From 03a1f50841a234da024540879848cae8f43f2810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B7=BB=E7=A0=96-JAVA=5CAdministrator?= <591141169@qq.com> Date: Tue, 7 May 2024 13:44:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E7=AB=AF=E5=9F=BA=E7=A1=80=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes | 1 + .gitignore | 55 + Docker-HOWTO.md | 49 + Dockerfile | 23 + Jenkinsfile | 60 + LICENSE | 20 + README.md | 340 + bin/deploy.sh | 160 + docker-compose.yml | 84 + docker.env | 25 + http-client.env.json | 20 + lombok.config | 4 + pom.xml | 142 + 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 | 681 + win-framework/pom.xml | 51 + win-framework/win-common/pom.xml | 144 + .../common/context/DataScopeHolder.java | 28 + .../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 | 42 + .../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 + .../datapermission/annotation/DataScope.java | 28 + .../annotation/DataScopeIndividuate.java | 28 + .../WinDataPermissionAutoConfiguration.java | 45 + ...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 | 92 + .../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 | 186 + .../framework/excel/core/util/ExcelUtils.java | 180 + .../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 | 31 + .../core/filter/DruidAdRemoveFilter.java | 38 + .../enums/ShardingTableCacheEnum.java | 62 + .../sharding/TimeShardingAlgorithm.java | 144 + .../utils/ShardingAlgorithmTool.java | 247 + .../utils/ShardingTablesLoadRunner.java | 24 + .../mybatis/config/DataScopeInterceptor.java | 56 + .../IdTypeEnvironmentPostProcessor.java | 108 + .../config/WinMybatisAutoConfiguration.java | 66 + .../mybatis/core/dataobject/BaseDO.java | 52 + .../core/dataobject/ConcurrencyDO.java | 23 + .../mybatis/core/dataobject/IdDO.java | 21 + .../mybatis/core/dataobject/MasterDO.java | 62 + .../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 + .../mybatis/core/viewobject/BaseVO.java | 40 + .../mybatis/core/viewobject/MasterVO.java | 52 + .../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 | 170 + .../win/framework/web/constant/Constant.java | 20 + .../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 | 43 + .../core/handler/GlobalExceptionHandler.java | 339 + .../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 | 67 + .../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-eam/pom.xml | 23 + win-module-eam/win-module-eam-api/pom.xml | 34 + .../com/win/module/eam/api/package-info.java | 4 + .../module/eam/enums/DictTypeConstants.java | 104 + .../module/eam/enums/ErrorCodeConstants.java | 161 + .../win/module/eam/enums/package-info.java | 4 + win-module-eam/win-module-eam-biz/pom.xml | 129 + .../com/win/module/eam/api/package-info.java | 4 + .../AdjustRecordDetailController.java | 133 + .../AdjustRecordMainController.java | 117 + .../vo/AdjustRecordDetailBaseVO.java | 45 + .../vo/AdjustRecordDetailCreateReqVO.java | 14 + .../vo/AdjustRecordDetailExcelVO.java | 37 + .../vo/AdjustRecordDetailExportReqVO.java | 33 + .../vo/AdjustRecordDetailPageReqVO.java | 40 + .../vo/AdjustRecordDetailRespVO.java | 13 + .../vo/AdjustRecordDetailUpdateReqVO.java | 14 + .../vo/AdjustRecordMainBaseVO.java | 42 + .../vo/AdjustRecordMainCreateReqVO.java | 12 + .../vo/AdjustRecordMainExcelVO.java | 35 + .../vo/AdjustRecordMainExportReqVO.java | 37 + .../vo/AdjustRecordMainPageReqVO.java | 39 + .../vo/AdjustRecordMainRespVO.java | 12 + .../vo/AdjustRecordMainUpdateReqVO.java | 12 + .../AttachmentFileController.java | 182 + .../vo/AttachmentFileBaseVO.java | 50 + .../vo/AttachmentFileCreateReqVO.java | 30 + .../vo/AttachmentFileExcelVO.java | 46 + .../vo/AttachmentFileExportReqVO.java | 43 + .../vo/AttachmentFilePageReqVO.java | 48 + .../vo/AttachmentFileRespVO.java | 23 + .../vo/AttachmentFileUpdateReqVO.java | 18 + .../attachmentfile/vo/FileInfo.java | 31 + .../attachmentfile/vo/UploadFileRequest.java | 34 + .../eam/controller/board/BoardController.java | 89 + .../eam/controller/board/vo/BoardBaseVO.java | 75 + .../controller/board/vo/BoardPageReqVO.java | 37 + .../eam/controller/board/vo/BoardRespVO.java | 39 + .../classtype/ClassTypeController.java | 140 + .../classtype/vo/ClassTypeBaseVO.java | 50 + .../classtype/vo/ClassTypeCreateReqVO.java | 14 + .../classtype/vo/ClassTypeExcelVO.java | 49 + .../classtype/vo/ClassTypeExportReqVO.java | 12 + .../classtype/vo/ClassTypePageReqVO.java | 14 + .../classtype/vo/ClassTypeRespVO.java | 24 + .../classtype/vo/ClassTypeUpdateReqVO.java | 14 + .../controller/classtype/vo/IdentityVO.java | 32 + .../countJob/CountJobDetailController.java | 134 + .../countJob/CountJobMainController.java | 144 + .../countJob/vo/CountJobDetailBaseVO.java | 43 + .../vo/CountJobDetailCreateReqVO.java | 12 + .../countJob/vo/CountJobDetailExcelVO.java | 43 + .../vo/CountJobDetailExportReqVO.java | 30 + .../vo/CountJobDetailImportErrorVO.java | 25 + .../countJob/vo/CountJobDetailPageReqVO.java | 35 + .../countJob/vo/CountJobDetailRespVO.java | 12 + .../vo/CountJobDetailUpdateReqVO.java | 14 + .../countJob/vo/CountJobMainBaseVO.java | 37 + .../countJob/vo/CountJobMainCreateReqVO.java | 12 + .../countJob/vo/CountJobMainExcelVO.java | 32 + .../countJob/vo/CountJobMainExportReqVO.java | 28 + .../countJob/vo/CountJobMainPageReqVO.java | 33 + .../countJob/vo/CountJobMainRespVO.java | 12 + .../countJob/vo/CountJobMainUpdateReqVO.java | 14 + .../CountRecordDetailController.java | 109 + .../CountRecordMainController.java | 127 + .../vo/CountRecordDetailBaseVO.java | 52 + .../vo/CountRecordDetailCreateReqVO.java | 12 + .../vo/CountRecordDetailExcelVO.java | 41 + .../vo/CountRecordDetailExportReqVO.java | 41 + .../vo/CountRecordDetailPageReqVO.java | 48 + .../vo/CountRecordDetailRespVO.java | 12 + .../vo/CountRecordDetailUpdateReqVO.java | 14 + .../countRecord/vo/CountRecordMainBaseVO.java | 37 + .../vo/CountRecordMainCreateReqVO.java | 12 + .../vo/CountRecordMainExcelVO.java | 29 + .../vo/CountRecordMainExportReqVO.java | 28 + .../vo/CountRecordMainPageReqVO.java | 31 + .../countRecord/vo/CountRecordMainRespVO.java | 16 + .../vo/CountRecordMainUpdateReqVO.java | 14 + .../CountadjustPlanController.java | 118 + .../vo/CountadjustPlanBaseVO.java | 32 + .../vo/CountadjustPlanCreateReqVO.java | 14 + .../vo/CountadjustPlanExcelVO.java | 37 + .../vo/CountadjustPlanExportReqVO.java | 30 + .../vo/CountadjustPlanPageReqVO.java | 32 + .../vo/CountadjustPlanRespVO.java | 16 + .../vo/CountadjustPlanUpdateReqVO.java | 18 + .../DeviceAccountsController.java | 259 + .../vo/DeviceAccountsBaseVO.java | 96 + .../vo/DeviceAccountsCreateReqVO.java | 14 + .../vo/DeviceAccountsExcelVO.java | 75 + .../vo/DeviceAccountsExportReqVO.java | 27 + .../vo/DeviceAccountsPageReqVO.java | 49 + .../vo/DeviceAccountsReqVO.java | 18 + .../vo/DeviceAccountsRespVO.java | 30 + .../vo/DeviceAccountsUpdateReqVO.java | 14 + .../DeviceInspectionJobDetailController.java | 148 + ...viceInspectionJobDetailItemController.java | 135 + .../DeviceInspectionJobMainController.java | 217 + .../vo/DeviceInspectionJobDetailBaseVO.java | 80 + .../DeviceInspectionJobDetailCreateReqVO.java | 12 + .../vo/DeviceInspectionJobDetailExcelVO.java | 56 + .../DeviceInspectionJobDetailExportReqVO.java | 46 + .../DeviceInspectionJobDetailItemBaseVO.java | 46 + ...iceInspectionJobDetailItemCreateReqVO.java | 12 + .../DeviceInspectionJobDetailItemExcelVO.java | 47 + ...iceInspectionJobDetailItemExportReqVO.java | 19 + ...eviceInspectionJobDetailItemPageReqVO.java | 22 + .../DeviceInspectionJobDetailItemRespVO.java | 19 + ...iceInspectionJobDetailItemUpdateReqVO.java | 18 + .../DeviceInspectionJobDetailPageReqVO.java | 52 + .../vo/DeviceInspectionJobDetailRespVO.java | 24 + .../DeviceInspectionJobDetailUpdateReqVO.java | 18 + .../vo/DeviceInspectionJobMainBaseVO.java | 87 + .../DeviceInspectionJobMainCreateReqVO.java | 19 + .../vo/DeviceInspectionJobMainExcelVO.java | 56 + .../DeviceInspectionJobMainExportReqVO.java | 37 + .../vo/DeviceInspectionJobMainPageReqVO.java | 58 + .../vo/DeviceInspectionJobMainRespVO.java | 40 + .../DeviceInspectionJobMainUpdateReqVO.java | 12 + .../vo/DeviceInspectionReportReqVo.java | 102 + .../DeviceInternalAuditController.java | 101 + .../vo/DeviceInternalAuditBaseVO.java | 59 + .../vo/DeviceInternalAuditCreateReqVO.java | 14 + .../vo/DeviceInternalAuditExcelVO.java | 66 + .../vo/DeviceInternalAuditExportReqVO.java | 62 + .../vo/DeviceInternalAuditPageReqVO.java | 67 + .../vo/DeviceInternalAuditRespVO.java | 19 + .../vo/DeviceInternalAuditUpdateReqVO.java | 18 + .../deviceitem/DeviceItemController.java | 117 + .../deviceitem/vo/DeviceItemBaseVO.java | 36 + .../deviceitem/vo/DeviceItemCreateReqVO.java | 14 + .../deviceitem/vo/DeviceItemExcelVO.java | 34 + .../deviceitem/vo/DeviceItemExportReqVO.java | 27 + .../deviceitem/vo/DeviceItemPageReqVO.java | 29 + .../deviceitem/vo/DeviceItemRespVO.java | 13 + .../deviceitem/vo/DeviceItemUpdateReqVO.java | 14 + .../DeviceMaintainJobDetailController.java | 145 + .../DeviceMaintainJobMainController.java | 208 + .../MaintainJobDetailItemController.java | 138 + .../vo/DeviceMaintainJobDetailBaseVO.java | 81 + .../DeviceMaintainJobDetailCreateReqVO.java | 12 + .../vo/DeviceMaintainJobDetailExcelVO.java | 65 + .../DeviceMaintainJobDetailExportReqVO.java | 65 + .../vo/DeviceMaintainJobDetailPageReqVO.java | 67 + .../vo/DeviceMaintainJobDetailRespVO.java | 27 + .../DeviceMaintainJobDetailUpdateReqVO.java | 18 + .../vo/DeviceMaintainJobMainBaseVO.java | 93 + .../vo/DeviceMaintainJobMainCreateReqVO.java | 12 + .../vo/DeviceMaintainJobMainExcelVO.java | 73 + .../vo/DeviceMaintainJobMainExportReqVO.java | 39 + .../vo/DeviceMaintainJobMainPageReqVO.java | 65 + .../vo/DeviceMaintainJobMainRespVO.java | 52 + .../vo/DeviceMaintainJobMainUpdateReqVO.java | 12 + .../vo/DeviceMaintainJobReportReqVo.java | 102 + .../vo/MaintainJobDetailItemBaseVO.java | 45 + .../vo/MaintainJobDetailItemCreateReqVO.java | 12 + .../vo/MaintainJobDetailItemExcelVO.java | 48 + .../vo/MaintainJobDetailItemExportReqVO.java | 10 + .../vo/MaintainJobDetailItemPageReqVO.java | 13 + .../vo/MaintainJobDetailItemRespVO.java | 19 + .../vo/MaintainJobDetailItemUpdateReqVO.java | 18 + .../DeviceMaintainPlanController.java | 144 + .../vo/DeviceMaintainPlanBaseVO.java | 57 + .../vo/DeviceMaintainPlanCreateReqVO.java | 14 + .../vo/DeviceMaintainPlanExcelVO.java | 50 + .../vo/DeviceMaintainPlanExportReqVO.java | 27 + .../vo/DeviceMaintainPlanPageReqVO.java | 39 + .../vo/DeviceMaintainPlanRespVO.java | 16 + .../vo/DeviceMaintainPlanUpdateReqVO.java | 14 + .../DeviceMaintenanceJobDetailController.java | 154 + ...iceMaintenanceJobDetailItemController.java | 148 + .../DeviceMaintenanceJobMainController.java | 297 + .../vo/DeviceMaintenanceJobDetailBaseVO.java | 58 + ...DeviceMaintenanceJobDetailCreateReqVO.java | 18 + .../vo/DeviceMaintenanceJobDetailExcelVO.java | 46 + ...DeviceMaintenanceJobDetailExportReqVO.java | 28 + .../DeviceMaintenanceJobDetailItemBaseVO.java | 45 + ...ceMaintenanceJobDetailItemCreateReqVO.java | 12 + ...DeviceMaintenanceJobDetailItemExcelVO.java | 42 + ...ceMaintenanceJobDetailItemExportReqVO.java | 10 + ...viceMaintenanceJobDetailItemPageReqVO.java | 13 + .../DeviceMaintenanceJobDetailItemRespVO.java | 16 + ...ceMaintenanceJobDetailItemUpdateReqVO.java | 18 + .../DeviceMaintenanceJobDetailPageReqVO.java | 36 + .../vo/DeviceMaintenanceJobDetailRespVO.java | 28 + ...DeviceMaintenanceJobDetailUpdateReqVO.java | 14 + .../vo/DeviceMaintenanceJobMainBaseVO.java | 112 + .../DeviceMaintenanceJobMainCreateReqVO.java | 14 + .../vo/DeviceMaintenanceJobMainExcelVO.java | 60 + .../DeviceMaintenanceJobMainExportReqVO.java | 43 + .../vo/DeviceMaintenanceJobMainPageReqVO.java | 70 + .../vo/DeviceMaintenanceJobMainRespVO.java | 59 + .../DeviceMaintenanceJobMainUpdateReqVO.java | 14 + .../DeviceMoldItemsController.java | 190 + .../vo/DeviceMaintenanceExcelVO.java | 54 + .../vo/DeviceMoldItemsBaseVO.java | 61 + .../vo/DeviceMoldItemsCreateReqVO.java | 15 + .../vo/DeviceMoldItemsExportReqVO.java | 37 + .../vo/DeviceMoldItemsPageReqVO.java | 50 + .../vo/DeviceMoldItemsRespVO.java | 25 + .../vo/DeviceMoldItemsUpdateReqVO.java | 15 + .../devicemolditems/vo/InspectionExcelVO.java | 44 + .../vo/MoldMaintenanceExcelVO.java | 57 + .../DeviceMoldItemsHistoryController.java | 183 + .../vo/DeviceMoldItemsHistoryBaseVO.java | 71 + .../vo/DeviceMoldItemsHistoryCreateReqVO.java | 14 + .../vo/DeviceMoldItemsHistoryExcelVO.java | 65 + .../vo/DeviceMoldItemsHistoryExportReqVO.java | 63 + .../vo/DeviceMoldItemsHistoryPageReqVO.java | 68 + .../vo/DeviceMoldItemsHistoryRespVO.java | 38 + .../vo/DeviceMoldItemsHistoryUpdateReqVO.java | 18 + .../DeviceRepairRequestController.java | 195 + .../vo/DeviceRepairRequestExcelVO.java | 53 + .../vo/DeviceRepairRequestExportReqVO.java | 22 + .../vo/DeviceRepairRequestPageReqVO.java | 45 + .../vo/DeviceRepairRequestRequestBaseVO.java | 66 + ...DeviceRepairRequestRequestCreateReqVO.java | 15 + .../vo/DeviceRepairRequestRequestRespVO.java | 41 + ...DeviceRepairRequestRequestUpdateReqVO.java | 12 + ...eSpotInspectionRecordDetailController.java | 148 + ...iceSpotInspectionRecordMainController.java | 190 + ...eviceSpotInspectionRecordDetailBaseVO.java | 46 + ...SpotInspectionRecordDetailCreateReqVO.java | 14 + ...viceSpotInspectionRecordDetailExcelVO.java | 43 + ...SpotInspectionRecordDetailExportReqVO.java | 38 + ...ceSpotInspectionRecordDetailPageReqVO.java | 45 + ...eviceSpotInspectionRecordDetailRespVO.java | 19 + ...SpotInspectionRecordDetailUpdateReqVO.java | 18 + .../DeviceSpotInspectionRecordMainBaseVO.java | 85 + ...ceSpotInspectionRecordMainCreateReqVO.java | 14 + ...DeviceSpotInspectionRecordMainExcelVO.java | 52 + ...ceSpotInspectionRecordMainExportReqVO.java | 24 + ...viceSpotInspectionRecordMainPageReqVO.java | 53 + .../DeviceSpotInspectionRecordMainRespVO.java | 36 + ...ceSpotInspectionRecordMainUpdateReqVO.java | 14 + .../factoryarea/FactoryAreaController.java | 99 + .../factoryarea/vo/FactoryAreaBaseVO.java | 62 + .../vo/FactoryAreaCreateReqVO.java | 14 + .../factoryarea/vo/FactoryAreaExcelVO.java | 38 + .../vo/FactoryAreaExportReqVO.java | 36 + .../factoryarea/vo/FactoryAreaPageReqVO.java | 38 + .../factoryarea/vo/FactoryAreaRespVO.java | 13 + .../vo/FactoryAreaUpdateReqVO.java | 14 + .../fixedassets/FixedAssetsController.java | 150 + .../fixedassets/vo/FixedAssetsBaseVO.java | 84 + .../vo/FixedAssetsCreateReqVO.java | 14 + .../fixedassets/vo/FixedAssetsExcelVO.java | 68 + .../vo/FixedAssetsExportReqVO.java | 37 + .../fixedassets/vo/FixedAssetsPageReqVO.java | 42 + .../fixedassets/vo/FixedAssetsRespVO.java | 16 + .../vo/FixedAssetsUpdateReqVO.java | 14 + .../homePage/HomePageController.java | 41 + .../eam/controller/item/ItemController.java | 182 + .../eam/controller/item/vo/ItemBaseVO.java | 90 + .../controller/item/vo/ItemCreateReqVO.java | 14 + .../eam/controller/item/vo/ItemExcelVO.java | 113 + .../controller/item/vo/ItemExportReqVO.java | 19 + .../eam/controller/item/vo/ItemPageReqVO.java | 24 + .../eam/controller/item/vo/ItemRespVO.java | 51 + .../controller/item/vo/ItemUpdateReqVO.java | 18 + .../itemaccounts/ItemAccountsController.java | 188 + .../itemaccounts/vo/ItemAccountsBaseVO.java | 164 + .../vo/ItemAccountsCreateReqVO.java | 14 + .../itemaccounts/vo/ItemAccountsExcelVO.java | 44 + .../vo/ItemAccountsExportReqVO.java | 15 + .../vo/ItemAccountsPageReqVO.java | 24 + .../itemaccounts/vo/ItemAccountsRespVO.java | 19 + .../vo/ItemAccountsUpdateReqVO.java | 14 + .../ItemApplyRequestDetailController.java | 138 + .../ItemApplyRequestMainController.java | 279 + .../vo/ItemApplyRequestDetailBaseVO.java | 74 + .../vo/ItemApplyRequestDetailCreateReqVO.java | 12 + .../vo/ItemApplyRequestDetailExcelVO.java | 47 + .../vo/ItemApplyRequestDetailExportReqVO.java | 44 + .../vo/ItemApplyRequestDetailPageReqVO.java | 51 + .../vo/ItemApplyRequestDetailRespVO.java | 19 + .../vo/ItemApplyRequestDetailUpdateReqVO.java | 18 + .../vo/ItemApplyRequestMainBaseVO.java | 73 + .../vo/ItemApplyRequestMainCreateReqVO.java | 43 + .../vo/ItemApplyRequestMainExcelVO.java | 53 + .../vo/ItemApplyRequestMainExportReqVO.java | 38 + .../vo/ItemApplyRequestMainPageReqVO.java | 59 + .../vo/ItemApplyRequestMainRespVO.java | 34 + .../vo/ItemApplyRequestMainUpdateReqVO.java | 12 + .../ItemInLocationController.java | 117 + .../vo/ItemInLocationBaseVO.java | 36 + .../vo/ItemInLocationCreateReqVO.java | 14 + .../vo/ItemInLocationExcelVO.java | 35 + .../vo/ItemInLocationExportReqVO.java | 30 + .../vo/ItemInLocationPageReqVO.java | 35 + .../vo/ItemInLocationRespVO.java | 13 + .../vo/ItemInLocationUpdateReqVO.java | 14 + .../ItemLocationReplaceController.java | 114 + .../vo/ItemLocationReplaceBaseVO.java | 33 + .../vo/ItemLocationReplaceCreateReqVO.java | 14 + .../vo/ItemLocationReplaceExcelVO.java | 31 + .../vo/ItemLocationReplaceExportReqVO.java | 31 + .../vo/ItemLocationReplacePageReqVO.java | 36 + .../vo/ItemLocationReplaceRespVO.java | 16 + .../vo/ItemLocationReplaceUpdateReqVO.java | 14 + .../ItemMaintenanceRecordController.java | 143 + .../vo/ItemMaintenanceRecordBaseVO.java | 44 + .../vo/ItemMaintenanceRecordCreateReqVO.java | 24 + .../vo/ItemMaintenanceRecordExcelVO.java | 42 + .../vo/ItemMaintenanceRecordExportReqVO.java | 28 + .../vo/ItemMaintenanceRecordPageReqVO.java | 30 + .../vo/ItemMaintenanceRecordRespVO.java | 27 + .../vo/ItemMaintenanceRecordUpdateReqVO.java | 12 + .../itemorder/ItemOrderDetailController.java | 139 + .../itemorder/ItemOrderMainController.java | 189 + .../itemorder/vo/ItemOrderDetailBaseVO.java | 84 + .../vo/ItemOrderDetailCreateReqVO.java | 14 + .../itemorder/vo/ItemOrderDetailExcelVO.java | 75 + .../vo/ItemOrderDetailExportReqVO.java | 75 + .../vo/ItemOrderDetailPageReqVO.java | 82 + .../itemorder/vo/ItemOrderDetailRespVO.java | 19 + .../vo/ItemOrderDetailUpdateReqVO.java | 14 + .../itemorder/vo/ItemOrderMainBaseVO.java | 85 + .../vo/ItemOrderMainCreateReqVO.java | 39 + .../itemorder/vo/ItemOrderMainExcelVO.java | 83 + .../vo/ItemOrderMainExportReqVO.java | 23 + .../itemorder/vo/ItemOrderMainPageReqVO.java | 25 + .../itemorder/vo/ItemOrderMainRespVO.java | 19 + .../vo/ItemOrderMainUpdateReqVO.java | 14 + .../itemorder/vo/PdaItemOrderCreateReqVO.java | 43 + .../ItemOutLocationController.java | 117 + .../vo/ItemOutLocationBaseVO.java | 36 + .../vo/ItemOutLocationCreateReqVO.java | 14 + .../vo/ItemOutLocationExcelVO.java | 35 + .../vo/ItemOutLocationExportReqVO.java | 30 + .../vo/ItemOutLocationPageReqVO.java | 35 + .../vo/ItemOutLocationRespVO.java | 13 + .../vo/ItemOutLocationUpdateReqVO.java | 14 + .../location/LocationController.java | 159 + .../location/vo/LocationBaseVO.java | 47 + .../location/vo/LocationCreateReqVO.java | 14 + .../location/vo/LocationExcelVO.java | 49 + .../location/vo/LocationExportReqVO.java | 33 + .../location/vo/LocationOutScanCodeReqVO.java | 25 + .../location/vo/LocationPageReqVO.java | 35 + .../controller/location/vo/LocationReqVO.java | 33 + .../location/vo/LocationRespVO.java | 44 + .../location/vo/LocationUpdateReqVO.java | 14 + .../locationarea/LocationAreaController.java | 128 + .../locationarea/vo/LocationAreaBaseVO.java | 40 + .../vo/LocationAreaCreateReqVO.java | 14 + .../locationarea/vo/LocationAreaExcelVO.java | 40 + .../vo/LocationAreaExportReqVO.java | 22 + .../vo/LocationAreaPageReqVO.java | 27 + .../locationarea/vo/LocationAreaRespVO.java | 16 + .../vo/LocationAreaUpdateReqVO.java | 14 + .../maintainback/MaintainBackController.java | 136 + .../maintainback/vo/MaintainBackBaseVO.java | 58 + .../vo/MaintainBackCreateReqVO.java | 14 + .../maintainback/vo/MaintainBackExcelVO.java | 46 + .../vo/MaintainBackExportReqVO.java | 43 + .../vo/MaintainBackPageReqVO.java | 48 + .../maintainback/vo/MaintainBackRespVO.java | 19 + .../vo/MaintainBackUpdateReqVO.java | 20 + .../MaintenanceTurntoController.java | 139 + .../vo/MaintenanceTurntoBaseVO.java | 57 + .../vo/MaintenanceTurntoCreateReqVO.java | 18 + .../vo/MaintenanceTurntoExcelVO.java | 52 + .../vo/MaintenanceTurntoExportReqVO.java | 12 + .../vo/MaintenanceTurntoPageReqVO.java | 14 + .../vo/MaintenanceTurntoRespVO.java | 16 + .../vo/MaintenanceTurntoUpdateReqVO.java | 22 + .../moldaccounts/MoldAccountsController.java | 180 + .../moldaccounts/vo/MoldAccountsBaseVO.java | 91 + .../vo/MoldAccountsCreateReqVO.java | 14 + .../moldaccounts/vo/MoldAccountsExcelVO.java | 74 + .../vo/MoldAccountsExportReqVO.java | 25 + .../vo/MoldAccountsPageReqVO.java | 40 + .../moldaccounts/vo/MoldAccountsRespVO.java | 22 + .../vo/MoldAccountsUpdateReqVO.java | 15 + .../MoldInspectionJobDetailController.java | 149 + ...MoldInspectionJobDetailItemController.java | 136 + .../MoldInspectionJobMainController.java | 218 + .../MoldMaintainJobDetailController.java | 144 + .../MoldMaintainJobDetailItemController.java | 137 + .../MoldMaintainJobMainController.java | 208 + .../MoldMaintainPlanController.java | 144 + .../MoldMaintenanceJobDetailController.java | 154 + ...oldMaintenanceJobDetailItemController.java | 148 + .../MoldMaintenanceJobMainController.java | 296 + .../MoldMilestoneController.java | 149 + .../moldmilestone/vo/MoldMilestoneBaseVO.java | 42 + .../vo/MoldMilestoneCreateReqVO.java | 14 + .../vo/MoldMilestoneExcelVO.java | 45 + .../vo/MoldMilestoneExportReqVO.java | 45 + .../vo/MoldMilestonePageReqVO.java | 50 + .../moldmilestone/vo/MoldMilestoneRespVO.java | 19 + .../vo/MoldMilestoneUpdateReqVO.java | 20 + .../MoldRepairRequestController.java | 192 + ...dSpotInspectionRecordDetailController.java | 146 + ...oldSpotInspectionRecordMainController.java | 190 + .../BasicMonthEquipmentController.java | 141 + .../vo/BasicMonthEquipmentBaseVO.java | 53 + .../vo/BasicMonthEquipmentCreateReqVO.java | 14 + .../vo/BasicMonthEquipmentErrorVO.java | 25 + .../vo/BasicMonthEquipmentExcelVO.java | 35 + .../vo/BasicMonthEquipmentExportReqVO.java | 15 + .../vo/BasicMonthEquipmentPageReqVO.java | 17 + .../vo/BasicMonthEquipmentRespVO.java | 16 + .../vo/BasicMonthEquipmentUpdateReqVO.java | 17 + .../module/eam/controller/package-info.java | 4 + .../producePlan/ProducePlanController.java | 105 + .../producePlan/vo/ProducePlanBaseVO.java | 92 + .../vo/ProducePlanCreateReqVO.java | 14 + .../producePlan/vo/ProducePlanExcelVO.java | 95 + .../vo/ProducePlanExportReqVO.java | 94 + .../producePlan/vo/ProducePlanPageReqVO.java | 99 + .../producePlan/vo/ProducePlanRespVO.java | 19 + .../vo/ProducePlanUpdateReqVO.java | 18 + .../supplier/SupplierController.java | 132 + .../supplier/vo/SupplierBaseVO.java | 58 + .../supplier/vo/SupplierCreateReqVO.java | 14 + .../supplier/vo/SupplierExcelVO.java | 47 + .../supplier/vo/SupplierExportReqVO.java | 36 + .../supplier/vo/SupplierPageReqVO.java | 38 + .../controller/supplier/vo/SupplierReqVO.java | 36 + .../supplier/vo/SupplierRespVO.java | 14 + .../supplier/vo/SupplierUpdateReqVO.java | 14 + .../TechInspectionJobDetailController.java | 149 + ...TechInspectionJobDetailItemController.java | 136 + .../TechInspectionJobMainController.java | 217 + .../TechMaintainJobDetailController.java | 144 + .../TechMaintainJobDetailItemController.java | 137 + .../TechMaintainJobMainController.java | 208 + .../TechMaintenanceJobDetailController.java | 154 + ...echMaintenanceJobDetailItemController.java | 148 + .../TechMaintenanceJobMainController.java | 296 + .../TechRepairRequestController.java | 195 + .../transaction/TransactionController.java | 118 + .../transaction/vo/TransactionBaseVO.java | 68 + .../vo/TransactionCreateReqVO.java | 14 + .../transaction/vo/TransactionExcelVO.java | 40 + .../vo/TransactionExportReqVO.java | 39 + .../transaction/vo/TransactionPageReqVO.java | 45 + .../transaction/vo/TransactionRespVO.java | 14 + .../vo/TransactionUpdateReqVO.java | 14 + .../UniappPushMessageController.java | 139 + .../vo/UniappPushMessageBaseVO.java | 68 + .../vo/UniappPushMessageCreateReqVO.java | 14 + .../vo/UniappPushMessageExcelVO.java | 55 + .../vo/UniappPushMessageExportReqVO.java | 50 + .../vo/UniappPushMessagePageReqVO.java | 52 + .../vo/UniappPushMessageRespVO.java | 29 + .../vo/UniappPushMessageUpdateReqVO.java | 18 + .../BasciYearEquipmentController.java | 135 + .../vo/BasciYearEquipmentBaseVO.java | 48 + .../vo/BasciYearEquipmentCreateReqVO.java | 14 + .../vo/BasciYearEquipmentExcelVO.java | 45 + .../vo/BasciYearEquipmentExportReqVO.java | 15 + .../vo/BasciYearEquipmentPageReqVO.java | 17 + .../vo/BasciYearEquipmentRespVO.java | 19 + .../vo/BasciYearEquipmentUpdateReqVO.java | 18 + .../AdjustRecordDetailConvert.java | 36 + .../adjustRecord/AdjustRecordMainConvert.java | 36 + .../attachmentfile/AttachmentFileConvert.java | 37 + .../eam/convert/board/BoardConvert.java | 37 + .../convert/classtype/ClassTypeConvert.java | 37 + .../countJobDetail/CountJobDetailConvert.java | 38 + .../countJobMain/CountJobMainConvert.java | 36 + .../countRecord/CountRecordDetailConvert.java | 36 + .../countRecord/CountRecordMainConvert.java | 36 + .../CountadjustPlanConvert.java | 36 + .../deviceaccounts/DeviceAccountsConvert.java | 37 + .../DeviceInspectionJobDetailConvert.java | 37 + .../DeviceInspectionJobDetailItemConvert.java | 36 + .../DeviceInspectionJobMainConvert.java | 36 + .../DeviceInternalAuditConvert.java | 37 + .../convert/deviceitem/DeviceItemConvert.java | 38 + .../DeviceMaintainJobDetailConvert.java | 37 + .../DeviceMaintainJobMainConvert.java | 36 + .../MaintainJobDetailItemConvert.java | 36 + .../DeviceMaintainPlanConvert.java | 37 + .../DeviceMaintenanceJobDetailConvert.java | 38 + ...DeviceMaintenanceJobDetailItemConvert.java | 37 + .../DeviceMaintenanceJobMainConvert.java | 36 + .../DeviceMoldItemsConvert.java | 40 + .../DeviceMoldItemsHistoryConvert.java | 36 + .../DeviceRepairRequestConvert.java | 36 + ...viceSpotInspectionRecordDetailConvert.java | 37 + ...DeviceSpotInspectionRecordMainConvert.java | 37 + .../factoryarea/FactoryAreaConvert.java | 36 + .../fixedassets/FixedAssetsConvert.java | 37 + .../module/eam/convert/item/ItemConvert.java | 36 + .../itemaccounts/ItemAccountsConvert.java | 37 + .../ItemApplyRequestDetailConvert.java | 38 + .../ItemApplyRequestMainConvert.java | 35 + .../iteminlocation/ItemInLocationConvert.java | 36 + .../ItemLocationReplaceConvert.java | 37 + .../ItemMaintenanceRecordConvert.java | 37 + .../itemorder/ItemOrderDetailConvert.java | 37 + .../itemorder/ItemOrderMainConvert.java | 37 + .../ItemOutLocationConvert.java | 36 + .../eam/convert/location/LocationConvert.java | 36 + .../locationarea/LocationAreaConvert.java | 36 + .../maintainback/MaintainBackConvert.java | 36 + .../MaintenanceTurntoConvert.java | 37 + .../moldaccounts/MoldAccountsConvert.java | 38 + .../moldmilestone/MoldMilestoneConvert.java | 36 + .../BasicMonthEquipmentConvert.java | 36 + .../win/module/eam/convert/package-info.java | 4 + .../producePlan/ProducePlanConvert.java | 36 + .../eam/convert/supplier/SupplierConvert.java | 36 + .../transaction/TransactionConvert.java | 36 + .../UniappPushMessageConvert.java | 37 + .../BasciYearEquipmentConvert.java | 37 + .../adjustRecord/AdjustRecordDetailDO.java | 76 + .../adjustRecord/AdjustRecordMainDO.java | 68 + .../attachmentfile/AttachmentFileDO.java | 82 + .../dal/dataobject/classtype/ClassTypeDO.java | 73 + .../countJobDetail/CountJobDetailDO.java | 81 + .../countJobMain/CountJobMainDO.java | 66 + .../countRecord/CountRecordDetailDO.java | 79 + .../countRecord/CountRecordMainDO.java | 63 + .../countadjustPlan/CountadjustPlanDO.java | 62 + .../deviceaccounts/DeviceAccountsDO.java | 119 + .../DeviceInspectionJobDetailDO.java | 114 + .../DeviceInspectionJobDetailItemDO.java | 65 + .../DeviceInspectionJobMainDO.java | 151 + .../DeviceInspectionReportDo.java | 90 + .../DeviceInternalAuditDO.java | 95 + .../dataobject/deviceitem/DeviceItemDO.java | 50 + .../DeviceMaintainJobDetailDO.java | 125 + .../DeviceMaintainJobMainDO.java | 182 + .../DeviceMaintainJobMainDOExpand.java | 33 + .../DeviceMaintainJobReportDo.java | 90 + .../MaintainJobDetailItemDO.java | 64 + .../DeviceMaintainPlanDO.java | 83 + .../DeviceMaintenanceJobDetailDO.java | 83 + .../DeviceMaintenanceJobDetailItemDO.java | 64 + .../DeviceMaintenanceJobMainDO.java | 223 + .../devicemolditems/DeviceMoldItemsDO.java | 106 + .../DeviceMoldItemsHistoryDO.java | 103 + .../DeviceRepairRequestDO.java | 119 + .../DeviceSpotInspectionRecordDetailDO.java | 63 + .../DeviceSpotInspectionRecordMainDO.java | 154 + .../dataobject/factoryarea/FactoryAreaDO.java | 62 + .../dataobject/fixedassets/FixedAssetsDO.java | 109 + .../eam/dal/dataobject/item/ItemDO.java | 194 + .../itemaccounts/ItemAccountsDO.java | 195 + .../ItemApplyRequestDetailDO.java | 106 + .../ItemApplyRequestMainDO.java | 128 + .../iteminlocation/ItemInLocationDO.java | 64 + .../ItemLocationReplaceDO.java | 56 + .../ItemMaintenanceRecordDO.java | 86 + .../itemorder/ItemOrderDetailDO.java | 120 + .../dataobject/itemorder/ItemOrderMainDO.java | 122 + .../itemoutlocation/ItemOutLocationDO.java | 64 + .../eam/dal/dataobject/json/JsonTask.java | 43 + .../dal/dataobject/json/MasterSlaveTask.java | 20 + .../eam/dal/dataobject/json/TedIssunpDet.java | 69 + .../dal/dataobject/json/TedIssunpMstr.java | 43 + .../eam/dal/dataobject/json/TedRctunpDet.java | 70 + .../dal/dataobject/json/TedRctunpMstr.java | 45 + .../dal/dataobject/json/TedReceiptDet.java | 62 + .../dal/dataobject/json/TedReceiptMstr.java | 51 + .../dal/dataobject/location/LocationDO.java | 117 + .../locationarea/LocationAreaDO.java | 59 + .../maintainback/MaintainBackDO.java | 80 + .../MaintenanceTurntoDO.java | 89 + .../moldaccounts/MoldAccountsDO.java | 129 + .../moldaccounts/MoldAccountsDOExpand.java | 25 + .../moldmilestone/MoldMilestoneDO.java | 69 + .../monthequipment/BasicMonthEquipmentDO.java | 70 + .../dataobject/producePlan/ProducePlanDO.java | 141 + .../dal/dataobject/supplier/SupplierDO.java | 86 + .../dataobject/transaction/TransactionDO.java | 94 + .../UniappPushMessageDO.java | 98 + .../yearequipment/BasciYearEquipmentDO.java | 71 + .../AdjustRecordDetailMapper.java | 42 + .../adjustRecord/AdjustRecordMainMapper.java | 51 + .../attachmentfile/AttachmentFileMapper.java | 62 + .../dal/mysql/classtype/ClassTypeMapper.java | 73 + .../countJobMain/CountJobDetailMapper.java | 42 + .../countJobMain/CountJobMainMapper.java | 53 + .../countRecord/CountRecordDetailMapper.java | 51 + .../countRecord/CountRecordMainMapper.java | 50 + .../CountadjustPlanMapper.java | 54 + .../deviceaccounts/DeviceAccountsMapper.java | 155 + .../DeviceInspectionJobDetailItemMapper.java | 44 + .../DeviceInspectionJobDetailMapper.java | 51 + .../DeviceInspectionJobMainMapper.java | 106 + .../DeviceInternalAuditMapper.java | 60 + .../mysql/deviceitem/DeviceItemMapper.java | 54 + .../DeviceMaintainJobDetailMapper.java | 70 + .../DeviceMaintainJobMainMapper.java | 119 + .../MaintainJobDetailItemMapper.java | 46 + .../DeviceMaintainPlanMapper.java | 73 + .../DeviceMaintenanceJobDetailItemMapper.java | 48 + .../DeviceMaintenanceJobDetailMapper.java | 71 + .../DeviceMaintenanceJobMainMapper.java | 202 + .../DeviceMoldItemsMapper.java | 48 + .../DeviceMoldItemsHistoryMapper.java | 62 + .../DeviceRepairRequestMapper.java | 95 + ...eviceSpotInspectionRecordDetailMapper.java | 54 + .../DeviceSpotInspectionRecordMainMapper.java | 69 + .../mysql/factoryarea/FactoryAreaMapper.java | 47 + .../mysql/fixedassets/FixedAssetsMapper.java | 53 + .../module/eam/dal/mysql/item/ItemMapper.java | 84 + .../itemaccounts/ItemAccountsMapper.java | 158 + .../ItemApplyRequestDetailMapper.java | 58 + .../ItemApplyRequestMainMapper.java | 80 + .../iteminlocation/ItemInLocationMapper.java | 49 + .../ItemLocationReplaceMapper.java | 47 + .../ItemMaintenanceRecordMapper.java | 53 + .../itemorder/ItemOrderDetailMapper.java | 73 + .../mysql/itemorder/ItemOrderMainMapper.java | 51 + .../ItemOutLocationMapper.java | 49 + .../dal/mysql/location/LocationMapper.java | 80 + .../locationarea/LocationAreaMapper.java | 45 + .../maintainback/MaintainBackMapper.java | 47 + .../MaintenanceTurntoMapper.java | 31 + .../moldaccounts/MoldAccountsMapper.java | 100 + .../moldmilestone/MoldMilestoneMapper.java | 57 + .../BasicMonthEquipmentMapper.java | 45 + .../mysql/producePlan/ProducePlanMapper.java | 60 + .../dal/mysql/supplier/SupplierMapper.java | 67 + .../mysql/transaction/TransactionMapper.java | 52 + .../UniappPushMessageMapper.java | 53 + .../BasciYearEquipmentMapper.java | 33 + .../com/win/module/eam/dal/package-info.java | 4 + .../eam/enums/OpenAndClose/CompleteEnum.java | 28 + .../eam/enums/basic/BasicStatusEnum.java | 49 + .../eam/enums/basic/BooleanTypeEnum.java | 28 + .../enums/itemApply/ItemApplyStatusEnum.java | 45 + .../MonthequipmentStatusEnum.java | 39 + .../module/eam/enums/order/FaultTypeEnum.java | 31 + .../eam/enums/order/MaintenanceTypeEnum.java | 30 + .../win/module/eam/enums/order/MonthEnum.java | 65 + .../enums/order/OrderNextPeriodDataEnum.java | 41 + .../eam/enums/order/OrderPeriodDataEnum.java | 40 + .../eam/enums/order/OrderStatusEnum.java | 63 + .../eam/enums/order/PeriodTypeEnum.java | 34 + .../win/module/eam/enums/order/WeekEnum.java | 58 + .../win/module/eam/enums/package-info.java | 4 + .../eam/enums/request/RequestStatusEnum.java | 50 + .../eam/enums/status/AdjustStatusEnum.java | 42 + .../status/DevicemolditemsStatusEnum.java | 41 + .../enums/transaction/TransactionEnum.java | 43 + .../transactionType/TransactionTypeEnum.java | 40 + .../module/eam/job/CreateMaintainPlanJob.java | 27 + .../eam/job/MilestoneStageNoticeJob.java | 25 + .../win/module/eam/job/MoldMilestoneJob.java | 24 + .../win/module/eam/job/ProducePlanJob.java | 24 + .../eam/job/SpotInspectionEndTimeJob.java | 23 + .../eam/job/SpotInspectionStartTimeJob.java | 23 + .../module/eam/job/UncompletedOrderJob.java | 24 + .../AdjustRecordDetailService.java | 81 + .../AdjustRecordDetailServiceImpl.java | 109 + .../adjustRecord/AdjustRecordMainService.java | 83 + .../AdjustRecordMainServiceImpl.java | 91 + .../attachmentfile/AttachmentFileService.java | 114 + .../AttachmentFileServiceImpl.java | 268 + .../eam/service/board/BoardService.java | 64 + .../eam/service/board/BoardServiceImpl.java | 252 + .../service/classtype/ClassTypeService.java | 86 + .../classtype/ClassTypeServiceImpl.java | 157 + .../counRecord/CountRecordDetailService.java | 84 + .../CountRecordDetailServiceImpl.java | 85 + .../counRecord/CountRecordMainService.java | 86 + .../CountRecordMainServiceImpl.java | 200 + .../countJobDetail/CountJobDetailService.java | 81 + .../CountJobDetailServiceImpl.java | 186 + .../countJobMain/CountJobMainService.java | 83 + .../countJobMain/CountJobMainServiceImpl.java | 90 + .../CountadjustPlanService.java | 91 + .../CountadjustPlanServiceImpl.java | 139 + .../deviceaccounts/DeviceAccountsService.java | 144 + .../DeviceAccountsServiceImpl.java | 459 + .../DeviceInspectionJobDetailItemService.java | 80 + ...iceInspectionJobDetailItemServiceImpl.java | 107 + .../DeviceInspectionJobDetailService.java | 87 + .../DeviceInspectionJobDetailServiceImpl.java | 242 + .../DeviceInspectionJobMainService.java | 146 + .../DeviceInspectionJobMainServiceImpl.java | 410 + .../DeviceInternalAuditService.java | 73 + .../DeviceInternalAuditServiceImpl.java | 114 + .../service/deviceitem/DeviceItemService.java | 77 + .../deviceitem/DeviceItemServiceImpl.java | 117 + .../DeviceMaintainJobDetailService.java | 87 + .../DeviceMaintainJobDetailServiceImpl.java | 220 + .../DeviceMaintainJobMainService.java | 151 + .../DeviceMaintainJobMainServiceImpl.java | 408 + .../MaintainJobDetailItemService.java | 79 + .../MaintainJobDetailItemServiceImpl.java | 105 + .../DeviceMaintainPlanService.java | 106 + .../DeviceMaintainPlanServiceImpl.java | 644 + ...DeviceMaintenanceJobDetailItemService.java | 87 + ...ceMaintenanceJobDetailItemServiceImpl.java | 112 + .../DeviceMaintenanceJobDetailService.java | 88 + ...DeviceMaintenanceJobDetailServiceImpl.java | 253 + .../DeviceMaintenanceJobMainService.java | 170 + .../DeviceMaintenanceJobMainServiceImpl.java | 987 ++ .../DeviceMoldItemsService.java | 89 + .../DeviceMoldItemsServiceImpl.java | 440 + .../DeviceMoldItemsHistoryService.java | 80 + .../DeviceMoldItemsHistoryServiceImpl.java | 107 + .../DeviceRepairRequestService.java | 113 + .../DeviceRepairRequestServiceImpl.java | 360 + ...viceSpotInspectionRecordDetailService.java | 87 + ...SpotInspectionRecordDetailServiceImpl.java | 111 + ...DeviceSpotInspectionRecordMainService.java | 130 + ...ceSpotInspectionRecordMainServiceImpl.java | 395 + .../factoryarea/FactoryAreaService.java | 72 + .../factoryarea/FactoryAreaServiceImpl.java | 98 + .../fixedassets/FixedAssetsService.java | 90 + .../fixedassets/FixedAssetsServiceImpl.java | 128 + .../eam/service/homePage/HomePageService.java | 31 + .../service/homePage/HomePageServiceImpl.java | 322 + .../module/eam/service/item/ItemService.java | 133 + .../eam/service/item/ItemServiceImpl.java | 263 + .../itemaccounts/ItemAccountsService.java | 121 + .../itemaccounts/ItemAccountsServiceImpl.java | 236 + .../ItemApplyRequestDetailService.java | 80 + .../ItemApplyRequestDetailServiceImpl.java | 126 + .../ItemApplyRequestMainService.java | 160 + .../ItemApplyRequestMainServiceImpl.java | 594 + .../iteminlocation/ItemInLocationService.java | 83 + .../ItemInLocationServiceImpl.java | 91 + .../ItemLocationReplaceService.java | 84 + .../ItemLocationReplaceServiceImpl.java | 92 + .../ItemMaintenanceRecordService.java | 88 + .../ItemMaintenanceRecordServiceImpl.java | 192 + .../itemorder/ItemOrderDetailService.java | 79 + .../itemorder/ItemOrderDetailServiceImpl.java | 107 + .../itemorder/ItemOrderMainService.java | 121 + .../itemorder/ItemOrderMainServiceImpl.java | 330 + .../ItemOutLocationService.java | 83 + .../ItemOutLocationServiceImpl.java | 91 + .../eam/service/location/LocationService.java | 111 + .../service/location/LocationServiceImpl.java | 218 + .../locationarea/LocationAreaService.java | 80 + .../locationarea/LocationAreaServiceImpl.java | 120 + .../maintainback/MaintainBackService.java | 81 + .../maintainback/MaintainBackServiceImpl.java | 108 + .../MaintenanceTurntoService.java | 80 + .../MaintenanceTurntoServiceImpl.java | 107 + .../moldaccounts/MoldAccountsService.java | 134 + .../moldaccounts/MoldAccountsServiceImpl.java | 225 + .../MoldInspectionJobDetailItemService.java | 80 + ...oldInspectionJobDetailItemServiceImpl.java | 107 + .../MoldInspectionJobDetailService.java | 87 + .../MoldInspectionJobDetailServiceImpl.java | 242 + .../MoldInspectionJobMainService.java | 146 + .../MoldInspectionJobMainServiceImpl.java | 409 + .../MoldMaintainJobDetailItemService.java | 79 + .../MoldMaintainJobDetailItemServiceImpl.java | 105 + .../MoldMaintainJobDetailService.java | 87 + .../MoldMaintainJobDetailServiceImpl.java | 220 + .../MoldMaintainJobMainService.java | 151 + .../MoldMaintainJobMainServiceImpl.java | 409 + .../MoldMaintenanceJobDetailItemService.java | 87 + ...ldMaintenanceJobDetailItemServiceImpl.java | 112 + .../MoldMaintenanceJobDetailService.java | 88 + .../MoldMaintenanceJobDetailServiceImpl.java | 253 + .../MoldMaintenanceJobMainService.java | 169 + .../MoldMaintenanceJobMainServiceImpl.java | 849 ++ .../moldmilestone/MoldMilestoneService.java | 93 + .../MoldMilestoneServiceImpl.java | 199 + .../MoldRepairRequestService.java | 113 + .../MoldRepairRequestServiceImpl.java | 361 + ...MoldSpotInspectionRecordDetailService.java | 87 + ...SpotInspectionRecordDetailServiceImpl.java | 111 + .../MoldSpotInspectionRecordMainService.java | 129 + ...ldSpotInspectionRecordMainServiceImpl.java | 390 + .../BasicMonthEquipmentService.java | 85 + .../BasicMonthEquipmentServiceImpl.java | 224 + .../win/module/eam/service/package-info.java | 4 + .../producePlan/ProducePlanService.java | 66 + .../producePlan/ProducePlanServiceImpl.java | 129 + .../eam/service/supplier/SupplierService.java | 90 + .../service/supplier/SupplierServiceImpl.java | 111 + .../TechInspectionJobDetailItemService.java | 80 + ...echInspectionJobDetailItemServiceImpl.java | 107 + .../TechInspectionJobDetailService.java | 87 + .../TechInspectionJobDetailServiceImpl.java | 242 + .../TechInspectionJobMainService.java | 146 + .../TechInspectionJobMainServiceImpl.java | 410 + .../TechMaintainJobDetailItemService.java | 79 + .../TechMaintainJobDetailItemServiceImpl.java | 105 + .../TechMaintainJobDetailService.java | 87 + .../TechMaintainJobDetailServiceImpl.java | 220 + .../TechMaintainJobMainService.java | 151 + .../TechMaintainJobMainServiceImpl.java | 406 + .../TechMaintenanceJobDetailItemService.java | 87 + ...chMaintenanceJobDetailItemServiceImpl.java | 112 + .../TechMaintenanceJobDetailService.java | 88 + .../TechMaintenanceJobDetailServiceImpl.java | 253 + .../TechMaintenanceJobMainService.java | 175 + .../TechMaintenanceJobMainServiceImpl.java | 868 ++ .../TechRepairRequestService.java | 113 + .../TechRepairRequestServiceImpl.java | 360 + .../transaction/TransactionService.java | 90 + .../transaction/TransactionServiceImpl.java | 352 + .../UniappPushMessageService.java | 84 + .../UniappPushMessageServiceImpl.java | 218 + .../BasciYearEquipmentService.java | 80 + .../BasciYearEquipmentServiceImpl.java | 157 + .../java/com/win/module/eam/util/GetRole.java | 126 + .../win/module/eam/util/SessionIdUtil.java | 20 + .../com/win/module/eam/util/ShellConfig.java | 14 + .../com/win/module/eam/util/SoapUtil.java | 240 + .../com/win/module/eam/util/package-info.java | 4 + .../src/main/resources/i18n/eam.properties | 1 + .../main/resources/i18n/eam_en_US.properties | 0 .../main/resources/i18n/eam_zh_CN.properties | 0 .../adjustRecord/AdjustRecordDetailMapper.xml | 12 + .../adjustRecord/AdjustRecordMainMapper.xml | 12 + .../attachmentfile/AttachmentFileMapper.xml | 100 + .../mapper/classtype/ClassTypeMapper.xml | 94 + .../counRecord/CountRecordDetailMapper.xml | 31 + .../counRecord/CountRecordMainMapper.xml | 22 + .../countJobDetail/CountJobDetailMapper.xml | 12 + .../countJobMain/CountJobMainMapper.xml | 12 + .../countadjustPlan/CountadjustPlanMapper.xml | 13 + .../deviceaccounts/DeviceAccountsMapper.xml | 195 + .../DeviceInspectionJobDetailItemMapper.xml | 24 + .../DeviceInspectionJobDetailMapper.xml | 12 + .../DeviceInspectionJobMainMapper.xml | 215 + .../DeviceInternalAuditMapper.xml | 12 + .../mapper/deviceitem/DeviceItemMapper.xml | 16 + .../DeviceMaintainJobDetailMapper.xml | 13 + .../DeviceMaintainJobMainMapper.xml | 389 + .../MaintainJobDetailItemMapper.xml | 24 + .../DeviceMaintainPlanMapper.xml | 113 + .../DeviceMaintenanceJobDetailItemMapper.xml | 24 + .../DeviceMaintenanceJobDetailMapper.xml | 12 + .../DeviceMaintenanceJobMainMapper.xml | 770 + .../devicemolditems/DeviceMoldItemsMapper.xml | 52 + .../DeviceMoldItemsHistoryMapper.xml | 12 + .../DeviceRepairRequestMapper.xml | 209 + ...DeviceSpotInspectionRecordDetailMapper.xml | 12 + .../DeviceSpotInspectionRecordMainMapper.xml | 90 + .../mapper/factoryarea/FactoryAreaMapper.xml | 12 + .../main/resources/mapper/item/ItemMapper.xml | 134 + .../itemaccounts/ItemAccountsMapper.xml | 59 + .../ItemApplyRequestDetailMapper.xml | 48 + .../ItemApplyRequestMainMapper.xml | 188 + .../iteminlocation/ItemInLocationMapper.xml | 12 + .../ItemLocationReplaceMapper.xml | 12 + .../ItemMaintenanceRecordMapper.xml | 42 + .../itemorder/ItemOrderDetailMapper.xml | 36 + .../mapper/itemorder/ItemOrderMainMapper.xml | 37 + .../itemoutlocation/ItemOutLocationMapper.xml | 12 + .../mapper/location/LocationMapper.xml | 69 + .../locationarea/LocationAreaMapper.xml | 12 + .../MaintenanceTurntoMapper.xml | 12 + .../moldaccounts/MoldAccountsMapper.xml | 182 + .../moldmilestone/MoldMilestoneMapper.xml | 40 + .../BasicMonthEquipmentMapper.xml | 47 + .../mapper/producePlan/ProducePlanMapper.xml | 49 + .../mapper/supplier/SupplierMapper.xml | 12 + .../mapper/transaction/TransactionMapper.xml | 12 + .../UniappPushMessageMapper.xml | 12 + .../BasciYearEquipmentMapper.xml | 11 + win-module-infra/pom.xml | 25 + win-module-infra/win-module-infra-api/pom.xml | 33 + .../module/infra/api/config/ApiConfigApi.java | 17 + .../infra/api/config/dto/ConfigDTO.java | 79 + .../win/module/infra/api/file/FileApi.java | 51 + .../module/infra/api/file/dto/FileDTO.java | 46 + .../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 | 16 + .../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 + .../infra/api/config/ConfigApiImpl.java | 31 + .../module/infra/api/file/FileApiImpl.java | 27 + .../infra/api/logger/ApiAccessLogApiImpl.java | 33 + .../infra/api/logger/ApiErrorLogApiImpl.java | 33 + .../infra/api/trends/TrendsApiImpl.java | 39 + .../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 | 127 + .../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 | 94 + .../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 | 36 + .../convert/db/DataSourceConfigConvert.java | 30 + .../infra/convert/file/FileConfigConvert.java | 36 + .../infra/convert/file/FileConvert.java | 23 + .../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 | 43 + .../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 | 57 + .../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 | 66 + .../infra/service/file/FileServiceImpl.java | 131 + .../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 | 145 + .../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 | 3 + .../resources/codegen/java/service/service.vm | 79 + .../codegen/java/service/serviceImpl.vm | 106 + .../codegen/java/test/serviceTest.vm | 165 + .../codegen/java/test/serviceTest.vm.bark | 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 | 244 + .../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 | 77 + .../win/module/system/api/dept/PostApi.java | 24 + .../system/api/dept/dto/DeptRespDTO.java | 57 + .../module/system/api/dict/DictDataApi.java | 70 + .../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 | 48 + .../dto/NotifySendSingleToRoleReqDTO.java | 33 + .../dto/NotifySendSingleToRolesReqDTO.java | 34 + .../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 | 123 + .../module/system/api/permission/RoleApi.java | 21 + .../dto/DeptDataPermissionRespDTO.java | 35 + .../dto/PermissionIdentificationRespVO.java | 72 + .../api/sensitiveword/SensitiveWordApi.java | 30 + .../api/serialnumber/SerialNumberApi.java | 15 + .../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 | 77 + .../system/api/user/dto/AdminUserRespDTO.java | 52 + .../api/user/dto/AdminUserRespExpandDTO.java | 41 + .../system/enums/DictTypeConstants.java | 29 + .../system/enums/ErrorCodeConstants.java | 179 + .../module/system/enums/common/SexEnum.java | 27 + .../system/enums/dept/BooleanTypeEnum.java | 28 + .../module/system/enums/dept/DeptIdEnum.java | 20 + .../system/enums/dept/DeptLevelEnum.java | 28 + .../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 | 41 + .../enums/sms/SmsReceiveStatusEnum.java | 23 + .../module/system/enums/sms/SmsSceneEnum.java | 51 + .../system/enums/sms/SmsSendStatusEnum.java | 24 + .../system/enums/sms/SmsTemplateTypeEnum.java | 25 + .../system/enums/status/AdjustStatusEnum.java | 29 + .../win-module-system-biz/pom.xml | 116 + .../module/system/api/dept/DeptApiImpl.java | 61 + .../module/system/api/dept/PostApiImpl.java | 74 + .../system/api/dict/DictDataApiImpl.java | 69 + .../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 | 62 + .../system/api/oauth2/OAuth2TokenApiImpl.java | 47 + .../api/permission/PermissionApiImpl.java | 189 + .../system/api/permission/RoleApiImpl.java | 24 + .../sensitiveword/SensitiveWordApiImpl.java | 29 + .../api/serialnumber/SerialNumberApiImpl.java | 23 + .../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 | 61 + .../system/aspectj/DataScopeAspect.java | 216 + .../aspectj/DataScopeIndividuateAspect.java | 214 + .../context/AuthenticationContextHolder.java | 24 + .../context/PermissionContextHolder.java | 24 + .../controller/auth/AuthController.http | 33 + .../controller/auth/AuthController.java | 113 + .../controller/auth/vo/AuthLoginReqVO.java | 50 + .../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 | 137 + .../controller/dept/PostController.java | 99 + .../controller/dept/vo/dept/DeptBaseVO.java | 71 + .../dept/vo/dept/DeptCreateReqVO.java | 12 + .../dept/vo/dept/DeptListReqVO.java | 16 + .../dept/vo/dept/DeptPageReqVO.java | 15 + .../controller/dept/vo/dept/DeptRespVO.java | 23 + .../dept/vo/dept/DeptSimpleRespVO.java | 32 + .../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 | 125 + .../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 | 28 + .../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 | 28 + .../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 | 115 + .../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 | 42 + .../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 + .../sysconfig/SysConfigController.java | 135 + .../sysconfig/vo/SysConfigBaseVO.java | 31 + .../sysconfig/vo/SysConfigCreateReqVO.java | 12 + .../sysconfig/vo/SysConfigExcelVO.java | 34 + .../sysconfig/vo/SysConfigExportReqVO.java | 37 + .../sysconfig/vo/SysConfigPageReqVO.java | 39 + .../sysconfig/vo/SysConfigRespVO.java | 16 + .../sysconfig/vo/SysConfigUpdateReqVO.java | 12 + .../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 | 208 + .../user/UserProfileController.http | 4 + .../user/UserProfileController.java | 100 + .../user/vo/profile/UserProfileRespVO.java | 112 + .../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 | 40 + .../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 | 36 + .../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 | 30 + .../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 + .../convert/sysconfig/SysConfigConvert.java | 36 + .../system/convert/tenant/TenantConvert.java | 45 + .../convert/tenant/TenantPackageConvert.java | 36 + .../system/convert/user/UserConvert.java | 52 + .../system/dal/dataobject/dept/DeptDO.java | 86 + .../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/sysconfig/SysConfigDO.java | 56 + .../dal/dataobject/tenant/TenantDO.java | 82 + .../dataobject/tenant/TenantPackageDO.java | 52 + .../dal/dataobject/user/AdminUserDO.java | 100 + .../dataobject/user/AdminUserDOExpand.java | 41 + .../system/dal/mysql/dept/DeptMapper.java | 82 + .../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 | 55 + .../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 | 54 + .../dal/mysql/permission/RoleMenuMapper.java | 40 + .../dal/mysql/permission/UserRoleMapper.java | 36 + .../sensitiveword/SensitiveWordMapper.java | 48 + .../serialnumber/SerialNumberMapper.java | 37 + .../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 + .../dal/mysql/sysconfig/SysConfigMapper.java | 45 + .../system/dal/mysql/tenant/TenantMapper.java | 53 + .../dal/mysql/tenant/TenantPackageMapper.java | 32 + .../dal/mysql/user/AdminUserMapper.java | 63 + .../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 | 192 + .../system/service/dept/DeptService.java | 140 + .../system/service/dept/DeptServiceImpl.java | 311 + .../system/service/dept/PostService.java | 98 + .../system/service/dept/PostServiceImpl.java | 151 + .../system/service/dict/DictDataService.java | 114 + .../service/dict/DictDataServiceImpl.java | 231 + .../system/service/dict/DictTypeService.java | 89 + .../service/dict/DictTypeServiceImpl.java | 156 + .../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 | 151 + .../service/permission/RoleServiceImpl.java | 263 + .../permission/bo/RoleCreateReqBO.java | 49 + .../sensitiveword/SensitiveWordService.java | 99 + .../SensitiveWordServiceImpl.java | 268 + .../serialnumber/SerialNumberService.java | 94 + .../serialnumber/SerialNumberServiceImpl.java | 183 + .../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/sysconfig/SysConfigService.java | 81 + .../sysconfig/SysConfigServiceImpl.java | 94 + .../service/tenant/TenantPackageService.java | 73 + .../tenant/TenantPackageServiceImpl.java | 116 + .../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 | 226 + .../service/user/AdminUserServiceImpl.java | 470 + .../com/win/module/system/util/Constants.java | 145 + .../win/module/system/util/StringUtils.java | 516 + .../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 .../main/resources/mapper/dept/DeptMapper.xml | 108 + .../mapper/dept/sysconfig/SysConfigMapper.xml | 12 + .../main/resources/mapper/user/UserMapper.xml | 36 + .../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/pom.xml | 104 + .../com/win/server/WinServerApplication.java | 25 + .../server/controller/DefaultController.java | 30 + .../src/main/resources/application-dev.yaml | 201 + .../src/main/resources/application-druid.yml | 47 + .../src/main/resources/application-local.yaml | 206 + .../src/main/resources/application-prod.yaml | 187 + .../src/main/resources/application-test.yaml | 186 + .../src/main/resources/application.yaml | 274 + .../src/main/resources/logback-spring.xml | 163 + .../src/main/resources/magic-editor-config.js | 22 + .../src/test/java/com/win/ProjectReactor.java | 146 + 2271 files changed, 184704 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 Docker-HOWTO.md create mode 100644 Dockerfile create mode 100644 Jenkinsfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 bin/deploy.sh 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/context/DataScopeHolder.java 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/annotation/DataScope.java create mode 100644 win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/annotation/DataScopeIndividuate.java 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/DataScopeInterceptor.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/dataobject/ConcurrencyDO.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/IdDO.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/MasterDO.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/java/com/win/framework/mybatis/core/viewobject/BaseVO.java create mode 100644 win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/viewobject/MasterVO.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-eam/pom.xml create mode 100644 win-module-eam/win-module-eam-api/pom.xml create mode 100644 win-module-eam/win-module-eam-api/src/main/java/com/win/module/eam/api/package-info.java create mode 100644 win-module-eam/win-module-eam-api/src/main/java/com/win/module/eam/enums/DictTypeConstants.java create mode 100644 win-module-eam/win-module-eam-api/src/main/java/com/win/module/eam/enums/ErrorCodeConstants.java create mode 100644 win-module-eam/win-module-eam-api/src/main/java/com/win/module/eam/enums/package-info.java create mode 100644 win-module-eam/win-module-eam-biz/pom.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/api/package-info.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/AdjustRecordDetailController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/AdjustRecordMainController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/AttachmentFileController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFilePageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/FileInfo.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/UploadFileRequest.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/board/BoardController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/board/vo/BoardBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/board/vo/BoardPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/board/vo/BoardRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/ClassTypeController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypePageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/IdentityVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/CountJobDetailController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/CountJobMainController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailImportErrorVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/CountRecordDetailController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/CountRecordMainController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/CountadjustPlanController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/DeviceAccountsController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/DeviceInspectionJobDetailController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/DeviceInspectionJobDetailItemController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/DeviceInspectionJobMainController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionReportReqVo.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/DeviceInternalAuditController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/DeviceItemController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/DeviceMaintainJobDetailController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/DeviceMaintainJobMainController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/MaintainJobDetailItemController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobReportReqVo.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/DeviceMaintainPlanController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/DeviceMaintenanceJobDetailController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/DeviceMaintenanceJobDetailItemController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/DeviceMaintenanceJobMainController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/DeviceMoldItemsController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMaintenanceExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/InspectionExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/MoldMaintenanceExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/DeviceMoldItemsHistoryController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/DeviceRepairRequestController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestRequestBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestRequestCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestRequestRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestRequestUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/DeviceSpotInspectionRecordMainController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/FactoryAreaController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/FixedAssetsController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/homePage/HomePageController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/ItemController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/ItemAccountsController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/ItemApplyRequestDetailController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/ItemApplyRequestMainController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/ItemInLocationController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/ItemLocationReplaceController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplacePageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/ItemMaintenanceRecordController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/ItemOrderDetailController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/ItemOrderMainController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/PdaItemOrderCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/ItemOutLocationController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/LocationController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationOutScanCodeReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/LocationAreaController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/MaintainBackController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/MaintenanceTurntoController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/MoldAccountsController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldinspectionjob/MoldInspectionJobDetailController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldinspectionjob/MoldInspectionJobDetailItemController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldinspectionjob/MoldInspectionJobMainController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintainjob/MoldMaintainJobDetailController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintainjob/MoldMaintainJobDetailItemController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintainjob/MoldMaintainJobMainController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintainplan/MoldMaintainPlanController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintenancejob/MoldMaintenanceJobDetailController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintenancejob/MoldMaintenanceJobDetailItemController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintenancejob/MoldMaintenanceJobMainController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/MoldMilestoneController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestonePageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldrepairrequest/MoldRepairRequestController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldspotinspectionrecord/MoldSpotInspectionRecordDetailController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldspotinspectionrecord/MoldSpotInspectionRecordMainController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/BasicMonthEquipmentController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentErrorVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/package-info.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/ProducePlanController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/SupplierController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techinspectionjob/TechInspectionJobDetailController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techinspectionjob/TechInspectionJobDetailItemController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techinspectionjob/TechInspectionJobMainController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintainjob/TechMaintainJobDetailController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintainjob/TechMaintainJobDetailItemController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintainjob/TechMaintainJobMainController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintenancejob/TechMaintenanceJobDetailController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintenancejob/TechMaintenanceJobDetailItemController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintenancejob/TechMaintenanceJobMainController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techrepairrequest/TechRepairRequestController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/TransactionController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/UniappPushMessageController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessagePageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/BasciYearEquipmentController.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentBaseVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentCreateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentExcelVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentExportReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentPageReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentRespVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentUpdateReqVO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/adjustRecord/AdjustRecordDetailConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/adjustRecord/AdjustRecordMainConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/attachmentfile/AttachmentFileConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/board/BoardConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/classtype/ClassTypeConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countJobDetail/CountJobDetailConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countJobMain/CountJobMainConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countRecord/CountRecordDetailConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countRecord/CountRecordMainConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countadjustPlan/CountadjustPlanConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceaccounts/DeviceAccountsConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceinspectionjob/DeviceInspectionJobDetailConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceinspectionjob/DeviceInspectionJobDetailItemConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceinspectionjob/DeviceInspectionJobMainConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceinternalaudit/DeviceInternalAuditConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceitem/DeviceItemConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintainjob/DeviceMaintainJobDetailConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintainjob/DeviceMaintainJobMainConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintainjob/MaintainJobDetailItemConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintainplan/DeviceMaintainPlanConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintenancejob/DeviceMaintenanceJobDetailConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintenancejob/DeviceMaintenanceJobDetailItemConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintenancejob/DeviceMaintenanceJobMainConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemolditems/DeviceMoldItemsConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemolditemshistory/DeviceMoldItemsHistoryConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicerepairrequest/DeviceRepairRequestConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicespotinspectionrecord/DeviceSpotInspectionRecordMainConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/factoryarea/FactoryAreaConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/fixedassets/FixedAssetsConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/item/ItemConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemaccounts/ItemAccountsConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemapplyrequest/ItemApplyRequestDetailConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemapplyrequest/ItemApplyRequestMainConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/iteminlocation/ItemInLocationConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemlocationreplace/ItemLocationReplaceConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemmaintenancerecord/ItemMaintenanceRecordConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemorder/ItemOrderDetailConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemorder/ItemOrderMainConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemoutlocation/ItemOutLocationConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/location/LocationConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/locationarea/LocationAreaConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/maintainback/MaintainBackConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/maintenanceturnto/MaintenanceTurntoConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/moldaccounts/MoldAccountsConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/moldmilestone/MoldMilestoneConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/monthequipment/BasicMonthEquipmentConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/package-info.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/producePlan/ProducePlanConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/supplier/SupplierConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/transaction/TransactionConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/uniapppushmessage/UniappPushMessageConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/yearequipment/BasciYearEquipmentConvert.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/adjustRecord/AdjustRecordDetailDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/adjustRecord/AdjustRecordMainDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/attachmentfile/AttachmentFileDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/classtype/ClassTypeDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countJobDetail/CountJobDetailDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countJobMain/CountJobMainDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countRecord/CountRecordDetailDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countRecord/CountRecordMainDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countadjustPlan/CountadjustPlanDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceaccounts/DeviceAccountsDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinspectionjob/DeviceInspectionJobDetailDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinspectionjob/DeviceInspectionJobDetailItemDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinspectionjob/DeviceInspectionJobMainDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinspectionjob/DeviceInspectionReportDo.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinternalaudit/DeviceInternalAuditDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceitem/DeviceItemDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/DeviceMaintainJobDetailDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/DeviceMaintainJobMainDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/DeviceMaintainJobMainDOExpand.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/DeviceMaintainJobReportDo.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/MaintainJobDetailItemDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainplan/DeviceMaintainPlanDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintenancejob/DeviceMaintenanceJobDetailDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintenancejob/DeviceMaintenanceJobDetailItemDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintenancejob/DeviceMaintenanceJobMainDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemolditems/DeviceMoldItemsDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemolditemshistory/DeviceMoldItemsHistoryDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicerepairrequest/DeviceRepairRequestDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicespotinspectionrecord/DeviceSpotInspectionRecordMainDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/factoryarea/FactoryAreaDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/fixedassets/FixedAssetsDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/item/ItemDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemaccounts/ItemAccountsDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemapplyrequest/ItemApplyRequestDetailDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemapplyrequest/ItemApplyRequestMainDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/iteminlocation/ItemInLocationDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemlocationreplace/ItemLocationReplaceDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemmaintenancerecord/ItemMaintenanceRecordDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemorder/ItemOrderDetailDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemorder/ItemOrderMainDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemoutlocation/ItemOutLocationDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/JsonTask.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/MasterSlaveTask.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedIssunpDet.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedIssunpMstr.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedRctunpDet.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedRctunpMstr.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedReceiptDet.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedReceiptMstr.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/location/LocationDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/locationarea/LocationAreaDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/maintainback/MaintainBackDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/maintenanceturnto/MaintenanceTurntoDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/moldaccounts/MoldAccountsDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/moldaccounts/MoldAccountsDOExpand.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/moldmilestone/MoldMilestoneDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/monthequipment/BasicMonthEquipmentDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/producePlan/ProducePlanDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/supplier/SupplierDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/transaction/TransactionDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/uniapppushmessage/UniappPushMessageDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/yearequipment/BasciYearEquipmentDO.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/adjustRecord/AdjustRecordDetailMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/adjustRecord/AdjustRecordMainMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/attachmentfile/AttachmentFileMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/classtype/ClassTypeMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countJobMain/CountJobDetailMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countJobMain/CountJobMainMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countRecord/CountRecordDetailMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countRecord/CountRecordMainMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countadjustPlan/CountadjustPlanMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceaccounts/DeviceAccountsMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceinspectionjob/DeviceInspectionJobDetailItemMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceinspectionjob/DeviceInspectionJobDetailMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceinspectionjob/DeviceInspectionJobMainMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceinternalaudit/DeviceInternalAuditMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceitem/DeviceItemMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintainjob/DeviceMaintainJobDetailMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintainjob/DeviceMaintainJobMainMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintainjob/MaintainJobDetailItemMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintainplan/DeviceMaintainPlanMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintenancejob/DeviceMaintenanceJobDetailItemMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintenancejob/DeviceMaintenanceJobDetailMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintenancejob/DeviceMaintenanceJobMainMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemolditems/DeviceMoldItemsMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemolditemshistory/DeviceMoldItemsHistoryMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicerepairrequest/DeviceRepairRequestMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicespotinspectionrecord/DeviceSpotInspectionRecordMainMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/factoryarea/FactoryAreaMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/fixedassets/FixedAssetsMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/item/ItemMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemaccounts/ItemAccountsMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemapplyrequest/ItemApplyRequestDetailMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemapplyrequest/ItemApplyRequestMainMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/iteminlocation/ItemInLocationMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemlocationreplace/ItemLocationReplaceMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemmaintenancerecord/ItemMaintenanceRecordMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemorder/ItemOrderDetailMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemorder/ItemOrderMainMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemoutlocation/ItemOutLocationMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/location/LocationMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/locationarea/LocationAreaMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/maintainback/MaintainBackMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/maintenanceturnto/MaintenanceTurntoMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/moldaccounts/MoldAccountsMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/moldmilestone/MoldMilestoneMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/monthequipment/BasicMonthEquipmentMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/producePlan/ProducePlanMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/supplier/SupplierMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/transaction/TransactionMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/uniapppushmessage/UniappPushMessageMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/yearequipment/BasciYearEquipmentMapper.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/package-info.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/OpenAndClose/CompleteEnum.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/basic/BasicStatusEnum.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/basic/BooleanTypeEnum.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/itemApply/ItemApplyStatusEnum.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/monthequipment/MonthequipmentStatusEnum.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/FaultTypeEnum.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/MaintenanceTypeEnum.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/MonthEnum.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/OrderNextPeriodDataEnum.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/OrderPeriodDataEnum.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/OrderStatusEnum.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/PeriodTypeEnum.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/WeekEnum.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/package-info.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/request/RequestStatusEnum.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/status/AdjustStatusEnum.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/status/DevicemolditemsStatusEnum.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/transaction/TransactionEnum.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/transactionType/TransactionTypeEnum.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/CreateMaintainPlanJob.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/MilestoneStageNoticeJob.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/MoldMilestoneJob.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/ProducePlanJob.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/SpotInspectionEndTimeJob.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/SpotInspectionStartTimeJob.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/UncompletedOrderJob.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/adjustRecord/AdjustRecordDetailService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/adjustRecord/AdjustRecordDetailServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/adjustRecord/AdjustRecordMainService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/adjustRecord/AdjustRecordMainServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/attachmentfile/AttachmentFileService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/attachmentfile/AttachmentFileServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/board/BoardService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/board/BoardServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/classtype/ClassTypeService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/classtype/ClassTypeServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/counRecord/CountRecordDetailService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/counRecord/CountRecordDetailServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/counRecord/CountRecordMainService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/counRecord/CountRecordMainServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countJobDetail/CountJobDetailService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countJobDetail/CountJobDetailServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countJobMain/CountJobMainService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countJobMain/CountJobMainServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countadjustPlan/CountadjustPlanService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countadjustPlan/CountadjustPlanServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceaccounts/DeviceAccountsService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceaccounts/DeviceAccountsServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobDetailItemService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobDetailItemServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobDetailService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobDetailServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobMainService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobMainServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinternalaudit/DeviceInternalAuditService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinternalaudit/DeviceInternalAuditServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceitem/DeviceItemService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceitem/DeviceItemServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/DeviceMaintainJobDetailService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/DeviceMaintainJobDetailServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/DeviceMaintainJobMainService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/DeviceMaintainJobMainServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/MaintainJobDetailItemService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/MaintainJobDetailItemServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainplan/DeviceMaintainPlanService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainplan/DeviceMaintainPlanServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobDetailItemService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobDetailItemServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobDetailService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobDetailServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobMainService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobMainServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemolditems/DeviceMoldItemsService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemolditems/DeviceMoldItemsServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemolditemshistory/DeviceMoldItemsHistoryService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemolditemshistory/DeviceMoldItemsHistoryServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicerepairrequest/DeviceRepairRequestService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicerepairrequest/DeviceRepairRequestServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicespotinspectionrecord/DeviceSpotInspectionRecordMainService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicespotinspectionrecord/DeviceSpotInspectionRecordMainServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/factoryarea/FactoryAreaService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/factoryarea/FactoryAreaServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/fixedassets/FixedAssetsService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/fixedassets/FixedAssetsServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/homePage/HomePageService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/homePage/HomePageServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/item/ItemService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/item/ItemServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemaccounts/ItemAccountsService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemaccounts/ItemAccountsServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemapplyrequest/ItemApplyRequestDetailService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemapplyrequest/ItemApplyRequestDetailServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemapplyrequest/ItemApplyRequestMainService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemapplyrequest/ItemApplyRequestMainServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/iteminlocation/ItemInLocationService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/iteminlocation/ItemInLocationServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemlocationreplace/ItemLocationReplaceService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemlocationreplace/ItemLocationReplaceServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemmaintenancerecord/ItemMaintenanceRecordService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemmaintenancerecord/ItemMaintenanceRecordServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemorder/ItemOrderDetailService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemorder/ItemOrderDetailServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemorder/ItemOrderMainService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemorder/ItemOrderMainServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemoutlocation/ItemOutLocationService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemoutlocation/ItemOutLocationServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/location/LocationService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/location/LocationServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/locationarea/LocationAreaService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/locationarea/LocationAreaServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/maintainback/MaintainBackService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/maintainback/MaintainBackServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/maintenanceturnto/MaintenanceTurntoService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/maintenanceturnto/MaintenanceTurntoServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldaccounts/MoldAccountsService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldaccounts/MoldAccountsServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobDetailItemService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobDetailItemServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobDetailService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobDetailServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobMainService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobMainServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobDetailItemService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobDetailItemServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobDetailService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobDetailServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobMainService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobMainServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobDetailItemService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobDetailItemServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobDetailService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobDetailServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobMainService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobMainServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmilestone/MoldMilestoneService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmilestone/MoldMilestoneServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldrepairrequest/MoldRepairRequestService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldrepairrequest/MoldRepairRequestServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldspotinspectionrecord/MoldSpotInspectionRecordDetailService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldspotinspectionrecord/MoldSpotInspectionRecordDetailServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldspotinspectionrecord/MoldSpotInspectionRecordMainService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldspotinspectionrecord/MoldSpotInspectionRecordMainServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/monthequipment/BasicMonthEquipmentService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/monthequipment/BasicMonthEquipmentServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/package-info.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/producePlan/ProducePlanService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/producePlan/ProducePlanServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/supplier/SupplierService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/supplier/SupplierServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobDetailItemService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobDetailItemServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobDetailService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobDetailServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobMainService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobMainServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobDetailItemService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobDetailItemServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobDetailService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobDetailServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobMainService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobMainServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobDetailItemService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobDetailItemServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobDetailService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobDetailServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobMainService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobMainServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techrepairrequest/TechRepairRequestService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techrepairrequest/TechRepairRequestServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/transaction/TransactionService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/transaction/TransactionServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/uniapppushmessage/UniappPushMessageService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/uniapppushmessage/UniappPushMessageServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/yearequipment/BasciYearEquipmentService.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/yearequipment/BasciYearEquipmentServiceImpl.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/GetRole.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/SessionIdUtil.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/ShellConfig.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/SoapUtil.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/package-info.java create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/i18n/eam.properties create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/i18n/eam_en_US.properties create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/i18n/eam_zh_CN.properties create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/adjustRecord/AdjustRecordDetailMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/adjustRecord/AdjustRecordMainMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/attachmentfile/AttachmentFileMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/classtype/ClassTypeMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/counRecord/CountRecordDetailMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/counRecord/CountRecordMainMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/countJobDetail/CountJobDetailMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/countJobMain/CountJobMainMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/countadjustPlan/CountadjustPlanMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceaccounts/DeviceAccountsMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceinspectionjob/DeviceInspectionJobDetailItemMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceinspectionjob/DeviceInspectionJobDetailMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceinspectionjob/DeviceInspectionJobMainMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceinternalaudit/DeviceInternalAuditMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceitem/DeviceItemMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintainjob/DeviceMaintainJobDetailMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintainjob/DeviceMaintainJobMainMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintainjob/MaintainJobDetailItemMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintainplan/DeviceMaintainPlanMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintenancejob/DeviceMaintenanceJobDetailItemMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintenancejob/DeviceMaintenanceJobDetailMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintenancejob/DeviceMaintenanceJobMainMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemolditems/DeviceMoldItemsMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemolditemshistory/DeviceMoldItemsHistoryMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicerepairrequest/DeviceRepairRequestMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicespotinspectionrecord/DeviceSpotInspectionRecordMainMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/factoryarea/FactoryAreaMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/item/ItemMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemaccounts/ItemAccountsMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemapplyrequest/ItemApplyRequestDetailMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemapplyrequest/ItemApplyRequestMainMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/iteminlocation/ItemInLocationMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemlocationreplace/ItemLocationReplaceMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemmaintenancerecord/ItemMaintenanceRecordMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemorder/ItemOrderDetailMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemorder/ItemOrderMainMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemoutlocation/ItemOutLocationMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/location/LocationMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/locationarea/LocationAreaMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/maintenanceturnto/MaintenanceTurntoMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/moldaccounts/MoldAccountsMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/moldmilestone/MoldMilestoneMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/monthequipment/BasicMonthEquipmentMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/producePlan/ProducePlanMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/supplier/SupplierMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/transaction/TransactionMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/uniapppushmessage/UniappPushMessageMapper.xml create mode 100644 win-module-eam/win-module-eam-biz/src/main/resources/mapper/yearequipment/BasciYearEquipmentMapper.xml 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/config/ApiConfigApi.java create mode 100644 win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/config/dto/ConfigDTO.java 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/file/dto/FileDTO.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/config/ConfigApiImpl.java 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/java/test/serviceTest.vm.bark 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/NotifySendSingleToRoleReqDTO.java create mode 100644 win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifySendSingleToRolesReqDTO.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/permission/dto/PermissionIdentificationRespVO.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/api/user/dto/AdminUserRespExpandDTO.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/BooleanTypeEnum.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/dept/DeptLevelEnum.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-api/src/main/java/com/win/module/system/enums/status/AdjustStatusEnum.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/aspectj/DataScopeAspect.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/aspectj/DataScopeIndividuateAspect.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/context/AuthenticationContextHolder.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/context/PermissionContextHolder.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/DeptPageReqVO.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/sysconfig/SysConfigController.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigBaseVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigCreateReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigExcelVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigExportReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigPageReqVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigRespVO.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigUpdateReqVO.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/sysconfig/SysConfigConvert.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/sysconfig/SysConfigDO.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/dataobject/user/AdminUserDOExpand.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/sysconfig/SysConfigMapper.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/sysconfig/SysConfigService.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sysconfig/SysConfigServiceImpl.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/Constants.java create mode 100644 win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/StringUtils.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/main/resources/mapper/dept/DeptMapper.xml create mode 100644 win-module-system/win-module-system-biz/src/main/resources/mapper/dept/sysconfig/SysConfigMapper.xml create mode 100644 win-module-system/win-module-system-biz/src/main/resources/mapper/user/UserMapper.xml 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/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-local.yaml 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..662604a --- /dev/null +++ b/.gitignore @@ -0,0 +1,55 @@ +###################################################################### +# 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/ + +*.DS_Store 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/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0646a1e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +## AdoptOpenJDK 停止发布 OpenJDK 二进制,而 Eclipse Temurin 是它的延伸,提供更好的稳定性 +## 感谢复旦核博士的建议!灰子哥,牛皮! +FROM eclipse-temurin:17-jre-alpine + +## 创建目录,并使用它作为工作目录 +RUN mkdir -p /opt/win-server +WORKDIR /opt/win-server +## 将后端项目的 Jar 文件,复制到镜像中 +COPY ./win-server/target/win-server.jar win-server.jar + +## 设置 TZ 时区 +ENV TZ=Asia/Shanghai +## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖 +ENV JAVA_OPTS="" + +## 应用参数 +ENV ARGS="" + +## 暴露后端项目的 25210 端口 +EXPOSE 25210 + +## 启动后端项目 +CMD java ${JAVA_OPTS} -jar win-server.jar $ARGS 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/bin/deploy.sh b/bin/deploy.sh new file mode 100644 index 0000000..31022bd --- /dev/null +++ b/bin/deploy.sh @@ -0,0 +1,160 @@ +#!/bin/bash +set -e + +DATE=$(date +%Y%m%d%H%M) +# 基础路径 +BASE_PATH=/work/projects/win-server +# 编译后 jar 的地址。部署时,Jenkins 会上传 jar 包到该目录下 +SOURCE_PATH=$BASE_PATH/build +# 服务名称。同时约定部署服务的 jar 包名字也为它。 +SERVER_NAME=win-server +# 环境 +PROFILES_ACTIVE=development +# 健康检查 URL +HEALTH_CHECK_URL=http://127.0.0.1:48080/actuator/health/ + +# heapError 存放路径 +HEAP_ERROR_PATH=$BASE_PATH/heapError +# JVM 参数 +JAVA_OPS="-Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$HEAP_ERROR_PATH" + +# SkyWalking Agent 配置 +#export SW_AGENT_NAME=$SERVER_NAME +#export SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.0.84:11800 +#export SW_GRPC_LOG_SERVER_HOST=192.168.0.84 +#export SW_AGENT_TRACE_IGNORE_PATH="Redisson/PING,/actuator/**,/admin/**" +#export JAVA_AGENT=-javaagent:/work/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar + +# 备份 +function backup() { + # 如果不存在,则无需备份 + if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then + echo "[backup] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过备份" + # 如果存在,则备份到 backup 目录下,使用时间作为后缀 + else + echo "[backup] 开始备份 $SERVER_NAME ..." + cp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar + echo "[backup] 备份 $SERVER_NAME 完成" + fi +} + +# 最新构建代码 移动到项目环境 +function transfer() { + echo "[transfer] 开始转移 $SERVER_NAME.jar" + + # 删除原 jar 包 + if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then + echo "[transfer] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过删除" + else + echo "[transfer] 移除 $BASE_PATH/$SERVER_NAME.jar 完成" + rm $BASE_PATH/$SERVER_NAME.jar + fi + + # 复制新 jar 包 + echo "[transfer] 从 $SOURCE_PATH 中获取 $SERVER_NAME.jar 并迁移至 $BASE_PATH ...." + cp $SOURCE_PATH/$SERVER_NAME.jar $BASE_PATH + + echo "[transfer] 转移 $SERVER_NAME.jar 完成" +} + +# 停止:优雅关闭之前已经启动的服务 +function stop() { + echo "[stop] 开始停止 $BASE_PATH/$SERVER_NAME" + PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}') + # 如果 Java 服务启动中,则进行关闭 + if [ -n "$PID" ]; then + # 正常关闭 + echo "[stop] $BASE_PATH/$SERVER_NAME 运行中,开始 kill [$PID]" + kill -15 $PID + # 等待最大 120 秒,直到关闭完成。 + for ((i = 0; i < 120; i++)) + do + sleep 1 + PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}') + if [ -n "$PID" ]; then + echo -e ".\c" + else + echo '[stop] 停止 $BASE_PATH/$SERVER_NAME 成功' + break + fi + done + + # 如果正常关闭失败,那么进行强制 kill -9 进行关闭 + if [ -n "$PID" ]; then + echo "[stop] $BASE_PATH/$SERVER_NAME 失败,强制 kill -9 $PID" + kill -9 $PID + fi + # 如果 Java 服务未启动,则无需关闭 + else + echo "[stop] $BASE_PATH/$SERVER_NAME 未启动,无需停止" + fi +} + +# 启动:启动后端项目 +function start() { + # 开启启动前,打印启动参数 + echo "[start] 开始启动 $BASE_PATH/$SERVER_NAME" + echo "[start] JAVA_OPS: $JAVA_OPS" + echo "[start] JAVA_AGENT: $JAVA_AGENT" + echo "[start] PROFILES: $PROFILES_ACTIVE" + + # 开始启动 + BUILD_ID=dontKillMe nohup java -server $JAVA_OPS $JAVA_AGENT -jar $BASE_PATH/$SERVER_NAME.jar --spring.profiles.active=$PROFILES_ACTIVE & + echo "[start] 启动 $BASE_PATH/$SERVER_NAME 完成" +} + +# 健康检查:自动判断后端项目是否正常启动 +function healthCheck() { + # 如果配置健康检查,则进行健康检查 + if [ -n "$HEALTH_CHECK_URL" ]; then + # 健康检查最大 120 秒,直到健康检查通过 + echo "[healthCheck] 开始通过 $HEALTH_CHECK_URL 地址,进行健康检查"; + for ((i = 0; i < 120; i++)) + do + # 请求健康检查地址,只获取状态码。 + result=`curl -I -m 10 -o /dev/null -s -w %{http_code} $HEALTH_CHECK_URL || echo "000"` + # 如果状态码为 200,则说明健康检查通过 + if [ "$result" == "200" ]; then + echo "[healthCheck] 健康检查通过"; + break + # 如果状态码非 200,则说明未通过。sleep 1 秒后,继续重试 + else + echo -e ".\c" + sleep 1 + fi + done + + # 健康检查未通过,则异常退出 shell 脚本,不继续部署。 + if [ ! "$result" == "200" ]; then + echo "[healthCheck] 健康检查不通过,可能部署失败。查看日志,自行判断是否启动成功"; + tail -n 10 nohup.out + exit 1; + # 健康检查通过,打印最后 10 行日志,可能部署的人想看下日志。 + else + tail -n 10 nohup.out + fi + # 如果未配置健康检查,则 sleep 120 秒,人工看日志是否部署成功。 + else + echo "[healthCheck] HEALTH_CHECK_URL 未配置,开始 sleep 120 秒"; + sleep 120 + echo "[healthCheck] sleep 120 秒完成,查看日志,自行判断是否启动成功"; + tail -n 50 nohup.out + fi +} + +# 部署 +function deploy() { + cd $BASE_PATH + # 备份原 jar + backup + # 停止 Java 服务 + stop + # 部署新 jar + transfer + # 启动 Java 服务 + start + # 健康检查 + healthCheck +} + +deploy 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..e6919c3 --- /dev/null +++ b/pom.xml @@ -0,0 +1,142 @@ + + + 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 + win-module-eam + + + ${project.artifactId} + 闻荫项目基础脚手架 + https://github.com/YunaiV/ruoyi-vue-pro + + + 3.0.0 + + 17 + ${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..21fc0f6 --- /dev/null +++ b/win-dependencies/pom.xml @@ -0,0 +1,681 @@ + + + 4.0.0 + + com.win + win-dependencies + ${revision} + pom + + ${project.artifactId} + 基础 bom 文件,管理整个项目的依赖版本 + https://github.com/YunaiV/ruoyi-vue-pro + + + 3.0.0 + ${java.version} + ${java.version} + 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 + 10.2.0.jre17 + 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.microsoft.sqlserver + mssql-jdbc + ${sqlserver.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/context/DataScopeHolder.java b/win-framework/win-common/src/main/java/com/win/framework/common/context/DataScopeHolder.java new file mode 100644 index 0000000..1545fc4 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/context/DataScopeHolder.java @@ -0,0 +1,28 @@ +package com.win.framework.common.context; + +/** + * @ClassName TableAliasHolder + * @Description TODO + * @Author longlongxiaogege + * @Date 2023/6/27 13:32 + * @Version 1.0 + */ +public class DataScopeHolder { + + private static ThreadLocal dataScopeSql = new ThreadLocal<>(); + + public static void addDataScopeSql(Object sql) { + if (dataScopeSql.get() == null) { + dataScopeSql.set(sql); + } + } + + public static Object getDataScopeSql() { + return dataScopeSql.get(); + } + + public static void removeDataScopeSql() { + dataScopeSql.remove(); + } + +} 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..8f7c5a6 --- /dev/null +++ b/win-framework/win-common/src/main/java/com/win/framework/common/exception/enums/GlobalErrorCodeConstants.java @@ -0,0 +1,42 @@ +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/annotation/DataScope.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/annotation/DataScope.java new file mode 100644 index 0000000..078a869 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/annotation/DataScope.java @@ -0,0 +1,28 @@ +package com.win.framework.datapermission.annotation; + +import java.lang.annotation.*; + +/** + * 数据权限过滤注解 + * + * @author win + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataScope { + /** + * 部门表的别名 + */ + public String deptAlias() default ""; + + /** + * 用户表的别名 + */ + public String userAlias() default ""; + + /** + * 权限字符(用于多个角色匹配符合要求的权限)默认根据权限注解@ss获取,多个权限用逗号分隔开来 + */ + public String permission() default ""; +} diff --git a/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/annotation/DataScopeIndividuate.java b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/annotation/DataScopeIndividuate.java new file mode 100644 index 0000000..4a8d4b7 --- /dev/null +++ b/win-framework/win-spring-boot-starter-biz-data-permission/src/main/java/com/win/framework/datapermission/annotation/DataScopeIndividuate.java @@ -0,0 +1,28 @@ +package com.win.framework.datapermission.annotation; + +import java.lang.annotation.*; + +/** + * 数据权限过滤注解 + * + * @author win + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataScopeIndividuate { + /** + * 部门表的别名 + */ + public String deptAlias() default ""; + + /** + * 用户表的别名 + */ + public String userAlias() default ""; + + /** + * 权限字符(用于多个角色匹配符合要求的权限)默认根据权限注解@ss获取,多个权限用逗号分隔开来 + */ + public String permission() default ""; +} 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..3dbe776 --- /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,45 @@ +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; + return null; + } + + @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..828efba --- /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 Collections.emptyList(); + } + // 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..54607a5 --- /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,92 @@ +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..5053ea2 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/util/ConvertUtil.java @@ -0,0 +1,186 @@ +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.ParameterizedType; +import java.util.*; + +@Data +@Slf4j +public class ConvertUtil { + + /** + * excel数据 + */ + private List dataList; + + /** + * 判断重复的属性方法 + */ + private String[] methodNames; + + /** + * 子类 + */ + 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.methodNames == null || this.methodNames.length == 0) { + String[] methodNames = this.getOnlyOneAnnotation(); + if(methodNames == null || methodNames.length == 0) { + throw new ServiceException().setMessage("未发现OnlyOne注解属性"); + } + this.methodNames = methodNames; + } + 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; + } + + /** + * 添加数据 + * @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); + List subClassList = new ArrayList<>(); + subClassList.add(subObject); + ReflectUtil.invoke(mainObject, "set" + this.subObjectMethodName, subClassList); + dataList.add(mainObject); + } else {//list中存在主数据,只添加子数据 + List subClassList = ReflectUtil.invoke(mainObject, "get" + this.subObjectMethodName); + subClassList.add(subObject); + ReflectUtil.invoke(mainObject, "set" + this.subObjectMethodName, subClassList); + } + } + + /** + * 判断数据是否存在 + */ + private T checkDataIsExist(Object object) { + for(T obj : dataList) { + boolean flag = true; + for(String methodName : this.methodNames) { + T methodValue1 = ReflectUtil.invoke(obj, "get" + methodName); + Object methodValue2 = ReflectUtil.invoke(object, "get" + methodName); + if (!methodValue1.equals(methodValue2)) { + flag = false; + } + } + if(flag) { + return obj; + } + } + return null; + } + + private String[] getOnlyOneAnnotation() { + Field[] fields = this.getAllFields(this.mainClass); + List methodList = new ArrayList<>(); + for (Field field : fields) { + // 只判断该字段拥有非空注解 + if (field.isAnnotationPresent(OnlyOne.class)) { + //获取属性的名字 + String attributeName = field.getName(); + //将属性名字的首字母大写 + methodList.add(Character.toUpperCase(attributeName.charAt(0)) + attributeName.substring(1)); + } + } + return methodList.toArray(new String[0]); + } + + 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..905baa7 --- /dev/null +++ b/win-framework/win-spring-boot-starter-excel/src/main/java/com/win/framework/excel/core/util/ExcelUtils.java @@ -0,0 +1,180 @@ +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; +// } + + + /** + * 写入本地文件 + * @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); + // import_error文件用于存放导入失败的文件 + File errorFile =new File(webProperties.getProfile() + "/" + "import_error"); + //如果文件夹不存在则创建 + if(!errorFile.exists() && !errorFile.isDirectory()){ + errorFile.mkdirs(); + } + File file = ResourceUtils.getFile( webProperties.getProfile() + "/" + "import_error"+"/"+ fileName); + EasyExcel.write(file).sheet(sheetName).doWrite(dataList); + return Constant.RESOURCE_IMPORT_ERROR_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..c37ae9e --- /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.DataSourceProperty; +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.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); + dataSourceMap.put(DataSourceEnum.SHARDING, shardingSphereDataSource); + //打开下面的代码可以把 shardingjdbc 管理的数据源也交给动态数据源管理 (根据自己需要选择开启) + //dataSourceMap.putAll(((MasterSlaveDataSource) masterSlaveDataSource).getDataSourceMap()); + 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..daf0616 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/datasource/core/enums/DataSourceEnum.java @@ -0,0 +1,31 @@ +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"; + + /** + * 主库,推荐使用 {@link com.baomidou.dynamic.datasource.annotation.Master} 注解 + */ + String SQL_SERVER_All = "sql-server-all"; + /** + * 主库,推荐使用 {@link com.baomidou.dynamic.datasource.annotation.Master} 注解 + */ + String SQL_SERVER_ONE = "sql-server-one"; + +} 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/DataScopeInterceptor.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/DataScopeInterceptor.java new file mode 100644 index 0000000..83b3eec --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/DataScopeInterceptor.java @@ -0,0 +1,56 @@ +package com.win.framework.mybatis.config; + +import com.baomidou.mybatisplus.core.toolkit.PluginUtils; +import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; +import com.win.framework.common.context.DataScopeHolder; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; + +import java.sql.SQLException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @ClassName DataScopeInterceptor + * @Description TODO + * @Author longlongxiaogege + * @Date 2023/6/27 13:21 + * @Version 1.0 + */ +@Slf4j +public class DataScopeInterceptor implements InnerInterceptor { + + @Override + public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { + String buildSql = boundSql.getSql(); + Object dataScopeSql = DataScopeHolder.getDataScopeSql(); + if (dataScopeSql != null) { + Pattern patternOrder = Pattern.compile("ORDER(\\s+)BY", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);//匹配ORDER BY正则 + Pattern patternGroup = Pattern.compile("GROUP(\\s+)BY", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);//匹配GROUP BY正则 + Matcher matcherOrder = patternOrder.matcher(buildSql); + Matcher matcherGroup = patternGroup.matcher(buildSql); + Pattern patternCount = Pattern.compile("COUNT", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);//匹配ORDER BY正则 + Matcher matcherCount = patternCount.matcher(buildSql); + //不带COUNT时清除数据权限sql + if (!matcherCount.find()) { + DataScopeHolder.removeDataScopeSql(); + } + if (buildSql.contains("WHERE")) {//带where + buildSql = buildSql.replaceFirst("WHERE", " WHERE (" + dataScopeSql.toString() + ") AND "); + } else if (matcherOrder.find()) {//带order by + buildSql = matcherOrder.replaceFirst(" WHERE (" + dataScopeSql.toString() + ") ORDER BY"); + } else if (matcherGroup.find()) {//带group by + buildSql = matcherGroup.replaceFirst(" WHERE (" + dataScopeSql.toString() + ") GROUP BY"); + } else {//什么都不带 + buildSql += " WHERE (" + dataScopeSql.toString() + ")"; + } + PluginUtils.MPBoundSql mpBoundSql = PluginUtils.mpBoundSql(boundSql); + mpBoundSql.sql(buildSql); + } + } + +} 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..884eeea --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/config/WinMybatisAutoConfiguration.java @@ -0,0 +1,66 @@ +package com.win.framework.mybatis.config; + +import cn.hutool.core.util.StrUtil; +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.OptimisticLockerInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.win.framework.mybatis.core.handler.DefaultDBFieldHandler; +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 DataScopeInterceptor()); // 数据拦截 + mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); // 分页插件 + mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 乐观锁 + 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..bdb2409 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/BaseDO.java @@ -0,0 +1,52 @@ +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/dataobject/ConcurrencyDO.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/ConcurrencyDO.java new file mode 100644 index 0000000..9b2f066 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/ConcurrencyDO.java @@ -0,0 +1,23 @@ +package com.win.framework.mybatis.core.dataobject; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.Version; +import lombok.Data; + +/** + * 基础实体对象 + * + * @author 闻荫源码 + */ +@Data +public abstract class ConcurrencyDO extends IdDO { + + /** + * 并发乐观锁 + */ + @Version + @TableField(fill = FieldFill.INSERT) + private Integer ConcurrencyStamp; + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/IdDO.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/IdDO.java new file mode 100644 index 0000000..a1ef5bb --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/IdDO.java @@ -0,0 +1,21 @@ +package com.win.framework.mybatis.core.dataobject; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +/** + * 基础实体对象 + * + * @author 闻荫源码 + */ +@Data +public abstract class IdDO extends BaseDO { + + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/MasterDO.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/MasterDO.java new file mode 100644 index 0000000..478bbfe --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/dataobject/MasterDO.java @@ -0,0 +1,62 @@ +package com.win.framework.mybatis.core.dataobject; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; + +import java.time.LocalDateTime; + + +/** + * 基础实体对象 + * + * @author 闻荫源码 + */ +@Data +public abstract class MasterDO extends ConcurrencyDO { + + /** + * 是否可用 + */ + private String available; + + /** + * 生效时间 + */ + private LocalDateTime activeTime; + + /** + * 生效时间 + */ + private LocalDateTime expireTime; + + /** + * 备注 + */ + private String remark; + + /** + * 删除时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime deletionTime; + + /** + * 删除者,目前使用 SysUser 的 id 编号 + *

+ * 使用 String 类型的原因是,未来可能会存在非数值的情况,留好拓展性。 + */ + @TableField(fill = FieldFill.INSERT_UPDATE, jdbcType = JdbcType.VARCHAR) + private String deleterId; + + /** + * 扩展属性 + */ + private String extraProperties; + + /** + * 地点ID + */ + private String siteId; + +} 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/java/com/win/framework/mybatis/core/viewobject/BaseVO.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/viewobject/BaseVO.java new file mode 100644 index 0000000..8a3a776 --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/viewobject/BaseVO.java @@ -0,0 +1,40 @@ +package com.win.framework.mybatis.core.viewobject; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** + * 基础实体对象 + * + * @author 闻荫源码 + */ +@Data +public abstract class BaseVO implements Serializable { + + @Schema(description = "id", example = "id") + private Long id; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime createTime; + + @Schema(description = "最后更新时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime updateTime; + + @Schema(description = "创建者") + private String creator; + + @Schema(description = "更新者") + private String updater; + + @Schema(description = "是否删除") + private Boolean deleted; + +} diff --git a/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/viewobject/MasterVO.java b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/viewobject/MasterVO.java new file mode 100644 index 0000000..f23c91a --- /dev/null +++ b/win-framework/win-spring-boot-starter-mybatis/src/main/java/com/win/framework/mybatis/core/viewobject/MasterVO.java @@ -0,0 +1,52 @@ +package com.win.framework.mybatis.core.viewobject; + +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; + + +/** + * 基础实体对象 + * + * @author 闻荫源码 + */ +@Data +public abstract class MasterVO extends BaseVO{ + + @Schema(description = "是否可用", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "是否可用不能为空") + private String available; + + @Schema(description = "生效时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime activeTime; + + @Schema(description = "失效时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime expireTime; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "删除时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime deletionTime; + + @Schema(description = "删除者") + private String deleterId; + + @Schema(description = "扩展属性") + private String extraProperties; + + @Schema(description = "地点ID") + private String siteId; + + @Schema(description = "并发乐观锁") + private Integer ConcurrencyStamp; + +} 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..7e8ccce --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/config/WinWebAutoConfiguration.java @@ -0,0 +1,170 @@ +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() + "/"); + registry.addResourceHandler(Constant.RESOURCE_PREFIX + "/**", Constant.STATIC_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..c22347a --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/constant/Constant.java @@ -0,0 +1,20 @@ +package com.win.framework.web.constant; + +public class Constant { + + /** + * 资源映射路径 前缀 + */ + public static final String RESOURCE_PREFIX = "/profile/"; + + /** + * 导入excel失败 + */ + public static final String RESOURCE_IMPORT_ERROR_PREFIX = "/profile/import_error/"; + + /** + * 静态资源路径 + */ + public static final String STATIC_RESOURCE_PREFIX="/admin-api/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..814b4f3 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/filter/MyI18nInterceptor.java @@ -0,0 +1,43 @@ +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 + 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..6ddf161 --- /dev/null +++ b/win-framework/win-spring-boot-starter-web/src/main/java/com/win/framework/web/core/handler/GlobalExceptionHandler.java @@ -0,0 +1,339 @@ +package com.win.framework.web.core.handler; + +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.exceptions.UtilException; +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); + } + if (ex instanceof UtilException) { + return utilExceptionHandler((UtilException) 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()); + } + + /** + * 处理业务异常 ServiceException + * + * 例如说,商品库存不足,用户手机号已存在。 + */ + @ExceptionHandler(value = UtilException.class) + public CommonResult utilExceptionHandler(UtilException ex) { + log.info("[utilExceptionHandler]", ex); + return CommonResult.error(600, 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..2474331 --- /dev/null +++ b/win-module-bpm/win-module-bpm-api/src/main/java/com/win/module/bpm/enums/ErrorCodeConstants.java @@ -0,0 +1,67 @@ +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-eam/pom.xml b/win-module-eam/pom.xml new file mode 100644 index 0000000..3b93776 --- /dev/null +++ b/win-module-eam/pom.xml @@ -0,0 +1,23 @@ + + + + com.win + win + ${revision} + + 4.0.0 + + win-module-eam-api + win-module-eam-biz + + win-module-eam + pom + + ${project.artifactId} + + mes 模块下,我们放通用业务,支撑上层的核心业务。 + + + diff --git a/win-module-eam/win-module-eam-api/pom.xml b/win-module-eam/win-module-eam-api/pom.xml new file mode 100644 index 0000000..1cb3e3b --- /dev/null +++ b/win-module-eam/win-module-eam-api/pom.xml @@ -0,0 +1,34 @@ + + + + com.win + win-module-eam + ${revision} + + 4.0.0 + win-module-eam-api + jar + + ${project.artifactId} + + mes 模块 API,暴露给其它模块调用 + + + + + com.win + win-common + + + + + org.springframework.boot + spring-boot-starter-validation + true + + + + + diff --git a/win-module-eam/win-module-eam-api/src/main/java/com/win/module/eam/api/package-info.java b/win-module-eam/win-module-eam-api/src/main/java/com/win/module/eam/api/package-info.java new file mode 100644 index 0000000..fe80bd0 --- /dev/null +++ b/win-module-eam/win-module-eam-api/src/main/java/com/win/module/eam/api/package-info.java @@ -0,0 +1,4 @@ +/** + * System API 包,定义暴露给其它模块的 API + */ +package com.win.module.eam.api; diff --git a/win-module-eam/win-module-eam-api/src/main/java/com/win/module/eam/enums/DictTypeConstants.java b/win-module-eam/win-module-eam-api/src/main/java/com/win/module/eam/enums/DictTypeConstants.java new file mode 100644 index 0000000..b791d5b --- /dev/null +++ b/win-module-eam/win-module-eam-api/src/main/java/com/win/module/eam/enums/DictTypeConstants.java @@ -0,0 +1,104 @@ +package com.win.module.eam.enums; + +/** + * System 字典类型的枚举类 + * + * @author 闻荫源码 + */ +public interface DictTypeConstants { + + String ITEM_STATUS = "item_status";// 物品状态 + + String UOM = "uom";// 计量单位 + + String TRUE_FALSE = "true_false";// 是否 + + String CLASSIFICATION = "classification";// ABC类 + + String ITEM_TYPE = "item_type";// 物品类型 + + String ITEM_CATEGORY = "Item_category";// 物品种类 + + String ITEM_SUBJECT = "item_subject";// 物品科目 + + + String ITEM_REGION = "item_region";// 物品区域 + + String ITEM_GROUP = "item_group";// 物品分组 + + String ITEM_COLOR = "item_color";// 物品颜色 + + String ITEM_CONFIGURATION = "item_configuration";// 物品配置 + + String EQ_LEVEL = "eq_level";// 质量等级 + + String PACK_UNIT = "pack_unit";//包装单位 + + String CURRENCY = "currency";//货币 + + String SUPPLIER_TYPE = "supplier_type";//供应商类型 + + String SETTLEMENT_TYPE = "settlement_type";//结算类型 + + String CUSTOMER_TYPE = "customer_type";//客户类型 + + String WAREHOUSE_TYPE = "warehouse_type";//仓库类型 + + String DOCK_TYPE = "dock_type";//月台类型 + + String LOCATION_AREA_TYPE = "location_area_type";//库区类型 + + String DEVICE_MOLD_TYPE = "device_mold_type";//设备或模具类型 + + String DEVICEMOLDITEMS_STATUS = "devicemolditems_status"; // 项类型 + + String EXECUTION_CYCLE = "execution_cycle"; // 保养周期 + + String ERP_LOCATION = "erp_location";//ERP库位 + + String LOCATION_TYPE = "location_type";//库位类型 + + String WORKSHOP_TYPE = "workshop_type";//车间类型 + + String PRODUCTION_LINE_TYPE = "production_line_type";//生产线类型 + String VEHICLE_PLATE_NUMBER = "vehicle_plate_number";//车牌号 + + String WORK_STATION_TYPE = "work_station_type";//工位类型 + + String PROCESS_TYPE = "process_type";//工序类型 + String STRATEGY_PARAM_OPEARTOR = "strategy_param_opeartor";//策略参数操作符 NULL >= <= == != + String DATA_TYPE = "data_type";//数据类型 + String STRATEGY_TYPE = "strategy_type";//策略类型 + String DOCUMENT_TYPE = "document_type";//单据类型 + String OWNER_TYPE = "owner_type";//货主类型 + String INTERFACE_TYPE = "interface_type";//接口类型 + String REQUEST_MODE = "reqeust_mode";//申请模式 + String LABEL_TYPE = "label_type";//标签类型 + String LABEL_STATUS = "label_status";//标签状态 + String CARRIER_TYPE = "carrier_type";//承运商类型 + String INVENTORY_STATUS = "inventory_status";//库存状态 + String REQUEST_STATUS = "request_status";//请求状态 + String PLAN_STATUS = "plan_status";//计划状态 + String PURCHASE_PLAN_STATUS = "purchase_plan_status";//计划状态 + String PURCHASE_ORDER_TYPE = "purchase_order_type";//采购订单类型 + String PURCHASE_RETURN_REASON = "purchase_return_reason";//原因 + + String TRANSFER_MODE = "transfer_mode";//运输方式 + String FAILED_REASON = "failed_reason";//采购收货不合格原因 + String INSPECT_TYPE = "inspect_type";//检验类型 + String NEXT_ACTION = "next_action";//下一步检验动作 + String SAMPLE_METHOD = "sample_method";//抽检方式 + String INSPECT_FAILED_REASON = "inspect_failed_reason";//不合格原因 + String INSPECT_RESULT = "inspect_result";//检验结果 + String COUNT_DIMENSION = "count_dimension"; // 盘点范围类型 + String COUNT_TYPE = "count_type"; + String JOB_STATUS = "job_status";//任务状态 + String JOB_STAGE_STATUS = "job_stage_status";//任务阶段状态 + String COUNT_STAGE = "count_stage"; //阶段 + String BIND_TYPE = "bind_type"; // 器具绑定类型 + String CONTAINER_TYPE = "container_type"; // 器具类型 + String CONTAINER_STATUS = "container_status"; // 器具状态 + String CONTAINER_CONTENT_TYPE = "container_content_type"; // 器具内容类型 + String EQUIPMENT_INDEX_NAME = "equipment_index_name"; //设备年度目标指标名称分类字段 + String FACTORY_TYPE = "factory_type"; // 月指标导入厂区字典 +} diff --git a/win-module-eam/win-module-eam-api/src/main/java/com/win/module/eam/enums/ErrorCodeConstants.java b/win-module-eam/win-module-eam-api/src/main/java/com/win/module/eam/enums/ErrorCodeConstants.java new file mode 100644 index 0000000..9df6163 --- /dev/null +++ b/win-module-eam/win-module-eam-api/src/main/java/com/win/module/eam/enums/ErrorCodeConstants.java @@ -0,0 +1,161 @@ +package com.win.module.eam.enums; + +import com.win.framework.common.exception.ErrorCode; + +/** + * System 错误码枚举类 + * + * system 系统,使用 1-002-000-000 段 + */ +public interface ErrorCodeConstants { + //厂区 基本信息ErrorCode + ErrorCode FACTORY_AREA_NOT_EXISTS = new ErrorCode(1_000_020_000, "厂区不存在"); + + ErrorCode LOCATION_AREA_HAVE_EXISTS = new ErrorCode(1_000_020_001, "库区编号已存在"); + //库位 基本信息ErrorCode + ErrorCode LOCATION_NOT_EXISTS = new ErrorCode(1_000_020_001, "库位不存在"); + + ErrorCode LOCATION_HAVE_EXISTS = new ErrorCode(1_000_020_001, "库位编号已存在"); + //供应商 基本信息ErrorCode + ErrorCode SUPPLIER_NOT_EXISTS = new ErrorCode(1_000_020_002, "供应商不存在"); + + ErrorCode SUPPLIER_HAVE_EXISTS = new ErrorCode(1_000_020_002, "供应商编号已存在"); + //备件 基本信息ErrorCode + ErrorCode ITEM_NOT_EXISTS = new ErrorCode(1_000_020_003, "备件不存在"); + //采购订单 基本信息ErrorCode + ErrorCode ITEM_ORDER_MAIN_NOT_EXISTS = new ErrorCode(1_000_020_003, "采购订单不存在"); + //设备备件关系 基本信息ErrorCode + ErrorCode DEVICE_ITEM_NOT_EXISTS = new ErrorCode(1_000_020_004, "设备备件关系不存在"); + // 项记录表(设备 模具 保养 维修 巡检点检) + ErrorCode DEVICE_MOLD_ITEMS_NOT_EXISTS = new ErrorCode(1_000_020_005, "项记录表(设备 模具 保养 维修 巡检点检)不存在"); + //固定资产 + ErrorCode FIXED_ASSETS_NOT_EXISTS = new ErrorCode(1_000_020_006, "固定资产不存在"); + ErrorCode REQUEST_REPAIR_NOT_EXISTS = new ErrorCode(1_000_020_007, "维修申请不存在"); + ErrorCode REQUEST_REPAIR_PRE_EXISTS = new ErrorCode(1_000_020_008, "申请已接单不能删除"); + ErrorCode REQUEST_REPAIR_DEL_EXISTS = new ErrorCode(1_000_020_009, "申请已接单不能驳回"); + ErrorCode WEI_XIU_NOT_EXISTS = new ErrorCode(1_000_020_010, "维修人员已接单不能驳回"); + ErrorCode WEI_XIU_ORDER_NOT_EXISTS = new ErrorCode(1_000_020_010, "维修工单不存在"); + ErrorCode JIAN_XIU_ORDER_NOT_PENDING = new ErrorCode(1_000_020_010, "检修工单非待接单状态"); + ErrorCode JIAN_XIU_ORDER_NOT_EXISTS = new ErrorCode(1_000_020_010, "检修工单不存在"); + ErrorCode JIAN_XIU_ORDER_NOT_USER = new ErrorCode(1_000_020_010, "当前操作人与接单人不符"); + ErrorCode JIAN_XIU_ORDER_NOT_POST = new ErrorCode(1_000_020_010, "当前人非维修人员或工程师"); + ErrorCode WEI_XIU_NOT_DJ = new ErrorCode(1_000_020_010, "不能接单"); + ErrorCode WEI_XIU_NOT_WORKER = new ErrorCode(1_000_020_010, "当前人非维修人员,不能接单"); + ErrorCode WEI_XIU_NOT_ENGINEER = new ErrorCode(1_000_020_010, "当前人非维修工程师,不能点击验证"); + ErrorCode WEI_XIU_NOT_WC = new ErrorCode(1_000_020_010, "非接单人员,不能点击完成"); + ErrorCode WEI_XIU_NOT_YZ = new ErrorCode(1_000_020_010, "不能点击验证"); + ErrorCode WEI_XIU_NOT_ZUANBAN = new ErrorCode(1_000_020_010, "当前状态非已接单,不能转办"); + ErrorCode WEI_XIU_NOT_TYPE_ZUANBAN = new ErrorCode(1_000_020_010, "相同类型不能转办"); + + //备件盘点计划ErrorCode + ErrorCode COUNTADJUST_PLAN_NOT_EXISTS = new ErrorCode(1_000_020_011, "备件盘点计划不存在"); + + //备件盘点任务主 + ErrorCode COUNTADJOBJUSTMAIN_NOT_EXISTS = new ErrorCode(1_000_020_012, "备件盘点任务主不存在"); + + //备件盘点任务子 + ErrorCode COUNTADJOBJUSTDETAIL_NOT_EXISTS = new ErrorCode(1_000_020_013, "备件盘点任务子不存在"); + + //备件盘点记录主 + ErrorCode COUNTADRECORD_NOT_EXISTS = new ErrorCode(1_000_020_014, "备件盘点记录主不存在"); + + //备件盘点记录子 + ErrorCode COUNT_DETAIL_NOT_EXISTS = new ErrorCode(1_000_020_015, "备件盘点记录子不存在"); + + //备件盘点调整记录主 + ErrorCode ADJUSTRECORD_NOT_EXISTS = new ErrorCode(1_000_020_016, "备件盘点调整记录主不存在"); + + //备件盘点调整记录子 + ErrorCode ADJUSTDETAILRECORD_NOT_EXISTS = new ErrorCode(1_000_020_017, "备件盘点调整记录子不存在"); + + ErrorCode WEI_XIU_ORDER_DETAILS_NOT_EXISTS = new ErrorCode(1_000_020_010, "维修工单子项不存在"); + + ErrorCode JIAN_XIU_PEOPLE_DIFF = new ErrorCode(1_000_020_010, "当前人与接单人员不一致"); + // ========== 库存事务 TODO 补充编号 ========== + ErrorCode TRANSACTION_NOT_EXISTS = new ErrorCode(1_000_020_018, "库存事务不存在"); + //巡检点检 + ErrorCode XUN_JIAN_ORDER_NOT_EXISTS = new ErrorCode(1_000_020_019, "巡检工单不存在"); + + ErrorCode ATTACHMENT_FILE_NOT_EXISTS = new ErrorCode(1_000_020_020, "附件文件不存在"); + + //备件入库记录 + ErrorCode ITEM_IN_LOCATION_NOT_EXISTS = new ErrorCode(1_000_020_021, "备件入库记录不存在"); + + //备件出库记录 + ErrorCode ITEM_OUT_LOCATION_NOT_EXISTS = new ErrorCode(1_000_020_022, "备件出库记录不存在"); + //库存是否充足 + ErrorCode COUNT_IS_HAVA = new ErrorCode(1_000_020_019, "库存不足!"); + ErrorCode ITEM_APPLY_MAIN_NOT_EXISTS = new ErrorCode(1_000_020_020, "备件申请不存在"); + ErrorCode ITEM_APPLY_DETAILS_NOT_EXISTS = new ErrorCode(1_000_020_021, "请选择申领的备件"); + ErrorCode ITEM_APPLY_CANCEL_NOT = new ErrorCode(1_000_020_022, "该申领已审批不能撤回"); + ErrorCode ITEM_APPLY_APPROVE_NOT = new ErrorCode(1_000_020_023, "该申领状态非待审批"); + ErrorCode ITEM_APPLY_APPROVE_USER = new ErrorCode(1_000_020_024, "当前人无审批权限"); + ErrorCode INFRA_CONFIG_NOT_EXIST = new ErrorCode(1_000_020_025, "缺少工单生成提前天数系统配置"); + + ErrorCode ITEM_APPLY_APPROVE_OUT_NOT = new ErrorCode(1_000_020_026, "该申领状态非审核通过或者出库中"); + ErrorCode APPLAY_ITEM_EXCLUDE = new ErrorCode(1_000_020_027, "该配件不在申领范围内"); + ErrorCode LOCATION_ITEM_NOT = new ErrorCode(1_000_020_028, "该库位没有绑定备件"); + ErrorCode ITEM_APPLY_NUM_OVERFLOW = new ErrorCode(1_000_020_029, "备件出库数量大于申领数量"); + ErrorCode MOLD_MILESTONE_NOT_EXISTS = new ErrorCode(1_000_020_030, "里程碑不存在"); + ErrorCode PURCHASE_ITEM_EXCLUDE = new ErrorCode(1_000_020_029, "该配件不在采购订单范围内"); + ErrorCode PURCHASE_ITEM_COMPLETE = new ErrorCode(1_000_020_030, "该配件采购数量已足额"); + ErrorCode PURCHASE_ITEM_NOT_EXISTS = new ErrorCode(1_000_020_031, "采购订单不存在"); + ErrorCode PURCHASE_ITEM_ORDER_COMPLETE = new ErrorCode(1_000_020_032, "采购订单已完成"); + ErrorCode PURCHASE_ITEM_ORDER_NUM_OVERFLOW = new ErrorCode(1_000_020_033, "备件收货数量大于采购数量"); + ErrorCode ITEM_DATA_NOT_EMPTY = new ErrorCode(1_000_020_034, "零件不能为空"); + ErrorCode ITEM_RETURN_FALSE = new ErrorCode(1_000_020_035, "备件归还的库位必须是账外库"); + ErrorCode PURCHASE_ITEM_ORDER_TRUE = new ErrorCode(1_000_020_036, "采购入库的库位必须是账内库"); + ErrorCode FACTORY_NO_NOMAL = new ErrorCode(1_000_020_037, "当前人员厂区与工单来源的厂区不一致"); + ErrorCode CLASSTYPR_NO_NOMAL = new ErrorCode(1_000_020_038, "当前人员所属班组无法操作工单"); + ErrorCode PEOPLE_NO_NOMAL = new ErrorCode(1_000_020_039, "当前人无法执行撤销操作"); + ErrorCode DEVICE_ORITEM_NOMAL = new ErrorCode(1_000_020_040, "该设备或模具已在检修中不可重复"); + ErrorCode WEI_XIU_ORITEM_NOMAL = new ErrorCode(1_000_020_040, "该维修工单已在检修中"); + ErrorCode DEVICE_INTERNAL_AUDIT_NOT_EXISTS = new ErrorCode(1_000_020_040, "设备内审业务说明不存在"); + ErrorCode BAO_YANG_JOB_NOT_EXISTS = new ErrorCode(1_000_020_040, "保养工单不存在"); + ErrorCode ITEM_LOCATION_REPLACE_NOT_EXISTS = new ErrorCode(1_000_020_041, "备件库位变更记录不存在"); + ErrorCode MAINTAIN_BACK_NOT_EXISTS = new ErrorCode(1_000_020_042, "设备保养变更记录不存在"); + ErrorCode LOCATION_CAN_NOT_DELETE = new ErrorCode(1_000_020_043, "该库区已经存在于其他库位,不允许删除"); + ErrorCode LOCATION_CAN_NOT_REPLACE = new ErrorCode(1_000_020_043, "该备件编号已存在于其他库位中!"); + + ErrorCode DEVICE_NO_EXISTS = new ErrorCode(1_000_020_044, "该设备不存在"); + ErrorCode DEVICE_TYPE_NO_NORMAL = new ErrorCode(1_000_020_045, "该设备与类型不符"); + ErrorCode MOLD_NO_EXISTS = new ErrorCode(1_000_020_046, "该模具不存在"); + ErrorCode NOLD_TYPE_NO_NORMAL = new ErrorCode(1_000_020_047, "该模具与类型不符"); + ErrorCode DEVICE_STATUS_0 = new ErrorCode(1_000_020_048, "该设备正在维修中"); + ErrorCode MOLD_STATUS_0 = new ErrorCode(1_000_020_049, "该模具正在维修中"); + ErrorCode FACTORY_DEVICE_NO_NORMAL = new ErrorCode(1_000_020_047, "该设备所属厂区与当前人所在厂区不符"); + ErrorCode FACTORY_MOLD_NO_NORMAL = new ErrorCode(1_000_020_047, "该模具所属厂区与当前人所在厂区不符"); + + ErrorCode LOCATION_CAN_NOT_REPLACE2 = new ErrorCode(1_000_020_044, "该库位已存在!"); + ErrorCode ITEM_IS_HAVE= new ErrorCode(1_000_020_045, "该备件已存在!"); + ErrorCode ProducePlan_NOT_EXISTS= new ErrorCode(1_000_020_046, "生产计划不存在!"); + ErrorCode ITEM_CAN_NOT_DELETE= new ErrorCode(1_000_020_045, "该备件已存在于备件台账,不允许删除!"); + ErrorCode MOLD_ACCOUNT_EXISTS = new ErrorCode(1_000_020_050, "该编号模具已存在!"); + ErrorCode FALSE_LOCATION_ACCOUNT_EXISTS = new ErrorCode(1_000_020_051, "该备件有账外库且库存大于0,应该优先出账外库"); + ErrorCode OUT_BIG_APPLY = new ErrorCode(1_000_020_052, "出库数量大于申领数量"); + ErrorCode OUT_BIG_INVENTORY = new ErrorCode(1_000_020_053, "出库数量大于库存"); + ErrorCode YEAR_INDEX_NOT_EXISTS = new ErrorCode(1_000_020_054, "年度计划不存在"); + ErrorCode YEAR_INDEX_EXISTS = new ErrorCode(1_000_020_055, "当前存在年份厂区类型一致的数据请勿重复添加"); + ErrorCode INVALID_TEMPLATE = new ErrorCode(1_000_020_056, "模版中存在无效数据,导入失败!"); + ErrorCode DEVICE_MOLD_ITEMS_HISTORY_NOT_EXISTS = new ErrorCode(1_000_020_056, "模板修改历史不存在,导入失败!"); + ErrorCode DEVICE_MOLD_ITEMS_HISTORY_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_000_020_056, "模板修改历史不存在,导入失败!"); + + + ErrorCode WEI_XIU_ORDER_NOT_EXISTS_APPLY = new ErrorCode(1_000_020_057, "当前工单无报修申请"); + ErrorCode WEI_XIU_ORDER_APPLY_NOT_CONFORM = new ErrorCode(1_000_020_058, "当前操作人非报修人"); + ErrorCode WEI_XIU_ORDER_APPLY_NOT_EMPTY = new ErrorCode(1_000_020_059, "申请确认结果不能为空"); + ErrorCode JIAN_XIU_MAINTENANCE_NOT_EMPTY = new ErrorCode(1_000_020_060, "检修人员不能为空"); + ErrorCode JIAN_XIU_NOT_COMPLETED = new ErrorCode(1_000_020_061, "当前工单状态非完成状态,不能验证"); + ErrorCode JIAN_XIU_NOT_PENDING = new ErrorCode(1_000_020_061, "当前工单状态非待接单状态,不能接单"); + ErrorCode JIAN_XIU_NOT_VERIFY = new ErrorCode(1_000_020_061, "当前工单需要报修人确认,不能验证"); + ErrorCode BASIC_MONTH_EQUIPMENT_NOT_EXISTS = new ErrorCode(1_000_020_062, "设备月指标不存在"); + ErrorCode YEAR_NOT_DELETE = new ErrorCode(1_000_020_063, "当前年份类型厂区存在月指标数据无法删除"); + ErrorCode CLASS_TYPE_NOT_EXISTS = new ErrorCode(1_000_020_063, "数据不存在"); + ErrorCode CLASS_TYPE_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_000_020_063, "数据不存在"); + + ErrorCode WORKER_ENGINEER_IS_NOT = new ErrorCode(1_000_020_063, "当前非工程师和维修工"); + + ErrorCode CLASS_TYPE_DATA_REPEAT = new ErrorCode(1_000_020_063, "厂区和班组固定,不能重复"); + +} + diff --git a/win-module-eam/win-module-eam-api/src/main/java/com/win/module/eam/enums/package-info.java b/win-module-eam/win-module-eam-api/src/main/java/com/win/module/eam/enums/package-info.java new file mode 100644 index 0000000..88e25d4 --- /dev/null +++ b/win-module-eam/win-module-eam-api/src/main/java/com/win/module/eam/enums/package-info.java @@ -0,0 +1,4 @@ +/** + * System API 包,定义暴露给其它模块的 API + */ +package com.win.module.eam.enums; diff --git a/win-module-eam/win-module-eam-biz/pom.xml b/win-module-eam/win-module-eam-biz/pom.xml new file mode 100644 index 0000000..a501a4f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/pom.xml @@ -0,0 +1,129 @@ + + + + com.win + win-module-eam + ${revision} + + 4.0.0 + win-module-eam-biz + jar + + ${project.artifactId} + + mes 模块下,我们放通用业务,支撑上层的核心业务。 + + + + + com.win + win-module-system-api + ${revision} + + + com.win + win-module-infra-api + ${revision} + + + com.win + win-module-eam-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 + + + + org.dom4j + dom4j + 2.0.0 + + + + com.win + win-spring-boot-starter-captcha + + + + org.springframework.boot + spring-boot-starter-mail + + + com.alibaba + fastjson + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/api/package-info.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/api/package-info.java new file mode 100644 index 0000000..fe80bd0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/api/package-info.java @@ -0,0 +1,4 @@ +/** + * System API 包,定义暴露给其它模块的 API + */ +package com.win.module.eam.api; diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/AdjustRecordDetailController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/AdjustRecordDetailController.java new file mode 100644 index 0000000..6c53f8b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/AdjustRecordDetailController.java @@ -0,0 +1,133 @@ +package com.win.module.eam.controller.adjustRecord; + +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.eam.controller.adjustRecord.vo.*; +import com.win.module.eam.convert.adjustRecord.AdjustRecordDetailConvert; +import com.win.module.eam.dal.dataobject.adjustRecord.AdjustRecordDetailDO; +import com.win.module.eam.service.adjustRecord.AdjustRecordDetailService; +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.Arrays; +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("/eam/adjustRecordDetail") +@Validated +public class AdjustRecordDetailController { + + @Resource + private AdjustRecordDetailService Service; + + @PostMapping("/create") + @Operation(summary = "创建备件盘点调整记录子") + @PreAuthorize("@ss.hasPermission('adjustRecordDetail::create')") + public CommonResult create(@Valid @RequestBody AdjustRecordDetailCreateReqVO createReqVO) { + return success(Service.create(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新备件盘点调整记录子") + @PreAuthorize("@ss.hasPermission('adjustRecordDetail::update')") + public CommonResult update(@Valid @RequestBody AdjustRecordDetailUpdateReqVO updateReqVO) { + int result = Service.update(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除备件盘点调整记录子") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('adjustRecordDetail::delete')") + public CommonResult delete(@RequestParam("id") Long id) { + int result = Service.delete(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得备件盘点调整记录子") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('adjustRecordDetail::query')") + public CommonResult get(@RequestParam("id") Long id) { + AdjustRecordDetailDO adjustRecordDetailDO = Service.get(id); + return success(AdjustRecordDetailConvert.INSTANCE.convert(adjustRecordDetailDO)); + } + + @GetMapping("/list") + @Operation(summary = "获得备件盘点调整记录子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('adjustRecordDetail::query')") + public CommonResult> getList(@RequestParam("ids") Collection ids) { + List list = Service.getList(ids); + return success(AdjustRecordDetailConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得备件盘点调整记录子分页") + @PreAuthorize("@ss.hasPermission('adjustRecordDetail::query')") + public CommonResult> getPage(@Valid AdjustRecordDetailPageReqVO pageVO) { + PageResult pageResult = Service.getPage(pageVO); + return success(AdjustRecordDetailConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出备件盘点调整记录子 Excel") + @PreAuthorize("@ss.hasPermission('adjustRecordDetail::export')") + @OperateLog(type = EXPORT) + public void exportExcel(@Valid AdjustRecordDetailExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = Service.getList(exportReqVO); + // 导出 Excel + List datas = AdjustRecordDetailConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "备件盘点调整记录子.xls", "数据", AdjustRecordDetailExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入备件盘点调整记录子模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "备件盘点调整记录子基本信息导入模板.xls", "备件盘点调整记录子基本信息列表", AdjustRecordDetailExcelVO.class, list); + } + +// @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('adjustRecordDetail::import')") +// 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 list = ExcelUtils.read(file, AdjustRecordDetailExcelVO.class); +// List errorList = Service.importAdjustRecordDetailList(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")) + ".xlsx", "错误列表", errorList); +// returnMap.put("errorFile", url); +// } +// +// return success(returnMap); +// } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/AdjustRecordMainController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/AdjustRecordMainController.java new file mode 100644 index 0000000..b8db351 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/AdjustRecordMainController.java @@ -0,0 +1,117 @@ +package com.win.module.eam.controller.adjustRecord; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.adjustRecord.vo.*; +import com.win.module.eam.convert.adjustRecord.AdjustRecordMainConvert; +import com.win.module.eam.dal.dataobject.adjustRecord.AdjustRecordMainDO; +import com.win.module.eam.service.adjustRecord.AdjustRecordMainService; +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.Arrays; +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("/eam/adjustRecordMain") +@Validated +public class AdjustRecordMainController { + + @Resource + private AdjustRecordMainService Service; + + @PostMapping("/create") + @Operation(summary = "创建备件盘点调整记录主") + @PreAuthorize("@ss.hasPermission('adjustRecordMain::create')") + public CommonResult create(@Valid @RequestBody AdjustRecordMainCreateReqVO createReqVO) { + return success(Service.create(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新备件盘点调整记录主") + @PreAuthorize("@ss.hasPermission('adjustRecordMain::update')") + public CommonResult update(@Valid @RequestBody AdjustRecordMainUpdateReqVO updateReqVO) { + int result = Service.update(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除备件盘点调整记录主") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('adjustRecordMain::delete')") + public CommonResult delete(@RequestParam("id") Long id) { + int result = Service.delete(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得备件盘点调整记录主") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('adjustRecordMain::query')") + public CommonResult get(@RequestParam("id") Long id) { + AdjustRecordMainDO adjustRecordMainDO = Service.get(id); + return success(AdjustRecordMainConvert.INSTANCE.convert(adjustRecordMainDO)); + } + + @GetMapping("/list") + @Operation(summary = "获得备件盘点调整记录主列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('adjustRecordMain::query')") + public CommonResult> getList(@RequestParam("ids") Collection ids) { + List list = Service.getList(ids); + return success(AdjustRecordMainConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得备件盘点调整记录主分页") +// @PreAuthorize("@ss.hasPermission('adjustRecordMain::query')") + public CommonResult> getPage(@Valid AdjustRecordMainPageReqVO pageVO) { + PageResult pageResult = Service.getPage(pageVO); + return success(AdjustRecordMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出备件盘点调整记录主 Excel") + @PreAuthorize("@ss.hasPermission('adjustRecordMain::export')") + @OperateLog(type = EXPORT) + public void exportExcel(@Valid AdjustRecordMainExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = Service.getList(exportReqVO); + // 导出 Excel + List datas = AdjustRecordMainConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "备件盘点调整记录主.xls", "数据", AdjustRecordMainExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入备件盘点调整记录主模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "备件盘点调整记录主基本信息导入模板.xls", "备件盘点调整记录主基本信息列表", AdjustRecordMainExcelVO.class, list); + } + + @PostMapping("/senior") + @Operation(summary = "高级搜索获得账期日历分页") +// @PreAuthorize("@ss.hasPermission('wms:location:query')") + public CommonResult> getLocationSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = Service.getAdjustRecordMainSenior(conditions); + PageResult result = AdjustRecordMainConvert.INSTANCE.convertPage(pageResult); + return success(result); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailBaseVO.java new file mode 100644 index 0000000..e8867c9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailBaseVO.java @@ -0,0 +1,45 @@ +package com.win.module.eam.controller.adjustRecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 备件盘点调整记录子 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class AdjustRecordDetailBaseVO { + + private Long id; + + private Long masterId; + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "编号唯一标识不能为空") + private String number; + + @Schema(description = "库位编码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "库位编码不能为空") + private String locationNumber; + + @Schema(description = "库区编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "库区编号不能为空") + private String areaNumber; + + @Schema(description = "备件编码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "备件编码不能为空") + private String itemNumber; + + @Schema(description = "库存数量", requiredMode = Schema.RequiredMode.REQUIRED) + private BigDecimal qty; + + @Schema(description = "盘点数量", requiredMode = Schema.RequiredMode.REQUIRED) + private BigDecimal countQty; + + @Schema(description = "差异数量", requiredMode = Schema.RequiredMode.REQUIRED) + private BigDecimal differenceQty; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailCreateReqVO.java new file mode 100644 index 0000000..3e4e648 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.adjustRecord.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 备件盘点调整记录子创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class AdjustRecordDetailCreateReqVO extends AdjustRecordDetailBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailExcelVO.java new file mode 100644 index 0000000..4e14970 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailExcelVO.java @@ -0,0 +1,37 @@ +package com.win.module.eam.controller.adjustRecord.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 备件盘点调整记录子 Excel VO + * + * @author 超级管理员 + */ +@Data +public class AdjustRecordDetailExcelVO { + + @ExcelProperty("编号唯一标识") + private String number; + + @ExcelProperty("库位编码") + private String locationNumber; + + @ExcelProperty("库区编号") + private String areaNumber; + + @ExcelProperty("备件编码") + private String itemNumber; + + @ExcelProperty("库存数量") + private BigDecimal qty; + + @ExcelProperty("盘点数量") + private BigDecimal countQty; + + @ExcelProperty("差异数量") + private BigDecimal differenceQty; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailExportReqVO.java new file mode 100644 index 0000000..400ab89 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailExportReqVO.java @@ -0,0 +1,33 @@ +package com.win.module.eam.controller.adjustRecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 备件盘点调整记录子 Excel 导出 Request VO,参数和 AdjustRecordDetailPageReqVO 是一致的") +@Data +public class AdjustRecordDetailExportReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "库位编码") + private String locationNumber; + + @Schema(description = "库区编号") + private String areaNumber; + + @Schema(description = "备件编码") + private String itemNumber; + + @Schema(description = "库存数量") + private BigDecimal qty; + + @Schema(description = "盘点数量") + private BigDecimal countQty; + + @Schema(description = "差异数量") + private BigDecimal differenceQty; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailPageReqVO.java new file mode 100644 index 0000000..c284897 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailPageReqVO.java @@ -0,0 +1,40 @@ +package com.win.module.eam.controller.adjustRecord.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 java.math.BigDecimal; + +@Schema(description = "管理后台 - 备件盘点调整记录子分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class AdjustRecordDetailPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "库位编码") + private String locationNumber; + + @Schema(description = "库区编号") + private String areaNumber; + + @Schema(description = "备件编码") + private String itemNumber; + + @Schema(description = "库存数量") + private BigDecimal qty; + + @Schema(description = "盘点数量") + private BigDecimal countQty; + + @Schema(description = "差异数量") + private BigDecimal differenceQty; + + private Long masterId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailRespVO.java new file mode 100644 index 0000000..cdb54e0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailRespVO.java @@ -0,0 +1,13 @@ +package com.win.module.eam.controller.adjustRecord.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 AdjustRecordDetailRespVO extends AdjustRecordDetailBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailUpdateReqVO.java new file mode 100644 index 0000000..fb2b378 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordDetailUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.adjustRecord.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 AdjustRecordDetailUpdateReqVO extends AdjustRecordDetailBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainBaseVO.java new file mode 100644 index 0000000..b319f43 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainBaseVO.java @@ -0,0 +1,42 @@ +package com.win.module.eam.controller.adjustRecord.vo; + +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 AdjustRecordMainBaseVO { + + private Long id; + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "编号唯一标识不能为空") + private String number; + + @Schema(description = "盘点计划编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "盘点计划编号不能为空") + private String planNumber; + + @Schema(description = "盘点申请编号预留") + private String requestNumber; + + @Schema(description = "申请时间预留") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime requestTime; + + @Schema(description = "任务编号预留") + private String jobNumber; + + @Schema(description = "任务编号预留") + private String recordNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainCreateReqVO.java new file mode 100644 index 0000000..cbf8d1f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.adjustRecord.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 备件盘点调整记录主创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class AdjustRecordMainCreateReqVO extends AdjustRecordMainBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainExcelVO.java new file mode 100644 index 0000000..a5c4d7a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainExcelVO.java @@ -0,0 +1,35 @@ +package com.win.module.eam.controller.adjustRecord.vo; + +import lombok.*; + +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 备件盘点调整记录主 Excel VO + * + * @author 超级管理员 + */ +@Data +public class AdjustRecordMainExcelVO { + + @ExcelProperty("编号唯一标识") + private String number; + + @ExcelProperty("盘点计划编号") + private String planNumber; + + @ExcelProperty("盘点申请编号预留") + private String requestNumber; + + @ExcelProperty("申请时间预留") + private LocalDateTime requestTime; + + @ExcelProperty("任务编号预留") + private String jobNumber; + + @ExcelProperty("任务编号预留") + private String recordNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainExportReqVO.java new file mode 100644 index 0000000..13d835c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainExportReqVO.java @@ -0,0 +1,37 @@ +package com.win.module.eam.controller.adjustRecord.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +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,参数和 AdjustRecordMainPageReqVO 是一致的") +@Data +public class AdjustRecordMainExportReqVO { + + @Schema(description = "id", example = "22248") + private Long id; + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "盘点计划编号") + private String planNumber; + + @Schema(description = "盘点申请编号预留") + private String requestNumber; + + @Schema(description = "申请时间预留") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] requestTime; + + @Schema(description = "任务编号预留") + private String jobNumber; + + @Schema(description = "任务编号预留") + private String recordNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainPageReqVO.java new file mode 100644 index 0000000..df9891f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainPageReqVO.java @@ -0,0 +1,39 @@ +package com.win.module.eam.controller.adjustRecord.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 AdjustRecordMainPageReqVO extends PageParam { + + @Schema(description = "id", example = "22248") + private Long id; + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "盘点计划编号") + private String planNumber; + + @Schema(description = "盘点申请编号预留") + private String requestNumber; + + @Schema(description = "申请时间预留") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] requestTime; + + @Schema(description = "任务编号预留") + private String jobNumber; + + @Schema(description = "任务编号预留") + private String recordNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainRespVO.java new file mode 100644 index 0000000..722cffc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainRespVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.adjustRecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Schema(description = "管理后台 - 备件盘点调整记录主 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class AdjustRecordMainRespVO extends AdjustRecordMainBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainUpdateReqVO.java new file mode 100644 index 0000000..de9254f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/adjustRecord/vo/AdjustRecordMainUpdateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.adjustRecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Schema(description = "管理后台 - 备件盘点调整记录主更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class AdjustRecordMainUpdateReqVO extends AdjustRecordMainBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/AttachmentFileController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/AttachmentFileController.java new file mode 100644 index 0000000..38f6be7 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/AttachmentFileController.java @@ -0,0 +1,182 @@ +package com.win.module.eam.controller.attachmentfile; + +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.eam.controller.attachmentfile.vo.*; +import com.win.module.eam.convert.attachmentfile.AttachmentFileConvert; +import com.win.module.eam.dal.dataobject.attachmentfile.AttachmentFileDO; +import com.win.module.eam.service.attachmentfile.AttachmentFileService; +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.beans.factory.annotation.Value; +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.File; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 设备模具附件文件") +@RestController +@RequestMapping("/eam/attachment-file") +@Validated +public class AttachmentFileController { + + @Resource + private AttachmentFileService attachmentFileService; + + @Value("${win.file.path}") + private String filePath; + + @PostMapping("/create") + @Operation(summary = "创建设备模具附件文件") + @PreAuthorize("@ss.hasPermission('item:replaceItemDes:create')") + public CommonResult createAttachmentFile(@Valid @RequestBody AttachmentFileCreateReqVO createReqVO) { + return success(attachmentFileService.createAttachmentFile(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新设备模具附件文件") + @PreAuthorize("@ss.hasPermission('item:replaceItemDes:update')") + public CommonResult updateAttachmentFile(@Valid @RequestBody AttachmentFileUpdateReqVO updateReqVO) { + int result = attachmentFileService.updateAttachmentFile(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除设备模具附件文件") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('item:replaceItemDes:delete')") + public CommonResult deleteAttachmentFile(@RequestParam("id") Long id) { + + // 根据文件ID查询文件信息 + AttachmentFileDO attachmentFile = attachmentFileService.getAttachmentFile(id); + if (attachmentFile == null) { + throw new RuntimeException("文件不存在"); + } + // 删除文件 + String filePath = attachmentFile.getPath(); + File file = new File(filePath); + if (file.exists()) { + if (!file.delete()) { + throw new RuntimeException("文件删除失败"); + } + } + int result = attachmentFileService.deleteAttachmentFile(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得设备模具附件文件") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('basic:attachment-file:query')") + public CommonResult getAttachmentFile(@RequestParam("id") Long id) { + AttachmentFileDO attachmentFile = attachmentFileService.getAttachmentFile(id); + return success(AttachmentFileConvert.INSTANCE.convert(attachmentFile)); + } + + @GetMapping("/list") + @Operation(summary = "获得设备模具附件文件列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('basic:attachment-file:query')") + public CommonResult> getAttachmentFileList(@RequestParam("ids") Collection ids) { + List list = attachmentFileService.getAttachmentFileList(ids); + return success(AttachmentFileConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得设备模具附件文件分页") +// @PreAuthorize("@ss.hasPermission('basic:attachment-file:query')") + public CommonResult> getAttachmentFilePage(@Valid AttachmentFilePageReqVO pageVO) { + PageResult pageResult = attachmentFileService.getAttachmentFilePage(pageVO); + return success(AttachmentFileConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出设备模具附件文件 Excel") + @PreAuthorize("@ss.hasPermission('item:replaceItemDes:export')") + @OperateLog(type = EXPORT) + public void exportAttachmentFileExcel(@Valid AttachmentFileExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = attachmentFileService.getAttachmentFileList(exportReqVO); + // 导出 Excel + List datas = AttachmentFileConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "设备模具附件文件.xls", "数据", AttachmentFileExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入设备模具附件文件模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "设备模具附件文件基本信息导入模板.xls", "设备模具附件文件基本信息列表", AttachmentFileExcelVO.class, list); + } + + @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('item:replaceItemDes:import')") + 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 list = ExcelUtils.read(file, AttachmentFileExcelVO.class); + List errorList = attachmentFileService.importAttachmentFileList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + + @PostMapping("/upload") + @Operation(summary = "上传文件") + @OperateLog(logArgs = false) + public CommonResult uploadFile(@Valid @RequestBody UploadFileRequest request) throws Exception { + if(request.getFileInfoList()!=null){ + return success(attachmentFileService.uploadFileNew(request)); + }else{ + return success(attachmentFileService.uploadFile(request)); + } + } + + @PostMapping("/listNoPage") + @Operation(summary = "获得设备模具附件文件分页") +// @PreAuthorize("@ss.hasPermission('basic:attachment-file:query')") + public CommonResult> getAttachmentFileListNoPage(@Valid @RequestBody AttachmentFileDO attachmentFileDO) { + List list = attachmentFileService.getAttachmentFileList(attachmentFileDO); + List resultList = list.stream().map(item->{ + FileInfo fileInfo = new FileInfo(); + fileInfo.setName(item.getFileName()); + fileInfo.setUrl(item.getPath()); + fileInfo.setUid(item.getUid()); + return fileInfo; + }).toList(); + return success(resultList); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileBaseVO.java new file mode 100644 index 0000000..4a5312f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileBaseVO.java @@ -0,0 +1,50 @@ +package com.win.module.eam.controller.attachmentfile.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.Version; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 设备模具附件文件 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class AttachmentFileBaseVO { + @Schema(description = "主键") + @TableId(type = IdType.INPUT) + private Long id; + @Schema(description = "设备/模具编号") + private String number; + + @Schema(description = "文件名称", example = "王五") + private String fileName; + + @Schema(description = "文件类型", example = "1") + private String fileType; + + @Schema(description = "文件地址", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "文件地址不能为空") + private String path; + + @Schema(description = "文件大小") + private String size; + + @Schema(description = "功能编码", example = "2") + private String funcCode; + + @Schema(description = "文件业务类型", example = "2") + private String fileBusiType; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "并发乐观锁不能为空") + @Version + private Integer concurrencyStamp; + + @Schema(description = "源编码", example = "1") + private String uid; + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileCreateReqVO.java new file mode 100644 index 0000000..5baa8e7 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileCreateReqVO.java @@ -0,0 +1,30 @@ +package com.win.module.eam.controller.attachmentfile.vo; + +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 java.util.List; + +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 AttachmentFileCreateReqVO extends AttachmentFileBaseVO { + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime createTime; + + @Schema(description = "创建者用户名") + private String creator; + + @Schema(description = "文件路径列表") + private List filePathList; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileExcelVO.java new file mode 100644 index 0000000..fc38ed3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileExcelVO.java @@ -0,0 +1,46 @@ +package com.win.module.eam.controller.attachmentfile.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 设备模具附件文件 Excel VO + * + * @author 超级管理员 + */ +@Data +public class AttachmentFileExcelVO { + + @ExcelProperty("id") + private Long id; + + @ExcelProperty("设备/模具编号") + private String number; + + @ExcelProperty("文件名称") + private String fileName; + + @ExcelProperty("文件类型") + private String fileType; + +// @ExcelProperty("文件地址") + private String path; + + @ExcelProperty("文件大小") + private String size; + + @ExcelProperty("功能编码") + private String funcCode; + + @ExcelProperty("文件业务类型") + private String fileBusiType; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileExportReqVO.java new file mode 100644 index 0000000..ad6ff0d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileExportReqVO.java @@ -0,0 +1,43 @@ +package com.win.module.eam.controller.attachmentfile.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,参数和 AttachmentFilePageReqVO 是一致的") +@Data +public class AttachmentFileExportReqVO { + + @Schema(description = "设备/模具编号") + private String number; + + @Schema(description = "文件名称", example = "王五") + private String fileName; + + @Schema(description = "文件类型", example = "1") + private String fileType; + + @Schema(description = "文件地址") + private String path; + + @Schema(description = "功能编码") + private String funcCode; + + @Schema(description = "文件大小") + private String size; + + @Schema(description = "文件业务类型", example = "2") + private String fileBusiType; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFilePageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFilePageReqVO.java new file mode 100644 index 0000000..ca9dfb0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFilePageReqVO.java @@ -0,0 +1,48 @@ +package com.win.module.eam.controller.attachmentfile.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 AttachmentFilePageReqVO extends PageParam { + + @Schema(description = "设备/模具编号") + private String number; + + @Schema(description = "文件名称", example = "王五") + private String fileName; + + @Schema(description = "文件类型", example = "1") + private String fileType; + + @Schema(description = "文件地址") + private String path; + + @Schema(description = "文件大小") + private String size; + + @Schema(description = "功能编码", example = "2") + private String funcCode; + + @Schema(description = "文件业务类型", example = "2") + private String fileBusiType; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileRespVO.java new file mode 100644 index 0000000..75579ee --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileRespVO.java @@ -0,0 +1,23 @@ +package com.win.module.eam.controller.attachmentfile.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 设备模具附件文件 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class AttachmentFileRespVO extends AttachmentFileBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "29650") + private Long id; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "文件路径列表") + private List filePathList; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileUpdateReqVO.java new file mode 100644 index 0000000..8c8fc88 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/AttachmentFileUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.eam.controller.attachmentfile.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.List; + +@Schema(description = "管理后台 - 设备模具附件文件更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class AttachmentFileUpdateReqVO extends AttachmentFileBaseVO { + @Schema(description = "文件路径列表") + private List filePathList; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/FileInfo.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/FileInfo.java new file mode 100644 index 0000000..8eae977 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/FileInfo.java @@ -0,0 +1,31 @@ +package com.win.module.eam.controller.attachmentfile.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @ClassName FileInfo + * @Description TODO + * @Author longlongxiaogege + * @Date 2024/2/5 09:22 + * @Version 1.0 + */ +@Data +public class FileInfo { + + @Schema(description = "文件名称", example = "王五") + private String name; + + @Schema(description = "文件路径", example = "1") + private String url; + + @Schema(description = "源编码", example = "1") + private String uid; + + @Schema(description = "上传情况", example = "success") + private String status; + + @Schema(description = "编号", example = "1") + private String id; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/UploadFileRequest.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/UploadFileRequest.java new file mode 100644 index 0000000..1fae562 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/attachmentfile/vo/UploadFileRequest.java @@ -0,0 +1,34 @@ +package com.win.module.eam.controller.attachmentfile.vo; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * @ClassName UploadFileRequest + * @Description TODO + * @Author longlongxiaogege + * @Date 2024/2/4 14:18 + * @Version 1.0 + */ +@Data +public class UploadFileRequest { + +// @NotEmpty(message = "文件路径列表不能为空") + private List filePathList; + + @NotBlank(message = "单号不能为空") + private String number; + +// @NotBlank(message = "业务类型不能为空") + private String fileBusiType; + + @NotBlank(message = "功能编码不能为空") + private String funcCode; + + private List fileInfoList; + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/board/BoardController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/board/BoardController.java new file mode 100644 index 0000000..3eaca11 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/board/BoardController.java @@ -0,0 +1,89 @@ +package com.win.module.eam.controller.board; + +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobMainConvert; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.service.board.BoardService; +import com.win.module.system.api.user.AdminUserApi; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.*; +import java.util.*; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.pojo.CommonResult; +import static com.win.framework.common.pojo.CommonResult.success; + + + +@Tag(name = "管理后台 - 大屏看板") +@RestController +@RequestMapping("/eam/board") +@Validated +public class BoardController { + + @Resource + private BoardService boardService; + + @Resource + private AdminUserApi userApi; + + @GetMapping("/getMaintenanceNumbers") + @Operation(summary = "看板获取工单状态数据") + public CommonResult> getMaintenanceNumbers() { + return success(boardService.getMaintenanceNumbers()); + } + + @GetMapping("/getDeviceNumbers") + @Operation(summary = "看板获取设备情况") + public CommonResult> getDeviceNumbers() { + return success(boardService.getDeviceNumbers()); + } + + @GetMapping("/getMoldNumbers") + @Operation(summary = "看板获取模具情况") + public CommonResult> getMoldNumbers() { + return success(boardService.getMoldNumbers()); + } + + @GetMapping("/getAppPage") + @Operation(summary = "看板获得APP维修工单分页") + public CommonResult> getAppPage(@Valid DeviceMaintenanceJobMainPageReqVO pageVO) { + PageResult pageResult = boardService.getAppPage(pageVO); + return success(DeviceMaintenanceJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/getDeviceSealNumberList") + @Operation(summary = "看板获取近30天设备故障次数列表") + public CommonResult>> getDeviceSealNumberList() { + List> list = boardService.getDeviceSealNumberList(); + return success(list); + } + + @GetMapping("/getOrderPieData") + @Operation(summary = "维修工单故障类型数量饼状图") + public CommonResult>> getOrderPieData() { + List> list = boardService.getOrderPieData(); + return success(list); + } + + @GetMapping("/getOrderBarData") + @Operation(summary = "获取近30维修工单数量柱状图") + public CommonResult> getOrderBarData() { + Map map = boardService.getOrderBarData(); + return success(map); + } + + @GetMapping("/getPeopleWorkList") + @Operation(summary = "获得近30天维修人员的维修工作完成情况") + public CommonResult>> getPeopleWorkList() { + List> list = boardService.getPeopleWorkList(); + return success(list); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/board/vo/BoardBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/board/vo/BoardBaseVO.java new file mode 100644 index 0000000..d5d11b5 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/board/vo/BoardBaseVO.java @@ -0,0 +1,75 @@ +package com.win.module.eam.controller.board.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 维修工单主 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class BoardBaseVO { + @Schema(description = "id") + //@NotNull(message = "id") + private Long id; + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "编号唯一标识不能为空") + private String number; + + @Schema(description = "报修工单申请号", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "报修工单申请号不能为空") + private String requestNumber; + + @Schema(description = "描述") + //@NotNull(message = "描述不能为空") + private String describes; + + @Schema(description = "设备模具编号", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "设备模具编号不能为空") + private String deviceNumber; + + @Schema(description = "厂区编号", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "厂区编号不能为空") + private String factoryAreaNumber; + + @Schema(description = "维修人", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "维修人不能为空") + private Long maintenance; + + @Schema(description = "报修人联系电话") + private String maintenancePhone; + + @Schema(description = "完成情况", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + //@NotNull(message = "状态不能为空") + private String status; + + @Schema(description = "工单状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + //@NotNull(message = "状态不能为空") + private String result; + + @Schema(description = "类型设备", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + //@NotNull(message = "类型设备不能为空") + private String type; + + @Schema(description = "地点ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "17996") + //@NotNull(message = "地点ID不能为空") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "故障类型枚举EM、CM、 PM") + private String faultType; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + // @NotNull(message = "并发乐观锁不能为空") + private Integer concurrencyStamp; + + @Schema(description = "班次", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "班次") + private Long classes; + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/board/vo/BoardPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/board/vo/BoardPageReqVO.java new file mode 100644 index 0000000..844c4aa --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/board/vo/BoardPageReqVO.java @@ -0,0 +1,37 @@ +package com.win.module.eam.controller.board.vo; + +import lombok.*; +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 BoardPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "状态", example = "2") + private String status; + + @Schema(description = "类型设备", example = "2") + private String type; + + @Schema(description = "0工单1我的", example = "2") + private String flag; + + @Schema(description = "我的用户", example = "2") + private String userId; + + @Schema(description = "描述", example = "1") + private String describes; + + @Schema(description = "名称", example = "1") + private String name; + + @Schema(description = "故障名称", example = "1") + private String faultTypeName; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/board/vo/BoardRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/board/vo/BoardRespVO.java new file mode 100644 index 0000000..d02bf3a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/board/vo/BoardRespVO.java @@ -0,0 +1,39 @@ +package com.win.module.eam.controller.board.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 BoardRespVO extends BoardBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "部门名称") + private String deptName; + @Schema(description = "厂区") + private String factoryAreaName; + + @Schema(description = "类型") + private String typeName; + + @Schema(description = "维修人") + private String maintenanceName; + + @Schema(description = "名称") + private String name; + + @Schema(description = "故障名称", example = "1") + private String faultTypeName; + + @Schema(description = "类型", example = "1") + private String faultType; + + @Schema(description = "班次", example = "1") + private String classesName; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/ClassTypeController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/ClassTypeController.java new file mode 100644 index 0000000..07f13f4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/ClassTypeController.java @@ -0,0 +1,140 @@ +package com.win.module.eam.controller.classtype; + +import com.win.module.eam.controller.classtype.vo.*; +import io.swagger.v3.oas.annotations.Parameters; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +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.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.*; +import java.io.IOException; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.pojo.CommonResult; +import static com.win.framework.common.pojo.CommonResult.success; + +import com.win.framework.excel.core.util.ExcelUtils; + +import com.win.framework.operatelog.core.annotations.OperateLog; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.win.module.eam.dal.dataobject.classtype.ClassTypeDO; +import com.win.module.eam.convert.classtype.ClassTypeConvert; +import com.win.module.eam.service.classtype.ClassTypeService; +import org.springframework.web.multipart.MultipartFile; + +@Tag(name = "管理后台 - 厂区班组角色数据维护") +@RestController +@RequestMapping("/eam/class-type") +@Validated +public class ClassTypeController { + + @Resource + private ClassTypeService classTypeService; + + @PostMapping("/create") + @Operation(summary = "创建厂区班组角色数据维护") + @PreAuthorize("@ss.hasPermission('eam:class-type:create')") + public CommonResult createClassType(@Valid @RequestBody ClassTypeCreateReqVO createReqVO) { + return success(classTypeService.createClassType(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新厂区班组角色数据维护") + @PreAuthorize("@ss.hasPermission('eam:class-type:update')") + public CommonResult updateClassType(@Valid @RequestBody ClassTypeUpdateReqVO updateReqVO) { + int result = classTypeService.updateClassType(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除厂区班组角色数据维护") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:class-type:delete')") + public CommonResult deleteClassType(@RequestParam("id") Long id) { + int result = classTypeService.deleteClassType(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得厂区班组角色数据维护") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('eam:class-type:query')") + public CommonResult getClassType(@RequestParam("id") Long id) { + ClassTypeDO classType = classTypeService.getClassType(id); + return success(ClassTypeConvert.INSTANCE.convert(classType)); + } + + @GetMapping("/list") + @Operation(summary = "获得厂区班组角色数据维护列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('eam:class-type:query')") + public CommonResult> getClassTypeList(@RequestParam("ids") Collection ids) { + List list = classTypeService.getClassTypeList(ids); + return success(ClassTypeConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得厂区班组角色数据维护分页") + @PreAuthorize("@ss.hasPermission('eam:class-type:query')") + public CommonResult> getClassTypePage(@Valid ClassTypePageReqVO pageVO) { + PageResult pageResult = classTypeService.getClassTypePage(pageVO); + return success(ClassTypeConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出厂区班组角色数据维护 Excel") + @PreAuthorize("@ss.hasPermission('eam:class-type:export')") + @OperateLog(type = EXPORT) + public void exportClassTypeExcel(@Valid ClassTypeExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = classTypeService.getClassTypeList(exportReqVO); + // 导出 Excel + List datas = ClassTypeConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "厂区班组角色数据维护.xls", "数据", ClassTypeExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入厂区班组角色数据维护模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "厂区班组角色数据维护基本信息导入模板.xls", "厂区班组角色数据维护基本信息列表", ClassTypeExcelVO.class, list); + } + + @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('eam:class-type:import')") + 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 list = ExcelUtils.read(file, ClassTypeExcelVO.class); + List errorList = classTypeService.importClassTypeList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeBaseVO.java new file mode 100644 index 0000000..2614692 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeBaseVO.java @@ -0,0 +1,50 @@ +package com.win.module.eam.controller.classtype.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 ClassTypeBaseVO { + + private Long id; + + @Schema(description = "维修工角色id", requiredMode = Schema.RequiredMode.REQUIRED, example = "9908") + @NotNull(message = "维修工角色id不能为空") + private String workerRoleId; + + @Schema(description = "工程师角色id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19989") + @NotNull(message = "工程师角色id不能为空") + private String engineerRoleId; + + @Schema(description = "设备类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "设备类型不能为空") + private String type; + + @Schema(description = "描述") + private String describes; + + @Schema(description = "所属厂区编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "所属厂区编号不能为空") + private String factoryAreaNumber; + + @Schema(description = "地点ID", example = "9009") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "采购部门", example = "6719") + private Long deptId; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeCreateReqVO.java new file mode 100644 index 0000000..74d0392 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.classtype.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 厂区班组角色数据维护创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ClassTypeCreateReqVO extends ClassTypeBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeExcelVO.java new file mode 100644 index 0000000..9fbe95d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeExcelVO.java @@ -0,0 +1,49 @@ +package com.win.module.eam.controller.classtype.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 ClassTypeExcelVO { + + @ExcelProperty("维修工角色id") + private String workerRoleId; + + @ExcelProperty("工程师角色id") + private String engineerRoleId; + + @ExcelProperty("设备类型") + private String type; + + @ExcelProperty("描述") + private String describes; + + @ExcelProperty("所属厂区编号") + private String factoryAreaNumber; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("采购部门") + private Long deptId; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeExportReqVO.java new file mode 100644 index 0000000..f354848 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeExportReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.classtype.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,参数和 ClassTypePageReqVO 是一致的") +@Data +public class ClassTypeExportReqVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypePageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypePageReqVO.java new file mode 100644 index 0000000..7871d9c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypePageReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.classtype.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 ClassTypePageReqVO extends PageParam { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeRespVO.java new file mode 100644 index 0000000..ec71dd6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeRespVO.java @@ -0,0 +1,24 @@ +package com.win.module.eam.controller.classtype.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +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 ClassTypeRespVO extends ClassTypeBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "用户id") + private Long userId; + @Schema(description = "cid") + private String cid; + @Schema(description = "nickname") + private String nickname; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeUpdateReqVO.java new file mode 100644 index 0000000..c8d24ad --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/ClassTypeUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.classtype.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 厂区班组角色数据维护更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ClassTypeUpdateReqVO extends ClassTypeBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/IdentityVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/IdentityVO.java new file mode 100644 index 0000000..b6fd5f8 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/classtype/vo/IdentityVO.java @@ -0,0 +1,32 @@ +package com.win.module.eam.controller.classtype.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * 当前人身份的实体类 包括工程师 维修工类型 哪个班组 哪个厂区的 + */ +@Data +public class IdentityVO { + + @Schema(description = "是否是工程师") + private Boolean Engineer; + @Schema(description = "是否是维修工") + private Boolean worker; + + @Schema(description = "班组") + private String classType; + + @Schema(description = "所属厂区编号") + private String factoryAreaNumber; + + @Schema(description = "维修工角色id", requiredMode = Schema.RequiredMode.REQUIRED, example = "9908") + private String workerRoleId; + + @Schema(description = "工程师角色id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19989") + private String engineerRoleId; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/CountJobDetailController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/CountJobDetailController.java new file mode 100644 index 0000000..83061d1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/CountJobDetailController.java @@ -0,0 +1,134 @@ +package com.win.module.eam.controller.countJob; + +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.eam.controller.countJob.vo.*; +import com.win.module.eam.convert.countJobDetail.CountJobDetailConvert; +import com.win.module.eam.dal.dataobject.countJobDetail.CountJobDetailDO; +import com.win.module.eam.service.countJobDetail.CountJobDetailService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 备件盘点任务子") +@RestController +@RequestMapping("/eam/countJobDetail") +@Validated +public class CountJobDetailController { + + @Resource + private CountJobDetailService Service; + + @PostMapping("/create") + @Operation(summary = "创建备件盘点任务子") + @PreAuthorize("@ss.hasPermission('countJobDetail::create')") + public CommonResult create(@Valid @RequestBody CountJobDetailCreateReqVO createReqVO) { + return success(Service.create(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新备件盘点任务子") + @PreAuthorize("@ss.hasPermission('countJobDetail::update')") + public CommonResult update(@Valid @RequestBody CountJobDetailUpdateReqVO updateReqVO) { + int result = Service.update(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除备件盘点任务子") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('countJobDetail::delete')") + public CommonResult delete(@RequestParam("id") Long id) { + int result = Service.delete(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得备件盘点任务子") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('countJobDetail::query')") + public CommonResult get(@RequestParam("id") Long id) { + CountJobDetailDO countJobDetailDO = Service.get(id); + return success(CountJobDetailConvert.INSTANCE.convert(countJobDetailDO)); + } + + @GetMapping("/list") + @Operation(summary = "获得备件盘点任务子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('countJobDetail::query')") + public CommonResult> getList(@RequestParam("ids") Collection ids) { + List list = Service.getList(ids); + return success(CountJobDetailConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得备件盘点任务子分页") + @PreAuthorize("@ss.hasPermission('countJobDetail::query')") + public CommonResult> getPage(@Valid CountJobDetailPageReqVO pageVO) { + PageResult pageResult = Service.getPage(pageVO); + return success(CountJobDetailConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出备件盘点任务子 Excel") + @PreAuthorize("@ss.hasPermission('countJobDetail::export')") + @OperateLog(type = EXPORT) + public void exportExcel(@Valid CountJobDetailExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = Service.getList(exportReqVO); + // 导出 Excel + List datas = CountJobDetailConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "备件盘点任务子.xls", "数据", CountJobDetailExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入备件盘点任务子模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "备件盘点任务子基本信息导入模板.xls", "备件盘点任务子基本信息列表", CountJobDetailExcelVO.class, list); + } + + @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('countJobDetail::import')") + 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 list = ExcelUtils.read(file, CountJobDetailExcelVO.class); + List errorList = Service.importCountJobDetailList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/CountJobMainController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/CountJobMainController.java new file mode 100644 index 0000000..4786e3f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/CountJobMainController.java @@ -0,0 +1,144 @@ +package com.win.module.eam.controller.countJob; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.countJob.vo.*; +import com.win.module.eam.convert.countJobDetail.CountJobDetailConvert; +import com.win.module.eam.convert.countJobMain.CountJobMainConvert; +import com.win.module.eam.dal.dataobject.countJobDetail.CountJobDetailDO; +import com.win.module.eam.dal.dataobject.countJobMain.CountJobMainDO; +import com.win.module.eam.service.countJobDetail.CountJobDetailService; +import com.win.module.eam.service.countJobMain.CountJobMainService; +import com.win.module.eam.service.countadjustPlan.CountadjustPlanService; +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.Arrays; +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("/eam/countJobMain") +@Validated +public class CountJobMainController { + + @Resource + private CountJobMainService Service; + @Resource + private CountJobDetailService detailService; + + @Resource + private CountadjustPlanService countadjustPlanService; + + @PostMapping("/create") + @Operation(summary = "创建备件盘点任务主") + @PreAuthorize("@ss.hasPermission('item:countadjustWork:create')") + public CommonResult create(@Valid @RequestBody CountJobMainCreateReqVO createReqVO) { + return success(Service.create(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新备件盘点任务主") + @PreAuthorize("@ss.hasPermission('item:countadjustWork:update')") + public CommonResult update(@Valid @RequestBody CountJobMainUpdateReqVO updateReqVO) { + int result = Service.update(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除备件盘点任务主") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('item:countadjustWork:delete')") + public CommonResult delete(@RequestParam("id") Long id) { + int result = Service.delete(id); + return success(result > 0); + } + + @GetMapping("/handleMainExport") + @Operation(summary = "导出备件盘点工单 Excel") + @OperateLog(type = EXPORT) + public void handleMainExport(@RequestParam("id") Long id, + HttpServletResponse response) throws IOException { + //导出子表的数据 + CountJobDetailExportReqVO countJobDetailExportReqVO=new CountJobDetailExportReqVO(); + countJobDetailExportReqVO.setNumber(Service.get(id).getJobNumber()); + List list = detailService.getList(countJobDetailExportReqVO); + // 导出 Excel + List datas = CountJobDetailConvert.INSTANCE.convertList02(list); + for (CountJobDetailExcelVO data : datas) { + //反写主表中的盘点计划单号 + data.setPlanNumber(Service.get(id).getNumber()); + } + ExcelUtils.write(response, "备件盘点工单.xls", "数据", CountJobDetailExcelVO.class, datas); + } + + @GetMapping("/get") + @Operation(summary = "获得备件盘点任务主") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('countJobMain::query')") + public CommonResult get(@RequestParam("id") Long id) { + CountJobMainDO countJobMainDO = Service.get(id); + return success(CountJobMainConvert.INSTANCE.convert(countJobMainDO)); + } + + @GetMapping("/list") + @Operation(summary = "获得备件盘点任务主列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('countJobMain::query')") + public CommonResult> getList(@RequestParam("ids") Collection ids) { + List list = Service.getList(ids); + return success(CountJobMainConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得备件盘点任务主分页") +// @PreAuthorize("@ss.hasPermission('countJobMain::query')") + public CommonResult> getPage(@Valid CountJobMainPageReqVO pageVO) { + PageResult pageResult = Service.getPage(pageVO); + return success(CountJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出备件盘点任务主 Excel") + @PreAuthorize("@ss.hasPermission('item:countadjustWork:export')") + @OperateLog(type = EXPORT) + public void exportExcel(@Valid CountJobMainExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = Service.getList(exportReqVO); + // 导出 Excel + List datas = CountJobMainConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "备件盘点任务主.xls", "数据", CountJobMainExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入备件盘点任务主模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "备件盘点任务主基本信息导入模板.xls", "备件盘点任务主基本信息列表", CountJobMainExcelVO.class, list); + } + + @PostMapping("/senior") + @Operation(summary = "高级搜索获得账期日历分页") +// @PreAuthorize("@ss.hasPermission('wms:location:query')") + public CommonResult> getLocationSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = Service.getCountJobMainSenior(conditions); + PageResult result = CountJobMainConvert.INSTANCE.convertPage(pageResult); + return success(result); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailBaseVO.java new file mode 100644 index 0000000..188f8a1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailBaseVO.java @@ -0,0 +1,43 @@ +package com.win.module.eam.controller.countJob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 备件盘点任务子 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class CountJobDetailBaseVO { + + private Long id; + + @Schema(description = "单据号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "单据号") + private String number; + + @Schema(description = "库位编码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "库位编码不能为空") + private String locationNumber; + + @Schema(description = "库区编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "库区编号不能为空") + private String areaNumber; + + @Schema(description = "备件编码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "备件编码不能为空") + private String itemNumber; + + @Schema(description = "库存数量", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "库存数量不能为空") + private BigDecimal qty; + + /** + * masterId + */ + private Long masterId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailCreateReqVO.java new file mode 100644 index 0000000..a119297 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.countJob.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 备件盘点任务子创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CountJobDetailCreateReqVO extends CountJobDetailBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailExcelVO.java new file mode 100644 index 0000000..0e738e4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailExcelVO.java @@ -0,0 +1,43 @@ +package com.win.module.eam.controller.countJob.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * 备件盘点任务子 Excel VO + * + * @author 超级管理员 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) +public class CountJobDetailExcelVO { + + @ExcelProperty("盘点工单编号") + private String number; + + @ExcelProperty("盘点计划编号") + private String planNumber; + + @ExcelProperty("备件编号") + private String itemNumber; + + @ExcelProperty("库位编号") + private String locationNumber; + + @ExcelProperty("库区编号") + private String areaNumber; + + @ExcelProperty("库存数量") + private BigDecimal qty; + + @ExcelProperty("盘点数量") + private BigDecimal countQty; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailExportReqVO.java new file mode 100644 index 0000000..2ea8d14 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailExportReqVO.java @@ -0,0 +1,30 @@ +package com.win.module.eam.controller.countJob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 备件盘点任务子 Excel 导出 Request VO,参数和 CountJobDetailPageReqVO 是一致的") +@Data +public class CountJobDetailExportReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "盘点计划编号") + private String planNumber; + + @Schema(description = "库位编码") + private String locationNumber; + + @Schema(description = "库区编号") + private String areaNumber; + + @Schema(description = "备件编码") + private String itemNumber; + + @Schema(description = "库存数量") + private BigDecimal qty; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailImportErrorVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailImportErrorVO.java new file mode 100644 index 0000000..338ae68 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailImportErrorVO.java @@ -0,0 +1,25 @@ +package com.win.module.eam.controller.countJob.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + + +/** + * 采购索赔申请子 Excel VO + * + * @author 超级管理员 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CountJobDetailImportErrorVO extends CountJobDetailExcelVO { + + @ExcelProperty(value = "导入状态", index = 0) + private String importStatus; + + @ExcelProperty(value = "导入说明", index = 1) + private String importRemark; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailPageReqVO.java new file mode 100644 index 0000000..02d2559 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailPageReqVO.java @@ -0,0 +1,35 @@ +package com.win.module.eam.controller.countJob.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 java.math.BigDecimal; + +@Schema(description = "管理后台 - 备件盘点任务子分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CountJobDetailPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "库位编码") + private String locationNumber; + + @Schema(description = "库区编号") + private String areaNumber; + + @Schema(description = "备件编码") + private String itemNumber; + + @Schema(description = "库存数量") + private BigDecimal qty; + + private Long masterId; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailRespVO.java new file mode 100644 index 0000000..af332a6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailRespVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.countJob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Schema(description = "管理后台 - 备件盘点任务子 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CountJobDetailRespVO extends CountJobDetailBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailUpdateReqVO.java new file mode 100644 index 0000000..650648b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobDetailUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.countJob.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 CountJobDetailUpdateReqVO extends CountJobDetailBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainBaseVO.java new file mode 100644 index 0000000..3475670 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainBaseVO.java @@ -0,0 +1,37 @@ +package com.win.module.eam.controller.countJob.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 CountJobMainBaseVO { + + private Long id; + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "编号唯一标识不能为空") + private String jobNumber; + + @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "盘点计划申请编号") + private String number; + + @Schema(description = "状态枚举预留", example = "1") + private String status; + + @Schema(description = "盘点人部门id", example = "28334") + private String countDeptId; + + @Schema(description = "盘点人id", example = "9676") + private String countId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainCreateReqVO.java new file mode 100644 index 0000000..2bd3e94 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.countJob.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 备件盘点任务主创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CountJobMainCreateReqVO extends CountJobMainBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainExcelVO.java new file mode 100644 index 0000000..1d0edd1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainExcelVO.java @@ -0,0 +1,32 @@ +package com.win.module.eam.controller.countJob.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 备件盘点任务主 Excel VO + * + * @author 超级管理员 + */ +@Data +public class CountJobMainExcelVO { + + @ExcelProperty("编号唯一标识") + private String jobNumber; + + @ExcelProperty("名称") + private String name; + + @ExcelProperty("盘点计划申请编号") + private String number; + + @ExcelProperty("状态枚举预留") + private String status; + + @ExcelProperty("盘点人部门id") + private String countDeptId; + + @ExcelProperty("盘点人id") + private String countId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainExportReqVO.java new file mode 100644 index 0000000..750a7c0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainExportReqVO.java @@ -0,0 +1,28 @@ +package com.win.module.eam.controller.countJob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 备件盘点任务主 Excel 导出 Request VO,参数和 CountJobMainPageReqVO 是一致的") +@Data +public class CountJobMainExportReqVO { + + @Schema(description = "编号唯一标识") + private String jobNumber; + + @Schema(description = "名称", example = "张三") + private String name; + + @Schema(description = "盘点计划申请编号") + private String number; + + @Schema(description = "状态枚举预留", example = "1") + private String status; + + @Schema(description = "盘点人部门id", example = "28334") + private String countDeptId; + + @Schema(description = "盘点人id", example = "9676") + private String countId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainPageReqVO.java new file mode 100644 index 0000000..d44e881 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainPageReqVO.java @@ -0,0 +1,33 @@ +package com.win.module.eam.controller.countJob.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; + +@Schema(description = "管理后台 - 备件盘点任务主分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CountJobMainPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String jobNumber; + + @Schema(description = "名称", example = "张三") + private String name; + + @Schema(description = "盘点计划申请编号") + private String number; + + @Schema(description = "状态枚举预留", example = "1") + private String status; + + @Schema(description = "盘点人部门id", example = "28334") + private String countDeptId; + + @Schema(description = "盘点人id", example = "9676") + private String countId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainRespVO.java new file mode 100644 index 0000000..b07feb6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainRespVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.countJob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Schema(description = "管理后台 - 备件盘点任务主 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CountJobMainRespVO extends CountJobMainBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainUpdateReqVO.java new file mode 100644 index 0000000..9e16e94 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countJob/vo/CountJobMainUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.countJob.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 CountJobMainUpdateReqVO extends CountJobMainBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/CountRecordDetailController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/CountRecordDetailController.java new file mode 100644 index 0000000..95c4722 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/CountRecordDetailController.java @@ -0,0 +1,109 @@ +package com.win.module.eam.controller.countRecord; + +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.eam.controller.countRecord.vo.*; +import com.win.module.eam.convert.countRecord.CountRecordDetailConvert; +import com.win.module.eam.dal.dataobject.countRecord.CountRecordDetailDO; +import com.win.module.eam.service.counRecord.CountRecordDetailService; +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.Arrays; +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("/eam/countRecordDetail") +@Validated +public class CountRecordDetailController { + + @Resource + private CountRecordDetailService Service; + + @PostMapping("/create") + @Operation(summary = "创建备件盘点记录子") + @PreAuthorize("@ss.hasPermission('countRecordDetail::create')") + public CommonResult create(@Valid @RequestBody CountRecordDetailCreateReqVO createReqVO) { + return success(Service.create(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新备件盘点记录子") + @PreAuthorize("@ss.hasPermission('countRecordDetail::update')") + public CommonResult update(@Valid @RequestBody CountRecordDetailUpdateReqVO updateReqVO) { + int result = Service.update(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除备件盘点记录子") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('countRecordDetail::delete')") + public CommonResult delete(@RequestParam("id") Long id) { + int result = Service.delete(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得备件盘点记录子") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('countRecordDetail::query')") + public CommonResult get(@RequestParam("id") Long id) { + CountRecordDetailDO countRecordDetailDO = Service.get(id); + return success(CountRecordDetailConvert.INSTANCE.convert(countRecordDetailDO)); + } + + @GetMapping("/list") + @Operation(summary = "获得备件盘点记录子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('countRecordDetail::query')") + public CommonResult> getList(@RequestParam("ids") Collection ids) { + List list = Service.getList(ids); + return success(CountRecordDetailConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得备件盘点记录子分页") + @PreAuthorize("@ss.hasPermission('countRecordDetail::query')") + public CommonResult> getPage(@Valid CountRecordDetailPageReqVO pageVO) { + PageResult pageResult = Service.getPage(pageVO); + return success(CountRecordDetailConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出备件盘点记录子 Excel") + @PreAuthorize("@ss.hasPermission('countRecordDetail::export')") + @OperateLog(type = EXPORT) + public void exportExcel(@Valid CountRecordDetailExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = Service.getList(exportReqVO); + // 导出 Excel + List datas = CountRecordDetailConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "备件盘点记录子.xls", "数据", CountRecordDetailExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入备件盘点记录子模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "备件盘点记录子基本信息导入模板.xls", "备件盘点记录子基本信息列表", CountRecordDetailExcelVO.class, list); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/CountRecordMainController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/CountRecordMainController.java new file mode 100644 index 0000000..4f21ee6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/CountRecordMainController.java @@ -0,0 +1,127 @@ +package com.win.module.eam.controller.countRecord; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.countRecord.vo.*; +import com.win.module.eam.convert.countRecord.CountRecordMainConvert; +import com.win.module.eam.dal.dataobject.countRecord.CountRecordMainDO; +import com.win.module.eam.service.counRecord.CountRecordMainService; +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.Arrays; +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("/eam/countRecordMain") +@Validated +public class CountRecordMainController { + + @Resource + private CountRecordMainService Service; + + @PostMapping("/create") + @Operation(summary = "创建备件盘点记录主") + @PreAuthorize("@ss.hasPermission('item:countRecord:create')") + public CommonResult create(@Valid @RequestBody CountRecordMainCreateReqVO createReqVO) { + return success(Service.create(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新备件盘点记录主") + @PreAuthorize("@ss.hasPermission('item:countRecord:update')") + public CommonResult update(@Valid @RequestBody CountRecordMainUpdateReqVO updateReqVO) { + int result = Service.update(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除备件盘点记录主") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('item:countRecord:delete')") + public CommonResult delete(@RequestParam("id") Long id) { + int result = Service.delete(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得备件盘点记录主") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('countRecord::query')") + public CommonResult get(@RequestParam("id") Long id) { + CountRecordMainDO counRecordDO = Service.get(id); + return success(CountRecordMainConvert.INSTANCE.convert(counRecordDO)); + } + + @GetMapping("/list") + @Operation(summary = "获得备件盘点记录主列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('countRecord::query')") + public CommonResult> getList(@RequestParam("ids") Collection ids) { + List list = Service.getList(ids); + return success(CountRecordMainConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得备件盘点记录主分页") +// @PreAuthorize("@ss.hasPermission('countRecord::query')") + public CommonResult> getPage(@Valid CountRecordMainPageReqVO pageVO) { + PageResult pageResult = Service.getPage(pageVO); + return success(CountRecordMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出备件盘点记录主 Excel") + @PreAuthorize("@ss.hasPermission('item:countRecord:export')") + @OperateLog(type = EXPORT) + public void exportExcel(@Valid CountRecordMainExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = Service.getList(exportReqVO); + // 导出 Excel + List datas = CountRecordMainConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "备件盘点记录主.xls", "数据", CountRecordMainExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入备件盘点记录主模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "备件盘点记录主基本信息导入模板.xls", "备件盘点记录主基本信息列表", CountRecordMainExcelVO.class, list); + } + + @GetMapping("/adjust") + @Operation(summary = "盘点调整") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('item:countRecord:adjust')") + public CommonResult adjust(@RequestParam("number") String number) { + int result = Service.adjust(number); + return success(result > 0); + } + + @PostMapping("/senior") + @Operation(summary = "高级搜索获得账期日历分页") +// @PreAuthorize("@ss.hasPermission('wms:location:query')") + public CommonResult> getLocationSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = Service.getCountRecordMainSenior(conditions); + PageResult result = CountRecordMainConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailBaseVO.java new file mode 100644 index 0000000..64fe02f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailBaseVO.java @@ -0,0 +1,52 @@ +package com.win.module.eam.controller.countRecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +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 CountRecordDetailBaseVO { + + private Long id; + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "编号唯一标识不能为空") + private String number; + + @Schema(description = "库位编码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "库位编码不能为空") + private String locationNumber; + + @Schema(description = "库区编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "库区编号不能为空") + private String areaNumber; + + @Schema(description = "备件编码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "备件编码不能为空") + private String itemNumber; + + @Schema(description = "库存数量", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "库存数量不能为空") + private BigDecimal qty; + + @Schema(description = "盘点数量") + private BigDecimal countQty; + + @Schema(description = "差异数量") + private BigDecimal differenceQty; + + @Schema(description = "盘点时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime countTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailCreateReqVO.java new file mode 100644 index 0000000..629ea93 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.countRecord.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 备件盘点记录子创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CountRecordDetailCreateReqVO extends CountRecordDetailBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailExcelVO.java new file mode 100644 index 0000000..b66db2a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailExcelVO.java @@ -0,0 +1,41 @@ +package com.win.module.eam.controller.countRecord.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 备件盘点记录子 Excel VO + * + * @author 超级管理员 + */ +@Data +public class CountRecordDetailExcelVO { + + @ExcelProperty("编号唯一标识") + private String number; + + @ExcelProperty("库位编码") + private String locationNumber; + + @ExcelProperty("库区编号") + private String areaNumber; + + @ExcelProperty("备件编码") + private String itemNumber; + + @ExcelProperty("库存数量") + private BigDecimal qty; + + @ExcelProperty("盘点数量") + private BigDecimal countQty; + + @ExcelProperty("差异数量") + private BigDecimal differenceQty; + + @ExcelProperty("盘点时间") + private LocalDateTime countTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailExportReqVO.java new file mode 100644 index 0000000..70dee0a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailExportReqVO.java @@ -0,0 +1,41 @@ +package com.win.module.eam.controller.countRecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +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,参数和 CountRecordDetailPageReqVO 是一致的") +@Data +public class CountRecordDetailExportReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "库位编码") + private String locationNumber; + + @Schema(description = "库区编号") + private String areaNumber; + + @Schema(description = "备件编码") + private String itemNumber; + + @Schema(description = "库存数量") + private BigDecimal qty; + + @Schema(description = "盘点数量") + private BigDecimal countQty; + + @Schema(description = "差异数量") + private BigDecimal differenceQty; + + @Schema(description = "盘点时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] countTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailPageReqVO.java new file mode 100644 index 0000000..560679b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailPageReqVO.java @@ -0,0 +1,48 @@ +package com.win.module.eam.controller.countRecord.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.math.BigDecimal; +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 CountRecordDetailPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "库位编码") + private String locationNumber; + + @Schema(description = "库区编号") + private String areaNumber; + + @Schema(description = "备件编码") + private String itemNumber; + + @Schema(description = "库存数量") + private BigDecimal qty; + + @Schema(description = "盘点数量") + private BigDecimal countQty; + + @Schema(description = "差异数量") + private BigDecimal differenceQty; + + @Schema(description = "盘点时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] countTime; + + private Long masterId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailRespVO.java new file mode 100644 index 0000000..b4bb57d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailRespVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.countRecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Schema(description = "管理后台 - 备件盘点记录子 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CountRecordDetailRespVO extends CountRecordDetailBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailUpdateReqVO.java new file mode 100644 index 0000000..e25adf0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordDetailUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.countRecord.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 CountRecordDetailUpdateReqVO extends CountRecordDetailBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainBaseVO.java new file mode 100644 index 0000000..a4cebb6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainBaseVO.java @@ -0,0 +1,37 @@ +package com.win.module.eam.controller.countRecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * 备件盘点记录主 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class CountRecordMainBaseVO { + + private Long id; + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "编号唯一标识不能为空") + private String number; + + @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "盘点计划申请编号预留") + private String requestNumber; + + @Schema(description = "是否完成盘点") + private String status; + + @Schema(description = "工单编号") + private String jobNumber; + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainCreateReqVO.java new file mode 100644 index 0000000..dffbdfc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.countRecord.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 备件盘点记录主创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CountRecordMainCreateReqVO extends CountRecordMainBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainExcelVO.java new file mode 100644 index 0000000..879512b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainExcelVO.java @@ -0,0 +1,29 @@ +package com.win.module.eam.controller.countRecord.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 备件盘点记录主 Excel VO + * + * @author 超级管理员 + */ +@Data +public class CountRecordMainExcelVO { + + @ExcelProperty("编号唯一标识") + private String number; + + @ExcelProperty("名称") + private String name; + + @ExcelProperty("盘点计划申请编号预留") + private String requestNumber; + + @ExcelProperty("是否完成盘点") + private String status; + + @ExcelProperty("工单编号") + private String jobNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainExportReqVO.java new file mode 100644 index 0000000..f7e250b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainExportReqVO.java @@ -0,0 +1,28 @@ +package com.win.module.eam.controller.countRecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 备件盘点记录主 Excel 导出 Request VO,参数和 CounRecordPageReqVO 是一致的") +@Data +public class CountRecordMainExportReqVO { + + @Schema(description = "id", example = "30654") + private Long id; + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "张三") + private String name; + + @Schema(description = "盘点计划申请编号预留") + private String requestNumber; + + @Schema(description = "是否完成盘点") + private String status; + + @Schema(description = "工单编号") + private String jobNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainPageReqVO.java new file mode 100644 index 0000000..a70138e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainPageReqVO.java @@ -0,0 +1,31 @@ +package com.win.module.eam.controller.countRecord.vo; + +import lombok.*; +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 CountRecordMainPageReqVO extends PageParam { + + @Schema(description = "id", example = "30654") + private Long id; + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "张三") + private String name; + + @Schema(description = "盘点计划申请编号预留") + private String requestNumber; + + @Schema(description = "是否完成盘点") + private String status; + + @Schema(description = "工单编号") + private String jobNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainRespVO.java new file mode 100644 index 0000000..cd3788a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.eam.controller.countRecord.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 CountRecordMainRespVO extends CountRecordMainBaseVO { + + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainUpdateReqVO.java new file mode 100644 index 0000000..8687c25 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countRecord/vo/CountRecordMainUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.countRecord.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 CountRecordMainUpdateReqVO extends CountRecordMainBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/CountadjustPlanController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/CountadjustPlanController.java new file mode 100644 index 0000000..625183b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/CountadjustPlanController.java @@ -0,0 +1,118 @@ +package com.win.module.eam.controller.countadjustPlan; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.countadjustPlan.vo.*; +import com.win.module.eam.convert.countadjustPlan.CountadjustPlanConvert; +import com.win.module.eam.dal.dataobject.countadjustPlan.CountadjustPlanDO; +import com.win.module.eam.service.countadjustPlan.CountadjustPlanService; +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.Arrays; +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("/eam/countadjust-plan") +@Validated +public class CountadjustPlanController { + + @Resource + private CountadjustPlanService countadjustPlanService; + + @PostMapping("/create") + @Operation(summary = "创建备件盘点计划") + @PreAuthorize("@ss.hasPermission('item:countadjustPlan:create')") + public CommonResult createCountadjustPlan(@Valid @RequestBody CountadjustPlanCreateReqVO createReqVO) { + return success(countadjustPlanService.createCountadjustPlan(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新备件盘点计划") + @PreAuthorize("@ss.hasPermission('item:countadjustPlan:update')") + public CommonResult updateCountadjustPlan(@Valid @RequestBody CountadjustPlanUpdateReqVO updateReqVO) { + int result = countadjustPlanService.updateCountadjustPlan(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除备件盘点计划") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('item:countadjustPlan:delete')") + public CommonResult deleteCountadjustPlan(@RequestParam("id") Long id) { + int result = countadjustPlanService.deleteCountadjustPlan(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得备件盘点计划") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('plan:countadjust-plan:query')") + public CommonResult getCountadjustPlan(@RequestParam("id") Long id) { + CountadjustPlanDO countadjustPlan = countadjustPlanService.getCountadjustPlan(id); + return success(CountadjustPlanConvert.INSTANCE.convert(countadjustPlan)); + } + + @GetMapping("/list") + @Operation(summary = "获得备件盘点计划列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('plan:countadjust-plan:query')") + public CommonResult> getCountadjustPlanList(@RequestParam("ids") Collection ids) { + List list = countadjustPlanService.getCountadjustPlanList(ids); + return success(CountadjustPlanConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得备件盘点计划分页") +// @PreAuthorize("@ss.hasPermission('plan:countadjust-plan:query')") + public CommonResult> getCountadjustPlanPage(@Valid CountadjustPlanPageReqVO pageVO) { + PageResult pageResult = countadjustPlanService.getCountadjustPlanPage(pageVO); + return success(CountadjustPlanConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出备件盘点计划 Excel") + @PreAuthorize("@ss.hasPermission('item:countadjustPlan:export')") + @OperateLog(type = EXPORT) + public void exportCountadjustPlanExcel(@Valid CountadjustPlanExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = countadjustPlanService.getCountadjustPlanList(exportReqVO); + // 导出 Excel + List datas = CountadjustPlanConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "备件盘点计划.xls", "数据", CountadjustPlanExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入备件盘点计划模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "备件盘点计划基本信息导入模板.xls", "备件盘点计划基本信息列表", CountadjustPlanExcelVO.class, list); + } + + + @PostMapping("/senior") + @Operation(summary = "高级搜索获得账期日历分页") +// @PreAuthorize("@ss.hasPermission('wms:location:query')") + public CommonResult> getLocationSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = countadjustPlanService.getCountadjustPlanSenior(conditions); + PageResult result = CountadjustPlanConvert.INSTANCE.convertPage(pageResult); + return success(result); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanBaseVO.java new file mode 100644 index 0000000..334371b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanBaseVO.java @@ -0,0 +1,32 @@ +package com.win.module.eam.controller.countadjustPlan.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 CountadjustPlanBaseVO { + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "编号唯一标识不能为空") + private String number; + + @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "盘点备件的类型A、B、C 枚举") + private String classification; + + @Schema(description = "是否账内库TRUE账内FALSE账外", example = "19895") + private String isInAccount; + + @Schema(description = "枚举0新建、1发布、2已完成", example = "1") + private String status; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanCreateReqVO.java new file mode 100644 index 0000000..a7d6046 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.countadjustPlan.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 备件盘点计划创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CountadjustPlanCreateReqVO extends CountadjustPlanBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanExcelVO.java new file mode 100644 index 0000000..a090238 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanExcelVO.java @@ -0,0 +1,37 @@ +package com.win.module.eam.controller.countadjustPlan.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 CountadjustPlanExcelVO { + + @ExcelProperty("id") + private Long id; + + @ExcelProperty("编号唯一标识") + private String number; + + @ExcelProperty("名称") + private String name; + + @ExcelProperty("盘点备件的类型A、B、C 枚举") + private String classification; + + @ExcelProperty("是否账内库TRUE账内FALSE账外") + private String isInAccount; + + @ExcelProperty("枚举0新建、1发布、2已完成") + private String status; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanExportReqVO.java new file mode 100644 index 0000000..35d0bc4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanExportReqVO.java @@ -0,0 +1,30 @@ +package com.win.module.eam.controller.countadjustPlan.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,参数和 CountadjustPlanPageReqVO 是一致的") +@Data +public class CountadjustPlanExportReqVO { + + @Schema(description = "id", example = "20669") + private Long id; + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "芋艿") + private String name; + + @Schema(description = "盘点备件的类型A、B、C 枚举") + private String classification; + + @Schema(description = "是否账内库TRUE账内FALSE账外", example = "19895") + private String isInAccount; + + @Schema(description = "枚举0新建、1发布、2已完成", example = "1") + private String status; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanPageReqVO.java new file mode 100644 index 0000000..2155ff1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanPageReqVO.java @@ -0,0 +1,32 @@ +package com.win.module.eam.controller.countadjustPlan.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 CountadjustPlanPageReqVO extends PageParam { + + @Schema(description = "id", example = "20669") + private Long id; + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "芋艿") + private String name; + + @Schema(description = "盘点备件的类型A、B、C 枚举") + private String classification; + + @Schema(description = "是否账内库TRUE账内FALSE账外", example = "19895") + private String isInAccount; + + @Schema(description = "枚举0新建、1发布、2已完成", example = "1") + private String status; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanRespVO.java new file mode 100644 index 0000000..17212df --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.eam.controller.countadjustPlan.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 CountadjustPlanRespVO extends CountadjustPlanBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20669") + private Long id; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanUpdateReqVO.java new file mode 100644 index 0000000..b2ecb31 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/countadjustPlan/vo/CountadjustPlanUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.eam.controller.countadjustPlan.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 备件盘点计划更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class CountadjustPlanUpdateReqVO extends CountadjustPlanBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20669") + @NotNull(message = "id不能为空") + private Long id; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/DeviceAccountsController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/DeviceAccountsController.java new file mode 100644 index 0000000..3164225 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/DeviceAccountsController.java @@ -0,0 +1,259 @@ +package com.win.module.eam.controller.deviceaccounts; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.attachmentfile.vo.FileInfo; +import com.win.module.eam.controller.deviceaccounts.vo.*; +import com.win.module.eam.convert.deviceaccounts.DeviceAccountsConvert; +import com.win.module.eam.dal.dataobject.attachmentfile.AttachmentFileDO; +import com.win.module.eam.dal.dataobject.deviceaccounts.DeviceAccountsDO; +import com.win.module.eam.service.attachmentfile.AttachmentFileService; +import com.win.module.eam.service.deviceaccounts.DeviceAccountsService; +import com.win.module.system.api.user.AdminUserApi; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 设备台账") +@RestController +@RequestMapping("/eam/device-accounts") +@Validated +public class DeviceAccountsController { + + @Resource + private DeviceAccountsService deviceAccountsService; + + @Resource + private AdminUserApi userApi; + + @Resource + private AttachmentFileService attachmentFileService; + + @PostMapping("/create") + @Operation(summary = "创建设备台账") + @PreAuthorize("@ss.hasPermission('eam:device-accounts:create')") + public CommonResult createDeviceAccounts(@Valid @RequestBody DeviceAccountsCreateReqVO createReqVO) { + return success(deviceAccountsService.createDeviceAccounts(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新设备台账") + @PreAuthorize("@ss.hasPermission('eam:device-accounts:update')") + public CommonResult updateDeviceAccounts(@Valid @RequestBody DeviceAccountsUpdateReqVO updateReqVO) { + int result = deviceAccountsService.updateDeviceAccounts(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除设备台账") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:device-accounts:delete')") + public CommonResult deleteDeviceAccounts(@RequestParam("id") Long id) { + int result = deviceAccountsService.deleteDeviceAccounts(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得设备台账") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:device-accounts:query')") + public CommonResult getDeviceAccounts(@RequestParam("id") Long id) { + DeviceAccountsDO deviceAccounts = deviceAccountsService.getDeviceAccounts(id); + return success(DeviceAccountsConvert.INSTANCE.convert(deviceAccounts)); + } + + @GetMapping("/list") + @Operation(summary = "获得设备台账列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-accounts:query')") + public CommonResult> getDeviceAccountsList(@RequestParam("ids") Collection ids) { + List list = deviceAccountsService.getDeviceAccountsList(ids); + return success(DeviceAccountsConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得设备台账分页") + //@PreAuthorize("@ss.hasPermission('eam:device-accounts:query')") + public CommonResult> getDeviceAccountsPage(@Valid DeviceAccountsPageReqVO pageVO) { + PageResult pageResult = deviceAccountsService.getDeviceAccountsPage(pageVO); + PageResult deviceAccountsRespVOPage = DeviceAccountsConvert.INSTANCE.convertPage(pageResult); + List list = deviceAccountsRespVOPage.getList(); + List resultList = list.stream().map(item ->{ + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setNumber(item.getNumber()); + attachmentFileDO.setFuncCode("device_mould_picture"); + attachmentFileDO.setDeleted(false); + List attachmentPicDOList = attachmentFileService.getAttachmentFileList(attachmentFileDO); + List imageList = new ArrayList<>(); + attachmentPicDOList.stream().forEach(element->{ + FileInfo fileInfo = new FileInfo(); + fileInfo.setName(element.getFileName()); + fileInfo.setUrl(element.getPath()); + imageList.add(fileInfo); + }); + item.setFilePathList(imageList); + attachmentFileDO.setFuncCode("device_mould_attachment"); + List attachmentFileDOList = attachmentFileService.getAttachmentFileList(attachmentFileDO); + item.setAttachments(attachmentFileDOList); + return item; + }).toList(); + deviceAccountsRespVOPage.setList(resultList); + return success(deviceAccountsRespVOPage); + } + + + @PostMapping("/senior") + @Operation(summary = "获得设备台账分页") + //@PreAuthorize("@ss.hasPermission('eam:device-accounts:query')") + public CommonResult> getDeviceAccountsSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = deviceAccountsService.getDeviceAccountsSenior(conditions); + PageResult result = DeviceAccountsConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + + @GetMapping("/export-excel") + @Operation(summary = "导出设备台账 Excel") + //@PreAuthorize("@ss.hasPermission('eam:device-accounts:export')") + @OperateLog(type = EXPORT) + public void exportDeviceAccountsExcel(@Valid DeviceAccountsExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deviceAccountsService.getDeviceAccountsList(exportReqVO); + // 导出 Excel + List datas = DeviceAccountsConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "设备台账.xls", "数据", DeviceAccountsExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入设备台账模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "设备台账基本信息导入模板.xls", "设备台账基本信息列表", DeviceAccountsExcelVO.class, list); + } + + @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('eam:device-accounts:import')") + 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 list = ExcelUtils.read(file, DeviceAccountsExcelVO.class); + List errorList = deviceAccountsService.importDeviceAccountsList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + + @GetMapping("/getCounts") + @Operation(summary = "APP首页维修人员获得本厂区设备数量") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-main:query')") + public CommonResult> getCounts() { + Map counts = deviceAccountsService.getCounts(); + return success(counts); + } + + @GetMapping("/getToDoCountsByUser") + @Operation(summary = "APP首页根据当前人获取待办数据") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-main:query')") + public CommonResult> getToDoCountsByUser() { + Map counts = deviceAccountsService.getToDoCountsByUser(); + return success(counts); + } + + @GetMapping("/getDetailsByNumber") + @Operation(summary = "APP根据设备号查询信息") + @Parameters({ + @Parameter(name = "number", description = "设备或模具号", required = true), + @Parameter(name = "type", description = "类型", example = "1"), + @Parameter(name = "flag", description = "1为正常设备模具全部2为所有设备不填或者0查的本厂区"), + }) + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-main:query')") + public CommonResult> getDetailsByNumber(@RequestParam("number") String number,String type,String flag) { + Map map = deviceAccountsService.getDetailsByNumber(number,type,flag); + return success(map); + } + @GetMapping("/selectData") + @Operation(summary = "APP根据厂区编码查询正常设备列表或者工艺列表") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-main:query')") + @Parameter(name = "factoryAreaNumber", description = "厂区number 不传默认查当前人所属厂区" , required = true, example = "1024") + public CommonResult>> selectData(String factoryAreaNumber) { + List> maps = deviceAccountsService.selectData(factoryAreaNumber); + return success(maps); + } + @GetMapping("/getAppPage") + @Operation(summary = "获得APP设备列表分页") + @Parameters({ + @Parameter(name = "pageSize", description = "每页几条", required = true), + @Parameter(name = "pageNo", description = "第几页", example = "1"), + @Parameter(name = "name", description = "设备名称"), + @Parameter(name = "number", description = "编码"), + @Parameter(name = "factory_area_number", description = "厂区编码"), + @Parameter(name = "type", description = "设备类型"), + }) + public CommonResult> getAppPage(@Valid DeviceAccountsPageReqVO pageVO) { + PageResult pageResult = deviceAccountsService.getAppPage(pageVO); + return success(DeviceAccountsConvert.INSTANCE.convertPage(pageResult)); + } + @GetMapping("/selectAll") + @Operation(summary = "APP查询所有设备") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-main:query')") + public CommonResult>> selectAll() { + List> maps = deviceAccountsService.selectAll(); + return success(maps); + } + + @PostMapping("/noPage") + @Operation(summary = "获得设备台账分页") + //@PreAuthorize("@ss.hasPermission('eam:device-accounts:query')") + public CommonResult> getDeviceAccountsNoPage(@Valid @RequestBody DeviceAccountsPageReqVO pageVO) { + List deviceAccountsDOList = deviceAccountsService.selectListNoPage(pageVO); + return success(DeviceAccountsConvert.INSTANCE.convertList(deviceAccountsDOList)); + } + + +// @GetMapping("/getFactoryAreaNumber") +// @Operation(summary = "根据设备信息获取所属厂区") +// @Parameter(name = "id", description = "编号", required = true, example = "1024") +// //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-main:query')") +// public CommonResult> getFactoryAreaNumber(@RequestParam("number") String number) { +// AdminUserRespDTO user = userApi.getUser(getLoginUserId()); +// Map counts = deviceAccountsService.getToDoCounts(number); +// return success(counts); +// } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsBaseVO.java new file mode 100644 index 0000000..4566ff3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsBaseVO.java @@ -0,0 +1,96 @@ +package com.win.module.eam.controller.deviceaccounts.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +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 DeviceAccountsBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long id; + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "编号唯一标识不能为空") + private String number; + + @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "规格型号") + private String specification; + + @Schema(description = "设备类型", example = "1") + private String type; + + @Schema(description = "所属厂区编号", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "所属厂区编号不能为空") + private String factoryAreaNumber; + + @Schema(description = "采购时间", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "采购时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime purchaseTime; + + @Schema(description = "采购部门") + private String purchaseDept; + + @Schema(description = "采购人", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "采购人不能为空") + private String purchaser; + + @Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "供应商编号不能为空") + private String supplierNumber; + + @Schema(description = "出厂日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime productionDate; + + @Schema(description = "价格", example = "27962") + private BigDecimal purchasePrice; + + @Schema(description = "部门", requiredMode = Schema.RequiredMode.REQUIRED, example = "13771") +// @NotNull(message = "采购部门不能为空") + private Long deptId; + + @Schema(description = "地点ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11800") +// @NotNull(message = "地点ID不能为空") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "并发乐观锁不能为空") + + private Integer concurrencyStamp; + + @Schema(description = "状态0正常1维修中") + private String status; + + @Schema(description = "设备图片") + private String images; + + @Schema(description = "设备功率") + private String power; + + @Schema(description = "描述") + private String describes; + + @Schema(description = "负责人") + private String principal; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsCreateReqVO.java new file mode 100644 index 0000000..3a17a76 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.deviceaccounts.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 备件台账创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceAccountsCreateReqVO extends DeviceAccountsBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsExcelVO.java new file mode 100644 index 0000000..bcd6af0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsExcelVO.java @@ -0,0 +1,75 @@ +package com.win.module.eam.controller.deviceaccounts.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 备件台账 Excel VO + * + * @author 超级管理员 + */ +@Data +public class DeviceAccountsExcelVO { + + @ExcelProperty("编号唯一标识") + private String number; + + @ExcelProperty("名称") + private String name; + + @ExcelProperty("规格型号") + private String specification; + + @ExcelProperty("设备类型") + private String type; + + @ExcelProperty("所属厂区编号") + private String factoryAreaNumber; + + @ExcelProperty("采购时间") + private LocalDateTime purchaseTime; + + @Schema(description = "采购部门") + private String purchaseDept; + + @ExcelProperty("采购人") + private String purchaser; + + @ExcelProperty("供应商编号") + private String supplierNumber; + + @ExcelProperty("出厂日期") + private LocalDateTime productionDate; + + @ExcelProperty("价格") + private BigDecimal purchasePrice; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + + @Schema(description = "设备功率") + private String power; + + @Schema(description = "描述") + private String describes; + + @Schema(description = "状态0正常1维修中") + private String status; + + @Schema(description = "负责人") + private String principal; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsExportReqVO.java new file mode 100644 index 0000000..df146e6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsExportReqVO.java @@ -0,0 +1,27 @@ +package com.win.module.eam.controller.deviceaccounts.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 备件台账 Excel 导出 Request VO,参数和 DeviceAccountsPageReqVO 是一致的") +@Data +public class DeviceAccountsExportReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "张三") + private String name; + + @Schema(description = "设备类型", example = "1") + private String type; + + @Schema(description = "厂区编码", example = "1") + private String factoryAreaNumber; + + @Schema(description = "状态0正常1维修中") + private String status; + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsPageReqVO.java new file mode 100644 index 0000000..3059e2f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsPageReqVO.java @@ -0,0 +1,49 @@ +package com.win.module.eam.controller.deviceaccounts.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; + +@Schema(description = "管理后台 - 备件台账分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceAccountsPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "张三") + private String name; + + @Schema(description = "设备类型", example = "1") + private String type; + + @Schema(description = "设备类型名称", example = "1") + private String typeName; + + @Schema(description = "厂区名称", example = "1") + private String factoryAreaName; + + @Schema(description = "厂区编码", example = "1") + private String factoryAreaNumber; + + @Schema(description = "设备功率") + private String power; + + @Schema(description = "设备功率范围") + private String powerRange; + + @Schema(description = "描述") + private String describes; + + @Schema(description = "状态0正常1维修中") + private String status; + + @Schema(description = "负责人") + private String principal; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsReqVO.java new file mode 100644 index 0000000..28bf6b1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.eam.controller.deviceaccounts.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 DeviceAccountsReqVO extends DeviceAccountsBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsRespVO.java new file mode 100644 index 0000000..080b037 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsRespVO.java @@ -0,0 +1,30 @@ +package com.win.module.eam.controller.deviceaccounts.vo; + +import com.win.module.eam.controller.attachmentfile.vo.FileInfo; +import com.win.module.eam.dal.dataobject.attachmentfile.AttachmentFileDO; +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 DeviceAccountsRespVO extends DeviceAccountsBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "设备图片") + private List filePathList; + + @Schema(description = "设备附件") + private List attachments; + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsUpdateReqVO.java new file mode 100644 index 0000000..22792b2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceaccounts/vo/DeviceAccountsUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.deviceaccounts.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 备件台账更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceAccountsUpdateReqVO extends DeviceAccountsBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/DeviceInspectionJobDetailController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/DeviceInspectionJobDetailController.java new file mode 100644 index 0000000..546c6ec --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/DeviceInspectionJobDetailController.java @@ -0,0 +1,148 @@ +package com.win.module.eam.controller.deviceinspectionjob; + +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.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobDetailConvert; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailDO; +import com.win.module.eam.service.deviceinspectionjob.DeviceInspectionJobDetailService; +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.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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 检修工单子") +@RestController +@RequestMapping("/eam/device-inspection-job-detail") +@Validated +public class DeviceInspectionJobDetailController { + + @Resource + private DeviceInspectionJobDetailService deviceInspectionDetailService; + + @PostMapping("/create") + @Operation(summary = "创建检修工单子") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:create')") + public CommonResult createDeviceInspectionDetail(@Valid @RequestBody DeviceInspectionJobDetailCreateReqVO createReqVO) { + return success(deviceInspectionDetailService.createDeviceInspectionDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新检修工单子") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:update')") + public CommonResult updateDeviceInspectionDetail(@Valid @RequestBody DeviceInspectionJobDetailUpdateReqVO updateReqVO) { + int result = deviceInspectionDetailService.updateDeviceInspectionDetail(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除检修工单子") + @Parameter(name = "id", description = "编号", required = true) +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:delete')") + public CommonResult deleteDeviceInspectionDetail(@RequestParam("id") Long id) { + int result = deviceInspectionDetailService.deleteDeviceInspectionDetail(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得检修工单子") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:query')") + public CommonResult getDeviceInspectionDetail(@RequestParam("id") Long id) { + DeviceInspectionJobDetailDO deviceInspectionDetail = deviceInspectionDetailService.getDeviceInspectionDetail(id); + return success(DeviceInspectionJobDetailConvert.INSTANCE.convert(deviceInspectionDetail)); + } + + @GetMapping("/list") + @Operation(summary = "获得检修工单子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:query')") + public CommonResult> getDeviceInspectionDetailList(@RequestParam("ids") Collection ids) { + List list = deviceInspectionDetailService.getDeviceInspectionDetailList(ids); + return success(DeviceInspectionJobDetailConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得检修工单子分页") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:query')") + public CommonResult> getDeviceInspectionDetailPage(@Valid DeviceInspectionJobDetailPageReqVO pageVO) { + PageResult pageResult = deviceInspectionDetailService.getDeviceInspectionDetailPage(pageVO); + return success(DeviceInspectionJobDetailConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出检修工单子 Excel") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:export')") + @OperateLog(type = EXPORT) + public void exportDeviceInspectionDetailExcel(@Valid DeviceInspectionJobDetailExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deviceInspectionDetailService.getDeviceInspectionDetailList(exportReqVO); + // 导出 Excel + List datas = DeviceInspectionJobDetailConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "检修工单子.xls", "数据", DeviceInspectionJobDetailExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入检修工单子模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "检修工单子基本信息导入模板.xls", "检修工单子基本信息列表", DeviceInspectionJobDetailExcelVO.class, list); + } + + @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('eam:device-inspection-job-detail:import')") + 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 list = ExcelUtils.read(file, DeviceInspectionJobDetailExcelVO.class); + List errorList = deviceInspectionDetailService.importDeviceInspectionDetailList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + /** + * 根据检修工单号查询工单子项信息列表 + * @param + * @return + */ + @GetMapping("/selectListByNumber") + @Operation(summary = "获得检修工单子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-detail:query')") + public CommonResult> selectListByNumber(@RequestParam("number") String number) { + List list = deviceInspectionDetailService.selectListByNumber(number); + return success(DeviceInspectionJobDetailConvert.INSTANCE.convertList(list)); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/DeviceInspectionJobDetailItemController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/DeviceInspectionJobDetailItemController.java new file mode 100644 index 0000000..e722a1b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/DeviceInspectionJobDetailItemController.java @@ -0,0 +1,135 @@ +package com.win.module.eam.controller.deviceinspectionjob; + +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.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobDetailItemConvert; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailItemDO; +import com.win.module.eam.service.deviceinspectionjob.DeviceInspectionJobDetailItemService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 检修工单子表与备件关系") +@RestController +@RequestMapping("/eam/device-inspection-job-detail-item") +@Validated +public class DeviceInspectionJobDetailItemController { + + @Resource + private DeviceInspectionJobDetailItemService deviceInspectionDetailItemService; + + @PostMapping("/create") + @Operation(summary = "创建检修工单子表与备件关系") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:create')") + public CommonResult createDeviceInspectionDetailItem(@Valid @RequestBody DeviceInspectionJobDetailItemCreateReqVO createReqVO) { + return success(deviceInspectionDetailItemService.createDeviceInspectionDetailItem(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新检修工单子表与备件关系") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:update')") + public CommonResult updateDeviceInspectionDetailItem(@Valid @RequestBody DeviceInspectionJobDetailItemUpdateReqVO updateReqVO) { + int result = deviceInspectionDetailItemService.updateDeviceInspectionDetailItem(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除检修工单子表与备件关系") + @Parameter(name = "id", description = "编号", required = true) +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:delete')") + public CommonResult deleteDeviceInspectionDetailItem(@RequestParam("id") Long id) { + int result = deviceInspectionDetailItemService.deleteDeviceInspectionDetailItem(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得检修工单子表与备件关系") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:query')") + public CommonResult getDeviceInspectionDetailItem(@RequestParam("id") Long id) { + DeviceInspectionJobDetailItemDO deviceInspectionDetailItem = deviceInspectionDetailItemService.getDeviceInspectionDetailItem(id); + return success(DeviceInspectionJobDetailItemConvert.INSTANCE.convert(deviceInspectionDetailItem)); + } + + @GetMapping("/list") + @Operation(summary = "获得检修工单子表与备件关系列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:query')") + public CommonResult> getDeviceInspectionDetailItemList(@RequestParam("ids") Collection ids) { + List list = deviceInspectionDetailItemService.getDeviceInspectionDetailItemList(ids); + return success(DeviceInspectionJobDetailItemConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得检修工单子表与备件关系分页") + @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:query')") + public CommonResult> getDeviceInspectionDetailItemPage(@Valid DeviceInspectionJobDetailItemPageReqVO pageVO) { + PageResult pageResult = deviceInspectionDetailItemService.getDeviceInspectionDetailItemPage(pageVO); + return success(DeviceInspectionJobDetailItemConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出检修工单子表与备件关系 Excel") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:export')") + @OperateLog(type = EXPORT) + public void exportDeviceInspectionDetailItemExcel(@Valid DeviceInspectionJobDetailItemExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deviceInspectionDetailItemService.getDeviceInspectionDetailItemList(exportReqVO); + // 导出 Excel + List datas = DeviceInspectionJobDetailItemConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "检修工单子表与备件关系.xls", "数据", DeviceInspectionJobDetailItemExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入检修工单子表与备件关系模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "检修工单子表与备件关系基本信息导入模板.xls", "检修工单子表与备件关系基本信息列表", DeviceInspectionJobDetailItemExcelVO.class, list); + } + + @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('eam:device-inspection-job-detail-item:import')") + 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 list = ExcelUtils.read(file, DeviceInspectionJobDetailItemExcelVO.class); + List errorList = deviceInspectionDetailItemService.importDeviceInspectionDetailItemList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/DeviceInspectionJobMainController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/DeviceInspectionJobMainController.java new file mode 100644 index 0000000..75cad00 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/DeviceInspectionJobMainController.java @@ -0,0 +1,217 @@ +package com.win.module.eam.controller.deviceinspectionjob; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobMainConvert; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobMainDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionReportDo; +import com.win.module.eam.service.deviceinspectionjob.DeviceInspectionJobMainService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 检修工单主") +@RestController +@RequestMapping("/eam/device-inspection-job-main") +@Validated +public class DeviceInspectionJobMainController { + + @Resource + private DeviceInspectionJobMainService deviceInspectionMainService; + + @PostMapping("/create") + @Operation(summary = "创建检修工单主") + @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-main:create') or @ss.hasPermission('eam:device-inspection-job-main:createAPP')") + public CommonResult createDeviceInspectionMain(@Valid @RequestBody DeviceInspectionJobMainCreateReqVO createReqVO) { + return success(deviceInspectionMainService.createDeviceInspectionMain(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新检修工单主") + @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-main:update') or @ss.hasPermission('eam:device-inspection-job-main:updateAPP')") + public CommonResult updateDeviceInspectionMain(@Valid @RequestBody DeviceInspectionJobMainUpdateReqVO updateReqVO) { + int result = deviceInspectionMainService.updateDeviceInspectionMain(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除检修工单主") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-main:delete') or @ss.hasPermission('eam:device-inspection-job-main:deleteAPP')") + public CommonResult deleteDeviceInspectionMain(@RequestParam("id") Long id) { + int result = deviceInspectionMainService.deleteDeviceInspectionMain(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得检修工单主") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-main:query')") + public CommonResult getDeviceInspectionMain(@RequestParam("id") Long id) { + DeviceInspectionJobMainDO deviceInspectionMain = deviceInspectionMainService.getDeviceInspectionMain(id); + return success(DeviceInspectionJobMainConvert.INSTANCE.convert(deviceInspectionMain)); + } + + @GetMapping("/list") + @Operation(summary = "获得检修工单主列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-main:query')") + public CommonResult> getDeviceInspectionMainList(@RequestParam("ids") Collection ids) { + List list = deviceInspectionMainService.getDeviceInspectionMainList(ids); + return success(DeviceInspectionJobMainConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得检修工单主分页") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-main:query')") + public CommonResult> getDeviceInspectionMainPage(@Valid DeviceInspectionJobMainPageReqVO pageVO) { + PageResult pageResult = deviceInspectionMainService.getDeviceInspectionMainPage(pageVO); + return success(DeviceInspectionJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + + @PostMapping("/senior") + @Operation(summary = "获得检修工单分页") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-main:query')") + public CommonResult> getInspectionJobMainSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = deviceInspectionMainService.getInspectionJobMainSenior(conditions); + PageResult result = DeviceInspectionJobMainConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + + @GetMapping("/export-excel") + @Operation(summary = "导出检修工单主 Excel") + @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-main:export')") + @OperateLog(type = EXPORT) + public void exportDeviceInspectionMainExcel(@Valid DeviceInspectionJobMainExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deviceInspectionMainService.getDeviceInspectionMainList(exportReqVO); + // 导出 Excel + List datas = DeviceInspectionJobMainConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "检修工单主.xls", "数据", DeviceInspectionJobMainExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入检修工单主模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "检修工单主基本信息导入模板.xls", "检修工单主基本信息列表", DeviceInspectionJobMainExcelVO.class, list); + } + + @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('eam:device-inspection-job-main:import')") + 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 list = ExcelUtils.read(file, DeviceInspectionJobMainExcelVO.class); + List errorList = deviceInspectionMainService.importDeviceInspectionMainList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + @GetMapping("/getAppPage") + @Operation(summary = "获得APP模具或设备工单分页") + @Parameters({ + @Parameter(name = "flag", description = "1从我的进入0或者不填从首页进入", required = true), + @Parameter(name = "type", description = "DEVICE设备MOLD模具", example = "1"), + }) + public CommonResult> getAppPage(@Valid DeviceInspectionJobMainPageReqVO pageVO) { + PageResult pageResult = deviceInspectionMainService.getAppPage(pageVO); + return success(DeviceInspectionJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/orderClickFinish") + @Operation(summary = "检修点击完成") + @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-main:orderClickFinish') or @ss.hasPermission('eam:device-inspection-job-main:orderClickFinishAPP')") + @Parameter(name = "id", description = "检修工单id", required = true) + public CommonResult orderClickFinish(@RequestParam("id") Long id) { + int result = deviceInspectionMainService.onClick(id); + return success(result > 0); + } + + @GetMapping("/orderClickVerify") + @Operation(summary = "检修点击验证") + @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-main:orderClickVerify') or @ss.hasPermission('eam:device-inspection-job-main:orderClickVerifyAPP')") + @Parameter(name = "id", description = "检修工单id", required = true) + @Parameter(name = "verifyContent", description = "验证内容可选填", required = false) + public CommonResult orderClickVerify(@RequestParam("id") Long id,String verifyContent) { + int result = deviceInspectionMainService.onVerify(id,verifyContent); + return success(result > 0); + } + + + @PostMapping("/createPC") + @Operation(summary = "创建检修工单主") + @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-main:create')") + public CommonResult createDeviceInspectionMainPC(@Valid @RequestBody DeviceInspectionJobMainCreateReqVO createReqVO) { + return success(deviceInspectionMainService.createDeviceInspectionMainPC(createReqVO)); + } + + + @GetMapping("/noPage") + @Operation(summary = "获得检修工单主分页") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-main:query')") + public CommonResult> getDeviceInspectionMainNoPage(@Valid DeviceInspectionJobMainPageReqVO pageVO) { + List list = deviceInspectionMainService.getDeviceInspectionMainNoPage(pageVO); + return success(DeviceInspectionJobMainConvert.INSTANCE.convertList(list)); + } + + + + + @GetMapping("/getInspectionReport") + @Operation(summary = "保养打印单生成子单") + public CommonResult> getMaintainReport(DeviceInspectionReportReqVo deviceInspectionReportReqVo) { + DeviceInspectionReportDo deviceInspectionReportDo = DeviceInspectionJobMainConvert.INSTANCE.convert(deviceInspectionReportReqVo); + return success(deviceInspectionMainService.getInspectionReport(deviceInspectionReportDo)); + } + + + @GetMapping("/getInspectionReportMainInfo") + @Operation(summary = "保养打印单生成主单") + public CommonResult> getMaintainReportMainInfo(DeviceInspectionReportReqVo deviceInspectionReportReqVo) { + DeviceInspectionReportDo deviceInspectionReportDo = new DeviceInspectionReportDo(); + deviceInspectionReportDo.setId(deviceInspectionReportReqVo.getId()); + List resultList = deviceInspectionMainService.getInspectionReportMainInfo(deviceInspectionReportDo); + return success(resultList); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailBaseVO.java new file mode 100644 index 0000000..32046d0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailBaseVO.java @@ -0,0 +1,80 @@ +package com.win.module.eam.controller.deviceinspectionjob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +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 DeviceInspectionJobDetailBaseVO { + private Long id; + + private Long masterId;//主表id + + @Schema(description = "检修工单号与主表一致") + private String number; + + @Schema(description = "地点ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12355") + // @NotNull(message = "地点ID不能为空") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + // @NotNull(message = "并发乐观锁不能为空") + private Integer concurrencyStamp; + + @Schema(description = "内容", example = "赵六") + private String name; + + @Schema(description = "人数") + @NotNull(message = "人数不能为空") + private Integer peoples; + + @Schema(description = "预计分钟") + @NotNull(message = "预计分钟数不能为空") + private Integer estimatedMinutes; + + @Schema(description = "实际分钟") + @NotNull(message = "实际分钟数不能为空") + private Integer actualMinutes; + + @Schema(description = "责任人多选") + @NotNull(message = "责任人不能为空") + private String chargePeoples; + + //@Schema(description = "完成时间") + @Schema(description = "完成时间", requiredMode = Schema.RequiredMode.REQUIRED) + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime completionTime; + + @Schema(description = "工程师确认") + //@NotNull(message = "工程师确认不能为空") + private String engineer; + + @Schema(description = "未完成原因", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "未完成原因不能为空") + private String uncompleted; + + @Schema(description = "备件数量类", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "未完成原因不能为空") + private List> itemNumbers; + + @Schema(description = "是否完成", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "未完成原因不能为空") + private String status; + + @Schema(description = "是否完成名称", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "未完成原因不能为空") + private String statusName; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailCreateReqVO.java new file mode 100644 index 0000000..0b5426e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.deviceinspectionjob.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 检修工单子创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceInspectionJobDetailCreateReqVO extends DeviceInspectionJobDetailBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailExcelVO.java new file mode 100644 index 0000000..5eee7f2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailExcelVO.java @@ -0,0 +1,56 @@ +package com.win.module.eam.controller.deviceinspectionjob.vo; + +import lombok.*; + +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 检修工单子 Excel VO + * + * @author 超级管理员 + */ +@Data +public class DeviceInspectionJobDetailExcelVO { + + @ExcelProperty("检修工单号与主表一致") + private String number; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + + @ExcelProperty("内容") + private String name; + + @ExcelProperty("人数") + private Integer peoples; + + @ExcelProperty("预计分钟") + private Integer estimatedMinutes; + + @ExcelProperty("实际分钟") + private Integer actualMinutes; + + @ExcelProperty("责任人多选") + private String chargePeoples; + + @ExcelProperty("完成时间") + private LocalDateTime completionTime; + + @ExcelProperty("工程师确认") + private String engineer; + + @ExcelProperty("未完成原因") + private String uncompleted; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailExportReqVO.java new file mode 100644 index 0000000..4985a45 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailExportReqVO.java @@ -0,0 +1,46 @@ +package com.win.module.eam.controller.deviceinspectionjob.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,参数和 DeviceInspectionDetailPageReqVO 是一致的") +@Data +public class DeviceInspectionJobDetailExportReqVO { + + @Schema(description = "人数") + private Integer peoples; + + @Schema(description = "预计分钟") + private Integer estimatedMinutes; + + @Schema(description = "责任人多选") + private String chargePeoples; + + @Schema(description = "未完成原因") + private String uncompleted; + + @Schema(description = "是否完成0 1", example = "1") + private String status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "地点ID", example = "17177") + private String siteId; + + @Schema(description = "内容", example = "芋艿") + private String name; + + @Schema(description = "单据号") + private String number; + + @Schema(description = "主表ID", example = "3454") + private Long masterId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemBaseVO.java new file mode 100644 index 0000000..fa34206 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemBaseVO.java @@ -0,0 +1,46 @@ +package com.win.module.eam.controller.deviceinspectionjob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 检修工单子表与备件关系 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class DeviceInspectionJobDetailItemBaseVO { + + private Long masterId;//主表id + + @Schema(description = "检修工单号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "检修工单号不能为空") + private String number; + + @Schema(description = "检修工单子表id", requiredMode = Schema.RequiredMode.REQUIRED, example = "30773") + @NotNull(message = "检修工单子表id不能为空") + private Long maintenanceDetailId; + + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "数量不能为空") + private BigDecimal qty; + + @Schema(description = "故障描述") + private String describes; + + @Schema(description = "地点ID", example = "14335") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + + @Schema(description = "备件号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "备件号不能为空") + private String itemNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemCreateReqVO.java new file mode 100644 index 0000000..83be7df --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.deviceinspectionjob.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 检修工单子表与备件关系创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceInspectionJobDetailItemCreateReqVO extends DeviceInspectionJobDetailItemBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemExcelVO.java new file mode 100644 index 0000000..986a5e9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemExcelVO.java @@ -0,0 +1,47 @@ +package com.win.module.eam.controller.deviceinspectionjob.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 检修工单子表与备件关系 Excel VO + * + * @author 超级管理员 + */ +@Data +public class DeviceInspectionJobDetailItemExcelVO { + + @ExcelProperty("id") + private Long id; + + @ExcelProperty("检修工单号") + private String number; + + @ExcelProperty("检修工单子表id") + private Long maintenanceDetailId; + + @ExcelProperty("数量") + private BigDecimal qty; + + @ExcelProperty("故障描述") + private String describes; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + + @ExcelProperty("备件号") + private String itemNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemExportReqVO.java new file mode 100644 index 0000000..c5bc7c5 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemExportReqVO.java @@ -0,0 +1,19 @@ +package com.win.module.eam.controller.deviceinspectionjob.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 检修工单子表与备件关系 Excel 导出 Request VO,参数和 DeviceInspectionDetailItemPageReqVO 是一致的") +@Data +public class DeviceInspectionJobDetailItemExportReqVO { + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + + @Schema(description = "备件号") + private String itemNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemPageReqVO.java new file mode 100644 index 0000000..4b226a3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemPageReqVO.java @@ -0,0 +1,22 @@ +package com.win.module.eam.controller.deviceinspectionjob.vo; + +import lombok.*; +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 DeviceInspectionJobDetailItemPageReqVO extends PageParam { + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + + @Schema(description = "备件号") + private String itemNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemRespVO.java new file mode 100644 index 0000000..3a1f5c1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.eam.controller.deviceinspectionjob.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 DeviceInspectionJobDetailItemRespVO extends DeviceInspectionJobDetailItemBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "6934") + private Long id; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemUpdateReqVO.java new file mode 100644 index 0000000..ad07bff --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailItemUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.eam.controller.deviceinspectionjob.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 DeviceInspectionJobDetailItemUpdateReqVO extends DeviceInspectionJobDetailItemBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "6934") + @NotNull(message = "id不能为空") + private Long id; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailPageReqVO.java new file mode 100644 index 0000000..d064c88 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailPageReqVO.java @@ -0,0 +1,52 @@ +package com.win.module.eam.controller.deviceinspectionjob.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 DeviceInspectionJobDetailPageReqVO extends PageParam { + + @Schema(description = "人数") + private Integer peoples; + + @Schema(description = "预计分钟") + private Integer estimatedMinutes; + + @Schema(description = "责任人多选") + private String chargePeoples; + + @Schema(description = "未完成原因") + private String uncompleted; + + @Schema(description = "是否完成0 1", example = "1") + private String status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "地点ID", example = "17177") + private String siteId; + + @Schema(description = "内容", example = "芋艿") + private String name; + + @Schema(description = "单据号") + private String number; + + @Schema(description = "主表ID", example = "3454") + private Long masterId; + +} + diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailRespVO.java new file mode 100644 index 0000000..a0ad89b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailRespVO.java @@ -0,0 +1,24 @@ +package com.win.module.eam.controller.deviceinspectionjob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +@Schema(description = "管理后台 - 检修工单子 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceInspectionJobDetailRespVO extends DeviceInspectionJobDetailBaseVO { + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "备件拼接") + private List> items; + + @Schema(description = "检修人名称集合") + private String chargePeoplesName; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailUpdateReqVO.java new file mode 100644 index 0000000..ef08bcb --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobDetailUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.eam.controller.deviceinspectionjob.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 DeviceInspectionJobDetailUpdateReqVO extends DeviceInspectionJobDetailBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "13302") + @NotNull(message = "id不能为空") + private Long id; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainBaseVO.java new file mode 100644 index 0000000..8172308 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainBaseVO.java @@ -0,0 +1,87 @@ +package com.win.module.eam.controller.deviceinspectionjob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.*; +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 DeviceInspectionJobMainBaseVO { + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "id不能为空") + private Long id; + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "编号唯一标识不能为空") + private String number; + + @Schema(description = "维修工单号", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "维修工单号不能为空") + private String maintenanceNumber; + + @Schema(description = "设备模具", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "设备模具不能为空") + private String deviceNumber; + + @Schema(description = "厂区编号", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "厂区编号不能为空") + private String factoryAreaNumber; + + @Schema(description = "故障类型枚举EM、CM、 PM", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "故障类型枚举不能为空") + private String faultType; + + @Schema(description = "描述") + private String describes; + + @Schema(description = "维修人") + private Long maintenance; + + @Schema(description = "验证人") + private Long verifyer; + + @Schema(description = "验证时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime verifyTime; + + @Schema(description = "完成时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime completionTime; + + @Schema(description = "接单时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime receivingTime; + + @Schema(description = "维修人联系电话") + private String maintenancePhone; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + //@NotNull(message = "状态不能为空") + private String status; + + @Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + //@NotNull(message = "类型不能为空") + private String type; + + @Schema(description = "地点ID", example = "32516") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "并发乐观锁不能为空") + private Integer concurrencyStamp; + + @Schema(description = "验证意见") + private String verifyContent; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainCreateReqVO.java new file mode 100644 index 0000000..b1e2a63 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainCreateReqVO.java @@ -0,0 +1,19 @@ +package com.win.module.eam.controller.deviceinspectionjob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.List; + +@Schema(description = "管理后台 - 检修工单主创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceInspectionJobMainCreateReqVO extends DeviceInspectionJobMainBaseVO { + + @Schema(description = "检修工单子表", requiredMode = Schema.RequiredMode.REQUIRED) + private List subList; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainExcelVO.java new file mode 100644 index 0000000..6cbd04a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainExcelVO.java @@ -0,0 +1,56 @@ +package com.win.module.eam.controller.deviceinspectionjob.vo; + +import lombok.*; + +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 检修工单主 Excel VO + * + * @author 超级管理员 + */ +@Data +public class DeviceInspectionJobMainExcelVO { + + @ExcelProperty("编号唯一标识") + private String number; + + @ExcelProperty("维修工单号") + private String maintenanceNumber; + + @ExcelProperty("设备模具") + private String deviceNumber; + + @ExcelProperty("厂区编号") + private String factoryAreaNumber; + + @ExcelProperty("描述") + private String describe; + + @ExcelProperty("维修人") + private Long maintenance; + + @ExcelProperty("维修人联系电话") + private String maintenancePhone; + + @ExcelProperty("状态") + private String status; + + @ExcelProperty("类型") + private String type; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainExportReqVO.java new file mode 100644 index 0000000..03822ef --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainExportReqVO.java @@ -0,0 +1,37 @@ +package com.win.module.eam.controller.deviceinspectionjob.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 检修工单主 Excel 导出 Request VO,参数和 DeviceInspectionMainPageReqVO 是一致的") +@Data +public class DeviceInspectionJobMainExportReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "设备模具") + private String deviceNumber; + + @Schema(description = "状态", example = "1") + private String status; + + @Schema(description = "类型", example = "1") + private String type; + + + @Schema(description = "厂区编码", example = "1") + private String factoryAreaNumber; + + + @Schema(description = "检修人", example = "1") + private String maintenance; + + + @Schema(description = "维修工单", example = "1") + private String maintenanceNumber; + + @Schema(description = "验证人", example = "1") + private String verifyer; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainPageReqVO.java new file mode 100644 index 0000000..0a65f62 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainPageReqVO.java @@ -0,0 +1,58 @@ +package com.win.module.eam.controller.deviceinspectionjob.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; + +@Schema(description = "管理后台 - 检修工单主分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceInspectionJobMainPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "设备模具") + private String deviceNumber; + + @Schema(description = "状态", example = "1") + private String status; + + @Schema(description = "类型", example = "1") + private String type; + + @Schema(description = "0工单1我的", example = "2") + private String flag; + + @Schema(description = "我的用户", example = "2") + private String userId; + + @Schema(description = "描述", example = "1") + private String describes; + + @Schema(description = "名称", example = "1") + private String name; + + @Schema(description = "厂区编码", example = "1") + private String factoryAreaNumber; + + @Schema(description = "班组", example = "1") + private String classType; + + @Schema(description = "检修人", example = "1") + private String maintenance; + + + @Schema(description = "维修工单", example = "1") + private String maintenanceNumber; + + @Schema(description = "维修工0还是工程师1", example = "1") + private String standType; + + @Schema(description = "验证人", example = "1") + private String verifyer; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainRespVO.java new file mode 100644 index 0000000..3b275f4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainRespVO.java @@ -0,0 +1,40 @@ +package com.win.module.eam.controller.deviceinspectionjob.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 DeviceInspectionJobMainRespVO extends DeviceInspectionJobMainBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "厂区") + private String factoryAreaName; + + @Schema(description = "类型") + private String typeName; + + @Schema(description = "类型") + private String statusName; + + @Schema(description = "维修人") + private String maintenanceName; + + @Schema(description = "名称") + private String name; + + @Schema(description = "故障类型", example = "1") + private String faultType; + + @Schema(description = "故障名称", example = "1") + private String faultTypeName; + + @Schema(description = "班次", example = "1") + private String classesName; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainUpdateReqVO.java new file mode 100644 index 0000000..0161599 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionJobMainUpdateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.deviceinspectionjob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Schema(description = "管理后台 - 检修工单主更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceInspectionJobMainUpdateReqVO extends DeviceInspectionJobMainBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionReportReqVo.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionReportReqVo.java new file mode 100644 index 0000000..4a926c4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinspectionjob/vo/DeviceInspectionReportReqVo.java @@ -0,0 +1,102 @@ +package com.win.module.eam.controller.deviceinspectionjob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @ClassName DeviceMaintainJobReportReqVo + * @Description TODO + * @Author longlongxiaogege + * @Date 2024/4/19 08:36 + * @Version 1.0 + */ +@Data +public class DeviceInspectionReportReqVo { + /** + * 编号 + */ + @Schema(description = "id") + private String id; + /** + * 序号 + */ + @Schema(description = "序号") + private String rowNum; + /** + * 故障类型 + */ + @Schema(description = "故障类型") + private String label; + /** + * 设备编号 + */ + @Schema(description = "设备编号") + private String deviceNumber; + /** + * 设备名称 + */ + @Schema(description = "设备名称") + private String deviceName; + /** + * 设备部位 + */ + @Schema(description = "设备部位") + private String equipmentParts; + /** + * 保养内容 + */ + @Schema(description = "保养内容") + private String contents; + /** + * 人数 + */ + @Schema(description = "人数") + private String peoples; + /** + * 预计完成时间 + */ + @Schema(description = "预计完成时间") + private String estimatedMinutes; + /** + * 责任人 + */ + @Schema(description = "责任人") + private String chargePeoples; + /** + * 完成状态 + */ + @Schema(description = "完成状态") + private String status; + /** + * 完成时间 + */ + @Schema(description = "完成时间") + private String completionTime; + /** + * 备件名称 + */ + @Schema(description = "备件名称") + private String itemName; + /** + * 备件个数 + */ + @Schema(description = "备件个数") + private String qty; + /** + * 未完成原因 + */ + @Schema(description = "未完成原因") + private String uncompleted; + /** + * 操作人 + */ + @Schema(description = "操作人") + private Long maintenance; + /** + * 工程师确认 + */ + @Schema(description = "工程师确认") + private String engineer; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/DeviceInternalAuditController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/DeviceInternalAuditController.java new file mode 100644 index 0000000..66a3618 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/DeviceInternalAuditController.java @@ -0,0 +1,101 @@ +package com.win.module.eam.controller.deviceinternalaudit; + +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.eam.controller.deviceinternalaudit.vo.*; +import com.win.module.eam.convert.deviceinternalaudit.DeviceInternalAuditConvert; +import com.win.module.eam.dal.dataobject.deviceinternalaudit.DeviceInternalAuditDO; +import com.win.module.eam.service.deviceinternalaudit.DeviceInternalAuditService; +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.Arrays; +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("/eam/device-internal-audit") +@Validated +public class DeviceInternalAuditController { + + @Resource + private DeviceInternalAuditService deviceInternalAuditService; + + @PostMapping("/create") + @Operation(summary = "创建设备内审业务说明") + public CommonResult createDeviceInternalAudit(@Valid @RequestBody DeviceInternalAuditCreateReqVO createReqVO) { + return success(deviceInternalAuditService.createDeviceInternalAudit(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新设备内审业务说明") + public CommonResult updateDeviceInternalAudit(@Valid @RequestBody DeviceInternalAuditUpdateReqVO updateReqVO) { + int result = deviceInternalAuditService.updateDeviceInternalAudit(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除设备内审业务说明") + @Parameter(name = "id", description = "编号", required = true) + public CommonResult deleteDeviceInternalAudit(@RequestParam("id") Long id) { + int result = deviceInternalAuditService.deleteDeviceInternalAudit(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得设备内审业务说明") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + public CommonResult getDeviceInternalAudit(@RequestParam("id") Long id) { + DeviceInternalAuditDO deviceInternalAudit = deviceInternalAuditService.getDeviceInternalAudit(id); + return success(DeviceInternalAuditConvert.INSTANCE.convert(deviceInternalAudit)); + } + + @GetMapping("/list") + @Operation(summary = "获得设备内审业务说明列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + public CommonResult> getDeviceInternalAuditList(@RequestParam("ids") Collection ids) { + List list = deviceInternalAuditService.getDeviceInternalAuditList(ids); + return success(DeviceInternalAuditConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得设备内审业务说明分页") + public CommonResult> getDeviceInternalAuditPage(@Valid DeviceInternalAuditPageReqVO pageVO) { + PageResult pageResult = deviceInternalAuditService.getDeviceInternalAuditPage(pageVO); + return success(DeviceInternalAuditConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出设备内审业务说明 Excel") + @OperateLog(type = EXPORT) + public void exportDeviceInternalAuditExcel(@Valid DeviceInternalAuditExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deviceInternalAuditService.getDeviceInternalAuditList(exportReqVO); + // 导出 Excel + List datas = DeviceInternalAuditConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "设备内审业务说明.xls", "数据", DeviceInternalAuditExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入设备内审业务说明模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "设备内审业务说明基本信息导入模板.xls", "设备内审业务说明基本信息列表", DeviceInternalAuditExcelVO.class, list); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditBaseVO.java new file mode 100644 index 0000000..02542e5 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditBaseVO.java @@ -0,0 +1,59 @@ +package com.win.module.eam.controller.deviceinternalaudit.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 设备内审业务说明 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class DeviceInternalAuditBaseVO { + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + private String number; + + @Schema(description = "人员", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "人员不能为空") + private String personer; + + @Schema(description = "装配") + private Integer fitOut; + + @Schema(description = "涂装") + private Integer coating; + + @Schema(description = "注塑") + private Integer injectionMolding; + + @Schema(description = "商务") + private Integer business; + + @Schema(description = "实验室") + private Integer laboratory; + + @Schema(description = "IT") + private Integer it; + + @Schema(description = "质量保障部") + private Integer qualityDepartment; + + @Schema(description = "物流") + private Integer materialFlow; + + @Schema(description = "模具前期") + private Integer moldPre; + + @Schema(description = "平均分") + private BigDecimal average; + + @Schema(description = "描述") + private String describes; + + @Schema(description = "是否可用") + private String available; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditCreateReqVO.java new file mode 100644 index 0000000..2813568 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.deviceinternalaudit.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 DeviceInternalAuditCreateReqVO extends DeviceInternalAuditBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditExcelVO.java new file mode 100644 index 0000000..7c938c5 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditExcelVO.java @@ -0,0 +1,66 @@ +package com.win.module.eam.controller.deviceinternalaudit.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 设备内审业务说明 Excel VO + * + * @author 超级管理员 + */ +@Data +public class DeviceInternalAuditExcelVO { + + @ExcelProperty("id") + private Long id; + + @ExcelProperty("编号唯一标识") + private String number; + + + @ExcelProperty("人员") + private String personer; + + @ExcelProperty("装配") + private BigDecimal fitOut; + + @ExcelProperty("涂装") + private BigDecimal coating; + + @ExcelProperty("注塑") + private BigDecimal injectionMolding; + + @ExcelProperty("商务") + private BigDecimal business; + + @ExcelProperty("实验室") + private BigDecimal laboratory; + + @ExcelProperty("IT") + private BigDecimal it; + + @ExcelProperty("质量保障部") + private BigDecimal qualityDepartment; + + @ExcelProperty("物流") + private BigDecimal materialFlow; + + @ExcelProperty("模具前期") + private BigDecimal moldPre; + + @ExcelProperty("平均分") + private BigDecimal average; + + @ExcelProperty("描述") + private String describes; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("是否可用") + private String available; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditExportReqVO.java new file mode 100644 index 0000000..893d84c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditExportReqVO.java @@ -0,0 +1,62 @@ +package com.win.module.eam.controller.deviceinternalaudit.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +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,参数和 DeviceInternalAuditPageReqVO 是一致的") +@Data +public class DeviceInternalAuditExportReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "描述") + private String describes; + + @Schema(description = "人员") + private String personer; + + @Schema(description = "装配") + private Integer fitOut; + + @Schema(description = "涂装") + private Integer coating; + + @Schema(description = "注塑") + private Integer injectionMolding; + + @Schema(description = "商务") + private Integer business; + + @Schema(description = "实验室") + private Integer laboratory; + + @Schema(description = "IT") + private Integer it; + + @Schema(description = "质量保障部") + private Integer qualityDepartment; + + @Schema(description = "物流") + private Integer materialFlow; + + @Schema(description = "模具前期") + private Integer moldPre; + + @Schema(description = "平均分") + private BigDecimal average; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "是否可用") + private String available; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditPageReqVO.java new file mode 100644 index 0000000..8539d8f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditPageReqVO.java @@ -0,0 +1,67 @@ +package com.win.module.eam.controller.deviceinternalaudit.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.math.BigDecimal; +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 DeviceInternalAuditPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "人员") + private String personer; + + @Schema(description = "装配") + private Integer fitOut; + + @Schema(description = "涂装") + private Integer coating; + + @Schema(description = "注塑") + private Integer injectionMolding; + + @Schema(description = "商务") + private Integer business; + + @Schema(description = "实验室") + private Integer laboratory; + + @Schema(description = "IT") + private Integer it; + + @Schema(description = "质量保障部") + private Integer qualityDepartment; + + @Schema(description = "物流") + private Integer materialFlow; + + @Schema(description = "模具前期") + private Integer moldPre; + + @Schema(description = "平均分") + private BigDecimal average; + + @Schema(description = "描述") + private String describes; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "是否可用") + private String available; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditRespVO.java new file mode 100644 index 0000000..553508d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.eam.controller.deviceinternalaudit.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 DeviceInternalAuditRespVO extends DeviceInternalAuditBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24963") + private Long id; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditUpdateReqVO.java new file mode 100644 index 0000000..da6dea9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceinternalaudit/vo/DeviceInternalAuditUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.eam.controller.deviceinternalaudit.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 设备内审业务说明更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceInternalAuditUpdateReqVO extends DeviceInternalAuditBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24963") + @NotNull(message = "id不能为空") + private Long id; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/DeviceItemController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/DeviceItemController.java new file mode 100644 index 0000000..4dba10f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/DeviceItemController.java @@ -0,0 +1,117 @@ +package com.win.module.eam.controller.deviceitem; + +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.eam.controller.deviceitem.vo.*; +import com.win.module.eam.convert.deviceitem.DeviceItemConvert; +import com.win.module.eam.dal.dataobject.deviceitem.DeviceItemDO; +import com.win.module.eam.service.deviceitem.DeviceItemService; +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 javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +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("/rel/device-item") +@Validated +public class DeviceItemController { + + @Resource + private DeviceItemService deviceItemService; + + @PostMapping("/create") + @Operation(summary = "创建设备备件关系") +// @PreAuthorize("@ss.hasPermission('rel:device-item:create')") + public CommonResult createDeviceItem(@Valid @RequestBody DeviceItemCreateReqVO createReqVO) { + return success(deviceItemService.createDeviceItem(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新设备备件关系") +// @PreAuthorize("@ss.hasPermission('rel:device-item:update')") + public CommonResult updateDeviceItem(@Valid @RequestBody DeviceItemUpdateReqVO updateReqVO) { + int result = deviceItemService.updateDeviceItem(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除设备备件关系") + @Parameter(name = "id", description = "编号", required = true) +// @PreAuthorize("@ss.hasPermission('rel:device-item:delete')") + public CommonResult deleteDeviceItem(@RequestParam("id") Long id) { + int result = deviceItemService.deleteDeviceItem(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得设备备件关系") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('rel:device-item:query')") + public CommonResult getDeviceItem(@RequestParam("id") Long id) { + DeviceItemDO deviceItem = deviceItemService.getDeviceItem(id); + return success(DeviceItemConvert.INSTANCE.convert(deviceItem)); + } + + @GetMapping("/list") + @Operation(summary = "获得设备备件关系列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('rel:device-item:query')") + public CommonResult> getDeviceItemList(@RequestParam("ids") Collection ids) { + List list = deviceItemService.getDeviceItemList(ids); + return success(DeviceItemConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得设备备件关系分页") +// @PreAuthorize("@ss.hasPermission('rel:device-item:query')") + public CommonResult> getDeviceItemPage(@Valid DeviceItemPageReqVO pageVO) { + PageResult pageResult = deviceItemService.getDeviceItemPage(pageVO); + return success(DeviceItemConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出设备备件关系 Excel") +// @PreAuthorize("@ss.hasPermission('rel:device-item:export')") + @OperateLog(type = EXPORT) + public void exportDeviceItemExcel(@Valid DeviceItemExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deviceItemService.getDeviceItemList(exportReqVO); + // 导出 Excel + List datas = DeviceItemConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "设备备件关系.xls", "数据", DeviceItemExcelVO.class, datas); + } + + + @PostMapping("/createBatch") + @Operation(summary = "创建设备备件关系") +// @PreAuthorize("@ss.hasPermission('rel:device-item:create')") + public CommonResult createDeviceItemBatch(@NotEmpty @RequestBody List<@Valid DeviceItemCreateReqVO> createReqVOList) { + List deviceItemDOList = DeviceItemConvert.INSTANCE.convertList03(createReqVOList); + deviceItemService.createDeviceItemBatch(deviceItemDOList); + return CommonResult.success(true); + } + + @GetMapping("/noPage") + @Operation(summary = "获得设备备件关系不分页") +// @PreAuthorize("@ss.hasPermission('rel:device-item:query')") + public CommonResult> getDeviceItemNoPage(@Valid DeviceItemPageReqVO pageVO) { + List pageResult = deviceItemService.getDeviceItemNoPage(pageVO); + return success(DeviceItemConvert.INSTANCE.convertList(pageResult)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemBaseVO.java new file mode 100644 index 0000000..1e1a73e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemBaseVO.java @@ -0,0 +1,36 @@ +package com.win.module.eam.controller.deviceitem.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 DeviceItemBaseVO { + + @Schema(description = "id", example = "id") + private Long id; + + @Schema(description = "备件代码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "备件代码不能为空") + private String itemNumber; + + @Schema(description = "设备代码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "设备代码不能为空") + private String deviceNumber; + + @Schema(description = "地点ID", example = "12282") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "并发乐观锁不能为空") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemCreateReqVO.java new file mode 100644 index 0000000..a2666e9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.deviceitem.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 设备备件关系创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceItemCreateReqVO extends DeviceItemBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemExcelVO.java new file mode 100644 index 0000000..804639c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemExcelVO.java @@ -0,0 +1,34 @@ +package com.win.module.eam.controller.deviceitem.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 DeviceItemExcelVO { + + @ExcelProperty("备件代码") + private String itemNumber; + + @ExcelProperty("设备代码") + private String deviceNumber; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemExportReqVO.java new file mode 100644 index 0000000..7594405 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemExportReqVO.java @@ -0,0 +1,27 @@ +package com.win.module.eam.controller.deviceitem.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,参数和 DeviceItemPageReqVO 是一致的") +@Data +public class DeviceItemExportReqVO { + + @Schema(description = "备件代码") + private String itemNumber; + + @Schema(description = "设备代码") + private String deviceNumber; + + @Schema(description = "地点ID", example = "12282") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemPageReqVO.java new file mode 100644 index 0000000..17f7015 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemPageReqVO.java @@ -0,0 +1,29 @@ +package com.win.module.eam.controller.deviceitem.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 DeviceItemPageReqVO extends PageParam { + + @Schema(description = "备件代码") + private String itemNumber; + + @Schema(description = "设备代码") + private String deviceNumber; + + @Schema(description = "地点ID", example = "12282") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemRespVO.java new file mode 100644 index 0000000..cb58966 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemRespVO.java @@ -0,0 +1,13 @@ +package com.win.module.eam.controller.deviceitem.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 DeviceItemRespVO extends DeviceItemBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemUpdateReqVO.java new file mode 100644 index 0000000..aaa547b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/deviceitem/vo/DeviceItemUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.deviceitem.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 DeviceItemUpdateReqVO extends DeviceItemBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/DeviceMaintainJobDetailController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/DeviceMaintainJobDetailController.java new file mode 100644 index 0000000..fafc3ae --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/DeviceMaintainJobDetailController.java @@ -0,0 +1,145 @@ +package com.win.module.eam.controller.devicemaintainjob; + +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.convert.devicemaintainjob.DeviceMaintainJobDetailConvert; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobDetailDO; +import com.win.module.eam.service.devicemaintainjob.DeviceMaintainJobDetailService; +import io.swagger.v3.oas.annotations.Parameters; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +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.*; +import javax.servlet.http.*; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.*; +import java.io.IOException; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.pojo.CommonResult; +import static com.win.framework.common.pojo.CommonResult.success; + +import com.win.framework.excel.core.util.ExcelUtils; + +import com.win.framework.operatelog.core.annotations.OperateLog; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.*; + +import org.springframework.web.multipart.MultipartFile; + +@Tag(name = "管理后台 - 保养工单子") +@RestController +@RequestMapping("/eam/device-maintain-job-detail") +@Validated +public class DeviceMaintainJobDetailController { + + @Resource + private DeviceMaintainJobDetailService deviceMaintainJobDetailService; + + @PostMapping("/create") + @Operation(summary = "创建保养工单子") + //@PreAuthorize("@ss.hasPermission('eam:device-maintain-job-detail:create')") + public CommonResult createDeviceMaintainOrderDetail(@Valid @RequestBody DeviceMaintainJobDetailCreateReqVO createReqVO) { + return success(deviceMaintainJobDetailService.createDeviceMaintainOrderDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新保养工单子") + //@PreAuthorize("@ss.hasPermission('eam:device-maintain-job-detail:update')") + public CommonResult updateDeviceMaintainOrderDetail(@Valid @RequestBody DeviceMaintainJobDetailUpdateReqVO updateReqVO) { + int result = deviceMaintainJobDetailService.updateDeviceMaintainOrderDetail(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除保养工单子") + @Parameter(name = "id", description = "编号", required = true) + //@PreAuthorize("@ss.hasPermission('eam:device-maintain-job-detail:delete')") + public CommonResult deleteDeviceMaintainOrderDetail(@RequestParam("id") Long id) { + int result = deviceMaintainJobDetailService.deleteDeviceMaintainOrderDetail(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得保养工单子") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:device-maintain-job-detail:query')") + public CommonResult getDeviceMaintainOrderDetail(@RequestParam("id") Long id) { + DeviceMaintainJobDetailDO deviceMaintainOrderDetail = deviceMaintainJobDetailService.getDeviceMaintainOrderDetail(id); + return success(DeviceMaintainJobDetailConvert.INSTANCE.convert(deviceMaintainOrderDetail)); + } + + @GetMapping("/list") + @Operation(summary = "获得保养工单子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-maintain-job-detail:query')") + public CommonResult> getDeviceMaintainOrderDetailList(@RequestParam("ids") Collection ids) { + List list = deviceMaintainJobDetailService.getDeviceMaintainOrderDetailList(ids); + return success(DeviceMaintainJobDetailConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得保养工单子分页") + //@PreAuthorize("@ss.hasPermission('eam:device-maintain-job-detail:query')") + public CommonResult> getDeviceMaintainOrderDetailPage(@Valid DeviceMaintainJobDetailPageReqVO pageVO) { + PageResult pageResult = deviceMaintainJobDetailService.getDeviceMaintainOrderDetailPage(pageVO); + return success(DeviceMaintainJobDetailConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出保养工单子 Excel") + //@PreAuthorize("@ss.hasPermission('eam:device-maintain-job-detail:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMaintainOrderDetailExcel(@Valid DeviceMaintainJobDetailExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deviceMaintainJobDetailService.getDeviceMaintainOrderDetailList(exportReqVO); + // 导出 Excel + List datas = DeviceMaintainJobDetailConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "保养工单子.xls", "数据", DeviceMaintainJobDetailExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入保养工单子模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "保养工单子基本信息导入模板.xls", "保养工单子基本信息列表", DeviceMaintainJobDetailExcelVO.class, list); + } + + @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('eam:device-maintain-job-detail:import')") + 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 list = ExcelUtils.read(file, DeviceMaintainJobDetailExcelVO.class); + List errorList = deviceMaintainJobDetailService.importDeviceMaintainOrderDetailList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + return success(returnMap); + } + + @GetMapping("/selectListByNumber") + @Operation(summary = "获得保养工单子列表") + @Parameter(name = "number", description = "保养工单号", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-maintain-job-detail:query')") + public CommonResult> selectListByNumber(@RequestParam("number") String number) { + List list = deviceMaintainJobDetailService.selectListByNumber(number); + return success(DeviceMaintainJobDetailConvert.INSTANCE.convertList(list)); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/DeviceMaintainJobMainController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/DeviceMaintainJobMainController.java new file mode 100644 index 0000000..2adef38 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/DeviceMaintainJobMainController.java @@ -0,0 +1,208 @@ +package com.win.module.eam.controller.devicemaintainjob; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.convert.devicemaintainjob.DeviceMaintainJobMainConvert; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobReportDo; +import com.win.module.eam.service.devicemaintainjob.DeviceMaintainJobMainService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + + +@Tag(name = "管理后台 - 保养工单主") +@RestController +@RequestMapping("/eam/device-maintain-job-main") +@Validated +public class DeviceMaintainJobMainController { + + @Resource + private DeviceMaintainJobMainService deviceMaintainJobMainService; + + @PostMapping("/create") + @Operation(summary = "创建保养工单主") + @PreAuthorize("@ss.hasPermission('eam:device-maintain-job-main:create')") + public CommonResult createDeviceMaintainOrderMain(@Valid @RequestBody DeviceMaintainJobMainCreateReqVO createReqVO) { + return success(deviceMaintainJobMainService.createDeviceMaintainOrderMain(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新保养工单主") + @PreAuthorize("@ss.hasPermission('eam:device-maintain-job-main:update')") + public CommonResult updateDeviceMaintainOrderMain(@Valid @RequestBody DeviceMaintainJobMainUpdateReqVO updateReqVO) { + int result = deviceMaintainJobMainService.updateDeviceMaintainOrderMain(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除保养工单主") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:device-maintain-job-main:delete')") + public CommonResult deleteDeviceMaintainOrderMain(@RequestParam("id") Long id) { + int result = deviceMaintainJobMainService.deleteDeviceMaintainOrderMain(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得保养工单主") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:device-maintain-job-main:query')") + public CommonResult getDeviceMaintainOrderMain(@RequestParam("id") Long id) { + DeviceMaintainJobMainDO deviceMaintainOrderMain = deviceMaintainJobMainService.getDeviceMaintainOrderMain(id); + return success(DeviceMaintainJobMainConvert.INSTANCE.convert(deviceMaintainOrderMain)); + } + + @GetMapping("/list") + @Operation(summary = "获得保养工单主列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-maintain-job-main:query')") + public CommonResult> getDeviceMaintainOrderMainList(@RequestParam("ids") Collection ids) { + List list = deviceMaintainJobMainService.getDeviceMaintainOrderMainList(ids); + return success(DeviceMaintainJobMainConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得保养工单主分页") + //@PreAuthorize("@ss.hasPermission('eam:device-maintain-job-main:query')") + public CommonResult> getDeviceMaintainOrderMainPage(@Valid DeviceMaintainJobMainPageReqVO pageVO) { + PageResult pageResult = deviceMaintainJobMainService.getDeviceMaintainOrderMainPage(pageVO); + return success(DeviceMaintainJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + + + @PostMapping("/senior") + @Operation(summary = "获得保养工单主分页") + //@PreAuthorize("@ss.hasPermission('eam:device-maintain-job-main:query')") + public CommonResult> getDeviceMaintainOrderMainSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = deviceMaintainJobMainService.getDeviceMaintainOrderMainSenior(conditions); + PageResult result = DeviceMaintainJobMainConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + + + @GetMapping("/export-excel") + @Operation(summary = "导出保养工单主 Excel") + @PreAuthorize("@ss.hasPermission('eam:device-maintain-job-main:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMaintainOrderMainExcel(@Valid DeviceMaintainJobMainExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deviceMaintainJobMainService.getDeviceMaintainOrderMainList(exportReqVO); + // 导出 Excel + List datas = DeviceMaintainJobMainConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "保养工单主.xls", "数据", DeviceMaintainJobMainExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入保养工单主模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "保养工单主基本信息导入模板.xls", "保养工单主基本信息列表", DeviceMaintainJobMainExcelVO.class, list); + } + + @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('eam:device-maintain-job-main:import')") + 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 list = ExcelUtils.read(file, DeviceMaintainJobMainExcelVO.class); + List errorList = deviceMaintainJobMainService.importDeviceMaintainOrderMainList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + @GetMapping("/getAppPage") + @Operation(summary = "获得APP保养工单分页") + public CommonResult> getAppPage(@Valid DeviceMaintainJobMainPageReqVO pageVO) { + PageResult pageResult = deviceMaintainJobMainService.getAppPage(pageVO); + return success(DeviceMaintainJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/orderClick") + @Operation(summary = "APP保养工单接单所有人都能接单") + @Parameters({ + @Parameter(name = "id", description = "主键id", required = true) + }) + @PreAuthorize("@ss.hasPermission('eam:device-maintain-job-main:orderClick') or @ss.hasPermission('eam:device-maintain-job-main:orderClickAPP')") + public CommonResult orderClick(@RequestParam("id") Long id) { + return success(deviceMaintainJobMainService.orderClick(id)); + } + + @GetMapping("/orderClickFinish") + @Operation(summary = "APP保养工单点击完成") + @Parameters({ + @Parameter(name = "id", description = "主键id", required = true) + }) + @PreAuthorize("@ss.hasPermission('eam:device-maintain-job-main:orderClickFinish') or @ss.hasPermission('eam:device-maintain-job-main:orderClickFinishAPP')") + public CommonResult orderClickFinish(@RequestParam("id") Long id) { + return success(deviceMaintainJobMainService.orderClickFinish(id)); + } + + @GetMapping("/orderClickVerify") + @Operation(summary = "APP保养工单工程师验证") + @Parameters({ + @Parameter(name = "id", description = "主键id", required = true) + }) + @PreAuthorize("@ss.hasPermission('eam:device-maintain-job-main:orderClickVerify') or @ss.hasPermission('eam:device-maintain-job-main:orderClickVerifyAPP')") + public CommonResult orderClickVerify(@RequestParam("id") Long id, String verifyContent) { + return success(deviceMaintainJobMainService.orderClickVerify(id,verifyContent)); + } + + + @GetMapping("/getMaintainReport") + @Operation(summary = "保养打印单生成子单") + public CommonResult> getMaintainReport(DeviceMaintainJobReportReqVo deviceMaintainJobReportReqVo) { + DeviceMaintainJobReportDo deviceMaintainJobReportDo = DeviceMaintainJobMainConvert.INSTANCE.convert(deviceMaintainJobReportReqVo); + return success(deviceMaintainJobMainService.getMaintainReport(deviceMaintainJobReportDo)); + } + + + @GetMapping("/getMaintainReportMainInfo") + @Operation(summary = "保养打印单生成主单") + public CommonResult> getMaintainReportMainInfo(DeviceMaintainJobReportReqVo deviceMaintainJobReportReqVo) { + DeviceMaintainJobReportDo deviceMaintainJobReportDo = new DeviceMaintainJobReportDo(); + deviceMaintainJobReportDo.setId(deviceMaintainJobReportReqVo.getId()); + List resultList = deviceMaintainJobMainService.getMaintainReportMainInfo(deviceMaintainJobReportDo); + return success(resultList); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/MaintainJobDetailItemController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/MaintainJobDetailItemController.java new file mode 100644 index 0000000..8f17dbc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/MaintainJobDetailItemController.java @@ -0,0 +1,138 @@ +package com.win.module.eam.controller.devicemaintainjob; + +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.convert.devicemaintainjob.MaintainJobDetailItemConvert; +import com.win.module.eam.dal.dataobject.devicemaintainjob.MaintainJobDetailItemDO; +import com.win.module.eam.service.devicemaintainjob.MaintainJobDetailItemService; +import io.swagger.v3.oas.annotations.Parameters; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +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.*; +import javax.servlet.http.*; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.*; +import java.io.IOException; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.pojo.CommonResult; +import static com.win.framework.common.pojo.CommonResult.success; + +import com.win.framework.excel.core.util.ExcelUtils; + +import com.win.framework.operatelog.core.annotations.OperateLog; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.*; + +import org.springframework.web.multipart.MultipartFile; + +@Tag(name = "管理后台 - 保养工单子表与备件关系") +@RestController +@RequestMapping("/eam/maintain-job-detail-item") +@Validated +public class MaintainJobDetailItemController { + + @Resource + private MaintainJobDetailItemService maintainJobDetailItemService; + + @PostMapping("/create") + @Operation(summary = "创建保养工单子表与备件关系") + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:create')") + public CommonResult createMaintainOrderDetailItem(@Valid @RequestBody MaintainJobDetailItemCreateReqVO createReqVO) { + return success(maintainJobDetailItemService.createMaintainOrderDetailItem(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新保养工单子表与备件关系") + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:update')") + public CommonResult updateMaintainOrderDetailItem(@Valid @RequestBody MaintainJobDetailItemUpdateReqVO updateReqVO) { + int result = maintainJobDetailItemService.updateMaintainOrderDetailItem(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除保养工单子表与备件关系") + @Parameter(name = "id", description = "编号", required = true) + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:delete')") + public CommonResult deleteMaintainOrderDetailItem(@RequestParam("id") Long id) { + int result = maintainJobDetailItemService.deleteMaintainOrderDetailItem(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得保养工单子表与备件关系") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:query')") + public CommonResult getMaintainOrderDetailItem(@RequestParam("id") Long id) { + MaintainJobDetailItemDO maintainOrderDetailItem = maintainJobDetailItemService.getMaintainOrderDetailItem(id); + return success(MaintainJobDetailItemConvert.INSTANCE.convert(maintainOrderDetailItem)); + } + + @GetMapping("/list") + @Operation(summary = "获得保养工单子表与备件关系列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:query')") + public CommonResult> getMaintainOrderDetailItemList(@RequestParam("ids") Collection ids) { + List list = maintainJobDetailItemService.getMaintainOrderDetailItemList(ids); + return success(MaintainJobDetailItemConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得保养工单子表与备件关系分页") + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:query')") + public CommonResult> getMaintainOrderDetailItemPage(@Valid MaintainJobDetailItemPageReqVO pageVO) { + PageResult pageResult = maintainJobDetailItemService.getMaintainOrderDetailItemPage(pageVO); + return success(MaintainJobDetailItemConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出保养工单子表与备件关系 Excel") + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:export')") + @OperateLog(type = EXPORT) + public void exportMaintainOrderDetailItemExcel(@Valid MaintainJobDetailItemExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = maintainJobDetailItemService.getMaintainOrderDetailItemList(exportReqVO); + // 导出 Excel + List datas = MaintainJobDetailItemConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "保养工单子表与备件关系.xls", "数据", MaintainJobDetailItemExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入保养工单子表与备件关系模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "保养工单子表与备件关系基本信息导入模板.xls", "保养工单子表与备件关系基本信息列表", MaintainJobDetailItemExcelVO.class, list); + } + + @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('eam:maintain-job-detail-item:import')") + 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 list = ExcelUtils.read(file, MaintainJobDetailItemExcelVO.class); + List errorList = maintainJobDetailItemService.importMaintainOrderDetailItemList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailBaseVO.java new file mode 100644 index 0000000..8868d59 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailBaseVO.java @@ -0,0 +1,81 @@ +package com.win.module.eam.controller.devicemaintainjob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +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 DeviceMaintainJobDetailBaseVO { + private Long id; + /** + * 主表id + */ + private Long masterId; + + @Schema(description = "地点ID", example = "14287") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "并发乐观锁不能为空") + private Integer concurrencyStamp; + + @Schema(description = "内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + //@NotNull(message = "内容不能为空") + private String name; + + @Schema(description = "检修工单号与主表一致", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "检修工单号与主表一致不能为空") + private String number; + + @Schema(description = "人数", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "人数不能为空") + private Integer peoples; + + @Schema(description = "预计分钟", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "预计分钟不能为空") + private Integer estimatedMinutes; + + @Schema(description = "实际分钟", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "实际分钟不能为空") + private Integer actualMinutes; + + @Schema(description = "责任人多选", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "责任人多选不能为空") + private String chargePeoples; + + @Schema(description = "完成时间", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "完成时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime completionTime; + + @Schema(description = "工程师确认", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "工程师确认不能为空") + private String engineer; + + @Schema(description = "未完成原因") + private String uncompleted; + + @Schema(description = "是否完成0 1", example = "2") + private String status; + + @Schema(description = "维修内容") + private String contents; + + @Schema(description = "备件和数量") + private List> itemNumbers; + @Schema(description = "保养部位") + private String equipmentParts; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailCreateReqVO.java new file mode 100644 index 0000000..3957f1c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.devicemaintainjob.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 保养工单子创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceMaintainJobDetailCreateReqVO extends DeviceMaintainJobDetailBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailExcelVO.java new file mode 100644 index 0000000..6e8327f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailExcelVO.java @@ -0,0 +1,65 @@ +package com.win.module.eam.controller.devicemaintainjob.vo; + +import lombok.*; + +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 保养工单子 Excel VO + * + * @author 超级管理员 + */ +@Data +public class DeviceMaintainJobDetailExcelVO { + + @ExcelProperty("id") + private Long id; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + + @ExcelProperty("内容") + private String name; + + @ExcelProperty("检修工单号与主表一致") + private String number; + + @ExcelProperty("人数") + private Integer peoples; + + @ExcelProperty("预计分钟") + private Integer estimatedMinutes; + + @ExcelProperty("实际分钟") + private Integer actualMinutes; + + @ExcelProperty("责任人多选") + private String chargePeoples; + + @ExcelProperty("完成时间") + private LocalDateTime completionTime; + + @ExcelProperty("工程师确认") + private String engineer; + + @ExcelProperty("未完成原因") + private String uncompleted; + + @ExcelProperty("是否完成0 1") + private String status; + + @ExcelProperty("维修内容") + private String contents; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailExportReqVO.java new file mode 100644 index 0000000..ee4a348 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailExportReqVO.java @@ -0,0 +1,65 @@ +package com.win.module.eam.controller.devicemaintainjob.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,参数和 DeviceMaintainOrderDetailPageReqVO 是一致的") +@Data +public class DeviceMaintainJobDetailExportReqVO { + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "地点ID", example = "14287") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + + @Schema(description = "内容", example = "赵六") + private String name; + + @Schema(description = "检修工单号与主表一致") + private String number; + + @Schema(description = "人数") + private Integer peoples; + + @Schema(description = "预计分钟") + private Integer estimatedMinutes; + + @Schema(description = "实际分钟") + private Integer actualMinutes; + + @Schema(description = "责任人多选") + private String chargePeoples; + + @Schema(description = "完成时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] completionTime; + + @Schema(description = "工程师确认") + private String engineer; + + @Schema(description = "未完成原因") + private String uncompleted; + + @Schema(description = "是否完成0 1", example = "2") + private String status; + + @Schema(description = "维修内容") + private String contents; + + @Schema(description = "主表id") + private String masterId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailPageReqVO.java new file mode 100644 index 0000000..4240cf6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailPageReqVO.java @@ -0,0 +1,67 @@ +package com.win.module.eam.controller.devicemaintainjob.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 DeviceMaintainJobDetailPageReqVO extends PageParam { + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "地点ID", example = "14287") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + + @Schema(description = "内容", example = "赵六") + private String name; + + @Schema(description = "检修工单号与主表一致") + private String number; + + @Schema(description = "人数") + private Integer peoples; + + @Schema(description = "预计分钟") + private Integer estimatedMinutes; + + @Schema(description = "实际分钟") + private Integer actualMinutes; + + @Schema(description = "责任人多选") + private String chargePeoples; + + @Schema(description = "完成时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] completionTime; + + @Schema(description = "工程师确认") + private String engineer; + + @Schema(description = "未完成原因") + private String uncompleted; + + @Schema(description = "是否完成0 1", example = "2") + private String status; + + @Schema(description = "维修内容") + private String contents; + + @Schema(description = "主表id") + private String masterId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailRespVO.java new file mode 100644 index 0000000..209be1d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailRespVO.java @@ -0,0 +1,27 @@ +package com.win.module.eam.controller.devicemaintainjob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +@Schema(description = "管理后台 - 保养工单子 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceMaintainJobDetailRespVO extends DeviceMaintainJobDetailBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "8746") + private Long id; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "备件拼接") + private List> items; + + @Schema(description = "检修人名称集合") + private String chargePeoplesName; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailUpdateReqVO.java new file mode 100644 index 0000000..14e6e73 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobDetailUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.eam.controller.devicemaintainjob.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 DeviceMaintainJobDetailUpdateReqVO extends DeviceMaintainJobDetailBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "8746") + @NotNull(message = "id不能为空") + private Long id; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainBaseVO.java new file mode 100644 index 0000000..1a7058e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainBaseVO.java @@ -0,0 +1,93 @@ +package com.win.module.eam.controller.devicemaintainjob.vo; + +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 DeviceMaintainJobMainBaseVO { + private Long id; + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "编号唯一标识不能为空") + private String number; + + @Schema(description = "内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + @NotNull(message = "保养内容不能为空") + private String describes; + + @Schema(description = "保养计划单号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "保养计划单号不能为空") + private String planNumber; + + @Schema(description = "设备/模具编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "设备/模具编号不能为空") + private String deviceNumber; + + @Schema(description = "厂区编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "厂区编号不能为空") + private String factoryAreaNumber; + + @Schema(description = "工单所属周期") + private String executePeriod; + + @Schema(description = "工单所属次数") + private String times; + + @Schema(description = "接单时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime receiveTime; + +// @Schema(description = "指派时间") +// @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) +// private LocalDateTime assignTime; + @Schema(description = "工程师审核意见") + private String approveOpinion; + + @Schema(description = "接单人员") + private Long maintenance; + + @Schema(description = "审核人") + private Long verifyer; + + @Schema(description = "完成时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime completionTime; + + @Schema(description = "验证时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime verifyTime; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + //@NotNull(message = "状态不能为空") + private String status; + + @Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + //@NotNull(message = "类型不能为空") + private String type; + + @Schema(description = "地点ID", example = "26229") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "故障类型") + private String faultType; + + @Schema(description = "用户id") + private String userId; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "并发乐观锁不能为空") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainCreateReqVO.java new file mode 100644 index 0000000..1b8d9b3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.devicemaintainjob.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 保养工单主创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceMaintainJobMainCreateReqVO extends DeviceMaintainJobMainBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainExcelVO.java new file mode 100644 index 0000000..a2d8ecd --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainExcelVO.java @@ -0,0 +1,73 @@ +package com.win.module.eam.controller.devicemaintainjob.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 保养工单主 Excel VO + * + * @author 超级管理员 + */ +@Data +public class DeviceMaintainJobMainExcelVO { + + @ExcelProperty("编号唯一标识") + private String number; + + @ExcelProperty("名称") + private String name; + + @ExcelProperty("保养计划单号") + private String planNumber; + + @ExcelProperty("设备/模具编号") + private String deviceNumber; + + @ExcelProperty("厂区编号") + private String factoryAreaNumber; + + @ExcelProperty("工单所属周期") + private String executePeriod; + + @ExcelProperty("工单所属次数") + private String times; + + @ExcelProperty("工程师id") + private Long engineer; + + @ExcelProperty("接单时间") + private LocalDateTime receiveTime; + + @ExcelProperty("指派时间") + private LocalDateTime assignTime; + + @ExcelProperty("工程师id") + private Long worker; + + @ExcelProperty("完成时间") + private LocalDateTime finishedTime; + + @ExcelProperty("验证时间") + private LocalDateTime verifyTime; + + @ExcelProperty("状态") + private String status; + + @ExcelProperty("类型") + private String type; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainExportReqVO.java new file mode 100644 index 0000000..2db477f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainExportReqVO.java @@ -0,0 +1,39 @@ +package com.win.module.eam.controller.devicemaintainjob.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,参数和 deviceMaintainOrderMainPageReqVO 是一致的") +@Data +public class DeviceMaintainJobMainExportReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "李四") + private String name; + + @Schema(description = "设备/模具编号") + private String deviceNumber; + + @Schema(description = "状态", example = "1") + private String status; + + @Schema(description = "类型", example = "2") + private String type; + + + @Schema(description = "厂区编码", example = "2") + private String factoryAreaNumber; + + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainPageReqVO.java new file mode 100644 index 0000000..7995975 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainPageReqVO.java @@ -0,0 +1,65 @@ +package com.win.module.eam.controller.devicemaintainjob.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 DeviceMaintainJobMainPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "李四") + private String name; + + @Schema(description = "设备/模具编号") + private String deviceNumber; + + + @Schema(description = "保养计划编号") + private String planNumber; + + + @Schema(description = "工单所属周期") + private String executePeriod; + + @Schema(description = "工单所属次数") + private String times; + + @Schema(description = "状态", example = "1") + private String status; + + @Schema(description = "类型", example = "2") + private String type; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "0工单1我的", example = "2") + private String flag; + + @Schema(description = "userId", example = "2") + private String userId; + + @Schema(description = "描述", example = "2") + private String describes; + + @Schema(description = "厂区编码", example = "2") + private String factoryAreaNumber; + + @Schema(description = "班次", example = "2") + private String classType; + + @Schema(description = "0维修人员1工程师", example = "2") + private String standType; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainRespVO.java new file mode 100644 index 0000000..e180fa1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainRespVO.java @@ -0,0 +1,52 @@ +package com.win.module.eam.controller.devicemaintainjob.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 DeviceMaintainJobMainRespVO extends DeviceMaintainJobMainBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "部门名称") + private String deptName; + + @Schema(description = "厂区") + private String factoryAreaName; + + @Schema(description = "工单所属周期") + private String executePeriod; + + @Schema(description = "工单所属次数") + private String times; + + @Schema(description = "类型") + private String typeName; + + @Schema(description = "维修人") + private String maintenanceName; + + @Schema(description = "名称") + private String name; + + @Schema(description = "故障名称", example = "1") + private String faultTypeName; + + @Schema(description = "类型", example = "1") + private String faultType; + + @Schema(description = "状态", example = "1") + private String statusName; + + @Schema(description = "工程师审核意见") + private String verifyContent; + + @Schema(description = "验证人") + private String verifyName; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainUpdateReqVO.java new file mode 100644 index 0000000..9f45012 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobMainUpdateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.devicemaintainjob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Schema(description = "管理后台 - 保养工单主更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceMaintainJobMainUpdateReqVO extends DeviceMaintainJobMainBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobReportReqVo.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobReportReqVo.java new file mode 100644 index 0000000..b3e5cff --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/DeviceMaintainJobReportReqVo.java @@ -0,0 +1,102 @@ +package com.win.module.eam.controller.devicemaintainjob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @ClassName DeviceMaintainJobReportReqVo + * @Description TODO + * @Author longlongxiaogege + * @Date 2024/4/19 08:36 + * @Version 1.0 + */ +@Data +public class DeviceMaintainJobReportReqVo { + /** + * 编号 + */ + @Schema(description = "id") + private String id; + /** + * 序号 + */ + @Schema(description = "序号") + private String rowNum; + /** + * 故障类型 + */ + @Schema(description = "故障类型") + private String label; + /** + * 设备编号 + */ + @Schema(description = "设备编号") + private String deviceNumber; + /** + * 设备名称 + */ + @Schema(description = "设备名称") + private String deviceName; + /** + * 设备部位 + */ + @Schema(description = "设备部位") + private String equipmentParts; + /** + * 保养内容 + */ + @Schema(description = "保养内容") + private String contents; + /** + * 人数 + */ + @Schema(description = "人数") + private String peoples; + /** + * 预计完成时间 + */ + @Schema(description = "预计完成时间") + private String estimatedMinutes; + /** + * 责任人 + */ + @Schema(description = "责任人") + private String chargePeoples; + /** + * 完成状态 + */ + @Schema(description = "完成状态") + private String status; + /** + * 完成时间 + */ + @Schema(description = "完成时间") + private String completionTime; + /** + * 备件名称 + */ + @Schema(description = "备件名称") + private String itemName; + /** + * 备件个数 + */ + @Schema(description = "备件个数") + private String qty; + /** + * 未完成原因 + */ + @Schema(description = "未完成原因") + private String uncompleted; + /** + * 操作人 + */ + @Schema(description = "操作人") + private Long maintenance; + /** + * 工程师确认 + */ + @Schema(description = "工程师确认") + private String engineer; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemBaseVO.java new file mode 100644 index 0000000..bf91e58 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemBaseVO.java @@ -0,0 +1,45 @@ +package com.win.module.eam.controller.devicemaintainjob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.math.BigDecimal; +import javax.validation.constraints.*; + +/** + * 保养工单子表与备件关系 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class MaintainJobDetailItemBaseVO { + /** + * 子项主id + */ + @Schema(description = "检修工单号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "检修工单号不能为空") + private String number; + + @Schema(description = "检修工单子表id", requiredMode = Schema.RequiredMode.REQUIRED, example = "14119") + @NotNull(message = "检修工单子表id不能为空") + private Long masterId; + + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "数量不能为空") + private BigDecimal qty; + + @Schema(description = "故障描述") + private String describes; + + @Schema(description = "地点ID", example = "28297") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + + @Schema(description = "备件号") + private String itemNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemCreateReqVO.java new file mode 100644 index 0000000..d9d0a27 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.devicemaintainjob.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 保养工单子表与备件关系创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MaintainJobDetailItemCreateReqVO extends MaintainJobDetailItemBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemExcelVO.java new file mode 100644 index 0000000..69d3bb8 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemExcelVO.java @@ -0,0 +1,48 @@ +package com.win.module.eam.controller.devicemaintainjob.vo; + +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 保养工单子表与备件关系 Excel VO + * + * @author 超级管理员 + */ +@Data +public class MaintainJobDetailItemExcelVO { + + @ExcelProperty("id") + private Long id; + + @ExcelProperty("检修工单号") + private String maintenanceNumber; + + @ExcelProperty("检修工单子表id") + private Long maintenanceDetailId; + + @ExcelProperty("数量") + private BigDecimal qty; + + @ExcelProperty("故障描述") + private String describes; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + + @ExcelProperty("备件号") + private String itemNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemExportReqVO.java new file mode 100644 index 0000000..8164b59 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemExportReqVO.java @@ -0,0 +1,10 @@ +package com.win.module.eam.controller.devicemaintainjob.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 保养工单子表与备件关系 Excel 导出 Request VO,参数和 MaintainOrderDetailItemPageReqVO 是一致的") +@Data +public class MaintainJobDetailItemExportReqVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemPageReqVO.java new file mode 100644 index 0000000..95109e8 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemPageReqVO.java @@ -0,0 +1,13 @@ +package com.win.module.eam.controller.devicemaintainjob.vo; + +import lombok.*; +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 MaintainJobDetailItemPageReqVO extends PageParam { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemRespVO.java new file mode 100644 index 0000000..261e111 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.eam.controller.devicemaintainjob.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 MaintainJobDetailItemRespVO extends MaintainJobDetailItemBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19140") + private Long id; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemUpdateReqVO.java new file mode 100644 index 0000000..6d2f998 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainjob/vo/MaintainJobDetailItemUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.eam.controller.devicemaintainjob.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 MaintainJobDetailItemUpdateReqVO extends MaintainJobDetailItemBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19140") + @NotNull(message = "id不能为空") + private Long id; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/DeviceMaintainPlanController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/DeviceMaintainPlanController.java new file mode 100644 index 0000000..967b84a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/DeviceMaintainPlanController.java @@ -0,0 +1,144 @@ +package com.win.module.eam.controller.devicemaintainplan; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.devicemaintainplan.vo.*; +import com.win.module.eam.convert.devicemaintainplan.DeviceMaintainPlanConvert; +import com.win.module.eam.dal.dataobject.devicemaintainplan.DeviceMaintainPlanDO; +import com.win.module.eam.service.devicemaintainplan.DeviceMaintainPlanService; +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.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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 保养计划") +@RestController +@RequestMapping("/eam/device-maintain-plan") +@Validated +public class DeviceMaintainPlanController { + + @Resource + private DeviceMaintainPlanService deviceMaintainPlanService; + + @PostMapping("/create") + @Operation(summary = "创建保养计划") +// @PreAuthorize("@ss.hasPermission('eam:device-maintain-plan:create')") + public CommonResult createDeviceMaintainPlan(@Valid @RequestBody DeviceMaintainPlanCreateReqVO createReqVO) { + return success(deviceMaintainPlanService.createDeviceMaintainPlan(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新保养计划") +// @PreAuthorize("@ss.hasPermission('eam:device-maintain-plan:update')") + public CommonResult updateDeviceMaintainPlan(@Valid @RequestBody DeviceMaintainPlanUpdateReqVO updateReqVO) { + int result = deviceMaintainPlanService.updateDeviceMaintainPlan(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除保养计划") + @Parameter(name = "id", description = "编号", required = true) +// @PreAuthorize("@ss.hasPermission('eam:device-maintain-plan:delete')") + public CommonResult deleteDeviceMaintainPlan(@RequestParam("id") Long id) { + int result = deviceMaintainPlanService.deleteDeviceMaintainPlan(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得保养计划") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:device-maintain-plan:query')") + public CommonResult getDeviceMaintainPlan(@RequestParam("id") Long id) { + DeviceMaintainPlanDO deviceMaintainPlan = deviceMaintainPlanService.getDeviceMaintainPlan(id); + return success(DeviceMaintainPlanConvert.INSTANCE.convert(deviceMaintainPlan)); + } + + @GetMapping("/list") + @Operation(summary = "获得保养计划列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:device-maintain-plan:query')") + public CommonResult> getDeviceMaintainPlanList(@RequestParam("ids") Collection ids) { + List list = deviceMaintainPlanService.getDeviceMaintainPlanList(ids); + return success(DeviceMaintainPlanConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得保养计划分页") +// @PreAuthorize("@ss.hasPermission('eam:device-maintain-plan:query')") + public CommonResult> getDeviceMaintainPlanPage(@Valid DeviceMaintainPlanPageReqVO pageVO) { + PageResult pageResult = deviceMaintainPlanService.getDeviceMaintainPlanPage(pageVO); + return success(DeviceMaintainPlanConvert.INSTANCE.convertPage(pageResult)); + } + + @PostMapping("/senior") + @Operation(summary = "获得保养计划分页") +// @PreAuthorize("@ss.hasPermission('eam:device-maintain-plan:query')") + public CommonResult> getDeviceAccountsSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = deviceMaintainPlanService.getDeviceMaintainPlanSenior(conditions); + PageResult result = DeviceMaintainPlanConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出保养计划 Excel") +// @PreAuthorize("@ss.hasPermission('eam:device-maintain-plan:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMaintainPlanExcel(@Valid DeviceMaintainPlanExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deviceMaintainPlanService.getDeviceMaintainPlanList(exportReqVO); + // 导出 Excel + List datas = DeviceMaintainPlanConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "保养计划.xls", "数据", DeviceMaintainPlanExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入保养计划模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "保养计划基本信息导入模板.xls", "保养计划基本信息列表", DeviceMaintainPlanExcelVO.class, list); + } + + @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('eam:device-maintain-plan:import')") + 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 list = ExcelUtils.read(file, DeviceMaintainPlanExcelVO.class); + List errorList = deviceMaintainPlanService.importDeviceMaintainPlanList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanBaseVO.java new file mode 100644 index 0000000..a4be2d7 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanBaseVO.java @@ -0,0 +1,57 @@ +package com.win.module.eam.controller.devicemaintainplan.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 DeviceMaintainPlanBaseVO { + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "编号唯一标识不能为空") + private String number; + + @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "设备模具编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "") + @NotNull(message = "设备模具编号不能为空") + private String deviceNumber; + + @Schema(description = "保养类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "保养类型不能为空") + private String maintenanceType; + + @Schema(description = "设备执行周期、半年、年") + private String cycle; + + @Schema(description = "特殊周期-月") + private String cycleMonth; + + @Schema(description = "特殊周期-周") + private String cycleWeek; + + @Schema(description = "次数") + private Long times; + + @Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "类型不能为空") + private String type; + + @Schema(description = "地点ID", example = "10407") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "并发乐观锁不能为空") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanCreateReqVO.java new file mode 100644 index 0000000..be3b2e3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.devicemaintainplan.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 保养计划创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceMaintainPlanCreateReqVO extends DeviceMaintainPlanBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanExcelVO.java new file mode 100644 index 0000000..1635dc8 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanExcelVO.java @@ -0,0 +1,50 @@ +package com.win.module.eam.controller.devicemaintainplan.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 保养计划 Excel VO + * + * @author 超级管理员 + */ +@Data +public class DeviceMaintainPlanExcelVO { + + @ExcelProperty("编号唯一标识") + private String number; + + @ExcelProperty("名称") + private String name; + + @ExcelProperty("设备模具编号") + private String deviceNumber; + + + @ExcelProperty("保养类型") + private String maintenanceType; + + @ExcelProperty("设备执行周期、半年、年") + private String cycle; + + @ExcelProperty("次数") + private Long times; + + @ExcelProperty("类型") + private String type; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanExportReqVO.java new file mode 100644 index 0000000..7e75241 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanExportReqVO.java @@ -0,0 +1,27 @@ +package com.win.module.eam.controller.devicemaintainplan.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 保养计划 Excel 导出 Request VO,参数和 DeviceMaintainPlanPageReqVO 是一致的") +@Data +public class DeviceMaintainPlanExportReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "李四") + private String name; + + @Schema(description = "设备模具编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "") + private String deviceNumber; + + @Schema(description = "类型", example = "2") + private String type; + + @Schema(description = "保养类型", example = "CYCLE") + private String maintenanceType; + + @Schema(description = "保养周期", example = "MONTH") + private String cycle; +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanPageReqVO.java new file mode 100644 index 0000000..2e509b4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanPageReqVO.java @@ -0,0 +1,39 @@ +package com.win.module.eam.controller.devicemaintainplan.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; + +@Schema(description = "管理后台 - 保养计划分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceMaintainPlanPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "李四") + private String name; + + @Schema(description = "设备模具编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "") + private String deviceNumber; + + @Schema(description = "类型", example = "2") + private String type; + + @Schema(description = "保养类型", example = "CYCLE") + private String maintenanceType; + + @Schema(description = "保养周期", example = "MONTH") + private String cycle; + + @Schema(description = "保养次数", example = "1000") + private Long times; + + @Schema(description = "是否删除", example = "1") + private String deleted; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanRespVO.java new file mode 100644 index 0000000..801ba4c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.eam.controller.devicemaintainplan.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 DeviceMaintainPlanRespVO extends DeviceMaintainPlanBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanUpdateReqVO.java new file mode 100644 index 0000000..097f98c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintainplan/vo/DeviceMaintainPlanUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.devicemaintainplan.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 保养计划更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceMaintainPlanUpdateReqVO extends DeviceMaintainPlanBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/DeviceMaintenanceJobDetailController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/DeviceMaintenanceJobDetailController.java new file mode 100644 index 0000000..093d299 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/DeviceMaintenanceJobDetailController.java @@ -0,0 +1,154 @@ +package com.win.module.eam.controller.devicemaintenancejob; + +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.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobDetailConvert; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailDO; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailItemMapper; +import com.win.module.eam.service.devicemaintenancejob.DeviceMaintenanceJobDetailService; +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.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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 维修工单子") +@RestController +@RequestMapping("/eam/device-maintenance-job-detail") +@Validated +public class DeviceMaintenanceJobDetailController { + + @Resource + private DeviceMaintenanceJobDetailService deviceMaintenanceJobDetailService; + + @Resource + private DeviceMaintenanceJobDetailItemMapper deviceMaintenanceJobDetailItemMapper; + + @PostMapping("/create") + @Operation(summary = "创建维修工单子") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:create')") + public CommonResult createDeviceMaintenanceDetail(@Valid @RequestBody DeviceMaintenanceJobDetailCreateReqVO createReqVO) { + return success(deviceMaintenanceJobDetailService.createDeviceMaintenanceDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新维修工单子") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:update')") + public CommonResult updateDeviceMaintenanceDetail(@Valid @RequestBody DeviceMaintenanceJobDetailUpdateReqVO updateReqVO) { + int result = deviceMaintenanceJobDetailService.updateDeviceMaintenanceDetail(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除维修工单子项以及备件关系表") + @Parameter(name = "id", description = "编号", required = true) +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:delete')") + public CommonResult deleteDeviceMaintenanceDetail(@RequestParam("id") Long id) { + int result = deviceMaintenanceJobDetailService.deleteDeviceMaintenanceDetail(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得维修工单子") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:query')") + public CommonResult getDeviceMaintenanceDetail(@RequestParam("id") Long id) { + DeviceMaintenanceJobDetailDO deviceMaintenanceDetail = deviceMaintenanceJobDetailService.getDeviceMaintenanceDetail(id); + return success(DeviceMaintenanceJobDetailConvert.INSTANCE.convert(deviceMaintenanceDetail)); + } + + @GetMapping("/list") + @Operation(summary = "获得维修工单子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:query')") + public CommonResult> getDeviceMaintenanceDetailList(@RequestParam("ids") Collection ids) { + List list = deviceMaintenanceJobDetailService.getDeviceMaintenanceDetailList(ids); + return success(DeviceMaintenanceJobDetailConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "PC端获得维修工单子分页") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:query')") + public CommonResult> getDeviceMaintenanceDetailPage(@Valid DeviceMaintenanceJobDetailPageReqVO pageVO) { + PageResult pageResult = deviceMaintenanceJobDetailService.getDeviceMaintenanceDetailPage(pageVO); + return success(DeviceMaintenanceJobDetailConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出维修工单子 Excel") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMaintenanceDetailExcel(@Valid DeviceMaintenanceJobDetailExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deviceMaintenanceJobDetailService.getDeviceMaintenanceDetailList(exportReqVO); + // 导出 Excel + List datas = DeviceMaintenanceJobDetailConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "维修工单子.xls", "数据", DeviceMaintenanceJobDetailExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入维修工单子模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "维修工单子基本信息导入模板.xls", "维修工单子基本信息列表", DeviceMaintenanceJobDetailExcelVO.class, list); + } + + @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('eam:device-maintenance-job-detail:import')") + 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 list = ExcelUtils.read(file, DeviceMaintenanceJobDetailExcelVO.class); + List errorList = deviceMaintenanceJobDetailService.importDeviceMaintenanceDetailList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + /** + * APP根据维修工单号查询工单子项信息列表 + * @param + * @return + */ + @GetMapping("/selectListByNumber") + @Operation(summary = "APP获得维修工单子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:query')") + public CommonResult> selectListByNumber(@RequestParam("number") String number) { + List list = deviceMaintenanceJobDetailService.selectListByNumber(number); + return success(DeviceMaintenanceJobDetailConvert.INSTANCE.convertList(list)); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/DeviceMaintenanceJobDetailItemController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/DeviceMaintenanceJobDetailItemController.java new file mode 100644 index 0000000..ca91f33 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/DeviceMaintenanceJobDetailItemController.java @@ -0,0 +1,148 @@ +package com.win.module.eam.controller.devicemaintenancejob; + +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.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobDetailItemConvert; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailItemDO; +import com.win.module.eam.service.devicemaintenancejob.DeviceMaintenanceJobDetailItemService; +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.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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 维修工单子表与备件关系") +@RestController +@RequestMapping("/eam/device-maintenance-job-detail-item") +@Validated +public class DeviceMaintenanceJobDetailItemController { + + @Resource + private DeviceMaintenanceJobDetailItemService deviceMaintenanceJobDetailItemService; + + @PostMapping("/create") + @Operation(summary = "创建维修工单子表与备件关系") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:create')") + public CommonResult createDeviceMaintenanceDetailItem(@Valid @RequestBody DeviceMaintenanceJobDetailItemCreateReqVO createReqVO) { + return success(deviceMaintenanceJobDetailItemService.createDeviceMaintenanceDetailItem(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新维修工单子表与备件关系") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:update')") + public CommonResult updateDeviceMaintenanceDetailItem(@Valid @RequestBody DeviceMaintenanceJobDetailItemUpdateReqVO updateReqVO) { + int result = deviceMaintenanceJobDetailItemService.updateDeviceMaintenanceDetailItem(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除维修工单子表与备件关系") + @Parameter(name = "id", description = "编号", required = true) + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:delete')") + public CommonResult deleteDeviceMaintenanceDetailItem(@RequestParam("id") Long id) { + int result = deviceMaintenanceJobDetailItemService.deleteDeviceMaintenanceDetailItem(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得维修工单子表与备件关系") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:query')") + public CommonResult getDeviceMaintenanceDetailItem(@RequestParam("id") Long id) { + DeviceMaintenanceJobDetailItemDO deviceMaintenanceDetailItem = deviceMaintenanceJobDetailItemService.getDeviceMaintenanceDetailItem(id); + return success(DeviceMaintenanceJobDetailItemConvert.INSTANCE.convert(deviceMaintenanceDetailItem)); + } + + @GetMapping("/list") + @Operation(summary = "获得维修工单子表与备件关系列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:query')") + public CommonResult> getDeviceMaintenanceDetailItemList(@RequestParam("ids") Collection ids) { + List list = deviceMaintenanceJobDetailItemService.getDeviceMaintenanceDetailItemList(ids); + return success(DeviceMaintenanceJobDetailItemConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得维修工单子表与备件关系分页") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:query')") + public CommonResult> getDeviceMaintenanceDetailItemPage(@Valid DeviceMaintenanceJobDetailItemPageReqVO pageVO) { + PageResult pageResult = deviceMaintenanceJobDetailItemService.getDeviceMaintenanceDetailItemPage(pageVO); + return success(DeviceMaintenanceJobDetailItemConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出维修工单子表与备件关系 Excel") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMaintenanceDetailItemExcel(@Valid DeviceMaintenanceJobDetailItemExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deviceMaintenanceJobDetailItemService.getDeviceMaintenanceDetailItemList(exportReqVO); + // 导出 Excel + List datas = DeviceMaintenanceJobDetailItemConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "维修工单子表与备件关系.xls", "数据", DeviceMaintenanceJobDetailItemExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入维修工单子表与备件关系模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "维修工单子表与备件关系基本信息导入模板.xls", "维修工单子表与备件关系基本信息列表", DeviceMaintenanceJobDetailItemExcelVO.class, list); + } + + @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('eam:device-maintenance-job-detail-item:import')") + 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 list = ExcelUtils.read(file, DeviceMaintenanceJobDetailItemExcelVO.class); + List errorList = deviceMaintenanceJobDetailItemService.importDeviceMaintenanceDetailItemList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + /** + * 根据维修子项id获取备件列表 + * @param + * @return + */ + @GetMapping("/selectListById") + @Operation(summary = "根据维修子项id获取备件列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-detail:query')") + public CommonResult>> selectListByNumber(@RequestParam("maintenanceDetailId") Long maintenanceDetailId) { + List> list = deviceMaintenanceJobDetailItemService.selectListById(maintenanceDetailId); + return success(list); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/DeviceMaintenanceJobMainController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/DeviceMaintenanceJobMainController.java new file mode 100644 index 0000000..b0dd6fe --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/DeviceMaintenanceJobMainController.java @@ -0,0 +1,297 @@ +package com.win.module.eam.controller.devicemaintenancejob; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.win.framework.datapermission.core.rule.dept.DeptDataPermissionRule; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobMainConvert; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.eam.service.devicemaintenancejob.DeviceMaintenanceJobMainService; +import com.win.module.eam.util.SoapUtil; +import com.win.module.system.api.user.AdminUserApi; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + + +@Tag(name = "管理后台 - 维修工单主") +@RestController +@RequestMapping("/eam/device-maintenance-job-main") +@Validated +public class DeviceMaintenanceJobMainController { + + @Resource + private DeviceMaintenanceJobMainService deviceMaintenanceJobMainService; + + @Resource + private AdminUserApi userApi; + + @Resource + private DeptDataPermissionRule deptDataPermissionRule; + + @PostMapping("/create") + @Operation(summary = "APP创建维修工单主") + @PreAuthorize("@ss.hasPermission('eam:eam:device-maintenance-job-main:create') or @ss.hasPermission('eam:device-maintenance-job-main:createAPP')") + public CommonResult createDeviceMaintenanceMain(@Valid @RequestBody DeviceMaintenanceJobMainCreateReqVO createReqVO) { + createReqVO.setMaintenance(getLoginUserId()); + createReqVO.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + return success(deviceMaintenanceJobMainService.createDeviceMaintenanceMain(createReqVO)); + } + + @PostMapping("/createPC") + @Operation(summary = "PC创建维修工单主") + @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-main:create')") + public CommonResult createDeviceMaintenanceMainPC(@Valid @RequestBody DeviceMaintenanceJobMainCreateReqVO createReqVO) { + //不走申请直接创建工单更改当前人为接单人 状态为接单状态 + createReqVO.setMaintenance(getLoginUserId()); + createReqVO.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + return success(deviceMaintenanceJobMainService.createDeviceMaintenanceMainPC(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新维修工单主") + @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-main:update') or @ss.hasPermission('eam:device-maintenance-job-main:updateAPP')") + public CommonResult updateDeviceMaintenanceMain(@Valid @RequestBody DeviceMaintenanceJobMainUpdateReqVO updateReqVO) { + int result = deviceMaintenanceJobMainService.updateDeviceMaintenanceMain(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除维修工单主") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-main:delete') or @ss.hasPermission('eam:device-maintenance-job-main:deleteAPP')") + public CommonResult deleteDeviceMaintenanceMain(@RequestParam("id") Long id) { + int result = deviceMaintenanceJobMainService.deleteDeviceMaintenanceMain(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得维修工单主") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-main:query')") + public CommonResult getDeviceMaintenanceMain(@RequestParam("id") Long id) { + DeviceMaintenanceJobMainDO deviceMaintenanceMain = deviceMaintenanceJobMainService.getDeviceMaintenanceMain(id); + return success(DeviceMaintenanceJobMainConvert.INSTANCE.convert(deviceMaintenanceMain)); + } + + @GetMapping("/list") + @Operation(summary = "获得维修工单主列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-main:query')") + public CommonResult> getDeviceMaintenanceMainList(@RequestParam("ids") Collection ids) { + List list = deviceMaintenanceJobMainService.getDeviceMaintenanceMainList(ids); + return success(DeviceMaintenanceJobMainConvert.INSTANCE.convertList(list)); + } + @GetMapping("/page") + @Operation(summary = "获得维修工单主分页") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-main:query')") + public CommonResult> getDeviceMaintenanceMainPage(@Valid DeviceMaintenanceJobMainPageReqVO pageVO) { + PageResult pageResult = deviceMaintenanceJobMainService.getDeviceMaintenanceMainPage(pageVO); + return success(DeviceMaintenanceJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + @PostMapping("/senior") + @Operation(summary = "获得维修工单主分页") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-main:query')") + public CommonResult> getDeviceMaintenanceMainSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = deviceMaintenanceJobMainService.getDeviceMaintenanceMainSenior(conditions); + PageResult result = DeviceMaintenanceJobMainConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出维修工单主 Excel") + @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-main:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMaintenanceMainExcel(@Valid DeviceMaintenanceJobMainExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deviceMaintenanceJobMainService.getDeviceMaintenanceMainList(exportReqVO); + // 导出 Excel + List datas = DeviceMaintenanceJobMainConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "维修工单主.xls", "数据", DeviceMaintenanceJobMainExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入维修工单主模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "维修工单主基本信息导入模板.xls", "维修工单主基本信息列表", DeviceMaintenanceJobMainExcelVO.class, list); + } + + @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('eam:device-maintenance-job-main:import')") + 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 list = ExcelUtils.read(file, DeviceMaintenanceJobMainExcelVO.class); + List errorList = deviceMaintenanceJobMainService.importDeviceMaintenanceMainList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + return success(returnMap); + } + @GetMapping("/getAppPage") + @Operation(summary = "获得APP维修工单分页") + public CommonResult> getAppPage(@Valid DeviceMaintenanceJobMainPageReqVO pageVO) { + PageResult pageResult = deviceMaintenanceJobMainService.getAppPage(pageVO); + return success(DeviceMaintenanceJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/getAppByNumber") + @Operation(summary = "获得APP维修工单详情根据number") + public CommonResult getAppByNumber(@RequestParam("number") String number) { + DeviceMaintenanceJobMainDO en = deviceMaintenanceJobMainService.getAppByNumber(number); + return success(DeviceMaintenanceJobMainConvert.INSTANCE.convert(en)); + } + + @GetMapping("/turnTo") + @Operation(summary = "APP维修工单转办") + @Parameters({ + @Parameter(name = "deviceNumber", description = "转办设备或模具编码", required = true), + @Parameter(name = "id", description = "id", required = true), + @Parameter(name = "receiverType", description = "转办后类型", required = true), + @Parameter(name = "receiverUserId", description = "接收人id暂无用", required = false), + @Parameter(name = "status", description = "1人员转办0或者不填是设备转办", required = true), + }) + @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-main:turnTo') or @ss.hasPermission('eam:device-maintenance-job-main:turnToAPP')") + public CommonResult turnTo(@RequestParam("deviceNumber") String deviceNumber,@RequestParam("id") Long id,@RequestParam("receiverType") String receiverType, Long receiverUserId,String status) { + return success(deviceMaintenanceJobMainService.turnTo(deviceNumber,id,receiverType,receiverUserId,status)); + } + + @GetMapping("/orderClick") + @Operation(summary = "APP维修工单接单") + @Parameters({ + @Parameter(name = "number", description = "工单编号", required = true), + @Parameter(name = "status", description = "列表状态", required = true), + @Parameter(name = "id", description = "主键id", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = false) + }) + @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-main:orderClick') or @ss.hasPermission('eam:device-maintenance-job-main:orderClickAPP')") + public CommonResult orderClick(@RequestParam("id") Long id) { + return success(deviceMaintenanceJobMainService.orderClick(id)); + } + + @GetMapping("/orderClickFinish") + @Operation(summary = "APP维修工单点击完成") + @Parameters({ + @Parameter(name = "number", description = "工单编号", required = true), + @Parameter(name = "status", description = "列表状态", required = true), + @Parameter(name = "id", description = "主键id", required = true), + @Parameter(name = "result", description = "点击完成带着COMPLETED", required = true), + @Parameter(name = "result", description = "申请带着申请人驳回 申请人通过", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = false) + }) + @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-main:orderClickFinish') or @ss.hasPermission('eam:device-maintenance-job-main:orderClickFinishAPP')") + public CommonResult orderClickFinish(@RequestParam("id") Long id,String result) { + return success(deviceMaintenanceJobMainService.orderClickFinish(id,result)); + } + + + @GetMapping("/orderClickConfirm") + @Operation(summary = "APP维修工单申请人确认") + @Parameters({ + @Parameter(name = "number", description = "工单编号", required = true), + @Parameter(name = "status", description = "列表状态", required = true), + @Parameter(name = "id", description = "主键id", required = true), + @Parameter(name = "result", description = "点击完成带着COMPLETED", required = true), + @Parameter(name = "result", description = "申请带着申请人驳回 申请人通过", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = false) + }) + @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-main:orderClickConfirm') or @ss.hasPermission('eam:device-maintenance-job-main:orderClickConfirmAPP')") + public CommonResult orderClickConfirm(@RequestParam("id") Long id,String result,String content) { + return success(deviceMaintenanceJobMainService.orderClickConfirm(id,result,content)); + } + + @GetMapping("/orderClickVerify") + @Operation(summary = "APP维修工单验证") + @Parameters({ + @Parameter(name = "number", description = "工单编号", required = true), + @Parameter(name = "status", description = "列表状态", required = true), + @Parameter(name = "id", description = "主键id", required = true), + @Parameter(name = "result", description = "点击完成带着COMPLETED", required = true), + @Parameter(name = "result", description = "申请带着申请人驳回 申请人通过", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = false) + }) + @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-main:orderClickVerify') or @ss.hasPermission('eam:device-maintenance-job-main:orderClickVerifyAPP')") + public CommonResult orderClickVerify(String status,@RequestParam("id") Long id,String content) { + return success(deviceMaintenanceJobMainService.orderClickVerify(id,status,content)); + } + + @GetMapping("/getDictList") + @Operation(summary = "APP获取字典") + @Parameters({ + @Parameter(name = "number", description = "设备或模具编码", required = true), + @Parameter(name = "type", description = "DEVICE设备 MOLD模具", required = true), + @Parameter(name = "id", description = "主键id", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = true) + }) + public CommonResult>> getDictList(@RequestParam("type") String type) { + return success(deviceMaintenanceJobMainService.getDictList(type)); + } + + @GetMapping("/getList") + @Operation(summary = "APP获取采取临时措施的维修工单") + @Parameter(name = "type", description = "DEVICE MOLD", required = true) + public CommonResult>> getList(@RequestParam("type") String type) { + return success(deviceMaintenanceJobMainService.getList(type)); + } + + @PostMapping("/TestSend") + @Operation(summary = "消息推送测试") + @Parameter(name = "type", description = "DEVICE MOLD", required = true) + public CommonResult>> send(@RequestBody Map map) { + SoapUtil soapUtil = new SoapUtil(); + String title = map.get("title").toString(); + String content = map.get("content").toString(); + String type = map.get("type").toString(); + String status = map.get("status").toString(); + String number = map.get("number").toString(); + String cid = map.get("cid").toString(); + Map map1 = new HashMap<>(); + map1.put("type",type); + map1.put("status",status); + map1.put("number",number); + map1.put("cid",cid); + //soapUtil.uniappSend(List.of(cid),title,content,map1); + return success(null); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailBaseVO.java new file mode 100644 index 0000000..038b8de --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailBaseVO.java @@ -0,0 +1,58 @@ +package com.win.module.eam.controller.devicemaintenancejob.vo; + +import com.baomidou.mybatisplus.annotation.Version; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 维修工单子 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class DeviceMaintenanceJobDetailBaseVO { + + @Schema(description = "id", example = "赵六") + private Long id; + + @Schema(description = "名称", example = "赵六") + private String name; + + @Schema(description = "维修工单号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "维修工单号不能为空") + private String number; + + @Schema(description = "故障描述") + @NotNull(message = "故障描述不能为空") + private String describes; + + @Schema(description = "故障真因") + @NotNull(message = "故障真因不能为空") + private String describes1; + + @Schema(description = "解决措施") + @NotNull(message = "解决措施不能为空") + private String workOut; + + @Schema(description = "维修人员字符串多个") + private String maintenances; + + @Schema(description = "地点ID", example = "15439") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "并发乐观锁不能为空") + @Version + private Integer concurrencyStamp; + + @Schema(description = "备件编码") + private String itemNumber; + + @Schema(description = "数量") + private BigDecimal qty; +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailCreateReqVO.java new file mode 100644 index 0000000..137d033 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailCreateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.eam.controller.devicemaintenancejob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.List; +import java.util.Map; + +@Schema(description = "管理后台 - 维修工单子创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceMaintenanceJobDetailCreateReqVO extends DeviceMaintenanceJobDetailBaseVO { + private List> itemNumbers; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailExcelVO.java new file mode 100644 index 0000000..70b6952 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailExcelVO.java @@ -0,0 +1,46 @@ +package com.win.module.eam.controller.devicemaintenancejob.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 维修工单子 Excel VO + * + * @author 超级管理员 + */ +@Data +public class DeviceMaintenanceJobDetailExcelVO { + + @ExcelProperty("名称") + private String name; + + @ExcelProperty("维修工单号") + private String number; + + @ExcelProperty("故障描述") + private String describes; + + @ExcelProperty("故障真因") + private String describes1; + + @ExcelProperty("解决措施") + private String workOut; + + @ExcelProperty("维修人员字符串多个") + private String maintenances; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailExportReqVO.java new file mode 100644 index 0000000..bd4132e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailExportReqVO.java @@ -0,0 +1,28 @@ +package com.win.module.eam.controller.devicemaintenancejob.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +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,参数和 DeviceMaintenanceDetailPageReqVO 是一致的") +@Data +public class DeviceMaintenanceJobDetailExportReqVO { + + @Schema(description = "维修工单号") + private String maintenanceNumber; + + @Schema(description = "故障描述") + private String describes; + + @Schema(description = "故障真因") + private String describes1; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemBaseVO.java new file mode 100644 index 0000000..c903652 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemBaseVO.java @@ -0,0 +1,45 @@ +package com.win.module.eam.controller.devicemaintenancejob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.math.BigDecimal; +import javax.validation.constraints.*; + +/** + * 维修工单子表与备件关系 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class DeviceMaintenanceJobDetailItemBaseVO { + + @Schema(description = "维修工单号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "维修工单号不能为空") + private String maintenanceNumber; + + @Schema(description = "维修工单子表id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1818") + @NotNull(message = "维修工单子表id不能为空") + private Long maintenanceDetailId; + + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "数量不能为空") + private BigDecimal qty; + + @Schema(description = "故障描述") + private String describes; + + @Schema(description = "地点ID", example = "6721") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "并发乐观锁不能为空") + private Integer concurrencyStamp; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "并发乐观锁不能为空") + private Integer itemNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemCreateReqVO.java new file mode 100644 index 0000000..98b7451 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.devicemaintenancejob.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 维修工单子表与备件关系创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceMaintenanceJobDetailItemCreateReqVO extends DeviceMaintenanceJobDetailItemBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemExcelVO.java new file mode 100644 index 0000000..7c6b612 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemExcelVO.java @@ -0,0 +1,42 @@ +package com.win.module.eam.controller.devicemaintenancejob.vo; + +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 维修工单子表与备件关系 Excel VO + * + * @author 超级管理员 + */ +@Data +public class DeviceMaintenanceJobDetailItemExcelVO { + + @ExcelProperty("维修工单号") + private String maintenanceNumber; + + @ExcelProperty("维修工单子表id") + private Long maintenanceDetailId; + + @ExcelProperty("数量") + private BigDecimal qty; + + @ExcelProperty("故障描述") + private String describes; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemExportReqVO.java new file mode 100644 index 0000000..ca508c2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemExportReqVO.java @@ -0,0 +1,10 @@ +package com.win.module.eam.controller.devicemaintenancejob.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 维修工单子表与备件关系 Excel 导出 Request VO,参数和 DeviceMaintenanceDetailItemPageReqVO 是一致的") +@Data +public class DeviceMaintenanceJobDetailItemExportReqVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemPageReqVO.java new file mode 100644 index 0000000..b74a8df --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemPageReqVO.java @@ -0,0 +1,13 @@ +package com.win.module.eam.controller.devicemaintenancejob.vo; + +import lombok.*; +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 DeviceMaintenanceJobDetailItemPageReqVO extends PageParam { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemRespVO.java new file mode 100644 index 0000000..fe542f8 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.eam.controller.devicemaintenancejob.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 DeviceMaintenanceJobDetailItemRespVO extends DeviceMaintenanceJobDetailItemBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemUpdateReqVO.java new file mode 100644 index 0000000..23a4421 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailItemUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.eam.controller.devicemaintenancejob.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 DeviceMaintenanceJobDetailItemUpdateReqVO extends DeviceMaintenanceJobDetailItemBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "29280") + @NotNull(message = "id不能为空") + private Long id; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailPageReqVO.java new file mode 100644 index 0000000..025a1c0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailPageReqVO.java @@ -0,0 +1,36 @@ +package com.win.module.eam.controller.devicemaintenancejob.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 DeviceMaintenanceJobDetailPageReqVO extends PageParam { + + @Schema(description = "维修工单号") + private String number; + + @Schema(description = "主表id") + private String masterId; + + @Schema(description = "故障描述") + private String describes; + + @Schema(description = "故障真因") + private String describes1; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailRespVO.java new file mode 100644 index 0000000..fb1a465 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailRespVO.java @@ -0,0 +1,28 @@ +package com.win.module.eam.controller.devicemaintenancejob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +@Schema(description = "管理后台 - 维修工单子 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceMaintenanceJobDetailRespVO extends DeviceMaintenanceJobDetailBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "备件拼接") + private List> items; + + @Schema(description = "备件拼接") + private List> itemNumbers; + + @Schema(description = "维修人名字集合") + private String maintenancesName; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailUpdateReqVO.java new file mode 100644 index 0000000..9ed7d32 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobDetailUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.devicemaintenancejob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; + +@Schema(description = "管理后台 - 维修工单子更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceMaintenanceJobDetailUpdateReqVO extends DeviceMaintenanceJobDetailBaseVO { + private List> itemNumbers; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainBaseVO.java new file mode 100644 index 0000000..0b33f74 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainBaseVO.java @@ -0,0 +1,112 @@ +package com.win.module.eam.controller.devicemaintenancejob.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; + +/** + * 维修工单主 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class DeviceMaintenanceJobMainBaseVO { + @Schema(description = "id") + //@NotNull(message = "id") + private Long id; + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "编号唯一标识不能为空") + private String number; + + @Schema(description = "报修工单申请号", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "报修工单申请号不能为空") + private String requestNumber; + + @Schema(description = "描述") + //@NotNull(message = "描述不能为空") + private String describes; + + @Schema(description = "设备模具编号", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "设备模具编号不能为空") + private String deviceNumber; + + @Schema(description = "厂区编号", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "厂区编号不能为空") + private String factoryAreaNumber; + + @Schema(description = "维修人", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "维修人不能为空") + private Long maintenance; + + @Schema(description = "报修人联系电话") + private String maintenancePhone; + + @Schema(description = "申请人", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "维修人不能为空") + private Long applyer; + + @Schema(description = "申请确认内容") + private String applyContent; + + @Schema(description = "验证内容") + private String verifyContent; + + @Schema(description = "申请人确认时间", requiredMode = Schema.RequiredMode.REQUIRED) + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime applyTime; + + @Schema(description = "完成情况", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + //@NotNull(message = "状态不能为空") + private String status; + + @Schema(description = "工单状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + //@NotNull(message = "状态不能为空") + private String result; + + @Schema(description = "类型设备", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + //@NotNull(message = "类型设备不能为空") + private String type; + + @Schema(description = "地点ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "17996") + //@NotNull(message = "地点ID不能为空") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "故障类型枚举EM、CM、 PM") + private String faultType; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + // @NotNull(message = "并发乐观锁不能为空") + private Integer concurrencyStamp; + + @Schema(description = "班次", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "班次") + private Long classes; + + @Schema(description = "接单时间", requiredMode = Schema.RequiredMode.REQUIRED) + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime receivingTime; + + @Schema(description = "完成时间", requiredMode = Schema.RequiredMode.REQUIRED) + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime completionTime; + + @Schema(description = "验证时间", requiredMode = Schema.RequiredMode.REQUIRED) + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime verifyTime; + + @Schema(description = "验证人", requiredMode = Schema.RequiredMode.REQUIRED) + private Long verifyer; + + @Schema(description = "工单创建人", requiredMode = Schema.RequiredMode.REQUIRED) + private String creator; + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainCreateReqVO.java new file mode 100644 index 0000000..8b1c6d6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.devicemaintenancejob.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 维修工单主创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceMaintenanceJobMainCreateReqVO extends DeviceMaintenanceJobMainBaseVO { + private List subList; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainExcelVO.java new file mode 100644 index 0000000..57e1414 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainExcelVO.java @@ -0,0 +1,60 @@ +package com.win.module.eam.controller.devicemaintenancejob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 维修工单主 Excel VO + * + * @author 超级管理员 + */ +@Data +public class DeviceMaintenanceJobMainExcelVO { + + @ExcelProperty("编号唯一标识") + private String number; + + @ExcelProperty("报修工单申请号") + private String requestNumber; + + @ExcelProperty("描述") + private String describe; + + @ExcelProperty("设备模具编号") + private String deviceNumber; + + @ExcelProperty("厂区编号") + private String factoryAreaNumber; + + @ExcelProperty("维修人") + private Long maintenance; + + @ExcelProperty("申请人") + private Long applyer; + + @ExcelProperty("报修人联系电话") + private String maintenancePhone; + + @ExcelProperty("状态") + private String status; + + @ExcelProperty("类型设备") + private String type; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainExportReqVO.java new file mode 100644 index 0000000..f7f5388 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainExportReqVO.java @@ -0,0 +1,43 @@ +package com.win.module.eam.controller.devicemaintenancejob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 维修工单主 Excel 导出 Request VO,参数和 DeviceMaintenanceMainPageReqVO 是一致的") +@Data +public class DeviceMaintenanceJobMainExportReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "状态", example = "2") + private String status; + + @Schema(description = "类型设备", example = "2") + private String type; + + @Schema(description = "设备模具编号", example = "2") + private String deviceNumber; + + + @Schema(description = "厂区编码", example = "1") + private String factoryAreaNumber; + + @Schema(description = "班次") + private Long classes; + + @Schema(description = "故障类型", example = "1") + private String faultType; + + + @Schema(description = "维修人") + private Long maintenance; + + @Schema(description = "报修人") + private Long declarer; + + @Schema(description = "验证人") + private Long verifyer; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainPageReqVO.java new file mode 100644 index 0000000..552464a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainPageReqVO.java @@ -0,0 +1,70 @@ +package com.win.module.eam.controller.devicemaintenancejob.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; + +@Schema(description = "管理后台 - 维修工单主分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceMaintenanceJobMainPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "设备模具编码") + private String deviceNumber; + + @Schema(description = "报修工单申请号") + private String requestNumber; + + @Schema(description = "状态", example = "2") + private String status; + + @Schema(description = "类型设备", example = "2") + private String type; + + @Schema(description = "0工单1我的", example = "2") + private String flag; + + @Schema(description = "我的用户", example = "2") + private String userId; + + @Schema(description = "描述", example = "1") + private String describes; + + @Schema(description = "名称", example = "1") + private String name; + + @Schema(description = "故障名称", example = "1") + private String faultTypeName; + + @Schema(description = "厂区编码", example = "1") + private String factoryAreaNumber; + + @Schema(description = "身份0维修工1工程师", example = "1") + private String standType; + + @Schema(description = "班组", example = "1") + private String classType; + + @Schema(description = "班次") + private Long classes; + + @Schema(description = "故障类型", example = "1") + private String faultType; + + + @Schema(description = "维修人") + private Long maintenance; + + @Schema(description = "报修人") + private Long declarer; + + @Schema(description = "验证人") + private Long verifyer; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainRespVO.java new file mode 100644 index 0000000..cd0cd2f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainRespVO.java @@ -0,0 +1,59 @@ +package com.win.module.eam.controller.devicemaintenancejob.vo; + +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 DeviceMaintenanceJobMainRespVO extends DeviceMaintenanceJobMainBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "部门名称") + private String deptName; + @Schema(description = "厂区") + private String factoryAreaName; + + @Schema(description = "类型") + private String typeName; + + @Schema(description = "维修人") + private String maintenanceName; + + @Schema(description = "名称") + private String name; + + @Schema(description = "故障名称", example = "1") + private String faultTypeName; + + @Schema(description = "类型", example = "1") + private String faultType; + + @Schema(description = "班次", example = "1") + private String classesName; + + @Schema(description = "图片路径") + private List filePathList; + + @Schema(description = "维修人姓名") + private String applyName; + + @Schema(description = "验证人姓名") + private String verifyName; + + @Schema(description = "报修人") + private Long declarer; + + @Schema(description = "是否有子单内容") + private boolean hasDetails; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainUpdateReqVO.java new file mode 100644 index 0000000..d509722 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemaintenancejob/vo/DeviceMaintenanceJobMainUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.devicemaintenancejob.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Schema(description = "管理后台 - 维修工单主更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceMaintenanceJobMainUpdateReqVO extends DeviceMaintenanceJobMainBaseVO { +// @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) +// //@NotNull(message = "编号唯一标识不能为空") +// private Long id; +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/DeviceMoldItemsController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/DeviceMoldItemsController.java new file mode 100644 index 0000000..f5a0c64 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/DeviceMoldItemsController.java @@ -0,0 +1,190 @@ +package com.win.module.eam.controller.devicemolditems; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +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.eam.controller.devicemolditems.vo.*; +import com.win.module.eam.convert.devicemolditems.DeviceMoldItemsConvert; +import com.win.module.eam.dal.dataobject.devicemolditems.DeviceMoldItemsDO; +import com.win.module.eam.enums.DictTypeConstants; +import com.win.module.eam.service.devicemolditems.DeviceMoldItemsService; +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.*; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 项记录表(设备 模具 保养 维修 巡检点检)") +@RestController +@RequestMapping("/eam/device-mold-items") +@Validated +public class DeviceMoldItemsController { + + @Resource + private DeviceMoldItemsService deviceMoldItemsService; + + @PostMapping("/create") + @Operation(summary = "创建项记录表(设备 模具 保养 维修 巡检点检)") + @PreAuthorize("@ss.hasPermission('basic:deviceMaintenance:create')") + public CommonResult createDeviceMoldItems(@Valid @RequestBody DeviceMoldItemsCreateReqVO createReqVO) { + return success(deviceMoldItemsService.createDeviceMoldItems(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新项记录表(设备 模具 保养 维修 巡检点检)") + @PreAuthorize("@ss.hasPermission('basic:deviceMaintenance:update')") + public CommonResult updateDeviceMoldItems(@Valid @RequestBody DeviceMoldItemsUpdateReqVO updateReqVO) { + int result = deviceMoldItemsService.updateDeviceMoldItems(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除项记录表(设备 模具 保养 维修 巡检点检)") + @Parameter(name = "id", description = "编号", required = true) + @Parameter(name = "remark", description = "备注", required = false) // 添加remark的描述 +// 如果使用Spring Security的权限注解,保持不变 +@PreAuthorize("@ss.hasPermission('basic:deviceMaintenance:delete')") + public CommonResult deleteDeviceMoldItems(@RequestParam("id") Long id, @RequestParam(value = "remark", required = false) String remark) { + int result = deviceMoldItemsService.deleteDeviceMoldItems(id, remark); // 确保Service层方法也接受remark参数 + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得项记录表(设备 模具 保养 维修 巡检点检)") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:device-mold-items:query')") + public CommonResult getDeviceMoldItems(@RequestParam("id") Long id) { + DeviceMoldItemsDO deviceMoldItems = deviceMoldItemsService.getDeviceMoldItems(id); + return success(DeviceMoldItemsConvert.INSTANCE.convert(deviceMoldItems)); + } + + @GetMapping("/list") + @Operation(summary = "获得项记录表(设备 模具 保养 维修 巡检点检)列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:device-mold-items:query')") + public CommonResult> getDeviceMoldItemsList(@RequestParam("ids") Collection ids) { + List list = deviceMoldItemsService.getDeviceMoldItemsList(ids); + return success(DeviceMoldItemsConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得项记录表(设备 模具 保养 维修 巡检点检)分页") +// @PreAuthorize("@ss.hasPermission('eam:device-mold-items:query')") + public CommonResult> getDeviceMoldItemsPage(@Valid DeviceMoldItemsPageReqVO pageVO) { + PageResult pageResult = deviceMoldItemsService.getDeviceMoldItemsPage(pageVO); + return success(DeviceMoldItemsConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出项记录表(设备 模具 保养 维修 巡检点检) Excel") + @PreAuthorize("@ss.hasPermission('eam:device-mold-items:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMoldItemsExcel(@Valid DeviceMoldItemsExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deviceMoldItemsService.getDeviceMoldItemsList(exportReqVO); + Map mapDropDown = new HashMap<>(); + //设备保养项配置 + if("DEVICE".equals(exportReqVO.getType())&& "MAINTAIN".equals(exportReqVO.getStatus())){ + List resultList = this.getDeviceMaintenanceExcelVo(list, mapDropDown); + // 导出 Excel + ExcelUtils.write(response, "设备保养项配置.xls", "数据", DeviceMaintenanceExcelVO.class, resultList,mapDropDown); + } + //模具保养项配置 + else if("MOLD".equals(exportReqVO.getType())&& "MAINTAIN".equals(exportReqVO.getStatus())){ + List resultList = this.getMoldMaintenanceExcelVO(list, mapDropDown); + // 导出 Excel + ExcelUtils.write(response, "模具保养项配置.xls", "数据", MoldMaintenanceExcelVO.class, resultList,mapDropDown); + } + //巡检点检项配置 + else if("DEVICE".equals(exportReqVO.getType())&& "INSPECTION".equals(exportReqVO.getStatus())){ + List resultList = this.getInspectionExcelVO(list, mapDropDown); + // 导出 Excel + ExcelUtils.write(response, "设备巡检点检项配置.xls", "数据", InspectionExcelVO.class, resultList,mapDropDown); + } + else if("MOLD".equals(exportReqVO.getType())&& "INSPECTION".equals(exportReqVO.getStatus())){ + List resultList = this.getInspectionExcelVO(list, mapDropDown); + // 导出 Excel + ExcelUtils.write(response, "模具巡检点检项配置.xls", "数据", InspectionExcelVO.class, resultList,mapDropDown); + } + } + + private List getDeviceMaintenanceExcelVo(List list, Map mapDropDown) { + String[] type = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.DEVICE_MOLD_TYPE); + mapDropDown.put(2, type); + String[] status = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.DEVICEMOLDITEMS_STATUS); + mapDropDown.put(4, status); + String[] executionCycle = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.EXECUTION_CYCLE); + mapDropDown.put(5, executionCycle); + String[] available = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.TRUE_FALSE); + mapDropDown.put(8, available); + // 导出 Excel + List resultList = DeviceMoldItemsConvert.INSTANCE.convertList02(list); + return resultList; + } + private List getMoldMaintenanceExcelVO(List list, Map mapDropDown) { + String[] type = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.DEVICE_MOLD_TYPE); + mapDropDown.put(2, type); + String[] status = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.DEVICEMOLDITEMS_STATUS); + mapDropDown.put(4, status); + String[] executionCycle = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.EXECUTION_CYCLE); + mapDropDown.put(5, executionCycle); + String[] available = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.TRUE_FALSE); + mapDropDown.put(8, available); + // 导出 Excel + List resultList = DeviceMoldItemsConvert.INSTANCE.convertList03(list); + return resultList; + } + private List getInspectionExcelVO(List list, Map mapDropDown) { + String[] type = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.DEVICE_MOLD_TYPE); + mapDropDown.put(2, type); + String[] status = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.DEVICEMOLDITEMS_STATUS); + mapDropDown.put(4, status); + String[] available = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.TRUE_FALSE); + mapDropDown.put(6, available); + // 导出 Excel + List resultList = DeviceMoldItemsConvert.INSTANCE.convertList04(list); + return resultList; + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入项记录表(设备 模具 保养 维修 巡检点检)模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "项记录表(设备 模具 保养 维修 巡检点检)基本信息导入模板.xls", "项记录表(设备 模具 保养 维修 巡检点检)基本信息列表", DeviceMaintenanceExcelVO.class, list); + } + @GetMapping("/getNumber") + @Operation(summary = "获得项记录表分页") +// @PreAuthorize("@ss.hasPermission('wms:supplierinvoice-request-main:getNumber')") + public CommonResult getNumber(@Valid DeviceMoldItemsPageReqVO pageVO) { + Object object = deviceMoldItemsService.getNumber(pageVO); + return success(object) ; + } + + @GetMapping("/getListByNumber") + @Operation(summary = "根据设备编码查询巡检点检项目") + //@PreAuthorize("@ss.hasPermission('wms:supplierinvoice-request-main:getNumber')") + public CommonResult getListByNumber(String number) { + Object object = deviceMoldItemsService.getListByNumber(number); + return success(object) ; + } + + @GetMapping("/testPlan") + @Operation(summary = "根据设备编码查询巡检点检项目") + public CommonResult testPlan(String date,String type) { + deviceMoldItemsService.testPlan(date,type); + return success(null) ; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMaintenanceExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMaintenanceExcelVO.java new file mode 100644 index 0000000..1e5498a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMaintenanceExcelVO.java @@ -0,0 +1,54 @@ +package com.win.module.eam.controller.devicemolditems.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.eam.enums.DictTypeConstants; +import lombok.Data; + +/** + * 设备保养项配置 + * @author 超级管理员 + */ +@Data +public class DeviceMaintenanceExcelVO { + + @ExcelProperty("保养内容") + @ColumnWidth(value = 20) + private String name; + + @ExcelProperty(value = "类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.DEVICE_MOLD_TYPE) + @ColumnWidth(value = 20) + private String type; + + @ExcelProperty("设备编号") + @ColumnWidth(value = 20) + private String deviceNumber; + + //枚举维修、保养、巡检点检 + @ExcelProperty(value = "项类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.DEVICEMOLDITEMS_STATUS) + @ColumnWidth(value = 20) + private String status; + + @ExcelProperty(value = "保养周期", converter = DictConvert.class) + @DictFormat(DictTypeConstants.EXECUTION_CYCLE) + @ColumnWidth(value = 20) + private String executionCycle; + + @ExcelProperty("人数") + @ColumnWidth(value = 20) + private Integer peoples; + + @ExcelProperty("保养所需时间(分钟)") + @ColumnWidth(value = 30) + private Integer estimatedMinutes; + + @ExcelProperty(value = "是否可用", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + @ColumnWidth(value = 20) + private String available; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsBaseVO.java new file mode 100644 index 0000000..7a6aea7 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsBaseVO.java @@ -0,0 +1,61 @@ +package com.win.module.eam.controller.devicemolditems.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 DeviceMoldItemsBaseVO { + + @Schema(description = "id", example = "id") + private Long id; + + @Schema(description = "保养内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + @NotNull(message = "保养内容不能为空") + private String name; + + @Schema(description = "设备模具编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "设备模具编号不能为空") + private String deviceNumber; + + @Schema(description = "类型设备、模具枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "类型设备、模具枚举不能为空") + private String type; + + @Schema(description = "项类型枚举维修、保养、巡检点检", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "项类型枚举维修、保养、巡检点检不能为空") + private String status; + + @Schema(description = "执行周期", example = "2") + private String executionCycle; + + @Schema(description = "特殊周期-月", example = "2") + private String executionCycleMonth; + + @Schema(description = "特殊周期-周", example = "2") + private String executionCycleWeek; + + @Schema(description = "设备部位", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + private String equipmentParts; + + @Schema(description = "人数") + private String peoples; + + @Schema(description = "预计所需时间") + private String estimatedMinutes; + + @Schema(description = "地点ID", example = "5283") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsCreateReqVO.java new file mode 100644 index 0000000..b2bac95 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsCreateReqVO.java @@ -0,0 +1,15 @@ +package com.win.module.eam.controller.devicemolditems.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 DeviceMoldItemsCreateReqVO extends DeviceMoldItemsBaseVO { + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "就是想改") + private String remark; +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsExportReqVO.java new file mode 100644 index 0000000..38da876 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsExportReqVO.java @@ -0,0 +1,37 @@ +package com.win.module.eam.controller.devicemolditems.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 项记录表(设备 模具 保养 维修 巡检点检) Excel 导出 Request VO,参数和 DeviceMoldItemsPageReqVO 是一致的") +@Data +public class DeviceMoldItemsExportReqVO { + + @Schema(description = "保养内容", example = "赵六") + private String name; + + @Schema(description = "设备模具编号") + private String deviceNumber; + + @Schema(description = "设备模具名称") + private String deviceName; + + @Schema(description = "类型设备、模具枚举", example = "2") + private String type; + + @Schema(description = "执行周期", example = "2") + private String executionCycle; + + @Schema(description = "设备部位", example = "2") + private String equipmentParts; + + @Schema(description = "项类型枚举维修、保养、巡检点检", example = "1") + private String status; + + @Schema(description = "人数") + private String peoples; + + @Schema(description = "预计所需时间") + private String estimatedMinutes; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsPageReqVO.java new file mode 100644 index 0000000..bde8824 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsPageReqVO.java @@ -0,0 +1,50 @@ +package com.win.module.eam.controller.devicemolditems.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; + +@Schema(description = "管理后台 - 项记录表(设备 模具 保养 维修 巡检点检)分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceMoldItemsPageReqVO extends PageParam { + + @Schema(description = "保养项名称", example = "赵六") + private String name; + + @Schema(description = "设备模具编号") + private String deviceNumber; + + @Schema(description = "类型设备、模具枚举", example = "2") + private String type; + + @Schema(description = "执行周期", example = "2") + private String executionCycle; + + @Schema(description = "特殊周期-月", example = "2") + private String executionCycleMonth; + + @Schema(description = "特殊周期-周", example = "2") + private String executionCycleWeek; + + @Schema(description = "设备部位", example = "2") + private String equipmentParts; + + @Schema(description = "项类型枚举维修、保养、巡检点检", example = "1") + private String status; + + /** + * 是否可用 + */ + private String available; + + @Schema(description = "人数") + private String peoples; + + @Schema(description = "预计所需时间") + private String estimatedMinutes; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsRespVO.java new file mode 100644 index 0000000..cbc01e4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsRespVO.java @@ -0,0 +1,25 @@ +package com.win.module.eam.controller.devicemolditems.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 DeviceMoldItemsRespVO extends DeviceMoldItemsBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + /** + * 设备/模具名称 + */ + @Schema(description = "名称") + private String deviceName; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsUpdateReqVO.java new file mode 100644 index 0000000..68104e1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/DeviceMoldItemsUpdateReqVO.java @@ -0,0 +1,15 @@ +package com.win.module.eam.controller.devicemolditems.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 DeviceMoldItemsUpdateReqVO extends DeviceMoldItemsBaseVO { + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "就是想改") + private String remark; +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/InspectionExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/InspectionExcelVO.java new file mode 100644 index 0000000..c882a0a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/InspectionExcelVO.java @@ -0,0 +1,44 @@ +package com.win.module.eam.controller.devicemolditems.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.eam.enums.DictTypeConstants; +import lombok.Data; + +/** + * 巡检点检项配置 + * @author 超级管理员 + */ +@Data +public class InspectionExcelVO { + + @ExcelProperty("保养内容") + @ColumnWidth(value = 20) + private String name; + + @ExcelProperty(value = "类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.DEVICE_MOLD_TYPE) + @ColumnWidth(value = 20) + private String type; + + @ExcelProperty("设备编号") + @ColumnWidth(value = 20) + private String deviceNumber; + + @ExcelProperty(value = "项类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.DEVICEMOLDITEMS_STATUS) + @ColumnWidth(value = 20) + private String status; + + @ExcelProperty("设备部位") + @ColumnWidth(value = 20) + private String equipmentParts; + + @ExcelProperty(value = "是否可用", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + @ColumnWidth(value = 20) + private String available; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/MoldMaintenanceExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/MoldMaintenanceExcelVO.java new file mode 100644 index 0000000..3c8c1d2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditems/vo/MoldMaintenanceExcelVO.java @@ -0,0 +1,57 @@ +package com.win.module.eam.controller.devicemolditems.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.eam.enums.DictTypeConstants; +import lombok.Data; + +/** + * 模具保养项配置 + * @author 超级管理员 + */ +@Data +public class MoldMaintenanceExcelVO { + + @ExcelProperty("保养内容") + @ColumnWidth(value = 20) + private String name; + + @ExcelProperty(value = "类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.DEVICE_MOLD_TYPE) + @ColumnWidth(value = 20) + private String type; + + @ExcelProperty("模具编号") + @ColumnWidth(value = 20) + private String deviceNumber; + + @ExcelProperty("模具名称") + @ColumnWidth(value = 20) + private String deviceName; + + @ExcelProperty(value = "项类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.DEVICEMOLDITEMS_STATUS) + @ColumnWidth(value = 20) + private String status; + + @ExcelProperty(value = "保养周期", converter = DictConvert.class) + @DictFormat(DictTypeConstants.EXECUTION_CYCLE) + @ColumnWidth(value = 20) + private String executionCycle; + + @ExcelProperty("人数") + @ColumnWidth(value = 20) + private Integer peoples; + + @ExcelProperty("保养所需时间(分钟)") + @ColumnWidth(value = 30) + private Integer estimatedMinutes; + + @ExcelProperty(value = "是否可用", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + @ColumnWidth(value = 20) + private String available; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/DeviceMoldItemsHistoryController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/DeviceMoldItemsHistoryController.java new file mode 100644 index 0000000..27da760 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/DeviceMoldItemsHistoryController.java @@ -0,0 +1,183 @@ +package com.win.module.eam.controller.devicemolditemshistory; + +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.eam.controller.deviceaccounts.vo.DeviceAccountsPageReqVO; +import com.win.module.eam.controller.devicemolditemshistory.vo.*; +import com.win.module.eam.controller.moldaccounts.vo.MoldAccountsPageReqVO; +import com.win.module.eam.convert.devicemolditemshistory.DeviceMoldItemsHistoryConvert; +import com.win.module.eam.dal.dataobject.deviceaccounts.DeviceAccountsDO; +import com.win.module.eam.dal.dataobject.devicemolditemshistory.DeviceMoldItemsHistoryDO; +import com.win.module.eam.dal.dataobject.moldaccounts.MoldAccountsDO; +import com.win.module.eam.service.deviceaccounts.DeviceAccountsServiceImpl; +import com.win.module.eam.service.devicemolditemshistory.DeviceMoldItemsHistoryService; +import com.win.module.eam.service.moldaccounts.MoldAccountsServiceImpl; +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 java.util.stream.Collectors; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 项记录历史表(设备 模具 保养 维修 巡检点检)") +@RestController +@RequestMapping("/record/device-mold-items-history") +@Validated +public class DeviceMoldItemsHistoryController { + + @Resource + private DeviceMoldItemsHistoryService deviceMoldItemsHistoryService; + + @Resource + private DeviceAccountsServiceImpl deviceAccountsService; + + @Resource + private MoldAccountsServiceImpl moldAccountsService; + + + @PostMapping("/create") + @Operation(summary = "创建项记录历史表(设备 模具 保养 维修 巡检点检)") + @PreAuthorize("@ss.hasPermission('record:device-mold-items-history:create')") + public CommonResult createDeviceMoldItemsHistory(@Valid @RequestBody DeviceMoldItemsHistoryCreateReqVO createReqVO) { + return success(deviceMoldItemsHistoryService.createDeviceMoldItemsHistory(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新项记录历史表(设备 模具 保养 维修 巡检点检)") + @PreAuthorize("@ss.hasPermission('record:device-mold-items-history:update')") + public CommonResult updateDeviceMoldItemsHistory(@Valid @RequestBody DeviceMoldItemsHistoryUpdateReqVO updateReqVO) { + int result = deviceMoldItemsHistoryService.updateDeviceMoldItemsHistory(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除项记录历史表(设备 模具 保养 维修 巡检点检)") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('record:device-mold-items-history:delete')") + public CommonResult deleteDeviceMoldItemsHistory(@RequestParam("id") Long id) { + int result = deviceMoldItemsHistoryService.deleteDeviceMoldItemsHistory(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得项记录历史表(设备 模具 保养 维修 巡检点检)") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('record:device-mold-items-history:query')") + public CommonResult getDeviceMoldItemsHistory(@RequestParam("id") Long id) { + DeviceMoldItemsHistoryDO deviceMoldItemsHistory = deviceMoldItemsHistoryService.getDeviceMoldItemsHistory(id); + return success(DeviceMoldItemsHistoryConvert.INSTANCE.convert(deviceMoldItemsHistory)); + } + + @GetMapping("/list") + @Operation(summary = "获得项记录历史表(设备 模具 保养 维修 巡检点检)列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('record:device-mold-items-history:query')") + public CommonResult> getDeviceMoldItemsHistoryList(@RequestParam("ids") Collection ids) { + List list = deviceMoldItemsHistoryService.getDeviceMoldItemsHistoryList(ids); + return success(DeviceMoldItemsHistoryConvert.INSTANCE.convertList(list)); + } + +// @GetMapping("/page") +// @Operation(summary = "获得项记录历史表(设备 模具 保养 维修 巡检点检)分页") +// @PreAuthorize("@ss.hasPermission('record:device-mold-items-history:query')") +// public CommonResult> getDeviceMoldItemsHistoryPage(@Valid DeviceMoldItemsHistoryPageReqVO pageVO) { +// PageResult pageResult = deviceMoldItemsHistoryService.getDeviceMoldItemsHistoryPage(pageVO); +// DeviceAccountsPageReqVO deviceAccountsPageReqVO = new DeviceAccountsPageReqVO(); +// List deviceAccountsDOList = deviceAccountsService.selectListNoPage(deviceAccountsPageReqVO); +// MoldAccountsPageReqVO moldAccountsPageReqVO = new MoldAccountsPageReqVO(); +// List moldAccountsDOList = moldAccountsService.selectListNoPage(moldAccountsPageReqVO); +// PageResult pageResultList = DeviceMoldItemsHistoryConvert.INSTANCE.convertPage(pageResult); +// return success(pageResultList); +// } + @GetMapping("/page") + @Operation(summary = "获得项记录历史表(设备 模具 保养 维修 巡检点检)分页") + @PreAuthorize("@ss.hasPermission('record:device-mold-items-history:query')") + public CommonResult> getDeviceMoldItemsHistoryPage(@Valid DeviceMoldItemsHistoryPageReqVO pageVO) { + PageResult pageResult = deviceMoldItemsHistoryService.getDeviceMoldItemsHistoryPage(pageVO); + DeviceAccountsPageReqVO deviceAccountsPageReqVO = new DeviceAccountsPageReqVO(); + List deviceAccountsDOList = deviceAccountsService.selectListNoPage(deviceAccountsPageReqVO); + MoldAccountsPageReqVO moldAccountsPageReqVO = new MoldAccountsPageReqVO(); + List moldAccountsDOList = moldAccountsService.selectListNoPage(moldAccountsPageReqVO); + + // 将列表转换为Map,提高查找效率 + Map deviceAccountsMap = deviceAccountsDOList.stream() + .collect(Collectors.toMap(DeviceAccountsDO::getNumber, DeviceAccountsDO::getName, (existing, replacement) -> existing)); + Map moldAccountsMap = moldAccountsDOList.stream() + .collect(Collectors.toMap(MoldAccountsDO::getNumber, MoldAccountsDO::getName, (existing, replacement) -> existing)); + + PageResult pageResultList = DeviceMoldItemsHistoryConvert.INSTANCE.convertPage(pageResult); + + // 使用Stream API处理 + pageResultList.getList().forEach(item -> { + if ("DEVICE".equals(item.getType())) { + item.setDeviceName(deviceAccountsMap.getOrDefault(item.getDeviceNumber(), null)); + } else if ("MOLD".equals(item.getType())) { + item.setDeviceName(moldAccountsMap.getOrDefault(item.getDeviceNumber(), null)); + } + }); + + return success(pageResultList); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出项记录历史表(设备 模具 保养 维修 巡检点检) Excel") + @PreAuthorize("@ss.hasPermission('record:device-mold-items-history:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMoldItemsHistoryExcel(@Valid DeviceMoldItemsHistoryExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deviceMoldItemsHistoryService.getDeviceMoldItemsHistoryList(exportReqVO); + // 导出 Excel + List datas = DeviceMoldItemsHistoryConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "项记录历史表(设备 模具 保养 维修 巡检点检).xls", "数据", DeviceMoldItemsHistoryExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入项记录历史表(设备 模具 保养 维修 巡检点检)模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "项记录历史表(设备 模具 保养 维修 巡检点检)基本信息导入模板.xls", "项记录历史表(设备 模具 保养 维修 巡检点检)基本信息列表", DeviceMoldItemsHistoryExcelVO.class, list); + } + + @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('record:device-mold-items-history:import')") + 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 list = ExcelUtils.read(file, DeviceMoldItemsHistoryExcelVO.class); + List errorList = deviceMoldItemsHistoryService.importDeviceMoldItemsHistoryList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryBaseVO.java new file mode 100644 index 0000000..70c2039 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryBaseVO.java @@ -0,0 +1,71 @@ +package com.win.module.eam.controller.devicemolditemshistory.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 项记录历史表(设备 模具 保养 维修 巡检点检) Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class DeviceMoldItemsHistoryBaseVO { + @Schema(description = "父id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long masterId; + + @Schema(description = "保养内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + @NotNull(message = "保养内容不能为空") + private String name; + + @Schema(description = "设备模具编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "设备模具编号不能为空") + private String deviceNumber; + + @Schema(description = "执行周期月、季度、半年、年") + private String executionCycle; + + @Schema(description = "特殊周期-月") + private String executionCycleMonth; + + @Schema(description = "特殊周期-周") + private String executionCycleWeek; + + @Schema(description = "设备部位") + private String equipmentParts; + + @Schema(description = "类型设备、模具枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "类型设备、模具枚举不能为空") + private String type; + + @Schema(description = "项类型枚举维修、保养、巡检点检", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "项类型枚举维修、保养、巡检点检不能为空") + private String status; + + @Schema(description = "人数") + private Integer peoples; + + @Schema(description = "预计所需时间") + private Integer estimatedMinutes; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "地点ID", example = "16845") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "并发乐观锁不能为空") + private Integer concurrencyStamp; + + @Schema(description = "人数") + private Integer peopleNum; + + @Schema(description = "保养所需时间(单位小时)") + private BigDecimal maintenanceTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryCreateReqVO.java new file mode 100644 index 0000000..c32d064 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.devicemolditemshistory.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 项记录历史表(设备 模具 保养 维修 巡检点检)创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceMoldItemsHistoryCreateReqVO extends DeviceMoldItemsHistoryBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryExcelVO.java new file mode 100644 index 0000000..840ea88 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryExcelVO.java @@ -0,0 +1,65 @@ +package com.win.module.eam.controller.devicemolditemshistory.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 项记录历史表(设备 模具 保养 维修 巡检点检) Excel VO + * + * @author Lu.jl + */ +@Data +public class DeviceMoldItemsHistoryExcelVO { + + @ExcelProperty("id") + private Long id; + + @ExcelProperty("保养内容") + private String name; + + @ExcelProperty("设备模具编号") + private String deviceNumber; + + @ExcelProperty("执行周期月、季度、半年、年") + private String executionCycle; + + @ExcelProperty("设备部位") + private String equipmentParts; + + @ExcelProperty("类型设备、模具枚举") + private String type; + + @ExcelProperty("项类型枚举维修、保养、巡检点检") + private String status; + + @ExcelProperty("人数") + private Integer peoples; + + @ExcelProperty("预计所需时间") + private Integer estimatedMinutes; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + + @ExcelProperty("人数") + private Integer peopleNum; + + @ExcelProperty("保养所需时间(单位小时)") + private BigDecimal maintenanceTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryExportReqVO.java new file mode 100644 index 0000000..fe5ab92 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryExportReqVO.java @@ -0,0 +1,63 @@ +package com.win.module.eam.controller.devicemolditemshistory.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +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,参数和 DeviceMoldItemsHistoryPageReqVO 是一致的") +@Data +public class DeviceMoldItemsHistoryExportReqVO { + + @Schema(description = "保养内容", example = "李四") + private String name; + + @Schema(description = "设备模具编号") + private String deviceNumber; + + @Schema(description = "执行周期月、季度、半年、年") + private String executionCycle; + + @Schema(description = "设备部位") + private String equipmentParts; + + @Schema(description = "类型设备、模具枚举", example = "1") + private String type; + + @Schema(description = "项类型枚举维修、保养、巡检点检", example = "2") + private String status; + + @Schema(description = "人数") + private Integer peoples; + + @Schema(description = "预计所需时间") + private Integer estimatedMinutes; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "地点ID", example = "16845") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + + @Schema(description = "人数") + private Integer peopleNum; + + @Schema(description = "保养所需时间(单位小时)") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private BigDecimal[] maintenanceTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryPageReqVO.java new file mode 100644 index 0000000..b8e1f10 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryPageReqVO.java @@ -0,0 +1,68 @@ +package com.win.module.eam.controller.devicemolditemshistory.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.math.BigDecimal; +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 DeviceMoldItemsHistoryPageReqVO extends PageParam { + + @Schema(description = "保养内容", example = "李四") + private String name; + + @Schema(description = "设备模具编号") + private String deviceNumber; + + @Schema(description = "执行周期月、季度、半年、年") + private String executionCycle; + + @Schema(description = "设备部位") + private String equipmentParts; + + @Schema(description = "类型设备、模具枚举", example = "1") + private String type; + + @Schema(description = "项类型枚举维修、保养、巡检点检", example = "2") + private String status; + + @Schema(description = "人数") + private Integer peoples; + + @Schema(description = "预计所需时间") + private Integer estimatedMinutes; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "地点ID", example = "16845") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + + @Schema(description = "人数") + private Integer peopleNum; + + @Schema(description = "保养所需时间(单位小时)") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private BigDecimal[] maintenanceTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryRespVO.java new file mode 100644 index 0000000..73ee6ee --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryRespVO.java @@ -0,0 +1,38 @@ +package com.win.module.eam.controller.devicemolditemshistory.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 DeviceMoldItemsHistoryRespVO extends DeviceMoldItemsHistoryBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "8411") + private Long id; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "操作类型") + private String operatType; + + @Schema(description = "设备模具名称") + private String deviceName; + + @Schema(description = "创建人") + private String creator; + + @Schema(description = "创建时间") + private LocalDateTime create_time; + + @Schema(description = "修改人") + private String updater; + + @Schema(description = "修改时间") + private LocalDateTime update_time; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryUpdateReqVO.java new file mode 100644 index 0000000..5ff7306 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicemolditemshistory/vo/DeviceMoldItemsHistoryUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.eam.controller.devicemolditemshistory.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 项记录历史表(设备 模具 保养 维修 巡检点检)更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceMoldItemsHistoryUpdateReqVO extends DeviceMoldItemsHistoryBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "8411") + @NotNull(message = "id不能为空") + private Long id; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/DeviceRepairRequestController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/DeviceRepairRequestController.java new file mode 100644 index 0000000..04526a4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/DeviceRepairRequestController.java @@ -0,0 +1,195 @@ +package com.win.module.eam.controller.devicerepairrequest; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.devicerepairrequest.vo.*; +import com.win.module.eam.convert.devicerepairrequest.DeviceRepairRequestConvert; +import com.win.module.eam.dal.dataobject.devicerepairrequest.DeviceRepairRequestDO; +import com.win.module.eam.service.devicerepairrequest.DeviceRepairRequestService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 报修申请设备模具") +@RestController +@RequestMapping("/eam/device-repair-request") +@Validated +public class DeviceRepairRequestController { + + @Resource + private DeviceRepairRequestService deviceRepairRequestService; + + + @PostMapping("/create") + @Operation(summary = "创建报修申请") + @PreAuthorize("@ss.hasPermission('eam:device-repair-request:create') or @ss.hasPermission('eam:device-repair-request:createAPP')") + public CommonResult createDeviceRepair(@Valid @RequestBody DeviceRepairRequestRequestCreateReqVO createReqVO) { + return success(deviceRepairRequestService.createDeviceRepair(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新报修申请") + @PreAuthorize("@ss.hasPermission('eam:device-repair-request:update') or @ss.hasPermission('eam:device-repair-request:updateAPP')") + public CommonResult updateDeviceRepair(@Valid @RequestBody DeviceRepairRequestRequestUpdateReqVO updateReqVO) { + int result = deviceRepairRequestService.updateDeviceRepair(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除报修申请") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:device-repair-request:delete') or @ss.hasPermission('eam:device-repair-request:deleteAPP')") + public CommonResult deleteDeviceRepair(@RequestParam("id") Long id) { + int result = deviceRepairRequestService.deleteDeviceRepair(id); + return success(result > 0); + } + + @DeleteMapping("/cancel") + @Operation(summary = "APP撤销申请") + @Parameter(name = "id", description = "主键id", required = true) + @PreAuthorize("@ss.hasPermission('eam:device-repair-request:cancel') or @ss.hasPermission('eam:device-repair-request:cancelAPP')") + public CommonResult cancel(@RequestParam("id") Long id) { + int result = deviceRepairRequestService.rejectedDeviceRepair(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得报修申请") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:device-repair-request:query')") + public CommonResult getDeviceRepair(@RequestParam("id") Long id) { + DeviceRepairRequestDO deviceRepair = deviceRepairRequestService.getDeviceRepair(id); + return success(DeviceRepairRequestConvert.INSTANCE.convert(deviceRepair)); + } + + @GetMapping("/list") + @Operation(summary = "获得报修申请列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-repair-request:query')") + public CommonResult> getDeviceRepairList(@RequestParam("ids") Collection ids) { + List list = deviceRepairRequestService.getDeviceRepairList(ids); + return success(DeviceRepairRequestConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得报修申请分页") + //@PreAuthorize("@ss.hasPermission('eam:device-repair-request:query')") + public CommonResult> getDeviceRepairPage(@Valid DeviceRepairRequestPageReqVO pageVO) { + PageResult pageResult = deviceRepairRequestService.getDeviceRepairPage(pageVO); + return success(DeviceRepairRequestConvert.INSTANCE.convertPage(pageResult)); + } + + + @PostMapping("/senior") + @Operation(summary = "获得报修申请分页") + //@PreAuthorize("@ss.hasPermission('eam:device-repair-request:query')") + public CommonResult> getDeviceRepairSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = deviceRepairRequestService.getDeviceRepairSenior(conditions); + PageResult result = DeviceRepairRequestConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + + @GetMapping("/export-excel") + @Operation(summary = "导出报修申请 Excel") + @PreAuthorize("@ss.hasPermission('eam:device-repair-request:export')") + @OperateLog(type = EXPORT) + public void exportDeviceRepairExcel(@Valid DeviceRepairRequestExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deviceRepairRequestService.getDeviceRepairList(exportReqVO); + // 导出 Excel + List datas = DeviceRepairRequestConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "报修申请.xls", "数据", DeviceRepairRequestExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入报修申请模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "报修申请基本信息导入模板.xls", "报修申请基本信息列表", DeviceRepairRequestExcelVO.class, list); + } + + @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('eam:device-repair-request:import')") + 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 list = ExcelUtils.read(file, DeviceRepairRequestExcelVO.class); + List errorList = deviceRepairRequestService.importDeviceRepairList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + @GetMapping("/getAppPage") + @Operation(summary = "获得APP报修申请分页") + @Parameters({ + @Parameter(name = "pageSize", description = "每页几条", required = true), + @Parameter(name = "pageNo", description = "第几页", example = "1"), + @Parameter(name = "type", description = "DEVICE 设备 MOLD模具", example = "true"), + @Parameter(name = "flag", description = "首页进入0从我的进入1", example = "true"), + @Parameter(name = "name", description = "设备名称"), + @Parameter(name = "number", description = "单号"), + }) + public CommonResult> getAppPage(@Valid DeviceRepairRequestPageReqVO pageVO) { + PageResult pageResult = deviceRepairRequestService.getAppPage(pageVO); + return success(DeviceRepairRequestConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/getDetailsByNumber") + @Operation(summary = "根据报修单号查询报修信息") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:device-repair-request:query')") + public CommonResult> getDetailsByNumber(@RequestParam("requestNumber") String requestNumber,@RequestParam("type") String type) { + Map detailsByNumber = deviceRepairRequestService.getDetailsByNumber(requestNumber, type); + return success(detailsByNumber); + } + + + + @GetMapping("/getOrderByNumber") + @Operation(summary = "根据报修单号查询报修信息") + @Parameter(name = "requestNumber", description = "申请编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:device-repair-request:query')") + public CommonResult getOrderByNumber(@RequestParam("requestNumber") String requestNumber) { + DeviceRepairRequestDO orderInfo = deviceRepairRequestService.getOrderByNumber(requestNumber); + return success(orderInfo); + } + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestExcelVO.java new file mode 100644 index 0000000..381daa4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestExcelVO.java @@ -0,0 +1,53 @@ +package com.win.module.eam.controller.devicerepairrequest.vo; + +import lombok.*; + +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 报修申请 Excel VO + * + * @author 超级管理员 + */ +@Data +public class DeviceRepairRequestExcelVO { + + @ExcelProperty("编号唯一标识") + private String number; + + @ExcelProperty("描述") + private String describes; + + @ExcelProperty("设备模具编号") + private String deviceNumber; + + @ExcelProperty("厂区编号") + private String factoryAreaNumber; + + @ExcelProperty("报修人") + private Long declarer; + + @ExcelProperty("报修人联系电话") + private String declarerPhone; + + @ExcelProperty("故障类型枚举EM、CM、 PM") + private String faultType; + + @ExcelProperty("类型") + private String type; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestExportReqVO.java new file mode 100644 index 0000000..94f6184 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestExportReqVO.java @@ -0,0 +1,22 @@ +package com.win.module.eam.controller.devicerepairrequest.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 报修申请 Excel 导出 Request VO,参数和 DeviceRepairPageReqVO 是一致的") +@Data +public class DeviceRepairRequestExportReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "设备模具编号") + private String deviceNumber; + + @Schema(description = "类型", example = "1") + private String type; + + @Schema(description = "厂区编码", example = "1") + private String factoryAreaNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestPageReqVO.java new file mode 100644 index 0000000..8fd65c7 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestPageReqVO.java @@ -0,0 +1,45 @@ +package com.win.module.eam.controller.devicerepairrequest.vo; + +import lombok.*; +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 DeviceRepairRequestPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "设备模具编号") + private String deviceNumber; + + @Schema(description = "类型", example = "1") + private String type; + + @Schema(description = "结果", example = "1") + private String result; + + @Schema(description = "名称或模具查询", example = "1") + private String selectStr; + + @Schema(description = "设备模具名称模糊", example = "1") + private String name; + + @Schema(description = "0首页进入1我的", example = "1") + private String flag; + + @Schema(description = "我的userId", example = "1") + private String userId; + + @Schema(description = "描述", example = "1") + private String describes; + + @Schema(description = "厂区编码", example = "1") + private String factoryAreaNumber; + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestRequestBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestRequestBaseVO.java new file mode 100644 index 0000000..9f93e47 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestRequestBaseVO.java @@ -0,0 +1,66 @@ +package com.win.module.eam.controller.devicerepairrequest.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.*; + +/** + * 报修申请 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class DeviceRepairRequestRequestBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "id") + private Long id; + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "编号唯一标识不能为空") + private String number; + + @Schema(description = "描述") + private String describes; + + @Schema(description = "设备模具编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "设备模具编号不能为空") + private String deviceNumber; + + @Schema(description = "厂区编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "厂区编号不能为空") + private String factoryAreaNumber; + + @Schema(description = "报修人", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "报修人不能为空") + private Long declarer; + + @Schema(description = "报修人联系电话") + private String declarerPhone; + + @Schema(description = "故障类型枚举EM、CM、 PM", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + //@NotNull(message = "故障类型枚举EM、CM、 PM不能为空") + private String faultType; + + @Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "类型不能为空") + private String type; + + @Schema(description = "结果", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private String result; + + @Schema(description = "地点ID", example = "17942") + private String siteId; + + @Schema(description = "是否可用", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "是否可用不能为空") + private String available; + + @Schema(description = "部门id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long deptId; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "并发乐观锁不能为空") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestRequestCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestRequestCreateReqVO.java new file mode 100644 index 0000000..d987688 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestRequestCreateReqVO.java @@ -0,0 +1,15 @@ +package com.win.module.eam.controller.devicerepairrequest.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 报修申请创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceRepairRequestRequestCreateReqVO extends DeviceRepairRequestRequestBaseVO { + @Schema(description = "文件路径列表") + private List filePathList; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestRequestRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestRequestRespVO.java new file mode 100644 index 0000000..40e7ad3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestRequestRespVO.java @@ -0,0 +1,41 @@ +package com.win.module.eam.controller.devicerepairrequest.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 报修申请 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceRepairRequestRequestRespVO extends DeviceRepairRequestRequestBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "部门名称") + private String departName; + + @Schema(description = "厂区") + private String factoryAreaName; + + @Schema(description = "类型") + private String typeName; + + @Schema(description = "维修人") + private String maintenanceName; + + @Schema(description = "申请人") + private String declarName; + + @Schema(description = "名称") + private String name; + + @Schema(description = "是否撤销0可以点击1不能点击") + private String isCancel; + + @Schema(description = "报修申请图片列表") + private List filePathList; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestRequestUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestRequestUpdateReqVO.java new file mode 100644 index 0000000..b55a00d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicerepairrequest/vo/DeviceRepairRequestRequestUpdateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.devicerepairrequest.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Schema(description = "管理后台 - 报修申请更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceRepairRequestRequestUpdateReqVO extends DeviceRepairRequestRequestBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailController.java new file mode 100644 index 0000000..dae5955 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailController.java @@ -0,0 +1,148 @@ +package com.win.module.eam.controller.devicespotinspectionrecord; + +import com.win.module.eam.controller.devicespotinspectionrecord.vo.*; +import io.swagger.v3.oas.annotations.Parameters; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +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.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.*; +import java.io.IOException; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.pojo.CommonResult; +import static com.win.framework.common.pojo.CommonResult.success; + +import com.win.framework.excel.core.util.ExcelUtils; + +import com.win.framework.operatelog.core.annotations.OperateLog; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailDO; +import com.win.module.eam.convert.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailConvert; +import com.win.module.eam.service.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailService; +import org.springframework.web.multipart.MultipartFile; + +@Tag(name = "管理后台 - 巡检点检记录子") +@RestController +@RequestMapping("/eam/device-spot-inspection-record-detail") +@Validated +public class DeviceSpotInspectionRecordDetailController { + + @Resource + private DeviceSpotInspectionRecordDetailService deviceSpotInspectionRecordDetailService; + + @PostMapping("/create") + @Operation(summary = "创建巡检点检记录子") + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-detail:create')") + public CommonResult createDeviceSpotInspectionRecordDetail(@Valid @RequestBody DeviceSpotInspectionRecordDetailCreateReqVO createReqVO) { + return success(deviceSpotInspectionRecordDetailService.createDeviceSpotInspectionRecordDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新巡检点检记录子") + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-detail:update')") + public CommonResult updateDeviceSpotInspectionRecordDetail(@Valid @RequestBody DeviceSpotInspectionRecordDetailUpdateReqVO updateReqVO) { + int result = deviceSpotInspectionRecordDetailService.updateDeviceSpotInspectionRecordDetail(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除巡检点检记录子") + @Parameter(name = "id", description = "编号", required = true) + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-detail:delete')") + public CommonResult deleteDeviceSpotInspectionRecordDetail(@RequestParam("id") Long id) { + int result = deviceSpotInspectionRecordDetailService.deleteDeviceSpotInspectionRecordDetail(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得巡检点检记录子") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-detail:query')") + public CommonResult getDeviceSpotInspectionRecordDetail(@RequestParam("id") Long id) { + DeviceSpotInspectionRecordDetailDO deviceSpotInspectionRecordDetail = deviceSpotInspectionRecordDetailService.getDeviceSpotInspectionRecordDetail(id); + return success(DeviceSpotInspectionRecordDetailConvert.INSTANCE.convert(deviceSpotInspectionRecordDetail)); + } + + @GetMapping("/list") + @Operation(summary = "获得巡检点检记录子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-detail:query')") + public CommonResult> getDeviceSpotInspectionRecordDetailList(@RequestParam("ids") Collection ids) { + List list = deviceSpotInspectionRecordDetailService.getDeviceSpotInspectionRecordDetailList(ids); + return success(DeviceSpotInspectionRecordDetailConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得巡检点检记录子分页") + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-detail:query')") + public CommonResult> getDeviceSpotInspectionRecordDetailPage(@Valid DeviceSpotInspectionRecordDetailPageReqVO pageVO) { + PageResult pageResult = deviceSpotInspectionRecordDetailService.getDeviceSpotInspectionRecordDetailPage(pageVO); + return success(DeviceSpotInspectionRecordDetailConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出巡检点检记录子 Excel") + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-detail:export')") + @OperateLog(type = EXPORT) + public void exportDeviceSpotInspectionRecordDetailExcel(@Valid DeviceSpotInspectionRecordDetailExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deviceSpotInspectionRecordDetailService.getDeviceSpotInspectionRecordDetailList(exportReqVO); + // 导出 Excel + List datas = DeviceSpotInspectionRecordDetailConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "巡检点检记录子.xls", "数据", DeviceSpotInspectionRecordDetailExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入巡检点检记录子模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "巡检点检记录子基本信息导入模板.xls", "巡检点检记录子基本信息列表", DeviceSpotInspectionRecordDetailExcelVO.class, list); + } + + @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('eam:device-spot-inspection-record-detail:import')") + 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 list = ExcelUtils.read(file, DeviceSpotInspectionRecordDetailExcelVO.class); + List errorList = deviceSpotInspectionRecordDetailService.importDeviceSpotInspectionRecordDetailList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + @GetMapping("/getList") + @Operation(summary = "获得设备巡检点检记录子列表") + @Parameter(name = "number", description = "巡检点检工单号", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-detail:query')") + public CommonResult> getList(@RequestParam("number") String number) { + List list = deviceSpotInspectionRecordDetailService.getList(number); + return success(DeviceSpotInspectionRecordDetailConvert.INSTANCE.convertList(list)); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/DeviceSpotInspectionRecordMainController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/DeviceSpotInspectionRecordMainController.java new file mode 100644 index 0000000..6a77efe --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/DeviceSpotInspectionRecordMainController.java @@ -0,0 +1,190 @@ +package com.win.module.eam.controller.devicespotinspectionrecord; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.devicemolditems.vo.DeviceMoldItemsRespVO; +import com.win.module.eam.controller.devicespotinspectionrecord.vo.*; +import com.win.module.eam.convert.devicemolditems.DeviceMoldItemsConvert; +import com.win.module.eam.convert.devicespotinspectionrecord.DeviceSpotInspectionRecordMainConvert; +import com.win.module.eam.dal.dataobject.devicemolditems.DeviceMoldItemsDO; +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordMainDO; +import com.win.module.eam.service.devicespotinspectionrecord.DeviceSpotInspectionRecordMainService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + + +@Tag(name = "管理后台 - 巡检点检记录") +@RestController +@RequestMapping("/eam/device-spot-inspection-record-main") +@Validated +public class DeviceSpotInspectionRecordMainController { + + @Resource + private DeviceSpotInspectionRecordMainService deviceSpotInspectionRecordMainService; + + @PostMapping("/create") + @Operation(summary = "创建检修工单主") + @PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-main:create') or @ss.hasPermission('eam:device-spot-inspection-record-main:createAPP')") + public CommonResult createDeviceSpotInspectionRecordMain(@Valid @RequestBody DeviceSpotInspectionRecordMainCreateReqVO createReqVO) { + return success(deviceSpotInspectionRecordMainService.createDeviceSpotInspectionRecordMain(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新检修工单主或完成") + @PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-main:update') or @ss.hasPermission('eam:device-spot-inspection-record-main:updateAPP')") + @Parameters({ + @Parameter(name = "id", description = "id", required = true), + @Parameter(name = "status", description = "点击完成的时候才传COMPLETED固定值", required = false), + }) + public CommonResult updateDeviceSpotInspectionRecordMain(@Valid @RequestBody DeviceSpotInspectionRecordMainUpdateReqVO updateReqVO) { + int result = deviceSpotInspectionRecordMainService.updateDeviceSpotInspectionRecordMain(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除检修工单主") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-main:delete') or @ss.hasPermission('eam:device-spot-inspection-record-main:deleteAPP')") + public CommonResult deleteDeviceSpotInspectionRecordMain(@RequestParam("id") Long id) { + int result = deviceSpotInspectionRecordMainService.deleteDeviceSpotInspectionRecordMain(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得检修工单主") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-main:query')") + public CommonResult getDeviceSpotInspectionRecordMain(@RequestParam("id") Long id) { + DeviceSpotInspectionRecordMainDO deviceSpotInspectionRecordMain = deviceSpotInspectionRecordMainService.getDeviceSpotInspectionRecordMain(id); + return success(DeviceSpotInspectionRecordMainConvert.INSTANCE.convert(deviceSpotInspectionRecordMain)); + } + + @GetMapping("/list") + @Operation(summary = "获得检修工单主列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-main:query')") + public CommonResult> getDeviceSpotInspectionRecordMainList(@RequestParam("ids") Collection ids) { + List list = deviceSpotInspectionRecordMainService.getDeviceSpotInspectionRecordMainList(ids); + return success(DeviceSpotInspectionRecordMainConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得检修工单主分页") + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-main:query')") + public CommonResult> getDeviceSpotInspectionRecordMainPage(@Valid DeviceSpotInspectionRecordMainPageReqVO pageVO) { + PageResult pageResult = deviceSpotInspectionRecordMainService.getDeviceSpotInspectionRecordMainPage(pageVO); + return success(DeviceSpotInspectionRecordMainConvert.INSTANCE.convertPage(pageResult)); + } + + @PostMapping("/senior") + @Operation(summary = "获得检修工单主分页") + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-main:query')") + public CommonResult> getDeviceSpotInspectionRecordMainSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = deviceSpotInspectionRecordMainService.getDeviceSpotInspectionRecordMainSenior(conditions); + PageResult result = DeviceSpotInspectionRecordMainConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出检修工单主 Excel") + @PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-main:export')") + @OperateLog(type = EXPORT) + public void exportDeviceSpotInspectionRecordMainExcel(@Valid DeviceSpotInspectionRecordMainExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deviceSpotInspectionRecordMainService.getDeviceSpotInspectionRecordMainList(exportReqVO); + // 导出 Excel + List datas = DeviceSpotInspectionRecordMainConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "检修工单主.xls", "数据", DeviceSpotInspectionRecordMainExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入检修工单主模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "检修工单主基本信息导入模板.xls", "检修工单主基本信息列表", DeviceSpotInspectionRecordMainExcelVO.class, list); + } + + @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('eam:device-spot-inspection-record-main:import')") + 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 list = ExcelUtils.read(file, DeviceSpotInspectionRecordMainExcelVO.class); + List errorList = deviceSpotInspectionRecordMainService.importDeviceSpotInspectionRecordMainList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + @GetMapping("/getListByDeviceNumber") + @Operation(summary = "根据设备模具号查询巡检点检项列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-mold-items:query')") + public CommonResult> getDeviceMoldItemsList(@RequestParam("number") String number) { + List list = deviceSpotInspectionRecordMainService.getDeviceMoldItemsList(number); + return success(DeviceMoldItemsConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/getAppPage") + @Operation(summary = "获得APP工单分页") + public CommonResult> getAppPage(@Valid DeviceSpotInspectionRecordMainPageReqVO pageVO) { + PageResult pageResult = deviceSpotInspectionRecordMainService.getAppPage(pageVO); + return success(DeviceSpotInspectionRecordMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/orderClickFinish") + @Operation(summary = "巡检点检点击完成") + @Parameters({ + @Parameter(name = "id", description = "主键id", required = true) + }) + @PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-main:orderClickFinish') or @ss.hasPermission('eam:device-spot-inspection-record-main:orderClickFinishAPP')") + public CommonResult orderClickFinish(@RequestParam("id") Long id) { + return success(deviceSpotInspectionRecordMainService.orderClickFinish(id)); + } + + @GetMapping("/orderClickVerify") + @Operation(summary = "巡检点检工程师审核") + @Parameters({ + @Parameter(name = "id", description = "主键id", required = true) + }) + @PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-main:orderClickVerify') or @ss.hasPermission('eam:device-spot-inspection-record-main:orderClickVerifyAPP')") + public CommonResult orderClickVerify(@RequestParam("id") Long id,@RequestParam("status") String status,String approveOpinion) { + return success(deviceSpotInspectionRecordMainService.orderClickApprove(id,status,approveOpinion)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailBaseVO.java new file mode 100644 index 0000000..f4eaf57 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailBaseVO.java @@ -0,0 +1,46 @@ +package com.win.module.eam.controller.devicespotinspectionrecord.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 DeviceSpotInspectionRecordDetailBaseVO { + @Schema(description = "id") + private Long id; + @Schema(description = "主表id") + private Long masterId; + + @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + //@NotNull(message = "检测项名称不能为空") + private String name; + + @Schema(description = "检修工单号与主表一致", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "工单号不能为空") + private String number; + + @Schema(description = "是否符合TRUE/FALSE") + @NotNull(message = "是否符合不能为空") + private String isConform; + + @Schema(description = "地点ID", example = "13310") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "并发乐观锁不能为空") + private Integer concurrencyStamp; + @Schema(description = "设备部位") + //@NotNull(message = "设备部位不能为空") + private String equipmentPosition; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailCreateReqVO.java new file mode 100644 index 0000000..a186a5f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.devicespotinspectionrecord.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 巡检点检记录子创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceSpotInspectionRecordDetailCreateReqVO extends DeviceSpotInspectionRecordDetailBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailExcelVO.java new file mode 100644 index 0000000..34ab407 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailExcelVO.java @@ -0,0 +1,43 @@ +package com.win.module.eam.controller.devicespotinspectionrecord.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 DeviceSpotInspectionRecordDetailExcelVO { + + @ExcelProperty("id") + private Long id; + + @ExcelProperty("名称") + private String name; + + @ExcelProperty("检修工单号与主表一致") + private String number; + + @ExcelProperty("是否符合TRUE/FALSE") + private String isConform; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailExportReqVO.java new file mode 100644 index 0000000..fa94f28 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailExportReqVO.java @@ -0,0 +1,38 @@ +package com.win.module.eam.controller.devicespotinspectionrecord.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.win.framework.common.pojo.PageParam; +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,参数和 DeviceSpotInspectionRecordDetailPageReqVO 是一致的") +@Data +public class DeviceSpotInspectionRecordDetailExportReqVO { + + @Schema(description = "名称", example = "芋艿") + private String name; + + @Schema(description = "检修工单号与主表一致") + private String number; + + @Schema(description = "是否符合TRUE/FALSE") + private String isConform; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "地点ID", example = "13310") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailPageReqVO.java new file mode 100644 index 0000000..356048f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailPageReqVO.java @@ -0,0 +1,45 @@ +package com.win.module.eam.controller.devicespotinspectionrecord.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 DeviceSpotInspectionRecordDetailPageReqVO extends PageParam { + + @Schema(description = "名称", example = "芋艿") + private String name; + + @Schema(description = "检修工单号与主表一致") + private String number; + + @Schema(description = "主表id") + private String masterId; + + @Schema(description = "是否符合TRUE/FALSE") + private String isConform; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "地点ID", example = "13310") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailRespVO.java new file mode 100644 index 0000000..e664d24 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.eam.controller.devicespotinspectionrecord.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 DeviceSpotInspectionRecordDetailRespVO extends DeviceSpotInspectionRecordDetailBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "31464") + private Long id; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailUpdateReqVO.java new file mode 100644 index 0000000..aca5230 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordDetailUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.eam.controller.devicespotinspectionrecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 巡检点检记录子更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceSpotInspectionRecordDetailUpdateReqVO extends DeviceSpotInspectionRecordDetailBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "31464") + @NotNull(message = "id不能为空") + private Long id; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainBaseVO.java new file mode 100644 index 0000000..337a156 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainBaseVO.java @@ -0,0 +1,85 @@ +package com.win.module.eam.controller.devicespotinspectionrecord.vo; + +import com.baomidou.mybatisplus.annotation.Version; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** + * 检修工单主 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class DeviceSpotInspectionRecordMainBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "编号唯一标识不能为空") + private Long id; + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "编号唯一标识不能为空") + private String number; + + @Schema(description = "设备模具", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "设备模具不能为空") + private String deviceNumber; + + @Schema(description = "描述") + private String describes; + + @Schema(description = "维修人") + private Long maintenance; + + @Schema(description = "维修人联系电话") + private String maintenancePhone; + + @Schema(description = "审批意见") + private String approveOpinion; + + @Schema(description = "审批人") + private Long verifyer; + + @Schema(description = "审批时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime verifyTime; + + @Schema(description = "完成时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime completionTime; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + //@NotNull(message = "状态不能为空") + private String status; + + @Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + //@NotNull(message = "类型不能为空") + private String type; + + @Schema(description = "地点ID", example = "3083") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "并发乐观锁不能为空") + @Version + private Integer concurrencyStamp; + + @Schema(description = "班次") + private String classes; + + @Schema(description = "班次名称") + private String classesName; + + @Schema(description = "子数据列表") + private List> subList; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainCreateReqVO.java new file mode 100644 index 0000000..6110778 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.devicespotinspectionrecord.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 检修工单主创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceSpotInspectionRecordMainCreateReqVO extends DeviceSpotInspectionRecordMainBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainExcelVO.java new file mode 100644 index 0000000..0b3747f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainExcelVO.java @@ -0,0 +1,52 @@ +package com.win.module.eam.controller.devicespotinspectionrecord.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 DeviceSpotInspectionRecordMainExcelVO { + + @ExcelProperty("编号唯一标识") + private String number; + + @ExcelProperty("设备模具") + private String deviceNumber; + + @ExcelProperty("描述") + private String describe; + + @ExcelProperty("维修人") + private Long maintenance; + + @ExcelProperty("维修人联系电话") + private String maintenancePhone; + + @ExcelProperty("状态") + private String status; + + @ExcelProperty("类型") + private String type; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainExportReqVO.java new file mode 100644 index 0000000..6cd304b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainExportReqVO.java @@ -0,0 +1,24 @@ +package com.win.module.eam.controller.devicespotinspectionrecord.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,参数和 DeviceSpotInspectionRecordMainPageReqVO 是一致的") +@Data +public class DeviceSpotInspectionRecordMainExportReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "设备模具") + private String deviceNumber; + + @Schema(description = "状态", example = "2") + private String status; + + @Schema(description = "类型", example = "2") + private String type; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainPageReqVO.java new file mode 100644 index 0000000..845eb9a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainPageReqVO.java @@ -0,0 +1,53 @@ +package com.win.module.eam.controller.devicespotinspectionrecord.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 DeviceSpotInspectionRecordMainPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "设备模具") + private String deviceNumber; + + @Schema(description = "状态", example = "2") + private String status; + + @Schema(description = "类型", example = "2") + private String type; + + @Schema(description = "部门名称") + private String deptName; + @Schema(description = "厂区") + private String factoryAreaName; + + @Schema(description = "类型") + private String typeName; + + @Schema(description = "维修人") + private String maintenanceName; + + @Schema(description = "名称") + private String name; + + @Schema(description = "0首页1我的") + private String flag; + + @Schema(description = "用户id") + private String userId; + + @Schema(description = "描述") + private String describes; + + @Schema(description = "班组") + private String classType; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainRespVO.java new file mode 100644 index 0000000..934c8f2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainRespVO.java @@ -0,0 +1,36 @@ +package com.win.module.eam.controller.devicespotinspectionrecord.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 DeviceSpotInspectionRecordMainRespVO extends DeviceSpotInspectionRecordMainBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "部门名称") + private String deptName; + @Schema(description = "厂区") + private String factoryAreaName; + + @Schema(description = "类型") + private String typeName; + + @Schema(description = "维修人") + private String maintenanceName; + + @Schema(description = "名称") + private String name; + + @Schema(description = "类型名称", example = "1") + private String statusName; + + @Schema(description = "验证人") + private String verifyName; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainUpdateReqVO.java new file mode 100644 index 0000000..172c543 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/devicespotinspectionrecord/vo/DeviceSpotInspectionRecordMainUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.devicespotinspectionrecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 检修工单主更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceSpotInspectionRecordMainUpdateReqVO extends DeviceSpotInspectionRecordMainBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/FactoryAreaController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/FactoryAreaController.java new file mode 100644 index 0000000..98e86b8 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/FactoryAreaController.java @@ -0,0 +1,99 @@ +package com.win.module.eam.controller.factoryarea; + +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.eam.controller.factoryarea.vo.*; +import com.win.module.eam.convert.factoryarea.FactoryAreaConvert; +import com.win.module.eam.dal.dataobject.factoryarea.FactoryAreaDO; +import com.win.module.eam.service.factoryarea.FactoryAreaService; +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.Arrays; +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("/eam/factory-area") +@Validated +public class FactoryAreaController { + + @Resource + private FactoryAreaService factoryAreaService; + + @PostMapping("/create") + @Operation(summary = "创建厂区") + @PreAuthorize("@ss.hasPermission('basic:factory-area:create')") + public CommonResult createFactoryArea(@Valid @RequestBody FactoryAreaCreateReqVO createReqVO) { + return success(factoryAreaService.createFactoryArea(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新厂区") + @PreAuthorize("@ss.hasPermission('basic:factory-area:update')") + public CommonResult updateFactoryArea(@Valid @RequestBody FactoryAreaUpdateReqVO updateReqVO) { + int result = factoryAreaService.updateFactoryArea(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除厂区") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('basic:factory-area:delete')") + public CommonResult deleteFactoryArea(@RequestParam("id") Long id) { + int result = factoryAreaService.deleteFactoryArea(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得厂区") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('basic:factory-area:query')") + public CommonResult getFactoryArea(@RequestParam("id") Long id) { + FactoryAreaDO factoryArea = factoryAreaService.getFactoryArea(id); + return success(FactoryAreaConvert.INSTANCE.convert(factoryArea)); + } + + @GetMapping("/list") + @Operation(summary = "获得厂区列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('basic:factory-area:query')") + public CommonResult> getFactoryAreaList(@RequestParam("ids") Collection ids) { + List list = factoryAreaService.getFactoryAreaList(ids); + return success(FactoryAreaConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得厂区分页") + @PreAuthorize("@ss.hasPermission('basic:factory-area:query')") + public CommonResult> getFactoryAreaPage(@Valid FactoryAreaPageReqVO pageVO) { + PageResult pageResult = factoryAreaService.getFactoryAreaPage(pageVO); + return success(FactoryAreaConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出厂区 Excel") + @PreAuthorize("@ss.hasPermission('basic:factory-area:export')") + @OperateLog(type = EXPORT) + public void exportFactoryAreaExcel(@Valid FactoryAreaExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = factoryAreaService.getFactoryAreaList(exportReqVO); + // 导出 Excel + List datas = FactoryAreaConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "厂区.xls", "数据", FactoryAreaExcelVO.class, datas); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaBaseVO.java new file mode 100644 index 0000000..f08db6c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaBaseVO.java @@ -0,0 +1,62 @@ +package com.win.module.eam.controller.factoryarea.vo; + +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 FactoryAreaBaseVO { + + @Schema(description = "id", example = "id") + private Long id; + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + private String number; + + @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "描述", example = "你猜") + private String description; + + @Schema(description = "负责人") + private String leader; + + @Schema(description = "负责人电话") + private String leaderPhone; + + @Schema(description = "地点ID", example = "3249") + private String siteId; + + @Schema(description = "是否可用", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "是否可用不能为空") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer concurrencyStamp; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime createTime; + + @Schema(description = "创建者用户名") + private String creator; + + @Schema(description = "最后更新时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime updateTime; + + @Schema(description = "最后更新者用户名") + private String updater; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaCreateReqVO.java new file mode 100644 index 0000000..d0278b0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.factoryarea.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 厂区创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class FactoryAreaCreateReqVO extends FactoryAreaBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaExcelVO.java new file mode 100644 index 0000000..680bf6b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaExcelVO.java @@ -0,0 +1,38 @@ +package com.win.module.eam.controller.factoryarea.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 厂区 Excel VO + * + * @author 超级管理员 + */ +@Data +public class FactoryAreaExcelVO { + + @ExcelProperty("厂区编号") + private String number; + + @ExcelProperty("名称") + private String name; + + @ExcelProperty("描述") + private String description; + + @ExcelProperty("负责人") + private String leader; + + @ExcelProperty("负责人电话") + private String leaderPhone; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaExportReqVO.java new file mode 100644 index 0000000..e3ea776 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaExportReqVO.java @@ -0,0 +1,36 @@ +package com.win.module.eam.controller.factoryarea.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,参数和 FactoryAreaPageReqVO 是一致的") +@Data +public class FactoryAreaExportReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "芋艿") + private String name; + + @Schema(description = "描述", example = "你猜") + private String description; + + @Schema(description = "负责人") + private String leader; + + @Schema(description = "负责人电话") + private String leaderPhone; + + @Schema(description = "地点ID", example = "3249") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaPageReqVO.java new file mode 100644 index 0000000..810d36a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaPageReqVO.java @@ -0,0 +1,38 @@ +package com.win.module.eam.controller.factoryarea.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 FactoryAreaPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "芋艿") + private String name; + + @Schema(description = "描述", example = "你猜") + private String description; + + @Schema(description = "负责人") + private String leader; + + @Schema(description = "负责人电话") + private String leaderPhone; + + @Schema(description = "地点ID", example = "3249") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaRespVO.java new file mode 100644 index 0000000..3eca5f7 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaRespVO.java @@ -0,0 +1,13 @@ +package com.win.module.eam.controller.factoryarea.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 FactoryAreaRespVO extends FactoryAreaBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaUpdateReqVO.java new file mode 100644 index 0000000..1001955 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/factoryarea/vo/FactoryAreaUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.factoryarea.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 厂区更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class FactoryAreaUpdateReqVO extends FactoryAreaBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/FixedAssetsController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/FixedAssetsController.java new file mode 100644 index 0000000..3dcd366 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/FixedAssetsController.java @@ -0,0 +1,150 @@ +package com.win.module.eam.controller.fixedassets; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.win.framework.datapermission.core.rule.dept.DeptDataPermissionRule; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.eam.controller.fixedassets.vo.*; +import com.win.module.eam.convert.fixedassets.FixedAssetsConvert; +import com.win.module.eam.dal.dataobject.fixedassets.FixedAssetsDO; +import com.win.module.eam.service.fixedassets.FixedAssetsService; +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.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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 固定资产") +@RestController +@RequestMapping("/eam/fixed-assets") +@Validated +public class FixedAssetsController { + + @Resource + private FixedAssetsService fixedAssetsService; + + @PostMapping("/create") + @Operation(summary = "创建固定资产") +// @PreAuthorize("@ss.hasPermission('eam:fixed-assets:create')") + public CommonResult createFixedAssets(@Valid @RequestBody FixedAssetsCreateReqVO createReqVO) { + return success(fixedAssetsService.createFixedAssets(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新固定资产") +// @PreAuthorize("@ss.hasPermission('eam:fixed-assets:update')") + public CommonResult updateFixedAssets(@Valid @RequestBody FixedAssetsUpdateReqVO updateReqVO) { + int result = fixedAssetsService.updateFixedAssets(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除固定资产") + @Parameter(name = "id", description = "编号", required = true) +// @PreAuthorize("@ss.hasPermission('eam:fixed-assets:delete')") + public CommonResult deleteFixedAssets(@RequestParam("id") Long id) { + int result = fixedAssetsService.deleteFixedAssets(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得固定资产") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:fixed-assets:query')") + public CommonResult getFixedAssets(@RequestParam("id") Long id) { + FixedAssetsDO fixedAssets = fixedAssetsService.getFixedAssets(id); + return success(FixedAssetsConvert.INSTANCE.convert(fixedAssets)); + } + + @GetMapping("/list") + @Operation(summary = "获得固定资产列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:fixed-assets:query')") + public CommonResult> getFixedAssetsList(@RequestParam("ids") Collection ids) { + List list = fixedAssetsService.getFixedAssetsList(ids); + return success(FixedAssetsConvert.INSTANCE.convertList(list)); + } + + @Resource + private DeptDataPermissionRule deptDataPermissionRule; + + @DataPermission(includeRules = DeptDataPermissionRule.class) + @GetMapping("/page") + @Operation(summary = "获得固定资产分页") +// @PreAuthorize("@ss.hasPermission('eam:fixed-assets:query')") + public CommonResult> getFixedAssetsPage(@Valid FixedAssetsPageReqVO pageVO) { + PageResult pageResult = fixedAssetsService.getFixedAssetsPage(pageVO); + return success(FixedAssetsConvert.INSTANCE.convertPage(pageResult)); + } + + @PostMapping("/senior") + @Operation(summary = "获得固定资产分页") +// @PreAuthorize("@ss.hasPermission('eam:fixed-assets:query')") + public CommonResult> getFixedAssetsSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = fixedAssetsService.getFixedAssetsSenior(conditions); + PageResult result = FixedAssetsConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出固定资产 Excel") +// @PreAuthorize("@ss.hasPermission('eam:fixed-assets:export')") + @OperateLog(type = EXPORT) + public void exportFixedAssetsExcel(@Valid FixedAssetsExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = fixedAssetsService.getFixedAssetsList(exportReqVO); + // 导出 Excel + List datas = FixedAssetsConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "固定资产.xls", "数据", FixedAssetsExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入固定资产模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "固定资产基本信息导入模板.xls", "固定资产基本信息列表", FixedAssetsExcelVO.class, list); + } + + @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('eam:fixed-assets:import')") + 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 list = ExcelUtils.read(file, FixedAssetsExcelVO.class); + List errorList = fixedAssetsService.importFixedAssetsList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsBaseVO.java new file mode 100644 index 0000000..18276e1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsBaseVO.java @@ -0,0 +1,84 @@ +package com.win.module.eam.controller.fixedassets.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; + +/** + * 固定资产 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class FixedAssetsBaseVO { + + @Schema(description = "id", example = "13974430952352") + private Long id; + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + private String number; + + @Schema(description = "资产名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") + @NotNull(message = "资产名称不能为空") + private String name; + + @Schema(description = "会计单位") + private String accountingUnit; + + @Schema(description = "规格型号") + private String specifications; + + @Schema(description = "库位编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "库位编号不能为空") + private String locationNumber; + + @Schema(description = "投入使用时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDateTime beginUseDate; +// +// @Schema(description = "采购部门") +// private String purchaseDept; + + @Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED) + private String supplierNumber; + + @Schema(description = "出厂日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDateTime productionDate; + +// @Schema(description = "购买价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "23715") +// private BigDecimal purchasePrice; + + @Schema(description = "管理部门") + private String manageDept; + + @Schema(description = "单位") + private String unit; + + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED) + private BigDecimal qty; + + @Schema(description = "期间费用科目描述") + private String costSubjectDesc; + + @Schema(description = "使用人") + private String user; + + @Schema(description = "状态") + private String status; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "地点ID", example = "27367") + private String siteId; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsCreateReqVO.java new file mode 100644 index 0000000..1a055dc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.fixedassets.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 FixedAssetsCreateReqVO extends FixedAssetsBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsExcelVO.java new file mode 100644 index 0000000..daaea5a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsExcelVO.java @@ -0,0 +1,68 @@ +package com.win.module.eam.controller.fixedassets.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 固定资产 Excel VO + * + * @author 超级管理员 + */ +@Data +public class FixedAssetsExcelVO { + + @ExcelProperty("编号唯一标识") + private String number; + + @ExcelProperty("资产名称") + private String name; + + @ExcelProperty("会计单位") + private String accountingUnit; + + @ExcelProperty("规格型号") + private String specifications; + + @ExcelProperty("库位编号") + private String locationNumber; + + @ExcelProperty("投入使用时间") + private LocalDateTime beginUseDate; + +// @ExcelProperty("采购部门") +// private String purchaseDept; + + @ExcelProperty("供应商编号") + private String supplierNumber; + + @ExcelProperty("出厂日期") + private LocalDateTime productionDate; + +// @ExcelProperty("购买价格") +// private BigDecimal purchasePrice; + + @ExcelProperty("管理部门") + private String manageDept; + + @ExcelProperty("单位") + private String unit; + + @ExcelProperty("数量") + private BigDecimal qty; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsExportReqVO.java new file mode 100644 index 0000000..7b0d66a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsExportReqVO.java @@ -0,0 +1,37 @@ +package com.win.module.eam.controller.fixedassets.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,参数和 FixedAssetsPageReqVO 是一致的") +@Data +public class FixedAssetsExportReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "资产名称", example = "王五") + private String name; + + @Schema(description = "会计单位") + private String accountingUnit; + + @Schema(description = "库位编号") + private String locationNumber; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "是否可用") + private String manageDept; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsPageReqVO.java new file mode 100644 index 0000000..e238b4f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsPageReqVO.java @@ -0,0 +1,42 @@ +package com.win.module.eam.controller.fixedassets.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 FixedAssetsPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "资产名称", example = "王五") + private String name; + + @Schema(description = "会计单位") + private String accountingUnit; + + @Schema(description = "库位编号") + private String locationNumber; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "管理部门") + private String manageDept; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsRespVO.java new file mode 100644 index 0000000..8ee8241 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.eam.controller.fixedassets.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 FixedAssetsRespVO extends FixedAssetsBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsUpdateReqVO.java new file mode 100644 index 0000000..392a6d8 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/fixedassets/vo/FixedAssetsUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.fixedassets.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 FixedAssetsUpdateReqVO extends FixedAssetsBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/homePage/HomePageController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/homePage/HomePageController.java new file mode 100644 index 0000000..e5a415a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/homePage/HomePageController.java @@ -0,0 +1,41 @@ +package com.win.module.eam.controller.homePage; + +import com.win.framework.common.pojo.CommonResult; +import com.win.module.eam.dal.dataobject.yearequipment.BasciYearEquipmentDO; +import com.win.module.eam.service.homePage.HomePageService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import java.util.*; +import static com.win.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 首页") +@RestController +@RequestMapping("/eam/home-page") +@Validated +public class HomePageController { + + + @Resource + private HomePageService homePageService; + @GetMapping("/select") + @Operation(summary = "首页获取三个厂区数据") + public CommonResult> createItemAccounts() { + return success(homePageService.select()); + } + + @GetMapping("/selectYearIndex") + @Operation(summary = "首页获取三个厂区年度指标") + public CommonResult> selectYearIndex() { + return success(homePageService.selectYearIndex()); + } + + @GetMapping("/selectMonthGraphByFactory") + @Operation(summary = "根据厂区获取当年十二个月的曲线图") + public CommonResult> selectMonthGraphByFactory(@RequestParam("factory") String factory) { + return success(homePageService.selectMonthGraphByFactory(factory)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/ItemController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/ItemController.java new file mode 100644 index 0000000..a1bea2b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/ItemController.java @@ -0,0 +1,182 @@ +package com.win.module.eam.controller.item; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.item.vo.*; +import com.win.module.eam.convert.item.ItemConvert; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.service.item.ItemService; +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.HashMap; +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("/eam/item") +@Validated +public class ItemController { + + @Resource + private ItemService itemService; + + @PostMapping("/create") + @Operation(summary = "创建备件") + @PreAuthorize("@ss.hasPermission('basic:item:create')") + public CommonResult createItem(@Valid @RequestBody ItemCreateReqVO createReqVO) { + return success(itemService.createItem(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新备件") + @PreAuthorize("@ss.hasPermission('basic:item:update')") + public CommonResult updateItem(@Valid @RequestBody ItemUpdateReqVO updateReqVO) { + int result = itemService.updateItem(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除备件") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('basic:item:delete')") + public CommonResult deleteItem(@RequestParam("id") Long id) { + int result = itemService.deleteItem(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得备件") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('basic:item:query')") + public CommonResult getItem(@RequestParam("id") Long id) { + ItemDO item = itemService.getItem(id); + return success(ItemConvert.INSTANCE.convert(item)); + } + + @GetMapping("/list") + @Operation(summary = "获得备件列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('basic:item:query')") + public CommonResult> getItemList(@RequestParam("ids") Collection ids) { + List list = itemService.getItemList(ids); + return success(ItemConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得备件分页") +// @PreAuthorize("@ss.hasPermission('basic:item:query')") + public CommonResult> getItemPage(@Valid ItemPageReqVO pageVO) { + PageResult pageResult = itemService.getItemPage(pageVO); + return success(ItemConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出备件 Excel") + @PreAuthorize("@ss.hasPermission('basic:item:export')") + @OperateLog(type = EXPORT) + public void exportItemExcel(@Valid ItemExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = itemService.getItemList(exportReqVO); + Map mapDropDown = new HashMap<>(); + List resultList = this.getExcelVo(list, mapDropDown); + // 导出 Excel + ExcelUtils.write(response, "备件.xls", "数据", ItemExcelVO.class, resultList,mapDropDown); + } + + private List getExcelVo(List list, Map mapDropDown) { +// String[] isConstant = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.TRUE_FALSE); +// mapDropDown.put(4, isConstant); +// String[] uom = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.UOM); +// mapDropDown.put(7, uom); +// String[] category = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.ITEM_CATEGORY); +// mapDropDown.put(8, category); +// String[] classification = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.ABC_CLASS); +// mapDropDown.put(9, classification); +// String[] region = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.ITEM_REGION); +// mapDropDown.put(10, region); +// String[] isRadeIn = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.TRUE_FALSE); +// mapDropDown.put(16, isRadeIn); +// String[] isFramework = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.TRUE_FALSE); +// mapDropDown.put(17, isFramework); +// String[] available = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.TRUE_FALSE); +// mapDropDown.put(18, available); + // 导出 Excel + List resultList = ItemConvert.INSTANCE.convertList02(list); + return resultList; + } + + @GetMapping("/getListByNumber") +// @Operation(summary = "根据设备或模具号查询私有备件+全局备件列表") + @Parameter(name = "number", description = "根据设备或模具号 不传查询全局备件", required = false) + public CommonResult>> getListByNumber(String number,String name) { + return success(itemService.getListByNumber(number,name)); + } + + @GetMapping("/getAppPage") +// @Operation(summary = "根据获取所有的备件分页列表") + public CommonResult> getAppPage(@Valid ItemPageReqVO pageVO) { + PageResult pageResult = itemService.getAppPage(pageVO); + return success(ItemConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/getApplyList") +// @Operation(summary = "获取备件申领所有备件列表信息必须有台账的备件") + public CommonResult> getApplyList() { + return success(itemService.getApplyList()); + } + + @GetMapping("/getItemMaintainList") +// @Operation(summary = "获取备件维修所需备件列表(基础信息全部)") + public CommonResult> getItemMaintainList() { + return success(itemService.getItemMaintainList()); + } + + @GetMapping("/scanCodeByNumber") + @Operation(summary = "备件归还扫备件二维码查询信息") +// @PreAuthorize("@ss.hasPermission('basic:item:query')") + public CommonResult scanCodeByNumber(@RequestParam("number") String number) { + return success(ItemConvert.INSTANCE.convert(itemService.scanCodeByNumber(number))); + } + + @GetMapping("/inScanCodeByNumber") + @Operation(summary = "采购订单入库扫备件码获取库位信息以及关联备件信息") +// @PreAuthorize("@ss.hasPermission('eam:item:query')") + public CommonResult inScanCodeByNumber(@RequestParam("number") String number,@RequestParam("id") Long id) { + return success(ItemConvert.INSTANCE.convert(itemService.inScanCodeByNumber(number,id))); + } + + @PostMapping("/senior") + @Operation(summary = "高级搜索获得账期日历分页") +// @PreAuthorize("@ss.hasPermission('wms:item:query')") + public CommonResult> getItemSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = itemService.getItemSenior(conditions); + PageResult result = ItemConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + @GetMapping("/noPage") + @Operation(summary = "获得备件分页") +// @PreAuthorize("@ss.hasPermission('eam:item:query')") + public CommonResult> getItemNoPage(@Valid ItemPageReqVO pageVO) { + List pageResult = itemService.getItemNoPage(pageVO); + return success(ItemConvert.INSTANCE.convertList(pageResult)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemBaseVO.java new file mode 100644 index 0000000..9f9b441 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemBaseVO.java @@ -0,0 +1,90 @@ +package com.win.module.eam.controller.item.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 备件 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class ItemBaseVO { + + @Schema(description = "id", example = "id") + private Long id; + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + private String number; + + @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "品牌") + private String brand; + + @Schema(description = "规格型号") + private String specifications; + + @Schema(description = "是否存储TRUE/FALSE") + private String isConstant; + + @Schema(description = "科目") + private String subject; + @Schema(description = "科目代码代码枚举工具、易耗品、备品备件、机物料") + private String subjectCode; + + @Schema(description = "类别") + private String category; + + + @Schema(description = "区域") + private String region; + + @Schema(description = "枚举分类 A、B、C") + private String classification; + + @Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "单位不能为空") + private String uom; + + @Schema(description = "单价", example = "29374") + private BigDecimal singlePrice; + + @Schema(description = "重采购点") + private Long reprocurement; + + @Schema(description = "安全库存") + private Long safetyStock; + + @Schema(description = "成本中心") + private String cost; + + @Schema(description = "采购员") + private String purchaser; + + @Schema(description = "财务") + private String financer; + + @Schema(description = "是否框架协议TRUE/FALSE") + private String isFramework; + + @Schema(description = "是否以旧换新TRUE/FALSE") + private String isRadeIn; + + @Schema(description = "描述") + private String describes; + + @Schema(description = "地点ID", example = "1166") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemCreateReqVO.java new file mode 100644 index 0000000..0745cb5 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.item.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 备件创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemCreateReqVO extends ItemBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemExcelVO.java new file mode 100644 index 0000000..af0b047 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemExcelVO.java @@ -0,0 +1,113 @@ +package com.win.module.eam.controller.item.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.eam.enums.DictTypeConstants; +import lombok.Data; + +/** + * 备件 Excel VO + * + * @author 超级管理员 + */ +@Data +public class ItemExcelVO { + + @ExcelProperty("备件编号") + @ColumnWidth(value = 20) + private String number; + + @ExcelProperty("备件名称") + @ColumnWidth(value = 20) + private String name; + + @ExcelProperty("规格型号") + @ColumnWidth(value = 20) + private String specifications; + + @ExcelProperty(value = "是否常储", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + @ColumnWidth(value = 20) + private String isConstant; + + @ExcelProperty(value = "科目", converter = DictConvert.class) + @DictFormat(DictTypeConstants.ITEM_SUBJECT) + @ColumnWidth(value = 20) + private String subject; + + @ExcelProperty("科目代码") + @ColumnWidth(value = 20) + + private String subjectCode; + + @ExcelProperty(value = "单位", converter = DictConvert.class) + @DictFormat(DictTypeConstants.UOM) + @ColumnWidth(value = 20) + private String uom; + + @ExcelProperty(value = "类别", converter = DictConvert.class) + @DictFormat(DictTypeConstants.ITEM_CATEGORY) + @ColumnWidth(value = 20) + private String category; + + @ExcelProperty(value = "备件分类", converter = DictConvert.class) + @DictFormat(DictTypeConstants.CLASSIFICATION) + @ColumnWidth(value = 20) + private String classification; + + @ExcelProperty(value = "区域", converter = DictConvert.class) + @DictFormat(DictTypeConstants.ITEM_REGION) + @ColumnWidth(value = 20) + private String region; + + @ExcelProperty("重采购点") + @ColumnWidth(value = 20) + private Long reprocurement; + + @ExcelProperty("安全库存") + @ColumnWidth(value = 20) + private Long safetyStock; + + @ExcelProperty("成本中心") + @ColumnWidth(value = 20) + private String cost; + + @ExcelProperty("采购员") + @ColumnWidth(value = 20) + private String purchaser; + + @ExcelProperty("财务") + @ColumnWidth(value = 20) + private String financer; + + @ExcelProperty(value = "是否以旧换新", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + @ColumnWidth(value = 20) + private String isRadeIn; + + @ExcelProperty(value = "是否框架协议", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + @ColumnWidth(value = 20) + private String isFramework; + + @ExcelProperty(value = "是否可用", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + @ColumnWidth(value = 20) + private String available; + +// /** +// * 创建时间 +// */ +// @ExcelProperty("创建时间") +// @ColumnWidth(value = 20) +// private LocalDateTime createTime; + + @ExcelProperty("描述") + @ColumnWidth(value = 20) + private String describes; + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemExportReqVO.java new file mode 100644 index 0000000..b50ad23 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemExportReqVO.java @@ -0,0 +1,19 @@ +package com.win.module.eam.controller.item.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 备件 Excel 导出 Request VO,参数和 ItemPageReqVO 是一致的") +@Data +public class ItemExportReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称") + private String name; + + @Schema(description = "名称") + private String available; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemPageReqVO.java new file mode 100644 index 0000000..5c0a6eb --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemPageReqVO.java @@ -0,0 +1,24 @@ +package com.win.module.eam.controller.item.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; + +@Schema(description = "管理后台 - 备件分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称") + private String name; + + @Schema(description = "是否可用") + private String available; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemRespVO.java new file mode 100644 index 0000000..d2dde42 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemRespVO.java @@ -0,0 +1,51 @@ +package com.win.module.eam.controller.item.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +@Schema(description = "管理后台 - 备件 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemRespVO extends ItemBaseVO { + @Schema(description = "备件库存(账内和账外的和)") + private BigDecimal qty; + + @Schema(description = "库位编码") + private String locationNumber; + + @Schema(description = "库区编码") + private String areaNumber; + + @Schema(description = "是否账内账外") + private String isInAccount; + + @Schema(description = "备件编码") + private String itemNumber; + + @Schema(description = "备件名称") + private String itemName; + + @Schema(description = "采购订单已入库数量") + private BigDecimal deliveryQty; + + @Schema(description = "采购订单申请数量") + private BigDecimal applyQty; + + @Schema(description = "描述") + private String describes; + + @Schema(description = "存放库位list") + private List> list; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemUpdateReqVO.java new file mode 100644 index 0000000..3b9563d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/item/vo/ItemUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.eam.controller.item.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.List; + +@Schema(description = "管理后台 - 备件更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemUpdateReqVO extends ItemBaseVO { + private List deviceNumber; + private String itemNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/ItemAccountsController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/ItemAccountsController.java new file mode 100644 index 0000000..278a626 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/ItemAccountsController.java @@ -0,0 +1,188 @@ +package com.win.module.eam.controller.itemaccounts; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.itemaccounts.vo.*; +import com.win.module.eam.convert.itemaccounts.ItemAccountsConvert; +import com.win.module.eam.dal.dataobject.itemaccounts.ItemAccountsDO; +import com.win.module.eam.service.itemaccounts.ItemAccountsService; +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 javax.validation.constraints.NotEmpty; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 备件台账") +@RestController +@RequestMapping("/eam/item-accounts") +@Validated +public class ItemAccountsController { + + @Resource + private ItemAccountsService itemAccountsService; + + @PostMapping("/create") + @Operation(summary = "创建备件台账") + @PreAuthorize("@ss.hasPermission('item:itemAccounts:create')") + public CommonResult createItemAccounts(@Valid @RequestBody ItemAccountsCreateReqVO createReqVO) { + return success(itemAccountsService.createItemAccounts(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新备件台账") + @PreAuthorize("@ss.hasPermission('item:itemAccounts:update')") + public CommonResult updateItemAccounts(@Valid @RequestBody ItemAccountsUpdateReqVO updateReqVO) { + int result = itemAccountsService.updateItemAccounts(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除备件台账") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('item:itemAccounts:delete')") + public CommonResult deleteItemAccounts(@RequestParam("id") Long id) { + int result = itemAccountsService.deleteItemAccounts(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得备件台账") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:item-accounts:query')") + public CommonResult getItemAccounts(@RequestParam("id") Long id) { + ItemAccountsDO itemAccounts = itemAccountsService.getItemAccounts(id); + return success(ItemAccountsConvert.INSTANCE.convert(itemAccounts)); + } + + @GetMapping("/list") + @Operation(summary = "获得备件台账列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:item-accounts:query')") + public CommonResult> getItemAccountsList(@RequestParam("ids") Collection ids) { + List list = itemAccountsService.getItemAccountsList(ids); + return success(ItemAccountsConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得备件台账分页") +// @PreAuthorize("@ss.hasPermission('eam:item-accounts:query')") + public CommonResult> getItemAccountsPage(@Valid ItemAccountsPageReqVO pageVO) { + PageResult pageResult = itemAccountsService.getItemAccountsPage(pageVO); + PageResult result = ItemAccountsConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出备件台账 Excel") + @PreAuthorize("@ss.hasPermission('item:itemAccounts:export')") + @OperateLog(type = EXPORT) + public void exportItemAccountsExcel(@Valid ItemAccountsExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = itemAccountsService.getItemAccountsList(exportReqVO); + // 导出 Excel + List datas = ItemAccountsConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "备件台账.xls", "数据", ItemAccountsExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入备件台账模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "备件台账基本信息导入模板.xls", "备件台账基本信息列表", ItemAccountsExcelVO.class, list); + } + + @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('item:itemAccounts:import')") + 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 list = ExcelUtils.read(file, ItemAccountsExcelVO.class); + List errorList = itemAccountsService.importItemAccountsList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + @GetMapping("/getAppPage") + @Operation(summary = "获得APP备件列表分页 预留") + @Parameters({ + @Parameter(name = "pageSize", description = "每页几条", required = true), + @Parameter(name = "pageNo", description = "第几页", example = "1"), + @Parameter(name = "name", description = "设备名称"), + @Parameter(name = "number", description = "编码"), + @Parameter(name = "type", description = "设备类型"), + }) + public CommonResult> getAppPage(@Valid ItemAccountsPageReqVO pageVO) { + PageResult pageResult = itemAccountsService.getAppPage(pageVO); + return success(ItemAccountsConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/selectAll") + @Operation(summary = "APP查询所有模具不分厂区和正常维修中") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-main:query')") + public CommonResult>> selectAll() { + List> maps = itemAccountsService.selectAll(); + return success(maps); + } + + @PostMapping("/replaceLocation") + @Operation(summary = "备件台账更换库位") + @PreAuthorize("@ss.hasPermission('item:itemAccounts:replaceLocation')") + public CommonResult replaceLocation(@NotEmpty @RequestBody List<@Valid ItemAccountsCreateReqVO> createReqVOList) { + ItemAccountsDO itemAccountsDO = ItemAccountsConvert.INSTANCE.convert(createReqVOList.get(0)); + int result = itemAccountsService.replaceLocation(itemAccountsDO); + return success(result > 0); + } + + @PostMapping("/senior") + @Operation(summary = "高级搜索获得账期日历分页") +// @PreAuthorize("@ss.hasPermission('wms:location:query')") + public CommonResult> getLocationSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = itemAccountsService.getItemAccountsSenior(conditions); + PageResult result = ItemAccountsConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + + @GetMapping("/noPage") + @Operation(summary = "获得备件分页") +// @PreAuthorize("@ss.hasPermission('eam:item:query')") + public CommonResult> getItemNoPage(@Valid ItemAccountsPageReqVO pageVO) { + List pageResult = itemAccountsService.getItemAccountsNoPage(pageVO); + return success(ItemAccountsConvert.INSTANCE.convertList(pageResult)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsBaseVO.java new file mode 100644 index 0000000..7683774 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsBaseVO.java @@ -0,0 +1,164 @@ +package com.win.module.eam.controller.itemaccounts.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 备件台账 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class ItemAccountsBaseVO { + + @Schema(description = "id") + private Long id; + + @Schema(description = "备件编号", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "备件编号不能为空") + private String itemNumber; + + @Schema(description = "库区编号", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "库区编号不能为空") + private String areaNumber; + + @Schema(description = "库位编号", requiredMode = Schema.RequiredMode.REQUIRED) +// @NotNull(message = "库位编号不能为空") + private String locationNumber; + + @Schema(description = "库存数量") + private BigDecimal qty; + + @Schema(description = "是否账内库TRUE账内FALSE账外", example = "6680") + private String isInAccount; + /** + * 名称 + */ + @Schema(description = "名称") + private String name; + /** + * 品牌 + */ + @Schema(description = "品牌") + private String brand; + /** + * 规格型号 + */ + @Schema(description = "规格型号") + private String specifications; + /** + * 是否常储TRUE/FALSE + */ + @Schema(description = "是否常储") + private String isConstant; + + /** + * 是否全局TRUE/FALSE + */ + @Schema(description = "是否全局") + private String isOverall; + /** + * 科目代码枚举工具、易耗品、机物料、备品备件、辅材 + */ + @Schema(description = "科目代码") + private String subject; + /** + * 科目代码 + */ + @Schema(description = "科目代码") + private String subjectCode; + /** + * 区域 + */ + @Schema(description = "区域") + private String region; + + /** + * 枚举分类 A、B、C + */ + @Schema(description = "分类") + private String classification; + /** + * 单位 + */ + @Schema(description = "单位") + private String uom; + /** + * 单价 + */ + @Schema(description = "单价") + private BigDecimal singlePrice; + /** + * 重点采购 + */ + @Schema(description = "重点采购") + private Long reprocurement; + /** + * 安全库存 + */ + @Schema(description = "安全库存") + private Long safetyStock; + /** + * 成本中心 + */ + @Schema(description = "成本中心") + private String cost; + /** + * 采购员 + */ + @Schema(description = "采购员") + private String purchaser; + /** + * 财务 + */ + @Schema(description = "财务") + private String financer; + /** + * 是否框架协议TRUE/FALSE + */ + @Schema(description = "是否框架协议") + private String isFramework; + /** + * 是否以旧换新TRUE/FALSE + */ + @Schema(description = "是否以旧换新") + private String isRadeIn; + /** + * 是否可用 + */ + @Schema(description = "是否可用") + private String itemAvailable; + /** + * 采购时间 + */ + @Schema(description = "采购时间") + private LocalDateTime purchaseTime; + + /** + * 库龄 + */ + @Schema(description = "库龄") + private Long stockAge; + /** + * 类别 + */ + @Schema(description = "类别") + private String category; + /** + * 描述 + */ + @Schema(description = "描述") + private String describes; + + @Schema(description = "地点ID", example = "29301") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsCreateReqVO.java new file mode 100644 index 0000000..a081edb --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.itemaccounts.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 ItemAccountsCreateReqVO extends ItemAccountsBaseVO { + private Long id; +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsExcelVO.java new file mode 100644 index 0000000..ae8767e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsExcelVO.java @@ -0,0 +1,44 @@ +package com.win.module.eam.controller.itemaccounts.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 备件台账 Excel VO + * + * @author 超级管理员 + */ +@Data +public class ItemAccountsExcelVO { + + @ExcelProperty("备件编号") + private String itemNumber; + + @ExcelProperty("库区编号") + private String areaNumber; + + @ExcelProperty("库位编号") + private String locationNumber; + + @ExcelProperty("库存数量") + private BigDecimal qty; + + @ExcelProperty("是否账内库TRUE账内FALSE账外") + private String isInAccount; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsExportReqVO.java new file mode 100644 index 0000000..dbbed2b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsExportReqVO.java @@ -0,0 +1,15 @@ +package com.win.module.eam.controller.itemaccounts.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,参数和 ItemAccountsPageReqVO 是一致的") +@Data +public class ItemAccountsExportReqVO { + + @Schema(description = "备件编号") + private String itemNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsPageReqVO.java new file mode 100644 index 0000000..fe6656f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsPageReqVO.java @@ -0,0 +1,24 @@ +package com.win.module.eam.controller.itemaccounts.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; + +@Schema(description = "管理后台 - 备件台账分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemAccountsPageReqVO extends PageParam { + + @Schema(description = "id") + private Long id; + + @Schema(description = "备件编号") + private String itemNumber; + + @Schema(description = "是否可用") + private String available; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsRespVO.java new file mode 100644 index 0000000..354cdc2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.eam.controller.itemaccounts.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 ItemAccountsRespVO extends ItemAccountsBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsUpdateReqVO.java new file mode 100644 index 0000000..b26b3e0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemaccounts/vo/ItemAccountsUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.itemaccounts.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 备件台账更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemAccountsUpdateReqVO extends ItemAccountsBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/ItemApplyRequestDetailController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/ItemApplyRequestDetailController.java new file mode 100644 index 0000000..59a76e3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/ItemApplyRequestDetailController.java @@ -0,0 +1,138 @@ +package com.win.module.eam.controller.itemapplyrequest; + +import com.win.module.eam.controller.itemapplyrequest.vo.*; +import com.win.module.eam.convert.itemapplyrequest.ItemApplyRequestDetailConvert; +import com.win.module.eam.dal.dataobject.itemapplyrequest.ItemApplyRequestDetailDO; +import io.swagger.v3.oas.annotations.Parameters; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +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.*; +import javax.servlet.http.*; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.*; +import java.io.IOException; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.pojo.CommonResult; +import static com.win.framework.common.pojo.CommonResult.success; + +import com.win.framework.excel.core.util.ExcelUtils; + +import com.win.framework.operatelog.core.annotations.OperateLog; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.win.module.eam.service.itemapplyrequest.ItemApplyRequestDetailService; +import org.springframework.web.multipart.MultipartFile; + +@Tag(name = "管理后台 - 备件申领记录子") +@RestController +@RequestMapping("/eam/item-apply-request-detail") +@Validated +public class ItemApplyRequestDetailController { + + @Resource + private ItemApplyRequestDetailService itemApplyRequestDetailService; + + @PostMapping("/create") + @Operation(summary = "创建备件申领记录子") + //@PreAuthorize("@ss.hasPermission('eam:item-apply-request-detail:create')") + public CommonResult createItemApplyDetail(@Valid @RequestBody ItemApplyRequestDetailCreateReqVO createReqVO) { + return success(itemApplyRequestDetailService.createItemApplyDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新备件申领记录子") + //@PreAuthorize("@ss.hasPermission('eam:item-apply-request-detail:update')") + public CommonResult updateItemApplyDetail(@Valid @RequestBody ItemApplyRequestDetailUpdateReqVO updateReqVO) { + int result = itemApplyRequestDetailService.updateItemApplyDetail(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除备件申领记录子") + @Parameter(name = "id", description = "编号", required = true) + //@PreAuthorize("@ss.hasPermission('eam:item-apply-request-detail:delete')") + public CommonResult deleteItemApplyDetail(@RequestParam("id") Long id) { + int result = itemApplyRequestDetailService.deleteItemApplyDetail(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得备件申领记录子") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:item-apply-request-detail:query')") + public CommonResult getItemApplyDetail(@RequestParam("id") Long id) { + ItemApplyRequestDetailDO itemApplyDetail = itemApplyRequestDetailService.getItemApplyDetail(id); + return success(ItemApplyRequestDetailConvert.INSTANCE.convert(itemApplyDetail)); + } + + @GetMapping("/list") + @Operation(summary = "获得备件申领记录子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:item-apply-request-detail:query')") + public CommonResult> getItemApplyDetailList(@RequestParam("ids") Collection ids) { + List list = itemApplyRequestDetailService.getItemApplyDetailList(ids); + return success(ItemApplyRequestDetailConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得备件申领记录子分页") + //@PreAuthorize("@ss.hasPermission('eam:item-apply-request-detail:query')") + public CommonResult> getItemApplyDetailPage(@Valid ItemApplyRequestDetailPageReqVO pageVO) { + PageResult pageResult = itemApplyRequestDetailService.getItemApplyDetailPage(pageVO); + return success(ItemApplyRequestDetailConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出备件申领记录子 Excel") + //@PreAuthorize("@ss.hasPermission('eam:item-apply-request-detail:export')") + @OperateLog(type = EXPORT) + public void exportItemApplyDetailExcel(@Valid ItemApplyRequestDetailExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = itemApplyRequestDetailService.getItemApplyDetailList(exportReqVO); + // 导出 Excel + List datas = ItemApplyRequestDetailConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "备件申领记录子.xls", "数据", ItemApplyRequestDetailExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入备件申领记录子模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "备件申领记录子基本信息导入模板.xls", "备件申领记录子基本信息列表", ItemApplyRequestDetailExcelVO.class, list); + } + + @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('eam:item-apply-request-detail:import')") + 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 list = ExcelUtils.read(file, ItemApplyRequestDetailExcelVO.class); + List errorList = itemApplyRequestDetailService.importItemApplyDetailList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/ItemApplyRequestMainController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/ItemApplyRequestMainController.java new file mode 100644 index 0000000..15ba54a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/ItemApplyRequestMainController.java @@ -0,0 +1,279 @@ +package com.win.module.eam.controller.itemapplyrequest; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.itemapplyrequest.vo.*; +import com.win.module.eam.convert.itemapplyrequest.ItemApplyRequestMainConvert; +import com.win.module.eam.dal.dataobject.itemapplyrequest.ItemApplyRequestMainDO; +import com.win.module.eam.enums.request.RequestStatusEnum; +import com.win.module.eam.service.itemapplyrequest.ItemApplyRequestMainService; +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.Collection; +import java.util.HashMap; +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("/eam/item-apply-request-main") +@Validated +public class ItemApplyRequestMainController { + + @Resource + private ItemApplyRequestMainService itemApplyRequestMainService; + + @PostMapping("/create") + @Operation(summary = "创建备件申领记录主") + @PreAuthorize("@ss.hasPermission('item:itemApplyMain:create')") + public CommonResult createItemApplyMain(@Valid @RequestBody ItemApplyRequestMainCreateReqVO createReqVO) { + return success(itemApplyRequestMainService.createItemApplyMain(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新备件申领记录主") + @PreAuthorize("@ss.hasPermission('item:itemApplyMain:update')") + public CommonResult updateItemApplyMain(@Valid @RequestBody ItemApplyRequestMainUpdateReqVO updateReqVO) { + int result = itemApplyRequestMainService.updateItemApplyMain(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除备件申领记录主") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('item:itemApplyMain:delete')") + public CommonResult deleteItemApplyMain(@RequestParam("id") Long id) { + int result = itemApplyRequestMainService.deleteItemApplyMain(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得备件申领记录主") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:item-apply-request-main:query')") + public CommonResult getItemApplyMain(@RequestParam("id") Long id) { + ItemApplyRequestMainDO itemApplyMain = itemApplyRequestMainService.getItemApplyMain(id); + return success(ItemApplyRequestMainConvert.INSTANCE.convert(itemApplyMain)); + } + + @GetMapping("/list") + @Operation(summary = "获得备件申领记录主列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:item-apply-request-main:query')") + public CommonResult> getItemApplyMainList(@RequestParam("ids") Collection ids) { + List list = itemApplyRequestMainService.getItemApplyMainList(ids); + return success(ItemApplyRequestMainConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得备件申领记录主分页") + //@PreAuthorize("@ss.hasPermission('eam:item-apply-request-main:query')") + public CommonResult> getItemApplyMainPage(@Valid ItemApplyRequestMainPageReqVO pageVO) { + PageResult pageResult = itemApplyRequestMainService.getItemApplyMainPage(pageVO); + return success(ItemApplyRequestMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出备件申领记录主 Excel") + @PreAuthorize("@ss.hasPermission('eam:item-apply-request-main:export')") + @OperateLog(type = EXPORT) + public void exportItemApplyMainExcel(@Valid ItemApplyRequestMainExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = itemApplyRequestMainService.getItemApplyMainList(exportReqVO); + // 导出 Excel + List datas = ItemApplyRequestMainConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "备件申领记录主.xls", "数据", ItemApplyRequestMainExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入备件申领记录主模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = List.of(); + // 输出 + ExcelUtils.write(response, "备件申领记录主基本信息导入模板.xls", "备件申领记录主基本信息列表", ItemApplyRequestMainExcelVO.class, list); + } + + @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('eam:item-apply-request-main:import')") + 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 list = ExcelUtils.read(file, ItemApplyRequestMainExcelVO.class); + List errorList = itemApplyRequestMainService.importItemApplyMainList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + @GetMapping("/cancel") + @Operation(summary = "在未审批前撤销申领") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:item-apply-request-main:cancel') or @ss.hasPermission('eam:item-apply-request-main:cancelAPP')") + public CommonResult cancel(@RequestParam("id") Long id) { + int result = itemApplyRequestMainService.cancel(id); + return success(result > 0); + } + + @GetMapping("/backout") + @Operation(summary = "撤销") + @Parameters({ + @Parameter(name = "id", description = "id", required = true), + }) + @PreAuthorize("@ss.hasPermission('item:itemApplyMain:backout')") + public CommonResult backout(@RequestParam("id") Long id) { + int result = itemApplyRequestMainService.backout(id); + return success(result > 0); + } + + @GetMapping("/approve") + @Operation(summary = "审批角色审批备件申领") + @Parameters({ + @Parameter(name = "id", description = "id", required = true), + @Parameter(name = "status", description = "1审批通过2审批驳回", required = true), + }) + @PreAuthorize("@ss.hasPermission('item:itemApplyMain:approve') or @ss.hasPermission('item:itemApplyMain:approveAPP')") + public CommonResult approve(@RequestParam("id") Long id, @RequestParam("status") String status) { + int result = itemApplyRequestMainService.approve(id, status); + return success(result > 0); + } + + @PostMapping("/outOperation") + @Operation(summary = "出库操作") + @Parameters({ + @Parameter(name = "id", description = "主单id", required = true), + @Parameter(name = "List> itemNumbers", description = "子单列表", required = true), + @Parameter(name = "itemNumber", description = "零件号", required = true), + @Parameter(name = "locationNumber", description = "库位号", required = true), + @Parameter(name = "describes", description = "描述", required = false), + }) + @PreAuthorize("@ss.hasPermission('eam:item-apply-record-main:outOperation') or @ss.hasPermission('eam:item-apply-record-main:outOperationAPP')") + public CommonResult outOperation(@RequestBody ItemApplyRequestMainCreateReqVO reqVO) { + int result = itemApplyRequestMainService.outOperation(reqVO); + return success(result > 0); + } + + @GetMapping("/appGetByNumber") + @Operation(summary = "app根据申领number获取申领详情信息") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:item-apply-request-main:query')") + public CommonResult> appGetByNumber(@RequestParam("number") String number) { + Map list = itemApplyRequestMainService.appGetByNumber(number); + return success(list); + } + + @GetMapping("/getAppPage") + @Operation(summary = "获取备件申领工单列表分页") + public CommonResult> getAppPage(@Valid ItemApplyRequestMainPageReqVO pageVO) { + PageResult pageResult = itemApplyRequestMainService.getAppPage(pageVO); + return success(ItemApplyRequestMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/agree") + @Operation(summary = "审批通过") + @Parameter(name = "id", description = "编号", required = true) + //@PreAuthorize("@ss.hasPermission('wms:purchase-main:close')") + public CommonResult agree(@RequestParam("id") Long id) { + String status = RequestStatusEnum.ITEM_APPLY_1.getCode(); + Integer count = itemApplyRequestMainService.approve(id, status); + return success(count > 0); + } + + @GetMapping("/disAgree") + @Operation(summary = "审批驳回") + @Parameter(name = "id", description = "编号", required = true) + //@PreAuthorize("@ss.hasPermission('wms:purchase-main:close')") + public CommonResult disAgree(@RequestParam("id") Long id) { + String status = RequestStatusEnum.ITEM_APPLY_2.getCode(); + Integer count = itemApplyRequestMainService.approve(id, status); + return success(count > 0); + } + + @GetMapping("/getAppApprovePage") + @Operation(summary = "获取备件审批列表分页一级权限") + @PreAuthorize("@ss.hasPermission('eam:item-apply-request-main:role1') or @ss.hasPermission('eam:item-apply-request-main:role1APP')") + public CommonResult> getAppApprovePage(@Valid ItemApplyRequestMainPageReqVO pageVO) { + pageVO.setRole("1"); + PageResult pageResult = itemApplyRequestMainService.getAppApprovePage(pageVO); + return success(ItemApplyRequestMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/getAppApprovePage1") + @Operation(summary = "获取备件审批列表分页二级权限") + @PreAuthorize("@ss.hasPermission('eam:item-apply-request-main:role0') or @ss.hasPermission('eam:item-apply-request-main:role0APP')") + public CommonResult> getAppApprovePage1(@Valid ItemApplyRequestMainPageReqVO pageVO) { + pageVO.setRole("0"); + PageResult pageResult = itemApplyRequestMainService.getAppApprovePage(pageVO); + return success(ItemApplyRequestMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/getAppOutOperaPage") + @Operation(summary = "获取备件出库列表分页") + //@PreAuthorize("@ss.hasPermission('eam:item-apply-record-main:query')") + public CommonResult> getAppOutOperaPage(@Valid ItemApplyRequestMainPageReqVO pageVO) { + PageResult pageResult = itemApplyRequestMainService.getAppOutOperaPage(pageVO); + return success(ItemApplyRequestMainConvert.INSTANCE.convertPage(pageResult)); + } + + @PostMapping("/inOperation") + @Operation(summary = "备件归还操作") + @Parameters({ + @Parameter(name = "itemNumber", description = "零件号", required = true), + @Parameter(name = "locationNumber", description = "库位号", required = true), + @Parameter(name = "areaNumber", description = "库区号", required = true), + @Parameter(name = "isInAccount", description = "是否账内账外库", required = true), + @Parameter(name = "itemNumbers", description = "列表", required = true), + @Parameter(name = "qty", description = "归还数量", required = true), + @Parameter(name = "reverterId", description = "归还人id", required = true), + @Parameter(name = "describes", description = "描述", required = false), + }) + @PreAuthorize("@ss.hasPermission('eam:item-apply-record-main:inOperation') or @ss.hasPermission('eam:item-apply-record-main:inOperationAPP')") + public CommonResult inOperation(@RequestBody ItemApplyRequestMainCreateReqVO reqVO) { + int result = itemApplyRequestMainService.inOperation(reqVO); + return success(result > 0); + } + + @PostMapping("/senior") + @Operation(summary = "高级搜索获得账期日历分页") + //@PreAuthorize("@ss.hasPermission('wms:location:query')") + public CommonResult> getLocationSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = itemApplyRequestMainService.getItemApplyRequestMainSenior(conditions); + PageResult result = ItemApplyRequestMainConvert.INSTANCE.convertPage(pageResult); + + return success(result); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailBaseVO.java new file mode 100644 index 0000000..fd657f1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailBaseVO.java @@ -0,0 +1,74 @@ +package com.win.module.eam.controller.itemapplyrequest.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + * 备件申领记录子 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class ItemApplyRequestDetailBaseVO { + @Schema(description = "id") + private Long id; + @Schema(description = "主id") + private Long masterId; + + @Schema(description = "申领主代码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "申领主代码不能为空") + private String number; + + @Schema(description = "备件代码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "备件代码不能为空") + private String itemNumber; + + /** + * 维修申领、以旧换新字典 + */ + @Schema(description = "是否以旧换新TRUE/FALSE", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "是否以旧换新TRUE/FALSE不能为空") + private String isRadeIn; + + @Schema(description = "申请数量", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "数量不能为空") + private BigDecimal qty; + + @Schema(description = "库存数量", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "库存数量不能为空") + private BigDecimal currentQty; + + @Schema(description = "地点ID", example = "11025") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "并发乐观锁不能为空") + private Integer concurrencyStamp; + + @Schema(description = "设备模具") + private String deviceNumber; + + @Schema(description = "设备模具类型") + private String type; + + @Schema(description = "接收结果") + private String result; + + @Schema(description = "备件列表包含备件编码 申请数量 库存数量 设备模具编号 设备模具类型") + private List> itemNumbers; + @Schema(description = "出库接收值") + private BigDecimal receiveQty; + + @Schema(description = "备件台账申领时的价格") + private BigDecimal currentSinglePrice; + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailCreateReqVO.java new file mode 100644 index 0000000..045411a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.itemapplyrequest.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 备件申领记录子创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemApplyRequestDetailCreateReqVO extends ItemApplyRequestDetailBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailExcelVO.java new file mode 100644 index 0000000..2870095 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailExcelVO.java @@ -0,0 +1,47 @@ +package com.win.module.eam.controller.itemapplyrequest.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 备件申领记录子 Excel VO + * + * @author 超级管理员 + */ +@Data +public class ItemApplyRequestDetailExcelVO { + + @ExcelProperty("id") + private Long id; + + @ExcelProperty("申领主代码") + private String number; + + @ExcelProperty("备件代码") + private String itemNumber; + + @ExcelProperty("是否以旧换新TRUE/FALSE") + private String isRadeIn; + + @ExcelProperty("数量") + private BigDecimal qty; + + @ExcelProperty("库存数量") + private BigDecimal currentQty; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailExportReqVO.java new file mode 100644 index 0000000..aece7f3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailExportReqVO.java @@ -0,0 +1,44 @@ +package com.win.module.eam.controller.itemapplyrequest.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +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,参数和 ItemApplyDetailPageReqVO 是一致的") +@Data +public class ItemApplyRequestDetailExportReqVO { + + @Schema(description = "申领主代码") + private String number; + + @Schema(description = "备件代码") + private String itemNumber; + + @Schema(description = "数量") + private BigDecimal qty; + + @Schema(description = "是否以旧换新TRUE/FALSE") + private String isRadeIn; + + @Schema(description = "库存数量") + private BigDecimal currentQty; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "地点ID", example = "11025") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailPageReqVO.java new file mode 100644 index 0000000..7a33339 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailPageReqVO.java @@ -0,0 +1,51 @@ +package com.win.module.eam.controller.itemapplyrequest.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.math.BigDecimal; +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 ItemApplyRequestDetailPageReqVO extends PageParam { + + @Schema(description = "申领主代码") + private String number; + + @Schema(description = "备件代码") + private String itemNumber; + + @Schema(description = "是否以旧换新TRUE/FALSE") + private String isRadeIn; + + @Schema(description = "数量") + private BigDecimal qty; + + @Schema(description = "库存数量") + private BigDecimal currentQty; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "地点ID", example = "11025") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + + private Long masterId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailRespVO.java new file mode 100644 index 0000000..8e97dd6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.eam.controller.itemapplyrequest.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 ItemApplyRequestDetailRespVO extends ItemApplyRequestDetailBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "8884") + private Long id; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailUpdateReqVO.java new file mode 100644 index 0000000..82b303d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestDetailUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.eam.controller.itemapplyrequest.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 ItemApplyRequestDetailUpdateReqVO extends ItemApplyRequestDetailBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "8884") + @NotNull(message = "id不能为空") + private Long id; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainBaseVO.java new file mode 100644 index 0000000..c964274 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainBaseVO.java @@ -0,0 +1,73 @@ +package com.win.module.eam.controller.itemapplyrequest.vo; + +import com.win.framework.excel.core.annotations.SubObject; +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.List; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** + * 备件申领记录主 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class ItemApplyRequestMainBaseVO { + + @Schema(description = "id") + private Long id; + + @Schema(description = "描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @NotNull(message = "描述不能为空") + private String name; + + @Schema(description = "审批时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime approveTime; + + @Schema(description = "出库时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime outTime; + + @Schema(description = "地点ID", example = "28729") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer concurrencyStamp; + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + private String number; + + @Schema(description = "申领人id", example = "5808") + private String applyId; + + @Schema(description = "申领人部门id", example = "23065") + private String applyDeptId; + + @Schema(description = "审批人id", example = "16054") + private String approveId; + + @Schema(description = "出库人id", example = "22203") + private String outId; + + @Schema(description = "申领状态", example = "22203") + private String status; + + @Schema(description = "申领状态名称", example = "22203") + private String statusName; + + @Schema(description = "描述", example = "22203") + private String describes; + + @SubObject + @Schema(description = "子表数据") + private List subList; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainCreateReqVO.java new file mode 100644 index 0000000..c41bbbe --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainCreateReqVO.java @@ -0,0 +1,43 @@ +package com.win.module.eam.controller.itemapplyrequest.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +@Schema(description = "管理后台 - 备件申领记录主创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemApplyRequestMainCreateReqVO extends ItemApplyRequestMainBaseVO { + + @Schema(description = "备件和数量") + private List> itemNumbers; + + @Schema(description = "备件号") + private String itemNumber; + + @Schema(description = "库位号") + private String locationNumber; + + @Schema(description = "库区号") + private String areaNumber; + + @Schema(description = "是否账内账外库") + private String isInAccount; + + @Schema(description = "归还数量") + private BigDecimal qty; + + @Schema(description = "备件归还人id") + private String reverterId; + + @Schema(description = "备件出库事务描述信息") + private String describes; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainExcelVO.java new file mode 100644 index 0000000..7591b61 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainExcelVO.java @@ -0,0 +1,53 @@ +package com.win.module.eam.controller.itemapplyrequest.vo; + +import lombok.*; + +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 备件申领记录主 Excel VO + * + * @author 超级管理员 + */ +@Data +public class ItemApplyRequestMainExcelVO { + + @ExcelProperty("描述") + private String name; + + @ExcelProperty("审批时间") + private LocalDateTime approveTime; + + @ExcelProperty("出库时间") + private LocalDateTime outTime; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + + @ExcelProperty("编号唯一标识") + private String number; + + @ExcelProperty("申领人id") + private String applyId; + + @ExcelProperty("申领人部门id") + private String applyDeptId; + + @ExcelProperty("审批人id") + private String approveId; + + @ExcelProperty("出库人id") + private String outId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainExportReqVO.java new file mode 100644 index 0000000..b5cbf1d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainExportReqVO.java @@ -0,0 +1,38 @@ +package com.win.module.eam.controller.itemapplyrequest.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +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,参数和 ItemApplyMainPageReqVO 是一致的") +@Data +public class ItemApplyRequestMainExportReqVO { + + @Schema(description = "出库时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] outTime; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "申领人id", example = "5808") + private String applyId; + + @Schema(description = "申领人部门id", example = "23065") + private String applyDeptId; + + @Schema(description = "审批人id", example = "16054") + private String approveId; + + @Schema(description = "出库人id", example = "22203") + private String outId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainPageReqVO.java new file mode 100644 index 0000000..5ceeebd --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainPageReqVO.java @@ -0,0 +1,59 @@ +package com.win.module.eam.controller.itemapplyrequest.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 ItemApplyRequestMainPageReqVO extends PageParam { + + @Schema(description = "出库时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] outTime; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "申领人id", example = "5808") + private String applyId; + + @Schema(description = "申领人部门id", example = "23065") + private String applyDeptId; + + @Schema(description = "审批人id", example = "16054") + private String approveId; + + @Schema(description = "出库人id", example = "22203") + private String outId; + + @Schema(description = "状态", example = "22203") + private String status; + + @Schema(description = "0工单1我的申领2我的审批", example = "2") + private String flag; + + @Schema(description = "我的用户", example = "2") + private String userId; + + @Schema(description = "描述", example = "1") + private String describes; + + @Schema(description = "名称", example = "1") + private String name; + + @Schema(description = "角色0普通审批人员1车间主任", example = "1") + private String role; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainRespVO.java new file mode 100644 index 0000000..f14983c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainRespVO.java @@ -0,0 +1,34 @@ +package com.win.module.eam.controller.itemapplyrequest.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 ItemApplyRequestMainRespVO extends ItemApplyRequestMainBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "申领状态名称") + private String statusName; + + @Schema(description = "描述") + private String describes; + + @Schema(description = "描述") + private String applyDeptName; + + @Schema(description = "申领人名称") + private String applyName; + + @Schema(description = "审批人名称") + private String approveName; + + @Schema(description = "出库人名称") + private String outName; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainUpdateReqVO.java new file mode 100644 index 0000000..9f5feb2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemapplyrequest/vo/ItemApplyRequestMainUpdateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.itemapplyrequest.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Schema(description = "管理后台 - 备件申领记录主更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemApplyRequestMainUpdateReqVO extends ItemApplyRequestMainBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/ItemInLocationController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/ItemInLocationController.java new file mode 100644 index 0000000..be7e59c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/ItemInLocationController.java @@ -0,0 +1,117 @@ +package com.win.module.eam.controller.iteminlocation; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.iteminlocation.vo.*; +import com.win.module.eam.convert.iteminlocation.ItemInLocationConvert; +import com.win.module.eam.dal.dataobject.iteminlocation.ItemInLocationDO; +import com.win.module.eam.service.iteminlocation.ItemInLocationService; +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.Arrays; +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("/eam/item-in-location") +@Validated +public class ItemInLocationController { + + @Resource + private ItemInLocationService itemInLocationService; + + @PostMapping("/create") + @Operation(summary = "创建备件入库记录") + @PreAuthorize("@ss.hasPermission('item:itemInLocation:create')") + public CommonResult createItemInLocation(@Valid @RequestBody ItemInLocationCreateReqVO createReqVO) { + return success(itemInLocationService.createItemInLocation(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新备件入库记录") + @PreAuthorize("@ss.hasPermission('item:itemInLocation:update')") + public CommonResult updateItemInLocation(@Valid @RequestBody ItemInLocationUpdateReqVO updateReqVO) { + int result = itemInLocationService.updateItemInLocation(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除备件入库记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('item:itemInLocation:delete')") + public CommonResult deleteItemInLocation(@RequestParam("id") Long id) { + int result = itemInLocationService.deleteItemInLocation(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得备件入库记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('record:item-in-location:query')") + public CommonResult getItemInLocation(@RequestParam("id") Long id) { + ItemInLocationDO itemInLocation = itemInLocationService.getItemInLocation(id); + return success(ItemInLocationConvert.INSTANCE.convert(itemInLocation)); + } + + @GetMapping("/list") + @Operation(summary = "获得备件入库记录列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('record:item-in-location:query')") + public CommonResult> getItemInLocationList(@RequestParam("ids") Collection ids) { + List list = itemInLocationService.getItemInLocationList(ids); + return success(ItemInLocationConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得备件入库记录分页") + //@PreAuthorize("@ss.hasPermission('record:item-in-location:query')") + public CommonResult> getItemInLocationPage(@Valid ItemInLocationPageReqVO pageVO) { + PageResult pageResult = itemInLocationService.getItemInLocationPage(pageVO); + return success(ItemInLocationConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出备件入库记录 Excel") + @PreAuthorize("@ss.hasPermission('item:itemInLocation:export')") + @OperateLog(type = EXPORT) + public void exportItemInLocationExcel(@Valid ItemInLocationExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = itemInLocationService.getItemInLocationList(exportReqVO); + // 导出 Excel + List datas = ItemInLocationConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "备件入库记录.xls", "数据", ItemInLocationExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入备件入库记录模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "备件入库记录基本信息导入模板.xls", "备件入库记录基本信息列表", ItemInLocationExcelVO.class, list); + } + + @PostMapping("/senior") + @Operation(summary = "高级搜索获得账期日历分页") + //@PreAuthorize("@ss.hasPermission('wms:location:query')") + public CommonResult> getLocationSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = itemInLocationService.getItemInLocationSenior(conditions); + PageResult result = ItemInLocationConvert.INSTANCE.convertPage(pageResult); + return success(result); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationBaseVO.java new file mode 100644 index 0000000..a4a22ff --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationBaseVO.java @@ -0,0 +1,36 @@ +package com.win.module.eam.controller.iteminlocation.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 备件入库记录 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class ItemInLocationBaseVO { + + private Long id; + + @Schema(description = "入库编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "入库编号不能为空") + private String number; + + @Schema(description = "备件编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "备件编号不能为空") + private String itemNumber; + + @Schema(description = "库位编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "库位编号不能为空") + private String locationNumber; + + @Schema(description = "入库类型", example = "1") + private String type; + + @Schema(description = "数量") + private BigDecimal qty; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationCreateReqVO.java new file mode 100644 index 0000000..e76c882 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.iteminlocation.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 备件入库记录创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemInLocationCreateReqVO extends ItemInLocationBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationExcelVO.java new file mode 100644 index 0000000..2919502 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationExcelVO.java @@ -0,0 +1,35 @@ +package com.win.module.eam.controller.iteminlocation.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 备件入库记录 Excel VO + * + * @author 超级管理员 + */ +@Data +public class ItemInLocationExcelVO { + + @ExcelProperty("入库编号") + private String number; + + @ExcelProperty("备件编号") + private String itemNumber; + + @ExcelProperty("库位编号") + private String locationNumber; + + @ExcelProperty("入库类型") + private String type; + + @ExcelProperty("数量") + private BigDecimal qty; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationExportReqVO.java new file mode 100644 index 0000000..483f03c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationExportReqVO.java @@ -0,0 +1,30 @@ +package com.win.module.eam.controller.iteminlocation.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 备件入库记录 Excel 导出 Request VO,参数和 ItemInLocationPageReqVO 是一致的") +@Data +public class ItemInLocationExportReqVO { + + @Schema(description = "id", example = "31273") + private Long id; + + @Schema(description = "入库编号") + private String number; + + @Schema(description = "备件编号") + private String itemNumber; + + @Schema(description = "库位编号") + private String locationNumber; + + @Schema(description = "入库类型", example = "1") + private String type; + + @Schema(description = "数量") + private BigDecimal qty; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationPageReqVO.java new file mode 100644 index 0000000..f006e84 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationPageReqVO.java @@ -0,0 +1,35 @@ +package com.win.module.eam.controller.iteminlocation.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 java.math.BigDecimal; + +@Schema(description = "管理后台 - 备件入库记录分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemInLocationPageReqVO extends PageParam { + + @Schema(description = "id", example = "31273") + private Long id; + + @Schema(description = "入库编号") + private String number; + + @Schema(description = "备件编号") + private String itemNumber; + + @Schema(description = "库位编号") + private String locationNumber; + + @Schema(description = "入库类型", example = "1") + private String type; + + @Schema(description = "数量") + private BigDecimal qty; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationRespVO.java new file mode 100644 index 0000000..d68972f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationRespVO.java @@ -0,0 +1,13 @@ +package com.win.module.eam.controller.iteminlocation.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 ItemInLocationRespVO extends ItemInLocationBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationUpdateReqVO.java new file mode 100644 index 0000000..a2f77a7 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/iteminlocation/vo/ItemInLocationUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.iteminlocation.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 ItemInLocationUpdateReqVO extends ItemInLocationBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/ItemLocationReplaceController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/ItemLocationReplaceController.java new file mode 100644 index 0000000..cd21e18 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/ItemLocationReplaceController.java @@ -0,0 +1,114 @@ +package com.win.module.eam.controller.itemlocationreplace; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.itemlocationreplace.vo.*; +import com.win.module.eam.convert.itemlocationreplace.ItemLocationReplaceConvert; +import com.win.module.eam.dal.dataobject.itemlocationreplace.ItemLocationReplaceDO; +import com.win.module.eam.service.itemlocationreplace.ItemLocationReplaceService; +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.Arrays; +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("/eam/item-location-replace") +@Validated +public class ItemLocationReplaceController { + + @Resource + private ItemLocationReplaceService itemLocationReplaceService; + + @PostMapping("/create") + @Operation(summary = "创建备件库位变更记录") + @PreAuthorize("@ss.hasPermission('item:itemLocationReplace:create')") + public CommonResult createItemLocationReplace(@Valid @RequestBody ItemLocationReplaceCreateReqVO createReqVO) { + return success(itemLocationReplaceService.createItemLocationReplace(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新备件库位变更记录") + @PreAuthorize("@ss.hasPermission('item:itemLocationReplace:update')") + public CommonResult updateItemLocationReplace(@Valid @RequestBody ItemLocationReplaceUpdateReqVO updateReqVO) { + int result = itemLocationReplaceService.updateItemLocationReplace(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除备件库位变更记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('item:itemLocationReplace:delete')") + public CommonResult deleteItemLocationReplace(@RequestParam("id") Long id) { + int result = itemLocationReplaceService.deleteItemLocationReplace(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得备件库位变更记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + public CommonResult getItemLocationReplace(@RequestParam("id") Long id) { + ItemLocationReplaceDO itemLocationReplace = itemLocationReplaceService.getItemLocationReplace(id); + return success(ItemLocationReplaceConvert.INSTANCE.convert(itemLocationReplace)); + } + + @GetMapping("/list") + @Operation(summary = "获得备件库位变更记录列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + public CommonResult> getItemLocationReplaceList(@RequestParam("ids") Collection ids) { + List list = itemLocationReplaceService.getItemLocationReplaceList(ids); + return success(ItemLocationReplaceConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得备件库位变更记录分页") + public CommonResult> getItemLocationReplacePage(@Valid ItemLocationReplacePageReqVO pageVO) { + PageResult pageResult = itemLocationReplaceService.getItemLocationReplacePage(pageVO); + return success(ItemLocationReplaceConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出备件库位变更记录 Excel") + @OperateLog(type = EXPORT) + @PreAuthorize("@ss.hasPermission('item:itemLocationReplace:export')") + public void exportItemLocationReplaceExcel(@Valid ItemLocationReplaceExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = itemLocationReplaceService.getItemLocationReplaceList(exportReqVO); + // 导出 Excel + List datas = ItemLocationReplaceConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "备件库位变更记录.xls", "数据", ItemLocationReplaceExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入备件库位变更记录模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "备件库位变更记录基本信息导入模板.xls", "备件库位变更记录基本信息列表", ItemLocationReplaceExcelVO.class, list); + } + + @PostMapping("/senior") + @Operation(summary = "高级搜索获得账期日历分页") + public CommonResult> getLocationSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = itemLocationReplaceService.getItemLocationReplaceSenior(conditions); + PageResult result = ItemLocationReplaceConvert.INSTANCE.convertPage(pageResult); + return success(result); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceBaseVO.java new file mode 100644 index 0000000..dba53b5 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceBaseVO.java @@ -0,0 +1,33 @@ +package com.win.module.eam.controller.itemlocationreplace.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 ItemLocationReplaceBaseVO { + + @Schema(description = "id", example = "id") + private Long id; + + @Schema(description = "库位编码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "库位编码不能为空") + private String locationNumber; + + @Schema(description = "描述") + private String ranks; + + @Schema(description = "变更前备件编码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "变更前备件编码不能为空") + private String oldItemNumber; + + @Schema(description = "变更后备件编码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "变更后备件编码不能为空") + private String itemNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceCreateReqVO.java new file mode 100644 index 0000000..fa4a92f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.itemlocationreplace.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 备件库位变更记录创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemLocationReplaceCreateReqVO extends ItemLocationReplaceBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceExcelVO.java new file mode 100644 index 0000000..e9a3ab2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceExcelVO.java @@ -0,0 +1,31 @@ +package com.win.module.eam.controller.itemlocationreplace.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 备件库位变更记录 Excel VO + * + * @author 超级管理员 + */ +@Data +public class ItemLocationReplaceExcelVO { + + @ExcelProperty("库位编码") + private String locationNumber; + + @ExcelProperty("描述") + private String ranks; + + @ExcelProperty("变更前备件编码") + private String oldItemNumber; + + @ExcelProperty("变更后备件编码") + private String itemNumber; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceExportReqVO.java new file mode 100644 index 0000000..ce775e3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceExportReqVO.java @@ -0,0 +1,31 @@ +package com.win.module.eam.controller.itemlocationreplace.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,参数和 ItemLocationReplacePageReqVO 是一致的") +@Data +public class ItemLocationReplaceExportReqVO { + + @Schema(description = "库位编码") + private String locationNumber; + + @Schema(description = "描述") + private String ranks; + + @Schema(description = "变更前备件编码") + private String oldItemNumber; + + @Schema(description = "变更后备件编码") + private String itemNumber; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplacePageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplacePageReqVO.java new file mode 100644 index 0000000..8729db0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplacePageReqVO.java @@ -0,0 +1,36 @@ +package com.win.module.eam.controller.itemlocationreplace.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 ItemLocationReplacePageReqVO extends PageParam { + + @Schema(description = "库位编码") + private String locationNumber; + + @Schema(description = "描述") + private String ranks; + + @Schema(description = "变更前备件编码") + private String oldItemNumber; + + @Schema(description = "变更后备件编码") + private String itemNumber; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceRespVO.java new file mode 100644 index 0000000..1e25e7d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.eam.controller.itemlocationreplace.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 ItemLocationReplaceRespVO extends ItemLocationReplaceBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceUpdateReqVO.java new file mode 100644 index 0000000..4a29253 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemlocationreplace/vo/ItemLocationReplaceUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.itemlocationreplace.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 ItemLocationReplaceUpdateReqVO extends ItemLocationReplaceBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/ItemMaintenanceRecordController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/ItemMaintenanceRecordController.java new file mode 100644 index 0000000..aa97c88 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/ItemMaintenanceRecordController.java @@ -0,0 +1,143 @@ +package com.win.module.eam.controller.itemmaintenancerecord; + +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.eam.controller.itemmaintenancerecord.vo.*; +import com.win.module.eam.convert.itemmaintenancerecord.ItemMaintenanceRecordConvert; +import com.win.module.eam.dal.dataobject.itemmaintenancerecord.ItemMaintenanceRecordDO; +import com.win.module.eam.service.itemmaintenancerecord.ItemMaintenanceRecordService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 备件维修记录") +@RestController +@RequestMapping("/eam/item-maintenance-record") +@Validated +public class ItemMaintenanceRecordController { + + @Resource + private ItemMaintenanceRecordService itemMaintenanceRecordService; + + @PostMapping("/create") + @Operation(summary = "创建备件维修记录") + @PreAuthorize("@ss.hasPermission('item:itemMaintenance:create')") + public CommonResult createItemMaintenance(@Valid @RequestBody ItemMaintenanceRecordCreateReqVO createReqVO) { + return success(itemMaintenanceRecordService.createItemMaintenance(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新备件维修记录") + @PreAuthorize("@ss.hasPermission('item:itemMaintenance:update')") + public CommonResult updateItemMaintenance(@Valid @RequestBody ItemMaintenanceRecordUpdateReqVO updateReqVO) { + int result = itemMaintenanceRecordService.updateItemMaintenance(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除备件维修记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('item:itemMaintenance:delete')") + public CommonResult deleteItemMaintenance(@RequestParam("id") Long id) { + int result = itemMaintenanceRecordService.deleteItemMaintenance(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得备件维修记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:item-maintenance-record:query')") + public CommonResult getItemMaintenance(@RequestParam("id") Long id) { + ItemMaintenanceRecordDO itemMaintenance = itemMaintenanceRecordService.getItemMaintenance(id); + return success(ItemMaintenanceRecordConvert.INSTANCE.convert(itemMaintenance)); + } + + @GetMapping("/list") + @Operation(summary = "获得备件维修记录列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:item-maintenance-record:query')") + public CommonResult> getItemMaintenanceList(@RequestParam("ids") Collection ids) { + List list = itemMaintenanceRecordService.getItemMaintenanceList(ids); + return success(ItemMaintenanceRecordConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得备件维修记录分页") + //@PreAuthorize("@ss.hasPermission('eam:item-maintenance-record:query')") + public CommonResult> getItemMaintenancePage(@Valid ItemMaintenanceRecordPageReqVO pageVO) { + PageResult pageResult = itemMaintenanceRecordService.getItemMaintenancePage(pageVO); + return success(ItemMaintenanceRecordConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出备件维修记录 Excel") + //@PreAuthorize("@ss.hasPermission('eam:item-maintenance-record:export')") + @OperateLog(type = EXPORT) + public void exportItemMaintenanceExcel(@Valid ItemMaintenanceRecordExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = itemMaintenanceRecordService.getItemMaintenanceList(exportReqVO); + // 导出 Excel + List datas = ItemMaintenanceRecordConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "备件维修记录.xls", "数据", ItemMaintenanceRecordExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入备件维修记录模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "备件维修记录基本信息导入模板.xls", "备件维修记录基本信息列表", ItemMaintenanceRecordExcelVO.class, list); + } + + @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('eam:item-maintenance-record:import')") + 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 list = ExcelUtils.read(file, ItemMaintenanceRecordExcelVO.class); + List errorList = itemMaintenanceRecordService.importItemMaintenanceList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + @GetMapping("/getAppPage") + @Operation(summary = "APP获取当前人维修记录") + //@PreAuthorize("@ss.hasPermission('eam:item-maintenance-record:query')") + public CommonResult> getAppPage(@Valid ItemMaintenanceRecordPageReqVO pageVO) { + PageResult pageResult = itemMaintenanceRecordService.getAppPage(pageVO); + return success(ItemMaintenanceRecordConvert.INSTANCE.convertPage(pageResult)); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordBaseVO.java new file mode 100644 index 0000000..34f7601 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordBaseVO.java @@ -0,0 +1,44 @@ +package com.win.module.eam.controller.itemmaintenancerecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.math.BigDecimal; + +/** + * 备件维修记录 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class ItemMaintenanceRecordBaseVO { + + @Schema(description = "代码", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "代码不能为空") + private String number; + + @Schema(description = "备件代码", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "备件代码不能为空") + private String itemNumber; + + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "数量不能为空") + private BigDecimal qty; + + @Schema(description = "维修结果YES、NO") + //@NotNull(message = "维序结果不能为空") + private String result; + + @Schema(description = "地点ID", example = "31791") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer concurrencyStamp; + + @Schema(description = "维修原因") + //@NotNull(message = "备件维修原因不能为空") + private String reasons; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordCreateReqVO.java new file mode 100644 index 0000000..212d0d6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordCreateReqVO.java @@ -0,0 +1,24 @@ +package com.win.module.eam.controller.itemmaintenancerecord.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 备件维修记录创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemMaintenanceRecordCreateReqVO extends ItemMaintenanceRecordBaseVO { + @Schema(description = "库位编码") + private String locationNumber; + + @Schema(description = "库区编码") + private String areaNumber; + + @Schema(description = "是否账内账外") + private String isInAccount; + + @Schema(description = "备件维修数据集合") + private List> itemNumbers; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordExcelVO.java new file mode 100644 index 0000000..8cca92f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordExcelVO.java @@ -0,0 +1,42 @@ +package com.win.module.eam.controller.itemmaintenancerecord.vo; + +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 备件维修记录 Excel VO + * + * @author 超级管理员 + */ +@Data +public class ItemMaintenanceRecordExcelVO { + + @ExcelProperty("代码") + private String number; + + @ExcelProperty("备件代码") + private String itemNumber; + + @ExcelProperty("数量") + private BigDecimal qty; + + @ExcelProperty("维修结果YES、NO") + private String result; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordExportReqVO.java new file mode 100644 index 0000000..fa29083 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordExportReqVO.java @@ -0,0 +1,28 @@ +package com.win.module.eam.controller.itemmaintenancerecord.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +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,参数和 ItemMaintenancePageReqVO 是一致的") +@Data +public class ItemMaintenanceRecordExportReqVO { + + @Schema(description = "代码") + private String number; + + @Schema(description = "备件代码") + private String itemNumber; + + @Schema(description = "维修结果YES、NO") + private String result; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordPageReqVO.java new file mode 100644 index 0000000..138bf4f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordPageReqVO.java @@ -0,0 +1,30 @@ +package com.win.module.eam.controller.itemmaintenancerecord.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 ItemMaintenanceRecordPageReqVO extends PageParam { + private String userId; + @Schema(description = "代码") + private String number; + + @Schema(description = "备件代码") + private String itemNumber; + + @Schema(description = "维修结果YES、NO") + private String result; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordRespVO.java new file mode 100644 index 0000000..89fff97 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordRespVO.java @@ -0,0 +1,27 @@ +package com.win.module.eam.controller.itemmaintenancerecord.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 ItemMaintenanceRecordRespVO extends ItemMaintenanceRecordBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "创建时间") + private String resultName; + + @Schema(description = "创建时间") + private String itemName; + + @Schema(description = "创建时间") + private String userName; + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordUpdateReqVO.java new file mode 100644 index 0000000..f5a91eb --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemmaintenancerecord/vo/ItemMaintenanceRecordUpdateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.itemmaintenancerecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Schema(description = "管理后台 - 备件维修记录更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemMaintenanceRecordUpdateReqVO extends ItemMaintenanceRecordBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/ItemOrderDetailController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/ItemOrderDetailController.java new file mode 100644 index 0000000..c714100 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/ItemOrderDetailController.java @@ -0,0 +1,139 @@ +package com.win.module.eam.controller.itemorder; + +import com.win.module.eam.controller.itemorder.vo.*; +import io.swagger.v3.oas.annotations.Parameters; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +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.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.*; +import java.io.IOException; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.pojo.CommonResult; +import static com.win.framework.common.pojo.CommonResult.success; + +import com.win.framework.excel.core.util.ExcelUtils; + +import com.win.framework.operatelog.core.annotations.OperateLog; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.win.module.eam.dal.dataobject.itemorder.ItemOrderDetailDO; +import com.win.module.eam.convert.itemorder.ItemOrderDetailConvert; +import com.win.module.eam.service.itemorder.ItemOrderDetailService; +import org.springframework.web.multipart.MultipartFile; + +@Tag(name = "管理后台 - 备件采购订单子") +@RestController +@RequestMapping("/eam/item-order-detail") +@Validated +public class ItemOrderDetailController { + + @Resource + private ItemOrderDetailService itemOrderDetailService; + + @PostMapping("/create") + @Operation(summary = "创建备件采购订单子") + @PreAuthorize("@ss.hasPermission('eam:item-order-detail:create')") + public CommonResult createItemOrderDetail(@Valid @RequestBody ItemOrderDetailCreateReqVO createReqVO) { + return success(itemOrderDetailService.createItemOrderDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新备件采购订单子") + @PreAuthorize("@ss.hasPermission('eam:item-order-detail:update')") + public CommonResult updateItemOrderDetail(@Valid @RequestBody ItemOrderDetailUpdateReqVO updateReqVO) { + int result = itemOrderDetailService.updateItemOrderDetail(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除备件采购订单子") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:item-order-detail:delete')") + public CommonResult deleteItemOrderDetail(@RequestParam("id") Long id) { + int result = itemOrderDetailService.deleteItemOrderDetail(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得备件采购订单子") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('eam:item-order-detail:query')") + public CommonResult getItemOrderDetail(@RequestParam("id") Long id) { + ItemOrderDetailDO itemOrderDetail = itemOrderDetailService.getItemOrderDetail(id); + return success(ItemOrderDetailConvert.INSTANCE.convert(itemOrderDetail)); + } + + @GetMapping("/list") + @Operation(summary = "获得备件采购订单子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('eam:item-order-detail:query')") + public CommonResult> getItemOrderDetailList(@RequestParam("ids") Collection ids) { + List list = itemOrderDetailService.getItemOrderDetailList(ids); + return success(ItemOrderDetailConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得备件采购订单子分页") + @PreAuthorize("@ss.hasPermission('eam:item-order-detail:query')") + public CommonResult> getItemOrderDetailPage(@Valid ItemOrderDetailPageReqVO pageVO) { + PageResult pageResult = itemOrderDetailService.getItemOrderDetailPage(pageVO); + return success(ItemOrderDetailConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出备件采购订单子 Excel") + @PreAuthorize("@ss.hasPermission('eam:item-order-detail:export')") + @OperateLog(type = EXPORT) + public void exportItemOrderDetailExcel(@Valid ItemOrderDetailExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = itemOrderDetailService.getItemOrderDetailList(exportReqVO); + // 导出 Excel + List datas = ItemOrderDetailConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "备件采购订单子.xls", "数据", ItemOrderDetailExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入备件采购订单子模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "备件采购订单子基本信息导入模板.xls", "备件采购订单子基本信息列表", ItemOrderDetailExcelVO.class, list); + } + + @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('eam:item-order-detail:import')") + 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 list = ExcelUtils.read(file, ItemOrderDetailExcelVO.class); + List errorList = itemOrderDetailService.importItemOrderDetailList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/ItemOrderMainController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/ItemOrderMainController.java new file mode 100644 index 0000000..70ef23b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/ItemOrderMainController.java @@ -0,0 +1,189 @@ +package com.win.module.eam.controller.itemorder; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.itemorder.vo.*; +import com.win.module.eam.convert.itemorder.ItemOrderDetailConvert; +import com.win.module.eam.convert.itemorder.ItemOrderMainConvert; +import com.win.module.eam.dal.dataobject.itemorder.ItemOrderMainDO; +import com.win.module.eam.service.itemorder.ItemOrderMainService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 备件采购订单主") +@RestController +@RequestMapping("/eam/item-order-main") +@Validated +public class ItemOrderMainController { + + @Resource + private ItemOrderMainService itemOrderMainService; + + @PostMapping("/create") + @Operation(summary = "创建备件采购订单主") + @PreAuthorize("@ss.hasPermission('item:itemOrderMain:create')") + public CommonResult createItemOrderMain(@Valid @RequestBody ItemOrderMainCreateReqVO createReqVO) { + return success(itemOrderMainService.createItemOrderMain(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新备件采购订单主") + @PreAuthorize("@ss.hasPermission('item:itemOrderMain:update')") + public CommonResult updateItemOrderMain(@Valid @RequestBody ItemOrderMainUpdateReqVO updateReqVO) { + int result = itemOrderMainService.updateItemOrderMain(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除备件采购订单主") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('item:itemOrderMain:delete')") + public CommonResult deleteItemOrderMain(@RequestParam("id") Long id) { + int result = itemOrderMainService.deleteItemOrderMain(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得备件采购订单主") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:item-order-main:query')") + public CommonResult getItemOrderMain(@RequestParam("id") Long id) { + ItemOrderMainDO itemOrderMain = itemOrderMainService.getItemOrderMain(id); + return success(ItemOrderMainConvert.INSTANCE.convert(itemOrderMain)); + } + + @GetMapping("/list") + @Operation(summary = "获得备件采购订单主列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:item-order-main:query')") + public CommonResult> getItemOrderMainList(@RequestParam("ids") Collection ids) { + List list = itemOrderMainService.getItemOrderMainList(ids); + return success(ItemOrderMainConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得备件采购订单主分页") +// @PreAuthorize("@ss.hasPermission('eam:item-order-main:query')") + public CommonResult> getItemOrderMainPage(@Valid ItemOrderMainPageReqVO pageVO) { + PageResult pageResult = itemOrderMainService.getItemOrderMainPage(pageVO); + return success(ItemOrderMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出备件采购订单主 Excel") + @PreAuthorize("@ss.hasPermission('item:itemOrderMain:export')") + @OperateLog(type = EXPORT) + public void exportItemOrderMainExcel(@Valid ItemOrderMainExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = itemOrderMainService.getItemOrderMainList(exportReqVO); + // 导出 Excel + List datas = ItemOrderMainConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "备件采购订单主.xls", "数据", ItemOrderMainExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入备件采购订单主模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "备件采购订单主基本信息导入模板.xls", "备件采购订单主基本信息列表", ItemOrderMainExcelVO.class, list); + } + + @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('item:itemOrderMain:import')") + 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 list = ExcelUtils.read(file, ItemOrderMainExcelVO.class); + List errorList = itemOrderMainService.importItemOrderMainList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + @PostMapping("/close") + @Operation(summary = "关闭采购订单主") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('item:itemOrderMain:close')") + public CommonResult closeItemOrderMain(@RequestParam("id") Long id) { + Integer count = itemOrderMainService.closeItemOrderMain(id); + return success(count > 0); + } + + @GetMapping("/getPdaPage") + @Operation(summary = "PDA获得采购订单分页") + //@PreAuthorize("@ss.hasPermission('eam:item-order-main:query')") + public CommonResult> getPdaPage(@Valid ItemOrderMainPageReqVO pageVO) { + PageResult pageResult = itemOrderMainService.getPdaPage(pageVO); + return success(ItemOrderMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/getPdaDetailsById") + @Operation(summary = "PDA获得采购订单的备件详细列表") +// @PreAuthorize("@ss.hasPermission('eam:item-order-main:query')") + public CommonResult> getPdaDetailsById(@RequestParam("id") Long id) { + return success(ItemOrderDetailConvert.INSTANCE.convertList(itemOrderMainService.getPdaDetailsById(id))); + } + + @PostMapping("/inOperation") + @Operation(summary = "采购入库操作") + @Parameters({ + @Parameter(name = "id", description = "主单id", required = true), + @Parameter(name = "number", description = "主单number", required = true), + @Parameter(name = "List> itemNumbers", description = "子单列表", required = true), + @Parameter(name = "itemNumber", description = "零件号", required = true), + @Parameter(name = "locationNumber", description = "库位号", required = true), + @Parameter(name = "areaNumber", description = "库区号", required = true), + @Parameter(name = "isInAccount", description = "是否账内账外库", required = true), + @Parameter(name = "qty", description = "入库数量", required = true), + @Parameter(name = "describes", description = "描述", required = false), + }) + @PreAuthorize("@ss.hasPermission('eam:item-order-main:inOperation') or @ss.hasPermission('eam:item-order-main:inOperationAPP')") + public CommonResult inOperation(@RequestBody PdaItemOrderCreateReqVO reqVO) { + int result = itemOrderMainService.inOperation(reqVO); + return success(result > 0); + } + + @PostMapping("/senior") + @Operation(summary = "高级搜索获得账期日历分页") +// @PreAuthorize("@ss.hasPermission('wms:location:query')") + public CommonResult> getItemOrderMainSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = itemOrderMainService.getItemOrderMainSenior(conditions); + PageResult result = ItemOrderMainConvert.INSTANCE.convertPage(pageResult); + return success(result); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailBaseVO.java new file mode 100644 index 0000000..768b1a4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailBaseVO.java @@ -0,0 +1,84 @@ +package com.win.module.eam.controller.itemorder.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +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 ItemOrderDetailBaseVO { + + @Schema(description = "订单号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "订单号不能为空") + private String number; + + @Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "序号不能为空") + private Long serialNumber; + + @Schema(description = "申请单号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "申请单号唯一标识不能为空") + private String requestNo; + + @Schema(description = "申请人") + private String requestPerson; + + @Schema(description = "备件代码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "备件代码不能为空") + private String itemNumber; + + @Schema(description = "备件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + @NotNull(message = "备件名称不能为空") + private String itemName; + + @Schema(description = "科目代码") + private String subjectCode; + + @Schema(description = "规格型号") + private String specifications; + + @Schema(description = "到货日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime deliveryTime; + + @Schema(description = "单位") + private String uom; + + @Schema(description = "数量") + private BigDecimal qty; + + @Schema(description = "价格", example = "27191") + private BigDecimal singlePrice; + + @Schema(description = "含税价格", example = "19065") + private BigDecimal taxPrice; + + @Schema(description = "地点ID", example = "5782") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + /** + * 接收备件状态 未完成INCOMPLETE 完成COMPLETE + */ + @Schema(description = "备件状态") + private String status; + + @Schema(description = "收货数量") + private BigDecimal deliveryQty; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "并发乐观锁不能为空") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailCreateReqVO.java new file mode 100644 index 0000000..8c7c3a2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.itemorder.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 备件采购订单子创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemOrderDetailCreateReqVO extends ItemOrderDetailBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailExcelVO.java new file mode 100644 index 0000000..9240a54 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailExcelVO.java @@ -0,0 +1,75 @@ +package com.win.module.eam.controller.itemorder.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 备件采购订单子 Excel VO + * + * @author 超级管理员 + */ +@Data +public class ItemOrderDetailExcelVO { + + @ExcelProperty("订单号") + private String number; + + @ExcelProperty("序号") + private Long serialNumber; + + @ExcelProperty("申请单号唯一标识") + private String requestNo; + + @ExcelProperty("申请人") + private String requestPerson; + + @ExcelProperty("备件代码") + private String itemNumber; + + @ExcelProperty("备件名称") + private String itemName; + + @ExcelProperty("科目代码") + private String subjectCode; + + @ExcelProperty("规格型号") + private String specifications; + + @ExcelProperty("到货日期") + private LocalDateTime deliveryTime; + + @ExcelProperty("单位") + private String uom; + + @ExcelProperty("数量") + private BigDecimal qty; + + @ExcelProperty("价格") + private BigDecimal singlePrice; + + @ExcelProperty("含税价格") + private BigDecimal taxPrice; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + /** + * 接收备件状态 未完成INCOMPLETE 完成COMPLETE + */ + @ExcelProperty("备件状态") + private String status; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailExportReqVO.java new file mode 100644 index 0000000..aede39e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailExportReqVO.java @@ -0,0 +1,75 @@ +package com.win.module.eam.controller.itemorder.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +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,参数和 ItemOrderDetailPageReqVO 是一致的") +@Data +public class ItemOrderDetailExportReqVO { + + @Schema(description = "订单号") + private Long number; + + @Schema(description = "序号") + private Long serialNumber; + + @Schema(description = "申请单号唯一标识") + private String requestNo; + + @Schema(description = "申请人") + private String requestPerson; + + @Schema(description = "备件代码") + private String itemNumber; + + @Schema(description = "备件名称", example = "李四") + private String itemName; + + @Schema(description = "科目代码") + private String subjectCode; + + @Schema(description = "规格型号") + private String specifications; + + @Schema(description = "到货日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] deliveryTime; + + @Schema(description = "单位") + private String uom; + + @Schema(description = "数量") + private BigDecimal qty; + + @Schema(description = "价格", example = "27191") + private BigDecimal singlePrice; + + @Schema(description = "含税价格", example = "19065") + private BigDecimal taxPrice; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "地点ID", example = "5782") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + /** + * 接收备件状态 未完成INCOMPLETE 完成COMPLETE + */ + @Schema(description = "备件状态") + private String status; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailPageReqVO.java new file mode 100644 index 0000000..fc29a93 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailPageReqVO.java @@ -0,0 +1,82 @@ +package com.win.module.eam.controller.itemorder.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.math.BigDecimal; +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 ItemOrderDetailPageReqVO extends PageParam { + + @Schema(description = "订单号") + private Long number; + + @Schema(description = "序号") + private Long serialNumber; + + @Schema(description = "申请单号唯一标识") + private String requestNo; + + @Schema(description = "申请人") + private String requestPerson; + + @Schema(description = "备件代码") + private String itemNumber; + + @Schema(description = "备件名称", example = "李四") + private String itemName; + + @Schema(description = "科目代码") + private String subjectCode; + + @Schema(description = "规格型号") + private String specifications; + + @Schema(description = "到货日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] deliveryTime; + + @Schema(description = "单位") + private String uom; + + @Schema(description = "数量") + private BigDecimal qty; + + @Schema(description = "价格", example = "27191") + private BigDecimal singlePrice; + + @Schema(description = "含税价格", example = "19065") + private BigDecimal taxPrice; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "地点ID", example = "5782") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + /** + * 接收备件状态 未完成INCOMPLETE 完成COMPLETE + */ + @Schema(description = "备件状态") + private String status; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + + private Long masterId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailRespVO.java new file mode 100644 index 0000000..04fd5d3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.eam.controller.itemorder.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 ItemOrderDetailRespVO extends ItemOrderDetailBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "类型名称") + private String statusName; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailUpdateReqVO.java new file mode 100644 index 0000000..8be85e7 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderDetailUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.itemorder.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 备件采购订单子更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemOrderDetailUpdateReqVO extends ItemOrderDetailBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainBaseVO.java new file mode 100644 index 0000000..305d43e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainBaseVO.java @@ -0,0 +1,85 @@ +package com.win.module.eam.controller.itemorder.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; + +import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; + +/** + * 备件采购订单主 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class ItemOrderMainBaseVO { + + @Schema(description = "id", example = "id") + private Long id; + + @Schema(description = "订单号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + private String number; + + @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED) + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate date; + + @Schema(description = "电话") + private String phone; + + @Schema(description = "传真") + private String fax; + + @Schema(description = "采购员") + private String purchaser; + + @Schema(description = "供应商编号") + private String supplierNumber; + + @Schema(description = "供应商名称", example = "张三") + private String supplierName; + + @Schema(description = "供应商地址") + private String supplierAddress; + + @Schema(description = "发货至") + private String shipTo; + + @Schema(description = "开票至") + private String invoiceTo; + + @Schema(description = "联系人") + private String contacts; + + @Schema(description = "联系电话") + private String contactsPhone; + + @Schema(description = "付款方式", example = "2") + private String paymentType; + + @Schema(description = "注册地") + private String registLocation; + + @Schema(description = "开户行") + private String bank; + + @Schema(description = "账号", example = "7782") + private String account; + + @Schema(description = "税号") + private String dutyParagraph; + + @Schema(description = "地点ID", example = "8172") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "接收备件状态") + private String status; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainCreateReqVO.java new file mode 100644 index 0000000..0b882cc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainCreateReqVO.java @@ -0,0 +1,39 @@ +package com.win.module.eam.controller.itemorder.vo; + +import com.win.framework.excel.core.annotations.SubObject; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +@Schema(description = "管理后台 - 备件采购订单主创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemOrderMainCreateReqVO extends ItemOrderMainBaseVO { + @SubObject + @Schema(description = "子表数据") + private List subList; + + @Schema(description = "备件和数量") + private List> itemNumbers; + + @Schema(description = "备件号") + private String itemNumber; + + @Schema(description = "库位号") + private String locationNumber; + + @Schema(description = "库区号") + private String areaNumber; + + @Schema(description = "是否账内账外库") + private String isInAccount; + + @Schema(description = "入库数量") + private BigDecimal qty; +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainExcelVO.java new file mode 100644 index 0000000..4aa8fec --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainExcelVO.java @@ -0,0 +1,83 @@ +package com.win.module.eam.controller.itemorder.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * 备件采购订单主 Excel VO + * + * @author 超级管理员 + */ +@Data +public class ItemOrderMainExcelVO { + + @ExcelProperty("订单号唯一标识") + private String number; + + @ExcelProperty("日期") + private LocalDate date; + + @ExcelProperty("电话") + private String phone; + + @ExcelProperty("传真") + private String fax; + + @ExcelProperty("采购员") + private String purchaser; + + @ExcelProperty("供应商编号") + private String supplierNumber; + + @ExcelProperty("供应商名称") + private String supplierName; + + @ExcelProperty("供应商地址") + private String supplierAddress; + + @ExcelProperty("发货至") + private String shipTo; + + @ExcelProperty("开票至") + private String invoiceTo; + + @ExcelProperty("联系人") + private String contacts; + + @ExcelProperty("联系电话") + private String contactsPhone; + + @ExcelProperty("付款方式") + private String paymentType; + + @ExcelProperty("注册地") + private String registLocation; + + @ExcelProperty("开户行") + private String bank; + + @ExcelProperty("账号") + private String account; + + @ExcelProperty("税号") + private String dutyParagraph; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("接收备件状态") + private String status; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainExportReqVO.java new file mode 100644 index 0000000..6ea29f9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainExportReqVO.java @@ -0,0 +1,23 @@ +package com.win.module.eam.controller.itemorder.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.win.framework.common.pojo.PageParam; +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,参数和 ItemOrderMainPageReqVO 是一致的") +@Data +public class ItemOrderMainExportReqVO { + + @Schema(description = "订单号唯一标识") + private String number; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainPageReqVO.java new file mode 100644 index 0000000..2e07d59 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainPageReqVO.java @@ -0,0 +1,25 @@ +package com.win.module.eam.controller.itemorder.vo; + +import lombok.*; +import java.util.*; +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 ItemOrderMainPageReqVO extends PageParam { + + @Schema(description = "订单号唯一标识") + private String number; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainRespVO.java new file mode 100644 index 0000000..998f5dc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.eam.controller.itemorder.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 ItemOrderMainRespVO extends ItemOrderMainBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "状态名称") + private String statusName; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainUpdateReqVO.java new file mode 100644 index 0000000..423a1a0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/ItemOrderMainUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.itemorder.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 备件采购订单主更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemOrderMainUpdateReqVO extends ItemOrderMainBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/PdaItemOrderCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/PdaItemOrderCreateReqVO.java new file mode 100644 index 0000000..267b640 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemorder/vo/PdaItemOrderCreateReqVO.java @@ -0,0 +1,43 @@ +package com.win.module.eam.controller.itemorder.vo; + +import com.win.framework.excel.core.annotations.SubObject; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +@Schema(description = "pda接收采购订单类 Request VO") +@Data +@ToString(callSuper = true) +public class PdaItemOrderCreateReqVO { + @Schema(description = "id") + private Long id; + +// @Schema(description = "采购订单") +// private String number; + + @Schema(description = "备件和数量") + private List> itemNumbers; + + @Schema(description = "备件号") + private String itemNumber; + + @Schema(description = "库位号") + private String locationNumber; + + @Schema(description = "库区号") + private String areaNumber; + + @Schema(description = "是否账内账外库") + private String isInAccount; + + @Schema(description = "入库数量") + private BigDecimal qty; + + @Schema(description = "采购入库事务描述信息") + private String describes; +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/ItemOutLocationController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/ItemOutLocationController.java new file mode 100644 index 0000000..af27a47 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/ItemOutLocationController.java @@ -0,0 +1,117 @@ +package com.win.module.eam.controller.itemoutlocation; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.itemoutlocation.vo.*; +import com.win.module.eam.convert.itemoutlocation.ItemOutLocationConvert; +import com.win.module.eam.dal.dataobject.itemoutlocation.ItemOutLocationDO; +import com.win.module.eam.service.itemoutlocation.ItemOutLocationService; +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.Arrays; +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("/eam/item-out-location") +@Validated +public class ItemOutLocationController { + + @Resource + private ItemOutLocationService itemOutLocationService; + + @PostMapping("/create") + @Operation(summary = "创建备件出库记录") + @PreAuthorize("@ss.hasPermission('item:itemOutLocation:create')") + public CommonResult createItemOutLocation(@Valid @RequestBody ItemOutLocationCreateReqVO createReqVO) { + return success(itemOutLocationService.createItemOutLocation(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新备件出库记录") + @PreAuthorize("@ss.hasPermission('item:itemOutLocation:update')") + public CommonResult updateItemOutLocation(@Valid @RequestBody ItemOutLocationUpdateReqVO updateReqVO) { + int result = itemOutLocationService.updateItemOutLocation(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除备件出库记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('item:itemOutLocation:delete')") + public CommonResult deleteItemOutLocation(@RequestParam("id") Long id) { + int result = itemOutLocationService.deleteItemOutLocation(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得备件出库记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('record:item-out-location:query')") + public CommonResult getItemOutLocation(@RequestParam("id") Long id) { + ItemOutLocationDO itemOutLocation = itemOutLocationService.getItemOutLocation(id); + return success(ItemOutLocationConvert.INSTANCE.convert(itemOutLocation)); + } + + @GetMapping("/list") + @Operation(summary = "获得备件出库记录列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('record:item-out-location:query')") + public CommonResult> getItemOutLocationList(@RequestParam("ids") Collection ids) { + List list = itemOutLocationService.getItemOutLocationList(ids); + return success(ItemOutLocationConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得备件出库记录分页") +// @PreAuthorize("@ss.hasPermission('record:item-out-location:query')") + public CommonResult> getItemOutLocationPage(@Valid ItemOutLocationPageReqVO pageVO) { + PageResult pageResult = itemOutLocationService.getItemOutLocationPage(pageVO); + return success(ItemOutLocationConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出备件出库记录 Excel") + @PreAuthorize("@ss.hasPermission('item:itemOutLocation:export')") + @OperateLog(type = EXPORT) + public void exportItemOutLocationExcel(@Valid ItemOutLocationExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = itemOutLocationService.getItemOutLocationList(exportReqVO); + // 导出 Excel + List datas = ItemOutLocationConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "备件出库记录.xls", "数据", ItemOutLocationExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入备件出库记录模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "备件出库记录基本信息导入模板.xls", "备件出库记录基本信息列表", ItemOutLocationExcelVO.class, list); + } + + @PostMapping("/senior") + @Operation(summary = "高级搜索获得账期日历分页") + //@PreAuthorize("@ss.hasPermission('wms:location:query')") + public CommonResult> getLocationSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = itemOutLocationService.getItemOutLocationSenior(conditions); + PageResult result = ItemOutLocationConvert.INSTANCE.convertPage(pageResult); + return success(result); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationBaseVO.java new file mode 100644 index 0000000..460f794 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationBaseVO.java @@ -0,0 +1,36 @@ +package com.win.module.eam.controller.itemoutlocation.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 备件出库记录 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class ItemOutLocationBaseVO { + + private Long id; + + @Schema(description = "出库编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "出库编号不能为空") + private String number; + + @Schema(description = "备件编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "备件编号不能为空") + private String itemNumber; + + @Schema(description = "库位编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "库位编号不能为空") + private String locationNumber; + + @Schema(description = "出库类型", example = "1") + private String type; + + @Schema(description = "数量") + private BigDecimal qty; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationCreateReqVO.java new file mode 100644 index 0000000..ab912a6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.itemoutlocation.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 备件出库记录创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemOutLocationCreateReqVO extends ItemOutLocationBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationExcelVO.java new file mode 100644 index 0000000..28974d5 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationExcelVO.java @@ -0,0 +1,35 @@ +package com.win.module.eam.controller.itemoutlocation.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 备件出库记录 Excel VO + * + * @author 超级管理员 + */ +@Data +public class ItemOutLocationExcelVO { + + @ExcelProperty("出库编号") + private String number; + + @ExcelProperty("备件编号") + private String itemNumber; + + @ExcelProperty("库位编号") + private String locationNumber; + + @ExcelProperty("出库类型") + private String type; + + @ExcelProperty("数量") + private BigDecimal qty; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationExportReqVO.java new file mode 100644 index 0000000..99e35d1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationExportReqVO.java @@ -0,0 +1,30 @@ +package com.win.module.eam.controller.itemoutlocation.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 备件出库记录 Excel 导出 Request VO,参数和 ItemOutLocationPageReqVO 是一致的") +@Data +public class ItemOutLocationExportReqVO { + + @Schema(description = "id", example = "5526") + private Long id; + + @Schema(description = "出库编号") + private String number; + + @Schema(description = "备件编号") + private String itemNumber; + + @Schema(description = "库位编号") + private String locationNumber; + + @Schema(description = "出库类型", example = "1") + private String type; + + @Schema(description = "数量") + private BigDecimal qty; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationPageReqVO.java new file mode 100644 index 0000000..c5de529 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationPageReqVO.java @@ -0,0 +1,35 @@ +package com.win.module.eam.controller.itemoutlocation.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 java.math.BigDecimal; + +@Schema(description = "管理后台 - 备件出库记录分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ItemOutLocationPageReqVO extends PageParam { + + @Schema(description = "id", example = "5526") + private Long id; + + @Schema(description = "出库编号") + private String number; + + @Schema(description = "备件编号") + private String itemNumber; + + @Schema(description = "库位编号") + private String locationNumber; + + @Schema(description = "出库类型", example = "1") + private String type; + + @Schema(description = "数量") + private BigDecimal qty; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationRespVO.java new file mode 100644 index 0000000..a12b8c3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationRespVO.java @@ -0,0 +1,13 @@ +package com.win.module.eam.controller.itemoutlocation.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 ItemOutLocationRespVO extends ItemOutLocationBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationUpdateReqVO.java new file mode 100644 index 0000000..6aef58c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/itemoutlocation/vo/ItemOutLocationUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.itemoutlocation.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 ItemOutLocationUpdateReqVO extends ItemOutLocationBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/LocationController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/LocationController.java new file mode 100644 index 0000000..f7d5ac1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/LocationController.java @@ -0,0 +1,159 @@ +package com.win.module.eam.controller.location; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +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.eam.controller.location.vo.*; +import com.win.module.eam.convert.location.LocationConvert; +import com.win.module.eam.dal.dataobject.location.LocationDO; +import com.win.module.eam.enums.DictTypeConstants; +import com.win.module.eam.service.location.LocationService; +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.HashMap; +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("/eam/location") +@Validated +public class LocationController { + + @Resource + private LocationService locationService; + + @PostMapping("/create") + @Operation(summary = "创建库位") + @PreAuthorize("@ss.hasPermission('basic:location:create')") + public CommonResult createLocation(@Valid @RequestBody LocationCreateReqVO createReqVO) { + return success(locationService.createLocation(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新库位") + @PreAuthorize("@ss.hasPermission('basic:location:update')") + public CommonResult updateLocation(@Valid @RequestBody LocationUpdateReqVO updateReqVO) { + int result = locationService.updateLocation(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除库位") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('basic:location:delete')") + public CommonResult deleteLocation(@RequestParam("id") Long id) { + int result = locationService.deleteLocation(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得库位") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('basic:location:query')") + public CommonResult getLocation(@RequestParam("id") Long id) { + LocationDO location = locationService.getLocation(id); + return success(LocationConvert.INSTANCE.convert(location)); + } + + @GetMapping("/list") + @Operation(summary = "获得库位列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('basic:location:query')") + public CommonResult> getLocationList(@RequestParam("ids") Collection ids) { + List list = locationService.getLocationList(ids); + return success(LocationConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得库位分页") +// @PreAuthorize("@ss.hasPermission('basic:location:query')") + public CommonResult> getLocationPage(@Valid LocationPageReqVO pageVO) { + PageResult pageResult = locationService.getLocationPage(pageVO); + return success(LocationConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出库位 Excel") + @PreAuthorize("@ss.hasPermission('basic:location:export')") + @OperateLog(type = EXPORT) + public void exportLocationExcel(@Valid LocationExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = locationService.getLocationList(exportReqVO); + Map mapDropDown = new HashMap<>(); + List resultList = this.getExcelVo(list, mapDropDown); + // 导出 Excel + ExcelUtils.write(response, "库位.xls", "数据", LocationExcelVO.class, resultList,mapDropDown); + } + + private List getExcelVo(List list, Map mapDropDown) { + String[] type = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.LOCATION_AREA_TYPE); + mapDropDown.put(4, type); + String[] isInAccount = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.TRUE_FALSE); + mapDropDown.put(5, isInAccount); + String[] available = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.TRUE_FALSE); + mapDropDown.put(6, available); + // 导出 Excel + List resultList = LocationConvert.INSTANCE.convertList02(list); + return resultList; + } + + @GetMapping("/scanCodeByNumber") + @Operation(summary = "备件维修扫库位码获取库位信息以及关联备件信息") +// @PreAuthorize("@ss.hasPermission('basic:location:query')") + public CommonResult scanCodeByNumber(@RequestParam("number") String number) { + LocationDO locationDO = locationService.scanCodeByNumber(number); + return success(LocationConvert.INSTANCE.convert(locationDO)); + } + + + @PostMapping("/outScanCodeByNumber") + @Operation(summary = "备件出库扫库位码获取库位信息以及关联备件信息") +// @PreAuthorize("@ss.hasPermission('basic:location:query')") + public CommonResult outScanCodeByNumber(@RequestBody LocationOutScanCodeReqVO reqVO) { + LocationDO locationDO = locationService.outScanCodeByNumber(reqVO); + return success(LocationConvert.INSTANCE.convert(locationDO)); + } + + + @GetMapping("/noPage") + @Operation(summary = "获得库位不分页") +// @PreAuthorize("@ss.hasPermission('basic:location:query')") + public CommonResult> getLocationNoPage(@Valid LocationReqVO pageVO) { + List result = locationService.selectListNoPage(pageVO); + return success(LocationConvert.INSTANCE.convertList(result)); + } + + @PostMapping("/senior") + @Operation(summary = "高级搜索获得库位分页") +// @PreAuthorize("@ss.hasPermission('basic:location:query')") + public CommonResult> getLocationSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = locationService.getLocationSenior(conditions); + PageResult result = LocationConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + @GetMapping("/pdaItemAndLocation") + @Operation(summary = "PDA根据库位码或备件码查询相应的信息") + public CommonResult> pdaItemAndLocation(@RequestParam("number") String number) { + List locationDOS = locationService.pdaItemAndLocation(number);//根据库区号查询数据 + return success(LocationConvert.INSTANCE.convertList(locationDOS)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationBaseVO.java new file mode 100644 index 0000000..1b9b6ed --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationBaseVO.java @@ -0,0 +1,47 @@ +package com.win.module.eam.controller.location.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 LocationBaseVO { + + @Schema(description = "id", example = "id") + private Long id; + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + private String number; + + @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "描述", example = "你猜") + private String description; + + @Schema(description = "库区编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "库区编号不能为空") + private String areaNumber; + + @Schema(description = "类型", example = "2") + private String type; + + @Schema(description = "是否账内账外默认TRUE账内FALSE账外", example = "21786") + private String isInAccount; + + @Schema(description = "地点ID", example = "23633") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationCreateReqVO.java new file mode 100644 index 0000000..355e1ad --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.location.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 库位创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class LocationCreateReqVO extends LocationBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationExcelVO.java new file mode 100644 index 0000000..2870934 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationExcelVO.java @@ -0,0 +1,49 @@ +package com.win.module.eam.controller.location.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.eam.enums.DictTypeConstants; +import lombok.Data; + +/** + * 库位 Excel VO + * + * @author 超级管理员 + */ +@Data +public class LocationExcelVO { + + @ExcelProperty("库位编号") + @ColumnWidth(value = 20) + private String number; + + @ExcelProperty("库位名称") + @ColumnWidth(value = 20) + private String name; + + @ExcelProperty("库区编号") + @ColumnWidth(value = 20) + private String areaNumber; + + @ExcelProperty(value = "类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.LOCATION_AREA_TYPE) + @ColumnWidth(value = 20) + private String type; + + @ExcelProperty(value = "是否账内", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + @ColumnWidth(value = 20) + private String isInAccount; + + @ExcelProperty(value = "是否可用", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + @ColumnWidth(value = 20) + private String available; + + @ExcelProperty("描述") + @ColumnWidth(value = 30) + private String description; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationExportReqVO.java new file mode 100644 index 0000000..9a17eca --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationExportReqVO.java @@ -0,0 +1,33 @@ +package com.win.module.eam.controller.location.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,参数和 LocationPageReqVO 是一致的") +@Data +public class LocationExportReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "芋艿") + private String name; + + @Schema(description = "描述", example = "你猜") + private String description; + + @Schema(description = "库区编号") + private String areaNumber; + + @Schema(description = "类型", example = "2") + private String type; + + @Schema(description = "是否账内账外默认TRUE账内FALSE账外", example = "21786") + private String isInAccount; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationOutScanCodeReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationOutScanCodeReqVO.java new file mode 100644 index 0000000..6e44c1b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationOutScanCodeReqVO.java @@ -0,0 +1,25 @@ +package com.win.module.eam.controller.location.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import java.util.List; +import java.util.Map; + +@Schema(description = "管理后台 - 库位扫码实体类") +@Data +@ToString(callSuper = true) +public class LocationOutScanCodeReqVO { + + @Schema(description = "库位码") + private String number; + + @Schema(description = "出库申领主信息id", example = "芋艿") + private Long id; + + @Schema(description = "添加缓存的备件列表备件", example = "你猜") + private List> itemNumbers; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationPageReqVO.java new file mode 100644 index 0000000..64e93e0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationPageReqVO.java @@ -0,0 +1,35 @@ +package com.win.module.eam.controller.location.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 LocationPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "芋艿") + private String name; + + @Schema(description = "描述", example = "你猜") + private String description; + + @Schema(description = "库区编号") + private String areaNumber; + + @Schema(description = "类型", example = "2") + private String type; + + @Schema(description = "是否账内账外默认TRUE账内FALSE账外", example = "21786") + private String isInAccount; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationReqVO.java new file mode 100644 index 0000000..29cc8a9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationReqVO.java @@ -0,0 +1,33 @@ +package com.win.module.eam.controller.location.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "管理后台 - 库位 Request VO") +@Data +@ToString(callSuper = true) +public class LocationReqVO{ + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "芋艿") + private String name; + + @Schema(description = "描述", example = "你猜") + private String description; + + @Schema(description = "库区编号") + private String areaNumber; + + @Schema(description = "类型", example = "2") + private String type; + + @Schema(description = "是否账内账外默认TRUE账内FALSE账外", example = "21786") + private String isInAccount; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationRespVO.java new file mode 100644 index 0000000..eb58018 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationRespVO.java @@ -0,0 +1,44 @@ +package com.win.module.eam.controller.location.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 库位 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class LocationRespVO extends LocationBaseVO { + + @Schema(description = "备件编号") + private String itemNumber; + + @Schema(description = "库位编码") + private String locationNumber; + + @Schema(description = "备件名称") + private String itemName; + + @Schema(description = "库存数量") + private BigDecimal qty; + + @Schema(description = "备件出库申领数量") + private BigDecimal applyQty; + + @Schema(description = "备件出库出库数量") + private BigDecimal receiveQty; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "库区名称") + private String areaName; + + @Schema(description = "已接收数量") + private BigDecimal totalReception; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationUpdateReqVO.java new file mode 100644 index 0000000..ecbe300 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/location/vo/LocationUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.location.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 LocationUpdateReqVO extends LocationBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/LocationAreaController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/LocationAreaController.java new file mode 100644 index 0000000..a2bfdda --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/LocationAreaController.java @@ -0,0 +1,128 @@ +package com.win.module.eam.controller.locationarea; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +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.eam.controller.locationarea.vo.*; +import com.win.module.eam.convert.locationarea.LocationAreaConvert; +import com.win.module.eam.dal.dataobject.locationarea.LocationAreaDO; +import com.win.module.eam.enums.DictTypeConstants; +import com.win.module.eam.service.locationarea.LocationAreaService; +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.*; + +import static com.win.framework.common.pojo.CommonResult.success; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 库区") +@RestController +@RequestMapping("/eam/location-area") +@Validated +public class LocationAreaController { + + @Resource + private LocationAreaService locationAreaService; + + @PostMapping("/create") + @Operation(summary = "创建库区") + @PreAuthorize("@ss.hasPermission('basic:locationArea:create')") + public CommonResult createLocationArea(@Valid @RequestBody LocationAreaCreateReqVO createReqVO) { + return success(locationAreaService.createLocationArea(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新库区") + @PreAuthorize("@ss.hasPermission('basic:locationArea:update')") + public CommonResult updateLocationArea(@Valid @RequestBody LocationAreaUpdateReqVO updateReqVO) { + int result = locationAreaService.updateLocationArea(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除库区") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('basic:locationArea:delete')") + public CommonResult deleteLocationArea(@RequestParam("id") Long id) { + int result = locationAreaService.deleteLocationArea(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得库区") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('basic:locationArea:query')") + public CommonResult getLocationArea(@RequestParam("id") Long id) { + LocationAreaDO locationArea = locationAreaService.getLocationArea(id); + return success(LocationAreaConvert.INSTANCE.convert(locationArea)); + } + + @GetMapping("/list") + @Operation(summary = "获得库区列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('basic:locationArea:query')") + public CommonResult> getLocationAreaList(@RequestParam("ids") Collection ids) { + List list = locationAreaService.getLocationAreaList(ids); + return success(LocationAreaConvert.INSTANCE.convertList(list)); + } + @GetMapping("/page") + @Operation(summary = "获得库区分页") +// @PreAuthorize("@ss.hasPermission('basic:locationArea:query')") + public CommonResult> getLocationAreaPage(@Valid LocationAreaPageReqVO pageVO) { + PageResult pageResult = locationAreaService.getLocationAreaPage(pageVO); + return success(LocationAreaConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出库区 Excel") + @PreAuthorize("@ss.hasPermission('basic:locationArea:export')") + @OperateLog(type = EXPORT) + public void exportLocationAreaExcel(@Valid LocationAreaExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = locationAreaService.getLocationAreaList(exportReqVO); + Map mapDropDown = new HashMap<>(); + List resultList = this.getExcelVo(list, mapDropDown); + // 导出 Excel + ExcelUtils.write(response, "库区.xls", "数据", LocationAreaExcelVO.class, resultList,mapDropDown); + } + + private List getExcelVo(List list, Map mapDropDown) { + String[] type = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.LOCATION_AREA_TYPE); + mapDropDown.put(3, type); + String[] available = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.TRUE_FALSE); + mapDropDown.put(4, available); + // 导出 Excel + List resultList = LocationAreaConvert.INSTANCE.convertList02(list); + return resultList; + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入库区模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "库区基本信息导入模板.xls", "库区基本信息列表", LocationAreaExcelVO.class, list); + } + + @PostMapping("/senior") + @Operation(summary = "高级搜索获得库位分页") +// @PreAuthorize("@ss.hasPermission('basic:locationArea:query')") + public CommonResult> getLocationSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = locationAreaService.getLocationAreaSenior(conditions); + PageResult result = LocationAreaConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaBaseVO.java new file mode 100644 index 0000000..4fdc961 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaBaseVO.java @@ -0,0 +1,40 @@ +package com.win.module.eam.controller.locationarea.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 LocationAreaBaseVO { + + @Schema(description = "id", example = "id") + private Long id; + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + private String number; + + @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "描述", example = "你猜") + private String description; + + @Schema(description = "类型枚举辅材库、备品备件库、工具库、专用耗材库、易耗品库", example = "2") + private String type; + + @Schema(description = "地点ID", example = "19003") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaCreateReqVO.java new file mode 100644 index 0000000..d1bf470 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.locationarea.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 库区创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class LocationAreaCreateReqVO extends LocationAreaBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaExcelVO.java new file mode 100644 index 0000000..cb651cf --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaExcelVO.java @@ -0,0 +1,40 @@ +package com.win.module.eam.controller.locationarea.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.eam.enums.DictTypeConstants; +import lombok.Data; + +/** + * 库区 Excel VO + * + * @author 超级管理员 + */ +@Data +public class LocationAreaExcelVO { + + @ExcelProperty("库区编号") + @ColumnWidth(value = 20) + private String number; + + @ExcelProperty("库区名称") + @ColumnWidth(value = 20) + private String name; + + @ExcelProperty(value = "类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.LOCATION_AREA_TYPE) + @ColumnWidth(value = 20) + private String type; + + @ExcelProperty(value = "是否可用", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + @ColumnWidth(value = 20) + private String available; + + @ExcelProperty("描述") + @ColumnWidth(value = 30) + private String description; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaExportReqVO.java new file mode 100644 index 0000000..07bd0aa --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaExportReqVO.java @@ -0,0 +1,22 @@ +package com.win.module.eam.controller.locationarea.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 库区 Excel 导出 Request VO,参数和 LocationAreaPageReqVO 是一致的") +@Data +public class LocationAreaExportReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "王五") + private String name; + + @Schema(description = "类型枚举辅材库、备品备件库、工具库、专用耗材库、易耗品库", example = "2") + private String type; + + @Schema(description = "是否可用") + private String available; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaPageReqVO.java new file mode 100644 index 0000000..8d3beef --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaPageReqVO.java @@ -0,0 +1,27 @@ +package com.win.module.eam.controller.locationarea.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; + +@Schema(description = "管理后台 - 库区分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class LocationAreaPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "王五") + private String name; + + @Schema(description = "类型枚举辅材库、备品备件库、工具库、专用耗材库、易耗品库", example = "2") + private String type; + + @Schema(description = "是否可用") + private String available; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaRespVO.java new file mode 100644 index 0000000..a960706 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.eam.controller.locationarea.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 LocationAreaRespVO extends LocationAreaBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaUpdateReqVO.java new file mode 100644 index 0000000..51d009c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/locationarea/vo/LocationAreaUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.locationarea.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 库区更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class LocationAreaUpdateReqVO extends LocationAreaBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/MaintainBackController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/MaintainBackController.java new file mode 100644 index 0000000..b39863e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/MaintainBackController.java @@ -0,0 +1,136 @@ +package com.win.module.eam.controller.maintainback; + +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.eam.controller.maintainback.vo.*; +import com.win.module.eam.convert.maintainback.MaintainBackConvert; +import com.win.module.eam.dal.dataobject.maintainback.MaintainBackDO; +import com.win.module.eam.service.maintainback.MaintainBackService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + + +@Tag(name = "管理后台 - 保养计划") +@RestController +@RequestMapping("/plan/maintain-back") +@Validated +public class MaintainBackController { + + @Resource + private MaintainBackService maintainBackService; + + @PostMapping("/create") + @Operation(summary = "创建保养计划") + @PreAuthorize("@ss.hasPermission('plan:maintain-back:create')") + public CommonResult createMaintainBack(@Valid @RequestBody MaintainBackCreateReqVO createReqVO) { + return success(maintainBackService.createMaintainBack(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新保养计划") + @PreAuthorize("@ss.hasPermission('plan:maintain-back:update')") + public CommonResult updateMaintainBack(@Valid @RequestBody MaintainBackUpdateReqVO updateReqVO) { + int result = maintainBackService.updateMaintainBack(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除保养计划") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('plan:maintain-back:delete')") + public CommonResult deleteMaintainBack(@RequestParam("id") Long id) { + int result = maintainBackService.deleteMaintainBack(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得保养计划") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('plan:maintain-back:query')") + public CommonResult getMaintainBack(@RequestParam("id") Long id) { + MaintainBackDO maintainBack = maintainBackService.getMaintainBack(id); + return success(MaintainBackConvert.INSTANCE.convert(maintainBack)); + } + + @GetMapping("/list") + @Operation(summary = "获得保养计划列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('plan:maintain-back:query')") + public CommonResult> getMaintainBackList(@RequestParam("ids") Collection ids) { + List list = maintainBackService.getMaintainBackList(ids); + return success(MaintainBackConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得保养计划分页") + @PreAuthorize("@ss.hasPermission('plan:maintain-back:query')") + public CommonResult> getMaintainBackPage(@Valid MaintainBackPageReqVO pageVO) { + PageResult pageResult = maintainBackService.getMaintainBackPage(pageVO); + return success(MaintainBackConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出保养计划 Excel") + @PreAuthorize("@ss.hasPermission('plan:maintain-back:export')") + @OperateLog(type = EXPORT) + public void exportMaintainBackExcel(@Valid MaintainBackExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = maintainBackService.getMaintainBackList(exportReqVO); + // 导出 Excel + List datas = MaintainBackConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "保养计划.xls", "数据", MaintainBackExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入保养计划模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "保养计划基本信息导入模板.xls", "保养计划基本信息列表", MaintainBackExcelVO.class, list); + } + + @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('plan:maintain-back:import')") + 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 list = ExcelUtils.read(file, MaintainBackExcelVO.class); + List errorList = maintainBackService.importMaintainBackList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackBaseVO.java new file mode 100644 index 0000000..3bbca8c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackBaseVO.java @@ -0,0 +1,58 @@ +package com.win.module.eam.controller.maintainback.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 MaintainBackBaseVO { + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "编号唯一标识不能为空") + private String number; + + @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "设备模具编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "设备模具编号不能为空") + private String deviceNumber; + + @Schema(description = "(旧)的执行周期") + private String oldCycle; + + @Schema(description = "(新)设备执行周期月、季度、半年、年") + private String newCycle; + + @Schema(description = "(旧)的执行周期-月") + private String oldCycleMonth; + + @Schema(description = "(新)设备执行周期-月") + private String newCycleMonth; + + @Schema(description = "(旧)的执行周期-周") + private String oldCycleWeek; + + @Schema(description = "(新)设备执行周期-周") + private String newCycleWeek; + + @Schema(description = "(旧)是否可用") + private String oldAvailable; + + @Schema(description = "(新)是否可用") + private String newAvailable; + + @Schema(description = "类型设备、模具枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "类型设备、模具枚举不能为空") + private String type; + + @Schema(description = "operator") + private String operation; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackCreateReqVO.java new file mode 100644 index 0000000..d4a5965 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.maintainback.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 MaintainBackCreateReqVO extends MaintainBackBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackExcelVO.java new file mode 100644 index 0000000..f86c8cc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackExcelVO.java @@ -0,0 +1,46 @@ +package com.win.module.eam.controller.maintainback.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 保养计划 Excel VO + * + * @author 超级管理员 + */ +@Data +public class MaintainBackExcelVO { + + @ExcelProperty("id") + private Long id; + + @ExcelProperty("编号唯一标识") + private String number; + + @ExcelProperty("名称") + private String name; + + @ExcelProperty("设备模具编号") + private String deviceNumber; + + @ExcelProperty("(旧)的执行周期") + private String oldCycle; + + @ExcelProperty("(新)设备执行周期月、季度、半年、年") + private String newCycle; + + @ExcelProperty("(旧)是否可用") + private String oldAvailable; + + @ExcelProperty("(新)是否可用") + private String newAvailable; + + @ExcelProperty("类型设备、模具枚举") + private String type; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackExportReqVO.java new file mode 100644 index 0000000..910f053 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackExportReqVO.java @@ -0,0 +1,43 @@ +package com.win.module.eam.controller.maintainback.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,参数和 MaintainBackPageReqVO 是一致的") +@Data +public class MaintainBackExportReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "芋艿") + private String name; + + @Schema(description = "设备模具编号") + private String deviceNumber; + + @Schema(description = "(旧)的执行周期") + private String oldCycle; + + @Schema(description = "(新)设备执行周期月、季度、半年、年") + private String newCycle; + + @Schema(description = "(旧)是否可用") + private String oldAvailable; + + @Schema(description = "(新)是否可用") + private String newAvailable; + + @Schema(description = "类型设备、模具枚举", example = "1") + private String type; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackPageReqVO.java new file mode 100644 index 0000000..4ad15fa --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackPageReqVO.java @@ -0,0 +1,48 @@ +package com.win.module.eam.controller.maintainback.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 MaintainBackPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "芋艿") + private String name; + + @Schema(description = "设备模具编号") + private String deviceNumber; + + @Schema(description = "(旧)的执行周期") + private String oldCycle; + + @Schema(description = "(新)设备执行周期月、季度、半年、年") + private String newCycle; + + @Schema(description = "(旧)是否可用") + private String oldAvailable; + + @Schema(description = "(新)是否可用") + private String newAvailable; + + @Schema(description = "类型设备、模具枚举", example = "1") + private String type; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackRespVO.java new file mode 100644 index 0000000..2fa9534 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.eam.controller.maintainback.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 MaintainBackRespVO extends MaintainBackBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "4141") + private Long id; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackUpdateReqVO.java new file mode 100644 index 0000000..7c8ac7a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintainback/vo/MaintainBackUpdateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.eam.controller.maintainback.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 MaintainBackUpdateReqVO extends MaintainBackBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "4141") + @NotNull(message = "id不能为空") + private Long id; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/MaintenanceTurntoController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/MaintenanceTurntoController.java new file mode 100644 index 0000000..4047ab4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/MaintenanceTurntoController.java @@ -0,0 +1,139 @@ +package com.win.module.eam.controller.maintenanceturnto; + +import com.win.module.eam.controller.maintenanceturnto.vo.*; +import io.swagger.v3.oas.annotations.Parameters; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +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.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.*; +import java.io.IOException; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.pojo.CommonResult; +import static com.win.framework.common.pojo.CommonResult.success; + +import com.win.framework.excel.core.util.ExcelUtils; + +import com.win.framework.operatelog.core.annotations.OperateLog; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.win.module.eam.dal.dataobject.maintenanceturnto.MaintenanceTurntoDO; +import com.win.module.eam.convert.maintenanceturnto.MaintenanceTurntoConvert; +import com.win.module.eam.service.maintenanceturnto.MaintenanceTurntoService; +import org.springframework.web.multipart.MultipartFile; + +@Tag(name = "管理后台 - 维修转办记录") +@RestController +@RequestMapping("/eam/maintenance-turnto") +@Validated +public class MaintenanceTurntoController { + + @Resource + private MaintenanceTurntoService maintenanceTurntoService; + + @PostMapping("/create") + @Operation(summary = "创建维修转办记录") + @PreAuthorize("@ss.hasPermission('eam:maintenance-turnto:create')") + public CommonResult createMaintenanceTurnto(@Valid @RequestBody MaintenanceTurntoCreateReqVO createReqVO) { + return success(maintenanceTurntoService.createMaintenanceTurnto(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新维修转办记录") + @PreAuthorize("@ss.hasPermission('eam:maintenance-turnto:update')") + public CommonResult updateMaintenanceTurnto(@Valid @RequestBody MaintenanceTurntoUpdateReqVO updateReqVO) { + int result = maintenanceTurntoService.updateMaintenanceTurnto(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除维修转办记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:maintenance-turnto:delete')") + public CommonResult deleteMaintenanceTurnto(@RequestParam("id") Long id) { + int result = maintenanceTurntoService.deleteMaintenanceTurnto(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得维修转办记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('eam:maintenance-turnto:query')") + public CommonResult getMaintenanceTurnto(@RequestParam("id") Long id) { + MaintenanceTurntoDO maintenanceTurnto = maintenanceTurntoService.getMaintenanceTurnto(id); + return success(MaintenanceTurntoConvert.INSTANCE.convert(maintenanceTurnto)); + } + + @GetMapping("/list") + @Operation(summary = "获得维修转办记录列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('eam:maintenance-turnto:query')") + public CommonResult> getMaintenanceTurntoList(@RequestParam("ids") Collection ids) { + List list = maintenanceTurntoService.getMaintenanceTurntoList(ids); + return success(MaintenanceTurntoConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得维修转办记录分页") + @PreAuthorize("@ss.hasPermission('eam:maintenance-turnto:query')") + public CommonResult> getMaintenanceTurntoPage(@Valid MaintenanceTurntoPageReqVO pageVO) { + PageResult pageResult = maintenanceTurntoService.getMaintenanceTurntoPage(pageVO); + return success(MaintenanceTurntoConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出维修转办记录 Excel") + @PreAuthorize("@ss.hasPermission('eam:maintenance-turnto:export')") + @OperateLog(type = EXPORT) + public void exportMaintenanceTurntoExcel(@Valid MaintenanceTurntoExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = maintenanceTurntoService.getMaintenanceTurntoList(exportReqVO); + // 导出 Excel + List datas = MaintenanceTurntoConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "维修转办记录.xls", "数据", MaintenanceTurntoExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入维修转办记录模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "维修转办记录基本信息导入模板.xls", "维修转办记录基本信息列表", MaintenanceTurntoExcelVO.class, list); + } + + @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('eam:maintenance-turnto:import')") + 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 list = ExcelUtils.read(file, MaintenanceTurntoExcelVO.class); + List errorList = maintenanceTurntoService.importMaintenanceTurntoList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoBaseVO.java new file mode 100644 index 0000000..457eddc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoBaseVO.java @@ -0,0 +1,57 @@ +package com.win.module.eam.controller.maintenanceturnto.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 MaintenanceTurntoBaseVO { + + @Schema(description = "维系工单号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "维系工单号不能为空") + private String maintenanceNumber; + + @Schema(description = "设备模具编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "设备模具编号不能为空") + private String deviceNumber; + + @Schema(description = "厂区编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "厂区编号不能为空") + private String factoryAreaNumber; + + @Schema(description = "转办人id", requiredMode = Schema.RequiredMode.REQUIRED, example = "12303") + @NotNull(message = "转办人id不能为空") + private Long turnToUserid; + + @Schema(description = "接收人id", requiredMode = Schema.RequiredMode.REQUIRED, example = "17886") + @NotNull(message = "接收人id不能为空") + private Long receiverUserid; + + @Schema(description = "转办前类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "转办前类型不能为空") + private String turnToType; + + @Schema(description = "转办后的类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "转办后的类型不能为空") + private String receiverType; + + @Schema(description = "地点ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "15543") + @NotNull(message = "地点ID不能为空") + private String siteId; + + @Schema(description = "是否可用", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "是否可用不能为空") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "并发乐观锁不能为空") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoCreateReqVO.java new file mode 100644 index 0000000..9e5af45 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoCreateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.eam.controller.maintenanceturnto.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 维修转办记录创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MaintenanceTurntoCreateReqVO extends MaintenanceTurntoBaseVO { + + @Schema(description = "部门id", requiredMode = Schema.RequiredMode.REQUIRED, example = "10285") + @NotNull(message = "部门id不能为空") + private Long deptId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoExcelVO.java new file mode 100644 index 0000000..5539f0e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoExcelVO.java @@ -0,0 +1,52 @@ +package com.win.module.eam.controller.maintenanceturnto.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 MaintenanceTurntoExcelVO { + + @ExcelProperty("维系工单号") + private String maintenanceNumber; + + @ExcelProperty("设备模具编号") + private String deviceNumber; + + @ExcelProperty("厂区编号") + private String factoryAreaNumber; + + @ExcelProperty("转办人id") + private Long turnToUserid; + + @ExcelProperty("接收人id") + private Long receiverUserid; + + @ExcelProperty("转办前类型") + private String turnToType; + + @ExcelProperty("转办后的类型") + private String receiverType; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoExportReqVO.java new file mode 100644 index 0000000..ac9a272 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoExportReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.eam.controller.maintenanceturnto.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,参数和 MaintenanceTurntoPageReqVO 是一致的") +@Data +public class MaintenanceTurntoExportReqVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoPageReqVO.java new file mode 100644 index 0000000..a92aad8 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoPageReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.maintenanceturnto.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 MaintenanceTurntoPageReqVO extends PageParam { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoRespVO.java new file mode 100644 index 0000000..0c8ae7c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.eam.controller.maintenanceturnto.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 MaintenanceTurntoRespVO extends MaintenanceTurntoBaseVO { + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoUpdateReqVO.java new file mode 100644 index 0000000..8c0ad83 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/maintenanceturnto/vo/MaintenanceTurntoUpdateReqVO.java @@ -0,0 +1,22 @@ +package com.win.module.eam.controller.maintenanceturnto.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 维修转办记录更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MaintenanceTurntoUpdateReqVO extends MaintenanceTurntoBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "12530") + @NotNull(message = "id不能为空") + private Long id; + + @Schema(description = "部门id", requiredMode = Schema.RequiredMode.REQUIRED, example = "10285") + @NotNull(message = "部门id不能为空") + private Long deptId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/MoldAccountsController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/MoldAccountsController.java new file mode 100644 index 0000000..54974c8 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/MoldAccountsController.java @@ -0,0 +1,180 @@ +package com.win.module.eam.controller.moldaccounts; + +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.eam.controller.moldaccounts.vo.*; +import com.win.module.eam.convert.moldaccounts.MoldAccountsConvert; +import com.win.module.eam.dal.dataobject.moldaccounts.MoldAccountsDO; +import com.win.module.eam.service.moldaccounts.MoldAccountsService; +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.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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 模具台账") +@RestController +@RequestMapping("/eam/mold-accounts") +@Validated +public class MoldAccountsController { + + @Resource + private MoldAccountsService moldAccountsService; + + @PostMapping("/create") + @Operation(summary = "创建模具台账") +// @PreAuthorize("@ss.hasPermission('eam:mold-accounts:create')") + public CommonResult createMoldAccounts(@Valid @RequestBody MoldAccountsCreateReqVO createReqVO) { + return success(moldAccountsService.createMoldAccounts(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新模具台账") +// @PreAuthorize("@ss.hasPermission('eam:mold-accounts:update')") + public CommonResult updateMoldAccounts(@Valid @RequestBody MoldAccountsUpdateReqVO updateReqVO) { + int result = moldAccountsService.updateMoldAccounts(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除模具台账") + @Parameter(name = "id", description = "编号", required = true) +// @PreAuthorize("@ss.hasPermission('eam:mold-accounts:delete')") + public CommonResult deleteMoldAccounts(@RequestParam("id") Long id) { + int result = moldAccountsService.deleteMoldAccounts(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得模具台账") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:mold-accounts:query')") + public CommonResult getMoldAccounts(@RequestParam("id") Long id) { + MoldAccountsDO moldAccounts = moldAccountsService.getMoldAccounts(id); + return success(MoldAccountsConvert.INSTANCE.convert(moldAccounts)); + } + + @GetMapping("/list") + @Operation(summary = "获得模具台账列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:mold-accounts:query')") + public CommonResult> getMoldAccountsList(@RequestParam("ids") Collection ids) { + List list = moldAccountsService.getMoldAccountsList(ids); + return success(MoldAccountsConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得模具台账分页") +// @PreAuthorize("@ss.hasPermission('eam:mold-accounts:query')") + public CommonResult> getMoldAccountsPage(@Valid MoldAccountsPageReqVO pageVO) { + PageResult pageResult = moldAccountsService.getMoldAccountsPage(pageVO); + return success(MoldAccountsConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出模具台账 Excel") +// @PreAuthorize("@ss.hasPermission('eam:mold-accounts:export')") + @OperateLog(type = EXPORT) + public void exportMoldAccountsExcel(@Valid MoldAccountsExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = moldAccountsService.getMoldAccountsList(exportReqVO); + // 导出 Excel + List datas = MoldAccountsConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "模具台账.xls", "数据", MoldAccountsExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入模具台账模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "模具台账基本信息导入模板.xls", "模具台账基本信息列表", MoldAccountsExcelVO.class, list); + } + + @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('eam:mold-accounts:import')") + 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 list = ExcelUtils.read(file, MoldAccountsExcelVO.class); + List errorList = moldAccountsService.importMoldAccountsList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + @GetMapping("/getDetailsByNumber") + @Operation(summary = "APP根据模具号查询信息") + @Parameter(name = "number", description = "模具号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-main:query')") + public CommonResult> getDetailsByNumber(@RequestParam("number") String number,String type, String flag) { + Map map = moldAccountsService.getDetailsByNumber(number,type,flag); + return success(map); + } + + @GetMapping("/selectData") + @Operation(summary = "APP根据厂区编码获取厂区下的正常模具列表") + @Parameter(name = "factoryAreNumber", description = "厂区号", required = false, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-main:query')") + @Parameter(name = "factoryAreaNumber", description = "厂区number 不传默认查当前人所属厂区" , required = true, example = "1024") + public CommonResult>> selectData(String factoryAreaNumber) { + List> maps = moldAccountsService.selectData(factoryAreaNumber); + return success(maps); + } + + @GetMapping("/getAppPage") + @Operation(summary = "获得APP模具列表分页") + @Parameters({ + @Parameter(name = "pageSize", description = "每页几条", required = true), + @Parameter(name = "pageNo", description = "第几页", example = "1"), + @Parameter(name = "name", description = "设备名称"), + @Parameter(name = "number", description = "编码"), + @Parameter(name = "factory_area_number", description = "厂区编码"), + @Parameter(name = "type", description = "设备类型"), + }) + public CommonResult> getAppPage(@Valid MoldAccountsPageReqVO pageVO) { + PageResult pageResult = moldAccountsService.getAppPage(pageVO); + return success(MoldAccountsConvert.INSTANCE.convertPage(pageResult)); + } + + + @PostMapping("/noPage") + @Operation(summary = "获得备件台账分页") +// @PreAuthorize("@ss.hasPermission('eam:mold-accounts:query')") + public CommonResult> getMoldAccountsNoPage(@Valid @RequestBody MoldAccountsPageReqVO pageVO) { + List moldAccountsDOList = moldAccountsService.selectListNoPage(pageVO); + return success(MoldAccountsConvert.INSTANCE.convertList(moldAccountsDOList)); + } + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsBaseVO.java new file mode 100644 index 0000000..42a2a32 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsBaseVO.java @@ -0,0 +1,91 @@ +package com.win.module.eam.controller.moldaccounts.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +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 MoldAccountsBaseVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "编号不能为空") + private String number; + + @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "规格型号") + private String specification; + + @Schema(description = "模具类型", example = "1") + private String type; + + @Schema(description = "所属厂区编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "所属厂区编号不能为空") + private String factoryAreaNumber; + + @Schema(description = "采购时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "采购时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime purchaseTime; + + @Schema(description = "采购人", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "采购人不能为空") + private String purchaser; + + @Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "供应商编号不能为空") + private String supplierNumber; + + @Schema(description = "出厂日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime productionDate; + + @Schema(description = "购买价格", example = "14660") + private BigDecimal purchasePrice; + + @Schema(description = "是否客户资产TRUE/FALSE") + private String isClientAssets; + + @Schema(description = "生产次数 用来产生保养计划,保养计划完成后归零。") + private Long frequency; + + @Schema(description = "节拍 生产一个零件所需时间,对系统没影响") + private Long beat; + + @Schema(description = "地点ID", example = "19218") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer concurrencyStamp; + + @Schema(description = "状态0正常1维修中") + private String status; + + @Schema(description = "描述") + private String describes; + + @Schema(description = "id") + private Long id; + + @Schema(description = "图片") + private String images; + + @Schema(description = "所属部门") + private Long deptId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsCreateReqVO.java new file mode 100644 index 0000000..c4a21e8 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.moldaccounts.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 模具台账创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MoldAccountsCreateReqVO extends MoldAccountsBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsExcelVO.java new file mode 100644 index 0000000..a419b30 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsExcelVO.java @@ -0,0 +1,74 @@ +package com.win.module.eam.controller.moldaccounts.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 模具台账 Excel VO + * + * @author 超级管理员 + */ +@Data +public class MoldAccountsExcelVO { + + @ExcelProperty("编号") + private String number; + + @ExcelProperty("名称") + private String name; + + @ExcelProperty("规格型号") + private String specification; + + @ExcelProperty("模具类型") + private String type; + + @ExcelProperty("所属厂区编号") + private String factoryAreaNumber; + + @ExcelProperty("采购时间") + private LocalDateTime purchaseTime; + + @ExcelProperty("采购部门") + private Long deptId; + + @ExcelProperty("采购人") + private String purchaser; + + @ExcelProperty("供应商编号") + private String supplierNumber; + + @ExcelProperty("出厂日期") + private LocalDateTime productionDate; + + @ExcelProperty("购买价格") + private BigDecimal purchasePrice; + + @ExcelProperty("是否客户资产TRUE/FALSE") + private String isClientAssets; + + @ExcelProperty("生产次数 用来产生保养计划,保养计划完成后归零。") + private Long frequency; + + @ExcelProperty("节拍 生产一个零件所需时间,对系统没影响") + private Long beat; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + + @ExcelProperty("描述") + private String describes; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsExportReqVO.java new file mode 100644 index 0000000..b3b80cf --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsExportReqVO.java @@ -0,0 +1,25 @@ +package com.win.module.eam.controller.moldaccounts.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 模具台账 Excel 导出 Request VO,参数和 MoldAccountsPageReqVO 是一致的") +@Data +public class MoldAccountsExportReqVO { + + @Schema(description = "编号") + private String number; + + @Schema(description = "名称", example = "赵六") + private String name; + + @Schema(description = "模具类型", example = "1") + private String type; + + @Schema(description = "所属厂区", example = "1") + private String factoryAreaNumber; + + @Schema(description = "模具状态", example = "1") + private String status; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsPageReqVO.java new file mode 100644 index 0000000..2b35aa7 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsPageReqVO.java @@ -0,0 +1,40 @@ +package com.win.module.eam.controller.moldaccounts.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; + +@Schema(description = "管理后台 - 模具台账分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MoldAccountsPageReqVO extends PageParam { + + @Schema(description = "编号") + private String number; + + @Schema(description = "名称", example = "赵六") + private String name; + + @Schema(description = "模具类型", example = "1") + private String type; + + @Schema(description = "类型名称", example = "1") + private String typeName; + + @Schema(description = "厂区名称", example = "1") + private String factoryAreaName; + + @Schema(description = "厂区编码", example = "1") + private String factoryAreaNumber; + + @Schema(description = "描述", example = "1") + private String describes; + + @Schema(description = "状态", example = "1") + private String status; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsRespVO.java new file mode 100644 index 0000000..2aefd75 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsRespVO.java @@ -0,0 +1,22 @@ +package com.win.module.eam.controller.moldaccounts.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 MoldAccountsRespVO extends MoldAccountsBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "类型名称") + private String typeName; + + @Schema(description = "厂区名称") + private String factoryAreaName; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsUpdateReqVO.java new file mode 100644 index 0000000..80f28d0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldaccounts/vo/MoldAccountsUpdateReqVO.java @@ -0,0 +1,15 @@ +package com.win.module.eam.controller.moldaccounts.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 模具台账更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MoldAccountsUpdateReqVO extends MoldAccountsBaseVO { + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldinspectionjob/MoldInspectionJobDetailController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldinspectionjob/MoldInspectionJobDetailController.java new file mode 100644 index 0000000..b2a4dfd --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldinspectionjob/MoldInspectionJobDetailController.java @@ -0,0 +1,149 @@ +package com.win.module.eam.controller.moldinspectionjob; + +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.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobDetailConvert; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailDO; +import com.win.module.eam.service.deviceinspectionjob.DeviceInspectionJobDetailService; +import com.win.module.eam.service.moldinspectionjob.MoldInspectionJobDetailService; +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.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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 检修工单子") +@RestController +@RequestMapping("/eam/mold-inspection-job-detail") +@Validated +public class MoldInspectionJobDetailController { + + @Resource + private MoldInspectionJobDetailService moldInspectionDetailService; + + @PostMapping("/create") + @Operation(summary = "创建检修工单子") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:create')") + public CommonResult createDeviceInspectionDetail(@Valid @RequestBody DeviceInspectionJobDetailCreateReqVO createReqVO) { + return success(moldInspectionDetailService.createDeviceInspectionDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新检修工单子") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:update')") + public CommonResult updateDeviceInspectionDetail(@Valid @RequestBody DeviceInspectionJobDetailUpdateReqVO updateReqVO) { + int result = moldInspectionDetailService.updateDeviceInspectionDetail(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除检修工单子") + @Parameter(name = "id", description = "编号", required = true) +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:delete')") + public CommonResult deleteDeviceInspectionDetail(@RequestParam("id") Long id) { + int result = moldInspectionDetailService.deleteDeviceInspectionDetail(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得检修工单子") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:query')") + public CommonResult getDeviceInspectionDetail(@RequestParam("id") Long id) { + DeviceInspectionJobDetailDO deviceInspectionDetail = moldInspectionDetailService.getDeviceInspectionDetail(id); + return success(DeviceInspectionJobDetailConvert.INSTANCE.convert(deviceInspectionDetail)); + } + + @GetMapping("/list") + @Operation(summary = "获得检修工单子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:query')") + public CommonResult> getDeviceInspectionDetailList(@RequestParam("ids") Collection ids) { + List list = moldInspectionDetailService.getDeviceInspectionDetailList(ids); + return success(DeviceInspectionJobDetailConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得检修工单子分页") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:query')") + public CommonResult> getDeviceInspectionDetailPage(@Valid DeviceInspectionJobDetailPageReqVO pageVO) { + PageResult pageResult = moldInspectionDetailService.getDeviceInspectionDetailPage(pageVO); + return success(DeviceInspectionJobDetailConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出检修工单子 Excel") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:export')") + @OperateLog(type = EXPORT) + public void exportDeviceInspectionDetailExcel(@Valid DeviceInspectionJobDetailExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = moldInspectionDetailService.getDeviceInspectionDetailList(exportReqVO); + // 导出 Excel + List datas = DeviceInspectionJobDetailConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "检修工单子.xls", "数据", DeviceInspectionJobDetailExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入检修工单子模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "检修工单子基本信息导入模板.xls", "检修工单子基本信息列表", DeviceInspectionJobDetailExcelVO.class, list); + } + + @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('eam:device-inspection-job-detail:import')") + 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 list = ExcelUtils.read(file, DeviceInspectionJobDetailExcelVO.class); + List errorList = moldInspectionDetailService.importDeviceInspectionDetailList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + /** + * 根据检修工单号查询工单子项信息列表 + * @param + * @return + */ + @GetMapping("/selectListByNumber") + @Operation(summary = "获得检修工单子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-detail:query')") + public CommonResult> selectListByNumber(@RequestParam("number") String number) { + List list = moldInspectionDetailService.selectListByNumber(number); + return success(DeviceInspectionJobDetailConvert.INSTANCE.convertList(list)); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldinspectionjob/MoldInspectionJobDetailItemController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldinspectionjob/MoldInspectionJobDetailItemController.java new file mode 100644 index 0000000..0f1035f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldinspectionjob/MoldInspectionJobDetailItemController.java @@ -0,0 +1,136 @@ +package com.win.module.eam.controller.moldinspectionjob; + +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.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobDetailItemConvert; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailItemDO; +import com.win.module.eam.service.deviceinspectionjob.DeviceInspectionJobDetailItemService; +import com.win.module.eam.service.moldinspectionjob.MoldInspectionJobDetailItemService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 检修工单子表与备件关系") +@RestController +@RequestMapping("/eam/mold-inspection-job-detail-item") +@Validated +public class MoldInspectionJobDetailItemController { + + @Resource + private MoldInspectionJobDetailItemService moldInspectionDetailItemService; + + @PostMapping("/create") + @Operation(summary = "创建检修工单子表与备件关系") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:create')") + public CommonResult createDeviceInspectionDetailItem(@Valid @RequestBody DeviceInspectionJobDetailItemCreateReqVO createReqVO) { + return success(moldInspectionDetailItemService.createDeviceInspectionDetailItem(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新检修工单子表与备件关系") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:update')") + public CommonResult updateDeviceInspectionDetailItem(@Valid @RequestBody DeviceInspectionJobDetailItemUpdateReqVO updateReqVO) { + int result = moldInspectionDetailItemService.updateDeviceInspectionDetailItem(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除检修工单子表与备件关系") + @Parameter(name = "id", description = "编号", required = true) +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:delete')") + public CommonResult deleteDeviceInspectionDetailItem(@RequestParam("id") Long id) { + int result = moldInspectionDetailItemService.deleteDeviceInspectionDetailItem(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得检修工单子表与备件关系") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:query')") + public CommonResult getDeviceInspectionDetailItem(@RequestParam("id") Long id) { + DeviceInspectionJobDetailItemDO deviceInspectionDetailItem = moldInspectionDetailItemService.getDeviceInspectionDetailItem(id); + return success(DeviceInspectionJobDetailItemConvert.INSTANCE.convert(deviceInspectionDetailItem)); + } + + @GetMapping("/list") + @Operation(summary = "获得检修工单子表与备件关系列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:query')") + public CommonResult> getDeviceInspectionDetailItemList(@RequestParam("ids") Collection ids) { + List list = moldInspectionDetailItemService.getDeviceInspectionDetailItemList(ids); + return success(DeviceInspectionJobDetailItemConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得检修工单子表与备件关系分页") + @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:query')") + public CommonResult> getDeviceInspectionDetailItemPage(@Valid DeviceInspectionJobDetailItemPageReqVO pageVO) { + PageResult pageResult = moldInspectionDetailItemService.getDeviceInspectionDetailItemPage(pageVO); + return success(DeviceInspectionJobDetailItemConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出检修工单子表与备件关系 Excel") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:export')") + @OperateLog(type = EXPORT) + public void exportDeviceInspectionDetailItemExcel(@Valid DeviceInspectionJobDetailItemExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = moldInspectionDetailItemService.getDeviceInspectionDetailItemList(exportReqVO); + // 导出 Excel + List datas = DeviceInspectionJobDetailItemConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "检修工单子表与备件关系.xls", "数据", DeviceInspectionJobDetailItemExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入检修工单子表与备件关系模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "检修工单子表与备件关系基本信息导入模板.xls", "检修工单子表与备件关系基本信息列表", DeviceInspectionJobDetailItemExcelVO.class, list); + } + + @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('eam:device-inspection-job-detail-item:import')") + 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 list = ExcelUtils.read(file, DeviceInspectionJobDetailItemExcelVO.class); + List errorList = moldInspectionDetailItemService.importDeviceInspectionDetailItemList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldinspectionjob/MoldInspectionJobMainController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldinspectionjob/MoldInspectionJobMainController.java new file mode 100644 index 0000000..15bcc05 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldinspectionjob/MoldInspectionJobMainController.java @@ -0,0 +1,218 @@ +package com.win.module.eam.controller.moldinspectionjob; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobMainConvert; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobMainDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionReportDo; +import com.win.module.eam.service.deviceinspectionjob.DeviceInspectionJobMainService; +import com.win.module.eam.service.moldinspectionjob.MoldInspectionJobMainService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 检修工单主") +@RestController +@RequestMapping("/eam/mold-inspection-job-main") +@Validated +public class MoldInspectionJobMainController { + + @Resource + private MoldInspectionJobMainService moldInspectionMainService; + + @PostMapping("/create") + @Operation(summary = "创建检修工单主") + @PreAuthorize("@ss.hasPermission('eam:mold-inspection-job-main:create') or @ss.hasPermission('eam:mold-inspection-job-main:createAPP')") + public CommonResult createDeviceInspectionMain(@Valid @RequestBody DeviceInspectionJobMainCreateReqVO createReqVO) { + return success(moldInspectionMainService.createDeviceInspectionMain(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新检修工单主") + @PreAuthorize("@ss.hasPermission('eam:mold-inspection-job-main:update') or @ss.hasPermission('eam:mold-inspection-job-main:updateAPP')") + public CommonResult updateDeviceInspectionMain(@Valid @RequestBody DeviceInspectionJobMainUpdateReqVO updateReqVO) { + int result = moldInspectionMainService.updateDeviceInspectionMain(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除检修工单主") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:mold-inspection-job-main:delete') or @ss.hasPermission('eam:mold-inspection-job-main:deleteAPP')") + public CommonResult deleteDeviceInspectionMain(@RequestParam("id") Long id) { + int result = moldInspectionMainService.deleteDeviceInspectionMain(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得检修工单主") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:mold-inspection-job-main:query')") + public CommonResult getDeviceInspectionMain(@RequestParam("id") Long id) { + DeviceInspectionJobMainDO deviceInspectionMain = moldInspectionMainService.getDeviceInspectionMain(id); + return success(DeviceInspectionJobMainConvert.INSTANCE.convert(deviceInspectionMain)); + } + + @GetMapping("/list") + @Operation(summary = "获得检修工单主列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:mold-inspection-job-main:query')") + public CommonResult> getDeviceInspectionMainList(@RequestParam("ids") Collection ids) { + List list = moldInspectionMainService.getDeviceInspectionMainList(ids); + return success(DeviceInspectionJobMainConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得检修工单主分页") +// @PreAuthorize("@ss.hasPermission('eam:mold-inspection-job-main:query')") + public CommonResult> getDeviceInspectionMainPage(@Valid DeviceInspectionJobMainPageReqVO pageVO) { + PageResult pageResult = moldInspectionMainService.getDeviceInspectionMainPage(pageVO); + return success(DeviceInspectionJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + + @PostMapping("/senior") + @Operation(summary = "获得检修工单分页") +// @PreAuthorize("@ss.hasPermission('eam:mold-inspection-job-main:query')") + public CommonResult> getInspectionJobMainSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = moldInspectionMainService.getInspectionJobMainSenior(conditions); + PageResult result = DeviceInspectionJobMainConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + + @GetMapping("/export-excel") + @Operation(summary = "导出检修工单主 Excel") + @PreAuthorize("@ss.hasPermission('eam:mold-inspection-job-main:export')") + @OperateLog(type = EXPORT) + public void exportDeviceInspectionMainExcel(@Valid DeviceInspectionJobMainExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = moldInspectionMainService.getDeviceInspectionMainList(exportReqVO); + // 导出 Excel + List datas = DeviceInspectionJobMainConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "检修工单主.xls", "数据", DeviceInspectionJobMainExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入检修工单主模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "检修工单主基本信息导入模板.xls", "检修工单主基本信息列表", DeviceInspectionJobMainExcelVO.class, list); + } + + @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('eam:mold-inspection-job-main:import')") + 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 list = ExcelUtils.read(file, DeviceInspectionJobMainExcelVO.class); + List errorList = moldInspectionMainService.importDeviceInspectionMainList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + @GetMapping("/getAppPage") + @Operation(summary = "获得APP模具或设备工单分页") + @Parameters({ + @Parameter(name = "flag", description = "1从我的进入0或者不填从首页进入", required = true), + @Parameter(name = "type", description = "DEVICE设备MOLD模具", example = "1"), + }) + public CommonResult> getAppPage(@Valid DeviceInspectionJobMainPageReqVO pageVO) { + PageResult pageResult = moldInspectionMainService.getAppPage(pageVO); + return success(DeviceInspectionJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/orderClickFinish") + @Operation(summary = "检修点击完成") + @PreAuthorize("@ss.hasPermission('eam:mold-inspection-job-main:orderClickFinish') or @ss.hasPermission('eam:mold-inspection-job-main:orderClickFinishAPP')") + @Parameter(name = "id", description = "检修工单id", required = true) + public CommonResult orderClickFinish(@RequestParam("id") Long id) { + int result = moldInspectionMainService.onClick(id); + return success(result > 0); + } + + @GetMapping("/orderClickVerify") + @Operation(summary = "检修点击验证") + @PreAuthorize("@ss.hasPermission('eam:mold-inspection-job-main:orderClickVerify') or @ss.hasPermission('eam:mold-inspection-job-main:orderClickVerifyPP')") + @Parameter(name = "id", description = "检修工单id", required = true) + @Parameter(name = "verifyContent", description = "验证内容可选填", required = false) + public CommonResult verifyContent(@RequestParam("id") Long id,String verifyContent) { + int result = moldInspectionMainService.onVerify(id,verifyContent); + return success(result > 0); + } + + + @PostMapping("/createPC") + @Operation(summary = "创建检修工单主") + @PreAuthorize("@ss.hasPermission('eam:mold-inspection-job-main:create')") + public CommonResult createDeviceInspectionMainPC(@Valid @RequestBody DeviceInspectionJobMainCreateReqVO createReqVO) { + return success(moldInspectionMainService.createDeviceInspectionMainPC(createReqVO)); + } + + + @GetMapping("/noPage") + @Operation(summary = "获得检修工单主分页") +// @PreAuthorize("@ss.hasPermission('eam:mold-inspection-job-main:query')") + public CommonResult> getDeviceInspectionMainNoPage(@Valid DeviceInspectionJobMainPageReqVO pageVO) { + List list = moldInspectionMainService.getDeviceInspectionMainNoPage(pageVO); + return success(DeviceInspectionJobMainConvert.INSTANCE.convertList(list)); + } + + + + + @GetMapping("/getInspectionReport") + @Operation(summary = "保养打印单生成子单") + public CommonResult> getMaintainReport(DeviceInspectionReportReqVo deviceInspectionReportReqVo) { + DeviceInspectionReportDo deviceInspectionReportDo = DeviceInspectionJobMainConvert.INSTANCE.convert(deviceInspectionReportReqVo); + return success(moldInspectionMainService.getInspectionReport(deviceInspectionReportDo)); + } + + + @GetMapping("/getInspectionReportMainInfo") + @Operation(summary = "保养打印单生成主单") + public CommonResult> getMaintainReportMainInfo(DeviceInspectionReportReqVo deviceInspectionReportReqVo) { + DeviceInspectionReportDo deviceInspectionReportDo = new DeviceInspectionReportDo(); + deviceInspectionReportDo.setId(deviceInspectionReportReqVo.getId()); + List resultList = moldInspectionMainService.getInspectionReportMainInfo(deviceInspectionReportDo); + return success(resultList); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintainjob/MoldMaintainJobDetailController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintainjob/MoldMaintainJobDetailController.java new file mode 100644 index 0000000..6849b58 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintainjob/MoldMaintainJobDetailController.java @@ -0,0 +1,144 @@ +package com.win.module.eam.controller.moldmaintainjob; + +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.convert.devicemaintainjob.DeviceMaintainJobDetailConvert; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobDetailDO; +import com.win.module.eam.service.moldmaintainjob.MoldMaintainJobDetailService; +import io.swagger.v3.oas.annotations.Parameters; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +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.*; +import javax.servlet.http.*; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.*; +import java.io.IOException; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.pojo.CommonResult; +import static com.win.framework.common.pojo.CommonResult.success; + +import com.win.framework.excel.core.util.ExcelUtils; + +import com.win.framework.operatelog.core.annotations.OperateLog; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.*; + +import org.springframework.web.multipart.MultipartFile; + +@Tag(name = "管理后台 - 保养工单子") +@RestController +@RequestMapping("/eam/mold-maintain-job-detail") +@Validated +public class MoldMaintainJobDetailController { + + @Resource + private MoldMaintainJobDetailService moldMaintainJobDetailService; + + @PostMapping("/create") + @Operation(summary = "创建保养工单子") + //@PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-detail:create')") + public CommonResult createDeviceMaintainOrderDetail(@Valid @RequestBody DeviceMaintainJobDetailCreateReqVO createReqVO) { + return success(moldMaintainJobDetailService.createDeviceMaintainOrderDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新保养工单子") + //@PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-detail:update')") + public CommonResult updateDeviceMaintainOrderDetail(@Valid @RequestBody DeviceMaintainJobDetailUpdateReqVO updateReqVO) { + int result = moldMaintainJobDetailService.updateDeviceMaintainOrderDetail(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除保养工单子") + @Parameter(name = "id", description = "编号", required = true) + //@PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-detail:delete')") + public CommonResult deleteDeviceMaintainOrderDetail(@RequestParam("id") Long id) { + int result = moldMaintainJobDetailService.deleteDeviceMaintainOrderDetail(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得保养工单子") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-detail:query')") + public CommonResult getDeviceMaintainOrderDetail(@RequestParam("id") Long id) { + DeviceMaintainJobDetailDO deviceMaintainOrderDetail = moldMaintainJobDetailService.getDeviceMaintainOrderDetail(id); + return success(DeviceMaintainJobDetailConvert.INSTANCE.convert(deviceMaintainOrderDetail)); + } + + @GetMapping("/list") + @Operation(summary = "获得保养工单子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-detail:query')") + public CommonResult> getDeviceMaintainOrderDetailList(@RequestParam("ids") Collection ids) { + List list = moldMaintainJobDetailService.getDeviceMaintainOrderDetailList(ids); + return success(DeviceMaintainJobDetailConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得保养工单子分页") + //@PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-detail:query')") + public CommonResult> getDeviceMaintainOrderDetailPage(@Valid DeviceMaintainJobDetailPageReqVO pageVO) { + PageResult pageResult = moldMaintainJobDetailService.getDeviceMaintainOrderDetailPage(pageVO); + return success(DeviceMaintainJobDetailConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出保养工单子 Excel") + //@PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-detail:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMaintainOrderDetailExcel(@Valid DeviceMaintainJobDetailExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = moldMaintainJobDetailService.getDeviceMaintainOrderDetailList(exportReqVO); + // 导出 Excel + List datas = DeviceMaintainJobDetailConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "保养工单子.xls", "数据", DeviceMaintainJobDetailExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入保养工单子模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "保养工单子基本信息导入模板.xls", "保养工单子基本信息列表", DeviceMaintainJobDetailExcelVO.class, list); + } + + @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('eam:mold-maintain-job-detail:import')") + 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 list = ExcelUtils.read(file, DeviceMaintainJobDetailExcelVO.class); + List errorList = moldMaintainJobDetailService.importDeviceMaintainOrderDetailList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + return success(returnMap); + } + + @GetMapping("/selectListByNumber") + @Operation(summary = "获得保养工单子列表") + @Parameter(name = "number", description = "保养工单号", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-detail:query')") + public CommonResult> selectListByNumber(@RequestParam("number") String number) { + List list = moldMaintainJobDetailService.selectListByNumber(number); + return success(DeviceMaintainJobDetailConvert.INSTANCE.convertList(list)); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintainjob/MoldMaintainJobDetailItemController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintainjob/MoldMaintainJobDetailItemController.java new file mode 100644 index 0000000..2b7de4c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintainjob/MoldMaintainJobDetailItemController.java @@ -0,0 +1,137 @@ +package com.win.module.eam.controller.moldmaintainjob; + +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.convert.devicemaintainjob.MaintainJobDetailItemConvert; +import com.win.module.eam.dal.dataobject.devicemaintainjob.MaintainJobDetailItemDO; +import com.win.module.eam.service.moldmaintainjob.MoldMaintainJobDetailItemService; +import io.swagger.v3.oas.annotations.Parameters; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +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.*; +import javax.servlet.http.*; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.*; +import java.io.IOException; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.pojo.CommonResult; +import static com.win.framework.common.pojo.CommonResult.success; + +import com.win.framework.excel.core.util.ExcelUtils; + +import com.win.framework.operatelog.core.annotations.OperateLog; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.*; + +import org.springframework.web.multipart.MultipartFile; + +@Tag(name = "管理后台 - 保养工单子表与备件关系") +@RestController +@RequestMapping("/eam/mold-maintain-job-detail-item") +@Validated +public class MoldMaintainJobDetailItemController { + + @Resource + private MoldMaintainJobDetailItemService moldMaintainJobDetailItemService; + + @PostMapping("/create") + @Operation(summary = "创建保养工单子表与备件关系") + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:create')") + public CommonResult createMaintainOrderDetailItem(@Valid @RequestBody MaintainJobDetailItemCreateReqVO createReqVO) { + return success(moldMaintainJobDetailItemService.createMaintainOrderDetailItem(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新保养工单子表与备件关系") + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:update')") + public CommonResult updateMaintainOrderDetailItem(@Valid @RequestBody MaintainJobDetailItemUpdateReqVO updateReqVO) { + int result = moldMaintainJobDetailItemService.updateMaintainOrderDetailItem(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除保养工单子表与备件关系") + @Parameter(name = "id", description = "编号", required = true) + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:delete')") + public CommonResult deleteMaintainOrderDetailItem(@RequestParam("id") Long id) { + int result = moldMaintainJobDetailItemService.deleteMaintainOrderDetailItem(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得保养工单子表与备件关系") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:query')") + public CommonResult getMaintainOrderDetailItem(@RequestParam("id") Long id) { + MaintainJobDetailItemDO maintainOrderDetailItem = moldMaintainJobDetailItemService.getMaintainOrderDetailItem(id); + return success(MaintainJobDetailItemConvert.INSTANCE.convert(maintainOrderDetailItem)); + } + + @GetMapping("/list") + @Operation(summary = "获得保养工单子表与备件关系列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:query')") + public CommonResult> getMaintainOrderDetailItemList(@RequestParam("ids") Collection ids) { + List list = moldMaintainJobDetailItemService.getMaintainOrderDetailItemList(ids); + return success(MaintainJobDetailItemConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得保养工单子表与备件关系分页") + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:query')") + public CommonResult> getMaintainOrderDetailItemPage(@Valid MaintainJobDetailItemPageReqVO pageVO) { + PageResult pageResult = moldMaintainJobDetailItemService.getMaintainOrderDetailItemPage(pageVO); + return success(MaintainJobDetailItemConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出保养工单子表与备件关系 Excel") + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:export')") + @OperateLog(type = EXPORT) + public void exportMaintainOrderDetailItemExcel(@Valid MaintainJobDetailItemExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = moldMaintainJobDetailItemService.getMaintainOrderDetailItemList(exportReqVO); + // 导出 Excel + List datas = MaintainJobDetailItemConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "保养工单子表与备件关系.xls", "数据", MaintainJobDetailItemExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入保养工单子表与备件关系模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "保养工单子表与备件关系基本信息导入模板.xls", "保养工单子表与备件关系基本信息列表", MaintainJobDetailItemExcelVO.class, list); + } + + @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('eam:maintain-job-detail-item:import')") + 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 list = ExcelUtils.read(file, MaintainJobDetailItemExcelVO.class); + List errorList = moldMaintainJobDetailItemService.importMaintainOrderDetailItemList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintainjob/MoldMaintainJobMainController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintainjob/MoldMaintainJobMainController.java new file mode 100644 index 0000000..0709c54 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintainjob/MoldMaintainJobMainController.java @@ -0,0 +1,208 @@ +package com.win.module.eam.controller.moldmaintainjob; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.convert.devicemaintainjob.DeviceMaintainJobMainConvert; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobReportDo; +import com.win.module.eam.service.moldmaintainjob.MoldMaintainJobMainService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + + +@Tag(name = "管理后台 - 保养工单主") +@RestController +@RequestMapping("/eam/mold-maintain-job-main") +@Validated +public class MoldMaintainJobMainController { + + @Resource + private MoldMaintainJobMainService moldMaintainJobMainService; + + @PostMapping("/create") + @Operation(summary = "创建保养工单主") + @PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-main:create')") + public CommonResult createDeviceMaintainOrderMain(@Valid @RequestBody DeviceMaintainJobMainCreateReqVO createReqVO) { + return success(moldMaintainJobMainService.createDeviceMaintainOrderMain(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新保养工单主") + @PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-main:update')") + public CommonResult updateDeviceMaintainOrderMain(@Valid @RequestBody DeviceMaintainJobMainUpdateReqVO updateReqVO) { + int result = moldMaintainJobMainService.updateDeviceMaintainOrderMain(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除保养工单主") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-main:delete')") + public CommonResult deleteDeviceMaintainOrderMain(@RequestParam("id") Long id) { + int result = moldMaintainJobMainService.deleteDeviceMaintainOrderMain(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得保养工单主") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-main:query')") + public CommonResult getDeviceMaintainOrderMain(@RequestParam("id") Long id) { + DeviceMaintainJobMainDO deviceMaintainOrderMain = moldMaintainJobMainService.getDeviceMaintainOrderMain(id); + return success(DeviceMaintainJobMainConvert.INSTANCE.convert(deviceMaintainOrderMain)); + } + + @GetMapping("/list") + @Operation(summary = "获得保养工单主列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-main:query')") + public CommonResult> getDeviceMaintainOrderMainList(@RequestParam("ids") Collection ids) { + List list = moldMaintainJobMainService.getDeviceMaintainOrderMainList(ids); + return success(DeviceMaintainJobMainConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得保养工单主分页") + //@PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-main:query')") + public CommonResult> getDeviceMaintainOrderMainPage(@Valid DeviceMaintainJobMainPageReqVO pageVO) { + PageResult pageResult = moldMaintainJobMainService.getDeviceMaintainOrderMainPage(pageVO); + return success(DeviceMaintainJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + + + @PostMapping("/senior") + @Operation(summary = "获得保养工单主分页") + //@PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-main:query')") + public CommonResult> getDeviceMaintainOrderMainSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = moldMaintainJobMainService.getDeviceMaintainOrderMainSenior(conditions); + PageResult result = DeviceMaintainJobMainConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + + + @GetMapping("/export-excel") + @Operation(summary = "导出保养工单主 Excel") + @PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-main:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMaintainOrderMainExcel(@Valid DeviceMaintainJobMainExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = moldMaintainJobMainService.getDeviceMaintainOrderMainList(exportReqVO); + // 导出 Excel + List datas = DeviceMaintainJobMainConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "保养工单主.xls", "数据", DeviceMaintainJobMainExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入保养工单主模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "保养工单主基本信息导入模板.xls", "保养工单主基本信息列表", DeviceMaintainJobMainExcelVO.class, list); + } + + @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('eam:mold-maintain-job-main:import')") + 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 list = ExcelUtils.read(file, DeviceMaintainJobMainExcelVO.class); + List errorList = moldMaintainJobMainService.importDeviceMaintainOrderMainList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + @GetMapping("/getAppPage") + @Operation(summary = "获得APP保养工单分页") + public CommonResult> getAppPage(@Valid DeviceMaintainJobMainPageReqVO pageVO) { + PageResult pageResult = moldMaintainJobMainService.getAppPage(pageVO); + return success(DeviceMaintainJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/orderClick") + @Operation(summary = "APP保养工单接单所有人都能接单") + @Parameters({ + @Parameter(name = "id", description = "主键id", required = true) + }) + @PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-main:orderClick') or @ss.hasPermission('eam:mold-maintain-job-main:orderClickAPP')") + public CommonResult orderClick(@RequestParam("id") Long id) { + return success(moldMaintainJobMainService.orderClick(id)); + } + + @GetMapping("/orderClickFinish") + @Operation(summary = "APP保养工单点击完成") + @Parameters({ + @Parameter(name = "id", description = "主键id", required = true) + }) + @PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-main:orderClickFinish') or @ss.hasPermission('eam:mold-maintain-job-main:orderClickFinishAPP')") + public CommonResult orderClickFinish(@RequestParam("id") Long id) { + return success(moldMaintainJobMainService.orderClickFinish(id)); + } + + @GetMapping("/orderClickVerify") + @Operation(summary = "APP保养工单工程师验证") + @Parameters({ + @Parameter(name = "id", description = "主键id", required = true) + }) + @PreAuthorize("@ss.hasPermission('eam:mold-maintain-job-main:orderClickVerify') or @ss.hasPermission('eam:mold-maintain-job-main:orderClickVerifyAPP')") + public CommonResult orderClickVerify(@RequestParam("id") Long id, String verifyContent) { + return success(moldMaintainJobMainService.orderClickVerify(id,verifyContent)); + } + + + @GetMapping("/getMaintainReport") + @Operation(summary = "保养打印单生成子单") + public CommonResult> getMaintainReport(DeviceMaintainJobReportReqVo deviceMaintainJobReportReqVo) { + DeviceMaintainJobReportDo deviceMaintainJobReportDo = DeviceMaintainJobMainConvert.INSTANCE.convert(deviceMaintainJobReportReqVo); + return success(moldMaintainJobMainService.getMaintainReport(deviceMaintainJobReportDo)); + } + + + @GetMapping("/getMaintainReportMainInfo") + @Operation(summary = "保养打印单生成主单") + public CommonResult> getMaintainReportMainInfo(DeviceMaintainJobReportReqVo deviceMaintainJobReportReqVo) { + DeviceMaintainJobReportDo deviceMaintainJobReportDo = new DeviceMaintainJobReportDo(); + deviceMaintainJobReportDo.setId(deviceMaintainJobReportReqVo.getId()); + List resultList = moldMaintainJobMainService.getMaintainReportMainInfo(deviceMaintainJobReportDo); + return success(resultList); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintainplan/MoldMaintainPlanController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintainplan/MoldMaintainPlanController.java new file mode 100644 index 0000000..5c5c8de --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintainplan/MoldMaintainPlanController.java @@ -0,0 +1,144 @@ +package com.win.module.eam.controller.moldmaintainplan; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.devicemaintainplan.vo.*; +import com.win.module.eam.convert.devicemaintainplan.DeviceMaintainPlanConvert; +import com.win.module.eam.dal.dataobject.devicemaintainplan.DeviceMaintainPlanDO; +import com.win.module.eam.service.devicemaintainplan.DeviceMaintainPlanService; +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.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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 保养计划") +@RestController +@RequestMapping("/eam/mold-maintain-plan") +@Validated +public class MoldMaintainPlanController { + + @Resource + private DeviceMaintainPlanService deviceMaintainPlanService; + + @PostMapping("/create") + @Operation(summary = "创建保养计划") +// @PreAuthorize("@ss.hasPermission('eam:device-maintain-plan:create')") + public CommonResult createDeviceMaintainPlan(@Valid @RequestBody DeviceMaintainPlanCreateReqVO createReqVO) { + return success(deviceMaintainPlanService.createDeviceMaintainPlan(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新保养计划") +// @PreAuthorize("@ss.hasPermission('eam:device-maintain-plan:update')") + public CommonResult updateDeviceMaintainPlan(@Valid @RequestBody DeviceMaintainPlanUpdateReqVO updateReqVO) { + int result = deviceMaintainPlanService.updateDeviceMaintainPlan(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除保养计划") + @Parameter(name = "id", description = "编号", required = true) +// @PreAuthorize("@ss.hasPermission('eam:device-maintain-plan:delete')") + public CommonResult deleteDeviceMaintainPlan(@RequestParam("id") Long id) { + int result = deviceMaintainPlanService.deleteDeviceMaintainPlan(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得保养计划") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:device-maintain-plan:query')") + public CommonResult getDeviceMaintainPlan(@RequestParam("id") Long id) { + DeviceMaintainPlanDO deviceMaintainPlan = deviceMaintainPlanService.getDeviceMaintainPlan(id); + return success(DeviceMaintainPlanConvert.INSTANCE.convert(deviceMaintainPlan)); + } + + @GetMapping("/list") + @Operation(summary = "获得保养计划列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:device-maintain-plan:query')") + public CommonResult> getDeviceMaintainPlanList(@RequestParam("ids") Collection ids) { + List list = deviceMaintainPlanService.getDeviceMaintainPlanList(ids); + return success(DeviceMaintainPlanConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得保养计划分页") +// @PreAuthorize("@ss.hasPermission('eam:device-maintain-plan:query')") + public CommonResult> getDeviceMaintainPlanPage(@Valid DeviceMaintainPlanPageReqVO pageVO) { + PageResult pageResult = deviceMaintainPlanService.getDeviceMaintainPlanPage(pageVO); + return success(DeviceMaintainPlanConvert.INSTANCE.convertPage(pageResult)); + } + + @PostMapping("/senior") + @Operation(summary = "获得保养计划分页") +// @PreAuthorize("@ss.hasPermission('eam:device-maintain-plan:query')") + public CommonResult> getDeviceAccountsSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = deviceMaintainPlanService.getDeviceMaintainPlanSenior(conditions); + PageResult result = DeviceMaintainPlanConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出保养计划 Excel") +// @PreAuthorize("@ss.hasPermission('eam:device-maintain-plan:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMaintainPlanExcel(@Valid DeviceMaintainPlanExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = deviceMaintainPlanService.getDeviceMaintainPlanList(exportReqVO); + // 导出 Excel + List datas = DeviceMaintainPlanConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "保养计划.xls", "数据", DeviceMaintainPlanExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入保养计划模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "保养计划基本信息导入模板.xls", "保养计划基本信息列表", DeviceMaintainPlanExcelVO.class, list); + } + + @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('eam:device-maintain-plan:import')") + 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 list = ExcelUtils.read(file, DeviceMaintainPlanExcelVO.class); + List errorList = deviceMaintainPlanService.importDeviceMaintainPlanList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintenancejob/MoldMaintenanceJobDetailController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintenancejob/MoldMaintenanceJobDetailController.java new file mode 100644 index 0000000..a02b79c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintenancejob/MoldMaintenanceJobDetailController.java @@ -0,0 +1,154 @@ +package com.win.module.eam.controller.moldmaintenancejob; + +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.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobDetailConvert; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailDO; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailItemMapper; +import com.win.module.eam.service.moldmaintenancejob.MoldMaintenanceJobDetailService; +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.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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 维修工单子") +@RestController +@RequestMapping("/eam/mold-maintenance-job-detail") +@Validated +public class MoldMaintenanceJobDetailController { + + @Resource + private MoldMaintenanceJobDetailService moldMaintenanceJobDetailService; + + @Resource + private DeviceMaintenanceJobDetailItemMapper deviceMaintenanceJobDetailItemMapper; + + @PostMapping("/create") + @Operation(summary = "创建维修工单子") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:create')") + public CommonResult createDeviceMaintenanceDetail(@Valid @RequestBody DeviceMaintenanceJobDetailCreateReqVO createReqVO) { + return success(moldMaintenanceJobDetailService.createDeviceMaintenanceDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新维修工单子") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:update')") + public CommonResult updateDeviceMaintenanceDetail(@Valid @RequestBody DeviceMaintenanceJobDetailUpdateReqVO updateReqVO) { + int result = moldMaintenanceJobDetailService.updateDeviceMaintenanceDetail(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除维修工单子项以及备件关系表") + @Parameter(name = "id", description = "编号", required = true) +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:delete')") + public CommonResult deleteDeviceMaintenanceDetail(@RequestParam("id") Long id) { + int result = moldMaintenanceJobDetailService.deleteDeviceMaintenanceDetail(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得维修工单子") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:query')") + public CommonResult getDeviceMaintenanceDetail(@RequestParam("id") Long id) { + DeviceMaintenanceJobDetailDO deviceMaintenanceDetail = moldMaintenanceJobDetailService.getDeviceMaintenanceDetail(id); + return success(DeviceMaintenanceJobDetailConvert.INSTANCE.convert(deviceMaintenanceDetail)); + } + + @GetMapping("/list") + @Operation(summary = "获得维修工单子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:query')") + public CommonResult> getDeviceMaintenanceDetailList(@RequestParam("ids") Collection ids) { + List list = moldMaintenanceJobDetailService.getDeviceMaintenanceDetailList(ids); + return success(DeviceMaintenanceJobDetailConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "PC端获得维修工单子分页") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:query')") + public CommonResult> getDeviceMaintenanceDetailPage(@Valid DeviceMaintenanceJobDetailPageReqVO pageVO) { + PageResult pageResult = moldMaintenanceJobDetailService.getDeviceMaintenanceDetailPage(pageVO); + return success(DeviceMaintenanceJobDetailConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出维修工单子 Excel") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMaintenanceDetailExcel(@Valid DeviceMaintenanceJobDetailExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = moldMaintenanceJobDetailService.getDeviceMaintenanceDetailList(exportReqVO); + // 导出 Excel + List datas = DeviceMaintenanceJobDetailConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "维修工单子.xls", "数据", DeviceMaintenanceJobDetailExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入维修工单子模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "维修工单子基本信息导入模板.xls", "维修工单子基本信息列表", DeviceMaintenanceJobDetailExcelVO.class, list); + } + + @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('eam:device-maintenance-job-detail:import')") + 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 list = ExcelUtils.read(file, DeviceMaintenanceJobDetailExcelVO.class); + List errorList = moldMaintenanceJobDetailService.importDeviceMaintenanceDetailList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + /** + * APP根据维修工单号查询工单子项信息列表 + * @param + * @return + */ + @GetMapping("/selectListByNumber") + @Operation(summary = "APP获得维修工单子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:query')") + public CommonResult> selectListByNumber(@RequestParam("number") String number) { + List list = moldMaintenanceJobDetailService.selectListByNumber(number); + return success(DeviceMaintenanceJobDetailConvert.INSTANCE.convertList(list)); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintenancejob/MoldMaintenanceJobDetailItemController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintenancejob/MoldMaintenanceJobDetailItemController.java new file mode 100644 index 0000000..57889f1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintenancejob/MoldMaintenanceJobDetailItemController.java @@ -0,0 +1,148 @@ +package com.win.module.eam.controller.moldmaintenancejob; + +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.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobDetailItemConvert; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailItemDO; +import com.win.module.eam.service.moldmaintenancejob.MoldMaintenanceJobDetailItemService; +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.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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 维修工单子表与备件关系") +@RestController +@RequestMapping("/eam/mold-maintenance-job-detail-item") +@Validated +public class MoldMaintenanceJobDetailItemController { + + @Resource + private MoldMaintenanceJobDetailItemService moldMaintenanceJobDetailItemService; + + @PostMapping("/create") + @Operation(summary = "创建维修工单子表与备件关系") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:create')") + public CommonResult createDeviceMaintenanceDetailItem(@Valid @RequestBody DeviceMaintenanceJobDetailItemCreateReqVO createReqVO) { + return success(moldMaintenanceJobDetailItemService.createDeviceMaintenanceDetailItem(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新维修工单子表与备件关系") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:update')") + public CommonResult updateDeviceMaintenanceDetailItem(@Valid @RequestBody DeviceMaintenanceJobDetailItemUpdateReqVO updateReqVO) { + int result = moldMaintenanceJobDetailItemService.updateDeviceMaintenanceDetailItem(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除维修工单子表与备件关系") + @Parameter(name = "id", description = "编号", required = true) + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:delete')") + public CommonResult deleteDeviceMaintenanceDetailItem(@RequestParam("id") Long id) { + int result = moldMaintenanceJobDetailItemService.deleteDeviceMaintenanceDetailItem(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得维修工单子表与备件关系") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:query')") + public CommonResult getDeviceMaintenanceDetailItem(@RequestParam("id") Long id) { + DeviceMaintenanceJobDetailItemDO deviceMaintenanceDetailItem = moldMaintenanceJobDetailItemService.getDeviceMaintenanceDetailItem(id); + return success(DeviceMaintenanceJobDetailItemConvert.INSTANCE.convert(deviceMaintenanceDetailItem)); + } + + @GetMapping("/list") + @Operation(summary = "获得维修工单子表与备件关系列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:query')") + public CommonResult> getDeviceMaintenanceDetailItemList(@RequestParam("ids") Collection ids) { + List list = moldMaintenanceJobDetailItemService.getDeviceMaintenanceDetailItemList(ids); + return success(DeviceMaintenanceJobDetailItemConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得维修工单子表与备件关系分页") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:query')") + public CommonResult> getDeviceMaintenanceDetailItemPage(@Valid DeviceMaintenanceJobDetailItemPageReqVO pageVO) { + PageResult pageResult = moldMaintenanceJobDetailItemService.getDeviceMaintenanceDetailItemPage(pageVO); + return success(DeviceMaintenanceJobDetailItemConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出维修工单子表与备件关系 Excel") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMaintenanceDetailItemExcel(@Valid DeviceMaintenanceJobDetailItemExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = moldMaintenanceJobDetailItemService.getDeviceMaintenanceDetailItemList(exportReqVO); + // 导出 Excel + List datas = DeviceMaintenanceJobDetailItemConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "维修工单子表与备件关系.xls", "数据", DeviceMaintenanceJobDetailItemExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入维修工单子表与备件关系模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "维修工单子表与备件关系基本信息导入模板.xls", "维修工单子表与备件关系基本信息列表", DeviceMaintenanceJobDetailItemExcelVO.class, list); + } + + @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('eam:device-maintenance-job-detail-item:import')") + 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 list = ExcelUtils.read(file, DeviceMaintenanceJobDetailItemExcelVO.class); + List errorList = moldMaintenanceJobDetailItemService.importDeviceMaintenanceDetailItemList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + /** + * 根据维修子项id获取备件列表 + * @param + * @return + */ + @GetMapping("/selectListById") + @Operation(summary = "根据维修子项id获取备件列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-detail:query')") + public CommonResult>> selectListByNumber(@RequestParam("maintenanceDetailId") Long maintenanceDetailId) { + List> list = moldMaintenanceJobDetailItemService.selectListById(maintenanceDetailId); + return success(list); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintenancejob/MoldMaintenanceJobMainController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintenancejob/MoldMaintenanceJobMainController.java new file mode 100644 index 0000000..0eca74f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmaintenancejob/MoldMaintenanceJobMainController.java @@ -0,0 +1,296 @@ +package com.win.module.eam.controller.moldmaintenancejob; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.datapermission.core.rule.dept.DeptDataPermissionRule; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobMainConvert; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.eam.service.moldmaintenancejob.MoldMaintenanceJobMainService; +import com.win.module.eam.util.SoapUtil; +import com.win.module.system.api.user.AdminUserApi; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + + +@Tag(name = "管理后台 - 维修工单主") +@RestController +@RequestMapping("/eam/mold-maintenance-job-main") +@Validated +public class MoldMaintenanceJobMainController { + + @Resource + private MoldMaintenanceJobMainService moldMaintenanceJobMainService; + + @Resource + private AdminUserApi userApi; + + @Resource + private DeptDataPermissionRule deptDataPermissionRule; + + @PostMapping("/create") + @Operation(summary = "APP创建维修工单主") + @PreAuthorize("@ss.hasPermission('eam:mold-maintenance-job-main:create') or @ss.hasPermission('eam:mold-maintenance-job-main:createAPP')") + public CommonResult createDeviceMaintenanceMain(@Valid @RequestBody DeviceMaintenanceJobMainCreateReqVO createReqVO) { + createReqVO.setMaintenance(getLoginUserId()); + createReqVO.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + return success(moldMaintenanceJobMainService.createDeviceMaintenanceMain(createReqVO)); + } + + @PostMapping("/createPC") + @Operation(summary = "PC创建维修工单主") + @PreAuthorize("@ss.hasPermission('eam:mold-maintenance-job-main:create')") + public CommonResult createDeviceMaintenanceMainPC(@Valid @RequestBody DeviceMaintenanceJobMainCreateReqVO createReqVO) { + //不走申请直接创建工单更改当前人为接单人 状态为接单状态 + createReqVO.setMaintenance(getLoginUserId()); + createReqVO.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + return success(moldMaintenanceJobMainService.createDeviceMaintenanceMainPC(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新维修工单主") + @PreAuthorize("@ss.hasPermission('eam:mold-maintenance-job-main:update') or @ss.hasPermission('eam:mold-maintenance-job-main:updateAPP')") + public CommonResult updateDeviceMaintenanceMain(@Valid @RequestBody DeviceMaintenanceJobMainUpdateReqVO updateReqVO) { + int result = moldMaintenanceJobMainService.updateDeviceMaintenanceMain(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除维修工单主") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:mold-maintenance-job-main:delete') or @ss.hasPermission('eam:mold-maintenance-job-main:deleteAPP')") + public CommonResult deleteDeviceMaintenanceMain(@RequestParam("id") Long id) { + int result = moldMaintenanceJobMainService.deleteDeviceMaintenanceMain(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得维修工单主") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:mold-maintenance-job-main:query')") + public CommonResult getDeviceMaintenanceMain(@RequestParam("id") Long id) { + DeviceMaintenanceJobMainDO deviceMaintenanceMain = moldMaintenanceJobMainService.getDeviceMaintenanceMain(id); + return success(DeviceMaintenanceJobMainConvert.INSTANCE.convert(deviceMaintenanceMain)); + } + + @GetMapping("/list") + @Operation(summary = "获得维修工单主列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:mold-maintenance-job-main:query')") + public CommonResult> getDeviceMaintenanceMainList(@RequestParam("ids") Collection ids) { + List list = moldMaintenanceJobMainService.getDeviceMaintenanceMainList(ids); + return success(DeviceMaintenanceJobMainConvert.INSTANCE.convertList(list)); + } + @GetMapping("/page") + @Operation(summary = "获得维修工单主分页") + //@PreAuthorize("@ss.hasPermission('eam:mold-maintenance-job-main:query')") + public CommonResult> getDeviceMaintenanceMainPage(@Valid DeviceMaintenanceJobMainPageReqVO pageVO) { + PageResult pageResult = moldMaintenanceJobMainService.getDeviceMaintenanceMainPage(pageVO); + return success(DeviceMaintenanceJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + @PostMapping("/senior") + @Operation(summary = "获得维修工单主分页") + //@PreAuthorize("@ss.hasPermission('eam:mold-maintenance-job-main:query')") + public CommonResult> getDeviceMaintenanceMainSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = moldMaintenanceJobMainService.getDeviceMaintenanceMainSenior(conditions); + PageResult result = DeviceMaintenanceJobMainConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出维修工单主 Excel") + @PreAuthorize("@ss.hasPermission('eam:mold-maintenance-job-main:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMaintenanceMainExcel(@Valid DeviceMaintenanceJobMainExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = moldMaintenanceJobMainService.getDeviceMaintenanceMainList(exportReqVO); + // 导出 Excel + List datas = DeviceMaintenanceJobMainConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "维修工单主.xls", "数据", DeviceMaintenanceJobMainExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入维修工单主模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "维修工单主基本信息导入模板.xls", "维修工单主基本信息列表", DeviceMaintenanceJobMainExcelVO.class, list); + } + + @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('eam:mold-maintenance-job-main:import')") + 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 list = ExcelUtils.read(file, DeviceMaintenanceJobMainExcelVO.class); + List errorList = moldMaintenanceJobMainService.importDeviceMaintenanceMainList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + return success(returnMap); + } + @GetMapping("/getAppPage") + @Operation(summary = "获得APP维修工单分页") + public CommonResult> getAppPage(@Valid DeviceMaintenanceJobMainPageReqVO pageVO) { + PageResult pageResult = moldMaintenanceJobMainService.getAppPage(pageVO); + return success(DeviceMaintenanceJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/getAppByNumber") + @Operation(summary = "获得APP维修工单详情根据number") + public CommonResult getAppByNumber(@RequestParam("number") String number) { + DeviceMaintenanceJobMainDO en = moldMaintenanceJobMainService.getAppByNumber(number); + return success(DeviceMaintenanceJobMainConvert.INSTANCE.convert(en)); + } + + @GetMapping("/turnTo") + @Operation(summary = "APP维修工单转办") + @Parameters({ + @Parameter(name = "deviceNumber", description = "转办设备或模具编码", required = true), + @Parameter(name = "id", description = "id", required = true), + @Parameter(name = "receiverType", description = "转办后类型", required = true), + @Parameter(name = "receiverUserId", description = "接收人id暂无用", required = false), + @Parameter(name = "status", description = "1人员转办0或者不填是设备转办", required = true), + }) + @PreAuthorize("@ss.hasPermission('eam:mold-maintenance-job-main:turnTo') or @ss.hasPermission('eam:mold-maintenance-job-main:turnToAPP')") + public CommonResult turnTo(@RequestParam("deviceNumber") String deviceNumber,@RequestParam("id") Long id,@RequestParam("receiverType") String receiverType, Long receiverUserId,String status) { + return success(moldMaintenanceJobMainService.turnTo(deviceNumber,id,receiverType,receiverUserId,status)); + } + + @GetMapping("/orderClick") + @Operation(summary = "APP维修工单接单") + @Parameters({ + @Parameter(name = "number", description = "工单编号", required = true), + @Parameter(name = "status", description = "列表状态", required = true), + @Parameter(name = "id", description = "主键id", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = false) + }) + @PreAuthorize("@ss.hasPermission('eam:mold-maintenance-job-main:orderClick') or @ss.hasPermission('eam:mold-maintenance-job-main:orderClickToAPP')") + public CommonResult orderClick(@RequestParam("id") Long id) { + return success(moldMaintenanceJobMainService.orderClick(id)); + } + + @GetMapping("/orderClickFinish") + @Operation(summary = "APP维修工单点击完成") + @Parameters({ + @Parameter(name = "number", description = "工单编号", required = true), + @Parameter(name = "status", description = "列表状态", required = true), + @Parameter(name = "id", description = "主键id", required = true), + @Parameter(name = "result", description = "点击完成带着COMPLETED", required = true), + @Parameter(name = "result", description = "申请带着申请人驳回 申请人通过", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = false) + }) + @PreAuthorize("@ss.hasPermission('eam:mold-maintenance-job-main:orderClickFinish') or @ss.hasPermission('eam:mold-maintenance-job-main:orderClickFinishAPP')") + public CommonResult orderClickFinish(@RequestParam("id") Long id,String result) { + return success(moldMaintenanceJobMainService.orderClickFinish(id,result)); + } + + + @GetMapping("/orderClickConfirm") + @Operation(summary = "APP维修工单申请人确认") + @Parameters({ + @Parameter(name = "number", description = "工单编号", required = true), + @Parameter(name = "status", description = "列表状态", required = true), + @Parameter(name = "id", description = "主键id", required = true), + @Parameter(name = "result", description = "点击完成带着COMPLETED", required = true), + @Parameter(name = "result", description = "申请带着申请人驳回 申请人通过", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = false) + }) + @PreAuthorize("@ss.hasPermission('eam:mold-maintenance-job-main:orderClickConfirm') or @ss.hasPermission('eam:mold-maintenance-job-main:orderClickConfirmAPP')") + public CommonResult orderClickConfirm(@RequestParam("id") Long id,String result,String content) { + return success(moldMaintenanceJobMainService.orderClickConfirm(id,result,content)); + } + + @GetMapping("/orderClickVerify") + @Operation(summary = "APP维修工单验证") + @Parameters({ + @Parameter(name = "number", description = "工单编号", required = true), + @Parameter(name = "status", description = "列表状态", required = true), + @Parameter(name = "id", description = "主键id", required = true), + @Parameter(name = "result", description = "点击完成带着COMPLETED", required = true), + @Parameter(name = "result", description = "申请带着申请人驳回 申请人通过", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = false) + }) + @PreAuthorize("@ss.hasPermission('eam:mold-maintenance-job-main:orderClickVerify') or @ss.hasPermission('eam:mold-maintenance-job-main:orderClickVerifyAPP')") + public CommonResult orderClickVerify(String status,@RequestParam("id") Long id,String content) { + return success(moldMaintenanceJobMainService.orderClickVerify(id,status,content)); + } + + @GetMapping("/getDictList") + @Operation(summary = "APP获取字典") + @Parameters({ + @Parameter(name = "number", description = "设备或模具编码", required = true), + @Parameter(name = "type", description = "DEVICE设备 MOLD模具", required = true), + @Parameter(name = "id", description = "主键id", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = true) + }) + public CommonResult>> getDictList(@RequestParam("type") String type) { + return success(moldMaintenanceJobMainService.getDictList(type)); + } + + @GetMapping("/getList") + @Operation(summary = "APP获取采取临时措施的维修工单") + @Parameter(name = "type", description = "DEVICE MOLD", required = true) + public CommonResult>> getList(@RequestParam("type") String type) { + return success(moldMaintenanceJobMainService.getList(type)); + } + + @PostMapping("/TestSend") + @Operation(summary = "消息推送测试") + @Parameter(name = "type", description = "DEVICE MOLD", required = true) + public CommonResult>> send(@RequestBody Map map) { + SoapUtil soapUtil = new SoapUtil(); + String title = map.get("title").toString(); + String content = map.get("content").toString(); + String type = map.get("type").toString(); + String status = map.get("status").toString(); + String number = map.get("number").toString(); + String cid = map.get("cid").toString(); + Map map1 = new HashMap<>(); + map1.put("type",type); + map1.put("status",status); + map1.put("number",number); + map1.put("cid",cid); + //soapUtil.uniappSend(List.of(cid),title,content,map1); + return success(null); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/MoldMilestoneController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/MoldMilestoneController.java new file mode 100644 index 0000000..1eb0a49 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/MoldMilestoneController.java @@ -0,0 +1,149 @@ +package com.win.module.eam.controller.moldmilestone; + +import com.alibaba.druid.util.StringUtils; +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.eam.controller.moldmilestone.vo.*; +import com.win.module.eam.convert.moldmilestone.MoldMilestoneConvert; +import com.win.module.eam.dal.dataobject.moldmilestone.MoldMilestoneDO; +import com.win.module.eam.service.moldmilestone.MoldMilestoneService; +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.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.operatelog.core.enums.OperateTypeEnum.EXPORT; + + +@Tag(name = "管理后台 - 模具里程碑") +@RestController +@RequestMapping("/basic/mold-milestone") +@Validated +public class MoldMilestoneController { + + @Resource + private MoldMilestoneService moldMilestoneService; + + @PostMapping("/create") + @Operation(summary = "创建模具里程碑") +// @PreAuthorize("@ss.hasPermission('basic:mold-milestone:create')") + public CommonResult createMoldMilestone(@Valid @RequestBody MoldMilestoneCreateReqVO createReqVO) { + return success(moldMilestoneService.createMoldMilestone(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新模具里程碑") +// @PreAuthorize("@ss.hasPermission('basic:mold-milestone:update')") + public CommonResult updateMoldMilestone(@Valid @RequestBody MoldMilestoneUpdateReqVO updateReqVO) { + int result = moldMilestoneService.updateMoldMilestone(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除模具里程碑") + @Parameter(name = "id", description = "编号", required = true) +// @PreAuthorize("@ss.hasPermission('basic:mold-milestone:delete')") + public CommonResult deleteMoldMilestone(@RequestParam("id") Long id) { + int result = moldMilestoneService.deleteMoldMilestone(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得模具里程碑") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('basic:mold-milestone:query')") + public CommonResult getMoldMilestone(@RequestParam("id") Long id) { + MoldMilestoneDO moldMilestone = moldMilestoneService.getMoldMilestone(id); + return success(MoldMilestoneConvert.INSTANCE.convert(moldMilestone)); + } + + @GetMapping("/list") + @Operation(summary = "获得模具里程碑列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('basic:mold-milestone:query')") + public CommonResult> getMoldMilestoneList(@RequestParam("ids") Collection ids) { + List list = moldMilestoneService.getMoldMilestoneList(ids); + return success(MoldMilestoneConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得模具里程碑分页") +// @PreAuthorize("@ss.hasPermission('basic:mold-milestone:query')") + public CommonResult> getMoldMilestonePage(@Valid MoldMilestonePageReqVO pageVO) { + PageResult pageResult = moldMilestoneService.getMoldMilestonePage(pageVO); + return success(MoldMilestoneConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出模具里程碑 Excel") +// @PreAuthorize("@ss.hasPermission('basic:mold-milestone:export')") + @OperateLog(type = EXPORT) + public void exportMoldMilestoneExcel(@Valid MoldMilestoneExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = moldMilestoneService.getMoldMilestoneList(exportReqVO); + // 导出 Excel + List datas = MoldMilestoneConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "模具里程碑.xls", "数据", MoldMilestoneExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入模具里程碑模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "模具里程碑基本信息导入模板.xls", "模具里程碑基本信息列表", MoldMilestoneExcelVO.class, list); + } + + @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('basic:mold-milestone:import')") + 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 list = ExcelUtils.read(file, MoldMilestoneExcelVO.class); + List errorList = moldMilestoneService.importMoldMilestoneList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + + @GetMapping("/createBatchByMoldNumber") + @Operation(summary = "创建模具里程碑") + public CommonResult createBatchByMoldNumber(String moldNumber){ + if(StringUtils.isEmpty(moldNumber)){ + throw new RuntimeException("模具号不能为空"); + } + moldMilestoneService.createBatchByMoldNumber(moldNumber); + return success(true); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneBaseVO.java new file mode 100644 index 0000000..9e06788 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneBaseVO.java @@ -0,0 +1,42 @@ +package com.win.module.eam.controller.moldmilestone.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +/** + * 模具里程碑 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class MoldMilestoneBaseVO { + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "编号唯一标识不能为空") + private String number; + + @Schema(description = "模具编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "模具编号不能为空") + private String moldNumber; + + @Schema(description = "里程碑阶段") + private String milestoneStage; + + @Schema(description = "里程碑日期") + @JsonFormat(shape = JsonFormat.Shape.NUMBER) + private LocalDateTime milestoneDate; + + @Schema(description = "地点ID", example = "8292") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "并发乐观锁不能为空") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneCreateReqVO.java new file mode 100644 index 0000000..6a5ad1b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.moldmilestone.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 MoldMilestoneCreateReqVO extends MoldMilestoneBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneExcelVO.java new file mode 100644 index 0000000..a0facc7 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneExcelVO.java @@ -0,0 +1,45 @@ +package com.win.module.eam.controller.moldmilestone.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 模具里程碑 Excel VO + * + * @author 超级管理员 + */ +@Data +public class MoldMilestoneExcelVO { + + @ExcelProperty("id") + private Long id; + + @ExcelProperty("编号唯一标识") + private String number; + + @ExcelProperty("模具编号") + private String moldNumber; + + @ExcelProperty("里程碑阶段") + private String milestoneStage; + + @ExcelProperty("里程碑日期") + @JsonFormat(shape = JsonFormat.Shape.NUMBER) + private LocalDateTime milestoneDate; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneExportReqVO.java new file mode 100644 index 0000000..2ad68fc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneExportReqVO.java @@ -0,0 +1,45 @@ +package com.win.module.eam.controller.moldmilestone.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; +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,参数和 MoldMilestonePageReqVO 是一致的") +@Data +public class MoldMilestoneExportReqVO { + + @Schema(description = "id", example = "13015") + private Long id; + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "模具编号") + private String moldNumber; + + @Schema(description = "里程碑阶段") + private String milestoneStage; + + @Schema(description = "里程碑日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDate[] milestoneDate; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "地点ID", example = "8292") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestonePageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestonePageReqVO.java new file mode 100644 index 0000000..bf8e56a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestonePageReqVO.java @@ -0,0 +1,50 @@ +package com.win.module.eam.controller.moldmilestone.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.LocalDate; +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 MoldMilestonePageReqVO extends PageParam { + + @Schema(description = "id", example = "13015") + private Long id; + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "模具编号") + private String moldNumber; + + @Schema(description = "里程碑阶段") + private String milestoneStage; + + @Schema(description = "里程碑日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDate[] milestoneDate; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "地点ID", example = "8292") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneRespVO.java new file mode 100644 index 0000000..205aa19 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.eam.controller.moldmilestone.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 MoldMilestoneRespVO extends MoldMilestoneBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "13015") + private Long id; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneUpdateReqVO.java new file mode 100644 index 0000000..3e07daa --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldmilestone/vo/MoldMilestoneUpdateReqVO.java @@ -0,0 +1,20 @@ +package com.win.module.eam.controller.moldmilestone.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 MoldMilestoneUpdateReqVO extends MoldMilestoneBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "13015") + @NotNull(message = "id不能为空") + private Long id; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldrepairrequest/MoldRepairRequestController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldrepairrequest/MoldRepairRequestController.java new file mode 100644 index 0000000..f265d0e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldrepairrequest/MoldRepairRequestController.java @@ -0,0 +1,192 @@ +package com.win.module.eam.controller.moldrepairrequest; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.devicerepairrequest.vo.*; +import com.win.module.eam.convert.devicerepairrequest.DeviceRepairRequestConvert; +import com.win.module.eam.dal.dataobject.devicerepairrequest.DeviceRepairRequestDO; +import com.win.module.eam.service.moldrepairrequest.MoldRepairRequestService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 报修申请设备模具") +@RestController +@RequestMapping("/eam/mold-repair-request") +@Validated +public class MoldRepairRequestController { + + @Resource + private MoldRepairRequestService moldRepairRequestService; + + @PostMapping("/create") + @Operation(summary = "创建报修申请") + @PreAuthorize("@ss.hasPermission('eam:mold-repair-request:create') or @ss.hasPermission('eam:mold-repair-request:createAPP')") + public CommonResult createDeviceRepair(@Valid @RequestBody DeviceRepairRequestRequestCreateReqVO createReqVO) { + return success(moldRepairRequestService.createDeviceRepair(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新报修申请") + @PreAuthorize("@ss.hasPermission('eam:mold-repair-request:update') or @ss.hasPermission('eam:mold-repair-request:updateAPP')") + public CommonResult updateDeviceRepair(@Valid @RequestBody DeviceRepairRequestRequestUpdateReqVO updateReqVO) { + int result = moldRepairRequestService.updateDeviceRepair(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除报修申请") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:mold-repair-request:delete') or @ss.hasPermission('eam:mold-repair-request:deleteAPP')") + public CommonResult deleteDeviceRepair(@RequestParam("id") Long id) { + int result = moldRepairRequestService.deleteDeviceRepair(id); + return success(result > 0); + } + + @DeleteMapping("/cancel") + @Operation(summary = "APP撤销申请") + @Parameter(name = "id", description = "主键id", required = true) + @PreAuthorize("@ss.hasPermission('eam:mold-repair-request:cancel') or @ss.hasPermission('eam:mold-repair-request:cancelAPP')") + public CommonResult cancel(@RequestParam("id") Long id) { + int result = moldRepairRequestService.rejectedDeviceRepair(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得报修申请") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:mold-repair-request:query')") + public CommonResult getDeviceRepair(@RequestParam("id") Long id) { + DeviceRepairRequestDO deviceRepair = moldRepairRequestService.getDeviceRepair(id); + return success(DeviceRepairRequestConvert.INSTANCE.convert(deviceRepair)); + } + + @GetMapping("/list") + @Operation(summary = "获得报修申请列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:mold-repair-request:query')") + public CommonResult> getDeviceRepairList(@RequestParam("ids") Collection ids) { + List list = moldRepairRequestService.getDeviceRepairList(ids); + return success(DeviceRepairRequestConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得报修申请分页") + //@PreAuthorize("@ss.hasPermission('eam:mold-repair-request:query')") + public CommonResult> getDeviceRepairPage(@Valid DeviceRepairRequestPageReqVO pageVO) { + PageResult pageResult = moldRepairRequestService.getDeviceRepairPage(pageVO); + return success(DeviceRepairRequestConvert.INSTANCE.convertPage(pageResult)); + } + + @PostMapping("/senior") + @Operation(summary = "获得报修申请分页") + //@PreAuthorize("@ss.hasPermission('eam:mold-repair-request:query')") + public CommonResult> getDeviceRepairSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = moldRepairRequestService.getDeviceRepairSenior(conditions); + PageResult result = DeviceRepairRequestConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出报修申请 Excel") + @PreAuthorize("@ss.hasPermission('eam:mold-repair-request:export')") + @OperateLog(type = EXPORT) + public void exportDeviceRepairExcel(@Valid DeviceRepairRequestExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = moldRepairRequestService.getDeviceRepairList(exportReqVO); + // 导出 Excel + List datas = DeviceRepairRequestConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "报修申请.xls", "数据", DeviceRepairRequestExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入报修申请模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "报修申请基本信息导入模板.xls", "报修申请基本信息列表", DeviceRepairRequestExcelVO.class, list); + } + + @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('eam:mold-repair-request:import')") + 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 list = ExcelUtils.read(file, DeviceRepairRequestExcelVO.class); + List errorList = moldRepairRequestService.importDeviceRepairList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + @GetMapping("/getAppPage") + @Operation(summary = "获得APP报修申请分页") + @Parameters({ + @Parameter(name = "pageSize", description = "每页几条", required = true), + @Parameter(name = "pageNo", description = "第几页", example = "1"), + @Parameter(name = "type", description = "DEVICE 设备 MOLD模具", example = "true"), + @Parameter(name = "flag", description = "首页进入0从我的进入1", example = "true"), + @Parameter(name = "name", description = "设备名称"), + @Parameter(name = "number", description = "单号"), + }) + public CommonResult> getAppPage(@Valid DeviceRepairRequestPageReqVO pageVO) { + PageResult pageResult = moldRepairRequestService.getAppPage(pageVO); + return success(DeviceRepairRequestConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/getDetailsByNumber") + @Operation(summary = "根据报修单号查询报修信息") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:mold-repair-request:query')") + public CommonResult> getDetailsByNumber(@RequestParam("requestNumber") String requestNumber,@RequestParam("type") String type) { + Map detailsByNumber = moldRepairRequestService.getDetailsByNumber(requestNumber, type); + return success(detailsByNumber); + } + + + + @GetMapping("/getOrderByNumber") + @Operation(summary = "根据报修单号查询报修信息") + @Parameter(name = "requestNumber", description = "申请编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:mold-repair-request:query')") + public CommonResult getOrderByNumber(@RequestParam("requestNumber") String requestNumber) { + DeviceRepairRequestDO orderInfo = moldRepairRequestService.getOrderByNumber(requestNumber); + return success(orderInfo); + } + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldspotinspectionrecord/MoldSpotInspectionRecordDetailController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldspotinspectionrecord/MoldSpotInspectionRecordDetailController.java new file mode 100644 index 0000000..ece142a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldspotinspectionrecord/MoldSpotInspectionRecordDetailController.java @@ -0,0 +1,146 @@ +package com.win.module.eam.controller.moldspotinspectionrecord; + +import com.win.module.eam.controller.devicespotinspectionrecord.vo.*; +import com.win.module.eam.service.moldspotinspectionrecord.MoldSpotInspectionRecordDetailService; +import io.swagger.v3.oas.annotations.Parameters; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +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.*; +import javax.servlet.http.*; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.*; +import java.io.IOException; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.pojo.CommonResult; +import static com.win.framework.common.pojo.CommonResult.success; + +import com.win.framework.excel.core.util.ExcelUtils; + +import com.win.framework.operatelog.core.annotations.OperateLog; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailDO; +import com.win.module.eam.convert.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailConvert; +import org.springframework.web.multipart.MultipartFile; + +@Tag(name = "管理后台 - 巡检点检记录子") +@RestController +@RequestMapping("/eam/mold-spot-inspection-record-detail") +@Validated +public class MoldSpotInspectionRecordDetailController { + + @Resource + private MoldSpotInspectionRecordDetailService moldSpotInspectionRecordDetailService; + + @PostMapping("/create") + @Operation(summary = "创建巡检点检记录子") + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-detail:create')") + public CommonResult createDeviceSpotInspectionRecordDetail(@Valid @RequestBody DeviceSpotInspectionRecordDetailCreateReqVO createReqVO) { + return success(moldSpotInspectionRecordDetailService.createDeviceSpotInspectionRecordDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新巡检点检记录子") + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-detail:update')") + public CommonResult updateDeviceSpotInspectionRecordDetail(@Valid @RequestBody DeviceSpotInspectionRecordDetailUpdateReqVO updateReqVO) { + int result = moldSpotInspectionRecordDetailService.updateDeviceSpotInspectionRecordDetail(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除巡检点检记录子") + @Parameter(name = "id", description = "编号", required = true) + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-detail:delete')") + public CommonResult deleteDeviceSpotInspectionRecordDetail(@RequestParam("id") Long id) { + int result = moldSpotInspectionRecordDetailService.deleteDeviceSpotInspectionRecordDetail(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得巡检点检记录子") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-detail:query')") + public CommonResult getDeviceSpotInspectionRecordDetail(@RequestParam("id") Long id) { + DeviceSpotInspectionRecordDetailDO deviceSpotInspectionRecordDetail = moldSpotInspectionRecordDetailService.getDeviceSpotInspectionRecordDetail(id); + return success(DeviceSpotInspectionRecordDetailConvert.INSTANCE.convert(deviceSpotInspectionRecordDetail)); + } + + @GetMapping("/list") + @Operation(summary = "获得巡检点检记录子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-detail:query')") + public CommonResult> getDeviceSpotInspectionRecordDetailList(@RequestParam("ids") Collection ids) { + List list = moldSpotInspectionRecordDetailService.getDeviceSpotInspectionRecordDetailList(ids); + return success(DeviceSpotInspectionRecordDetailConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得巡检点检记录子分页") + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-detail:query')") + public CommonResult> getDeviceSpotInspectionRecordDetailPage(@Valid DeviceSpotInspectionRecordDetailPageReqVO pageVO) { + PageResult pageResult = moldSpotInspectionRecordDetailService.getDeviceSpotInspectionRecordDetailPage(pageVO); + return success(DeviceSpotInspectionRecordDetailConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出巡检点检记录子 Excel") + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-detail:export')") + @OperateLog(type = EXPORT) + public void exportDeviceSpotInspectionRecordDetailExcel(@Valid DeviceSpotInspectionRecordDetailExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = moldSpotInspectionRecordDetailService.getDeviceSpotInspectionRecordDetailList(exportReqVO); + // 导出 Excel + List datas = DeviceSpotInspectionRecordDetailConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "巡检点检记录子.xls", "数据", DeviceSpotInspectionRecordDetailExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入巡检点检记录子模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "巡检点检记录子基本信息导入模板.xls", "巡检点检记录子基本信息列表", DeviceSpotInspectionRecordDetailExcelVO.class, list); + } + + @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('eam:device-spot-inspection-record-detail:import')") + 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 list = ExcelUtils.read(file, DeviceSpotInspectionRecordDetailExcelVO.class); + List errorList = moldSpotInspectionRecordDetailService.importDeviceSpotInspectionRecordDetailList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + @GetMapping("/getList") + @Operation(summary = "获得设备巡检点检记录子列表") + @Parameter(name = "number", description = "巡检点检工单号", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-spot-inspection-record-detail:query')") + public CommonResult> getList(@RequestParam("number") String number) { + List list = moldSpotInspectionRecordDetailService.getList(number); + return success(DeviceSpotInspectionRecordDetailConvert.INSTANCE.convertList(list)); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldspotinspectionrecord/MoldSpotInspectionRecordMainController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldspotinspectionrecord/MoldSpotInspectionRecordMainController.java new file mode 100644 index 0000000..e26cb9c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/moldspotinspectionrecord/MoldSpotInspectionRecordMainController.java @@ -0,0 +1,190 @@ +package com.win.module.eam.controller.moldspotinspectionrecord; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.devicemolditems.vo.DeviceMoldItemsRespVO; +import com.win.module.eam.controller.devicespotinspectionrecord.vo.*; +import com.win.module.eam.convert.devicemolditems.DeviceMoldItemsConvert; +import com.win.module.eam.convert.devicespotinspectionrecord.DeviceSpotInspectionRecordMainConvert; +import com.win.module.eam.dal.dataobject.devicemolditems.DeviceMoldItemsDO; +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordMainDO; +import com.win.module.eam.service.moldspotinspectionrecord.MoldSpotInspectionRecordMainService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + + +@Tag(name = "管理后台 - 巡检点检记录") +@RestController +@RequestMapping("/eam/mold-spot-inspection-record-main") +@Validated +public class MoldSpotInspectionRecordMainController { + + @Resource + private MoldSpotInspectionRecordMainService moldSpotInspectionRecordMainService; + + @PostMapping("/create") + @Operation(summary = "创建检修工单主") + @PreAuthorize("@ss.hasPermission('eam:mold-spot-inspection-record-main:create') or @ss.hasPermission('eam:mold-spot-inspection-record-main:createAPP')") + public CommonResult createDeviceSpotInspectionRecordMain(@Valid @RequestBody DeviceSpotInspectionRecordMainCreateReqVO createReqVO) { + return success(moldSpotInspectionRecordMainService.createDeviceSpotInspectionRecordMain(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新检修工单主或完成") + @PreAuthorize("@ss.hasPermission('eam:mold-spot-inspection-record-main:update') or @ss.hasPermission('eam:mold-spot-inspection-record-main:updateAPP')") + @Parameters({ + @Parameter(name = "id", description = "id", required = true), + @Parameter(name = "status", description = "点击完成的时候才传COMPLETED固定值", required = false), + }) + public CommonResult updateDeviceSpotInspectionRecordMain(@Valid @RequestBody DeviceSpotInspectionRecordMainUpdateReqVO updateReqVO) { + int result = moldSpotInspectionRecordMainService.updateDeviceSpotInspectionRecordMain(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除检修工单主") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:mold-spot-inspection-record-main:delete') or @ss.hasPermission('eam:mold-spot-inspection-record-main:deleteAPP')") + public CommonResult deleteDeviceSpotInspectionRecordMain(@RequestParam("id") Long id) { + int result = moldSpotInspectionRecordMainService.deleteDeviceSpotInspectionRecordMain(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得检修工单主") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:mold-spot-inspection-record-main:query')") + public CommonResult getDeviceSpotInspectionRecordMain(@RequestParam("id") Long id) { + DeviceSpotInspectionRecordMainDO deviceSpotInspectionRecordMain = moldSpotInspectionRecordMainService.getDeviceSpotInspectionRecordMain(id); + return success(DeviceSpotInspectionRecordMainConvert.INSTANCE.convert(deviceSpotInspectionRecordMain)); + } + + @GetMapping("/list") + @Operation(summary = "获得检修工单主列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:mold-spot-inspection-record-main:query')") + public CommonResult> getDeviceSpotInspectionRecordMainList(@RequestParam("ids") Collection ids) { + List list = moldSpotInspectionRecordMainService.getDeviceSpotInspectionRecordMainList(ids); + return success(DeviceSpotInspectionRecordMainConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得检修工单主分页") + //@PreAuthorize("@ss.hasPermission('eam:mold-spot-inspection-record-main:query')") + public CommonResult> getDeviceSpotInspectionRecordMainPage(@Valid DeviceSpotInspectionRecordMainPageReqVO pageVO) { + PageResult pageResult = moldSpotInspectionRecordMainService.getDeviceSpotInspectionRecordMainPage(pageVO); + return success(DeviceSpotInspectionRecordMainConvert.INSTANCE.convertPage(pageResult)); + } + + @PostMapping("/senior") + @Operation(summary = "获得检修工单主分页") + //@PreAuthorize("@ss.hasPermission('eam:mold-spot-inspection-record-main:query')") + public CommonResult> getDeviceSpotInspectionRecordMainSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = moldSpotInspectionRecordMainService.getDeviceSpotInspectionRecordMainSenior(conditions); + PageResult result = DeviceSpotInspectionRecordMainConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出检修工单主 Excel") + @PreAuthorize("@ss.hasPermission('eam:mold-spot-inspection-record-main:export')") + @OperateLog(type = EXPORT) + public void exportDeviceSpotInspectionRecordMainExcel(@Valid DeviceSpotInspectionRecordMainExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = moldSpotInspectionRecordMainService.getDeviceSpotInspectionRecordMainList(exportReqVO); + // 导出 Excel + List datas = DeviceSpotInspectionRecordMainConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "检修工单主.xls", "数据", DeviceSpotInspectionRecordMainExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入检修工单主模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "检修工单主基本信息导入模板.xls", "检修工单主基本信息列表", DeviceSpotInspectionRecordMainExcelVO.class, list); + } + + @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('eam:mold-spot-inspection-record-main:import')") + 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 list = ExcelUtils.read(file, DeviceSpotInspectionRecordMainExcelVO.class); + List errorList = moldSpotInspectionRecordMainService.importDeviceSpotInspectionRecordMainList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + @GetMapping("/getListByDeviceNumber") + @Operation(summary = "根据设备模具号查询巡检点检项列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-mold-items:query')") + public CommonResult> getDeviceMoldItemsList(@RequestParam("number") String number) { + List list = moldSpotInspectionRecordMainService.getDeviceMoldItemsList(number); + return success(DeviceMoldItemsConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/getAppPage") + @Operation(summary = "获得APP工单分页") + public CommonResult> getAppPage(@Valid DeviceSpotInspectionRecordMainPageReqVO pageVO) { + PageResult pageResult = moldSpotInspectionRecordMainService.getAppPage(pageVO); + return success(DeviceSpotInspectionRecordMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/orderClickFinish") + @Operation(summary = "巡检点检点击完成") + @Parameters({ + @Parameter(name = "id", description = "主键id", required = true) + }) + @PreAuthorize("@ss.hasPermission('eam:mold-spot-inspection-record-main:orderClickFinish') or @ss.hasPermission('eam:mold-spot-inspection-record-main:orderClickFinishAPP')") + public CommonResult orderClickFinish(@RequestParam("id") Long id) { + return success(moldSpotInspectionRecordMainService.orderClickFinish(id)); + } + + @GetMapping("/orderClickVerify") + @Operation(summary = "巡检点检工程师验证") + @Parameters({ + @Parameter(name = "id", description = "主键id", required = true) + }) + @PreAuthorize("@ss.hasPermission('eam:mold-spot-inspection-record-main:orderClickVerify') or @ss.hasPermission('eam:mold-spot-inspection-record-main:orderClickVerifyAPP')") + public CommonResult orderClickApprove(@RequestParam("id") Long id,@RequestParam("status") String status,String approveOpinion) { + return success(moldSpotInspectionRecordMainService.orderClickApprove(id,status,approveOpinion)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/BasicMonthEquipmentController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/BasicMonthEquipmentController.java new file mode 100644 index 0000000..936d72d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/BasicMonthEquipmentController.java @@ -0,0 +1,141 @@ +package com.win.module.eam.controller.monthequipment; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.PageResult; +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.eam.controller.monthequipment.vo.*; +import com.win.module.eam.convert.monthequipment.BasicMonthEquipmentConvert; +import com.win.module.eam.dal.dataobject.monthequipment.BasicMonthEquipmentDO; +import com.win.module.eam.enums.DictTypeConstants; +import com.win.module.eam.service.monthequipment.BasicMonthEquipmentService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 首页月设备实现指标") +@RestController +@RequestMapping("/eam/basic-month-equipment") +@Validated +public class BasicMonthEquipmentController { + + @Resource + private BasicMonthEquipmentService basicMonthEquipmentService; + + @PostMapping("/create") + @Operation(summary = "创建首页月设备实现指标") + @PreAuthorize("@ss.hasPermission('basic:BasicMonthEquipment:create')") + public CommonResult createBasicMonthEquipment(@Valid @RequestBody BasicMonthEquipmentCreateReqVO createReqVO) { + return success(basicMonthEquipmentService.createBasicMonthEquipment(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新首页月设备实现指标") + @PreAuthorize("@ss.hasPermission('basic:BasicMonthEquipment:update')") + public CommonResult updateBasicMonthEquipment(@Valid @RequestBody BasicMonthEquipmentUpdateReqVO updateReqVO) { + int result = basicMonthEquipmentService.updateBasicMonthEquipment(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除首页月设备实现指标") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('basic:BasicMonthEquipment:delete')") + public CommonResult deleteBasicMonthEquipment(@RequestParam("id") Long id) { + int result = basicMonthEquipmentService.deleteBasicMonthEquipment(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得首页月设备实现指标") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:basic-month-equipment:query')") + public CommonResult getBasicMonthEquipment(@RequestParam("id") Long id) { + BasicMonthEquipmentDO basicMonthEquipment = basicMonthEquipmentService.getBasicMonthEquipment(id); + return success(BasicMonthEquipmentConvert.INSTANCE.convert(basicMonthEquipment)); + } + + @GetMapping("/list") + @Operation(summary = "获得首页月设备实现指标列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:basic-month-equipment:query')") + public CommonResult> getBasicMonthEquipmentList(@RequestParam("ids") Collection ids) { + List list = basicMonthEquipmentService.getBasicMonthEquipmentList(ids); + return success(BasicMonthEquipmentConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得首页月设备实现指标分页") +// @PreAuthorize("@ss.hasPermission('eam:basic-month-equipment:query')") + public CommonResult> getBasicMonthEquipmentPage(@Valid BasicMonthEquipmentPageReqVO pageVO) { + PageResult pageResult = basicMonthEquipmentService.getBasicMonthEquipmentPage(pageVO); + return success(BasicMonthEquipmentConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出首页月设备实现指标 Excel") + @PreAuthorize("@ss.hasPermission('basic:BasicMonthEquipment:export')") + @OperateLog(type = EXPORT) + public void exportBasicMonthEquipmentExcel(@Valid BasicMonthEquipmentExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = basicMonthEquipmentService.getBasicMonthEquipmentList(exportReqVO); + // 导出 Excel + List datas = BasicMonthEquipmentConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "首页月设备实现指标.xls", "数据", BasicMonthEquipmentExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入首页月设备实现指标模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + Map mapDropDown = new HashMap<>(); + String[] EQUIPMENT_INDEX_NAME = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.EQUIPMENT_INDEX_NAME); + String[] MONTH_INDEX_FACTORY_TYPE = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.FACTORY_TYPE); + mapDropDown.put(1, EQUIPMENT_INDEX_NAME); + mapDropDown.put(2, MONTH_INDEX_FACTORY_TYPE); + + // 输出 + ExcelUtils.write(response, "首页月设备实现指标基本信息导入模板.xls", "首页月设备实现指标基本信息列表", BasicMonthEquipmentExcelVO.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('basic:BasicMonthEquipment:import')") + 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 list = ExcelUtils.read(file, BasicMonthEquipmentExcelVO.class); + List errorList = basicMonthEquipmentService.importBasicMonthEquipmentList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + return success(returnMap); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentBaseVO.java new file mode 100644 index 0000000..c0b570c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentBaseVO.java @@ -0,0 +1,53 @@ +package com.win.module.eam.controller.monthequipment.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 BasicMonthEquipmentBaseVO { + + private Long id; + + @Schema(description = "名称", example = "王五") + private String name; + + @Schema(description = "类型枚举字典", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "类型枚举字典不能为空") + private String type; + + @Schema(description = "厂区枚举字典", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "厂区枚举字典不能为空") + private String factoryType; + + @Schema(description = "月指标", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "月指标不能为空") + private String monthIndex; + + @Schema(description = "月", requiredMode = Schema.RequiredMode.REQUIRED) + private int month; + + @Schema(description = "年", requiredMode = Schema.RequiredMode.REQUIRED) + private int year; + + @Schema(description = "实际") + @NotNull(message = "实际值不能为空") + private String actual; + + @Schema(description = "地点ID", example = "9019") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentCreateReqVO.java new file mode 100644 index 0000000..804c644 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.monthequipment.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 首页月设备实现指标创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BasicMonthEquipmentCreateReqVO extends BasicMonthEquipmentBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentErrorVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentErrorVO.java new file mode 100644 index 0000000..182a2b1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentErrorVO.java @@ -0,0 +1,25 @@ +package com.win.module.eam.controller.monthequipment.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + + +/** + * 采购索赔申请子 Excel VO + * + * @author 超级管理员 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BasicMonthEquipmentErrorVO extends BasicMonthEquipmentExcelVO { + + @ExcelProperty(value = "导入状态", index = 0) + private String importStatus; + + @ExcelProperty(value = "导入说明", index = 1) + private String importRemark; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentExcelVO.java new file mode 100644 index 0000000..f91e132 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentExcelVO.java @@ -0,0 +1,35 @@ +package com.win.module.eam.controller.monthequipment.vo; + +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import lombok.*; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.experimental.Accessors; + +/** + * 首页月设备实现指标 Excel VO + * + * @author 超级管理员 + */ +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题 +@Data +public class BasicMonthEquipmentExcelVO { + + @ExcelProperty("年月(如2024年3月)") + private String monthIndex; + + @ExcelProperty(value = "类型",converter = DictConvert.class) + @DictFormat("EQUIPMENT_INDEX_NAME") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中 + private String type; + + @ExcelProperty(value = "厂区",converter = DictConvert.class) + @DictFormat("FACTORY_TYPE") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中 + private String factoryType; + + @ExcelProperty("月实际值(没有则为0)") + private String actual; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentExportReqVO.java new file mode 100644 index 0000000..5a2543a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentExportReqVO.java @@ -0,0 +1,15 @@ +package com.win.module.eam.controller.monthequipment.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,参数和 BasicMonthEquipmentPageReqVO 是一致的") +@Data +public class BasicMonthEquipmentExportReqVO { + + @Schema(description = "厂区枚举字典", example = "1") + private String factoryType; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentPageReqVO.java new file mode 100644 index 0000000..c9acac8 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentPageReqVO.java @@ -0,0 +1,17 @@ +package com.win.module.eam.controller.monthequipment.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 BasicMonthEquipmentPageReqVO extends PageParam { + + @Schema(description = "厂区枚举字典", example = "1") + private String factoryType; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentRespVO.java new file mode 100644 index 0000000..e6bfc86 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.eam.controller.monthequipment.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 BasicMonthEquipmentRespVO extends BasicMonthEquipmentBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentUpdateReqVO.java new file mode 100644 index 0000000..c2de116 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/monthequipment/vo/BasicMonthEquipmentUpdateReqVO.java @@ -0,0 +1,17 @@ +package com.win.module.eam.controller.monthequipment.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 首页月设备实现指标更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BasicMonthEquipmentUpdateReqVO extends BasicMonthEquipmentBaseVO { + + @Schema(description = "id", example = "6261") + private Long id; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/package-info.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/package-info.java new file mode 100644 index 0000000..9192566 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/package-info.java @@ -0,0 +1,4 @@ +/** + * System API 包,定义暴露给其它模块的 API + */ +package com.win.module.eam.controller; diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/ProducePlanController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/ProducePlanController.java new file mode 100644 index 0000000..40f64d3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/ProducePlanController.java @@ -0,0 +1,105 @@ +package com.win.module.eam.controller.producePlan; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.eam.controller.producePlan.vo.*; +import com.win.module.eam.convert.producePlan.ProducePlanConvert; +import com.win.module.eam.dal.dataobject.producePlan.ProducePlanDO; +import com.win.module.eam.service.producePlan.ProducePlanService; +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.Arrays; +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("/eam/producePlan") +@Validated +public class ProducePlanController { + + @Resource + private ProducePlanService producePlanService; + +// @PostMapping("/create") +// @Operation(summary = "创建生产计划") +// @PreAuthorize("@ss.hasPermission('producePlan::create')") +// public CommonResult create(@Valid @RequestBody ProducePlanCreateReqVO createReqVO) { +// return success(Service.create(createReqVO)); +// } + + @PutMapping("/update") + @Operation(summary = "更新生产计划") + @PreAuthorize("@ss.hasPermission('producePlan::update')") + public CommonResult update(@Valid @RequestBody ProducePlanUpdateReqVO updateReqVO) { + int result = producePlanService.update(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除生产计划") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('producePlan::delete')") + public CommonResult delete(@RequestParam("id") Long id) { + int result = producePlanService.delete(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得生产计划") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('producePlan::query')") + public CommonResult get(@RequestParam("id") Long id) { + ProducePlanDO producePlanDO= producePlanService.get(id); + return success(ProducePlanConvert.INSTANCE.convert(producePlanDO)); + } + + @GetMapping("/list") + @Operation(summary = "获得生产计划列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('producePlan::query')") + public CommonResult> getList(@RequestParam("ids") Collection ids) { + List list = producePlanService.getList(ids); + return success(ProducePlanConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出生产计划 Excel") + @PreAuthorize("@ss.hasPermission('producePlan::export')") + @OperateLog(type = EXPORT) + public void exportExcel(@Valid ProducePlanExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = producePlanService.getList(exportReqVO); + // 导出 Excel + List datas = ProducePlanConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "生产计划.xls", "数据", ProducePlanExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入生产计划模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "生产计划基本信息导入模板.xls", "生产计划基本信息列表", ProducePlanExcelVO.class, list); + } + + @GetMapping("/produce") + @Operation(summary = "获得导入生产计划模板") + public void aa(){ + producePlanService.getNewProducePlan(); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanBaseVO.java new file mode 100644 index 0000000..db3819d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanBaseVO.java @@ -0,0 +1,92 @@ +package com.win.module.eam.controller.producePlan.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 生产计划 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class ProducePlanBaseVO { + + @Schema(description = "外部接口ID") + private String serviceId; + + @Schema(description = "计划单号") + private String planCode; + + @Schema(description = "产线") + private String workLineCode; + + @Schema(description = "产线名称", example = "王五") + private String workLineName; + + @Schema(description = "车型") + private String model; + + @Schema(description = "配置") + private String configure; + + @Schema(description = "配置名称", example = "王五") + private String configureName; + + @Schema(description = "计划数量") + private Integer planQty; + + @Schema(description = "完工数量") + private Integer completedQty; + + @Schema(description = "计划状态") + private String planState; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "创建用户") + private String createUser; + + @Schema(description = "更新用户") + private String updateUser; + + @Schema(description = "备用字段1") + private String column1; + + @Schema(description = "备用字段2") + private String column2; + + @Schema(description = "备用字段3", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "备用字段3不能为空") + private String column3; + + @Schema(description = "备用字段4") + private BigDecimal column4; + + @Schema(description = "开始时间") + private String startTime; + + @Schema(description = "结束时间") + private String endTime; + + @Schema(description = "工时") + private String workHours; + + @Schema(description = "顺序") + private Integer seq; + + @Schema(description = "工位记录") + private String wscode1; + + @Schema(description = "工位记录") + private String wscode2; + + @Schema(description = "工位记录") + private String wscode3; + + @Schema(description = "工位记录") + private String wscode4; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanCreateReqVO.java new file mode 100644 index 0000000..596ae1e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.producePlan.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 生产计划创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ProducePlanCreateReqVO extends ProducePlanBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanExcelVO.java new file mode 100644 index 0000000..e36f062 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanExcelVO.java @@ -0,0 +1,95 @@ +package com.win.module.eam.controller.producePlan.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 生产计划 Excel VO + * + * @author 超级管理员 + */ +@Data +public class ProducePlanExcelVO { + + @ExcelProperty("id") + private Long id; + + @ExcelProperty("计划单号") + private String planCode; + + @ExcelProperty("产线") + private String workLineCode; + + @ExcelProperty("产线名称") + private String workLineName; + + @ExcelProperty("车型") + private String model; + + @ExcelProperty("配置") + private String configure; + + @ExcelProperty("配置名称") + private String configureName; + + @ExcelProperty("计划数量") + private Integer planQty; + + @ExcelProperty("完工数量") + private Integer completedQty; + + @ExcelProperty("计划状态") + private String planState; + + @ExcelProperty("备注") + private String remark; + + @ExcelProperty("创建用户") + private String createUser; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("更新用户") + private String updateUser; + + @ExcelProperty("备用字段1") + private String column1; + + @ExcelProperty("备用字段2") + private String column2; + + @ExcelProperty("备用字段3") + private String column3; + + @ExcelProperty("备用字段4") + private BigDecimal column4; + + @ExcelProperty("开始时间") + private String startTime; + + @ExcelProperty("结束时间") + private String endTime; + + @ExcelProperty("工时") + private String workHours; + + @ExcelProperty("顺序") + private Integer seq; + + @ExcelProperty("工位记录") + private String wscode1; + + @ExcelProperty("工位记录") + private String wscode2; + + @ExcelProperty("工位记录") + private String wscode3; + + @ExcelProperty("工位记录") + private String wscode4; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanExportReqVO.java new file mode 100644 index 0000000..be349ee --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanExportReqVO.java @@ -0,0 +1,94 @@ +package com.win.module.eam.controller.producePlan.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +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,参数和 ProducePlanPageReqVO 是一致的") +@Data +public class ProducePlanExportReqVO { + + @Schema(description = "计划单号") + private String planCode; + + @Schema(description = "产线") + private String workLineCode; + + @Schema(description = "产线名称", example = "王五") + private String workLineName; + + @Schema(description = "车型") + private String model; + + @Schema(description = "配置") + private String configure; + + @Schema(description = "配置名称", example = "王五") + private String configureName; + + @Schema(description = "计划数量") + private Integer planQty; + + @Schema(description = "完工数量") + private Integer completedQty; + + @Schema(description = "计划状态") + private String planState; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "创建用户") + private String createUser; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "更新用户") + private String updateUser; + + @Schema(description = "备用字段1") + private String column1; + + @Schema(description = "备用字段2") + private String column2; + + @Schema(description = "备用字段3") + private String column3; + + @Schema(description = "备用字段4") + private BigDecimal column4; + + @Schema(description = "开始时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] startTime; + + @Schema(description = "结束时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] endTime; + + @Schema(description = "工时") + private String workHours; + + @Schema(description = "顺序") + private Integer seq; + + @Schema(description = "工位记录") + private String wscode1; + + @Schema(description = "工位记录") + private String wscode2; + + @Schema(description = "工位记录") + private String wscode3; + + @Schema(description = "工位记录") + private String wscode4; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanPageReqVO.java new file mode 100644 index 0000000..0e1f28e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanPageReqVO.java @@ -0,0 +1,99 @@ +package com.win.module.eam.controller.producePlan.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.math.BigDecimal; +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 ProducePlanPageReqVO extends PageParam { + + @Schema(description = "计划单号") + private String planCode; + + @Schema(description = "产线") + private String workLineCode; + + @Schema(description = "产线名称", example = "王五") + private String workLineName; + + @Schema(description = "车型") + private String model; + + @Schema(description = "配置") + private String configure; + + @Schema(description = "配置名称", example = "王五") + private String configureName; + + @Schema(description = "计划数量") + private Integer planQty; + + @Schema(description = "完工数量") + private Integer completedQty; + + @Schema(description = "计划状态") + private String planState; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "创建用户") + private String createUser; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "更新用户") + private String updateUser; + + @Schema(description = "备用字段1") + private String column1; + + @Schema(description = "备用字段2") + private String column2; + + @Schema(description = "备用字段3") + private String column3; + + @Schema(description = "备用字段4") + private BigDecimal column4; + + @Schema(description = "开始时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] startTime; + + @Schema(description = "结束时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private String[] endTime; + + @Schema(description = "工时") + private String workHours; + + @Schema(description = "顺序") + private Integer seq; + + @Schema(description = "工位记录") + private String wscode1; + + @Schema(description = "工位记录") + private String wscode2; + + @Schema(description = "工位记录") + private String wscode3; + + @Schema(description = "工位记录") + private String wscode4; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanRespVO.java new file mode 100644 index 0000000..6f0387c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.eam.controller.producePlan.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 ProducePlanRespVO extends ProducePlanBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24353") + private Long id; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanUpdateReqVO.java new file mode 100644 index 0000000..0b73065 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/producePlan/vo/ProducePlanUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.eam.controller.producePlan.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 生产计划更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ProducePlanUpdateReqVO extends ProducePlanBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24353") + @NotNull(message = "id不能为空") + private Long id; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/SupplierController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/SupplierController.java new file mode 100644 index 0000000..b5ad924 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/SupplierController.java @@ -0,0 +1,132 @@ +package com.win.module.eam.controller.supplier; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +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.eam.controller.supplier.vo.*; +import com.win.module.eam.convert.supplier.SupplierConvert; +import com.win.module.eam.dal.dataobject.supplier.SupplierDO; +import com.win.module.eam.enums.DictTypeConstants; +import com.win.module.eam.service.supplier.SupplierService; +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.HashMap; +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("/eam/supplier") +@Validated +public class SupplierController { + + @Resource + private SupplierService supplierService; + + @PostMapping("/create") + @Operation(summary = "创建供应商") + @PreAuthorize("@ss.hasPermission('basic:supplier:create')") + public CommonResult createSupplier(@Valid @RequestBody SupplierCreateReqVO createReqVO) { + return success(supplierService.createSupplier(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新供应商") + @PreAuthorize("@ss.hasPermission('basic:supplier:update')") + public CommonResult updateSupplier(@Valid @RequestBody SupplierUpdateReqVO updateReqVO) { + int result = supplierService.updateSupplier(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除供应商") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('basic:supplier:delete')") + public CommonResult deleteSupplier(@RequestParam("id") Long id) { + int result = supplierService.deleteSupplier(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得供应商") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('basic:supplier:query')") + public CommonResult getSupplier(@RequestParam("id") Long id) { + SupplierDO supplier = supplierService.getSupplier(id); + return success(SupplierConvert.INSTANCE.convert(supplier)); + } + + @GetMapping("/list") + @Operation(summary = "获得供应商列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('basic:supplier:query')") + public CommonResult> getSupplierList(@RequestParam("ids") Collection ids) { + List list = supplierService.getSupplierList(ids); + return success(SupplierConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得供应商分页") +// @PreAuthorize("@ss.hasPermission('basic:supplier:query')") + public CommonResult> getSupplierPage(@Valid SupplierPageReqVO pageVO) { + PageResult pageResult = supplierService.getSupplierPage(pageVO); + return success(SupplierConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出供应商 Excel") + @PreAuthorize("@ss.hasPermission('basic:supplier:export')") + @OperateLog(type = EXPORT) + public void exportSupplierExcel(@Valid SupplierExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = supplierService.getSupplierList(exportReqVO); + Map mapDropDown = new HashMap<>(); + List resultList = this.getExcelVo(list, mapDropDown); + // 导出 Excel + ExcelUtils.write(response, "供应商.xls", "数据", SupplierExcelVO.class, resultList,mapDropDown); + } + + private List getExcelVo(List list, Map mapDropDown) { + String[] available = DictFrameworkUtils.dictTypeDictDataValue(DictTypeConstants.TRUE_FALSE); + mapDropDown.put(6, available); + // 导出 Excel + List resultList = SupplierConvert.INSTANCE.convertList02(list); + return resultList; + } + + + @GetMapping("/noPage") + @Operation(summary = "获得供应商不分页") +// @PreAuthorize("@ss.hasPermission('basic:supplier:query')") + public CommonResult> getSupplierNoPage(@Valid SupplierReqVO pageVO) { + List pageResult = supplierService.getSupplierNoPage(pageVO); + return success(SupplierConvert.INSTANCE.convertList(pageResult)); + } + + @PostMapping("/senior") + @Operation(summary = "高级搜索获得账期日历分页") +// @PreAuthorize("@ss.hasPermission('basic:supplier:query')") + public CommonResult> getSupplierSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = supplierService.getSupplierSenior(conditions); + PageResult result = SupplierConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierBaseVO.java new file mode 100644 index 0000000..3c43cf1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierBaseVO.java @@ -0,0 +1,58 @@ +package com.win.module.eam.controller.supplier.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 SupplierBaseVO { + + @Schema(description = "id", example = "id") + private Long id; + + @Schema(description = "编号唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + private String number; + + @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "简称", example = "王五") + private String shortName; + + @Schema(description = "地址") + private String address; + + @Schema(description = "国家") + private String country; + + @Schema(description = "城市") + private String city; + + @Schema(description = "电话") + private String phone; + + @Schema(description = "传真") + private String fax; + + @Schema(description = "邮编", example = "3288") + private String postId; + + @Schema(description = "联系人") + private String contacts; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "地点ID", example = "19829") + private String siteId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierCreateReqVO.java new file mode 100644 index 0000000..271ccce --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.supplier.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 SupplierCreateReqVO extends SupplierBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierExcelVO.java new file mode 100644 index 0000000..c4b7b90 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierExcelVO.java @@ -0,0 +1,47 @@ +package com.win.module.eam.controller.supplier.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.win.framework.excel.core.annotations.DictFormat; +import com.win.framework.excel.core.convert.DictConvert; +import com.win.module.eam.enums.DictTypeConstants; +import lombok.Data; + +/** + * 供应商 Excel VO + * + * @author 超级管理员 + */ +@Data +public class SupplierExcelVO { + + @ExcelProperty("供应商编号") + @ColumnWidth(value = 20) + private String number; + + @ExcelProperty("供应商名称") + @ColumnWidth(value = 20) + private String name; + + @ExcelProperty("简称") + @ColumnWidth(value = 20) + private String shortName; + + @ExcelProperty("联系人") + @ColumnWidth(value = 20) + private String contacts; + + @ExcelProperty("联系电话") + @ColumnWidth(value = 20) + private String phone; + + @ExcelProperty(value = "是否可用", converter = DictConvert.class) + @DictFormat(DictTypeConstants.TRUE_FALSE) + @ColumnWidth(value = 20) + private String available; + + @ExcelProperty("备注") + @ColumnWidth(value = 30) + private String remark; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierExportReqVO.java new file mode 100644 index 0000000..af564b2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierExportReqVO.java @@ -0,0 +1,36 @@ +package com.win.module.eam.controller.supplier.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,参数和 SupplierPageReqVO 是一致的") +@Data +public class SupplierExportReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "赵六") + private String name; + + @Schema(description = "简称", example = "王五") + private String shortName; + + @Schema(description = "地址") + private String address; + + @Schema(description = "国家") + private String country; + + @Schema(description = "城市") + private String city; + + @Schema(description = "电话") + private String phone; + + @Schema(description = "地点ID", example = "19829") + private String siteId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierPageReqVO.java new file mode 100644 index 0000000..719a198 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierPageReqVO.java @@ -0,0 +1,38 @@ +package com.win.module.eam.controller.supplier.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 SupplierPageReqVO extends PageParam { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "赵六") + private String name; + + @Schema(description = "简称", example = "王五") + private String shortName; + + @Schema(description = "地址") + private String address; + + @Schema(description = "国家") + private String country; + + @Schema(description = "城市") + private String city; + + @Schema(description = "电话") + private String phone; + + @Schema(description = "地点ID", example = "19829") + private String siteId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierReqVO.java new file mode 100644 index 0000000..7fcf896 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierReqVO.java @@ -0,0 +1,36 @@ +package com.win.module.eam.controller.supplier.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "管理后台 - 供应商分页 Request VO") +@Data +@ToString(callSuper = true) +public class SupplierReqVO { + + @Schema(description = "编号唯一标识") + private String number; + + @Schema(description = "名称", example = "赵六") + private String name; + + @Schema(description = "简称", example = "王五") + private String shortName; + + @Schema(description = "地址") + private String address; + + @Schema(description = "国家") + private String country; + + @Schema(description = "城市") + private String city; + + @Schema(description = "电话") + private String phone; + + @Schema(description = "地点ID", example = "19829") + private String siteId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierRespVO.java new file mode 100644 index 0000000..68f819f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierRespVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.supplier.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 SupplierRespVO extends SupplierBaseVO { + @Schema(description = "创建时间") + private LocalDateTime createTime; +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierUpdateReqVO.java new file mode 100644 index 0000000..7cc9d74 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/supplier/vo/SupplierUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.supplier.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 SupplierUpdateReqVO extends SupplierBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techinspectionjob/TechInspectionJobDetailController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techinspectionjob/TechInspectionJobDetailController.java new file mode 100644 index 0000000..7f5b89c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techinspectionjob/TechInspectionJobDetailController.java @@ -0,0 +1,149 @@ +package com.win.module.eam.controller.techinspectionjob; + +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.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobDetailConvert; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailDO; +import com.win.module.eam.service.deviceinspectionjob.DeviceInspectionJobDetailService; +import com.win.module.eam.service.techinspectionjob.TechInspectionJobDetailService; +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.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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 检修工单子") +@RestController +@RequestMapping("/eam/tech-inspection-job-detail") +@Validated +public class TechInspectionJobDetailController { + + @Resource + private TechInspectionJobDetailService techInspectionDetailService; + + @PostMapping("/create") + @Operation(summary = "创建检修工单子") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:create')") + public CommonResult createDeviceInspectionDetail(@Valid @RequestBody DeviceInspectionJobDetailCreateReqVO createReqVO) { + return success(techInspectionDetailService.createDeviceInspectionDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新检修工单子") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:update')") + public CommonResult updateDeviceInspectionDetail(@Valid @RequestBody DeviceInspectionJobDetailUpdateReqVO updateReqVO) { + int result = techInspectionDetailService.updateDeviceInspectionDetail(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除检修工单子") + @Parameter(name = "id", description = "编号", required = true) +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:delete')") + public CommonResult deleteDeviceInspectionDetail(@RequestParam("id") Long id) { + int result = techInspectionDetailService.deleteDeviceInspectionDetail(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得检修工单子") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:query')") + public CommonResult getDeviceInspectionDetail(@RequestParam("id") Long id) { + DeviceInspectionJobDetailDO deviceInspectionDetail = techInspectionDetailService.getDeviceInspectionDetail(id); + return success(DeviceInspectionJobDetailConvert.INSTANCE.convert(deviceInspectionDetail)); + } + + @GetMapping("/list") + @Operation(summary = "获得检修工单子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:query')") + public CommonResult> getDeviceInspectionDetailList(@RequestParam("ids") Collection ids) { + List list = techInspectionDetailService.getDeviceInspectionDetailList(ids); + return success(DeviceInspectionJobDetailConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得检修工单子分页") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:query')") + public CommonResult> getDeviceInspectionDetailPage(@Valid DeviceInspectionJobDetailPageReqVO pageVO) { + PageResult pageResult = techInspectionDetailService.getDeviceInspectionDetailPage(pageVO); + return success(DeviceInspectionJobDetailConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出检修工单子 Excel") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail:export')") + @OperateLog(type = EXPORT) + public void exportDeviceInspectionDetailExcel(@Valid DeviceInspectionJobDetailExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = techInspectionDetailService.getDeviceInspectionDetailList(exportReqVO); + // 导出 Excel + List datas = DeviceInspectionJobDetailConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "检修工单子.xls", "数据", DeviceInspectionJobDetailExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入检修工单子模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "检修工单子基本信息导入模板.xls", "检修工单子基本信息列表", DeviceInspectionJobDetailExcelVO.class, list); + } + + @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('eam:device-inspection-job-detail:import')") + 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 list = ExcelUtils.read(file, DeviceInspectionJobDetailExcelVO.class); + List errorList = techInspectionDetailService.importDeviceInspectionDetailList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + /** + * 根据检修工单号查询工单子项信息列表 + * @param + * @return + */ + @GetMapping("/selectListByNumber") + @Operation(summary = "获得检修工单子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-detail:query')") + public CommonResult> selectListByNumber(@RequestParam("number") String number) { + List list = techInspectionDetailService.selectListByNumber(number); + return success(DeviceInspectionJobDetailConvert.INSTANCE.convertList(list)); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techinspectionjob/TechInspectionJobDetailItemController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techinspectionjob/TechInspectionJobDetailItemController.java new file mode 100644 index 0000000..8b1874b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techinspectionjob/TechInspectionJobDetailItemController.java @@ -0,0 +1,136 @@ +package com.win.module.eam.controller.techinspectionjob; + +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.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobDetailItemConvert; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailItemDO; +import com.win.module.eam.service.deviceinspectionjob.DeviceInspectionJobDetailItemService; +import com.win.module.eam.service.techinspectionjob.TechInspectionJobDetailItemService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 检修工单子表与备件关系") +@RestController +@RequestMapping("/eam/tech-inspection-job-detail-item") +@Validated +public class TechInspectionJobDetailItemController { + + @Resource + private TechInspectionJobDetailItemService techInspectionJobDetailItemService; + + @PostMapping("/create") + @Operation(summary = "创建检修工单子表与备件关系") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:create')") + public CommonResult createDeviceInspectionDetailItem(@Valid @RequestBody DeviceInspectionJobDetailItemCreateReqVO createReqVO) { + return success(techInspectionJobDetailItemService.createDeviceInspectionDetailItem(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新检修工单子表与备件关系") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:update')") + public CommonResult updateDeviceInspectionDetailItem(@Valid @RequestBody DeviceInspectionJobDetailItemUpdateReqVO updateReqVO) { + int result = techInspectionJobDetailItemService.updateDeviceInspectionDetailItem(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除检修工单子表与备件关系") + @Parameter(name = "id", description = "编号", required = true) +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:delete')") + public CommonResult deleteDeviceInspectionDetailItem(@RequestParam("id") Long id) { + int result = techInspectionJobDetailItemService.deleteDeviceInspectionDetailItem(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得检修工单子表与备件关系") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:query')") + public CommonResult getDeviceInspectionDetailItem(@RequestParam("id") Long id) { + DeviceInspectionJobDetailItemDO deviceInspectionDetailItem = techInspectionJobDetailItemService.getDeviceInspectionDetailItem(id); + return success(DeviceInspectionJobDetailItemConvert.INSTANCE.convert(deviceInspectionDetailItem)); + } + + @GetMapping("/list") + @Operation(summary = "获得检修工单子表与备件关系列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:query')") + public CommonResult> getDeviceInspectionDetailItemList(@RequestParam("ids") Collection ids) { + List list = techInspectionJobDetailItemService.getDeviceInspectionDetailItemList(ids); + return success(DeviceInspectionJobDetailItemConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得检修工单子表与备件关系分页") + @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:query')") + public CommonResult> getDeviceInspectionDetailItemPage(@Valid DeviceInspectionJobDetailItemPageReqVO pageVO) { + PageResult pageResult = techInspectionJobDetailItemService.getDeviceInspectionDetailItemPage(pageVO); + return success(DeviceInspectionJobDetailItemConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出检修工单子表与备件关系 Excel") +// @PreAuthorize("@ss.hasPermission('eam:device-inspection-job-detail-item:export')") + @OperateLog(type = EXPORT) + public void exportDeviceInspectionDetailItemExcel(@Valid DeviceInspectionJobDetailItemExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = techInspectionJobDetailItemService.getDeviceInspectionDetailItemList(exportReqVO); + // 导出 Excel + List datas = DeviceInspectionJobDetailItemConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "检修工单子表与备件关系.xls", "数据", DeviceInspectionJobDetailItemExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入检修工单子表与备件关系模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "检修工单子表与备件关系基本信息导入模板.xls", "检修工单子表与备件关系基本信息列表", DeviceInspectionJobDetailItemExcelVO.class, list); + } + + @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('eam:device-inspection-job-detail-item:import')") + 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 list = ExcelUtils.read(file, DeviceInspectionJobDetailItemExcelVO.class); + List errorList = techInspectionJobDetailItemService.importDeviceInspectionDetailItemList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techinspectionjob/TechInspectionJobMainController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techinspectionjob/TechInspectionJobMainController.java new file mode 100644 index 0000000..0141d3b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techinspectionjob/TechInspectionJobMainController.java @@ -0,0 +1,217 @@ +package com.win.module.eam.controller.techinspectionjob; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobMainConvert; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobMainDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionReportDo; +import com.win.module.eam.service.deviceinspectionjob.DeviceInspectionJobMainService; +import com.win.module.eam.service.techinspectionjob.TechInspectionJobMainService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 检修工单主") +@RestController +@RequestMapping("/eam/tech-inspection-job-main") +@Validated +public class TechInspectionJobMainController { + + @Resource + private TechInspectionJobMainService techInspectionJobMainService; + + @PostMapping("/create") + @Operation(summary = "创建检修工单主") + @PreAuthorize("@ss.hasPermission('eam:tech-inspection-job-main:create')") + public CommonResult createDeviceInspectionMain(@Valid @RequestBody DeviceInspectionJobMainCreateReqVO createReqVO) { + return success(techInspectionJobMainService.createDeviceInspectionMain(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新检修工单主") + @PreAuthorize("@ss.hasPermission('eam:tech-inspection-job-main:update')") + public CommonResult updateDeviceInspectionMain(@Valid @RequestBody DeviceInspectionJobMainUpdateReqVO updateReqVO) { + int result = techInspectionJobMainService.updateDeviceInspectionMain(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除检修工单主") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:tech-inspection-job-main:delete')") + public CommonResult deleteDeviceInspectionMain(@RequestParam("id") Long id) { + int result = techInspectionJobMainService.deleteDeviceInspectionMain(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得检修工单主") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:tech-inspection-job-main:query')") + public CommonResult getDeviceInspectionMain(@RequestParam("id") Long id) { + DeviceInspectionJobMainDO deviceInspectionMain = techInspectionJobMainService.getDeviceInspectionMain(id); + return success(DeviceInspectionJobMainConvert.INSTANCE.convert(deviceInspectionMain)); + } + + @GetMapping("/list") + @Operation(summary = "获得检修工单主列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:tech-inspection-job-main:query')") + public CommonResult> getDeviceInspectionMainList(@RequestParam("ids") Collection ids) { + List list = techInspectionJobMainService.getDeviceInspectionMainList(ids); + return success(DeviceInspectionJobMainConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得检修工单主分页") +// @PreAuthorize("@ss.hasPermission('eam:tech-inspection-job-main:query')") + public CommonResult> getDeviceInspectionMainPage(@Valid DeviceInspectionJobMainPageReqVO pageVO) { + PageResult pageResult = techInspectionJobMainService.getDeviceInspectionMainPage(pageVO); + return success(DeviceInspectionJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + + @PostMapping("/senior") + @Operation(summary = "获得检修工单分页") +// @PreAuthorize("@ss.hasPermission('eam:tech-inspection-job-main:query')") + public CommonResult> getInspectionJobMainSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = techInspectionJobMainService.getInspectionJobMainSenior(conditions); + PageResult result = DeviceInspectionJobMainConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + + @GetMapping("/export-excel") + @Operation(summary = "导出检修工单主 Excel") +// @PreAuthorize("@ss.hasPermission('eam:tech-inspection-job-main:export')") + @OperateLog(type = EXPORT) + public void exportDeviceInspectionMainExcel(@Valid DeviceInspectionJobMainExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = techInspectionJobMainService.getDeviceInspectionMainList(exportReqVO); + // 导出 Excel + List datas = DeviceInspectionJobMainConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "检修工单主.xls", "数据", DeviceInspectionJobMainExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入检修工单主模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "检修工单主基本信息导入模板.xls", "检修工单主基本信息列表", DeviceInspectionJobMainExcelVO.class, list); + } + + @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('eam:tech-inspection-job-main:import')") + 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 list = ExcelUtils.read(file, DeviceInspectionJobMainExcelVO.class); + List errorList = techInspectionJobMainService.importDeviceInspectionMainList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + @GetMapping("/getAppPage") + @Operation(summary = "获得APP模具或设备工单分页") + @Parameters({ + @Parameter(name = "flag", description = "1从我的进入0或者不填从首页进入", required = true), + @Parameter(name = "type", description = "DEVICE设备MOLD模具", example = "1"), + }) + public CommonResult> getAppPage(@Valid DeviceInspectionJobMainPageReqVO pageVO) { + PageResult pageResult = techInspectionJobMainService.getAppPage(pageVO); + return success(DeviceInspectionJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/orderClickFinish") + @Operation(summary = "检修点击完成") + @PreAuthorize("@ss.hasPermission('eam:tech-inspection-job-main:orderClickFinish')") + @Parameter(name = "id", description = "检修工单id", required = true) + public CommonResult orderClickFinish(@RequestParam("id") Long id) { + int result = techInspectionJobMainService.onClick(id); + return success(result > 0); + } + + @GetMapping("/orderClickVerify") + @Operation(summary = "检修点击验证") + @PreAuthorize("@ss.hasPermission('eam:tech-inspection-job-main:orderClickVerify')") + @Parameter(name = "id", description = "检修工单id", required = true) + @Parameter(name = "verifyContent", description = "验证内容可选填", required = false) + public CommonResult orderClickVerify(@RequestParam("id") Long id,String verifyContent) { + int result = techInspectionJobMainService.onVerify(id,verifyContent); + return success(result > 0); + } + + + @PostMapping("/createPC") + @Operation(summary = "创建检修工单主") + @PreAuthorize("@ss.hasPermission('eam:tech-inspection-job-main:create')") + public CommonResult createDeviceInspectionMainPC(@Valid @RequestBody DeviceInspectionJobMainCreateReqVO createReqVO) { + return success(techInspectionJobMainService.createDeviceInspectionMainPC(createReqVO)); + } + + + @GetMapping("/noPage") + @Operation(summary = "获得检修工单主分页") +// @PreAuthorize("@ss.hasPermission('eam:tech-inspection-job-main:query')") + public CommonResult> getDeviceInspectionMainNoPage(@Valid DeviceInspectionJobMainPageReqVO pageVO) { + List list = techInspectionJobMainService.getDeviceInspectionMainNoPage(pageVO); + return success(DeviceInspectionJobMainConvert.INSTANCE.convertList(list)); + } + + + + @GetMapping("/getInspectionReport") + @Operation(summary = "保养打印单生成子单") + public CommonResult> getMaintainReport(DeviceInspectionReportReqVo deviceInspectionReportReqVo) { + DeviceInspectionReportDo deviceInspectionReportDo = DeviceInspectionJobMainConvert.INSTANCE.convert(deviceInspectionReportReqVo); + return success(techInspectionJobMainService.getInspectionReport(deviceInspectionReportDo)); + } + + + @GetMapping("/getInspectionReportMainInfo") + @Operation(summary = "保养打印单生成主单") + public CommonResult> getMaintainReportMainInfo(DeviceInspectionReportReqVo deviceInspectionReportReqVo) { + DeviceInspectionReportDo deviceInspectionReportDo = new DeviceInspectionReportDo(); + deviceInspectionReportDo.setId(deviceInspectionReportReqVo.getId()); + List resultList = techInspectionJobMainService.getInspectionReportMainInfo(deviceInspectionReportDo); + return success(resultList); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintainjob/TechMaintainJobDetailController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintainjob/TechMaintainJobDetailController.java new file mode 100644 index 0000000..d7c8387 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintainjob/TechMaintainJobDetailController.java @@ -0,0 +1,144 @@ +package com.win.module.eam.controller.techmaintainjob; + +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.convert.devicemaintainjob.DeviceMaintainJobDetailConvert; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobDetailDO; +import com.win.module.eam.service.techmaintainjob.TechMaintainJobDetailService; +import io.swagger.v3.oas.annotations.Parameters; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +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.*; +import javax.servlet.http.*; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.*; +import java.io.IOException; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.pojo.CommonResult; +import static com.win.framework.common.pojo.CommonResult.success; + +import com.win.framework.excel.core.util.ExcelUtils; + +import com.win.framework.operatelog.core.annotations.OperateLog; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.*; + +import org.springframework.web.multipart.MultipartFile; + +@Tag(name = "管理后台 - 保养工单子") +@RestController +@RequestMapping("/eam/tech-maintain-job-detail") +@Validated +public class TechMaintainJobDetailController { + + @Resource + private TechMaintainJobDetailService techMaintainJobDetailService; + + @PostMapping("/create") + @Operation(summary = "创建保养工单子") + //@PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-detail:create')") + public CommonResult createDeviceMaintainOrderDetail(@Valid @RequestBody DeviceMaintainJobDetailCreateReqVO createReqVO) { + return success(techMaintainJobDetailService.createDeviceMaintainOrderDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新保养工单子") + //@PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-detail:update')") + public CommonResult updateDeviceMaintainOrderDetail(@Valid @RequestBody DeviceMaintainJobDetailUpdateReqVO updateReqVO) { + int result = techMaintainJobDetailService.updateDeviceMaintainOrderDetail(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除保养工单子") + @Parameter(name = "id", description = "编号", required = true) + //@PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-detail:delete')") + public CommonResult deleteDeviceMaintainOrderDetail(@RequestParam("id") Long id) { + int result = techMaintainJobDetailService.deleteDeviceMaintainOrderDetail(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得保养工单子") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-detail:query')") + public CommonResult getDeviceMaintainOrderDetail(@RequestParam("id") Long id) { + DeviceMaintainJobDetailDO deviceMaintainOrderDetail = techMaintainJobDetailService.getDeviceMaintainOrderDetail(id); + return success(DeviceMaintainJobDetailConvert.INSTANCE.convert(deviceMaintainOrderDetail)); + } + + @GetMapping("/list") + @Operation(summary = "获得保养工单子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-detail:query')") + public CommonResult> getDeviceMaintainOrderDetailList(@RequestParam("ids") Collection ids) { + List list = techMaintainJobDetailService.getDeviceMaintainOrderDetailList(ids); + return success(DeviceMaintainJobDetailConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得保养工单子分页") + //@PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-detail:query')") + public CommonResult> getDeviceMaintainOrderDetailPage(@Valid DeviceMaintainJobDetailPageReqVO pageVO) { + PageResult pageResult = techMaintainJobDetailService.getDeviceMaintainOrderDetailPage(pageVO); + return success(DeviceMaintainJobDetailConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出保养工单子 Excel") + //@PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-detail:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMaintainOrderDetailExcel(@Valid DeviceMaintainJobDetailExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = techMaintainJobDetailService.getDeviceMaintainOrderDetailList(exportReqVO); + // 导出 Excel + List datas = DeviceMaintainJobDetailConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "保养工单子.xls", "数据", DeviceMaintainJobDetailExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入保养工单子模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "保养工单子基本信息导入模板.xls", "保养工单子基本信息列表", DeviceMaintainJobDetailExcelVO.class, list); + } + + @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('eam:tech-maintain-job-detail:import')") + 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 list = ExcelUtils.read(file, DeviceMaintainJobDetailExcelVO.class); + List errorList = techMaintainJobDetailService.importDeviceMaintainOrderDetailList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + return success(returnMap); + } + + @GetMapping("/selectListByNumber") + @Operation(summary = "获得保养工单子列表") + @Parameter(name = "number", description = "保养工单号", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-detail:query')") + public CommonResult> selectListByNumber(@RequestParam("number") String number) { + List list = techMaintainJobDetailService.selectListByNumber(number); + return success(DeviceMaintainJobDetailConvert.INSTANCE.convertList(list)); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintainjob/TechMaintainJobDetailItemController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintainjob/TechMaintainJobDetailItemController.java new file mode 100644 index 0000000..d29bb38 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintainjob/TechMaintainJobDetailItemController.java @@ -0,0 +1,137 @@ +package com.win.module.eam.controller.techmaintainjob; + +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.convert.devicemaintainjob.MaintainJobDetailItemConvert; +import com.win.module.eam.dal.dataobject.devicemaintainjob.MaintainJobDetailItemDO; +import com.win.module.eam.service.techmaintainjob.TechMaintainJobDetailItemService; +import io.swagger.v3.oas.annotations.Parameters; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +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.*; +import javax.servlet.http.*; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.*; +import java.io.IOException; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.pojo.CommonResult; +import static com.win.framework.common.pojo.CommonResult.success; + +import com.win.framework.excel.core.util.ExcelUtils; + +import com.win.framework.operatelog.core.annotations.OperateLog; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.*; + +import org.springframework.web.multipart.MultipartFile; + +@Tag(name = "管理后台 - 保养工单子表与备件关系") +@RestController +@RequestMapping("/eam/tech-maintain-job-detail-item") +@Validated +public class TechMaintainJobDetailItemController { + + @Resource + private TechMaintainJobDetailItemService techMaintainJobDetailItemService; + + @PostMapping("/create") + @Operation(summary = "创建保养工单子表与备件关系") + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:create')") + public CommonResult createMaintainOrderDetailItem(@Valid @RequestBody MaintainJobDetailItemCreateReqVO createReqVO) { + return success(techMaintainJobDetailItemService.createMaintainOrderDetailItem(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新保养工单子表与备件关系") + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:update')") + public CommonResult updateMaintainOrderDetailItem(@Valid @RequestBody MaintainJobDetailItemUpdateReqVO updateReqVO) { + int result = techMaintainJobDetailItemService.updateMaintainOrderDetailItem(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除保养工单子表与备件关系") + @Parameter(name = "id", description = "编号", required = true) + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:delete')") + public CommonResult deleteMaintainOrderDetailItem(@RequestParam("id") Long id) { + int result = techMaintainJobDetailItemService.deleteMaintainOrderDetailItem(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得保养工单子表与备件关系") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:query')") + public CommonResult getMaintainOrderDetailItem(@RequestParam("id") Long id) { + MaintainJobDetailItemDO maintainOrderDetailItem = techMaintainJobDetailItemService.getMaintainOrderDetailItem(id); + return success(MaintainJobDetailItemConvert.INSTANCE.convert(maintainOrderDetailItem)); + } + + @GetMapping("/list") + @Operation(summary = "获得保养工单子表与备件关系列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:query')") + public CommonResult> getMaintainOrderDetailItemList(@RequestParam("ids") Collection ids) { + List list = techMaintainJobDetailItemService.getMaintainOrderDetailItemList(ids); + return success(MaintainJobDetailItemConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得保养工单子表与备件关系分页") + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:query')") + public CommonResult> getMaintainOrderDetailItemPage(@Valid MaintainJobDetailItemPageReqVO pageVO) { + PageResult pageResult = techMaintainJobDetailItemService.getMaintainOrderDetailItemPage(pageVO); + return success(MaintainJobDetailItemConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出保养工单子表与备件关系 Excel") + //@PreAuthorize("@ss.hasPermission('eam:maintain-job-detail-item:export')") + @OperateLog(type = EXPORT) + public void exportMaintainOrderDetailItemExcel(@Valid MaintainJobDetailItemExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = techMaintainJobDetailItemService.getMaintainOrderDetailItemList(exportReqVO); + // 导出 Excel + List datas = MaintainJobDetailItemConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "保养工单子表与备件关系.xls", "数据", MaintainJobDetailItemExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入保养工单子表与备件关系模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "保养工单子表与备件关系基本信息导入模板.xls", "保养工单子表与备件关系基本信息列表", MaintainJobDetailItemExcelVO.class, list); + } + + @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('eam:maintain-job-detail-item:import')") + 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 list = ExcelUtils.read(file, MaintainJobDetailItemExcelVO.class); + List errorList = techMaintainJobDetailItemService.importMaintainOrderDetailItemList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintainjob/TechMaintainJobMainController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintainjob/TechMaintainJobMainController.java new file mode 100644 index 0000000..cfb230d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintainjob/TechMaintainJobMainController.java @@ -0,0 +1,208 @@ +package com.win.module.eam.controller.techmaintainjob; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.convert.devicemaintainjob.DeviceMaintainJobMainConvert; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobReportDo; +import com.win.module.eam.service.techmaintainjob.TechMaintainJobMainService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + + +@Tag(name = "管理后台 - 保养工单主") +@RestController +@RequestMapping("/eam/tech-maintain-job-main") +@Validated +public class TechMaintainJobMainController { + + @Resource + private TechMaintainJobMainService techMaintainJobMainService; + + @PostMapping("/create") + @Operation(summary = "创建保养工单主") + @PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-main:create')") + public CommonResult createDeviceMaintainOrderMain(@Valid @RequestBody DeviceMaintainJobMainCreateReqVO createReqVO) { + return success(techMaintainJobMainService.createDeviceMaintainOrderMain(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新保养工单主") + @PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-main:update')") + public CommonResult updateDeviceMaintainOrderMain(@Valid @RequestBody DeviceMaintainJobMainUpdateReqVO updateReqVO) { + int result = techMaintainJobMainService.updateDeviceMaintainOrderMain(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除保养工单主") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-main:delete')") + public CommonResult deleteDeviceMaintainOrderMain(@RequestParam("id") Long id) { + int result = techMaintainJobMainService.deleteDeviceMaintainOrderMain(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得保养工单主") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-main:query')") + public CommonResult getDeviceMaintainOrderMain(@RequestParam("id") Long id) { + DeviceMaintainJobMainDO deviceMaintainOrderMain = techMaintainJobMainService.getDeviceMaintainOrderMain(id); + return success(DeviceMaintainJobMainConvert.INSTANCE.convert(deviceMaintainOrderMain)); + } + + @GetMapping("/list") + @Operation(summary = "获得保养工单主列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-main:query')") + public CommonResult> getDeviceMaintainOrderMainList(@RequestParam("ids") Collection ids) { + List list = techMaintainJobMainService.getDeviceMaintainOrderMainList(ids); + return success(DeviceMaintainJobMainConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得保养工单主分页") + //@PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-main:query')") + public CommonResult> getDeviceMaintainOrderMainPage(@Valid DeviceMaintainJobMainPageReqVO pageVO) { + PageResult pageResult = techMaintainJobMainService.getDeviceMaintainOrderMainPage(pageVO); + return success(DeviceMaintainJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + + + @PostMapping("/senior") + @Operation(summary = "获得保养工单主分页") + //@PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-main:query')") + public CommonResult> getDeviceMaintainOrderMainSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = techMaintainJobMainService.getDeviceMaintainOrderMainSenior(conditions); + PageResult result = DeviceMaintainJobMainConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + + + @GetMapping("/export-excel") + @Operation(summary = "导出保养工单主 Excel") + @PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-main:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMaintainOrderMainExcel(@Valid DeviceMaintainJobMainExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = techMaintainJobMainService.getDeviceMaintainOrderMainList(exportReqVO); + // 导出 Excel + List datas = DeviceMaintainJobMainConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "保养工单主.xls", "数据", DeviceMaintainJobMainExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入保养工单主模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "保养工单主基本信息导入模板.xls", "保养工单主基本信息列表", DeviceMaintainJobMainExcelVO.class, list); + } + + @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('eam:tech-maintain-job-main:import')") + 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 list = ExcelUtils.read(file, DeviceMaintainJobMainExcelVO.class); + List errorList = techMaintainJobMainService.importDeviceMaintainOrderMainList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + @GetMapping("/getAppPage") + @Operation(summary = "获得APP保养工单分页") + public CommonResult> getAppPage(@Valid DeviceMaintainJobMainPageReqVO pageVO) { + PageResult pageResult = techMaintainJobMainService.getAppPage(pageVO); + return success(DeviceMaintainJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/orderClick") + @Operation(summary = "APP保养工单接单所有人都能接单") + @Parameters({ + @Parameter(name = "id", description = "主键id", required = true) + }) + @PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-main:orderClick')") + public CommonResult orderClick(@RequestParam("id") Long id) { + return success(techMaintainJobMainService.orderClick(id)); + } + + @GetMapping("/orderClickFinish") + @Operation(summary = "APP保养工单点击完成") + @Parameters({ + @Parameter(name = "id", description = "主键id", required = true) + }) + @PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-main:orderClickFinish')") + public CommonResult orderClickFinish(@RequestParam("id") Long id) { + return success(techMaintainJobMainService.orderClickFinish(id)); + } + + @GetMapping("/orderClickVerify") + @Operation(summary = "APP保养工单工程师验证") + @Parameters({ + @Parameter(name = "id", description = "主键id", required = true) + }) + @PreAuthorize("@ss.hasPermission('eam:tech-maintain-job-main:orderClickVerify')") + public CommonResult orderClickVerify(@RequestParam("id") Long id, String verifyContent) { + return success(techMaintainJobMainService.orderClickVerify(id,verifyContent)); + } + + + @GetMapping("/getMaintainReport") + @Operation(summary = "保养打印单生成子单") + public CommonResult> getMaintainReport(DeviceMaintainJobReportReqVo deviceMaintainJobReportReqVo) { + DeviceMaintainJobReportDo deviceMaintainJobReportDo = DeviceMaintainJobMainConvert.INSTANCE.convert(deviceMaintainJobReportReqVo); + return success(techMaintainJobMainService.getMaintainReport(deviceMaintainJobReportDo)); + } + + + @GetMapping("/getMaintainReportMainInfo") + @Operation(summary = "保养打印单生成主单") + public CommonResult> getMaintainReportMainInfo(DeviceMaintainJobReportReqVo deviceMaintainJobReportReqVo) { + DeviceMaintainJobReportDo deviceMaintainJobReportDo = new DeviceMaintainJobReportDo(); + deviceMaintainJobReportDo.setId(deviceMaintainJobReportReqVo.getId()); + List resultList = techMaintainJobMainService.getMaintainReportMainInfo(deviceMaintainJobReportDo); + return success(resultList); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintenancejob/TechMaintenanceJobDetailController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintenancejob/TechMaintenanceJobDetailController.java new file mode 100644 index 0000000..b728350 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintenancejob/TechMaintenanceJobDetailController.java @@ -0,0 +1,154 @@ +package com.win.module.eam.controller.techmaintenancejob; + +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.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobDetailConvert; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailDO; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailItemMapper; +import com.win.module.eam.service.techmaintenancejob.TechMaintenanceJobDetailService; +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.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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 维修工单子") +@RestController +@RequestMapping("/eam/tech-maintenance-job-detail") +@Validated +public class TechMaintenanceJobDetailController { + + @Resource + private TechMaintenanceJobDetailService techMaintenanceJobDetailService; + + @Resource + private DeviceMaintenanceJobDetailItemMapper deviceMaintenanceJobDetailItemMapper; + + @PostMapping("/create") + @Operation(summary = "创建维修工单子") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:create')") + public CommonResult createDeviceMaintenanceDetail(@Valid @RequestBody DeviceMaintenanceJobDetailCreateReqVO createReqVO) { + return success(techMaintenanceJobDetailService.createDeviceMaintenanceDetail(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新维修工单子") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:update')") + public CommonResult updateDeviceMaintenanceDetail(@Valid @RequestBody DeviceMaintenanceJobDetailUpdateReqVO updateReqVO) { + int result = techMaintenanceJobDetailService.updateDeviceMaintenanceDetail(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除维修工单子项以及备件关系表") + @Parameter(name = "id", description = "编号", required = true) +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:delete')") + public CommonResult deleteDeviceMaintenanceDetail(@RequestParam("id") Long id) { + int result = techMaintenanceJobDetailService.deleteDeviceMaintenanceDetail(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得维修工单子") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:query')") + public CommonResult getDeviceMaintenanceDetail(@RequestParam("id") Long id) { + DeviceMaintenanceJobDetailDO deviceMaintenanceDetail = techMaintenanceJobDetailService.getDeviceMaintenanceDetail(id); + return success(DeviceMaintenanceJobDetailConvert.INSTANCE.convert(deviceMaintenanceDetail)); + } + + @GetMapping("/list") + @Operation(summary = "获得维修工单子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:query')") + public CommonResult> getDeviceMaintenanceDetailList(@RequestParam("ids") Collection ids) { + List list = techMaintenanceJobDetailService.getDeviceMaintenanceDetailList(ids); + return success(DeviceMaintenanceJobDetailConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "PC端获得维修工单子分页") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:query')") + public CommonResult> getDeviceMaintenanceDetailPage(@Valid DeviceMaintenanceJobDetailPageReqVO pageVO) { + PageResult pageResult = techMaintenanceJobDetailService.getDeviceMaintenanceDetailPage(pageVO); + return success(DeviceMaintenanceJobDetailConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出维修工单子 Excel") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMaintenanceDetailExcel(@Valid DeviceMaintenanceJobDetailExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = techMaintenanceJobDetailService.getDeviceMaintenanceDetailList(exportReqVO); + // 导出 Excel + List datas = DeviceMaintenanceJobDetailConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "维修工单子.xls", "数据", DeviceMaintenanceJobDetailExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入维修工单子模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "维修工单子基本信息导入模板.xls", "维修工单子基本信息列表", DeviceMaintenanceJobDetailExcelVO.class, list); + } + + @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('eam:device-maintenance-job-detail:import')") + 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 list = ExcelUtils.read(file, DeviceMaintenanceJobDetailExcelVO.class); + List errorList = techMaintenanceJobDetailService.importDeviceMaintenanceDetailList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + /** + * APP根据维修工单号查询工单子项信息列表 + * @param + * @return + */ + @GetMapping("/selectListByNumber") + @Operation(summary = "APP获得维修工单子列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail:query')") + public CommonResult> selectListByNumber(@RequestParam("number") String number) { + List list = techMaintenanceJobDetailService.selectListByNumber(number); + return success(DeviceMaintenanceJobDetailConvert.INSTANCE.convertList(list)); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintenancejob/TechMaintenanceJobDetailItemController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintenancejob/TechMaintenanceJobDetailItemController.java new file mode 100644 index 0000000..3097143 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintenancejob/TechMaintenanceJobDetailItemController.java @@ -0,0 +1,148 @@ +package com.win.module.eam.controller.techmaintenancejob; + +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.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobDetailItemConvert; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailItemDO; +import com.win.module.eam.service.techmaintenancejob.TechMaintenanceJobDetailItemService; +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.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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 维修工单子表与备件关系") +@RestController +@RequestMapping("/eam/tech-maintenance-job-detail-item") +@Validated +public class TechMaintenanceJobDetailItemController { + + @Resource + private TechMaintenanceJobDetailItemService techMaintenanceJobDetailItemService; + + @PostMapping("/create") + @Operation(summary = "创建维修工单子表与备件关系") +// @PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:create')") + public CommonResult createDeviceMaintenanceDetailItem(@Valid @RequestBody DeviceMaintenanceJobDetailItemCreateReqVO createReqVO) { + return success(techMaintenanceJobDetailItemService.createDeviceMaintenanceDetailItem(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新维修工单子表与备件关系") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:update')") + public CommonResult updateDeviceMaintenanceDetailItem(@Valid @RequestBody DeviceMaintenanceJobDetailItemUpdateReqVO updateReqVO) { + int result = techMaintenanceJobDetailItemService.updateDeviceMaintenanceDetailItem(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除维修工单子表与备件关系") + @Parameter(name = "id", description = "编号", required = true) + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:delete')") + public CommonResult deleteDeviceMaintenanceDetailItem(@RequestParam("id") Long id) { + int result = techMaintenanceJobDetailItemService.deleteDeviceMaintenanceDetailItem(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得维修工单子表与备件关系") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:query')") + public CommonResult getDeviceMaintenanceDetailItem(@RequestParam("id") Long id) { + DeviceMaintenanceJobDetailItemDO deviceMaintenanceDetailItem = techMaintenanceJobDetailItemService.getDeviceMaintenanceDetailItem(id); + return success(DeviceMaintenanceJobDetailItemConvert.INSTANCE.convert(deviceMaintenanceDetailItem)); + } + + @GetMapping("/list") + @Operation(summary = "获得维修工单子表与备件关系列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:query')") + public CommonResult> getDeviceMaintenanceDetailItemList(@RequestParam("ids") Collection ids) { + List list = techMaintenanceJobDetailItemService.getDeviceMaintenanceDetailItemList(ids); + return success(DeviceMaintenanceJobDetailItemConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得维修工单子表与备件关系分页") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:query')") + public CommonResult> getDeviceMaintenanceDetailItemPage(@Valid DeviceMaintenanceJobDetailItemPageReqVO pageVO) { + PageResult pageResult = techMaintenanceJobDetailItemService.getDeviceMaintenanceDetailItemPage(pageVO); + return success(DeviceMaintenanceJobDetailItemConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出维修工单子表与备件关系 Excel") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-job-detail-item:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMaintenanceDetailItemExcel(@Valid DeviceMaintenanceJobDetailItemExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = techMaintenanceJobDetailItemService.getDeviceMaintenanceDetailItemList(exportReqVO); + // 导出 Excel + List datas = DeviceMaintenanceJobDetailItemConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "维修工单子表与备件关系.xls", "数据", DeviceMaintenanceJobDetailItemExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入维修工单子表与备件关系模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "维修工单子表与备件关系基本信息导入模板.xls", "维修工单子表与备件关系基本信息列表", DeviceMaintenanceJobDetailItemExcelVO.class, list); + } + + @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('eam:device-maintenance-job-detail-item:import')") + 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 list = ExcelUtils.read(file, DeviceMaintenanceJobDetailItemExcelVO.class); + List errorList = techMaintenanceJobDetailItemService.importDeviceMaintenanceDetailItemList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + /** + * 根据维修子项id获取备件列表 + * @param + * @return + */ + @GetMapping("/selectListById") + @Operation(summary = "根据维修子项id获取备件列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:device-maintenance-detail:query')") + public CommonResult>> selectListByNumber(@RequestParam("maintenanceDetailId") Long maintenanceDetailId) { + List> list = techMaintenanceJobDetailItemService.selectListById(maintenanceDetailId); + return success(list); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintenancejob/TechMaintenanceJobMainController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintenancejob/TechMaintenanceJobMainController.java new file mode 100644 index 0000000..bce3d73 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techmaintenancejob/TechMaintenanceJobMainController.java @@ -0,0 +1,296 @@ +package com.win.module.eam.controller.techmaintenancejob; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.datapermission.core.rule.dept.DeptDataPermissionRule; +import com.win.framework.excel.core.util.ExcelUtils; +import com.win.framework.operatelog.core.annotations.OperateLog; +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobMainConvert; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.eam.service.techmaintenancejob.TechMaintenanceJobMainService; +import com.win.module.eam.util.SoapUtil; +import com.win.module.system.api.user.AdminUserApi; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + + +@Tag(name = "管理后台 - 维修工单主") +@RestController +@RequestMapping("/eam/tech-maintenance-job-main") +@Validated +public class TechMaintenanceJobMainController { + + @Resource + private TechMaintenanceJobMainService techMaintenanceJobMainService; + + @Resource + private AdminUserApi userApi; + + @Resource + private DeptDataPermissionRule deptDataPermissionRule; + + @PostMapping("/create") + @Operation(summary = "APP创建维修工单主") + @PreAuthorize("@ss.hasPermission('eam:tech-maintenance-job-main:create') or @ss.hasPermission('eam:tech-maintenance-job-main:createAPP') ") + public CommonResult createDeviceMaintenanceMain(@Valid @RequestBody DeviceMaintenanceJobMainCreateReqVO createReqVO) { + createReqVO.setMaintenance(getLoginUserId()); + createReqVO.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + return success(techMaintenanceJobMainService.createDeviceMaintenanceMain(createReqVO)); + } + + @PostMapping("/createPC") + @Operation(summary = "PC创建维修工单主") + @PreAuthorize("@ss.hasPermission('eam:tech-maintenance-job-main:create')") + public CommonResult createDeviceMaintenanceMainPC(@Valid @RequestBody DeviceMaintenanceJobMainCreateReqVO createReqVO) { + //不走申请直接创建工单更改当前人为接单人 状态为接单状态 + createReqVO.setMaintenance(getLoginUserId()); + createReqVO.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + return success(techMaintenanceJobMainService.createDeviceMaintenanceMainPC(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新维修工单主") + @PreAuthorize("@ss.hasPermission('eam:tech-maintenance-job-main:update') or @ss.hasPermission('eam:tech-maintenance-job-main:updateAPP')") + public CommonResult updateDeviceMaintenanceMain(@Valid @RequestBody DeviceMaintenanceJobMainUpdateReqVO updateReqVO) { + int result = techMaintenanceJobMainService.updateDeviceMaintenanceMain(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除维修工单主") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:tech-maintenance-job-main:delete') or @ss.hasPermission('eam:tech-maintenance-job-main:deleteAPP')") + public CommonResult deleteDeviceMaintenanceMain(@RequestParam("id") Long id) { + int result = techMaintenanceJobMainService.deleteDeviceMaintenanceMain(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得维修工单主") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:tech-maintenance-job-main:query')") + public CommonResult getDeviceMaintenanceMain(@RequestParam("id") Long id) { + DeviceMaintenanceJobMainDO deviceMaintenanceMain = techMaintenanceJobMainService.getDeviceMaintenanceMain(id); + return success(DeviceMaintenanceJobMainConvert.INSTANCE.convert(deviceMaintenanceMain)); + } + + @GetMapping("/list") + @Operation(summary = "获得维修工单主列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:tech-maintenance-job-main:query')") + public CommonResult> getDeviceMaintenanceMainList(@RequestParam("ids") Collection ids) { + List list = techMaintenanceJobMainService.getDeviceMaintenanceMainList(ids); + return success(DeviceMaintenanceJobMainConvert.INSTANCE.convertList(list)); + } + @GetMapping("/page") + @Operation(summary = "获得维修工单主分页") + //@PreAuthorize("@ss.hasPermission('eam:tech-maintenance-job-main:query')") + public CommonResult> getDeviceMaintenanceMainPage(@Valid DeviceMaintenanceJobMainPageReqVO pageVO) { + PageResult pageResult = techMaintenanceJobMainService.getDeviceMaintenanceMainPage(pageVO); + return success(DeviceMaintenanceJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + @PostMapping("/senior") + @Operation(summary = "获得维修工单主分页") + @PreAuthorize("@ss.hasPermission('eam:tech-maintenance-job-main:query')") + public CommonResult> getDeviceMaintenanceMainSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = techMaintenanceJobMainService.getDeviceMaintenanceMainSenior(conditions); + PageResult result = DeviceMaintenanceJobMainConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出维修工单主 Excel") + @PreAuthorize("@ss.hasPermission('eam:tech-maintenance-job-main:export')") + @OperateLog(type = EXPORT) + public void exportDeviceMaintenanceMainExcel(@Valid DeviceMaintenanceJobMainExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = techMaintenanceJobMainService.getDeviceMaintenanceMainList(exportReqVO); + // 导出 Excel + List datas = DeviceMaintenanceJobMainConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "维修工单主.xls", "数据", DeviceMaintenanceJobMainExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入维修工单主模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "维修工单主基本信息导入模板.xls", "维修工单主基本信息列表", DeviceMaintenanceJobMainExcelVO.class, list); + } + + @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('eam:tech-maintenance-job-main:import')") + 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 list = ExcelUtils.read(file, DeviceMaintenanceJobMainExcelVO.class); + List errorList = techMaintenanceJobMainService.importDeviceMaintenanceMainList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + return success(returnMap); + } + @GetMapping("/getAppPage") + @Operation(summary = "获得APP维修工单分页") + public CommonResult> getAppPage(@Valid DeviceMaintenanceJobMainPageReqVO pageVO) { + PageResult pageResult = techMaintenanceJobMainService.getAppPage(pageVO); + return success(DeviceMaintenanceJobMainConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/getAppByNumber") + @Operation(summary = "获得APP维修工单详情根据number") + public CommonResult getAppByNumber(@RequestParam("number") String number) { + DeviceMaintenanceJobMainDO en = techMaintenanceJobMainService.getAppByNumber(number); + return success(DeviceMaintenanceJobMainConvert.INSTANCE.convert(en)); + } + + @GetMapping("/turnTo") + @Operation(summary = "APP维修工单转办") + @Parameters({ + @Parameter(name = "deviceNumber", description = "转办设备或模具编码", required = true), + @Parameter(name = "id", description = "id", required = true), + @Parameter(name = "receiverType", description = "转办后类型", required = true), + @Parameter(name = "receiverUserId", description = "接收人id暂无用", required = false), + @Parameter(name = "status", description = "1人员转办0或者不填是设备转办", required = true), + }) + @PreAuthorize("@ss.hasPermission('eam:tech-maintenance-job-main:turnTo') or @ss.hasPermission('eam:tech-maintenance-job-main:turnToAPP') ") + public CommonResult turnTo(@RequestParam("deviceNumber") String deviceNumber,@RequestParam("id") Long id,@RequestParam("receiverType") String receiverType, Long receiverUserId,String status) { + return success(techMaintenanceJobMainService.turnTo(deviceNumber,id,receiverType,receiverUserId,status)); + } + + @GetMapping("/orderClick") + @Operation(summary = "APP维修工单接单") + @Parameters({ + @Parameter(name = "number", description = "工单编号", required = true), + @Parameter(name = "status", description = "列表状态", required = true), + @Parameter(name = "id", description = "主键id", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = false) + }) + @PreAuthorize("@ss.hasPermission('eam:tech-maintenance-job-main:orderClick') or @ss.hasPermission('eam:tech-maintenance-job-main:orderClickAPP')") + public CommonResult orderClick(@RequestParam("id") Long id) { + return success(techMaintenanceJobMainService.orderClick(id)); + } + + @GetMapping("/orderClickFinish") + @Operation(summary = "APP维修工单点击完成") + @Parameters({ + @Parameter(name = "number", description = "工单编号", required = true), + @Parameter(name = "status", description = "列表状态", required = true), + @Parameter(name = "id", description = "主键id", required = true), + @Parameter(name = "result", description = "点击完成带着COMPLETED", required = true), + @Parameter(name = "result", description = "申请带着申请人驳回 申请人通过", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = false) + }) + @PreAuthorize("@ss.hasPermission('eam:tech-maintenance-job-main:orderClickFinish') or @ss.hasPermission('eam:tech-maintenance-job-main:orderClickFinishAPP')") + public CommonResult orderClickFinish(@RequestParam("id") Long id,String result) { + return success(techMaintenanceJobMainService.orderClickFinish(id,result)); + } + + + @GetMapping("/orderClickConfirm") + @Operation(summary = "APP维修工单申请人确认") + @Parameters({ + @Parameter(name = "number", description = "工单编号", required = true), + @Parameter(name = "status", description = "列表状态", required = true), + @Parameter(name = "id", description = "主键id", required = true), + @Parameter(name = "result", description = "点击完成带着COMPLETED", required = true), + @Parameter(name = "result", description = "申请带着申请人驳回 申请人通过", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = false) + }) + @PreAuthorize("@ss.hasPermission('eam:tech-maintenance-job-main:orderClickConfirm') or @ss.hasPermission('eam:tech-maintenance-job-main:orderClickConfirmAPP')") + public CommonResult orderClickConfirm(@RequestParam("id") Long id,String result,String content) { + return success(techMaintenanceJobMainService.orderClickConfirm(id,result,content)); + } + + @GetMapping("/orderClickVerify") + @Operation(summary = "APP维修工单验证") + @Parameters({ + @Parameter(name = "number", description = "工单编号", required = true), + @Parameter(name = "status", description = "列表状态", required = true), + @Parameter(name = "id", description = "主键id", required = true), + @Parameter(name = "result", description = "点击完成带着COMPLETED", required = true), + @Parameter(name = "result", description = "申请带着申请人驳回 申请人通过", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = false) + }) + @PreAuthorize("@ss.hasPermission('eam:tech-maintenance-job-main:orderClickVerify') or @ss.hasPermission('eam:tech-maintenance-job-main:orderClickVerifyAPP')") + public CommonResult orderClickVerify(String status,@RequestParam("id") Long id,String content) { + return success(techMaintenanceJobMainService.orderClickVerify(id,status,content)); + } + + @GetMapping("/getDictList") + @Operation(summary = "APP获取字典") + @Parameters({ + @Parameter(name = "number", description = "设备或模具编码", required = true), + @Parameter(name = "type", description = "DEVICE设备 MOLD模具", required = true), + @Parameter(name = "id", description = "主键id", required = true), + @Parameter(name = "requestNumber", description = "申请单号没有传空字符", required = true) + }) + public CommonResult>> getDictList(@RequestParam("type") String type) { + return success(techMaintenanceJobMainService.getDictList(type)); + } + + @GetMapping("/getList") + @Operation(summary = "APP获取采取临时措施的维修工单") + @Parameter(name = "type", description = "DEVICE MOLD", required = true) + public CommonResult>> getList(@RequestParam("type") String type) { + return success(techMaintenanceJobMainService.getList(type)); + } + + @PostMapping("/TestSend") + @Operation(summary = "消息推送测试") + @Parameter(name = "type", description = "DEVICE MOLD", required = true) + public CommonResult>> send(@RequestBody Map map) { + SoapUtil soapUtil = new SoapUtil(); + String title = map.get("title").toString(); + String content = map.get("content").toString(); + String type = map.get("type").toString(); + String status = map.get("status").toString(); + String number = map.get("number").toString(); + String cid = map.get("cid").toString(); + Map map1 = new HashMap<>(); + map1.put("type",type); + map1.put("status",status); + map1.put("number",number); + map1.put("cid",cid); + //soapUtil.uniappSend(List.of(cid),title,content,map1); + return success(null); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techrepairrequest/TechRepairRequestController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techrepairrequest/TechRepairRequestController.java new file mode 100644 index 0000000..719c9ab --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/techrepairrequest/TechRepairRequestController.java @@ -0,0 +1,195 @@ +package com.win.module.eam.controller.techrepairrequest; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.devicerepairrequest.vo.*; +import com.win.module.eam.convert.devicerepairrequest.DeviceRepairRequestConvert; +import com.win.module.eam.dal.dataobject.devicerepairrequest.DeviceRepairRequestDO; +import com.win.module.eam.service.techrepairrequest.TechRepairRequestService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 报修申请设备模具") +@RestController +@RequestMapping("/eam/tech-repair-request") +@Validated +public class TechRepairRequestController { + + @Resource + private TechRepairRequestService techRepairRequestService; + + + @PostMapping("/create") + @Operation(summary = "创建报修申请") + @PreAuthorize("@ss.hasPermission('eam:tech-repair-request:create') or @ss.hasPermission('eam:tech-repair-request:createAPP')") + public CommonResult createDeviceRepair(@Valid @RequestBody DeviceRepairRequestRequestCreateReqVO createReqVO) { + return success(techRepairRequestService.createDeviceRepair(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新报修申请") + @PreAuthorize("@ss.hasPermission('eam:tech-repair-request:update') or @ss.hasPermission('eam:tech-repair-request:updateAPP')") + public CommonResult updateDeviceRepair(@Valid @RequestBody DeviceRepairRequestRequestUpdateReqVO updateReqVO) { + int result = techRepairRequestService.updateDeviceRepair(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除报修申请") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:tech-repair-request:delete') or @ss.hasPermission('eam:tech-repair-request:deleteAPP')") + public CommonResult deleteDeviceRepair(@RequestParam("id") Long id) { + int result = techRepairRequestService.deleteDeviceRepair(id); + return success(result > 0); + } + + @DeleteMapping("/cancel") + @Operation(summary = "APP撤销申请") + @Parameter(name = "id", description = "主键id", required = true) + @PreAuthorize("@ss.hasPermission('eam:tech-repair-request:cancel') or @ss.hasPermission('eam:tech-repair-request:cancelAPP')") + public CommonResult rejected(@RequestParam("id") Long id) { + int result = techRepairRequestService.rejectedDeviceRepair(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得报修申请") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:tech-repair-request:query')") + public CommonResult getDeviceRepair(@RequestParam("id") Long id) { + DeviceRepairRequestDO deviceRepair = techRepairRequestService.getDeviceRepair(id); + return success(DeviceRepairRequestConvert.INSTANCE.convert(deviceRepair)); + } + + @GetMapping("/list") + @Operation(summary = "获得报修申请列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:tech-repair-request:query')") + public CommonResult> getDeviceRepairList(@RequestParam("ids") Collection ids) { + List list = techRepairRequestService.getDeviceRepairList(ids); + return success(DeviceRepairRequestConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得报修申请分页") + //@PreAuthorize("@ss.hasPermission('eam:tech-repair-request:query')") + public CommonResult> getDeviceRepairPage(@Valid DeviceRepairRequestPageReqVO pageVO) { + PageResult pageResult = techRepairRequestService.getDeviceRepairPage(pageVO); + return success(DeviceRepairRequestConvert.INSTANCE.convertPage(pageResult)); + } + + + @PostMapping("/senior") + @Operation(summary = "获得报修申请分页") + //@PreAuthorize("@ss.hasPermission('eam:tech-repair-request:query')") + public CommonResult> getDeviceRepairSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = techRepairRequestService.getDeviceRepairSenior(conditions); + PageResult result = DeviceRepairRequestConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + + @GetMapping("/export-excel") + @Operation(summary = "导出报修申请 Excel") + //@PreAuthorize("@ss.hasPermission('eam:tech-repair-request:export')") + @OperateLog(type = EXPORT) + public void exportDeviceRepairExcel(@Valid DeviceRepairRequestExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = techRepairRequestService.getDeviceRepairList(exportReqVO); + // 导出 Excel + List datas = DeviceRepairRequestConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "报修申请.xls", "数据", DeviceRepairRequestExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入报修申请模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "报修申请基本信息导入模板.xls", "报修申请基本信息列表", DeviceRepairRequestExcelVO.class, list); + } + + @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('eam:tech-repair-request:import')") + 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 list = ExcelUtils.read(file, DeviceRepairRequestExcelVO.class); + List errorList = techRepairRequestService.importDeviceRepairList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } + + @GetMapping("/getAppPage") + @Operation(summary = "获得APP报修申请分页") + @Parameters({ + @Parameter(name = "pageSize", description = "每页几条", required = true), + @Parameter(name = "pageNo", description = "第几页", example = "1"), + @Parameter(name = "type", description = "DEVICE 设备 MOLD模具", example = "true"), + @Parameter(name = "flag", description = "首页进入0从我的进入1", example = "true"), + @Parameter(name = "name", description = "设备名称"), + @Parameter(name = "number", description = "单号"), + }) + public CommonResult> getAppPage(@Valid DeviceRepairRequestPageReqVO pageVO) { + PageResult pageResult = techRepairRequestService.getAppPage(pageVO); + return success(DeviceRepairRequestConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/getDetailsByNumber") + @Operation(summary = "根据报修单号查询报修信息") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:tech-repair-request:query')") + public CommonResult> getDetailsByNumber(@RequestParam("requestNumber") String requestNumber,@RequestParam("type") String type) { + Map detailsByNumber = techRepairRequestService.getDetailsByNumber(requestNumber, type); + return success(detailsByNumber); + } + + + + @GetMapping("/getOrderByNumber") + @Operation(summary = "根据报修单号查询报修信息") + @Parameter(name = "requestNumber", description = "申请编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:tech-repair-request:query')") + public CommonResult getOrderByNumber(@RequestParam("requestNumber") String requestNumber) { + DeviceRepairRequestDO orderInfo = techRepairRequestService.getOrderByNumber(requestNumber); + return success(orderInfo); + } + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/TransactionController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/TransactionController.java new file mode 100644 index 0000000..4e33747 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/TransactionController.java @@ -0,0 +1,118 @@ +package com.win.module.eam.controller.transaction; + +import com.win.framework.common.pojo.CommonResult; +import com.win.framework.common.pojo.CustomConditions; +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.eam.controller.transaction.vo.*; +import com.win.module.eam.convert.transaction.TransactionConvert; +import com.win.module.eam.dal.dataobject.transaction.TransactionDO; +import com.win.module.eam.service.transaction.TransactionService; +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.Arrays; +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("/eam/transaction") +@Validated +public class TransactionController { + + @Resource + private TransactionService Service; + + @PostMapping("/create") + @Operation(summary = "创建库存事务") + @PreAuthorize("@ss.hasPermission('item:transaction:create')") + public CommonResult create(@Valid @RequestBody List createReqVOList) { + return success(Service.create(createReqVOList)); + } + + @PutMapping("/update") + @Operation(summary = "更新库存事务") + @PreAuthorize("@ss.hasPermission('item:transaction:update')") + public CommonResult update(@Valid @RequestBody TransactionUpdateReqVO updateReqVO) { + int result = Service.update(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除库存事务") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('item:transaction:delete')") + public CommonResult delete(@RequestParam("id") Long id) { + int result = Service.delete(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得库存事务") + @Parameter(name = "id", description = "编号", required = true, example = "1024") +// @PreAuthorize("@ss.hasPermission('transaction::query')") + public CommonResult get(@RequestParam("id") Long id) { + TransactionDO transactionDO = Service.get(id); + return success(TransactionConvert.INSTANCE.convert(transactionDO)); + } + + @GetMapping("/list") + @Operation(summary = "获得库存事务列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") +// @PreAuthorize("@ss.hasPermission('transaction::query')") + public CommonResult> getList(@RequestParam("ids") Collection ids) { + List list = Service.getList(ids); + return success(TransactionConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得库存事务分页") +// @PreAuthorize("@ss.hasPermission('transaction::query')") + public CommonResult> getPage(@Valid TransactionPageReqVO pageVO) { + PageResult pageResult = Service.getPage(pageVO); + return success(TransactionConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出库存事务 Excel") + @PreAuthorize("@ss.hasPermission('item:transaction:export')") + @OperateLog(type = EXPORT) + public void exportExcel(@Valid TransactionExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = Service.getList(exportReqVO); + // 导出 Excel + List datas = TransactionConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "库存事务.xls", "数据", TransactionExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入库存事务模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "库存事务基本信息导入模板.xls", "库存事务基本信息列表", TransactionExcelVO.class, list); + } + + @PostMapping("/senior") + @Operation(summary = "高级搜索获得账期日历分页") +// @PreAuthorize("@ss.hasPermission('wms:location:query')") + public CommonResult> getLocationSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = Service.getTransactionSenior(conditions); + PageResult result =TransactionConvert.INSTANCE.convertPage(pageResult); + + return success(result); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionBaseVO.java new file mode 100644 index 0000000..7b3ab91 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionBaseVO.java @@ -0,0 +1,68 @@ +package com.win.module.eam.controller.transaction.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 库存事务 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class TransactionBaseVO { + private Long id; + /** + * 备件编号 + */ + @Schema(description = "备件编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "备件编号不能为空") + private String itemNumber; + /** + * 库位编号 + */ + @Schema(description = "库位编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "库位编号不能为空") + private String locationNumber; + + @Schema(description = "事务类型IN、OUT", example = "2") + private String transactionType; + + @Schema(description = "库存动作枚举采购入库、领用出库、归还入库、维修入库", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "库存动作枚举采购入库、领用出库、归还入库、维修入库不能为空") + private String inventoryAction; + + @Schema(description = "库存状态", example = "1") + private String inventoryStatus; + + @Schema(description = "计量单位从备件中获取", requiredMode = Schema.RequiredMode.REQUIRED) + private String uom; + + @Schema(description = "数量") + private BigDecimal qty; + + @Schema(description = "关联人") + private String operator; + + @Schema(description = "操作人") + private String creator; + + @Schema(description = "关联工单") + private String associatedNumber; + + @Schema(description = "是否账内账外") + @NotNull(message = "是否账内账外不能为空") + private String isInAccount; + + /** + * 库区编号 + */ + @Schema(description = "库区编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "库区编号不能为空") + private String areaNumber; + + @Schema(description = "备注原因") + private String describes; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionCreateReqVO.java new file mode 100644 index 0000000..17baf7e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.transaction.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 TransactionCreateReqVO extends TransactionBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionExcelVO.java new file mode 100644 index 0000000..c9b244b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionExcelVO.java @@ -0,0 +1,40 @@ +package com.win.module.eam.controller.transaction.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 库存事务 Excel VO + * + * @author 超级管理员 + */ +@Data +public class TransactionExcelVO { + + @ExcelProperty("备件编号") + private String itemNumber; + + @ExcelProperty("库位编号") + private String locationNumber; + + @ExcelProperty("事务类型IN、OUT") + private String transactionType; + + @ExcelProperty("库存动作枚举采购入库、领用出库、归还入库、维修入库") + private String inventoryAction; + + @ExcelProperty("业务类型") + private String businessType; + + @ExcelProperty("库存状态") + private String inventoryStatus; + + @ExcelProperty("计量单位从备件中获取") + private String uom; + + @ExcelProperty("数量") + private BigDecimal qty; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionExportReqVO.java new file mode 100644 index 0000000..bf66a66 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionExportReqVO.java @@ -0,0 +1,39 @@ +package com.win.module.eam.controller.transaction.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 库存事务 Excel 导出 Request VO,参数和 TransactionPageReqVO 是一致的") +@Data +public class TransactionExportReqVO { + + @Schema(description = "id", example = "11530") + private Long id; + + @Schema(description = "备件编号") + private String itemNumber; + + @Schema(description = "库位编号") + private String locationNumber; + + @Schema(description = "事务类型IN、OUT", example = "2") + private String transactionType; + + @Schema(description = "库存动作枚举采购入库、领用出库、归还入库、维修入库") + private String inventoryAction; + + @Schema(description = "业务类型", example = "1") + private String businessType; + + @Schema(description = "库存状态", example = "1") + private String inventoryStatus; + + @Schema(description = "计量单位从备件中获取") + private String uom; + + @Schema(description = "数量") + private BigDecimal qty; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionPageReqVO.java new file mode 100644 index 0000000..a848706 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionPageReqVO.java @@ -0,0 +1,45 @@ +package com.win.module.eam.controller.transaction.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 java.math.BigDecimal; + +@Schema(description = "管理后台 - 库存事务分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class TransactionPageReqVO extends PageParam { + + @Schema(description = "id", example = "11530") + private Long id; + + @Schema(description = "备件编号") + private String itemNumber; + + + @Schema(description = "库位编号") + private String locationNumber; + + @Schema(description = "事务类型IN、OUT", example = "2") + private String transactionType; + + @Schema(description = "库存动作枚举采购入库、领用出库、归还入库、维修入库") + private String inventoryAction; + + @Schema(description = "业务类型", example = "1") + private String businessType; + + @Schema(description = "库存状态", example = "1") + private String inventoryStatus; + + @Schema(description = "计量单位从备件中获取") + private String uom; + + @Schema(description = "数量") + private BigDecimal qty; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionRespVO.java new file mode 100644 index 0000000..9d556f9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionRespVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.transaction.vo; + +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 TransactionRespVO extends TransactionBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionUpdateReqVO.java new file mode 100644 index 0000000..1698ac0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/transaction/vo/TransactionUpdateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.transaction.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 TransactionUpdateReqVO extends TransactionBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/UniappPushMessageController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/UniappPushMessageController.java new file mode 100644 index 0000000..aecdee2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/UniappPushMessageController.java @@ -0,0 +1,139 @@ +package com.win.module.eam.controller.uniapppushmessage; + +import com.win.module.eam.controller.uniapppushmessage.vo.*; +import io.swagger.v3.oas.annotations.Parameters; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +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.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.*; +import java.io.IOException; + +import com.win.framework.common.pojo.PageResult; +import com.win.framework.common.pojo.CommonResult; +import static com.win.framework.common.pojo.CommonResult.success; + +import com.win.framework.excel.core.util.ExcelUtils; + +import com.win.framework.operatelog.core.annotations.OperateLog; +import static com.win.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.win.module.eam.dal.dataobject.uniapppushmessage.UniappPushMessageDO; +import com.win.module.eam.convert.uniapppushmessage.UniappPushMessageConvert; +import com.win.module.eam.service.uniapppushmessage.UniappPushMessageService; +import org.springframework.web.multipart.MultipartFile; + +@Tag(name = "管理后台 - uniapp推送记录") +@RestController +@RequestMapping("/eam/uniapp-push-message") +@Validated +public class UniappPushMessageController { + + @Resource + private UniappPushMessageService uniappPushMessageService; + + @PostMapping("/create") + @Operation(summary = "创建uniapp推送记录") + @PreAuthorize("@ss.hasPermission('eam:uniapp-push-message:create')") + public CommonResult createUniappPushMessage(@Valid @RequestBody UniappPushMessageCreateReqVO createReqVO) { + return success(uniappPushMessageService.createUniappPushMessage(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新uniapp推送记录") + @PreAuthorize("@ss.hasPermission('eam:uniapp-push-message:update')") + public CommonResult updateUniappPushMessage(@Valid @RequestBody UniappPushMessageUpdateReqVO updateReqVO) { + int result = uniappPushMessageService.updateUniappPushMessage(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除uniapp推送记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('eam:uniapp-push-message:delete')") + public CommonResult deleteUniappPushMessage(@RequestParam("id") Long id) { + int result = uniappPushMessageService.deleteUniappPushMessage(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得uniapp推送记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('eam:uniapp-push-message:query')") + public CommonResult getUniappPushMessage(@RequestParam("id") Long id) { + UniappPushMessageDO uniappPushMessage = uniappPushMessageService.getUniappPushMessage(id); + return success(UniappPushMessageConvert.INSTANCE.convert(uniappPushMessage)); + } + + @GetMapping("/list") + @Operation(summary = "获得uniapp推送记录列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('eam:uniapp-push-message:query')") + public CommonResult> getUniappPushMessageList(@RequestParam("ids") Collection ids) { + List list = uniappPushMessageService.getUniappPushMessageList(ids); + return success(UniappPushMessageConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得uniapp推送记录分页") + @PreAuthorize("@ss.hasPermission('eam:uniapp-push-message:query')") + public CommonResult> getUniappPushMessagePage(@Valid UniappPushMessagePageReqVO pageVO) { + PageResult pageResult = uniappPushMessageService.getUniappPushMessagePage(pageVO); + return success(UniappPushMessageConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出uniapp推送记录 Excel") + @PreAuthorize("@ss.hasPermission('eam:uniapp-push-message:export')") + @OperateLog(type = EXPORT) + public void exportUniappPushMessageExcel(@Valid UniappPushMessageExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = uniappPushMessageService.getUniappPushMessageList(exportReqVO); + // 导出 Excel + List datas = UniappPushMessageConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "uniapp推送记录.xls", "数据", UniappPushMessageExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入uniapp推送记录模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "uniapp推送记录基本信息导入模板.xls", "uniapp推送记录基本信息列表", UniappPushMessageExcelVO.class, list); + } + + @PostMapping("/import") + @Operation(summary = "导入uniapp推送记录基本信息") + @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('eam:uniapp-push-message:import')") + 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 list = ExcelUtils.read(file, UniappPushMessageExcelVO.class); + List errorList = uniappPushMessageService.importUniappPushMessageList(list, mode, updatePart); + + Map returnMap = new HashMap<>(); + returnMap.put("errorCount", errorList.size()); + if(!errorList.isEmpty()) { + String url = ExcelUtils.writeLocalFile("uniapp推送记录基本信息导入错误数据" + LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageBaseVO.java new file mode 100644 index 0000000..42f6bed --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageBaseVO.java @@ -0,0 +1,68 @@ +package com.win.module.eam.controller.uniapppushmessage.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.*; + +/** + * uniapp推送记录 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class UniappPushMessageBaseVO { + + @Schema(description = "结果码", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "结果码不能为空") + private String resultMsg; + + @Schema(description = "工单号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "工单号不能为空") + private String number; + + @Schema(description = "推送消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "推送消息类型不能为空") + private String type; + + @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "标题不能为空") + private String title; + + @Schema(description = "数据", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "数据不能为空") + private String payload; + + @Schema(description = "内容", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "内容不能为空") + private String content; + + @Schema(description = "地点ID", example = "17963") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁", requiredMode = Schema.RequiredMode.REQUIRED) + //@NotNull(message = "并发乐观锁不能为空") + private Integer concurrencyStamp; + + @Schema(description = "部门id", example = "9776") + private Long deptId; + + @Schema(description = "设备唯一码") + private String cid; + + @Schema(description = "任务id") + private String taskId; + + @Schema(description = "推送消息类型字典") + private String status; + + @Schema(description = "厂区编码") + private String factoryAreaNumber; + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageCreateReqVO.java new file mode 100644 index 0000000..392f77f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.uniapppushmessage.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - uniapp推送记录创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UniappPushMessageCreateReqVO extends UniappPushMessageBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageExcelVO.java new file mode 100644 index 0000000..d843859 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageExcelVO.java @@ -0,0 +1,55 @@ +package com.win.module.eam.controller.uniapppushmessage.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; + +/** + * uniapp推送记录 Excel VO + * + * @author 超级管理员 + */ +@Data +public class UniappPushMessageExcelVO { + + @ExcelProperty("id") + private Long id; + + @ExcelProperty("结果码") + private String resultMsg; + + @ExcelProperty("工单号") + private String number; + + @ExcelProperty("推送消息类型") + private String type; + + @ExcelProperty("标题") + private String title; + + @ExcelProperty("数据") + private String payload; + + @ExcelProperty("内容") + private String content; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @ExcelProperty("地点ID") + private String siteId; + + @ExcelProperty("是否可用") + private String available; + + @ExcelProperty("并发乐观锁") + private Integer concurrencyStamp; + + @ExcelProperty("部门id") + private Long deptId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageExportReqVO.java new file mode 100644 index 0000000..cc2806b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageExportReqVO.java @@ -0,0 +1,50 @@ +package com.win.module.eam.controller.uniapppushmessage.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.win.framework.common.pojo.PageParam; +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 = "管理后台 - uniapp推送记录 Excel 导出 Request VO,参数和 UniappPushMessagePageReqVO 是一致的") +@Data +public class UniappPushMessageExportReqVO { + + @Schema(description = "结果码") + private String resultMsg; + + @Schema(description = "工单号") + private String number; + + @Schema(description = "推送消息类型", example = "2") + private String type; + + @Schema(description = "标题") + private String title; + + @Schema(description = "数据") + private String payload; + + @Schema(description = "内容") + private String content; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "地点ID", example = "17963") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + + @Schema(description = "部门id", example = "9776") + private Long deptId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessagePageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessagePageReqVO.java new file mode 100644 index 0000000..da901bf --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessagePageReqVO.java @@ -0,0 +1,52 @@ +package com.win.module.eam.controller.uniapppushmessage.vo; + +import lombok.*; +import java.util.*; +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 = "管理后台 - uniapp推送记录分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UniappPushMessagePageReqVO extends PageParam { + + @Schema(description = "结果码") + private String resultMsg; + + @Schema(description = "工单号") + private String number; + + @Schema(description = "推送消息类型", example = "2") + private String type; + + @Schema(description = "标题") + private String title; + + @Schema(description = "数据") + private String payload; + + @Schema(description = "内容") + private String content; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "地点ID", example = "17963") + private String siteId; + + @Schema(description = "是否可用") + private String available; + + @Schema(description = "并发乐观锁") + private Integer concurrencyStamp; + + @Schema(description = "部门id", example = "9776") + private Long deptId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageRespVO.java new file mode 100644 index 0000000..bd9130f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageRespVO.java @@ -0,0 +1,29 @@ +package com.win.module.eam.controller.uniapppushmessage.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +@Schema(description = "管理后台 - uniapp推送记录 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UniappPushMessageRespVO extends UniappPushMessageBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "28282") + private Long id; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "发送设备码集合") + private List cids; + + @Schema(description = "发送体") + private Map payloads; + + @Schema(description = "申请人id") + private Long applyer; +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageUpdateReqVO.java new file mode 100644 index 0000000..175c337 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/uniapppushmessage/vo/UniappPushMessageUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.eam.controller.uniapppushmessage.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - uniapp推送记录更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class UniappPushMessageUpdateReqVO extends UniappPushMessageBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "28282") + @NotNull(message = "id不能为空") + private Long id; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/BasciYearEquipmentController.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/BasciYearEquipmentController.java new file mode 100644 index 0000000..3f1f79e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/BasciYearEquipmentController.java @@ -0,0 +1,135 @@ +package com.win.module.eam.controller.yearequipment; + +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.eam.controller.yearequipment.vo.*; +import com.win.module.eam.convert.yearequipment.BasciYearEquipmentConvert; +import com.win.module.eam.dal.dataobject.yearequipment.BasciYearEquipmentDO; +import com.win.module.eam.service.yearequipment.BasciYearEquipmentService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 首页年设备指标") +@RestController +@RequestMapping("/eam/basci-year-equipment") +@Validated +public class BasciYearEquipmentController { + + @Resource + private BasciYearEquipmentService basciYearEquipmentService; + + @PostMapping("/create") + @Operation(summary = "创建首页年设备指标") + @PreAuthorize("@ss.hasPermission('basic:BasciYearEquipment:create')") + public CommonResult createBasciYearEquipment(@Valid @RequestBody BasciYearEquipmentCreateReqVO createReqVO) { + return success(basciYearEquipmentService.createBasciYearEquipment(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新首页年设备指标") + @PreAuthorize("@ss.hasPermission('basic:BasciYearEquipment:update')") + public CommonResult updateBasciYearEquipment(@Valid @RequestBody BasciYearEquipmentUpdateReqVO updateReqVO) { + int result = basciYearEquipmentService.updateBasciYearEquipment(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除首页年设备指标") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('basic:BasciYearEquipment:delete')") + public CommonResult deleteBasciYearEquipment(@RequestParam("id") Long id) { + int result = basciYearEquipmentService.deleteBasciYearEquipment(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得首页年设备指标") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + //@PreAuthorize("@ss.hasPermission('eam:basci-year-equipment:query')") + public CommonResult getBasciYearEquipment(@RequestParam("id") Long id) { + BasciYearEquipmentDO basciYearEquipment = basciYearEquipmentService.getBasciYearEquipment(id); + return success(BasciYearEquipmentConvert.INSTANCE.convert(basciYearEquipment)); + } + + @GetMapping("/list") + @Operation(summary = "获得首页年设备指标列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + //@PreAuthorize("@ss.hasPermission('eam:basci-year-equipment:query')") + public CommonResult> getBasciYearEquipmentList(@RequestParam("ids") Collection ids) { + List list = basciYearEquipmentService.getBasciYearEquipmentList(ids); + return success(BasciYearEquipmentConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得首页年设备指标分页") +// @PreAuthorize("@ss.hasPermission('eam:basci-year-equipment:query')") + public CommonResult> getBasciYearEquipmentPage(@Valid BasciYearEquipmentPageReqVO pageVO) { + PageResult pageResult = basciYearEquipmentService.getBasciYearEquipmentPage(pageVO); + return success(BasciYearEquipmentConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出首页年设备指标 Excel") + @PreAuthorize("@ss.hasPermission('basic:BasciYearEquipment:export')") + @OperateLog(type = EXPORT) + public void exportBasciYearEquipmentExcel(@Valid BasciYearEquipmentExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = basciYearEquipmentService.getBasciYearEquipmentList(exportReqVO); + // 导出 Excel + List datas = BasciYearEquipmentConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "首页年设备指标.xls", "数据", BasciYearEquipmentExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入首页年设备指标模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "首页年设备指标基本信息导入模板.xls", "首页年设备指标基本信息列表", BasciYearEquipmentExcelVO.class, list); + } + + @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('basic:BasciYearEquipment:import')") + 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 list = ExcelUtils.read(file, BasciYearEquipmentExcelVO.class); + List errorList = basciYearEquipmentService.importBasciYearEquipmentList(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")) + ".xlsx", "错误列表", errorList); + returnMap.put("errorFile", url); + } + + return success(returnMap); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentBaseVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentBaseVO.java new file mode 100644 index 0000000..87f9168 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentBaseVO.java @@ -0,0 +1,48 @@ +package com.win.module.eam.controller.yearequipment.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import javax.validation.constraints.*; + +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; + +/** + * 首页年设备指标 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class BasciYearEquipmentBaseVO { + + @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") + //@NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "类型枚举字典", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "类型枚举字典不能为空") + private String type; + + @Schema(description = "厂区枚举字典", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "厂区枚举字典不能为空") + private String factoryType; + + @Schema(description = "年指标", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "年指标不能为空") + //@JsonFormat(pattern = "yyyy", timezone = TIME_ZONE_DEFAULT) + private String yearIndex; + + @Schema(description = "目标", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "目标不能为空") + private String goal; + + @Schema(description = "实际") + private String actual; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentCreateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentCreateReqVO.java new file mode 100644 index 0000000..845e055 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentCreateReqVO.java @@ -0,0 +1,14 @@ +package com.win.module.eam.controller.yearequipment.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 首页年设备指标创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BasciYearEquipmentCreateReqVO extends BasciYearEquipmentBaseVO { + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentExcelVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentExcelVO.java new file mode 100644 index 0000000..104d930 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentExcelVO.java @@ -0,0 +1,45 @@ +package com.win.module.eam.controller.yearequipment.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDate; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; + +import com.alibaba.excel.annotation.ExcelProperty; + +/** + * 首页年设备指标 Excel VO + * + * @author 超级管理员 + */ +@Data +public class BasciYearEquipmentExcelVO { + + @ExcelProperty("id") + private Long id; + + @ExcelProperty("名称") + private String name; + + @ExcelProperty("类型枚举字典") + private String type; + + @ExcelProperty("厂区枚举字典") + private String factoryType; + + @ExcelProperty("年指标") + private LocalDate yearIndex; + + @ExcelProperty("目标") + private String goal; + + @ExcelProperty("实现") + private String realizes; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentExportReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentExportReqVO.java new file mode 100644 index 0000000..1b89321 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentExportReqVO.java @@ -0,0 +1,15 @@ +package com.win.module.eam.controller.yearequipment.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,参数和 BasciYearEquipmentPageReqVO 是一致的") +@Data +public class BasciYearEquipmentExportReqVO { + + @Schema(description = "厂区枚举字典", example = "1") + private String factoryType; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentPageReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentPageReqVO.java new file mode 100644 index 0000000..4f837ba --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentPageReqVO.java @@ -0,0 +1,17 @@ +package com.win.module.eam.controller.yearequipment.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 BasciYearEquipmentPageReqVO extends PageParam { + + @Schema(description = "厂区枚举字典", example = "1") + private String factoryType; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentRespVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentRespVO.java new file mode 100644 index 0000000..0778f68 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentRespVO.java @@ -0,0 +1,19 @@ +package com.win.module.eam.controller.yearequipment.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 BasciYearEquipmentRespVO extends BasciYearEquipmentBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32693") + private Long id; + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentUpdateReqVO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentUpdateReqVO.java new file mode 100644 index 0000000..4608731 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/controller/yearequipment/vo/BasciYearEquipmentUpdateReqVO.java @@ -0,0 +1,18 @@ +package com.win.module.eam.controller.yearequipment.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; + +@Schema(description = "管理后台 - 首页年设备指标更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class BasciYearEquipmentUpdateReqVO extends BasciYearEquipmentBaseVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32693") + @NotNull(message = "id不能为空") + private Long id; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/adjustRecord/AdjustRecordDetailConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/adjustRecord/AdjustRecordDetailConvert.java new file mode 100644 index 0000000..69175e4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/adjustRecord/AdjustRecordDetailConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.adjustRecord; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordDetailCreateReqVO; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordDetailExcelVO; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordDetailRespVO; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordDetailUpdateReqVO; +import com.win.module.eam.dal.dataobject.adjustRecord.AdjustRecordDetailDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 备件盘点调整记录子 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface AdjustRecordDetailConvert { + + AdjustRecordDetailConvert INSTANCE = Mappers.getMapper(AdjustRecordDetailConvert.class); + + AdjustRecordDetailDO convert(AdjustRecordDetailCreateReqVO bean); + + AdjustRecordDetailDO convert(AdjustRecordDetailUpdateReqVO bean); + + AdjustRecordDetailRespVO convert(AdjustRecordDetailDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/adjustRecord/AdjustRecordMainConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/adjustRecord/AdjustRecordMainConvert.java new file mode 100644 index 0000000..08c5905 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/adjustRecord/AdjustRecordMainConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.adjustRecord; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordMainCreateReqVO; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordMainExcelVO; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordMainRespVO; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordMainUpdateReqVO; +import com.win.module.eam.dal.dataobject.adjustRecord.AdjustRecordMainDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 备件盘点调整记录主 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface AdjustRecordMainConvert { + + AdjustRecordMainConvert INSTANCE = Mappers.getMapper(AdjustRecordMainConvert.class); + + AdjustRecordMainDO convert(AdjustRecordMainCreateReqVO bean); + + AdjustRecordMainDO convert(AdjustRecordMainUpdateReqVO bean); + + AdjustRecordMainRespVO convert(AdjustRecordMainDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/attachmentfile/AttachmentFileConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/attachmentfile/AttachmentFileConvert.java new file mode 100644 index 0000000..3ed19bd --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/attachmentfile/AttachmentFileConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.attachmentfile; + + +import com.win.module.eam.controller.attachmentfile.vo.AttachmentFileCreateReqVO; +import com.win.module.eam.controller.attachmentfile.vo.AttachmentFileExcelVO; +import com.win.module.eam.controller.attachmentfile.vo.AttachmentFileRespVO; +import com.win.module.eam.controller.attachmentfile.vo.AttachmentFileUpdateReqVO; +import com.win.module.eam.dal.dataobject.attachmentfile.AttachmentFileDO; +import org.mapstruct.factory.Mappers; +import org.mapstruct.Mapper; +import com.win.framework.common.pojo.PageResult; + +import java.util.List; + +/** + * 设备模具附件文件 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface AttachmentFileConvert { + + AttachmentFileConvert INSTANCE = Mappers.getMapper(AttachmentFileConvert.class); + + AttachmentFileDO convert(AttachmentFileCreateReqVO bean); + + AttachmentFileDO convert(AttachmentFileUpdateReqVO bean); + + AttachmentFileRespVO convert(AttachmentFileDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/board/BoardConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/board/BoardConvert.java new file mode 100644 index 0000000..bd560bc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/board/BoardConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.board; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobMainCreateReqVO; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobMainExcelVO; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobMainRespVO; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobMainUpdateReqVO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 维修工单主 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface BoardConvert { + + BoardConvert INSTANCE = Mappers.getMapper(BoardConvert.class); + + DeviceMaintenanceJobMainDO convert(DeviceMaintenanceJobMainCreateReqVO bean); + + DeviceMaintenanceJobMainDO convert(DeviceMaintenanceJobMainUpdateReqVO bean); + + DeviceMaintenanceJobMainRespVO convert(DeviceMaintenanceJobMainDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/classtype/ClassTypeConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/classtype/ClassTypeConvert.java new file mode 100644 index 0000000..1bc88dc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/classtype/ClassTypeConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.classtype; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.classtype.vo.ClassTypeCreateReqVO; +import com.win.module.eam.controller.classtype.vo.ClassTypeExcelVO; +import com.win.module.eam.controller.classtype.vo.ClassTypeRespVO; +import com.win.module.eam.controller.classtype.vo.ClassTypeUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.win.module.eam.dal.dataobject.classtype.ClassTypeDO; + +/** + * 厂区班组角色数据维护 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface ClassTypeConvert { + + ClassTypeConvert INSTANCE = Mappers.getMapper(ClassTypeConvert.class); + + ClassTypeDO convert(ClassTypeCreateReqVO bean); + + ClassTypeDO convert(ClassTypeUpdateReqVO bean); + + ClassTypeRespVO convert(ClassTypeDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countJobDetail/CountJobDetailConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countJobDetail/CountJobDetailConvert.java new file mode 100644 index 0000000..b07fd39 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countJobDetail/CountJobDetailConvert.java @@ -0,0 +1,38 @@ +package com.win.module.eam.convert.countJobDetail; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.countJob.vo.CountJobDetailCreateReqVO; +import com.win.module.eam.controller.countJob.vo.CountJobDetailExcelVO; +import com.win.module.eam.controller.countJob.vo.CountJobDetailRespVO; +import com.win.module.eam.controller.countJob.vo.CountJobDetailUpdateReqVO; +import com.win.module.eam.dal.dataobject.countJobDetail.CountJobDetailDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 备件盘点任务子 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface CountJobDetailConvert { + + CountJobDetailConvert INSTANCE = Mappers.getMapper(CountJobDetailConvert.class); + + CountJobDetailDO convert(CountJobDetailCreateReqVO bean); + + CountJobDetailDO convert(CountJobDetailUpdateReqVO bean); + + CountJobDetailDO convert(CountJobDetailExcelVO bean); + + CountJobDetailRespVO convert(CountJobDetailDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countJobMain/CountJobMainConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countJobMain/CountJobMainConvert.java new file mode 100644 index 0000000..f5835c9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countJobMain/CountJobMainConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.countJobMain; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.countJob.vo.CountJobMainCreateReqVO; +import com.win.module.eam.controller.countJob.vo.CountJobMainExcelVO; +import com.win.module.eam.controller.countJob.vo.CountJobMainRespVO; +import com.win.module.eam.controller.countJob.vo.CountJobMainUpdateReqVO; +import com.win.module.eam.dal.dataobject.countJobMain.CountJobMainDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 备件盘点任务主 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface CountJobMainConvert { + + CountJobMainConvert INSTANCE = Mappers.getMapper(CountJobMainConvert.class); + + CountJobMainDO convert(CountJobMainCreateReqVO bean); + + CountJobMainDO convert(CountJobMainUpdateReqVO bean); + + CountJobMainRespVO convert(CountJobMainDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countRecord/CountRecordDetailConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countRecord/CountRecordDetailConvert.java new file mode 100644 index 0000000..65f4962 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countRecord/CountRecordDetailConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.countRecord; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.countRecord.vo.CountRecordDetailCreateReqVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordDetailExcelVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordDetailRespVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordDetailUpdateReqVO; +import com.win.module.eam.dal.dataobject.countRecord.CountRecordDetailDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 备件盘点记录子 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface CountRecordDetailConvert { + + CountRecordDetailConvert INSTANCE = Mappers.getMapper(CountRecordDetailConvert.class); + + CountRecordDetailDO convert(CountRecordDetailCreateReqVO bean); + + CountRecordDetailDO convert(CountRecordDetailUpdateReqVO bean); + + CountRecordDetailRespVO convert(CountRecordDetailDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countRecord/CountRecordMainConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countRecord/CountRecordMainConvert.java new file mode 100644 index 0000000..53d8448 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countRecord/CountRecordMainConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.countRecord; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.countRecord.vo.CountRecordMainCreateReqVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordMainExcelVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordMainRespVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordMainUpdateReqVO; +import com.win.module.eam.dal.dataobject.countRecord.CountRecordMainDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 备件盘点记录主 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface CountRecordMainConvert { + + CountRecordMainConvert INSTANCE = Mappers.getMapper(CountRecordMainConvert.class); + + CountRecordMainDO convert(CountRecordMainCreateReqVO bean); + + CountRecordMainDO convert(CountRecordMainUpdateReqVO bean); + + CountRecordMainRespVO convert(CountRecordMainDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countadjustPlan/CountadjustPlanConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countadjustPlan/CountadjustPlanConvert.java new file mode 100644 index 0000000..c4ed883 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/countadjustPlan/CountadjustPlanConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.countadjustPlan; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.countadjustPlan.vo.CountadjustPlanCreateReqVO; +import com.win.module.eam.controller.countadjustPlan.vo.CountadjustPlanExcelVO; +import com.win.module.eam.controller.countadjustPlan.vo.CountadjustPlanRespVO; +import com.win.module.eam.controller.countadjustPlan.vo.CountadjustPlanUpdateReqVO; +import com.win.module.eam.dal.dataobject.countadjustPlan.CountadjustPlanDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 备件盘点计划 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface CountadjustPlanConvert { + + CountadjustPlanConvert INSTANCE = Mappers.getMapper(CountadjustPlanConvert.class); + + CountadjustPlanDO convert(CountadjustPlanCreateReqVO bean); + + CountadjustPlanDO convert(CountadjustPlanUpdateReqVO bean); + + CountadjustPlanRespVO convert(CountadjustPlanDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceaccounts/DeviceAccountsConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceaccounts/DeviceAccountsConvert.java new file mode 100644 index 0000000..3ad0d11 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceaccounts/DeviceAccountsConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.deviceaccounts; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceaccounts.vo.DeviceAccountsCreateReqVO; +import com.win.module.eam.controller.deviceaccounts.vo.DeviceAccountsExcelVO; +import com.win.module.eam.controller.deviceaccounts.vo.DeviceAccountsRespVO; +import com.win.module.eam.controller.deviceaccounts.vo.DeviceAccountsUpdateReqVO; +import com.win.module.eam.dal.dataobject.deviceaccounts.DeviceAccountsDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 备件台账 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceAccountsConvert { + + DeviceAccountsConvert INSTANCE = Mappers.getMapper(DeviceAccountsConvert.class); + + DeviceAccountsDO convert(DeviceAccountsCreateReqVO bean); + + DeviceAccountsDO convert(DeviceAccountsUpdateReqVO bean); + + DeviceAccountsRespVO convert(DeviceAccountsDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + DeviceAccountsUpdateReqVO convertBack(DeviceAccountsDO bean); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceinspectionjob/DeviceInspectionJobDetailConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceinspectionjob/DeviceInspectionJobDetailConvert.java new file mode 100644 index 0000000..967d427 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceinspectionjob/DeviceInspectionJobDetailConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.deviceinspectionjob; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.controller.deviceinspectionjob.vo.DeviceInspectionJobDetailRespVO; +import com.win.module.eam.controller.deviceinspectionjob.vo.DeviceInspectionJobDetailUpdateReqVO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 检修工单子 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceInspectionJobDetailConvert { + + DeviceInspectionJobDetailConvert INSTANCE = Mappers.getMapper(DeviceInspectionJobDetailConvert.class); + + DeviceInspectionJobDetailDO convert(DeviceInspectionJobDetailCreateReqVO bean); + + DeviceInspectionJobDetailDO convert(DeviceInspectionJobDetailUpdateReqVO bean); + + DeviceInspectionJobDetailRespVO convert(DeviceInspectionJobDetailDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + List convertList03(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceinspectionjob/DeviceInspectionJobDetailItemConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceinspectionjob/DeviceInspectionJobDetailItemConvert.java new file mode 100644 index 0000000..8180337 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceinspectionjob/DeviceInspectionJobDetailItemConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.deviceinspectionjob; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.controller.deviceinspectionjob.vo.DeviceInspectionJobDetailItemCreateReqVO; +import com.win.module.eam.controller.deviceinspectionjob.vo.DeviceInspectionJobDetailItemUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailItemDO; + +/** + * 检修工单子表与备件关系 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceInspectionJobDetailItemConvert { + + DeviceInspectionJobDetailItemConvert INSTANCE = Mappers.getMapper(DeviceInspectionJobDetailItemConvert.class); + + DeviceInspectionJobDetailItemDO convert(DeviceInspectionJobDetailItemCreateReqVO bean); + + DeviceInspectionJobDetailItemDO convert(DeviceInspectionJobDetailItemUpdateReqVO bean); + + DeviceInspectionJobDetailItemRespVO convert(DeviceInspectionJobDetailItemDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceinspectionjob/DeviceInspectionJobMainConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceinspectionjob/DeviceInspectionJobMainConvert.java new file mode 100644 index 0000000..b4839c2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceinspectionjob/DeviceInspectionJobMainConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.deviceinspectionjob; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobMainDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionReportDo; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 检修工单主 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceInspectionJobMainConvert { + + DeviceInspectionJobMainConvert INSTANCE = Mappers.getMapper(DeviceInspectionJobMainConvert.class); + + DeviceInspectionJobMainDO convert(DeviceInspectionJobMainCreateReqVO bean); + + DeviceInspectionJobMainDO convert(DeviceInspectionJobMainUpdateReqVO bean); + + DeviceInspectionJobMainRespVO convert(DeviceInspectionJobMainDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + DeviceInspectionReportDo convert(DeviceInspectionReportReqVo bean); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceinternalaudit/DeviceInternalAuditConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceinternalaudit/DeviceInternalAuditConvert.java new file mode 100644 index 0000000..c448f94 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceinternalaudit/DeviceInternalAuditConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.deviceinternalaudit; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceinternalaudit.vo.DeviceInternalAuditCreateReqVO; +import com.win.module.eam.controller.deviceinternalaudit.vo.DeviceInternalAuditExcelVO; +import com.win.module.eam.controller.deviceinternalaudit.vo.DeviceInternalAuditRespVO; +import com.win.module.eam.controller.deviceinternalaudit.vo.DeviceInternalAuditUpdateReqVO; +import com.win.module.eam.dal.dataobject.deviceinternalaudit.DeviceInternalAuditDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + + +/** + * 设备内审业务说明 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceInternalAuditConvert { + + DeviceInternalAuditConvert INSTANCE = Mappers.getMapper(DeviceInternalAuditConvert.class); + + DeviceInternalAuditDO convert(DeviceInternalAuditCreateReqVO bean); + + DeviceInternalAuditDO convert(DeviceInternalAuditUpdateReqVO bean); + + DeviceInternalAuditRespVO convert(DeviceInternalAuditDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceitem/DeviceItemConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceitem/DeviceItemConvert.java new file mode 100644 index 0000000..5ee2bec --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/deviceitem/DeviceItemConvert.java @@ -0,0 +1,38 @@ +package com.win.module.eam.convert.deviceitem; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceitem.vo.DeviceItemCreateReqVO; +import com.win.module.eam.controller.deviceitem.vo.DeviceItemExcelVO; +import com.win.module.eam.controller.deviceitem.vo.DeviceItemRespVO; +import com.win.module.eam.controller.deviceitem.vo.DeviceItemUpdateReqVO; +import com.win.module.eam.dal.dataobject.deviceitem.DeviceItemDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 设备备件关系 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceItemConvert { + + DeviceItemConvert INSTANCE = Mappers.getMapper(DeviceItemConvert.class); + + DeviceItemDO convert(DeviceItemCreateReqVO bean); + + DeviceItemDO convert(DeviceItemUpdateReqVO bean); + + DeviceItemRespVO convert(DeviceItemDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + List convertList03(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintainjob/DeviceMaintainJobDetailConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintainjob/DeviceMaintainJobDetailConvert.java new file mode 100644 index 0000000..c64e0c2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintainjob/DeviceMaintainJobDetailConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.devicemaintainjob; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.devicemaintainjob.vo.DeviceMaintainJobDetailCreateReqVO; +import com.win.module.eam.controller.devicemaintainjob.vo.DeviceMaintainJobDetailExcelVO; +import com.win.module.eam.controller.devicemaintainjob.vo.DeviceMaintainJobDetailRespVO; +import com.win.module.eam.controller.devicemaintainjob.vo.DeviceMaintainJobDetailUpdateReqVO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobDetailDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 保养工单子 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceMaintainJobDetailConvert { + + DeviceMaintainJobDetailConvert INSTANCE = Mappers.getMapper(DeviceMaintainJobDetailConvert.class); + + DeviceMaintainJobDetailDO convert(DeviceMaintainJobDetailCreateReqVO bean); + + DeviceMaintainJobDetailDO convert(DeviceMaintainJobDetailUpdateReqVO bean); + + DeviceMaintainJobDetailRespVO convert(DeviceMaintainJobDetailDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintainjob/DeviceMaintainJobMainConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintainjob/DeviceMaintainJobMainConvert.java new file mode 100644 index 0000000..ee96be2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintainjob/DeviceMaintainJobMainConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.devicemaintainjob; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobReportDo; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + + +/** + * 保养工单主 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceMaintainJobMainConvert { + + DeviceMaintainJobMainConvert INSTANCE = Mappers.getMapper(DeviceMaintainJobMainConvert.class); + + DeviceMaintainJobMainDO convert(DeviceMaintainJobMainCreateReqVO bean); + + DeviceMaintainJobMainDO convert(DeviceMaintainJobMainUpdateReqVO bean); + + DeviceMaintainJobMainRespVO convert(DeviceMaintainJobMainDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + DeviceMaintainJobReportDo convert(DeviceMaintainJobReportReqVo bean); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintainjob/MaintainJobDetailItemConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintainjob/MaintainJobDetailItemConvert.java new file mode 100644 index 0000000..18e6130 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintainjob/MaintainJobDetailItemConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.devicemaintainjob; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.controller.devicemaintainjob.vo.MaintainJobDetailItemCreateReqVO; +import com.win.module.eam.controller.devicemaintainjob.vo.MaintainJobDetailItemRespVO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.MaintainJobDetailItemDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 保养工单子表与备件关系 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface MaintainJobDetailItemConvert { + + MaintainJobDetailItemConvert INSTANCE = Mappers.getMapper(MaintainJobDetailItemConvert.class); + + MaintainJobDetailItemDO convert(MaintainJobDetailItemCreateReqVO bean); + + MaintainJobDetailItemDO convert(MaintainJobDetailItemUpdateReqVO bean); + + MaintainJobDetailItemRespVO convert(MaintainJobDetailItemDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintainplan/DeviceMaintainPlanConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintainplan/DeviceMaintainPlanConvert.java new file mode 100644 index 0000000..2dc882e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintainplan/DeviceMaintainPlanConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.devicemaintainplan; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.devicemaintainplan.vo.DeviceMaintainPlanCreateReqVO; +import com.win.module.eam.controller.devicemaintainplan.vo.DeviceMaintainPlanExcelVO; +import com.win.module.eam.controller.devicemaintainplan.vo.DeviceMaintainPlanRespVO; +import com.win.module.eam.controller.devicemaintainplan.vo.DeviceMaintainPlanUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.win.module.eam.dal.dataobject.devicemaintainplan.DeviceMaintainPlanDO; + +/** + * 保养计划 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceMaintainPlanConvert { + + DeviceMaintainPlanConvert INSTANCE = Mappers.getMapper(DeviceMaintainPlanConvert.class); + + DeviceMaintainPlanDO convert(DeviceMaintainPlanCreateReqVO bean); + + DeviceMaintainPlanDO convert(DeviceMaintainPlanUpdateReqVO bean); + + DeviceMaintainPlanRespVO convert(DeviceMaintainPlanDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintenancejob/DeviceMaintenanceJobDetailConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintenancejob/DeviceMaintenanceJobDetailConvert.java new file mode 100644 index 0000000..0524518 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintenancejob/DeviceMaintenanceJobDetailConvert.java @@ -0,0 +1,38 @@ +package com.win.module.eam.convert.devicemaintenancejob; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobDetailRespVO; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobDetailCreateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailDO; + +/** + * 维修工单子 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceMaintenanceJobDetailConvert { + + DeviceMaintenanceJobDetailConvert INSTANCE = Mappers.getMapper(DeviceMaintenanceJobDetailConvert.class); + + DeviceMaintenanceJobDetailDO convert(DeviceMaintenanceJobDetailCreateReqVO bean); + + DeviceMaintenanceJobDetailDO convert(DeviceMaintenanceJobDetailUpdateReqVO bean); + + DeviceMaintenanceJobDetailRespVO convert(DeviceMaintenanceJobDetailDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + List convertList03(List subList); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintenancejob/DeviceMaintenanceJobDetailItemConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintenancejob/DeviceMaintenanceJobDetailItemConvert.java new file mode 100644 index 0000000..1e137ef --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintenancejob/DeviceMaintenanceJobDetailItemConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.devicemaintenancejob; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobDetailItemCreateReqVO; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobDetailItemExcelVO; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobDetailItemRespVO; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobDetailItemUpdateReqVO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailItemDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 维修工单子表与备件关系 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceMaintenanceJobDetailItemConvert { + + DeviceMaintenanceJobDetailItemConvert INSTANCE = Mappers.getMapper(DeviceMaintenanceJobDetailItemConvert.class); + + DeviceMaintenanceJobDetailItemDO convert(DeviceMaintenanceJobDetailItemCreateReqVO bean); + + DeviceMaintenanceJobDetailItemDO convert(DeviceMaintenanceJobDetailItemUpdateReqVO bean); + + DeviceMaintenanceJobDetailItemRespVO convert(DeviceMaintenanceJobDetailItemDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintenancejob/DeviceMaintenanceJobMainConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintenancejob/DeviceMaintenanceJobMainConvert.java new file mode 100644 index 0000000..50fef19 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemaintenancejob/DeviceMaintenanceJobMainConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.devicemaintenancejob; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobMainCreateReqVO; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobMainExcelVO; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobMainRespVO; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobMainUpdateReqVO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 维修工单主 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceMaintenanceJobMainConvert { + + DeviceMaintenanceJobMainConvert INSTANCE = Mappers.getMapper(DeviceMaintenanceJobMainConvert.class); + + DeviceMaintenanceJobMainDO convert(DeviceMaintenanceJobMainCreateReqVO bean); + + DeviceMaintenanceJobMainDO convert(DeviceMaintenanceJobMainUpdateReqVO bean); + + DeviceMaintenanceJobMainRespVO convert(DeviceMaintenanceJobMainDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemolditems/DeviceMoldItemsConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemolditems/DeviceMoldItemsConvert.java new file mode 100644 index 0000000..fb54351 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemolditems/DeviceMoldItemsConvert.java @@ -0,0 +1,40 @@ +package com.win.module.eam.convert.devicemolditems; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemolditems.vo.*; +import com.win.module.eam.dal.dataobject.devicemolditems.DeviceMoldItemsDO; +import com.win.module.eam.dal.dataobject.devicemolditemshistory.DeviceMoldItemsHistoryDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 项记录表(设备 模具 保养 维修 巡检点检) Convert + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceMoldItemsConvert { + + DeviceMoldItemsConvert INSTANCE = Mappers.getMapper(DeviceMoldItemsConvert.class); + + DeviceMoldItemsDO convert(DeviceMoldItemsCreateReqVO bean); + + DeviceMoldItemsDO convert(DeviceMoldItemsUpdateReqVO bean); + + DeviceMoldItemsRespVO convert(DeviceMoldItemsDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + List convertList03(List list); + List convertList04(List list); + DeviceMoldItemsHistoryDO convertHis(DeviceMoldItemsCreateReqVO bean); + DeviceMoldItemsHistoryDO convertHis(DeviceMoldItemsUpdateReqVO bean); + DeviceMoldItemsHistoryDO convertHis(DeviceMoldItemsDO bean); + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemolditemshistory/DeviceMoldItemsHistoryConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemolditemshistory/DeviceMoldItemsHistoryConvert.java new file mode 100644 index 0000000..e60fd61 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicemolditemshistory/DeviceMoldItemsHistoryConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.devicemolditemshistory; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemolditemshistory.vo.DeviceMoldItemsHistoryCreateReqVO; +import com.win.module.eam.controller.devicemolditemshistory.vo.DeviceMoldItemsHistoryExcelVO; +import com.win.module.eam.controller.devicemolditemshistory.vo.DeviceMoldItemsHistoryRespVO; +import com.win.module.eam.controller.devicemolditemshistory.vo.DeviceMoldItemsHistoryUpdateReqVO; +import com.win.module.eam.dal.dataobject.devicemolditemshistory.DeviceMoldItemsHistoryDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 项记录历史表(设备 模具 保养 维修 巡检点检) Convert + * + * @author Lu.jl + */ +@Mapper +public interface DeviceMoldItemsHistoryConvert { + + DeviceMoldItemsHistoryConvert INSTANCE = Mappers.getMapper(DeviceMoldItemsHistoryConvert.class); + + DeviceMoldItemsHistoryDO convert(DeviceMoldItemsHistoryCreateReqVO bean); + + DeviceMoldItemsHistoryDO convert(DeviceMoldItemsHistoryUpdateReqVO bean); + + DeviceMoldItemsHistoryRespVO convert(DeviceMoldItemsHistoryDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicerepairrequest/DeviceRepairRequestConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicerepairrequest/DeviceRepairRequestConvert.java new file mode 100644 index 0000000..d54468a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicerepairrequest/DeviceRepairRequestConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.devicerepairrequest; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.devicerepairrequest.vo.*; +import com.win.module.eam.controller.devicerepairrequest.vo.DeviceRepairRequestRequestCreateReqVO; +import com.win.module.eam.controller.devicerepairrequest.vo.DeviceRepairRequestRequestRespVO; +import com.win.module.eam.dal.dataobject.devicerepairrequest.DeviceRepairRequestDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 报修申请 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceRepairRequestConvert { + + DeviceRepairRequestConvert INSTANCE = Mappers.getMapper(DeviceRepairRequestConvert.class); + + DeviceRepairRequestDO convert(DeviceRepairRequestRequestCreateReqVO bean); + + DeviceRepairRequestDO convert(DeviceRepairRequestRequestUpdateReqVO bean); + + DeviceRepairRequestRequestRespVO convert(DeviceRepairRequestDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailConvert.java new file mode 100644 index 0000000..9c0061c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.devicespotinspectionrecord; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.devicespotinspectionrecord.vo.DeviceSpotInspectionRecordDetailCreateReqVO; +import com.win.module.eam.controller.devicespotinspectionrecord.vo.DeviceSpotInspectionRecordDetailExcelVO; +import com.win.module.eam.controller.devicespotinspectionrecord.vo.DeviceSpotInspectionRecordDetailRespVO; +import com.win.module.eam.controller.devicespotinspectionrecord.vo.DeviceSpotInspectionRecordDetailUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailDO; + +/** + * 巡检点检记录子 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceSpotInspectionRecordDetailConvert { + + DeviceSpotInspectionRecordDetailConvert INSTANCE = Mappers.getMapper(DeviceSpotInspectionRecordDetailConvert.class); + + DeviceSpotInspectionRecordDetailDO convert(DeviceSpotInspectionRecordDetailCreateReqVO bean); + + DeviceSpotInspectionRecordDetailDO convert(DeviceSpotInspectionRecordDetailUpdateReqVO bean); + + DeviceSpotInspectionRecordDetailRespVO convert(DeviceSpotInspectionRecordDetailDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicespotinspectionrecord/DeviceSpotInspectionRecordMainConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicespotinspectionrecord/DeviceSpotInspectionRecordMainConvert.java new file mode 100644 index 0000000..799e28a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/devicespotinspectionrecord/DeviceSpotInspectionRecordMainConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.devicespotinspectionrecord; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.devicespotinspectionrecord.vo.DeviceSpotInspectionRecordMainCreateReqVO; +import com.win.module.eam.controller.devicespotinspectionrecord.vo.DeviceSpotInspectionRecordMainExcelVO; +import com.win.module.eam.controller.devicespotinspectionrecord.vo.DeviceSpotInspectionRecordMainRespVO; +import com.win.module.eam.controller.devicespotinspectionrecord.vo.DeviceSpotInspectionRecordMainUpdateReqVO; +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordMainDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 检修工单主 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceSpotInspectionRecordMainConvert { + + DeviceSpotInspectionRecordMainConvert INSTANCE = Mappers.getMapper(DeviceSpotInspectionRecordMainConvert.class); + + DeviceSpotInspectionRecordMainDO convert(DeviceSpotInspectionRecordMainCreateReqVO bean); + + DeviceSpotInspectionRecordMainDO convert(DeviceSpotInspectionRecordMainUpdateReqVO bean); + + DeviceSpotInspectionRecordMainRespVO convert(DeviceSpotInspectionRecordMainDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/factoryarea/FactoryAreaConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/factoryarea/FactoryAreaConvert.java new file mode 100644 index 0000000..f9906b5 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/factoryarea/FactoryAreaConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.factoryarea; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.factoryarea.vo.FactoryAreaCreateReqVO; +import com.win.module.eam.controller.factoryarea.vo.FactoryAreaExcelVO; +import com.win.module.eam.controller.factoryarea.vo.FactoryAreaRespVO; +import com.win.module.eam.controller.factoryarea.vo.FactoryAreaUpdateReqVO; +import com.win.module.eam.dal.dataobject.factoryarea.FactoryAreaDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 厂区 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface FactoryAreaConvert { + + FactoryAreaConvert INSTANCE = Mappers.getMapper(FactoryAreaConvert.class); + + FactoryAreaDO convert(FactoryAreaCreateReqVO bean); + + FactoryAreaDO convert(FactoryAreaUpdateReqVO bean); + + FactoryAreaRespVO convert(FactoryAreaDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/fixedassets/FixedAssetsConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/fixedassets/FixedAssetsConvert.java new file mode 100644 index 0000000..ba305ad --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/fixedassets/FixedAssetsConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.fixedassets; + + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.fixedassets.vo.FixedAssetsCreateReqVO; +import com.win.module.eam.controller.fixedassets.vo.FixedAssetsExcelVO; +import com.win.module.eam.controller.fixedassets.vo.FixedAssetsRespVO; +import com.win.module.eam.controller.fixedassets.vo.FixedAssetsUpdateReqVO; +import com.win.module.eam.dal.dataobject.fixedassets.FixedAssetsDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 固定资产 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface FixedAssetsConvert { + + FixedAssetsConvert INSTANCE = Mappers.getMapper(FixedAssetsConvert.class); + + FixedAssetsDO convert(FixedAssetsCreateReqVO bean); + + FixedAssetsDO convert(FixedAssetsUpdateReqVO bean); + + FixedAssetsRespVO convert(FixedAssetsDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/item/ItemConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/item/ItemConvert.java new file mode 100644 index 0000000..b4e24e5 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/item/ItemConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.item; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.item.vo.ItemCreateReqVO; +import com.win.module.eam.controller.item.vo.ItemExcelVO; +import com.win.module.eam.controller.item.vo.ItemRespVO; +import com.win.module.eam.controller.item.vo.ItemUpdateReqVO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 备件 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface ItemConvert { + + ItemConvert INSTANCE = Mappers.getMapper(ItemConvert.class); + + ItemDO convert(ItemCreateReqVO bean); + + ItemDO convert(ItemUpdateReqVO bean); + + ItemRespVO convert(ItemDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemaccounts/ItemAccountsConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemaccounts/ItemAccountsConvert.java new file mode 100644 index 0000000..4bf7858 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemaccounts/ItemAccountsConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.itemaccounts; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.itemaccounts.vo.ItemAccountsCreateReqVO; +import com.win.module.eam.controller.itemaccounts.vo.ItemAccountsExcelVO; +import com.win.module.eam.controller.itemaccounts.vo.ItemAccountsRespVO; +import com.win.module.eam.controller.itemaccounts.vo.ItemAccountsUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.win.module.eam.dal.dataobject.itemaccounts.ItemAccountsDO; + +/** + * 备件台账 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface ItemAccountsConvert { + + ItemAccountsConvert INSTANCE = Mappers.getMapper(ItemAccountsConvert.class); + + ItemAccountsDO convert(ItemAccountsCreateReqVO bean); + + ItemAccountsDO convert(ItemAccountsUpdateReqVO bean); + + ItemAccountsRespVO convert(ItemAccountsDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemapplyrequest/ItemApplyRequestDetailConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemapplyrequest/ItemApplyRequestDetailConvert.java new file mode 100644 index 0000000..a5c00a8 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemapplyrequest/ItemApplyRequestDetailConvert.java @@ -0,0 +1,38 @@ +package com.win.module.eam.convert.itemapplyrequest; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.itemapplyrequest.vo.ItemApplyRequestDetailCreateReqVO; +import com.win.module.eam.controller.itemapplyrequest.vo.ItemApplyRequestDetailExcelVO; +import com.win.module.eam.controller.itemapplyrequest.vo.ItemApplyRequestDetailRespVO; +import com.win.module.eam.controller.itemapplyrequest.vo.ItemApplyRequestDetailUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.win.module.eam.dal.dataobject.itemapplyrequest.ItemApplyRequestDetailDO; + +/** + * 备件申领记录子 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface ItemApplyRequestDetailConvert { + + ItemApplyRequestDetailConvert INSTANCE = Mappers.getMapper(ItemApplyRequestDetailConvert.class); + + ItemApplyRequestDetailDO convert(ItemApplyRequestDetailCreateReqVO bean); + + ItemApplyRequestDetailDO convert(ItemApplyRequestDetailUpdateReqVO bean); + + ItemApplyRequestDetailRespVO convert(ItemApplyRequestDetailDO bean); + + List convertList(List list); + List convertList03(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemapplyrequest/ItemApplyRequestMainConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemapplyrequest/ItemApplyRequestMainConvert.java new file mode 100644 index 0000000..eb2a73e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemapplyrequest/ItemApplyRequestMainConvert.java @@ -0,0 +1,35 @@ +package com.win.module.eam.convert.itemapplyrequest; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.itemapplyrequest.vo.*; +import com.win.module.eam.controller.itemapplyrequest.vo.ItemApplyRequestMainUpdateReqVO; +import com.win.module.eam.controller.itemapplyrequest.vo.ItemApplyRequestMainRespVO; +import com.win.module.eam.dal.dataobject.itemapplyrequest.ItemApplyRequestMainDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 备件申领记录主 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface ItemApplyRequestMainConvert { + + ItemApplyRequestMainConvert INSTANCE = Mappers.getMapper(ItemApplyRequestMainConvert.class); + + ItemApplyRequestMainDO convert(ItemApplyRequestMainCreateReqVO bean); + + ItemApplyRequestMainDO convert(ItemApplyRequestMainUpdateReqVO bean); + + ItemApplyRequestMainRespVO convert(ItemApplyRequestMainDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/iteminlocation/ItemInLocationConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/iteminlocation/ItemInLocationConvert.java new file mode 100644 index 0000000..45a4057 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/iteminlocation/ItemInLocationConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.iteminlocation; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.iteminlocation.vo.ItemInLocationCreateReqVO; +import com.win.module.eam.controller.iteminlocation.vo.ItemInLocationExcelVO; +import com.win.module.eam.controller.iteminlocation.vo.ItemInLocationRespVO; +import com.win.module.eam.controller.iteminlocation.vo.ItemInLocationUpdateReqVO; +import com.win.module.eam.dal.dataobject.iteminlocation.ItemInLocationDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 备件入库记录 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface ItemInLocationConvert { + + ItemInLocationConvert INSTANCE = Mappers.getMapper(ItemInLocationConvert.class); + + ItemInLocationDO convert(ItemInLocationCreateReqVO bean); + + ItemInLocationDO convert(ItemInLocationUpdateReqVO bean); + + ItemInLocationRespVO convert(ItemInLocationDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemlocationreplace/ItemLocationReplaceConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemlocationreplace/ItemLocationReplaceConvert.java new file mode 100644 index 0000000..fb9849d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemlocationreplace/ItemLocationReplaceConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.itemlocationreplace; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.itemlocationreplace.vo.ItemLocationReplaceCreateReqVO; +import com.win.module.eam.controller.itemlocationreplace.vo.ItemLocationReplaceExcelVO; +import com.win.module.eam.controller.itemlocationreplace.vo.ItemLocationReplaceRespVO; +import com.win.module.eam.controller.itemlocationreplace.vo.ItemLocationReplaceUpdateReqVO; +import com.win.module.eam.dal.dataobject.itemlocationreplace.ItemLocationReplaceDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + + +/** + * 备件库位变更记录 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface ItemLocationReplaceConvert { + + ItemLocationReplaceConvert INSTANCE = Mappers.getMapper(ItemLocationReplaceConvert.class); + + ItemLocationReplaceDO convert(ItemLocationReplaceCreateReqVO bean); + + ItemLocationReplaceDO convert(ItemLocationReplaceUpdateReqVO bean); + + ItemLocationReplaceRespVO convert(ItemLocationReplaceDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemmaintenancerecord/ItemMaintenanceRecordConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemmaintenancerecord/ItemMaintenanceRecordConvert.java new file mode 100644 index 0000000..91ebd7c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemmaintenancerecord/ItemMaintenanceRecordConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.itemmaintenancerecord; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.itemmaintenancerecord.vo.ItemMaintenanceRecordCreateReqVO; +import com.win.module.eam.controller.itemmaintenancerecord.vo.ItemMaintenanceRecordExcelVO; +import com.win.module.eam.controller.itemmaintenancerecord.vo.ItemMaintenanceRecordRespVO; +import com.win.module.eam.controller.itemmaintenancerecord.vo.ItemMaintenanceRecordUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.win.module.eam.dal.dataobject.itemmaintenancerecord.ItemMaintenanceRecordDO; + +/** + * 备件维修记录 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface ItemMaintenanceRecordConvert { + + ItemMaintenanceRecordConvert INSTANCE = Mappers.getMapper(ItemMaintenanceRecordConvert.class); + + ItemMaintenanceRecordDO convert(ItemMaintenanceRecordCreateReqVO bean); + + ItemMaintenanceRecordDO convert(ItemMaintenanceRecordUpdateReqVO bean); + + ItemMaintenanceRecordRespVO convert(ItemMaintenanceRecordDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemorder/ItemOrderDetailConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemorder/ItemOrderDetailConvert.java new file mode 100644 index 0000000..f48875f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemorder/ItemOrderDetailConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.itemorder; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.itemorder.vo.ItemOrderDetailCreateReqVO; +import com.win.module.eam.controller.itemorder.vo.ItemOrderDetailExcelVO; +import com.win.module.eam.controller.itemorder.vo.ItemOrderDetailRespVO; +import com.win.module.eam.controller.itemorder.vo.ItemOrderDetailUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.win.module.eam.dal.dataobject.itemorder.ItemOrderDetailDO; + +/** + * 备件采购订单子 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface ItemOrderDetailConvert { + + ItemOrderDetailConvert INSTANCE = Mappers.getMapper(ItemOrderDetailConvert.class); + + ItemOrderDetailDO convert(ItemOrderDetailCreateReqVO bean); + + ItemOrderDetailDO convert(ItemOrderDetailUpdateReqVO bean); + + ItemOrderDetailRespVO convert(ItemOrderDetailDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemorder/ItemOrderMainConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemorder/ItemOrderMainConvert.java new file mode 100644 index 0000000..abb0693 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemorder/ItemOrderMainConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.itemorder; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.itemorder.vo.ItemOrderMainCreateReqVO; +import com.win.module.eam.controller.itemorder.vo.ItemOrderMainExcelVO; +import com.win.module.eam.controller.itemorder.vo.ItemOrderMainRespVO; +import com.win.module.eam.controller.itemorder.vo.ItemOrderMainUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.win.module.eam.dal.dataobject.itemorder.ItemOrderMainDO; + +/** + * 备件采购订单主 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface ItemOrderMainConvert { + + ItemOrderMainConvert INSTANCE = Mappers.getMapper(ItemOrderMainConvert.class); + + ItemOrderMainDO convert(ItemOrderMainCreateReqVO bean); + + ItemOrderMainDO convert(ItemOrderMainUpdateReqVO bean); + + ItemOrderMainRespVO convert(ItemOrderMainDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemoutlocation/ItemOutLocationConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemoutlocation/ItemOutLocationConvert.java new file mode 100644 index 0000000..d15d8a2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/itemoutlocation/ItemOutLocationConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.itemoutlocation; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.itemoutlocation.vo.ItemOutLocationCreateReqVO; +import com.win.module.eam.controller.itemoutlocation.vo.ItemOutLocationExcelVO; +import com.win.module.eam.controller.itemoutlocation.vo.ItemOutLocationRespVO; +import com.win.module.eam.controller.itemoutlocation.vo.ItemOutLocationUpdateReqVO; +import com.win.module.eam.dal.dataobject.itemoutlocation.ItemOutLocationDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 备件出库记录 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface ItemOutLocationConvert { + + ItemOutLocationConvert INSTANCE = Mappers.getMapper(ItemOutLocationConvert.class); + + ItemOutLocationDO convert(ItemOutLocationCreateReqVO bean); + + ItemOutLocationDO convert(ItemOutLocationUpdateReqVO bean); + + ItemOutLocationRespVO convert(ItemOutLocationDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/location/LocationConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/location/LocationConvert.java new file mode 100644 index 0000000..b450b6e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/location/LocationConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.location; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.location.vo.LocationCreateReqVO; +import com.win.module.eam.controller.location.vo.LocationExcelVO; +import com.win.module.eam.controller.location.vo.LocationRespVO; +import com.win.module.eam.controller.location.vo.LocationUpdateReqVO; +import com.win.module.eam.dal.dataobject.location.LocationDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 库位 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface LocationConvert { + + LocationConvert INSTANCE = Mappers.getMapper(LocationConvert.class); + + LocationDO convert(LocationCreateReqVO bean); + + LocationDO convert(LocationUpdateReqVO bean); + + LocationRespVO convert(LocationDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/locationarea/LocationAreaConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/locationarea/LocationAreaConvert.java new file mode 100644 index 0000000..f32b675 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/locationarea/LocationAreaConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.locationarea; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.locationarea.vo.LocationAreaCreateReqVO; +import com.win.module.eam.controller.locationarea.vo.LocationAreaExcelVO; +import com.win.module.eam.controller.locationarea.vo.LocationAreaRespVO; +import com.win.module.eam.controller.locationarea.vo.LocationAreaUpdateReqVO; +import com.win.module.eam.dal.dataobject.locationarea.LocationAreaDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 库区 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface LocationAreaConvert { + + LocationAreaConvert INSTANCE = Mappers.getMapper(LocationAreaConvert.class); + + LocationAreaDO convert(LocationAreaCreateReqVO bean); + + LocationAreaDO convert(LocationAreaUpdateReqVO bean); + + LocationAreaRespVO convert(LocationAreaDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/maintainback/MaintainBackConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/maintainback/MaintainBackConvert.java new file mode 100644 index 0000000..044c0fb --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/maintainback/MaintainBackConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.maintainback; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.maintainback.vo.MaintainBackCreateReqVO; +import com.win.module.eam.controller.maintainback.vo.MaintainBackExcelVO; +import com.win.module.eam.controller.maintainback.vo.MaintainBackRespVO; +import com.win.module.eam.controller.maintainback.vo.MaintainBackUpdateReqVO; +import com.win.module.eam.dal.dataobject.maintainback.MaintainBackDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 保养计划 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface MaintainBackConvert { + + MaintainBackConvert INSTANCE = Mappers.getMapper(MaintainBackConvert.class); + + MaintainBackDO convert(MaintainBackCreateReqVO bean); + + MaintainBackDO convert(MaintainBackUpdateReqVO bean); + + MaintainBackRespVO convert(MaintainBackDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/maintenanceturnto/MaintenanceTurntoConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/maintenanceturnto/MaintenanceTurntoConvert.java new file mode 100644 index 0000000..0cdb92b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/maintenanceturnto/MaintenanceTurntoConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.maintenanceturnto; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.maintenanceturnto.vo.MaintenanceTurntoCreateReqVO; +import com.win.module.eam.controller.maintenanceturnto.vo.MaintenanceTurntoExcelVO; +import com.win.module.eam.controller.maintenanceturnto.vo.MaintenanceTurntoRespVO; +import com.win.module.eam.controller.maintenanceturnto.vo.MaintenanceTurntoUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.win.module.eam.dal.dataobject.maintenanceturnto.MaintenanceTurntoDO; + +/** + * 维修转办记录 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface MaintenanceTurntoConvert { + + MaintenanceTurntoConvert INSTANCE = Mappers.getMapper(MaintenanceTurntoConvert.class); + + MaintenanceTurntoDO convert(MaintenanceTurntoCreateReqVO bean); + + MaintenanceTurntoDO convert(MaintenanceTurntoUpdateReqVO bean); + + MaintenanceTurntoRespVO convert(MaintenanceTurntoDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/moldaccounts/MoldAccountsConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/moldaccounts/MoldAccountsConvert.java new file mode 100644 index 0000000..319d178 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/moldaccounts/MoldAccountsConvert.java @@ -0,0 +1,38 @@ +package com.win.module.eam.convert.moldaccounts; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.moldaccounts.vo.MoldAccountsCreateReqVO; +import com.win.module.eam.controller.moldaccounts.vo.MoldAccountsExcelVO; +import com.win.module.eam.controller.moldaccounts.vo.MoldAccountsRespVO; +import com.win.module.eam.controller.moldaccounts.vo.MoldAccountsUpdateReqVO; +import com.win.module.eam.dal.dataobject.moldaccounts.MoldAccountsDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 模具台账 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface MoldAccountsConvert { + + MoldAccountsConvert INSTANCE = Mappers.getMapper(MoldAccountsConvert.class); + + MoldAccountsDO convert(MoldAccountsCreateReqVO bean); + + MoldAccountsDO convert(MoldAccountsUpdateReqVO bean); + + MoldAccountsRespVO convert(MoldAccountsDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + + MoldAccountsUpdateReqVO convertBack(MoldAccountsDO bean); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/moldmilestone/MoldMilestoneConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/moldmilestone/MoldMilestoneConvert.java new file mode 100644 index 0000000..a789b85 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/moldmilestone/MoldMilestoneConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.moldmilestone; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.moldmilestone.vo.MoldMilestoneCreateReqVO; +import com.win.module.eam.controller.moldmilestone.vo.MoldMilestoneExcelVO; +import com.win.module.eam.controller.moldmilestone.vo.MoldMilestoneRespVO; +import com.win.module.eam.controller.moldmilestone.vo.MoldMilestoneUpdateReqVO; +import com.win.module.eam.dal.dataobject.moldmilestone.MoldMilestoneDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 模具里程碑 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface MoldMilestoneConvert { + + MoldMilestoneConvert INSTANCE = Mappers.getMapper(MoldMilestoneConvert.class); + + MoldMilestoneDO convert(MoldMilestoneCreateReqVO bean); + + MoldMilestoneDO convert(MoldMilestoneUpdateReqVO bean); + + MoldMilestoneRespVO convert(MoldMilestoneDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/monthequipment/BasicMonthEquipmentConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/monthequipment/BasicMonthEquipmentConvert.java new file mode 100644 index 0000000..f718fbc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/monthequipment/BasicMonthEquipmentConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.monthequipment; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.monthequipment.vo.*; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.win.module.eam.dal.dataobject.monthequipment.BasicMonthEquipmentDO; + +/** + * 首页月设备实现指标 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface BasicMonthEquipmentConvert { + + BasicMonthEquipmentConvert INSTANCE = Mappers.getMapper(BasicMonthEquipmentConvert.class); + + BasicMonthEquipmentDO convert(BasicMonthEquipmentCreateReqVO bean); + + BasicMonthEquipmentDO convert(BasicMonthEquipmentUpdateReqVO bean); + + BasicMonthEquipmentErrorVO convert(BasicMonthEquipmentExcelVO bean); + BasicMonthEquipmentCreateReqVO convert1(BasicMonthEquipmentExcelVO bean); + BasicMonthEquipmentRespVO convert(BasicMonthEquipmentDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/package-info.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/package-info.java new file mode 100644 index 0000000..11a5830 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/package-info.java @@ -0,0 +1,4 @@ +/** + * System API 包,定义暴露给其它模块的 API + */ +package com.win.module.eam.convert; diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/producePlan/ProducePlanConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/producePlan/ProducePlanConvert.java new file mode 100644 index 0000000..408877a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/producePlan/ProducePlanConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.producePlan; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.producePlan.vo.ProducePlanCreateReqVO; +import com.win.module.eam.controller.producePlan.vo.ProducePlanExcelVO; +import com.win.module.eam.controller.producePlan.vo.ProducePlanRespVO; +import com.win.module.eam.controller.producePlan.vo.ProducePlanUpdateReqVO; +import com.win.module.eam.dal.dataobject.producePlan.ProducePlanDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 生产计划 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface ProducePlanConvert { + + ProducePlanConvert INSTANCE = Mappers.getMapper(ProducePlanConvert.class); + + ProducePlanDO convert(ProducePlanCreateReqVO bean); + + ProducePlanDO convert(ProducePlanUpdateReqVO bean); + + ProducePlanRespVO convert(ProducePlanDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/supplier/SupplierConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/supplier/SupplierConvert.java new file mode 100644 index 0000000..59f2b88 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/supplier/SupplierConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.supplier; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.supplier.vo.SupplierCreateReqVO; +import com.win.module.eam.controller.supplier.vo.SupplierExcelVO; +import com.win.module.eam.controller.supplier.vo.SupplierRespVO; +import com.win.module.eam.controller.supplier.vo.SupplierUpdateReqVO; +import com.win.module.eam.dal.dataobject.supplier.SupplierDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 供应商 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface SupplierConvert { + + SupplierConvert INSTANCE = Mappers.getMapper(SupplierConvert.class); + + SupplierDO convert(SupplierCreateReqVO bean); + + SupplierDO convert(SupplierUpdateReqVO bean); + + SupplierRespVO convert(SupplierDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/transaction/TransactionConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/transaction/TransactionConvert.java new file mode 100644 index 0000000..3976c05 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/transaction/TransactionConvert.java @@ -0,0 +1,36 @@ +package com.win.module.eam.convert.transaction; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.transaction.vo.TransactionCreateReqVO; +import com.win.module.eam.controller.transaction.vo.TransactionExcelVO; +import com.win.module.eam.controller.transaction.vo.TransactionRespVO; +import com.win.module.eam.controller.transaction.vo.TransactionUpdateReqVO; +import com.win.module.eam.dal.dataobject.transaction.TransactionDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 库存事务 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface TransactionConvert { + + TransactionConvert INSTANCE = Mappers.getMapper(TransactionConvert.class); + + TransactionDO convert(TransactionCreateReqVO bean); + + TransactionDO convert(TransactionUpdateReqVO bean); + + TransactionRespVO convert(TransactionDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/uniapppushmessage/UniappPushMessageConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/uniapppushmessage/UniappPushMessageConvert.java new file mode 100644 index 0000000..d30b423 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/uniapppushmessage/UniappPushMessageConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.uniapppushmessage; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.uniapppushmessage.vo.UniappPushMessageCreateReqVO; +import com.win.module.eam.controller.uniapppushmessage.vo.UniappPushMessageExcelVO; +import com.win.module.eam.controller.uniapppushmessage.vo.UniappPushMessageRespVO; +import com.win.module.eam.controller.uniapppushmessage.vo.UniappPushMessageUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.win.module.eam.dal.dataobject.uniapppushmessage.UniappPushMessageDO; + +/** + * uniapp推送记录 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface UniappPushMessageConvert { + + UniappPushMessageConvert INSTANCE = Mappers.getMapper(UniappPushMessageConvert.class); + + UniappPushMessageDO convert(UniappPushMessageCreateReqVO bean); + + UniappPushMessageDO convert(UniappPushMessageUpdateReqVO bean); + + UniappPushMessageRespVO convert(UniappPushMessageDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/yearequipment/BasciYearEquipmentConvert.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/yearequipment/BasciYearEquipmentConvert.java new file mode 100644 index 0000000..0872600 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/convert/yearequipment/BasciYearEquipmentConvert.java @@ -0,0 +1,37 @@ +package com.win.module.eam.convert.yearequipment; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.controller.yearequipment.vo.BasciYearEquipmentCreateReqVO; +import com.win.module.eam.controller.yearequipment.vo.BasciYearEquipmentExcelVO; +import com.win.module.eam.controller.yearequipment.vo.BasciYearEquipmentRespVO; +import com.win.module.eam.controller.yearequipment.vo.BasciYearEquipmentUpdateReqVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; +import com.win.module.eam.dal.dataobject.yearequipment.BasciYearEquipmentDO; + +/** + * 首页年设备指标 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface BasciYearEquipmentConvert { + + BasciYearEquipmentConvert INSTANCE = Mappers.getMapper(BasciYearEquipmentConvert.class); + + BasciYearEquipmentDO convert(BasciYearEquipmentCreateReqVO bean); + + BasciYearEquipmentDO convert(BasciYearEquipmentUpdateReqVO bean); + + BasciYearEquipmentRespVO convert(BasciYearEquipmentDO bean); + + List convertList(List list); + + PageResult convertPage(PageResult page); + + List convertList02(List list); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/adjustRecord/AdjustRecordDetailDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/adjustRecord/AdjustRecordDetailDO.java new file mode 100644 index 0000000..05c949c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/adjustRecord/AdjustRecordDetailDO.java @@ -0,0 +1,76 @@ +package com.win.module.eam.dal.dataobject.adjustRecord; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; + +/** + * 备件盘点调整记录子 DO + * + * @author 超级管理员 + */ +@TableName("record_countadjust_detail") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AdjustRecordDetailDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String number; + /** + * masterId + */ + private Long masterId; + /** + * 库位编码 + */ + private String locationNumber; + /** + * 库区编号 + */ + private String areaNumber; + /** + * 备件编码 + */ + private String itemNumber; + /** + * 库存数量 + */ + private BigDecimal qty; + /** + * 盘点数量 + */ + private BigDecimal countQty; + /** + * 差异数量 + */ + private BigDecimal differenceQty; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/adjustRecord/AdjustRecordMainDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/adjustRecord/AdjustRecordMainDO.java new file mode 100644 index 0000000..fc676f9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/adjustRecord/AdjustRecordMainDO.java @@ -0,0 +1,68 @@ +package com.win.module.eam.dal.dataobject.adjustRecord; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 备件盘点调整记录主 DO + * + * @author 超级管理员 + */ +@TableName("record_countadjust_main") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AdjustRecordMainDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String number; + /** + * 盘点计划编号 + */ + private String planNumber; + /** + * 盘点申请编号预留 + */ + private String requestNumber; + /** + * 申请时间预留 + */ + private LocalDateTime requestTime; + /** + * 任务编号预留 + */ + private String jobNumber; + /** + * 任务编号预留 + */ + private String recordNumber; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/attachmentfile/AttachmentFileDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/attachmentfile/AttachmentFileDO.java new file mode 100644 index 0000000..a340a60 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/attachmentfile/AttachmentFileDO.java @@ -0,0 +1,82 @@ +package com.win.module.eam.dal.dataobject.attachmentfile; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.util.List; + +/** + * 设备模具附件文件 DO + * + * @author 超级管理员 + */ +@TableName("basic_attachment_file") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AttachmentFileDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 设备/模具编号 + */ + private String number; + /** + * 文件名称 + */ + private String fileName; + /** + * 文件类型 + */ + private String fileType; + + /** + * 功能编号 + */ + private String funcCode; + /** + * 文件地址 + */ + private String path; + /** + * 文件大小 + */ + private String size; + /** + * 文件业务类型 + */ + private String fileBusiType; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + + @TableField(exist = false) + private List filePathList; + + /** + * 源编码 + */ + private String uid; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/classtype/ClassTypeDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/classtype/ClassTypeDO.java new file mode 100644 index 0000000..7f8f697 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/classtype/ClassTypeDO.java @@ -0,0 +1,73 @@ +package com.win.module.eam.dal.dataobject.classtype; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.win.framework.mybatis.core.dataobject.BaseDO; + +/** + * 厂区班组角色数据维护 DO + * + * @author 超级管理员 + */ +@TableName("basic_class_type") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ClassTypeDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 维修工角色id + */ + private String workerRoleId; + /** + * 工程师角色id + */ + private String engineerRoleId; + /** + * 设备类型 + */ + private String type; + /** + * 描述 + */ + private String describes; + /** + * 所属厂区编号 + */ + private String factoryAreaNumber; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 采购部门 + */ + private Long deptId; + /** + * 并发乐观锁 + */ + private Integer concurrencyStamp; + @TableField(exist = false) + private Long userId; + @TableField(exist = false) + private String cid; + + @TableField(exist = false) + private String nickname; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countJobDetail/CountJobDetailDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countJobDetail/CountJobDetailDO.java new file mode 100644 index 0000000..b886534 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countJobDetail/CountJobDetailDO.java @@ -0,0 +1,81 @@ +package com.win.module.eam.dal.dataobject.countJobDetail; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; + +/** + * 备件盘点任务子 DO + * + * @author 超级管理员 + */ +@TableName("job_count_detail") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CountJobDetailDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + + /** + * masterId + */ + private Long masterId; + + /** + * 编号唯一标识 + */ + private String number; + /** + * 库位编码 + */ + private String locationNumber; + /** + * 库区编号 + */ + private String areaNumber; + /** + * 备件编码 + */ + private String itemNumber; + /** + * 库存数量 + */ + private BigDecimal qty; + + /** + * 盘点数量(盘点调整中使用) + */ + @TableField(exist = false) + private BigDecimal countQty; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + + //盘点计划单号 + @TableField(exist = false) + private String planNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countJobMain/CountJobMainDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countJobMain/CountJobMainDO.java new file mode 100644 index 0000000..e07fd4e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countJobMain/CountJobMainDO.java @@ -0,0 +1,66 @@ +package com.win.module.eam.dal.dataobject.countJobMain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +/** + * 备件盘点任务主 DO + * + * @author 超级管理员 + */ +@TableName("job_count_main") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CountJobMainDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String jobNumber; + /** + * 名称 + */ + private String name; + /** + * 盘点计划申请编号 + */ + private String number; + /** + * 状态枚举预留 + */ + private String status; + /** + * 盘点人部门id + */ + private String countDeptId; + /** + * 盘点人id + */ + private String countId; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countRecord/CountRecordDetailDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countRecord/CountRecordDetailDO.java new file mode 100644 index 0000000..ba1025c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countRecord/CountRecordDetailDO.java @@ -0,0 +1,79 @@ +package com.win.module.eam.dal.dataobject.countRecord; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 备件盘点记录子 DO + * + * @author 超级管理员 + */ +@TableName("record_count_detail") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CountRecordDetailDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + + private Long masterId; + /** + * 编号唯一标识 + */ + private String number; + /** + * 库位编码 + */ + private String locationNumber; + /** + * 库区编号 + */ + private String areaNumber; + /** + * 备件编码 + */ + private String itemNumber; + /** + * 库存数量 + */ + private BigDecimal qty; + /** + * 盘点数量 + */ + private BigDecimal countQty; + /** + * 差异数量 + */ + private BigDecimal differenceQty; + /** + * 盘点时间 + */ + private LocalDateTime countTime; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countRecord/CountRecordMainDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countRecord/CountRecordMainDO.java new file mode 100644 index 0000000..3fa745b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countRecord/CountRecordMainDO.java @@ -0,0 +1,63 @@ +package com.win.module.eam.dal.dataobject.countRecord; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +/** + * 备件盘点记录主 DO + * + * @author 超级管理员 + */ +@TableName("record_count_main") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CountRecordMainDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String number; + + /** + * 盘点调整状态 可生成CANGENERATE不需要生成NOGENERATE已生成COMPLETED作废CANCEL + */ + private String status; + /** + * 名称 + */ + private String name; + /** + * 盘点计划申请编号预留 + */ + private String requestNumber; + /** + * 工单编号 + */ + private String jobNumber; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countadjustPlan/CountadjustPlanDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countadjustPlan/CountadjustPlanDO.java new file mode 100644 index 0000000..64e4b5f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/countadjustPlan/CountadjustPlanDO.java @@ -0,0 +1,62 @@ +package com.win.module.eam.dal.dataobject.countadjustPlan; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +/** + * 备件盘点计划 DO + * + * @author 超级管理员 + */ +@TableName("plan_count") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CountadjustPlanDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String number; + /** + * 名称 + */ + private String name; + /** + * 盘点备件的类型A、B、C 枚举 + */ + private String classification; + /** + * 是否账内库TRUE账内FALSE账外 + */ + private String isInAccount; + /** + * 枚举0新建、1发布、2已完成 + */ + private String status; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceaccounts/DeviceAccountsDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceaccounts/DeviceAccountsDO.java new file mode 100644 index 0000000..5e56318 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceaccounts/DeviceAccountsDO.java @@ -0,0 +1,119 @@ +package com.win.module.eam.dal.dataobject.deviceaccounts; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 备件台账 DO + * + * @author 超级管理员 + */ +@TableName("basic_device_accounts") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceAccountsDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String number; + /** + * 名称 + */ + private String name; + /** + * 规格型号 + */ + private String specification; + /** + * 设备类型 + */ + private String type; + /** + * 所属厂区编号 + */ + private String factoryAreaNumber; + /** + * 采购时间 + */ + private LocalDateTime purchaseTime; + /** + * 采购部门 + */ + private Long deptId; + /** + * 采购人 + */ + private String purchaser; + /** + * 供应商编号 + */ + private String supplierNumber; + /** + * 出厂日期 + */ + private LocalDateTime productionDate; + /** + * 价格 + */ + private BigDecimal purchasePrice; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + /** + * 状态0正常1维修中 + */ + private String status; + + /** + * 设备类型名称 + */ + @TableField(exist = false) + private String typeName; + + /** + * 厂区名称 + */ + @TableField(exist = false) + private String factoryAreaName; + + @TableField(exist = false) + private String images; + + private String power; + + private String describes; + + private String principal; + + + private String purchaseDept; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinspectionjob/DeviceInspectionJobDetailDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinspectionjob/DeviceInspectionJobDetailDO.java new file mode 100644 index 0000000..882b513 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinspectionjob/DeviceInspectionJobDetailDO.java @@ -0,0 +1,114 @@ +package com.win.module.eam.dal.dataobject.deviceinspectionjob; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +/** + * 检修工单子 DO + * + * @author 超级管理员 + */ +@TableName("job_inspection_detail") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceInspectionJobDetailDO extends BaseDO { + /** + * 主表id + */ + private Long masterId; + + /** + * id + */ + @TableId + private Long id; + /** + * 检修工单号与主表一致 + */ + private String number; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + /** + * 内容 + */ + private String name; + /** + * 人数 + */ + private Integer peoples; + /** + * 预计分钟 + */ + private Integer estimatedMinutes; + /** + * 实际分钟 + */ + private Integer actualMinutes; + /** + * 责任人多选 + */ + private String chargePeoples; + + /** + * 完成时间 + */ + private LocalDateTime completionTime; + /** + * 工程师确认 + */ + private String engineer; + + /** + * 状态0 + */ + private String status; + /** + * 未完成原因 + */ + private String uncompleted; + /** + * 用于组装返回备件和数量 + */ + @TableField(exist = false) + private List> items; + + /** + * 责任人姓名 + */ + @TableField(exist = false) + private String chargePeoplesName; + + /** + * 状态名称 + */ + @TableField(exist = false) + private String statusName; + + + @TableField(exist = false) + private List> itemNumbers; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinspectionjob/DeviceInspectionJobDetailItemDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinspectionjob/DeviceInspectionJobDetailItemDO.java new file mode 100644 index 0000000..e6c13df --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinspectionjob/DeviceInspectionJobDetailItemDO.java @@ -0,0 +1,65 @@ +package com.win.module.eam.dal.dataobject.deviceinspectionjob; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; + +/** + * 检修工单子表与备件关系 DO + * + * @author 超级管理员 + */ +@TableName("job_inspection_detail_item") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceInspectionJobDetailItemDO extends BaseDO { + + + /** + * id + */ + @TableId + private Long id; + /** + * 检修工单号 + */ + private String number; + /** + * 检修工单子表id + */ + private Long masterId; + /** + * 数量 + */ + private BigDecimal qty; + /** + * 故障描述 + */ + private String describes; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + /** + * 备件号 + */ + private String itemNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinspectionjob/DeviceInspectionJobMainDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinspectionjob/DeviceInspectionJobMainDO.java new file mode 100644 index 0000000..166febc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinspectionjob/DeviceInspectionJobMainDO.java @@ -0,0 +1,151 @@ +package com.win.module.eam.dal.dataobject.deviceinspectionjob; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 检修工单主 DO + * + * @author 超级管理员 + */ +@TableName("job_inspection_main") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceInspectionJobMainDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + + /** + * 部门id + */ + private Long deptId; + /** + * 编号唯一标识 + */ + private String number; + /** + * 维修工单号 + */ + private String maintenanceNumber; + /** + * 设备模具 + */ + private String deviceNumber; + /** + * 厂区编号 + */ + private String factoryAreaNumber; + /** + * 描述 + */ + private String describes; + /** + * 维修人 + */ + private Long maintenance; + + /** + * 验证人 + */ + private Long verifyer; + + /** + * 验证内容 + */ + private String verifyContent; + + /** + * 验证时间 + */ + private LocalDateTime verifyTime; + /** + * 完成时间 + */ + private LocalDateTime completionTime; + /** + * 接单时间 + */ + private LocalDateTime receivingTime; + /** + * 维修人联系电话 + */ + private String maintenancePhone; + /** + * 状态 + */ + private String status; + /** + * 类型 + */ + private String type; + /** + * 故障类型 + */ + private String faultType; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + + /** + * 厂区名称 + */ + @TableField(exist = false) + private String factoryAreaName; + + /** + * 模具还是设备 + */ + @TableField(exist = false) + private String typeName; + + /** + * 状态名称 + */ + @TableField(exist = false) + private String statusName; + + /** + * 维修人 + */ + @TableField(exist = false) + private String maintenanceName; + + /** + * 设备、模具名称 + */ + @TableField(exist = false) + private String name; + + /** + * 故障名称 + */ + @TableField(exist = false) + private String faultTypeName; + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinspectionjob/DeviceInspectionReportDo.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinspectionjob/DeviceInspectionReportDo.java new file mode 100644 index 0000000..ee9f386 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinspectionjob/DeviceInspectionReportDo.java @@ -0,0 +1,90 @@ +package com.win.module.eam.dal.dataobject.deviceinspectionjob; + +import lombok.*; + +/** + * @ClassName DeviceMaintainJobReportDo + * @Description TODO + * @Author longlongxiaogege + * @Date 2024/4/18 11:47 + * @Version 1.0 + */ +@Data +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceInspectionReportDo { + /** + * id + */ + private String id; + /** + * 序号 + */ + private String rowNum; + /** + * 故障类型 + */ + private String label; + /** + * 设备编号 + */ + private String deviceNumber; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备部位 + */ + private String equipmentParts; + /** + * 保养内容 + */ + private String contents; + /** + * 人数 + */ + private String peoples; + /** + * 预计完成时间 + */ + private String estimatedMinutes; + /** + * 责任人 + */ + private String chargePeoples; + /** + * 完成状态 + */ + private String status; + /** + * 完成时间 + */ + private String completionTime; + /** + * 备件名称 + */ + private String itemName; + /** + * 备件个数 + */ + private String qty; + /** + * 未完成原因 + */ + private String uncompleted; + /** + * 操作人 + */ + private Long maintenance; + /** + * 工程师确认 + */ + private String engineer; + + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinternalaudit/DeviceInternalAuditDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinternalaudit/DeviceInternalAuditDO.java new file mode 100644 index 0000000..f753645 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceinternalaudit/DeviceInternalAuditDO.java @@ -0,0 +1,95 @@ +package com.win.module.eam.dal.dataobject.deviceinternalaudit; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; + +/** + * 设备内审业务说明 DO + * + * @author 超级管理员 + */ +@TableName("record_device_internal_audit") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceInternalAuditDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String number; + /** + * 描述 + */ + private String describes; + /** + * 人员 + */ + private String personer; + /** + * 装配 + */ + private Integer fitOut; + /** + * 涂装 + */ + private Integer coating; + /** + * 注塑 + */ + private Integer injectionMolding; + /** + * 商务 + */ + private Integer business; + /** + * 实验室 + */ + private Integer laboratory; + /** + * IT + */ + private Integer it; + /** + * 质量保障部 + */ + private Integer qualityDepartment; + /** + * 物流 + */ + private Integer materialFlow; + /** + * 模具前期 + */ + private Integer moldPre; + + /** + * 平均分 + */ + private BigDecimal average; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceitem/DeviceItemDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceitem/DeviceItemDO.java new file mode 100644 index 0000000..780d0bb --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/deviceitem/DeviceItemDO.java @@ -0,0 +1,50 @@ +package com.win.module.eam.dal.dataobject.deviceitem; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +/** + * 设备备件关系 DO + * + * @author 超级管理员 + */ +@TableName("rel_device_item") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceItemDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 备件代码 + */ + private String itemNumber; + /** + * 设备代码 + */ + private String deviceNumber; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/DeviceMaintainJobDetailDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/DeviceMaintainJobDetailDO.java new file mode 100644 index 0000000..b4f7cc5 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/DeviceMaintainJobDetailDO.java @@ -0,0 +1,125 @@ +package com.win.module.eam.dal.dataobject.devicemaintainjob; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +/** + * 保养工单子 DO + * + * @author 超级管理员 + */ +@TableName("job_maintain_detail") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceMaintainJobDetailDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 主表id + */ + private Long masterId; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + /** + * 内容 + */ + private String name; + /** + * 检修工单号与主表一致 + */ + private String number; + /** + * 人数 + */ + private Integer peoples; + /** + * 预计分钟 + */ + private Integer estimatedMinutes; + /** + * 实际分钟 + */ + private Integer actualMinutes; + /** + * 责任人多选 + */ + private String chargePeoples; + /** + * 完成时间 + */ + private LocalDateTime completionTime; + /** + * 工程师确认 + */ + private String engineer; + /** + * 未完成原因 + */ + private String uncompleted; + /** + * 是否完成0 1 + */ + private String status; + /** + * 维修内容 + */ + private String contents; + + /** + * 保养部位 + */ + private String equipmentParts; + + /** + * 用于组装返回备件和数量 + */ + @TableField(exist = false) + private List> items; + + /** + * 责任人姓名 + */ + @TableField(exist = false) + private String chargePeoplesName; + + /** + * 状态名称 + */ + @TableField(exist = false) + private String statusName; + + + /** + * 备件列表 + */ + @TableField(exist = false) + private List> itemNumbers; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/DeviceMaintainJobMainDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/DeviceMaintainJobMainDO.java new file mode 100644 index 0000000..c2b1d29 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/DeviceMaintainJobMainDO.java @@ -0,0 +1,182 @@ +package com.win.module.eam.dal.dataobject.devicemaintainjob; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 保养工单主 DO + * + * @author 超级管理员 + */ +@TableName("job_maintain_main") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceMaintainJobMainDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String number; + + + /** + * 故障类型 + */ + private String faultType; + /** + * 内容 + */ + private String describes; + + /** + * 工程师审核意见 + */ + private String verifyContent; + /** + * 保养计划单号 + */ + private String planNumber; + /** + * 设备/模具编号 + */ + private String deviceNumber; + + /** + * 审核人 + */ + private Long verifyer; + /** + * 厂区编号 + */ + private String factoryAreaNumber; + /** + * 工单所属周期 + */ + private String executePeriod; + /** + * 工单所属次数 + */ + private String times; + /** + * 接单人 + */ + private Long maintenance; + /** + * 接单时间 + */ + private LocalDateTime receiveTime; + /** + * 完成时间 + */ + private LocalDateTime completionTime; + /** + * 验证时间 + */ + private LocalDateTime verifyTime; + + /** + * 状态 + */ + private String status; + /** + * 类型 + */ + private String type; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + + /** + * 部门 + */ + private Long deptId; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + + /** + * 模具 设备名称 + */ + @TableField(exist = false) + private String name; + + /** + * 厂区名称 + */ + @TableField(exist = false) + private String factoryAreaName; + + /** + * 模具还是设备 + */ + @TableField(exist = false) + private String typeName; + + /** + * 部门名称 + */ + @TableField(exist = false) + private String deptName; + + /** + * 维修人 + */ + @TableField(exist = false) + private String maintenanceName; + + /** + * 维修人 + */ + @TableField(exist = false) + private String faultTypeName; + + /** + * 状态 + */ + @TableField(exist = false) + private String statusName; + + /** + * 周期 + */ + private String cycle; + + /** + * 周期-月 + */ + private String cycleMonth; + + /** + * 周期-周 + */ + private String cycleWeek; + + /** + * 验证人 + */ + @TableField(exist = false) + private String verifyName; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/DeviceMaintainJobMainDOExpand.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/DeviceMaintainJobMainDOExpand.java new file mode 100644 index 0000000..e8caebd --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/DeviceMaintainJobMainDOExpand.java @@ -0,0 +1,33 @@ +package com.win.module.eam.dal.dataobject.devicemaintainjob; + +import lombok.*; + +/** + * 保养工单主 DO + * + * @author 超级管理员 + */ +//@TableName("job_maintain_main") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor +public class DeviceMaintainJobMainDOExpand extends DeviceMaintainJobMainDO { + + /** + * 保养类型 + */ + private String maintenanceType; + + /** + * 保养周期 + */ + private String periodCycle; + + /** + * 周期名称 + */ + private String cycleName; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/DeviceMaintainJobReportDo.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/DeviceMaintainJobReportDo.java new file mode 100644 index 0000000..5d3d75e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/DeviceMaintainJobReportDo.java @@ -0,0 +1,90 @@ +package com.win.module.eam.dal.dataobject.devicemaintainjob; + +import lombok.*; + +/** + * @ClassName DeviceMaintainJobReportDo + * @Description TODO + * @Author longlongxiaogege + * @Date 2024/4/18 11:47 + * @Version 1.0 + */ +@Data +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceMaintainJobReportDo { + /** + * id + */ + private String id; + /** + * 序号 + */ + private String rowNum; + /** + * 故障类型 + */ + private String label; + /** + * 设备编号 + */ + private String deviceNumber; + /** + * 设备名称 + */ + private String deviceName; + /** + * 设备部位 + */ + private String equipmentParts; + /** + * 保养内容 + */ + private String contents; + /** + * 人数 + */ + private String peoples; + /** + * 预计完成时间 + */ + private String estimatedMinutes; + /** + * 责任人 + */ + private String chargePeoples; + /** + * 完成状态 + */ + private String status; + /** + * 完成时间 + */ + private String completionTime; + /** + * 备件名称 + */ + private String itemName; + /** + * 备件个数 + */ + private String qty; + /** + * 未完成原因 + */ + private String uncompleted; + /** + * 操作人 + */ + private Long maintenance; + /** + * 工程师确认 + */ + private String engineer; + + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/MaintainJobDetailItemDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/MaintainJobDetailItemDO.java new file mode 100644 index 0000000..8be81e3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainjob/MaintainJobDetailItemDO.java @@ -0,0 +1,64 @@ +package com.win.module.eam.dal.dataobject.devicemaintainjob; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; + +/** + * 保养工单子表与备件关系 DO + * + * @author 超级管理员 + */ +@TableName("job_maintain_detail_item") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MaintainJobDetailItemDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 检修工单号 + */ + private String number; + /** + * 检修工单子表id + */ + private Long masterId; + /** + * 数量 + */ + private BigDecimal qty; + /** + * 故障描述 + */ + private String describes; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + /** + * 备件号 + */ + private String itemNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainplan/DeviceMaintainPlanDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainplan/DeviceMaintainPlanDO.java new file mode 100644 index 0000000..ec18221 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintainplan/DeviceMaintainPlanDO.java @@ -0,0 +1,83 @@ +package com.win.module.eam.dal.dataobject.devicemaintainplan; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +/** + * 保养计划 DO + * + * @author 超级管理员 + */ +@TableName("plan_maintain") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceMaintainPlanDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String number; + /** + * 名称 + */ + private String name; + /** + * 编号 + */ + private String deviceNumber; + /** + * 保养类型 + */ + private String maintenanceType; + /** + * 设备执行周期、半年、年 + */ + private String cycle; + /** + * 周期-月 + */ + private String cycleMonth; + + /** + * 周期-周 + */ + private String cycleWeek; + /** + * 次数 + */ + private Long times; + /** + * 类型 + */ + private String type; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + /** + * 部门id + */ + private Long deptId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintenancejob/DeviceMaintenanceJobDetailDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintenancejob/DeviceMaintenanceJobDetailDO.java new file mode 100644 index 0000000..3021b0f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintenancejob/DeviceMaintenanceJobDetailDO.java @@ -0,0 +1,83 @@ +package com.win.module.eam.dal.dataobject.devicemaintenancejob; + +import lombok.*; +import java.util.*; + +import com.baomidou.mybatisplus.annotation.*; +import com.win.framework.mybatis.core.dataobject.BaseDO; + +/** + * 维修工单子 DO + * + * @author 超级管理员 + */ +@TableName("job_maintenance_detail") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceMaintenanceJobDetailDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + + private Long masterId; + /** + * 名称 + */ + private String name; + /** + * 维修工单号 + */ + private String number; + /** + * 故障描述 + */ + private String describes; + /** + * 故障真因 + */ + private String describes1; + /** + * 解决措施 + */ + private String workOut; + /** + * 维修人员字符串多个 + */ + private String maintenances; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + + /** + * 备件拼接参数 + */ + @TableField(exist = false) + private List> items; + + /** + * 人员名称 + */ + @TableField(exist = false) + private String maintenancesName; + + @TableField(exist = false) + private List> itemNumbers; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintenancejob/DeviceMaintenanceJobDetailItemDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintenancejob/DeviceMaintenanceJobDetailItemDO.java new file mode 100644 index 0000000..a5313e1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintenancejob/DeviceMaintenanceJobDetailItemDO.java @@ -0,0 +1,64 @@ +package com.win.module.eam.dal.dataobject.devicemaintenancejob; + +import lombok.*; + +import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.*; +import com.win.framework.mybatis.core.dataobject.BaseDO; + +/** + * 维修工单子表与备件关系 DO + * + * @author 超级管理员 + */ +@TableName("job_maintenance_detail_item") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceMaintenanceJobDetailItemDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 维修工单子表id + */ + private Long masterId; + /** + * 维修工单号 + */ + private String number; + /** + * 数量 + */ + private BigDecimal qty; + /** + * 故障描述 + */ + private String describes; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + + /** + * 并发乐观锁 + */ + private String itemNumber; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintenancejob/DeviceMaintenanceJobMainDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintenancejob/DeviceMaintenanceJobMainDO.java new file mode 100644 index 0000000..50ddabd --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemaintenancejob/DeviceMaintenanceJobMainDO.java @@ -0,0 +1,223 @@ +package com.win.module.eam.dal.dataobject.devicemaintenancejob; + +import com.baomidou.mybatisplus.annotation.*; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 维修工单主 DO + * + * @author 超级管理员 + */ +@TableName("job_maintenance_main") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceMaintenanceJobMainDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String number; + /** + * 报修工单申请号 + */ + private String requestNumber; + /** + * 描述 + */ + private String describes; + + /** + * 描述1 + */ + private String describes1; + /** + * 设备模具编号 + */ + private String deviceNumber; + /** + * 厂区编号 + */ + private String factoryAreaNumber; + /** + * 维修人 + */ + @TableField(updateStrategy = FieldStrategy.IGNORED) + private Long maintenance; + + /** + * 验证人 + */ + private Long verifyer; + + + + /** + * 报修人联系电话 + */ + private String maintenancePhone; + + /** + * 申请确认内容 + */ + private String applyContent; + + /** + * 验证确认内容 + */ + private String verifyContent; + + /** + * 申请人 + */ + private Long applyer; + + + + /** + * 验证时间 + */ + private LocalDateTime applyTime; + /** + * 状态 + */ + private String status; + /** + * 类型设备 + */ + private String type; + /** + * 结果临时措施还是已完成 + */ + private String result; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + + /** + * 部门id + */ + private Long deptId; + + /** + * 班次 + */ + private String classes; + + /** + * 验证时间 + */ + private LocalDateTime verifyTime; + + /** + * 接单时间 + */ + @TableField(updateStrategy = FieldStrategy.IGNORED) + private LocalDateTime receivingTime; + + /** + * 完成时间 + */ + @TableField(updateStrategy = FieldStrategy.IGNORED) + private LocalDateTime completionTime; + /** + * 维修时间 + */ + private String maintenanceTime; + /** + * 故障类型枚举EM、CM、 PM + */ + private String faultType; + + /** + * 模具 设备名称 + */ + @TableField(exist = false) + private String name; + + /** + * 厂区名称 + */ + @TableField(exist = false) + private String factoryAreaName; + + /** + * 模具还是设备 + */ + @TableField(exist = false) + private String typeName; + + /** + * 部门名称 + */ + @TableField(exist = false) + private String deptName; + + /** + * 维修人 + */ + @TableField(exist = false) + private String maintenanceName; + + /** + * 维修人 + */ + @TableField(exist = false) + private String faultTypeName; + /** + * 班次 + */ + @TableField(exist = false) + private String classesName; + + /** + * 报修申请图片列表 + */ + @TableField(exist = false) + private List filePathList; + + /** + * 是否有子单 + **/ + @TableField(exist = false) + private boolean hasDetails; + + /** + * 报修人 + **/ + @TableField(exist = false) + private Long declarer; + + + @TableField(exist = false) + private String verifyName; + + /** + * 申请人名称 + */ + @TableField(exist = false) + private String applyName; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemolditems/DeviceMoldItemsDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemolditems/DeviceMoldItemsDO.java new file mode 100644 index 0000000..c87357e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemolditems/DeviceMoldItemsDO.java @@ -0,0 +1,106 @@ +package com.win.module.eam.dal.dataobject.devicemolditems; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +/** + * 项记录表(设备 模具 保养 维修 巡检点检) DO + * + * @author 超级管理员 + */ +@TableName("record_device_mold_items") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceMoldItemsDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 保养内容 + */ + private String name; + /** + * 设备/模具编号 + */ + private String deviceNumber; + /** + * 类型设备、模具枚举 + */ + private String type; + /** + * 项类型枚举维修、保养、巡检点检 + */ + private String status; + + /** + * 设备执行周期、半年、年 + */ + private String executionCycle; + + /** + * 特殊周期-月 + */ + private String executionCycleMonth; + + /** + * 特殊周期-周 + */ + private String executionCycleWeek; + + /** + * 设备部位 + */ + private String equipmentParts; + + /** + * 人数 + */ + private Integer peoples; + + /** + * 预计所需时间 + */ + private Integer estimatedMinutes; + +// maintenance_time +// /** +// * 预计所需时间 +// */ +// private Integer estimatedMinutes; + + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + /** + * 是否符合TRUE/FALSE + */ + @TableField(exist = false) + private String isConform; + + /** + * 设备/模具名称 + */ + @TableField(exist = false) + private String deviceName; +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemolditemshistory/DeviceMoldItemsHistoryDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemolditemshistory/DeviceMoldItemsHistoryDO.java new file mode 100644 index 0000000..cea96a5 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicemolditemshistory/DeviceMoldItemsHistoryDO.java @@ -0,0 +1,103 @@ +package com.win.module.eam.dal.dataobject.devicemolditemshistory; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; + +/** + * 项记录历史表(设备 模具 保养 维修 巡检点检) DO + * + * @author Lu.jl + */ +@TableName("record_device_mold_items_history") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceMoldItemsHistoryDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 父id + */ + private Long masterId; + /** + * 保养内容 + */ + private String name; + /** + * 设备模具编号 + */ + private String deviceNumber; + /** + * 执行周期月、季度、半年、年 + */ + private String executionCycle; + /** + * 特殊周期-月 + */ + private String executionCycleMonth; + /** + * 特殊周期-周 + */ + private String executionCycleWeek; + /** + * 设备部位 + */ + private String equipmentParts; + /** + * 类型设备、模具枚举 + */ + private String type; + /** + * 项类型枚举维修、保养、巡检点检 + */ + private String status; + /** + * 人数 + */ + private Integer peoples; + /** + * 预计所需时间 + */ + private Integer estimatedMinutes; + /** + * 备注 + */ + private String remark; + /** + * 操作类型 + */ + private String operatType; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + private Integer concurrencyStamp; + /** + * 人数 + */ + private Integer peopleNum; + /** + * 保养所需时间(单位小时) + */ + private BigDecimal maintenanceTime; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicerepairrequest/DeviceRepairRequestDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicerepairrequest/DeviceRepairRequestDO.java new file mode 100644 index 0000000..e9d0f0e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicerepairrequest/DeviceRepairRequestDO.java @@ -0,0 +1,119 @@ +package com.win.module.eam.dal.dataobject.devicerepairrequest; + +import lombok.*; +import java.util.*; + +import com.baomidou.mybatisplus.annotation.*; +import com.win.framework.mybatis.core.dataobject.BaseDO; + +/** + * 报修申请 DO + * + * @author 超级管理员 + */ +@TableName("request_repair") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceRepairRequestDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String number; + /** + * 描述 + */ + private String describes; + /** + * 设备模具编号 + */ + private String deviceNumber; + /** + * 厂区编号 + */ + private String factoryAreaNumber; + /** + * 报修人 + */ + private Long declarer; + /** + * 报修人联系电话 + */ + private String declarerPhone; + /** + * 故障类型枚举EM、CM、 PM + */ + private String faultType; + /** + * 类型 + */ + private String type; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + /** + * 部门id + */ + private Long deptId; + + /** + * 结果 + */ + private String result; + /** + * 部门名称 + */ + @TableField(exist = false) + private String departName; + /** + * 维修人名称 + */ + @TableField(exist = false) + private String declarName; + + /** + * 模具 设备名称 + */ + @TableField(exist = false) + private String name; + + /** + * 厂区名称 + */ + @TableField(exist = false) + private String factoryAreaName; + + /** + * 是否撤销0可以点击1不能点击 + */ + @TableField(exist = false) + private String isCancel; + + /** + * 报修申请图片列表 + */ + @TableField(exist = false) + private List filePathList; + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailDO.java new file mode 100644 index 0000000..9e6a62f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailDO.java @@ -0,0 +1,63 @@ +package com.win.module.eam.dal.dataobject.devicespotinspectionrecord; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.win.framework.mybatis.core.dataobject.BaseDO; + +/** + * 巡检点检记录子 DO + * + * @author 超级管理员 + */ +@TableName("record_spot_inspection_detail") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceSpotInspectionRecordDetailDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 主表id + */ + private Long masterId; + /** + * 名称 + */ + private String name; + /** + * 设备部位 + */ + private String equipmentPosition; + /** + * 检修工单号与主表一致 + */ + private String number; + /** + * 是否符合TRUE/FALSE + */ + private String isConform; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicespotinspectionrecord/DeviceSpotInspectionRecordMainDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicespotinspectionrecord/DeviceSpotInspectionRecordMainDO.java new file mode 100644 index 0000000..7cca279 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/devicespotinspectionrecord/DeviceSpotInspectionRecordMainDO.java @@ -0,0 +1,154 @@ +package com.win.module.eam.dal.dataobject.devicespotinspectionrecord; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.win.framework.mybatis.core.dataobject.BaseDO; + +/** + * 检修工单主 DO + * + * @author 超级管理员 + */ +@TableName("record_spot_inspection_main") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeviceSpotInspectionRecordMainDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String number; + /** + * 设备模具 + */ + private String deviceNumber; + /** + * 描述 + */ + private String describes; + /** + * 工程师审批意见 + */ + private String approveOpinion; + /** + * 维修人 + */ + private Long maintenance; + + /** + * 验证人 + */ + private Long verifyer; + + /** + * 验证时间 + */ + private LocalDateTime verifyTime; + /** + * 完成时间 + */ + private LocalDateTime completionTime; + /** + * 维修人联系电话 + */ + private String maintenancePhone; + /** + * 状态 + */ + private String status; + /** + * 类型 + */ + private String type; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + + /** + * 班次 + */ + private String classes; + + /** + * 部门 + */ + private Long deptId; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + + /** + * 模具 设备名称 + */ + @TableField(exist = false) + private String name; + + /** + * 厂区名称 + */ + @TableField(exist = false) + private String factoryAreaName; + + /** + * 厂区编码 + */ + @TableField(exist = false) + private String factoryAreaNumber; + + /** + * 模具还是设备 + */ + @TableField(exist = false) + private String typeName; + + /** + * 部门名称 + */ + @TableField(exist = false) + private String deptName; + + /** + * 维修人 + */ + @TableField(exist = false) + private String maintenanceName; + + /** + * 状态 + */ + @TableField(exist = false) + private String statusName; + + /** + * 班次名称 + */ + @TableField(exist = false) + private String classesName; + + /** + * 验证人 + */ + @TableField(exist = false) + private String verifyName; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/factoryarea/FactoryAreaDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/factoryarea/FactoryAreaDO.java new file mode 100644 index 0000000..ffc0bfc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/factoryarea/FactoryAreaDO.java @@ -0,0 +1,62 @@ +package com.win.module.eam.dal.dataobject.factoryarea; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +/** + * 厂区 DO + * + * @author 超级管理员 + */ +@TableName("basic_factory_area") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FactoryAreaDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 厂区编号 + */ + private String number; + /** + * 名称 + */ + private String name; + /** + * 描述 + */ + private String description; + /** + * 负责人 + */ + private String leader; + /** + * 负责人电话 + */ + private String leaderPhone; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/fixedassets/FixedAssetsDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/fixedassets/FixedAssetsDO.java new file mode 100644 index 0000000..161819c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/fixedassets/FixedAssetsDO.java @@ -0,0 +1,109 @@ +package com.win.module.eam.dal.dataobject.fixedassets; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 固定资产 DO + * + * @author 超级管理员 + */ +@TableName("basic_fixed_assets") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FixedAssetsDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String number; + /** + * 资产名称 + */ + private String name; + /** + * 会计单位 + */ + private String accountingUnit; + /** + * 规格型号 + */ + private String specifications; + /** + * 库位编号 + */ + private String locationNumber; + /** + * 投入使用时间 + */ + private LocalDateTime beginUseDate; +// /** +// * 采购部门 +// */ +// private String purchaseDept; + /** + * 供应商编号 + */ + private String supplierNumber; + /** + * 出厂日期 + */ + private LocalDateTime productionDate; +// /** +// * 购买价格 +// */ +// private BigDecimal purchasePrice; + /** + * 管理部门 + */ + private String manageDept; + /** + * 单位 + */ + private String unit; + /** + * 数量 + */ + private BigDecimal qty; + /** + * 期间费用科目描述 + */ + private String costSubjectDesc; + /** + * 使用人 + */ + private String user; + /** + * 状态 + */ + private String status; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/item/ItemDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/item/ItemDO.java new file mode 100644 index 0000000..2293a44 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/item/ItemDO.java @@ -0,0 +1,194 @@ +package com.win.module.eam.dal.dataobject.item; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +/** + * 备件 DO + * + * @author 超级管理员 + */ +@TableName("basic_item") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ItemDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String number; + /** + * 名称 + */ + private String name; + /** + * 品牌 + */ + private String brand; + /** + * 规格型号 + */ + private String specifications; + /** + * 是否存储TRUE/FALSE + */ + private String isConstant; + + /** + * 是否全局TRUE/FALSE + */ + private String isOverall; + /** + * 科目代码枚举工具、易耗品、机物料、备品备件、辅材 + */ + private String subject; + /** + * 科目代码 + */ + private String subjectCode; + /** + * 区域 + */ + private String region; + + /** + * 枚举分类 A、B、C + */ + private String classification; + /** + * 单位 + */ + private String uom; + /** + * 单价 + */ + private BigDecimal singlePrice; + /** + * 重点采购 + */ + private Long reprocurement; + /** + * 安全库存 + */ + private Long safetyStock; + /** + * 成本中心 + */ + private String cost; + /** + * 采购员 + */ + private String purchaser; + /** + * 财务 + */ + private String financer; + /** + * 是否框架协议TRUE/FALSE + */ + private String isFramework; + /** + * 是否以旧换新TRUE/FALSE + */ + private String isRadeIn; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + + /** + * 采购时间 + */ + private LocalDateTime purchaseTime; + + /** + * 库龄 + */ + private Long stockAge; + /** + * 类别 + */ + private String category; + /** + * 描述 + */ + private String describes; + /** + * 库存数量 + */ + @TableField(exist = false) + private BigDecimal qty; + /** + * 库位编码 + */ + @TableField(exist = false) + private String locationNumber; + /** + * 库区编码 + */ + @TableField(exist = false) + private String areaNumber; + /** + * 是否账内账外 + */ + @TableField(exist = false) + private String isInAccount; + /** + * 备件编码 + */ + @TableField(exist = false) + private String itemNumber; + /** + * 备件名称 + */ + @TableField(exist = false) + private String itemName; + + /** + * 采购订单已入库数量 + */ + @TableField(exist = false) + private BigDecimal deliveryQty; + + /** + * 采购订单申请数量 + */ + @TableField(exist = false) + private BigDecimal applyQty; + + /** + * 采购订单申请数量 + */ + @TableField(exist = false) + private List> list; + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemaccounts/ItemAccountsDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemaccounts/ItemAccountsDO.java new file mode 100644 index 0000000..ceacd09 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemaccounts/ItemAccountsDO.java @@ -0,0 +1,195 @@ +package com.win.module.eam.dal.dataobject.itemaccounts; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 备件台账 DO + * + * @author 超级管理员 + */ +@TableName("basic_item_accounts") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ItemAccountsDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 备件编号 + */ + private String itemNumber; + /** + * 库区编号 + */ + private String areaNumber; + /** + * 库位编号 + */ + private String locationNumber; + /** + * 库存数量 + */ + private BigDecimal qty; + /** + * 是否账内库TRUE账内FALSE账外 + */ + private String isInAccount; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + + /** + * 名称 + */ + @TableField(exist = false) + private String name; + /** + * 品牌 + */ + @TableField(exist = false) + private String brand; + /** + * 规格型号 + */ + @TableField(exist = false) + private String specifications; + /** + * 是否存储TRUE/FALSE + */ + @TableField(exist = false) + private String isConstant; + + /** + * 是否全局TRUE/FALSE + */ + @TableField(exist = false) + private String isOverall; + /** + * 科目代码枚举工具、易耗品、机物料、备品备件、辅材 + */ + @TableField(exist = false) + private String subject; + /** + * 科目代码 + */ + @TableField(exist = false) + private String subjectCode; + /** + * 区域 + */ + @TableField(exist = false) + private String region; + + /** + * 枚举分类 A、B、C + */ + @TableField(exist = false) + private String classification; + /** + * 单位 + */ + @TableField(exist = false) + private String uom; + /** + * 单价 + */ + @TableField(exist = false) + private BigDecimal singlePrice; + /** + * 重点采购 + */ + @TableField(exist = false) + private Long reprocurement; + /** + * 安全库存 + */ + @TableField(exist = false) + private Long safetyStock; + /** + * 成本中心 + */ + @TableField(exist = false) + private String cost; + /** + * 采购员 + */ + @TableField(exist = false) + private String purchaser; + /** + * 财务 + */ + @TableField(exist = false) + private String financer; + /** + * 是否框架协议TRUE/FALSE + */ + @TableField(exist = false) + private String isFramework; + /** + * 是否以旧换新TRUE/FALSE + */ + @TableField(exist = false) + private String isRadeIn; + /** + * 是否可用 + */ + @TableField(exist = false) + private String itemAvailable; + /** + * 采购时间 + */ + @TableField(exist = false) + private LocalDateTime purchaseTime; + + /** + * 库龄 + */ + @TableField(exist = false) + private Long stockAge; + /** + * 类别 + */ + @TableField(exist = false) + private String category; + /** + * 描述 + */ + @TableField(exist = false) + private String describes; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + /** + * 事务类型IN、OUT + */ + @TableField(exist = false) + private String transactionType; + + //基础信息备件的属性 + @TableField(exist = false) + private ItemDO itemDO; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemapplyrequest/ItemApplyRequestDetailDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemapplyrequest/ItemApplyRequestDetailDO.java new file mode 100644 index 0000000..8a5a17e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemapplyrequest/ItemApplyRequestDetailDO.java @@ -0,0 +1,106 @@ +package com.win.module.eam.dal.dataobject.itemapplyrequest; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + * 备件申领记录子 DO + * + * @author 超级管理员 + */ +@TableName("request_apply_detail") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ItemApplyRequestDetailDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + + /** + * masterId + */ + private Long masterId; + + /** + * 申领主代码 + */ + private String number; + /** + * 备件代码 + */ + private String itemNumber; + + /** + * 是否以旧换新TRUE/FALSE + */ + private String isRadeIn; + + /** + * 数量 + */ + private BigDecimal qty; + + /** + * 出库接收值 + */ + private BigDecimal receiveQty; + /** + * 库存数量 + */ + private BigDecimal currentQty; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + + /** + * 设备模具 + */ + private String deviceNumber; + + /** + * 设备模具类型 + */ + private String type; + + /** + * 子项接收结果接收中 RECEIVE 完成 COMPLETED + */ + private String result; + + /** + * 备件台账申领时的价格 + */ + private BigDecimal currentSinglePrice; + + /** + * 备件列表包含备件编码 申请数量 库存数量 设备模具编号 设备模具类型 + */ + @TableField(exist = false) + private List> itemNumbers; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemapplyrequest/ItemApplyRequestMainDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemapplyrequest/ItemApplyRequestMainDO.java new file mode 100644 index 0000000..ad545a4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemapplyrequest/ItemApplyRequestMainDO.java @@ -0,0 +1,128 @@ +package com.win.module.eam.dal.dataobject.itemapplyrequest; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 备件申领记录主 DO + * + * @author 超级管理员 + */ +@TableName("request_apply_main") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ItemApplyRequestMainDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 描述 + */ + private String name; + /** + * 审批时间 + */ + private LocalDateTime approveTime; + /** + * 出库时间 + */ + private LocalDateTime outTime; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + /** + * 编号唯一标识 + */ + private String number; + /** + * 申领人id + */ + private String applyId; + /** + * 申领人部门id + */ + private String applyDeptId; + /** + * 审批人id + */ + private String approveId; + /** + * 出库人id + */ + private String outId; + /** + * 状态 0待审批1审批通过2审批驳回3出库中4完成5撤回 + */ + private String status; + + /** + * 部门 + */ + private Long deptId; + + /** + * 所有备件总价值小于5000 大于5000 + */ + private BigDecimal sumVal; + + /** + * 申领状态名称 + */ + @TableField(exist = false) + private String statusName; + + /** + * 描述 + */ + @TableField(exist = false) + private String describes; + + /** + * 申领人部门名称 + */ + @TableField(exist = false) + private String applyDeptName; + + /** + * 申领人名称 + */ + @TableField(exist = false) + private String applyName; + + /** + * 审批人名称 + */ + @TableField(exist = false) + private String approveName; + + /** + * 出库人名称 + */ + @TableField(exist = false) + private String outName; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/iteminlocation/ItemInLocationDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/iteminlocation/ItemInLocationDO.java new file mode 100644 index 0000000..0484225 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/iteminlocation/ItemInLocationDO.java @@ -0,0 +1,64 @@ +package com.win.module.eam.dal.dataobject.iteminlocation; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; + +/** + * 备件入库记录 DO + * + * @author 超级管理员 + */ +@TableName("record_item_in_location") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ItemInLocationDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 入库编号 + */ + private String number; + /** + * 备件编号 + */ + private String itemNumber; + /** + * 库位编号 + */ + private String locationNumber; + /** + * 入库类型 + */ + private String type; + /** + * 数量 + */ + private BigDecimal qty; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemlocationreplace/ItemLocationReplaceDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemlocationreplace/ItemLocationReplaceDO.java new file mode 100644 index 0000000..cd99b36 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemlocationreplace/ItemLocationReplaceDO.java @@ -0,0 +1,56 @@ +package com.win.module.eam.dal.dataobject.itemlocationreplace; + +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("record_item_location_replace") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ItemLocationReplaceDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 库位编码 + */ + private String locationNumber; + /** + * 描述 + */ + private String ranks; + /** + * 变更前备件编码 + */ + private String oldItemNumber; + /** + * 变更后备件编码 + */ + private String itemNumber; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemmaintenancerecord/ItemMaintenanceRecordDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemmaintenancerecord/ItemMaintenanceRecordDO.java new file mode 100644 index 0000000..b6a32d8 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemmaintenancerecord/ItemMaintenanceRecordDO.java @@ -0,0 +1,86 @@ +package com.win.module.eam.dal.dataobject.itemmaintenancerecord; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; + +/** + * 备件维修记录 DO + * + * @author 超级管理员 + */ +@TableName("record_maintenance_item") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ItemMaintenanceRecordDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 代码 + */ + private String number; + /** + * 备件代码 + */ + private String itemNumber; + /** + * 数量 + */ + private BigDecimal qty; + /** + * 维修结果YES、NO + */ + private String result; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + + /** + * 是否可用 + */ + private Long deptId; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + + /** + * 维修原因 + */ + private String reasons; + /** + * 维修结果 + */ + @TableField(exist = false) + private String resultName; + /** + * 备件名称 + */ + @TableField(exist = false) + private String itemName; + /** + * 操作人 + */ + @TableField(exist = false) + private String userName; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemorder/ItemOrderDetailDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemorder/ItemOrderDetailDO.java new file mode 100644 index 0000000..a913f47 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemorder/ItemOrderDetailDO.java @@ -0,0 +1,120 @@ +package com.win.module.eam.dal.dataobject.itemorder; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 备件采购订单子 DO + * + * @author 超级管理员 + */ +@TableName("order_item_detail") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ItemOrderDetailDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + + /** + * masterId + */ + private Long masterId; + + /** + * 订单号 + */ + private String number; + /** + * 序号 + */ + private Long serialNumber; + /** + * 申请单号唯一标识 + */ + private String requestNo; + /** + * 申请人 + */ + private String requestPerson; + /** + * 备件代码 + */ + private String itemNumber; + /** + * 备件名称 + */ + private String itemName; + /** + * 科目代码 + */ + private String subjectCode; + /** + * 规格型号 + */ + private String specifications; + /** + * 到货日期 + */ + private LocalDateTime deliveryTime; + /** + * 单位 + */ + private String uom; + /** + * 数量 + */ + private BigDecimal qty; + + /** + * 收货数量 + */ + private BigDecimal deliveryQty; + /** + * 价格 + */ + private BigDecimal singlePrice; + /** + * 含税价格 + */ + private BigDecimal taxPrice; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + + /** + * 接收备件状态 未完成INCOMPLETE 完成COMPLETE + */ + private String status; + /** + * 状态名称 + */ + @TableField(exist = false) + private String statusName; + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemorder/ItemOrderMainDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemorder/ItemOrderMainDO.java new file mode 100644 index 0000000..562b3a9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemorder/ItemOrderMainDO.java @@ -0,0 +1,122 @@ +package com.win.module.eam.dal.dataobject.itemorder; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.time.LocalDate; + +/** + * 备件采购订单主 DO + * + * @author 超级管理员 + */ +@TableName("order_item_main") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ItemOrderMainDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 订单号唯一标识 + */ + private String number; + /** + * 日期 + */ + private LocalDate date; + /** + * 电话 + */ + private String phone; + /** + * 传真 + */ + private String fax; + /** + * 采购员 + */ + private String purchaser; + /** + * 供应商编号 + */ + private String supplierNumber; + /** + * 供应商名称 + */ + private String supplierName; + /** + * 供应商地址 + */ + private String supplierAddress; + /** + * 发货至 + */ + private String shipTo; + /** + * 开票至 + */ + private String invoiceTo; + /** + * 联系人 + */ + private String contacts; + /** + * 联系电话 + */ + private String contactsPhone; + /** + * 付款方式 + */ + private String paymentType; + /** + * 注册地 + */ + private String registLocation; + /** + * 开户行 + */ + private String bank; + /** + * 账号 + */ + private String account; + /** + * 税号 + */ + private String dutyParagraph; + /** + * 地点ID + */ + private String siteId; + /** + * 接收备件状态 未完成INCOMPLETE 完成COMPLETE + */ + private String status; + /** + * 状态打开/关闭 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + /** + * 状态名称 + */ + @TableField(exist = false) + private String statusName; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemoutlocation/ItemOutLocationDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemoutlocation/ItemOutLocationDO.java new file mode 100644 index 0000000..91f7473 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/itemoutlocation/ItemOutLocationDO.java @@ -0,0 +1,64 @@ +package com.win.module.eam.dal.dataobject.itemoutlocation; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; + +/** + * 备件出库记录 DO + * + * @author 超级管理员 + */ +@TableName("record_item_out_location") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ItemOutLocationDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 出库编号 + */ + private String number; + /** + * 备件编号 + */ + private String itemNumber; + /** + * 库位编号 + */ + private String locationNumber; + /** + * 出库类型 + */ + private String type; + /** + * 数量 + */ + private BigDecimal qty; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/JsonTask.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/JsonTask.java new file mode 100644 index 0000000..e6b4778 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/JsonTask.java @@ -0,0 +1,43 @@ +package com.win.module.eam.dal.dataobject.json; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.UUID; + +/** + * QAD接口生成生成任务jsonTask所需的实体 + */ +@Component +@Data +public class JsonTask { + //任务id自己造一个,) + @JSONField(name = "TaskID") + UUID TaskID; + //表名,如果是带有主子表的话,表名是主表的表名 + @JSONField(name = "TableName") + String TableName; + + @JSONField(name = "DataCount") + //数据的条数(明细的) + int DataCount; + + //(自己系统的名字) + @JSONField(name = "Creator") + String Creator; + //产生业务的操作者 + @JSONField(name = "CreateUser") + String CreateUser; + //QAD域 + @JSONField(name = "Domain") + + String Domain; + //QAD地点 + @JSONField(name = "Site") + String Site; + //时间 + @JSONField(name = "CreateTime",format = "yyyy-MM-dd HH:MM:SS") + LocalDateTime CreateTime; +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/MasterSlaveTask.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/MasterSlaveTask.java new file mode 100644 index 0000000..7f11e1f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/MasterSlaveTask.java @@ -0,0 +1,20 @@ +package com.win.module.eam.dal.dataobject.json; + +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.util.List; +@Data +@Component +public class MasterSlaveTask { + //获取到的 + String sessionId; + //任务 + List jsonTask; + //主表数据 + List jsonMaster; + //子表数据 + List jsonSlave; + //是否压缩 + String zipped; +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedIssunpDet.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedIssunpDet.java new file mode 100644 index 0000000..e10e145 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedIssunpDet.java @@ -0,0 +1,69 @@ +package com.win.module.eam.dal.dataobject.json; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.UUID; + +/** + * 领用出库子表 + */ +@Data +@Component +public class TedIssunpDet { + @JSONField(name = "DataID") + UUID DataID;//(一个新的,不重复行) + @JSONField(name = "CommandType") + String CommandType;//命令类型--赋值A + @JSONField(name = "TaskID") + UUID TaskID;//任务编号 + @JSONField(name = "Remark") + String Remark;//备注 + @JSONField(name = "CreateTime",format = "yyyy-MM-dd HH:MM:SS") + LocalDateTime CreateTime;//创建时间 + @JSONField(name = "CreateUser") + String CreateUser;// 创建人 + @JSONField(name = "UID") + int UID;// + @JSONField(name = "GUID") + UUID GUID;//UUID(一个新的,不重复行) + @JSONField(name = "Project") + String Project;// 项目 + @JSONField(name = "CcAccount") + String CcAccount;// 成本中心 + @JSONField(name = "SubAccount") + String SubAccount;// 分账户 + @JSONField(name = "Domain") + String Domain;// 域 + @JSONField(name = "CreditAccount") + String CreditAccount;// 科目 + @JSONField(name = "Address") + String Address;// 地址 + @JSONField(name = "CustomerNbr") + String CustomerNbr;// 客户单 + @JSONField(name = "Line") + int Line;// 行号 + @JSONField(name = "Reference") + String Reference;// 参考号 + @JSONField(name = "Lot") + String Lot;// 批号 批次 + @JSONField(name = "Location") + String Location;// 库位 erp库位 + @JSONField(name = "Conversion") + String Conversion;// 转换量 + @JSONField(name = "Quantity") + BigDecimal Quantity;// 数量 + @JSONField(name = "Um") + String Um;// 单位 + @JSONField(name = "PartCode") + String PartCode;// 物料号 + @JSONField(name = "UnplanedBillNum") + String UnplanedBillNum;// 单号 + @JSONField(name = "Remarks") + String Remarks;// 备注 + @JSONField(name = "Site") + String Site;// 地点 +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedIssunpMstr.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedIssunpMstr.java new file mode 100644 index 0000000..77dfc55 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedIssunpMstr.java @@ -0,0 +1,43 @@ +package com.win.module.eam.dal.dataobject.json; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.UUID; + +/** + * 领用出库主表 + */ +@Data +@Component +public class TedIssunpMstr { + @JSONField(name = "User") + private String User; + @JSONField(name = "UnplanedBillNum") + private String UnplanedBillNum; + @JSONField(name = "Date",format = "yyyy-MM-dd HH:MM:SS") + private LocalDateTime Date; + @JSONField(name = "Time",format = "yyyy-MM-dd HH:MM:SS") + private LocalDateTime Time; + @JSONField(name = "GUID") + private UUID GUID; + @JSONField(name = "UID") + private int UID; + @JSONField(name = "CreateUser") + private String CreateUser; + @JSONField(name = "CreateTime",format = "yyyy-MM-dd HH:MM:SS") + private LocalDateTime CreateTime; + @JSONField(name = "Remark") + private String Remark; + @JSONField(name = "TaskID") + private UUID TaskID; + @JSONField(name = "CommandType") + private String CommandType; + @JSONField(name = "Domain") + private String Domain; + @JSONField(name = "Site") + private String Site; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedRctunpDet.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedRctunpDet.java new file mode 100644 index 0000000..2e221ee --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedRctunpDet.java @@ -0,0 +1,70 @@ +package com.win.module.eam.dal.dataobject.json; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.UUID; + +/** + * 盘点调整子表 + */ + +@Component +@Data +public class TedRctunpDet { + @JSONField(name = "DataID") + private UUID DataID;// + @JSONField(name = "CommandType") + private String CommandType;// 命令类型 + @JSONField(name = "TaskID") + private UUID TaskID;// 任务编号 + @JSONField(name = "Remark") + private String Remark;// 备注 + @JSONField(name = "CreateTime",format = "yyyy-MM-dd HH:MM:SS") + private LocalDateTime CreateTime;// 创建时间 + @JSONField(name = "CreateUser") + private String CreateUser;// 创建人 + @JSONField(name = "UID") + private int UID;// + @JSONField(name = "GUID") + private UUID GUID;// UUID(一个新的,不重复行) + @JSONField(name = "Project") + private String Project;// 项目 + @JSONField(name = "CcAccount") + private String CcAccount;// 成本中心 + @JSONField(name = "SubAccount") + private String SubAccount;// 分账户 + @JSONField(name = "Domain") + private String Domain;// 域 + @JSONField(name = "CreditAccount") + private String CreditAccount;// 科目 + @JSONField(name = "Address") + private String Address;// 地址 + @JSONField(name = "CustomerNbr") + private String CustomerNbr;// 客户单 + @JSONField(name = "Line") + private int Line;// 行号 + @JSONField(name = "Reference") + private String Reference;// 参考号 + @JSONField(name = "Lot") + private String Lot;// 批号 + @JSONField(name = "Location") + private String Location;// 库位 + @JSONField(name = "Conversion") + private String Conversion;// 转换量 + @JSONField(name = "Quantity") + private BigDecimal Quantity;// 数量 + @JSONField(name = "Um") + private String Um;// 单位 + @JSONField(name = "PartCode") + private String PartCode;// 物料号 + @JSONField(name = "ReceiveBillNum") + private String ReceiveBillNum;// 单号 + @JSONField(name = "Remarks") + private String Remarks;// 备注 + @JSONField(name = "Site") + private String Site;// 地点 +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedRctunpMstr.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedRctunpMstr.java new file mode 100644 index 0000000..1d1a674 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedRctunpMstr.java @@ -0,0 +1,45 @@ +package com.win.module.eam.dal.dataobject.json; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.UUID; + +/** + * 盘点调整主表 + */ +@Data +@Component +public class TedRctunpMstr { + @JSONField(name = "User") + private String User; + @JSONField(name = "ReceiveBillNum") + private String ReceiveBillNum; + @JSONField(name = "Date",format = "yyyy-MM-dd HH:MM:SS") + private LocalDateTime Date; + @JSONField(name = "Time",format = "yyyy-MM-dd HH:MM:SS") + private LocalDateTime Time; + @JSONField(name = "GUID") + private UUID GUID; + @JSONField(name = "UID") + private int UID; + @JSONField(name = "CreateUser") + private String CreateUser; + @JSONField(name = "CreateTime",format = "yyyy-MM-dd HH:MM:SS") + private LocalDateTime CreateTime; + @JSONField(name = "Remark") + private String Remark; + @JSONField(name = "TaskID") + private UUID TaskID; + @JSONField(name = "CommandType") + private String CommandType; + @JSONField(name = "DataID") + private UUID DataID; + @JSONField(name = "Domain") + private String Domain; + @JSONField(name = "Site") + private String Site; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedReceiptDet.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedReceiptDet.java new file mode 100644 index 0000000..07cd276 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedReceiptDet.java @@ -0,0 +1,62 @@ +package com.win.module.eam.dal.dataobject.json; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.UUID; + +/** + * 采购收货子 + */ +@Data +@Component +public class TedReceiptDet { + @JSONField(name = "GUID") + private UUID GUID;// UUID(一个新的,不重复行) + @JSONField(name = "ASN") + private String ASN;// ASN单号 + @JSONField(name = "PurchaseOrder") + private String PurchaseOrder;// 采购订单 + @JSONField(name = "Line") + private int Line;// 行号 + @JSONField(name = "PartCode") + private String PartCode;// 物料号 + @JSONField(name = "ReceiveNbr") + private String ReceiveNbr;// 收货单号 + @JSONField(name = "ReceiveQuantity") + private BigDecimal ReceiveQuantity;// 收货数量 + @JSONField(name = "Location") + private String Location;// 库位 + @JSONField(name = "Um") + private String Um;// 采购单位 + @JSONField(name = "logisticsUm") + private String logisticsUm;// 物流单位 + @JSONField(name = "Lot") + private String Lot;// 批号 + @JSONField(name = "Reference") + private String Reference;// 参考号 + @JSONField(name = "UID") + private int UID;// + @JSONField(name = "SupplierLot") + private String SupplierLot;// 供应商批次 + @JSONField(name = "CreateUser") + private String CreateUser;// 创建人 + @JSONField(name = "CreateTime",format = "yyyy-MM-dd HH:MM:SS") + private LocalDateTime CreateTime;// 创建时间 + @JSONField(name = "Remark") + private String Remark;// 备注 + @JSONField(name = "TaskID") + private UUID TaskID;// 任务编号 + @JSONField(name = "CommandType") + private String CommandType;// 命令类型--赋值A + @JSONField(name = "DataID") + private UUID DataID;// + @JSONField(name = "Domain") + private String Domain;// 域 + @JSONField(name = "Site") + private String Site;// 地点 + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedReceiptMstr.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedReceiptMstr.java new file mode 100644 index 0000000..be6d536 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/json/TedReceiptMstr.java @@ -0,0 +1,51 @@ +package com.win.module.eam.dal.dataobject.json; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.UUID; + +/** + * 采购收货主 + */ +@Data +@Component +public class TedReceiptMstr { + + @JSONField(name = "User") + private String User;// 操作员 + @JSONField(name = "ASN") + private String ASN;// 货运单 + @JSONField(name = "PurchaseOrder") + private String PurchaseOrder;// 采购订单 + @JSONField(name = "Supplier") + private String Supplier;// 供应商 + @JSONField(name = "ReceiveNbr") + private String ReceiveNbr;// 收货单号 + @JSONField(name = "ReceiptDate",format = "yyyy-MM-dd HH:MM:SS") + private LocalDateTime ReceiptDate;// 收货日期 + @JSONField(name = "Time") + private LocalDateTime Time;// 时间 + @JSONField(name = "GUID") + private UUID GUID;// UUID(一个新的,不重复行) + @JSONField(name = "ID") + private UUID ID;// UUID(一个新的,不重复行) + @JSONField(name = "CreateUser") + private String CreateUser;// 创建人 + @JSONField(name = "CreateTime",format = "yyyy-MM-dd HH:MM:SS") + private LocalDateTime CreateTime;// 创建时间 + @JSONField(name = "Remark") + private String Remark;// 备注 + @JSONField(name = "TaskID") + private UUID TaskID;// 任务编号 + @JSONField(name = "CommandType") + private String CommandType;// 命令类型 + @JSONField(name = "DataID") + private UUID DataID;// + @JSONField(name = "Domain") + private String Domain;// 域 + @JSONField(name = "Site") + private String Site;// 地点 +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/location/LocationDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/location/LocationDO.java new file mode 100644 index 0000000..3f2d9f6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/location/LocationDO.java @@ -0,0 +1,117 @@ +package com.win.module.eam.dal.dataobject.location; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; + +/** + * 库位 DO + * + * @author 超级管理员 + */ +@TableName("basic_location") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LocationDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String number; + /** + * 名称 + */ + private String name; + /** + * 描述 + */ + private String description; + /** + * 库区编号 + */ + private String areaNumber; + /** + * 类型 + */ + private String type; + /** + * 是否账内账外默认TRUE账内FALSE账外 + */ + private String isInAccount; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + + + /** + * 备件标号 + */ + @TableField(exist = false) + private String itemNumber; + + /** + * 备件标号 + */ + @TableField(exist = false) + private String locationNumber; + + /** + * 备件名称 + */ + @TableField(exist = false) + private String itemName; + + /** + * 库存数量 + */ + @TableField(exist = false) + private BigDecimal qty; + + /** + * 备件出库申领数量 + */ + @TableField(exist = false) + private BigDecimal applyQty; + + /** + * 备件出库出库数量 + */ + @TableField(exist = false) + private BigDecimal receiveQty; + + /** + * 库区名称 + */ + @TableField(exist = false) + private String areaName; + /** + * 备件出库该库位最多可以出库数量 + */ + @TableField(exist = false) + private BigDecimal totalReception; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/locationarea/LocationAreaDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/locationarea/LocationAreaDO.java new file mode 100644 index 0000000..c09fab5 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/locationarea/LocationAreaDO.java @@ -0,0 +1,59 @@ +package com.win.module.eam.dal.dataobject.locationarea; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.win.framework.mybatis.core.dataobject.BaseDO; + +/** + * 库区 DO + * + * @author 超级管理员 + */ +@TableName("basic_location_area") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LocationAreaDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String number; + /** + * 名称 + */ + private String name; + /** + * 描述 + */ + private String description; + /** + * 类型枚举辅材库、备品备件库、工具库、专用耗材库、易耗品库 + */ + private String type; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/maintainback/MaintainBackDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/maintainback/MaintainBackDO.java new file mode 100644 index 0000000..5ba0d39 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/maintainback/MaintainBackDO.java @@ -0,0 +1,80 @@ +package com.win.module.eam.dal.dataobject.maintainback; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.io.Serializable; + +/** + * 保养计划 DO + * + * @author 超级管理员 + */ +@TableName("plan_maintain_back") +@Data +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MaintainBackDO implements Serializable { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String number; + /** + * 名称 + */ + private String name; + /** + * 设备模具编号 + */ + private String deviceNumber; + /** + * (旧)的执行周期 + */ + private String oldCycle; + /** + * (新)设备执行周期月、季度、半年、年 + */ + private String newCycle; + /** + * (旧)特殊周期-月 + */ + private String oldCycleMonth; + /** + * (新)特殊周期-月 + */ + private String newCycleMonth; + /** + * (旧)特殊周期-周 + */ + private String oldCycleWeek; + /** + * (新)特殊周期-周 + */ + private String newCycleWeek; + /** + * (旧)是否可用 + */ + private String oldAvailable; + /** + * (新)是否可用 + */ + private String newAvailable; + /** + * 类型设备、模具枚举 + */ + private String type; + /** + * 操作类型 + */ + private String operation; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/maintenanceturnto/MaintenanceTurntoDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/maintenanceturnto/MaintenanceTurntoDO.java new file mode 100644 index 0000000..54397db --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/maintenanceturnto/MaintenanceTurntoDO.java @@ -0,0 +1,89 @@ +package com.win.module.eam.dal.dataobject.maintenanceturnto; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.win.framework.mybatis.core.dataobject.BaseDO; + +/** + * 维修转办记录 DO + * + * @author 超级管理员 + */ +@TableName("record_maintenance_turnto") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MaintenanceTurntoDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 维系工单号 + */ + private String maintenanceNumber; + /** + * 设备模具编号 + */ + private String deviceNumber; + + /** + * 转前设备模具编号 + */ + private String deviceNumberOld; + /** + * 厂区编号 + */ + private String factoryAreaNumberOld; + /** + * 厂区编号 + */ + private String factoryAreaNumber; + /** + * 转办人id + */ + private Long turnToUserid; + /** + * 接收人id + */ + private Long receiverUserid; + /** + * 转办前类型 + */ + private String turnToType; + /** + * 转办后的类型 + */ + private String receiverType; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + + /** + * 是否可用 + */ + private String status; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + /** + * 部门id + */ + private Long deptId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/moldaccounts/MoldAccountsDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/moldaccounts/MoldAccountsDO.java new file mode 100644 index 0000000..2a8ae62 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/moldaccounts/MoldAccountsDO.java @@ -0,0 +1,129 @@ +package com.win.module.eam.dal.dataobject.moldaccounts; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 模具台账 DO + * + * @author 超级管理员 + */ +@TableName("basic_mold_accounts") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MoldAccountsDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号 + */ + private String number; + /** + * 名称 + */ + private String name; + /** + * 规格型号 + */ + private String specification; + /** + * 模具类型 + */ + private String type; + /** + * 所属厂区编号 + */ + private String factoryAreaNumber; + /** + * 采购时间 + */ + private LocalDateTime purchaseTime; + /** + * 采购部门 + */ + private Long deptId; + /** + * 采购人 + */ + private String purchaser; + /** + * 供应商编号 + */ + private String supplierNumber; + /** + * 出厂日期 + */ + private LocalDateTime productionDate; + /** + * 购买价格 + */ + private BigDecimal purchasePrice; + /** + * 是否客户资产TRUE/FALSE + */ + private String isClientAssets; + /** + * 生产次数 用来产生保养计划,保养计划完成后归零。 + */ + private Long frequency; + /** + * 节拍 生产一个零件所需时间,对系统没影响 + */ + private Long beat; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + + /** + * 状态0正常1维修中 + */ + private String status; + + /** + * 类型名称 + */ + @TableField(exist = false) + private String typeName; + + /** + * 厂区名称 + */ + @TableField(exist = false) + private String factoryAreaName; + /** + * 图片 + */ + @TableField(exist = false) + private String images; + + /** + * 描述 + */ + private String describes; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/moldaccounts/MoldAccountsDOExpand.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/moldaccounts/MoldAccountsDOExpand.java new file mode 100644 index 0000000..da51b27 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/moldaccounts/MoldAccountsDOExpand.java @@ -0,0 +1,25 @@ +package com.win.module.eam.dal.dataobject.moldaccounts; + +/** + * @ClassName MoldAccountsDOExpand + * @Description TODO + * @Author longlongxiaogege + * @Date 2024/2/7 11:56 + * @Version 1.0 + */ +public class MoldAccountsDOExpand extends MoldAccountsDO{ + + /** + * 类型中文名 + */ + private String typeName; + + + /** + * 厂区中文名 + */ + private String factoryAreaName; + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/moldmilestone/MoldMilestoneDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/moldmilestone/MoldMilestoneDO.java new file mode 100644 index 0000000..bb39728 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/moldmilestone/MoldMilestoneDO.java @@ -0,0 +1,69 @@ +package com.win.module.eam.dal.dataobject.moldmilestone; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.time.LocalDateTime; + +/** + * 模具里程碑 DO + * + * @author 超级管理员 + */ +@TableName("basic_mold_milestone") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MoldMilestoneDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String number; + /** + * 模具编号 + */ + private String moldNumber; + /** + * 里程碑阶段 + */ + private String milestoneStage; + /** + * 里程碑日期 + */ + @JsonFormat(shape = JsonFormat.Shape.NUMBER) + private LocalDateTime milestoneDate; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + + /** + * 是否可用 + */ + @TableField(exist = false) + private String name; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/monthequipment/BasicMonthEquipmentDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/monthequipment/BasicMonthEquipmentDO.java new file mode 100644 index 0000000..536fc34 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/monthequipment/BasicMonthEquipmentDO.java @@ -0,0 +1,70 @@ +package com.win.module.eam.dal.dataobject.monthequipment; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.win.framework.mybatis.core.dataobject.BaseDO; + +/** + * 首页月设备实现指标 DO + * + * @author 超级管理员 + */ +@TableName("basic_month_equipment") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BasicMonthEquipmentDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 名称 + */ + private String name; + /** + * 类型枚举字典 + */ + private String type; + /** + * 厂区枚举字典 + */ + private String factoryType; + /** + * 月指标 + */ + private String monthIndex; + /** + * 实际 + */ + private String actual; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 年 + */ + private int year; + /** + * 月 + */ + private int month; + /** + * 并发乐观锁 + */ + private Integer concurrencyStamp; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/producePlan/ProducePlanDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/producePlan/ProducePlanDO.java new file mode 100644 index 0000000..95ff581 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/producePlan/ProducePlanDO.java @@ -0,0 +1,141 @@ +package com.win.module.eam.dal.dataobject.producePlan; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 生产计划 DO + * + * @author 超级管理员 + */ +@TableName("plan_produce") +@Data +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ProducePlanDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 外部接口id + */ + private String serviceId; + /** + * 计划单号 + */ + private String planCode; + /** + * 产线 + */ + private String workLineCode; + /** + * 产线名称 + */ + private String workLineName; + /** + * 车型 + */ + private String model; + /** + * 配置 + */ + private String configure; + /** + * 配置名称 + */ + private String configureName; + /** + * 计划数量 + */ + private Integer planQty; + /** + * 完工数量 + */ + private Integer completedQty; + /** + * 计划状态 + */ + private String planState; + /** + * 备注 + */ + private String remark; + /** + * 创建用户 + */ + private String createUser; + /** + * 更新用户 + */ + private String updateUser; + /** + * 备用字段1 + */ + private String column1; + /** + * 备用字段2 + */ + private String column2; + /** + * 备用字段3 + */ + private String column3; + /** + * 备用字段4 + */ + private BigDecimal column4; + /** + * 开始时间 + */ + private String startTime; + /** + * 结束时间 + */ + private String endTime; + /** + * 工时 + */ + private String workHours; + /** + * 顺序 + */ + private Integer seq; + /** + * 工位记录 + */ + private String wscode1; + /** + * 工位记录 + */ + private String wscode2; + /** + * 工位记录 + */ + private String wscode3; + /** + * 工位记录 + */ + private String wscode4; + /** + * 创建时间 + */ + private LocalDateTime createTime; + /** + * 最后更新时间 + */ + private LocalDateTime updateTime; + /** + * 是否删除 + */ + private Boolean deleted; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/supplier/SupplierDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/supplier/SupplierDO.java new file mode 100644 index 0000000..4b45e39 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/supplier/SupplierDO.java @@ -0,0 +1,86 @@ +package com.win.module.eam.dal.dataobject.supplier; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +/** + * 供应商 DO + * + * @author 超级管理员 + */ +@TableName("basic_supplier") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SupplierDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 编号唯一标识 + */ + private String number; + /** + * 名称 + */ + private String name; + /** + * 简称 + */ + private String shortName; + /** + * 地址 + */ + private String address; + /** + * 国家 + */ + private String country; + /** + * 城市 + */ + private String city; + /** + * 电话 + */ + private String phone; + /** + * 传真 + */ + private String fax; + /** + * 邮编 + */ + private String postId; + /** + * 联系人 + */ + private String contacts; + /** + * 是否可用 + */ + private String available; + /** + * 备注 + */ + private String remark; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + /** + * 地点ID + */ + private String siteId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/transaction/TransactionDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/transaction/TransactionDO.java new file mode 100644 index 0000000..da56912 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/transaction/TransactionDO.java @@ -0,0 +1,94 @@ +package com.win.module.eam.dal.dataobject.transaction; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; +import com.win.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; + +/** + * 库存事务 DO + * + * @author 超级管理员 + */ +@TableName("transaction_transaction") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TransactionDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 备件编号 + */ + private String itemNumber; + /** + * 库位编号 + */ + private String locationNumber; + /** + * 事务类型IN、OUT + */ + private String transactionType; + /** + * 库存动作枚举采购入库、领用出库、归还入库、维修入库 + */ + private String inventoryAction; + /** + * 是否账内库TRUE账内FALSE账外 + */ + private String isInAccount; + /** + * 库存状态 + */ + private String inventoryStatus; + /** + * 计量单位从备件中获取 + */ + private String uom; + /** + * 数量 + */ + private BigDecimal qty; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + @Version + private Integer concurrencyStamp; + /** + * 操作人 + */ + private String operator; + + /** + * 关联工单 + */ + private String associatedNumber; + /** + * 库区编码 + */ + private String areaNumber; + + /** + * 描述原因备注 + */ + private String describes; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/uniapppushmessage/UniappPushMessageDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/uniapppushmessage/UniappPushMessageDO.java new file mode 100644 index 0000000..cbde695 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/uniapppushmessage/UniappPushMessageDO.java @@ -0,0 +1,98 @@ +package com.win.module.eam.dal.dataobject.uniapppushmessage; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.win.framework.mybatis.core.dataobject.BaseDO; + +/** + * uniapp推送记录 DO + * + * @author 超级管理员 + */ +@TableName("record_uniapp_push_message") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UniappPushMessageDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 结果码 + */ + private String resultMsg; + /** + * 工单号 + */ + private String number; + /** + * 推送消息类型 + */ + private String type; + /** + * 标题 + */ + private String title; + /** + * 数据 + */ + private String payload; + /** + * 内容 + */ + private String content; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + private Integer concurrencyStamp; + /** + * 部门id + */ + private Long deptId; + /** + *唯一标识 + */ + private String requestId; + /** + * 码 + */ + private Integer codes; + + /** + * 推送消息类型字典 + */ + private String status; + + /** + * 任务id + */ + private String taskId; + + /** + * 厂区 + */ + private String factoryAreaNumber; + + /** + * 设备唯一编码 + */ + private String cid; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/yearequipment/BasciYearEquipmentDO.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/yearequipment/BasciYearEquipmentDO.java new file mode 100644 index 0000000..8ee19d3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/dataobject/yearequipment/BasciYearEquipmentDO.java @@ -0,0 +1,71 @@ +package com.win.module.eam.dal.dataobject.yearequipment; + +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.win.framework.mybatis.core.dataobject.BaseDO; + +/** + * 首页年设备指标 DO + * + * @author 超级管理员 + */ +@TableName("basic_year_equipment") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BasciYearEquipmentDO extends BaseDO { + + /** + * id + */ + @TableId + private Long id; + /** + * 名称 + */ + private String name; + /** + * 类型枚举字典 + */ + private String type; + /** + * 厂区枚举字典 + */ + private String factoryType; + /** + * 年指标 + */ + private String yearIndex; + /** + * 目标 + */ + private String goal; + /** + * 实现 + */ + private String actual; + /** + * 地点ID + */ + private String siteId; + /** + * 是否可用 + */ + private String available; + /** + * 并发乐观锁 + */ + private Integer concurrencyStamp; + + private Long deptId; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/adjustRecord/AdjustRecordDetailMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/adjustRecord/AdjustRecordDetailMapper.java new file mode 100644 index 0000000..cb279b6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/adjustRecord/AdjustRecordDetailMapper.java @@ -0,0 +1,42 @@ +package com.win.module.eam.dal.mysql.adjustRecord; + +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.eam.controller.adjustRecord.vo.AdjustRecordDetailExportReqVO; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordDetailPageReqVO; +import com.win.module.eam.dal.dataobject.adjustRecord.AdjustRecordDetailDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 备件盘点调整记录子 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface AdjustRecordDetailMapper extends BaseMapperX { + + default PageResult selectPage(AdjustRecordDetailPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(AdjustRecordDetailDO::getMasterId,reqVO.getMasterId()) + .eqIfPresent(AdjustRecordDetailDO::getNumber, reqVO.getNumber()) + .eqIfPresent(AdjustRecordDetailDO::getLocationNumber, reqVO.getLocationNumber()) + .eqIfPresent(AdjustRecordDetailDO::getAreaNumber, reqVO.getAreaNumber()) + .eqIfPresent(AdjustRecordDetailDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(AdjustRecordDetailDO::getQty, reqVO.getQty()) + .orderByDesc(AdjustRecordDetailDO::getId)); + } + + default List selectList(AdjustRecordDetailExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(AdjustRecordDetailDO::getNumber, reqVO.getNumber()) + .eqIfPresent(AdjustRecordDetailDO::getLocationNumber, reqVO.getLocationNumber()) + .eqIfPresent(AdjustRecordDetailDO::getAreaNumber, reqVO.getAreaNumber()) + .eqIfPresent(AdjustRecordDetailDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(AdjustRecordDetailDO::getQty, reqVO.getQty()) + .orderByDesc(AdjustRecordDetailDO::getId)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/adjustRecord/AdjustRecordMainMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/adjustRecord/AdjustRecordMainMapper.java new file mode 100644 index 0000000..144a01b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/adjustRecord/AdjustRecordMainMapper.java @@ -0,0 +1,51 @@ +package com.win.module.eam.dal.mysql.adjustRecord; + +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordMainExportReqVO; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordMainPageReqVO; +import com.win.module.eam.dal.dataobject.adjustRecord.AdjustRecordMainDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 备件盘点调整记录主 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface AdjustRecordMainMapper extends BaseMapperX { + + default PageResult selectPage(AdjustRecordMainPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(AdjustRecordMainDO::getId, reqVO.getId()) + .eqIfPresent(AdjustRecordMainDO::getNumber, reqVO.getNumber()) + .eqIfPresent(AdjustRecordMainDO::getPlanNumber, reqVO.getPlanNumber()) + .eqIfPresent(AdjustRecordMainDO::getRequestNumber, reqVO.getRequestNumber()) + .betweenIfPresent(AdjustRecordMainDO::getRequestTime, reqVO.getRequestTime()) + .eqIfPresent(AdjustRecordMainDO::getJobNumber, reqVO.getJobNumber()) + .eqIfPresent(AdjustRecordMainDO::getRecordNumber, reqVO.getRecordNumber()) + .orderByDesc(AdjustRecordMainDO::getId)); + } + + default List selectList(AdjustRecordMainExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(AdjustRecordMainDO::getId, reqVO.getId()) + .eqIfPresent(AdjustRecordMainDO::getNumber, reqVO.getNumber()) + .eqIfPresent(AdjustRecordMainDO::getPlanNumber, reqVO.getPlanNumber()) + .eqIfPresent(AdjustRecordMainDO::getRequestNumber, reqVO.getRequestNumber()) + .betweenIfPresent(AdjustRecordMainDO::getRequestTime, reqVO.getRequestTime()) + .eqIfPresent(AdjustRecordMainDO::getJobNumber, reqVO.getJobNumber()) + .eqIfPresent(AdjustRecordMainDO::getRecordNumber, reqVO.getRecordNumber()) + .orderByDesc(AdjustRecordMainDO::getId)); + } + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/attachmentfile/AttachmentFileMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/attachmentfile/AttachmentFileMapper.java new file mode 100644 index 0000000..9335924 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/attachmentfile/AttachmentFileMapper.java @@ -0,0 +1,62 @@ +package com.win.module.eam.dal.mysql.attachmentfile; + + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.eam.controller.attachmentfile.vo.AttachmentFileExportReqVO; +import com.win.module.eam.controller.attachmentfile.vo.AttachmentFilePageReqVO; +import com.win.module.eam.dal.dataobject.attachmentfile.AttachmentFileDO; +import org.apache.ibatis.annotations.Mapper; +import com.win.framework.common.pojo.PageResult; + +import java.util.List; + +/** + * 设备模具附件文件 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface AttachmentFileMapper extends BaseMapperX { + + default PageResult selectPage(AttachmentFilePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(AttachmentFileDO::getNumber, reqVO.getNumber()) + .likeIfPresent(AttachmentFileDO::getFileName, reqVO.getFileName()) + .eqIfPresent(AttachmentFileDO::getFileType, reqVO.getFileType()) + .eqIfPresent(AttachmentFileDO::getPath, reqVO.getPath()) + .eqIfPresent(AttachmentFileDO::getSize, reqVO.getSize()) + .eqIfPresent(AttachmentFileDO::getFuncCode, reqVO.getFuncCode()) + .eqIfPresent(AttachmentFileDO::getFileBusiType, reqVO.getFileBusiType()) + .betweenIfPresent(AttachmentFileDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(AttachmentFileDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .orderByDesc(AttachmentFileDO::getId)); + } + + default List selectList(AttachmentFileExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(AttachmentFileDO::getNumber, reqVO.getNumber()) + .likeIfPresent(AttachmentFileDO::getFileName, reqVO.getFileName()) + .eqIfPresent(AttachmentFileDO::getFileType, reqVO.getFileType()) + .eqIfPresent(AttachmentFileDO::getPath, reqVO.getPath()) + .eqIfPresent(AttachmentFileDO::getSize, reqVO.getSize()) + .eqIfPresent(AttachmentFileDO::getFuncCode, reqVO.getFuncCode()) + .eqIfPresent(AttachmentFileDO::getFileBusiType, reqVO.getFileBusiType()) + .betweenIfPresent(AttachmentFileDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(AttachmentFileDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .orderByDesc(AttachmentFileDO::getId)); + } + + List getAttachmentFileList(AttachmentFileDO reqVO); + + + List getAttachmentFileListBatcn(List reqVOList); + + + int deleteBatch(List ids); + + + List getAttachmentFilePathList(AttachmentFileDO reqVO); + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/classtype/ClassTypeMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/classtype/ClassTypeMapper.java new file mode 100644 index 0000000..39fb744 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/classtype/ClassTypeMapper.java @@ -0,0 +1,73 @@ +package com.win.module.eam.dal.mysql.classtype; + +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.eam.controller.classtype.vo.ClassTypeExportReqVO; +import com.win.module.eam.controller.classtype.vo.ClassTypePageReqVO; +import com.win.module.eam.dal.dataobject.classtype.ClassTypeDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * 厂区班组角色数据维护 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface ClassTypeMapper extends BaseMapperX { + + default PageResult selectPage(ClassTypePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .orderByDesc(ClassTypeDO::getId)); + } + + default List selectList(ClassTypeExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .orderByDesc(ClassTypeDO::getId)); + } + + /** + * 获取当前用户信息 + * @param userId + * @return + */ + //List JudgeIdentity(@Param("userId") Long userId,@Param("type") Long type); + List JudgeIdentity(@Param("userId") Long userId,@Param("type") String type,@Param("flag") String flag,@Param("factoryAreaNumber") String factoryAreaNumber); + + default String getIdentity(String type){ + String a = "2"; + List list = JudgeIdentity(getLoginUserId(),type,"0",""); + if(!list.isEmpty()){ + a = "0"; + } + List list1 = JudgeIdentity(getLoginUserId(),type,"1",""); + if(!list1.isEmpty()){ + a = "1"; + } + return a; + }; + + /** + * 根据厂区 类型判断是否添加了班组维护信息 + * @param type + * @param factoryAreaNumber + */ + default String isExistData (String type,String factoryAreaNumber){ + String a = "2"; + List list = JudgeIdentity(getLoginUserId(),type,"0",factoryAreaNumber); + if(!list.isEmpty()){ + a = "0"; + } + List list1 = JudgeIdentity(getLoginUserId(),type,"1",factoryAreaNumber); + if(!list1.isEmpty()){ + a = "1"; + } + return a; + }; + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countJobMain/CountJobDetailMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countJobMain/CountJobDetailMapper.java new file mode 100644 index 0000000..35d7bd4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countJobMain/CountJobDetailMapper.java @@ -0,0 +1,42 @@ +package com.win.module.eam.dal.mysql.countJobMain; + +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.eam.controller.countJob.vo.CountJobDetailExportReqVO; +import com.win.module.eam.controller.countJob.vo.CountJobDetailPageReqVO; +import com.win.module.eam.dal.dataobject.countJobDetail.CountJobDetailDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 备件盘点任务子 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface CountJobDetailMapper extends BaseMapperX { + + default PageResult selectPage(CountJobDetailPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(CountJobDetailDO::getMasterId, reqVO.getMasterId()) + .eqIfPresent(CountJobDetailDO::getNumber, reqVO.getNumber()) + .eqIfPresent(CountJobDetailDO::getLocationNumber, reqVO.getLocationNumber()) + .eqIfPresent(CountJobDetailDO::getAreaNumber, reqVO.getAreaNumber()) + .eqIfPresent(CountJobDetailDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(CountJobDetailDO::getQty, reqVO.getQty()) + .orderByDesc(CountJobDetailDO::getId)); + } + + default List selectList(CountJobDetailExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(CountJobDetailDO::getNumber, reqVO.getNumber()) + .eqIfPresent(CountJobDetailDO::getLocationNumber, reqVO.getLocationNumber()) + .eqIfPresent(CountJobDetailDO::getAreaNumber, reqVO.getAreaNumber()) + .eqIfPresent(CountJobDetailDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(CountJobDetailDO::getQty, reqVO.getQty()) + .orderByDesc(CountJobDetailDO::getId)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countJobMain/CountJobMainMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countJobMain/CountJobMainMapper.java new file mode 100644 index 0000000..08d0731 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countJobMain/CountJobMainMapper.java @@ -0,0 +1,53 @@ +package com.win.module.eam.dal.mysql.countJobMain; + +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.countJob.vo.CountJobMainExportReqVO; +import com.win.module.eam.controller.countJob.vo.CountJobMainPageReqVO; +import com.win.module.eam.dal.dataobject.countJobMain.CountJobMainDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 备件盘点任务主 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface CountJobMainMapper extends BaseMapperX { + + default PageResult selectPage(CountJobMainPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(CountJobMainDO::getJobNumber, reqVO.getJobNumber()) + .likeIfPresent(CountJobMainDO::getName, reqVO.getName()) + .eqIfPresent(CountJobMainDO::getNumber, reqVO.getNumber()) + .eqIfPresent(CountJobMainDO::getStatus, reqVO.getStatus()) + .eqIfPresent(CountJobMainDO::getCountDeptId, reqVO.getCountDeptId()) + .eqIfPresent(CountJobMainDO::getCountId, reqVO.getCountId()) + .orderByDesc(CountJobMainDO::getId)); + } + + default List selectList(CountJobMainExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(CountJobMainDO::getJobNumber, reqVO.getJobNumber()) + .likeIfPresent(CountJobMainDO::getName, reqVO.getName()) + .eqIfPresent(CountJobMainDO::getNumber, reqVO.getNumber()) + .eqIfPresent(CountJobMainDO::getStatus, reqVO.getStatus()) + .eqIfPresent(CountJobMainDO::getCountDeptId, reqVO.getCountDeptId()) + .eqIfPresent(CountJobMainDO::getCountId, reqVO.getCountId()) + .orderByDesc(CountJobMainDO::getId)); + } + + default CountJobMainDO selectByCode(String code) { + return selectOne(CountJobMainDO::getJobNumber, code); + } + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countRecord/CountRecordDetailMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countRecord/CountRecordDetailMapper.java new file mode 100644 index 0000000..050741f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countRecord/CountRecordDetailMapper.java @@ -0,0 +1,51 @@ +package com.win.module.eam.dal.mysql.countRecord; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +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.eam.controller.countRecord.vo.CountRecordDetailExportReqVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordDetailPageReqVO; +import com.win.module.eam.dal.dataobject.countRecord.CountRecordDetailDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 备件盘点记录子 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface CountRecordDetailMapper extends BaseMapperX { + + default PageResult selectPage(CountRecordDetailPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(CountRecordDetailDO::getMasterId,reqVO.getMasterId()) + .eqIfPresent(CountRecordDetailDO::getNumber, reqVO.getNumber()) + .eqIfPresent(CountRecordDetailDO::getLocationNumber, reqVO.getLocationNumber()) + .eqIfPresent(CountRecordDetailDO::getAreaNumber, reqVO.getAreaNumber()) + .eqIfPresent(CountRecordDetailDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(CountRecordDetailDO::getQty, reqVO.getQty()) + .eqIfPresent(CountRecordDetailDO::getCountQty, reqVO.getCountQty()) + .betweenIfPresent(CountRecordDetailDO::getCountTime, reqVO.getCountTime()) + .orderByDesc(CountRecordDetailDO::getId)); + } + + IPage selectNewPage(Page page, @Param("vo") CountRecordDetailPageReqVO reqVO); + + default List selectList(CountRecordDetailExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(CountRecordDetailDO::getNumber, reqVO.getNumber()) + .eqIfPresent(CountRecordDetailDO::getLocationNumber, reqVO.getLocationNumber()) + .eqIfPresent(CountRecordDetailDO::getAreaNumber, reqVO.getAreaNumber()) + .eqIfPresent(CountRecordDetailDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(CountRecordDetailDO::getQty, reqVO.getQty()) + .eqIfPresent(CountRecordDetailDO::getCountQty, reqVO.getCountQty()) + .betweenIfPresent(CountRecordDetailDO::getCountTime, reqVO.getCountTime()) + .orderByDesc(CountRecordDetailDO::getId)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countRecord/CountRecordMainMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countRecord/CountRecordMainMapper.java new file mode 100644 index 0000000..b2f90b3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countRecord/CountRecordMainMapper.java @@ -0,0 +1,50 @@ +package com.win.module.eam.dal.mysql.countRecord; + +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.countRecord.vo.CountRecordMainExportReqVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordMainPageReqVO; +import com.win.module.eam.dal.dataobject.countRecord.CountRecordMainDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 备件盘点记录主 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface CountRecordMainMapper extends BaseMapperX { + + default PageResult selectPage(CountRecordMainPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(CountRecordMainDO::getId, reqVO.getId()) + .eqIfPresent(CountRecordMainDO::getNumber, reqVO.getNumber()) + .likeIfPresent(CountRecordMainDO::getName, reqVO.getName()) + .eqIfPresent(CountRecordMainDO::getRequestNumber, reqVO.getRequestNumber()) + .eqIfPresent(CountRecordMainDO::getJobNumber, reqVO.getJobNumber()) + .eqIfPresent(CountRecordMainDO::getStatus, reqVO.getStatus()) + .orderByDesc(CountRecordMainDO::getId)); + } + +// PageResult appaaaaNumber(CountRecordMainPageReqVO pageReqVO); +// IPage selectNewPage(Page page,@Param("vo") CountRecordMainPageReqVO reqVO); + default List selectList(CountRecordMainExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(CountRecordMainDO::getId, reqVO.getId()) + .eqIfPresent(CountRecordMainDO::getNumber, reqVO.getNumber()) + .likeIfPresent(CountRecordMainDO::getName, reqVO.getName()) + .eqIfPresent(CountRecordMainDO::getRequestNumber, reqVO.getRequestNumber()) + .eqIfPresent(CountRecordMainDO::getJobNumber, reqVO.getJobNumber()) + .orderByDesc(CountRecordMainDO::getId)); + } + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countadjustPlan/CountadjustPlanMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countadjustPlan/CountadjustPlanMapper.java new file mode 100644 index 0000000..5717be8 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/countadjustPlan/CountadjustPlanMapper.java @@ -0,0 +1,54 @@ +package com.win.module.eam.dal.mysql.countadjustPlan; + +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.countadjustPlan.vo.CountadjustPlanExportReqVO; +import com.win.module.eam.controller.countadjustPlan.vo.CountadjustPlanPageReqVO; +import com.win.module.eam.dal.dataobject.countadjustPlan.CountadjustPlanDO; +import com.win.module.eam.dal.dataobject.location.LocationDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 备件盘点计划 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface CountadjustPlanMapper extends BaseMapperX { + + default PageResult selectPage(CountadjustPlanPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(CountadjustPlanDO::getId, reqVO.getId()) + .eqIfPresent(CountadjustPlanDO::getNumber, reqVO.getNumber()) + .likeIfPresent(CountadjustPlanDO::getName, reqVO.getName()) + .eqIfPresent(CountadjustPlanDO::getClassification, reqVO.getClassification()) + .eqIfPresent(CountadjustPlanDO::getIsInAccount, reqVO.getIsInAccount()) + .eqIfPresent(CountadjustPlanDO::getStatus, reqVO.getStatus()) + .orderByDesc(CountadjustPlanDO::getId)); + } + + default CountadjustPlanDO selectByNumber(String number){ + return selectOne(CountadjustPlanDO::getNumber,number); + } + + default List selectList(CountadjustPlanExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(CountadjustPlanDO::getId, reqVO.getId()) + .eqIfPresent(CountadjustPlanDO::getNumber, reqVO.getNumber()) + .likeIfPresent(CountadjustPlanDO::getName, reqVO.getName()) + .eqIfPresent(CountadjustPlanDO::getClassification, reqVO.getClassification()) + .eqIfPresent(CountadjustPlanDO::getIsInAccount, reqVO.getIsInAccount()) + .eqIfPresent(CountadjustPlanDO::getStatus, reqVO.getStatus()) + .orderByDesc(CountadjustPlanDO::getId)); + } + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceaccounts/DeviceAccountsMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceaccounts/DeviceAccountsMapper.java new file mode 100644 index 0000000..3f0baf7 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceaccounts/DeviceAccountsMapper.java @@ -0,0 +1,155 @@ +package com.win.module.eam.dal.mysql.deviceaccounts; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.deviceaccounts.vo.DeviceAccountsExportReqVO; +import com.win.module.eam.controller.deviceaccounts.vo.DeviceAccountsPageReqVO; +import com.win.module.eam.controller.devicemolditems.vo.DeviceMoldItemsPageReqVO; +import com.win.module.eam.dal.dataobject.deviceaccounts.DeviceAccountsDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.time.LocalDate; +import java.util.List; +import java.util.Map; + +/** + * 备件台账 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceAccountsMapper extends BaseMapperX { + + default PageResult selectPage(DeviceAccountsPageReqVO reqVO) { + LambdaQueryWrapperX queryWrapper = new LambdaQueryWrapperX() + .eqIfPresent(DeviceAccountsDO::getNumber, reqVO.getNumber()) + .likeIfPresent(DeviceAccountsDO::getName, reqVO.getName()) + .eqIfPresent(DeviceAccountsDO::getType, reqVO.getType()) + .eqIfPresent(DeviceAccountsDO::getFactoryAreaNumber, reqVO.getFactoryAreaNumber()) + .eqIfPresent(DeviceAccountsDO::getStatus, reqVO.getStatus()) + .orderByDesc(DeviceAccountsDO::getId); + + if (reqVO.getPowerRange() != null && reqVO.getPowerRange().equals("high")) { + queryWrapper.and(wrapper -> wrapper.ge(DeviceAccountsDO::getPower, 30)); + } + + return selectPage(reqVO, queryWrapper); + } + + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + + default List selectList(DeviceAccountsExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceAccountsDO::getNumber, reqVO.getNumber()) + .likeIfPresent(DeviceAccountsDO::getName, reqVO.getName()) + .eqIfPresent(DeviceAccountsDO::getType, reqVO.getType()) + .eqIfPresent(DeviceAccountsDO::getFactoryAreaNumber, reqVO.getFactoryAreaNumber()) + .eqIfPresent(DeviceAccountsDO::getStatus, reqVO.getStatus()) + .orderByDesc(DeviceAccountsDO::getId)); + } + + default PageResult selectNumber(DeviceMoldItemsPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(DeviceAccountsDO::getAvailable, reqVO.getAvailable())); + } + + /** + * 获取该维修人员所属厂区下的设备总数 + * @param factoryAreaNumber + * @param status 0正常1故障 + * @return + */ + default Long selectCountByFactoryAreaNumber(String factoryAreaNumber,String status) { + return selectCount(new LambdaQueryWrapperX() + .eqIfPresent(DeviceAccountsDO::getFactoryAreaNumber, factoryAreaNumber) + .eqIfPresent(DeviceAccountsDO::getDeleted,0) + .eqIfPresent(DeviceAccountsDO::getAvailable,"TRUE") + .eqIfPresent(DeviceAccountsDO::getStatus,status)); + } + + /** + * 获取该维修人员所属厂区下的申请设备总数(去重) + * @param factoryAreaNumber + * @param type 模具或者设备 + * @return + */ + int selectRequestCountByAreaNumber(@Param("type") String type,@Param("factoryAreaNumber") String factoryAreaNumber); + + /** + * 获取该维修工程师所属厂区下的待验证数量 + * @param number + * @param type 模具或者设备 + * @return + */ + int selectToDoCountByAreaNumber(@Param("type") String type,@Param("number") String number); + + /** + * 获取该维修人员所属厂区下的申请设备总数(去重) + * @param number + * @return + */ + Map getDetailsByNumber(@Param("number") String number); + + List> selectData(@Param("factoryAreaNumber") String factoryAreaNumber); + + /** + * 获取所有设备列表包括维修中和正常的 + * @return + */ + List> selectAll(); + + /** + * APP获取所有设备列表 + * @param page + * @param reqVO + * @return + */ + IPage getAppPage(Page page, @Param("vo") DeviceAccountsPageReqVO reqVO); + + /** + * APP获取所有设备列表 + * @param number + * @param number + * @return + */ + DeviceAccountsDO getDetailsEntryByNumber(@Param("number") String number); + + default List selectAll(DeviceAccountsExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceAccountsDO::getNumber, reqVO.getNumber()) + .likeIfPresent(DeviceAccountsDO::getName, reqVO.getName()) + .eqIfPresent(DeviceAccountsDO::getType, reqVO.getType()) + .orderByDesc(DeviceAccountsDO::getId)); + } + + + /** + * 看板根据维修状态获取设备数量0正常1损坏 + * @param status + */ + default Long getDeviceNumbers(String status) { + return selectCount(new LambdaQueryWrapperX() + .eqIfPresent(DeviceAccountsDO::getStatus, status) + .eqIfPresent(DeviceAccountsDO::getDeleted,0) + .eqIfPresent(DeviceAccountsDO::getAvailable,"TRUE")); + } + + + default List selectListNoPage(DeviceAccountsPageReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceAccountsDO::getFactoryAreaNumber, reqVO.getFactoryAreaNumber()) + .eqIfPresent(DeviceAccountsDO::getNumber, reqVO.getNumber()) + .likeIfPresent(DeviceAccountsDO::getName, reqVO.getName()) + .eqIfPresent(DeviceAccountsDO::getType, reqVO.getType()) + .orderByDesc(DeviceAccountsDO::getId)); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceinspectionjob/DeviceInspectionJobDetailItemMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceinspectionjob/DeviceInspectionJobDetailItemMapper.java new file mode 100644 index 0000000..5f3ff36 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceinspectionjob/DeviceInspectionJobDetailItemMapper.java @@ -0,0 +1,44 @@ +package com.win.module.eam.dal.mysql.deviceinspectionjob; + +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.eam.controller.deviceinspectionjob.vo.DeviceInspectionJobDetailItemExportReqVO; +import com.win.module.eam.controller.deviceinspectionjob.vo.DeviceInspectionJobDetailItemPageReqVO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailItemDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 检修工单子表与备件关系 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceInspectionJobDetailItemMapper extends BaseMapperX { + + default PageResult selectPage(DeviceInspectionJobDetailItemPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DeviceInspectionJobDetailItemDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(DeviceInspectionJobDetailItemDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .eqIfPresent(DeviceInspectionJobDetailItemDO::getItemNumber, reqVO.getItemNumber()) + .orderByDesc(DeviceInspectionJobDetailItemDO::getId)); + } + + default List selectList(DeviceInspectionJobDetailItemExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceInspectionJobDetailItemDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(DeviceInspectionJobDetailItemDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .eqIfPresent(DeviceInspectionJobDetailItemDO::getItemNumber, reqVO.getItemNumber()) + .orderByDesc(DeviceInspectionJobDetailItemDO::getId)); + } + /** + * 根据检修工单子项id获取备件列表 + * @param maintenanceDetailId + * @return + */ + public List> selectListById(@Param("id") Long maintenanceDetailId); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceinspectionjob/DeviceInspectionJobDetailMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceinspectionjob/DeviceInspectionJobDetailMapper.java new file mode 100644 index 0000000..e153b1d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceinspectionjob/DeviceInspectionJobDetailMapper.java @@ -0,0 +1,51 @@ +package com.win.module.eam.dal.mysql.deviceinspectionjob; + +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.eam.controller.deviceinspectionjob.vo.DeviceInspectionJobDetailExportReqVO; +import com.win.module.eam.controller.deviceinspectionjob.vo.DeviceInspectionJobDetailPageReqVO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 检修工单子 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceInspectionJobDetailMapper extends BaseMapperX { + + default PageResult selectPage(DeviceInspectionJobDetailPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DeviceInspectionJobDetailDO::getPeoples, reqVO.getPeoples()) + .eqIfPresent(DeviceInspectionJobDetailDO::getEstimatedMinutes, reqVO.getEstimatedMinutes()) + .eqIfPresent(DeviceInspectionJobDetailDO::getChargePeoples, reqVO.getChargePeoples()) + .eqIfPresent(DeviceInspectionJobDetailDO::getUncompleted, reqVO.getUncompleted()) + .eqIfPresent(DeviceInspectionJobDetailDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(DeviceInspectionJobDetailDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DeviceInspectionJobDetailDO::getSiteId, reqVO.getSiteId()) + .likeIfPresent(DeviceInspectionJobDetailDO::getName, reqVO.getName()) + .eqIfPresent(DeviceInspectionJobDetailDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceInspectionJobDetailDO::getMasterId, reqVO.getMasterId()) + .orderByDesc(DeviceInspectionJobDetailDO::getId)); + } + + default List selectList(DeviceInspectionJobDetailExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceInspectionJobDetailDO::getPeoples, reqVO.getPeoples()) + .eqIfPresent(DeviceInspectionJobDetailDO::getEstimatedMinutes, reqVO.getEstimatedMinutes()) + .eqIfPresent(DeviceInspectionJobDetailDO::getChargePeoples, reqVO.getChargePeoples()) + .eqIfPresent(DeviceInspectionJobDetailDO::getUncompleted, reqVO.getUncompleted()) + .eqIfPresent(DeviceInspectionJobDetailDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(DeviceInspectionJobDetailDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DeviceInspectionJobDetailDO::getSiteId, reqVO.getSiteId()) + .likeIfPresent(DeviceInspectionJobDetailDO::getName, reqVO.getName()) + .eqIfPresent(DeviceInspectionJobDetailDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceInspectionJobDetailDO::getMasterId, reqVO.getMasterId()) + .orderByDesc(DeviceInspectionJobDetailDO::getId)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceinspectionjob/DeviceInspectionJobMainMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceinspectionjob/DeviceInspectionJobMainMapper.java new file mode 100644 index 0000000..cfb7d7d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceinspectionjob/DeviceInspectionJobMainMapper.java @@ -0,0 +1,106 @@ +package com.win.module.eam.dal.mysql.deviceinspectionjob; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.datapermission.annotation.DataScope; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.framework.mybatis.core.util.QueryWrapperUtils; +import com.win.module.eam.controller.deviceinspectionjob.vo.DeviceInspectionJobMainExportReqVO; +import com.win.module.eam.controller.deviceinspectionjob.vo.DeviceInspectionJobMainPageReqVO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobMainDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionReportDo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 检修工单主 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceInspectionJobMainMapper extends BaseMapperX { + + @DataScope(deptAlias = "job_inspection_main") + default PageResult selectPage(DeviceInspectionJobMainPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DeviceInspectionJobMainDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceInspectionJobMainDO::getFactoryAreaNumber, reqVO.getFactoryAreaNumber()) + .eqIfPresent(DeviceInspectionJobMainDO::getMaintenanceNumber, reqVO.getMaintenanceNumber()) + .eqIfPresent(DeviceInspectionJobMainDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(DeviceInspectionJobMainDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeviceInspectionJobMainDO::getType, reqVO.getType()) + .eqIfPresent(DeviceInspectionJobMainDO::getVerifyer, reqVO.getVerifyer()) + .eqIfPresent(DeviceInspectionJobMainDO::getMaintenance, reqVO.getMaintenance()) + .orderByDesc(DeviceInspectionJobMainDO::getId)); + } + + @DataScope(deptAlias = "job_inspection_main") + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + + @DataScope(deptAlias = "job_inspection_main") + default List selectList(DeviceInspectionJobMainExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceInspectionJobMainDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceInspectionJobMainDO::getFactoryAreaNumber, reqVO.getFactoryAreaNumber()) + .eqIfPresent(DeviceInspectionJobMainDO::getMaintenanceNumber, reqVO.getMaintenanceNumber()) + .eqIfPresent(DeviceInspectionJobMainDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(DeviceInspectionJobMainDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeviceInspectionJobMainDO::getType, reqVO.getType()) + .eqIfPresent(DeviceInspectionJobMainDO::getVerifyer, reqVO.getVerifyer()) + .eqIfPresent(DeviceInspectionJobMainDO::getMaintenance, reqVO.getMaintenance()) + .orderByDesc(DeviceInspectionJobMainDO::getId)); + } + + /** + * APP获取检修工单列表 + * @param page + * @param reqVO + * @return + */ + @DataScope(deptAlias = "d") + IPage getAppPage(Page page, @Param("vo") DeviceInspectionJobMainPageReqVO reqVO); + + + + default List selectNoPage(DeviceInspectionJobMainPageReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceInspectionJobMainDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceInspectionJobMainDO::getFactoryAreaNumber, reqVO.getFactoryAreaNumber()) + .eqIfPresent(DeviceInspectionJobMainDO::getMaintenanceNumber, reqVO.getMaintenanceNumber()) + .eqIfPresent(DeviceInspectionJobMainDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(DeviceInspectionJobMainDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeviceInspectionJobMainDO::getType, reqVO.getType()) + .eqIfPresent(DeviceInspectionJobMainDO::getMaintenance, reqVO.getMaintenance()) + .orderByDesc(DeviceInspectionJobMainDO::getId)); + } + + + /** + *@Author longlongxiaogege + *@Description //生成保养打印表子内容 + *@Date 13:15 2024/4/18 + *@Param [deviceMaintainJobReportDo] + *@return java.util.List + **/ + List getInspectionReport(DeviceInspectionReportDo deviceInspectionReportDo); + + /** + *@Author longlongxiaogege + *@Description //生成保养打印表主内容 + *@Date 16:44 2024/4/18 + *@Param [deviceMaintainJobReportDo] + *@return java.util.List + **/ + List getInspectionReportMainInfo(DeviceInspectionReportDo deviceInspectionReportDo); + + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceinternalaudit/DeviceInternalAuditMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceinternalaudit/DeviceInternalAuditMapper.java new file mode 100644 index 0000000..623e811 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceinternalaudit/DeviceInternalAuditMapper.java @@ -0,0 +1,60 @@ +package com.win.module.eam.dal.mysql.deviceinternalaudit; + +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.eam.controller.deviceinternalaudit.vo.DeviceInternalAuditExportReqVO; +import com.win.module.eam.controller.deviceinternalaudit.vo.DeviceInternalAuditPageReqVO; +import com.win.module.eam.dal.dataobject.deviceinternalaudit.DeviceInternalAuditDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + + +/** + * 设备内审业务说明 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceInternalAuditMapper extends BaseMapperX { + + default PageResult selectPage(DeviceInternalAuditPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DeviceInternalAuditDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceInternalAuditDO::getDescribes, reqVO.getDescribes()) + .eqIfPresent(DeviceInternalAuditDO::getPersoner, reqVO.getPersoner()) + .eqIfPresent(DeviceInternalAuditDO::getFitOut, reqVO.getFitOut()) + .eqIfPresent(DeviceInternalAuditDO::getCoating, reqVO.getCoating()) + .eqIfPresent(DeviceInternalAuditDO::getInjectionMolding, reqVO.getInjectionMolding()) + .eqIfPresent(DeviceInternalAuditDO::getBusiness, reqVO.getBusiness()) + .eqIfPresent(DeviceInternalAuditDO::getLaboratory, reqVO.getLaboratory()) + .eqIfPresent(DeviceInternalAuditDO::getIt, reqVO.getIt()) + .eqIfPresent(DeviceInternalAuditDO::getQualityDepartment, reqVO.getQualityDepartment()) + .eqIfPresent(DeviceInternalAuditDO::getMaterialFlow, reqVO.getMaterialFlow()) + .eqIfPresent(DeviceInternalAuditDO::getMoldPre, reqVO.getMoldPre()) + .betweenIfPresent(DeviceInternalAuditDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DeviceInternalAuditDO::getAvailable, reqVO.getAvailable()) + .orderByDesc(DeviceInternalAuditDO::getId)); + } + + default List selectList(DeviceInternalAuditExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceInternalAuditDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceInternalAuditDO::getDescribes, reqVO.getDescribes()) + .eqIfPresent(DeviceInternalAuditDO::getPersoner, reqVO.getPersoner()) + .eqIfPresent(DeviceInternalAuditDO::getFitOut, reqVO.getFitOut()) + .eqIfPresent(DeviceInternalAuditDO::getCoating, reqVO.getCoating()) + .eqIfPresent(DeviceInternalAuditDO::getInjectionMolding, reqVO.getInjectionMolding()) + .eqIfPresent(DeviceInternalAuditDO::getBusiness, reqVO.getBusiness()) + .eqIfPresent(DeviceInternalAuditDO::getLaboratory, reqVO.getLaboratory()) + .eqIfPresent(DeviceInternalAuditDO::getIt, reqVO.getIt()) + .eqIfPresent(DeviceInternalAuditDO::getQualityDepartment, reqVO.getQualityDepartment()) + .eqIfPresent(DeviceInternalAuditDO::getMaterialFlow, reqVO.getMaterialFlow()) + .eqIfPresent(DeviceInternalAuditDO::getMoldPre, reqVO.getMoldPre()) + .betweenIfPresent(DeviceInternalAuditDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DeviceInternalAuditDO::getAvailable, reqVO.getAvailable()) + .orderByDesc(DeviceInternalAuditDO::getId)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceitem/DeviceItemMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceitem/DeviceItemMapper.java new file mode 100644 index 0000000..c5aa8ab --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/deviceitem/DeviceItemMapper.java @@ -0,0 +1,54 @@ +package com.win.module.eam.dal.mysql.deviceitem; + +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.eam.controller.deviceitem.vo.DeviceItemExportReqVO; +import com.win.module.eam.controller.deviceitem.vo.DeviceItemPageReqVO; +import com.win.module.eam.dal.dataobject.deviceitem.DeviceItemDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 设备备件关系 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceItemMapper extends BaseMapperX { + + default PageResult selectPage(DeviceItemPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DeviceItemDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(DeviceItemDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(DeviceItemDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(DeviceItemDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(DeviceItemDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .orderByDesc(DeviceItemDO::getId)); + } + + default List selectList(DeviceItemExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceItemDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(DeviceItemDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(DeviceItemDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(DeviceItemDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(DeviceItemDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .orderByDesc(DeviceItemDO::getId)); + } + + + default List selectNoPage(DeviceItemPageReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceItemDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(DeviceItemDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(DeviceItemDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(DeviceItemDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(DeviceItemDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .orderByDesc(DeviceItemDO::getId)); + } + + void deleteByItemNumberDeviceNumber(DeviceItemDO deviceItemDO); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintainjob/DeviceMaintainJobDetailMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintainjob/DeviceMaintainJobDetailMapper.java new file mode 100644 index 0000000..58dee47 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintainjob/DeviceMaintainJobDetailMapper.java @@ -0,0 +1,70 @@ +package com.win.module.eam.dal.mysql.devicemaintainjob; + +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.devicemaintainjob.vo.DeviceMaintainJobDetailExportReqVO; +import com.win.module.eam.controller.devicemaintainjob.vo.DeviceMaintainJobDetailPageReqVO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobDetailDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 保养工单子 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceMaintainJobDetailMapper extends BaseMapperX { + + default PageResult selectPage(DeviceMaintainJobDetailPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .betweenIfPresent(DeviceMaintainJobDetailDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DeviceMaintainJobDetailDO::getMasterId, reqVO.getMasterId()) + .eqIfPresent(DeviceMaintainJobDetailDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(DeviceMaintainJobDetailDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(DeviceMaintainJobDetailDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .likeIfPresent(DeviceMaintainJobDetailDO::getName, reqVO.getName()) + .eqIfPresent(DeviceMaintainJobDetailDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceMaintainJobDetailDO::getPeoples, reqVO.getPeoples()) + .eqIfPresent(DeviceMaintainJobDetailDO::getEstimatedMinutes, reqVO.getEstimatedMinutes()) + .eqIfPresent(DeviceMaintainJobDetailDO::getActualMinutes, reqVO.getActualMinutes()) + .eqIfPresent(DeviceMaintainJobDetailDO::getChargePeoples, reqVO.getChargePeoples()) + .betweenIfPresent(DeviceMaintainJobDetailDO::getCompletionTime, reqVO.getCompletionTime()) + .eqIfPresent(DeviceMaintainJobDetailDO::getEngineer, reqVO.getEngineer()) + .eqIfPresent(DeviceMaintainJobDetailDO::getUncompleted, reqVO.getUncompleted()) + .eqIfPresent(DeviceMaintainJobDetailDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeviceMaintainJobDetailDO::getContents, reqVO.getContents()) + .orderByDesc(DeviceMaintainJobDetailDO::getId)); + } + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + + default List selectList(DeviceMaintainJobDetailExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .betweenIfPresent(DeviceMaintainJobDetailDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DeviceMaintainJobDetailDO::getMasterId, reqVO.getMasterId()) + .eqIfPresent(DeviceMaintainJobDetailDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(DeviceMaintainJobDetailDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(DeviceMaintainJobDetailDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .likeIfPresent(DeviceMaintainJobDetailDO::getName, reqVO.getName()) + .eqIfPresent(DeviceMaintainJobDetailDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceMaintainJobDetailDO::getPeoples, reqVO.getPeoples()) + .eqIfPresent(DeviceMaintainJobDetailDO::getEstimatedMinutes, reqVO.getEstimatedMinutes()) + .eqIfPresent(DeviceMaintainJobDetailDO::getActualMinutes, reqVO.getActualMinutes()) + .eqIfPresent(DeviceMaintainJobDetailDO::getChargePeoples, reqVO.getChargePeoples()) + .betweenIfPresent(DeviceMaintainJobDetailDO::getCompletionTime, reqVO.getCompletionTime()) + .eqIfPresent(DeviceMaintainJobDetailDO::getEngineer, reqVO.getEngineer()) + .eqIfPresent(DeviceMaintainJobDetailDO::getUncompleted, reqVO.getUncompleted()) + .eqIfPresent(DeviceMaintainJobDetailDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeviceMaintainJobDetailDO::getContents, reqVO.getContents()) + .orderByDesc(DeviceMaintainJobDetailDO::getId)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintainjob/DeviceMaintainJobMainMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintainjob/DeviceMaintainJobMainMapper.java new file mode 100644 index 0000000..5a7f2e7 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintainjob/DeviceMaintainJobMainMapper.java @@ -0,0 +1,119 @@ +package com.win.module.eam.dal.mysql.devicemaintainjob; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.datapermission.annotation.DataScope; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.framework.mybatis.core.util.QueryWrapperUtils; +import com.win.module.eam.controller.devicemaintainjob.vo.DeviceMaintainJobMainExportReqVO; +import com.win.module.eam.controller.devicemaintainjob.vo.DeviceMaintainJobMainPageReqVO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDOExpand; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobReportDo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 保养工单主 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceMaintainJobMainMapper extends BaseMapperX { + + @DataScope(deptAlias = "job_maintain_main") + default PageResult selectPage(DeviceMaintainJobMainPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DeviceMaintainJobMainDO::getNumber, reqVO.getNumber()) + .likeIfPresent(DeviceMaintainJobMainDO::getDescribes, reqVO.getName()) + .eqIfPresent(DeviceMaintainJobMainDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(DeviceMaintainJobMainDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeviceMaintainJobMainDO::getType, reqVO.getType()) + .eqIfPresent(DeviceMaintainJobMainDO::getFactoryAreaNumber, reqVO.getFactoryAreaNumber()) + .betweenIfPresent(DeviceMaintainJobMainDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DeviceMaintainJobMainDO::getId)); + } + + @DataScope(deptAlias = "job_maintain_main") + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + + @DataScope(deptAlias = "job_maintain_main") + default List selectList(DeviceMaintainJobMainExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceMaintainJobMainDO::getNumber, reqVO.getNumber()) + .likeIfPresent(DeviceMaintainJobMainDO::getDescribes, reqVO.getName()) + .eqIfPresent(DeviceMaintainJobMainDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(DeviceMaintainJobMainDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeviceMaintainJobMainDO::getType, reqVO.getType()) + .eqIfPresent(DeviceMaintainJobMainDO::getFactoryAreaNumber, reqVO.getFactoryAreaNumber()) + .betweenIfPresent(DeviceMaintainJobMainDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DeviceMaintainJobMainDO::getId)); + } + + /** + * APP获取保养工单列表 + * @param page + * @param reqVO + * @return + */ + @DataScope(deptAlias = "d") + IPage getAppPage(Page page, @Param("vo") DeviceMaintainJobMainPageReqVO reqVO); + + + + List selectDeviceMaintainOrderMainDOList(DeviceMaintainJobMainDOExpand reqVO); + + /** + * 根据时间获取未完成的保养工单 + * @param startDate + * @param endDate + * @return + */ + List selectList1(@Param("startDate") String startDate,@Param("endDate") String endDate); + + /** + * 保养计划生成保养工单待接单提醒邮件 + * @param date + * @return + */ + List selectList2(@Param("date") String date,@Param("factoryAreaNumber") String factoryAreaNumber,@Param("type") String type,@Param("status") String status); + + /** + * 首页获取保养月单数据 + * @param date + * @param factoryAreaNumber + * @param type + * @param status + * @return + */ + List selectList3(@Param("date") String date,@Param("factoryAreaNumber") String factoryAreaNumber,@Param("type") String type,@Param("status") String status); + + + + /** + *@Author longlongxiaogege + *@Description //生成保养打印表子内容 + *@Date 13:15 2024/4/18 + *@Param [deviceMaintainJobReportDo] + *@return java.util.List + **/ + List getMaintainReport(DeviceMaintainJobReportDo deviceMaintainJobReportDo); + + /** + *@Author longlongxiaogege + *@Description //生成保养打印表主内容 + *@Date 16:44 2024/4/18 + *@Param [deviceMaintainJobReportDo] + *@return java.util.List + **/ + List getMaintainReportMainInfo(DeviceMaintainJobReportDo deviceMaintainJobReportDo); + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintainjob/MaintainJobDetailItemMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintainjob/MaintainJobDetailItemMapper.java new file mode 100644 index 0000000..7f5b250 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintainjob/MaintainJobDetailItemMapper.java @@ -0,0 +1,46 @@ +package com.win.module.eam.dal.mysql.devicemaintainjob; + +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.devicemaintainjob.vo.MaintainJobDetailItemExportReqVO; +import com.win.module.eam.controller.devicemaintainjob.vo.MaintainJobDetailItemPageReqVO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.MaintainJobDetailItemDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 保养工单子表与备件关系 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface MaintainJobDetailItemMapper extends BaseMapperX { + + default PageResult selectPage(MaintainJobDetailItemPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .orderByDesc(MaintainJobDetailItemDO::getId)); + } + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + + default List selectList(MaintainJobDetailItemExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .orderByDesc(MaintainJobDetailItemDO::getId)); + } + + /** + * 根据保养工单子项id获取备件列表 + * @param maintenanceDetailId + * @return + */ + public List> selectListById(@Param("id") Long maintenanceDetailId); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintainplan/DeviceMaintainPlanMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintainplan/DeviceMaintainPlanMapper.java new file mode 100644 index 0000000..5163faf --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintainplan/DeviceMaintainPlanMapper.java @@ -0,0 +1,73 @@ +package com.win.module.eam.dal.mysql.devicemaintainplan; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.datapermission.annotation.DataScope; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.framework.mybatis.core.util.QueryWrapperUtils; +import com.win.module.eam.controller.devicemaintainplan.vo.DeviceMaintainPlanExportReqVO; +import com.win.module.eam.controller.devicemaintainplan.vo.DeviceMaintainPlanPageReqVO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDOExpand; +import com.win.module.eam.dal.dataobject.devicemaintainplan.DeviceMaintainPlanDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 保养计划 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceMaintainPlanMapper extends BaseMapperX { + + @DataScope(deptAlias = "plan_maintain") + default PageResult selectPage(DeviceMaintainPlanPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DeviceMaintainPlanDO::getNumber, reqVO.getNumber()) + .likeIfPresent(DeviceMaintainPlanDO::getName, reqVO.getName()) + .eqIfPresent(DeviceMaintainPlanDO::getType, reqVO.getType()) + .orderByDesc(DeviceMaintainPlanDO::getId)); + } + + @DataScope(deptAlias = "plan_maintain") + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + + default List selectList(DeviceMaintainPlanExportReqVO reqVO) { + LambdaQueryWrapperX queryWrapper = new LambdaQueryWrapperX() + .eqIfPresent(DeviceMaintainPlanDO::getNumber, reqVO.getNumber()) + .likeIfPresent(DeviceMaintainPlanDO::getName, reqVO.getName()) + .eqIfPresent(DeviceMaintainPlanDO::getType, reqVO.getType()) + .eqIfPresent(DeviceMaintainPlanDO::getMaintenanceType, reqVO.getMaintenanceType()) + .eqIfPresent(DeviceMaintainPlanDO::getCycle, reqVO.getCycle()) + .orderByDesc(DeviceMaintainPlanDO::getId); + return selectList(queryWrapper); + } + + default List selectNoPage(DeviceMaintainPlanPageReqVO reqVO) { + LambdaQueryWrapperX queryWrapper = new LambdaQueryWrapperX() + .eqIfPresent(DeviceMaintainPlanDO::getNumber, reqVO.getNumber()) + .likeIfPresent(DeviceMaintainPlanDO::getName, reqVO.getName()) + .eqIfPresent(DeviceMaintainPlanDO::getType, reqVO.getType()) + .eqIfPresent(DeviceMaintainPlanDO::getMaintenanceType, reqVO.getMaintenanceType()) + .eqIfPresent(DeviceMaintainPlanDO::getCycle, reqVO.getCycle()) + .orderByDesc(DeviceMaintainPlanDO::getId); + return selectList(queryWrapper); + } + + List selectMaintainByDeviceNumberPeriod(DeviceMaintainJobMainDOExpand reqVO); + + void insertMaintain(DeviceMaintainJobMainDOExpand reqVO); + + int deleteByDeviceNumberAndPeriod(DeviceMaintainJobMainDOExpand reqVO); + + DeviceMaintainJobMainDOExpand selectMainPlanName(DeviceMaintainJobMainDOExpand reqVO); + + DeviceMaintainJobMainDOExpand selectMoldMainPlanName(DeviceMaintainJobMainDOExpand reqVO); + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintenancejob/DeviceMaintenanceJobDetailItemMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintenancejob/DeviceMaintenanceJobDetailItemMapper.java new file mode 100644 index 0000000..09ec776 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintenancejob/DeviceMaintenanceJobDetailItemMapper.java @@ -0,0 +1,48 @@ +package com.win.module.eam.dal.mysql.devicemaintenancejob; + +import java.util.*; + +import com.win.framework.common.pojo.CustomConditions; +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.framework.mybatis.core.util.QueryWrapperUtils; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobDetailItemExportReqVO; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobDetailItemPageReqVO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailItemDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 维修工单子表与备件关系 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceMaintenanceJobDetailItemMapper extends BaseMapperX { + + default PageResult selectPage(DeviceMaintenanceJobDetailItemPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .orderByDesc(DeviceMaintenanceJobDetailItemDO::getId)); + } + + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + + + default List selectList(DeviceMaintenanceJobDetailItemExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .orderByDesc(DeviceMaintenanceJobDetailItemDO::getId)); + } + + /** + * 根据维修工单子项id获取备件列表 + * @param maintenanceDetailId + * @return + */ + public List> selectListById(@Param("id") Long maintenanceDetailId); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintenancejob/DeviceMaintenanceJobDetailMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintenancejob/DeviceMaintenanceJobDetailMapper.java new file mode 100644 index 0000000..4a3242e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintenancejob/DeviceMaintenanceJobDetailMapper.java @@ -0,0 +1,71 @@ +package com.win.module.eam.dal.mysql.devicemaintenancejob; + +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobDetailExportReqVO; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobDetailPageReqVO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.Collections; +import java.util.List; + +/** + * 维修工单子 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceMaintenanceJobDetailMapper extends BaseMapperX { + + default PageResult selectPage(DeviceMaintenanceJobDetailPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DeviceMaintenanceJobDetailDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceMaintenanceJobDetailDO::getMasterId, reqVO.getMasterId()) + .eqIfPresent(DeviceMaintenanceJobDetailDO::getDescribes, reqVO.getDescribes()) + .eqIfPresent(DeviceMaintenanceJobDetailDO::getDescribes1, reqVO.getDescribes1()) + .betweenIfPresent(DeviceMaintenanceJobDetailDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DeviceMaintenanceJobDetailDO::getId)); + } + + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + + + default List selectList(DeviceMaintenanceJobDetailExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceMaintenanceJobDetailDO::getNumber, reqVO.getMaintenanceNumber()) + .eqIfPresent(DeviceMaintenanceJobDetailDO::getDescribes, reqVO.getDescribes()) + .eqIfPresent(DeviceMaintenanceJobDetailDO::getDescribes1, reqVO.getDescribes1()) + .betweenIfPresent(DeviceMaintenanceJobDetailDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DeviceMaintenanceJobDetailDO::getId)); + } + + default List selectNoPage(DeviceMaintenanceJobDetailPageReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceMaintenanceJobDetailDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceMaintenanceJobDetailDO::getMasterId, reqVO.getMasterId()) + .eqIfPresent(DeviceMaintenanceJobDetailDO::getDescribes, reqVO.getDescribes()) + .eqIfPresent(DeviceMaintenanceJobDetailDO::getDescribes1, reqVO.getDescribes1()) + .betweenIfPresent(DeviceMaintenanceJobDetailDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DeviceMaintenanceJobDetailDO::getId)); + } + + default List selectByMasterIds(List masterIds) { + LambdaQueryWrapperX queryWrapper = new LambdaQueryWrapperX<>(); + // 检查masterIds是否不为空且其大小不为0 + if (masterIds != null && !masterIds.isEmpty()) { + queryWrapper.in(DeviceMaintenanceJobDetailDO::getMasterId, masterIds); + } else { + return Collections.emptyList(); + } + queryWrapper.orderByDesc(DeviceMaintenanceJobDetailDO::getId); + return selectList(queryWrapper); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintenancejob/DeviceMaintenanceJobMainMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintenancejob/DeviceMaintenanceJobMainMapper.java new file mode 100644 index 0000000..1eaea97 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemaintenancejob/DeviceMaintenanceJobMainMapper.java @@ -0,0 +1,202 @@ +package com.win.module.eam.dal.mysql.devicemaintenancejob; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.datapermission.annotation.DataScope; +import com.win.framework.datapermission.annotation.DataScopeIndividuate; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.framework.mybatis.core.util.QueryWrapperUtils; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobMainExportReqVO; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobMainPageReqVO; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobMainRespVO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + + +/** + * 维修工单主 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceMaintenanceJobMainMapper extends BaseMapperX { + + @DataScopeIndividuate(deptAlias = "job_maintenance_main") + default PageResult selectPage(DeviceMaintenanceJobMainPageReqVO reqVO) { + LambdaQueryWrapperX queryWrapper = new LambdaQueryWrapperX() + .eqIfPresent(DeviceMaintenanceJobMainDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getClasses, reqVO.getClasses()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getMaintenance, reqVO.getMaintenance()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getFaultType, reqVO.getFaultType()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getType, reqVO.getType()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getApplyer, reqVO.getDeclarer()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getVerifyer, reqVO.getVerifyer()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getFactoryAreaNumber, reqVO.getFactoryAreaNumber()) + .orderByDesc(DeviceMaintenanceJobMainDO::getId); + if(reqVO.getType() == null || reqVO.getType().isEmpty()){ + queryWrapper.neIfPresent(DeviceMaintenanceJobMainDO::getType, BasicStatusEnum.BASIC_MOLD.getCode()); + } else { + queryWrapper.eqIfPresent(DeviceMaintenanceJobMainDO::getType, reqVO.getType()); + } + return selectPage(reqVO,queryWrapper); + } + + @DataScopeIndividuate(deptAlias = "job_maintenance_main") + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + + default List selectList(DeviceMaintenanceJobMainExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceMaintenanceJobMainDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getClasses, reqVO.getClasses()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getFaultType, reqVO.getFaultType()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getMaintenance, reqVO.getMaintenance()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getType, reqVO.getType()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getApplyer, reqVO.getDeclarer()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getVerifyer, reqVO.getVerifyer()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getFactoryAreaNumber, reqVO.getFactoryAreaNumber()) + .orderByDesc(DeviceMaintenanceJobMainDO::getId)); + } + + /** + * 更改工单主表状态 + * @param request_number 申请工单号 撤回操作 + * @param id 工单主表可以做 + * @param status 工单主表状态枚举 + * @return + */ + int updateStatus(@Param("requestNumber") String request_number, @Param("id") Long id, @Param("status") String status); + + /** + * 根据申请号删除工单 + * @param request_number + * @return + */ + int deleteStatus(@Param("requestNumber") String request_number); + List> getDictList(@Param("type") String type); + + /** + * APP获取工单列表 + * @param page + * @param reqVO + * @return + */ + @DataScopeIndividuate(deptAlias = "d") + IPage getAppPage(Page page, @Param("vo") DeviceMaintenanceJobMainPageReqVO reqVO); + + /** + * APP获取报修人确认 + * @param page + * @param reqVO + * @return + */ + IPage getAppPage2(Page page, @Param("vo") DeviceMaintenanceJobMainPageReqVO reqVO); + + /** + * 根据工单号查询详情 + * @param number + * @return + */ + DeviceMaintenanceJobMainDO getAppByNumber(@Param("number") String number); + IPage getAppPage1(Page page, @Param("vo") DeviceMaintenanceJobMainPageReqVO reqVO); + + + /** + * 筛选 + * @param + * @return + */ + default Long selectCountByScree(DeviceMaintenanceJobMainRespVO entity) { + return selectCount(new LambdaQueryWrapperX() + .eqIfPresent(DeviceMaintenanceJobMainDO::getNumber, entity.getNumber()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getStatus, entity.getStatus()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getMaintenance, entity.getMaintenance()) + .eqIfPresent(DeviceMaintenanceJobMainDO::getDeleted,0) + .eqIfPresent(DeviceMaintenanceJobMainDO::getAvailable,"TRUE")); + } + + /** + * 获取维修工单列表 + * @return + */ + @DataScope(deptAlias = "d") + List> getList(@Param("type") String type); + + /** + * 根据维修工单状态获取数量 + * @param status + */ + default Long getMaintenanceNumbers(String status) { + return selectCount(new LambdaQueryWrapperX() + .eqIfPresent(DeviceMaintenanceJobMainDO::getStatus, status) + .eqIfPresent(DeviceMaintenanceJobMainDO::getDeleted,0) + .eqIfPresent(DeviceMaintenanceJobMainDO::getAvailable,"TRUE")); + } + + /** + * 获取看板工单分页 + * @param page + * @param reqVO + * @return + */ + IPage getKanBanAppPage(Page page, @Param("vo") DeviceMaintenanceJobMainPageReqVO reqVO); + + /** + * 看板获取近七天设备故障次数 + * @return + */ + List> getDeviceSealNumberList(@Param("startDate") String startDate,@Param("endDate") String endDate); + + /** + * 近七天维修工单数 + * @param date + * @return + */ + List> getOrderBarData(@Param("date") String date); + + /** + * 维修工单故障类型数量饼状图(日期预留) + * @param startDate + * @param endDate + * @return + */ + List> getOrderPieData(@Param("startDate") String startDate,@Param("endDate") String endDate); + + /** + * 获得近七天维修人员的维修工作完成情况 + * @param startDate + * @param endDate + * @return + */ + List> getPeopleWorkList(@Param("startDate") String startDate,@Param("endDate") String endDate); + + /** + * 根据时间获取未完成的维修工单 + * @param startDate + * @param endDate + * @return + */ + List selectList1(@Param("startDate") String startDate, @Param("endDate") String endDate); + + /** + * 获取当月维修时间() + * @param date + * @return + */ + Integer selectMinuteSum(@Param("date") String date,@Param("factoryAreaNumber") String factoryAreaNumber); + +} + diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemolditems/DeviceMoldItemsMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemolditems/DeviceMoldItemsMapper.java new file mode 100644 index 0000000..54efef2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemolditems/DeviceMoldItemsMapper.java @@ -0,0 +1,48 @@ +package com.win.module.eam.dal.mysql.devicemolditems; + +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.eam.controller.devicemolditems.vo.DeviceMoldItemsExportReqVO; +import com.win.module.eam.controller.devicemolditems.vo.DeviceMoldItemsPageReqVO; +import com.win.module.eam.dal.dataobject.devicemolditems.DeviceMoldItemsDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 项记录表(设备 模具 保养 维修 巡检点检) Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceMoldItemsMapper extends BaseMapperX { + + default PageResult selectPage(DeviceMoldItemsPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(DeviceMoldItemsDO::getName, reqVO.getName()) + .eqIfPresent(DeviceMoldItemsDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(DeviceMoldItemsDO::getType, reqVO.getType()) + .eqIfPresent(DeviceMoldItemsDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeviceMoldItemsDO::getEquipmentParts, reqVO.getEquipmentParts()) + .orderByDesc(DeviceMoldItemsDO::getId)); + } + + default List selectList(DeviceMoldItemsExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(DeviceMoldItemsDO::getName, reqVO.getName()) + .eqIfPresent(DeviceMoldItemsDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(DeviceMoldItemsDO::getType, reqVO.getType()) + .eqIfPresent(DeviceMoldItemsDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeviceMoldItemsDO::getEquipmentParts, reqVO.getEquipmentParts()) + .orderByDesc(DeviceMoldItemsDO::getId)); + } + + List selectListByDeviceNumberAndPeriod(DeviceMoldItemsDO deviceMoldItemsDO); + + + + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemolditemshistory/DeviceMoldItemsHistoryMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemolditemshistory/DeviceMoldItemsHistoryMapper.java new file mode 100644 index 0000000..a717316 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicemolditemshistory/DeviceMoldItemsHistoryMapper.java @@ -0,0 +1,62 @@ +package com.win.module.eam.dal.mysql.devicemolditemshistory; + +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.eam.controller.devicemolditemshistory.vo.DeviceMoldItemsHistoryExportReqVO; +import com.win.module.eam.controller.devicemolditemshistory.vo.DeviceMoldItemsHistoryPageReqVO; +import com.win.module.eam.dal.dataobject.devicemolditemshistory.DeviceMoldItemsHistoryDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 项记录历史表(设备 模具 保养 维修 巡检点检) Mapper + * + * @author Lu.jl + */ +@Mapper +public interface DeviceMoldItemsHistoryMapper extends BaseMapperX { + + default PageResult selectPage(DeviceMoldItemsHistoryPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(DeviceMoldItemsHistoryDO::getName, reqVO.getName()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getExecutionCycle, reqVO.getExecutionCycle()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getEquipmentParts, reqVO.getEquipmentParts()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getType, reqVO.getType()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getPeoples, reqVO.getPeoples()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getEstimatedMinutes, reqVO.getEstimatedMinutes()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(DeviceMoldItemsHistoryDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getPeopleNum, reqVO.getPeopleNum()) + .betweenIfPresent(DeviceMoldItemsHistoryDO::getMaintenanceTime, reqVO.getMaintenanceTime()) + .orderByDesc(DeviceMoldItemsHistoryDO::getId)); + } + + default List selectList(DeviceMoldItemsHistoryExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(DeviceMoldItemsHistoryDO::getName, reqVO.getName()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getExecutionCycle, reqVO.getExecutionCycle()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getEquipmentParts, reqVO.getEquipmentParts()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getType, reqVO.getType()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getPeoples, reqVO.getPeoples()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getEstimatedMinutes, reqVO.getEstimatedMinutes()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(DeviceMoldItemsHistoryDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .eqIfPresent(DeviceMoldItemsHistoryDO::getPeopleNum, reqVO.getPeopleNum()) + .betweenIfPresent(DeviceMoldItemsHistoryDO::getMaintenanceTime, reqVO.getMaintenanceTime()) + .orderByDesc(DeviceMoldItemsHistoryDO::getId)); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicerepairrequest/DeviceRepairRequestMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicerepairrequest/DeviceRepairRequestMapper.java new file mode 100644 index 0000000..2ccc3e9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicerepairrequest/DeviceRepairRequestMapper.java @@ -0,0 +1,95 @@ +package com.win.module.eam.dal.mysql.devicerepairrequest; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.devicerepairrequest.vo.DeviceRepairRequestExportReqVO; +import com.win.module.eam.controller.devicerepairrequest.vo.DeviceRepairRequestPageReqVO; +import com.win.module.eam.dal.dataobject.devicerepairrequest.DeviceRepairRequestDO; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 报修申请 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceRepairRequestMapper extends BaseMapperX { + + default PageResult selectPage(DeviceRepairRequestPageReqVO reqVO) { + LambdaQueryWrapperX queryWrapper = new LambdaQueryWrapperX() + .eqIfPresent(DeviceRepairRequestDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceRepairRequestDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(DeviceRepairRequestDO::getFactoryAreaNumber, reqVO.getFactoryAreaNumber()) + .eqIfPresent(DeviceRepairRequestDO::getResult, reqVO.getResult()) + .orderByDesc(DeviceRepairRequestDO::getId); + if(reqVO.getType() == null || reqVO.getType().isEmpty()){ + queryWrapper.neIfPresent(DeviceRepairRequestDO::getType, BasicStatusEnum.BASIC_MOLD.getCode()); + } else { + queryWrapper.eqIfPresent(DeviceRepairRequestDO::getType, reqVO.getType()); + } + + return selectPage(reqVO, queryWrapper); + } + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + + + default List selectList(DeviceRepairRequestExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceRepairRequestDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceRepairRequestDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(DeviceRepairRequestDO::getFactoryAreaNumber, reqVO.getFactoryAreaNumber()) + .eqIfPresent(DeviceRepairRequestDO::getType, reqVO.getType()) + .orderByDesc(DeviceRepairRequestDO::getId)); + } + + /** + *根据订单号查询该订单是是否为接单状态 + * @param id + * @param result + * @return + */ + default Long selectCountById(Long id,String result) { + return selectCount(new LambdaQueryWrapperX() + .eqIfPresent(DeviceRepairRequestDO::getId, id) + .eqIfPresent(DeviceRepairRequestDO::getDeleted,0) + .eqIfPresent(DeviceRepairRequestDO::getResult,result)); + } + + /** + * APP获取未完成的申请列表 + * @param page + * @param reqVO + * @return + */ + IPage getAppPage(Page page, @Param("vo") DeviceRepairRequestPageReqVO reqVO); + + /** + * 根据报修申请号查询报修详情 + * @param + * @return + */ + Map getDetailsByNumber(@Param("number") String requestNumber,@Param("type") String type); + + /** + * 根据报修申请号查询报修订单 + * @param + * @return + */ + DeviceRepairRequestDO getOrderByNumber(@Param("number") String requestNumber); + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailMapper.java new file mode 100644 index 0000000..eb5419d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailMapper.java @@ -0,0 +1,54 @@ +package com.win.module.eam.dal.mysql.devicespotinspectionrecord; + +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.devicespotinspectionrecord.vo.DeviceSpotInspectionRecordDetailExportReqVO; +import com.win.module.eam.controller.devicespotinspectionrecord.vo.DeviceSpotInspectionRecordDetailPageReqVO; +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 巡检点检记录子 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceSpotInspectionRecordDetailMapper extends BaseMapperX { + + default PageResult selectPage(DeviceSpotInspectionRecordDetailPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(DeviceSpotInspectionRecordDetailDO::getName, reqVO.getName()) + .eqIfPresent(DeviceSpotInspectionRecordDetailDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceSpotInspectionRecordDetailDO::getMasterId, reqVO.getMasterId()) + .eqIfPresent(DeviceSpotInspectionRecordDetailDO::getIsConform, reqVO.getIsConform()) + .betweenIfPresent(DeviceSpotInspectionRecordDetailDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DeviceSpotInspectionRecordDetailDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(DeviceSpotInspectionRecordDetailDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(DeviceSpotInspectionRecordDetailDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .orderByDesc(DeviceSpotInspectionRecordDetailDO::getId)); + } + + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + + + default List selectList(DeviceSpotInspectionRecordDetailExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(DeviceSpotInspectionRecordDetailDO::getName, reqVO.getName()) + .eqIfPresent(DeviceSpotInspectionRecordDetailDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceSpotInspectionRecordDetailDO::getIsConform, reqVO.getIsConform()) + .betweenIfPresent(DeviceSpotInspectionRecordDetailDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(DeviceSpotInspectionRecordDetailDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(DeviceSpotInspectionRecordDetailDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(DeviceSpotInspectionRecordDetailDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .orderByDesc(DeviceSpotInspectionRecordDetailDO::getId)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicespotinspectionrecord/DeviceSpotInspectionRecordMainMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicespotinspectionrecord/DeviceSpotInspectionRecordMainMapper.java new file mode 100644 index 0000000..fa3adeb --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/devicespotinspectionrecord/DeviceSpotInspectionRecordMainMapper.java @@ -0,0 +1,69 @@ +package com.win.module.eam.dal.mysql.devicespotinspectionrecord; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.datapermission.annotation.DataScope; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.framework.mybatis.core.util.QueryWrapperUtils; +import com.win.module.eam.controller.devicespotinspectionrecord.vo.DeviceSpotInspectionRecordMainExportReqVO; +import com.win.module.eam.controller.devicespotinspectionrecord.vo.DeviceSpotInspectionRecordMainPageReqVO; +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordMainDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 检修工单主 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface DeviceSpotInspectionRecordMainMapper extends BaseMapperX { + @DataScope(deptAlias = "record_spot_inspection_main") + default PageResult selectPage(DeviceSpotInspectionRecordMainPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DeviceSpotInspectionRecordMainDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceSpotInspectionRecordMainDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(DeviceSpotInspectionRecordMainDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeviceSpotInspectionRecordMainDO::getType, reqVO.getType()) + .orderByDesc(DeviceSpotInspectionRecordMainDO::getId)); + } + + @DataScope(deptAlias = "record_spot_inspection_main") + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + + + default List selectList(DeviceSpotInspectionRecordMainExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(DeviceSpotInspectionRecordMainDO::getNumber, reqVO.getNumber()) + .eqIfPresent(DeviceSpotInspectionRecordMainDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(DeviceSpotInspectionRecordMainDO::getStatus, reqVO.getStatus()) + .eqIfPresent(DeviceSpotInspectionRecordMainDO::getType, reqVO.getType()) + .orderByDesc(DeviceSpotInspectionRecordMainDO::getId)); + } + + /** + * 根据时间范围获取当前数据 + * @param times + * @return + */ + List selectSpotInspectionTask(@Param("times") String times,@Param("factoryAreaNumber") String factoryAreaNumber,@Param("classes") String classes); + + /** + * APP + * @param page + * @param reqVO + * @return + */ + @DataScope(deptAlias = "d") + IPage getAppPage(Page page, @Param("vo") DeviceSpotInspectionRecordMainPageReqVO reqVO); + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/factoryarea/FactoryAreaMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/factoryarea/FactoryAreaMapper.java new file mode 100644 index 0000000..3fbf86f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/factoryarea/FactoryAreaMapper.java @@ -0,0 +1,47 @@ +package com.win.module.eam.dal.mysql.factoryarea; + +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.eam.controller.factoryarea.vo.FactoryAreaExportReqVO; +import com.win.module.eam.controller.factoryarea.vo.FactoryAreaPageReqVO; +import com.win.module.eam.dal.dataobject.factoryarea.FactoryAreaDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 厂区 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface FactoryAreaMapper extends BaseMapperX { + + default PageResult selectPage(FactoryAreaPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(FactoryAreaDO::getNumber, reqVO.getNumber()) + .likeIfPresent(FactoryAreaDO::getName, reqVO.getName()) + .eqIfPresent(FactoryAreaDO::getDescription, reqVO.getDescription()) + .eqIfPresent(FactoryAreaDO::getLeader, reqVO.getLeader()) + .eqIfPresent(FactoryAreaDO::getLeaderPhone, reqVO.getLeaderPhone()) + .eqIfPresent(FactoryAreaDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(FactoryAreaDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(FactoryAreaDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .orderByDesc(FactoryAreaDO::getId)); + } + + default List selectList(FactoryAreaExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(FactoryAreaDO::getNumber, reqVO.getNumber()) + .likeIfPresent(FactoryAreaDO::getName, reqVO.getName()) + .eqIfPresent(FactoryAreaDO::getDescription, reqVO.getDescription()) + .eqIfPresent(FactoryAreaDO::getLeader, reqVO.getLeader()) + .eqIfPresent(FactoryAreaDO::getLeaderPhone, reqVO.getLeaderPhone()) + .eqIfPresent(FactoryAreaDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(FactoryAreaDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(FactoryAreaDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .orderByDesc(FactoryAreaDO::getId)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/fixedassets/FixedAssetsMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/fixedassets/FixedAssetsMapper.java new file mode 100644 index 0000000..03d7122 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/fixedassets/FixedAssetsMapper.java @@ -0,0 +1,53 @@ +package com.win.module.eam.dal.mysql.fixedassets; + +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.fixedassets.vo.FixedAssetsExportReqVO; +import com.win.module.eam.controller.fixedassets.vo.FixedAssetsPageReqVO; +import com.win.module.eam.dal.dataobject.fixedassets.FixedAssetsDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 固定资产 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface FixedAssetsMapper extends BaseMapperX { + + default PageResult selectPage(FixedAssetsPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(FixedAssetsDO::getNumber, reqVO.getNumber()) + .likeIfPresent(FixedAssetsDO::getName, reqVO.getName()) + .eqIfPresent(FixedAssetsDO::getAccountingUnit, reqVO.getAccountingUnit()) + .eqIfPresent(FixedAssetsDO::getLocationNumber, reqVO.getLocationNumber()) + .betweenIfPresent(FixedAssetsDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(FixedAssetsDO::getManageDept, reqVO.getManageDept()) + .eqIfPresent(FixedAssetsDO::getAvailable, reqVO.getAvailable()) + .orderByDesc(FixedAssetsDO::getId)); + } + + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + + + default List selectList(FixedAssetsExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(FixedAssetsDO::getNumber, reqVO.getNumber()) + .likeIfPresent(FixedAssetsDO::getName, reqVO.getName()) + .eqIfPresent(FixedAssetsDO::getAccountingUnit, reqVO.getAccountingUnit()) + .eqIfPresent(FixedAssetsDO::getLocationNumber, reqVO.getLocationNumber()) + .eqIfPresent(FixedAssetsDO::getManageDept, reqVO.getManageDept()) + .betweenIfPresent(FixedAssetsDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(FixedAssetsDO::getAvailable, reqVO.getAvailable()) + .orderByDesc(FixedAssetsDO::getId)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/item/ItemMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/item/ItemMapper.java new file mode 100644 index 0000000..4573fb1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/item/ItemMapper.java @@ -0,0 +1,84 @@ +package com.win.module.eam.dal.mysql.item; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.item.vo.ItemExportReqVO; +import com.win.module.eam.controller.item.vo.ItemPageReqVO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 备件 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface ItemMapper extends BaseMapperX { + + default PageResult selectPage(ItemPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ItemDO::getNumber, reqVO.getNumber()) + .eqIfPresent(ItemDO::getAvailable, reqVO.getAvailable()) + .likeIfPresent(ItemDO::getName, reqVO.getName()) + .orderByDesc(ItemDO::getId)); + } + + default List selectList(ItemExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ItemDO::getNumber, reqVO.getNumber()) + .eqIfPresent(ItemDO::getAvailable, reqVO.getAvailable()) + .likeIfPresent(ItemDO::getName, reqVO.getName()) + .orderByDesc(ItemDO::getId)); + } + + /** + *根据设备模具查询相关备件 + * @return + */ + List> getListByNumber(@Param("number") String number,@Param("name") String name); + + /** + * 获取全局备件 + * @return + */ + List> getListByALL( @Param("name") String name); + + /** + * app我的备件 + * @param page + * @param reqVO + * @return + */ + IPage getAppPage(Page page, @Param("vo") ItemPageReqVO reqVO); + + List getListByAccounts(); + + /** + * 备件 + * @return + */ + List scanCodeByNumber(@Param("number") String number); + + default PageResult getItemSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + + default List selectNoPage(ItemPageReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ItemDO::getNumber, reqVO.getNumber()) + .eqIfPresent(ItemDO::getAvailable, reqVO.getAvailable()) + .likeIfPresent(ItemDO::getName, reqVO.getName()) + .orderByDesc(ItemDO::getId)); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemaccounts/ItemAccountsMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemaccounts/ItemAccountsMapper.java new file mode 100644 index 0000000..1bf6489 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemaccounts/ItemAccountsMapper.java @@ -0,0 +1,158 @@ +package com.win.module.eam.dal.mysql.itemaccounts; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.itemaccounts.vo.ItemAccountsCreateReqVO; +import com.win.module.eam.controller.itemaccounts.vo.ItemAccountsExportReqVO; +import com.win.module.eam.controller.itemaccounts.vo.ItemAccountsPageReqVO; +import com.win.module.eam.convert.itemaccounts.ItemAccountsConvert; +import com.win.module.eam.dal.dataobject.itemaccounts.ItemAccountsDO; +import com.win.module.eam.enums.transaction.TransactionEnum; +import com.win.module.eam.enums.transactionType.TransactionTypeEnum; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.eam.enums.ErrorCodeConstants.COUNT_IS_HAVA; + +/** + * 备件台账 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface ItemAccountsMapper extends BaseMapperX { + + /** + * 更新库存余额数量,出库qty是负数 + */ + default Boolean updateItemAccountsQty(ItemAccountsCreateReqVO param, String transactionType, String InventoryAction) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("item_number", param.getItemNumber()); + queryWrapper.eq("location_number", param.getLocationNumber()); + queryWrapper.eq("is_in_account", param.getIsInAccount()); + ItemAccountsDO itemAccountsDO = selectOne(queryWrapper); + int result; + if (itemAccountsDO == null) {//不存在新增 + itemAccountsDO = ItemAccountsConvert.INSTANCE.convert(param); + result = this.insert(itemAccountsDO); + } else { + //存在只更新数量,获取差异的数量 + BigDecimal qtyNew = param.getQty(); + //如果是出库类型库存 例如:+(-2) + if (TransactionTypeEnum.TransactionType_OUT.getCode().equals(transactionType)&& TransactionEnum.REQUISITION_OUT.getCode().equals(InventoryAction)) { + //判断库存是否足够 + if (itemAccountsDO.getQty().compareTo(param.getQty()) >=0) { + qtyNew = BigDecimal.ZERO.subtract(qtyNew); + } else { + //库存不足 + throw exception(COUNT_IS_HAVA); + } + } + itemAccountsDO.setQty(itemAccountsDO.getQty().add(qtyNew)); + result = this.updateById(itemAccountsDO); + } + return result > 0; + } + + default PageResult selectPage(ItemAccountsPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ItemAccountsDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(ItemAccountsDO::getAvailable, reqVO.getAvailable()) + .orderByDesc(ItemAccountsDO::getId)); + } + + default List selectList(ItemAccountsExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ItemAccountsDO::getItemNumber, reqVO.getItemNumber()) + .orderByDesc(ItemAccountsDO::getId)); + } + + default Long selectCountByItemNumber(String itemNumber) { + return selectCount(new LambdaQueryWrapperX() + .eqIfPresent(ItemAccountsDO::getItemNumber, itemNumber) + .eqIfPresent(ItemAccountsDO::getAvailable,"TRUE")); + } + + /** + * APP获取所有设备列表 + * + * @param page + * @param reqVO + * @return + */ + IPage getAppPage(Page page, @Param("vo") ItemAccountsPageReqVO reqVO); + + /** + * 获取所有模具列表包括维修中和正常的 + * + * @return + */ + List> selectAll(); + + /** + * 根据备件号获取账内账外库存总数 + * + * @param number + * @return + */ + default BigDecimal selectInventorySum(String number) { + QueryWrapper itemAccountsQueryWrapper = new QueryWrapper<>(); + itemAccountsQueryWrapper.eq("item_number", number); + itemAccountsQueryWrapper.eq("deleted", 0); + itemAccountsQueryWrapper.eq("available", "TRUE"); + List itemAccountsDOS = selectList(itemAccountsQueryWrapper);//最多有两个账内和账外 + BigDecimal sum = BigDecimal.ZERO; + for (ItemAccountsDO en : itemAccountsDOS) { + sum = sum.add(en.getQty()); + } + return sum.setScale(2); + } + + /** + * 根据备件号获取账内账外库位号 + * + * @param number 备件号 + * @param type TRUE账内 FALSE账外 + * @return + */ + default Map selectLocationNumber(String number, String type) { + Map map = new HashMap<>(); + String locationNumber = ""; + String areaNumber = ""; + QueryWrapper itemAccountsQueryWrapper = new QueryWrapper<>(); + itemAccountsQueryWrapper.eq("item_number", number); + itemAccountsQueryWrapper.eq("deleted", 0); + itemAccountsQueryWrapper.eq("available", "TRUE"); + itemAccountsQueryWrapper.eq("is_in_account", type); + List itemAccountsDOS = selectList(itemAccountsQueryWrapper);//最多有两个账内和账外 + if (itemAccountsDOS.size() > 0) { + locationNumber = itemAccountsDOS.get(0).getLocationNumber(); + areaNumber = itemAccountsDOS.get(0).getAreaNumber(); + } + map.put("locationNumber", locationNumber); + map.put("areaNumber", areaNumber); + return map; + } + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + + default List selectNoPage(ItemAccountsPageReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ItemAccountsDO::getId, reqVO.getId()) + .orderByDesc(ItemAccountsDO::getId)); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemapplyrequest/ItemApplyRequestDetailMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemapplyrequest/ItemApplyRequestDetailMapper.java new file mode 100644 index 0000000..f945963 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemapplyrequest/ItemApplyRequestDetailMapper.java @@ -0,0 +1,58 @@ +package com.win.module.eam.dal.mysql.itemapplyrequest; + +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.eam.controller.itemapplyrequest.vo.ItemApplyRequestDetailExportReqVO; +import com.win.module.eam.controller.itemapplyrequest.vo.ItemApplyRequestDetailPageReqVO; +import com.win.module.eam.dal.dataobject.itemapplyrequest.ItemApplyRequestDetailDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 备件申领记录子 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface ItemApplyRequestDetailMapper extends BaseMapperX { + + default PageResult selectPage(ItemApplyRequestDetailPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ItemApplyRequestDetailDO::getMasterId,reqVO.getMasterId()) + .eqIfPresent(ItemApplyRequestDetailDO::getNumber, reqVO.getNumber()) + .eqIfPresent(ItemApplyRequestDetailDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(ItemApplyRequestDetailDO::getQty, reqVO.getQty()) + .eqIfPresent(ItemApplyRequestDetailDO::getCurrentQty, reqVO.getCurrentQty()) + .betweenIfPresent(ItemApplyRequestDetailDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(ItemApplyRequestDetailDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(ItemApplyRequestDetailDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(ItemApplyRequestDetailDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .orderByDesc(ItemApplyRequestDetailDO::getId)); + } + + default List selectList(ItemApplyRequestDetailExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ItemApplyRequestDetailDO::getNumber, reqVO.getNumber()) + .eqIfPresent(ItemApplyRequestDetailDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(ItemApplyRequestDetailDO::getQty, reqVO.getQty()) + .eqIfPresent(ItemApplyRequestDetailDO::getCurrentQty, reqVO.getCurrentQty()) + .betweenIfPresent(ItemApplyRequestDetailDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(ItemApplyRequestDetailDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(ItemApplyRequestDetailDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(ItemApplyRequestDetailDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .orderByDesc(ItemApplyRequestDetailDO::getId)); + } + + /** + * 根据申领number获取详情信息 + * @param number + * @return + */ + List> appGetByNumber(@Param("number") String number); + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemapplyrequest/ItemApplyRequestMainMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemapplyrequest/ItemApplyRequestMainMapper.java new file mode 100644 index 0000000..2680ece --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemapplyrequest/ItemApplyRequestMainMapper.java @@ -0,0 +1,80 @@ +package com.win.module.eam.dal.mysql.itemapplyrequest; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.itemapplyrequest.vo.ItemApplyRequestMainExportReqVO; +import com.win.module.eam.controller.itemapplyrequest.vo.ItemApplyRequestMainPageReqVO; +import com.win.module.eam.dal.dataobject.itemapplyrequest.ItemApplyRequestMainDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 备件申领记录主 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface ItemApplyRequestMainMapper extends BaseMapperX { + + default PageResult selectPage(ItemApplyRequestMainPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ItemApplyRequestMainDO::getNumber, reqVO.getNumber()) + .betweenIfPresent(ItemApplyRequestMainDO::getOutTime, reqVO.getOutTime()) + .betweenIfPresent(ItemApplyRequestMainDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(ItemApplyRequestMainDO::getStatus, reqVO.getStatus()) + .orderByDesc(ItemApplyRequestMainDO::getId)); + } + + default List selectList(ItemApplyRequestMainExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ItemApplyRequestMainDO::getNumber, reqVO.getNumber()) + .betweenIfPresent(ItemApplyRequestMainDO::getOutTime, reqVO.getOutTime()) + .betweenIfPresent(ItemApplyRequestMainDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ItemApplyRequestMainDO::getId)); + } + + /** + * 根据申领number获取详情信息 + * @param number + * @return + */ + Map appGetByNumber(@Param("number") String number); + + /** + * APP获取申领工单列表 + * @param page + * @param reqVO + * @return + */ + IPage getAppPage(Page page, @Param("vo") ItemApplyRequestMainPageReqVO reqVO); + + /** + * APP审批获取申领工单列表 + * @param page + * @param reqVO + * @return + */ + IPage getAppApprovePage(Page page, @Param("vo") ItemApplyRequestMainPageReqVO reqVO); + + /** + * APP备件领用出库 + * @param page + * @param reqVO + * @return + */ + IPage getAppOutOperaPage(Page page, @Param("vo") ItemApplyRequestMainPageReqVO reqVO); + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/iteminlocation/ItemInLocationMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/iteminlocation/ItemInLocationMapper.java new file mode 100644 index 0000000..b9561d3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/iteminlocation/ItemInLocationMapper.java @@ -0,0 +1,49 @@ +package com.win.module.eam.dal.mysql.iteminlocation; + +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.iteminlocation.vo.ItemInLocationExportReqVO; +import com.win.module.eam.controller.iteminlocation.vo.ItemInLocationPageReqVO; +import com.win.module.eam.dal.dataobject.iteminlocation.ItemInLocationDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 备件入库记录 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface ItemInLocationMapper extends BaseMapperX { + + default PageResult selectPage(ItemInLocationPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ItemInLocationDO::getId, reqVO.getId()) + .eqIfPresent(ItemInLocationDO::getNumber, reqVO.getNumber()) + .eqIfPresent(ItemInLocationDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(ItemInLocationDO::getLocationNumber, reqVO.getLocationNumber()) + .eqIfPresent(ItemInLocationDO::getType, reqVO.getType()) + .eqIfPresent(ItemInLocationDO::getQty, reqVO.getQty()) + .orderByDesc(ItemInLocationDO::getId)); + } + + default List selectList(ItemInLocationExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ItemInLocationDO::getId, reqVO.getId()) + .eqIfPresent(ItemInLocationDO::getNumber, reqVO.getNumber()) + .eqIfPresent(ItemInLocationDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(ItemInLocationDO::getLocationNumber, reqVO.getLocationNumber()) + .eqIfPresent(ItemInLocationDO::getType, reqVO.getType()) + .eqIfPresent(ItemInLocationDO::getQty, reqVO.getQty()) + .orderByDesc(ItemInLocationDO::getId)); + } + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemlocationreplace/ItemLocationReplaceMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemlocationreplace/ItemLocationReplaceMapper.java new file mode 100644 index 0000000..0c924e1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemlocationreplace/ItemLocationReplaceMapper.java @@ -0,0 +1,47 @@ +package com.win.module.eam.dal.mysql.itemlocationreplace; + +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.itemlocationreplace.vo.ItemLocationReplaceExportReqVO; +import com.win.module.eam.controller.itemlocationreplace.vo.ItemLocationReplacePageReqVO; +import com.win.module.eam.dal.dataobject.itemlocationreplace.ItemLocationReplaceDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 备件库位变更记录 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface ItemLocationReplaceMapper extends BaseMapperX { + + default PageResult selectPage(ItemLocationReplacePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ItemLocationReplaceDO::getLocationNumber, reqVO.getLocationNumber()) + .eqIfPresent(ItemLocationReplaceDO::getRanks, reqVO.getRanks()) + .eqIfPresent(ItemLocationReplaceDO::getOldItemNumber, reqVO.getOldItemNumber()) + .eqIfPresent(ItemLocationReplaceDO::getItemNumber, reqVO.getItemNumber()) + .betweenIfPresent(ItemLocationReplaceDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ItemLocationReplaceDO::getId)); + } + + default List selectList(ItemLocationReplaceExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ItemLocationReplaceDO::getLocationNumber, reqVO.getLocationNumber()) + .eqIfPresent(ItemLocationReplaceDO::getRanks, reqVO.getRanks()) + .eqIfPresent(ItemLocationReplaceDO::getOldItemNumber, reqVO.getOldItemNumber()) + .eqIfPresent(ItemLocationReplaceDO::getItemNumber, reqVO.getItemNumber()) + .betweenIfPresent(ItemLocationReplaceDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ItemLocationReplaceDO::getId)); + } + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemmaintenancerecord/ItemMaintenanceRecordMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemmaintenancerecord/ItemMaintenanceRecordMapper.java new file mode 100644 index 0000000..600b80a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemmaintenancerecord/ItemMaintenanceRecordMapper.java @@ -0,0 +1,53 @@ +package com.win.module.eam.dal.mysql.itemmaintenancerecord; + +import java.util.*; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.datapermission.annotation.DataScope; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.module.eam.controller.itemmaintenancerecord.vo.ItemMaintenanceRecordExportReqVO; +import com.win.module.eam.controller.itemmaintenancerecord.vo.ItemMaintenanceRecordPageReqVO; +import com.win.module.eam.dal.dataobject.itemmaintenancerecord.ItemMaintenanceRecordDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * 备件维修记录 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface ItemMaintenanceRecordMapper extends BaseMapperX { + default PageResult selectPage(ItemMaintenanceRecordPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ItemMaintenanceRecordDO::getNumber, reqVO.getNumber()) + .eqIfPresent(ItemMaintenanceRecordDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(ItemMaintenanceRecordDO::getResult, reqVO.getResult()) +// .eqIfPresent(ItemMaintenanceRecordDO::getCreator, getLoginUserId().toString()) + .betweenIfPresent(ItemMaintenanceRecordDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ItemMaintenanceRecordDO::getId)); + } + + default List selectList(ItemMaintenanceRecordExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ItemMaintenanceRecordDO::getNumber, reqVO.getNumber()) + .eqIfPresent(ItemMaintenanceRecordDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(ItemMaintenanceRecordDO::getResult, reqVO.getResult()) + .betweenIfPresent(ItemMaintenanceRecordDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ItemMaintenanceRecordDO::getId)); + } + + /** + * APP获取我的维修记录 + * @param page + * @param reqVO + * @return + */ + IPage getAppPage(Page page, @Param("vo") ItemMaintenanceRecordPageReqVO reqVO); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemorder/ItemOrderDetailMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemorder/ItemOrderDetailMapper.java new file mode 100644 index 0000000..8b0c9a5 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemorder/ItemOrderDetailMapper.java @@ -0,0 +1,73 @@ +package com.win.module.eam.dal.mysql.itemorder; + +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.eam.controller.itemorder.vo.ItemOrderDetailExportReqVO; +import com.win.module.eam.controller.itemorder.vo.ItemOrderDetailPageReqVO; +import com.win.module.eam.dal.dataobject.itemorder.ItemOrderDetailDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 备件采购订单子 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface ItemOrderDetailMapper extends BaseMapperX { + + default PageResult selectPage(ItemOrderDetailPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ItemOrderDetailDO::getMasterId,reqVO.getMasterId()) + .eqIfPresent(ItemOrderDetailDO::getSerialNumber, reqVO.getSerialNumber()) + .eqIfPresent(ItemOrderDetailDO::getRequestNo, reqVO.getRequestNo()) + .eqIfPresent(ItemOrderDetailDO::getRequestPerson, reqVO.getRequestPerson()) + .eqIfPresent(ItemOrderDetailDO::getItemNumber, reqVO.getItemNumber()) + .likeIfPresent(ItemOrderDetailDO::getItemName, reqVO.getItemName()) + .eqIfPresent(ItemOrderDetailDO::getSubjectCode, reqVO.getSubjectCode()) + .eqIfPresent(ItemOrderDetailDO::getSpecifications, reqVO.getSpecifications()) + .betweenIfPresent(ItemOrderDetailDO::getDeliveryTime, reqVO.getDeliveryTime()) + .eqIfPresent(ItemOrderDetailDO::getUom, reqVO.getUom()) + .eqIfPresent(ItemOrderDetailDO::getQty, reqVO.getQty()) + .eqIfPresent(ItemOrderDetailDO::getSinglePrice, reqVO.getSinglePrice()) + .eqIfPresent(ItemOrderDetailDO::getTaxPrice, reqVO.getTaxPrice()) + .betweenIfPresent(ItemOrderDetailDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(ItemOrderDetailDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(ItemOrderDetailDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(ItemOrderDetailDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .orderByDesc(ItemOrderDetailDO::getId)); + } + + default List selectList(ItemOrderDetailExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ItemOrderDetailDO::getSerialNumber, reqVO.getSerialNumber()) + .eqIfPresent(ItemOrderDetailDO::getRequestNo, reqVO.getRequestNo()) + .eqIfPresent(ItemOrderDetailDO::getRequestPerson, reqVO.getRequestPerson()) + .eqIfPresent(ItemOrderDetailDO::getItemNumber, reqVO.getItemNumber()) + .likeIfPresent(ItemOrderDetailDO::getItemName, reqVO.getItemName()) + .eqIfPresent(ItemOrderDetailDO::getSubjectCode, reqVO.getSubjectCode()) + .eqIfPresent(ItemOrderDetailDO::getSpecifications, reqVO.getSpecifications()) + .betweenIfPresent(ItemOrderDetailDO::getDeliveryTime, reqVO.getDeliveryTime()) + .eqIfPresent(ItemOrderDetailDO::getUom, reqVO.getUom()) + .eqIfPresent(ItemOrderDetailDO::getQty, reqVO.getQty()) + .eqIfPresent(ItemOrderDetailDO::getSinglePrice, reqVO.getSinglePrice()) + .eqIfPresent(ItemOrderDetailDO::getTaxPrice, reqVO.getTaxPrice()) + .betweenIfPresent(ItemOrderDetailDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(ItemOrderDetailDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(ItemOrderDetailDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(ItemOrderDetailDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .orderByDesc(ItemOrderDetailDO::getId)); + } + + /** + * PDA获得采购订单的备件详细列表 + * @param id + * @return + */ + List getPdaDetailsById(@Param("id") Long id); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemorder/ItemOrderMainMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemorder/ItemOrderMainMapper.java new file mode 100644 index 0000000..43cfe85 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemorder/ItemOrderMainMapper.java @@ -0,0 +1,51 @@ +package com.win.module.eam.dal.mysql.itemorder; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.itemorder.vo.ItemOrderMainExportReqVO; +import com.win.module.eam.controller.itemorder.vo.ItemOrderMainPageReqVO; +import com.win.module.eam.dal.dataobject.itemorder.ItemOrderMainDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 备件采购订单主 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface ItemOrderMainMapper extends BaseMapperX { + + default PageResult selectPage(ItemOrderMainPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ItemOrderMainDO::getNumber, reqVO.getNumber()) + .betweenIfPresent(ItemOrderMainDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ItemOrderMainDO::getId)); + } + + default List selectList(ItemOrderMainExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ItemOrderMainDO::getNumber, reqVO.getNumber()) + .betweenIfPresent(ItemOrderMainDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ItemOrderMainDO::getId)); + } + + /** + * PDA获取未完成的采购订单数 + * @param page + * @param reqVO + * @return + */ + IPage getPdaPage(Page page, @Param("vo") ItemOrderMainPageReqVO reqVO); + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemoutlocation/ItemOutLocationMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemoutlocation/ItemOutLocationMapper.java new file mode 100644 index 0000000..3f2870c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/itemoutlocation/ItemOutLocationMapper.java @@ -0,0 +1,49 @@ +package com.win.module.eam.dal.mysql.itemoutlocation; + +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.itemoutlocation.vo.ItemOutLocationExportReqVO; +import com.win.module.eam.controller.itemoutlocation.vo.ItemOutLocationPageReqVO; +import com.win.module.eam.dal.dataobject.itemoutlocation.ItemOutLocationDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 备件出库记录 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface ItemOutLocationMapper extends BaseMapperX { + + default PageResult selectPage(ItemOutLocationPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(ItemOutLocationDO::getId, reqVO.getId()) + .eqIfPresent(ItemOutLocationDO::getNumber, reqVO.getNumber()) + .eqIfPresent(ItemOutLocationDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(ItemOutLocationDO::getLocationNumber, reqVO.getLocationNumber()) + .eqIfPresent(ItemOutLocationDO::getType, reqVO.getType()) + .eqIfPresent(ItemOutLocationDO::getQty, reqVO.getQty()) + .orderByDesc(ItemOutLocationDO::getId)); + } + + default List selectList(ItemOutLocationExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ItemOutLocationDO::getId, reqVO.getId()) + .eqIfPresent(ItemOutLocationDO::getNumber, reqVO.getNumber()) + .eqIfPresent(ItemOutLocationDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(ItemOutLocationDO::getLocationNumber, reqVO.getLocationNumber()) + .eqIfPresent(ItemOutLocationDO::getType, reqVO.getType()) + .eqIfPresent(ItemOutLocationDO::getQty, reqVO.getQty()) + .orderByDesc(ItemOutLocationDO::getId)); + } + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/location/LocationMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/location/LocationMapper.java new file mode 100644 index 0000000..3f322a1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/location/LocationMapper.java @@ -0,0 +1,80 @@ +package com.win.module.eam.dal.mysql.location; + +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.location.vo.LocationExportReqVO; +import com.win.module.eam.controller.location.vo.LocationPageReqVO; +import com.win.module.eam.controller.location.vo.LocationReqVO; +import com.win.module.eam.dal.dataobject.location.LocationDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 库位 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface LocationMapper extends BaseMapperX { + + default PageResult selectPage(LocationPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(LocationDO::getNumber, reqVO.getNumber()) + .likeIfPresent(LocationDO::getName, reqVO.getName()) + .eqIfPresent(LocationDO::getDescription, reqVO.getDescription()) + .eqIfPresent(LocationDO::getAreaNumber, reqVO.getAreaNumber()) + .eqIfPresent(LocationDO::getType, reqVO.getType()) + .eqIfPresent(LocationDO::getIsInAccount, reqVO.getIsInAccount()) + .eqIfPresent(LocationDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .orderByDesc(LocationDO::getId)); + } + + default List selectList(LocationExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(LocationDO::getNumber, reqVO.getNumber()) + .likeIfPresent(LocationDO::getName, reqVO.getName()) + .eqIfPresent(LocationDO::getDescription, reqVO.getDescription()) + .eqIfPresent(LocationDO::getAreaNumber, reqVO.getAreaNumber()) + .eqIfPresent(LocationDO::getType, reqVO.getType()) + .eqIfPresent(LocationDO::getIsInAccount, reqVO.getIsInAccount()) + .eqIfPresent(LocationDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .orderByDesc(LocationDO::getId)); + } + + + default List selectListNoPage(LocationReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(LocationDO::getNumber, reqVO.getNumber()) + .likeIfPresent(LocationDO::getName, reqVO.getName()) + .eqIfPresent(LocationDO::getDescription, reqVO.getDescription()) + .eqIfPresent(LocationDO::getAreaNumber, reqVO.getAreaNumber()) + .eqIfPresent(LocationDO::getType, reqVO.getType()) + .eqIfPresent(LocationDO::getIsInAccount, reqVO.getIsInAccount()) + .eqIfPresent(LocationDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .orderByDesc(LocationDO::getId)); + } + + /** + * 扫库位码获取库位信息以及关联备件信息 + * @param number + * @return + */ + LocationDO scanCodeByNumber(@Param("number") String number); + + /** + * 扫备件码获取信息 + * @param number + * @return + */ + List selectListByItemNumber(@Param("number") String number); + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/locationarea/LocationAreaMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/locationarea/LocationAreaMapper.java new file mode 100644 index 0000000..303bde7 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/locationarea/LocationAreaMapper.java @@ -0,0 +1,45 @@ +package com.win.module.eam.dal.mysql.locationarea; + +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.locationarea.vo.LocationAreaExportReqVO; +import com.win.module.eam.controller.locationarea.vo.LocationAreaPageReqVO; +import com.win.module.eam.dal.dataobject.locationarea.LocationAreaDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 库区 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface LocationAreaMapper extends BaseMapperX { + + default PageResult selectPage(LocationAreaPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(LocationAreaDO::getNumber, reqVO.getNumber()) + .likeIfPresent(LocationAreaDO::getName, reqVO.getName()) + .eqIfPresent(LocationAreaDO::getType, reqVO.getType()) + .eqIfPresent(LocationAreaDO::getAvailable, reqVO.getAvailable()) + .orderByDesc(LocationAreaDO::getId)); + } + + default List selectList(LocationAreaExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(LocationAreaDO::getNumber, reqVO.getNumber()) + .likeIfPresent(LocationAreaDO::getName, reqVO.getName()) + .eqIfPresent(LocationAreaDO::getType, reqVO.getType()) + .eqIfPresent(LocationAreaDO::getAvailable, reqVO.getAvailable()) + .orderByDesc(LocationAreaDO::getId)); + } + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/maintainback/MaintainBackMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/maintainback/MaintainBackMapper.java new file mode 100644 index 0000000..26bfebc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/maintainback/MaintainBackMapper.java @@ -0,0 +1,47 @@ +package com.win.module.eam.dal.mysql.maintainback; + +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.eam.controller.maintainback.vo.MaintainBackExportReqVO; +import com.win.module.eam.controller.maintainback.vo.MaintainBackPageReqVO; +import com.win.module.eam.dal.dataobject.maintainback.MaintainBackDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 保养计划 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface MaintainBackMapper extends BaseMapperX { + + default PageResult selectPage(MaintainBackPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MaintainBackDO::getNumber, reqVO.getNumber()) + .likeIfPresent(MaintainBackDO::getName, reqVO.getName()) + .eqIfPresent(MaintainBackDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(MaintainBackDO::getOldCycle, reqVO.getOldCycle()) + .eqIfPresent(MaintainBackDO::getNewCycle, reqVO.getNewCycle()) + .eqIfPresent(MaintainBackDO::getOldAvailable, reqVO.getOldAvailable()) + .eqIfPresent(MaintainBackDO::getNewAvailable, reqVO.getNewAvailable()) + .eqIfPresent(MaintainBackDO::getType, reqVO.getType()) + .orderByDesc(MaintainBackDO::getId)); + } + + default List selectList(MaintainBackExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(MaintainBackDO::getNumber, reqVO.getNumber()) + .likeIfPresent(MaintainBackDO::getName, reqVO.getName()) + .eqIfPresent(MaintainBackDO::getDeviceNumber, reqVO.getDeviceNumber()) + .eqIfPresent(MaintainBackDO::getOldCycle, reqVO.getOldCycle()) + .eqIfPresent(MaintainBackDO::getNewCycle, reqVO.getNewCycle()) + .eqIfPresent(MaintainBackDO::getOldAvailable, reqVO.getOldAvailable()) + .eqIfPresent(MaintainBackDO::getNewAvailable, reqVO.getNewAvailable()) + .eqIfPresent(MaintainBackDO::getType, reqVO.getType()) + .orderByDesc(MaintainBackDO::getId)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/maintenanceturnto/MaintenanceTurntoMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/maintenanceturnto/MaintenanceTurntoMapper.java new file mode 100644 index 0000000..347adf6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/maintenanceturnto/MaintenanceTurntoMapper.java @@ -0,0 +1,31 @@ +package com.win.module.eam.dal.mysql.maintenanceturnto; + +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.eam.controller.maintenanceturnto.vo.MaintenanceTurntoExportReqVO; +import com.win.module.eam.controller.maintenanceturnto.vo.MaintenanceTurntoPageReqVO; +import com.win.module.eam.dal.dataobject.maintenanceturnto.MaintenanceTurntoDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 维修转办记录 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface MaintenanceTurntoMapper extends BaseMapperX { + + default PageResult selectPage(MaintenanceTurntoPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .orderByDesc(MaintenanceTurntoDO::getId)); + } + + default List selectList(MaintenanceTurntoExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .orderByDesc(MaintenanceTurntoDO::getId)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/moldaccounts/MoldAccountsMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/moldaccounts/MoldAccountsMapper.java new file mode 100644 index 0000000..27070ba --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/moldaccounts/MoldAccountsMapper.java @@ -0,0 +1,100 @@ +package com.win.module.eam.dal.mysql.moldaccounts; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +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.eam.controller.devicemolditems.vo.DeviceMoldItemsPageReqVO; +import com.win.module.eam.controller.moldaccounts.vo.MoldAccountsExportReqVO; +import com.win.module.eam.controller.moldaccounts.vo.MoldAccountsPageReqVO; +import com.win.module.eam.dal.dataobject.moldaccounts.MoldAccountsDO; +import com.win.module.eam.dal.dataobject.moldaccounts.MoldAccountsDOExpand; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 模具台账 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface MoldAccountsMapper extends BaseMapperX { + + default PageResult selectPage(MoldAccountsPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MoldAccountsDO::getFactoryAreaNumber, reqVO.getFactoryAreaNumber()) + .eqIfPresent(MoldAccountsDO::getNumber, reqVO.getNumber()) + .likeIfPresent(MoldAccountsDO::getName, reqVO.getName()) + .eqIfPresent(MoldAccountsDO::getType, reqVO.getType()) + .eqIfPresent(MoldAccountsDO::getStatus, reqVO.getStatus()) + .orderByDesc(MoldAccountsDO::getId)); + } + + default List selectList(MoldAccountsExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(MoldAccountsDO::getNumber, reqVO.getNumber()) + .likeIfPresent(MoldAccountsDO::getName, reqVO.getName()) + .eqIfPresent(MoldAccountsDO::getType, reqVO.getType()) + .orderByDesc(MoldAccountsDO::getId)); + } + + default PageResult selectNumber(DeviceMoldItemsPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(MoldAccountsDO::getAvailable, reqVO.getAvailable())); + } + + /** + * APP获取所有模具列表 + * @param page + * @param reqVO + * @return + */ + IPage getAppPage(Page page, @Param("vo") MoldAccountsPageReqVO reqVO); + + /** + * 获取厂区下模具列表 + * @param factoryAreaNumber + * @return + */ + List> selectData(@Param("factoryAreaNumber") String factoryAreaNumber); + + /** + * 根据模具号查询信息 + * @param number + * @return + */ + Map getDetailsByNumber(@Param("number") String number); + + + MoldAccountsDOExpand getDetailsEntryByNumber(@Param("number") String number); + + + MoldAccountsDO getMoldDetailsEntryByNumber(@Param("number") String number); + + /** + * 看板获取模具数量0正常1损坏 + * @param status + */ + default Long getMoldNumbers(String status) { + return selectCount(new LambdaQueryWrapperX() + .eqIfPresent(MoldAccountsDO::getStatus, status) + .eqIfPresent(MoldAccountsDO::getDeleted,0) + .eqIfPresent(MoldAccountsDO::getAvailable,"TRUE")); + } + + + default List selectListNoPage(MoldAccountsPageReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(MoldAccountsDO::getFactoryAreaNumber, reqVO.getFactoryAreaNumber()) + .eqIfPresent(MoldAccountsDO::getNumber, reqVO.getNumber()) + .likeIfPresent(MoldAccountsDO::getName, reqVO.getName()) + .eqIfPresent(MoldAccountsDO::getType, reqVO.getType()) + .orderByDesc(MoldAccountsDO::getId)); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/moldmilestone/MoldMilestoneMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/moldmilestone/MoldMilestoneMapper.java new file mode 100644 index 0000000..e9f633e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/moldmilestone/MoldMilestoneMapper.java @@ -0,0 +1,57 @@ +package com.win.module.eam.dal.mysql.moldmilestone; + + +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.eam.controller.moldmilestone.vo.MoldMilestoneExportReqVO; +import com.win.module.eam.controller.moldmilestone.vo.MoldMilestonePageReqVO; +import com.win.module.eam.dal.dataobject.moldmilestone.MoldMilestoneDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 模具里程碑 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface MoldMilestoneMapper extends BaseMapperX { + + default PageResult selectPage(MoldMilestonePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MoldMilestoneDO::getId, reqVO.getId()) + .eqIfPresent(MoldMilestoneDO::getNumber, reqVO.getNumber()) + .eqIfPresent(MoldMilestoneDO::getMoldNumber, reqVO.getMoldNumber()) + .eqIfPresent(MoldMilestoneDO::getMilestoneStage, reqVO.getMilestoneStage()) + .betweenIfPresent(MoldMilestoneDO::getMilestoneDate, reqVO.getMilestoneDate()) + .betweenIfPresent(MoldMilestoneDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(MoldMilestoneDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(MoldMilestoneDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(MoldMilestoneDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .orderByAsc(MoldMilestoneDO::getId)); + } + + default List selectList(MoldMilestoneExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(MoldMilestoneDO::getId, reqVO.getId()) + .eqIfPresent(MoldMilestoneDO::getNumber, reqVO.getNumber()) + .eqIfPresent(MoldMilestoneDO::getMoldNumber, reqVO.getMoldNumber()) + .eqIfPresent(MoldMilestoneDO::getMilestoneStage, reqVO.getMilestoneStage()) + .betweenIfPresent(MoldMilestoneDO::getMilestoneDate, reqVO.getMilestoneDate()) + .betweenIfPresent(MoldMilestoneDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(MoldMilestoneDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(MoldMilestoneDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(MoldMilestoneDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .orderByAsc(MoldMilestoneDO::getId)); + } + + /** + * 查询所有有里程碑日期而没有文件的数据 + * @return + */ + List selectListByMilestoneDate(@Param("startDate") String startDate,@Param("endDate") String endDate); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/monthequipment/BasicMonthEquipmentMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/monthequipment/BasicMonthEquipmentMapper.java new file mode 100644 index 0000000..2594ed6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/monthequipment/BasicMonthEquipmentMapper.java @@ -0,0 +1,45 @@ +package com.win.module.eam.dal.mysql.monthequipment; + +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.eam.controller.monthequipment.vo.BasicMonthEquipmentExportReqVO; +import com.win.module.eam.controller.monthequipment.vo.BasicMonthEquipmentPageReqVO; +import com.win.module.eam.dal.dataobject.monthequipment.BasicMonthEquipmentDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 首页月设备实现指标 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface BasicMonthEquipmentMapper extends BaseMapperX { + + default PageResult selectPage(BasicMonthEquipmentPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(BasicMonthEquipmentDO::getFactoryType, reqVO.getFactoryType()) + .orderByDesc(BasicMonthEquipmentDO::getId)); + } + + default List selectList(BasicMonthEquipmentExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(BasicMonthEquipmentDO::getFactoryType, reqVO.getFactoryType()) + .orderByDesc(BasicMonthEquipmentDO::getId)); + } + + String handleData(@Param("type") String Type,@Param("factory") String factory,@Param("year") int year); + + /** + * 获取当年12各月份数值 + * @param type + * @param factroy + * @param year + * @return + */ + List> selectMonthGraph(@Param("type") String type,@Param("factory") String factroy,@Param("year") String year); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/producePlan/ProducePlanMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/producePlan/ProducePlanMapper.java new file mode 100644 index 0000000..c6e36ec --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/producePlan/ProducePlanMapper.java @@ -0,0 +1,60 @@ +package com.win.module.eam.dal.mysql.producePlan; + +import com.win.framework.mybatis.core.mapper.BaseMapperX; +import com.win.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.win.module.eam.controller.producePlan.vo.ProducePlanExportReqVO; +import com.win.module.eam.dal.dataobject.producePlan.ProducePlanDO; +import org.apache.ibatis.annotations.Mapper; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + + +/** + * 生产计划 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface ProducePlanMapper extends BaseMapperX { + default List selectList(ProducePlanExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(ProducePlanDO::getPlanCode, reqVO.getPlanCode()) + .eqIfPresent(ProducePlanDO::getWorkLineCode, reqVO.getWorkLineCode()) + .likeIfPresent(ProducePlanDO::getWorkLineName, reqVO.getWorkLineName()) + .eqIfPresent(ProducePlanDO::getModel, reqVO.getModel()) + .eqIfPresent(ProducePlanDO::getConfigure, reqVO.getConfigure()) + .likeIfPresent(ProducePlanDO::getConfigureName, reqVO.getConfigureName()) + .eqIfPresent(ProducePlanDO::getPlanQty, reqVO.getPlanQty()) + .eqIfPresent(ProducePlanDO::getCompletedQty, reqVO.getCompletedQty()) + .eqIfPresent(ProducePlanDO::getPlanState, reqVO.getPlanState()) + .eqIfPresent(ProducePlanDO::getRemark, reqVO.getRemark()) + .eqIfPresent(ProducePlanDO::getCreateUser, reqVO.getCreateUser()) + .betweenIfPresent(ProducePlanDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(ProducePlanDO::getUpdateUser, reqVO.getUpdateUser()) + .eqIfPresent(ProducePlanDO::getColumn1, reqVO.getColumn1()) + .eqIfPresent(ProducePlanDO::getColumn2, reqVO.getColumn2()) + .eqIfPresent(ProducePlanDO::getColumn3, reqVO.getColumn3()) + .eqIfPresent(ProducePlanDO::getColumn4, reqVO.getColumn4()) + .betweenIfPresent(ProducePlanDO::getStartTime, reqVO.getStartTime()) + .betweenIfPresent(ProducePlanDO::getEndTime, reqVO.getEndTime()) + .eqIfPresent(ProducePlanDO::getWorkHours, reqVO.getWorkHours()) + .eqIfPresent(ProducePlanDO::getSeq, reqVO.getSeq()) + .eqIfPresent(ProducePlanDO::getWscode1, reqVO.getWscode1()) + .eqIfPresent(ProducePlanDO::getWscode2, reqVO.getWscode2()) + .eqIfPresent(ProducePlanDO::getWscode3, reqVO.getWscode3()) + .eqIfPresent(ProducePlanDO::getWscode4, reqVO.getWscode4()) + .orderByDesc(ProducePlanDO::getId)); + } + + /** + * 外接口访问生产计划 + * @return + */ + List getNewProducePlan(LocalDateTime createTime); + + BigDecimal getProducePlanQty(String id); + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/supplier/SupplierMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/supplier/SupplierMapper.java new file mode 100644 index 0000000..7b73cb1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/supplier/SupplierMapper.java @@ -0,0 +1,67 @@ +package com.win.module.eam.dal.mysql.supplier; + +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.supplier.vo.SupplierExportReqVO; +import com.win.module.eam.controller.supplier.vo.SupplierPageReqVO; +import com.win.module.eam.controller.supplier.vo.SupplierReqVO; +import com.win.module.eam.dal.dataobject.supplier.SupplierDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 供应商 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface SupplierMapper extends BaseMapperX { + + default PageResult selectPage(SupplierPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(SupplierDO::getNumber, reqVO.getNumber()) + .likeIfPresent(SupplierDO::getName, reqVO.getName()) + .likeIfPresent(SupplierDO::getShortName, reqVO.getShortName()) + .eqIfPresent(SupplierDO::getAddress, reqVO.getAddress()) + .eqIfPresent(SupplierDO::getCountry, reqVO.getCountry()) + .eqIfPresent(SupplierDO::getCity, reqVO.getCity()) + .eqIfPresent(SupplierDO::getPhone, reqVO.getPhone()) + .eqIfPresent(SupplierDO::getSiteId, reqVO.getSiteId()) + .orderByDesc(SupplierDO::getId)); + } + + default List selectList(SupplierExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(SupplierDO::getNumber, reqVO.getNumber()) + .likeIfPresent(SupplierDO::getName, reqVO.getName()) + .likeIfPresent(SupplierDO::getShortName, reqVO.getShortName()) + .eqIfPresent(SupplierDO::getAddress, reqVO.getAddress()) + .eqIfPresent(SupplierDO::getCountry, reqVO.getCountry()) + .eqIfPresent(SupplierDO::getCity, reqVO.getCity()) + .eqIfPresent(SupplierDO::getPhone, reqVO.getPhone()) + .eqIfPresent(SupplierDO::getSiteId, reqVO.getSiteId()) + .orderByDesc(SupplierDO::getId)); + } + + default List selectNoPage(SupplierReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(SupplierDO::getNumber, reqVO.getNumber()) + .likeIfPresent(SupplierDO::getName, reqVO.getName()) + .likeIfPresent(SupplierDO::getShortName, reqVO.getShortName()) + .eqIfPresent(SupplierDO::getAddress, reqVO.getAddress()) + .eqIfPresent(SupplierDO::getCountry, reqVO.getCountry()) + .eqIfPresent(SupplierDO::getCity, reqVO.getCity()) + .eqIfPresent(SupplierDO::getPhone, reqVO.getPhone()) + .eqIfPresent(SupplierDO::getSiteId, reqVO.getSiteId()) + .orderByDesc(SupplierDO::getId)); + } + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/transaction/TransactionMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/transaction/TransactionMapper.java new file mode 100644 index 0000000..20a4336 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/transaction/TransactionMapper.java @@ -0,0 +1,52 @@ +package com.win.module.eam.dal.mysql.transaction; + +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.eam.controller.transaction.vo.TransactionExportReqVO; +import com.win.module.eam.controller.transaction.vo.TransactionPageReqVO; +import com.win.module.eam.dal.dataobject.transaction.TransactionDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 库存事务 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface TransactionMapper extends BaseMapperX { + + default PageResult selectPage(TransactionPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(TransactionDO::getId, reqVO.getId()) + .eqIfPresent(TransactionDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(TransactionDO::getLocationNumber, reqVO.getLocationNumber()) + .eqIfPresent(TransactionDO::getTransactionType, reqVO.getTransactionType()) + .eqIfPresent(TransactionDO::getInventoryAction, reqVO.getInventoryAction()) + .eqIfPresent(TransactionDO::getInventoryStatus, reqVO.getInventoryStatus()) + .eqIfPresent(TransactionDO::getUom, reqVO.getUom()) + .eqIfPresent(TransactionDO::getQty, reqVO.getQty()) + .orderByDesc(TransactionDO::getId)); + } + default List selectList(TransactionExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(TransactionDO::getId, reqVO.getId()) + .eqIfPresent(TransactionDO::getItemNumber, reqVO.getItemNumber()) + .eqIfPresent(TransactionDO::getLocationNumber, reqVO.getLocationNumber()) + .eqIfPresent(TransactionDO::getTransactionType, reqVO.getTransactionType()) + .eqIfPresent(TransactionDO::getInventoryAction, reqVO.getInventoryAction()) + .eqIfPresent(TransactionDO::getInventoryStatus, reqVO.getInventoryStatus()) + .eqIfPresent(TransactionDO::getUom, reqVO.getUom()) + .eqIfPresent(TransactionDO::getQty, reqVO.getQty()) + .orderByDesc(TransactionDO::getId)); + } + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/uniapppushmessage/UniappPushMessageMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/uniapppushmessage/UniappPushMessageMapper.java new file mode 100644 index 0000000..f301d0a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/uniapppushmessage/UniappPushMessageMapper.java @@ -0,0 +1,53 @@ +package com.win.module.eam.dal.mysql.uniapppushmessage; + +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.eam.controller.uniapppushmessage.vo.UniappPushMessageExportReqVO; +import com.win.module.eam.controller.uniapppushmessage.vo.UniappPushMessagePageReqVO; +import com.win.module.eam.dal.dataobject.uniapppushmessage.UniappPushMessageDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * uniapp推送记录 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface UniappPushMessageMapper extends BaseMapperX { + + default PageResult selectPage(UniappPushMessagePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(UniappPushMessageDO::getResultMsg, reqVO.getResultMsg()) + .eqIfPresent(UniappPushMessageDO::getNumber, reqVO.getNumber()) + .eqIfPresent(UniappPushMessageDO::getType, reqVO.getType()) + .eqIfPresent(UniappPushMessageDO::getTitle, reqVO.getTitle()) + .eqIfPresent(UniappPushMessageDO::getPayload, reqVO.getPayload()) + .eqIfPresent(UniappPushMessageDO::getContent, reqVO.getContent()) + .betweenIfPresent(UniappPushMessageDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(UniappPushMessageDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(UniappPushMessageDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(UniappPushMessageDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .eqIfPresent(UniappPushMessageDO::getDeptId, reqVO.getDeptId()) + .orderByDesc(UniappPushMessageDO::getId)); + } + + default List selectList(UniappPushMessageExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(UniappPushMessageDO::getResultMsg, reqVO.getResultMsg()) + .eqIfPresent(UniappPushMessageDO::getNumber, reqVO.getNumber()) + .eqIfPresent(UniappPushMessageDO::getType, reqVO.getType()) + .eqIfPresent(UniappPushMessageDO::getTitle, reqVO.getTitle()) + .eqIfPresent(UniappPushMessageDO::getPayload, reqVO.getPayload()) + .eqIfPresent(UniappPushMessageDO::getContent, reqVO.getContent()) + .betweenIfPresent(UniappPushMessageDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(UniappPushMessageDO::getSiteId, reqVO.getSiteId()) + .eqIfPresent(UniappPushMessageDO::getAvailable, reqVO.getAvailable()) + .eqIfPresent(UniappPushMessageDO::getConcurrencyStamp, reqVO.getConcurrencyStamp()) + .eqIfPresent(UniappPushMessageDO::getDeptId, reqVO.getDeptId()) + .orderByDesc(UniappPushMessageDO::getId)); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/yearequipment/BasciYearEquipmentMapper.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/yearequipment/BasciYearEquipmentMapper.java new file mode 100644 index 0000000..0386a00 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/mysql/yearequipment/BasciYearEquipmentMapper.java @@ -0,0 +1,33 @@ +package com.win.module.eam.dal.mysql.yearequipment; + +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.eam.controller.yearequipment.vo.BasciYearEquipmentExportReqVO; +import com.win.module.eam.controller.yearequipment.vo.BasciYearEquipmentPageReqVO; +import com.win.module.eam.dal.dataobject.yearequipment.BasciYearEquipmentDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 首页年设备指标 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface BasciYearEquipmentMapper extends BaseMapperX { + + default PageResult selectPage(BasciYearEquipmentPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(BasciYearEquipmentDO::getFactoryType, reqVO.getFactoryType()) + .orderByDesc(BasciYearEquipmentDO::getId)); + } + + default List selectList(BasciYearEquipmentExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(BasciYearEquipmentDO::getFactoryType, reqVO.getFactoryType()) + .orderByDesc(BasciYearEquipmentDO::getId)); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/package-info.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/package-info.java new file mode 100644 index 0000000..64081ba --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/dal/package-info.java @@ -0,0 +1,4 @@ +/** + * System API 包,定义暴露给其它模块的 API + */ +package com.win.module.eam.dal; diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/OpenAndClose/CompleteEnum.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/OpenAndClose/CompleteEnum.java new file mode 100644 index 0000000..fa76598 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/OpenAndClose/CompleteEnum.java @@ -0,0 +1,28 @@ +package com.win.module.eam.enums.OpenAndClose; + +/** + * Boolean枚举 + * + * @author win + */ +public enum CompleteEnum { + + INCOMPLETE("INCOMPLETE", "未完成"), COMPLETE("COMPLETE", "完成"); + + private final String code; + private final String info; + + CompleteEnum(String code, String info) { + this.code = code; + this.info = info; + } + + public String getCode() { + return code; + } + + public String getInfo() { + return info; + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/basic/BasicStatusEnum.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/basic/BasicStatusEnum.java new file mode 100644 index 0000000..7d0415d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/basic/BasicStatusEnum.java @@ -0,0 +1,49 @@ +package com.win.module.eam.enums.basic; + +import java.util.stream.Stream; + +public enum BasicStatusEnum { + //设备模具报修申请 + BASIC_DEVICE("DEVICE", "设备"), + BASIC_MOLD("MOLD", "模具"), + BASIC_TECH("TECH", "工艺"), + BASIC_SOPT("SPOT", "巡检点检"), + MAINTENANCE_MON("MONTH", "月保养"), + MAINTENANCE_QUARTER("QUARTER", "季度保养"), + MAINTENANCE_HALF_YEAR("HALFYEAR", "半年保养"), + MAINTENANCE_YEAR("YEAR", "年保养"), + BASIC_STATUS_0("0", "正常"), + BASIC_STATUS_1("1", "维修中"), + ; + private String code; + private String name; + + BasicStatusEnum(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return this.code; + } + + public String getName() { + return this.name; + } + + /** + * 用状态值获取枚举 + * @param code + * @return + */ + static BasicStatusEnum getOrderStatusEnum(String code) { + for (BasicStatusEnum orderStatusEnum : values()) { + if (orderStatusEnum.getCode().equals(code)) { + return orderStatusEnum; + } + } + return null; + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/basic/BooleanTypeEnum.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/basic/BooleanTypeEnum.java new file mode 100644 index 0000000..77924c9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/basic/BooleanTypeEnum.java @@ -0,0 +1,28 @@ +package com.win.module.eam.enums.basic; + +/** + * Boolean枚举 + * + * @author win + */ +public enum BooleanTypeEnum { + + F("FALSE", "否"), Y("TRUE", "是"); + + private final String code; + private final String info; + + BooleanTypeEnum(String code, String info) { + this.code = code; + this.info = info; + } + + public String getCode() { + return code; + } + + public String getInfo() { + return info; + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/itemApply/ItemApplyStatusEnum.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/itemApply/ItemApplyStatusEnum.java new file mode 100644 index 0000000..92428de --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/itemApply/ItemApplyStatusEnum.java @@ -0,0 +1,45 @@ +package com.win.module.eam.enums.itemApply; + +public enum ItemApplyStatusEnum { + + //备件申领状态(0待审批1审批通过2审批驳回3出库中4完成5撤回) + REVIEWING("0", "待审批"), + AGREED("1", "审批通过"), + REFUSED("2", "审批驳回"), + HANDLING("3", "出库中"), + COMPLETED("4", "已完成"), + WITHDRAW("5", "撤回"), + ; + private String code; + private String name; + + ItemApplyStatusEnum(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return this.code; + } + + public String getName() { + return this.name; + } + + /** + * 用状态值获取枚举 + * + * @param code + * @return + */ + static ItemApplyStatusEnum getOrderStatusEnum(String code) { + for (ItemApplyStatusEnum orderStatusEnum : values()) { + if (orderStatusEnum.getCode().equals(code)) { + return orderStatusEnum; + } + } + return null; + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/monthequipment/MonthequipmentStatusEnum.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/monthequipment/MonthequipmentStatusEnum.java new file mode 100644 index 0000000..48c2442 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/monthequipment/MonthequipmentStatusEnum.java @@ -0,0 +1,39 @@ +package com.win.module.eam.enums.monthequipment; + +public enum MonthequipmentStatusEnum { + FAILURE_RECOVER_TIME("2", "平均故障恢复时间(MTTR/min)"), + FAILURE_INTERVAL_TIME("1", "平均故障间隔时间(H)"), + equipment_outage_rate("0", "设备停机率"), + ; + private String code; + private String name; + + MonthequipmentStatusEnum(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return this.code; + } + + public String getName() { + return this.name; + } + + /** + * 用状态值获取枚举 + * @param code + * @return + */ + static MonthequipmentStatusEnum getOrderStatusEnum(String code) { + for (MonthequipmentStatusEnum orderStatusEnum : values()) { + if (orderStatusEnum.getCode().equals(code)) { + return orderStatusEnum; + } + } + return null; + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/FaultTypeEnum.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/FaultTypeEnum.java new file mode 100644 index 0000000..1065568 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/FaultTypeEnum.java @@ -0,0 +1,31 @@ +package com.win.module.eam.enums.order; + +public enum FaultTypeEnum { + PM("PM", "PM"), + CM("CM", "CM"), + EM("EM", "EM"); + + private final String CH; + private final String EN; + + FaultTypeEnum(String CH, String EN) { + this.CH = CH; + this.EN = EN; + } + + public String getCode() { + // 在这里根据需要返回中文或英文的值 + // 例如,你可以根据应用程序的语言设置来判断返回中文还是英文 + // 这里示例根据简单的条件返回英文值 + boolean useEnglish = true; // 根据实际情况设置是否使用英文 + return useEnglish ? EN : CH; + } + + public String getValue() { + // 在这里根据需要返回中文或英文的值 + // 例如,你可以根据应用程序的语言设置来判断返回中文还是英文 + // 这里示例根据简单的条件返回中文值 + boolean useChinese = true; // 根据实际情况设置是否使用中文 + return useChinese ? CH : EN; + } +} \ No newline at end of file diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/MaintenanceTypeEnum.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/MaintenanceTypeEnum.java new file mode 100644 index 0000000..dd0b3a7 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/MaintenanceTypeEnum.java @@ -0,0 +1,30 @@ +package com.win.module.eam.enums.order; + +public enum MaintenanceTypeEnum { + CYCLE("周期", "CYCLE"), + TIMES("次数", "TIMES"); + + private final String CH; + private final String EN; + + MaintenanceTypeEnum(String CH, String EN) { + this.CH = CH; + this.EN = EN; + } + + public String getCode() { + // 在这里根据需要返回中文或英文的值 + // 例如,你可以根据应用程序的语言设置来判断返回中文还是英文 + // 这里示例根据简单的条件返回英文值 + boolean useEnglish = true; // 根据实际情况设置是否使用英文 + return useEnglish ? EN : CH; + } + + public String getValue() { + // 在这里根据需要返回中文或英文的值 + // 例如,你可以根据应用程序的语言设置来判断返回中文还是英文 + // 这里示例根据简单的条件返回英文值 + boolean useChinese = true; // 根据实际情况设置是否使用英文 + return useChinese ? CH : EN; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/MonthEnum.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/MonthEnum.java new file mode 100644 index 0000000..ca5847c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/MonthEnum.java @@ -0,0 +1,65 @@ +package com.win.module.eam.enums.order; + +public enum MonthEnum { + JANUARY("1", "JANUARY", "一月"), + FEBRUARY("2", "FEBRUARY", "二月"), + MARCH("3", "MARCH", "三月"), + APRIL("4", "APRIL", "四月"), + MAY("5", "MAY", "五月"), + JUNE("6", "JUNE", "六月"), + JULY("7", "JULY", "七月"), + AUGUST("8", "AUGUST", "八月"), + SEPTEMBER("9", "SEPTEMBER", "九月"), + OCTOBER("10", "OCTOBER", "十月"), + NOVEMBER("11", "NOVEMBER", "十一月"), + DECEMBER("12", "DECEMBER", "十二月"); + + private String code; + private String name; // Now stores the name in all uppercase + private String chineseName; + + MonthEnum(String code, String name, String chineseName) { + this.code = code; + this.name = name.toUpperCase(); // Ensure the name is stored in uppercase + this.chineseName = chineseName; + } + + public String getCode() { + return code; + } + + public String getName() { + return name; + } + + public String getChineseName() { + return chineseName; + } + + public static MonthEnum fromName(String name) { + for (MonthEnum month : MonthEnum.values()) { + if (month.getName().equalsIgnoreCase(name)) { + return month; + } + } + throw new IllegalArgumentException("No constant with name " + name + " found"); + } + + public static MonthEnum fromCode(String code) { + for (MonthEnum month : MonthEnum.values()) { + if (month.getCode().equals(code)) { + return month; + } + } + throw new IllegalArgumentException("No constant with code " + code + " found"); + } + + public static MonthEnum fromChineseName(String chineseName) { + for (MonthEnum month : MonthEnum.values()) { + if (month.getChineseName().equals(chineseName)) { + return month; + } + } + throw new IllegalArgumentException("No constant with Chinese name " + chineseName + " found"); + } +} \ No newline at end of file diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/OrderNextPeriodDataEnum.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/OrderNextPeriodDataEnum.java new file mode 100644 index 0000000..7eb6bb5 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/OrderNextPeriodDataEnum.java @@ -0,0 +1,41 @@ +package com.win.module.eam.enums.order; +import java.time.LocalDate; + +public enum OrderNextPeriodDataEnum { + MONTH { + @Override + public boolean isPeriodDate(LocalDate date) { + // 每月的周期日就是每月的第一天 + return date.equals(date.withDayOfMonth(1)); + } + }, + QUARTER { + @Override + public boolean isPeriodDate(LocalDate date) { + // 季度的周期日是季度最后一个月的第一天 + int month = date.getMonthValue(); + int startMonthOfQuarter = ((month - 1) / 3) * 3 + 1; + LocalDate periodDate = LocalDate.of(date.getYear(), startMonthOfQuarter + 2, 1); + return date.equals(periodDate); + } + }, + HALF_YEAR { + @Override + public boolean isPeriodDate(LocalDate date) { + // 半年的周期日是半年最后一个月的第一天 + int month = date.getMonthValue(); + int startMonthOfHalfYear = ((month - 1) / 6) * 6 + 1; + LocalDate periodDate = LocalDate.of(date.getYear(), startMonthOfHalfYear + 5, 1); + return date.equals(periodDate); + } + }, + YEAR { + @Override + public boolean isPeriodDate(LocalDate date) { + // 年的周期日是每年的12月1日 + return date.getMonthValue() == 12 && date.getDayOfMonth() == 1; + } + }; + + public abstract boolean isPeriodDate(LocalDate date); +} \ No newline at end of file diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/OrderPeriodDataEnum.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/OrderPeriodDataEnum.java new file mode 100644 index 0000000..87ae67b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/OrderPeriodDataEnum.java @@ -0,0 +1,40 @@ +package com.win.module.eam.enums.order; + +import java.time.LocalDate; + +public enum OrderPeriodDataEnum { + MONTH { + @Override + public LocalDate getStartDate() { + // 当前月的第一天 + return LocalDate.now().withDayOfMonth(1); + } + }, + QUARTER { + @Override + public LocalDate getStartDate() { + int currentMonth = LocalDate.now().getMonthValue(); + int startMonthOfCurrentQuarter = ((currentMonth - 1) / 3) * 3 + 1; + // 当前季度最后一个月的第一天 + return LocalDate.now().withMonth(startMonthOfCurrentQuarter + 2).withDayOfMonth(1); + } + }, + HALF_YEAR { + @Override + public LocalDate getStartDate() { + int currentMonth = LocalDate.now().getMonthValue(); + int startMonthOfCurrentHalf = ((currentMonth - 1) / 6) * 6 + 1; + // 当前半年最后一个月的第一天 + return LocalDate.now().withMonth(startMonthOfCurrentHalf + 5).withDayOfMonth(1); + } + }, + YEAR { + @Override + public LocalDate getStartDate() { + // 当前年的最后一个月的第一天 + return LocalDate.now().withMonth(12).withDayOfMonth(1); + } + }; + + public abstract LocalDate getStartDate(); +} \ No newline at end of file diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/OrderStatusEnum.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/OrderStatusEnum.java new file mode 100644 index 0000000..89617cd --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/OrderStatusEnum.java @@ -0,0 +1,63 @@ +package com.win.module.eam.enums.order; + +public enum OrderStatusEnum { + + //工单进程 + PEND_ORDER_STATUS("PENDING", "待接单"), + RECEIVED_ORDER_STATUS("PECEIVED", "已接单"), + TRANSFERRED_STATUS("TRANSFERRED", "已转办"), + COMPLETED_STATUS("COMPLETED", "已完成"), + VERIFIED_STATUS("VERIFIED", "已验证"), + REJECTED_STATUS("REJECTED", "已驳回"), + APPLY_REJECTED_STATUS("APPLYREJECTED", "申请人驳回"), + APPLY_PASS_STATUS("APPLYPASS", "申请人通过"), + APPROVE_REJECTED_STATUS("APPROVEREJECTED", "审核人驳回"), + APPROVE_PASS_STATUS("APPROVEPASS", "审核人通过"), + //工单结果 + RESULT_TEMPORARILY("TEMPORARILY", "临时措施"), + RESULT_COMPLETED("COMPLETED", "完成"), + //检修 保养工单状态 + JX_PROCCED_STATUS("PROCCED", "检修中"), + JX_COMPLETED_STATUS("COMPLETED", "完成"), + //巡检点检工单状态 + XJ_PROCCED_STATUS("PROCCED", "检修中"), + XJ_COMPLETED_STATUS("COMPLETED", "完成"), + //巡检点检子项是否符合 + XJ_IS_CONFORM("TRUE", "符合"), + XJ_IS_NOT_CONFORM("FALSE", "不符合"), + ITEM_WEIXIU_YES("YES", "完成"), + ITEM_WEIXIU_NO("NO", "未完成"), + ; + private String code; + private String name; + + OrderStatusEnum(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return this.code; + } + + public String getName() { + return this.name; + } + + /** + * 用状态值获取枚举 + * + * @param code + * @return + */ + static OrderStatusEnum getOrderStatusEnum(String code) { + for (OrderStatusEnum orderStatusEnum : values()) { + if (orderStatusEnum.getCode().equals(code)) { + return orderStatusEnum; + } + } + return null; + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/PeriodTypeEnum.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/PeriodTypeEnum.java new file mode 100644 index 0000000..a714d4a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/PeriodTypeEnum.java @@ -0,0 +1,34 @@ +package com.win.module.eam.enums.order; + +public enum PeriodTypeEnum { + + COUNT( "次数", "count"), + YEAR("年", "YEAR"), + HALF_YEAR("半年", "HALF_YEAR"), + QUARTER("季", "QUARTER"), + MONTH("月", "MONTH"); + + private final String CH; + private final String EN; + + PeriodTypeEnum(String CH, String EN) { + this.CH = CH; + this.EN = EN; + } + + public String getCode() { + // 在这里根据需要返回中文或英文的值 + // 例如,你可以根据应用程序的语言设置来判断返回中文还是英文 + // 这里示例根据简单的条件返回英文值 + boolean useEnglish = true; // 根据实际情况设置是否使用英文 + return useEnglish ? EN : CH; + } + + public String getValue() { + // 在这里根据需要返回中文或英文的值 + // 例如,你可以根据应用程序的语言设置来判断返回中文还是英文 + // 这里示例根据简单的条件返回中文值 + boolean useChinese = true; // 根据实际情况设置是否使用中文 + return useChinese ? CH : EN; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/WeekEnum.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/WeekEnum.java new file mode 100644 index 0000000..70775df --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/order/WeekEnum.java @@ -0,0 +1,58 @@ +package com.win.module.eam.enums.order; + +public enum WeekEnum { + FIRST_WEEK("1", "FIRST_WEEK", "第一周"), + SECOND_WEEK("2", "SECOND_WEEK", "第二周"), + THIRD_WEEK("3", "THIRD_WEEK", "第三周"), + FOURTH_WEEK("4", "FOURTH_WEEK", "第四周"), + FIFTH_WEEK("5", "FIFTH_WEEK", "第五周"); + + private String code; + private String name; // Now stores the name in all uppercase + private String chineseName; + + WeekEnum(String code, String name, String chineseName) { + this.code = code; + this.name = name; + this.chineseName = chineseName; + } + + public String getCode() { + return code; + } + + public String getName() { + return name; + } + + public String getChineseName() { + return chineseName; + } + + public static WeekEnum fromCode(String code) { + for (WeekEnum week : WeekEnum.values()) { + if (week.getCode().equals(code)) { + return week; + } + } + throw new IllegalArgumentException("No constant with code " + code + " found"); + } + + public static WeekEnum fromChineseName(String chineseName) { + for (WeekEnum week : WeekEnum.values()) { + if (week.getChineseName().equals(chineseName)) { + return week; + } + } + throw new IllegalArgumentException("No constant with Chinese name " + chineseName + " found"); + } + + public static WeekEnum fromName(String name) { + for (WeekEnum week : WeekEnum.values()) { + if (week.getName().equalsIgnoreCase(name)) { + return week; + } + } + throw new IllegalArgumentException("No constant with name " + name + " found"); + } +} \ No newline at end of file diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/package-info.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/package-info.java new file mode 100644 index 0000000..88e25d4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/package-info.java @@ -0,0 +1,4 @@ +/** + * System API 包,定义暴露给其它模块的 API + */ +package com.win.module.eam.enums; diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/request/RequestStatusEnum.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/request/RequestStatusEnum.java new file mode 100644 index 0000000..7dbfd1a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/request/RequestStatusEnum.java @@ -0,0 +1,50 @@ +package com.win.module.eam.enums.request; + +import java.util.stream.Stream; + +public enum RequestStatusEnum { + //设备模具报修申请 + RE_EM("EM", "EM"), + RE_CM("CM", "CM"), + RE_PM("PM", "PM"), + ITEM_APPLY_0("0","待审核"), + ITEM_APPLY_1("1","审核通过"), + ITEM_APPLY_2("2","审核未通过"), + ITEM_APPLY_3("3","出库中"), + ITEM_APPLY_4("4","完成"), + ITEM_APPLY_5("5","撤回"), + ITEM_APPLY_DETAILS_RECEIVE("RECEIVE","接收中"), + ITEM_APPLY_DETAILS_COMPLETED("COMPLETED","接收完成"), + ; + private String code; + private String name; + + RequestStatusEnum(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return this.code; + } + + public String getName() { + return this.name; + } + + /** + * 用状态值获取枚举 + * @param code + * @return + */ + static RequestStatusEnum getOrderStatusEnum(String code) { + for (RequestStatusEnum orderStatusEnum : values()) { + if (orderStatusEnum.getCode().equals(code)) { + return orderStatusEnum; + } + } + return null; + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/status/AdjustStatusEnum.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/status/AdjustStatusEnum.java new file mode 100644 index 0000000..93473bf --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/status/AdjustStatusEnum.java @@ -0,0 +1,42 @@ +package com.win.module.eam.enums.status; + +public enum AdjustStatusEnum { + //设备模具报修申请 + CANGENERATE("CANGENERATE", "可生成"), + NOGENERATE("NOGENERATE", "不需要生成"), + COMPLETED("COMPLETED", "已生成"), + CANCEL("CANCEL", "作废"), + + ; + private String code; + private String name; + + AdjustStatusEnum(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return this.code; + } + + public String getName() { + return this.name; + } + + /** + * 用状态值获取枚举 + * @param code + * @return + */ + static AdjustStatusEnum getOrderStatusEnum(String code) { + for (AdjustStatusEnum orderStatusEnum : values()) { + if (orderStatusEnum.getCode().equals(code)) { + return orderStatusEnum; + } + } + return null; + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/status/DevicemolditemsStatusEnum.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/status/DevicemolditemsStatusEnum.java new file mode 100644 index 0000000..30b8585 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/status/DevicemolditemsStatusEnum.java @@ -0,0 +1,41 @@ +package com.win.module.eam.enums.status; + +public enum DevicemolditemsStatusEnum { + //设备模具报修申请 + INSPECTION("INSPECTION", "巡检点检"), + MAINTAIN("MAINTAIN", "保养"), + MAINTENANCE("MAINTENANCE", "维修"), + + ; + private String code; + private String name; + + DevicemolditemsStatusEnum(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return this.code; + } + + public String getName() { + return this.name; + } + + /** + * 用状态值获取枚举 + * @param code + * @return + */ + static DevicemolditemsStatusEnum getOrderStatusEnum(String code) { + for (DevicemolditemsStatusEnum orderStatusEnum : values()) { + if (orderStatusEnum.getCode().equals(code)) { + return orderStatusEnum; + } + } + return null; + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/transaction/TransactionEnum.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/transaction/TransactionEnum.java new file mode 100644 index 0000000..1ca091c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/transaction/TransactionEnum.java @@ -0,0 +1,43 @@ +package com.win.module.eam.enums.transaction; + +public enum TransactionEnum { + //设备模具报修申请 + PURCHASE_IN("PURCHASEIN", "采购入库"), + REQUISITION_OUT("REQUISITIONOUT", "领用出库"), + RETURN_IN("RETURNIN", "归还入库"), + SERVICE_IN("SERVICEIN", "维修入库"), + ADJUST("ADJUST", "盘点调整"), + + ; + private String code; + private String name; + + TransactionEnum(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return this.code; + } + + public String getName() { + return this.name; + } + + /** + * 用状态值获取枚举 + * @param code + * @return + */ + static TransactionEnum getOrderStatusEnum(String code) { + for (TransactionEnum orderStatusEnum : values()) { + if (orderStatusEnum.getCode().equals(code)) { + return orderStatusEnum; + } + } + return null; + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/transactionType/TransactionTypeEnum.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/transactionType/TransactionTypeEnum.java new file mode 100644 index 0000000..9b5cf55 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/enums/transactionType/TransactionTypeEnum.java @@ -0,0 +1,40 @@ +package com.win.module.eam.enums.transactionType; + +public enum TransactionTypeEnum { + //设备模具报修申请 + TransactionType_IN("IN", "入库"), + TransactionType_OUT("OUT", "出库"), + ; + private String code; + private String name; + + TransactionTypeEnum(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return this.code; + } + + public String getName() { + return this.name; + } + + /** + * 用状态值获取枚举 + * + * @param code + * @return + */ + static TransactionTypeEnum getTransactionTypeEnum(String code) { + for (TransactionTypeEnum orderStatusEnum : values()) { + if (orderStatusEnum.getCode().equals(code)) { + return orderStatusEnum; + } + } + return null; + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/CreateMaintainPlanJob.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/CreateMaintainPlanJob.java new file mode 100644 index 0000000..63160e2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/CreateMaintainPlanJob.java @@ -0,0 +1,27 @@ +package com.win.module.eam.job; + +import com.win.framework.quartz.core.handler.JobHandler; +import com.win.module.eam.service.devicemaintainplan.DeviceMaintainPlanServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @ClassName CreateMaintainPlanJob + * @Description TODO + * @Author longlongxiaogege + * @Date 2024/2/7 11:09 + * @Version 1.0 + */ +@Component +public class CreateMaintainPlanJob implements JobHandler { + + @Autowired + private DeviceMaintainPlanServiceImpl deviceMaintainPlanService; + + + @Override + public String execute(String param) throws Exception { + deviceMaintainPlanService.createMaintainPlanTask(); + return null; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/MilestoneStageNoticeJob.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/MilestoneStageNoticeJob.java new file mode 100644 index 0000000..75670c4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/MilestoneStageNoticeJob.java @@ -0,0 +1,25 @@ +package com.win.module.eam.job; + +import com.win.framework.quartz.core.handler.JobHandler; +import com.win.module.eam.service.devicemaintainplan.DeviceMaintainPlanServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @ClassName MilestoneStageNoticeJob + * @Description TODO + * @Author longlongxiaogege + * @Date 2024/2/22 09:05 + * @Version 1.0 + */ +public class MilestoneStageNoticeJob implements JobHandler { + + @Autowired + private DeviceMaintainPlanServiceImpl deviceMaintainPlanService; + + + @Override + public String execute(String param) throws Exception { + deviceMaintainPlanService.createMaintainPlanTask(); + return null; + } +} \ No newline at end of file diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/MoldMilestoneJob.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/MoldMilestoneJob.java new file mode 100644 index 0000000..1cac172 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/MoldMilestoneJob.java @@ -0,0 +1,24 @@ +package com.win.module.eam.job; + +import com.win.framework.quartz.core.handler.JobHandler; +import com.win.module.eam.service.devicemaintainjob.DeviceMaintainJobMainService; +import com.win.module.eam.service.moldmilestone.MoldMilestoneService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 每天早上八点定时模具里程碑记录 + */ +@Component +public class MoldMilestoneJob implements JobHandler { + + @Autowired + private MoldMilestoneService moldMilestoneService; + + + @Override + public String execute(String param) throws Exception { + moldMilestoneService.createMoldMilestoneJob(); + return null; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/ProducePlanJob.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/ProducePlanJob.java new file mode 100644 index 0000000..54ea68a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/ProducePlanJob.java @@ -0,0 +1,24 @@ +package com.win.module.eam.job; + +import com.win.framework.quartz.core.handler.JobHandler; +import com.win.module.eam.service.producePlan.ProducePlanServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @ClassName ProducePlanJob + * @Description TODO + * @Author yejiaxing + */ +@Component +public class ProducePlanJob implements JobHandler { + @Autowired + private ProducePlanServiceImpl producePlanService; + + @Override + public String execute(String param) throws Exception { +// ProducePlanCreateReqVO createReqVO=new ProducePlanCreateReqVO(); +// producePlanService.create(createReqVO); + return null; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/SpotInspectionEndTimeJob.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/SpotInspectionEndTimeJob.java new file mode 100644 index 0000000..7750409 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/SpotInspectionEndTimeJob.java @@ -0,0 +1,23 @@ +package com.win.module.eam.job; + +import com.win.framework.quartz.core.handler.JobHandler; +import com.win.module.eam.service.devicespotinspectionrecord.DeviceSpotInspectionRecordMainService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 巡检点检晚班定时获取没有巡检点检工单推送给部门主管 + */ +@Component +public class SpotInspectionEndTimeJob implements JobHandler { + + @Autowired + private DeviceSpotInspectionRecordMainService deviceSpotInspectionRecordMainService; + + + @Override + public String execute(String param) throws Exception { + deviceSpotInspectionRecordMainService.createSpotInspectionTask(1); + return null; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/SpotInspectionStartTimeJob.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/SpotInspectionStartTimeJob.java new file mode 100644 index 0000000..ce1cbcc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/SpotInspectionStartTimeJob.java @@ -0,0 +1,23 @@ +package com.win.module.eam.job; + +import com.win.framework.quartz.core.handler.JobHandler; +import com.win.module.eam.service.devicespotinspectionrecord.DeviceSpotInspectionRecordMainService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 巡检点检晚班定时获取没有巡检点检工单推送给部门主管 + */ +@Component +public class SpotInspectionStartTimeJob implements JobHandler { + + @Autowired + private DeviceSpotInspectionRecordMainService deviceSpotInspectionRecordMainService; + + + @Override + public String execute(String param) throws Exception { + deviceSpotInspectionRecordMainService.createSpotInspectionTask(0); + return null; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/UncompletedOrderJob.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/UncompletedOrderJob.java new file mode 100644 index 0000000..9551a31 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/job/UncompletedOrderJob.java @@ -0,0 +1,24 @@ +package com.win.module.eam.job; + +import com.win.framework.quartz.core.handler.JobHandler; +import com.win.module.eam.service.devicemaintainjob.DeviceMaintainJobMainService; +import com.win.module.eam.service.devicespotinspectionrecord.DeviceSpotInspectionRecordMainService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 每月一号查询上个月未完成保养维修工单号 + */ +@Component +public class UncompletedOrderJob implements JobHandler { + + @Autowired + private DeviceMaintainJobMainService deviceMaintainJobMainService; + + + @Override + public String execute(String param) throws Exception { + deviceMaintainJobMainService.createUncompletedOrderTask(); + return null; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/adjustRecord/AdjustRecordDetailService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/adjustRecord/AdjustRecordDetailService.java new file mode 100644 index 0000000..1f64feb --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/adjustRecord/AdjustRecordDetailService.java @@ -0,0 +1,81 @@ +package com.win.module.eam.service.adjustRecord; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.adjustRecord.vo.*; +import com.win.module.eam.dal.dataobject.adjustRecord.AdjustRecordDetailDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 备件盘点调整记录子 Service 接口 + * + * @author 超级管理员 + */ +public interface AdjustRecordDetailService { + + /** + * 创建备件盘点调整记录子 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long create(@Valid AdjustRecordDetailCreateReqVO createReqVO); + + /** + * 更新备件盘点调整记录子 + * + * @param updateReqVO 更新信息 + */ + Integer update(@Valid AdjustRecordDetailUpdateReqVO updateReqVO); + + /** + * 删除备件盘点调整记录子 + * + * @param id 编号 + */ + Integer delete(Long id); + + /** + * 获得备件盘点调整记录子 + * + * @param id 编号 + * @return 备件盘点调整记录子 + */ + AdjustRecordDetailDO get(Long id); + + /** + * 获得备件盘点调整记录子列表 + * + * @param ids 编号 + * @return 备件盘点调整记录子列表 + */ + List getList(Collection ids); + + /** + * 获得备件盘点调整记录子分页 + * + * @param pageReqVO 分页查询 + * @return 备件盘点调整记录子分页 + */ + PageResult getPage(AdjustRecordDetailPageReqVO pageReqVO); + + /** + * 获得备件盘点调整记录子列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 备件盘点调整记录子列表 + */ + List getList(AdjustRecordDetailExportReqVO exportReqVO); + +// /** +// * 导入备件盘点调整记录子主信息 +// * +// * @param datas 导入备件盘点调整记录子主信息列表 +// * @param mode 导入模式1更新2追加3覆盖 +// * @param updatePart 是否支持更新 +// * @return 导入结果 +// */ +// public List importAdjustRecordDetailList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/adjustRecord/AdjustRecordDetailServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/adjustRecord/AdjustRecordDetailServiceImpl.java new file mode 100644 index 0000000..20bcaa7 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/adjustRecord/AdjustRecordDetailServiceImpl.java @@ -0,0 +1,109 @@ +package com.win.module.eam.service.adjustRecord; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordDetailCreateReqVO; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordDetailExportReqVO; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordDetailPageReqVO; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordDetailUpdateReqVO; +import com.win.module.eam.convert.adjustRecord.AdjustRecordDetailConvert; +import com.win.module.eam.dal.dataobject.adjustRecord.AdjustRecordDetailDO; +import com.win.module.eam.dal.mysql.adjustRecord.AdjustRecordDetailMapper; +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.eam.enums.ErrorCodeConstants.ADJUSTDETAILRECORD_NOT_EXISTS; + +/** + * 备件盘点调整记录子 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class AdjustRecordDetailServiceImpl implements AdjustRecordDetailService { + + @Resource + private AdjustRecordDetailMapper Mapper; + + @Override + public Long create(AdjustRecordDetailCreateReqVO createReqVO) { + // 插入 + AdjustRecordDetailDO adjustRecordDetailDO = AdjustRecordDetailConvert.INSTANCE.convert(createReqVO); + Mapper.insert(adjustRecordDetailDO); + // 返回 + return adjustRecordDetailDO.getId(); + } + + @Override + public Integer update(AdjustRecordDetailUpdateReqVO updateReqVO) { + // 校验存在 + validateExists(updateReqVO.getId()); + // 更新 + AdjustRecordDetailDO updateObj = AdjustRecordDetailConvert.INSTANCE.convert(updateReqVO); + return Mapper.updateById(updateObj); + } + + @Override + public Integer delete(Long id) { + // 校验存在 + validateExists(id); + // 删除 + return Mapper.deleteById(id); + } + + private void validateExists(Long id) { + if (Mapper.selectById(id) == null) { + throw exception(ADJUSTDETAILRECORD_NOT_EXISTS); + } + } + + @Override + public AdjustRecordDetailDO get(Long id) { + return Mapper.selectById(id); + } + + @Override + public List getList(Collection ids) { + return Mapper.selectBatchIds(ids); + } + + @Override + public PageResult getPage(AdjustRecordDetailPageReqVO pageReqVO) { + return Mapper.selectPage(pageReqVO); + } + + @Override + public List getList(AdjustRecordDetailExportReqVO exportReqVO) { + return Mapper.selectList(exportReqVO); + } + +// @Override +// public List importAdjustRecordDetailList(List datas, Integer mode, boolean updatePart) { +// if (CollUtil.isEmpty(datas)) { +// throw exception(_IMPORT_LIST_IS_EMPTY); +// } +// +// List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// AdjustRecordDetailDO obj = Mapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// Mapper.insert(AdjustRecordDetailConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// AdjustRecordDetailDO DO = AdjustRecordDetailConvert.INSTANCE.convert(item); +// DO.setId(obj.getId()); +// Mapper.updateById(obj); +// } +// } +// }); +// +// return errorList; +// } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/adjustRecord/AdjustRecordMainService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/adjustRecord/AdjustRecordMainService.java new file mode 100644 index 0000000..0f2e5cb --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/adjustRecord/AdjustRecordMainService.java @@ -0,0 +1,83 @@ +package com.win.module.eam.service.adjustRecord; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordMainCreateReqVO; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordMainExportReqVO; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordMainPageReqVO; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordMainUpdateReqVO; +import com.win.module.eam.dal.dataobject.adjustRecord.AdjustRecordMainDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 备件盘点调整记录主 Service 接口 + * + * @author 超级管理员 + */ +public interface AdjustRecordMainService { + + /** + * 创建备件盘点调整记录主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long create(@Valid AdjustRecordMainCreateReqVO createReqVO); + + /** + * 更新备件盘点调整记录主 + * + * @param updateReqVO 更新信息 + */ + Integer update(@Valid AdjustRecordMainUpdateReqVO updateReqVO); + + /** + * 删除备件盘点调整记录主 + * + * @param id 编号 + */ + Integer delete(Long id); + + /** + * 获得备件盘点调整记录主 + * + * @param id 编号 + * @return 备件盘点调整记录主 + */ + AdjustRecordMainDO get(Long id); + + /** + * 获得备件盘点调整记录主列表 + * + * @param ids 编号 + * @return 备件盘点调整记录主列表 + */ + List getList(Collection ids); + + /** + * 获得备件盘点调整记录主分页 + * + * @param pageReqVO 分页查询 + * @return 备件盘点调整记录主分页 + */ + PageResult getPage(AdjustRecordMainPageReqVO pageReqVO); + + /** + * 获得备件盘点调整记录主列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 备件盘点调整记录主列表 + */ + List getList(AdjustRecordMainExportReqVO exportReqVO); + + /** + * 获得用高级搜索库位分页列表 + * + * @param conditions 分页、排序和自定义条件 + * @return 分页列表 + */ + PageResult getAdjustRecordMainSenior(CustomConditions conditions); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/adjustRecord/AdjustRecordMainServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/adjustRecord/AdjustRecordMainServiceImpl.java new file mode 100644 index 0000000..d5e66d3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/adjustRecord/AdjustRecordMainServiceImpl.java @@ -0,0 +1,91 @@ +package com.win.module.eam.service.adjustRecord; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordMainCreateReqVO; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordMainExportReqVO; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordMainPageReqVO; +import com.win.module.eam.controller.adjustRecord.vo.AdjustRecordMainUpdateReqVO; +import com.win.module.eam.convert.adjustRecord.AdjustRecordMainConvert; +import com.win.module.eam.dal.dataobject.adjustRecord.AdjustRecordMainDO; +import com.win.module.eam.dal.mysql.adjustRecord.AdjustRecordMainMapper; +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.eam.enums.ErrorCodeConstants.ADJUSTRECORD_NOT_EXISTS; + +/** + * 备件盘点调整记录主 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class AdjustRecordMainServiceImpl implements AdjustRecordMainService { + + @Resource + private AdjustRecordMainMapper Mapper; + + @Override + public Long create(AdjustRecordMainCreateReqVO createReqVO) { + // 插入 + AdjustRecordMainDO adjustRecordMainDO = AdjustRecordMainConvert.INSTANCE.convert(createReqVO); + Mapper.insert(adjustRecordMainDO); + // 返回 + return adjustRecordMainDO.getId(); + } + + @Override + public Integer update(AdjustRecordMainUpdateReqVO updateReqVO) { + // 校验存在 + validateExists(updateReqVO.getId()); + // 更新 + AdjustRecordMainDO updateObj = AdjustRecordMainConvert.INSTANCE.convert(updateReqVO); + return Mapper.updateById(updateObj); + } + + @Override + public Integer delete(Long id) { + // 校验存在 + validateExists(id); + // 删除 + return Mapper.deleteById(id); + } + + private void validateExists(Long id) { + if (Mapper.selectById(id) == null) { + throw exception(ADJUSTRECORD_NOT_EXISTS); + } + } + + @Override + public AdjustRecordMainDO get(Long id) { + return Mapper.selectById(id); + } + + @Override + public List getList(Collection ids) { + return Mapper.selectBatchIds(ids); + } + + @Override + public PageResult getPage(AdjustRecordMainPageReqVO pageReqVO) { + return Mapper.selectPage(pageReqVO); + } + + @Override + public List getList(AdjustRecordMainExportReqVO exportReqVO) { + return Mapper.selectList(exportReqVO); + } + @Override + public PageResult getAdjustRecordMainSenior(CustomConditions conditions) { + return Mapper.selectSenior(conditions); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/attachmentfile/AttachmentFileService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/attachmentfile/AttachmentFileService.java new file mode 100644 index 0000000..dfa2ecd --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/attachmentfile/AttachmentFileService.java @@ -0,0 +1,114 @@ +package com.win.module.eam.service.attachmentfile; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.attachmentfile.vo.*; +import com.win.module.eam.dal.dataobject.attachmentfile.AttachmentFileDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 设备模具附件文件 Service 接口 + * + * @author 超级管理员 + */ +public interface AttachmentFileService { + + /** + * 创建设备模具附件文件 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createAttachmentFile(@Valid AttachmentFileCreateReqVO createReqVO); + + /** + * 更新设备模具附件文件 + * + * @param updateReqVO 更新信息 + */ + Integer updateAttachmentFile(@Valid AttachmentFileUpdateReqVO updateReqVO); + + /** + * 删除设备模具附件文件 + * + * @param id 编号 + */ + Integer deleteAttachmentFile(Long id); + + /** + * 获得设备模具附件文件 + * + * @param id 编号 + * @return 设备模具附件文件 + */ + AttachmentFileDO getAttachmentFile(Long id); + + /** + * 获得设备模具附件文件列表 + * + * @param ids 编号 + * @return 设备模具附件文件列表 + */ + List getAttachmentFileList(Collection ids); + + /** + * 获得设备模具附件文件分页 + * + * @param pageReqVO 分页查询 + * @return 设备模具附件文件分页 + */ + PageResult getAttachmentFilePage(AttachmentFilePageReqVO pageReqVO); + + /** + * 获得设备模具附件文件列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 设备模具附件文件列表 + */ + List getAttachmentFileList(AttachmentFileExportReqVO exportReqVO); + + /** + * 导入设备模具附件文件主信息 + * + * @param datas 导入设备模具附件文件主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importAttachmentFileList(List datas, Integer mode, boolean updatePart); + + + void insertBatch(List AttachmentFileCreateReqVOList); + + + /** + * 获得设备模具附件文件列表, 用于详情展示 + * + * @param ReqVO 查询条件 + * @return 设备模具附件文件列表 + */ + List getAttachmentFileList(AttachmentFileDO ReqVO); + + /** + * 获得设备模具附件文件列表, 用于详情展示 + * + * @param ReqVOList 查询条件 + * @return 设备模具附件文件列表 + */ + List getAttachmentFileListBatcn(List ReqVOList); + + + int deleteBatch(List ids); + + + Boolean uploadFile(UploadFileRequest request); + + + Boolean uploadFileNew(UploadFileRequest request); + + + List getAttachmentFilePathList(AttachmentFileDO ReqVO); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/attachmentfile/AttachmentFileServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/attachmentfile/AttachmentFileServiceImpl.java new file mode 100644 index 0000000..f0b9774 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/attachmentfile/AttachmentFileServiceImpl.java @@ -0,0 +1,268 @@ +package com.win.module.eam.service.attachmentfile; + +import cn.hutool.core.util.StrUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.attachmentfile.vo.*; +import com.win.module.eam.convert.attachmentfile.AttachmentFileConvert; +import com.win.module.eam.dal.dataobject.attachmentfile.AttachmentFileDO; +import com.win.module.eam.dal.mysql.attachmentfile.AttachmentFileMapper; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.ATTACHMENT_FILE_NOT_EXISTS; + +/** + * 设备模具附件文件 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class AttachmentFileServiceImpl implements AttachmentFileService { + + @Resource + private AttachmentFileMapper attachmentFileMapper; + + @Value("${win.file.path}") + private String filePath; + + @Override + public Long createAttachmentFile(AttachmentFileCreateReqVO createReqVO) { + // 插入 + List filePathList = createReqVO.getFilePathList(); + if (filePathList.size() > 0) {//如果有文件 + UploadFileRequest uploadFileRequest = new UploadFileRequest(); + uploadFileRequest.setNumber(createReqVO.getNumber()); + uploadFileRequest.setFuncCode(createReqVO.getFuncCode()); + uploadFileRequest.setFilePathList(filePathList); + this.uploadFile(uploadFileRequest); + } + // 返回 + return 1L; + } + + @Override + public Integer updateAttachmentFile(AttachmentFileUpdateReqVO updateReqVO) { + // 校验存在 + validateAttachmentFileExists(updateReqVO.getId()); + // 更新 + AttachmentFileDO updateObj = AttachmentFileConvert.INSTANCE.convert(updateReqVO); + return attachmentFileMapper.updateById(updateObj); + } + + @Override + public Integer deleteAttachmentFile(Long id) { + // 校验存在 + validateAttachmentFileExists(id); + // 删除 + return attachmentFileMapper.deleteById(id); + } + + private void validateAttachmentFileExists(Long id) { + if (attachmentFileMapper.selectById(id) == null) { + throw exception(ATTACHMENT_FILE_NOT_EXISTS); + } + } + + @Override + public AttachmentFileDO getAttachmentFile(Long id) { + AttachmentFileDO attachmentFileDO = attachmentFileMapper.selectById(id); + List filePathList = new ArrayList<>(); + String[] arr = attachmentFileDO.getPath().split(","); + for (String str : arr) { + filePathList.add(str); + } + attachmentFileDO.setFilePathList(filePathList); + return attachmentFileDO; + } + + @Override + public List getAttachmentFileList(Collection ids) { + return attachmentFileMapper.selectBatchIds(ids); + } + + @Override + public PageResult getAttachmentFilePage(AttachmentFilePageReqVO pageReqVO) { + PageResult pageResult = attachmentFileMapper.selectPage(pageReqVO); + List attachmentFileDOList = pageResult.getList(); + for (AttachmentFileDO attachmentFileDO : attachmentFileDOList) { + List filePathList = new ArrayList<>(); + String[] arr = attachmentFileDO.getPath().split(","); + for (String str : arr) { + filePathList.add(str); + } + attachmentFileDO.setFilePathList(filePathList); + } + return pageResult; + } + + @Override + public List getAttachmentFileList(AttachmentFileExportReqVO exportReqVO) { + return attachmentFileMapper.selectList(exportReqVO); + } + + @Override + public List importAttachmentFileList(List datas, Integer mode, boolean updatePart) { +// if (CollUtil.isEmpty(datas)) { +// throw exception(ATTACHMENT_FILE_IMPORT_LIST_IS_EMPTY); +// } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// AttachmentFileDO obj = attachmentFileMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// attachmentFileMapper.insert(AttachmentFileConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// AttachmentFileDO attachmentFileDO = AttachmentFileConvert.INSTANCE.convert(item); +// attachmentFileDO.setId(obj.getId()); +// attachmentFileMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public void insertBatch(List attachmentFileCreateReqVOList) { + List attachmentFileDOList = attachmentFileCreateReqVOList.stream().map(item -> { + return AttachmentFileConvert.INSTANCE.convert(item); + }).toList(); + attachmentFileMapper.insertBatch(attachmentFileDOList); + } + + @Override + public List getAttachmentFileList(AttachmentFileDO ReqVO) { + return attachmentFileMapper.getAttachmentFileList(ReqVO); + } + + @Override + public List getAttachmentFileListBatcn(List ReqVOList) { + return attachmentFileMapper.getAttachmentFileListBatcn(ReqVOList); + } + + @Override + public int deleteBatch(List ids) { + return attachmentFileMapper.deleteBatch(ids); + } + + @Transactional + @Override + public Boolean uploadFile(UploadFileRequest request) { + List attachmentFileCreateReqVOList = new ArrayList<>(); + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + //清除旧数据 + attachmentFileDO.setFileBusiType(request.getFileBusiType()); + attachmentFileDO.setNumber(request.getNumber()); + attachmentFileDO.setFuncCode(request.getFuncCode()); + List attachmentFileDOList = getAttachmentFileList(attachmentFileDO); + if (attachmentFileDOList != null && attachmentFileDOList.size() > 0) { + List ids = attachmentFileDOList.stream().map(item -> { + return item.getId(); + }).toList(); + deleteBatch(ids); + } + if (request.getFilePathList() != null && request.getFilePathList().size() > 0) { + request.getFilePathList().forEach(filePath -> { + AttachmentFileCreateReqVO attachmentFileCreateReqVO = new AttachmentFileCreateReqVO(); + // 获取请求的路径 + String path = StrUtil.subAfter(filePath, "/get/", false); + if (StrUtil.isEmpty(path)) { + throw new IllegalArgumentException("结尾的 path 路径必须传递"); + } + File file = new File(filePath); + // 获取文件大小(以字节为单位) + attachmentFileCreateReqVO.setSize(String.valueOf(file.length())); + // 获取文件名 + attachmentFileCreateReqVO.setFileName(file.getName()); + // 获取文件后缀名 + attachmentFileCreateReqVO.setFileType(getFileExtension(file.getName())); + attachmentFileCreateReqVO.setFileBusiType(request.getFileBusiType()); + attachmentFileCreateReqVO.setNumber(request.getNumber()); + attachmentFileCreateReqVO.setFuncCode(request.getFuncCode()); + attachmentFileCreateReqVO.setPath(filePath); + attachmentFileCreateReqVO.setCreator(String.valueOf(getLoginUserId())); + attachmentFileCreateReqVOList.add(attachmentFileCreateReqVO); + }); + } + //新增新数据 + insertBatch(attachmentFileCreateReqVOList); + return true; + } + + + @Transactional + @Override + public Boolean uploadFileNew(UploadFileRequest request) { + List attachmentFileCreateReqVOList = new ArrayList<>(); + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + //清除旧数据 + attachmentFileDO.setFileBusiType(request.getFileBusiType()); + attachmentFileDO.setNumber(request.getNumber()); + attachmentFileDO.setFuncCode(request.getFuncCode()); + List attachmentFileDOList = getAttachmentFileList(attachmentFileDO); + if (attachmentFileDOList != null && attachmentFileDOList.size() > 0) { + List ids = attachmentFileDOList.stream().map(item -> { + return item.getId(); + }).toList(); + deleteBatch(ids); + } + if (request.getFileInfoList() != null && request.getFileInfoList().size() > 0) { + request.getFileInfoList().forEach(fileInfo -> { + AttachmentFileCreateReqVO attachmentFileCreateReqVO = new AttachmentFileCreateReqVO(); + // 获取请求的路径 + String path = StrUtil.subAfter(fileInfo.getUrl(), "/get/", false); + if (StrUtil.isEmpty(path)) { + throw new IllegalArgumentException("结尾的 path 路径必须传递"); + } + File file = new File(fileInfo.getUrl()); + // 获取文件大小(以字节为单位) + attachmentFileCreateReqVO.setSize(String.valueOf(file.length())); + // 获取文件名 + attachmentFileCreateReqVO.setFileName(fileInfo.getName()); + // 获取文件后缀名 + attachmentFileCreateReqVO.setFileType(getFileExtension(fileInfo.getName())); + attachmentFileCreateReqVO.setFileBusiType(request.getFileBusiType()); + attachmentFileCreateReqVO.setNumber(request.getNumber()); + attachmentFileCreateReqVO.setFuncCode(request.getFuncCode()); + attachmentFileCreateReqVO.setPath(fileInfo.getUrl()); + attachmentFileCreateReqVO.setUid(fileInfo.getUid()); + attachmentFileCreateReqVO.setCreator(String.valueOf(getLoginUserId())); + attachmentFileCreateReqVOList.add(attachmentFileCreateReqVO); + }); + } + //新增新数据 + insertBatch(attachmentFileCreateReqVOList); + return true; + } + + @Override + public List getAttachmentFilePathList(AttachmentFileDO ReqVO) { + return attachmentFileMapper.getAttachmentFilePathList(ReqVO); + } + + + // 获取文件后缀名的方法 + private static String getFileExtension(String fileName) { + int dotIndex = fileName.lastIndexOf("."); + if (dotIndex > 0 && dotIndex < fileName.length() - 1) { + return fileName.substring(dotIndex + 1); + } else { + return ""; + } + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/board/BoardService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/board/BoardService.java new file mode 100644 index 0000000..89804a1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/board/BoardService.java @@ -0,0 +1,64 @@ +package com.win.module.eam.service.board; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; + +/** + * 维修工单主 Service 接口 + * + * @author 超级管理员 + */ +public interface BoardService { + + /** + * 看板获取工单状态数量 + * @return + */ + Map getMaintenanceNumbers(); + + /** + * 看板获取设备情况 + * @return + */ + Map getDeviceNumbers(); + + /** + * 看板获取模具情况 + * @return + */ + Map getMoldNumbers(); + + /** + * 看板获取维修工单分页数据 + * @param pageVO + * @return + */ + PageResult getAppPage(DeviceMaintenanceJobMainPageReqVO pageVO); + + /** + * 看板获取近七天设备故障次数列表 + * @return + */ + List> getDeviceSealNumberList(); + + /** + * 获取近七天维修工单数量柱状图 + * @return + */ + Map getOrderBarData(); + /** + * 维修工单故障类型数量饼状图 + * @return + */ + List> getOrderPieData(); + + /** + * 获得近七天维修人员的维修工作完成情况 + * @return + */ + List> getPeopleWorkList(); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/board/BoardServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/board/BoardServiceImpl.java new file mode 100644 index 0000000..9027a6f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/board/BoardServiceImpl.java @@ -0,0 +1,252 @@ +package com.win.module.eam.service.board; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailItemMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobMainMapper; +import com.win.module.eam.dal.mysql.devicerepairrequest.DeviceRepairRequestMapper; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.eam.dal.mysql.maintenanceturnto.MaintenanceTurntoMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.eam.service.devicerepairrequest.DeviceRepairRequestService; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; + +import org.springframework.validation.annotation.Validated; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import com.win.framework.common.pojo.PageResult; + +/** + * 维修工单主 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class BoardServiceImpl implements BoardService { + + @Resource + private DeviceMaintenanceJobMainMapper deviceMaintenanceJobMainMapper;//维修工单 + + @Resource + private DeviceRepairRequestMapper deviceRepairRequestMapper; + @Lazy + @Resource + private DeviceRepairRequestService moldRepairRequestService; + + @Resource + private MaintenanceTurntoMapper maintenanceTurntoMapper; + + @Resource + private DeviceMaintenanceJobDetailMapper deviceMaintenanceJobDetailMapper; + @Resource + DeviceMaintenanceJobDetailItemMapper deviceMaintenanceJobDetailItemMapper; + + @Resource + ItemMapper itemMapper; + + @Resource + private MoldAccountsMapper moldAccountsMapper; + + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + + + @Override + public Map getMaintenanceNumbers() { + Map map = new HashMap<>(); + Long daijiedan = deviceMaintenanceJobMainMapper.getMaintenanceNumbers(OrderStatusEnum.PEND_ORDER_STATUS.getCode());//待接单 + Long yijiedan = deviceMaintenanceJobMainMapper.getMaintenanceNumbers(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode());//已接单 + Long yiwancheng = deviceMaintenanceJobMainMapper.getMaintenanceNumbers(OrderStatusEnum.COMPLETED_STATUS.getCode());//已完成 + Long yiyanzheng = deviceMaintenanceJobMainMapper.getMaintenanceNumbers(OrderStatusEnum.VERIFIED_STATUS.getCode());//已验证 + Long yibohui = deviceMaintenanceJobMainMapper.getMaintenanceNumbers(OrderStatusEnum.REJECTED_STATUS.getCode());//已驳回 + map.put("daijiedan",daijiedan); + map.put("yijiedan",yijiedan); + map.put("yiwancheng",yiwancheng); + map.put("yiyanzheng",yiyanzheng); + map.put("yibohui",yibohui); + return map; + } + + @Override + public Map getDeviceNumbers() { + Map map = new HashMap<>(); + BigDecimal zhengchang = new BigDecimal(deviceAccountsMapper.getDeviceNumbers("0")); + BigDecimal sunhuai = new BigDecimal(deviceAccountsMapper.getDeviceNumbers("1")); + BigDecimal sum = zhengchang.add(sunhuai); + BigDecimal zhanbi = zhengchang.divide(sum, 2, RoundingMode.HALF_UP); + //BigDecimal zhanbi = zhengchang.divide(sum).setScale(2); + map.put("zhengchang",zhengchang); + map.put("sunhuai",sunhuai); + map.put("sum",sum); + map.put("zhanbi",zhanbi); + return map; + } + + @Override + public Map getMoldNumbers() { + Map map = new HashMap<>(); + BigDecimal zhengchang = new BigDecimal(moldAccountsMapper.getMoldNumbers("0")); + BigDecimal sunhuai = new BigDecimal(moldAccountsMapper.getMoldNumbers("1")); + BigDecimal sum = zhengchang.add(sunhuai); + BigDecimal zhanbi = zhengchang.divide(sum, 2, RoundingMode.HALF_UP); + map.put("zhengchang",zhengchang); + map.put("sunhuai",sunhuai); + map.put("sum",sum); + map.put("zhanbi",zhanbi); + return map; + } + + @Override + public PageResult getAppPage(DeviceMaintenanceJobMainPageReqVO pageReqVO) { + IPage pageInfo = deviceMaintenanceJobMainMapper.getKanBanAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for(DeviceMaintenanceJobMainDO en :pageInfo.getRecords()){ + String deviceNumber = en.getDeviceNumber(); + String type = en.getType(); + if("MOLD".equals(type)){//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + }else{//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + } + } + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + + @Override + public List> getDeviceSealNumberList() { + LocalDate now = LocalDate.now(); + LocalDate localDate = now.minusDays(30); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + String endDate = now.format(formatter); + String startDate = localDate.format(formatter); + List> deviceSealNumberList = deviceMaintenanceJobMainMapper.getDeviceSealNumberList(startDate, endDate); + for(Map en:deviceSealNumberList) { + String deviceNumber = en.get("deviceNumber").toString(); + String type = en.get("type").toString(); + if ("MOLD".equals(type)) {//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.put("factoryAreaNumber",(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaNumber").toString())); + en.put("factoryAreaName",(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaName").toString())); + en.put("name",(detailsByNumber == null ? "" : detailsByNumber.get("name").toString())); + } else {//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.put("factoryAreaNumber",(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaNumber").toString())); + en.put("factoryAreaName",(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaName").toString())); + en.put("name",(detailsByNumber == null ? "" : detailsByNumber.get("name").toString())); + } + } + return deviceSealNumberList; + } + + @Override + public Map getOrderBarData() { + Map map = new HashMap<>(); + // 获取当前日期 + LocalDate today = LocalDate.now(); + // 创建一个列表来存储前七天的日期 + List xData = new ArrayList<>(); + List yData = new ArrayList<>(); + // 循环七次,获取前30天的日期 + for (int i = 30; i > 0; i--) { + // 获取当前日期减去循环次数的日期 + LocalDate date = today.minusDays(i-1); + // 定义日期格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + String dateStr = date.format(formatter); + int zs = deviceMaintenanceJobMainMapper.getOrderBarData(dateStr).size(); + yData.add(zs); + // 将日期格式化为字符串,并添加到列表中 + DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("MM-dd"); + String dateStr1 = date.format(formatter1); + xData.add(dateStr1); + } + map.put("xData",xData); + map.put("yData",yData); + return map; + } + + @Override + public List> getOrderPieData() { + //日期范围预留 + return deviceMaintenanceJobMainMapper.getOrderPieData(null, null); + } + + @Override + public List> getPeopleWorkList() { + LocalDate now = LocalDate.now(); + LocalDate localDate = now.minusDays(30); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + String endDate = now.format(formatter); + String startDate = localDate.format(formatter); + List> peopleWorkList = deviceMaintenanceJobMainMapper.getPeopleWorkList(startDate, endDate); + return peopleWorkList; + } + + /** + * 获取近七天的日期数据包括今天(暂无用) + * @return + */ + static List getSevenDayList(){ + // 获取当前日期 + LocalDate today = LocalDate.now(); + + // 创建一个列表来存储前七天的日期 + List previousDates = new ArrayList<>(); + + // 循环七次,获取前七天的日期 + for (int i = 30; i > 0; i--) { + // 获取当前日期减去循环次数的日期 + LocalDate date = today.minusDays(i-1); + + // 定义日期格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + // 将日期格式化为字符串,并添加到列表中 + previousDates.add(date.format(formatter)); + } + return previousDates; + }; + + public static void main(String[] args) { + // 获取当前日期 + LocalDate today = LocalDate.now(); + + // 创建一个列表来存储前七天的日期 + List previousDates = new ArrayList<>(); + + // 循环七次,获取前七天的日期 + for (int i = 30; i > 0; i--) { + // 获取当前日期减去循环次数的日期 + LocalDate date = today.minusDays(i-1); + + // 定义日期格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + // 将日期格式化为字符串,并添加到列表中 + previousDates.add(date.format(formatter)); + } + + // 打印结果 + System.out.println("前七天的日期(格式化后): " + previousDates); + } +} \ No newline at end of file diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/classtype/ClassTypeService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/classtype/ClassTypeService.java new file mode 100644 index 0000000..e967c4b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/classtype/ClassTypeService.java @@ -0,0 +1,86 @@ +package com.win.module.eam.service.classtype; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.classtype.vo.*; +import com.win.module.eam.dal.dataobject.classtype.ClassTypeDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 厂区班组角色数据维护 Service 接口 + * + * @author 超级管理员 + */ +public interface ClassTypeService { + + /** + * 创建厂区班组角色数据维护 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createClassType(@Valid ClassTypeCreateReqVO createReqVO); + + /** + * 更新厂区班组角色数据维护 + * + * @param updateReqVO 更新信息 + */ + Integer updateClassType(@Valid ClassTypeUpdateReqVO updateReqVO); + + /** + * 删除厂区班组角色数据维护 + * + * @param id 编号 + */ + Integer deleteClassType(Long id); + + /** + * 获得厂区班组角色数据维护 + * + * @param id 编号 + * @return 厂区班组角色数据维护 + */ + ClassTypeDO getClassType(Long id); + + /** + * 获得厂区班组角色数据维护列表 + * + * @param ids 编号 + * @return 厂区班组角色数据维护列表 + */ + List getClassTypeList(Collection ids); + + /** + * 获得厂区班组角色数据维护分页 + * + * @param pageReqVO 分页查询 + * @return 厂区班组角色数据维护分页 + */ + PageResult getClassTypePage(ClassTypePageReqVO pageReqVO); + + /** + * 获得厂区班组角色数据维护列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 厂区班组角色数据维护列表 + */ + List getClassTypeList(ClassTypeExportReqVO exportReqVO); + + /** + * 导入厂区班组角色数据维护主信息 + * + * @param datas 导入厂区班组角色数据维护主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importClassTypeList(List datas, Integer mode, boolean updatePart); + + /** + * 判断当前人是工程师还是维修工0无1维修工1工程师 + * @return + */ + String JudgeIdentity(String type); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/classtype/ClassTypeServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/classtype/ClassTypeServiceImpl.java new file mode 100644 index 0000000..1f6d379 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/classtype/ClassTypeServiceImpl.java @@ -0,0 +1,157 @@ +package com.win.module.eam.service.classtype; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.module.eam.controller.classtype.vo.*; +import com.win.module.eam.convert.classtype.ClassTypeConvert; +import com.win.module.eam.dal.mysql.classtype.ClassTypeMapper; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.win.module.eam.dal.dataobject.classtype.ClassTypeDO; +import com.win.framework.common.pojo.PageResult; + + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 厂区班组角色数据维护 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class ClassTypeServiceImpl implements ClassTypeService { + + @Resource + private ClassTypeMapper classTypeMapper; + + @Override + public Long createClassType(ClassTypeCreateReqVO createReqVO) { + // 插入 + validateClassTypeRepeatCreate(createReqVO.getFactoryAreaNumber(),createReqVO.getType()); + ClassTypeDO classType = ClassTypeConvert.INSTANCE.convert(createReqVO); + classTypeMapper.insert(classType); + // 返回 + return classType.getId(); + } + + @Override + public Integer updateClassType(ClassTypeUpdateReqVO updateReqVO) { + // 校验存在 + validateClassTypeRepeatUpdate(updateReqVO.getId()); + // 更新 + ClassTypeDO updateObj = ClassTypeConvert.INSTANCE.convert(updateReqVO); + return classTypeMapper.updateById(updateObj); + } + + @Override + public Integer deleteClassType(Long id) { + // 校验存在 + validateClassTypeExists(id); + // 删除 + return classTypeMapper.deleteById(id); + } + + private void validateClassTypeExists(Long id) { + if (classTypeMapper.selectById(id) == null) { + throw exception(CLASS_TYPE_NOT_EXISTS); + } + } + + /** + * 新增修改去重提示 厂区+班组只能有一条数据 + * @param id + */ + private void validateClassTypeRepeatUpdate(Long id) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + ClassTypeDO classTypeDO = classTypeMapper.selectById(id); + if (classTypeDO == null) { + throw exception(CLASS_TYPE_NOT_EXISTS); + } + queryWrapper.eq("factory_area_number",classTypeDO.getFactoryAreaNumber()); + queryWrapper.eq("type",classTypeDO.getType()); + queryWrapper.ne("id",id); + List classTypeDOS = classTypeMapper.selectList(queryWrapper); + if(!classTypeDOS.isEmpty()){ + throw exception(CLASS_TYPE_DATA_REPEAT); + } + + } + + private void validateClassTypeRepeatCreate( String factoryAreaNumber,String type) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("factory_area_number",factoryAreaNumber); + queryWrapper.eq("type",type); + List classTypeDOS = classTypeMapper.selectList(queryWrapper); + if(!classTypeDOS.isEmpty()){ + throw exception(CLASS_TYPE_DATA_REPEAT); + } + + } + + @Override + public ClassTypeDO getClassType(Long id) { + return classTypeMapper.selectById(id); + } + + @Override + public List getClassTypeList(Collection ids) { + return classTypeMapper.selectBatchIds(ids); + } + + @Override + public PageResult getClassTypePage(ClassTypePageReqVO pageReqVO) { + return classTypeMapper.selectPage(pageReqVO); + } + + @Override + public List getClassTypeList(ClassTypeExportReqVO exportReqVO) { + return classTypeMapper.selectList(exportReqVO); + } + + @Override + public List importClassTypeList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + throw exception(CLASS_TYPE_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); + datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// ClassTypeDO obj = classTypeMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// classTypeMapper.insert(ClassTypeConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// ClassTypeDO classTypeDO = ClassTypeConvert.INSTANCE.convert(item); +// classTypeDO.setId(obj.getId()); +// classTypeMapper.updateById(obj); +// } +// } + }); + + return errorList; + } + + @Override + public String JudgeIdentity(String type) { +// List classTypeDOS = classTypeMapper.JudgeIdentity(getLoginUserId(),type); +// String a = "0"; +// for(ClassTypeDO en:classTypeDOS){ +// if(en.getWorkerRoleId()!=null && !"".equals(en.getWorkerRoleId())){ +// a = "1"; +// } +// if(en.getEngineerRoleId()!=null && !"".equals(en.getEngineerRoleId())){ +// a = "2"; +// return a; +// } +// } + return null; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/counRecord/CountRecordDetailService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/counRecord/CountRecordDetailService.java new file mode 100644 index 0000000..66016a4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/counRecord/CountRecordDetailService.java @@ -0,0 +1,84 @@ +package com.win.module.eam.service.counRecord; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.countRecord.vo.CountRecordDetailCreateReqVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordDetailExportReqVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordDetailPageReqVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordDetailUpdateReqVO; +import com.win.module.eam.dal.dataobject.countRecord.CountRecordDetailDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 备件盘点记录子 Service 接口 + * + * @author 超级管理员 + */ +public interface CountRecordDetailService { + + /** + * 创建备件盘点记录子 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long create(@Valid CountRecordDetailCreateReqVO createReqVO); + + /** + * 更新备件盘点记录子 + * + * @param updateReqVO 更新信息 + */ + Integer update(@Valid CountRecordDetailUpdateReqVO updateReqVO); + + /** + * 删除备件盘点记录子 + * + * @param id 编号 + */ + Integer delete(Long id); + + /** + * 获得备件盘点记录子 + * + * @param id 编号 + * @return 备件盘点记录子 + */ + CountRecordDetailDO get(Long id); + + /** + * 获得备件盘点记录子列表 + * + * @param ids 编号 + * @return 备件盘点记录子列表 + */ + List getList(Collection ids); + + /** + * 获得备件盘点记录子分页 + * + * @param pageReqVO 分页查询 + * @return 备件盘点记录子分页 + */ + PageResult getPage(CountRecordDetailPageReqVO pageReqVO); + + /** + * 获得备件盘点记录子列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 备件盘点记录子列表 + */ + List getList(CountRecordDetailExportReqVO exportReqVO); + +// /** +// * 导入备件盘点记录子主信息 +// * +// * @param datas 导入备件盘点记录子主信息列表 +// * @param mode 导入模式1更新2追加3覆盖 +// * @param updatePart 是否支持更新 +// * @return 导入结果 +// */ +// public List importCountRecordDetailList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/counRecord/CountRecordDetailServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/counRecord/CountRecordDetailServiceImpl.java new file mode 100644 index 0000000..b415a00 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/counRecord/CountRecordDetailServiceImpl.java @@ -0,0 +1,85 @@ +package com.win.module.eam.service.counRecord; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.countRecord.vo.CountRecordDetailCreateReqVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordDetailExportReqVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordDetailPageReqVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordDetailUpdateReqVO; +import com.win.module.eam.convert.countRecord.CountRecordDetailConvert; +import com.win.module.eam.dal.dataobject.countRecord.CountRecordDetailDO; +import com.win.module.eam.dal.mysql.countRecord.CountRecordDetailMapper; +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.eam.enums.ErrorCodeConstants.COUNT_DETAIL_NOT_EXISTS; + +/** + * 备件盘点记录子 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class CountRecordDetailServiceImpl implements CountRecordDetailService { + + @Resource + private CountRecordDetailMapper countRecordDetailMapper; + + @Override + public Long create(CountRecordDetailCreateReqVO createReqVO) { + // 插入 + CountRecordDetailDO countRecordDetailDO = CountRecordDetailConvert.INSTANCE.convert(createReqVO); + countRecordDetailMapper.insert(countRecordDetailDO); + // 返回 + return countRecordDetailDO.getId(); + } + + @Override + public Integer update(CountRecordDetailUpdateReqVO updateReqVO) { + // 校验存在 + validateExists(updateReqVO.getId()); + // 更新 + CountRecordDetailDO updateObj = CountRecordDetailConvert.INSTANCE.convert(updateReqVO); + return countRecordDetailMapper.updateById(updateObj); + } + + @Override + public Integer delete(Long id) { + // 校验存在 + validateExists(id); + // 删除 + return countRecordDetailMapper.deleteById(id); + } + + private void validateExists(Long id) { + if (countRecordDetailMapper.selectById(id) == null) { + throw exception(COUNT_DETAIL_NOT_EXISTS); + } + } + + @Override + public CountRecordDetailDO get(Long id) { + return countRecordDetailMapper.selectById(id); + } + + @Override + public List getList(Collection ids) { + return countRecordDetailMapper.selectBatchIds(ids); + } + + @Override + public PageResult getPage(CountRecordDetailPageReqVO pageReqVO) { + return countRecordDetailMapper.selectPage(pageReqVO); + } + + @Override + public List getList(CountRecordDetailExportReqVO exportReqVO) { + return countRecordDetailMapper.selectList(exportReqVO); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/counRecord/CountRecordMainService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/counRecord/CountRecordMainService.java new file mode 100644 index 0000000..26e832f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/counRecord/CountRecordMainService.java @@ -0,0 +1,86 @@ +package com.win.module.eam.service.counRecord; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.countRecord.vo.CountRecordMainCreateReqVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordMainExportReqVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordMainPageReqVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordMainUpdateReqVO; +import com.win.module.eam.dal.dataobject.countRecord.CountRecordMainDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 备件盘点记录主 Service 接口 + * + * @author 超级管理员 + */ +public interface CountRecordMainService { + + /** + * 创建备件盘点记录主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long create(@Valid CountRecordMainCreateReqVO createReqVO); + + /** + * 更新备件盘点记录主 + * + * @param updateReqVO 更新信息 + */ + Integer update(@Valid CountRecordMainUpdateReqVO updateReqVO); + + /** + * 删除备件盘点记录主 + * + * @param id 编号 + */ + Integer delete(Long id); + + Integer adjust(String number); + + + /** + * 获得备件盘点记录主 + * + * @param id 编号 + * @return 备件盘点记录主 + */ + CountRecordMainDO get(Long id); + + /** + * 获得备件盘点记录主列表 + * + * @param ids 编号 + * @return 备件盘点记录主列表 + */ + List getList(Collection ids); + + /** + * 获得备件盘点记录主分页 + * + * @param pageReqVO 分页查询 + * @return 备件盘点记录主分页 + */ + PageResult getPage(CountRecordMainPageReqVO pageReqVO); + + /** + * 获得备件盘点记录主列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 备件盘点记录主列表 + */ + List getList(CountRecordMainExportReqVO exportReqVO); + + /** + * 获得用高级搜索库位分页列表 + * + * @param conditions 分页、排序和自定义条件 + * @return 分页列表 + */ + PageResult getCountRecordMainSenior(CustomConditions conditions); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/counRecord/CountRecordMainServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/counRecord/CountRecordMainServiceImpl.java new file mode 100644 index 0000000..5d8f51e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/counRecord/CountRecordMainServiceImpl.java @@ -0,0 +1,200 @@ +package com.win.module.eam.service.counRecord; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.exception.ServiceException; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.countRecord.vo.CountRecordMainCreateReqVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordMainExportReqVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordMainPageReqVO; +import com.win.module.eam.controller.countRecord.vo.CountRecordMainUpdateReqVO; +import com.win.module.eam.controller.transaction.vo.TransactionCreateReqVO; +import com.win.module.eam.convert.countRecord.CountRecordMainConvert; +import com.win.module.eam.dal.dataobject.adjustRecord.AdjustRecordDetailDO; +import com.win.module.eam.dal.dataobject.adjustRecord.AdjustRecordMainDO; +import com.win.module.eam.dal.dataobject.countJobMain.CountJobMainDO; +import com.win.module.eam.dal.dataobject.countRecord.CountRecordDetailDO; +import com.win.module.eam.dal.dataobject.countRecord.CountRecordMainDO; +import com.win.module.eam.dal.dataobject.countadjustPlan.CountadjustPlanDO; +import com.win.module.eam.dal.mysql.adjustRecord.AdjustRecordDetailMapper; +import com.win.module.eam.dal.mysql.adjustRecord.AdjustRecordMainMapper; +import com.win.module.eam.dal.mysql.countJobMain.CountJobDetailMapper; +import com.win.module.eam.dal.mysql.countJobMain.CountJobMainMapper; +import com.win.module.eam.dal.mysql.countRecord.CountRecordDetailMapper; +import com.win.module.eam.dal.mysql.countRecord.CountRecordMainMapper; +import com.win.module.eam.dal.mysql.countadjustPlan.CountadjustPlanMapper; +import com.win.module.eam.dal.mysql.itemaccounts.ItemAccountsMapper; +import com.win.module.eam.enums.status.AdjustStatusEnum; +import com.win.module.eam.enums.transaction.TransactionEnum; +import com.win.module.eam.enums.transactionType.TransactionTypeEnum; +import com.win.module.eam.service.transaction.TransactionService; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.eam.enums.ErrorCodeConstants.COUNTADRECORD_NOT_EXISTS; + +/** + * 备件盘点记录主 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class CountRecordMainServiceImpl implements CountRecordMainService { + + @Resource + private CountRecordMainMapper countRecordMainMapper; + @Resource + private CountRecordDetailMapper countRecordDetailMapper; + @Resource + private CountadjustPlanMapper countadjustPlanMapper; + + @Resource + private CountJobMainMapper countJobMainMapper; + @Resource + private CountJobDetailMapper countJobDetailMapper; + @Resource + private AdjustRecordMainMapper adjustRecordMainMapper; + @Resource + private AdjustRecordDetailMapper adjustRecordDetailMapper; + @Resource + private TransactionService transactionService; + @Resource + private ItemAccountsMapper itemAccountsMapper; + @Resource + private SerialNumberApi serialNumberApi; + + @Override + public Long create(CountRecordMainCreateReqVO createReqVO) { + // 插入 + CountRecordMainDO counRecordDO = CountRecordMainConvert.INSTANCE.convert(createReqVO); + countRecordMainMapper.insert(counRecordDO); + // 返回 + return counRecordDO.getId(); + } + + @Override + public Integer update(CountRecordMainUpdateReqVO updateReqVO) { + // 校验存在 + validateExists(updateReqVO.getId()); + // 更新 + CountRecordMainDO updateObj = CountRecordMainConvert.INSTANCE.convert(updateReqVO); + return countRecordMainMapper.updateById(updateObj); + } + + @Override + public Integer delete(Long id) { + // 校验存在 + validateExists(id); + // 删除 + return countRecordMainMapper.deleteById(id); + } + + + @Override + @Transactional + public Integer adjust(String number) { + int reslt = 0; + //盘点记录主表 + QueryWrapper recordMainDOQueryWrapper = new QueryWrapper<>(); + recordMainDOQueryWrapper.eq("number", number); + CountRecordMainDO countRecordMainDO = countRecordMainMapper.selectOne(recordMainDOQueryWrapper); + countRecordMainDO.setStatus(AdjustStatusEnum.COMPLETED.getCode()); + countRecordMainMapper.updateById(countRecordMainDO); + //盘点工单主表 + QueryWrapper countJobMainDOQueryWrapper = new QueryWrapper<>(); + countJobMainDOQueryWrapper.eq("job_number", countRecordMainDO.getJobNumber()); + CountJobMainDO countJobMainDO = countJobMainMapper.selectOne(countJobMainDOQueryWrapper); + //新增盘点调整记录主表 + AdjustRecordMainDO adjustRecordMainDO = new AdjustRecordMainDO(); + String adjustRecordNumber = serialNumberApi.generateCode(RuleCodeEnum.Adjust_Record.getCode()); + adjustRecordMainDO.setNumber(adjustRecordNumber); + adjustRecordMainDO.setRecordNumber(countRecordMainDO.getNumber()); + adjustRecordMainDO.setJobNumber(countJobMainDO.getJobNumber()); + adjustRecordMainDO.setPlanNumber(countJobMainDO.getNumber()); + adjustRecordMainMapper.insert(adjustRecordMainDO); + + //盘点记录子表 + QueryWrapper countRecordDetailDOQueryWrapper = new QueryWrapper<>(); + countRecordDetailDOQueryWrapper.eq("number", number); + List countRecordDetailDOList = countRecordDetailMapper.selectList(countRecordDetailDOQueryWrapper); + for (CountRecordDetailDO countRecordDetailDO : countRecordDetailDOList) { + List list = new ArrayList<>(); + //添加库存事务 + TransactionCreateReqVO transactionCreateReqVO = new TransactionCreateReqVO(); + if ((countRecordDetailDO.getCountQty().subtract(countRecordDetailDO.getQty())).compareTo(new BigDecimal(0)) == 1) { + //盘盈 盘点数量>库存数量 + transactionCreateReqVO.setTransactionType(TransactionTypeEnum.TransactionType_IN.getCode()); + transactionCreateReqVO.setQty(countRecordDetailDO.getCountQty().subtract(countRecordDetailDO.getQty())); + } else if ((countRecordDetailDO.getCountQty().subtract(countRecordDetailDO.getQty())).compareTo(new BigDecimal(0)) == -1) { + //盘盈 盘点数量<库存数量 + transactionCreateReqVO.setTransactionType(TransactionTypeEnum.TransactionType_OUT.getCode()); + transactionCreateReqVO.setQty(countRecordDetailDO.getQty().subtract(countRecordDetailDO.getCountQty())); + } + transactionCreateReqVO.setAssociatedNumber(countJobMainDO.getNumber()); + transactionCreateReqVO.setItemNumber(countRecordDetailDO.getItemNumber()); + transactionCreateReqVO.setLocationNumber(countRecordDetailDO.getLocationNumber()); + transactionCreateReqVO.setAreaNumber(countRecordDetailDO.getAreaNumber()); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", countRecordMainDO.getRequestNumber()); + CountadjustPlanDO countadjustPlanDO =countadjustPlanMapper.selectOne(queryWrapper); + transactionCreateReqVO.setIsInAccount(countadjustPlanDO.getIsInAccount()); + transactionCreateReqVO.setInventoryAction(TransactionEnum.ADJUST.getCode()); + list.add(transactionCreateReqVO); + try{ + reslt = transactionService.create(list); + } catch(ServiceException ex){ + throw ex; + } + //新增盘点调整记录子表 + AdjustRecordDetailDO adjustRecordDetailDO = new AdjustRecordDetailDO(); + BeanUtils.copyProperties(countRecordDetailDO, adjustRecordDetailDO); + adjustRecordDetailDO.setNumber(adjustRecordNumber); + adjustRecordDetailDO.setMasterId(adjustRecordMainDO.getId()); + reslt =adjustRecordDetailMapper.insert(adjustRecordDetailDO); + } + return reslt; + } + + private void validateExists(Long id) { + if (countRecordMainMapper.selectById(id) == null) { + throw exception(COUNTADRECORD_NOT_EXISTS); + } + } + + @Override + public CountRecordMainDO get(Long id) { + return countRecordMainMapper.selectById(id); + } + + @Override + public List getList(Collection ids) { + return countRecordMainMapper.selectBatchIds(ids); + } + + @Override + public PageResult getPage(CountRecordMainPageReqVO pageReqVO) { + return countRecordMainMapper.selectPage(pageReqVO); + } + + @Override + public List getList(CountRecordMainExportReqVO exportReqVO) { + return countRecordMainMapper.selectList(exportReqVO); + } + + @Override + public PageResult getCountRecordMainSenior(CustomConditions conditions) { + return countRecordMainMapper.selectSenior(conditions); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countJobDetail/CountJobDetailService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countJobDetail/CountJobDetailService.java new file mode 100644 index 0000000..d1091f9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countJobDetail/CountJobDetailService.java @@ -0,0 +1,81 @@ +package com.win.module.eam.service.countJobDetail; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.countJob.vo.*; +import com.win.module.eam.dal.dataobject.countJobDetail.CountJobDetailDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 备件盘点任务子 Service 接口 + * + * @author 超级管理员 + */ +public interface CountJobDetailService { + + /** + * 创建备件盘点任务子 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long create(@Valid CountJobDetailCreateReqVO createReqVO); + + /** + * 更新备件盘点任务子 + * + * @param updateReqVO 更新信息 + */ + Integer update(@Valid CountJobDetailUpdateReqVO updateReqVO); + + /** + * 删除备件盘点任务子 + * + * @param id 编号 + */ + Integer delete(Long id); + + /** + * 获得备件盘点任务子 + * + * @param id 编号 + * @return 备件盘点任务子 + */ + CountJobDetailDO get(Long id); + + /** + * 获得备件盘点任务子列表 + * + * @param ids 编号 + * @return 备件盘点任务子列表 + */ + List getList(Collection ids); + + /** + * 获得备件盘点任务子分页 + * + * @param pageReqVO 分页查询 + * @return 备件盘点任务子分页 + */ + PageResult getPage(CountJobDetailPageReqVO pageReqVO); + + /** + * 获得备件盘点任务子列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 备件盘点任务子列表 + */ + List getList(CountJobDetailExportReqVO exportReqVO); + + /** + * 导入备件盘点任务子主信息 + * + * @param datas 导入备件盘点任务子主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importCountJobDetailList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countJobDetail/CountJobDetailServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countJobDetail/CountJobDetailServiceImpl.java new file mode 100644 index 0000000..7ee6a61 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countJobDetail/CountJobDetailServiceImpl.java @@ -0,0 +1,186 @@ +package com.win.module.eam.service.countJobDetail; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.countJob.vo.*; +import com.win.module.eam.convert.countJobDetail.CountJobDetailConvert; +import com.win.module.eam.dal.dataobject.countJobDetail.CountJobDetailDO; +import com.win.module.eam.dal.dataobject.countJobMain.CountJobMainDO; +import com.win.module.eam.dal.dataobject.countRecord.CountRecordDetailDO; +import com.win.module.eam.dal.dataobject.countRecord.CountRecordMainDO; +import com.win.module.eam.dal.mysql.countJobMain.CountJobDetailMapper; +import com.win.module.eam.dal.mysql.countJobMain.CountJobMainMapper; +import com.win.module.eam.dal.mysql.countRecord.CountRecordDetailMapper; +import com.win.module.eam.dal.mysql.countRecord.CountRecordMainMapper; +import com.win.module.eam.dal.mysql.countadjustPlan.CountadjustPlanMapper; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +import com.win.module.system.enums.status.AdjustStatusEnum; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.eam.enums.ErrorCodeConstants.COUNTADJOBJUSTDETAIL_NOT_EXISTS; +import static com.win.module.system.enums.ErrorCodeConstants.CONFIG_IMPORT_LIST_IS_EMPTY; + +/** + * 备件盘点任务子 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class CountJobDetailServiceImpl implements CountJobDetailService { + + @Resource + private CountJobDetailMapper countJobDetailMapper; + @Resource + private CountJobMainMapper countJobMainMapper; + @Resource + private CountRecordMainMapper countRecordMainMapper; + @Resource + private CountRecordDetailMapper countRecordDetailMapper; + @Resource + private CountadjustPlanMapper countadjustPlanMapper; + + @Resource + private SerialNumberApi serialNumberApi; + + + @Override + public Long create(CountJobDetailCreateReqVO createReqVO) { + // 插入 + CountJobDetailDO countJobDetailDO = CountJobDetailConvert.INSTANCE.convert(createReqVO); + countJobDetailMapper.insert(countJobDetailDO); + // 返回 + return countJobDetailDO.getId(); + } + + @Override + public Integer update(CountJobDetailUpdateReqVO updateReqVO) { + // 校验存在 + validateExists(updateReqVO.getId()); + // 更新 + CountJobDetailDO updateObj = CountJobDetailConvert.INSTANCE.convert(updateReqVO); + return countJobDetailMapper.updateById(updateObj); + } + + @Override + public Integer delete(Long id) { + // 校验存在 + validateExists(id); + // 删除 + return countJobDetailMapper.deleteById(id); + } + + private void validateExists(Long id) { + if (countJobDetailMapper.selectById(id) == null) { + throw exception(COUNTADJOBJUSTDETAIL_NOT_EXISTS); + } + } + + @Override + public CountJobDetailDO get(Long id) { + return countJobDetailMapper.selectById(id); + } + + @Override + public List getList(Collection ids) { + return countJobDetailMapper.selectBatchIds(ids); + } + + @Override + public PageResult getPage(CountJobDetailPageReqVO pageReqVO) { + return countJobDetailMapper.selectPage(pageReqVO); + } + + @Override + public List getList(CountJobDetailExportReqVO exportReqVO) { + + + + return countJobDetailMapper.selectList(exportReqVO); + } + + @Override + @Transactional + public List importCountJobDetailList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + throw exception(CONFIG_IMPORT_LIST_IS_EMPTY); + } + List errorList = new ArrayList<>(); + boolean flag = true; + for (CountJobDetailExcelVO createReqVO : datas) { + CountJobDetailDO mainDo = CountJobDetailConvert.INSTANCE.convert(createReqVO); + //盘点数量正常输入 + if (mainDo.getCountQty() == null && mainDo.getCountQty().compareTo(new BigDecimal(0)) != 0) { + CountJobDetailImportErrorVO importErrorVO = new CountJobDetailImportErrorVO(); + importErrorVO.setImportStatus("失败"); + importErrorVO.setImportRemark("盘点工单编号为" + createReqVO.getNumber() + " 数据项中的盘点数量不正确!"); + errorList.add(importErrorVO); + flag = false; + } + } + //写入数据 + if (flag) { + //该EXCEL所有工单编号都是一样的 + CountJobMainDO countJobMainDO = countJobMainMapper.selectByCode(datas.get(0).getNumber()); + //如果该工单号已经存在可生成的盘点记录,覆盖该盘点记录,改为作废状态 + QueryWrapper countRecordMainDOQueryWrapper = new QueryWrapper<>(); + countRecordMainDOQueryWrapper.eq("job_number", countJobMainDO.getJobNumber()); + countRecordMainDOQueryWrapper.eq("status", AdjustStatusEnum.CANGENERATE.getCode()); + CountRecordMainDO countRecordMainDO = countRecordMainMapper.selectOne(countRecordMainDOQueryWrapper); + if (countRecordMainDO != null) { + //如果该工单号已经存在可生成的盘点记录,覆盖该盘点记录,改为作废状态 + countRecordMainDO.setStatus(AdjustStatusEnum.CANCEL.getCode()); + countRecordMainDO.setUpdateTime(LocalDateTime.now()); + countRecordMainMapper.updateById(countRecordMainDO); + } + + //生成盘点记录 + CountRecordMainDO counRecordMainDO = new CountRecordMainDO(); + counRecordMainDO.setJobNumber(countJobMainDO.getJobNumber()); + counRecordMainDO.setRequestNumber(datas.get(0).getPlanNumber()); + counRecordMainDO.setName(countJobMainDO.getName()); + String number = serialNumberApi.generateCode(RuleCodeEnum.COUNT_RECORD.getCode()); + counRecordMainDO.setNumber(number); + Boolean res = false; + List countJobDetailExcelVOList = new ArrayList<>(); + //比较库存数量和盘点数量 + for (CountJobDetailExcelVO data : datas) { + if (data.getCountQty().compareTo(data.getQty()) != 0) { + res = true; + countJobDetailExcelVOList.add(data); + } + } + if (res) { + //如果子表中的库存数量和盘点数量都不同时,盘点调整才能生成 + counRecordMainDO.setStatus(AdjustStatusEnum.CANGENERATE.getCode()); + countRecordMainMapper.insert(counRecordMainDO); + for (CountJobDetailExcelVO data : countJobDetailExcelVOList) { + CountRecordDetailDO countRecordDetailDO = new CountRecordDetailDO(); + BeanUtils.copyProperties(data, countRecordDetailDO); + countRecordDetailDO.setNumber(number); + countRecordDetailDO.setMasterId(counRecordMainDO.getId()); + countRecordDetailDO.setDifferenceQty(data.getCountQty().subtract(data.getQty())); + countRecordDetailMapper.insert(countRecordDetailDO); + } + } else { + //如果子表中的库存数量和盘点数量相同时,盘点调整不需要生成 + counRecordMainDO.setStatus(AdjustStatusEnum.NOGENERATE.getCode()); + countRecordMainMapper.insert(counRecordMainDO); + } + } + return errorList; + } +} \ No newline at end of file diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countJobMain/CountJobMainService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countJobMain/CountJobMainService.java new file mode 100644 index 0000000..872bbea --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countJobMain/CountJobMainService.java @@ -0,0 +1,83 @@ +package com.win.module.eam.service.countJobMain; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.countJob.vo.CountJobMainCreateReqVO; +import com.win.module.eam.controller.countJob.vo.CountJobMainExportReqVO; +import com.win.module.eam.controller.countJob.vo.CountJobMainPageReqVO; +import com.win.module.eam.controller.countJob.vo.CountJobMainUpdateReqVO; +import com.win.module.eam.dal.dataobject.countJobMain.CountJobMainDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 备件盘点任务主 Service 接口 + * + * @author 超级管理员 + */ +public interface CountJobMainService { + + /** + * 创建备件盘点任务主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long create(@Valid CountJobMainCreateReqVO createReqVO); + + /** + * 更新备件盘点任务主 + * + * @param updateReqVO 更新信息 + */ + Integer update(@Valid CountJobMainUpdateReqVO updateReqVO); + + /** + * 删除备件盘点任务主 + * + * @param id 编号 + */ + Integer delete(Long id); + + /** + * 获得备件盘点任务主 + * + * @param id 编号 + * @return 备件盘点任务主 + */ + CountJobMainDO get(Long id); + + /** + * 获得备件盘点任务主列表 + * + * @param ids 编号 + * @return 备件盘点任务主列表 + */ + List getList(Collection ids); + + /** + * 获得备件盘点任务主分页 + * + * @param pageReqVO 分页查询 + * @return 备件盘点任务主分页 + */ + PageResult getPage(CountJobMainPageReqVO pageReqVO); + + /** + * 获得备件盘点任务主列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 备件盘点任务主列表 + */ + List getList(CountJobMainExportReqVO exportReqVO); + + /** + * 获得用高级搜索库位分页列表 + * + * @param conditions 分页、排序和自定义条件 + * @return 分页列表 + */ + PageResult getCountJobMainSenior(CustomConditions conditions); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countJobMain/CountJobMainServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countJobMain/CountJobMainServiceImpl.java new file mode 100644 index 0000000..5e44dec --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countJobMain/CountJobMainServiceImpl.java @@ -0,0 +1,90 @@ +package com.win.module.eam.service.countJobMain; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.countJob.vo.CountJobMainCreateReqVO; +import com.win.module.eam.controller.countJob.vo.CountJobMainExportReqVO; +import com.win.module.eam.controller.countJob.vo.CountJobMainPageReqVO; +import com.win.module.eam.controller.countJob.vo.CountJobMainUpdateReqVO; +import com.win.module.eam.convert.countJobMain.CountJobMainConvert; +import com.win.module.eam.dal.dataobject.countJobMain.CountJobMainDO; +import com.win.module.eam.dal.mysql.countJobMain.CountJobMainMapper; +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.eam.enums.ErrorCodeConstants.COUNTADJOBJUSTDETAIL_NOT_EXISTS; + +/** + * 备件盘点任务主 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class CountJobMainServiceImpl implements CountJobMainService { + + @Resource + private CountJobMainMapper Mapper; + + @Override + public Long create(CountJobMainCreateReqVO createReqVO) { + // 插入 + CountJobMainDO countJobMainDO = CountJobMainConvert.INSTANCE.convert(createReqVO); + Mapper.insert(countJobMainDO); + // 返回 + return countJobMainDO.getId(); + } + + @Override + public Integer update(CountJobMainUpdateReqVO updateReqVO) { + // 校验存在 + validateExists(updateReqVO.getId()); + // 更新 + CountJobMainDO updateObj = CountJobMainConvert.INSTANCE.convert(updateReqVO); + return Mapper.updateById(updateObj); + } + + @Override + public Integer delete(Long id) { + // 校验存在 + validateExists(id); + // 删除 + return Mapper.deleteById(id); + } + + private void validateExists(Long id) { + if (Mapper.selectById(id) == null) { + throw exception(COUNTADJOBJUSTDETAIL_NOT_EXISTS); + } + } + + @Override + public CountJobMainDO get(Long id) { + return Mapper.selectById(id); + } + + @Override + public List getList(Collection ids) { + return Mapper.selectBatchIds(ids); + } + + @Override + public PageResult getPage(CountJobMainPageReqVO pageReqVO) { + return Mapper.selectPage(pageReqVO); + } + + @Override + public List getList(CountJobMainExportReqVO exportReqVO) { + return Mapper.selectList(exportReqVO); + } + + @Override + public PageResult getCountJobMainSenior(CustomConditions conditions) { + return Mapper.selectSenior(conditions); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countadjustPlan/CountadjustPlanService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countadjustPlan/CountadjustPlanService.java new file mode 100644 index 0000000..96603ff --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countadjustPlan/CountadjustPlanService.java @@ -0,0 +1,91 @@ +package com.win.module.eam.service.countadjustPlan; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.countadjustPlan.vo.CountadjustPlanCreateReqVO; +import com.win.module.eam.controller.countadjustPlan.vo.CountadjustPlanExportReqVO; +import com.win.module.eam.controller.countadjustPlan.vo.CountadjustPlanPageReqVO; +import com.win.module.eam.controller.countadjustPlan.vo.CountadjustPlanUpdateReqVO; +import com.win.module.eam.dal.dataobject.countadjustPlan.CountadjustPlanDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 备件盘点计划 Service 接口 + * + * @author 超级管理员 + */ +public interface CountadjustPlanService { + + /** + * 创建备件盘点计划 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createCountadjustPlan(@Valid CountadjustPlanCreateReqVO createReqVO); + + /** + * 更新备件盘点计划 + * + * @param updateReqVO 更新信息 + */ + Integer updateCountadjustPlan(@Valid CountadjustPlanUpdateReqVO updateReqVO); + + /** + * 删除备件盘点计划 + * + * @param id 编号 + */ + Integer deleteCountadjustPlan(Long id); + + /** + * 获得备件盘点计划 + * + * @param id 编号 + * @return 备件盘点计划 + */ + CountadjustPlanDO getCountadjustPlan(Long id); + + /** + * 获得备件盘点计划 + * + * @param number + * @return 备件盘点计划 + */ + CountadjustPlanDO getCountadjustPlanByNumber(String number); + + /** + * 获得备件盘点计划列表 + * + * @param ids 编号 + * @return 备件盘点计划列表 + */ + List getCountadjustPlanList(Collection ids); + + /** + * 获得备件盘点计划分页 + * + * @param pageReqVO 分页查询 + * @return 备件盘点计划分页 + */ + PageResult getCountadjustPlanPage(CountadjustPlanPageReqVO pageReqVO); + + /** + * 获得备件盘点计划列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 备件盘点计划列表 + */ + List getCountadjustPlanList(CountadjustPlanExportReqVO exportReqVO); + + /** + * 获得用高级搜索库位分页列表 + * + * @param conditions 分页、排序和自定义条件 + * @return 分页列表 + */ + PageResult getCountadjustPlanSenior(CustomConditions conditions); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countadjustPlan/CountadjustPlanServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countadjustPlan/CountadjustPlanServiceImpl.java new file mode 100644 index 0000000..a296ae5 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/countadjustPlan/CountadjustPlanServiceImpl.java @@ -0,0 +1,139 @@ +package com.win.module.eam.service.countadjustPlan; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.countadjustPlan.vo.CountadjustPlanCreateReqVO; +import com.win.module.eam.controller.countadjustPlan.vo.CountadjustPlanExportReqVO; +import com.win.module.eam.controller.countadjustPlan.vo.CountadjustPlanPageReqVO; +import com.win.module.eam.controller.countadjustPlan.vo.CountadjustPlanUpdateReqVO; +import com.win.module.eam.convert.countadjustPlan.CountadjustPlanConvert; +import com.win.module.eam.dal.dataobject.countJobDetail.CountJobDetailDO; +import com.win.module.eam.dal.dataobject.countJobMain.CountJobMainDO; +import com.win.module.eam.dal.dataobject.countadjustPlan.CountadjustPlanDO; +import com.win.module.eam.dal.dataobject.itemaccounts.ItemAccountsDO; +import com.win.module.eam.dal.mysql.countJobMain.CountJobDetailMapper; +import com.win.module.eam.dal.mysql.countJobMain.CountJobMainMapper; +import com.win.module.eam.dal.mysql.countadjustPlan.CountadjustPlanMapper; +import com.win.module.eam.dal.mysql.itemaccounts.ItemAccountsMapper; +import com.win.module.eam.enums.basic.BooleanTypeEnum; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +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.eam.enums.ErrorCodeConstants.COUNTADJUST_PLAN_NOT_EXISTS; + +/** + * 备件盘点计划 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class CountadjustPlanServiceImpl implements CountadjustPlanService { + @Resource + private CountadjustPlanMapper countadjustPlanMapper; + @Resource + private CountJobMainMapper countJobMainMapper; + @Resource + private CountJobDetailMapper countJobDetailMapper; + @Resource + private ItemAccountsMapper itemAccountsMapper; + @Resource + private SerialNumberApi serialNumberApi; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createCountadjustPlan(CountadjustPlanCreateReqVO createReqVO) { + // 插入 + CountadjustPlanDO countadjustPlan = CountadjustPlanConvert.INSTANCE.convert(createReqVO); + String planNumber = serialNumberApi.generateCode(RuleCodeEnum.PLAN_COUNT.getCode()); + countadjustPlan.setNumber(planNumber); + countadjustPlanMapper.insert(countadjustPlan); + //根据盘点计划生成盘点工单主表 + CountJobMainDO countJobMainDO = new CountJobMainDO(); + String jobNumber = serialNumberApi.generateCode(RuleCodeEnum.COUNT_JOB.getCode()); + countJobMainDO.setJobNumber(jobNumber); + countJobMainDO.setNumber(planNumber); + countJobMainDO.setName(countadjustPlan.getName()); + countJobMainMapper.insert(countJobMainDO); + //根据盘点计划查询盘点工单的子表中的备件数据 + QueryWrapper itemAccountsDOQueryWrapper = new QueryWrapper<>(); + itemAccountsDOQueryWrapper.eq("is_in_account", countadjustPlan.getIsInAccount()); + itemAccountsDOQueryWrapper.inSql("item_number", "SELECT number FROM `basic_item` WHERE number=basic_item_accounts.item_number AND classification='"+ countadjustPlan.getClassification() + "'"); + itemAccountsDOQueryWrapper.eq("available", BooleanTypeEnum.Y.getCode()); + List itemAccountsDOList = itemAccountsMapper.selectList(itemAccountsDOQueryWrapper); + for (ItemAccountsDO itemAccountsDO : itemAccountsDOList) { + CountJobDetailDO countJobDetailDO = new CountJobDetailDO(); + countJobDetailDO.setNumber(countJobMainDO.getJobNumber()); + countJobDetailDO.setMasterId(countJobMainDO.getId()); + countJobDetailDO.setItemNumber(itemAccountsDO.getItemNumber()); + countJobDetailDO.setAreaNumber(itemAccountsDO.getAreaNumber()); + countJobDetailDO.setLocationNumber(itemAccountsDO.getLocationNumber()); + countJobDetailDO.setQty(itemAccountsDO.getQty()); + countJobDetailMapper.insert(countJobDetailDO); + } + // 返回 + return countadjustPlan.getId(); + } + + @Override + public Integer updateCountadjustPlan(CountadjustPlanUpdateReqVO updateReqVO) { + // 校验存在 + validateCountadjustPlanExists(updateReqVO.getId()); + // 更新 + CountadjustPlanDO updateObj = CountadjustPlanConvert.INSTANCE.convert(updateReqVO); + return countadjustPlanMapper.updateById(updateObj); + } + + @Override + public Integer deleteCountadjustPlan(Long id) { + // 校验存在 + validateCountadjustPlanExists(id); + // 删除 + return countadjustPlanMapper.deleteById(id); + } + + private void validateCountadjustPlanExists(Long id) { + if (countadjustPlanMapper.selectById(id) == null) { + throw exception(COUNTADJUST_PLAN_NOT_EXISTS); + } + } + + @Override + public CountadjustPlanDO getCountadjustPlan(Long id) { + return countadjustPlanMapper.selectById(id); + } + + @Override + public CountadjustPlanDO getCountadjustPlanByNumber(String number) { + return countadjustPlanMapper.selectByNumber(number); + } + + @Override + public List getCountadjustPlanList(Collection ids) { + return countadjustPlanMapper.selectBatchIds(ids); + } + + @Override + public PageResult getCountadjustPlanPage(CountadjustPlanPageReqVO pageReqVO) { + return countadjustPlanMapper.selectPage(pageReqVO); + } + + @Override + public List getCountadjustPlanList(CountadjustPlanExportReqVO exportReqVO) { + return countadjustPlanMapper.selectList(exportReqVO); + } + + @Override + public PageResult getCountadjustPlanSenior(CustomConditions conditions) { + return countadjustPlanMapper.selectSenior(conditions); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceaccounts/DeviceAccountsService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceaccounts/DeviceAccountsService.java new file mode 100644 index 0000000..157dd17 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceaccounts/DeviceAccountsService.java @@ -0,0 +1,144 @@ +package com.win.module.eam.service.deviceaccounts; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceaccounts.vo.*; +import com.win.module.eam.dal.dataobject.deviceaccounts.DeviceAccountsDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 备件台账 Service 接口 + * + * @author 超级管理员 + */ +public interface DeviceAccountsService { + + /** + * 创建备件台账 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceAccounts(@Valid DeviceAccountsCreateReqVO createReqVO); + + /** + * 更新备件台账 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceAccounts(@Valid DeviceAccountsUpdateReqVO updateReqVO); + + /** + * 删除备件台账 + * + * @param id 编号 + */ + Integer deleteDeviceAccounts(Long id); + + /** + * 获得备件台账 + * + * @param id 编号 + * @return 备件台账 + */ + DeviceAccountsDO getDeviceAccounts(Long id); + + /** + * 获得备件台账列表 + * + * @param ids 编号 + * @return 备件台账列表 + */ + List getDeviceAccountsList(Collection ids); + + /** + * 获得备件台账分页 + * + * @param pageReqVO 分页查询 + * @return 备件台账分页 + */ + PageResult getDeviceAccountsPage(DeviceAccountsPageReqVO pageReqVO); + + /** + * 获得备件台账分页 + * + * @param conditions 分页查询 + * @return 备件台账分页 + */ + PageResult getDeviceAccountsSenior(CustomConditions conditions); + + /** + * 获得备件台账列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 备件台账列表 + */ + List getDeviceAccountsList(DeviceAccountsExportReqVO exportReqVO); + + /** + * 导入备件台账主信息 + * + * @param datas 导入备件台账主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceAccountsList(List datas, Integer mode, boolean updatePart); + + /** + * 获取当前维修人员所属厂区下的各种设备数据 + * @param + * @return + */ + public Map getCounts(); + + /** + * 获取当前维修工程师所属厂区下的各种待办数据 + * @return + */ + public Map getToDoCountsByUser(); + + /** + * APP根据设备号查询信息 + * @param number + * @return + */ + public Map getDetailsByNumber(String number,String type,String flag); + + /** + * APP查询当前人所属厂区下的设备列表或者工艺列表 + * @return + */ + public List> selectData(String factoryAreaNumber); + + /** + * 获取所有设备列表 + * @return + */ + public List> selectAll(); + + /** + * APP获得备件台账分页 + * + * @param pageReqVO 分页查询 + * @return 备件台账分页 + */ + PageResult getAppPage(DeviceAccountsPageReqVO pageReqVO); + + DeviceAccountsDO getDetailsEntryByNumber(String number); + + List selectListNoPage(DeviceAccountsPageReqVO pageReqVO); + + + /** + * 更新设备台账状态 + * + * @param number,status 更新信息 + */ + Integer updateDeviceAccountsStatus(String number, String status); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceaccounts/DeviceAccountsServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceaccounts/DeviceAccountsServiceImpl.java new file mode 100644 index 0000000..0878f29 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceaccounts/DeviceAccountsServiceImpl.java @@ -0,0 +1,459 @@ +package com.win.module.eam.service.deviceaccounts; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceaccounts.vo.*; +import com.win.module.eam.convert.deviceaccounts.DeviceAccountsConvert; +import com.win.module.eam.dal.dataobject.attachmentfile.AttachmentFileDO; +import com.win.module.eam.dal.dataobject.classtype.ClassTypeDO; +import com.win.module.eam.dal.dataobject.deviceaccounts.DeviceAccountsDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordMainDO; +import com.win.module.eam.dal.dataobject.itemapplyrequest.ItemApplyRequestMainDO; +import com.win.module.eam.dal.mysql.attachmentfile.AttachmentFileMapper; +import com.win.module.eam.dal.mysql.classtype.ClassTypeMapper; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobMainMapper; +import com.win.module.eam.dal.mysql.devicemaintainjob.DeviceMaintainJobMainMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobMainMapper; +import com.win.module.eam.dal.mysql.devicerepairrequest.DeviceRepairRequestMapper; +import com.win.module.eam.dal.mysql.devicespotinspectionrecord.DeviceSpotInspectionRecordMainMapper; +import com.win.module.eam.dal.mysql.itemapplyrequest.ItemApplyRequestMainMapper; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.eam.enums.request.RequestStatusEnum; +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.permission.PermissionApi; +import com.win.module.system.api.permission.RoleApi; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.enums.ErrorCodeConstants; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.*; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + + +/** + * 备件台账 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class DeviceAccountsServiceImpl implements DeviceAccountsService { + + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + + @Resource + private DeviceRepairRequestMapper deviceRepairRequestMapper; + + @Resource + private SerialNumberApi serialNumberApi; + + @Resource + private AdminUserApi adminUserApi; + + @Resource + DeptApi deptApi; + + @Resource + PostApi postApi; + + @Resource + private DeviceMaintenanceJobMainMapper deviceMaintenanceJobMainMapper; + + @Resource + private DeviceMaintainJobMainMapper deviceMaintainJobMainMapper; + + @Resource + private DeviceInspectionJobMainMapper deviceInspectionJobMainMapper; + + @Resource + private DeviceSpotInspectionRecordMainMapper deviceSpotInspectionRecordMainMapper; + + @Resource + private PermissionApi permissionApi; + + @Resource + private RoleApi roleApi; + @Resource + private ItemApplyRequestMainMapper itemApplyRequestMainMapper; + + @Resource + private AttachmentFileMapper attachmentFileMapper; + + @Resource + private ClassTypeMapper classTypeMapper; + + + @Override + public Long createDeviceAccounts(DeviceAccountsCreateReqVO createReqVO) { + + // 插入 + DeviceAccountsDO deviceAccounts = DeviceAccountsConvert.INSTANCE.convert(createReqVO); + +// String number = serialNumberApi.generateCode(RuleCodeEnum.DEVICE_ACCOUNT_ORDER.getCode()); + DeptRespDTO deptRespDTO = deptApi.getDept(Long.valueOf(deviceAccounts.getFactoryAreaNumber())); + if (deptRespDTO == null) { + throw new RuntimeException(ErrorCodeConstants.DEPT_NOT_FOUND.getMsg()); + } + if (deptRespDTO.getBusiType() == null || deptRespDTO.getBusiType().isEmpty()) { + throw new RuntimeException(ErrorCodeConstants.DEPT_BUSI_TYPE_NOT_FOUND.getMsg()); + } + String number = serialNumberApi.generateCodeByLeftCodeAndPrefix(RuleCodeEnum.DEVICE_ACCOUNT_ORDER.getCode(), deptRespDTO.getBusiType()); + // 获得用户基本信息 + deviceAccounts.setNumber(number); +// deviceAccounts.setType(BasicStatusEnum.BASIC_DEVICE.getCode()); + deviceAccounts.setCreateTime(LocalDateTime.now()); + deviceAccounts.setCreator(getLoginUserId().toString()); + deviceAccounts.setDeptId(Long.valueOf(deviceAccounts.getFactoryAreaNumber())); + deviceAccountsMapper.insert(deviceAccounts); + // 返回 + return deviceAccounts.getId(); + } + + @Override + public Integer updateDeviceAccounts(DeviceAccountsUpdateReqVO updateReqVO) { + // 校验存在 + //validateDeviceAccountsExists(updateReqVO.getId()); + // 更新 + DeviceAccountsDO updateObj = DeviceAccountsConvert.INSTANCE.convert(updateReqVO); + return deviceAccountsMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceAccounts(Long id) { + // 校验存在 + validateDeviceAccountsExists(id); + // 删除 + return deviceAccountsMapper.deleteById(id); + } + + private void validateDeviceAccountsExists(Long id) { + if (deviceAccountsMapper.selectById(id) == null) { + //throw exception(DEVICE_ACCOUNTS_NOT_EXISTS); + } + } + + @Override + public DeviceAccountsDO getDeviceAccounts(Long id) { + return deviceAccountsMapper.selectById(id); + } + + @Override + public List getDeviceAccountsList(Collection ids) { + return deviceAccountsMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceAccountsPage(DeviceAccountsPageReqVO pageReqVO) { + return deviceAccountsMapper.selectPage(pageReqVO); + } + + @Override + public PageResult getDeviceAccountsSenior(CustomConditions conditions) { + return deviceAccountsMapper.selectSenior(conditions); + } + + @Override + public List getDeviceAccountsList(DeviceAccountsExportReqVO exportReqVO) { + return deviceAccountsMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceAccountsList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_ACCOUNTS_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceAccountsDO obj = deviceAccountsMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceAccountsMapper.insert(DeviceAccountsConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceAccountsDO deviceAccountsDO = DeviceAccountsConvert.INSTANCE.convert(item); +// deviceAccountsDO.setId(obj.getId()); +// deviceAccountsMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public Map getCounts() { + AdminUserRespDTO user = adminUserApi.getUser(getLoginUserId()); + String factoryAreaNumber = user.getDeptId().toString(); + //String factoryAreaNumber = deptApi.getDept(adminUserApi.getUser(getLoginUserId()).getDeptId()).getParentId()==null?"":deptApi.getDept(adminUserApi.getUser(getLoginUserId()).getDeptId()).getParentId().toString(); + Map map = new HashMap<>(); + //获取该厂区下所有的设备数量 + Long l = deviceAccountsMapper.selectCountByFactoryAreaNumber(factoryAreaNumber, ""); + map.put("allCount", l); + //获取该维修人员所属厂区下的故障设备总数(所有报修工单未点击完成的设备 去重) + Long ll = deviceAccountsMapper.selectCountByFactoryAreaNumber(factoryAreaNumber, "1"); + map.put("breakDownCount", ll); + //获取该维修人员所属厂区下的申请设备 + int j = deviceAccountsMapper.selectRequestCountByAreaNumber(BasicStatusEnum.BASIC_DEVICE.getCode(), factoryAreaNumber); + //获取该厂区下所有故障设备(所有的报修申请) + map.put("repairCount", j); + return map; + } + + @Override + public Map getToDoCountsByUser() { + //判断当前人所属部门 + AdminUserRespDTO user = adminUserApi.getUser(getLoginUserId()); + + Map map = new HashMap<>(); + int EweixiuD = 0;//维修工单工程师待接单 + int WweixiuD = 0;//维修工单维修工待接单 + int EbaoyangD = 0;//保养工单工程师待接单 + int WbaoyangD = 0;//保养工单维修工待接单 + int weixiuY = 0;//维修验证工单 + int baoyangY = 0;//保养验证工单 + int jianxiuY = 0;//检修验证工单 + int xunjianY = 0;//巡检点检验证工单 + int weixiuhuifuY = 0;//报修人确认 + int shenpi = 0;//备件审批 + List engineerList = classTypeMapper.JudgeIdentity(getLoginUserId(), null, "1","");//厂区班组工程师 + for (ClassTypeDO en : engineerList) {//维修工单工程师数据 + //维修工单工程师待接单 + String factoryAreaNumber = en.getFactoryAreaNumber(); + String type = en.getType(); + QueryWrapper deviceMaintenanceQueryEngineer = new QueryWrapper<>(); + deviceMaintenanceQueryEngineer.eq("available", "TRUE"); + deviceMaintenanceQueryEngineer.eq("deleted", 0); + deviceMaintenanceQueryEngineer.eq("factory_area_number", factoryAreaNumber); + deviceMaintenanceQueryEngineer.eq("type", type); + deviceMaintenanceQueryEngineer.eq("status", OrderStatusEnum.PEND_ORDER_STATUS.getCode()); + List jobMainDOS = deviceMaintenanceJobMainMapper.selectList(deviceMaintenanceQueryEngineer); + EweixiuD += jobMainDOS.size(); + + //维修工单工程师待验证报修人通过 + QueryWrapper deviceMaintenanceQueryEngineer1 = new QueryWrapper<>(); + deviceMaintenanceQueryEngineer1.eq("available", "TRUE"); + deviceMaintenanceQueryEngineer1.eq("deleted", 0); + deviceMaintenanceQueryEngineer1.eq("factory_area_number", factoryAreaNumber); + deviceMaintenanceQueryEngineer1.eq("type", type); + deviceMaintenanceQueryEngineer1.eq("status", OrderStatusEnum.APPROVE_PASS_STATUS.getCode()); + List jobMainDOS1 = deviceMaintenanceJobMainMapper.selectList(deviceMaintenanceQueryEngineer1); + weixiuY += jobMainDOS1.size(); + + //维修工单工程师待验证不通过报修的维修工单 + QueryWrapper deviceMaintenanceQueryEngineer2 = new QueryWrapper<>(); + deviceMaintenanceQueryEngineer2.eq("available", "TRUE"); + deviceMaintenanceQueryEngineer2.eq("deleted", 0); + deviceMaintenanceQueryEngineer2.eq("factory_area_number", factoryAreaNumber); + deviceMaintenanceQueryEngineer2.eq("type", type); + deviceMaintenanceQueryEngineer2.eq("status", OrderStatusEnum.COMPLETED_STATUS.getCode()); + deviceMaintenanceQueryEngineer2.isNull("request_number"); + deviceMaintenanceQueryEngineer2.isNull("applyer"); + List jobMainDOS2 = deviceMaintenanceJobMainMapper.selectList(deviceMaintenanceQueryEngineer2); + weixiuY += jobMainDOS2.size(); + + //保养 + QueryWrapper baoyangQueryWrapper = new QueryWrapper<>(); + baoyangQueryWrapper.eq("available", "TRUE"); + baoyangQueryWrapper.eq("deleted", 0); + baoyangQueryWrapper.eq("factory_area_number", factoryAreaNumber); + baoyangQueryWrapper.eq("status", OrderStatusEnum.PEND_ORDER_STATUS.getCode()); + baoyangQueryWrapper.eq("type", type); + List deviceMaintainJobMainDOS = deviceMaintainJobMainMapper.selectList(baoyangQueryWrapper); + EbaoyangD += deviceMaintainJobMainDOS.size(); + //保养验证 + QueryWrapper baoyangQueryWrapper1 = new QueryWrapper<>(); + baoyangQueryWrapper1.eq("available", "TRUE"); + baoyangQueryWrapper1.eq("deleted", 0); + baoyangQueryWrapper1.eq("factory_area_number", factoryAreaNumber); + baoyangQueryWrapper1.eq("status", OrderStatusEnum.COMPLETED_STATUS.getCode()); + baoyangQueryWrapper1.eq("type", type); + List deviceMaintainJobMainDOS1 = deviceMaintainJobMainMapper.selectList(baoyangQueryWrapper1); + baoyangY = deviceMaintainJobMainDOS1.size(); + //检修验证 + QueryWrapper jianxiuQueryWrapper = new QueryWrapper<>(); + baoyangQueryWrapper.eq("available", "TRUE"); + baoyangQueryWrapper.eq("deleted", 0); + baoyangQueryWrapper.eq("factory_area_number", factoryAreaNumber); + baoyangQueryWrapper.eq("status", OrderStatusEnum.COMPLETED_STATUS.getCode()); + baoyangQueryWrapper.eq("type", type); + List deviceInspectionJobMainDOS = deviceInspectionJobMainMapper.selectList(jianxiuQueryWrapper); + jianxiuY += deviceInspectionJobMainDOS.size(); + //巡检点检验证 + QueryWrapper xunjianQueryWrapper = new QueryWrapper<>(); + xunjianQueryWrapper.eq("available", "TRUE"); + xunjianQueryWrapper.eq("deleted", 0); + xunjianQueryWrapper.eq("dept_id", factoryAreaNumber); + xunjianQueryWrapper.eq("status", OrderStatusEnum.COMPLETED_STATUS.getCode()); + xunjianQueryWrapper.eq("type", type); + List deviceSpotInspectionRecordMainDOS = deviceSpotInspectionRecordMainMapper.selectList(xunjianQueryWrapper); + xunjianY += deviceSpotInspectionRecordMainDOS.size(); + + } + List workerList = classTypeMapper.JudgeIdentity(getLoginUserId(), null, "0","");//厂区班组维修工 + for (ClassTypeDO en : workerList) {//维修工单工程师数据 + //维修工单维修工待接单 + String factoryAreaNumber = en.getFactoryAreaNumber(); + String type = en.getType(); + QueryWrapper deviceMaintenanceQueryEngineer = new QueryWrapper<>(); + deviceMaintenanceQueryEngineer.eq("available", "TRUE"); + deviceMaintenanceQueryEngineer.eq("deleted", 0); + deviceMaintenanceQueryEngineer.eq("factory_area_number", factoryAreaNumber); + deviceMaintenanceQueryEngineer.eq("type", type); + deviceMaintenanceQueryEngineer.eq("status", OrderStatusEnum.PEND_ORDER_STATUS.getCode()); + List jobMainDOS = deviceMaintenanceJobMainMapper.selectList(deviceMaintenanceQueryEngineer); + WweixiuD += jobMainDOS.size(); + + //保养 + QueryWrapper baoyangQueryWrapper = new QueryWrapper<>(); + baoyangQueryWrapper.eq("available", "TRUE"); + baoyangQueryWrapper.eq("deleted", 0); + baoyangQueryWrapper.eq("factory_area_number", factoryAreaNumber); + baoyangQueryWrapper.eq("status", OrderStatusEnum.PEND_ORDER_STATUS.getCode()); + baoyangQueryWrapper.eq("type", type); + List deviceMaintainJobMainDOS = deviceMaintainJobMainMapper.selectList(baoyangQueryWrapper); + WbaoyangD += deviceMaintainJobMainDOS.size(); + + } + //报修人确认验证 + QueryWrapper deviceMaintenanceQueryWrapper1 = new QueryWrapper<>(); + deviceMaintenanceQueryWrapper1.eq("available", "TRUE"); + deviceMaintenanceQueryWrapper1.eq("deleted", 0); + deviceMaintenanceQueryWrapper1.eq("factory_area_number", user.getDeptId()); + deviceMaintenanceQueryWrapper1.isNotNull("request_number"); + deviceMaintenanceQueryWrapper1.eq("applyer", getLoginUserId()); + deviceMaintenanceQueryWrapper1.eq("status", OrderStatusEnum.COMPLETED_STATUS.getCode()); + List deviceMaintenanceJobMainDOS1 = deviceMaintenanceJobMainMapper.selectList(deviceMaintenanceQueryWrapper1); + weixiuhuifuY = deviceMaintenanceJobMainDOS1.size(); + //判断是否有审批权限且是车间主任 +// if (permissionApi.getHighEngineerRole()) { +// QueryWrapper itemApplyQueryWrapper = new QueryWrapper<>(); +// itemApplyQueryWrapper.eq("available", "TRUE"); +// itemApplyQueryWrapper.eq("deleted", 0); +// itemApplyQueryWrapper.eq("status", RequestStatusEnum.ITEM_APPLY_0.getCode()); +// List itemApplyRequestMainDOS = itemApplyRequestMainMapper.selectList(itemApplyQueryWrapper); +// shenpi = itemApplyRequestMainDOS.size(); +// } +// if (permissionApi.getNomalWorkerRole()) { +// QueryWrapper itemApplyQueryWrapper = new QueryWrapper<>(); +// itemApplyQueryWrapper.eq("available", "TRUE"); +// itemApplyQueryWrapper.eq("deleted", 0); +// itemApplyQueryWrapper.eq("status", RequestStatusEnum.ITEM_APPLY_0.getCode()); +// itemApplyQueryWrapper.lt("sum_val", 5000); +// List itemApplyRequestMainDOS = itemApplyRequestMainMapper.selectList(itemApplyQueryWrapper); +// shenpi = itemApplyRequestMainDOS.size(); +// } + map.put("gongdan", EweixiuD + WweixiuD + WbaoyangD + EbaoyangD); + map.put("yanzheng", weixiuY + baoyangY + jianxiuY + xunjianY + weixiuhuifuY); + map.put("shenpi", 0); + return map; + } + + @Override + public Map getDetailsByNumber(String number, String type, String flag) { + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(number); + if (flag != null && "2".equals(flag)) {//全部设备 + return detailsByNumber; + } + if (detailsByNumber == null) { + throw exception(DEVICE_NO_EXISTS); + } + + if (!"0".equals(detailsByNumber.get("status"))) { + throw exception(DEVICE_STATUS_0); + } + + if (type != null && !"".equals(type)) { + if ("TECH".equals(type)) { + type = "DEVICE"; + } + if (!type.equals(detailsByNumber.get("type").toString())) { + throw exception(DEVICE_TYPE_NO_NORMAL); + } + } + if ("1".equals(flag)) {//全部 + } else { + String fac = adminUserApi.getUser(getLoginUserId()).getDeptId().toString(); + if (!fac.equals(detailsByNumber.get("factoryAreaNumber").toString())) { + throw exception(FACTORY_MOLD_NO_NORMAL); + } + } + return detailsByNumber; + } + + @Override + public List> selectData(String factoryAreaNumber) { + List> list = new ArrayList<>(); + if (factoryAreaNumber != null && !"".equals(factoryAreaNumber)) {//传入了厂区编号 + list = deviceAccountsMapper.selectData(factoryAreaNumber); + } else { + AdminUserRespDTO user = adminUserApi.getUser(getLoginUserId()); + if (user.getDeptId() != null) { + list = deviceAccountsMapper.selectData(user.getDeptId().toString()); + } + } + return list; + } + + @Override + public List> selectAll() { + return deviceAccountsMapper.selectAll(); + } + + @Override + public PageResult getAppPage(DeviceAccountsPageReqVO pageReqVO) { + IPage pageInfo = deviceAccountsMapper.getAppPage(new Page(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + for (DeviceAccountsDO en : pageInfo.getRecords()) { + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setNumber(en.getNumber()); + attachmentFileDO.setFuncCode("device_mould_picture"); + List attachmentFileList = attachmentFileMapper.getAttachmentFileList(attachmentFileDO); + en.setImages(attachmentFileList.size() == 0 ? "" : attachmentFileList.get(0).getPath()); + } + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + + @Override + public DeviceAccountsDO getDetailsEntryByNumber(String number) { + return deviceAccountsMapper.getDetailsEntryByNumber(number); + } + + @Override + public List selectListNoPage(DeviceAccountsPageReqVO pageReqVO) { + return deviceAccountsMapper.selectListNoPage(pageReqVO); + } + + @Override + public Integer updateDeviceAccountsStatus(String number, String status) { + DeviceAccountsDO deviceAccountsDO = getDetailsEntryByNumber(number); + deviceAccountsDO.setStatus(status); + deviceAccountsDO.setNumber(number); + DeviceAccountsUpdateReqVO deviceAccountsUpdateReqVO = DeviceAccountsConvert.INSTANCE.convertBack(deviceAccountsDO); + return updateDeviceAccounts(deviceAccountsUpdateReqVO); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobDetailItemService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobDetailItemService.java new file mode 100644 index 0000000..c6c1001 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobDetailItemService.java @@ -0,0 +1,80 @@ +package com.win.module.eam.service.deviceinspectionjob; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailItemDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 检修工单子表与备件关系 Service 接口 + * + * @author 超级管理员 + */ +public interface DeviceInspectionJobDetailItemService { + + /** + * 创建检修工单子表与备件关系 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceInspectionDetailItem(@Valid DeviceInspectionJobDetailItemCreateReqVO createReqVO); + + /** + * 更新检修工单子表与备件关系 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceInspectionDetailItem(@Valid DeviceInspectionJobDetailItemUpdateReqVO updateReqVO); + + /** + * 删除检修工单子表与备件关系 + * + * @param id 编号 + */ + Integer deleteDeviceInspectionDetailItem(Long id); + + /** + * 获得检修工单子表与备件关系 + * + * @param id 编号 + * @return 检修工单子表与备件关系 + */ + DeviceInspectionJobDetailItemDO getDeviceInspectionDetailItem(Long id); + + /** + * 获得检修工单子表与备件关系列表 + * + * @param ids 编号 + * @return 检修工单子表与备件关系列表 + */ + List getDeviceInspectionDetailItemList(Collection ids); + + /** + * 获得检修工单子表与备件关系分页 + * + * @param pageReqVO 分页查询 + * @return 检修工单子表与备件关系分页 + */ + PageResult getDeviceInspectionDetailItemPage(DeviceInspectionJobDetailItemPageReqVO pageReqVO); + + /** + * 获得检修工单子表与备件关系列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 检修工单子表与备件关系列表 + */ + List getDeviceInspectionDetailItemList(DeviceInspectionJobDetailItemExportReqVO exportReqVO); + + /** + * 导入检修工单子表与备件关系主信息 + * + * @param datas 导入检修工单子表与备件关系主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceInspectionDetailItemList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobDetailItemServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobDetailItemServiceImpl.java new file mode 100644 index 0000000..a04fde9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobDetailItemServiceImpl.java @@ -0,0 +1,107 @@ +package com.win.module.eam.service.deviceinspectionjob; + +import cn.hutool.core.collection.CollUtil; +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailItemDO; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobDetailItemConvert; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobDetailItemMapper; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * 检修工单子表与备件关系 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class DeviceInspectionJobDetailItemServiceImpl implements DeviceInspectionJobDetailItemService { + + @Resource + private DeviceInspectionJobDetailItemMapper deviceInspectionDetailItemMapper; + + @Override + public Long createDeviceInspectionDetailItem(DeviceInspectionJobDetailItemCreateReqVO createReqVO) { + // 插入 + DeviceInspectionJobDetailItemDO deviceInspectionDetailItem = DeviceInspectionJobDetailItemConvert.INSTANCE.convert(createReqVO); + deviceInspectionDetailItemMapper.insert(deviceInspectionDetailItem); + // 返回 + return deviceInspectionDetailItem.getId(); + } + + @Override + public Integer updateDeviceInspectionDetailItem(DeviceInspectionJobDetailItemUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceInspectionDetailItemExists(updateReqVO.getId()); + // 更新 + DeviceInspectionJobDetailItemDO updateObj = DeviceInspectionJobDetailItemConvert.INSTANCE.convert(updateReqVO); + return deviceInspectionDetailItemMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceInspectionDetailItem(Long id) { + // 校验存在 + validateDeviceInspectionDetailItemExists(id); + // 删除 + return deviceInspectionDetailItemMapper.deleteById(id); + } + + private void validateDeviceInspectionDetailItemExists(Long id) { + if (deviceInspectionDetailItemMapper.selectById(id) == null) { + //throw exception(DEVICE_INSPECTION_DETAIL_ITEM_NOT_EXISTS); + } + } + + @Override + public DeviceInspectionJobDetailItemDO getDeviceInspectionDetailItem(Long id) { + return deviceInspectionDetailItemMapper.selectById(id); + } + + @Override + public List getDeviceInspectionDetailItemList(Collection ids) { + return deviceInspectionDetailItemMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceInspectionDetailItemPage(DeviceInspectionJobDetailItemPageReqVO pageReqVO) { + return deviceInspectionDetailItemMapper.selectPage(pageReqVO); + } + + @Override + public List getDeviceInspectionDetailItemList(DeviceInspectionJobDetailItemExportReqVO exportReqVO) { + return deviceInspectionDetailItemMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceInspectionDetailItemList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_INSPECTION_DETAIL_ITEM_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceInspectionDetailItemDO obj = deviceInspectionDetailItemMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceInspectionDetailItemMapper.insert(DeviceInspectionDetailItemConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceInspectionDetailItemDO deviceInspectionDetailItemDO = DeviceInspectionDetailItemConvert.INSTANCE.convert(item); +// deviceInspectionDetailItemDO.setId(obj.getId()); +// deviceInspectionDetailItemMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobDetailService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobDetailService.java new file mode 100644 index 0000000..e989acc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobDetailService.java @@ -0,0 +1,87 @@ +package com.win.module.eam.service.deviceinspectionjob; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 检修工单子 Service 接口 + * + * @author 超级管理员 + */ +public interface DeviceInspectionJobDetailService { + + /** + * 创建检修工单子 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceInspectionDetail(@Valid DeviceInspectionJobDetailCreateReqVO createReqVO); + + /** + * 更新检修工单子 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceInspectionDetail(@Valid DeviceInspectionJobDetailUpdateReqVO updateReqVO); + + /** + * 删除检修工单子 + * + * @param id 编号 + */ + Integer deleteDeviceInspectionDetail(Long id); + + /** + * 获得检修工单子 + * + * @param id 编号 + * @return 检修工单子 + */ + DeviceInspectionJobDetailDO getDeviceInspectionDetail(Long id); + + /** + * 获得检修工单子列表 + * + * @param ids 编号 + * @return 检修工单子列表 + */ + List getDeviceInspectionDetailList(Collection ids); + + /** + * 获得检修工单子分页 + * + * @param pageReqVO 分页查询 + * @return 检修工单子分页 + */ + PageResult getDeviceInspectionDetailPage(DeviceInspectionJobDetailPageReqVO pageReqVO); + + /** + * 获得检修工单子列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 检修工单子列表 + */ + List getDeviceInspectionDetailList(DeviceInspectionJobDetailExportReqVO exportReqVO); + + /** + * 导入检修工单子主信息 + * + * @param datas 导入检修工单子主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceInspectionDetailList(List datas, Integer mode, boolean updatePart); + + /** + * 根据维修工单号查询工单子项列表信息 + * @param number + * @return + */ + List selectListByNumber(String number); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobDetailServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobDetailServiceImpl.java new file mode 100644 index 0000000..d91f7d8 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobDetailServiceImpl.java @@ -0,0 +1,242 @@ +package com.win.module.eam.service.deviceinspectionjob; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobDetailConvert; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailItemDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobMainDO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobDetailItemMapper; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobDetailMapper; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobMainMapper; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +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.module.eam.enums.ErrorCodeConstants.ITEM_NOT_EXISTS; + +/** + * 检修工单子 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class DeviceInspectionJobDetailServiceImpl implements DeviceInspectionJobDetailService { + + @Resource + private DeviceInspectionJobDetailMapper deviceInspectionDetailMapper; + + @Resource + ItemMapper itemMapper; + + @Resource + private DeviceInspectionJobDetailItemMapper detailItemMapper; + + @Resource + private DeviceInspectionJobMainMapper deviceInspectionJobMainMapper; + + @Resource + private DeviceInspectionJobDetailItemMapper deviceInspectionJobDetailItemMapper; + + @Resource + private AdminUserApi userApi; + + @Override + public Long createDeviceInspectionDetail(DeviceInspectionJobDetailCreateReqVO createReqVO) { + List mainDO = deviceInspectionJobMainMapper.selectList("number", createReqVO.getNumber()); + // 插入 + DeviceInspectionJobDetailDO deviceInspectionDetail = DeviceInspectionJobDetailConvert.INSTANCE.convert(createReqVO); + deviceInspectionDetail.setMasterId(mainDO.get(0).getId()); + deviceInspectionDetailMapper.insert(deviceInspectionDetail); + List> itemList = createReqVO.getItemNumbers();//备件号集合 + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(!itemDOS.isEmpty()){ + String number = itemDOS.get(0).getNumber(); + DeviceInspectionJobDetailItemDO dos = new DeviceInspectionJobDetailItemDO(); + dos.setMasterId(deviceInspectionDetail.getId()); + dos.setItemNumber(number); + dos.setMasterId(deviceInspectionDetail.getId()); + dos.setNumber(createReqVO.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + detailItemMapper.insert(dos); + }else{ + throw exception(ITEM_NOT_EXISTS); + } + } + } + // 返回 + return deviceInspectionDetail.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateDeviceInspectionDetail(DeviceInspectionJobDetailUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceInspectionDetailExists(updateReqVO.getId()); + // 更新 + DeviceInspectionJobDetailDO updateObj = DeviceInspectionJobDetailConvert.INSTANCE.convert(updateReqVO); + int i = deviceInspectionDetailMapper.updateById(updateObj); + //先删除关联备件 + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("master_id", updateReqVO.getId()); + itemQueryWrapper.eq("deleted", 0); + List deviceInspectionDetailItemDOS = detailItemMapper.selectList(itemQueryWrapper); + for(DeviceInspectionJobDetailItemDO item:deviceInspectionDetailItemDOS){ + detailItemMapper.deleteById(item.getId()); + } + //再添加备件 + List> itemList = updateReqVO.getItemNumbers(); + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(!itemDOS.isEmpty()){ + String number = itemDOS.get(0).getNumber(); + DeviceInspectionJobDetailItemDO dos = new DeviceInspectionJobDetailItemDO(); + dos.setItemNumber(number); + dos.setMasterId(updateReqVO.getId()); + dos.setNumber(updateReqVO.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + detailItemMapper.insert(dos); + }else{ + throw exception(ITEM_NOT_EXISTS); + } + } + } + return i; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer deleteDeviceInspectionDetail(Long id) { + // 校验存在 + validateDeviceInspectionDetailExists(id); + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("master_id", id); + itemQueryWrapper.eq("deleted", 0); + List deviceInspectionDetailItemDOS = detailItemMapper.selectList(itemQueryWrapper); + for(DeviceInspectionJobDetailItemDO item:deviceInspectionDetailItemDOS){ + detailItemMapper.deleteById(item.getId()); + } + // 删除 + return deviceInspectionDetailMapper.deleteById(id); + + + } + + private void validateDeviceInspectionDetailExists(Long id) { + if (deviceInspectionDetailMapper.selectById(id) == null) { + // throw exception(DEVICE_INSPECTION_DETAIL_NOT_EXISTS); + } + } + + @Override + public DeviceInspectionJobDetailDO getDeviceInspectionDetail(Long id) { + return deviceInspectionDetailMapper.selectById(id); + } + + @Override + public List getDeviceInspectionDetailList(Collection ids) { + return deviceInspectionDetailMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceInspectionDetailPage(DeviceInspectionJobDetailPageReqVO pageReqVO) { + PageResult deviceInspectionJobDetailDOList = deviceInspectionDetailMapper.selectPage(pageReqVO); + for(DeviceInspectionJobDetailDO en:deviceInspectionJobDetailDOList.getList()){ + List> list = deviceInspectionJobDetailItemMapper.selectListById(en.getId()); + en.setItemNumbers(list); + } + return deviceInspectionJobDetailDOList; + } + + @Override + public List getDeviceInspectionDetailList(DeviceInspectionJobDetailExportReqVO exportReqVO) { + return deviceInspectionDetailMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceInspectionDetailList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_INSPECTION_DETAIL_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceInspectionDetailDO obj = deviceInspectionDetailMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceInspectionDetailMapper.insert(DeviceInspectionDetailConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceInspectionDetailDO deviceInspectionDetailDO = DeviceInspectionDetailConvert.INSTANCE.convert(item); +// deviceInspectionDetailDO.setId(obj.getId()); +// deviceInspectionDetailMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public List selectListByNumber(String number) { + QueryWrapper detailsDOQueryWrapper = new QueryWrapper<>(); + detailsDOQueryWrapper.eq("number", number); + detailsDOQueryWrapper.eq("available", "TRUE"); + List maintenanceNumber = deviceInspectionDetailMapper.selectList(detailsDOQueryWrapper); + for(DeviceInspectionJobDetailDO en:maintenanceNumber){ + if(en.getStatus().equals("TRUE")){ + en.setStatusName("是"); + }else{ + en.setStatusName("否"); + } + StringBuilder names = new StringBuilder(); + if(!"".equals(en.getChargePeoples())&& en.getChargePeoples()!=null){ + String[] split = en.getChargePeoples().split(","); + for(int i = 0; i < split.length; i++) { + AdminUserRespDTO user = userApi.getUser(Long.parseLong(split[i])); + if (names.length() > 0) { + names.append(", "); + } + if(user!=null){ + String name = user.getNickname(); + names.append(name); + } + + } + en.setChargePeoplesName(names.toString()); + } + List> list = detailItemMapper.selectListById(en.getId()); +// StringBuilder sb = new StringBuilder(); +// for(Map map:list){ +// if (sb.length() > 0) { +// sb.append(", "); +// } +// String name = map.get("name").toString(); +// String qty = map.get("qty").toString(); +// sb.append(name+":"+qty); +// } + en.setItems(list); + } + return maintenanceNumber; + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobMainService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobMainService.java new file mode 100644 index 0000000..916435c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobMainService.java @@ -0,0 +1,146 @@ +package com.win.module.eam.service.deviceinspectionjob; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobMainDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionReportDo; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 检修工单主 Service 接口 + * + * @author 超级管理员 + */ +public interface DeviceInspectionJobMainService { + + /** + * 创建检修工单主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceInspectionMain(@Valid DeviceInspectionJobMainCreateReqVO createReqVO); + + /** + * 更新检修工单主 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceInspectionMain(@Valid DeviceInspectionJobMainUpdateReqVO updateReqVO); + + /** + * 删除检修工单主 + * + * @param id 编号 + */ + Integer deleteDeviceInspectionMain(Long id); + + /** + * 获得检修工单主 + * + * @param id 编号 + * @return 检修工单主 + */ + DeviceInspectionJobMainDO getDeviceInspectionMain(Long id); + + /** + * 获得检修工单主列表 + * + * @param ids 编号 + * @return 检修工单主列表 + */ + List getDeviceInspectionMainList(Collection ids); + + /** + * 获得检修工单主分页 + * + * @param pageReqVO 分页查询 + * @return 检修工单主分页 + */ + PageResult getDeviceInspectionMainPage(DeviceInspectionJobMainPageReqVO pageReqVO); + + /** + * 获得备件台账分页 + * + * @param conditions 分页查询 + * @return 备件台账分页 + */ + PageResult getInspectionJobMainSenior(CustomConditions conditions); + + /** + * 获得检修工单主列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 检修工单主列表 + */ + List getDeviceInspectionMainList(DeviceInspectionJobMainExportReqVO exportReqVO); + + /** + * 导入检修工单主主信息 + * + * @param datas 导入检修工单主主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceInspectionMainList(List datas, Integer mode, boolean updatePart); + + /** + * APP检修工单主表分页 + * @param pageReqVO + * @return + */ + PageResult getAppPage(DeviceInspectionJobMainPageReqVO pageReqVO); + + /** + * 检修点击完成 + * @param id 编号 + */ + Integer onClick(Long id); + + /** + * 检修点击验证 + * @param id 编号 + * @param verifyContent 验证内容 + */ + Integer onVerify(Long id,String verifyContent); + + + + /** + * 创建检修工单主PC + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceInspectionMainPC(@Valid DeviceInspectionJobMainCreateReqVO createReqVO); + + + List getDeviceInspectionMainNoPage(DeviceInspectionJobMainPageReqVO pageReqVO); + + + /** + *@Author longlongxiaogege + *@Description //生成保养打印表子内容 + *@Date 13:17 2024/4/18 + *@Param [deviceMaintainJobReportDo] + *@return java.util.List + **/ + List getInspectionReport(DeviceInspectionReportDo deviceInspectionReportDo); + + + /** + *@Author longlongxiaogege + *@Description //生成保养打印表主内容 + *@Date 13:17 2024/4/18 + *@Param [deviceMaintainJobReportDo] + *@return java.util.List + **/ + List getInspectionReportMainInfo(DeviceInspectionReportDo deviceInspectionReportDo); + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobMainServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobMainServiceImpl.java new file mode 100644 index 0000000..1e01268 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinspectionjob/DeviceInspectionJobMainServiceImpl.java @@ -0,0 +1,410 @@ +package com.win.module.eam.service.deviceinspectionjob; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobDetailConvert; +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobMainConvert; +import com.win.module.eam.dal.dataobject.classtype.ClassTypeDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailItemDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobMainDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionReportDo; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.mysql.classtype.ClassTypeMapper; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobDetailItemMapper; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobDetailMapper; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobMainMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobMainMapper; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.system.api.dept.DeptApi; +import com.win.module.system.api.mail.MailSendApi; +import com.win.module.system.api.mail.dto.MailSendSingleToUserReqDTO; +import com.win.module.system.api.permission.PermissionApi; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.api.user.dto.AdminUserRespExpandDTO; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; + +import static cn.hutool.log.StaticLog.info; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 检修工单主 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class DeviceInspectionJobMainServiceImpl implements DeviceInspectionJobMainService { + + @Resource + private DeviceInspectionJobMainMapper deviceInspectionJobMainMapper; + + @Resource + private DeviceMaintenanceJobMainMapper deviceMaintenanceJobMainMapper; + + @Resource + private SerialNumberApi serialNumberApi; + + @Resource + private AdminUserApi userApi; + + @Resource + private DeptApi deptApi; + + @Resource + private DeviceInspectionJobDetailMapper deviceInspectionDetailMapper; + + @Resource + private ItemMapper itemMapper; + + @Resource + private DeviceInspectionJobDetailItemMapper deviceInspectionDetailItemMapper; + + @Resource + private PermissionApi permissionApi; + + @Resource + private MoldAccountsMapper moldAccountsMapper; + + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + + @Resource + private MailSendApi mailSendApi; + + @Resource + private ClassTypeMapper classTypeMapper; + + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDeviceInspectionMain(DeviceInspectionJobMainCreateReqVO createReqVO) { + if (createReqVO.getMaintenance() == null) { + throw exception(JIAN_XIU_MAINTENANCE_NOT_EMPTY); + } + // 插入 + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + DeviceInspectionJobMainDO deviceInspectionMain = DeviceInspectionJobMainConvert.INSTANCE.convert(createReqVO); + deviceInspectionMain.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode());//已接单 + String number = serialNumberApi.generateCode(RuleCodeEnum.JIAN_XIU_ORDER.getCode()); + deviceInspectionMain.setNumber(number); + //检修工单是否选择了维修工单 + if (createReqVO.getMaintenanceNumber() != null && !"".equals(createReqVO.getMaintenanceNumber())) { + DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectOne("number", createReqVO.getMaintenanceNumber());//根据维修工单号查询维修 + //校验检修中维修工单唯一性 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("maintenance_number", createReqVO.getNumber()); + queryWrapper.eq("status", OrderStatusEnum.JX_PROCCED_STATUS.getCode()); + List jobMainDOS = deviceInspectionJobMainMapper.selectList(queryWrapper); + if (jobMainDOS != null && !jobMainDOS.isEmpty()) {//不能重复选择相同维修工单 + throw exception(WEI_XIU_ORITEM_NOMAL); + } + deviceInspectionMain.setDeviceNumber(deviceMaintenanceJobMainDO.getDeviceNumber()); + deviceInspectionMain.setType(deviceMaintenanceJobMainDO.getType()); + deviceInspectionMain.setFactoryAreaNumber(deviceMaintenanceJobMainDO.getFactoryAreaNumber()); + deviceInspectionMain.setDeptId(Long.parseLong(deviceMaintenanceJobMainDO.getFactoryAreaNumber())); + } else {//如果没有选择则传设备模具和type + deviceInspectionMain.setDeviceNumber(createReqVO.getDeviceNumber()); + deviceInspectionMain.setType(createReqVO.getType()); + //校验检修中的设备唯一性 + String deviceNumber = createReqVO.getDeviceNumber(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("device_number", deviceNumber); + queryWrapper.eq("status", OrderStatusEnum.JX_PROCCED_STATUS.getCode()); + List deviceInspectionJobMainDOS = deviceInspectionJobMainMapper.selectList(queryWrapper); + if (deviceInspectionJobMainDOS != null && !deviceInspectionJobMainDOS.isEmpty()) {//该设备模具已经有正在检修中未完成的不能再选 + throw exception(DEVICE_ORITEM_NOMAL); + } + } + deviceInspectionMain.setReceivingTime(LocalDateTime.now()); + deviceInspectionMain.setDeptId(user.getDeptId()); + deviceInspectionJobMainMapper.insert(deviceInspectionMain); + // 返回 + return deviceInspectionMain.getId(); + } + + @Override + public Integer updateDeviceInspectionMain(DeviceInspectionJobMainUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceInspectionMainExists(updateReqVO.getId()); + // 更新 + DeviceInspectionJobMainDO updateObj = DeviceInspectionJobMainConvert.INSTANCE.convert(updateReqVO); + //检修工单是否选择了维修工单 + if (updateReqVO.getMaintenanceNumber() != null && !"".equals(updateReqVO.getMaintenanceNumber())) { + DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectOne("number", updateReqVO.getMaintenanceNumber());//根据维修工单号查询维修 + updateObj.setDeviceNumber(deviceMaintenanceJobMainDO.getDeviceNumber()); + updateObj.setType(deviceMaintenanceJobMainDO.getType()); + updateObj.setNumber(deviceMaintenanceJobMainDO.getNumber()); + updateObj.setFactoryAreaNumber(deviceMaintenanceJobMainDO.getFactoryAreaNumber()); + } + return deviceInspectionJobMainMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceInspectionMain(Long id) { + // 校验存在 + validateDeviceInspectionMainExists(id); + // 删除 + return deviceInspectionJobMainMapper.deleteById(id); + } + + private void validateDeviceInspectionMainExists(Long id) { + if (deviceInspectionJobMainMapper.selectById(id) == null) { + throw exception(JIAN_XIU_ORDER_NOT_EXISTS); + } + } + + @Override + public DeviceInspectionJobMainDO getDeviceInspectionMain(Long id) { + return deviceInspectionJobMainMapper.selectById(id); + } + + @Override + public List getDeviceInspectionMainList(Collection ids) { + return deviceInspectionJobMainMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceInspectionMainPage(DeviceInspectionJobMainPageReqVO pageReqVO) { + return deviceInspectionJobMainMapper.selectPage(pageReqVO); + } + + @Override + public List getDeviceInspectionMainList(DeviceInspectionJobMainExportReqVO exportReqVO) { + return deviceInspectionJobMainMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceInspectionMainList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_INSPECTION_MAIN_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceInspectionMainDO obj = deviceInspectionMainMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceInspectionMainMapper.insert(DeviceInspectionMainConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceInspectionMainDO deviceInspectionMainDO = DeviceInspectionMainConvert.INSTANCE.convert(item); +// deviceInspectionMainDO.setId(obj.getId()); +// deviceInspectionMainMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public PageResult getAppPage(DeviceInspectionJobMainPageReqVO pageReqVO) { + pageReqVO.setUserId(getLoginUserId().toString()); + String b = classTypeMapper.getIdentity("DEVICE"); + if (b.equals("2")) { + throw exception(WORKER_ENGINEER_IS_NOT); + } + pageReqVO.setStandType(b); + pageReqVO.setClassType("DEVICE"); + if ("1".equals(pageReqVO.getFlag())) {//flag 0 首页进入 1我的进入 + pageReqVO.setUserId(getLoginUserId().toString()); + IPage pageInfo = deviceInspectionJobMainMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for (DeviceInspectionJobMainDO en : pageInfo.getRecords()) { + String deviceNumber = en.getDeviceNumber(); + String type = en.getType(); + if ("MOLD".equals(type)) {//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber == null ? "" : detailsByNumber.get("name").toString()); + } else {//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber == null ? "" : detailsByNumber.get("name").toString()); + } + } + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } else { + //首页进入是获取未接单 已接单的单子 + pageReqVO.setFlag("0"); + } + IPage pageInfo = deviceInspectionJobMainMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + + @Override + public PageResult getInspectionJobMainSenior(CustomConditions conditions) { + return deviceInspectionJobMainMapper.selectSenior(conditions); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer onClick(Long id) { + // 校验存在 + validateDeviceInspectionMainExists(id); + // 更新 + DeviceInspectionJobMainDO inspectionMainDO = deviceInspectionJobMainMapper.selectById(id);//根据检修id获取检修信息 + long maintenance = inspectionMainDO.getMaintenance(); + long loginUserId = getLoginUserId(); + if (maintenance != loginUserId) {//当前人与接单人不一致 + throw exception(JIAN_XIU_PEOPLE_DIFF); + } + //DeviceInspectionJobMainDO updateObj = new DeviceInspectionJobMainDO(); + inspectionMainDO.setId(id); + inspectionMainDO.setStatus(OrderStatusEnum.COMPLETED_STATUS.getCode());//已完成完成 + inspectionMainDO.setCompletionTime(LocalDateTime.now());//完成时间 + int i = deviceInspectionJobMainMapper.updateById(inspectionMainDO); + try { + sendEmails(inspectionMainDO); + } catch (Exception e) { + info("发送邮件异常:{}", e); + } + /*if(inspectionMainDO.getMaintenanceNumber()!=null&&!"".equals(inspectionMainDO.getMaintenanceNumber())){//有临时状态的维修工单需要更改状态 + List number = deviceMaintenanceJobMainMapper.selectList("number", inspectionMainDO.getMaintenanceNumber()); + DeviceMaintenanceJobMainDO maintenanceJobMainDO = number.get(0); + maintenanceJobMainDO.setResult(OrderStatusEnum.RESULT_COMPLETED.getCode()); + deviceMaintenanceJobMainMapper.updateById(maintenanceJobMainDO); + }*/ + return i; + } + + @Override + public Integer onVerify(Long id, String verifyContent) { + // 校验存在 + validateDeviceInspectionMainExists(id); + // 更新 + DeviceInspectionJobMainDO inspectionMainDO = deviceInspectionJobMainMapper.selectById(id);//根据检修id获取检修信息 + if (!OrderStatusEnum.COMPLETED_STATUS.getCode().equals(inspectionMainDO.getStatus())) { + throw exception(JIAN_XIU_NOT_COMPLETED); + } + inspectionMainDO.setVerifyTime(LocalDateTime.now()); + inspectionMainDO.setVerifyContent(verifyContent); + inspectionMainDO.setStatus(OrderStatusEnum.VERIFIED_STATUS.getCode());//已验证 + inspectionMainDO.setVerifyTime(LocalDateTime.now()); + inspectionMainDO.setVerifyer(getLoginUserId());//验证人 + int i = deviceInspectionJobMainMapper.updateById(inspectionMainDO); + if (inspectionMainDO.getMaintenanceNumber() != null && !"".equals(inspectionMainDO.getMaintenanceNumber())) {//有临时状态的维修工单需要更改状态 + List number = deviceMaintenanceJobMainMapper.selectList("number", inspectionMainDO.getMaintenanceNumber()); + DeviceMaintenanceJobMainDO maintenanceJobMainDO = number.get(0); + maintenanceJobMainDO.setResult(OrderStatusEnum.RESULT_COMPLETED.getCode()); + deviceMaintenanceJobMainMapper.updateById(maintenanceJobMainDO); + } + return i; + } + + @Override + public Long createDeviceInspectionMainPC(DeviceInspectionJobMainCreateReqVO createReqVO) { + // 插入 + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + DeviceInspectionJobMainDO deviceInspectionMain = DeviceInspectionJobMainConvert.INSTANCE.convert(createReqVO); + deviceInspectionMain.setMaintenance(getLoginUserId()); + deviceInspectionMain.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode());//检修中 + String number = serialNumberApi.generateCode(RuleCodeEnum.JIAN_XIU_ORDER.getCode()); + deviceInspectionMain.setNumber(number); + deviceInspectionMain.setDeptId(user.getDeptId()); + //检修工单是否选择了维修工单 + if (createReqVO.getNumber() != null && !"".equals(createReqVO.getNumber())) { + DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectOne("number", createReqVO.getNumber());//根据维修工单号查询维修 + deviceInspectionMain.setDeviceNumber(deviceMaintenanceJobMainDO.getDeviceNumber()); + deviceInspectionMain.setType(deviceMaintenanceJobMainDO.getType()); + deviceInspectionMain.setNumber(deviceMaintenanceJobMainDO.getNumber()); + deviceInspectionMain.setFactoryAreaNumber(deviceMaintenanceJobMainDO.getFactoryAreaNumber()); + } + if (createReqVO.getSubList() != null && !"".equals(createReqVO.getSubList())) {//PC端传入 + //主子表 + List subDOList = DeviceInspectionJobDetailConvert.INSTANCE.convertList03(createReqVO.getSubList()); + for (DeviceInspectionJobDetailDO deviceMaintenanceDetail : subDOList) { + deviceMaintenanceDetail.setNumber(number); + //插入子项数据 + int id = deviceInspectionDetailMapper.insert(deviceMaintenanceDetail); + List> itemList = deviceMaintenanceDetail.getItemNumbers();//备件号集合 + if (itemList != null && itemList.size() > 0) { + for (Map map : itemList) { + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if (itemDOS != null) { + String numbers = itemDOS.get(0).getNumber(); + DeviceInspectionJobDetailItemDO dos = new DeviceInspectionJobDetailItemDO(); + dos.setItemNumber(numbers); + dos.setMasterId(deviceMaintenanceDetail.getId()); + dos.setNumber(deviceMaintenanceDetail.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + deviceInspectionDetailItemMapper.insert(dos); + } + } + } + } + } + deviceInspectionJobMainMapper.insert(deviceInspectionMain); + + // 返回 + return deviceInspectionMain.getId(); + } + + @Override + public List getDeviceInspectionMainNoPage(DeviceInspectionJobMainPageReqVO pageReqVO) { + return deviceInspectionJobMainMapper.selectNoPage(pageReqVO); + } + + @Override + public List getInspectionReport(DeviceInspectionReportDo deviceInspectionReportDo) { + return deviceInspectionJobMainMapper.getInspectionReport(deviceInspectionReportDo); + } + + @Override + public List getInspectionReportMainInfo(DeviceInspectionReportDo deviceInspectionReportDo) { + return deviceInspectionJobMainMapper.getInspectionReportMainInfo(deviceInspectionReportDo); + } + + /** + * 检修工单给工程师发验证邮件 + */ + private void sendEmails(DeviceInspectionJobMainDO inspectionMainDO) { + List userBeanList = classTypeMapper.JudgeIdentity(null, inspectionMainDO.getType(), "1", inspectionMainDO.getFactoryAreaNumber()); + userBeanList.stream().forEach(item -> { + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getUserId())); + mailSendSingleToUserReqDTO.setTemplateCode("job-inspection-verify"); + Map params = new HashMap<>(); + params.put("typeName", "设备"); + params.put("number", inspectionMainDO.getNumber()); + params.put("name", item.getNickname()); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + } catch (RuntimeException e) { + info("工单编号为" + inspectionMainDO.getNumber() + "的名为:" + inspectionMainDO.getDescribes() + "的工单给" + item.getNickname() + "发送的邮件通知失败:{}", e); + } + }); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinternalaudit/DeviceInternalAuditService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinternalaudit/DeviceInternalAuditService.java new file mode 100644 index 0000000..80102d9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinternalaudit/DeviceInternalAuditService.java @@ -0,0 +1,73 @@ +package com.win.module.eam.service.deviceinternalaudit; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceinternalaudit.vo.*; +import com.win.module.eam.dal.dataobject.deviceinternalaudit.DeviceInternalAuditDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 设备内审业务说明 Service 接口 + * + * @author 超级管理员 + */ +public interface DeviceInternalAuditService { + + /** + * 创建设备内审业务说明 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceInternalAudit(@Valid DeviceInternalAuditCreateReqVO createReqVO); + + /** + * 更新设备内审业务说明 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceInternalAudit(@Valid DeviceInternalAuditUpdateReqVO updateReqVO); + + /** + * 删除设备内审业务说明 + * + * @param id 编号 + */ + Integer deleteDeviceInternalAudit(Long id); + + /** + * 获得设备内审业务说明 + * + * @param id 编号 + * @return 设备内审业务说明 + */ + DeviceInternalAuditDO getDeviceInternalAudit(Long id); + + /** + * 获得设备内审业务说明列表 + * + * @param ids 编号 + * @return 设备内审业务说明列表 + */ + List getDeviceInternalAuditList(Collection ids); + + /** + * 获得设备内审业务说明分页 + * + * @param pageReqVO 分页查询 + * @return 设备内审业务说明分页 + */ + PageResult getDeviceInternalAuditPage(DeviceInternalAuditPageReqVO pageReqVO); + + /** + * 获得设备内审业务说明列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 设备内审业务说明列表 + */ + List getDeviceInternalAuditList(DeviceInternalAuditExportReqVO exportReqVO); + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinternalaudit/DeviceInternalAuditServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinternalaudit/DeviceInternalAuditServiceImpl.java new file mode 100644 index 0000000..4aebcf3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceinternalaudit/DeviceInternalAuditServiceImpl.java @@ -0,0 +1,114 @@ +package com.win.module.eam.service.deviceinternalaudit; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceinternalaudit.vo.DeviceInternalAuditCreateReqVO; +import com.win.module.eam.controller.deviceinternalaudit.vo.DeviceInternalAuditExportReqVO; +import com.win.module.eam.controller.deviceinternalaudit.vo.DeviceInternalAuditPageReqVO; +import com.win.module.eam.controller.deviceinternalaudit.vo.DeviceInternalAuditUpdateReqVO; +import com.win.module.eam.convert.deviceinternalaudit.DeviceInternalAuditConvert; +import com.win.module.eam.dal.dataobject.deviceinternalaudit.DeviceInternalAuditDO; +import com.win.module.eam.dal.mysql.deviceinternalaudit.DeviceInternalAuditMapper; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.eam.enums.ErrorCodeConstants.DEVICE_INTERNAL_AUDIT_NOT_EXISTS; + +/** + * 设备内审业务说明 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class DeviceInternalAuditServiceImpl implements DeviceInternalAuditService { + + @Resource + private DeviceInternalAuditMapper deviceInternalAuditMapper; + @Resource + private SerialNumberApi serialNumberApi; + + @Override + public Long createDeviceInternalAudit(DeviceInternalAuditCreateReqVO createReqVO) { + // 插入 + DeviceInternalAuditDO deviceInternalAudit = DeviceInternalAuditConvert.INSTANCE.convert(createReqVO); + String adjustRecordNumber = serialNumberApi.generateCode(RuleCodeEnum.Adjust_Record.getCode()); + deviceInternalAudit.setNumber(adjustRecordNumber); + //计算九项的平均分 + int i = deviceInternalAudit.getFitOut()+deviceInternalAudit.getCoating()+deviceInternalAudit.getInjectionMolding() + +deviceInternalAudit.getBusiness()+deviceInternalAudit.getLaboratory()+deviceInternalAudit.getIt()+ + deviceInternalAudit.getQualityDepartment()+deviceInternalAudit.getMaterialFlow()+deviceInternalAudit.getMoldPre(); + if (i!=0){ + BigDecimal average = (BigDecimal.valueOf(i)).divide(new BigDecimal(9) ,2, BigDecimal.ROUND_HALF_UP); + deviceInternalAudit.setAverage(average); + }else { + deviceInternalAudit.setAverage(BigDecimal.ZERO); + } + deviceInternalAudit.setCreateTime(LocalDateTime.now()); + deviceInternalAuditMapper.insert(deviceInternalAudit); + // 返回 + return deviceInternalAudit.getId(); + } + + @Override + public Integer updateDeviceInternalAudit(DeviceInternalAuditUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceInternalAuditExists(updateReqVO.getId()); + // 更新 + DeviceInternalAuditDO updateObj = DeviceInternalAuditConvert.INSTANCE.convert(updateReqVO); + //计算九项的平均分 + int i = updateObj.getFitOut()+updateObj.getCoating()+updateObj.getInjectionMolding() + +updateObj.getBusiness()+updateObj.getLaboratory()+updateObj.getIt()+ + updateObj.getQualityDepartment()+updateObj.getMaterialFlow()+updateObj.getMoldPre(); + if (i!=0){ + BigDecimal average = (BigDecimal.valueOf(i)).divide(new BigDecimal(9) ,2, BigDecimal.ROUND_HALF_UP); + updateObj.setAverage(average); + }else { + updateObj.setAverage(BigDecimal.ZERO); + } + return deviceInternalAuditMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceInternalAudit(Long id) { + // 校验存在 + validateDeviceInternalAuditExists(id); + // 删除 + return deviceInternalAuditMapper.deleteById(id); + } + + private void validateDeviceInternalAuditExists(Long id) { + if (deviceInternalAuditMapper.selectById(id) == null) { + throw exception(DEVICE_INTERNAL_AUDIT_NOT_EXISTS); + } + } + + @Override + public DeviceInternalAuditDO getDeviceInternalAudit(Long id) { + return deviceInternalAuditMapper.selectById(id); + } + + @Override + public List getDeviceInternalAuditList(Collection ids) { + return deviceInternalAuditMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceInternalAuditPage(DeviceInternalAuditPageReqVO pageReqVO) { + return deviceInternalAuditMapper.selectPage(pageReqVO); + } + + @Override + public List getDeviceInternalAuditList(DeviceInternalAuditExportReqVO exportReqVO) { + return deviceInternalAuditMapper.selectList(exportReqVO); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceitem/DeviceItemService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceitem/DeviceItemService.java new file mode 100644 index 0000000..0750eb4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceitem/DeviceItemService.java @@ -0,0 +1,77 @@ +package com.win.module.eam.service.deviceitem; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceitem.vo.*; +import com.win.module.eam.dal.dataobject.deviceitem.DeviceItemDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 设备备件关系 Service 接口 + * + * @author 超级管理员 + */ +public interface DeviceItemService { + + /** + * 创建设备备件关系 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceItem(@Valid DeviceItemCreateReqVO createReqVO); + + /** + * 更新设备备件关系 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceItem(@Valid DeviceItemUpdateReqVO updateReqVO); + + /** + * 删除设备备件关系 + * + * @param id 编号 + */ + Integer deleteDeviceItem(Long id); + + /** + * 获得设备备件关系 + * + * @param id 编号 + * @return 设备备件关系 + */ + DeviceItemDO getDeviceItem(Long id); + + /** + * 获得设备备件关系列表 + * + * @param ids 编号 + * @return 设备备件关系列表 + */ + List getDeviceItemList(Collection ids); + + /** + * 获得设备备件关系分页 + * + * @param pageReqVO 分页查询 + * @return 设备备件关系分页 + */ + PageResult getDeviceItemPage(DeviceItemPageReqVO pageReqVO); + + /** + * 获得设备备件关系列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 设备备件关系列表 + */ + List getDeviceItemList(DeviceItemExportReqVO exportReqVO); + + void createDeviceItemBatch(List createReqVO); + + + List getDeviceItemNoPage(DeviceItemPageReqVO reqVO); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceitem/DeviceItemServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceitem/DeviceItemServiceImpl.java new file mode 100644 index 0000000..3f817c3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/deviceitem/DeviceItemServiceImpl.java @@ -0,0 +1,117 @@ +package com.win.module.eam.service.deviceitem; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceitem.vo.DeviceItemCreateReqVO; +import com.win.module.eam.controller.deviceitem.vo.DeviceItemExportReqVO; +import com.win.module.eam.controller.deviceitem.vo.DeviceItemPageReqVO; +import com.win.module.eam.controller.deviceitem.vo.DeviceItemUpdateReqVO; +import com.win.module.eam.convert.deviceitem.DeviceItemConvert; +import com.win.module.eam.dal.dataobject.deviceitem.DeviceItemDO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.mysql.deviceitem.DeviceItemMapper; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.eam.service.item.ItemService; +import com.win.module.system.enums.dept.BooleanTypeEnum; +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.Collection; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.eam.enums.ErrorCodeConstants.DEVICE_ITEM_NOT_EXISTS; + +/** + * 设备备件关系 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class DeviceItemServiceImpl implements DeviceItemService { + + @Resource + private DeviceItemMapper deviceItemMapper; + @Resource + private ItemService itemService; + @Resource + private ItemMapper itemMapper; + + @Override + public Long createDeviceItem(DeviceItemCreateReqVO createReqVO) { + // 插入 + DeviceItemDO deviceItem = DeviceItemConvert.INSTANCE.convert(createReqVO); + deviceItemMapper.insert(deviceItem); + // 返回 + return deviceItem.getId(); + } + + @Override + public Integer updateDeviceItem(DeviceItemUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceItemExists(updateReqVO.getId()); + // 更新 + DeviceItemDO updateObj = DeviceItemConvert.INSTANCE.convert(updateReqVO); + return deviceItemMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceItem(Long id) { + // 校验存在 + validateDeviceItemExists(id); + // 删除 + return deviceItemMapper.deleteById(id); + } + + private void validateDeviceItemExists(Long id) { + if (deviceItemMapper.selectById(id) == null) { + throw exception(DEVICE_ITEM_NOT_EXISTS); + } + } + + @Override + public DeviceItemDO getDeviceItem(Long id) { + return deviceItemMapper.selectById(id); + } + + @Override + public List getDeviceItemList(Collection ids) { + return deviceItemMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceItemPage(DeviceItemPageReqVO pageReqVO) { + return deviceItemMapper.selectPage(pageReqVO); + } + + @Override + public List getDeviceItemList(DeviceItemExportReqVO exportReqVO) { + return deviceItemMapper.selectList(exportReqVO); + } + + @Transactional + @Override + public void createDeviceItemBatch(List createReqVO) { + for (DeviceItemDO deviceItemDO : createReqVO) { + deviceItemDO.setCreateTime(LocalDateTime.now()); + QueryWrapper itemDOQueryWrapper = new QueryWrapper<>(); + itemDOQueryWrapper.eq("number", deviceItemDO.getItemNumber()); + ItemDO itemDO = itemMapper.selectOne(itemDOQueryWrapper); + itemDO.setIsOverall(BooleanTypeEnum.F.getCode()); + itemMapper.updateById(itemDO); + deviceItemMapper.deleteByItemNumberDeviceNumber(deviceItemDO); + } + deviceItemMapper.insertBatch(createReqVO); + } + + + @Override + public List getDeviceItemNoPage(DeviceItemPageReqVO reqVO) { + return deviceItemMapper.selectNoPage(reqVO); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/DeviceMaintainJobDetailService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/DeviceMaintainJobDetailService.java new file mode 100644 index 0000000..70bd5e6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/DeviceMaintainJobDetailService.java @@ -0,0 +1,87 @@ +package com.win.module.eam.service.devicemaintainjob; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobDetailDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 保养工单子 Service 接口 + * + * @author 超级管理员 + */ +public interface DeviceMaintainJobDetailService { + + /** + * 创建保养工单子 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintainOrderDetail(@Valid DeviceMaintainJobDetailCreateReqVO createReqVO); + + /** + * 更新保养工单子 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceMaintainOrderDetail(@Valid DeviceMaintainJobDetailUpdateReqVO updateReqVO); + + /** + * 删除保养工单子 + * + * @param id 编号 + */ + Integer deleteDeviceMaintainOrderDetail(Long id); + + /** + * 获得保养工单子 + * + * @param id 编号 + * @return 保养工单子 + */ + DeviceMaintainJobDetailDO getDeviceMaintainOrderDetail(Long id); + + /** + * 获得保养工单子列表 + * + * @param ids 编号 + * @return 保养工单子列表 + */ + List getDeviceMaintainOrderDetailList(Collection ids); + + /** + * 查询保养子项列表 + * @param number + * @return + */ + List selectListByNumber(String number); + + /** + * 获得保养工单子分页 + * + * @param pageReqVO 分页查询 + * @return 保养工单子分页 + */ + PageResult getDeviceMaintainOrderDetailPage(DeviceMaintainJobDetailPageReqVO pageReqVO); + + /** + * 获得保养工单子列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 保养工单子列表 + */ + List getDeviceMaintainOrderDetailList(DeviceMaintainJobDetailExportReqVO exportReqVO); + + /** + * 导入保养工单子主信息 + * + * @param datas 导入保养工单子主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceMaintainOrderDetailList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/DeviceMaintainJobDetailServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/DeviceMaintainJobDetailServiceImpl.java new file mode 100644 index 0000000..5c46ac7 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/DeviceMaintainJobDetailServiceImpl.java @@ -0,0 +1,220 @@ +package com.win.module.eam.service.devicemaintainjob; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.convert.devicemaintainjob.DeviceMaintainJobDetailConvert; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobDetailDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.MaintainJobDetailItemDO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.mysql.devicemaintainjob.DeviceMaintainJobDetailMapper; +import com.win.module.eam.dal.mysql.devicemaintainjob.DeviceMaintainJobMainMapper; +import com.win.module.eam.dal.mysql.devicemaintainjob.MaintainJobDetailItemMapper; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +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.module.eam.enums.ErrorCodeConstants.ITEM_NOT_EXISTS; + + +/** + * 保养工单子 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class DeviceMaintainJobDetailServiceImpl implements DeviceMaintainJobDetailService { + + @Resource + private DeviceMaintainJobDetailMapper deviceMaintainJobDetailMapper; + + @Resource + private MaintainJobDetailItemMapper maintainJobDetailItemMapper; + + @Resource + private DeviceMaintainJobMainMapper deviceMaintainJobMainMapper; + + @Resource + private AdminUserApi userApi; + + @Resource + ItemMapper itemMapper; + + @Override + public Long createDeviceMaintainOrderDetail(DeviceMaintainJobDetailCreateReqVO createReqVO) { + List mainDO = deviceMaintainJobMainMapper.selectList("number", createReqVO.getNumber()); + // 插入 + DeviceMaintainJobDetailDO deviceMaintainOrderDetail = DeviceMaintainJobDetailConvert.INSTANCE.convert(createReqVO); + deviceMaintainOrderDetail.setMasterId(mainDO.get(0).getId()); + int i = deviceMaintainJobDetailMapper.insert(deviceMaintainOrderDetail); + List> itemList = createReqVO.getItemNumbers();//备件号集合 + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(!itemDOS.isEmpty()){ + String number = itemDOS.get(0).getNumber(); + MaintainJobDetailItemDO dos = new MaintainJobDetailItemDO(); + dos.setItemNumber(number); + dos.setMasterId(deviceMaintainOrderDetail.getId()); + dos.setNumber(createReqVO.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + maintainJobDetailItemMapper.insert(dos); + }else{ + throw exception(ITEM_NOT_EXISTS); + } + } + } + // 返回 + return deviceMaintainOrderDetail.getId(); + } + + @Override + public Integer updateDeviceMaintainOrderDetail(DeviceMaintainJobDetailUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceMaintainOrderDetailExists(updateReqVO.getId()); + // 更新 + DeviceMaintainJobDetailDO updateObj = DeviceMaintainJobDetailConvert.INSTANCE.convert(updateReqVO); + int i = deviceMaintainJobDetailMapper.updateById(updateObj); + //先删除关联备件 + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("master_id", updateReqVO.getId()); + itemQueryWrapper.eq("deleted", 0); + List maintainJobDetailItemDOS = maintainJobDetailItemMapper.selectList(itemQueryWrapper); + for(MaintainJobDetailItemDO item: maintainJobDetailItemDOS){ + maintainJobDetailItemMapper.deleteById(item.getId()); + } + //再重新添加 + List> itemList = updateReqVO.getItemNumbers();//备件号集合 + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(!itemDOS.isEmpty()){ + String number = itemDOS.get(0).getNumber(); + MaintainJobDetailItemDO dos = new MaintainJobDetailItemDO(); + dos.setItemNumber(number); + dos.setMasterId(updateReqVO.getId()); + dos.setNumber(updateReqVO.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + maintainJobDetailItemMapper.insert(dos); + }else{ + throw exception(ITEM_NOT_EXISTS); + } + } + } + // 返回 + return i; + } + + @Override + public Integer deleteDeviceMaintainOrderDetail(Long id) { + // 校验存在 + validateDeviceMaintainOrderDetailExists(id); + // 删除 + return deviceMaintainJobDetailMapper.deleteById(id); + } + + private void validateDeviceMaintainOrderDetailExists(Long id) { + if (deviceMaintainJobDetailMapper.selectById(id) == null) { + //throw exception(DEVICE_MAINTAIN_ORDER_DETAIL_NOT_EXISTS); + } + } + + @Override + public DeviceMaintainJobDetailDO getDeviceMaintainOrderDetail(Long id) { + return deviceMaintainJobDetailMapper.selectById(id); + } + + @Override + public List getDeviceMaintainOrderDetailList(Collection ids) { + return deviceMaintainJobDetailMapper.selectBatchIds(ids); + } + + @Override + public List selectListByNumber(String number) { + QueryWrapper detailsDOQueryWrapper = new QueryWrapper<>(); + detailsDOQueryWrapper.eq("number", number); + detailsDOQueryWrapper.eq("available", "TRUE"); + List maintenanceNumber = deviceMaintainJobDetailMapper.selectList(detailsDOQueryWrapper); + for(DeviceMaintainJobDetailDO en:maintenanceNumber){ + StringBuilder names = new StringBuilder(); + if(!"".equals(en.getChargePeoples())&& en.getChargePeoples()!=null){ + String[] split = en.getChargePeoples().split(","); + for(int i = 0; i < split.length; i++) { + AdminUserRespDTO user = userApi.getUser(Long.parseLong(split[i])); + if (names.length() > 0) { + names.append(", "); + } + String name = user.getNickname(); + names.append(name); + } + en.setChargePeoplesName(names.toString()); + } + List> list = maintainJobDetailItemMapper.selectListById(en.getId()); +// StringBuilder sb = new StringBuilder(); +// for(Map map:list){ +// if (sb.length() > 0) { +// sb.append(", "); +// } +// String name = map.get("name").toString(); +// String qty = map.get("qty").toString(); +// sb.append(name+":"+qty); +// } + en.setItems(list); + } + return maintenanceNumber; + } + + @Override + public PageResult getDeviceMaintainOrderDetailPage(DeviceMaintainJobDetailPageReqVO pageReqVO) { + + PageResult deviceMaintainJobDetailDOList = deviceMaintainJobDetailMapper.selectPage(pageReqVO); + for(DeviceMaintainJobDetailDO en:deviceMaintainJobDetailDOList.getList()){ + List> list = maintainJobDetailItemMapper.selectListById(en.getId()); + en.setItemNumbers(list); + } + return deviceMaintainJobDetailDOList; + } + + @Override + public List getDeviceMaintainOrderDetailList(DeviceMaintainJobDetailExportReqVO exportReqVO) { + return deviceMaintainJobDetailMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceMaintainOrderDetailList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_MAINTAIN_ORDER_DETAIL_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceMaintainOrderDetailDO obj = deviceMaintainOrderDetailMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceMaintainOrderDetailMapper.insert(DeviceMaintainOrderDetailConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceMaintainOrderDetailDO deviceMaintainOrderDetailDO = DeviceMaintainOrderDetailConvert.INSTANCE.convert(item); +// deviceMaintainOrderDetailDO.setId(obj.getId()); +// deviceMaintainOrderDetailMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/DeviceMaintainJobMainService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/DeviceMaintainJobMainService.java new file mode 100644 index 0000000..1b1d6c3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/DeviceMaintainJobMainService.java @@ -0,0 +1,151 @@ +package com.win.module.eam.service.devicemaintainjob; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobReportDo; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 保养工单主 Service 接口 + * + * @author 超级管理员 + */ +public interface DeviceMaintainJobMainService { + + /** + * 创建保养工单主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintainOrderMain(@Valid DeviceMaintainJobMainCreateReqVO createReqVO); + + /** + * 更新保养工单主 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceMaintainOrderMain(@Valid DeviceMaintainJobMainUpdateReqVO updateReqVO); + + /** + * 删除保养工单主 + * + * @param id 编号 + */ + Integer deleteDeviceMaintainOrderMain(Long id); + + /** + * 获得保养工单主 + * + * @param id 编号 + * @return 保养工单主 + */ + DeviceMaintainJobMainDO getDeviceMaintainOrderMain(Long id); + + /** + * 获得保养工单主列表 + * + * @param ids 编号 + * @return 保养工单主列表 + */ + List getDeviceMaintainOrderMainList(Collection ids); + + /** + * 获得保养工单主分页 + * + * @param pageReqVO 分页查询 + * @return 保养工单主分页 + */ + PageResult getDeviceMaintainOrderMainPage(DeviceMaintainJobMainPageReqVO pageReqVO); + + + /** + * 获得保养工单主分页 + * + * @param conditions 分页查询 + * @return 保养工单主分页 + */ + PageResult getDeviceMaintainOrderMainSenior(CustomConditions conditions); + + + + /** + * APP分页 + * @param pageReqVO + * @return + */ + PageResult getAppPage(DeviceMaintainJobMainPageReqVO pageReqVO); + + /** + * 获得保养工单主列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 保养工单主列表 + */ + List getDeviceMaintainOrderMainList(DeviceMaintainJobMainExportReqVO exportReqVO); + + /** + * 导入保养工单主主信息 + * + * @param datas 导入保养工单主主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceMaintainOrderMainList(List datas, Integer mode, boolean updatePart); + + /** + * 保养工单点击接单 维修人员和工程师都能接单 + * @param id + * @return + */ + int orderClick(Long id); + + /** + * 点击完成 + * @param id + * @return + */ + int orderClickFinish(Long id); + + /** + * 保养工单工程师审核 + * @param id 工单id + * @param verifyContent 审核意见 + * @return + */ + int orderClickVerify(Long id,String verifyContent); + + /** + * 每月月初一号查询上个月未完成的保养和维修工单给主管发邮件 + */ + void createUncompletedOrderTask(); + + /** + *@Author longlongxiaogege + *@Description //生成保养打印表子内容 + *@Date 13:17 2024/4/18 + *@Param [deviceMaintainJobReportDo] + *@return java.util.List + **/ + List getMaintainReport(DeviceMaintainJobReportDo deviceMaintainJobReportDo); + + + /** + *@Author longlongxiaogege + *@Description //生成保养打印表主内容 + *@Date 13:17 2024/4/18 + *@Param [deviceMaintainJobReportDo] + *@return java.util.List + **/ + List getMaintainReportMainInfo(DeviceMaintainJobReportDo deviceMaintainJobReportDo); + + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/DeviceMaintainJobMainServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/DeviceMaintainJobMainServiceImpl.java new file mode 100644 index 0000000..088260a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/DeviceMaintainJobMainServiceImpl.java @@ -0,0 +1,408 @@ +package com.win.module.eam.service.devicemaintainjob; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.convert.devicemaintainjob.DeviceMaintainJobMainConvert; +import com.win.module.eam.dal.dataobject.classtype.ClassTypeDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobReportDo; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.dal.mysql.classtype.ClassTypeMapper; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.devicemaintainjob.DeviceMaintainJobMainMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobMainMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.system.api.dept.DeptApi; +import com.win.module.system.api.dept.PostApi; +import com.win.module.system.api.mail.MailSendApi; +import com.win.module.system.api.mail.dto.MailSendSingleToUserReqDTO; +import com.win.module.system.api.permission.PermissionApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.api.user.dto.AdminUserRespExpandDTO; +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.temporal.TemporalAdjusters; +import java.util.*; + +import static cn.hutool.log.StaticLog.info; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 保养工单主 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class DeviceMaintainJobMainServiceImpl implements DeviceMaintainJobMainService { + + @Resource + private DeviceMaintainJobMainMapper deviceMaintainJobMainMapper; + + @Resource + private MoldAccountsMapper moldAccountsMapper; + + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + + @Resource + private DeviceMaintenanceJobMainMapper deviceMaintenanceJobMainMapper; + + @Resource + private PostApi postApi; + @Resource + private MailSendApi mailSendApi; + + @Resource + private DeptApi deptApi; + + @Resource + private AdminUserApi userApi; + + @Resource + private PermissionApi permissionApi; + + @Resource + private ClassTypeMapper classTypeMapper; + + @Override + public Long createDeviceMaintainOrderMain(DeviceMaintainJobMainCreateReqVO createReqVO) { + // 插入 + DeviceMaintainJobMainDO deviceMaintainOrderMain = DeviceMaintainJobMainConvert.INSTANCE.convert(createReqVO); + deviceMaintainOrderMain.setDeptId(Long.parseLong(createReqVO.getFactoryAreaNumber())); + deviceMaintainJobMainMapper.insert(deviceMaintainOrderMain); + // 返回 + return deviceMaintainOrderMain.getId(); + } + + @Override + public Integer updateDeviceMaintainOrderMain(DeviceMaintainJobMainUpdateReqVO updateReqVO) { + // 校验存在 + //validateDeviceMaintainOrderMainExists(updateReqVO.getId()); + // 更新 + DeviceMaintainJobMainDO updateObj = DeviceMaintainJobMainConvert.INSTANCE.convert(updateReqVO); + return deviceMaintainJobMainMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceMaintainOrderMain(Long id) { + // 校验存在 + validateDeviceMaintainOrderMainExists(id); + // 删除 + return deviceMaintainJobMainMapper.deleteById(id); + } + + private void validateDeviceMaintainOrderMainExists(Long id) { + if (deviceMaintainJobMainMapper.selectById(id) == null) { + throw exception(JIAN_XIU_ORDER_NOT_EXISTS); + } + } + + @Override + public DeviceMaintainJobMainDO getDeviceMaintainOrderMain(Long id) { + return deviceMaintainJobMainMapper.selectById(id); + } + + @Override + public List getDeviceMaintainOrderMainList(Collection ids) { + return deviceMaintainJobMainMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceMaintainOrderMainPage(DeviceMaintainJobMainPageReqVO pageReqVO) { + return deviceMaintainJobMainMapper.selectPage(pageReqVO); + } + + + @Override + public PageResult getDeviceMaintainOrderMainSenior(CustomConditions conditions) { + return deviceMaintainJobMainMapper.selectSenior(conditions); + } + + + @Override + public PageResult getAppPage(DeviceMaintainJobMainPageReqVO pageReqVO) { + pageReqVO.setUserId(getLoginUserId().toString()); + String b = classTypeMapper.getIdentity("DEVICE"); + if (b.equals("2")) { + throw exception(WORKER_ENGINEER_IS_NOT); + } + pageReqVO.setStandType(b); + pageReqVO.setClassType("DEVICE"); + if ("1".equals(pageReqVO.getFlag())) {//flag 0 首页进入 1我的进入 + //我的里面都是获取的是当前人已经完成的单子 + pageReqVO.setUserId(getLoginUserId().toString()); + IPage pageInfo = deviceMaintainJobMainMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for(DeviceMaintainJobMainDO en :pageInfo.getRecords()){ + String deviceNumber = en.getDeviceNumber(); + String type = en.getType(); + if("MOLD".equals(type)){//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + }else{//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + } + + } + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } else { + //首页进入是获取未接单 已接单的单子 + pageReqVO.setFlag("0"); + } + IPage pageInfo = deviceMaintainJobMainMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + + @Override + public List getDeviceMaintainOrderMainList(DeviceMaintainJobMainExportReqVO exportReqVO) { + return deviceMaintainJobMainMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceMaintainOrderMainList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_MAINTAIN_ORDER_MAIN_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); + return errorList; + } + + @Override + public int orderClick(Long id) { + DeviceMaintainJobMainDO mainDO = new DeviceMaintainJobMainDO(); + mainDO.setId(id); + mainDO.setMaintenance(getLoginUserId()); + mainDO.setReceiveTime(LocalDateTime.now()); + mainDO.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + return deviceMaintainJobMainMapper.updateById(mainDO); + } + @Override + public int orderClickFinish(Long id) { + // 校验存在 + DeviceMaintainJobMainDO mainDO = deviceMaintainJobMainMapper.selectById(id); + if (deviceMaintainJobMainMapper.selectById(id) == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + if(!getLoginUserId().equals(mainDO.getMaintenance())){ + throw exception(JIAN_XIU_ORDER_NOT_USER); + } + mainDO.setId(id); + mainDO.setCompletionTime(LocalDateTime.now()); + mainDO.setStatus(OrderStatusEnum.RESULT_COMPLETED.getCode()); + try { + sendEmails(mainDO); + } catch (Exception e) { + info("发送邮件异常:{}",e); + } + int i = deviceMaintainJobMainMapper.updateById(mainDO); + + return i; + } + + @Override + public int orderClickVerify(Long id, String verifyContent) { + DeviceMaintainJobMainDO Do = deviceMaintainJobMainMapper.selectById(id); + // 校验存在 + if (Do == null) { + throw exception(BAO_YANG_JOB_NOT_EXISTS); + } + if(!permissionApi.BooleanEngineer()){ + throw exception(WEI_XIU_NOT_ENGINEER); + } + Do.setStatus(OrderStatusEnum.VERIFIED_STATUS.getCode()); + Do.setVerifyContent(verifyContent); + Do.setVerifyer(getLoginUserId()); + Do.setVerifyTime(LocalDateTime.now()); + return deviceMaintainJobMainMapper.updateById(Do); + } + + @Override + public void createUncompletedOrderTask() { + LocalDate now = LocalDate.now(); + LocalDate firstDayOfLastMonth = now.with(TemporalAdjusters.firstDayOfMonth()).minusMonths(1); + LocalDate lastDayOfLastMonth = now.with(TemporalAdjusters.lastDayOfMonth()).minusMonths(1); + String startDate = LocalDateTimeUtil.format(firstDayOfLastMonth,"yyyy-MM-dd"); + String endDate = LocalDateTimeUtil.format(lastDayOfLastMonth,"yyyy-MM-dd"); + String months = LocalDateTimeUtil.format(lastDayOfLastMonth,"yyyy-MM"); + List deviceMaintain = deviceMaintainJobMainMapper.selectList1(startDate, endDate); + List jobMainDOS = deviceMaintenanceJobMainMapper.selectList1(startDate, endDate); + StringBuilder str = new StringBuilder(); + StringBuilder str1 = new StringBuilder(); + for(DeviceMaintainJobMainDO en:deviceMaintain){ + String type = en.getType(); + String typeName = ""; + if(BasicStatusEnum.BASIC_DEVICE.getCode().equals(type)){ + typeName = "

   设备保养工单"; + }else if(BasicStatusEnum.BASIC_TECH.getCode().equals(type)){ + typeName = "

   工艺保养工单"; + }else if(BasicStatusEnum.BASIC_MOLD.getCode().equals(type)){ + typeName = "

   模具保养工单"; + } + str.append(typeName); + String number = en.getNumber(); + str.append("("); + str.append(number); + str.append(")

"); + } + for(DeviceMaintenanceJobMainDO en:jobMainDOS){ + String type = en.getType(); + String typeName = ""; + if(BasicStatusEnum.BASIC_DEVICE.getCode().equals(type)){ + typeName = "

   设备维修工单"; + }else if(BasicStatusEnum.BASIC_TECH.getCode().equals(type)){ + typeName = "

   工艺维修工单"; + }else if(BasicStatusEnum.BASIC_MOLD.getCode().equals(type)){ + typeName = "

   模具维修工单"; + } + str1.append(typeName); + String number = en.getNumber(); + str1.append("("); + str1.append(number); + str1.append(")

"); + } + if(deviceMaintain.size()>0 || jobMainDOS.size()>0){ + sendEmails(months,str.toString(),str1.toString()); + } + + } + + @Override + public List getMaintainReport(DeviceMaintainJobReportDo deviceMaintainJobReportDo) { + return deviceMaintainJobMainMapper.getMaintainReport(deviceMaintainJobReportDo); + } + + @Override + public List getMaintainReportMainInfo(DeviceMaintainJobReportDo deviceMaintainJobReportDo) { + return deviceMaintainJobMainMapper.getMaintainReportMainInfo(deviceMaintainJobReportDo); + } + + /** + * 校验能否点击待接单 + * @param id + */ + private void validateJD(Long id) { + DeviceMaintainJobMainDO mainDO = deviceMaintainJobMainMapper.selectById(id); + if (deviceMaintainJobMainMapper.selectById(id) == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + if(!OrderStatusEnum.PEND_ORDER_STATUS.getCode().equals(mainDO.getStatus())){ + throw exception(JIAN_XIU_ORDER_NOT_PENDING); + } + +// if(!permissionApi.B&&!b){ +// throw exception(JIAN_XIU_ORDER_NOT_POST); +// } + } + + /** + * 校验能否点击完成 + * @param id + */ + private void validateWC(Long id) { + DeviceMaintainJobMainDO mainDO = deviceMaintainJobMainMapper.selectById(id); + if (deviceMaintainJobMainMapper.selectById(id) == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + if(!getLoginUserId().equals(mainDO.getMaintenance())){ + throw exception(JIAN_XIU_ORDER_NOT_USER); + } +// Boolean a = postApi.booleanWorker(); +// Boolean b = postApi.booleanEngineer(); +// if(!a&&!b){ +// throw exception(JIAN_XIU_ORDER_NOT_POST); +// } + } + + /** + * 校验人员厂区和班组是否匹配 + * @param id + */ + private void validateFactoryAndClassType(Long id) { + DeviceMaintainJobMainDO mainDO = deviceMaintainJobMainMapper.selectById(id); + if (mainDO == null) { + throw exception(BAO_YANG_JOB_NOT_EXISTS); + } + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + Long deptId = user.getDeptId(); + if(!mainDO.getFactoryAreaNumber().equals(deptId.toString())){//厂区不一致 + throw exception(FACTORY_NO_NOMAL); + } + if(!mainDO.getType().equals(permissionApi.getClassType())){//班组不一致 + throw exception(CLASSTYPR_NO_NOMAL); + } + } + /** + * 每个月初查询上个月未完成的保养和维修工单给主管发送邮件 + */ + private void sendEmails(String months,String str,String str1){ + AdminUserRespExpandDTO adminUserRespExpandDTO = new AdminUserRespExpandDTO(); + List list = List.of("device_charge"); + adminUserRespExpandDTO.setCode(list); + List userBeanList = userApi.selectByUserIdentity(adminUserRespExpandDTO); + userBeanList.stream().forEach(item ->{ + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getId())); + mailSendSingleToUserReqDTO.setTemplateCode("month-examine-template"); + Map params = new HashMap<>(); + params.put("months",months); + params.put("str", str); + params.put("str1", str1); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + }catch(RuntimeException e){ + info(months+"未完成的保养和维修工单发送的邮件通知失败:{}", e); + } + }); + } + + /** + * 保养工单给工程师发验证邮件 + */ + private void sendEmails(DeviceMaintainJobMainDO mainDO){ + List userBeanList = classTypeMapper.JudgeIdentity(null, mainDO.getType(), "1", mainDO.getFactoryAreaNumber()); + userBeanList.stream().forEach(item ->{ + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getUserId())); + mailSendSingleToUserReqDTO.setTemplateCode("job-maintain-verify_template"); + Map params = new HashMap<>(); + params.put("typeName","设备"); + params.put("number", mainDO.getNumber()); + params.put("name", item.getNickname()); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + }catch(RuntimeException e){ + info("工单编号为"+mainDO.getNumber()+"的名为:"+mainDO.getDescribes()+"的工单给"+item.getNickname()+"发送的邮件通知失败:{}", e); + } + }); + + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/MaintainJobDetailItemService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/MaintainJobDetailItemService.java new file mode 100644 index 0000000..ef29396 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/MaintainJobDetailItemService.java @@ -0,0 +1,79 @@ +package com.win.module.eam.service.devicemaintainjob; + +import java.util.*; +import javax.validation.*; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintainjob.MaintainJobDetailItemDO; + +/** + * 保养工单子表与备件关系 Service 接口 + * + * @author 超级管理员 + */ +public interface MaintainJobDetailItemService { + + /** + * 创建保养工单子表与备件关系 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMaintainOrderDetailItem(@Valid MaintainJobDetailItemCreateReqVO createReqVO); + + /** + * 更新保养工单子表与备件关系 + * + * @param updateReqVO 更新信息 + */ + Integer updateMaintainOrderDetailItem(@Valid MaintainJobDetailItemUpdateReqVO updateReqVO); + + /** + * 删除保养工单子表与备件关系 + * + * @param id 编号 + */ + Integer deleteMaintainOrderDetailItem(Long id); + + /** + * 获得保养工单子表与备件关系 + * + * @param id 编号 + * @return 保养工单子表与备件关系 + */ + MaintainJobDetailItemDO getMaintainOrderDetailItem(Long id); + + /** + * 获得保养工单子表与备件关系列表 + * + * @param ids 编号 + * @return 保养工单子表与备件关系列表 + */ + List getMaintainOrderDetailItemList(Collection ids); + + /** + * 获得保养工单子表与备件关系分页 + * + * @param pageReqVO 分页查询 + * @return 保养工单子表与备件关系分页 + */ + PageResult getMaintainOrderDetailItemPage(MaintainJobDetailItemPageReqVO pageReqVO); + + /** + * 获得保养工单子表与备件关系列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 保养工单子表与备件关系列表 + */ + List getMaintainOrderDetailItemList(MaintainJobDetailItemExportReqVO exportReqVO); + + /** + * 导入保养工单子表与备件关系主信息 + * + * @param datas 导入保养工单子表与备件关系主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importMaintainOrderDetailItemList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/MaintainJobDetailItemServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/MaintainJobDetailItemServiceImpl.java new file mode 100644 index 0000000..11de7fe --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainjob/MaintainJobDetailItemServiceImpl.java @@ -0,0 +1,105 @@ +package com.win.module.eam.service.devicemaintainjob; + +import cn.hutool.core.collection.CollUtil; +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.convert.devicemaintainjob.MaintainJobDetailItemConvert; +import com.win.module.eam.dal.dataobject.devicemaintainjob.MaintainJobDetailItemDO; +import com.win.module.eam.dal.mysql.devicemaintainjob.MaintainJobDetailItemMapper; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.win.framework.common.pojo.PageResult; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * 保养工单子表与备件关系 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MaintainJobDetailItemServiceImpl implements MaintainJobDetailItemService { + + @Resource + private MaintainJobDetailItemMapper maintainJobDetailItemMapper; + + @Override + public Long createMaintainOrderDetailItem(MaintainJobDetailItemCreateReqVO createReqVO) { + // 插入 + MaintainJobDetailItemDO maintainOrderDetailItem = MaintainJobDetailItemConvert.INSTANCE.convert(createReqVO); + maintainJobDetailItemMapper.insert(maintainOrderDetailItem); + // 返回 + return maintainOrderDetailItem.getId(); + } + + @Override + public Integer updateMaintainOrderDetailItem(MaintainJobDetailItemUpdateReqVO updateReqVO) { + // 校验存在 + validateMaintainOrderDetailItemExists(updateReqVO.getId()); + // 更新 + MaintainJobDetailItemDO updateObj = MaintainJobDetailItemConvert.INSTANCE.convert(updateReqVO); + return maintainJobDetailItemMapper.updateById(updateObj); + } + + @Override + public Integer deleteMaintainOrderDetailItem(Long id) { + // 校验存在 + validateMaintainOrderDetailItemExists(id); + // 删除 + return maintainJobDetailItemMapper.deleteById(id); + } + + private void validateMaintainOrderDetailItemExists(Long id) { + if (maintainJobDetailItemMapper.selectById(id) == null) { + //throw exception(MAINTAIN_ORDER_DETAIL_ITEM_NOT_EXISTS); + } + } + + @Override + public MaintainJobDetailItemDO getMaintainOrderDetailItem(Long id) { + return maintainJobDetailItemMapper.selectById(id); + } + + @Override + public List getMaintainOrderDetailItemList(Collection ids) { + return maintainJobDetailItemMapper.selectBatchIds(ids); + } + + @Override + public PageResult getMaintainOrderDetailItemPage(MaintainJobDetailItemPageReqVO pageReqVO) { + return maintainJobDetailItemMapper.selectPage(pageReqVO); + } + + @Override + public List getMaintainOrderDetailItemList(MaintainJobDetailItemExportReqVO exportReqVO) { + return maintainJobDetailItemMapper.selectList(exportReqVO); + } + + @Override + public List importMaintainOrderDetailItemList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(MAINTAIN_ORDER_DETAIL_ITEM_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// MaintainOrderDetailItemDO obj = maintainOrderDetailItemMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// maintainOrderDetailItemMapper.insert(MaintainOrderDetailItemConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// MaintainOrderDetailItemDO maintainOrderDetailItemDO = MaintainOrderDetailItemConvert.INSTANCE.convert(item); +// maintainOrderDetailItemDO.setId(obj.getId()); +// maintainOrderDetailItemMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainplan/DeviceMaintainPlanService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainplan/DeviceMaintainPlanService.java new file mode 100644 index 0000000..481d4c0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainplan/DeviceMaintainPlanService.java @@ -0,0 +1,106 @@ +package com.win.module.eam.service.devicemaintainplan; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintainplan.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintainplan.DeviceMaintainPlanDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 保养计划 Service 接口 + * + * @author 超级管理员 + */ +public interface DeviceMaintainPlanService { + + /** + * 创建保养计划 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintainPlan(@Valid DeviceMaintainPlanCreateReqVO createReqVO); + + /** + * 更新保养计划 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceMaintainPlan(@Valid DeviceMaintainPlanUpdateReqVO updateReqVO); + + /** + * 删除保养计划 + * + * @param id 编号 + */ + Integer deleteDeviceMaintainPlan(Long id); + + /** + * 获得保养计划 + * + * @param id 编号 + * @return 保养计划 + */ + DeviceMaintainPlanDO getDeviceMaintainPlan(Long id); + + /** + * 获得保养计划列表 + * + * @param ids 编号 + * @return 保养计划列表 + */ + List getDeviceMaintainPlanList(Collection ids); + + /** + * 获得保养计划分页 + * + * @param pageReqVO 分页查询 + * @return 保养计划分页 + */ + PageResult getDeviceMaintainPlanPage(DeviceMaintainPlanPageReqVO pageReqVO); + + + /** + * 获得保养计划分页 + * + * @param conditions 分页查询 + * @return 保养计划分页 + */ + PageResult getDeviceMaintainPlanSenior(CustomConditions conditions); + + /** + * 获得保养计划列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 保养计划列表 + */ + List getDeviceMaintainPlanList(DeviceMaintainPlanExportReqVO exportReqVO); + + /** + * 导入保养计划主信息 + * + * @param datas 导入保养计划主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceMaintainPlanList(List datas, Integer mode, boolean updatePart); + + + /** + * 获得保养计划不分页 + * + * @param pageReqVO 分页查询 + * @return 保养计划分页 + */ + List getDeviceMaintainPlanNoPage(DeviceMaintainPlanPageReqVO pageReqVO); + + + public void createMaintainPlanTask(); + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainplan/DeviceMaintainPlanServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainplan/DeviceMaintainPlanServiceImpl.java new file mode 100644 index 0000000..6f5502a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintainplan/DeviceMaintainPlanServiceImpl.java @@ -0,0 +1,644 @@ +package com.win.module.eam.service.devicemaintainplan; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintainplan.vo.*; +import com.win.module.eam.convert.devicemaintainplan.DeviceMaintainPlanConvert; +import com.win.module.eam.dal.dataobject.classtype.ClassTypeDO; +import com.win.module.eam.dal.dataobject.deviceaccounts.DeviceAccountsDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobDetailDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintainplan.DeviceMaintainPlanDO; +import com.win.module.eam.dal.dataobject.devicemolditems.DeviceMoldItemsDO; +import com.win.module.eam.dal.dataobject.moldaccounts.MoldAccountsDO; +import com.win.module.eam.dal.dataobject.moldaccounts.MoldAccountsDOExpand; +import com.win.module.eam.dal.mysql.classtype.ClassTypeMapper; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.devicemaintainjob.DeviceMaintainJobDetailMapper; +import com.win.module.eam.dal.mysql.devicemaintainjob.DeviceMaintainJobMainMapper; +import com.win.module.eam.dal.mysql.devicemaintainplan.DeviceMaintainPlanMapper; +import com.win.module.eam.dal.mysql.devicemolditems.DeviceMoldItemsMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.enums.ErrorCodeConstants; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import com.win.module.eam.enums.order.*; +import com.win.module.eam.service.moldaccounts.MoldAccountsService; +import com.win.module.infra.api.config.ApiConfigApi; +import com.win.module.infra.api.config.dto.ConfigDTO; +import com.win.module.system.api.dept.DeptApi; +import com.win.module.system.api.mail.MailSendApi; +import com.win.module.system.api.mail.dto.MailSendSingleToUserReqDTO; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.Month; +import java.time.format.TextStyle; +import java.time.temporal.TemporalAdjusters; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +import static cn.hutool.log.StaticLog.info; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * 保养计划 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class DeviceMaintainPlanServiceImpl implements DeviceMaintainPlanService { + + @Resource + private DeviceMaintainPlanMapper deviceMaintainPlanMapper; + @Resource + private MoldAccountsService moldAccountsService; + + @Resource + private DeviceMaintainJobMainMapper deviceMaintainJobMainMapper; + + @Resource + private DeviceMaintainJobDetailMapper deviceMaintainJobDetailMapper; + + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + + @Resource + private MoldAccountsMapper moldAccountsMapper; + + @Resource + private DeviceMoldItemsMapper deviceMoldItemsMapper; + + @Resource + private SerialNumberApi serialNumberApi; + + @Resource + private ApiConfigApi apiConfigApi; + + @Resource + private MailSendApi mailSendApi; + + @Resource + private AdminUserApi adminUserApi; + + @Resource + private DeptApi deptApi; + + @Resource + private ClassTypeMapper classTypeMapper; + + public static final String BEFORE_DAYS = "biz.maintainorder.beforedays"; + public static final String NO_DELETED = "0"; + + + public static final String EXECUTE_PERIOD_MONTH = "第%s个月"; + public static final String EXECUTE_PERIOD_QUARTER = "第%s季度"; + public static final String EXECUTE_PERIOD_YEAR = "%s年"; + public static final String EXECUTE_PERIOD_WEAR = "%s次数保养"; + public static final String EXECUTE_PERIOD_HALF_YEAR_ABOVE = "上半年"; + public static final String EXECUTE_PERIOD_HALF_YEAR_BELOW = "下半年"; + public static final String WEAR_FREQUENCY_THRESHOLD = "biz.maintainorder.times"; + + @Override + public Long createDeviceMaintainPlan(DeviceMaintainPlanCreateReqVO createReqVO) { + // 插入 + DeviceMaintainPlanDO deviceMaintainPlan = DeviceMaintainPlanConvert.INSTANCE.convert(createReqVO); + deviceMaintainPlanMapper.insert(deviceMaintainPlan); + // 返回 + return deviceMaintainPlan.getId(); + } + + @Override + public Integer updateDeviceMaintainPlan(DeviceMaintainPlanUpdateReqVO updateReqVO) { + // 校验存在 + //validateDeviceMaintainPlanExists(updateReqVO.getId()); + // 更新 + DeviceMaintainPlanDO updateObj = DeviceMaintainPlanConvert.INSTANCE.convert(updateReqVO); + return deviceMaintainPlanMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceMaintainPlan(Long id) { + // 校验存在 + validateDeviceMaintainPlanExists(id); + // 删除 + return deviceMaintainPlanMapper.deleteById(id); + } + + private void validateDeviceMaintainPlanExists(Long id) { + if (deviceMaintainPlanMapper.selectById(id) == null) { + // throw exception(DEVICE_MAINTAIN_PLAN_NOT_EXISTS); + } + } + + @Override + public DeviceMaintainPlanDO getDeviceMaintainPlan(Long id) { + return deviceMaintainPlanMapper.selectById(id); + } + + @Override + public List getDeviceMaintainPlanList(Collection ids) { + return deviceMaintainPlanMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceMaintainPlanPage(DeviceMaintainPlanPageReqVO pageReqVO) { + return deviceMaintainPlanMapper.selectPage(pageReqVO); + } + + + @Override + public PageResult getDeviceMaintainPlanSenior(CustomConditions conditions) { + return deviceMaintainPlanMapper.selectSenior(conditions); + } + + + @Override + public List getDeviceMaintainPlanList(DeviceMaintainPlanExportReqVO exportReqVO) { + return deviceMaintainPlanMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceMaintainPlanList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_MAINTAIN_PLAN_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceMaintainPlanDO obj = deviceMaintainPlanMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceMaintainPlanMapper.insert(DeviceMaintainPlanConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceMaintainPlanDO deviceMaintainPlanDO = DeviceMaintainPlanConvert.INSTANCE.convert(item); +// deviceMaintainPlanDO.setId(obj.getId()); +// deviceMaintainPlanMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + + @Override + public List getDeviceMaintainPlanNoPage(DeviceMaintainPlanPageReqVO pageReqVO) { + return deviceMaintainPlanMapper.selectNoPage(pageReqVO); + } + + + @Override + public void createMaintainPlanTask() { + DeviceMaintainPlanPageReqVO pageReqVO = new DeviceMaintainPlanPageReqVO(); + pageReqVO.setDeleted(NO_DELETED); + List deviceMaintainPlanDOS = deviceMaintainPlanMapper.selectNoPage(pageReqVO); + executeByPriority(deviceMaintainPlanDOS); + } + + + public void executeByPriority(List deviceMaintainPlanDOS) { + Map> groupedPlans = new LinkedHashMap<>(); + + // 筛选出getCycle()为null的项 + List cycleIsNullList = deviceMaintainPlanDOS.stream() + .filter(plan -> plan.getCycle() == null) + .collect(Collectors.toList()); + + // 筛选出getCycle()不为null的项,重新赋值给deviceMaintainPlanDOS + deviceMaintainPlanDOS = deviceMaintainPlanDOS.stream() + .filter(plan -> plan.getCycle() != null) + .collect(Collectors.toList()); + + // 按照枚举定义的顺序创建分组 + for (PeriodTypeEnum period : PeriodTypeEnum.values()) { + groupedPlans.put(period.getCode(), new ArrayList<>()); + } + + // 将deviceMaintainPlanDOS按照cycle字段放入相应的分组中 + for (DeviceMaintainPlanDO plan : deviceMaintainPlanDOS) { + String cycle = plan.getCycle(); + if (groupedPlans.containsKey(cycle)) { + groupedPlans.get(cycle).add(plan); + } + } + + // 处理分组结果,按照枚举顺序 + Map highestPriorityPlans = new HashMap<>(); + for (Map.Entry> entry : groupedPlans.entrySet()) { + String cycle = entry.getKey(); + List plans = entry.getValue(); + System.out.println("Cycle: " + cycle); + // 按照deviceNumber分组并保留优先级最高的可执行的记录 + for (DeviceMaintainPlanDO plan : plans) { + Map result = isTimeToCreateOrder(plan); + if ((boolean) result.get("isTimeToCreateOrder")) { + String deviceNumber = plan.getDeviceNumber(); + if (!highestPriorityPlans.containsKey(deviceNumber)) { + highestPriorityPlans.put(deviceNumber, plan); + } + } + } + } + + // 执行优先级最高的可执行计划 + for (Map.Entry entry : highestPriorityPlans.entrySet()) { + String deviceNumber = entry.getKey(); + DeviceMaintainPlanDO plan = entry.getValue(); + execute(plan); + } + + //涂装的保养工单处理 + executeTzNow(cycleIsNullList); + + //发送邮件 + try { + sendEmails(); + } catch (Exception e) { + info("发送邮件异常:{}",e); + } + } + + public void execute(DeviceMaintainPlanDO plan) { + try{ + DeviceAccountsDO deviceAccountsDO = null; + MoldAccountsDO moldAccountsDO = null; + if(BasicStatusEnum.BASIC_DEVICE.getCode().equals(plan.getType())){ + deviceAccountsDO = deviceAccountsMapper.getDetailsEntryByNumber(plan.getDeviceNumber()); + } else if (BasicStatusEnum.BASIC_MOLD.getCode().equals(plan.getType())) { + moldAccountsDO = moldAccountsMapper.getMoldDetailsEntryByNumber(plan.getDeviceNumber()); + } + // 可以使用 plan 对象进行操作 + Map isToExcutePlanMap = isTimeToCreateOrder(plan); + if (isToExcutePlanMap.get("isTimeToCreateOrder") != null && (boolean) isToExcutePlanMap.get("isTimeToCreateOrder")) { + // 执行计划 + // 组装入参 + LocalDateTime now = LocalDateTime.now(); + String number = serialNumberApi.generateCode(RuleCodeEnum.BAO_YANG_ORDER.getCode()); + DeviceMaintainJobMainDO deviceMaintainJobMainDO = new DeviceMaintainJobMainDO(); + deviceMaintainJobMainDO.setNumber(number); + deviceMaintainJobMainDO.setPlanNumber(plan.getNumber()); + deviceMaintainJobMainDO.setDeviceNumber(plan.getDeviceNumber()); + deviceMaintainJobMainDO.setExecutePeriod(String.valueOf(isToExcutePlanMap.get("executePeriod"))); + deviceMaintainJobMainDO.setFaultType(FaultTypeEnum.PM.getCode()); + deviceMaintainJobMainDO.setType(plan.getType()); + deviceMaintainJobMainDO.setDescribes(plan.getName()); + deviceMaintainJobMainDO.setDeptId(plan.getDeptId()); + deviceMaintainJobMainDO.setStatus(OrderStatusEnum.PEND_ORDER_STATUS.getCode()); + deviceMaintainJobMainDO.setCreateTime(now); + deviceMaintainJobMainDO.setCreator(String.valueOf(getLoginUserId())); + deviceMaintainJobMainDO.setUpdateTime(now); + deviceMaintainJobMainDO.setCycle(plan.getCycle()); + deviceMaintainJobMainDO.setCycleMonth(plan.getCycleMonth()); + deviceMaintainJobMainDO.setCycleWeek(plan.getCycleWeek()); + deviceMaintainJobMainDO.setUpdater(String.valueOf(getLoginUserId())); + if(BasicStatusEnum.BASIC_DEVICE.getCode().equals(plan.getType())){ + deviceMaintainJobMainDO.setFactoryAreaNumber(deviceAccountsDO.getFactoryAreaNumber()); + } else if (BasicStatusEnum.BASIC_MOLD.getCode().equals(plan.getType())) { + deviceMaintainJobMainDO.setFactoryAreaNumber(moldAccountsDO.getFactoryAreaNumber()); + } + DeviceMoldItemsDO deviceMoldItemsDO = new DeviceMoldItemsDO(); + deviceMoldItemsDO.setDeviceNumber(plan.getDeviceNumber()); + deviceMoldItemsDO.setExecutionCycle(plan.getCycle()); + deviceMoldItemsDO.setExecutionCycleMonth(plan.getCycleMonth()); + deviceMoldItemsDO.setExecutionCycleWeek(plan.getCycleWeek()); + List deviceMoldItemsDOList = deviceMoldItemsMapper.selectListByDeviceNumberAndPeriod(deviceMoldItemsDO); + if(deviceMoldItemsDOList == null || deviceMoldItemsDOList.size() == 0){ + throw new RuntimeException("设备编号为"+plan.getDeviceNumber()+"的设备没有维护项信息"); + }else{ + //工单主表维护 + deviceMaintainJobMainMapper.insert(deviceMaintainJobMainDO); + List deviceMaintainJobDetailDOList = new ArrayList<>(); + deviceMoldItemsDOList.stream().forEach(item ->{ + DeviceMaintainJobDetailDO deviceMaintainJobDetailDO = new DeviceMaintainJobDetailDO(); + deviceMaintainJobDetailDO.setNumber(deviceMaintainJobMainDO.getNumber()); + deviceMaintainJobDetailDO.setMasterId(deviceMaintainJobMainDO.getId()); + deviceMaintainJobDetailDO.setStatus("1"); + deviceMaintainJobDetailDO.setContents(item.getName()); + deviceMaintainJobDetailDO.setEquipmentParts(item.getEquipmentParts()); + deviceMaintainJobDetailDO.setPeoples(item.getPeoples()); + deviceMaintainJobDetailDO.setEstimatedMinutes(item.getEstimatedMinutes()); + deviceMaintainJobDetailDO.setCreateTime(now); + deviceMaintainJobDetailDO.setCreator(String.valueOf(getLoginUserId())); + deviceMaintainJobDetailDO.setUpdateTime(now); + deviceMaintainJobDetailDO.setUpdater(String.valueOf(getLoginUserId())); + deviceMaintainJobDetailDOList.add(deviceMaintainJobDetailDO); + }); + //工单子表维护 + deviceMaintainJobDetailMapper.insertBatch(deviceMaintainJobDetailDOList); + Boolean isTime = false; + Object isTimeObj = isToExcutePlanMap.get("isTime"); + if(isTimeObj != null && isTimeObj instanceof Boolean){ + isTime = Boolean.valueOf(isTimeObj.toString()); + } + if(isTime){ + if (BasicStatusEnum.BASIC_MOLD.getCode().equals(plan.getType())) { + MoldAccountsDO moldAccountsDOUpdate = moldAccountsMapper.selectById(moldAccountsDO.getId()); + moldAccountsDOUpdate.setFrequency(0L); + moldAccountsMapper.updateById(moldAccountsDOUpdate); + } + deviceAccountsMapper.getDetailsEntryByNumber(deviceMaintainJobMainDO.getDeviceNumber()); + } + } + } + }catch(RuntimeException ex){ + info("保养计划工单生成失败:{}",ex); + } + } + + + public Map isTimeToCreateOrder(DeviceMaintainPlanDO plan) { + Map result = new HashMap<>(); + result.put("isTimeToCreateOrder", false); + result.put("isTime", false); + Map timeJubgeRecords = new ConcurrentHashMap<>(); + ConfigDTO configDTO = apiConfigApi.getConfigByKey(BEFORE_DAYS); + ConfigDTO configTimeDTO = apiConfigApi.getConfigByKey(WEAR_FREQUENCY_THRESHOLD); + if(configDTO == null){ + throw new RuntimeException(ErrorCodeConstants.INFRA_CONFIG_NOT_EXIST.getMsg()); + } + int beforeDays = Integer.parseInt(configDTO.getValue()); + LocalDate today = LocalDate.now(); + if (PeriodTypeEnum.MONTH.getCode().equals(plan.getCycle())) { + if (OrderNextPeriodDataEnum.MONTH.isPeriodDate(today.plusDays(beforeDays))) { + result.put("isTimeToCreateOrder", true); + result.put("executePeriod", String.format(EXECUTE_PERIOD_MONTH, today.plusDays(beforeDays).getMonthValue())); + } + } else if (PeriodTypeEnum.QUARTER.getCode().equals(plan.getCycle())) { + if (OrderNextPeriodDataEnum.QUARTER.isPeriodDate(today.plusDays(beforeDays))) { + result.put("isTimeToCreateOrder", true); + result.put("executePeriod", String.format(EXECUTE_PERIOD_QUARTER, (today.plusDays(beforeDays).getMonthValue() - 1) / 3 + 1)); + } + } else if (PeriodTypeEnum.HALF_YEAR.getCode().equals(plan.getCycle())) { + if (OrderNextPeriodDataEnum.HALF_YEAR.isPeriodDate(today.plusDays(beforeDays))) { + result.put("isTimeToCreateOrder", true); + int futureMonth = today.plusDays(beforeDays).getMonthValue(); + if (futureMonth >= Month.JANUARY.getValue() && futureMonth <= Month.JUNE.getValue()) { + result.put("executePeriod", EXECUTE_PERIOD_HALF_YEAR_ABOVE); + } else if (futureMonth >= Month.JULY.getValue() && futureMonth <= Month.DECEMBER.getValue()) { + result.put("executePeriod", EXECUTE_PERIOD_HALF_YEAR_BELOW); + } + } + } else if (PeriodTypeEnum.YEAR.getCode().equals(plan.getCycle())) { + if (OrderNextPeriodDataEnum.YEAR.isPeriodDate(today.plusDays(beforeDays))) { + result.put("isTimeToCreateOrder", true); + result.put("executePeriod", String.format(EXECUTE_PERIOD_YEAR, today.plusDays(beforeDays).getYear())); + } + } else if(PeriodTypeEnum.COUNT.getCode().equals(plan.getCycle())){ + if(timeJubgeRecords.get(plan.getDeviceNumber()) != null && timeJubgeRecords.get(plan.getDeviceNumber())){ + result.put("isTimeToCreateOrder", false); + }else{ + timeJubgeRecords.put(plan.getDeviceNumber(), true); + MoldAccountsDOExpand moldAccountsDOExpand = moldAccountsService.getDetailsEntryByNumber(plan.getDeviceNumber()); + if (moldAccountsDOExpand != null && moldAccountsDOExpand.getFrequency() != null) { + if (moldAccountsDOExpand.getFrequency() > Long.valueOf(configTimeDTO.getValue())) { + result.put("isTimeToCreateOrder", true); + result.put("isTime", true); + result.put("executePeriod", String.format(EXECUTE_PERIOD_WEAR, moldAccountsDOExpand.getFrequency())); + } + } + } + } + return result; + } + + /** + * 定时根据保养计划生成保养工单给所属厂区工程师发送邮件 + */ + private void sendEmails() { + String times = LocalDateTimeUtil.format(LocalDate.now(), "yyyy-MM-dd"); + String year = LocalDateTimeUtil.format(LocalDate.now(), "yyyy"); + List> list2 = deptApi.selectAllFactoryArea(); + for (Map map : list2) { + // 如果Map中已存在该键,则添加 + String factoryAreaNumber = map.get("id").toString(); + List deviceList = deviceMaintainJobMainMapper.selectList2(times, factoryAreaNumber, BasicStatusEnum.BASIC_DEVICE.getCode(),OrderStatusEnum.PEND_ORDER_STATUS.getCode());//设备 + List moldList = deviceMaintainJobMainMapper.selectList2(times, factoryAreaNumber, BasicStatusEnum.BASIC_MOLD.getCode(),OrderStatusEnum.PEND_ORDER_STATUS.getCode());//模具 + StringBuilder str = new StringBuilder();//设备 + str.append(year); + str.append("年"); + StringBuilder str1 = new StringBuilder();//模具非保养次数 + str1.append(year); + str1.append("年"); + for (DeviceMaintainJobMainDO en : deviceList) { + String deviceNumber = en.getDeviceNumber(); + String typeName = "

   设备保养工单

"; + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber == null ? "" : detailsByNumber.get("name").toString()); + String executePeriod = en.getExecutePeriod(); + str.append(typeName); + str.append("

   "); + str.append(executePeriod); + str.append("设备名称("); + str.append(en.getName()); + str.append(") "); + str.append("设备号("); + str.append(en.getDeviceNumber()); + str.append(")

"); + } + + for (DeviceMaintainJobMainDO en : moldList) { + String deviceNumber = en.getDeviceNumber(); + String cycle = en.getCycle(); + String typeName = "

   模具执行周期保养工单

"; + if("count".equals(cycle)){//达到模具保养次数 + typeName = "

   模具到达次数保养工单

"; + } + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber == null ? "" : detailsByNumber.get("name").toString()); + String executePeriod = en.getExecutePeriod(); + str1.append(typeName); + str1.append("

   "); + str1.append(executePeriod); + str1.append("模具名称("); + str1.append(en.getName()); + str1.append(") "); + str1.append("模具号("); + str1.append(en.getDeviceNumber()); + str1.append(")

"); + } + if (!deviceList.isEmpty()) { + List userBeanList = classTypeMapper.JudgeIdentity(null, "DEVICE", "1", factoryAreaNumber); + userBeanList.stream().forEach(item -> { + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getUserId())); + mailSendSingleToUserReqDTO.setTemplateCode("job-maintain-template"); + Map params = new HashMap<>(); + params.put("str", str); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + } catch (RuntimeException e) { + info("保养工单发送的邮件通知失败:{}", e); + } + }); + } + if (!moldList.isEmpty()) { + List userBeanList1 = classTypeMapper.JudgeIdentity(null, "MOLD", "1", factoryAreaNumber); + userBeanList1.stream().forEach(item -> { + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getUserId())); + mailSendSingleToUserReqDTO.setTemplateCode("job-maintain-template"); + Map params = new HashMap<>(); + params.put("str", str1); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + } catch (RuntimeException e) { + info("保养工单发送的邮件通知失败:{}", e); + } + }); + } + + } + } + + + public Map tzIsDateMatching(String cycleMonthName, String cycleWeekName, int beforeDays) { + Map result = new HashMap<>(); + result.put("isTimeToCreateOrder", false); + result.put("isTime", false); + result.put("executePeriod", ""); + LocalDate targetDate = LocalDate.now().plusDays(beforeDays); + + // 获取目标月份的英文大写 + String targetMonthName = targetDate.getMonth().getDisplayName(TextStyle.FULL, Locale.US); + + // 计算目标日期所在周次 + LocalDate firstDayOfMonth = targetDate.with(TemporalAdjusters.firstDayOfMonth()); + int weekNumberOfMonth = (targetDate.getDayOfMonth() + DayOfWeek.from(firstDayOfMonth).getValue() - 1) / 7 + 1; + + // 使用枚举类匹配 + MonthEnum monthEnum = MonthEnum.fromName(targetMonthName); + String targetWeekCode = String.valueOf(weekNumberOfMonth); + + if (monthEnum.getName().equals(cycleMonthName) && + WeekEnum.fromName(cycleWeekName).getCode().equals(targetWeekCode)) { + result.put("isTimeToCreateOrder", true); + result.put("isTime", true); // Assuming you want to set this to true when conditions match + + // 获取中文的“第几周”信息 + WeekEnum weekEnum = WeekEnum.fromName(cycleWeekName); + String weekChineseName = weekEnum.getChineseName(); + + // 设置执行周期为月份和周次的中文名称 + result.put("executePeriod", monthEnum.getChineseName() + " " + weekChineseName); + } + return result; + } + + + public void executeTzNow(List cycleIsNullList) { + ConfigDTO configDTO = apiConfigApi.getConfigByKey(BEFORE_DAYS); + if(configDTO == null){ + throw new RuntimeException(ErrorCodeConstants.INFRA_CONFIG_NOT_EXIST.getMsg()); + } + int beforeDays = Integer.parseInt(configDTO.getValue()); + for (DeviceMaintainPlanDO plan : cycleIsNullList) { + Map result = tzIsDateMatching(plan.getCycleMonth(), plan.getCycleWeek(), beforeDays); + if ((Boolean) result.get("isTimeToCreateOrder")) { + executeTz(plan,result); // 假设这个方法接受一个DeviceMaintainPlanDO类型的参数 + } + } + } + + public void executeTz(DeviceMaintainPlanDO plan, Map isToExcutePlanMap) { + try{ + DeviceAccountsDO deviceAccountsDO = null; + MoldAccountsDO moldAccountsDO = null; + if(BasicStatusEnum.BASIC_DEVICE.getCode().equals(plan.getType())){ + deviceAccountsDO = deviceAccountsMapper.getDetailsEntryByNumber(plan.getDeviceNumber()); + } else if (BasicStatusEnum.BASIC_MOLD.getCode().equals(plan.getType())) { + moldAccountsDO = moldAccountsMapper.getMoldDetailsEntryByNumber(plan.getDeviceNumber()); + } + // 执行计划 + // 组装入参 + LocalDateTime now = LocalDateTime.now(); + String number = serialNumberApi.generateCode(RuleCodeEnum.BAO_YANG_ORDER.getCode()); + DeviceMaintainJobMainDO deviceMaintainJobMainDO = new DeviceMaintainJobMainDO(); + deviceMaintainJobMainDO.setNumber(number); + deviceMaintainJobMainDO.setPlanNumber(plan.getNumber()); + deviceMaintainJobMainDO.setDeviceNumber(plan.getDeviceNumber()); + deviceMaintainJobMainDO.setExecutePeriod(String.valueOf(isToExcutePlanMap.get("executePeriod"))); + deviceMaintainJobMainDO.setFaultType(FaultTypeEnum.PM.getCode()); + deviceMaintainJobMainDO.setType(plan.getType()); + deviceMaintainJobMainDO.setDescribes(plan.getName()); + deviceMaintainJobMainDO.setDeptId(plan.getDeptId()); + deviceMaintainJobMainDO.setStatus(OrderStatusEnum.PEND_ORDER_STATUS.getCode()); + deviceMaintainJobMainDO.setCreateTime(now); + deviceMaintainJobMainDO.setCreator(String.valueOf(getLoginUserId())); + deviceMaintainJobMainDO.setUpdateTime(now); + deviceMaintainJobMainDO.setCycle(plan.getCycle()); + deviceMaintainJobMainDO.setCycleMonth(plan.getCycleMonth()); + deviceMaintainJobMainDO.setCycleWeek(plan.getCycleWeek()); + deviceMaintainJobMainDO.setUpdater(String.valueOf(getLoginUserId())); + if(BasicStatusEnum.BASIC_DEVICE.getCode().equals(plan.getType())){ + deviceMaintainJobMainDO.setFactoryAreaNumber(deviceAccountsDO.getFactoryAreaNumber()); + } else if (BasicStatusEnum.BASIC_MOLD.getCode().equals(plan.getType())) { + deviceMaintainJobMainDO.setFactoryAreaNumber(moldAccountsDO.getFactoryAreaNumber()); + } + DeviceMoldItemsDO deviceMoldItemsDO = new DeviceMoldItemsDO(); + deviceMoldItemsDO.setDeviceNumber(plan.getDeviceNumber()); + deviceMoldItemsDO.setExecutionCycle(plan.getCycle()); + deviceMoldItemsDO.setExecutionCycleMonth(plan.getCycleMonth()); + deviceMoldItemsDO.setExecutionCycleWeek(plan.getCycleWeek()); + List deviceMoldItemsDOList = deviceMoldItemsMapper.selectListByDeviceNumberAndPeriod(deviceMoldItemsDO); + if(deviceMoldItemsDOList == null || deviceMoldItemsDOList.size() == 0){ + throw new RuntimeException("设备编号为"+plan.getDeviceNumber()+"的设备没有维护项信息"); + }else{ + //工单主表维护 + deviceMaintainJobMainMapper.insert(deviceMaintainJobMainDO); + List deviceMaintainJobDetailDOList = new ArrayList<>(); + deviceMoldItemsDOList.stream().forEach(item ->{ + DeviceMaintainJobDetailDO deviceMaintainJobDetailDO = new DeviceMaintainJobDetailDO(); + deviceMaintainJobDetailDO.setNumber(deviceMaintainJobMainDO.getNumber()); + deviceMaintainJobDetailDO.setMasterId(deviceMaintainJobMainDO.getId()); + deviceMaintainJobDetailDO.setStatus("1"); + deviceMaintainJobDetailDO.setContents(item.getName()); + deviceMaintainJobDetailDO.setEquipmentParts(item.getEquipmentParts()); + deviceMaintainJobDetailDO.setPeoples(item.getPeoples()); + deviceMaintainJobDetailDO.setEstimatedMinutes(item.getEstimatedMinutes()); + deviceMaintainJobDetailDO.setCreateTime(now); + deviceMaintainJobDetailDO.setCreator(String.valueOf(getLoginUserId())); + deviceMaintainJobDetailDO.setUpdateTime(now); + deviceMaintainJobDetailDO.setUpdater(String.valueOf(getLoginUserId())); + deviceMaintainJobDetailDOList.add(deviceMaintainJobDetailDO); + }); + //工单子表维护 + deviceMaintainJobDetailMapper.insertBatch(deviceMaintainJobDetailDOList); + Boolean isTime = false; + Object isTimeObj = isToExcutePlanMap.get("isTime"); + if(isTimeObj != null && isTimeObj instanceof Boolean){ + isTime = Boolean.valueOf(isTimeObj.toString()); + } + if(isTime){ + if (BasicStatusEnum.BASIC_MOLD.getCode().equals(plan.getType())) { + MoldAccountsDO moldAccountsDOUpdate = moldAccountsMapper.selectById(moldAccountsDO.getId()); + moldAccountsDOUpdate.setFrequency(0L); + moldAccountsMapper.updateById(moldAccountsDOUpdate); + } + deviceAccountsMapper.getDetailsEntryByNumber(deviceMaintainJobMainDO.getDeviceNumber()); + } + } + }catch(RuntimeException ex){ + info("保养计划工单生成失败:{}",ex); + } + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobDetailItemService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobDetailItemService.java new file mode 100644 index 0000000..5437448 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobDetailItemService.java @@ -0,0 +1,87 @@ +package com.win.module.eam.service.devicemaintenancejob; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailItemDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 维修工单子表与备件关系 Service 接口 + * + * @author 超级管理员 + */ +public interface DeviceMaintenanceJobDetailItemService { + + /** + * 创建维修工单子表与备件关系 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintenanceDetailItem(@Valid DeviceMaintenanceJobDetailItemCreateReqVO createReqVO); + + /** + * 更新维修工单子表与备件关系 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceMaintenanceDetailItem(@Valid DeviceMaintenanceJobDetailItemUpdateReqVO updateReqVO); + + /** + * 删除维修工单子表与备件关系 + * + * @param id 编号 + */ + Integer deleteDeviceMaintenanceDetailItem(Long id); + + /** + * 获得维修工单子表与备件关系 + * + * @param id 编号 + * @return 维修工单子表与备件关系 + */ + DeviceMaintenanceJobDetailItemDO getDeviceMaintenanceDetailItem(Long id); + + /** + * 获得维修工单子表与备件关系列表 + * + * @param ids 编号 + * @return 维修工单子表与备件关系列表 + */ + List getDeviceMaintenanceDetailItemList(Collection ids); + + /** + * 获得维修工单子表与备件关系分页 + * + * @param pageReqVO 分页查询 + * @return 维修工单子表与备件关系分页 + */ + PageResult getDeviceMaintenanceDetailItemPage(DeviceMaintenanceJobDetailItemPageReqVO pageReqVO); + + /** + * 获得维修工单子表与备件关系列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 维修工单子表与备件关系列表 + */ + List getDeviceMaintenanceDetailItemList(DeviceMaintenanceJobDetailItemExportReqVO exportReqVO); + + /** + * 导入维修工单子表与备件关系主信息 + * + * @param datas 导入维修工单子表与备件关系主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceMaintenanceDetailItemList(List datas, Integer mode, boolean updatePart); + + /** + * 根据维修工单子项id获取备件列表 + * @param maintenanceDetailId + * @return + */ + List> selectListById(Long maintenanceDetailId); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobDetailItemServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobDetailItemServiceImpl.java new file mode 100644 index 0000000..756fd17 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobDetailItemServiceImpl.java @@ -0,0 +1,112 @@ +package com.win.module.eam.service.devicemaintenancejob; + +import cn.hutool.core.collection.CollUtil; +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailItemDO; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobDetailItemConvert; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailItemMapper; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * 维修工单子表与备件关系 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class DeviceMaintenanceJobDetailItemServiceImpl implements DeviceMaintenanceJobDetailItemService { + + @Resource + private DeviceMaintenanceJobDetailItemMapper deviceMaintenanceJobDetailItemMapper; + + @Override + public Long createDeviceMaintenanceDetailItem(DeviceMaintenanceJobDetailItemCreateReqVO createReqVO) { + // 插入 + DeviceMaintenanceJobDetailItemDO deviceMaintenanceDetailItem = DeviceMaintenanceJobDetailItemConvert.INSTANCE.convert(createReqVO); + deviceMaintenanceJobDetailItemMapper.insert(deviceMaintenanceDetailItem); + // 返回 + return deviceMaintenanceDetailItem.getId(); + } + + @Override + public Integer updateDeviceMaintenanceDetailItem(DeviceMaintenanceJobDetailItemUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceMaintenanceDetailItemExists(updateReqVO.getId()); + // 更新 + DeviceMaintenanceJobDetailItemDO updateObj = DeviceMaintenanceJobDetailItemConvert.INSTANCE.convert(updateReqVO); + return deviceMaintenanceJobDetailItemMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceMaintenanceDetailItem(Long id) { + // 校验存在 + validateDeviceMaintenanceDetailItemExists(id); + // 删除 + return deviceMaintenanceJobDetailItemMapper.deleteById(id); + } + + private void validateDeviceMaintenanceDetailItemExists(Long id) { + if (deviceMaintenanceJobDetailItemMapper.selectById(id) == null) { + //throw exception(DEVICE_MAINTENANCE_DETAIL_ITEM_NOT_EXISTS); + } + } + + @Override + public DeviceMaintenanceJobDetailItemDO getDeviceMaintenanceDetailItem(Long id) { + return deviceMaintenanceJobDetailItemMapper.selectById(id); + } + + @Override + public List getDeviceMaintenanceDetailItemList(Collection ids) { + return deviceMaintenanceJobDetailItemMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceMaintenanceDetailItemPage(DeviceMaintenanceJobDetailItemPageReqVO pageReqVO) { + return deviceMaintenanceJobDetailItemMapper.selectPage(pageReqVO); + } + + @Override + public List getDeviceMaintenanceDetailItemList(DeviceMaintenanceJobDetailItemExportReqVO exportReqVO) { + return deviceMaintenanceJobDetailItemMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceMaintenanceDetailItemList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_MAINTENANCE_DETAIL_ITEM_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceMaintenanceDetailItemDO obj = deviceMaintenanceDetailItemMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceMaintenanceDetailItemMapper.insert(DeviceMaintenanceDetailItemConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceMaintenanceDetailItemDO deviceMaintenanceDetailItemDO = DeviceMaintenanceDetailItemConvert.INSTANCE.convert(item); +// deviceMaintenanceDetailItemDO.setId(obj.getId()); +// deviceMaintenanceDetailItemMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public List> selectListById(Long maintenanceDetailId) { + return deviceMaintenanceJobDetailItemMapper.selectListById(maintenanceDetailId); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobDetailService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobDetailService.java new file mode 100644 index 0000000..a937734 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobDetailService.java @@ -0,0 +1,88 @@ +package com.win.module.eam.service.devicemaintenancejob; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailDO; + +/** + * 维修工单子 Service 接口 + * + * @author 超级管理员 + */ +public interface DeviceMaintenanceJobDetailService { + + /** + * 创建维修工单子 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintenanceDetail(@Valid DeviceMaintenanceJobDetailCreateReqVO createReqVO); + + /** + * 更新维修工单子 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceMaintenanceDetail(@Valid DeviceMaintenanceJobDetailUpdateReqVO updateReqVO); + + /** + * 删除维修工单子 + * + * @param id 编号 + */ + Integer deleteDeviceMaintenanceDetail(Long id); + + /** + * 获得维修工单子 + * + * @param id 编号 + * @return 维修工单子 + */ + DeviceMaintenanceJobDetailDO getDeviceMaintenanceDetail(Long id); + + /** + * 获得维修工单子列表 + * + * @param ids 编号 + * @return 维修工单子列表 + */ + List getDeviceMaintenanceDetailList(Collection ids); + + /** + * 根据维修工单号查询工单子项列表信息 + * @param number + * @return + */ + List selectListByNumber(String number); + + /** + * 获得维修工单子分页 + * + * @param pageReqVO 分页查询 + * @return 维修工单子分页 + */ + PageResult getDeviceMaintenanceDetailPage(DeviceMaintenanceJobDetailPageReqVO pageReqVO); + + + /** + * 获得维修工单子列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 维修工单子列表 + */ + List getDeviceMaintenanceDetailList(DeviceMaintenanceJobDetailExportReqVO exportReqVO); + + /** + * 导入维修工单子主信息 + * + * @param datas 导入维修工单子主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceMaintenanceDetailList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobDetailServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobDetailServiceImpl.java new file mode 100644 index 0000000..76ea2d0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobDetailServiceImpl.java @@ -0,0 +1,253 @@ +package com.win.module.eam.service.devicemaintenancejob; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobDetailConvert; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailItemDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailItemMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobMainMapper; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +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.module.eam.enums.ErrorCodeConstants.*; + +/** + * 维修工单子 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class DeviceMaintenanceJobDetailServiceImpl implements DeviceMaintenanceJobDetailService { + + @Resource + private AdminUserApi userApi; + @Resource + private DeviceMaintenanceJobDetailMapper deviceMaintenanceJobDetailMapper; + + @Resource + private DeviceMaintenanceJobMainMapper deviceMaintenanceJobMainMapper; + @Resource + DeviceMaintenanceJobDetailItemMapper deviceMaintenanceJobDetailItemMapper; + + @Resource + ItemMapper itemMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDeviceMaintenanceDetail(DeviceMaintenanceJobDetailCreateReqVO createReqVO) { + List main = deviceMaintenanceJobMainMapper.selectList("number", createReqVO.getNumber()); + Long mainId = main.get(0).getId(); + // 插入 + DeviceMaintenanceJobDetailDO deviceMaintenanceDetail = DeviceMaintenanceJobDetailConvert.INSTANCE.convert(createReqVO); + deviceMaintenanceDetail.setMasterId(mainId); + int id = deviceMaintenanceJobDetailMapper.insert(deviceMaintenanceDetail); + List> itemList = createReqVO.getItemNumbers();//备件号集合 + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(!itemDOS.isEmpty()){ + String number = itemDOS.get(0).getNumber(); + DeviceMaintenanceJobDetailItemDO dos = new DeviceMaintenanceJobDetailItemDO(); + dos.setItemNumber(number); + dos.setMasterId(deviceMaintenanceDetail.getId()); + dos.setNumber(createReqVO.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + deviceMaintenanceJobDetailItemMapper.insert(dos); + }else{ + throw exception(ITEM_NOT_EXISTS); + } + } + } + // 返回 + return deviceMaintenanceDetail.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateDeviceMaintenanceDetail(DeviceMaintenanceJobDetailUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceMaintenanceDetailExists(updateReqVO.getId()); + // 更新 + DeviceMaintenanceJobDetailDO updateObj = DeviceMaintenanceJobDetailConvert.INSTANCE.convert(updateReqVO); + int i = deviceMaintenanceJobDetailMapper.updateById(updateObj); + //先删除备件关联表 + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("master_id", updateReqVO.getId()); + itemQueryWrapper.eq("deleted", 0); + List deviceMaintenanceJobDetailItemDOS = deviceMaintenanceJobDetailItemMapper.selectList(itemQueryWrapper); + for(DeviceMaintenanceJobDetailItemDO item: deviceMaintenanceJobDetailItemDOS){ + deviceMaintenanceJobDetailItemMapper.deleteById(item.getId()); + } + + //重新加入备件 + List> itemList = updateReqVO.getItemNumbers(); + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(!itemDOS.isEmpty()){ + String number = itemDOS.get(0).getNumber(); + DeviceMaintenanceJobDetailItemDO dos = new DeviceMaintenanceJobDetailItemDO(); + dos.setItemNumber(number); + dos.setMasterId(updateReqVO.getId()); + dos.setNumber(updateReqVO.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + deviceMaintenanceJobDetailItemMapper.insert(dos); + }else{ + throw exception(ITEM_NOT_EXISTS); + } + } + } + return i; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer deleteDeviceMaintenanceDetail(Long id) { + // 校验存在 + validateDeviceMaintenanceDetailExists(id); + // 删除 + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("master_id", id); + itemQueryWrapper.eq("deleted", 0); + List deviceMaintenanceJobDetailItemDOS = deviceMaintenanceJobDetailItemMapper.selectList(itemQueryWrapper); + for(DeviceMaintenanceJobDetailItemDO item: deviceMaintenanceJobDetailItemDOS){ + deviceMaintenanceJobDetailItemMapper.deleteById(item.getId()); + } + int i = deviceMaintenanceJobDetailMapper.deleteById(id); + return i ; + } + + private void validateDeviceMaintenanceDetailExists(Long id) { + if (deviceMaintenanceJobDetailMapper.selectById(id) == null) { + throw exception(WEI_XIU_ORDER_DETAILS_NOT_EXISTS); + } + } + + @Override + public DeviceMaintenanceJobDetailDO getDeviceMaintenanceDetail(Long id) { + return deviceMaintenanceJobDetailMapper.selectById(id); + } + + @Override + public List getDeviceMaintenanceDetailList(Collection ids) { + return deviceMaintenanceJobDetailMapper.selectBatchIds(ids); + } + + @Override + public List selectListByNumber(String number) { + QueryWrapper detailsDOQueryWrapper = new QueryWrapper<>(); + detailsDOQueryWrapper.eq("number", number); + detailsDOQueryWrapper.eq("available", "TRUE"); + List maintenanceNumber = deviceMaintenanceJobDetailMapper.selectList(detailsDOQueryWrapper); + for(DeviceMaintenanceJobDetailDO en:maintenanceNumber){ + StringBuilder names = new StringBuilder(); + if(!"".equals(en.getMaintenances())&& en.getMaintenances()!=null){ + String[] split = en.getMaintenances().split(","); + for(int i = 0; i < split.length; i++) { + AdminUserRespDTO user = userApi.getUser(Long.parseLong(split[i])); + if (names.length() > 0) { + names.append(", "); + } + String name = user.getNickname(); + names.append(name); + } + en.setMaintenancesName(names.toString()); + } + List> list = deviceMaintenanceJobDetailItemMapper.selectListById(en.getId()); +// StringBuilder sb = new StringBuilder(); +// for(Map map:list){ +// if (sb.length() > 0) { +// sb.append(", "); +// } +// String name = map.get("name").toString(); +// String qty = map.get("qty").toString(); +// sb.append(name+":"+qty); +// } + en.setItems(list); + } + return maintenanceNumber; + } + + @Override + public PageResult getDeviceMaintenanceDetailPage(DeviceMaintenanceJobDetailPageReqVO pageReqVO) { + PageResult maintenanceNumber = deviceMaintenanceJobDetailMapper.selectPage(pageReqVO); + for(DeviceMaintenanceJobDetailDO en:maintenanceNumber.getList()){ + StringBuilder names = new StringBuilder(); + if(!"".equals(en.getMaintenances())&& en.getMaintenances()!=null){ + String[] split = en.getMaintenances().split(","); + for(int i = 0; i < split.length; i++) { + AdminUserRespDTO user = userApi.getUser(Long.parseLong(split[i])); + if (names.length() > 0) { + names.append(", "); + } + String name = user.getNickname(); + names.append(name); + } + en.setMaintenancesName(names.toString()); + } + List> list = deviceMaintenanceJobDetailItemMapper.selectListById(en.getId()); +// StringBuilder sb = new StringBuilder(); +// for(Map map:list){ +// if (sb.length() > 0) { +// sb.append(", "); +// } +// String name = map.get("name").toString(); +// String qty = map.get("qty").toString(); +// sb.append(name+":"+qty); +// } + en.setItemNumbers(list); + } + return maintenanceNumber; + + //return deviceMaintenanceDetailMapper.selectPage(pageReqVO); + } + + @Override + public List getDeviceMaintenanceDetailList(DeviceMaintenanceJobDetailExportReqVO exportReqVO) { + return deviceMaintenanceJobDetailMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceMaintenanceDetailList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_MAINTENANCE_DETAIL_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceMaintenanceDetailDO obj = deviceMaintenanceDetailMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceMaintenanceDetailMapper.insert(DeviceMaintenanceDetailConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceMaintenanceDetailDO deviceMaintenanceDetailDO = DeviceMaintenanceDetailConvert.INSTANCE.convert(item); +// deviceMaintenanceDetailDO.setId(obj.getId()); +// deviceMaintenanceDetailMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobMainService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobMainService.java new file mode 100644 index 0000000..9047d1e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobMainService.java @@ -0,0 +1,170 @@ +package com.win.module.eam.service.devicemaintenancejob; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 维修工单主 Service 接口 + * + * @author 超级管理员 + */ +public interface DeviceMaintenanceJobMainService { + + /** + * 创建维修工单主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintenanceMain(@Valid DeviceMaintenanceJobMainCreateReqVO createReqVO); + + /** + * pc创建维修工单主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintenanceMainPC(@Valid DeviceMaintenanceJobMainCreateReqVO createReqVO); + + /** + * 更新维修工单主 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceMaintenanceMain(@Valid DeviceMaintenanceJobMainUpdateReqVO updateReqVO); + + /** + * 删除维修工单主 + * + * @param id 编号 + */ + Integer deleteDeviceMaintenanceMain(Long id); + + /** + * 获得维修工单主 + * + * @param id 编号 + * @return 维修工单主 + */ + DeviceMaintenanceJobMainDO getDeviceMaintenanceMain(Long id); + + /** + * 获得维修工单主列表 + * + * @param ids 编号 + * @return 维修工单主列表 + */ + List getDeviceMaintenanceMainList(Collection ids); + + List> getDictList(String type); + + /** + * 获得维修工单主分页 + * + * @param pageReqVO 分页查询 + * @return 维修工单主分页 + */ + PageResult getDeviceMaintenanceMainPage(DeviceMaintenanceJobMainPageReqVO pageReqVO); + + + /** + * 获得维修工单主分页 + * + * @param conditions 分页查询 + * @return 维修工单主分页 + */ + PageResult getDeviceMaintenanceMainSenior(CustomConditions conditions); + + + /** + * 获得维修工单主列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 维修工单主列表 + */ + List getDeviceMaintenanceMainList(DeviceMaintenanceJobMainExportReqVO exportReqVO); + + /** + * 导入维修工单主主信息 + * + * @param datas 导入维修工单主主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceMaintenanceMainList(List datas, Integer mode, boolean updatePart); + + /** + * 更改工单主表状态 + * @param request_number 申请工单号 撤回操作 + * @param id 工单主表可以做 + * @param status 工单主表状态枚举 + * @return + */ + int updateStatus(String request_number,Long id,String status); + + /** + * 维修工单转办 + * @param deviceNumber 设备或模具号 + * @param receiverType 转后类型 + * @param receiverUserId 转后userId + * @param id id + * @return + */ + int turnTo(String deviceNumber,Long id,String receiverType,Long receiverUserId,String status); + + /** + *维修工单接单 + * @param id 工单id + * @return + */ + int orderClick(Long id); + /** + *维修工单点击完成 + * @param id 工单id + * @param result 结果临时合还是已完成 + * @return + */ + int orderClickFinish(Long id,String result); + /** + *维修工单报修人确认 + * @param id 工单id + * @param content 内容 + * @param result 通过还是驳回 + * @return + */ + int orderClickConfirm(Long id,String result,String content); + /** + *维修工单工程师验证 + * @param id 工单id + * @param status 当前状态 + * @param content 内容 + * @return + */ + int orderClickVerify(Long id,String status,String content); + + + /** + * 根据申请号删除工单 + * @param request_number 申请工单号 撤回操作 + * @return + */ + int deleteStatus(String request_number); + + PageResult getAppPage(DeviceMaintenanceJobMainPageReqVO pageReqVO); + + DeviceMaintenanceJobMainDO getAppByNumber(String number); + + /** + * 获取维修工单列表 + * @return + */ + List> getList(String type); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobMainServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobMainServiceImpl.java new file mode 100644 index 0000000..a9f39e1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemaintenancejob/DeviceMaintenanceJobMainServiceImpl.java @@ -0,0 +1,987 @@ +package com.win.module.eam.service.devicemaintenancejob; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.controller.uniapppushmessage.vo.UniappPushMessageRespVO; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobDetailConvert; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobMainConvert; +import com.win.module.eam.dal.dataobject.attachmentfile.AttachmentFileDO; +import com.win.module.eam.dal.dataobject.classtype.ClassTypeDO; +import com.win.module.eam.dal.dataobject.deviceaccounts.DeviceAccountsDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailItemDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.dal.dataobject.devicerepairrequest.DeviceRepairRequestDO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.dataobject.maintenanceturnto.MaintenanceTurntoDO; +import com.win.module.eam.dal.dataobject.moldaccounts.MoldAccountsDO; +import com.win.module.eam.dal.mysql.classtype.ClassTypeMapper; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailItemMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobMainMapper; +import com.win.module.eam.dal.mysql.devicerepairrequest.DeviceRepairRequestMapper; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.eam.dal.mysql.maintenanceturnto.MaintenanceTurntoMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.eam.service.attachmentfile.AttachmentFileService; +import com.win.module.eam.service.classtype.ClassTypeService; +import com.win.module.eam.service.deviceaccounts.DeviceAccountsService; +import com.win.module.eam.service.devicerepairrequest.DeviceRepairRequestService; +import com.win.module.eam.service.moldaccounts.MoldAccountsService; +import com.win.module.eam.service.uniapppushmessage.UniappPushMessageService; +import com.win.module.system.api.dept.DeptApi; +import com.win.module.system.api.dept.PostApi; +import com.win.module.system.api.mail.MailSendApi; +import com.win.module.system.api.mail.dto.MailSendSingleToUserReqDTO; +import com.win.module.system.api.permission.PermissionApi; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.api.user.dto.AdminUserRespExpandDTO; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +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 java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +import static cn.hutool.log.StaticLog.info; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 维修工单主 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class DeviceMaintenanceJobMainServiceImpl implements DeviceMaintenanceJobMainService { + + @Resource + private DeviceMaintenanceJobMainMapper deviceMaintenanceJobMainMapper; + + @Resource + private DeviceRepairRequestMapper deviceRepairRequestMapper; + @Lazy + @Resource + private DeviceRepairRequestService moldRepairRequestService; + + + @Resource + private MaintenanceTurntoMapper maintenanceTurntoMapper; + @Resource + private SerialNumberApi serialNumberApi; + + @Resource + private AdminUserApi userApi; + + @Resource + private DeptApi deptApi; + + @Resource + private PostApi postApi; + + @Resource + private DeviceMaintenanceJobDetailMapper deviceMaintenanceJobDetailMapper; + @Resource + DeviceMaintenanceJobDetailItemMapper deviceMaintenanceJobDetailItemMapper; + + @Resource + ItemMapper itemMapper; + + @Resource + private MoldAccountsMapper moldAccountsMapper; + + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + + @Resource + private AttachmentFileService attachmentFileService; + + @Resource + private DeviceAccountsService deviceAccountsService; + + @Resource + private MoldAccountsService moldAccountsService; + + @Resource + private MailSendApi mailSendApi; + + @Resource + private PermissionApi permissionApi; + @Resource + private AdminUserApi adminUserApi; + + @Resource + private UniappPushMessageService uniappPushMessageService; + + @Resource + private ClassTypeMapper classTypeMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDeviceMaintenanceMain(DeviceMaintenanceJobMainCreateReqVO createReqVO) { + // 插入 + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + DeviceMaintenanceJobMainDO deviceMaintenanceMain = DeviceMaintenanceJobMainConvert.INSTANCE.convert(createReqVO); + String number = serialNumberApi.generateCode(RuleCodeEnum.WEI_XIU_ORDER.getCode()); + deviceMaintenanceMain.setNumber(number); + if (OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode().equals(deviceMaintenanceMain.getStatus())) {//手动创建的是已接单 + //通过controller手动创建工单直接直接已接单 + deviceMaintenanceMain.setReceivingTime(LocalDateTime.now()); + deviceMaintenanceMain.setDeptId(user.getDeptId()); + } else { + deviceMaintenanceMain.setApplyer(getLoginUserId()); + deviceMaintenanceMain.setDeptId(Long.parseLong(createReqVO.getFactoryAreaNumber())); + } + + int i = deviceMaintenanceJobMainMapper.insert(deviceMaintenanceMain); + + //添加维修工单的设备模具需要更改维修状态为1维修中 + //更新设备模具状态 + if (createReqVO.getType().equals("MOLD")) { + MoldAccountsDO moldAccountsDO = moldAccountsMapper.selectOne("number", createReqVO.getDeviceNumber(), "deleted", 0); + moldAccountsDO.setStatus("1"); + moldAccountsDO.setNumber(createReqVO.getDeviceNumber()); + moldAccountsMapper.updateById(moldAccountsDO); + } else { + DeviceAccountsDO deviceAccountsDO = deviceAccountsMapper.selectOne("number", createReqVO.getDeviceNumber(), "deleted", 0); + deviceAccountsDO.setStatus("1"); + deviceAccountsDO.setNumber(createReqVO.getDeviceNumber()); + deviceAccountsMapper.updateById(deviceAccountsDO); + } + if (!OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode().equals(deviceMaintenanceMain.getStatus())) {//非手动创建的是从报修走的 + //发送邮件 + try { + sendEmails(deviceMaintenanceMain, 0); + } catch (Exception e) { + info("发送邮件异常:{}", e); + } + } + try { + UniappPushMessageRespVO respVO = new UniappPushMessageRespVO(); + respVO.setType(createReqVO.getType()); + respVO.setStatus("0"); + respVO.setNumber(number); + respVO.setFactoryAreaNumber(createReqVO.getFactoryAreaNumber()); + respVO.setType(createReqVO.getType()); + uniappPushMessageService.uniappSend(respVO); + } catch (Exception e) { + info("手机消息推送异常:{}", e); + } + // 返回 + return deviceMaintenanceMain.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDeviceMaintenanceMainPC(DeviceMaintenanceJobMainCreateReqVO createReqVO) { + // 插入 + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + DeviceMaintenanceJobMainDO deviceMaintenanceMain = DeviceMaintenanceJobMainConvert.INSTANCE.convert(createReqVO); + String number = serialNumberApi.generateCode(RuleCodeEnum.WEI_XIU_ORDER.getCode()); + deviceMaintenanceMain.setNumber(number); + deviceMaintenanceMain.setDeptId(user.getDeptId()); + if (deviceMaintenanceMain.getStatus() == null || "".equals(deviceMaintenanceMain.getStatus())) {//状态为空说明手动创建工单直接已接单 + //通过controller手动创建工单直接直接已接单 + deviceMaintenanceMain.setMaintenance(getLoginUserId());//添加接单人 + deviceMaintenanceMain.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode());//添加已接单 + deviceMaintenanceMain.setReceivingTime(LocalDateTime.now()); + deviceMaintenanceMain.setDeptId(Long.parseLong(createReqVO.getFactoryAreaNumber())); + deviceMaintenanceJobMainMapper.insert(deviceMaintenanceMain); + if (createReqVO.getSubList() != null && !"".equals(createReqVO.getSubList())) {//PC端传入 + //主子表 + List subDOList = DeviceMaintenanceJobDetailConvert.INSTANCE.convertList03(createReqVO.getSubList()); + for (DeviceMaintenanceJobDetailDO deviceMaintenanceDetail : subDOList) { + deviceMaintenanceDetail.setNumber(number); + deviceMaintenanceDetail.setMasterId(deviceMaintenanceMain.getId()); + //插入子项数据 + int id = deviceMaintenanceJobDetailMapper.insert(deviceMaintenanceDetail); + List> itemList = deviceMaintenanceDetail.getItemNumbers();//备件号集合 + if (itemList != null && itemList.size() > 0) { + for (Map map : itemList) { + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if (itemDOS != null) { + String numbers = itemDOS.get(0).getNumber(); + DeviceMaintenanceJobDetailItemDO dos = new DeviceMaintenanceJobDetailItemDO(); + dos.setItemNumber(numbers); + dos.setMasterId(deviceMaintenanceDetail.getId()); + dos.setNumber(deviceMaintenanceDetail.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + deviceMaintenanceJobDetailItemMapper.insert(dos); + } + } + } + } + } + } else { + deviceMaintenanceJobMainMapper.insert(deviceMaintenanceMain); + } + if (deviceMaintenanceMain.getId() != null) { + //更新设备模具状态 + if (BasicStatusEnum.BASIC_DEVICE.getCode().equals(createReqVO.getType())) { + deviceAccountsService.updateDeviceAccountsStatus(createReqVO.getDeviceNumber(), BasicStatusEnum.BASIC_STATUS_1.getCode()); + } else if (BasicStatusEnum.BASIC_MOLD.getCode().equals(createReqVO.getType())) { + moldAccountsService.updateMoldAccountsStatus(createReqVO.getDeviceNumber(), BasicStatusEnum.BASIC_STATUS_1.getCode()); + } + } +// else{//报修申请进来的待接单状态 +// deviceMaintenanceMain.setStatus(OrderStatusEnum.PEND_ORDER_STATUS.getCode());//待接单 +// } +////发送邮件 +// try { +// sendEmails(deviceMaintenanceMain,0); +// } catch (Exception e) { +// info("发送邮件异常:{}",e); +// } + try { + UniappPushMessageRespVO respVO = new UniappPushMessageRespVO(); + respVO.setType(createReqVO.getType()); + respVO.setStatus("0"); + respVO.setNumber(number); + respVO.setFactoryAreaNumber(createReqVO.getFactoryAreaNumber()); + respVO.setType(createReqVO.getType()); + uniappPushMessageService.uniappSend(respVO); + } catch (Exception e) { + info("手机消息推送异常:{}", e); + } + // 返回 + return deviceMaintenanceMain.getId(); + } + + @Override + public Integer updateDeviceMaintenanceMain(DeviceMaintenanceJobMainUpdateReqVO updateReqVO) { + // 校验存在 + // 更新 + DeviceMaintenanceJobMainDO maintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectById(updateReqVO.getId()); + DeviceMaintenanceJobMainDO updateObj = DeviceMaintenanceJobMainConvert.INSTANCE.convert(updateReqVO); + updateObj.setMaintenance(maintenanceJobMainDO.getMaintenance()); + updateObj.setReceivingTime(maintenanceJobMainDO.getReceivingTime()); + return deviceMaintenanceJobMainMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceMaintenanceMain(Long id) { + // 校验存在 + validateDeviceMaintenanceMainExists(id); + // 删除 + return deviceMaintenanceJobMainMapper.deleteById(id); + } + + private void validateDeviceMaintenanceMainExists(Long id) { + if (deviceMaintenanceJobMainMapper.selectById(id) == null) { + throw exception(WEI_XIU_NOT_EXISTS); + } + } + + @Override + public DeviceMaintenanceJobMainDO getDeviceMaintenanceMain(Long id) { + return deviceMaintenanceJobMainMapper.selectById(id); + } + + @Override + public List getDeviceMaintenanceMainList(Collection ids) { + return deviceMaintenanceJobMainMapper.selectBatchIds(ids); + } + + @Override + public List> getDictList(String type) { + return deviceMaintenanceJobMainMapper.getDictList(type); + } + + @Override + public PageResult getDeviceMaintenanceMainPage(DeviceMaintenanceJobMainPageReqVO pageReqVO) { + PageResult deviceMaintenanceJobMainDOPageResult = deviceMaintenanceJobMainMapper.selectPage(pageReqVO); + List deviceRepairList = deviceMaintenanceJobMainDOPageResult.getList(); + List masterIdList = deviceRepairList.stream().map(DeviceMaintenanceJobMainDO::getId).collect(Collectors.toList()); + List deviceMaintenanceJobDetailList = deviceMaintenanceJobDetailMapper.selectByMasterIds(masterIdList); + deviceRepairList.stream().forEach(deviceRepair -> { + if (deviceRepair.getRequestNumber() != null) { + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setFuncCode("request_repair"); + attachmentFileDO.setNumber(deviceRepair.getRequestNumber()); + List list = attachmentFileService.getAttachmentFilePathList(attachmentFileDO); + // 设置filePathList字段 + if (list != null && list.size() > 0) { + deviceRepair.setFilePathList(list); + } + // 根据requestNumber查询记录,并设置declarer + DeviceRepairRequestDO order = moldRepairRequestService.getOrderByNumber(deviceRepair.getRequestNumber()); + if (order != null) { + deviceRepair.setDeclarer(order.getDeclarer()); + } + } + // 使用Stream API来检查是否存在符合条件的记录 + Optional matchingDetail = deviceMaintenanceJobDetailList.stream() + .filter(deviceMaintenanceJobDetail -> deviceRepair.getId().equals(deviceMaintenanceJobDetail.getMasterId())) + .findAny(); + // 如果找到了至少一条符合条件的记录,返回true + deviceRepair.setHasDetails(matchingDetail.isPresent()); + }); + return deviceMaintenanceJobMainDOPageResult; + } + + @Override + public PageResult getDeviceMaintenanceMainSenior(CustomConditions conditions) { + PageResult deviceMaintenanceJobMainDOPageResult = deviceMaintenanceJobMainMapper.selectSenior(conditions); + List deviceRepairList = deviceMaintenanceJobMainDOPageResult.getList(); + List masterIdList = deviceRepairList.stream().map(DeviceMaintenanceJobMainDO::getId).collect(Collectors.toList()); + List deviceMaintenanceJobDetailList = deviceMaintenanceJobDetailMapper.selectByMasterIds(masterIdList); + deviceRepairList.stream().forEach(deviceRepair -> { + if (deviceRepair.getRequestNumber() != null) { + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setFuncCode("request_repair"); + attachmentFileDO.setNumber(deviceRepair.getRequestNumber()); + List list = attachmentFileService.getAttachmentFilePathList(attachmentFileDO); + // 设置filePathList字段 + if (list != null && list.size() > 0) { + deviceRepair.setFilePathList(list); + } + // 根据requestNumber查询记录,并设置declarer + DeviceRepairRequestDO order = moldRepairRequestService.getOrderByNumber(deviceRepair.getRequestNumber()); + if (order != null) { + deviceRepair.setDeclarer(order.getDeclarer()); + } + } + // 使用Stream API来检查是否存在符合条件的记录 + Optional matchingDetail = deviceMaintenanceJobDetailList.stream() + .filter(deviceMaintenanceJobDetail -> deviceRepair.getId().equals(deviceMaintenanceJobDetail.getMasterId())) + .findAny(); + // 如果找到了至少一条符合条件的记录,返回true + deviceRepair.setHasDetails(matchingDetail.isPresent()); + }); + return deviceMaintenanceJobMainDOPageResult; + } + + @Override + public List getDeviceMaintenanceMainList(DeviceMaintenanceJobMainExportReqVO exportReqVO) { + return deviceMaintenanceJobMainMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceMaintenanceMainList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_MAINTENANCE_MAIN_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceMaintenanceMainDO obj = deviceMaintenanceMainMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceMaintenanceMainMapper.insert(DeviceMaintenanceMainConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceMaintenanceMainDO deviceMaintenanceMainDO = DeviceMaintenanceMainConvert.INSTANCE.convert(item); +// deviceMaintenanceMainDO.setId(obj.getId()); +// deviceMaintenanceMainMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public int updateStatus(String request_number, Long id, String status) { + return deviceMaintenanceJobMainMapper.updateStatus(request_number, id, status); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int turnTo(String deviceNumber, Long id, String receiverType, Long receiverUserId, String status) { + DeviceMaintenanceJobMainDO Do = deviceMaintenanceJobMainMapper.selectById(id); + String oldtype = Do.getType(); + String olddeviceNumber = Do.getDeviceNumber(); + if (!OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode().equals(Do.getStatus())) {//已接单状态才能转办 + throw exception(WEI_XIU_NOT_ZUANBAN); + } +// if(Do.getType().equals(receiverType)){//同种类型不能转办 +// throw exception(WEI_XIU_NOT_TYPE_ZUANBAN); +// } + Long turnToUserId = Do.getMaintenance(); + String deviceNumberold = Do.getDeviceNumber(); + String factoryAreaNumber = Do.getFactoryAreaNumber(); + String turnToType = Do.getType(); + Do.setId(id); + Do.setDeviceNumber(deviceNumber); + Do.setType(receiverType); + if (!"1".equals(status)) {//非人员转办的时候是待接单状态 + Do.setStatus(OrderStatusEnum.PEND_ORDER_STATUS.getCode());//变成待接单状态 + Do.setMaintenance(null); + Do.setReceivingTime(null); + } else { + Do.setMaintenance(receiverUserId);//接单人 + Do.setReceivingTime(LocalDateTime.now());//接单时间 + Do.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode());//变成已接单状态 + } + int i = deviceMaintenanceJobMainMapper.updateById(Do); + //更新报修单 + QueryWrapper objectQueryWrapper = new QueryWrapper<>(); + objectQueryWrapper.eq("number", Do.getRequestNumber()); + objectQueryWrapper.eq("result", OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + List list = deviceRepairRequestMapper.selectList(objectQueryWrapper); + if (list != null && list.size() > 0) { + DeviceRepairRequestDO deviceRepairRequestDO = list.get(0); + deviceRepairRequestDO.setResult(OrderStatusEnum.TRANSFERRED_STATUS.getCode()); + deviceRepairRequestMapper.updateById(deviceRepairRequestDO); + //添加一个新的报修单,单号形同状态不同,此状态应该是和维修工单同步 + deviceRepairRequestDO.setResult(Do.getStatus()); + deviceRepairRequestDO.setType(receiverType); + deviceRepairRequestDO.setId(null); + deviceRepairRequestDO.setDeviceNumber(deviceNumber); + deviceRepairRequestMapper.insert(deviceRepairRequestDO); + } + if (!"1".equals(status)) {//设备转办更改状态 + //原报修设备修改更改状态为正常 + if (oldtype.equals("MOLD")) { + MoldAccountsDO moldAccountsDO = moldAccountsMapper.selectOne("number", olddeviceNumber, "deleted", 0); + moldAccountsDO.setStatus("0"); + moldAccountsMapper.updateById(moldAccountsDO); + } else { + DeviceAccountsDO deviceAccountsDO = deviceAccountsMapper.selectOne("number", olddeviceNumber, "deleted", 0); + deviceAccountsDO.setStatus("0"); + deviceAccountsMapper.updateById(deviceAccountsDO); + } + //转办的设备更改状态为维修 + if (receiverType.equals("MOLD")) { + MoldAccountsDO moldAccountsDO = moldAccountsMapper.selectOne("number", deviceNumber, "deleted", 0); + moldAccountsDO.setStatus("1"); + moldAccountsMapper.updateById(moldAccountsDO); + } else { + DeviceAccountsDO deviceAccountsDO = deviceAccountsMapper.selectOne("number", deviceNumber, "deleted", 0); + deviceAccountsDO.setStatus("1"); + deviceAccountsMapper.updateById(deviceAccountsDO); + } + } + //转办记录表 + MaintenanceTurntoDO turntoDO = new MaintenanceTurntoDO(); + turntoDO.setMaintenanceNumber(Do.getNumber()); + turntoDO.setDeviceNumberOld(deviceNumberold);//转前设备模具号 + turntoDO.setDeviceNumber(deviceNumber);//转后设备模具号 + turntoDO.setTurnToType(turnToType);//转前类型 + turntoDO.setReceiverType(receiverType);//转后类型 + turntoDO.setTurnToUserid(turnToUserId);//转前接单人 + turntoDO.setFactoryAreaNumber(factoryAreaNumber);//厂区号 + turntoDO.setReceiverUserid(receiverUserId);//转后接单人 + turntoDO.setFactoryAreaNumberOld(factoryAreaNumber); + turntoDO.setStatus(status); + int i1 = maintenanceTurntoMapper.insert(turntoDO); + return i1; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int orderClick(Long id) { + + DeviceMaintenanceJobMainDO Do = deviceMaintenanceJobMainMapper.selectById(id); + if (Do == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + Do.setReceivingTime(LocalDateTime.now()); + Do.setMaintenance(getLoginUserId());//接单人 + Do.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + int i = deviceMaintenanceJobMainMapper.updateById(Do); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", Do.getRequestNumber()); + queryWrapper.eq("result", OrderStatusEnum.PEND_ORDER_STATUS.getCode()); + List list = deviceRepairRequestMapper.selectList(queryWrapper); + if (list != null && list.size() > 0) { + DeviceRepairRequestDO deviceRepairRequestDO = list.get(0); + deviceRepairRequestDO.setResult(Do.getStatus()); + return deviceRepairRequestMapper.updateById(deviceRepairRequestDO); + } + return i; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int orderClickFinish(Long id, String result) { + DeviceMaintenanceJobMainDO Do = deviceMaintenanceJobMainMapper.selectById(id); + validateWC(id);//校验 + Do.setCompletionTime(LocalDateTime.now()); + Do.setStatus(OrderStatusEnum.COMPLETED_STATUS.getCode()); + Do.setResult(result); + deviceMaintenanceJobMainMapper.updateById(Do); + //点击完成需要修改设备模具状态为正常 + //更新设备模具需要更改维修状态为0正常 + String deviceNumber = Do.getDeviceNumber(); + DeviceAccountsDO deviceAccountsDO = deviceAccountsMapper.selectOne("number", deviceNumber, "deleted", 0); + deviceAccountsDO.setStatus("0"); + deviceAccountsDO.setNumber(deviceNumber); + int i = deviceAccountsMapper.updateById(deviceAccountsDO); + if (Do.getRequestNumber() != null && !Do.getRequestNumber().isEmpty()) {//该维修工单来源于报修申请需要申请人确认 + //给申报人推送消息 + UniappPushMessageRespVO respVO = new UniappPushMessageRespVO(); + respVO.setType(Do.getType()); + respVO.setStatus("1"); + respVO.setNumber(deviceNumber); + respVO.setFactoryAreaNumber(Do.getFactoryAreaNumber()); + respVO.setType(Do.getType()); + respVO.setApplyer(Do.getApplyer()); + uniappPushMessageService.uniappSend(respVO); + } else {//工程师验证 + try { + sendEmails(Do, 1); + } catch (Exception e) { + info("发送邮件异常:{}", e); + } + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", Do.getRequestNumber()); + queryWrapper.eq("result", OrderStatusEnum.PEND_ORDER_STATUS.getCode()); + List list = deviceRepairRequestMapper.selectList(queryWrapper); + if (list != null && list.size() > 0) { + DeviceRepairRequestDO deviceRepairRequestDO = list.get(0); + deviceRepairRequestDO.setResult(Do.getStatus()); + return deviceRepairRequestMapper.updateById(deviceRepairRequestDO); + } + return i; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int orderClickConfirm(Long id,String result, String content) { + DeviceMaintenanceJobMainDO Do = deviceMaintenanceJobMainMapper.selectById(id); + validateSQ(id);//校验 + Do.setApplyTime(LocalDateTime.now()); + if (result == null || result.isEmpty()) { + throw exception(WEI_XIU_ORDER_APPLY_NOT_EMPTY); + } + if (OrderStatusEnum.APPLY_PASS_STATUS.getCode().equals(result)) {//申请人通过流程正常走 + Do.setStatus(result); + Do.setApplyContent(content); + Do.setApplyTime(LocalDateTime.now()); + try { + sendEmails(Do, 1); + } catch (Exception e) { + info("发送邮件异常:{}", e); + } + } else {// 申请人确认驳回需要重置维修工单以及报修工单为已接单状态(暂时申请人确认操作不需要留痕) + Do.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + Do.setApplyContent(content); + Do.setApplyTime(LocalDateTime.now()); + Do.setResult(""); + Do.setCompletionTime(null); + } + int i = deviceMaintenanceJobMainMapper.updateById(Do); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", Do.getRequestNumber()); + queryWrapper.eq("result", OrderStatusEnum.COMPLETED_STATUS.getCode()); + List list = deviceRepairRequestMapper.selectList(queryWrapper); + if (list != null && list.size() > 0) { + DeviceRepairRequestDO deviceRepairRequestDO = list.get(0); + deviceRepairRequestDO.setResult(Do.getStatus()); + return deviceRepairRequestMapper.updateById(deviceRepairRequestDO); + } + return i; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int orderClickVerify(Long id,String status, String content) { + DeviceMaintenanceJobMainDO Do = deviceMaintenanceJobMainMapper.selectById(id); + validateYZ(id);//验证 + Do.setVerifyTime(LocalDateTime.now()); + Do.setVerifyer(getLoginUserId());//验证人 + Do.setVerifyContent(content); + Do.setStatus(OrderStatusEnum.VERIFIED_STATUS.getCode()); + int i = deviceMaintenanceJobMainMapper.updateById(Do); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", Do.getRequestNumber()); + queryWrapper.eq("result", status); + List list = deviceRepairRequestMapper.selectList(queryWrapper); + if (list != null && list.size() > 0) { + DeviceRepairRequestDO deviceRepairRequestDO = list.get(0); + deviceRepairRequestDO.setResult(Do.getStatus()); + return deviceRepairRequestMapper.updateById(deviceRepairRequestDO); + } + return i; + } + +// @Override +// @Transactional(rollbackFor = Exception.class) +// public int orderClick(Long id, String number, String status, String requestNumber, String result, String content) { +// //DeviceMaintenanceJobMainDO Do = new DeviceMaintenanceJobMainDO(); +// DeviceMaintenanceJobMainDO Do = deviceMaintenanceJobMainMapper.selectById(id); +// +// String statuss = ""; +// if (OrderStatusEnum.PEND_ORDER_STATUS.getCode().equals(status)) {//点击接单 维修人员能接单 +// validateFactoryAndClassType(id);//校验人员厂区和班组是否匹配 +// validateJD(id, number);//校验 +// Do.setReceivingTime(LocalDateTime.now()); +// Do.setMaintenance(getLoginUserId());//接单人 +// Do.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); +// } else if (OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode().equals(status)) {//点击完成 当前操作人与接单人一致才能点击完成 +// validateFactoryAndClassType(id);//校验人员厂区和班组是否匹配 +// //validateWC(id,number);//校验 +// Do.setCompletionTime(LocalDateTime.now()); +// Do.setStatus(OrderStatusEnum.COMPLETED_STATUS.getCode()); +// Do.setResult(result); +// //点击完成需要修改设备模具状态为正常 +// //更新设备模具需要更改维修状态为0正常 +// DeviceMaintenanceJobMainDO maintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectById(id); +// String type = maintenanceJobMainDO.getType(); +// String deviceNumber = maintenanceJobMainDO.getDeviceNumber(); +// if (type.equals("MOLD")) { +// MoldAccountsDO moldAccountsDO = moldAccountsMapper.selectOne("number", deviceNumber, "deleted", 0); +// moldAccountsDO.setStatus("0"); +// moldAccountsDO.setNumber(deviceNumber); +// moldAccountsMapper.updateById(moldAccountsDO); +// } else { +// DeviceAccountsDO deviceAccountsDO = deviceAccountsMapper.selectOne("number", deviceNumber, "deleted", 0); +// deviceAccountsDO.setStatus("0"); +// deviceAccountsDO.setNumber(deviceNumber); +// deviceAccountsMapper.updateById(deviceAccountsDO); +// } +// if (OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode().equals(status)) {//点击完成需要给工程师发送邮件提醒验证 +// if (Do.getRequestNumber() != null && !Do.getRequestNumber().isEmpty()) {//该维修工单来源于报修申请需要申请人确认 +// //给申报人推送消息 +// UniappPushMessageRespVO respVO = new UniappPushMessageRespVO(); +// respVO.setType(maintenanceJobMainDO.getType()); +// respVO.setStatus("1"); +// respVO.setNumber(number); +// respVO.setFactoryAreaNumber(maintenanceJobMainDO.getFactoryAreaNumber()); +// respVO.setType(maintenanceJobMainDO.getType()); +// respVO.setApplyer(maintenanceJobMainDO.getApplyer()); +// uniappPushMessageService.uniappSend(respVO); +// } else {//工程师验证 +//// try { +//// UniappPushMessageRespVO respVO = new UniappPushMessageRespVO(); +//// respVO.setType(maintenanceJobMainDO.getType()); +//// respVO.setStatus("2"); +//// respVO.setNumber(number); +//// respVO.setFactoryAreaNumber(maintenanceJobMainDO.getFactoryAreaNumber()); +//// respVO.setType(maintenanceJobMainDO.getType()); +//// uniappPushMessageService.uniappSend(respVO); +//// } catch (Exception e) { +//// info("手机消息推送异常:{}",e); +//// } +// try { +// sendEmails(maintenanceJobMainDO, 1); +// } catch (Exception e) { +// info("发送邮件异常:{}", e); +// } +// } +// } +// } else if (OrderStatusEnum.COMPLETED_STATUS.getCode().equals(status)) {//维修人员点击完成需要走下一步操作 +// if (Do.getRequestNumber() != null && !Do.getRequestNumber().isEmpty()) {//该维修工单来源于报修申请需要申请人确认 +// validateSQ(id, number);//校验 +// Do.setApplyTime(LocalDateTime.now()); +// if (result == null || result.isEmpty()) { +// throw exception(WEI_XIU_ORDER_APPLY_NOT_EMPTY); +// } +// if (OrderStatusEnum.APPLY_PASS_STATUS.getCode().equals(result)) {//申请人通过流程正常走 +// Do.setStatus(result); +// Do.setApplyContent(content); +// Do.setApplyTime(LocalDateTime.now()); +// try { +// sendEmails(Do, 1); +// } catch (Exception e) { +// info("发送邮件异常:{}", e); +// } +// } else {// 申请人确认驳回需要重置维修工单以及报修工单为已接单状态(暂时申请人确认操作不需要留痕) +// Do.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); +// Do.setApplyContent(content); +// Do.setApplyTime(LocalDateTime.now()); +// Do.setResult(""); +// Do.setCompletionTime(null); +// } +// } +// } else if (OrderStatusEnum.APPLY_PASS_STATUS.getCode().equals(status)) {//维修申请人确认 需要工程师验证 +// validateFactoryAndClassType(id);//校验人员厂区和班组是否匹配 +// validateYZ(id, number);//校验 +// Do.setVerifyTime(LocalDateTime.now()); +// Do.setVerifyer(getLoginUserId());//验证人 +// Do.setVerifyContent(content); +// Do.setStatus(OrderStatusEnum.VERIFIED_STATUS.getCode()); +// } else { +// throw exception(WEI_XIU_ORDER_NOT_EXISTS); +// } +// int i = deviceMaintenanceJobMainMapper.updateById(Do); +// QueryWrapper queryWrapper = new QueryWrapper<>(); +// queryWrapper.eq("number", requestNumber); +// queryWrapper.eq("result", status); +// List list = deviceRepairRequestMapper.selectList(queryWrapper); +// if (list != null && list.size() > 0) { +// DeviceRepairRequestDO deviceRepairRequestDO = list.get(0); +// deviceRepairRequestDO.setResult(Do.getStatus()); +// return deviceRepairRequestMapper.updateById(deviceRepairRequestDO); +// } +// return i; +// } + + @Override + public int deleteStatus(String request_number) { + return deviceMaintenanceJobMainMapper.deleteStatus(request_number); + } + + @Override + public PageResult getAppPage(DeviceMaintenanceJobMainPageReqVO pageReqVO) { + pageReqVO.setUserId(getLoginUserId().toString()); + Long factoryAreaNumber = userApi.getUser(getLoginUserId()).getDeptId();//厂区号查询当前厂区下的数据 + pageReqVO.setFactoryAreaNumber(factoryAreaNumber.toString()); + pageReqVO.setClassType("DEVICE"); + String b = classTypeMapper.getIdentity("DEVICE"); + if (b.equals("2")) { + throw exception(WORKER_ENGINEER_IS_NOT); + } + pageReqVO.setStandType(b); + if ("1".equals(pageReqVO.getFlag())) {//flag 0 首页进入 1我的进入 + //我的里面都是获取的是当前人已经完成的单子 + pageReqVO.setUserId(getLoginUserId().toString()); + IPage pageInfo = deviceMaintenanceJobMainMapper.getAppPage1(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for (DeviceMaintenanceJobMainDO en : pageInfo.getRecords()) { + String deviceNumber = en.getDeviceNumber(); + String type = en.getType(); + if ("MOLD".equals(type)) {//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber == null ? "" : detailsByNumber.get("name").toString()); + } else {//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber == null ? "" : detailsByNumber.get("name").toString()); + } + + } + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + if ("2".equals(pageReqVO.getFlag())) {//报修人确认列表 + IPage pageInfo = deviceMaintenanceJobMainMapper.getAppPage2(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } else { + //首页进入是获取未接单 已接单的单子 + pageReqVO.setFlag("0"); + } + IPage pageInfo = deviceMaintenanceJobMainMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + + @Override + public DeviceMaintenanceJobMainDO getAppByNumber(String number) { + DeviceMaintenanceJobMainDO en = deviceMaintenanceJobMainMapper.getAppByNumber(number); + if (en != null) { + String deviceNumber = en.getDeviceNumber(); + String type = en.getType(); + if ("MOLD".equals(type)) {//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber == null ? "" : detailsByNumber.get("name").toString()); + } else {//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber == null ? "" : detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber == null ? "" : detailsByNumber.get("name").toString()); + } + + return en; + } else { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + } + + @Override + public List> getList(String type) { + return deviceMaintenanceJobMainMapper.getList(type); + } + + /** + * 校验人员厂区和班组是否匹配 + * + * @param id + */ + private void validateFactoryAndClassType(Long id) { + String classType = permissionApi.getClassType(); + DeviceMaintenanceJobMainDO mainDO = deviceMaintenanceJobMainMapper.selectById(id); + if (mainDO == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } +// AdminUserRespDTO user = userApi.getUser(getLoginUserId()); +// Long deptId = user.getDeptId(); +// DeptRespDTO dept = deptApi.getDept(deptId); +// if(!mainDO.getFactoryAreaNumber().equals(user.getDeptId().toString())){//厂区不一致 +// throw exception(FACTORY_NO_NOMAL); +// } + if (!mainDO.getType().equals(classType)) {//班组不一致 + throw exception(CLASSTYPR_NO_NOMAL); + } + } + + /** + * 校验能否点击待接单 + * + * @param id + */ + private void validateJD(Long id, String number) { + if (deviceMaintenanceJobMainMapper.selectById(id) == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + DeviceMaintenanceJobMainRespVO reqVO = new DeviceMaintenanceJobMainRespVO(); + reqVO.setNumber(number); + reqVO.setStatus(OrderStatusEnum.PEND_ORDER_STATUS.getCode()); + Long l = deviceMaintenanceJobMainMapper.selectCountByScree(reqVO); + if (l <= 0) {//订单已被接单 + throw exception(WEI_XIU_NOT_DJ); + } + if (!permissionApi.BooleanEngineer() && !permissionApi.BooleanWorker()) { + throw exception(WEI_XIU_NOT_WORKER); + } + + } + + /** + * 校验能否点击完成 + * + * @param id + */ + private void validateWC(Long id) { + long size = 1L; // 声明一个long类型的变量并赋值为10 + DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectById(id); + if (deviceMaintenanceJobMainDO == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + DeviceMaintenanceJobMainRespVO reqVO = new DeviceMaintenanceJobMainRespVO(); + long loginUserId = getLoginUserId(); + long maintenance = deviceMaintenanceJobMainDO.getMaintenance(); + if (loginUserId != maintenance) {//接单人和维修人相等才能点击完成 + throw exception(WEI_XIU_NOT_WC); + } + reqVO.setNumber(deviceMaintenanceJobMainDO.getNumber()); + reqVO.setMaintenance(getLoginUserId()); + reqVO.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + //reqVo.set + Long l = deviceMaintenanceJobMainMapper.selectCountByScree(reqVO); + if (l < size) {//当前状态非待接单 + throw exception(JIAN_XIU_NOT_PENDING); + } + } + + /** + * 校验能否点击验证 + * + * @param id + */ + private void validateYZ(Long id) { + long size = 1L; // 声明一个long类型的变量并赋值为10 + DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectById(id); + if (deviceMaintenanceJobMainDO == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + if (deviceMaintenanceJobMainDO.getRequestNumber() != null && !deviceMaintenanceJobMainDO.getRequestNumber().isEmpty()) {//需要申请人确认通过才能验证 + DeviceMaintenanceJobMainRespVO reqVO = new DeviceMaintenanceJobMainRespVO(); + reqVO.setNumber(deviceMaintenanceJobMainDO.getNumber()); + reqVO.setStatus(OrderStatusEnum.APPLY_PASS_STATUS.getCode()); + //reqVo.set + Long l = deviceMaintenanceJobMainMapper.selectCountByScree(reqVO); + if (l < size) {//当前人无法验证 + throw exception(WEI_XIU_NOT_YZ); + } + } else {//维修工单手动创建的没有申请人节点 + DeviceMaintenanceJobMainRespVO reqVO = new DeviceMaintenanceJobMainRespVO(); + reqVO.setNumber(deviceMaintenanceJobMainDO.getNumber()); + reqVO.setStatus(OrderStatusEnum.COMPLETED_STATUS.getCode()); + //reqVo.set + Long l = deviceMaintenanceJobMainMapper.selectCountByScree(reqVO); + if (l < size) {//当前人无法验证 + throw exception(WEI_XIU_NOT_YZ); + } + + } + + } + + /** + * 申请人能否点击 + * + * @param id + */ + private void validateSQ(Long id) { + long size = 1L; // 声明一个long类型的变量并赋值为10 + DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectById(id); + if (deviceMaintenanceJobMainDO == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + Map detailsByNumber = deviceRepairRequestMapper.getDetailsByNumber(deviceMaintenanceJobMainDO.getRequestNumber(), deviceMaintenanceJobMainDO.getType()); + if (detailsByNumber == null || detailsByNumber.isEmpty()) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS_APPLY); + } else { + long loginUserId = getLoginUserId(); + long applyer = deviceMaintenanceJobMainDO.getApplyer(); + if (applyer != loginUserId) {//申请人与当前操作人不符合 + throw exception(WEI_XIU_ORDER_APPLY_NOT_CONFORM); + } + } + } + + /** + * 维修工单发送邮件 + */ + private void sendEmails(DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO, int flag) { + String type = deviceMaintenanceJobMainDO.getType(); + if (flag == 0) {//走报修创建的未接单的维修工单,待接单邮件提醒 + //List userBeanList = classTypeMapper.JudgeIdentity(null, type, "0", deviceMaintenanceJobMainDO.getFactoryAreaNumber()); + List userBeanList = classTypeMapper.JudgeIdentity(null, type, "1", deviceMaintenanceJobMainDO.getFactoryAreaNumber()); + userBeanList.stream().forEach(item -> { + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getUserId())); + mailSendSingleToUserReqDTO.setTemplateCode("request-repair-template"); + Map params = new HashMap<>(); + params.put("typeName", "设备"); + params.put("number", deviceMaintenanceJobMainDO.getNumber()); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + } catch (RuntimeException e) { + info("工单编号为" + deviceMaintenanceJobMainDO.getNumber() + "的名为:" + deviceMaintenanceJobMainDO.getDescribes() + "的工单给" + item.getNickname() + "发送的邮件通知失败:{}", e); + } + }); + } else {//维修工单点击完成后需要验证的邮件提醒 + List userBeanList = classTypeMapper.JudgeIdentity(null, type, "1", deviceMaintenanceJobMainDO.getFactoryAreaNumber()); + userBeanList.stream().forEach(item -> { + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getUserId())); + mailSendSingleToUserReqDTO.setTemplateCode("job-maintenance-template"); + Map params = new HashMap<>(); + params.put("typeName","设备"); + params.put("name", item.getNickname()); + params.put("number", deviceMaintenanceJobMainDO.getNumber()); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + } catch (RuntimeException e) { + info("工单编号为" + deviceMaintenanceJobMainDO.getNumber() + "的名为:" + deviceMaintenanceJobMainDO.getDescribes() + "的工单给" + item.getNickname() + "发送的邮件通知失败:{}", e); + } + }); + } + } + +} \ No newline at end of file diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemolditems/DeviceMoldItemsService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemolditems/DeviceMoldItemsService.java new file mode 100644 index 0000000..7f98874 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemolditems/DeviceMoldItemsService.java @@ -0,0 +1,89 @@ +package com.win.module.eam.service.devicemolditems; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemolditems.vo.*; +import com.win.module.eam.dal.dataobject.devicemolditems.DeviceMoldItemsDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 项记录表(设备 模具 保养 维修 巡检点检) Service 接口 + * + * @author 超级管理员 + */ +public interface DeviceMoldItemsService { + + /** + * 创建项记录表(设备 模具 保养 维修 巡检点检) + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMoldItems(@Valid DeviceMoldItemsCreateReqVO createReqVO); + + /** + * 更新项记录表(设备 模具 保养 维修 巡检点检) + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceMoldItems(@Valid DeviceMoldItemsUpdateReqVO updateReqVO); + + /** + * 删除项记录表(设备 模具 保养 维修 巡检点检) + * + * @param id 编号 + */ + Integer deleteDeviceMoldItems(Long id,String remark); + + /** + * 获得项记录表(设备 模具 保养 维修 巡检点检) + * + * @param id 编号 + * @return 项记录表(设备 模具 保养 维修 巡检点检) + */ + DeviceMoldItemsDO getDeviceMoldItems(Long id); + + /** + * 获得项记录表(设备 模具 保养 维修 巡检点检)列表 + * + * @param ids 编号 + * @return 项记录表(设备 模具 保养 维修 巡检点检)列表 + */ + List getDeviceMoldItemsList(Collection ids); + + /** + * 获得项记录表(设备 模具 保养 维修 巡检点检)分页 + * + * @param pageReqVO 分页查询 + * @return 项记录表(设备 模具 保养 维修 巡检点检)分页 + */ + PageResult getDeviceMoldItemsPage(DeviceMoldItemsPageReqVO pageReqVO); + + /** + * 获得项记录表(设备 模具 保养 维修 巡检点检)列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 项记录表(设备 模具 保养 维修 巡检点检)列表 + */ + List getDeviceMoldItemsList(DeviceMoldItemsExportReqVO exportReqVO); + + /** + * 根据设备编码查询巡检点检项目 + * @param number + * @return + */ + List getListByNumber(String number); + + /** + * 获得项记录表分页 + * + * @param pageReqVO 分页查询 + * @return 项记录表申请主分页 + */ + Object getNumber(DeviceMoldItemsPageReqVO pageReqVO); + + void testPlan(String date,String type); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemolditems/DeviceMoldItemsServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemolditems/DeviceMoldItemsServiceImpl.java new file mode 100644 index 0000000..a55ae3b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemolditems/DeviceMoldItemsServiceImpl.java @@ -0,0 +1,440 @@ +package com.win.module.eam.service.devicemolditems; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemolditems.vo.DeviceMoldItemsCreateReqVO; +import com.win.module.eam.controller.devicemolditems.vo.DeviceMoldItemsExportReqVO; +import com.win.module.eam.controller.devicemolditems.vo.DeviceMoldItemsPageReqVO; +import com.win.module.eam.controller.devicemolditems.vo.DeviceMoldItemsUpdateReqVO; +import com.win.module.eam.controller.maintainback.vo.MaintainBackCreateReqVO; +import com.win.module.eam.convert.devicemolditems.DeviceMoldItemsConvert; +import com.win.module.eam.dal.dataobject.deviceaccounts.DeviceAccountsDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDOExpand; +import com.win.module.eam.dal.dataobject.devicemaintainplan.DeviceMaintainPlanDO; +import com.win.module.eam.dal.dataobject.devicemolditems.DeviceMoldItemsDO; +import com.win.module.eam.dal.dataobject.devicemolditemshistory.DeviceMoldItemsHistoryDO; +import com.win.module.eam.dal.dataobject.moldaccounts.MoldAccountsDO; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.devicemaintainplan.DeviceMaintainPlanMapper; +import com.win.module.eam.dal.mysql.devicemolditems.DeviceMoldItemsMapper; +import com.win.module.eam.dal.mysql.devicemolditemshistory.DeviceMoldItemsHistoryMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import com.win.module.eam.enums.status.DevicemolditemsStatusEnum; +import com.win.module.eam.service.maintainback.MaintainBackService; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +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.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.eam.enums.ErrorCodeConstants.DEVICE_MOLD_ITEMS_NOT_EXISTS; + +/** + * 项记录表(设备 模具 保养 维修 巡检点检) Service 实现类 + * + * @author 超级管理员 + */ +@Slf4j +@Service +@Validated +public class DeviceMoldItemsServiceImpl implements DeviceMoldItemsService { + + @Resource + private DeviceMoldItemsMapper deviceMoldItemsMapper; + @Resource + private MoldAccountsMapper moldAccountsMapper; + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + @Resource + private DeviceMaintainPlanMapper deviceMaintainPlanMapper; + @Resource + private SerialNumberApi serialNumberApi; + @Resource + private MaintainBackService maintainBackService; + @Resource + private DeviceMoldItemsHistoryMapper deviceMoldItemsHistoryMapper; + @Override + @Transactional + public Long createDeviceMoldItems(DeviceMoldItemsCreateReqVO createReqVO) { + // 插入 + DeviceMoldItemsDO deviceMoldItems = DeviceMoldItemsConvert.INSTANCE.convert(createReqVO); + deviceMoldItemsMapper.insert(deviceMoldItems); + DeviceMoldItemsHistoryDO deviceMoldItemsHis = DeviceMoldItemsConvert.INSTANCE.convertHis(deviceMoldItems); + log.info("deviceMoldItemsHis={}", deviceMoldItemsHis); + deviceMoldItemsHis.setMasterId(deviceMoldItemsHis.getId()); + deviceMoldItemsHis.setOperatType("2"); + deviceMoldItemsHis.setId(null); + log.info("deviceMoldItemsHisNew={}", deviceMoldItemsHis); + deviceMoldItemsHistoryMapper.insert(deviceMoldItemsHis); + //如果是保养模块 + if (DevicemolditemsStatusEnum.MAINTAIN.getCode().equals(createReqVO.getStatus())) { + synchrodata(deviceMoldItems); + } + // 返回 + return deviceMoldItems.getId(); + } + + public boolean synchrodata(DeviceMoldItemsDO deviceMoldItems) { + boolean flag = true; + if (deviceMoldItems.getDeviceNumber() == null) { + throw new RuntimeException("设备编号不能为空"); + } + if (deviceMoldItems.getExecutionCycle() == null && (deviceMoldItems.getExecutionCycleMonth() == null || deviceMoldItems.getExecutionCycleWeek() == null)) { + throw new RuntimeException("周期不能为空"); + } + DeviceAccountsDO deviceAccountsDO = new DeviceAccountsDO(); + MoldAccountsDO moldAccountsDO = new MoldAccountsDO(); + if (BasicStatusEnum.BASIC_DEVICE.getCode().equals(deviceMoldItems.getType())) { + deviceAccountsDO = deviceAccountsMapper.selectOne(new QueryWrapper().lambda().eq(DeviceAccountsDO::getNumber, deviceMoldItems.getDeviceNumber())); + } else if (BasicStatusEnum.BASIC_MOLD.getCode().equals(deviceMoldItems.getType())) { + moldAccountsDO = moldAccountsMapper.selectOne(new QueryWrapper().lambda().eq(MoldAccountsDO::getNumber, deviceMoldItems.getDeviceNumber())); + } + DeviceMaintainPlanDO newDeviceMaintainPlanDO = null; + DeviceMaintainJobMainDOExpand DeviceMaintainJobMainDOExpand = new DeviceMaintainJobMainDOExpand(); + DeviceMaintainJobMainDOExpand.setDeviceNumber(deviceMoldItems.getDeviceNumber()); + DeviceMaintainJobMainDOExpand.setPeriodCycle(deviceMoldItems.getExecutionCycle()); + DeviceMaintainJobMainDOExpand.setCycleMonth(deviceMoldItems.getExecutionCycleMonth()); + DeviceMaintainJobMainDOExpand.setCycleWeek(deviceMoldItems.getExecutionCycleWeek()); + DeviceMaintainJobMainDOExpand.setType(deviceMoldItems.getType()); + DeviceMaintainJobMainDOExpand.setAvailable(deviceMoldItems.getAvailable()); + if (BasicStatusEnum.BASIC_DEVICE.getCode().equals(deviceMoldItems.getType())) { + DeviceMaintainJobMainDOExpand.setDeptId(deviceAccountsDO.getDeptId()); + } else if (BasicStatusEnum.BASIC_MOLD.getCode().equals(deviceMoldItems.getType())) { + DeviceMaintainJobMainDOExpand.setDeptId(moldAccountsDO.getDeptId()); + } + List DeviceMaintainJobMainDOExpands = deviceMaintainPlanMapper.selectMaintainByDeviceNumberPeriod(DeviceMaintainJobMainDOExpand); + if (DeviceMaintainJobMainDOExpands.size() == 0) { + String number = serialNumberApi.generateCode(RuleCodeEnum.BAO_YANG_JI_HUA_ORDER.getCode()); + DeviceMaintainJobMainDOExpand.setNumber(number); + DeviceMaintainJobMainDOExpand DeviceMaintainJobMainDOExpand1 = new DeviceMaintainJobMainDOExpand(); + if (BasicStatusEnum.BASIC_DEVICE.getCode().equals(deviceMoldItems.getType())) { + DeviceMaintainJobMainDOExpand1 = deviceMaintainPlanMapper.selectMainPlanName(DeviceMaintainJobMainDOExpand); + } else if (BasicStatusEnum.BASIC_MOLD.getCode().equals(deviceMoldItems.getType())) { + DeviceMaintainJobMainDOExpand1 = deviceMaintainPlanMapper.selectMoldMainPlanName(DeviceMaintainJobMainDOExpand); + } + DeviceMaintainJobMainDOExpand.setCycleName(DeviceMaintainJobMainDOExpand1.getCycleName()); + newDeviceMaintainPlanDO = new DeviceMaintainPlanDO(); + newDeviceMaintainPlanDO.setNumber(DeviceMaintainJobMainDOExpand.getNumber()); + newDeviceMaintainPlanDO.setType(DeviceMaintainJobMainDOExpand.getType()); + newDeviceMaintainPlanDO.setName(DeviceMaintainJobMainDOExpand.getCycleName()); + newDeviceMaintainPlanDO.setDeviceNumber(DeviceMaintainJobMainDOExpand.getDeviceNumber()); + newDeviceMaintainPlanDO.setCycle(DeviceMaintainJobMainDOExpand.getPeriodCycle()); + newDeviceMaintainPlanDO.setCycleMonth(DeviceMaintainJobMainDOExpand.getCycleMonth()); + newDeviceMaintainPlanDO.setCycleWeek(DeviceMaintainJobMainDOExpand.getCycleWeek()); + newDeviceMaintainPlanDO.setAvailable(DeviceMaintainJobMainDOExpand.getAvailable()); + if (BasicStatusEnum.BASIC_DEVICE.getCode().equals(deviceMoldItems.getType())) { + newDeviceMaintainPlanDO.setDeptId(DeviceMaintainJobMainDOExpand.getDeptId()); + } else if (BasicStatusEnum.BASIC_MOLD.getCode().equals(deviceMoldItems.getType())) { + newDeviceMaintainPlanDO.setDeptId(DeviceMaintainJobMainDOExpand.getDeptId()); + } + deviceMaintainPlanMapper.insert(newDeviceMaintainPlanDO); + } else { + flag = false; + } + createMaintainBackup(null, newDeviceMaintainPlanDO); + return flag; + } + + public boolean synchrodataUpdate(DeviceMoldItemsDO oldDeviceMoldItemsDO, DeviceMoldItemsDO newDeviceMoldItemsDO) { + + boolean flag = true; + DeviceMaintainPlanDO oldDeviceMaintainPlanDO = null; + DeviceMaintainPlanDO newDeviceMaintainPlanDO = null; + if (oldDeviceMoldItemsDO != null) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("device_number", oldDeviceMoldItemsDO.getDeviceNumber()) + .eq("available", oldDeviceMoldItemsDO.getAvailable()); + + if (oldDeviceMoldItemsDO.getExecutionCycle() != null) { + queryWrapper.eq("execution_cycle", oldDeviceMoldItemsDO.getExecutionCycle()); + } else { + // 当execution_cycle为null时,使用execution_cycle_month和execution_cycle_week作为条件 + queryWrapper.eq("execution_cycle_month", oldDeviceMoldItemsDO.getExecutionCycleMonth()) + .eq("execution_cycle_week", oldDeviceMoldItemsDO.getExecutionCycleWeek()); + } + + List listOld = deviceMoldItemsMapper.selectList(queryWrapper); + if (listOld == null || listOld.size() == 0) { + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("device_number", oldDeviceMoldItemsDO.getDeviceNumber()); + queryWrapper1.eq("available", oldDeviceMoldItemsDO.getAvailable()); + if(oldDeviceMoldItemsDO.getExecutionCycle() != null){ + queryWrapper1.eq("cycle", oldDeviceMoldItemsDO.getExecutionCycle()); + }else{ + queryWrapper1.eq("cycle_month", oldDeviceMoldItemsDO.getExecutionCycleMonth()) + .eq("cycle_week", oldDeviceMoldItemsDO.getExecutionCycleWeek()); + } + oldDeviceMaintainPlanDO = deviceMaintainPlanMapper.selectOne(queryWrapper1); + deviceMaintainPlanMapper.delete(queryWrapper1); + } + } + if (newDeviceMoldItemsDO != null) { + if (newDeviceMoldItemsDO.getDeviceNumber() == null) { + throw new RuntimeException("设备编号不能为空"); + } + if (newDeviceMoldItemsDO.getExecutionCycle() == null && (newDeviceMoldItemsDO.getExecutionCycleMonth() == null || newDeviceMoldItemsDO.getExecutionCycleWeek() == null)) { + throw new RuntimeException("周期不能为空"); + } + DeviceAccountsDO deviceAccountsDO = new DeviceAccountsDO(); + MoldAccountsDO moldAccountsDO = new MoldAccountsDO(); + if (BasicStatusEnum.BASIC_DEVICE.getCode().equals(newDeviceMoldItemsDO.getType())) { + deviceAccountsDO = deviceAccountsMapper.selectOne(new QueryWrapper().lambda().eq(DeviceAccountsDO::getNumber, newDeviceMoldItemsDO.getDeviceNumber())); + } else if (BasicStatusEnum.BASIC_MOLD.getCode().equals(newDeviceMoldItemsDO.getType())) { + moldAccountsDO = moldAccountsMapper.selectOne(new QueryWrapper().lambda().eq(MoldAccountsDO::getNumber, newDeviceMoldItemsDO.getDeviceNumber())); + } + DeviceMaintainJobMainDOExpand DeviceMaintainJobMainDOExpand = new DeviceMaintainJobMainDOExpand(); + DeviceMaintainJobMainDOExpand.setDeviceNumber(newDeviceMoldItemsDO.getDeviceNumber()); + DeviceMaintainJobMainDOExpand.setPeriodCycle(newDeviceMoldItemsDO.getExecutionCycle()); + DeviceMaintainJobMainDOExpand.setCycleMonth(newDeviceMoldItemsDO.getExecutionCycleMonth()); + DeviceMaintainJobMainDOExpand.setCycleWeek(newDeviceMoldItemsDO.getExecutionCycleWeek()); + DeviceMaintainJobMainDOExpand.setType(newDeviceMoldItemsDO.getType()); + DeviceMaintainJobMainDOExpand.setAvailable(newDeviceMoldItemsDO.getAvailable()); + if (BasicStatusEnum.BASIC_DEVICE.getCode().equals(newDeviceMoldItemsDO.getType())) { + DeviceMaintainJobMainDOExpand.setDeptId(deviceAccountsDO.getDeptId()); + } else if (BasicStatusEnum.BASIC_MOLD.getCode().equals(newDeviceMoldItemsDO.getType())) { + DeviceMaintainJobMainDOExpand.setDeptId(moldAccountsDO.getDeptId()); + } + List DeviceMaintainJobMainDOExpands = deviceMaintainPlanMapper.selectMaintainByDeviceNumberPeriod(DeviceMaintainJobMainDOExpand); + if (DeviceMaintainJobMainDOExpands.size() == 0) { + String number = serialNumberApi.generateCode(RuleCodeEnum.BAO_YANG_JI_HUA_ORDER.getCode()); + DeviceMaintainJobMainDOExpand.setNumber(number); + DeviceMaintainJobMainDOExpand DeviceMaintainJobMainDOExpand1 = new DeviceMaintainJobMainDOExpand(); + if (BasicStatusEnum.BASIC_DEVICE.getCode().equals(newDeviceMoldItemsDO.getType())) { + DeviceMaintainJobMainDOExpand1 = deviceMaintainPlanMapper.selectMainPlanName(DeviceMaintainJobMainDOExpand); + } else if (BasicStatusEnum.BASIC_MOLD.getCode().equals(newDeviceMoldItemsDO.getType())) { + DeviceMaintainJobMainDOExpand1 = deviceMaintainPlanMapper.selectMoldMainPlanName(DeviceMaintainJobMainDOExpand); + } + DeviceMaintainJobMainDOExpand.setCycleName(DeviceMaintainJobMainDOExpand1.getCycleName()); + newDeviceMaintainPlanDO = new DeviceMaintainPlanDO(); + newDeviceMaintainPlanDO.setNumber(DeviceMaintainJobMainDOExpand.getNumber()); + newDeviceMaintainPlanDO.setType(DeviceMaintainJobMainDOExpand.getType()); + newDeviceMaintainPlanDO.setName(DeviceMaintainJobMainDOExpand.getCycleName()); + newDeviceMaintainPlanDO.setDeviceNumber(DeviceMaintainJobMainDOExpand.getDeviceNumber()); + newDeviceMaintainPlanDO.setCycle(DeviceMaintainJobMainDOExpand.getPeriodCycle()); + newDeviceMaintainPlanDO.setCycleMonth(DeviceMaintainJobMainDOExpand.getCycleMonth()); + newDeviceMaintainPlanDO.setCycleWeek(DeviceMaintainJobMainDOExpand.getCycleWeek()); + newDeviceMaintainPlanDO.setAvailable(DeviceMaintainJobMainDOExpand.getAvailable()); + if (BasicStatusEnum.BASIC_DEVICE.getCode().equals(newDeviceMoldItemsDO.getType())) { + newDeviceMaintainPlanDO.setDeptId(DeviceMaintainJobMainDOExpand.getDeptId()); + } else if (BasicStatusEnum.BASIC_MOLD.getCode().equals(newDeviceMoldItemsDO.getType())) { + newDeviceMaintainPlanDO.setDeptId(DeviceMaintainJobMainDOExpand.getDeptId()); + } + deviceMaintainPlanMapper.insert(newDeviceMaintainPlanDO); + } else { + flag = false; + } + } + createMaintainBackup(oldDeviceMaintainPlanDO, newDeviceMaintainPlanDO); + return flag; + } + + @Override + public Integer updateDeviceMoldItems(DeviceMoldItemsUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceMoldItemsExists(updateReqVO.getId()); + DeviceMoldItemsDO oldDeviceMoldItemsDO = deviceMoldItemsMapper.selectById(updateReqVO.getId()); + // 更新 + DeviceMoldItemsDO updateObj = DeviceMoldItemsConvert.INSTANCE.convert(updateReqVO); + int result = deviceMoldItemsMapper.updateById(updateObj); + DeviceMoldItemsHistoryDO deviceMoldItemsHis = DeviceMoldItemsConvert.INSTANCE.convertHis(updateReqVO); + deviceMoldItemsHis.setMasterId(deviceMoldItemsHis.getId()); + deviceMoldItemsHis.setOperatType("3"); + deviceMoldItemsHis.setId(null); + deviceMoldItemsHistoryMapper.insert(deviceMoldItemsHis); + //如果是保养模块 + if (DevicemolditemsStatusEnum.MAINTAIN.getCode().equals(updateReqVO.getStatus())) { + if (result == 1) { + DeviceMoldItemsDO newDeviceMoldItemsDO = deviceMoldItemsMapper.selectById(updateReqVO.getId()); + synchrodataUpdate(oldDeviceMoldItemsDO, newDeviceMoldItemsDO); + } + } + return result; + } + + + @Override + public Integer deleteDeviceMoldItems(Long id,String remark) { + // 校验存在 + DeviceMoldItemsDO deviceMoldItemsDO = validateDeviceMoldItemsExists(id); + DeviceMoldItemsDO oldDeviceMoldItemsDO = deviceMoldItemsMapper.selectById(id); + DeviceMoldItemsHistoryDO deviceMoldItemsHis = DeviceMoldItemsConvert.INSTANCE.convertHis(oldDeviceMoldItemsDO); + deviceMoldItemsHis.setRemark(remark); + deviceMoldItemsHis.setMasterId(id); + deviceMoldItemsHis.setOperatType("4"); + deviceMoldItemsHis.setId(null); + deviceMoldItemsHistoryMapper.insert(deviceMoldItemsHis); + // 删除 + int flag = deviceMoldItemsMapper.deleteById(id); + int result = 0; + if (flag != 0) { + boolean syncFlag = synchrodataUpdate(oldDeviceMoldItemsDO, null); + if (syncFlag) { + result = 0; + } else { + result = 1; + } + } + return result; + } + + public int deleteSyncchroMaintainPlan(DeviceMoldItemsDO deviceMoldItemsDO) { + int result = 0; + List list = deviceMoldItemsMapper.selectListByDeviceNumberAndPeriod(deviceMoldItemsDO); + if (list.size() == 0) { + DeviceMaintainJobMainDOExpand DeviceMaintainJobMainDOExpand = new DeviceMaintainJobMainDOExpand(); + DeviceMaintainJobMainDOExpand.setDeviceNumber(deviceMoldItemsDO.getDeviceNumber()); + DeviceMaintainJobMainDOExpand.setPeriodCycle(deviceMoldItemsDO.getExecutionCycle()); + DeviceMaintainJobMainDOExpand.setType(deviceMoldItemsDO.getType()); + result = deviceMaintainPlanMapper.deleteByDeviceNumberAndPeriod(DeviceMaintainJobMainDOExpand); + } + return result; + } + + public void createMaintainBackup(DeviceMaintainPlanDO oldDeviceMaintainPlanDO, DeviceMaintainPlanDO newDeviceMaintainPlanDO) { + MaintainBackCreateReqVO reqVO = new MaintainBackCreateReqVO(); + if (newDeviceMaintainPlanDO != null && oldDeviceMaintainPlanDO != null) { + reqVO.setOperation("update"); + reqVO.setDeviceNumber(newDeviceMaintainPlanDO.getDeviceNumber()); + reqVO.setName(newDeviceMaintainPlanDO.getName()); + reqVO.setNumber(newDeviceMaintainPlanDO.getNumber()); + reqVO.setType(newDeviceMaintainPlanDO.getType()); + reqVO.setNewAvailable(newDeviceMaintainPlanDO.getAvailable()); + reqVO.setNewCycle(newDeviceMaintainPlanDO.getCycle()); + reqVO.setNewCycleMonth(newDeviceMaintainPlanDO.getCycleMonth()); + reqVO.setNewCycleWeek(newDeviceMaintainPlanDO.getCycleWeek()); + if (oldDeviceMaintainPlanDO != null) { + reqVO.setOldAvailable(oldDeviceMaintainPlanDO.getAvailable()); + reqVO.setOldCycle(oldDeviceMaintainPlanDO.getCycle()); + reqVO.setOldCycleMonth(oldDeviceMaintainPlanDO.getCycleMonth()); + reqVO.setOldCycleWeek(oldDeviceMaintainPlanDO.getCycleWeek()); + } + maintainBackService.createMaintainBack(reqVO); + } else if (newDeviceMaintainPlanDO != null && oldDeviceMaintainPlanDO == null) { + reqVO.setOperation("create"); + reqVO.setDeviceNumber(newDeviceMaintainPlanDO.getDeviceNumber()); + reqVO.setName(newDeviceMaintainPlanDO.getName()); + reqVO.setNumber(newDeviceMaintainPlanDO.getNumber()); + reqVO.setType(newDeviceMaintainPlanDO.getType()); + reqVO.setNewAvailable(newDeviceMaintainPlanDO.getAvailable()); + reqVO.setNewCycle(newDeviceMaintainPlanDO.getCycle()); + reqVO.setNewCycleMonth(newDeviceMaintainPlanDO.getCycleMonth()); + reqVO.setNewCycleWeek(newDeviceMaintainPlanDO.getCycleWeek()); + maintainBackService.createMaintainBack(reqVO); + } else if (oldDeviceMaintainPlanDO != null && newDeviceMaintainPlanDO == null) { + reqVO.setOperation("delete"); + reqVO.setDeviceNumber(oldDeviceMaintainPlanDO.getDeviceNumber()); + reqVO.setName(oldDeviceMaintainPlanDO.getName()); + reqVO.setNumber(oldDeviceMaintainPlanDO.getNumber()); + reqVO.setType(oldDeviceMaintainPlanDO.getType()); + reqVO.setOldAvailable(oldDeviceMaintainPlanDO.getAvailable()); + reqVO.setOldCycle(oldDeviceMaintainPlanDO.getCycle()); + reqVO.setOldCycleMonth(oldDeviceMaintainPlanDO.getCycleMonth()); + reqVO.setOldCycleWeek(oldDeviceMaintainPlanDO.getCycleWeek()); + maintainBackService.createMaintainBack(reqVO); + } + + } + + + private DeviceMoldItemsDO validateDeviceMoldItemsExists(Long id) { + DeviceMoldItemsDO deviceMoldItemsDO = deviceMoldItemsMapper.selectById(id); + if (deviceMoldItemsDO == null) { + throw exception(DEVICE_MOLD_ITEMS_NOT_EXISTS); + } else { + return deviceMoldItemsDO; + } + } + + @Override + public DeviceMoldItemsDO getDeviceMoldItems(Long id) { + return deviceMoldItemsMapper.selectById(id); + } + + @Override + public List getDeviceMoldItemsList(Collection ids) { + return deviceMoldItemsMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceMoldItemsPage(DeviceMoldItemsPageReqVO pageReqVO) { + PageResult pageResult = deviceMoldItemsMapper.selectPage(pageReqVO); + for (DeviceMoldItemsDO deviceMoldItemsDO : pageResult.getList()) { + // 模具 + if ("MOLD".equals(pageReqVO.getType())) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", deviceMoldItemsDO.getDeviceNumber()); + queryWrapper.eq("deleted", 0); + queryWrapper.eq("available", "TRUE"); + MoldAccountsDO moldAccountsDO = moldAccountsMapper.selectOne(queryWrapper); + deviceMoldItemsDO.setDeviceName(moldAccountsDO.getName()); + } + // 设备 + else if ("DEVICE".equals(pageReqVO.getType())) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", deviceMoldItemsDO.getDeviceNumber()); + queryWrapper.eq("deleted", 0); + queryWrapper.eq("available", "TRUE"); + DeviceAccountsDO deviceAccountsDO = deviceAccountsMapper.selectOne(queryWrapper); + deviceMoldItemsDO.setDeviceName(deviceAccountsDO.getName()); + } + } + return pageResult; + } + + @Override + public List getDeviceMoldItemsList(DeviceMoldItemsExportReqVO exportReqVO) { + return deviceMoldItemsMapper.selectList(exportReqVO); + } + + @Override + public List getListByNumber(String number) { + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("available", "TRUE"); + itemQueryWrapper.eq("deleted", 0); + itemQueryWrapper.eq("status", "INSPECTION"); + itemQueryWrapper.eq("device_number", number); + return deviceMoldItemsMapper.selectList(itemQueryWrapper); + } + + @Override + public Object getNumber(DeviceMoldItemsPageReqVO pageReqVO) { + Object object = new ArrayList<>(); + // 模具 + if ("MOLD".equals(pageReqVO.getType())) { + object = moldAccountsMapper.selectNumber(pageReqVO); + } + // 设备 + else if ("DEVICE".equals(pageReqVO.getType())) { + object = deviceAccountsMapper.selectNumber(pageReqVO); + } + return object; + } + + @Override + public void testPlan(String date,String type) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("available","TRUE"); + queryWrapper.eq("status","MAINTAIN"); + queryWrapper.eq("type",type); + if(date!=null&&!date.isEmpty()){ + queryWrapper.eq("create_time",date); + } + if(type!=null&&!type.isEmpty()){ + queryWrapper.eq("type",type); + } + List deviceMoldItemsDOS = deviceMoldItemsMapper.selectList(queryWrapper); + for(DeviceMoldItemsDO en:deviceMoldItemsDOS){ + synchrodata(en); + } + + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemolditemshistory/DeviceMoldItemsHistoryService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemolditemshistory/DeviceMoldItemsHistoryService.java new file mode 100644 index 0000000..20e433d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemolditemshistory/DeviceMoldItemsHistoryService.java @@ -0,0 +1,80 @@ +package com.win.module.eam.service.devicemolditemshistory; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemolditemshistory.vo.*; +import com.win.module.eam.dal.dataobject.devicemolditemshistory.DeviceMoldItemsHistoryDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +/** + * 项记录历史表(设备 模具 保养 维修 巡检点检) Service 接口 + * + * @author Lu.jl + */ +public interface DeviceMoldItemsHistoryService { + + /** + * 创建项记录历史表(设备 模具 保养 维修 巡检点检) + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMoldItemsHistory(@Valid DeviceMoldItemsHistoryCreateReqVO createReqVO); + + /** + * 更新项记录历史表(设备 模具 保养 维修 巡检点检) + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceMoldItemsHistory(@Valid DeviceMoldItemsHistoryUpdateReqVO updateReqVO); + + /** + * 删除项记录历史表(设备 模具 保养 维修 巡检点检) + * + * @param id 编号 + */ + Integer deleteDeviceMoldItemsHistory(Long id); + + /** + * 获得项记录历史表(设备 模具 保养 维修 巡检点检) + * + * @param id 编号 + * @return 项记录历史表(设备 模具 保养 维修 巡检点检) + */ + DeviceMoldItemsHistoryDO getDeviceMoldItemsHistory(Long id); + + /** + * 获得项记录历史表(设备 模具 保养 维修 巡检点检)列表 + * + * @param ids 编号 + * @return 项记录历史表(设备 模具 保养 维修 巡检点检)列表 + */ + List getDeviceMoldItemsHistoryList(Collection ids); + + /** + * 获得项记录历史表(设备 模具 保养 维修 巡检点检)分页 + * + * @param pageReqVO 分页查询 + * @return 项记录历史表(设备 模具 保养 维修 巡检点检)分页 + */ + PageResult getDeviceMoldItemsHistoryPage(DeviceMoldItemsHistoryPageReqVO pageReqVO); + + /** + * 获得项记录历史表(设备 模具 保养 维修 巡检点检)列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 项记录历史表(设备 模具 保养 维修 巡检点检)列表 + */ + List getDeviceMoldItemsHistoryList(DeviceMoldItemsHistoryExportReqVO exportReqVO); + + /** + * 导入项记录历史表(设备 模具 保养 维修 巡检点检)主信息 + * + * @param datas 导入项记录历史表(设备 模具 保养 维修 巡检点检)主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceMoldItemsHistoryList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemolditemshistory/DeviceMoldItemsHistoryServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemolditemshistory/DeviceMoldItemsHistoryServiceImpl.java new file mode 100644 index 0000000..33807fe --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicemolditemshistory/DeviceMoldItemsHistoryServiceImpl.java @@ -0,0 +1,107 @@ +package com.win.module.eam.service.devicemolditemshistory; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemolditemshistory.vo.*; +import com.win.module.eam.convert.devicemolditemshistory.DeviceMoldItemsHistoryConvert; +import com.win.module.eam.dal.dataobject.devicemolditemshistory.DeviceMoldItemsHistoryDO; +import com.win.module.eam.dal.mysql.devicemolditemshistory.DeviceMoldItemsHistoryMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.eam.enums.ErrorCodeConstants.DEVICE_MOLD_ITEMS_HISTORY_NOT_EXISTS; + +/** + * 项记录历史表(设备 模具 保养 维修 巡检点检) Service 实现类 + * + * @author Lu.jl + */ +@Service +@Validated +public class DeviceMoldItemsHistoryServiceImpl implements DeviceMoldItemsHistoryService { + + @Resource + private DeviceMoldItemsHistoryMapper deviceMoldItemsHistoryMapper; + + @Override + public Long createDeviceMoldItemsHistory(DeviceMoldItemsHistoryCreateReqVO createReqVO) { + // 插入 + DeviceMoldItemsHistoryDO deviceMoldItemsHistory = DeviceMoldItemsHistoryConvert.INSTANCE.convert(createReqVO); + deviceMoldItemsHistoryMapper.insert(deviceMoldItemsHistory); + // 返回 + return deviceMoldItemsHistory.getId(); + } + + @Override + public Integer updateDeviceMoldItemsHistory(DeviceMoldItemsHistoryUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceMoldItemsHistoryExists(updateReqVO.getId()); + // 更新 + DeviceMoldItemsHistoryDO updateObj = DeviceMoldItemsHistoryConvert.INSTANCE.convert(updateReqVO); + return deviceMoldItemsHistoryMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceMoldItemsHistory(Long id) { + // 校验存在 + validateDeviceMoldItemsHistoryExists(id); + // 删除 + return deviceMoldItemsHistoryMapper.deleteById(id); + } + + private void validateDeviceMoldItemsHistoryExists(Long id) { + if (deviceMoldItemsHistoryMapper.selectById(id) == null) { + throw exception(DEVICE_MOLD_ITEMS_HISTORY_NOT_EXISTS); + } + } + + @Override + public DeviceMoldItemsHistoryDO getDeviceMoldItemsHistory(Long id) { + return deviceMoldItemsHistoryMapper.selectById(id); + } + + @Override + public List getDeviceMoldItemsHistoryList(Collection ids) { + return deviceMoldItemsHistoryMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceMoldItemsHistoryPage(DeviceMoldItemsHistoryPageReqVO pageReqVO) { + return deviceMoldItemsHistoryMapper.selectPage(pageReqVO); + } + + @Override + public List getDeviceMoldItemsHistoryList(DeviceMoldItemsHistoryExportReqVO exportReqVO) { + return deviceMoldItemsHistoryMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceMoldItemsHistoryList(List datas, Integer mode, boolean updatePart) { +// if (CollUtil.isEmpty(datas)) { +// throw exception(DEVICE_MOLD_ITEMS_HISTORY_IMPORT_LIST_IS_EMPTY); +// } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceMoldItemsHistoryDO obj = deviceMoldItemsHistoryMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceMoldItemsHistoryMapper.insert(DeviceMoldItemsHistoryConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceMoldItemsHistoryDO deviceMoldItemsHistoryDO = DeviceMoldItemsHistoryConvert.INSTANCE.convert(item); +// deviceMoldItemsHistoryDO.setId(obj.getId()); +// deviceMoldItemsHistoryMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicerepairrequest/DeviceRepairRequestService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicerepairrequest/DeviceRepairRequestService.java new file mode 100644 index 0000000..5f5bb47 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicerepairrequest/DeviceRepairRequestService.java @@ -0,0 +1,113 @@ +package com.win.module.eam.service.devicerepairrequest; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicerepairrequest.vo.*; +import com.win.module.eam.dal.dataobject.devicerepairrequest.DeviceRepairRequestDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 报修申请 Service 接口 + * + * @author 超级管理员 + */ +public interface DeviceRepairRequestService { + + /** + * 创建报修申请 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceRepair(@Valid DeviceRepairRequestRequestCreateReqVO createReqVO); + + /** + * 更新报修申请 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceRepair(@Valid DeviceRepairRequestRequestUpdateReqVO updateReqVO); + + /** + * 删除报修申请 + * + * @param id 编号 + */ + Integer deleteDeviceRepair(Long id); + + /** + * 删除报修申请 + * + * @param id 编号 + */ + Integer rejectedDeviceRepair(Long id); + + /** + * 获得报修申请 + * + * @param id 编号 + * @return 报修申请 + */ + DeviceRepairRequestDO getDeviceRepair(Long id); + + /** + * 获得报修申请列表 + * + * @param ids 编号 + * @return 报修申请列表 + */ + List getDeviceRepairList(Collection ids); + + /** + * 获得报修申请分页 + * + * @param pageReqVO 分页查询 + * @return 报修申请分页 + */ + PageResult getDeviceRepairPage(DeviceRepairRequestPageReqVO pageReqVO); + + /** + * 获得报修申请分页 + * + * @param conditions 分页查询 + * @return 报修申请分页 + */ + PageResult getDeviceRepairSenior(CustomConditions conditions); + + PageResult getAppPage(DeviceRepairRequestPageReqVO pageReqVO); + + /** + * 获得报修申请列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 报修申请列表 + */ + List getDeviceRepairList(DeviceRepairRequestExportReqVO exportReqVO); + + /** + * 根据报修申请号查询报修详情 + * @param requestNumber + * @return + */ + Map getDetailsByNumber(String requestNumber,String type); + + /** + * 导入报修申请主信息 + * + * @param datas 导入报修申请主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceRepairList(List datas, Integer mode, boolean updatePart); + + + + DeviceRepairRequestDO getOrderByNumber(String requestNumber); + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicerepairrequest/DeviceRepairRequestServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicerepairrequest/DeviceRepairRequestServiceImpl.java new file mode 100644 index 0000000..131d06f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicerepairrequest/DeviceRepairRequestServiceImpl.java @@ -0,0 +1,360 @@ +package com.win.module.eam.service.devicerepairrequest; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.attachmentfile.vo.UploadFileRequest; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobMainCreateReqVO; +import com.win.module.eam.controller.devicerepairrequest.vo.*; +import com.win.module.eam.convert.devicerepairrequest.DeviceRepairRequestConvert; +import com.win.module.eam.dal.dataobject.attachmentfile.AttachmentFileDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.dal.dataobject.devicerepairrequest.DeviceRepairRequestDO; +import com.win.module.eam.dal.mysql.attachmentfile.AttachmentFileMapper; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobMainMapper; +import com.win.module.eam.dal.mysql.devicerepairrequest.DeviceRepairRequestMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.eam.service.attachmentfile.AttachmentFileService; +import com.win.module.eam.service.deviceaccounts.DeviceAccountsService; +import com.win.module.eam.service.devicemaintenancejob.DeviceMaintenanceJobMainService; +import com.win.module.eam.service.moldaccounts.MoldAccountsService; +import com.win.module.system.api.mail.MailSendApi; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.ArrayList; +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.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + + +/** + * 报修申请 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class DeviceRepairRequestServiceImpl implements DeviceRepairRequestService { + + @Resource + private DeviceRepairRequestMapper deviceRepairRequestMapper; + + @Resource + private DeviceMaintenanceJobMainMapper deviceMaintenanceJobMainMapper; + + @Resource + private SerialNumberApi serialNumberApi; + + @Resource + private AdminUserApi userApi; + + + @Resource + private DeviceMaintenanceJobMainService deviceMaintenanceJobMainService; + + @Resource + private DeviceAccountsService deviceAccountsService; + + @Resource + private MoldAccountsMapper moldAccountsMapper; + + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + + @Resource + private AttachmentFileService attachmentFileService; + + @Resource + private AttachmentFileMapper attachmentFileMapper; + + @Resource + private MoldAccountsService moldAccountsService; + + @Resource + private AdminUserApi adminUserApi; + + @Resource + private MailSendApi mailSendApi; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDeviceRepair(DeviceRepairRequestRequestCreateReqVO createReqVO) { + // 插入 + DeviceRepairRequestDO deviceRepair = DeviceRepairRequestConvert.INSTANCE.convert(createReqVO); + deviceRepair.setResult(OrderStatusEnum.PEND_ORDER_STATUS.getCode());//待接单 + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + String number = serialNumberApi.generateCode(RuleCodeEnum.REQUEST_REPAIR.getCode()); + deviceRepair.setNumber(number); + deviceRepair.setDeptId(Long.parseLong(createReqVO.getFactoryAreaNumber())); + deviceRepair.setDeclarer(user.getId()); + List filePathList = createReqVO.getFilePathList(); + if(filePathList!=null&&!filePathList.isEmpty()){//有图片 + UploadFileRequest uploadFileRequest = new UploadFileRequest(); + uploadFileRequest.setNumber(number); + uploadFileRequest.setFuncCode("request_repair"); + uploadFileRequest.setFilePathList(filePathList); + attachmentFileService.uploadFile(uploadFileRequest); + } + deviceRepairRequestMapper.insert(deviceRepair); + //添加维修工单 + DeviceMaintenanceJobMainCreateReqVO createReqVOS =new DeviceMaintenanceJobMainCreateReqVO(); + createReqVOS.setRequestNumber(number); + createReqVOS.setType(createReqVO.getType()); + createReqVOS.setDeviceNumber(createReqVO.getDeviceNumber()); + createReqVOS.setFactoryAreaNumber(createReqVO.getFactoryAreaNumber()); + createReqVOS.setDescribes(createReqVO.getDescribes()); + createReqVOS.setStatus(OrderStatusEnum.PEND_ORDER_STATUS.getCode()); + Long deviceMaintenanceMain = deviceMaintenanceJobMainService.createDeviceMaintenanceMain(createReqVOS);// 返回 + //修改台账保修状态 + if(deviceMaintenanceMain!=null){ + //更新设备模具状态 + if(BasicStatusEnum.BASIC_MOLD.getCode().equals(createReqVO.getType()) ){ + moldAccountsService.updateMoldAccountsStatus(createReqVO.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_1.getCode()); + } else { + deviceAccountsService.updateDeviceAccountsStatus(createReqVO.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_1.getCode()); + } + } + return deviceMaintenanceMain; + } + + @Override + public Integer updateDeviceRepair(DeviceRepairRequestRequestUpdateReqVO updateReqVO) { + // 校验存在 + //validateDeviceRepairExists(updateReqVO.getId(),updateReqVO.getNumber(),"1"); + // 更新 + DeviceRepairRequestDO updateObj = DeviceRepairRequestConvert.INSTANCE.convert(updateReqVO); + return deviceRepairRequestMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer deleteDeviceRepair(Long id) { + // 校验存在 + validateDeviceRepairExists(id,"0"); + // 删除 + deviceRepairRequestMapper.deleteById(id); + DeviceRepairRequestDO deviceRepairRequestDO = deviceRepairRequestMapper.selectById(id); + return deviceMaintenanceJobMainService.deleteStatus(deviceRepairRequestDO.getNumber()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer rejectedDeviceRepair(Long id) { + // 校验存在 + validateDeviceRepairExists(id,"1"); + // 删除 + DeviceRepairRequestDO deviceRepairRequestDO1 = deviceRepairRequestMapper.selectById(id); + long declarer = deviceRepairRequestDO1.getDeclarer(); + long loginUserId = getLoginUserId(); + if(declarer!=loginUserId){//只有报修人才能撤销 + throw exception(PEOPLE_NO_NOMAL);//当前人无法执行撤销操作 + } + deviceRepairRequestDO1.setResult(OrderStatusEnum.REJECTED_STATUS.getCode());//已驳回 + int i = deviceRepairRequestMapper.updateById(deviceRepairRequestDO1); + //更新设备模具状态 + if(BasicStatusEnum.BASIC_DEVICE.getCode().equals(deviceRepairRequestDO1.getType()) ){ + deviceAccountsService.updateDeviceAccountsStatus(deviceRepairRequestDO1.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_0.getCode()); + }if(BasicStatusEnum.BASIC_TECH.getCode().equals(deviceRepairRequestDO1.getType()) ){ + deviceAccountsService.updateDeviceAccountsStatus(deviceRepairRequestDO1.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_0.getCode()); + }else if(BasicStatusEnum.BASIC_MOLD.getCode().equals(deviceRepairRequestDO1.getType()) ){ + moldAccountsService.updateMoldAccountsStatus(deviceRepairRequestDO1.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_0.getCode()); + } + List requestNumber = deviceMaintenanceJobMainMapper.selectList("request_number", deviceRepairRequestDO1.getNumber()); + if(requestNumber!=null&&!requestNumber.isEmpty()){ + DeviceMaintenanceJobMainDO maintenanceJobMainDO = requestNumber.get(0); + maintenanceJobMainDO.setStatus(OrderStatusEnum.REJECTED_STATUS.getCode()); + deviceMaintenanceJobMainMapper.updateById(maintenanceJobMainDO); + } + return i; + } + + /** + * 根据id获取该订单是否接单 + * 校验id + * @param type 0删除1驳回 + */ + private void validateDeviceRepairExists(Long id,String type) { + if (deviceRepairRequestMapper.selectById(id) == null) { + throw exception(REQUEST_REPAIR_NOT_EXISTS); + } + Long l = deviceRepairRequestMapper.selectCountById(id, OrderStatusEnum.PEND_ORDER_STATUS.getCode());//待接单 + if(l==0){ + if("0".equals(type)){ + throw exception(REQUEST_REPAIR_DEL_EXISTS);//以接单不能删除 + }else{ + throw exception(REQUEST_REPAIR_PRE_EXISTS);//以接单不能驳回 + } + } + } + + @Override + public DeviceRepairRequestDO getDeviceRepair(Long id) { + return deviceRepairRequestMapper.selectById(id); + } + + @Override + public List getDeviceRepairList(Collection ids) { + return deviceRepairRequestMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceRepairPage(DeviceRepairRequestPageReqVO pageReqVO) { + PageResult deviceRepairDOPageResult = deviceRepairRequestMapper.selectPage(pageReqVO); + List deviceRepairList = deviceRepairDOPageResult.getList(); + deviceRepairList.stream().forEach(deviceRepair -> { + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setFuncCode("request_repair"); + attachmentFileDO.setNumber(deviceRepair.getNumber()); + List list = attachmentFileService.getAttachmentFilePathList(attachmentFileDO); + // 设置filePathList字段 + if(list!= null && list.size() > 0){ + deviceRepair.setFilePathList(list); + } + }); + return deviceRepairDOPageResult; + } + + @Override + public PageResult getDeviceRepairSenior(CustomConditions conditions) { + PageResult deviceRepairDOPageResult = deviceRepairRequestMapper.selectSenior(conditions); + List deviceRepairList = deviceRepairDOPageResult.getList(); + deviceRepairList.stream().forEach(deviceRepair -> { + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setFuncCode("request_repair"); + attachmentFileDO.setNumber(deviceRepair.getNumber()); + List list = attachmentFileService.getAttachmentFilePathList(attachmentFileDO); + // 设置filePathList字段 + if(list!= null && list.size() > 0){ + deviceRepair.setFilePathList(list); + } + }); + return deviceRepairDOPageResult; + } + + @Override + public PageResult getAppPage(DeviceRepairRequestPageReqVO pageReqVO) { + pageReqVO.setUserId(getLoginUserId().toString()); + if("1".equals(pageReqVO.getFlag())){//flag 0 首页进入 1我的进入 + //我的里面都是获取的是当前人已经完成的单子 + IPage pageInfo = deviceRepairRequestMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for(DeviceRepairRequestDO en :pageInfo.getRecords()){ + String deviceNumber = en.getDeviceNumber(); + String type = en.getType(); + if("MOLD".equals(type)){//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + }else{//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + } + //循环申请图片 + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setNumber(en.getNumber()); + attachmentFileDO.setFuncCode("request_repair"); + List attachmentFileList = attachmentFileMapper.getAttachmentFileList(attachmentFileDO); + List list = new ArrayList<>(); + for(AttachmentFileDO attachment:attachmentFileList){ + list.add(attachment.getPath()); + } + en.setFilePathList(list); + } + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + }else{ + //首页进入是获取未接单 已接单的单子 + pageReqVO.setFlag("0"); + } + IPage pageInfo = deviceRepairRequestMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for(DeviceRepairRequestDO en :pageInfo.getRecords()){ + //循环申请图片 + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setNumber(en.getNumber()); + attachmentFileDO.setFuncCode("request_repair"); + List attachmentFileList = attachmentFileMapper.getAttachmentFileList(attachmentFileDO); + List list = new ArrayList<>(); + for(AttachmentFileDO attachment:attachmentFileList){ + list.add(attachment.getPath()); + } + en.setFilePathList(list); + } + return new PageResult<>(pageInfo.getRecords() , pageInfo.getTotal()); + } + return null; + } + + @Override + public List getDeviceRepairList(DeviceRepairRequestExportReqVO exportReqVO) { + return deviceRepairRequestMapper.selectList(exportReqVO); + } + + @Override + public Map getDetailsByNumber(String requestNumber,String type) { + Map en = deviceRepairRequestMapper.getDetailsByNumber(requestNumber, type); + if(en!=null){ + //循环申请图片 + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setNumber(en.get("number").toString()); + attachmentFileDO.setFuncCode("request_repair"); + List attachmentFileList = attachmentFileMapper.getAttachmentFileList(attachmentFileDO); + List list = new ArrayList<>(); + for(AttachmentFileDO attachment:attachmentFileList){ + list.add(attachment.getPath()); + } + en.put("filePathList",list); + } + return en; + } + + @Override + public List importDeviceRepairList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_REPAIR_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceRepairDO obj = deviceRepairMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceRepairMapper.insert(DeviceRepairConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceRepairDO deviceRepairDO = DeviceRepairConvert.INSTANCE.convert(item); +// deviceRepairDO.setId(obj.getId()); +// deviceRepairMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public DeviceRepairRequestDO getOrderByNumber(String requestNumber) { + return deviceRepairRequestMapper.getOrderByNumber(requestNumber); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailService.java new file mode 100644 index 0000000..5a80a5f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailService.java @@ -0,0 +1,87 @@ +package com.win.module.eam.service.devicespotinspectionrecord; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.devicespotinspectionrecord.vo.*; +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 巡检点检记录子 Service 接口 + * + * @author 超级管理员 + */ +public interface DeviceSpotInspectionRecordDetailService { + + /** + * 创建巡检点检记录子 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceSpotInspectionRecordDetail(@Valid DeviceSpotInspectionRecordDetailCreateReqVO createReqVO); + + /** + * 更新巡检点检记录子 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceSpotInspectionRecordDetail(@Valid DeviceSpotInspectionRecordDetailUpdateReqVO updateReqVO); + + /** + * 删除巡检点检记录子 + * + * @param id 编号 + */ + Integer deleteDeviceSpotInspectionRecordDetail(Long id); + + /** + * 获得巡检点检记录子 + * + * @param id 编号 + * @return 巡检点检记录子 + */ + DeviceSpotInspectionRecordDetailDO getDeviceSpotInspectionRecordDetail(Long id); + + /** + * 获得巡检点检记录子列表 + * + * @param ids 编号 + * @return 巡检点检记录子列表 + */ + List getDeviceSpotInspectionRecordDetailList(Collection ids); + + /** + * 根据巡检工单号查询子项信息 + * @param number + * @return + */ + List getList(String number); + + /** + * 获得巡检点检记录子分页 + * + * @param pageReqVO 分页查询 + * @return 巡检点检记录子分页 + */ + PageResult getDeviceSpotInspectionRecordDetailPage(DeviceSpotInspectionRecordDetailPageReqVO pageReqVO); + + /** + * 获得巡检点检记录子列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 巡检点检记录子列表 + */ + List getDeviceSpotInspectionRecordDetailList(DeviceSpotInspectionRecordDetailExportReqVO exportReqVO); + + /** + * 导入巡检点检记录子主信息 + * + * @param datas 导入巡检点检记录子主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceSpotInspectionRecordDetailList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailServiceImpl.java new file mode 100644 index 0000000..02f63c9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailServiceImpl.java @@ -0,0 +1,111 @@ +package com.win.module.eam.service.devicespotinspectionrecord; + +import cn.hutool.core.collection.CollUtil; +import com.win.module.eam.controller.devicespotinspectionrecord.vo.*; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailDO; +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.convert.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailConvert; +import com.win.module.eam.dal.mysql.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailMapper; + + + +/** + * 巡检点检记录子 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class DeviceSpotInspectionRecordDetailServiceImpl implements DeviceSpotInspectionRecordDetailService { + + @Resource + private DeviceSpotInspectionRecordDetailMapper deviceSpotInspectionRecordDetailMapper; + + @Override + public Long createDeviceSpotInspectionRecordDetail(DeviceSpotInspectionRecordDetailCreateReqVO createReqVO) { + // 插入 + DeviceSpotInspectionRecordDetailDO deviceSpotInspectionRecordDetail = DeviceSpotInspectionRecordDetailConvert.INSTANCE.convert(createReqVO); + deviceSpotInspectionRecordDetailMapper.insert(deviceSpotInspectionRecordDetail); + // 返回 + return deviceSpotInspectionRecordDetail.getId(); + } + + @Override + public Integer updateDeviceSpotInspectionRecordDetail(DeviceSpotInspectionRecordDetailUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceSpotInspectionRecordDetailExists(updateReqVO.getId()); + // 更新 + DeviceSpotInspectionRecordDetailDO updateObj = DeviceSpotInspectionRecordDetailConvert.INSTANCE.convert(updateReqVO); + return deviceSpotInspectionRecordDetailMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceSpotInspectionRecordDetail(Long id) { + // 校验存在 + validateDeviceSpotInspectionRecordDetailExists(id); + // 删除 + return deviceSpotInspectionRecordDetailMapper.deleteById(id); + } + + private void validateDeviceSpotInspectionRecordDetailExists(Long id) { + if (deviceSpotInspectionRecordDetailMapper.selectById(id) == null) { + // throw exception(DEVICE_SPOT_INSPECTION_RECORD_DETAIL_NOT_EXISTS); + } + } + + @Override + public DeviceSpotInspectionRecordDetailDO getDeviceSpotInspectionRecordDetail(Long id) { + return deviceSpotInspectionRecordDetailMapper.selectById(id); + } + + @Override + public List getDeviceSpotInspectionRecordDetailList(Collection ids) { + return deviceSpotInspectionRecordDetailMapper.selectBatchIds(ids); + } + + @Override + public List getList(String number) { + return deviceSpotInspectionRecordDetailMapper.selectList("number",number); + } + + @Override + public PageResult getDeviceSpotInspectionRecordDetailPage(DeviceSpotInspectionRecordDetailPageReqVO pageReqVO) { + return deviceSpotInspectionRecordDetailMapper.selectPage(pageReqVO); + } + + @Override + public List getDeviceSpotInspectionRecordDetailList(DeviceSpotInspectionRecordDetailExportReqVO exportReqVO) { + return deviceSpotInspectionRecordDetailMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceSpotInspectionRecordDetailList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_SPOT_INSPECTION_RECORD_DETAIL_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceSpotInspectionRecordDetailDO obj = deviceSpotInspectionRecordDetailMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceSpotInspectionRecordDetailMapper.insert(DeviceSpotInspectionRecordDetailConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceSpotInspectionRecordDetailDO deviceSpotInspectionRecordDetailDO = DeviceSpotInspectionRecordDetailConvert.INSTANCE.convert(item); +// deviceSpotInspectionRecordDetailDO.setId(obj.getId()); +// deviceSpotInspectionRecordDetailMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicespotinspectionrecord/DeviceSpotInspectionRecordMainService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicespotinspectionrecord/DeviceSpotInspectionRecordMainService.java new file mode 100644 index 0000000..8d87aae --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicespotinspectionrecord/DeviceSpotInspectionRecordMainService.java @@ -0,0 +1,130 @@ +package com.win.module.eam.service.devicespotinspectionrecord; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicespotinspectionrecord.vo.*; +import com.win.module.eam.dal.dataobject.devicemolditems.DeviceMoldItemsDO; +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordMainDO; +import org.springframework.web.bind.annotation.RequestParam; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 检修工单主 Service 接口 + * + * @author 超级管理员 + */ +public interface DeviceSpotInspectionRecordMainService { + + /** + * 创建检修工单主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceSpotInspectionRecordMain(@Valid DeviceSpotInspectionRecordMainCreateReqVO createReqVO); + + /** + * 更新检修工单主 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceSpotInspectionRecordMain(@Valid DeviceSpotInspectionRecordMainUpdateReqVO updateReqVO); + + /** + * 删除检修工单主 + * + * @param id 编号 + */ + Integer deleteDeviceSpotInspectionRecordMain(Long id); + + /** + * 暂无用 + * @param id + * @return + */ + Integer orderClickFinish(Long id); + + /** + * 巡检点检审核 + * @param id 工单id + * @param status APPROVEREJECTED 审核不通过 APPROVEPASS审核通过 + * @param approveOpinion 审核意见 + * @return + */ + Integer orderClickApprove(Long id,String status,String approveOpinion); + + /** + * 获得检修工单主 + * + * @param id 编号 + * @return 检修工单主 + */ + DeviceSpotInspectionRecordMainDO getDeviceSpotInspectionRecordMain(Long id); + + /** + * 获得检修工单主列表 + * + * @param ids 编号 + * @return 检修工单主列表 + */ + List getDeviceSpotInspectionRecordMainList(Collection ids); + + /** + * 获得检修工单主分页 + * + * @param pageReqVO 分页查询 + * @return 检修工单主分页 + */ + PageResult getDeviceSpotInspectionRecordMainPage(DeviceSpotInspectionRecordMainPageReqVO pageReqVO); + + + /** + * 获得检修工单主分页 + * + * @param conditions 分页查询 + * @return 检修工单主分页 + */ + PageResult getDeviceSpotInspectionRecordMainSenior(CustomConditions conditions); + + + /** + * 获得检修工单主列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 检修工单主列表 + */ + List getDeviceSpotInspectionRecordMainList(DeviceSpotInspectionRecordMainExportReqVO exportReqVO); + + /** + * 导入检修工单主主信息 + * + * @param datas 导入检修工单主主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + List importDeviceSpotInspectionRecordMainList(List datas, Integer mode, boolean updatePart); + + /** + * 根据设备或模具编码查询巡检点检项列表 + * @param number + * @return + */ + List getDeviceMoldItemsList(String number); + + /** + * fenye + * @param pageReqVO + * @return + */ + PageResult getAppPage(DeviceSpotInspectionRecordMainPageReqVO pageReqVO); + + /** + * 巡检点检每天的定时任务 + * @param type 0 上午1下午 + */ + void createSpotInspectionTask(int type); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicespotinspectionrecord/DeviceSpotInspectionRecordMainServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicespotinspectionrecord/DeviceSpotInspectionRecordMainServiceImpl.java new file mode 100644 index 0000000..e2ab2b4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/devicespotinspectionrecord/DeviceSpotInspectionRecordMainServiceImpl.java @@ -0,0 +1,395 @@ +package com.win.module.eam.service.devicespotinspectionrecord; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.module.eam.controller.devicespotinspectionrecord.vo.*; +import com.win.module.eam.convert.devicespotinspectionrecord.DeviceSpotInspectionRecordMainConvert; +import com.win.module.eam.dal.dataobject.classtype.ClassTypeDO; +import com.win.module.eam.dal.dataobject.deviceaccounts.DeviceAccountsDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.dal.dataobject.devicemolditems.DeviceMoldItemsDO; +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailDO; +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordMainDO; +import com.win.module.eam.dal.dataobject.moldaccounts.MoldAccountsDO; +import com.win.module.eam.dal.mysql.classtype.ClassTypeMapper; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.devicemolditems.DeviceMoldItemsMapper; +import com.win.module.eam.dal.mysql.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailMapper; +import com.win.module.eam.dal.mysql.devicespotinspectionrecord.DeviceSpotInspectionRecordMainMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.infra.api.config.ApiConfigApi; +import com.win.module.infra.api.config.dto.ConfigDTO; +import com.win.module.system.api.dept.DeptApi; +import com.win.module.system.api.mail.MailSendApi; +import com.win.module.system.api.mail.dto.MailSendSingleToUserReqDTO; +import com.win.module.system.api.permission.PermissionApi; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.api.user.dto.AdminUserRespExpandDTO; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +import oracle.jdbc.logging.annotations.StringBlinder; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import javax.swing.*; + +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import com.win.framework.common.pojo.PageResult; + + +import static cn.hutool.log.StaticLog.info; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 检修工单主 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class DeviceSpotInspectionRecordMainServiceImpl implements DeviceSpotInspectionRecordMainService { + + @Resource + private DeviceSpotInspectionRecordMainMapper deviceSpotInspectionRecordMainMapper; + + @Resource + private DeviceSpotInspectionRecordDetailMapper deviceSpotInspectionRecordDetailMapper; + + @Resource + private DeviceMoldItemsMapper deviceMoldItemsMapper; + + @Resource + private AdminUserApi userApi; + + @Resource + private ApiConfigApi apiConfigApi; + + @Resource + private MailSendApi mailSendApi; + + @Resource + private PermissionApi permissionApi; + + @Resource + private DeptApi deptApi; + + @Resource + private SerialNumberApi serialNumberApi; + + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + + @Resource + private MoldAccountsMapper moldAccountsMapper; + + @Resource + private ClassTypeMapper classTypeMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDeviceSpotInspectionRecordMain(DeviceSpotInspectionRecordMainCreateReqVO createReqVO) { + // 主巡检点检记录插入 + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + DeviceSpotInspectionRecordMainDO deviceSpotInspectionRecordMain = DeviceSpotInspectionRecordMainConvert.INSTANCE.convert(createReqVO); + String number = serialNumberApi.generateCode(RuleCodeEnum.XUN_JIAN_ORDER.getCode()); + deviceSpotInspectionRecordMain.setNumber(number); + deviceSpotInspectionRecordMain.setMaintenance(getLoginUserId()); + deviceSpotInspectionRecordMain.setStatus(OrderStatusEnum.JX_COMPLETED_STATUS.getCode());//完成 + deviceSpotInspectionRecordMain.setCompletionTime(LocalDateTime.now()); + if("MOLD".equals(createReqVO.getType())){//模具 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", createReqVO.getDeviceNumber()); + MoldAccountsDO deviceAccountsDO = moldAccountsMapper.selectOne(queryWrapper); + deviceSpotInspectionRecordMain.setDeptId(Long.parseLong(deviceAccountsDO.getFactoryAreaNumber())); + }else{ + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", createReqVO.getDeviceNumber()); + DeviceAccountsDO deviceAccountsDO = deviceAccountsMapper.selectOne(queryWrapper); + deviceSpotInspectionRecordMain.setDeptId(Long.parseLong(deviceAccountsDO.getFactoryAreaNumber())); + } + int i = deviceSpotInspectionRecordMainMapper.insert(deviceSpotInspectionRecordMain); + deviceSpotInspectionRecordMain.getId(); + //子巡检项信息录入 + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("available", "TRUE"); + itemQueryWrapper.eq("deleted", 0); + itemQueryWrapper.eq("status", "INSPECTION"); + itemQueryWrapper.eq("device_number", createReqVO.getDeviceNumber()); + List deviceMoldItemsDOS = deviceMoldItemsMapper.selectList(itemQueryWrapper); + for(DeviceMoldItemsDO en:deviceMoldItemsDOS){ + DeviceSpotInspectionRecordDetailDO inspectionRecordDetailDO = new DeviceSpotInspectionRecordDetailDO(); + List> subList = createReqVO.getSubList(); + if(!subList.isEmpty()){ + for(Map map:subList){ + long id = Long.parseLong(map.get("id").toString()); + if(id==en.getId()){ + inspectionRecordDetailDO.setIsConform(map.get("isConform")==null?"FALSE":map.get("isConform").toString()); + } + } + } + inspectionRecordDetailDO.setMasterId(deviceSpotInspectionRecordMain.getId()); + inspectionRecordDetailDO.setNumber(number); + inspectionRecordDetailDO.setName(en.getName()); + inspectionRecordDetailDO.setEquipmentPosition(en.getEquipmentParts()); + deviceSpotInspectionRecordDetailMapper.insert(inspectionRecordDetailDO); + } + Long id = deviceSpotInspectionRecordMain.getId(); + //发送邮件 + try { + sendEmails(deviceSpotInspectionRecordMain); + } catch (Exception e) { + info("发送邮件异常:{}",e); + } + return id; + } + + @Override + public Integer updateDeviceSpotInspectionRecordMain(DeviceSpotInspectionRecordMainUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceSpotInspectionRecordMainExists(updateReqVO.getId()); + // 更新 + DeviceSpotInspectionRecordMainDO updateObj = DeviceSpotInspectionRecordMainConvert.INSTANCE.convert(updateReqVO); + return deviceSpotInspectionRecordMainMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceSpotInspectionRecordMain(Long id) { + // 校验存在 + validateDeviceSpotInspectionRecordMainExists(id); + // 删除 + return deviceSpotInspectionRecordMainMapper.deleteById(id); + } + + @Override + public Integer orderClickFinish(Long id) { + DeviceSpotInspectionRecordMainDO mainDO = deviceSpotInspectionRecordMainMapper.selectById(id); + // 校验存在 + if (mainDO == null) { + throw exception(XUN_JIAN_ORDER_NOT_EXISTS); + } + mainDO.setId(id); + //mainDO.setStatus(); + return deviceSpotInspectionRecordMainMapper.updateById(mainDO); + } + + @Override + public Integer orderClickApprove(Long id, String status, String approveOpinion) { + DeviceSpotInspectionRecordMainDO Do = deviceSpotInspectionRecordMainMapper.selectById(id); + // 校验存在 + if (Do == null) { + throw exception(XUN_JIAN_ORDER_NOT_EXISTS); + } + if(!permissionApi.BooleanEngineer()){ + throw exception(WEI_XIU_NOT_ENGINEER); + } + Do.setStatus(status); + Do.setApproveOpinion(approveOpinion); + Do.setVerifyer(getLoginUserId()); + Do.setVerifyTime(LocalDateTime.now()); + //mainDO.setStatus(); + return deviceSpotInspectionRecordMainMapper.updateById(Do); + } + + private void validateDeviceSpotInspectionRecordMainExists(Long id) { + if (deviceSpotInspectionRecordMainMapper.selectById(id) == null) { + throw exception(XUN_JIAN_ORDER_NOT_EXISTS); + } + } + + @Override + public DeviceSpotInspectionRecordMainDO getDeviceSpotInspectionRecordMain(Long id) { + return deviceSpotInspectionRecordMainMapper.selectById(id); + } + + @Override + public List getDeviceSpotInspectionRecordMainList(Collection ids) { + return deviceSpotInspectionRecordMainMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceSpotInspectionRecordMainPage(DeviceSpotInspectionRecordMainPageReqVO pageReqVO) { + return deviceSpotInspectionRecordMainMapper.selectPage(pageReqVO); + } + + + @Override + public PageResult getDeviceSpotInspectionRecordMainSenior(CustomConditions conditions) { + return deviceSpotInspectionRecordMainMapper.selectSenior(conditions); + } + + + @Override + public List getDeviceSpotInspectionRecordMainList(DeviceSpotInspectionRecordMainExportReqVO exportReqVO) { + return deviceSpotInspectionRecordMainMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceSpotInspectionRecordMainList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_SPOT_INSPECTION_RECORD_MAIN_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceSpotInspectionRecordMainDO obj = deviceSpotInspectionRecordMainMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceSpotInspectionRecordMainMapper.insert(DeviceSpotInspectionRecordMainConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceSpotInspectionRecordMainDO deviceSpotInspectionRecordMainDO = DeviceSpotInspectionRecordMainConvert.INSTANCE.convert(item); +// deviceSpotInspectionRecordMainDO.setId(obj.getId()); +// deviceSpotInspectionRecordMainMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public List getDeviceMoldItemsList(String number) { + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("available", "TRUE"); + itemQueryWrapper.eq("deleted", 0); + itemQueryWrapper.eq("device_number", number); + return deviceMoldItemsMapper.selectList(itemQueryWrapper); + } + + @Override + public PageResult getAppPage(DeviceSpotInspectionRecordMainPageReqVO pageReqVO) { + pageReqVO.setUserId(getLoginUserId().toString()); + pageReqVO.setClassType("DEVICE"); + IPage pageInfo = deviceSpotInspectionRecordMainMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for(DeviceSpotInspectionRecordMainDO en :pageInfo.getRecords()){ + String deviceNumber = en.getDeviceNumber(); + String type = en.getType(); + if("MOLD".equals(type)){//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + }else{//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + } + + } + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + + + + @Override + public void createSpotInspectionTask(int type) { + String times = null; + String classes = "0"; + if(0==type){//早班巡检 + // 设置为当天的 8:30 + ConfigDTO configByKey = apiConfigApi.getConfigByKey("record_spot_inspection.start_time"); + String value = configByKey.getValue(); + times = LocalDateTimeUtil.format(LocalDate.now(), "yyyy-MM-dd"); + times = times+" "+value; + }else{//晚班巡检 + classes = "1"; + // 设置为当天的 17:30 + ConfigDTO configByKey = apiConfigApi.getConfigByKey("record_spot_inspection.end_time"); + String value = configByKey.getValue(); + times = LocalDateTimeUtil.format(LocalDate.now(), "yyyy-MM-dd"); + times = times+" "+value; + } + List> list2 = deptApi.selectAllFactoryArea(); + for (Map map : list2) { + // 如果Map中已存在该键,则添加 + String factoryAreaNumber = map.get("id").toString(); + List list = deviceSpotInspectionRecordMainMapper.selectSpotInspectionTask(times,factoryAreaNumber,classes); + StringBuilder str = new StringBuilder(); + for(DeviceSpotInspectionRecordMainDO en:list){ + str.append("

  设备名称("); + String name = en.getName(); + str.append(name); + str.append("),"); + str.append("设备号("); + String deviceNumber = en.getDeviceNumber(); + str.append(deviceNumber); + str.append(")

"); + } + //发送邮件 + try { + if(!list.isEmpty()){ + sendEmails(times,str.toString(),factoryAreaNumber); + } + } catch (Exception e) { + info("发送邮件异常:{}",e); + } + } + } + + /** + * 每天定时巡检点检发送邮件 + * @param times + * @param str + * @param factoryAreaNumber + */ + private void sendEmails(String times,String str,String factoryAreaNumber){ + List userBeanList = classTypeMapper.JudgeIdentity(null, "DEVICE", "1", factoryAreaNumber); + userBeanList.stream().forEach(item ->{ + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getUserId())); + mailSendSingleToUserReqDTO.setTemplateCode("record-spot-inspection-template"); + Map params = new HashMap<>(); + params.put("str", str); + params.put("times", times); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + }catch(RuntimeException e){ + info("巡检点检的日期为"+times+",来自"+factoryAreaNumber+"给设备工程师发送的邮件通知失败:{}", e); + } + }); + } + + /** + * 巡检点验证给工程师发邮件 + * @param mainDO + */ + private void sendEmails(DeviceSpotInspectionRecordMainDO mainDO){ + List userBeanList = classTypeMapper.JudgeIdentity(null, mainDO.getType(), "1", mainDO.getFactoryAreaNumber()); + userBeanList.stream().forEach(item ->{ + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getUserId())); + mailSendSingleToUserReqDTO.setTemplateCode("record_spot_inspection_verify"); + Map params = new HashMap<>(); + params.put("typeName","设备"); + params.put("number", mainDO.getNumber()); + params.put("name", item.getNickname()); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + }catch(RuntimeException e){ + info("工单编号为"+mainDO.getNumber()+"的名为:"+mainDO.getDescribes()+"的工单给"+item.getNickname()+"发送的邮件通知失败:{}", e); + } + }); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/factoryarea/FactoryAreaService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/factoryarea/FactoryAreaService.java new file mode 100644 index 0000000..32d3cd9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/factoryarea/FactoryAreaService.java @@ -0,0 +1,72 @@ +package com.win.module.eam.service.factoryarea; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.factoryarea.vo.*; +import com.win.module.eam.dal.dataobject.factoryarea.FactoryAreaDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 厂区 Service 接口 + * + * @author 超级管理员 + */ +public interface FactoryAreaService { + + /** + * 创建厂区 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createFactoryArea(@Valid FactoryAreaCreateReqVO createReqVO); + + /** + * 更新厂区 + * + * @param updateReqVO 更新信息 + */ + Integer updateFactoryArea(@Valid FactoryAreaUpdateReqVO updateReqVO); + + /** + * 删除厂区 + * + * @param id 编号 + */ + Integer deleteFactoryArea(Long id); + + /** + * 获得厂区 + * + * @param id 编号 + * @return 厂区 + */ + FactoryAreaDO getFactoryArea(Long id); + + /** + * 获得厂区列表 + * + * @param ids 编号 + * @return 厂区列表 + */ + List getFactoryAreaList(Collection ids); + + /** + * 获得厂区分页 + * + * @param pageReqVO 分页查询 + * @return 厂区分页 + */ + PageResult getFactoryAreaPage(FactoryAreaPageReqVO pageReqVO); + + /** + * 获得厂区列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 厂区列表 + */ + List getFactoryAreaList(FactoryAreaExportReqVO exportReqVO); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/factoryarea/FactoryAreaServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/factoryarea/FactoryAreaServiceImpl.java new file mode 100644 index 0000000..e4eede3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/factoryarea/FactoryAreaServiceImpl.java @@ -0,0 +1,98 @@ +package com.win.module.eam.service.factoryarea; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.factoryarea.vo.FactoryAreaCreateReqVO; +import com.win.module.eam.controller.factoryarea.vo.FactoryAreaExportReqVO; +import com.win.module.eam.controller.factoryarea.vo.FactoryAreaPageReqVO; +import com.win.module.eam.controller.factoryarea.vo.FactoryAreaUpdateReqVO; +import com.win.module.eam.convert.factoryarea.FactoryAreaConvert; +import com.win.module.eam.dal.dataobject.factoryarea.FactoryAreaDO; +import com.win.module.eam.dal.mysql.factoryarea.FactoryAreaMapper; +import com.win.module.infra.api.trends.TrendsApi; +import com.win.module.infra.enums.TrendsTypeEnum; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +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; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.eam.enums.ErrorCodeConstants.FACTORY_AREA_NOT_EXISTS; + +/** + * 厂区 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class FactoryAreaServiceImpl implements FactoryAreaService { + + @Resource + private FactoryAreaMapper factoryAreaMapper; + @Resource + private SerialNumberApi serialNumberApi; + @Resource + private TrendsApi trendsApi; + + @Override + public Long createFactoryArea(FactoryAreaCreateReqVO createReqVO) { + // 插入 + FactoryAreaDO factoryArea = FactoryAreaConvert.INSTANCE.convert(createReqVO); + String number = serialNumberApi.generateCode(RuleCodeEnum.Factory_Area.getCode()); + factoryArea.setNumber(number); + factoryArea.setCreateTime(LocalDateTime.now()); + factoryAreaMapper.insert(factoryArea); + trendsApi.createTrends(factoryArea.getId(), "FactoryArea", "增加了厂区", TrendsTypeEnum.CREATE); + // 返回 + return factoryArea.getId(); + } + + @Override + public Integer updateFactoryArea(FactoryAreaUpdateReqVO updateReqVO) { + // 校验存在 + validateFactoryAreaExists(updateReqVO.getId()); + // 更新 + FactoryAreaDO updateObj = FactoryAreaConvert.INSTANCE.convert(updateReqVO); + return factoryAreaMapper.updateById(updateObj); + } + + @Override + public Integer deleteFactoryArea(Long id) { + // 校验存在 + validateFactoryAreaExists(id); + // 删除 + return factoryAreaMapper.deleteById(id); + } + + private void validateFactoryAreaExists(Long id) { + if (factoryAreaMapper.selectById(id) == null) { + throw exception(FACTORY_AREA_NOT_EXISTS); + } + } + + @Override + public FactoryAreaDO getFactoryArea(Long id) { + return factoryAreaMapper.selectById(id); + } + + @Override + public List getFactoryAreaList(Collection ids) { + return factoryAreaMapper.selectBatchIds(ids); + } + + @Override + public PageResult getFactoryAreaPage(FactoryAreaPageReqVO pageReqVO) { + return factoryAreaMapper.selectPage(pageReqVO); + } + + @Override + public List getFactoryAreaList(FactoryAreaExportReqVO exportReqVO) { + return factoryAreaMapper.selectList(exportReqVO); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/fixedassets/FixedAssetsService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/fixedassets/FixedAssetsService.java new file mode 100644 index 0000000..9af3488 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/fixedassets/FixedAssetsService.java @@ -0,0 +1,90 @@ +package com.win.module.eam.service.fixedassets; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.fixedassets.vo.*; +import com.win.module.eam.dal.dataobject.fixedassets.FixedAssetsDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 固定资产 Service 接口 + * + * @author 超级管理员 + */ +public interface FixedAssetsService { + + /** + * 创建固定资产 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createFixedAssets(@Valid FixedAssetsCreateReqVO createReqVO); + + /** + * 更新固定资产 + * + * @param updateReqVO 更新信息 + */ + Integer updateFixedAssets(@Valid FixedAssetsUpdateReqVO updateReqVO); + + /** + * 删除固定资产 + * + * @param id 编号 + */ + Integer deleteFixedAssets(Long id); + + /** + * 获得固定资产 + * + * @param id 编号 + * @return 固定资产 + */ + FixedAssetsDO getFixedAssets(Long id); + + /** + * 获得固定资产列表 + * + * @param ids 编号 + * @return 固定资产列表 + */ + List getFixedAssetsList(Collection ids); + + /** + * 获得固定资产分页 + * + * @param pageReqVO 分页查询 + * @return 固定资产分页 + */ + PageResult getFixedAssetsPage(FixedAssetsPageReqVO pageReqVO); + + /** + * 获得固定资产分页 + * + * @param conditions 分页查询 + * @return 固定资产分页 + */ + PageResult getFixedAssetsSenior(CustomConditions conditions); + + /** + * 获得固定资产列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 固定资产列表 + */ + List getFixedAssetsList(FixedAssetsExportReqVO exportReqVO); + + /** + * 导入固定资产主信息 + * + * @param datas 导入固定资产主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importFixedAssetsList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/fixedassets/FixedAssetsServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/fixedassets/FixedAssetsServiceImpl.java new file mode 100644 index 0000000..291285f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/fixedassets/FixedAssetsServiceImpl.java @@ -0,0 +1,128 @@ +package com.win.module.eam.service.fixedassets; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.fixedassets.vo.*; +import com.win.module.eam.convert.fixedassets.FixedAssetsConvert; +import com.win.module.eam.dal.dataobject.fixedassets.FixedAssetsDO; +import com.win.module.eam.dal.mysql.fixedassets.FixedAssetsMapper; +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.serialnumber.SerialNumberApi; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.eam.enums.ErrorCodeConstants.FIXED_ASSETS_NOT_EXISTS; + +/** + * 固定资产 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class FixedAssetsServiceImpl implements FixedAssetsService { + + @Resource + private FixedAssetsMapper fixedAssetsMapper; + @Resource + private SerialNumberApi serialNumberApi; + @Resource + private RoleApi roleApi; + @Resource + private PermissionApi permissionApi; + @Resource + private DictDataApi dictDataApi; + + @Override + public Long createFixedAssets(FixedAssetsCreateReqVO createReqVO) { + // 插入 + FixedAssetsDO fixedAssets = FixedAssetsConvert.INSTANCE.convert(createReqVO); +// String number = serialNumberApi.generateCode(RuleCodeEnum.FIXED_ASSETS.getCode()); +// fixedAssets.setNumber(number); + fixedAssetsMapper.insert(fixedAssets); + // 返回 + return fixedAssets.getId(); + } + + @Override + public Integer updateFixedAssets(FixedAssetsUpdateReqVO updateReqVO) { + // 校验存在 + validateFixedAssetsExists(updateReqVO.getId()); + // 更新 + FixedAssetsDO updateObj = FixedAssetsConvert.INSTANCE.convert(updateReqVO); + return fixedAssetsMapper.updateById(updateObj); + } + + @Override + public Integer deleteFixedAssets(Long id) { + // 校验存在 + validateFixedAssetsExists(id); + // 删除 + return fixedAssetsMapper.deleteById(id); + } + + private void validateFixedAssetsExists(Long id) { + if (fixedAssetsMapper.selectById(id) == null) { + throw exception(FIXED_ASSETS_NOT_EXISTS); + } + } + + @Override + public FixedAssetsDO getFixedAssets(Long id) { + return fixedAssetsMapper.selectById(id); + } + + @Override + public List getFixedAssetsList(Collection ids) { + return fixedAssetsMapper.selectBatchIds(ids); + } + + @Override + public PageResult getFixedAssetsPage(FixedAssetsPageReqVO pageReqVO) { + // 调用Mapper方法进行分页查询 + return fixedAssetsMapper.selectPage(pageReqVO); + } + + @Override + public PageResult getFixedAssetsSenior(CustomConditions conditions) { + return fixedAssetsMapper.selectSenior(conditions); + } + + @Override + public List getFixedAssetsList(FixedAssetsExportReqVO exportReqVO) { + return fixedAssetsMapper.selectList(exportReqVO); + } + + @Override + public List importFixedAssetsList(List datas, Integer mode, boolean updatePart) { +// if (CollUtil.isEmpty(datas)) { +// throw exception(FIXED_ASSETS_IMPORT_LIST_IS_EMPTY); +// } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// FixedAssetsDO obj = fixedAssetsMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// fixedAssetsMapper.insert(FixedAssetsConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// FixedAssetsDO fixedAssetsDO = FixedAssetsConvert.INSTANCE.convert(item); +// fixedAssetsDO.setId(obj.getId()); +// fixedAssetsMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/homePage/HomePageService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/homePage/HomePageService.java new file mode 100644 index 0000000..4720b5b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/homePage/HomePageService.java @@ -0,0 +1,31 @@ +package com.win.module.eam.service.homePage; +import com.win.module.eam.dal.dataobject.yearequipment.BasciYearEquipmentDO; + +import java.util.List; +import java.util.Map; + +/** + * pc首页 + */ +public interface HomePageService { + + /** + * 获取首页数据 + * @return + */ + Map select(); + + /** + * 获取年度指标 + * @return + */ + Map selectYearIndex(); + + /** + * 根据厂区类型获取折线统计数据 + * @param factory + * @return + */ + Map selectMonthGraphByFactory(String factory); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/homePage/HomePageServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/homePage/HomePageServiceImpl.java new file mode 100644 index 0000000..6bba03f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/homePage/HomePageServiceImpl.java @@ -0,0 +1,322 @@ +package com.win.module.eam.service.homePage; + +import cn.hutool.core.date.LocalDateTimeUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import com.win.module.eam.dal.dataobject.yearequipment.BasciYearEquipmentDO; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.devicemaintainjob.DeviceMaintainJobMainMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailItemMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobMainMapper; +import com.win.module.eam.dal.mysql.devicerepairrequest.DeviceRepairRequestMapper; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.eam.dal.mysql.maintenanceturnto.MaintenanceTurntoMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.dal.mysql.monthequipment.BasicMonthEquipmentMapper; +import com.win.module.eam.dal.mysql.yearequipment.BasciYearEquipmentMapper; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.eam.service.moldrepairrequest.MoldRepairRequestService; +import com.win.module.system.api.dept.DeptApi; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.time.LocalDate; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 首页 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class HomePageServiceImpl implements HomePageService { + + @Resource + private DeviceMaintenanceJobMainMapper deviceMaintenanceJobMainMapper;//维修工单 + + @Resource + private DeviceMaintainJobMainMapper deviceMaintainJobMainMapper;//保养 + + @Resource + private DeviceRepairRequestMapper deviceRepairRequestMapper; + @Lazy + @Resource + private MoldRepairRequestService moldRepairRequestService; + + @Resource + private MaintenanceTurntoMapper maintenanceTurntoMapper; + + @Resource + private DeviceMaintenanceJobDetailMapper deviceMaintenanceJobDetailMapper; + @Resource + DeviceMaintenanceJobDetailItemMapper deviceMaintenanceJobDetailItemMapper; + + @Resource + ItemMapper itemMapper; + + @Resource + private MoldAccountsMapper moldAccountsMapper; + + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + + @Resource + private BasciYearEquipmentMapper basciYearEquipmentMapper; + + @Resource + private BasicMonthEquipmentMapper basicMonthEquipmentMapper; + + @Resource + private DeptApi deptApi; + + + @Override + public Map select() { + Map map = new HashMap<>(); + map.put("zsZs",0);//当前设备数 + map.put("zsTJ",0);//当前设备停机状态 + map.put("zsWC","0%");//月设备保养完成率 + map.put("zsTime",0);//月汇总停机时间(完成时间-接单时间) + map.put("tzZs",0);//当前设备数 + map.put("tzTJ",0);////当前设备停机状态 + map.put("tzWC","0%");//月设备保养完成率 + map.put("tzTime",0);//月汇总停机时间(完成时间-接单时间) + map.put("zpZs",0);//当前设备数 + map.put("zpTJ",0);////当前设备停机状态 + map.put("zpWC","0%");//月设备保养完成率 + map.put("zpTime",0);//月汇总停机时间(完成时间-接单时间) + LocalDate now = LocalDate.now(); + String date = LocalDateTimeUtil.format(now, "yyyy-MM"); + LocalDate[] localDate = new LocalDate[2]; + localDate[0] = now; + localDate[1] = now; + List> list = deptApi.selectAllFactoryArea(); + for(Map mp:list){ + if("ZS".equals(mp.get("busiType"))){//注塑车间 + String factoryAreaNumber = mp.get("id").toString(); + Long zsTJ = deviceAccountsMapper.selectCountByFactoryAreaNumber(factoryAreaNumber, "1"); + Long zsZs = deviceAccountsMapper.selectCountByFactoryAreaNumber(factoryAreaNumber, null); + map.put("zsTJ",zsTJ); + map.put("zsZs",zsZs); + List completeSum = deviceMaintainJobMainMapper.selectList3(date, factoryAreaNumber, BasicStatusEnum.BASIC_DEVICE.getCode(),OrderStatusEnum.RESULT_COMPLETED.getCode());//当月保养数 + List zsSum = deviceMaintainJobMainMapper.selectList3(date, factoryAreaNumber, BasicStatusEnum.BASIC_DEVICE.getCode(),null);//当月保养数 + BigDecimal complete = new BigDecimal(completeSum.size()); + BigDecimal zs = new BigDecimal(zsSum.size()); + if(zs.compareTo(new BigDecimal(0))!=0){//说明不等于零 + // 执行除法运算 + BigDecimal result = complete.divide(zs, 2, RoundingMode.HALF_UP); // 保留两位小数,四舍五入 + // 转换为百分比并保留两位小数 + BigDecimal percentage = result.multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP); + map.put("zsWC",percentage.toString()+"%"); + } + + Integer i = deviceMaintenanceJobMainMapper.selectMinuteSum(date,factoryAreaNumber); + map.put("zsTime",i==null?0:i); + }else if("TZ".equals(mp.get("busiType"))){//涂装车间 + String factoryAreaNumber = mp.get("id").toString(); + Long tzTJ = deviceAccountsMapper.selectCountByFactoryAreaNumber(factoryAreaNumber, "1"); + Long tzZs = deviceAccountsMapper.selectCountByFactoryAreaNumber(factoryAreaNumber, null); + map.put("tzTJ",tzTJ); + map.put("tzZs",tzZs); + List completeSum = deviceMaintainJobMainMapper.selectList3(date, factoryAreaNumber, BasicStatusEnum.BASIC_DEVICE.getCode(),OrderStatusEnum.RESULT_COMPLETED.getCode());//当月保养数 + List zsSum = deviceMaintainJobMainMapper.selectList3(date, factoryAreaNumber, BasicStatusEnum.BASIC_DEVICE.getCode(),null);//当月保养数 + BigDecimal complete = new BigDecimal(completeSum.size()); + BigDecimal zs = new BigDecimal(zsSum.size()); + if(zs.compareTo(new BigDecimal(0))!=0){//说明不等于零 + // 执行除法运算 + BigDecimal result = complete.divide(zs, 2, RoundingMode.HALF_UP); // 保留两位小数,四舍五入 + // 转换为百分比并保留两位小数 + BigDecimal percentage = result.multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP); + map.put("tzWC",percentage.toString()+"%"); + } + Integer i = deviceMaintenanceJobMainMapper.selectMinuteSum(date,factoryAreaNumber); + map.put("tzTime",i==null?0:i); + }else if("ZP".equals(mp.get("busiType"))){//装配车间 + String factoryAreaNumber = mp.get("id").toString(); + Long zpTJ = deviceAccountsMapper.selectCountByFactoryAreaNumber(factoryAreaNumber, "1"); + Long zpZs = deviceAccountsMapper.selectCountByFactoryAreaNumber(factoryAreaNumber, null); + map.put("zpTJ",zpTJ); + map.put("zpZs",zpZs); + List completeSum = deviceMaintainJobMainMapper.selectList3(date, factoryAreaNumber, BasicStatusEnum.BASIC_DEVICE.getCode(),OrderStatusEnum.RESULT_COMPLETED.getCode());//当月保养数 + List zsSum = deviceMaintainJobMainMapper.selectList3(date, factoryAreaNumber, BasicStatusEnum.BASIC_DEVICE.getCode(),null);//当月保养数 + BigDecimal complete = new BigDecimal(completeSum.size()); + BigDecimal zs = new BigDecimal(zsSum.size()); + if(zs.compareTo(new BigDecimal(0))!=0) {//说明不等于0 + // 执行除法运算 + BigDecimal result = complete.divide(zs, 2, RoundingMode.HALF_UP); // 保留两位小数,四舍五入 + // 转换为百分比并保留两位小数 + BigDecimal percentage = result.multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP); + map.put("zpWC",percentage.toString()+"%"); + } + Integer i = deviceMaintenanceJobMainMapper.selectMinuteSum(date,factoryAreaNumber); + map.put("zpTime",i==null?0:i); + } + } + return map; + } + + @Override + public Map selectYearIndex() { + DecimalFormat df = new DecimalFormat("0.00"); + DecimalFormat df1 = new DecimalFormat("0"); + double goals = 0.0; + double actuals = 0.0; + Map map = new HashMap<>(); + //注塑车间 + map.put("zsTJName","设备停机率"); + map.put("zsTJGoal",""); + map.put("zsTJActual",""); + map.put("zsHFName","平均故障恢复时间(MTTR/min)"); + map.put("zsHFGoal",""); + map.put("zsHFActual",""); + map.put("zsJGName","平均故障间隔时间(H)"); + map.put("zsJGGoal",""); + map.put("zsJGActual",""); + + //装配车间 + map.put("zpTJName","设备停机率"); + map.put("zpTJGoal",""); + map.put("zpTJActual",""); + map.put("zpHFName","平均故障恢复时间(MTTR/min)"); + map.put("zpHFGoal",""); + map.put("zpHFActual",""); + map.put("zpJGName","平均故障间隔时间(H)"); + map.put("zpJGGoal",""); + map.put("zpJGActual",""); + + //涂装车间 + map.put("tzTJName","设备停机率"); + map.put("tzTJGoal",""); + map.put("tzTJActual",""); + map.put("tzHFName","平均故障恢复时间(MTTR/min)"); + map.put("tzHFGoal",""); + map.put("tzHFActual",""); + map.put("tzJGName","平均故障间隔时间(H)"); + map.put("tzJGGoal",""); + map.put("tzJGActual",""); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("year_index",LocalDateTimeUtil.format(LocalDate.now(),"yyyy")); + List list = basciYearEquipmentMapper.selectList(queryWrapper); + for(BasciYearEquipmentDO en:list) { + String factoryType = en.getFactoryType(); + String type = en.getType(); + String goal = en.getGoal(); + if(goal!=null&&!goal.isEmpty()){ + goals = Double.parseDouble(goal); + } + String actual = en.getActual(); + if(actual!=null&&!actual.isEmpty()){ + actuals = Double.parseDouble(actual); + } + if(actual==null||"".equals(actual)){ + actual = null; + } + if ("ZS".equals(factoryType)) {//注塑车间 + if("0".equals(type)){//设备停机率 + map.put("zsTJGoal",df.format(goals)+"%"); + map.put("zsTJActual",actual==null?"":df.format(actuals)+"%"); + }else if("1".equals(type)){//平均故障间隔时间(H) + map.put("zsJGGoal",df1.format(goals)); + map.put("zsJGActual",actual==null?"":df1.format(actuals)); + }else if("2".equals(type)){//平均故障恢复时间(MTTR/min) + map.put("zsHFGoal",df1.format(goals)); + map.put("zsHFActual",actual==null?"":df1.format(actuals)); + } + } + if ("TZ".equals(factoryType)) {//涂装车间 + if("0".equals(type)){//设备停机率 + map.put("tzTJGoal",df.format(goals)+"%"); + map.put("tzTJActual",actual==null?"":df.format(actuals)+"%"); + }else if("1".equals(type)){//平均故障间隔时间(H) + map.put("tzJGGoal",df1.format(goals)); + map.put("tzJGActual",actual==null?"":df1.format(actuals)); + }else if("2".equals(type)){//平均故障恢复时间(MTTR/min) + map.put("tzHFGoal",df1.format(goals)); + map.put("tzHFActual",actual==null?"":df1.format(actuals)); + } + } + if ("ZP".equals(factoryType)) {//装配塑车间 + if("0".equals(type)){//设备停机率 + map.put("zpTJGoal",df.format(goals)+"%"); + map.put("zpTJActual",actual==null?"":df.format(actuals)+"%"); + }else if("1".equals(type)){//平均故障间隔时间(H) + map.put("zpJGGoal",df1.format(goals)); + map.put("zpJGActual",actual==null?"":df1.format(actuals)); + }else if("2".equals(type)){//平均故障恢复时间(MTTR/min) + map.put("zpHFGoal",df1.format(goals)); + map.put("zpHFActual",actual==null?"":df1.format(actuals)); + } + } + } + return map; + } + + @Override + public Map selectMonthGraphByFactory(String factory) { + Map map = new HashMap<>(); + String goal = "0"; + String goal1 = "0"; + String goal2 = "0"; + String year = LocalDateTimeUtil.format(LocalDate.now(), "yyyy"); + List> list = basicMonthEquipmentMapper.selectMonthGraph("0", factory, year);//设备停机率 + List doubles = processingData(list); + map.put("TJACT",doubles); + List> list1 = basicMonthEquipmentMapper.selectMonthGraph("1", factory, year);//平均故障间隔时间 + List doubles1 = processingData(list1); + map.put("JGACT",doubles1); + List> list2 = basicMonthEquipmentMapper.selectMonthGraph("2", factory, year);//平均故障恢复时间MTTR + List doubles2 = processingData(list2); + map.put("HFACT",doubles2); + QueryWrapper query = new QueryWrapper<>(); + query.eq("type","0"); + query.eq("factory_type",factory); + query.eq("year_index",year); + BasciYearEquipmentDO basciYearEquipmentDO = basciYearEquipmentMapper.selectOne(query); + if(basciYearEquipmentDO!=null){ + goal = basciYearEquipmentDO.getGoal(); + } + QueryWrapper query1 = new QueryWrapper<>(); + query1.eq("type","1"); + query1.eq("factory_type",factory); + query1.eq("year_index",year); + BasciYearEquipmentDO basciYearEquipmentDO1 = basciYearEquipmentMapper.selectOne(query1); + if(basciYearEquipmentDO1!=null){ + goal1 = basciYearEquipmentDO1.getGoal(); + } + QueryWrapper query2 = new QueryWrapper<>(); + query2.eq("type","2"); + query2.eq("factory_type",factory); + query2.eq("year_index",year); + BasciYearEquipmentDO basciYearEquipmentDO2 = basciYearEquipmentMapper.selectOne(query2); + if(basciYearEquipmentDO2!=null){ + goal2 = basciYearEquipmentDO2.getGoal(); + } + map.put("TJAGOAL",Double.valueOf(goal)); + map.put("JGGOAL",Double.valueOf(goal1)); + map.put("HFGOAL",Double.valueOf(goal2)); + return map; + } + + /** + * 处理数据list转 + * @param list + * @return + */ + private List processingData(List> list){ + List fieldValues = list.stream() + .map(map -> Double.valueOf(map.get("actual").toString())) // 获取字段值,假设它们都是字符串 + .collect(Collectors.toList()); + return fieldValues; + } +} \ No newline at end of file diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/item/ItemService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/item/ItemService.java new file mode 100644 index 0000000..96c5bdd --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/item/ItemService.java @@ -0,0 +1,133 @@ +package com.win.module.eam.service.item; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.item.vo.ItemCreateReqVO; +import com.win.module.eam.controller.item.vo.ItemExportReqVO; +import com.win.module.eam.controller.item.vo.ItemPageReqVO; +import com.win.module.eam.controller.item.vo.ItemUpdateReqVO; +import com.win.module.eam.dal.dataobject.item.ItemDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 备件 Service 接口 + * + * @author 超级管理员 + */ +public interface ItemService { + + /** + * 创建备件 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createItem(@Valid ItemCreateReqVO createReqVO); + + /** + * 更新备件 + * + * @param updateReqVO 更新信息 + */ + Integer updateItem(@Valid ItemUpdateReqVO updateReqVO); + + /** + * 删除备件 + * + * @param id 编号 + */ + Integer deleteItem(Long id); + + /** + * 获得备件 + * + * @param id 编号 + * @return 备件 + */ + ItemDO getItem(Long id); + + /** + * 获得备件列表 + * + * @param ids 编号 + * @return 备件列表 + */ + List getItemList(Collection ids); + + /** + * 获得备件分页 + * + * @param pageReqVO 分页查询 + * @return 备件分页 + */ + PageResult getItemPage(ItemPageReqVO pageReqVO); + + /** + * 获得备件列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 备件列表 + */ + List getItemList(ItemExportReqVO exportReqVO); + /** + * 根据设备或模具号查询备件 + */ + List> getListByNumber(String number,String name); + + /** + * 备件申领获取所有备件列表信息(申领获取的备件必须要有台账的 其他工单的可以没有台账) + * @return + */ + List getApplyList(); + + /** + * 获取备件维修所需备件列表(基础信息全部) + * @return + */ + List getItemMaintainList(); + + /** + * 备件归还扫备件码 + * @param number + * @return + */ + ItemDO scanCodeByNumber(String number); + + /** + * 采购入库扫备件码 + * @param number + * @return + */ + ItemDO inScanCodeByNumber(String number,Long id); + + /** + * 获得备件分页 + * + * @param pageReqVO 分页查询 + * @return 备件分页 + */ + PageResult getAppPage(ItemPageReqVO pageReqVO); + + + /** + * 获得用高级搜索库位分页列表 + * + * @param conditions 分页、排序和自定义条件 + * @return 分页列表 + */ + PageResult getItemSenior(CustomConditions conditions); + + + /** + * 获得备件不分页 + * + * @param pageReqVO 不分页查询 + * @return 备件不分页 + */ + List getItemNoPage(ItemPageReqVO pageReqVO); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/item/ItemServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/item/ItemServiceImpl.java new file mode 100644 index 0000000..e87b471 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/item/ItemServiceImpl.java @@ -0,0 +1,263 @@ +package com.win.module.eam.service.item; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.exception.util.ServiceExceptionUtil; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.item.vo.ItemCreateReqVO; +import com.win.module.eam.controller.item.vo.ItemExportReqVO; +import com.win.module.eam.controller.item.vo.ItemPageReqVO; +import com.win.module.eam.controller.item.vo.ItemUpdateReqVO; +import com.win.module.eam.convert.item.ItemConvert; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.dataobject.itemaccounts.ItemAccountsDO; +import com.win.module.eam.dal.dataobject.itemorder.ItemOrderDetailDO; +import com.win.module.eam.dal.dataobject.itemorder.ItemOrderMainDO; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.eam.dal.mysql.itemaccounts.ItemAccountsMapper; +import com.win.module.eam.dal.mysql.itemorder.ItemOrderDetailMapper; +import com.win.module.eam.dal.mysql.itemorder.ItemOrderMainMapper; +import com.win.module.eam.enums.OpenAndClose.CompleteEnum; +import com.win.module.eam.enums.basic.BooleanTypeEnum; +import com.win.module.infra.api.trends.TrendsApi; +import com.win.module.system.api.dict.DictDataApi; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 备件 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class ItemServiceImpl implements ItemService { + + @Resource + private ItemMapper itemMapper; + @Resource + private SerialNumberApi serialNumberApi; + @Resource + private TrendsApi trendsApi; + + @Resource + private ItemAccountsMapper itemAccountsMapper; + + @Resource + private ItemOrderDetailMapper itemOrderDetailMapper; + + @Resource + private ItemOrderMainMapper itemOrderMainMapper; + + @Resource + private DictDataApi dictDataApi; + + @Override + public Long createItem(ItemCreateReqVO createReqVO) { + // 插入 + ItemDO item = ItemConvert.INSTANCE.convert(createReqVO); + String number = serialNumberApi.generateCode(RuleCodeEnum.Item.getCode()); + item.setNumber(number); + item.setCreateTime(LocalDateTime.now()); + //是否全局,备件没匹配设备时,默认是全局的 + item.setIsOverall(BooleanTypeEnum.Y.getCode()); + itemMapper.insert(item); + // 返回 + return item.getId(); + } + + @Override + public Integer updateItem(ItemUpdateReqVO updateReqVO) { + // 校验存在 + validateItemExists(updateReqVO.getId()); + // 更新 + ItemDO updateObj = ItemConvert.INSTANCE.convert(updateReqVO); + return itemMapper.updateById(updateObj); + } + + @Override + public Integer deleteItem(Long id) { + // 校验存在 + validateItemExists(id); + QueryWrapper objectQueryWrapper = new QueryWrapper<>(); + objectQueryWrapper.eq("item_number",itemMapper.selectById(id).getItemNumber()); + List itemAccountsDOList = itemAccountsMapper.selectList(objectQueryWrapper); + if(itemAccountsDOList.size()>0){ + throw ServiceExceptionUtil.exception(ITEM_CAN_NOT_DELETE); + } + // 删除 + return itemMapper.deleteById(id); + } + + private void validateItemExists(Long id) { + if (itemMapper.selectById(id) == null) { + throw exception(ITEM_NOT_EXISTS); + } + } + + @Override + public ItemDO getItem(Long id) { + return itemMapper.selectById(id); + } + + @Override + public List getItemList(Collection ids) { + return itemMapper.selectBatchIds(ids); + } + + @Override + public PageResult getItemPage(ItemPageReqVO pageReqVO) { + return itemMapper.selectPage(pageReqVO); + } + + @Override + public List getItemList(ItemExportReqVO exportReqVO) { + return itemMapper.selectList(exportReqVO); + } + + @Override + public List> getListByNumber(String number,String name) { + List> list1 = itemMapper.getListByALL(name); + if(number!=null && !"".equals(number)){ + List> list = itemMapper.getListByNumber(number,name); + list1.addAll(list); + } + return list1; + } + + @Override + public List getApplyList() { + List itemDOS = itemMapper.getListByAccounts(); + for(ItemDO en:itemDOS){ + BigDecimal bigDecimal = itemAccountsMapper.selectInventorySum(en.getNumber()); + en.setQty(bigDecimal); + } + return itemDOS; + } + + @Override + public List getItemMaintainList() { + List itemDOS = itemMapper.selectList("available", "TRUE"); + for(ItemDO en:itemDOS){ + BigDecimal bigDecimal = itemAccountsMapper.selectInventorySum(en.getNumber());//获取账内账外所有库存和 + en.setQty(bigDecimal); + Map map = itemAccountsMapper.selectLocationNumber(en.getNumber(), "FALSE");//获取账外库的库位号 + en.setLocationNumber(map.get("locationNumber").toString()); + en.setAreaNumber(map.get("areaNumber").toString()); + } + return itemDOS; + } + + @Override + public ItemDO scanCodeByNumber(String number) { + ItemDO itemDO1 = new ItemDO(); + List> list = new ArrayList<>(); + List itemDOS = itemMapper.scanCodeByNumber(number); + if(itemDOS.isEmpty()){ + throw exception(ITEM_NOT_EXISTS);//备件不存在 + } + for(ItemDO itemDO:itemDOS){ + Map map = new HashMap<>(); + map.put("isInAccount",itemDO.getIsInAccount()); + map.put("locationNumber",itemDO.getLocationNumber()); + map.put("areaNumber",itemDO.getAreaNumber()); + list.add(map); + itemDO1 = itemDOS.get(0); + } + itemDO1.setList(list); + return itemDO1; + } + + @Override + public ItemDO inScanCodeByNumber(String number, Long id) { + ItemDO itemDO1 = new ItemDO(); + ItemOrderMainDO itemOrderMainDO = itemOrderMainMapper.selectById(id); + if(itemOrderMainDO==null){ + throw exception(PURCHASE_ITEM_NOT_EXISTS);//采购订单不存在 + }else{ + if(CompleteEnum.COMPLETE.getCode().equals(itemOrderMainDO.getStatus())){ + throw exception(PURCHASE_ITEM_ORDER_COMPLETE);//采购订单已完成 + } + } + List itemDOS = itemMapper.scanCodeByNumber(number); + if(itemDOS.isEmpty()){ + throw exception(ITEM_NOT_EXISTS);//备件不存在 + } + List> list = new ArrayList<>(); + for(ItemDO itemDO:itemDOS){ + Map map = new HashMap<>(); + map.put("isInAccount",itemDO.getIsInAccount()); + map.put("locationNumber",itemDO.getLocationNumber()); + map.put("areaNumber",itemDO.getAreaNumber()); + list.add(map); + itemDO1 = itemDOS.get(0); + String itemNumber = itemDO1.getItemNumber(); + if (itemNumber != null && !"".equals(itemNumber)) { + QueryWrapper objectQueryWrapper = new QueryWrapper<>(); + objectQueryWrapper.eq("item_number", itemNumber); + objectQueryWrapper.eq("master_id", id); + List itemOrderDetailDOS = itemOrderDetailMapper.selectList(objectQueryWrapper); + if (itemOrderDetailDOS.size() == 0) {//扫的备件与采购订单的备件无关 + throw exception(PURCHASE_ITEM_EXCLUDE);//该配件不在采购订单范围内 + }else{ +// BigDecimal deliveryQty = itemOrderDetailDOS.get(0).getDeliveryQty(); +// BigDecimal qty = itemOrderDetailDOS.get(0).getQty(); + String status = itemOrderDetailDOS.get(0).getStatus(); + if(CompleteEnum.COMPLETE.getCode().equals(status)){//接收完成 + throw exception(PURCHASE_ITEM_COMPLETE);//该配件采购数量已足额 + } + BigDecimal deliveryQty = itemOrderDetailDOS.get(0).getDeliveryQty();//已入库数量 + BigDecimal qty = itemOrderDetailDOS.get(0).getQty();//采购订单数量 + if(deliveryQty==null){ + deliveryQty = BigDecimal.ZERO; + } + itemDO1.setDeliveryQty(deliveryQty); + itemDO1.setApplyQty(qty); + } + } else { + throw exception(ITEM_NOT_EXISTS);//备件不存在 + } + } + itemDO1.setList(list); + return itemDO1; + } + + @Override + public PageResult getAppPage(ItemPageReqVO pageReqVO) { + IPage pageInfo = itemMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + + if (pageInfo != null) { + for (ItemDO en : pageInfo.getRecords()) { + BigDecimal bigDecimal = itemAccountsMapper.selectInventorySum(en.getNumber()); + en.setQty(bigDecimal.setScale(2)); + } + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + + @Override + public PageResult getItemSenior(CustomConditions conditions) { + return itemMapper.getItemSenior(conditions); + } + + + @Override + public List getItemNoPage(ItemPageReqVO pageReqVO) { + return itemMapper.selectNoPage(pageReqVO); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemaccounts/ItemAccountsService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemaccounts/ItemAccountsService.java new file mode 100644 index 0000000..95286dc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemaccounts/ItemAccountsService.java @@ -0,0 +1,121 @@ +package com.win.module.eam.service.itemaccounts; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.itemaccounts.vo.*; +import com.win.module.eam.dal.dataobject.itemaccounts.ItemAccountsDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 备件台账 Service 接口 + * + * @author 超级管理员 + */ +public interface ItemAccountsService { + + /** + * 创建备件台账 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createItemAccounts(@Valid ItemAccountsCreateReqVO createReqVO); + + /** + * 更新备件台账 + * + * @param updateReqVO 更新信息 + */ + Integer updateItemAccounts(@Valid ItemAccountsUpdateReqVO updateReqVO); + + /** + * 删除备件台账 + * + * @param id 编号 + */ + Integer deleteItemAccounts(Long id); + + /** + * 获得备件台账 + * + * @param id 编号 + * @return 备件台账 + */ + ItemAccountsDO getItemAccounts(Long id); + + /** + * 获得备件台账列表 + * + * @param ids 编号 + * @return 备件台账列表 + */ + List getItemAccountsList(Collection ids); + + /** + * 获得备件台账分页 + * + * @param pageReqVO 分页查询 + * @return 备件台账分页 + */ + PageResult getItemAccountsPage(ItemAccountsPageReqVO pageReqVO); + + /** + * 获得备件台账列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 备件台账列表 + */ + List getItemAccountsList(ItemAccountsExportReqVO exportReqVO); + + /** + * 导入备件台账主信息 + * + * @param datas 导入备件台账主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importItemAccountsList(List datas, Integer mode, boolean updatePart); + + /** + * 获得备件台账分页 + * + * @param pageReqVO 分页查询 + * @return 备件台账分页 + */ + PageResult getAppPage(ItemAccountsPageReqVO pageReqVO); + + /** + * 获取所有模具列表 + * @return + */ + public List> selectAll(); + + /** + * 库位更换备件 + * + * @param itemAccountsDO + */ + Integer replaceLocation(ItemAccountsDO itemAccountsDO); + + + /** + * 获得用高级搜索库位分页列表 + * + * @param conditions 分页、排序和自定义条件 + * @return 分页列表 + */ + PageResult getItemAccountsSenior(CustomConditions conditions); + + /** + * 获得备件不分页 + * + * @param pageReqVO 不分页查询 + * @return 备件不分页 + */ + List getItemAccountsNoPage(ItemAccountsPageReqVO pageReqVO); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemaccounts/ItemAccountsServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemaccounts/ItemAccountsServiceImpl.java new file mode 100644 index 0000000..29346c4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemaccounts/ItemAccountsServiceImpl.java @@ -0,0 +1,236 @@ +package com.win.module.eam.service.itemaccounts; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.exception.util.ServiceExceptionUtil; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.itemaccounts.vo.*; +import com.win.module.eam.convert.itemaccounts.ItemAccountsConvert; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.dataobject.itemaccounts.ItemAccountsDO; +import com.win.module.eam.dal.dataobject.itemlocationreplace.ItemLocationReplaceDO; +import com.win.module.eam.dal.dataobject.location.LocationDO; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.eam.dal.mysql.itemaccounts.ItemAccountsMapper; +import com.win.module.eam.dal.mysql.itemlocationreplace.ItemLocationReplaceMapper; +import com.win.module.eam.dal.mysql.location.LocationMapper; +import com.win.module.eam.enums.basic.BooleanTypeEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static com.win.module.eam.enums.ErrorCodeConstants.LOCATION_CAN_NOT_REPLACE; +import static com.win.module.eam.enums.ErrorCodeConstants.LOCATION_CAN_NOT_REPLACE2; + +/** + * 备件台账 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class ItemAccountsServiceImpl implements ItemAccountsService { + + @Resource + private ItemAccountsMapper itemAccountsMapper; + + @Resource + private ItemLocationReplaceMapper itemLocationReplaceMapper; + + @Resource + private LocationMapper locationMapper; + + @Resource + private ItemMapper itemMapper; + + @Override + public Long createItemAccounts(ItemAccountsCreateReqVO createReqVO) { + // 插入 + ItemAccountsDO itemAccounts = ItemAccountsConvert.INSTANCE.convert(createReqVO); + itemAccountsMapper.insert(itemAccounts); + // 返回 + return itemAccounts.getId(); + } + + @Override + public Integer updateItemAccounts(ItemAccountsUpdateReqVO updateReqVO) { + // 校验存在 + //validateItemAccountsExists(updateReqVO.getId()); + // 更新 + ItemAccountsDO updateObj = ItemAccountsConvert.INSTANCE.convert(updateReqVO); + return itemAccountsMapper.updateById(updateObj); + } + + @Override + public Integer deleteItemAccounts(Long id) { + // 校验存在 + validateItemAccountsExists(id); + // 删除 + return itemAccountsMapper.deleteById(id); + } + + private void validateItemAccountsExists(Long id) { + if (itemAccountsMapper.selectById(id) == null) { + //throw exception(ITEM_ACCOUNTS_NOT_EXISTS); + } + } + + @Override + public ItemAccountsDO getItemAccounts(Long id) { + return itemAccountsMapper.selectById(id); + } + + @Override + public List getItemAccountsList(Collection ids) { + return itemAccountsMapper.selectBatchIds(ids); + } + + @Override + public PageResult getItemAccountsPage(ItemAccountsPageReqVO pageReqVO) { + PageResult pageResult = itemAccountsMapper.selectPage(pageReqVO); + List itemAccountsDOList = pageResult.getList(); + for (ItemAccountsDO itemAccountsDO : itemAccountsDOList) { + QueryWrapper itemDOQueryWrapper = new QueryWrapper<>(); + itemDOQueryWrapper.eq("available", BooleanTypeEnum.Y.getCode()); + itemDOQueryWrapper.eq("number", itemAccountsDO.getItemNumber()); + ItemDO itemDO = itemMapper.selectOne(itemDOQueryWrapper); + if(itemDO!=null){ + itemAccountsDO.setName(itemDO.getName()); + itemAccountsDO.setBrand(itemDO.getBrand()); + itemAccountsDO.setSpecifications(itemDO.getSpecifications()); + itemAccountsDO.setIsConstant(itemDO.getIsConstant()); + itemAccountsDO.setIsOverall(itemDO.getIsOverall()); + itemAccountsDO.setSubject(itemDO.getSubject()); + itemAccountsDO.setSubjectCode(itemDO.getSubjectCode()); + itemAccountsDO.setRegion(itemDO.getRegion()); + itemAccountsDO.setClassification(itemDO.getClassification()); + itemAccountsDO.setUom(itemDO.getUom()); + itemAccountsDO.setSinglePrice(itemDO.getSinglePrice()); + itemAccountsDO.setReprocurement(itemDO.getReprocurement()); + itemAccountsDO.setSafetyStock(itemDO.getSafetyStock()); + itemAccountsDO.setCost(itemDO.getCost()); + itemAccountsDO.setPurchaser(itemDO.getPurchaser()); + itemAccountsDO.setFinancer(itemDO.getFinancer()); + itemAccountsDO.setIsFramework(itemDO.getIsFramework()); + itemAccountsDO.setIsRadeIn(itemDO.getIsRadeIn()); + itemAccountsDO.setPurchaseTime(itemDO.getPurchaseTime()); + itemAccountsDO.setStockAge(itemDO.getStockAge()); + itemAccountsDO.setCategory(itemDO.getCategory()); + itemAccountsDO.setDescribes(itemDO.getDescribes()); + } + } + return pageResult; + } + + @Override + public List getItemAccountsList(ItemAccountsExportReqVO exportReqVO) { + return itemAccountsMapper.selectList(exportReqVO); + } + + @Override + public List importItemAccountsList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(ITEM_ACCOUNTS_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// ItemAccountsDO obj = itemAccountsMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// itemAccountsMapper.insert(ItemAccountsConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// ItemAccountsDO itemAccountsDO = ItemAccountsConvert.INSTANCE.convert(item); +// itemAccountsDO.setId(obj.getId()); +// itemAccountsMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public PageResult getAppPage(ItemAccountsPageReqVO pageReqVO) { + IPage pageInfo = itemAccountsMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + + @Override + public List> selectAll() { + return itemAccountsMapper.selectAll(); + } + + @Override + @Transactional + public Integer replaceLocation(ItemAccountsDO accountsDO) { + ItemAccountsDO itemAccountsDO = itemAccountsMapper.selectById(accountsDO.getId()); + if(accountsDO.getItemNumber().equals(itemAccountsDO.getItemNumber())){ + throw ServiceExceptionUtil.exception(LOCATION_CAN_NOT_REPLACE2); + } + //查询新备件在备件台账中是否存在 + QueryWrapper itemAccountsDOQueryWrapper = new QueryWrapper<>(); + itemAccountsDOQueryWrapper.eq("available", BooleanTypeEnum.Y.getCode()); + if (itemAccountsDO.getIsInAccount() != null) { + itemAccountsDOQueryWrapper.eq("is_in_account", itemAccountsDO.getIsInAccount()); + } + itemAccountsDOQueryWrapper.eq("item_number", accountsDO.getItemNumber()); + List itemAccountsDOList = itemAccountsMapper.selectList(itemAccountsDOQueryWrapper); + if (itemAccountsDOList.size() == 0) { + //新增备件库位变更记录 + ItemLocationReplaceDO itemLocationReplaceDO = new ItemLocationReplaceDO(); + itemLocationReplaceDO.setItemNumber(accountsDO.getItemNumber()); + itemLocationReplaceDO.setOldItemNumber(itemAccountsDO.getItemNumber()); + itemLocationReplaceDO.setLocationNumber(accountsDO.getLocationNumber()); + itemLocationReplaceDO.setCreateTime(LocalDateTime.now()); + itemLocationReplaceMapper.insert(itemLocationReplaceDO); + //删除备件台账的数据 + itemAccountsMapper.deleteById(itemAccountsDO); + //新增一条备件台账(该库位下的) + ItemAccountsDO newItemAccountsDO = new ItemAccountsDO(); + newItemAccountsDO.setIsInAccount(itemAccountsDO.getIsInAccount()); + newItemAccountsDO.setItemNumber(accountsDO.getItemNumber()); + newItemAccountsDO.setLocationNumber(accountsDO.getLocationNumber()); + //根据库位查询库区 + QueryWrapper locationDOQueryWrapper = new QueryWrapper<>(); + locationDOQueryWrapper.eq("available", BooleanTypeEnum.Y.getCode()); + locationDOQueryWrapper.eq("number", accountsDO.getLocationNumber()); + LocationDO locationDO = locationMapper.selectOne(locationDOQueryWrapper); + newItemAccountsDO.setAreaNumber(locationDO.getAreaNumber()); + //库位中新的备件数量是0 + newItemAccountsDO.setQty(BigDecimal.ZERO); + newItemAccountsDO.setCreateTime(LocalDateTime.now()); + newItemAccountsDO.setAvailable(BooleanTypeEnum.Y.getCode()); + itemAccountsMapper.insert(newItemAccountsDO); + } else { + throw ServiceExceptionUtil.exception(LOCATION_CAN_NOT_REPLACE); + } + return 1; + } + @Override + public PageResult getItemAccountsSenior(CustomConditions conditions) { + return itemAccountsMapper.selectSenior(conditions); + } + + @Override + public List getItemAccountsNoPage(ItemAccountsPageReqVO pageReqVO) { + return itemAccountsMapper.selectNoPage(pageReqVO); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemapplyrequest/ItemApplyRequestDetailService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemapplyrequest/ItemApplyRequestDetailService.java new file mode 100644 index 0000000..3350293 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemapplyrequest/ItemApplyRequestDetailService.java @@ -0,0 +1,80 @@ +package com.win.module.eam.service.itemapplyrequest; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.itemapplyrequest.vo.*; +import com.win.module.eam.dal.dataobject.itemapplyrequest.ItemApplyRequestDetailDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 备件申领记录子 Service 接口 + * + * @author 超级管理员 + */ +public interface ItemApplyRequestDetailService { + + /** + * 创建备件申领记录子 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createItemApplyDetail(@Valid ItemApplyRequestDetailCreateReqVO createReqVO); + + /** + * 更新备件申领记录子 + * + * @param updateReqVO 更新信息 + */ + Integer updateItemApplyDetail(@Valid ItemApplyRequestDetailUpdateReqVO updateReqVO); + + /** + * 删除备件申领记录子 + * + * @param id 编号 + */ + Integer deleteItemApplyDetail(Long id); + + /** + * 获得备件申领记录子 + * + * @param id 编号 + * @return 备件申领记录子 + */ + ItemApplyRequestDetailDO getItemApplyDetail(Long id); + + /** + * 获得备件申领记录子列表 + * + * @param ids 编号 + * @return 备件申领记录子列表 + */ + List getItemApplyDetailList(Collection ids); + + /** + * 获得备件申领记录子分页 + * + * @param pageReqVO 分页查询 + * @return 备件申领记录子分页 + */ + PageResult getItemApplyDetailPage(ItemApplyRequestDetailPageReqVO pageReqVO); + + /** + * 获得备件申领记录子列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 备件申领记录子列表 + */ + List getItemApplyDetailList(ItemApplyRequestDetailExportReqVO exportReqVO); + + /** + * 导入备件申领记录子主信息 + * + * @param datas 导入备件申领记录子主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importItemApplyDetailList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemapplyrequest/ItemApplyRequestDetailServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemapplyrequest/ItemApplyRequestDetailServiceImpl.java new file mode 100644 index 0000000..0bd121b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemapplyrequest/ItemApplyRequestDetailServiceImpl.java @@ -0,0 +1,126 @@ +package com.win.module.eam.service.itemapplyrequest; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.exception.util.ServiceExceptionUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.itemapplyrequest.vo.*; +import com.win.module.eam.convert.itemapplyrequest.ItemApplyRequestDetailConvert; +import com.win.module.eam.dal.dataobject.itemapplyrequest.ItemApplyRequestDetailDO; +import com.win.module.eam.dal.mysql.itemapplyrequest.ItemApplyRequestDetailMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import static com.win.module.eam.enums.ErrorCodeConstants.ITEM_IS_HAVE; + +/** + * 备件申领记录子 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class ItemApplyRequestDetailServiceImpl implements ItemApplyRequestDetailService { + + @Resource + private ItemApplyRequestDetailMapper itemApplyRequestDetailMapper; + + @Override + public Long createItemApplyDetail(ItemApplyRequestDetailCreateReqVO createReqVO) { + // 插入 + ItemApplyRequestDetailDO itemApplyDetail = ItemApplyRequestDetailConvert.INSTANCE.convert(createReqVO); + QueryWrapper itemApplyRequestDetailDOQueryWrapper = new QueryWrapper<>(); + itemApplyRequestDetailDOQueryWrapper.eq("master_id", createReqVO.getMasterId()); + itemApplyRequestDetailDOQueryWrapper.eq("number", createReqVO.getNumber()); + itemApplyRequestDetailDOQueryWrapper.eq("item_number", createReqVO.getItemNumber()); + List itemApplyRequestDetailDOList = itemApplyRequestDetailMapper.selectList(itemApplyRequestDetailDOQueryWrapper); + if(itemApplyRequestDetailDOList.size()>0){ + throw ServiceExceptionUtil.exception(ITEM_IS_HAVE); + } + itemApplyRequestDetailMapper.insert(itemApplyDetail); + // 返回 + return itemApplyDetail.getId(); + } + + @Override + public Integer updateItemApplyDetail(ItemApplyRequestDetailUpdateReqVO updateReqVO) { + // 校验存在 + validateItemApplyDetailExists(updateReqVO.getId()); + QueryWrapper itemApplyRequestDetailDOQueryWrapper = new QueryWrapper<>(); + itemApplyRequestDetailDOQueryWrapper.eq("master_id", updateReqVO.getMasterId()); + itemApplyRequestDetailDOQueryWrapper.eq("number", updateReqVO.getNumber()); + itemApplyRequestDetailDOQueryWrapper.eq("item_number", updateReqVO.getItemNumber()); + itemApplyRequestDetailDOQueryWrapper.ne("id", updateReqVO.getId()); + List itemApplyRequestDetailDOList = itemApplyRequestDetailMapper.selectList(itemApplyRequestDetailDOQueryWrapper); + if(itemApplyRequestDetailDOList.size()>0){ + throw ServiceExceptionUtil.exception(ITEM_IS_HAVE); + } + // 更新 + ItemApplyRequestDetailDO updateObj = ItemApplyRequestDetailConvert.INSTANCE.convert(updateReqVO); + return itemApplyRequestDetailMapper.updateById(updateObj); + } + + @Override + public Integer deleteItemApplyDetail(Long id) { + // 校验存在 + validateItemApplyDetailExists(id); + // 删除 + return itemApplyRequestDetailMapper.deleteById(id); + } + + private void validateItemApplyDetailExists(Long id) { + if (itemApplyRequestDetailMapper.selectById(id) == null) { + //throw exception(ITEM_APPLY_DETAIL_NOT_EXISTS); + } + } + + @Override + public ItemApplyRequestDetailDO getItemApplyDetail(Long id) { + return itemApplyRequestDetailMapper.selectById(id); + } + + @Override + public List getItemApplyDetailList(Collection ids) { + return itemApplyRequestDetailMapper.selectBatchIds(ids); + } + + @Override + public PageResult getItemApplyDetailPage(ItemApplyRequestDetailPageReqVO pageReqVO) { + return itemApplyRequestDetailMapper.selectPage(pageReqVO); + } + + @Override + public List getItemApplyDetailList(ItemApplyRequestDetailExportReqVO exportReqVO) { + return itemApplyRequestDetailMapper.selectList(exportReqVO); + } + + @Override + public List importItemApplyDetailList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(ITEM_APPLY_DETAIL_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// ItemApplyDetailDO obj = itemApplyDetailMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// itemApplyDetailMapper.insert(ItemApplyDetailConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// ItemApplyDetailDO itemApplyDetailDO = ItemApplyDetailConvert.INSTANCE.convert(item); +// itemApplyDetailDO.setId(obj.getId()); +// itemApplyDetailMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemapplyrequest/ItemApplyRequestMainService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemapplyrequest/ItemApplyRequestMainService.java new file mode 100644 index 0000000..087b4ee --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemapplyrequest/ItemApplyRequestMainService.java @@ -0,0 +1,160 @@ +package com.win.module.eam.service.itemapplyrequest; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.itemapplyrequest.vo.*; +import com.win.module.eam.dal.dataobject.itemapplyrequest.ItemApplyRequestMainDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 备件申领记录主 Service 接口 + * + * @author 超级管理员 + */ +public interface ItemApplyRequestMainService { + + /** + * 创建备件申领记录主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createItemApplyMain(@Valid ItemApplyRequestMainCreateReqVO createReqVO); + + /** + * 更新备件申领记录主 + * + * @param updateReqVO 更新信息 + */ + Integer updateItemApplyMain(@Valid ItemApplyRequestMainUpdateReqVO updateReqVO); + + /** + * 删除备件申领记录主 + * + * @param id 编号 + */ + Integer deleteItemApplyMain(Long id); + + /** + * 申领出库 + * @param reavo + * @return + */ + Integer outOperation(ItemApplyRequestMainCreateReqVO reavo); + + /** + * 备件归还 + * @param reavo + * @return + */ + Integer inOperation(ItemApplyRequestMainCreateReqVO reavo); + + + + /** + * 撤销申请 + * @param id + * @return + */ + Integer backout(Long id); + + /** + * 审批人审批 + * @param id + * @param status 1审批通过2审批驳回 + * @return + */ + Integer approve(Long id,String status); + + /** + * 撤销操作 + * @param id + * @return + */ + Integer cancel(Long id); + + /** + * 获得备件申领记录主 + * + * @param id 编号 + * @return 备件申领记录主 + */ + ItemApplyRequestMainDO getItemApplyMain(Long id); + + /** + * 获得备件申领记录主列表 + * + * @param ids 编号 + * @return 备件申领记录主列表 + */ + List getItemApplyMainList(Collection ids); + + /** + * 获得备件申领记录主分页 + * + * @param pageReqVO 分页查询 + * @return 备件申领记录主分页 + */ + PageResult getItemApplyMainPage(ItemApplyRequestMainPageReqVO pageReqVO); + + /** + * 获得备件申领记录主列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 备件申领记录主列表 + */ + List getItemApplyMainList(ItemApplyRequestMainExportReqVO exportReqVO); + + /** + * 导入备件申领记录主主信息 + * + * @param datas 导入备件申领记录主主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importItemApplyMainList(List datas, Integer mode, boolean updatePart); + + /** + * 根据申领number获取数据详情 + * @param number + * @return + */ + Map appGetByNumber(String number); + + /** + * APP获取申领列表 + * + * @param pageReqVO 分页查询 + * @return 备件申领记录主分页 + */ + PageResult getAppPage(ItemApplyRequestMainPageReqVO pageReqVO); + + /** + * APP审批获取申领列表 + * + * @param pageReqVO 分页查询 + * @return 备件申领记录主分页 + */ + PageResult getAppApprovePage(ItemApplyRequestMainPageReqVO pageReqVO); + + /** + * APP备件出库 + * + * @param pageReqVO 分页查询 + * @return APP备件出库分页 + */ + PageResult getAppOutOperaPage(ItemApplyRequestMainPageReqVO pageReqVO); + + /** + * 获得用高级搜索库位分页列表 + * + * @param conditions 分页、排序和自定义条件 + * @return 分页列表 + */ + PageResult getItemApplyRequestMainSenior(CustomConditions conditions); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemapplyrequest/ItemApplyRequestMainServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemapplyrequest/ItemApplyRequestMainServiceImpl.java new file mode 100644 index 0000000..9a1e98f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemapplyrequest/ItemApplyRequestMainServiceImpl.java @@ -0,0 +1,594 @@ +package com.win.module.eam.service.itemapplyrequest; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.itemapplyrequest.vo.*; +import com.win.module.eam.controller.transaction.vo.TransactionCreateReqVO; +import com.win.module.eam.convert.itemapplyrequest.ItemApplyRequestDetailConvert; +import com.win.module.eam.convert.itemapplyrequest.ItemApplyRequestMainConvert; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.dataobject.itemapplyrequest.ItemApplyRequestDetailDO; +import com.win.module.eam.dal.dataobject.itemapplyrequest.ItemApplyRequestMainDO; +import com.win.module.eam.dal.dataobject.iteminlocation.ItemInLocationDO; +import com.win.module.eam.dal.dataobject.itemoutlocation.ItemOutLocationDO; +import com.win.module.eam.dal.dataobject.location.LocationDO; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.eam.dal.mysql.itemaccounts.ItemAccountsMapper; +import com.win.module.eam.dal.mysql.itemapplyrequest.ItemApplyRequestDetailMapper; +import com.win.module.eam.dal.mysql.itemapplyrequest.ItemApplyRequestMainMapper; +import com.win.module.eam.dal.mysql.iteminlocation.ItemInLocationMapper; +import com.win.module.eam.dal.mysql.itemoutlocation.ItemOutLocationMapper; +import com.win.module.eam.dal.mysql.location.LocationMapper; +import com.win.module.eam.enums.request.RequestStatusEnum; +import com.win.module.eam.enums.transaction.TransactionEnum; +import com.win.module.eam.service.transaction.TransactionService; +import com.win.module.infra.api.trends.TrendsApi; +import com.win.module.system.api.mail.MailSendApi; +import com.win.module.system.api.mail.dto.MailSendSingleToUserReqDTO; +import com.win.module.system.api.permission.PermissionApi; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.api.user.dto.AdminUserRespExpandDTO; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +import org.apache.commons.lang.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; + +import static cn.hutool.log.StaticLog.info; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 备件申领记录主 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class ItemApplyRequestMainServiceImpl implements ItemApplyRequestMainService { + + @Resource + private ItemApplyRequestMainMapper itemApplyRequestMainMapper; + + @Resource + private ItemApplyRequestDetailMapper itemApplyRequestDetailMapper; + @Resource + private SerialNumberApi serialNumberApi; + @Resource + private TrendsApi trendsApi; + + @Resource + private AdminUserApi userApi; + + @Resource + private MailSendApi mailSendApi; + + @Resource + ItemMapper itemMapper; + + @Resource + ItemOutLocationMapper itemOutLocationMapper; + + @Resource + private ItemAccountsMapper itemAccountsMapper; + + @Resource + private PermissionApi permissionApi; + + @Resource + private ItemInLocationMapper itemInLocationMapper; + + @Resource + private TransactionService transactionService; + + @Resource + private LocationMapper locationMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createItemApplyMain(ItemApplyRequestMainCreateReqVO createReqVO) { + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + // 申领主信息插入 + ItemApplyRequestMainDO itemApplyMain = ItemApplyRequestMainConvert.INSTANCE.convert(createReqVO); + String number = serialNumberApi.generateCode(RuleCodeEnum.REQUEST_APPLY.getCode()); + itemApplyMain.setNumber(number); + itemApplyMain.setApplyId(user.getId().toString()); + itemApplyMain.setApplyDeptId(user.getDeptId().toString()); + itemApplyMain.setStatus(RequestStatusEnum.ITEM_APPLY_0.getCode());//待审核 + BigDecimal sums = BigDecimal.ZERO; + itemApplyMain.setDeptId(userApi.getUser(getLoginUserId()).getDeptId()); + itemApplyRequestMainMapper.insert(itemApplyMain); + if (createReqVO.getSubList() != null && !"".equals(createReqVO.getSubList())) {//有子项信息 + //申领子信息插入 + List subList = ItemApplyRequestDetailConvert.INSTANCE.convertList03(createReqVO.getSubList()); + for (ItemApplyRequestDetailDO detailsDo : subList) { + detailsDo.setNumber(number); + List itemDOS = itemMapper.selectList("number", detailsDo.getItemNumber()); + BigDecimal qty = detailsDo.getQty(); + sums = sums.add(itemDOS.get(0).getSinglePrice()==null?BigDecimal.ZERO:itemDOS.get(0).getSinglePrice().multiply(qty)); + detailsDo.setItemNumber(detailsDo.getItemNumber());//备件号 + detailsDo.setQty(qty);//申领数量 + detailsDo.setMasterId(itemApplyMain.getId()); + detailsDo.setType(detailsDo.getType());//设备模具类型 + detailsDo.setDeviceNumber(detailsDo.getDeviceNumber());//设备磨具号可以不传 + detailsDo.setCurrentQty(detailsDo.getCurrentQty());//当前库存 + detailsDo.setIsRadeIn(detailsDo.getIsRadeIn());//备件类型 + detailsDo.setResult(RequestStatusEnum.ITEM_APPLY_DETAILS_RECEIVE.getCode());//接收状态 接收中 + itemApplyRequestDetailMapper.insert(detailsDo); + } + itemApplyMain.setSumVal(sums); + itemApplyRequestMainMapper.updateById(itemApplyMain); + } else { + throw exception(ITEM_APPLY_DETAILS_NOT_EXISTS); + } + //发送邮件 + try { + sendEmails(itemApplyMain); + } catch (Exception e) { + info("发送邮件异常:{}",e); + } + // 返回 + return itemApplyMain.getId(); + } + + @Override + public Integer updateItemApplyMain(ItemApplyRequestMainUpdateReqVO updateReqVO) { + // 校验存在 + validateItemApplyMainExists(updateReqVO.getId()); + // 主信息更新 + ItemApplyRequestMainDO updateObj = ItemApplyRequestMainConvert.INSTANCE.convert(updateReqVO); + + BigDecimal sums = BigDecimal.ZERO; + if (updateReqVO.getSubList() != null && !"".equals(updateReqVO.getSubList())) {//有子项信息 + //先删子项信息 + QueryWrapper itemApplyQueryWrapper = new QueryWrapper<>(); + itemApplyQueryWrapper.eq("apply_number", updateReqVO.getNumber()); + itemApplyQueryWrapper.eq("deleted", 0); + List itemApplyRequestDetailDOS = itemApplyRequestDetailMapper.selectList(itemApplyQueryWrapper); + for (ItemApplyRequestDetailDO item : itemApplyRequestDetailDOS) { + itemApplyRequestMainMapper.deleteById(item.getId()); + } + //添加子项信息//申领子信息插入 + List subList = ItemApplyRequestDetailConvert.INSTANCE.convertList03(updateReqVO.getSubList()); + for (ItemApplyRequestDetailDO detailsDo : subList) { + detailsDo.setNumber(updateReqVO.getNumber()); + List itemDOS = itemMapper.selectList("number", detailsDo.getItemNumber()); + BigDecimal qty = detailsDo.getQty(); + sums = sums.add(itemDOS.get(0).getSinglePrice().multiply(qty)); + detailsDo.setItemNumber(detailsDo.getItemNumber());//备件号 + detailsDo.setQty(qty);//申领数量 + detailsDo.setType(detailsDo.getType());//设备模具类型 + detailsDo.setDeviceNumber(detailsDo.getDeviceNumber());//设备磨具号可以不传 + detailsDo.setCurrentQty(detailsDo.getCurrentQty());//当前库存 + detailsDo.setIsRadeIn(detailsDo.getIsRadeIn());//备件类型 + detailsDo.setResult(RequestStatusEnum.ITEM_APPLY_DETAILS_RECEIVE.getCode());//接收状态 接收中 + itemApplyRequestDetailMapper.insert(detailsDo); + } + updateObj.setSumVal(sums); + itemApplyRequestMainMapper.insert(updateObj); + } else { + throw exception(ITEM_APPLY_DETAILS_NOT_EXISTS); + } + return itemApplyRequestMainMapper.updateById(updateObj); + } + + @Override + public Integer deleteItemApplyMain(Long id) { + // 校验存在 + validateItemApplyMainExists(id); + // 删除 + return itemApplyRequestMainMapper.deleteById(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer outOperation(ItemApplyRequestMainCreateReqVO reavo) { + Long id = reavo.getId();//申领工单id + int i = 0; + ItemApplyRequestMainDO applyMainDO1 = itemApplyRequestMainMapper.selectById(id); + if (applyMainDO1 == null) { + throw exception(ITEM_APPLY_MAIN_NOT_EXISTS);// 校验存在 + } + validateItemApplyAppOut(id);//校验能否出库 + List> itemList = reavo.getItemNumbers();//备件号集合 + if (itemList != null && itemList.size() > 0) { + for (Map map : itemList) { + List list = new ArrayList<>(); + String itemNumber = map.get("itemNumber").toString();//备件号 + String qty = map.get("qty").toString();//出库数量 + String locationNumber = map.get("locationNumber").toString();//库位 + LocationDO locationDO = locationMapper.scanCodeByNumber(locationNumber); + String areaNumber = locationDO.getAreaNumber();//库区 + String isInAccount = locationDO.getIsInAccount();//是否账内账外 + BigDecimal qty2 = locationDO.getQty();//台账内库存数 + if(new BigDecimal(qty).compareTo(qty2)>0){ + throw exception(OUT_BIG_INVENTORY);// 出库数量大于库存 + } + //往申领工单子表中插入 + //ItemApplyDetailDO detailDO = new ItemApplyDetailDO(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("master_id", reavo.getId()); + queryWrapper.eq("item_number", itemNumber); + List itemApplyRequestDetailDOS = itemApplyRequestDetailMapper.selectList(queryWrapper); + if (itemApplyRequestDetailDOS.size() > 0) { + ItemApplyRequestDetailDO detailDO = itemApplyRequestDetailDOS.get(0); + BigDecimal receiveQty = detailDO.getReceiveQty();//已经接收数量 + if(receiveQty==null){ + receiveQty =BigDecimal.ZERO; + } + BigDecimal qty1 = detailDO.getQty();//申领数量 + receiveQty = receiveQty.add(new BigDecimal(qty)); + detailDO.setReceiveQty(receiveQty);//更新出库数量 + if (receiveQty.compareTo(qty1) > 0) {//接收的数大于申领数量 + //接收的数大于申领数量 + throw exception(ITEM_APPLY_NUM_OVERFLOW); + } + if (receiveQty.compareTo(qty1)==0) { + //数据相等完成 + detailDO.setResult(RequestStatusEnum.ITEM_APPLY_DETAILS_COMPLETED.getCode());//接收完成 + } else { + detailDO.setResult(RequestStatusEnum.ITEM_APPLY_DETAILS_RECEIVE.getCode());//接收中 + } + itemApplyRequestDetailMapper.updateById(detailDO); + //添加库存事务 + TransactionCreateReqVO transactionCreateReqVO = new TransactionCreateReqVO(); + transactionCreateReqVO.setItemNumber(itemNumber); + transactionCreateReqVO.setLocationNumber(locationNumber); + transactionCreateReqVO.setAreaNumber(areaNumber); + transactionCreateReqVO.setTransactionType("OUT"); + transactionCreateReqVO.setIsInAccount(isInAccount); + transactionCreateReqVO.setQty(new BigDecimal(qty)); + transactionCreateReqVO.setDescribes(reavo.getDescribes()); + transactionCreateReqVO.setAssociatedNumber(applyMainDO1.getNumber()); + transactionCreateReqVO.setOperator(getLoginUserId().toString()); + transactionCreateReqVO.setCreator(getLoginUserId().toString()); + transactionCreateReqVO.setInventoryAction(TransactionEnum.REQUISITION_OUT.getCode()); + list.add(transactionCreateReqVO); + transactionService.create(list); + //插入备件出库记录数据 + ItemOutLocationDO itemOutLocation = new ItemOutLocationDO(); + itemOutLocation.setNumber(applyMainDO1.getNumber()); + itemOutLocation.setItemNumber(itemNumber); + itemOutLocation.setLocationNumber(locationNumber); + itemOutLocation.setQty(new BigDecimal(qty)); + itemOutLocation.setType("OUT"); + itemOutLocationMapper.insert(itemOutLocation); + } else { + //该配件不在申领范围内 + throw exception(APPLAY_ITEM_EXCLUDE); + } + } + //插入主申请信息 + ItemApplyRequestMainDO applyMainDO = itemApplyRequestMainMapper.selectById(id); + applyMainDO.setOutId(getLoginUserId().toString()); + applyMainDO.setOutTime(LocalDateTime.now()); + QueryWrapper queryWrapper = new QueryWrapper<>(); + //遍历查询所有的子单出库是否有未完成的 + queryWrapper.eq("master_id", id); + queryWrapper.ne("result", RequestStatusEnum.ITEM_APPLY_DETAILS_COMPLETED.getCode()); + List itemApplyRequestDetailDOS = itemApplyRequestDetailMapper.selectList(queryWrapper); + if (itemApplyRequestDetailDOS.size() > 0) {//子单有未出库完的 主单状态给出库中 + applyMainDO.setStatus(RequestStatusEnum.ITEM_APPLY_3.getCode()); + } else {//子单全部出库完毕 给状态完成 + applyMainDO.setStatus(RequestStatusEnum.ITEM_APPLY_4.getCode()); + } + i = itemApplyRequestMainMapper.updateById(applyMainDO); + } + return i; + } + + @Override + public Integer inOperation(ItemApplyRequestMainCreateReqVO reavo) { + List> itemList = reavo.getItemNumbers();//备件号集合 + Integer i = 0; + if (itemList != null && itemList.size() > 0) { + String number = serialNumberApi.generateCode(RuleCodeEnum.Item_Return.getCode());//备件归还 + List list = new ArrayList<>(); + for (Map map : itemList) { + String itemNumber = map.get("itemNumber").toString();//备件号 + String qty = map.get("qty").toString();//归还数量 + String locationNumber = map.get("locationNumber").toString();//库位 + LocationDO locationDO = locationMapper.scanCodeByNumber(locationNumber); + if(!"FALSE".equals(locationDO.getIsInAccount())){//备件归还的库位必须是账外库 + throw exception(ITEM_RETURN_FALSE); + } + String areaNumber = locationDO.getAreaNumber(); + String isInAccount = locationDO.getIsInAccount(); + //添加库存事务 + TransactionCreateReqVO transactionCreateReqVO = new TransactionCreateReqVO(); + transactionCreateReqVO.setItemNumber(itemNumber); + transactionCreateReqVO.setLocationNumber(locationNumber); + transactionCreateReqVO.setAreaNumber(areaNumber); + transactionCreateReqVO.setTransactionType("IN"); + transactionCreateReqVO.setIsInAccount(isInAccount); + transactionCreateReqVO.setQty(new BigDecimal(qty)); + transactionCreateReqVO.setDescribes(reavo.getDescribes());//描述 + transactionCreateReqVO.setOperator(reavo.getReverterId()); + transactionCreateReqVO.setCreator(getLoginUserId().toString()); + transactionCreateReqVO.setAssociatedNumber(number); + transactionCreateReqVO.setInventoryAction(TransactionEnum.RETURN_IN.getCode()); + list.add(transactionCreateReqVO); + //插入备件归还记录 + ItemInLocationDO itemInLocationDO = new ItemInLocationDO(); + itemInLocationDO.setNumber(number); + itemInLocationDO.setItemNumber(itemNumber); + itemInLocationDO.setLocationNumber(locationNumber); + itemInLocationDO.setQty(new BigDecimal(qty)); + itemInLocationDO.setType("IN"); + itemInLocationMapper.insert(itemInLocationDO); + } + i = transactionService.create(list); + }else{ + throw exception(ITEM_DATA_NOT_EMPTY); + } + return i; + } + + @Override + public Integer backout(Long id) { + // 校验存在 + validateItemApplyMainExists(id); + //只有待审核才能撤销 + validateItemApplyCancel(id); + ItemApplyRequestMainDO applyMainDO = itemApplyRequestMainMapper.selectById(id); + applyMainDO.setStatus(RequestStatusEnum.ITEM_APPLY_5.getCode()); + return itemApplyRequestMainMapper.updateById(applyMainDO); + } + + @Override + public Integer approve(Long id, String status) { + // 校验存在 + validate(id); + // 校验是否可以审批 + validateItemApplyApprove(id);//只有待审核才能审批 + validate(id); + ItemApplyRequestMainDO applyMainDO = new ItemApplyRequestMainDO(); + applyMainDO.setId(id); + applyMainDO.setStatus(status); + applyMainDO.setApproveId(getLoginUserId().toString()); + applyMainDO.setApproveTime(LocalDateTime.now()); + return itemApplyRequestMainMapper.updateById(applyMainDO); + } + + @Override + public Integer cancel(Long id) { + // 校验存在 + validateItemApplyMainExists(id); + //校验当前状态是否符合撤回条件(未审批的可撤回) + validateItemApplyCancel(id); + ItemApplyRequestMainDO applyMainDO = new ItemApplyRequestMainDO(); + applyMainDO.setStatus(RequestStatusEnum.ITEM_APPLY_5.getCode()); + return itemApplyRequestMainMapper.updateById(applyMainDO); + } + + private void validateItemApplyMainExists(Long id) { + if (itemApplyRequestMainMapper.selectById(id) == null) { + throw exception(ITEM_APPLY_MAIN_NOT_EXISTS); + } + } + + /** + * 校验能否撤销 + * + * @param id + */ + private void validateItemApplyCancel(Long id) { + ItemApplyRequestMainDO applyMainDO = itemApplyRequestMainMapper.selectById(id); + if (!RequestStatusEnum.ITEM_APPLY_0.getCode().equals(applyMainDO.getStatus())) {//当前状态非待审批 + throw exception(ITEM_APPLY_CANCEL_NOT); + } + } + + /** + * 校验能否审批 + * + * @param id + */ + private void validateItemApplyApprove(Long id) { + ItemApplyRequestMainDO applyMainDO = itemApplyRequestMainMapper.selectById(id); + if (!RequestStatusEnum.ITEM_APPLY_0.getCode().equals(applyMainDO.getStatus())) {//当前状态非待审批 + throw exception(ITEM_APPLY_APPROVE_NOT); + } + } + + /** + * 能否出库 + * + * @param id + */ + private void validateItemApplyAppOut(Long id) { + ItemApplyRequestMainDO applyMainDO = itemApplyRequestMainMapper.selectById(id); + if (!RequestStatusEnum.ITEM_APPLY_1.getCode().equals(applyMainDO.getStatus()) && !RequestStatusEnum.ITEM_APPLY_3.getCode().equals(applyMainDO.getStatus())) {//当前状态非待审批 + throw exception(ITEM_APPLY_APPROVE_OUT_NOT); + } + } + + + @Override + public ItemApplyRequestMainDO getItemApplyMain(Long id) { + return itemApplyRequestMainMapper.selectById(id); + } + + @Override + public List getItemApplyMainList(Collection ids) { + return itemApplyRequestMainMapper.selectBatchIds(ids); + } + + @Override + public PageResult getItemApplyMainPage(ItemApplyRequestMainPageReqVO pageReqVO) { + PageResult pageResult = itemApplyRequestMainMapper.selectPage(pageReqVO); + List itemApplyRequestMainDOList = pageResult.getList(); + for (ItemApplyRequestMainDO itemApplyRequestMainDO : itemApplyRequestMainDOList) { + if(StringUtils.isNotEmpty(itemApplyRequestMainDO.getApplyId())){ + AdminUserRespDTO adminUserRespDTO = userApi.getUser(Long.valueOf(itemApplyRequestMainDO.getApplyId())); + itemApplyRequestMainDO.setApplyId(adminUserRespDTO.getNickname()); + } + if(StringUtils.isNotEmpty(itemApplyRequestMainDO.getApproveId())){ + AdminUserRespDTO adminUserRespDTO = userApi.getUser(Long.valueOf(itemApplyRequestMainDO.getApproveId())); + itemApplyRequestMainDO.setApproveId(adminUserRespDTO.getNickname()); + } + if(StringUtils.isNotEmpty(itemApplyRequestMainDO.getOutId())){ + AdminUserRespDTO adminUserRespDTO = userApi.getUser(Long.valueOf(itemApplyRequestMainDO.getOutId())); + itemApplyRequestMainDO.setOutId(adminUserRespDTO.getNickname()); + } + } + return pageResult; + } + + @Override + public List getItemApplyMainList(ItemApplyRequestMainExportReqVO exportReqVO) { + return itemApplyRequestMainMapper.selectList(exportReqVO); + } + + @Override + public List importItemApplyMainList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(ITEM_APPLY_MAIN_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// ItemApplyMainDO obj = itemApplyMainMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// itemApplyMainMapper.insert(ItemApplyMainConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// ItemApplyMainDO itemApplyMainDO = ItemApplyMainConvert.INSTANCE.convert(item); +// itemApplyMainDO.setId(obj.getId()); +// itemApplyMainMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public Map appGetByNumber(String number) { + Map main = itemApplyRequestMainMapper.appGetByNumber(number); + List> detailsList = new ArrayList<>(); + //查询子项信息 + List> list = itemApplyRequestDetailMapper.appGetByNumber(number); + for (Map map : list) { + BigDecimal itemNumber = itemAccountsMapper.selectInventorySum(map.get("itemNumber").toString()); + map.put("currentQty", itemNumber); + if ("MOLD".equals(map.get("type").toString())) {//选了模具 默认是设备 如果没选则走设备数据为空 + map.put("name", map.get("name1").toString()); + map.put("factoryAreaNumber", map.get("factoryAreaNumber1").toString()); + map.put("factoryAreaName", map.get("factoryAreaName1").toString()); + } + map.put("receiveQty",map.get("receiveQty")==null?BigDecimal.ZERO:map.get("receiveQty").toString()); + } + //main.put("detailsList",list); + main.put("subList", list); + return main; + } + + @Override + public PageResult getAppPage(ItemApplyRequestMainPageReqVO pageReqVO) { + pageReqVO.setUserId(getLoginUserId().toString()); + if ("1".equals(pageReqVO.getFlag())) {//flag 0 首页进入 1我的进入 + //我的里面都是获取的是当前人已经完成的单子 + pageReqVO.setUserId(getLoginUserId().toString()); + } else { + //首页进入是获取未接单 已接单的单子 + pageReqVO.setFlag("0"); + } + IPage pageInfo = itemApplyRequestMainMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + + @Override + public PageResult getAppApprovePage(ItemApplyRequestMainPageReqVO pageReqVO) { + //处理角色代码后期做 role 0 普通审批 1 车间主任 + if ("1".equals(pageReqVO.getFlag())) {//flag 0 首页进入 1我的进入 + //我的里面都是获取的是当前人已经完成的单子 + pageReqVO.setUserId(getLoginUserId().toString()); + } else { + //首页进入是获取未接单 已接单的单子 + pageReqVO.setFlag("0"); + } + IPage pageInfo = itemApplyRequestMainMapper.getAppApprovePage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + + } + + @Override + public PageResult getAppOutOperaPage(ItemApplyRequestMainPageReqVO pageReqVO) { + IPage pageInfo = itemApplyRequestMainMapper.getAppOutOperaPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + + /** + * 校验当前人是否为审批角色 + */ + private void validate(Long id) { + if (itemApplyRequestMainMapper.selectById(id) == null) { + throw exception(ITEM_APPLY_MAIN_NOT_EXISTS); + } + boolean a = permissionApi.hasAnyRoles(getLoginUserId(), "all_approve");//判断是否有审批权限且是车间主任 + boolean b = permissionApi.hasAnyRoles(getLoginUserId(), "normal_approve");//判断是否有审批权限且是普通主任 + if (a && b) { + throw exception(ITEM_APPLY_APPROVE_USER); + } + } + + @Override + public PageResult getItemApplyRequestMainSenior(CustomConditions conditions) { + return itemApplyRequestMainMapper.selectSenior(conditions); + } + + /** + * 备件申请工单发送邮件 + */ + private void sendEmails(ItemApplyRequestMainDO itemApplyRequestMainDO){ + AdminUserRespExpandDTO adminUserRespExpandDTO = new AdminUserRespExpandDTO(); + BigDecimal sumVal = itemApplyRequestMainDO.getSumVal(); + BigDecimal bigDecimal = new BigDecimal(5000); + if(bigDecimal.compareTo(sumVal)>0){//小于5000给两个审批角色发送 + List list = Arrays.asList("all_approve", "normal_approve"); + adminUserRespExpandDTO.setCode(list); + }else{//大于等于5000给一级审批角色发消息 + List list = List.of("all_approve"); + adminUserRespExpandDTO.setCode(list); + } + List userBeanList = userApi.selectByUserIdentity(adminUserRespExpandDTO); + userBeanList.stream().forEach(item ->{ + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getId())); + mailSendSingleToUserReqDTO.setTemplateCode("request-apply-template"); + Map params = new HashMap<>(); + params.put("name",item.getNickname()); + params.put("number", itemApplyRequestMainDO.getNumber()); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + }catch(RuntimeException e){ + info("工单编号为"+itemApplyRequestMainDO.getNumber()+"的名为:"+itemApplyRequestMainDO.getDescribes()+"的工单给"+item.getNickname()+"发送的邮件通知失败:{}", e); + } + }); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/iteminlocation/ItemInLocationService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/iteminlocation/ItemInLocationService.java new file mode 100644 index 0000000..e1dd66d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/iteminlocation/ItemInLocationService.java @@ -0,0 +1,83 @@ +package com.win.module.eam.service.iteminlocation; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.iteminlocation.vo.ItemInLocationCreateReqVO; +import com.win.module.eam.controller.iteminlocation.vo.ItemInLocationExportReqVO; +import com.win.module.eam.controller.iteminlocation.vo.ItemInLocationPageReqVO; +import com.win.module.eam.controller.iteminlocation.vo.ItemInLocationUpdateReqVO; +import com.win.module.eam.dal.dataobject.iteminlocation.ItemInLocationDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 备件入库记录 Service 接口 + * + * @author 超级管理员 + */ +public interface ItemInLocationService { + + /** + * 创建备件入库记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createItemInLocation(@Valid ItemInLocationCreateReqVO createReqVO); + + /** + * 更新备件入库记录 + * + * @param updateReqVO 更新信息 + */ + Integer updateItemInLocation(@Valid ItemInLocationUpdateReqVO updateReqVO); + + /** + * 删除备件入库记录 + * + * @param id 编号 + */ + Integer deleteItemInLocation(Long id); + + /** + * 获得备件入库记录 + * + * @param id 编号 + * @return 备件入库记录 + */ + ItemInLocationDO getItemInLocation(Long id); + + /** + * 获得备件入库记录列表 + * + * @param ids 编号 + * @return 备件入库记录列表 + */ + List getItemInLocationList(Collection ids); + + /** + * 获得备件入库记录分页 + * + * @param pageReqVO 分页查询 + * @return 备件入库记录分页 + */ + PageResult getItemInLocationPage(ItemInLocationPageReqVO pageReqVO); + + /** + * 获得备件入库记录列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 备件入库记录列表 + */ + List getItemInLocationList(ItemInLocationExportReqVO exportReqVO); + + /** + * 获得用高级搜索库位分页列表 + * + * @param conditions 分页、排序和自定义条件 + * @return 分页列表 + */ + PageResult getItemInLocationSenior(CustomConditions conditions); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/iteminlocation/ItemInLocationServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/iteminlocation/ItemInLocationServiceImpl.java new file mode 100644 index 0000000..cd1c938 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/iteminlocation/ItemInLocationServiceImpl.java @@ -0,0 +1,91 @@ +package com.win.module.eam.service.iteminlocation; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.iteminlocation.vo.ItemInLocationCreateReqVO; +import com.win.module.eam.controller.iteminlocation.vo.ItemInLocationExportReqVO; +import com.win.module.eam.controller.iteminlocation.vo.ItemInLocationPageReqVO; +import com.win.module.eam.controller.iteminlocation.vo.ItemInLocationUpdateReqVO; +import com.win.module.eam.convert.iteminlocation.ItemInLocationConvert; +import com.win.module.eam.dal.dataobject.iteminlocation.ItemInLocationDO; +import com.win.module.eam.dal.dataobject.location.LocationDO; +import com.win.module.eam.dal.mysql.iteminlocation.ItemInLocationMapper; +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.eam.enums.ErrorCodeConstants.ITEM_IN_LOCATION_NOT_EXISTS; + +/** + * 备件入库记录 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class ItemInLocationServiceImpl implements ItemInLocationService { + + @Resource + private ItemInLocationMapper itemInLocationMapper; + + @Override + public Long createItemInLocation(ItemInLocationCreateReqVO createReqVO) { + // 插入 + ItemInLocationDO itemInLocation = ItemInLocationConvert.INSTANCE.convert(createReqVO); + itemInLocationMapper.insert(itemInLocation); + // 返回 + return itemInLocation.getId(); + } + + @Override + public Integer updateItemInLocation(ItemInLocationUpdateReqVO updateReqVO) { + // 校验存在 + validateItemInLocationExists(updateReqVO.getId()); + // 更新 + ItemInLocationDO updateObj = ItemInLocationConvert.INSTANCE.convert(updateReqVO); + return itemInLocationMapper.updateById(updateObj); + } + + @Override + public Integer deleteItemInLocation(Long id) { + // 校验存在 + validateItemInLocationExists(id); + // 删除 + return itemInLocationMapper.deleteById(id); + } + + private void validateItemInLocationExists(Long id) { + if (itemInLocationMapper.selectById(id) == null) { + throw exception(ITEM_IN_LOCATION_NOT_EXISTS); + } + } + + @Override + public ItemInLocationDO getItemInLocation(Long id) { + return itemInLocationMapper.selectById(id); + } + + @Override + public List getItemInLocationList(Collection ids) { + return itemInLocationMapper.selectBatchIds(ids); + } + + @Override + public PageResult getItemInLocationPage(ItemInLocationPageReqVO pageReqVO) { + return itemInLocationMapper.selectPage(pageReqVO); + } + + @Override + public List getItemInLocationList(ItemInLocationExportReqVO exportReqVO) { + return itemInLocationMapper.selectList(exportReqVO); + } + + @Override + public PageResult getItemInLocationSenior(CustomConditions conditions) { + return itemInLocationMapper.selectSenior(conditions); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemlocationreplace/ItemLocationReplaceService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemlocationreplace/ItemLocationReplaceService.java new file mode 100644 index 0000000..c3659e0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemlocationreplace/ItemLocationReplaceService.java @@ -0,0 +1,84 @@ +package com.win.module.eam.service.itemlocationreplace; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.itemlocationreplace.vo.ItemLocationReplaceCreateReqVO; +import com.win.module.eam.controller.itemlocationreplace.vo.ItemLocationReplaceExportReqVO; +import com.win.module.eam.controller.itemlocationreplace.vo.ItemLocationReplacePageReqVO; +import com.win.module.eam.controller.itemlocationreplace.vo.ItemLocationReplaceUpdateReqVO; +import com.win.module.eam.dal.dataobject.itemlocationreplace.ItemLocationReplaceDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 备件库位变更记录 Service 接口 + * + * @author 超级管理员 + */ +public interface ItemLocationReplaceService { + + /** + * 创建备件库位变更记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createItemLocationReplace(@Valid ItemLocationReplaceCreateReqVO createReqVO); + + /** + * 更新备件库位变更记录 + * + * @param updateReqVO 更新信息 + */ + Integer updateItemLocationReplace(@Valid ItemLocationReplaceUpdateReqVO updateReqVO); + + /** + * 删除备件库位变更记录 + * + * @param id 编号 + */ + Integer deleteItemLocationReplace(Long id); + + /** + * 获得备件库位变更记录 + * + * @param id 编号 + * @return 备件库位变更记录 + */ + ItemLocationReplaceDO getItemLocationReplace(Long id); + + /** + * 获得备件库位变更记录列表 + * + * @param ids 编号 + * @return 备件库位变更记录列表 + */ + List getItemLocationReplaceList(Collection ids); + + /** + * 获得备件库位变更记录分页 + * + * @param pageReqVO 分页查询 + * @return 备件库位变更记录分页 + */ + PageResult getItemLocationReplacePage(ItemLocationReplacePageReqVO pageReqVO); + + /** + * 获得备件库位变更记录列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 备件库位变更记录列表 + */ + List getItemLocationReplaceList(ItemLocationReplaceExportReqVO exportReqVO); + + /** + * 获得用高级搜索库位分页列表 + * + * @param conditions 分页、排序和自定义条件 + * @return 分页列表 + */ + PageResult getItemLocationReplaceSenior(CustomConditions conditions); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemlocationreplace/ItemLocationReplaceServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemlocationreplace/ItemLocationReplaceServiceImpl.java new file mode 100644 index 0000000..31fc67a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemlocationreplace/ItemLocationReplaceServiceImpl.java @@ -0,0 +1,92 @@ +package com.win.module.eam.service.itemlocationreplace; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.itemlocationreplace.vo.ItemLocationReplaceCreateReqVO; +import com.win.module.eam.controller.itemlocationreplace.vo.ItemLocationReplaceExportReqVO; +import com.win.module.eam.controller.itemlocationreplace.vo.ItemLocationReplacePageReqVO; +import com.win.module.eam.controller.itemlocationreplace.vo.ItemLocationReplaceUpdateReqVO; +import com.win.module.eam.convert.itemlocationreplace.ItemLocationReplaceConvert; +import com.win.module.eam.dal.dataobject.itemlocationreplace.ItemLocationReplaceDO; +import com.win.module.eam.dal.dataobject.location.LocationDO; +import com.win.module.eam.dal.mysql.itemlocationreplace.ItemLocationReplaceMapper; +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.eam.enums.ErrorCodeConstants.ITEM_LOCATION_REPLACE_NOT_EXISTS; + +/** + * 备件库位变更记录 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class ItemLocationReplaceServiceImpl implements ItemLocationReplaceService { + + @Resource + private ItemLocationReplaceMapper itemLocationReplaceMapper; + + @Override + public Long createItemLocationReplace(ItemLocationReplaceCreateReqVO createReqVO) { + // 插入 + ItemLocationReplaceDO itemLocationReplace = ItemLocationReplaceConvert.INSTANCE.convert(createReqVO); + itemLocationReplaceMapper.insert(itemLocationReplace); + // 返回 + return itemLocationReplace.getId(); + } + + @Override + public Integer updateItemLocationReplace(ItemLocationReplaceUpdateReqVO updateReqVO) { + // 校验存在 + validateItemLocationReplaceExists(updateReqVO.getId()); + // 更新 + ItemLocationReplaceDO updateObj = ItemLocationReplaceConvert.INSTANCE.convert(updateReqVO); + return itemLocationReplaceMapper.updateById(updateObj); + } + + @Override + public Integer deleteItemLocationReplace(Long id) { + // 校验存在 + validateItemLocationReplaceExists(id); + // 删除 + return itemLocationReplaceMapper.deleteById(id); + } + + private void validateItemLocationReplaceExists(Long id) { + if (itemLocationReplaceMapper.selectById(id) == null) { + throw exception(ITEM_LOCATION_REPLACE_NOT_EXISTS); + } + } + + @Override + public ItemLocationReplaceDO getItemLocationReplace(Long id) { + return itemLocationReplaceMapper.selectById(id); + } + + @Override + public List getItemLocationReplaceList(Collection ids) { + return itemLocationReplaceMapper.selectBatchIds(ids); + } + + @Override + public PageResult getItemLocationReplacePage(ItemLocationReplacePageReqVO pageReqVO) { + return itemLocationReplaceMapper.selectPage(pageReqVO); + } + + @Override + public List getItemLocationReplaceList(ItemLocationReplaceExportReqVO exportReqVO) { + return itemLocationReplaceMapper.selectList(exportReqVO); + } + + @Override + public PageResult getItemLocationReplaceSenior(CustomConditions conditions) { + return itemLocationReplaceMapper.selectSenior(conditions); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemmaintenancerecord/ItemMaintenanceRecordService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemmaintenancerecord/ItemMaintenanceRecordService.java new file mode 100644 index 0000000..1f897ff --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemmaintenancerecord/ItemMaintenanceRecordService.java @@ -0,0 +1,88 @@ +package com.win.module.eam.service.itemmaintenancerecord; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.itemmaintenancerecord.vo.*; +import com.win.module.eam.dal.dataobject.itemmaintenancerecord.ItemMaintenanceRecordDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 备件维修记录 Service 接口 + * + * @author 超级管理员 + */ +public interface ItemMaintenanceRecordService { + + /** + * 创建备件维修记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createItemMaintenance(@Valid ItemMaintenanceRecordCreateReqVO createReqVO); + + /** + * 更新备件维修记录 + * + * @param updateReqVO 更新信息 + */ + Integer updateItemMaintenance(@Valid ItemMaintenanceRecordUpdateReqVO updateReqVO); + + /** + * 删除备件维修记录 + * + * @param id 编号 + */ + Integer deleteItemMaintenance(Long id); + + /** + * 获得备件维修记录 + * + * @param id 编号 + * @return 备件维修记录 + */ + ItemMaintenanceRecordDO getItemMaintenance(Long id); + + /** + * 获得备件维修记录列表 + * + * @param ids 编号 + * @return 备件维修记录列表 + */ + List getItemMaintenanceList(Collection ids); + + /** + * 获得备件维修记录分页 + * + * @param pageReqVO 分页查询 + * @return 备件维修记录分页 + */ + PageResult getItemMaintenancePage(ItemMaintenanceRecordPageReqVO pageReqVO); + + /** + * 获得备件维修记录列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 备件维修记录列表 + */ + List getItemMaintenanceList(ItemMaintenanceRecordExportReqVO exportReqVO); + + /** + * 导入备件维修记录主信息 + * + * @param datas 导入备件维修记录主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importItemMaintenanceList(List datas, Integer mode, boolean updatePart); + + /** + * APP我的获得当前人备件维修记录分页 + * + * @param pageReqVO 分页查询 + * @return 备件维修记录分页 + */ + PageResult getAppPage(ItemMaintenanceRecordPageReqVO pageReqVO); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemmaintenancerecord/ItemMaintenanceRecordServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemmaintenancerecord/ItemMaintenanceRecordServiceImpl.java new file mode 100644 index 0000000..d661e14 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemmaintenancerecord/ItemMaintenanceRecordServiceImpl.java @@ -0,0 +1,192 @@ +package com.win.module.eam.service.itemmaintenancerecord; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.module.eam.controller.itemmaintenancerecord.vo.*; +import com.win.module.eam.controller.transaction.vo.TransactionCreateReqVO; +import com.win.module.eam.convert.itemmaintenancerecord.ItemMaintenanceRecordConvert; +import com.win.module.eam.dal.dataobject.itemmaintenancerecord.ItemMaintenanceRecordDO; +import com.win.module.eam.dal.dataobject.location.LocationDO; +import com.win.module.eam.dal.mysql.location.LocationMapper; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.eam.enums.transaction.TransactionEnum; +import com.win.module.eam.service.transaction.TransactionService; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; + +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.math.BigDecimal; +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.dal.mysql.itemmaintenancerecord.ItemMaintenanceRecordMapper; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.ITEM_DATA_NOT_EMPTY; +import static com.win.module.eam.enums.ErrorCodeConstants.PURCHASE_ITEM_ORDER_TRUE; + +/** + * 备件维修记录 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class ItemMaintenanceRecordServiceImpl implements ItemMaintenanceRecordService { + + @Resource + private ItemMaintenanceRecordMapper itemMaintenanceRecordMapper; + + @Resource + private SerialNumberApi serialNumberApi; + + @Resource + private AdminUserApi userApi; + + @Resource + private TransactionService transactionService; + + @Resource + private LocationMapper locationMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createItemMaintenance(ItemMaintenanceRecordCreateReqVO createReqVO) { + int i = 0; + List> itemList = createReqVO.getItemNumbers();//备件号集合 + if(!itemList.isEmpty()){ + List list = new ArrayList<>(); + for(Map map:itemList){ + createReqVO.setItemNumber(map.get("itemNumber").toString()); + createReqVO.setLocationNumber(map.get("locationNumber").toString()); + createReqVO.setReasons(map.get("reasons")==null?"":map.get("reasons").toString()); + createReqVO.setResult(map.get("result").toString()); + createReqVO.setQty(new BigDecimal(map.get("qty").toString())); + String locationNumber = map.get("locationNumber").toString();//库位 + LocationDO locationDO = locationMapper.scanCodeByNumber(locationNumber); + if(!"FALSE".equals(locationDO.getIsInAccount())){//备件维修的库位必须是账外库 + throw exception(PURCHASE_ITEM_ORDER_TRUE); + } + String areaNumber = locationDO.getAreaNumber(); + createReqVO.setAreaNumber(areaNumber); + String isInAccount = locationDO.getIsInAccount(); + createReqVO.setIsInAccount(isInAccount); + // 插入 + ItemMaintenanceRecordDO itemMaintenance = ItemMaintenanceRecordConvert.INSTANCE.convert(createReqVO); + String number = serialNumberApi.generateCode(RuleCodeEnum.BJWX_RECORD.getCode()); + itemMaintenance.setNumber(number); + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + itemMaintenance.setDeptId(user.getDeptId()); + i = itemMaintenanceRecordMapper.insert(itemMaintenance); + //添加库存事务 + if(OrderStatusEnum.ITEM_WEIXIU_YES.getCode().equals(createReqVO.getResult())){//备件维修完成 + TransactionCreateReqVO transactionCreateReqVO = new TransactionCreateReqVO(); + transactionCreateReqVO.setItemNumber(createReqVO.getItemNumber()); + transactionCreateReqVO.setLocationNumber(createReqVO.getLocationNumber()); + transactionCreateReqVO.setAreaNumber(createReqVO.getAreaNumber()); + transactionCreateReqVO.setTransactionType("IN"); + transactionCreateReqVO.setIsInAccount("FALSE"); + transactionCreateReqVO.setQty(createReqVO.getQty()); + transactionCreateReqVO.setAssociatedNumber(number); + transactionCreateReqVO.setOperator(getLoginUserId().toString()); + transactionCreateReqVO.setInventoryAction(TransactionEnum.SERVICE_IN.getCode()); + list.add(transactionCreateReqVO); + transactionService.create(list); + } + } + + }else{ + throw exception(ITEM_DATA_NOT_EMPTY); + } + long a = i; + // 返回 + return a; + } + + @Override + public Integer updateItemMaintenance(ItemMaintenanceRecordUpdateReqVO updateReqVO) { + // 校验存在 + //validateItemMaintenanceExists(updateReqVO.getId()); + // 更新 + ItemMaintenanceRecordDO updateObj = ItemMaintenanceRecordConvert.INSTANCE.convert(updateReqVO); + return itemMaintenanceRecordMapper.updateById(updateObj); + } + + @Override + public Integer deleteItemMaintenance(Long id) { + // 校验存在 + validateItemMaintenanceExists(id); + // 删除 + return itemMaintenanceRecordMapper.deleteById(id); + } + + private void validateItemMaintenanceExists(Long id) { + if (itemMaintenanceRecordMapper.selectById(id) == null) { + //throw exception(ITEM_MAINTENANCE_NOT_EXISTS); + } + } + + @Override + public ItemMaintenanceRecordDO getItemMaintenance(Long id) { + return itemMaintenanceRecordMapper.selectById(id); + } + + @Override + public List getItemMaintenanceList(Collection ids) { + return itemMaintenanceRecordMapper.selectBatchIds(ids); + } + + @Override + public PageResult getItemMaintenancePage(ItemMaintenanceRecordPageReqVO pageReqVO) { + return itemMaintenanceRecordMapper.selectPage(pageReqVO); + } + + @Override + public List getItemMaintenanceList(ItemMaintenanceRecordExportReqVO exportReqVO) { + return itemMaintenanceRecordMapper.selectList(exportReqVO); + } + + @Override + public List importItemMaintenanceList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(ITEM_MAINTENANCE_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// ItemMaintenanceDO obj = itemMaintenanceMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// itemMaintenanceMapper.insert(ItemMaintenanceConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// ItemMaintenanceDO itemMaintenanceDO = ItemMaintenanceConvert.INSTANCE.convert(item); +// itemMaintenanceDO.setId(obj.getId()); +// itemMaintenanceMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public PageResult getAppPage(ItemMaintenanceRecordPageReqVO pageReqVO) { + pageReqVO.setUserId(getLoginUserId().toString()); + IPage pageInfo = itemMaintenanceRecordMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemorder/ItemOrderDetailService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemorder/ItemOrderDetailService.java new file mode 100644 index 0000000..980096c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemorder/ItemOrderDetailService.java @@ -0,0 +1,79 @@ +package com.win.module.eam.service.itemorder; + +import java.util.*; +import javax.validation.*; +import com.win.module.eam.controller.itemorder.vo.*; +import com.win.module.eam.dal.dataobject.itemorder.ItemOrderDetailDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 备件采购订单子 Service 接口 + * + * @author 超级管理员 + */ +public interface ItemOrderDetailService { + + /** + * 创建备件采购订单子 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createItemOrderDetail(@Valid ItemOrderDetailCreateReqVO createReqVO); + + /** + * 更新备件采购订单子 + * + * @param updateReqVO 更新信息 + */ + Integer updateItemOrderDetail(@Valid ItemOrderDetailUpdateReqVO updateReqVO); + + /** + * 删除备件采购订单子 + * + * @param id 编号 + */ + Integer deleteItemOrderDetail(Long id); + + /** + * 获得备件采购订单子 + * + * @param id 编号 + * @return 备件采购订单子 + */ + ItemOrderDetailDO getItemOrderDetail(Long id); + + /** + * 获得备件采购订单子列表 + * + * @param ids 编号 + * @return 备件采购订单子列表 + */ + List getItemOrderDetailList(Collection ids); + + /** + * 获得备件采购订单子分页 + * + * @param pageReqVO 分页查询 + * @return 备件采购订单子分页 + */ + PageResult getItemOrderDetailPage(ItemOrderDetailPageReqVO pageReqVO); + + /** + * 获得备件采购订单子列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 备件采购订单子列表 + */ + List getItemOrderDetailList(ItemOrderDetailExportReqVO exportReqVO); + + /** + * 导入备件采购订单子主信息 + * + * @param datas 导入备件采购订单子主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importItemOrderDetailList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemorder/ItemOrderDetailServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemorder/ItemOrderDetailServiceImpl.java new file mode 100644 index 0000000..7089c3a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemorder/ItemOrderDetailServiceImpl.java @@ -0,0 +1,107 @@ +package com.win.module.eam.service.itemorder; + +import cn.hutool.core.collection.CollUtil; +import com.win.module.eam.controller.itemorder.vo.*; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.win.module.eam.dal.dataobject.itemorder.ItemOrderDetailDO; +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.convert.itemorder.ItemOrderDetailConvert; +import com.win.module.eam.dal.mysql.itemorder.ItemOrderDetailMapper; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 备件采购订单子 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class ItemOrderDetailServiceImpl implements ItemOrderDetailService { + + @Resource + private ItemOrderDetailMapper itemOrderDetailMapper; + + @Override + public Long createItemOrderDetail(ItemOrderDetailCreateReqVO createReqVO) { + // 插入 + ItemOrderDetailDO itemOrderDetail = ItemOrderDetailConvert.INSTANCE.convert(createReqVO); + itemOrderDetailMapper.insert(itemOrderDetail); + // 返回 + return itemOrderDetail.getId(); + } + + @Override + public Integer updateItemOrderDetail(ItemOrderDetailUpdateReqVO updateReqVO) { + // 校验存在 + //validateItemOrderDetailExists(updateReqVO.getId()); + // 更新 + ItemOrderDetailDO updateObj = ItemOrderDetailConvert.INSTANCE.convert(updateReqVO); + return itemOrderDetailMapper.updateById(updateObj); + } + + @Override + public Integer deleteItemOrderDetail(Long id) { + // 校验存在 + validateItemOrderDetailExists(id); + // 删除 + return itemOrderDetailMapper.deleteById(id); + } + + private void validateItemOrderDetailExists(Long id) { + if (itemOrderDetailMapper.selectById(id) == null) { + //throw exception(ITEM_ORDER_DETAIL_NOT_EXISTS); + } + } + + @Override + public ItemOrderDetailDO getItemOrderDetail(Long id) { + return itemOrderDetailMapper.selectById(id); + } + + @Override + public List getItemOrderDetailList(Collection ids) { + return itemOrderDetailMapper.selectBatchIds(ids); + } + + @Override + public PageResult getItemOrderDetailPage(ItemOrderDetailPageReqVO pageReqVO) { + return itemOrderDetailMapper.selectPage(pageReqVO); + } + + @Override + public List getItemOrderDetailList(ItemOrderDetailExportReqVO exportReqVO) { + return itemOrderDetailMapper.selectList(exportReqVO); + } + + @Override + public List importItemOrderDetailList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(ITEM_ORDER_DETAIL_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// ItemOrderDetailDO obj = itemOrderDetailMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// itemOrderDetailMapper.insert(ItemOrderDetailConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// ItemOrderDetailDO itemOrderDetailDO = ItemOrderDetailConvert.INSTANCE.convert(item); +// itemOrderDetailDO.setId(obj.getId()); +// itemOrderDetailMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemorder/ItemOrderMainService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemorder/ItemOrderMainService.java new file mode 100644 index 0000000..e201799 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemorder/ItemOrderMainService.java @@ -0,0 +1,121 @@ +package com.win.module.eam.service.itemorder; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.itemorder.vo.*; +import com.win.module.eam.dal.dataobject.itemorder.ItemOrderDetailDO; +import com.win.module.eam.dal.dataobject.itemorder.ItemOrderMainDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 备件采购订单主 Service 接口 + * + * @author 超级管理员 + */ +public interface ItemOrderMainService { + + /** + * 创建备件采购订单主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createItemOrderMain(@Valid ItemOrderMainCreateReqVO createReqVO); + + /** + * 更新备件采购订单主 + * + * @param updateReqVO 更新信息 + */ + Integer updateItemOrderMain(@Valid ItemOrderMainUpdateReqVO updateReqVO); + + /** + * 删除备件采购订单主 + * + * @param id 编号 + */ + Integer deleteItemOrderMain(Long id); + + /** + * 获得备件采购订单主 + * + * @param id 编号 + * @return 备件采购订单主 + */ + ItemOrderMainDO getItemOrderMain(Long id); + + /** + * 获得备件采购订单主列表 + * + * @param ids 编号 + * @return 备件采购订单主列表 + */ + List getItemOrderMainList(Collection ids); + + /** + * 获得备件采购订单主分页 + * + * @param pageReqVO 分页查询 + * @return 备件采购订单主分页 + */ + PageResult getItemOrderMainPage(ItemOrderMainPageReqVO pageReqVO); + + /** + * PDA获得采购订单分页 + * @param pageReqVO + * @return + */ + PageResult getPdaPage(ItemOrderMainPageReqVO pageReqVO); + + /** + * 获得备件采购订单主列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 备件采购订单主列表 + */ + List getItemOrderMainList(ItemOrderMainExportReqVO exportReqVO); + + /** + * 导入备件采购订单主主信息 + * + * @param datas 导入备件采购订单主主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importItemOrderMainList(List datas, Integer mode, boolean updatePart); + + /** + * 关闭备件采购订单主主信息 + * + * @param id 采购订单申请主ID + * @return 更新数量 + */ + Integer closeItemOrderMain(Long id); + + /** + * PDA获得采购订单的备件详细列表 + * @param id + * @return + */ + List getPdaDetailsById(Long id); + + /** + * 采购入库 + * @param reavo + * @return + */ + Integer inOperation(PdaItemOrderCreateReqVO reavo); + + /** + * 获得用高级搜索库位分页列表 + * + * @param conditions 分页、排序和自定义条件 + * @return 分页列表 + */ + PageResult getItemOrderMainSenior(CustomConditions conditions); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemorder/ItemOrderMainServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemorder/ItemOrderMainServiceImpl.java new file mode 100644 index 0000000..04d4f99 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemorder/ItemOrderMainServiceImpl.java @@ -0,0 +1,330 @@ +package com.win.module.eam.service.itemorder; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.itemorder.vo.*; +import com.win.module.eam.controller.transaction.vo.TransactionCreateReqVO; +import com.win.module.eam.convert.itemorder.ItemOrderDetailConvert; +import com.win.module.eam.convert.itemorder.ItemOrderMainConvert; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.dataobject.itemorder.ItemOrderDetailDO; +import com.win.module.eam.dal.dataobject.itemorder.ItemOrderMainDO; +import com.win.module.eam.dal.dataobject.location.LocationDO; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.eam.dal.mysql.itemorder.ItemOrderDetailMapper; +import com.win.module.eam.dal.mysql.itemorder.ItemOrderMainMapper; +import com.win.module.eam.dal.mysql.location.LocationMapper; +import com.win.module.eam.enums.OpenAndClose.CompleteEnum; +import com.win.module.eam.enums.basic.BooleanTypeEnum; +import com.win.module.eam.enums.transaction.TransactionEnum; +import com.win.module.eam.service.transaction.TransactionService; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +import dm.jdbc.filter.stat.json.JSONObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.ArrayList; +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.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 备件采购订单主 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class ItemOrderMainServiceImpl implements ItemOrderMainService { + + @Resource + private ItemOrderMainMapper itemOrderMainMapper; + @Resource + private ItemOrderDetailMapper itemOrderDetailMapper; + @Resource + private SerialNumberApi serialNumberApi; + @Resource + private ItemMapper itemMapper; + + @Resource + private TransactionService transactionService; + + @Resource + private LocationMapper locationMapper; + + @Override + @Transactional + public Long createItemOrderMain(ItemOrderMainCreateReqVO createReqVO) { + // 插入 + ItemOrderMainDO itemOrderMain = ItemOrderMainConvert.INSTANCE.convert(createReqVO); + String orderNumber = serialNumberApi.generateCode(RuleCodeEnum.ITEM_ORDER.getCode()); + itemOrderMain.setNumber(orderNumber); + itemOrderMain.setStatus(CompleteEnum.INCOMPLETE.getCode()); + itemOrderMainMapper.insert(itemOrderMain); + for (ItemOrderDetailCreateReqVO itemOrderDetailCreateReqVO : createReqVO.getSubList()) { + ItemOrderDetailDO itemOrderDetailDO = ItemOrderDetailConvert.INSTANCE.convert(itemOrderDetailCreateReqVO); + itemOrderDetailDO.setNumber(orderNumber); + itemOrderDetailDO.setMasterId(itemOrderMain.getId()); + itemOrderDetailDO.setStatus(CompleteEnum.INCOMPLETE.getCode()); + //校验基础信息是否有该备件 + QueryWrapper itemDOQueryWrapper = new QueryWrapper<>(); + itemDOQueryWrapper.eq("number", itemOrderDetailDO.getItemNumber()); + ItemDO itemDO = itemMapper.selectOne(itemDOQueryWrapper); + if(itemDO!=null){ + itemDO.setSinglePrice(itemOrderDetailDO.getSinglePrice()); + itemDO.setSinglePrice(itemOrderDetailDO.getSinglePrice()); + itemMapper.updateById(itemDO); + } +// ItemAccountsDO itemAccountsDO = new ItemAccountsDO(); +// String itemNumber = serialNumberApi.generateCode(RuleCodeEnum.Item.getCode()); +// itemAccountsDO.setItemNumber(itemNumber); +// itemAccountsDO.setCreateTime(LocalDateTime.now()); +// //是否全局,备件没匹配设备时,默认是全局的 +// itemDO.setIsOverall(BooleanTypeEnum.Y.getCode()); +// itemMapper.insert(itemDO); + itemOrderDetailDO.setItemName(itemDO.getName()); + itemOrderDetailMapper.insert(itemOrderDetailDO); + + } + // 返回 + return itemOrderMain.getId(); + } + + @Override + public Integer updateItemOrderMain(ItemOrderMainUpdateReqVO updateReqVO) { + // 校验存在 + //validateItemOrderMainExists(updateReqVO.getId()); + // 更新 + ItemOrderMainDO updateObj = ItemOrderMainConvert.INSTANCE.convert(updateReqVO); + return itemOrderMainMapper.updateById(updateObj); + } + + @Override + public Integer deleteItemOrderMain(Long id) { + // 校验存在 + validateItemOrderMainExists(id); + // 删除 + return itemOrderMainMapper.deleteById(id); + } + + private ItemOrderMainDO validateItemOrderMainExists(Long id) { + ItemOrderMainDO itemOrderMainDO = itemOrderMainMapper.selectById(id); + if (itemOrderMainDO == null) { + throw exception(ITEM_ORDER_MAIN_NOT_EXISTS); + } + return itemOrderMainDO; + } + + @Override + public ItemOrderMainDO getItemOrderMain(Long id) { + return itemOrderMainMapper.selectById(id); + } + + @Override + public List getItemOrderMainList(Collection ids) { + return itemOrderMainMapper.selectBatchIds(ids); + } + + @Override + public PageResult getItemOrderMainPage(ItemOrderMainPageReqVO pageReqVO) { + return itemOrderMainMapper.selectPage(pageReqVO); + } + + @Override + public PageResult getPdaPage(ItemOrderMainPageReqVO pageReqVO) { + //我的里面都是获取的是当前人已经完成的单子 + IPage pageInfo = itemOrderMainMapper.getPdaPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + + @Override + public List getItemOrderMainList(ItemOrderMainExportReqVO exportReqVO) { + return itemOrderMainMapper.selectList(exportReqVO); + } + + @Override + public List importItemOrderMainList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(ITEM_ORDER_MAIN_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// ItemOrderMainDO obj = itemOrderMainMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// itemOrderMainMapper.insert(ItemOrderMainConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// ItemOrderMainDO itemOrderMainDO = ItemOrderMainConvert.INSTANCE.convert(item); +// itemOrderMainDO.setId(obj.getId()); +// itemOrderMainMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + @Transactional + public Integer closeItemOrderMain(Long id) { + // 校验存在存在下级单据 + ItemOrderMainDO mainDO = validateItemOrderMainExists(id); + //查询要货计划子表 + QueryWrapper itemOrderDetailDOQueryWrapper = new QueryWrapper<>(); + itemOrderDetailDOQueryWrapper.eq("number", mainDO.getNumber()); + itemOrderDetailDOQueryWrapper.eq("available", BooleanTypeEnum.Y.getCode()); + List itemOrderDetailDOList = itemOrderDetailMapper.selectList(itemOrderDetailDOQueryWrapper); + for (ItemOrderDetailDO itemOrderDetailDO : itemOrderDetailDOList) { + itemOrderDetailDO.setStatus(CompleteEnum.COMPLETE.getCode()); + itemOrderDetailMapper.updateById(itemOrderDetailDO); + } + mainDO.setStatus(CompleteEnum.COMPLETE.getCode()); + return itemOrderMainMapper.updateById(mainDO); + } + + @Override + public List getPdaDetailsById(Long id) { + return itemOrderDetailMapper.getPdaDetailsById(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer inOperation(PdaItemOrderCreateReqVO reavo) { + Long id = reavo.getId();//采购工单id + int i = 0; + // 校验存在 + validateExists(id); + ItemOrderMainDO itemOrderMainDO = itemOrderMainMapper.selectById(id); + validateIn(id);//校验订单是否完成 + List> itemList = reavo.getItemNumbers();//备件号集合 + if (itemList != null && itemList.size() > 0) { + for (Map map : itemList) { + List list = new ArrayList<>(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + String itemNumber = map.get("itemNumber").toString();//备件号 + String qty = map.get("qty").toString();//入库数量 + String locationNumber = map.get("locationNumber").toString();//库位 + LocationDO locationDO = locationMapper.scanCodeByNumber(locationNumber); + if(!"TRUE".equals(locationDO.getIsInAccount())){//采购入库的库位必须是账内库 + throw exception(PURCHASE_ITEM_ORDER_TRUE); + } + String areaNumber = locationDO.getAreaNumber(); + String isInAccount = locationDO.getIsInAccount(); + //往申领工单子表中插入 + queryWrapper.eq("master_id", reavo.getId()); + queryWrapper.eq("item_number", itemNumber); + List itemOrderDetailDOS = itemOrderDetailMapper.selectList(queryWrapper); + if (itemOrderDetailDOS.size() > 0) { + ItemOrderDetailDO detailDO = itemOrderDetailDOS.get(0); + String status = detailDO.getStatus(); + if(CompleteEnum.COMPLETE.getCode().equals(status)){//接收完成 + throw exception(PURCHASE_ITEM_COMPLETE);//该配件采购数量已足额 + } + BigDecimal receiveQty = detailDO.getDeliveryQty();//采购收货数 + if(receiveQty==null){ + receiveQty = new BigDecimal(BigInteger.ZERO); + } + BigDecimal qty1 = detailDO.getQty();//采购订单申请数 + if(qty1==null){ + qty1 = new BigDecimal(BigInteger.ZERO); + } + receiveQty = receiveQty.add(new BigDecimal(qty)); + detailDO.setDeliveryQty(receiveQty);//更新入库数量 + if (receiveQty.compareTo(qty1) > 0) {//接收的数大于申领数量 + //备件收货数量大于采购数量 + throw exception(PURCHASE_ITEM_ORDER_NUM_OVERFLOW); + } + if (receiveQty.compareTo(qty1)==0) {//equals()方法仍然会判断数值相等即使小数位不同 + //数据相等完成 + detailDO.setStatus(CompleteEnum.COMPLETE.getCode());//接收完成 + } else { + detailDO.setStatus(CompleteEnum.INCOMPLETE.getCode());//未完成 + } + itemOrderDetailMapper.updateById(detailDO); + //添加库存事务 + TransactionCreateReqVO transactionCreateReqVO = new TransactionCreateReqVO(); + transactionCreateReqVO.setItemNumber(itemNumber); + transactionCreateReqVO.setLocationNumber(locationNumber); + transactionCreateReqVO.setAreaNumber(areaNumber); + transactionCreateReqVO.setTransactionType("IN"); + transactionCreateReqVO.setIsInAccount(isInAccount); + transactionCreateReqVO.setQty(new BigDecimal(qty)); + transactionCreateReqVO.setDescribes(reavo.getDescribes()); + transactionCreateReqVO.setAssociatedNumber(itemOrderMainDO.getNumber()); + transactionCreateReqVO.setOperator(getLoginUserId().toString()); + transactionCreateReqVO.setCreator(getLoginUserId().toString()); + transactionCreateReqVO.setInventoryAction(TransactionEnum.PURCHASE_IN.getCode()); + list.add(transactionCreateReqVO); + System.out.println(JSONObject.valueToString(list)); + transactionService.create(list); + } else { + //该配件不在采购订单范围内 + throw exception(PURCHASE_ITEM_EXCLUDE); + } + } + //插入采购订单主表 + //遍历查询所有的子单看备件是否有备件没有采购完 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("master_id", id); + queryWrapper.eq("status", CompleteEnum.INCOMPLETE.getCode()); + List itemOrderDetailDOS = itemOrderDetailMapper.selectList(queryWrapper); + if (itemOrderDetailDOS.size() > 0) {//子单有未采购完的 主单状态给未完成 + itemOrderMainDO.setStatus(CompleteEnum.INCOMPLETE.getCode()); + } else {//子单全部入库完毕 给采购订单状态完成 + itemOrderMainDO.setStatus(CompleteEnum.COMPLETE.getCode()); + } + i = itemOrderMainMapper.updateById(itemOrderMainDO); + }else{ + //零件不能为空 + throw exception(ITEM_DATA_NOT_EMPTY); + } + return i; + } + + /** + * 校验工单是否存在 + * @param id + */ + private void validateExists(Long id) { + if (itemOrderMainMapper.selectById(id) == null) { + throw exception(PURCHASE_ITEM_NOT_EXISTS); + } + } + + /** + * 校验主订单是否完成 + * @param id + */ + private void validateIn(Long id) { + ItemOrderMainDO itemOrderMainDO = itemOrderMainMapper.selectById(id); + + if (CompleteEnum.COMPLETE.getCode().equals(itemOrderMainDO.getStatus())) {//状态为完成 + throw exception(PURCHASE_ITEM_ORDER_COMPLETE); + } + } + + @Override + public PageResult getItemOrderMainSenior(CustomConditions conditions) { + return itemOrderMainMapper.selectSenior(conditions); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemoutlocation/ItemOutLocationService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemoutlocation/ItemOutLocationService.java new file mode 100644 index 0000000..6cccef4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemoutlocation/ItemOutLocationService.java @@ -0,0 +1,83 @@ +package com.win.module.eam.service.itemoutlocation; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.itemoutlocation.vo.ItemOutLocationCreateReqVO; +import com.win.module.eam.controller.itemoutlocation.vo.ItemOutLocationExportReqVO; +import com.win.module.eam.controller.itemoutlocation.vo.ItemOutLocationPageReqVO; +import com.win.module.eam.controller.itemoutlocation.vo.ItemOutLocationUpdateReqVO; +import com.win.module.eam.dal.dataobject.itemoutlocation.ItemOutLocationDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 备件出库记录 Service 接口 + * + * @author 超级管理员 + */ +public interface ItemOutLocationService { + + /** + * 创建备件出库记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createItemOutLocation(@Valid ItemOutLocationCreateReqVO createReqVO); + + /** + * 更新备件出库记录 + * + * @param updateReqVO 更新信息 + */ + Integer updateItemOutLocation(@Valid ItemOutLocationUpdateReqVO updateReqVO); + + /** + * 删除备件出库记录 + * + * @param id 编号 + */ + Integer deleteItemOutLocation(Long id); + + /** + * 获得备件出库记录 + * + * @param id 编号 + * @return 备件出库记录 + */ + ItemOutLocationDO getItemOutLocation(Long id); + + /** + * 获得备件出库记录列表 + * + * @param ids 编号 + * @return 备件出库记录列表 + */ + List getItemOutLocationList(Collection ids); + + /** + * 获得备件出库记录分页 + * + * @param pageReqVO 分页查询 + * @return 备件出库记录分页 + */ + PageResult getItemOutLocationPage(ItemOutLocationPageReqVO pageReqVO); + + /** + * 获得备件出库记录列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 备件出库记录列表 + */ + List getItemOutLocationList(ItemOutLocationExportReqVO exportReqVO); + + /** + * 获得用高级搜索库位分页列表 + * + * @param conditions 分页、排序和自定义条件 + * @return 分页列表 + */ + PageResult getItemOutLocationSenior(CustomConditions conditions); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemoutlocation/ItemOutLocationServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemoutlocation/ItemOutLocationServiceImpl.java new file mode 100644 index 0000000..169adfd --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/itemoutlocation/ItemOutLocationServiceImpl.java @@ -0,0 +1,91 @@ +package com.win.module.eam.service.itemoutlocation; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.itemoutlocation.vo.ItemOutLocationCreateReqVO; +import com.win.module.eam.controller.itemoutlocation.vo.ItemOutLocationExportReqVO; +import com.win.module.eam.controller.itemoutlocation.vo.ItemOutLocationPageReqVO; +import com.win.module.eam.controller.itemoutlocation.vo.ItemOutLocationUpdateReqVO; +import com.win.module.eam.convert.itemoutlocation.ItemOutLocationConvert; +import com.win.module.eam.dal.dataobject.itemoutlocation.ItemOutLocationDO; +import com.win.module.eam.dal.dataobject.location.LocationDO; +import com.win.module.eam.dal.mysql.itemoutlocation.ItemOutLocationMapper; +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.eam.enums.ErrorCodeConstants.ITEM_OUT_LOCATION_NOT_EXISTS; + +/** + * 备件出库记录 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class ItemOutLocationServiceImpl implements ItemOutLocationService { + + @Resource + private ItemOutLocationMapper itemOutLocationMapper; + + @Override + public Long createItemOutLocation(ItemOutLocationCreateReqVO createReqVO) { + // 插入 + ItemOutLocationDO itemOutLocation = ItemOutLocationConvert.INSTANCE.convert(createReqVO); + itemOutLocationMapper.insert(itemOutLocation); + // 返回 + return itemOutLocation.getId(); + } + + @Override + public Integer updateItemOutLocation(ItemOutLocationUpdateReqVO updateReqVO) { + // 校验存在 + validateItemOutLocationExists(updateReqVO.getId()); + // 更新 + ItemOutLocationDO updateObj = ItemOutLocationConvert.INSTANCE.convert(updateReqVO); + return itemOutLocationMapper.updateById(updateObj); + } + + @Override + public Integer deleteItemOutLocation(Long id) { + // 校验存在 + validateItemOutLocationExists(id); + // 删除 + return itemOutLocationMapper.deleteById(id); + } + + private void validateItemOutLocationExists(Long id) { + if (itemOutLocationMapper.selectById(id) == null) { + throw exception(ITEM_OUT_LOCATION_NOT_EXISTS); + } + } + + @Override + public ItemOutLocationDO getItemOutLocation(Long id) { + return itemOutLocationMapper.selectById(id); + } + + @Override + public List getItemOutLocationList(Collection ids) { + return itemOutLocationMapper.selectBatchIds(ids); + } + + @Override + public PageResult getItemOutLocationPage(ItemOutLocationPageReqVO pageReqVO) { + return itemOutLocationMapper.selectPage(pageReqVO); + } + + @Override + public List getItemOutLocationList(ItemOutLocationExportReqVO exportReqVO) { + return itemOutLocationMapper.selectList(exportReqVO); + } + + @Override + public PageResult getItemOutLocationSenior(CustomConditions conditions) { + return itemOutLocationMapper.selectSenior(conditions); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/location/LocationService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/location/LocationService.java new file mode 100644 index 0000000..cb66c51 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/location/LocationService.java @@ -0,0 +1,111 @@ +package com.win.module.eam.service.location; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.location.vo.*; +import com.win.module.eam.dal.dataobject.location.LocationDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 库位 Service 接口 + * + * @author 超级管理员 + */ +public interface LocationService { + + /** + * 创建库位 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createLocation(@Valid LocationCreateReqVO createReqVO); + + /** + * 更新库位 + * + * @param updateReqVO 更新信息 + */ + Integer updateLocation(@Valid LocationUpdateReqVO updateReqVO); + + /** + * 删除库位 + * + * @param id 编号 + */ + Integer deleteLocation(Long id); + + /** + * 获得库位 + * + * @param id 编号 + * @return 库位 + */ + LocationDO getLocation(Long id); + + /** + * 获得库位列表 + * + * @param ids 编号 + * @return 库位列表 + */ + List getLocationList(Collection ids); + + /** + * 获得库位分页 + * + * @param pageReqVO 分页查询 + * @return 库位分页 + */ + PageResult getLocationPage(LocationPageReqVO pageReqVO); + + /** + * 获得库位列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 库位列表 + */ + List getLocationList(LocationExportReqVO exportReqVO); + + /** + * 扫库位码获取库位信息以及关联备件信息 + * @return + */ + LocationDO scanCodeByNumber(String number); + + /** + * 备件出库扫码 + * @param number + * @param id 备件申领id + * @return + */ + LocationDO outScanCodeByNumber(LocationOutScanCodeReqVO reqVO); + + /** + * 备件出库扫库位码获取库位信息以及关联备件信息 + * @param number + * @return + */ + List pdaItemAndLocation(String number); + + + /** + * 获得库位列表 + * + * @param reqVO + * @return 库位列表 + */ + List selectListNoPage(LocationReqVO reqVO); + + /** + * 获得库位分页列表 + * + * @param conditions 分页、排序和自定义条件 + * @return 分页列表 + */ + PageResult getLocationSenior(CustomConditions conditions); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/location/LocationServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/location/LocationServiceImpl.java new file mode 100644 index 0000000..06684fb --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/location/LocationServiceImpl.java @@ -0,0 +1,218 @@ +package com.win.module.eam.service.location; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.exception.util.ServiceExceptionUtil; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.location.vo.*; +import com.win.module.eam.convert.location.LocationConvert; +import com.win.module.eam.dal.dataobject.itemaccounts.ItemAccountsDO; +import com.win.module.eam.dal.dataobject.itemapplyrequest.ItemApplyRequestDetailDO; +import com.win.module.eam.dal.dataobject.location.LocationDO; +import com.win.module.eam.dal.mysql.itemaccounts.ItemAccountsMapper; +import com.win.module.eam.dal.mysql.itemapplyrequest.ItemApplyRequestDetailMapper; +import com.win.module.eam.dal.mysql.location.LocationMapper; +import com.win.module.infra.api.trends.TrendsApi; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 库位 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class LocationServiceImpl implements LocationService { + + @Resource + private LocationMapper locationMapper; + @Resource + private SerialNumberApi serialNumberApi; + @Resource + private TrendsApi trendsApi; + + @Resource + private ItemApplyRequestDetailMapper itemApplyRequestDetailMapper; + @Resource + private ItemAccountsMapper itemAccountsMapper; + + @Override + public Long createLocation(LocationCreateReqVO createReqVO) { + // 插入 + LocationDO location = LocationConvert.INSTANCE.convert(createReqVO); + QueryWrapper objectQueryWrapper = new QueryWrapper<>(); + objectQueryWrapper.eq("number", createReqVO.getNumber()); + objectQueryWrapper.eq("deleted", 0); + List locationDOList = locationMapper.selectList(objectQueryWrapper); + if (locationDOList.size() > 0) { + throw ServiceExceptionUtil.exception(LOCATION_HAVE_EXISTS); + } + location.setCreateTime(LocalDateTime.now()); + locationMapper.insert(location); + // 返回 + return location.getId(); + } + + @Override + public Integer updateLocation(LocationUpdateReqVO updateReqVO) { + // 校验存在 + validateLocationExists(updateReqVO.getId()); + // 更新 + LocationDO updateObj = LocationConvert.INSTANCE.convert(updateReqVO); + return locationMapper.updateById(updateObj); + } + + @Override + public Integer deleteLocation(Long id) { + // 校验存在 + validateLocationExists(id); + // 删除 + return locationMapper.deleteById(id); + } + + private void validateLocationExists(Long id) { + if (locationMapper.selectById(id) == null) { + throw exception(LOCATION_NOT_EXISTS); + } + } + + @Override + public LocationDO getLocation(Long id) { + return locationMapper.selectById(id); + } + + @Override + public List getLocationList(Collection ids) { + return locationMapper.selectBatchIds(ids); + } + + @Override + public PageResult getLocationPage(LocationPageReqVO pageReqVO) { + return locationMapper.selectPage(pageReqVO); + } + + @Override + public List getLocationList(LocationExportReqVO exportReqVO) { + return locationMapper.selectList(exportReqVO); + } + + @Override + public LocationDO scanCodeByNumber(String number) { + LocationDO locationDO = locationMapper.scanCodeByNumber(number); + if (locationDO == null) { + throw exception(LOCATION_NOT_EXISTS); + } + return locationMapper.scanCodeByNumber(number); + } + + @Override + public LocationDO outScanCodeByNumber(LocationOutScanCodeReqVO reqVO) { + LocationDO locationDO = locationMapper.scanCodeByNumber(reqVO.getNumber()); + BigDecimal zwqty = BigDecimal.ZERO;//该备件已经有账外库输入且没有点击确定 + if (locationDO != null) { + String itemNumber = locationDO.getItemNumber(); + if (itemNumber != null && !"".equals(itemNumber)) { + QueryWrapper objectQueryWrapper = new QueryWrapper<>(); + objectQueryWrapper.eq("item_number", itemNumber); + objectQueryWrapper.eq("master_id", reqVO.getId()); + ItemApplyRequestDetailDO itemApplyRequestDetailDO = itemApplyRequestDetailMapper.selectOne(objectQueryWrapper); + if (itemApplyRequestDetailDO == null) {//扫的库位所关联的备件与申领工单的备件无关 + throw exception(APPLAY_ITEM_EXCLUDE);//该备件不在申领范围内 + } + //校验优先账外库出库 + String isInAccount = locationDO.getIsInAccount(); + if ("TRUE".equals(isInAccount)) {//账内库需要先查询是否有账外库,有账外库且库存不为0的时候需要提醒用账外库 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("item_number", itemNumber); + queryWrapper.eq("is_in_account", "FALSE"); + queryWrapper.eq("available", "TRUE"); + ItemAccountsDO itemAccountsDO = itemAccountsMapper.selectOne(queryWrapper); + if (itemAccountsDO != null && itemAccountsDO.getQty().compareTo(BigDecimal.ZERO) > 0) {//有账外库且库存大于0 + Boolean tip = true; + List> itemNumbers = reqVO.getItemNumbers(); + if (itemNumbers != null && !itemNumbers.isEmpty()) {//已经添加了备件只不过没有提交 + for (Map map : itemNumbers) { + String locationNumber = map.get("locationNumber").toString(); + if (locationNumber.equals(itemAccountsDO.getLocationNumber())) {//如果已经有该账外库的备件添加了则需要把该账外库真实库存减去已经添加出库备件的数量 + BigDecimal qty = itemAccountsDO.getQty(); + zwqty = new BigDecimal(map.get("qty").toString());//该备件已经有账外库输入且没有点击确定 + if (qty.compareTo(zwqty) > 0) {//则账外库还有库存 + throw exception(FALSE_LOCATION_ACCOUNT_EXISTS);//该备件有账外库且库存大于0 + } else { + tip = false; + } + } + } + } + if (tip) { + throw exception(FALSE_LOCATION_ACCOUNT_EXISTS);//该备件有账外库且库存大于0 + } + } + } + BigDecimal applyQty = itemApplyRequestDetailDO.getQty();//申领数量 + if (applyQty == null) { + applyQty = BigDecimal.ZERO; + } + BigDecimal receiveQty = itemApplyRequestDetailDO.getReceiveQty();//出库接收数量 + if (receiveQty == null) { + receiveQty = BigDecimal.ZERO; + } + BigDecimal add = zwqty.add(receiveQty);//数据库已经接收数量+添加过账外库且没有提交确定 + if (applyQty.compareTo(add) > 0) { + BigDecimal totalReception = applyQty.subtract(add); + if (locationDO.getQty().compareTo(totalReception) < 0) {//库存数小于所需申领数 限制最大数为库存数 + locationDO.setTotalReception(locationDO.getQty());// + } else {//库存数大于等所需申领数 限制所需申领数 + locationDO.setTotalReception(totalReception);//限制当前库位只能出的备件数量 + } + + } else { + throw exception(OUT_BIG_APPLY);//该备件有账外库且库存大于0 + } + locationDO.setReceiveQty(receiveQty); + locationDO.setApplyQty(applyQty); + } else { + throw exception(LOCATION_ITEM_NOT);//该库位未与备件绑定 + } + return locationDO; + } + { + throw exception(LOCATION_NOT_EXISTS); + } + } + + @Override + public List pdaItemAndLocation(String number) { + LocationDO locationDO = locationMapper.scanCodeByNumber(number);//根据库位编码 + if (locationDO == null) {//number为备件码 + return locationMapper.selectListByItemNumber(number);//根据备件号 + } else { + return Collections.singletonList(locationDO); + } + } + + @Override + public List selectListNoPage(LocationReqVO reqVO) { + return locationMapper.selectListNoPage(reqVO); + } + + @Override + public PageResult getLocationSenior(CustomConditions conditions) { + return locationMapper.selectSenior(conditions); + } + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/locationarea/LocationAreaService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/locationarea/LocationAreaService.java new file mode 100644 index 0000000..ccd3bfa --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/locationarea/LocationAreaService.java @@ -0,0 +1,80 @@ +package com.win.module.eam.service.locationarea; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.locationarea.vo.*; +import com.win.module.eam.dal.dataobject.locationarea.LocationAreaDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 库区 Service 接口 + * + * @author 超级管理员 + */ +public interface LocationAreaService { + + /** + * 创建库区 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createLocationArea(@Valid LocationAreaCreateReqVO createReqVO); + + /** + * 更新库区 + * + * @param updateReqVO 更新信息 + */ + Integer updateLocationArea(@Valid LocationAreaUpdateReqVO updateReqVO); + + /** + * 删除库区 + * + * @param id 编号 + */ + Integer deleteLocationArea(Long id); + + /** + * 获得库区 + * + * @param id 编号 + * @return 库区 + */ + LocationAreaDO getLocationArea(Long id); + + /** + * 获得库区列表 + * + * @param ids 编号 + * @return 库区列表 + */ + List getLocationAreaList(Collection ids); + + /** + * 获得库区分页 + * + * @param pageReqVO 分页查询 + * @return 库区分页 + */ + PageResult getLocationAreaPage(LocationAreaPageReqVO pageReqVO); + + /** + * 获得库区列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 库区列表 + */ + List getLocationAreaList(LocationAreaExportReqVO exportReqVO); + + /** + * 获得库区分页列表 + * + * @param conditions 分页、排序和自定义条件 + * @return 分页列表 + */ + PageResult getLocationAreaSenior(CustomConditions conditions); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/locationarea/LocationAreaServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/locationarea/LocationAreaServiceImpl.java new file mode 100644 index 0000000..02b0624 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/locationarea/LocationAreaServiceImpl.java @@ -0,0 +1,120 @@ +package com.win.module.eam.service.locationarea; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.exception.util.ServiceExceptionUtil; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.locationarea.vo.LocationAreaCreateReqVO; +import com.win.module.eam.controller.locationarea.vo.LocationAreaExportReqVO; +import com.win.module.eam.controller.locationarea.vo.LocationAreaPageReqVO; +import com.win.module.eam.controller.locationarea.vo.LocationAreaUpdateReqVO; +import com.win.module.eam.convert.locationarea.LocationAreaConvert; +import com.win.module.eam.dal.dataobject.location.LocationDO; +import com.win.module.eam.dal.dataobject.locationarea.LocationAreaDO; +import com.win.module.eam.dal.mysql.location.LocationMapper; +import com.win.module.eam.dal.mysql.locationarea.LocationAreaMapper; +import com.win.module.infra.api.trends.TrendsApi; +import com.win.module.system.api.serialnumber.SerialNumberApi; +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; + +import static com.win.module.eam.enums.ErrorCodeConstants.LOCATION_AREA_HAVE_EXISTS; +import static com.win.module.eam.enums.ErrorCodeConstants.LOCATION_CAN_NOT_DELETE; + +/** + * 库区 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class LocationAreaServiceImpl implements LocationAreaService { + + @Resource + private LocationAreaMapper locationAreaMapper; + @Resource + private LocationMapper locationMapper; + + @Resource + private SerialNumberApi serialNumberApi; + @Resource + private TrendsApi trendsApi; + + @Override + public Long createLocationArea(LocationAreaCreateReqVO createReqVO) { + // 插入 + LocationAreaDO locationArea = LocationAreaConvert.INSTANCE.convert(createReqVO); + QueryWrapper objectQueryWrapper = new QueryWrapper<>(); + objectQueryWrapper.eq("number", createReqVO.getNumber()); + objectQueryWrapper.eq("deleted", 0); + List locationAreaList = locationAreaMapper.selectList(objectQueryWrapper); + if (locationAreaList.size() > 0) { + throw ServiceExceptionUtil.exception(LOCATION_AREA_HAVE_EXISTS); + } + locationArea.setCreateTime(LocalDateTime.now()); + locationAreaMapper.insert(locationArea); + // 返回 + return locationArea.getId(); + } + + @Override + public Integer updateLocationArea(LocationAreaUpdateReqVO updateReqVO) { + // 校验存在 + //validateLocationAreaExists(updateReqVO.getId()); + // 更新 + LocationAreaDO updateObj = LocationAreaConvert.INSTANCE.convert(updateReqVO); + return locationAreaMapper.updateById(updateObj); + } + + @Override + public Integer deleteLocationArea(Long id) { + // 校验存在 + validateLocationAreaExists(id); + LocationAreaDO locationAreaDO = locationAreaMapper.selectById(id); + QueryWrapper itemAccountsQueryWrapper = new QueryWrapper<>(); + itemAccountsQueryWrapper.eq("area_number", locationAreaDO.getNumber()); + itemAccountsQueryWrapper.eq("available", "TRUE"); + List locationDOList = locationMapper.selectList(itemAccountsQueryWrapper);//最多有两个账内和账外 + if (locationDOList.size() > 0) { + throw ServiceExceptionUtil.exception(LOCATION_CAN_NOT_DELETE); + } + // 删除 + return locationAreaMapper.deleteById(id); + } + + private void validateLocationAreaExists(Long id) { + if (locationAreaMapper.selectById(id) == null) { + //throw exception(LOCATION_AREA_NOT_EXISTS); + } + } + + @Override + public LocationAreaDO getLocationArea(Long id) { + return locationAreaMapper.selectById(id); + } + + @Override + public List getLocationAreaList(Collection ids) { + return locationAreaMapper.selectBatchIds(ids); + } + + @Override + public PageResult getLocationAreaPage(LocationAreaPageReqVO pageReqVO) { + return locationAreaMapper.selectPage(pageReqVO); + } + + @Override + public List getLocationAreaList(LocationAreaExportReqVO exportReqVO) { + return locationAreaMapper.selectList(exportReqVO); + } + + @Override + public PageResult getLocationAreaSenior(CustomConditions conditions) { + return locationAreaMapper.selectSenior(conditions); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/maintainback/MaintainBackService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/maintainback/MaintainBackService.java new file mode 100644 index 0000000..2144c77 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/maintainback/MaintainBackService.java @@ -0,0 +1,81 @@ +package com.win.module.eam.service.maintainback; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.maintainback.vo.*; +import com.win.module.eam.dal.dataobject.maintainback.MaintainBackDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 保养计划 Service 接口 + * + * @author 超级管理员 + */ +public interface MaintainBackService { + + /** + * 创建保养计划 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMaintainBack(@Valid MaintainBackCreateReqVO createReqVO); + + /** + * 更新保养计划 + * + * @param updateReqVO 更新信息 + */ + Integer updateMaintainBack(@Valid MaintainBackUpdateReqVO updateReqVO); + + /** + * 删除保养计划 + * + * @param id 编号 + */ + Integer deleteMaintainBack(Long id); + + /** + * 获得保养计划 + * + * @param id 编号 + * @return 保养计划 + */ + MaintainBackDO getMaintainBack(Long id); + + /** + * 获得保养计划列表 + * + * @param ids 编号 + * @return 保养计划列表 + */ + List getMaintainBackList(Collection ids); + + /** + * 获得保养计划分页 + * + * @param pageReqVO 分页查询 + * @return 保养计划分页 + */ + PageResult getMaintainBackPage(MaintainBackPageReqVO pageReqVO); + + /** + * 获得保养计划列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 保养计划列表 + */ + List getMaintainBackList(MaintainBackExportReqVO exportReqVO); + + /** + * 导入保养计划主信息 + * + * @param datas 导入保养计划主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importMaintainBackList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/maintainback/MaintainBackServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/maintainback/MaintainBackServiceImpl.java new file mode 100644 index 0000000..541e01a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/maintainback/MaintainBackServiceImpl.java @@ -0,0 +1,108 @@ +package com.win.module.eam.service.maintainback; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.maintainback.vo.*; +import com.win.module.eam.convert.maintainback.MaintainBackConvert; +import com.win.module.eam.dal.dataobject.maintainback.MaintainBackDO; +import com.win.module.eam.dal.mysql.maintainback.MaintainBackMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + + +/** + * 保养计划 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MaintainBackServiceImpl implements MaintainBackService { + + @Resource + private MaintainBackMapper maintainBackMapper; + + @Override + public Long createMaintainBack(MaintainBackCreateReqVO createReqVO) { + // 插入 + MaintainBackDO maintainBack = MaintainBackConvert.INSTANCE.convert(createReqVO); + maintainBackMapper.insert(maintainBack); + // 返回 + return maintainBack.getId(); + } + + @Override + public Integer updateMaintainBack(MaintainBackUpdateReqVO updateReqVO) { + // 校验存在 + validateMaintainBackExists(updateReqVO.getId()); + // 更新 + MaintainBackDO updateObj = MaintainBackConvert.INSTANCE.convert(updateReqVO); + return maintainBackMapper.updateById(updateObj); + } + + @Override + public Integer deleteMaintainBack(Long id) { + // 校验存在 + validateMaintainBackExists(id); + // 删除 + return maintainBackMapper.deleteById(id); + } + + private void validateMaintainBackExists(Long id) { + if (maintainBackMapper.selectById(id) == null) { + throw exception(MAINTAIN_BACK_NOT_EXISTS); + } + } + + @Override + public MaintainBackDO getMaintainBack(Long id) { + return maintainBackMapper.selectById(id); + } + + @Override + public List getMaintainBackList(Collection ids) { + return maintainBackMapper.selectBatchIds(ids); + } + + @Override + public PageResult getMaintainBackPage(MaintainBackPageReqVO pageReqVO) { + return maintainBackMapper.selectPage(pageReqVO); + } + + @Override + public List getMaintainBackList(MaintainBackExportReqVO exportReqVO) { + return maintainBackMapper.selectList(exportReqVO); + } + + @Override + public List importMaintainBackList(List datas, Integer mode, boolean updatePart) { +// if (CollUtil.isEmpty(datas)) { +// throw exception(MAINTAIN_BACK_IMPORT_LIST_IS_EMPTY); +// } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// MaintainBackDO obj = maintainBackMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// maintainBackMapper.insert(MaintainBackConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// MaintainBackDO maintainBackDO = MaintainBackConvert.INSTANCE.convert(item); +// maintainBackDO.setId(obj.getId()); +// maintainBackMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/maintenanceturnto/MaintenanceTurntoService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/maintenanceturnto/MaintenanceTurntoService.java new file mode 100644 index 0000000..ed1c073 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/maintenanceturnto/MaintenanceTurntoService.java @@ -0,0 +1,80 @@ +package com.win.module.eam.service.maintenanceturnto; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.maintenanceturnto.vo.*; +import com.win.module.eam.dal.dataobject.maintenanceturnto.MaintenanceTurntoDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 维修转办记录 Service 接口 + * + * @author 超级管理员 + */ +public interface MaintenanceTurntoService { + + /** + * 创建维修转办记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMaintenanceTurnto(@Valid MaintenanceTurntoCreateReqVO createReqVO); + + /** + * 更新维修转办记录 + * + * @param updateReqVO 更新信息 + */ + Integer updateMaintenanceTurnto(@Valid MaintenanceTurntoUpdateReqVO updateReqVO); + + /** + * 删除维修转办记录 + * + * @param id 编号 + */ + Integer deleteMaintenanceTurnto(Long id); + + /** + * 获得维修转办记录 + * + * @param id 编号 + * @return 维修转办记录 + */ + MaintenanceTurntoDO getMaintenanceTurnto(Long id); + + /** + * 获得维修转办记录列表 + * + * @param ids 编号 + * @return 维修转办记录列表 + */ + List getMaintenanceTurntoList(Collection ids); + + /** + * 获得维修转办记录分页 + * + * @param pageReqVO 分页查询 + * @return 维修转办记录分页 + */ + PageResult getMaintenanceTurntoPage(MaintenanceTurntoPageReqVO pageReqVO); + + /** + * 获得维修转办记录列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 维修转办记录列表 + */ + List getMaintenanceTurntoList(MaintenanceTurntoExportReqVO exportReqVO); + + /** + * 导入维修转办记录主信息 + * + * @param datas 导入维修转办记录主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importMaintenanceTurntoList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/maintenanceturnto/MaintenanceTurntoServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/maintenanceturnto/MaintenanceTurntoServiceImpl.java new file mode 100644 index 0000000..68a769d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/maintenanceturnto/MaintenanceTurntoServiceImpl.java @@ -0,0 +1,107 @@ +package com.win.module.eam.service.maintenanceturnto; + +import cn.hutool.core.collection.CollUtil; +import com.win.module.eam.controller.maintenanceturnto.vo.*; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.win.module.eam.dal.dataobject.maintenanceturnto.MaintenanceTurntoDO; +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.convert.maintenanceturnto.MaintenanceTurntoConvert; +import com.win.module.eam.dal.mysql.maintenanceturnto.MaintenanceTurntoMapper; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 维修转办记录 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MaintenanceTurntoServiceImpl implements MaintenanceTurntoService { + + @Resource + private MaintenanceTurntoMapper maintenanceTurntoMapper; + + @Override + public Long createMaintenanceTurnto(MaintenanceTurntoCreateReqVO createReqVO) { + // 插入 + MaintenanceTurntoDO maintenanceTurnto = MaintenanceTurntoConvert.INSTANCE.convert(createReqVO); + maintenanceTurntoMapper.insert(maintenanceTurnto); + // 返回 + return maintenanceTurnto.getId(); + } + + @Override + public Integer updateMaintenanceTurnto(MaintenanceTurntoUpdateReqVO updateReqVO) { + // 校验存在 + validateMaintenanceTurntoExists(updateReqVO.getId()); + // 更新 + MaintenanceTurntoDO updateObj = MaintenanceTurntoConvert.INSTANCE.convert(updateReqVO); + return maintenanceTurntoMapper.updateById(updateObj); + } + + @Override + public Integer deleteMaintenanceTurnto(Long id) { + // 校验存在 + validateMaintenanceTurntoExists(id); + // 删除 + return maintenanceTurntoMapper.deleteById(id); + } + + private void validateMaintenanceTurntoExists(Long id) { + if (maintenanceTurntoMapper.selectById(id) == null) { + //throw exception(MAINTENANCE_TURNTO_NOT_EXISTS); + } + } + + @Override + public MaintenanceTurntoDO getMaintenanceTurnto(Long id) { + return maintenanceTurntoMapper.selectById(id); + } + + @Override + public List getMaintenanceTurntoList(Collection ids) { + return maintenanceTurntoMapper.selectBatchIds(ids); + } + + @Override + public PageResult getMaintenanceTurntoPage(MaintenanceTurntoPageReqVO pageReqVO) { + return maintenanceTurntoMapper.selectPage(pageReqVO); + } + + @Override + public List getMaintenanceTurntoList(MaintenanceTurntoExportReqVO exportReqVO) { + return maintenanceTurntoMapper.selectList(exportReqVO); + } + + @Override + public List importMaintenanceTurntoList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(MAINTENANCE_TURNTO_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// MaintenanceTurntoDO obj = maintenanceTurntoMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// maintenanceTurntoMapper.insert(MaintenanceTurntoConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// MaintenanceTurntoDO maintenanceTurntoDO = MaintenanceTurntoConvert.INSTANCE.convert(item); +// maintenanceTurntoDO.setId(obj.getId()); +// maintenanceTurntoMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldaccounts/MoldAccountsService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldaccounts/MoldAccountsService.java new file mode 100644 index 0000000..b32bec3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldaccounts/MoldAccountsService.java @@ -0,0 +1,134 @@ +package com.win.module.eam.service.moldaccounts; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.moldaccounts.vo.*; +import com.win.module.eam.dal.dataobject.moldaccounts.MoldAccountsDO; +import com.win.module.eam.dal.dataobject.moldaccounts.MoldAccountsDOExpand; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 模具台账 Service 接口 + * + * @author 超级管理员 + */ +public interface MoldAccountsService { + + /** + * 创建模具台账 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMoldAccounts(@Valid MoldAccountsCreateReqVO createReqVO); + + /** + * 更新模具台账 + * + * @param updateReqVO 更新信息 + */ + Integer updateMoldAccounts(@Valid MoldAccountsUpdateReqVO updateReqVO); + + /** + * 删除模具台账 + * + * @param id 编号 + */ + Integer deleteMoldAccounts(Long id); + + /** + * 获得模具台账 + * + * @param id 编号 + * @return 模具台账 + */ + MoldAccountsDO getMoldAccounts(Long id); + + /** + * 获得模具台账列表 + * + * @param ids 编号 + * @return 模具台账列表 + */ + List getMoldAccountsList(Collection ids); + + /** + * 获得模具台账分页 + * + * @param pageReqVO 分页查询 + * @return 模具台账分页 + */ + PageResult getMoldAccountsPage(MoldAccountsPageReqVO pageReqVO); + + /** + * 获得模具台账列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 模具台账列表 + */ + List getMoldAccountsList(MoldAccountsExportReqVO exportReqVO); + + /** + * 导入模具台账主信息 + * + * @param datas 导入模具台账主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importMoldAccountsList(List datas, Integer mode, boolean updatePart); + + /** + * 获得模具台账分页 + * + * @param pageReqVO 分页查询 + * @return 模具台账分页 + */ + PageResult getAppPage(MoldAccountsPageReqVO pageReqVO); + + /** + * 获取当前人所属厂区下的模具列表 + * @return + */ + List> selectData(String factoryAreaNumber); + + /** + * 根据模具号查询模具信息 + * @param number + * @return + */ + Map getDetailsByNumber(String number,String type,String flag); + + /** + * 根据模具号查询模具信息 + * @param number + * @return + */ + MoldAccountsDOExpand getDetailsEntryByNumber(String number); + + /** + * 模具里程碑阶段通知定时任务 + * @param number + * @return + */ + String MoldMilestoneStageTask(); + + + + List selectListNoPage(MoldAccountsPageReqVO pageReqVO); + + /** + * 更新模具台账状态 + * + * @param number,status 更新信息 + */ + Integer updateMoldAccountsStatus(String number, String status); + + + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldaccounts/MoldAccountsServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldaccounts/MoldAccountsServiceImpl.java new file mode 100644 index 0000000..f27174d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldaccounts/MoldAccountsServiceImpl.java @@ -0,0 +1,225 @@ +package com.win.module.eam.service.moldaccounts; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.moldaccounts.vo.*; +import com.win.module.eam.convert.moldaccounts.MoldAccountsConvert; +import com.win.module.eam.dal.dataobject.attachmentfile.AttachmentFileDO; +import com.win.module.eam.dal.dataobject.moldaccounts.MoldAccountsDO; +import com.win.module.eam.dal.dataobject.moldaccounts.MoldAccountsDOExpand; +import com.win.module.eam.dal.mysql.attachmentfile.AttachmentFileMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.service.moldmilestone.MoldMilestoneService; +import com.win.module.system.api.dept.DeptApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +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.ArrayList; +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.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 模具台账 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MoldAccountsServiceImpl implements MoldAccountsService { + + @Resource + private MoldAccountsMapper moldAccountsMapper; + + @Resource + private AdminUserApi adminUserApi; + + @Resource + private AttachmentFileMapper attachmentFileMapper; + + @Resource + private MoldMilestoneService moldMilestoneService; + + @Resource + DeptApi deptApi; + + @Override + @Transactional + public Long createMoldAccounts(MoldAccountsCreateReqVO createReqVO) { + // 插入 + MoldAccountsDO moldAccounts = MoldAccountsConvert.INSTANCE.convert(createReqVO); + MoldAccountsDO moldAccountsDO = moldAccountsMapper.selectById(createReqVO.getId()); + if(moldAccountsDO!= null){ + throw exception(MOLD_ACCOUNT_EXISTS); + } + moldAccounts.setCreateTime(LocalDateTime.now()); + moldAccounts.setCreator(getLoginUserId().toString()); + moldAccounts.setDeptId(Long.valueOf(moldAccounts.getFactoryAreaNumber())); + moldAccountsMapper.insert(moldAccounts); + moldMilestoneService.createBatchByMoldNumber(createReqVO.getNumber()); + // 返回 + return moldAccounts.getId(); + } + + @Override + public Integer updateMoldAccounts(MoldAccountsUpdateReqVO updateReqVO) { + // 校验存在 + //validateMoldAccountsExists(updateReqVO.getId()); + // 更新 + MoldAccountsDO updateObj = MoldAccountsConvert.INSTANCE.convert(updateReqVO); + return moldAccountsMapper.updateById(updateObj); + } + + @Override + public Integer deleteMoldAccounts(Long id) { + // 校验存在 + validateMoldAccountsExists(id); + // 删除 + return moldAccountsMapper.deleteById(id); + } + + private void validateMoldAccountsExists(Long id) { + if (moldAccountsMapper.selectById(id) == null) { + //throw exception(MOLD_ACCOUNTS_NOT_EXISTS); + } + } + + @Override + public MoldAccountsDO getMoldAccounts(Long id) { + return moldAccountsMapper.selectById(id); + } + + @Override + public List getMoldAccountsList(Collection ids) { + return moldAccountsMapper.selectBatchIds(ids); + } + + @Override + public PageResult getMoldAccountsPage(MoldAccountsPageReqVO pageReqVO) { + return moldAccountsMapper.selectPage(pageReqVO); + } + + @Override + public List getMoldAccountsList(MoldAccountsExportReqVO exportReqVO) { + return moldAccountsMapper.selectList(exportReqVO); + } + + @Override + public List importMoldAccountsList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(MOLD_ACCOUNTS_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// MoldAccountsDO obj = moldAccountsMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// moldAccountsMapper.insert(MoldAccountsConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// MoldAccountsDO moldAccountsDO = MoldAccountsConvert.INSTANCE.convert(item); +// moldAccountsDO.setId(obj.getId()); +// moldAccountsMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public PageResult getAppPage(MoldAccountsPageReqVO pageReqVO) { + IPage pageInfo = moldAccountsMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for(MoldAccountsDO en:pageInfo.getRecords()){ + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setNumber(en.getNumber()); + attachmentFileDO.setFuncCode("device_mould_picture"); + List attachmentFileList = attachmentFileMapper.getAttachmentFileList(attachmentFileDO); + en.setImages(attachmentFileList.size()==0?"":attachmentFileList.get(0).getPath()); + } + return new PageResult<>(pageInfo.getRecords() , pageInfo.getTotal()); + } + return null; + } + + @Override + public List> selectData(String factoryAreaNumber) { + List> list = new ArrayList<>(); + if(factoryAreaNumber!=null&&!"".equals(factoryAreaNumber)){//传入了厂区编号 + list = moldAccountsMapper.selectData(factoryAreaNumber); + }else { + AdminUserRespDTO user = adminUserApi.getUser(getLoginUserId()); + if (user.getDeptId() != null) { + list = moldAccountsMapper.selectData(user.getDeptId().toString()); + } + } + return list; + } + + @Override + public Map getDetailsByNumber(String number,String type,String flag) { + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(number); + if(flag!=null&&"2".equals(flag)){//全部设备 + return detailsByNumber; + } + if(detailsByNumber==null){ + throw exception(MOLD_NO_EXISTS); + } + if(!"0".equals(detailsByNumber.get("status"))){ + throw exception(MOLD_STATUS_0); + } + if(type!=null&&!"".equals(type)){ + if(!type.equals(detailsByNumber.get("type").toString())){ + throw exception(NOLD_TYPE_NO_NORMAL); + } + } + if("1".equals(flag)){//全部 + + }else{//feiquanbu + String fac = adminUserApi.getUser(getLoginUserId()).getDeptId().toString(); + if(!fac.equals(detailsByNumber.get("factoryAreaNumber").toString())){ + throw exception(FACTORY_MOLD_NO_NORMAL); + } + } + return moldAccountsMapper.getDetailsByNumber(number); + } + + @Override + public MoldAccountsDOExpand getDetailsEntryByNumber(String number) { + return moldAccountsMapper.getDetailsEntryByNumber(number); + } + + @Override + public String MoldMilestoneStageTask() { + + return null; + } + + @Override + public List selectListNoPage(MoldAccountsPageReqVO pageReqVO) { + return moldAccountsMapper.selectListNoPage(pageReqVO); + } + + @Override + public Integer updateMoldAccountsStatus(String number, String status) { + MoldAccountsDO moldAccountsDO = getDetailsEntryByNumber(number); + moldAccountsDO.setStatus(status); + moldAccountsDO.setNumber(number); + MoldAccountsUpdateReqVO moldAccountsUpdateReqVO = MoldAccountsConvert.INSTANCE.convertBack(moldAccountsDO); + return updateMoldAccounts(moldAccountsUpdateReqVO); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobDetailItemService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobDetailItemService.java new file mode 100644 index 0000000..cc110e9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobDetailItemService.java @@ -0,0 +1,80 @@ +package com.win.module.eam.service.moldinspectionjob; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailItemDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 检修工单子表与备件关系 Service 接口 + * + * @author 超级管理员 + */ +public interface MoldInspectionJobDetailItemService { + + /** + * 创建检修工单子表与备件关系 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceInspectionDetailItem(@Valid DeviceInspectionJobDetailItemCreateReqVO createReqVO); + + /** + * 更新检修工单子表与备件关系 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceInspectionDetailItem(@Valid DeviceInspectionJobDetailItemUpdateReqVO updateReqVO); + + /** + * 删除检修工单子表与备件关系 + * + * @param id 编号 + */ + Integer deleteDeviceInspectionDetailItem(Long id); + + /** + * 获得检修工单子表与备件关系 + * + * @param id 编号 + * @return 检修工单子表与备件关系 + */ + DeviceInspectionJobDetailItemDO getDeviceInspectionDetailItem(Long id); + + /** + * 获得检修工单子表与备件关系列表 + * + * @param ids 编号 + * @return 检修工单子表与备件关系列表 + */ + List getDeviceInspectionDetailItemList(Collection ids); + + /** + * 获得检修工单子表与备件关系分页 + * + * @param pageReqVO 分页查询 + * @return 检修工单子表与备件关系分页 + */ + PageResult getDeviceInspectionDetailItemPage(DeviceInspectionJobDetailItemPageReqVO pageReqVO); + + /** + * 获得检修工单子表与备件关系列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 检修工单子表与备件关系列表 + */ + List getDeviceInspectionDetailItemList(DeviceInspectionJobDetailItemExportReqVO exportReqVO); + + /** + * 导入检修工单子表与备件关系主信息 + * + * @param datas 导入检修工单子表与备件关系主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceInspectionDetailItemList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobDetailItemServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobDetailItemServiceImpl.java new file mode 100644 index 0000000..fe3bdfe --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobDetailItemServiceImpl.java @@ -0,0 +1,107 @@ +package com.win.module.eam.service.moldinspectionjob; + +import cn.hutool.core.collection.CollUtil; +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailItemDO; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobDetailItemConvert; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobDetailItemMapper; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * 检修工单子表与备件关系 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MoldInspectionJobDetailItemServiceImpl implements MoldInspectionJobDetailItemService { + + @Resource + private DeviceInspectionJobDetailItemMapper deviceInspectionDetailItemMapper; + + @Override + public Long createDeviceInspectionDetailItem(DeviceInspectionJobDetailItemCreateReqVO createReqVO) { + // 插入 + DeviceInspectionJobDetailItemDO deviceInspectionDetailItem = DeviceInspectionJobDetailItemConvert.INSTANCE.convert(createReqVO); + deviceInspectionDetailItemMapper.insert(deviceInspectionDetailItem); + // 返回 + return deviceInspectionDetailItem.getId(); + } + + @Override + public Integer updateDeviceInspectionDetailItem(DeviceInspectionJobDetailItemUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceInspectionDetailItemExists(updateReqVO.getId()); + // 更新 + DeviceInspectionJobDetailItemDO updateObj = DeviceInspectionJobDetailItemConvert.INSTANCE.convert(updateReqVO); + return deviceInspectionDetailItemMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceInspectionDetailItem(Long id) { + // 校验存在 + validateDeviceInspectionDetailItemExists(id); + // 删除 + return deviceInspectionDetailItemMapper.deleteById(id); + } + + private void validateDeviceInspectionDetailItemExists(Long id) { + if (deviceInspectionDetailItemMapper.selectById(id) == null) { + //throw exception(DEVICE_INSPECTION_DETAIL_ITEM_NOT_EXISTS); + } + } + + @Override + public DeviceInspectionJobDetailItemDO getDeviceInspectionDetailItem(Long id) { + return deviceInspectionDetailItemMapper.selectById(id); + } + + @Override + public List getDeviceInspectionDetailItemList(Collection ids) { + return deviceInspectionDetailItemMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceInspectionDetailItemPage(DeviceInspectionJobDetailItemPageReqVO pageReqVO) { + return deviceInspectionDetailItemMapper.selectPage(pageReqVO); + } + + @Override + public List getDeviceInspectionDetailItemList(DeviceInspectionJobDetailItemExportReqVO exportReqVO) { + return deviceInspectionDetailItemMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceInspectionDetailItemList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_INSPECTION_DETAIL_ITEM_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceInspectionDetailItemDO obj = deviceInspectionDetailItemMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceInspectionDetailItemMapper.insert(DeviceInspectionDetailItemConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceInspectionDetailItemDO deviceInspectionDetailItemDO = DeviceInspectionDetailItemConvert.INSTANCE.convert(item); +// deviceInspectionDetailItemDO.setId(obj.getId()); +// deviceInspectionDetailItemMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobDetailService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobDetailService.java new file mode 100644 index 0000000..c34758f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobDetailService.java @@ -0,0 +1,87 @@ +package com.win.module.eam.service.moldinspectionjob; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 检修工单子 Service 接口 + * + * @author 超级管理员 + */ +public interface MoldInspectionJobDetailService { + + /** + * 创建检修工单子 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceInspectionDetail(@Valid DeviceInspectionJobDetailCreateReqVO createReqVO); + + /** + * 更新检修工单子 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceInspectionDetail(@Valid DeviceInspectionJobDetailUpdateReqVO updateReqVO); + + /** + * 删除检修工单子 + * + * @param id 编号 + */ + Integer deleteDeviceInspectionDetail(Long id); + + /** + * 获得检修工单子 + * + * @param id 编号 + * @return 检修工单子 + */ + DeviceInspectionJobDetailDO getDeviceInspectionDetail(Long id); + + /** + * 获得检修工单子列表 + * + * @param ids 编号 + * @return 检修工单子列表 + */ + List getDeviceInspectionDetailList(Collection ids); + + /** + * 获得检修工单子分页 + * + * @param pageReqVO 分页查询 + * @return 检修工单子分页 + */ + PageResult getDeviceInspectionDetailPage(DeviceInspectionJobDetailPageReqVO pageReqVO); + + /** + * 获得检修工单子列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 检修工单子列表 + */ + List getDeviceInspectionDetailList(DeviceInspectionJobDetailExportReqVO exportReqVO); + + /** + * 导入检修工单子主信息 + * + * @param datas 导入检修工单子主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceInspectionDetailList(List datas, Integer mode, boolean updatePart); + + /** + * 根据维修工单号查询工单子项列表信息 + * @param number + * @return + */ + List selectListByNumber(String number); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobDetailServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobDetailServiceImpl.java new file mode 100644 index 0000000..a578c04 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobDetailServiceImpl.java @@ -0,0 +1,242 @@ +package com.win.module.eam.service.moldinspectionjob; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobDetailConvert; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailItemDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobMainDO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobDetailItemMapper; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobDetailMapper; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobMainMapper; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +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.module.eam.enums.ErrorCodeConstants.ITEM_NOT_EXISTS; + +/** + * 检修工单子 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MoldInspectionJobDetailServiceImpl implements MoldInspectionJobDetailService { + + @Resource + private DeviceInspectionJobDetailMapper deviceInspectionDetailMapper; + + @Resource + ItemMapper itemMapper; + + @Resource + private DeviceInspectionJobDetailItemMapper detailItemMapper; + + @Resource + private DeviceInspectionJobMainMapper deviceInspectionJobMainMapper; + + @Resource + private DeviceInspectionJobDetailItemMapper deviceInspectionJobDetailItemMapper; + + @Resource + private AdminUserApi userApi; + + @Override + public Long createDeviceInspectionDetail(DeviceInspectionJobDetailCreateReqVO createReqVO) { + List mainDO = deviceInspectionJobMainMapper.selectList("number", createReqVO.getNumber()); + // 插入 + DeviceInspectionJobDetailDO deviceInspectionDetail = DeviceInspectionJobDetailConvert.INSTANCE.convert(createReqVO); + deviceInspectionDetail.setMasterId(mainDO.get(0).getId()); + deviceInspectionDetailMapper.insert(deviceInspectionDetail); + List> itemList = createReqVO.getItemNumbers();//备件号集合 + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(!itemDOS.isEmpty()){ + String number = itemDOS.get(0).getNumber(); + DeviceInspectionJobDetailItemDO dos = new DeviceInspectionJobDetailItemDO(); + dos.setMasterId(deviceInspectionDetail.getId()); + dos.setItemNumber(number); + dos.setMasterId(deviceInspectionDetail.getId()); + dos.setNumber(createReqVO.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + detailItemMapper.insert(dos); + }else{ + throw exception(ITEM_NOT_EXISTS); + } + } + } + // 返回 + return deviceInspectionDetail.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateDeviceInspectionDetail(DeviceInspectionJobDetailUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceInspectionDetailExists(updateReqVO.getId()); + // 更新 + DeviceInspectionJobDetailDO updateObj = DeviceInspectionJobDetailConvert.INSTANCE.convert(updateReqVO); + int i = deviceInspectionDetailMapper.updateById(updateObj); + //先删除关联备件 + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("master_id", updateReqVO.getId()); + itemQueryWrapper.eq("deleted", 0); + List deviceInspectionDetailItemDOS = detailItemMapper.selectList(itemQueryWrapper); + for(DeviceInspectionJobDetailItemDO item:deviceInspectionDetailItemDOS){ + detailItemMapper.deleteById(item.getId()); + } + //再添加备件 + List> itemList = updateReqVO.getItemNumbers(); + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(!itemDOS.isEmpty()){ + String number = itemDOS.get(0).getNumber(); + DeviceInspectionJobDetailItemDO dos = new DeviceInspectionJobDetailItemDO(); + dos.setItemNumber(number); + dos.setMasterId(updateReqVO.getId()); + dos.setNumber(updateReqVO.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + detailItemMapper.insert(dos); + }else{ + throw exception(ITEM_NOT_EXISTS); + } + } + } + return i; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer deleteDeviceInspectionDetail(Long id) { + // 校验存在 + validateDeviceInspectionDetailExists(id); + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("master_id", id); + itemQueryWrapper.eq("deleted", 0); + List deviceInspectionDetailItemDOS = detailItemMapper.selectList(itemQueryWrapper); + for(DeviceInspectionJobDetailItemDO item:deviceInspectionDetailItemDOS){ + detailItemMapper.deleteById(item.getId()); + } + // 删除 + return deviceInspectionDetailMapper.deleteById(id); + + + } + + private void validateDeviceInspectionDetailExists(Long id) { + if (deviceInspectionDetailMapper.selectById(id) == null) { + // throw exception(DEVICE_INSPECTION_DETAIL_NOT_EXISTS); + } + } + + @Override + public DeviceInspectionJobDetailDO getDeviceInspectionDetail(Long id) { + return deviceInspectionDetailMapper.selectById(id); + } + + @Override + public List getDeviceInspectionDetailList(Collection ids) { + return deviceInspectionDetailMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceInspectionDetailPage(DeviceInspectionJobDetailPageReqVO pageReqVO) { + PageResult deviceInspectionJobDetailDOList = deviceInspectionDetailMapper.selectPage(pageReqVO); + for(DeviceInspectionJobDetailDO en:deviceInspectionJobDetailDOList.getList()){ + List> list = deviceInspectionJobDetailItemMapper.selectListById(en.getId()); + en.setItemNumbers(list); + } + return deviceInspectionJobDetailDOList; + } + + @Override + public List getDeviceInspectionDetailList(DeviceInspectionJobDetailExportReqVO exportReqVO) { + return deviceInspectionDetailMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceInspectionDetailList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_INSPECTION_DETAIL_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceInspectionDetailDO obj = deviceInspectionDetailMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceInspectionDetailMapper.insert(DeviceInspectionDetailConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceInspectionDetailDO deviceInspectionDetailDO = DeviceInspectionDetailConvert.INSTANCE.convert(item); +// deviceInspectionDetailDO.setId(obj.getId()); +// deviceInspectionDetailMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public List selectListByNumber(String number) { + QueryWrapper detailsDOQueryWrapper = new QueryWrapper<>(); + detailsDOQueryWrapper.eq("number", number); + detailsDOQueryWrapper.eq("available", "TRUE"); + List maintenanceNumber = deviceInspectionDetailMapper.selectList(detailsDOQueryWrapper); + for(DeviceInspectionJobDetailDO en:maintenanceNumber){ + if(en.getStatus().equals("TRUE")){ + en.setStatusName("是"); + }else{ + en.setStatusName("否"); + } + StringBuilder names = new StringBuilder(); + if(!"".equals(en.getChargePeoples())&& en.getChargePeoples()!=null){ + String[] split = en.getChargePeoples().split(","); + for(int i = 0; i < split.length; i++) { + AdminUserRespDTO user = userApi.getUser(Long.parseLong(split[i])); + if (names.length() > 0) { + names.append(", "); + } + if(user!=null){ + String name = user.getNickname(); + names.append(name); + } + + } + en.setChargePeoplesName(names.toString()); + } + List> list = detailItemMapper.selectListById(en.getId()); +// StringBuilder sb = new StringBuilder(); +// for(Map map:list){ +// if (sb.length() > 0) { +// sb.append(", "); +// } +// String name = map.get("name").toString(); +// String qty = map.get("qty").toString(); +// sb.append(name+":"+qty); +// } + en.setItems(list); + } + return maintenanceNumber; + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobMainService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobMainService.java new file mode 100644 index 0000000..dce9dd9 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobMainService.java @@ -0,0 +1,146 @@ +package com.win.module.eam.service.moldinspectionjob; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobMainDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionReportDo; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 检修工单主 Service 接口 + * + * @author 超级管理员 + */ +public interface MoldInspectionJobMainService { + + /** + * 创建检修工单主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceInspectionMain(@Valid DeviceInspectionJobMainCreateReqVO createReqVO); + + /** + * 更新检修工单主 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceInspectionMain(@Valid DeviceInspectionJobMainUpdateReqVO updateReqVO); + + /** + * 删除检修工单主 + * + * @param id 编号 + */ + Integer deleteDeviceInspectionMain(Long id); + + /** + * 获得检修工单主 + * + * @param id 编号 + * @return 检修工单主 + */ + DeviceInspectionJobMainDO getDeviceInspectionMain(Long id); + + /** + * 获得检修工单主列表 + * + * @param ids 编号 + * @return 检修工单主列表 + */ + List getDeviceInspectionMainList(Collection ids); + + /** + * 获得检修工单主分页 + * + * @param pageReqVO 分页查询 + * @return 检修工单主分页 + */ + PageResult getDeviceInspectionMainPage(DeviceInspectionJobMainPageReqVO pageReqVO); + + /** + * 获得备件台账分页 + * + * @param conditions 分页查询 + * @return 备件台账分页 + */ + PageResult getInspectionJobMainSenior(CustomConditions conditions); + + /** + * 获得检修工单主列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 检修工单主列表 + */ + List getDeviceInspectionMainList(DeviceInspectionJobMainExportReqVO exportReqVO); + + /** + * 导入检修工单主主信息 + * + * @param datas 导入检修工单主主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceInspectionMainList(List datas, Integer mode, boolean updatePart); + + /** + * APP检修工单主表分页 + * @param pageReqVO + * @return + */ + PageResult getAppPage(DeviceInspectionJobMainPageReqVO pageReqVO); + + /** + * 检修点击完成 + * @param id 编号 + */ + Integer onClick(Long id); + + /** + * 检修点击验证 + * @param id 编号 + * @param verifyContent 验证内容 + */ + Integer onVerify(Long id,String verifyContent); + + + + /** + * 创建检修工单主PC + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceInspectionMainPC(@Valid DeviceInspectionJobMainCreateReqVO createReqVO); + + + List getDeviceInspectionMainNoPage(DeviceInspectionJobMainPageReqVO pageReqVO); + + + /** + *@Author longlongxiaogege + *@Description //生成保养打印表子内容 + *@Date 13:17 2024/4/18 + *@Param [deviceMaintainJobReportDo] + *@return java.util.List + **/ + List getInspectionReport(DeviceInspectionReportDo deviceInspectionReportDo); + + + /** + *@Author longlongxiaogege + *@Description //生成保养打印表主内容 + *@Date 13:17 2024/4/18 + *@Param [deviceMaintainJobReportDo] + *@return java.util.List + **/ + List getInspectionReportMainInfo(DeviceInspectionReportDo deviceInspectionReportDo); + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobMainServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobMainServiceImpl.java new file mode 100644 index 0000000..cb03c71 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldinspectionjob/MoldInspectionJobMainServiceImpl.java @@ -0,0 +1,409 @@ +package com.win.module.eam.service.moldinspectionjob; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobDetailConvert; +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobMainConvert; +import com.win.module.eam.dal.dataobject.classtype.ClassTypeDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailItemDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobMainDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionReportDo; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.mysql.classtype.ClassTypeMapper; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobDetailItemMapper; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobDetailMapper; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobMainMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobMainMapper; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.system.api.dept.DeptApi; +import com.win.module.system.api.mail.MailSendApi; +import com.win.module.system.api.mail.dto.MailSendSingleToUserReqDTO; +import com.win.module.system.api.permission.PermissionApi; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.api.user.dto.AdminUserRespExpandDTO; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; + +import static cn.hutool.log.StaticLog.info; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 检修工单主 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MoldInspectionJobMainServiceImpl implements MoldInspectionJobMainService { + + @Resource + private DeviceInspectionJobMainMapper deviceInspectionJobMainMapper; + + @Resource + private DeviceMaintenanceJobMainMapper deviceMaintenanceJobMainMapper; + + @Resource + private SerialNumberApi serialNumberApi; + + @Resource + private AdminUserApi userApi; + + @Resource + private DeptApi deptApi; + + @Resource + private DeviceInspectionJobDetailMapper deviceInspectionDetailMapper; + + @Resource + private ItemMapper itemMapper; + + @Resource + private DeviceInspectionJobDetailItemMapper deviceInspectionDetailItemMapper; + + @Resource + private PermissionApi permissionApi; + + @Resource + private MoldAccountsMapper moldAccountsMapper; + + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + + @Resource + private MailSendApi mailSendApi; + @Resource + private ClassTypeMapper classTypeMapper; + + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDeviceInspectionMain(DeviceInspectionJobMainCreateReqVO createReqVO) { + if(createReqVO.getMaintenance() == null){ + throw exception(JIAN_XIU_MAINTENANCE_NOT_EMPTY); + } + // 插入 + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + DeviceInspectionJobMainDO deviceInspectionMain = DeviceInspectionJobMainConvert.INSTANCE.convert(createReqVO); + deviceInspectionMain.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode());//已接单 + String number = serialNumberApi.generateCode(RuleCodeEnum.JIAN_XIU_ORDER.getCode()); + deviceInspectionMain.setNumber(number); + //检修工单是否选择了维修工单 + if(createReqVO.getMaintenanceNumber()!=null && !"".equals(createReqVO.getMaintenanceNumber())){ + DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectOne("number",createReqVO.getMaintenanceNumber());//根据维修工单号查询维修 + //校验检修中维修工单唯一性 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("maintenance_number",createReqVO.getNumber()); + queryWrapper.eq("status",OrderStatusEnum.JX_PROCCED_STATUS.getCode()); + List jobMainDOS = deviceInspectionJobMainMapper.selectList(queryWrapper); + if(jobMainDOS!=null&&!jobMainDOS.isEmpty()){//不能重复选择相同维修工单 + throw exception(WEI_XIU_ORITEM_NOMAL); + } + deviceInspectionMain.setDeviceNumber(deviceMaintenanceJobMainDO.getDeviceNumber()); + deviceInspectionMain.setType(deviceMaintenanceJobMainDO.getType()); + deviceInspectionMain.setFactoryAreaNumber(deviceMaintenanceJobMainDO.getFactoryAreaNumber()); + deviceInspectionMain.setDeptId(Long.parseLong(deviceMaintenanceJobMainDO.getFactoryAreaNumber())); + }else{//如果没有选择则传设备模具和type + deviceInspectionMain.setDeviceNumber(createReqVO.getDeviceNumber()); + deviceInspectionMain.setType(createReqVO.getType()); + //校验检修中的设备唯一性 + String deviceNumber = createReqVO.getDeviceNumber(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("device_number",deviceNumber); + queryWrapper.eq("status",OrderStatusEnum.JX_PROCCED_STATUS.getCode()); + List deviceInspectionJobMainDOS = deviceInspectionJobMainMapper.selectList(queryWrapper); + if(deviceInspectionJobMainDOS!=null&&!deviceInspectionJobMainDOS.isEmpty()){//该设备模具已经有正在检修中未完成的不能再选 + throw exception(DEVICE_ORITEM_NOMAL); + } + } + deviceInspectionMain.setReceivingTime(LocalDateTime.now()); + deviceInspectionMain.setDeptId(user.getDeptId()); + deviceInspectionJobMainMapper.insert(deviceInspectionMain); + // 返回 + return deviceInspectionMain.getId(); + } + + @Override + public Integer updateDeviceInspectionMain(DeviceInspectionJobMainUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceInspectionMainExists(updateReqVO.getId()); + // 更新 + DeviceInspectionJobMainDO updateObj = DeviceInspectionJobMainConvert.INSTANCE.convert(updateReqVO); + //检修工单是否选择了维修工单 + if(updateReqVO.getMaintenanceNumber()!=null && !"".equals(updateReqVO.getMaintenanceNumber())){ + DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectOne("number",updateReqVO.getMaintenanceNumber());//根据维修工单号查询维修 + updateObj.setDeviceNumber(deviceMaintenanceJobMainDO.getDeviceNumber()); + updateObj.setType(deviceMaintenanceJobMainDO.getType()); + updateObj.setNumber(deviceMaintenanceJobMainDO.getNumber()); + updateObj.setFactoryAreaNumber(deviceMaintenanceJobMainDO.getFactoryAreaNumber()); + } + return deviceInspectionJobMainMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceInspectionMain(Long id) { + // 校验存在 + validateDeviceInspectionMainExists(id); + // 删除 + return deviceInspectionJobMainMapper.deleteById(id); + } + + private void validateDeviceInspectionMainExists(Long id) { + if (deviceInspectionJobMainMapper.selectById(id) == null) { + throw exception(JIAN_XIU_ORDER_NOT_EXISTS); + } + } + + @Override + public DeviceInspectionJobMainDO getDeviceInspectionMain(Long id) { + return deviceInspectionJobMainMapper.selectById(id); + } + + @Override + public List getDeviceInspectionMainList(Collection ids) { + return deviceInspectionJobMainMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceInspectionMainPage(DeviceInspectionJobMainPageReqVO pageReqVO) { + return deviceInspectionJobMainMapper.selectPage(pageReqVO); + } + + @Override + public List getDeviceInspectionMainList(DeviceInspectionJobMainExportReqVO exportReqVO) { + return deviceInspectionJobMainMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceInspectionMainList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_INSPECTION_MAIN_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceInspectionMainDO obj = deviceInspectionMainMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceInspectionMainMapper.insert(DeviceInspectionMainConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceInspectionMainDO deviceInspectionMainDO = DeviceInspectionMainConvert.INSTANCE.convert(item); +// deviceInspectionMainDO.setId(obj.getId()); +// deviceInspectionMainMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public PageResult getAppPage(DeviceInspectionJobMainPageReqVO pageReqVO) { + pageReqVO.setUserId(getLoginUserId().toString()); + pageReqVO.setClassType("MOLD"); + String b = classTypeMapper.getIdentity("MOLD"); + if (b.equals("2")) { + throw exception(WORKER_ENGINEER_IS_NOT); + } + pageReqVO.setStandType(b); + if ("1".equals(pageReqVO.getFlag())) {//flag 0 首页进入 1我的进入 + pageReqVO.setUserId(getLoginUserId().toString()); + IPage pageInfo = deviceInspectionJobMainMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for(DeviceInspectionJobMainDO en :pageInfo.getRecords()){ + String deviceNumber = en.getDeviceNumber(); + String type = en.getType(); + if("MOLD".equals(type)){//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + }else{//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + } + } + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } else { + //首页进入是获取未接单 已接单的单子 + pageReqVO.setFlag("0"); + } + IPage pageInfo = deviceInspectionJobMainMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + + @Override + public PageResult getInspectionJobMainSenior(CustomConditions conditions) { + return deviceInspectionJobMainMapper.selectSenior(conditions); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer onClick(Long id) { + // 校验存在 + validateDeviceInspectionMainExists(id); + // 更新 + DeviceInspectionJobMainDO inspectionMainDO = deviceInspectionJobMainMapper.selectById(id);//根据检修id获取检修信息 + long maintenance = inspectionMainDO.getMaintenance(); + long loginUserId = getLoginUserId(); + if(maintenance != loginUserId){//当前人与接单人不一致 + throw exception(JIAN_XIU_PEOPLE_DIFF); + } + //DeviceInspectionJobMainDO updateObj = new DeviceInspectionJobMainDO(); + inspectionMainDO.setId(id); + inspectionMainDO.setStatus(OrderStatusEnum.COMPLETED_STATUS.getCode());//已完成完成 + inspectionMainDO.setCompletionTime(LocalDateTime.now());//完成时间 + int i = deviceInspectionJobMainMapper.updateById(inspectionMainDO); + try { + sendEmails(inspectionMainDO); + } catch (Exception e) { + info("发送邮件异常:{}",e); + } + /*if(inspectionMainDO.getMaintenanceNumber()!=null&&!"".equals(inspectionMainDO.getMaintenanceNumber())){//有临时状态的维修工单需要更改状态 + List number = deviceMaintenanceJobMainMapper.selectList("number", inspectionMainDO.getMaintenanceNumber()); + DeviceMaintenanceJobMainDO maintenanceJobMainDO = number.get(0); + maintenanceJobMainDO.setResult(OrderStatusEnum.RESULT_COMPLETED.getCode()); + deviceMaintenanceJobMainMapper.updateById(maintenanceJobMainDO); + }*/ + return i; + } + + @Override + public Integer onVerify(Long id,String verifyContent) { + // 校验存在 + validateDeviceInspectionMainExists(id); + // 更新 + DeviceInspectionJobMainDO inspectionMainDO = deviceInspectionJobMainMapper.selectById(id);//根据检修id获取检修信息 + if(!OrderStatusEnum.COMPLETED_STATUS.getCode().equals(inspectionMainDO.getStatus())){ + throw exception(JIAN_XIU_NOT_COMPLETED); + } + inspectionMainDO.setVerifyTime(LocalDateTime.now()); + inspectionMainDO.setVerifyContent(verifyContent); + inspectionMainDO.setStatus(OrderStatusEnum.VERIFIED_STATUS.getCode());//已验证 + inspectionMainDO.setVerifyTime(LocalDateTime.now()); + inspectionMainDO.setVerifyer(getLoginUserId());//验证人 + int i = deviceInspectionJobMainMapper.updateById(inspectionMainDO); + if(inspectionMainDO.getMaintenanceNumber()!=null&&!"".equals(inspectionMainDO.getMaintenanceNumber())){//有临时状态的维修工单需要更改状态 + List number = deviceMaintenanceJobMainMapper.selectList("number", inspectionMainDO.getMaintenanceNumber()); + DeviceMaintenanceJobMainDO maintenanceJobMainDO = number.get(0); + maintenanceJobMainDO.setResult(OrderStatusEnum.RESULT_COMPLETED.getCode()); + deviceMaintenanceJobMainMapper.updateById(maintenanceJobMainDO); + } + return i; + } + + @Override + public Long createDeviceInspectionMainPC(DeviceInspectionJobMainCreateReqVO createReqVO) { + // 插入 + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + DeviceInspectionJobMainDO deviceInspectionMain = DeviceInspectionJobMainConvert.INSTANCE.convert(createReqVO); + deviceInspectionMain.setMaintenance(getLoginUserId()); + deviceInspectionMain.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode());//检修中 + String number = serialNumberApi.generateCode(RuleCodeEnum.JIAN_XIU_ORDER.getCode()); + deviceInspectionMain.setNumber(number); + deviceInspectionMain.setDeptId(user.getDeptId()); + //检修工单是否选择了维修工单 + if(createReqVO.getNumber()!=null && !"".equals(createReqVO.getNumber())){ + DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectOne("number",createReqVO.getNumber());//根据维修工单号查询维修 + deviceInspectionMain.setDeviceNumber(deviceMaintenanceJobMainDO.getDeviceNumber()); + deviceInspectionMain.setType(deviceMaintenanceJobMainDO.getType()); + deviceInspectionMain.setNumber(deviceMaintenanceJobMainDO.getNumber()); + deviceInspectionMain.setFactoryAreaNumber(deviceMaintenanceJobMainDO.getFactoryAreaNumber()); + } + if(createReqVO.getSubList()!=null&&!"".equals(createReqVO.getSubList())){//PC端传入 + //主子表 + List subDOList = DeviceInspectionJobDetailConvert.INSTANCE.convertList03(createReqVO.getSubList()); + for (DeviceInspectionJobDetailDO deviceMaintenanceDetail : subDOList) { + deviceMaintenanceDetail.setNumber(number); + //插入子项数据 + int id = deviceInspectionDetailMapper.insert(deviceMaintenanceDetail); + List> itemList = deviceMaintenanceDetail.getItemNumbers();//备件号集合 + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(itemDOS!=null){ + String numbers = itemDOS.get(0).getNumber(); + DeviceInspectionJobDetailItemDO dos = new DeviceInspectionJobDetailItemDO(); + dos.setItemNumber(numbers); + dos.setMasterId(deviceMaintenanceDetail.getId()); + dos.setNumber(deviceMaintenanceDetail.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + deviceInspectionDetailItemMapper.insert(dos); + } + } + } + } + } + deviceInspectionJobMainMapper.insert(deviceInspectionMain); + + // 返回 + return deviceInspectionMain.getId(); + } + + @Override + public List getDeviceInspectionMainNoPage(DeviceInspectionJobMainPageReqVO pageReqVO) { + return deviceInspectionJobMainMapper.selectNoPage(pageReqVO); + } + + @Override + public List getInspectionReport(DeviceInspectionReportDo deviceInspectionReportDo) { + return deviceInspectionJobMainMapper.getInspectionReport(deviceInspectionReportDo); + } + + @Override + public List getInspectionReportMainInfo(DeviceInspectionReportDo deviceInspectionReportDo) { + return deviceInspectionJobMainMapper.getInspectionReportMainInfo(deviceInspectionReportDo); + } + + /** + * 检修工单给工程师发验证邮件 + */ + private void sendEmails(DeviceInspectionJobMainDO inspectionMainDO){ + List userBeanList = classTypeMapper.JudgeIdentity(null, inspectionMainDO.getType(), "1", inspectionMainDO.getFactoryAreaNumber()); + userBeanList.stream().forEach(item -> { + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getUserId())); + mailSendSingleToUserReqDTO.setTemplateCode("job-inspection-verify"); + Map params = new HashMap<>(); + params.put("typeName", "模具"); + params.put("number", inspectionMainDO.getNumber()); + params.put("name", item.getNickname()); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + } catch (RuntimeException e) { + info("工单编号为" + inspectionMainDO.getNumber() + "的名为:" + inspectionMainDO.getDescribes() + "的工单给" + item.getNickname() + "发送的邮件通知失败:{}", e); + } + }); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobDetailItemService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobDetailItemService.java new file mode 100644 index 0000000..02f2f1c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobDetailItemService.java @@ -0,0 +1,79 @@ +package com.win.module.eam.service.moldmaintainjob; + +import java.util.*; +import javax.validation.*; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintainjob.MaintainJobDetailItemDO; + +/** + * 保养工单子表与备件关系 Service 接口 + * + * @author 超级管理员 + */ +public interface MoldMaintainJobDetailItemService { + + /** + * 创建保养工单子表与备件关系 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMaintainOrderDetailItem(@Valid MaintainJobDetailItemCreateReqVO createReqVO); + + /** + * 更新保养工单子表与备件关系 + * + * @param updateReqVO 更新信息 + */ + Integer updateMaintainOrderDetailItem(@Valid MaintainJobDetailItemUpdateReqVO updateReqVO); + + /** + * 删除保养工单子表与备件关系 + * + * @param id 编号 + */ + Integer deleteMaintainOrderDetailItem(Long id); + + /** + * 获得保养工单子表与备件关系 + * + * @param id 编号 + * @return 保养工单子表与备件关系 + */ + MaintainJobDetailItemDO getMaintainOrderDetailItem(Long id); + + /** + * 获得保养工单子表与备件关系列表 + * + * @param ids 编号 + * @return 保养工单子表与备件关系列表 + */ + List getMaintainOrderDetailItemList(Collection ids); + + /** + * 获得保养工单子表与备件关系分页 + * + * @param pageReqVO 分页查询 + * @return 保养工单子表与备件关系分页 + */ + PageResult getMaintainOrderDetailItemPage(MaintainJobDetailItemPageReqVO pageReqVO); + + /** + * 获得保养工单子表与备件关系列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 保养工单子表与备件关系列表 + */ + List getMaintainOrderDetailItemList(MaintainJobDetailItemExportReqVO exportReqVO); + + /** + * 导入保养工单子表与备件关系主信息 + * + * @param datas 导入保养工单子表与备件关系主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importMaintainOrderDetailItemList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobDetailItemServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobDetailItemServiceImpl.java new file mode 100644 index 0000000..2352efb --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobDetailItemServiceImpl.java @@ -0,0 +1,105 @@ +package com.win.module.eam.service.moldmaintainjob; + +import cn.hutool.core.collection.CollUtil; +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.convert.devicemaintainjob.MaintainJobDetailItemConvert; +import com.win.module.eam.dal.dataobject.devicemaintainjob.MaintainJobDetailItemDO; +import com.win.module.eam.dal.mysql.devicemaintainjob.MaintainJobDetailItemMapper; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.win.framework.common.pojo.PageResult; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * 保养工单子表与备件关系 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MoldMaintainJobDetailItemServiceImpl implements MoldMaintainJobDetailItemService { + + @Resource + private MaintainJobDetailItemMapper maintainJobDetailItemMapper; + + @Override + public Long createMaintainOrderDetailItem(MaintainJobDetailItemCreateReqVO createReqVO) { + // 插入 + MaintainJobDetailItemDO maintainOrderDetailItem = MaintainJobDetailItemConvert.INSTANCE.convert(createReqVO); + maintainJobDetailItemMapper.insert(maintainOrderDetailItem); + // 返回 + return maintainOrderDetailItem.getId(); + } + + @Override + public Integer updateMaintainOrderDetailItem(MaintainJobDetailItemUpdateReqVO updateReqVO) { + // 校验存在 + validateMaintainOrderDetailItemExists(updateReqVO.getId()); + // 更新 + MaintainJobDetailItemDO updateObj = MaintainJobDetailItemConvert.INSTANCE.convert(updateReqVO); + return maintainJobDetailItemMapper.updateById(updateObj); + } + + @Override + public Integer deleteMaintainOrderDetailItem(Long id) { + // 校验存在 + validateMaintainOrderDetailItemExists(id); + // 删除 + return maintainJobDetailItemMapper.deleteById(id); + } + + private void validateMaintainOrderDetailItemExists(Long id) { + if (maintainJobDetailItemMapper.selectById(id) == null) { + //throw exception(MAINTAIN_ORDER_DETAIL_ITEM_NOT_EXISTS); + } + } + + @Override + public MaintainJobDetailItemDO getMaintainOrderDetailItem(Long id) { + return maintainJobDetailItemMapper.selectById(id); + } + + @Override + public List getMaintainOrderDetailItemList(Collection ids) { + return maintainJobDetailItemMapper.selectBatchIds(ids); + } + + @Override + public PageResult getMaintainOrderDetailItemPage(MaintainJobDetailItemPageReqVO pageReqVO) { + return maintainJobDetailItemMapper.selectPage(pageReqVO); + } + + @Override + public List getMaintainOrderDetailItemList(MaintainJobDetailItemExportReqVO exportReqVO) { + return maintainJobDetailItemMapper.selectList(exportReqVO); + } + + @Override + public List importMaintainOrderDetailItemList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(MAINTAIN_ORDER_DETAIL_ITEM_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// MaintainOrderDetailItemDO obj = maintainOrderDetailItemMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// maintainOrderDetailItemMapper.insert(MaintainOrderDetailItemConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// MaintainOrderDetailItemDO maintainOrderDetailItemDO = MaintainOrderDetailItemConvert.INSTANCE.convert(item); +// maintainOrderDetailItemDO.setId(obj.getId()); +// maintainOrderDetailItemMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobDetailService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobDetailService.java new file mode 100644 index 0000000..28c364f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobDetailService.java @@ -0,0 +1,87 @@ +package com.win.module.eam.service.moldmaintainjob; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobDetailDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 保养工单子 Service 接口 + * + * @author 超级管理员 + */ +public interface MoldMaintainJobDetailService { + + /** + * 创建保养工单子 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintainOrderDetail(@Valid DeviceMaintainJobDetailCreateReqVO createReqVO); + + /** + * 更新保养工单子 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceMaintainOrderDetail(@Valid DeviceMaintainJobDetailUpdateReqVO updateReqVO); + + /** + * 删除保养工单子 + * + * @param id 编号 + */ + Integer deleteDeviceMaintainOrderDetail(Long id); + + /** + * 获得保养工单子 + * + * @param id 编号 + * @return 保养工单子 + */ + DeviceMaintainJobDetailDO getDeviceMaintainOrderDetail(Long id); + + /** + * 获得保养工单子列表 + * + * @param ids 编号 + * @return 保养工单子列表 + */ + List getDeviceMaintainOrderDetailList(Collection ids); + + /** + * 查询保养子项列表 + * @param number + * @return + */ + List selectListByNumber(String number); + + /** + * 获得保养工单子分页 + * + * @param pageReqVO 分页查询 + * @return 保养工单子分页 + */ + PageResult getDeviceMaintainOrderDetailPage(DeviceMaintainJobDetailPageReqVO pageReqVO); + + /** + * 获得保养工单子列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 保养工单子列表 + */ + List getDeviceMaintainOrderDetailList(DeviceMaintainJobDetailExportReqVO exportReqVO); + + /** + * 导入保养工单子主信息 + * + * @param datas 导入保养工单子主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceMaintainOrderDetailList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobDetailServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobDetailServiceImpl.java new file mode 100644 index 0000000..3d9eb67 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobDetailServiceImpl.java @@ -0,0 +1,220 @@ +package com.win.module.eam.service.moldmaintainjob; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.convert.devicemaintainjob.DeviceMaintainJobDetailConvert; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobDetailDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.MaintainJobDetailItemDO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.mysql.devicemaintainjob.DeviceMaintainJobDetailMapper; +import com.win.module.eam.dal.mysql.devicemaintainjob.DeviceMaintainJobMainMapper; +import com.win.module.eam.dal.mysql.devicemaintainjob.MaintainJobDetailItemMapper; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +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.module.eam.enums.ErrorCodeConstants.ITEM_NOT_EXISTS; + + +/** + * 保养工单子 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MoldMaintainJobDetailServiceImpl implements MoldMaintainJobDetailService { + + @Resource + private DeviceMaintainJobDetailMapper deviceMaintainJobDetailMapper; + + @Resource + private MaintainJobDetailItemMapper maintainJobDetailItemMapper; + + @Resource + private DeviceMaintainJobMainMapper deviceMaintainJobMainMapper; + + @Resource + private AdminUserApi userApi; + + @Resource + ItemMapper itemMapper; + + @Override + public Long createDeviceMaintainOrderDetail(DeviceMaintainJobDetailCreateReqVO createReqVO) { + List mainDO = deviceMaintainJobMainMapper.selectList("number", createReqVO.getNumber()); + // 插入 + DeviceMaintainJobDetailDO deviceMaintainOrderDetail = DeviceMaintainJobDetailConvert.INSTANCE.convert(createReqVO); + deviceMaintainOrderDetail.setMasterId(mainDO.get(0).getId()); + int i = deviceMaintainJobDetailMapper.insert(deviceMaintainOrderDetail); + List> itemList = createReqVO.getItemNumbers();//备件号集合 + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(!itemDOS.isEmpty()){ + String number = itemDOS.get(0).getNumber(); + MaintainJobDetailItemDO dos = new MaintainJobDetailItemDO(); + dos.setItemNumber(number); + dos.setMasterId(deviceMaintainOrderDetail.getId()); + dos.setNumber(createReqVO.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + maintainJobDetailItemMapper.insert(dos); + }else{ + throw exception(ITEM_NOT_EXISTS); + } + } + } + // 返回 + return deviceMaintainOrderDetail.getId(); + } + + @Override + public Integer updateDeviceMaintainOrderDetail(DeviceMaintainJobDetailUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceMaintainOrderDetailExists(updateReqVO.getId()); + // 更新 + DeviceMaintainJobDetailDO updateObj = DeviceMaintainJobDetailConvert.INSTANCE.convert(updateReqVO); + int i = deviceMaintainJobDetailMapper.updateById(updateObj); + //先删除关联备件 + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("master_id", updateReqVO.getId()); + itemQueryWrapper.eq("deleted", 0); + List maintainJobDetailItemDOS = maintainJobDetailItemMapper.selectList(itemQueryWrapper); + for(MaintainJobDetailItemDO item: maintainJobDetailItemDOS){ + maintainJobDetailItemMapper.deleteById(item.getId()); + } + //再重新添加 + List> itemList = updateReqVO.getItemNumbers();//备件号集合 + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(!itemDOS.isEmpty()){ + String number = itemDOS.get(0).getNumber(); + MaintainJobDetailItemDO dos = new MaintainJobDetailItemDO(); + dos.setItemNumber(number); + dos.setMasterId(updateReqVO.getId()); + dos.setNumber(updateReqVO.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + maintainJobDetailItemMapper.insert(dos); + }else{ + throw exception(ITEM_NOT_EXISTS); + } + } + } + // 返回 + return i; + } + + @Override + public Integer deleteDeviceMaintainOrderDetail(Long id) { + // 校验存在 + validateDeviceMaintainOrderDetailExists(id); + // 删除 + return deviceMaintainJobDetailMapper.deleteById(id); + } + + private void validateDeviceMaintainOrderDetailExists(Long id) { + if (deviceMaintainJobDetailMapper.selectById(id) == null) { + //throw exception(DEVICE_MAINTAIN_ORDER_DETAIL_NOT_EXISTS); + } + } + + @Override + public DeviceMaintainJobDetailDO getDeviceMaintainOrderDetail(Long id) { + return deviceMaintainJobDetailMapper.selectById(id); + } + + @Override + public List getDeviceMaintainOrderDetailList(Collection ids) { + return deviceMaintainJobDetailMapper.selectBatchIds(ids); + } + + @Override + public List selectListByNumber(String number) { + QueryWrapper detailsDOQueryWrapper = new QueryWrapper<>(); + detailsDOQueryWrapper.eq("number", number); + detailsDOQueryWrapper.eq("available", "TRUE"); + List maintenanceNumber = deviceMaintainJobDetailMapper.selectList(detailsDOQueryWrapper); + for(DeviceMaintainJobDetailDO en:maintenanceNumber){ + StringBuilder names = new StringBuilder(); + if(!"".equals(en.getChargePeoples())&& en.getChargePeoples()!=null){ + String[] split = en.getChargePeoples().split(","); + for(int i = 0; i < split.length; i++) { + AdminUserRespDTO user = userApi.getUser(Long.parseLong(split[i])); + if (names.length() > 0) { + names.append(", "); + } + String name = user.getNickname(); + names.append(name); + } + en.setChargePeoplesName(names.toString()); + } + List> list = maintainJobDetailItemMapper.selectListById(en.getId()); +// StringBuilder sb = new StringBuilder(); +// for(Map map:list){ +// if (sb.length() > 0) { +// sb.append(", "); +// } +// String name = map.get("name").toString(); +// String qty = map.get("qty").toString(); +// sb.append(name+":"+qty); +// } + en.setItems(list); + } + return maintenanceNumber; + } + + @Override + public PageResult getDeviceMaintainOrderDetailPage(DeviceMaintainJobDetailPageReqVO pageReqVO) { + + PageResult deviceMaintainJobDetailDOList = deviceMaintainJobDetailMapper.selectPage(pageReqVO); + for(DeviceMaintainJobDetailDO en:deviceMaintainJobDetailDOList.getList()){ + List> list = maintainJobDetailItemMapper.selectListById(en.getId()); + en.setItemNumbers(list); + } + return deviceMaintainJobDetailDOList; + } + + @Override + public List getDeviceMaintainOrderDetailList(DeviceMaintainJobDetailExportReqVO exportReqVO) { + return deviceMaintainJobDetailMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceMaintainOrderDetailList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_MAINTAIN_ORDER_DETAIL_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceMaintainOrderDetailDO obj = deviceMaintainOrderDetailMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceMaintainOrderDetailMapper.insert(DeviceMaintainOrderDetailConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceMaintainOrderDetailDO deviceMaintainOrderDetailDO = DeviceMaintainOrderDetailConvert.INSTANCE.convert(item); +// deviceMaintainOrderDetailDO.setId(obj.getId()); +// deviceMaintainOrderDetailMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobMainService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobMainService.java new file mode 100644 index 0000000..c07a957 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobMainService.java @@ -0,0 +1,151 @@ +package com.win.module.eam.service.moldmaintainjob; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobReportDo; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 保养工单主 Service 接口 + * + * @author 超级管理员 + */ +public interface MoldMaintainJobMainService { + + /** + * 创建保养工单主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintainOrderMain(@Valid DeviceMaintainJobMainCreateReqVO createReqVO); + + /** + * 更新保养工单主 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceMaintainOrderMain(@Valid DeviceMaintainJobMainUpdateReqVO updateReqVO); + + /** + * 删除保养工单主 + * + * @param id 编号 + */ + Integer deleteDeviceMaintainOrderMain(Long id); + + /** + * 获得保养工单主 + * + * @param id 编号 + * @return 保养工单主 + */ + DeviceMaintainJobMainDO getDeviceMaintainOrderMain(Long id); + + /** + * 获得保养工单主列表 + * + * @param ids 编号 + * @return 保养工单主列表 + */ + List getDeviceMaintainOrderMainList(Collection ids); + + /** + * 获得保养工单主分页 + * + * @param pageReqVO 分页查询 + * @return 保养工单主分页 + */ + PageResult getDeviceMaintainOrderMainPage(DeviceMaintainJobMainPageReqVO pageReqVO); + + + /** + * 获得保养工单主分页 + * + * @param conditions 分页查询 + * @return 保养工单主分页 + */ + PageResult getDeviceMaintainOrderMainSenior(CustomConditions conditions); + + + + /** + * APP分页 + * @param pageReqVO + * @return + */ + PageResult getAppPage(DeviceMaintainJobMainPageReqVO pageReqVO); + + /** + * 获得保养工单主列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 保养工单主列表 + */ + List getDeviceMaintainOrderMainList(DeviceMaintainJobMainExportReqVO exportReqVO); + + /** + * 导入保养工单主主信息 + * + * @param datas 导入保养工单主主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceMaintainOrderMainList(List datas, Integer mode, boolean updatePart); + + /** + * 保养工单点击接单 维修人员和工程师都能接单 + * @param id + * @return + */ + int orderClick(Long id); + + /** + * 点击完成 + * @param id + * @return + */ + int orderClickFinish(Long id); + + /** + * 保养工单工程师审核 + * @param id 工单id + * @param verifyContent 审核意见 + * @return + */ + int orderClickVerify(Long id,String verifyContent); + + /** + * 每月月初一号查询上个月未完成的保养和维修工单给主管发邮件 + */ + void createUncompletedOrderTask(); + + /** + *@Author longlongxiaogege + *@Description //生成保养打印表子内容 + *@Date 13:17 2024/4/18 + *@Param [deviceMaintainJobReportDo] + *@return java.util.List + **/ + List getMaintainReport(DeviceMaintainJobReportDo deviceMaintainJobReportDo); + + + /** + *@Author longlongxiaogege + *@Description //生成保养打印表主内容 + *@Date 13:17 2024/4/18 + *@Param [deviceMaintainJobReportDo] + *@return java.util.List + **/ + List getMaintainReportMainInfo(DeviceMaintainJobReportDo deviceMaintainJobReportDo); + + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobMainServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobMainServiceImpl.java new file mode 100644 index 0000000..9124b92 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintainjob/MoldMaintainJobMainServiceImpl.java @@ -0,0 +1,409 @@ +package com.win.module.eam.service.moldmaintainjob; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.convert.devicemaintainjob.DeviceMaintainJobMainConvert; +import com.win.module.eam.dal.dataobject.classtype.ClassTypeDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobReportDo; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.dal.mysql.classtype.ClassTypeMapper; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.devicemaintainjob.DeviceMaintainJobMainMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobMainMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.eam.service.moldmaintainjob.MoldMaintainJobMainService; +import com.win.module.system.api.dept.DeptApi; +import com.win.module.system.api.dept.PostApi; +import com.win.module.system.api.mail.MailSendApi; +import com.win.module.system.api.mail.dto.MailSendSingleToUserReqDTO; +import com.win.module.system.api.permission.PermissionApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.api.user.dto.AdminUserRespExpandDTO; +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.temporal.TemporalAdjusters; +import java.util.*; + +import static cn.hutool.log.StaticLog.info; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 保养工单主 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MoldMaintainJobMainServiceImpl implements MoldMaintainJobMainService { + + @Resource + private DeviceMaintainJobMainMapper deviceMaintainJobMainMapper; + + @Resource + private MoldAccountsMapper moldAccountsMapper; + + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + + @Resource + private DeviceMaintenanceJobMainMapper deviceMaintenanceJobMainMapper; + + @Resource + private PostApi postApi; + @Resource + private MailSendApi mailSendApi; + + @Resource + private DeptApi deptApi; + + @Resource + private AdminUserApi userApi; + + @Resource + private PermissionApi permissionApi; + + @Resource + private ClassTypeMapper classTypeMapper; + + @Override + public Long createDeviceMaintainOrderMain(DeviceMaintainJobMainCreateReqVO createReqVO) { + // 插入 + DeviceMaintainJobMainDO deviceMaintainOrderMain = DeviceMaintainJobMainConvert.INSTANCE.convert(createReqVO); + deviceMaintainOrderMain.setDeptId(Long.parseLong(createReqVO.getFactoryAreaNumber())); + deviceMaintainJobMainMapper.insert(deviceMaintainOrderMain); + // 返回 + return deviceMaintainOrderMain.getId(); + } + + @Override + public Integer updateDeviceMaintainOrderMain(DeviceMaintainJobMainUpdateReqVO updateReqVO) { + // 校验存在 + //validateDeviceMaintainOrderMainExists(updateReqVO.getId()); + // 更新 + DeviceMaintainJobMainDO updateObj = DeviceMaintainJobMainConvert.INSTANCE.convert(updateReqVO); + return deviceMaintainJobMainMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceMaintainOrderMain(Long id) { + // 校验存在 + validateDeviceMaintainOrderMainExists(id); + // 删除 + return deviceMaintainJobMainMapper.deleteById(id); + } + + private void validateDeviceMaintainOrderMainExists(Long id) { + if (deviceMaintainJobMainMapper.selectById(id) == null) { + throw exception(JIAN_XIU_ORDER_NOT_EXISTS); + } + } + + @Override + public DeviceMaintainJobMainDO getDeviceMaintainOrderMain(Long id) { + return deviceMaintainJobMainMapper.selectById(id); + } + + @Override + public List getDeviceMaintainOrderMainList(Collection ids) { + return deviceMaintainJobMainMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceMaintainOrderMainPage(DeviceMaintainJobMainPageReqVO pageReqVO) { + return deviceMaintainJobMainMapper.selectPage(pageReqVO); + } + + + @Override + public PageResult getDeviceMaintainOrderMainSenior(CustomConditions conditions) { + return deviceMaintainJobMainMapper.selectSenior(conditions); + } + + + @Override + public PageResult getAppPage(DeviceMaintainJobMainPageReqVO pageReqVO) { + pageReqVO.setUserId(getLoginUserId().toString()); + pageReqVO.setClassType("MOLD"); + String b = classTypeMapper.getIdentity("MOLD"); + if (b.equals("2")) { + throw exception(WORKER_ENGINEER_IS_NOT); + } + pageReqVO.setStandType(b); + if ("1".equals(pageReqVO.getFlag())) {//flag 0 首页进入 1我的进入 + //我的里面都是获取的是当前人已经完成的单子 + pageReqVO.setUserId(getLoginUserId().toString()); + IPage pageInfo = deviceMaintainJobMainMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for(DeviceMaintainJobMainDO en :pageInfo.getRecords()){ + String deviceNumber = en.getDeviceNumber(); + String type = en.getType(); + if("MOLD".equals(type)){//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + }else{//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + } + + } + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } else { + //首页进入是获取未接单 已接单的单子 + pageReqVO.setFlag("0"); + } + IPage pageInfo = deviceMaintainJobMainMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + + @Override + public List getDeviceMaintainOrderMainList(DeviceMaintainJobMainExportReqVO exportReqVO) { + return deviceMaintainJobMainMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceMaintainOrderMainList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_MAINTAIN_ORDER_MAIN_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); + return errorList; + } + + @Override + public int orderClick(Long id) { + // 校验是否当前班组成员 + //validateFactoryAndClassType(id); + DeviceMaintainJobMainDO mainDO = new DeviceMaintainJobMainDO(); + mainDO.setId(id); + mainDO.setMaintenance(getLoginUserId()); + mainDO.setReceiveTime(LocalDateTime.now()); + mainDO.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + return deviceMaintainJobMainMapper.updateById(mainDO); + } + @Override + public int orderClickFinish(Long id) { + // 校验存在 + DeviceMaintainJobMainDO mainDO = deviceMaintainJobMainMapper.selectById(id); + if (deviceMaintainJobMainMapper.selectById(id) == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + if(!getLoginUserId().equals(mainDO.getMaintenance())){ + throw exception(JIAN_XIU_ORDER_NOT_USER); + } + mainDO.setId(id); + mainDO.setCompletionTime(LocalDateTime.now()); + mainDO.setStatus(OrderStatusEnum.RESULT_COMPLETED.getCode()); + try { + sendEmails(mainDO); + } catch (Exception e) { + info("发送邮件异常:{}",e); + } + int i = deviceMaintainJobMainMapper.updateById(mainDO); + + return i; + } + + @Override + public int orderClickVerify(Long id, String verifyContent) { + DeviceMaintainJobMainDO Do = deviceMaintainJobMainMapper.selectById(id); + // 校验存在 + if (Do == null) { + throw exception(BAO_YANG_JOB_NOT_EXISTS); + } + if(!permissionApi.BooleanEngineer()){ + throw exception(WEI_XIU_NOT_ENGINEER); + } + Do.setStatus(OrderStatusEnum.VERIFIED_STATUS.getCode()); + Do.setVerifyContent(verifyContent); + Do.setVerifyer(getLoginUserId()); + Do.setVerifyTime(LocalDateTime.now()); + return deviceMaintainJobMainMapper.updateById(Do); + } + + @Override + public void createUncompletedOrderTask() { + LocalDate now = LocalDate.now(); + LocalDate firstDayOfLastMonth = now.with(TemporalAdjusters.firstDayOfMonth()).minusMonths(1); + LocalDate lastDayOfLastMonth = now.with(TemporalAdjusters.lastDayOfMonth()).minusMonths(1); + String startDate = LocalDateTimeUtil.format(firstDayOfLastMonth,"yyyy-MM-dd"); + String endDate = LocalDateTimeUtil.format(lastDayOfLastMonth,"yyyy-MM-dd"); + String months = LocalDateTimeUtil.format(lastDayOfLastMonth,"yyyy-MM"); + List deviceMaintain = deviceMaintainJobMainMapper.selectList1(startDate, endDate); + List jobMainDOS = deviceMaintenanceJobMainMapper.selectList1(startDate, endDate); + StringBuilder str = new StringBuilder(); + StringBuilder str1 = new StringBuilder(); + for(DeviceMaintainJobMainDO en:deviceMaintain){ + String type = en.getType(); + String typeName = ""; + if(BasicStatusEnum.BASIC_DEVICE.getCode().equals(type)){ + typeName = "

   设备保养工单"; + }else if(BasicStatusEnum.BASIC_TECH.getCode().equals(type)){ + typeName = "

   工艺保养工单"; + }else if(BasicStatusEnum.BASIC_MOLD.getCode().equals(type)){ + typeName = "

   模具保养工单"; + } + str.append(typeName); + String number = en.getNumber(); + str.append("("); + str.append(number); + str.append(")

"); + } + for(DeviceMaintenanceJobMainDO en:jobMainDOS){ + String type = en.getType(); + String typeName = ""; + if(BasicStatusEnum.BASIC_DEVICE.getCode().equals(type)){ + typeName = "

   设备维修工单"; + }else if(BasicStatusEnum.BASIC_TECH.getCode().equals(type)){ + typeName = "

   工艺维修工单"; + }else if(BasicStatusEnum.BASIC_MOLD.getCode().equals(type)){ + typeName = "

   模具维修工单"; + } + str1.append(typeName); + String number = en.getNumber(); + str1.append("("); + str1.append(number); + str1.append(")

"); + } + if(deviceMaintain.size()>0 || jobMainDOS.size()>0){ + sendEmails(months,str.toString(),str1.toString()); + } + + } + + @Override + public List getMaintainReport(DeviceMaintainJobReportDo deviceMaintainJobReportDo) { + return deviceMaintainJobMainMapper.getMaintainReport(deviceMaintainJobReportDo); + } + + @Override + public List getMaintainReportMainInfo(DeviceMaintainJobReportDo deviceMaintainJobReportDo) { + return deviceMaintainJobMainMapper.getMaintainReportMainInfo(deviceMaintainJobReportDo); + } + + /** + * 校验能否点击待接单 + * @param id + */ + private void validateJD(Long id) { + DeviceMaintainJobMainDO mainDO = deviceMaintainJobMainMapper.selectById(id); + if (deviceMaintainJobMainMapper.selectById(id) == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + if(!OrderStatusEnum.PEND_ORDER_STATUS.getCode().equals(mainDO.getStatus())){ + throw exception(JIAN_XIU_ORDER_NOT_PENDING); + } + +// if(!permissionApi.B&&!b){ +// throw exception(JIAN_XIU_ORDER_NOT_POST); +// } + } + + /** + * 校验能否点击完成 + * @param id + */ + private void validateWC(Long id) { + DeviceMaintainJobMainDO mainDO = deviceMaintainJobMainMapper.selectById(id); + if (deviceMaintainJobMainMapper.selectById(id) == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + if(!getLoginUserId().equals(mainDO.getMaintenance())){ + throw exception(JIAN_XIU_ORDER_NOT_USER); + } +// Boolean a = postApi.booleanWorker(); +// Boolean b = postApi.booleanEngineer(); +// if(!a&&!b){ +// throw exception(JIAN_XIU_ORDER_NOT_POST); +// } + } + + /** + * 校验人员厂区和班组是否匹配 + * @param id + */ + private void validateFactoryAndClassType(Long id) { + DeviceMaintainJobMainDO mainDO = deviceMaintainJobMainMapper.selectById(id); + if (mainDO == null) { + throw exception(BAO_YANG_JOB_NOT_EXISTS); + } + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + Long deptId = user.getDeptId(); + if(!mainDO.getFactoryAreaNumber().equals(deptId.toString())){//厂区不一致 + throw exception(FACTORY_NO_NOMAL); + } + if(!mainDO.getType().equals(permissionApi.getClassType())){//班组不一致 + throw exception(CLASSTYPR_NO_NOMAL); + } + } + /** + * 每个月初查询上个月未完成的保养和维修工单给主管发送邮件 + */ + private void sendEmails(String months,String str,String str1){ + AdminUserRespExpandDTO adminUserRespExpandDTO = new AdminUserRespExpandDTO(); + List list = List.of("device_charge"); + adminUserRespExpandDTO.setCode(list); + List userBeanList = userApi.selectByUserIdentity(adminUserRespExpandDTO); + userBeanList.stream().forEach(item ->{ + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getId())); + mailSendSingleToUserReqDTO.setTemplateCode("month-examine-template"); + Map params = new HashMap<>(); + params.put("months",months); + params.put("str", str); + params.put("str1", str1); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + }catch(RuntimeException e){ + info(months+"未完成的保养和维修工单发送的邮件通知失败:{}", e); + } + }); + } + + /** + * 保养工单给工程师发验证邮件 + */ + private void sendEmails(DeviceMaintainJobMainDO mainDO){ + List userBeanList = classTypeMapper.JudgeIdentity(null, mainDO.getType(), "1", mainDO.getFactoryAreaNumber()); + userBeanList.stream().forEach(item ->{ + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getUserId())); + mailSendSingleToUserReqDTO.setTemplateCode("job-maintain-verify_template"); + Map params = new HashMap<>(); + params.put("typeName","模具"); + params.put("number", mainDO.getNumber()); + params.put("name", item.getNickname()); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + }catch(RuntimeException e){ + info("工单编号为"+mainDO.getNumber()+"的名为:"+mainDO.getDescribes()+"的工单给"+item.getNickname()+"发送的邮件通知失败:{}", e); + } + }); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobDetailItemService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobDetailItemService.java new file mode 100644 index 0000000..47a0caf --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobDetailItemService.java @@ -0,0 +1,87 @@ +package com.win.module.eam.service.moldmaintenancejob; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailItemDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 维修工单子表与备件关系 Service 接口 + * + * @author 超级管理员 + */ +public interface MoldMaintenanceJobDetailItemService { + + /** + * 创建维修工单子表与备件关系 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintenanceDetailItem(@Valid DeviceMaintenanceJobDetailItemCreateReqVO createReqVO); + + /** + * 更新维修工单子表与备件关系 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceMaintenanceDetailItem(@Valid DeviceMaintenanceJobDetailItemUpdateReqVO updateReqVO); + + /** + * 删除维修工单子表与备件关系 + * + * @param id 编号 + */ + Integer deleteDeviceMaintenanceDetailItem(Long id); + + /** + * 获得维修工单子表与备件关系 + * + * @param id 编号 + * @return 维修工单子表与备件关系 + */ + DeviceMaintenanceJobDetailItemDO getDeviceMaintenanceDetailItem(Long id); + + /** + * 获得维修工单子表与备件关系列表 + * + * @param ids 编号 + * @return 维修工单子表与备件关系列表 + */ + List getDeviceMaintenanceDetailItemList(Collection ids); + + /** + * 获得维修工单子表与备件关系分页 + * + * @param pageReqVO 分页查询 + * @return 维修工单子表与备件关系分页 + */ + PageResult getDeviceMaintenanceDetailItemPage(DeviceMaintenanceJobDetailItemPageReqVO pageReqVO); + + /** + * 获得维修工单子表与备件关系列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 维修工单子表与备件关系列表 + */ + List getDeviceMaintenanceDetailItemList(DeviceMaintenanceJobDetailItemExportReqVO exportReqVO); + + /** + * 导入维修工单子表与备件关系主信息 + * + * @param datas 导入维修工单子表与备件关系主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceMaintenanceDetailItemList(List datas, Integer mode, boolean updatePart); + + /** + * 根据维修工单子项id获取备件列表 + * @param maintenanceDetailId + * @return + */ + List> selectListById(Long maintenanceDetailId); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobDetailItemServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobDetailItemServiceImpl.java new file mode 100644 index 0000000..ef3ea32 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobDetailItemServiceImpl.java @@ -0,0 +1,112 @@ +package com.win.module.eam.service.moldmaintenancejob; + +import cn.hutool.core.collection.CollUtil; +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailItemDO; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobDetailItemConvert; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailItemMapper; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * 维修工单子表与备件关系 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MoldMaintenanceJobDetailItemServiceImpl implements MoldMaintenanceJobDetailItemService { + + @Resource + private DeviceMaintenanceJobDetailItemMapper deviceMaintenanceJobDetailItemMapper; + + @Override + public Long createDeviceMaintenanceDetailItem(DeviceMaintenanceJobDetailItemCreateReqVO createReqVO) { + // 插入 + DeviceMaintenanceJobDetailItemDO deviceMaintenanceDetailItem = DeviceMaintenanceJobDetailItemConvert.INSTANCE.convert(createReqVO); + deviceMaintenanceJobDetailItemMapper.insert(deviceMaintenanceDetailItem); + // 返回 + return deviceMaintenanceDetailItem.getId(); + } + + @Override + public Integer updateDeviceMaintenanceDetailItem(DeviceMaintenanceJobDetailItemUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceMaintenanceDetailItemExists(updateReqVO.getId()); + // 更新 + DeviceMaintenanceJobDetailItemDO updateObj = DeviceMaintenanceJobDetailItemConvert.INSTANCE.convert(updateReqVO); + return deviceMaintenanceJobDetailItemMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceMaintenanceDetailItem(Long id) { + // 校验存在 + validateDeviceMaintenanceDetailItemExists(id); + // 删除 + return deviceMaintenanceJobDetailItemMapper.deleteById(id); + } + + private void validateDeviceMaintenanceDetailItemExists(Long id) { + if (deviceMaintenanceJobDetailItemMapper.selectById(id) == null) { + //throw exception(DEVICE_MAINTENANCE_DETAIL_ITEM_NOT_EXISTS); + } + } + + @Override + public DeviceMaintenanceJobDetailItemDO getDeviceMaintenanceDetailItem(Long id) { + return deviceMaintenanceJobDetailItemMapper.selectById(id); + } + + @Override + public List getDeviceMaintenanceDetailItemList(Collection ids) { + return deviceMaintenanceJobDetailItemMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceMaintenanceDetailItemPage(DeviceMaintenanceJobDetailItemPageReqVO pageReqVO) { + return deviceMaintenanceJobDetailItemMapper.selectPage(pageReqVO); + } + + @Override + public List getDeviceMaintenanceDetailItemList(DeviceMaintenanceJobDetailItemExportReqVO exportReqVO) { + return deviceMaintenanceJobDetailItemMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceMaintenanceDetailItemList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_MAINTENANCE_DETAIL_ITEM_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceMaintenanceDetailItemDO obj = deviceMaintenanceDetailItemMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceMaintenanceDetailItemMapper.insert(DeviceMaintenanceDetailItemConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceMaintenanceDetailItemDO deviceMaintenanceDetailItemDO = DeviceMaintenanceDetailItemConvert.INSTANCE.convert(item); +// deviceMaintenanceDetailItemDO.setId(obj.getId()); +// deviceMaintenanceDetailItemMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public List> selectListById(Long maintenanceDetailId) { + return deviceMaintenanceJobDetailItemMapper.selectListById(maintenanceDetailId); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobDetailService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobDetailService.java new file mode 100644 index 0000000..0557985 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobDetailService.java @@ -0,0 +1,88 @@ +package com.win.module.eam.service.moldmaintenancejob; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailDO; + +/** + * 维修工单子 Service 接口 + * + * @author 超级管理员 + */ +public interface MoldMaintenanceJobDetailService { + + /** + * 创建维修工单子 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintenanceDetail(@Valid DeviceMaintenanceJobDetailCreateReqVO createReqVO); + + /** + * 更新维修工单子 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceMaintenanceDetail(@Valid DeviceMaintenanceJobDetailUpdateReqVO updateReqVO); + + /** + * 删除维修工单子 + * + * @param id 编号 + */ + Integer deleteDeviceMaintenanceDetail(Long id); + + /** + * 获得维修工单子 + * + * @param id 编号 + * @return 维修工单子 + */ + DeviceMaintenanceJobDetailDO getDeviceMaintenanceDetail(Long id); + + /** + * 获得维修工单子列表 + * + * @param ids 编号 + * @return 维修工单子列表 + */ + List getDeviceMaintenanceDetailList(Collection ids); + + /** + * 根据维修工单号查询工单子项列表信息 + * @param number + * @return + */ + List selectListByNumber(String number); + + /** + * 获得维修工单子分页 + * + * @param pageReqVO 分页查询 + * @return 维修工单子分页 + */ + PageResult getDeviceMaintenanceDetailPage(DeviceMaintenanceJobDetailPageReqVO pageReqVO); + + + /** + * 获得维修工单子列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 维修工单子列表 + */ + List getDeviceMaintenanceDetailList(DeviceMaintenanceJobDetailExportReqVO exportReqVO); + + /** + * 导入维修工单子主信息 + * + * @param datas 导入维修工单子主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceMaintenanceDetailList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobDetailServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobDetailServiceImpl.java new file mode 100644 index 0000000..0ee93ce --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobDetailServiceImpl.java @@ -0,0 +1,253 @@ +package com.win.module.eam.service.moldmaintenancejob; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobDetailConvert; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailItemDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailItemMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobMainMapper; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +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.module.eam.enums.ErrorCodeConstants.*; + +/** + * 维修工单子 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MoldMaintenanceJobDetailServiceImpl implements MoldMaintenanceJobDetailService { + + @Resource + private AdminUserApi userApi; + @Resource + private DeviceMaintenanceJobDetailMapper deviceMaintenanceJobDetailMapper; + + @Resource + private DeviceMaintenanceJobMainMapper deviceMaintenanceJobMainMapper; + @Resource + DeviceMaintenanceJobDetailItemMapper deviceMaintenanceJobDetailItemMapper; + + @Resource + ItemMapper itemMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDeviceMaintenanceDetail(DeviceMaintenanceJobDetailCreateReqVO createReqVO) { + List main = deviceMaintenanceJobMainMapper.selectList("number", createReqVO.getNumber()); + Long mainId = main.get(0).getId(); + // 插入 + DeviceMaintenanceJobDetailDO deviceMaintenanceDetail = DeviceMaintenanceJobDetailConvert.INSTANCE.convert(createReqVO); + deviceMaintenanceDetail.setMasterId(mainId); + int id = deviceMaintenanceJobDetailMapper.insert(deviceMaintenanceDetail); + List> itemList = createReqVO.getItemNumbers();//备件号集合 + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(!itemDOS.isEmpty()){ + String number = itemDOS.get(0).getNumber(); + DeviceMaintenanceJobDetailItemDO dos = new DeviceMaintenanceJobDetailItemDO(); + dos.setItemNumber(number); + dos.setMasterId(deviceMaintenanceDetail.getId()); + dos.setNumber(createReqVO.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + deviceMaintenanceJobDetailItemMapper.insert(dos); + }else{ + throw exception(ITEM_NOT_EXISTS); + } + } + } + // 返回 + return deviceMaintenanceDetail.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateDeviceMaintenanceDetail(DeviceMaintenanceJobDetailUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceMaintenanceDetailExists(updateReqVO.getId()); + // 更新 + DeviceMaintenanceJobDetailDO updateObj = DeviceMaintenanceJobDetailConvert.INSTANCE.convert(updateReqVO); + int i = deviceMaintenanceJobDetailMapper.updateById(updateObj); + //先删除备件关联表 + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("master_id", updateReqVO.getId()); + itemQueryWrapper.eq("deleted", 0); + List deviceMaintenanceJobDetailItemDOS = deviceMaintenanceJobDetailItemMapper.selectList(itemQueryWrapper); + for(DeviceMaintenanceJobDetailItemDO item: deviceMaintenanceJobDetailItemDOS){ + deviceMaintenanceJobDetailItemMapper.deleteById(item.getId()); + } + + //重新加入备件 + List> itemList = updateReqVO.getItemNumbers(); + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(!itemDOS.isEmpty()){ + String number = itemDOS.get(0).getNumber(); + DeviceMaintenanceJobDetailItemDO dos = new DeviceMaintenanceJobDetailItemDO(); + dos.setItemNumber(number); + dos.setMasterId(updateReqVO.getId()); + dos.setNumber(updateReqVO.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + deviceMaintenanceJobDetailItemMapper.insert(dos); + }else{ + throw exception(ITEM_NOT_EXISTS); + } + } + } + return i; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer deleteDeviceMaintenanceDetail(Long id) { + // 校验存在 + validateDeviceMaintenanceDetailExists(id); + // 删除 + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("master_id", id); + itemQueryWrapper.eq("deleted", 0); + List deviceMaintenanceJobDetailItemDOS = deviceMaintenanceJobDetailItemMapper.selectList(itemQueryWrapper); + for(DeviceMaintenanceJobDetailItemDO item: deviceMaintenanceJobDetailItemDOS){ + deviceMaintenanceJobDetailItemMapper.deleteById(item.getId()); + } + int i = deviceMaintenanceJobDetailMapper.deleteById(id); + return i ; + } + + private void validateDeviceMaintenanceDetailExists(Long id) { + if (deviceMaintenanceJobDetailMapper.selectById(id) == null) { + throw exception(WEI_XIU_ORDER_DETAILS_NOT_EXISTS); + } + } + + @Override + public DeviceMaintenanceJobDetailDO getDeviceMaintenanceDetail(Long id) { + return deviceMaintenanceJobDetailMapper.selectById(id); + } + + @Override + public List getDeviceMaintenanceDetailList(Collection ids) { + return deviceMaintenanceJobDetailMapper.selectBatchIds(ids); + } + + @Override + public List selectListByNumber(String number) { + QueryWrapper detailsDOQueryWrapper = new QueryWrapper<>(); + detailsDOQueryWrapper.eq("number", number); + detailsDOQueryWrapper.eq("available", "TRUE"); + List maintenanceNumber = deviceMaintenanceJobDetailMapper.selectList(detailsDOQueryWrapper); + for(DeviceMaintenanceJobDetailDO en:maintenanceNumber){ + StringBuilder names = new StringBuilder(); + if(!"".equals(en.getMaintenances())&& en.getMaintenances()!=null){ + String[] split = en.getMaintenances().split(","); + for(int i = 0; i < split.length; i++) { + AdminUserRespDTO user = userApi.getUser(Long.parseLong(split[i])); + if (names.length() > 0) { + names.append(", "); + } + String name = user.getNickname(); + names.append(name); + } + en.setMaintenancesName(names.toString()); + } + List> list = deviceMaintenanceJobDetailItemMapper.selectListById(en.getId()); +// StringBuilder sb = new StringBuilder(); +// for(Map map:list){ +// if (sb.length() > 0) { +// sb.append(", "); +// } +// String name = map.get("name").toString(); +// String qty = map.get("qty").toString(); +// sb.append(name+":"+qty); +// } + en.setItems(list); + } + return maintenanceNumber; + } + + @Override + public PageResult getDeviceMaintenanceDetailPage(DeviceMaintenanceJobDetailPageReqVO pageReqVO) { + PageResult maintenanceNumber = deviceMaintenanceJobDetailMapper.selectPage(pageReqVO); + for(DeviceMaintenanceJobDetailDO en:maintenanceNumber.getList()){ + StringBuilder names = new StringBuilder(); + if(!"".equals(en.getMaintenances())&& en.getMaintenances()!=null){ + String[] split = en.getMaintenances().split(","); + for(int i = 0; i < split.length; i++) { + AdminUserRespDTO user = userApi.getUser(Long.parseLong(split[i])); + if (names.length() > 0) { + names.append(", "); + } + String name = user.getNickname(); + names.append(name); + } + en.setMaintenancesName(names.toString()); + } + List> list = deviceMaintenanceJobDetailItemMapper.selectListById(en.getId()); +// StringBuilder sb = new StringBuilder(); +// for(Map map:list){ +// if (sb.length() > 0) { +// sb.append(", "); +// } +// String name = map.get("name").toString(); +// String qty = map.get("qty").toString(); +// sb.append(name+":"+qty); +// } + en.setItemNumbers(list); + } + return maintenanceNumber; + + //return deviceMaintenanceDetailMapper.selectPage(pageReqVO); + } + + @Override + public List getDeviceMaintenanceDetailList(DeviceMaintenanceJobDetailExportReqVO exportReqVO) { + return deviceMaintenanceJobDetailMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceMaintenanceDetailList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_MAINTENANCE_DETAIL_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceMaintenanceDetailDO obj = deviceMaintenanceDetailMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceMaintenanceDetailMapper.insert(DeviceMaintenanceDetailConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceMaintenanceDetailDO deviceMaintenanceDetailDO = DeviceMaintenanceDetailConvert.INSTANCE.convert(item); +// deviceMaintenanceDetailDO.setId(obj.getId()); +// deviceMaintenanceDetailMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobMainService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobMainService.java new file mode 100644 index 0000000..1e02836 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobMainService.java @@ -0,0 +1,169 @@ +package com.win.module.eam.service.moldmaintenancejob; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 维修工单主 Service 接口 + * + * @author 超级管理员 + */ +public interface MoldMaintenanceJobMainService { + + /** + * 创建维修工单主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintenanceMain(@Valid DeviceMaintenanceJobMainCreateReqVO createReqVO); + + /** + * pc创建维修工单主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintenanceMainPC(@Valid DeviceMaintenanceJobMainCreateReqVO createReqVO); + + /** + * 更新维修工单主 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceMaintenanceMain(@Valid DeviceMaintenanceJobMainUpdateReqVO updateReqVO); + + /** + * 删除维修工单主 + * + * @param id 编号 + */ + Integer deleteDeviceMaintenanceMain(Long id); + + /** + * 获得维修工单主 + * + * @param id 编号 + * @return 维修工单主 + */ + DeviceMaintenanceJobMainDO getDeviceMaintenanceMain(Long id); + + /** + * 获得维修工单主列表 + * + * @param ids 编号 + * @return 维修工单主列表 + */ + List getDeviceMaintenanceMainList(Collection ids); + + List> getDictList(String type); + + /** + * 获得维修工单主分页 + * + * @param pageReqVO 分页查询 + * @return 维修工单主分页 + */ + PageResult getDeviceMaintenanceMainPage(DeviceMaintenanceJobMainPageReqVO pageReqVO); + + + /** + * 获得维修工单主分页 + * + * @param conditions 分页查询 + * @return 维修工单主分页 + */ + PageResult getDeviceMaintenanceMainSenior(CustomConditions conditions); + + + /** + * 获得维修工单主列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 维修工单主列表 + */ + List getDeviceMaintenanceMainList(DeviceMaintenanceJobMainExportReqVO exportReqVO); + + /** + * 导入维修工单主主信息 + * + * @param datas 导入维修工单主主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceMaintenanceMainList(List datas, Integer mode, boolean updatePart); + + /** + * 更改工单主表状态 + * @param request_number 申请工单号 撤回操作 + * @param id 工单主表可以做 + * @param status 工单主表状态枚举 + * @return + */ + int updateStatus(String request_number,Long id,String status); + + /** + * 维修工单转办 + * @param deviceNumber 设备或模具号 + * @param receiverType 转后类型 + * @param receiverUserId 转后userId + * @param id id + * @return + */ + int turnTo(String deviceNumber,Long id,String receiverType,Long receiverUserId,String status); + + /** + *维修工单接单 + * @param id 工单id + * @return + */ + int orderClick(Long id); + /** + *维修工单点击完成 + * @param id 工单id + * @param result 结果临时合还是已完成 + * @return + */ + int orderClickFinish(Long id,String result); + /** + *维修工单报修人确认 + * @param id 工单id + * @param content 内容 + * @param result 通过还是驳回 + * @return + */ + int orderClickConfirm(Long id,String result,String content); + /** + *维修工单工程师验证 + * @param id 工单id + * @param status 当前状态 + * @param content 内容 + * @return + */ + int orderClickVerify(Long id,String status,String content); + + /** + * 根据申请号删除工单 + * @param request_number 申请工单号 撤回操作 + * @return + */ + int deleteStatus(String request_number); + + PageResult getAppPage(DeviceMaintenanceJobMainPageReqVO pageReqVO); + + DeviceMaintenanceJobMainDO getAppByNumber(String number); + + /** + * 获取维修工单列表 + * @return + */ + List> getList(String type); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobMainServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobMainServiceImpl.java new file mode 100644 index 0000000..6bd2db0 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmaintenancejob/MoldMaintenanceJobMainServiceImpl.java @@ -0,0 +1,849 @@ +package com.win.module.eam.service.moldmaintenancejob; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.controller.uniapppushmessage.vo.UniappPushMessageRespVO; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobDetailConvert; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobMainConvert; +import com.win.module.eam.dal.dataobject.attachmentfile.AttachmentFileDO; +import com.win.module.eam.dal.dataobject.classtype.ClassTypeDO; +import com.win.module.eam.dal.dataobject.deviceaccounts.DeviceAccountsDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailItemDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.dal.dataobject.devicerepairrequest.DeviceRepairRequestDO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.dataobject.maintenanceturnto.MaintenanceTurntoDO; +import com.win.module.eam.dal.dataobject.moldaccounts.MoldAccountsDO; +import com.win.module.eam.dal.mysql.classtype.ClassTypeMapper; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailItemMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobMainMapper; +import com.win.module.eam.dal.mysql.devicerepairrequest.DeviceRepairRequestMapper; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.eam.dal.mysql.maintenanceturnto.MaintenanceTurntoMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.eam.service.attachmentfile.AttachmentFileService; +import com.win.module.eam.service.deviceaccounts.DeviceAccountsService; +import com.win.module.eam.service.moldaccounts.MoldAccountsService; +import com.win.module.eam.service.moldrepairrequest.MoldRepairRequestService; +import com.win.module.eam.service.uniapppushmessage.UniappPushMessageService; +import com.win.module.system.api.dept.DeptApi; +import com.win.module.system.api.dept.PostApi; +import com.win.module.system.api.mail.MailSendApi; +import com.win.module.system.api.mail.dto.MailSendSingleToUserReqDTO; +import com.win.module.system.api.permission.PermissionApi; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.api.user.dto.AdminUserRespExpandDTO; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +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 java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +import static cn.hutool.log.StaticLog.info; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 维修工单主 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MoldMaintenanceJobMainServiceImpl implements MoldMaintenanceJobMainService { + + @Resource + private DeviceMaintenanceJobMainMapper deviceMaintenanceJobMainMapper; + + @Resource + private DeviceRepairRequestMapper deviceRepairRequestMapper; + @Lazy + @Resource + private MoldRepairRequestService moldRepairRequestService; + + + @Resource + private MaintenanceTurntoMapper maintenanceTurntoMapper; + @Resource + private SerialNumberApi serialNumberApi; + + @Resource + private AdminUserApi userApi; + + @Resource + private DeptApi deptApi; + + @Resource + private PostApi postApi; + + @Resource + private DeviceMaintenanceJobDetailMapper deviceMaintenanceJobDetailMapper; + @Resource + DeviceMaintenanceJobDetailItemMapper deviceMaintenanceJobDetailItemMapper; + + @Resource + ItemMapper itemMapper; + + @Resource + private MoldAccountsMapper moldAccountsMapper; + + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + + @Resource + private AttachmentFileService attachmentFileService; + + @Resource + private DeviceAccountsService deviceAccountsService; + + @Resource + private MoldAccountsService moldAccountsService; + + @Resource + private MailSendApi mailSendApi; + + @Resource + private PermissionApi permissionApi; + @Resource + private AdminUserApi adminUserApi; + + @Resource + private UniappPushMessageService uniappPushMessageService; + + @Resource + private ClassTypeMapper classTypeMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDeviceMaintenanceMain(DeviceMaintenanceJobMainCreateReqVO createReqVO) { + // 插入 + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + DeviceMaintenanceJobMainDO deviceMaintenanceMain = DeviceMaintenanceJobMainConvert.INSTANCE.convert(createReqVO); + String number = serialNumberApi.generateCode(RuleCodeEnum.WEI_XIU_ORDER.getCode()); + deviceMaintenanceMain.setNumber(number); + if(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode().equals(deviceMaintenanceMain.getStatus())){//手动创建的是已接单 + //通过controller手动创建工单直接直接已接单 + deviceMaintenanceMain.setReceivingTime(LocalDateTime.now()); + deviceMaintenanceMain.setDeptId(user.getDeptId()); + }else{ + deviceMaintenanceMain.setApplyer(getLoginUserId()); + deviceMaintenanceMain.setDeptId(Long.parseLong(createReqVO.getFactoryAreaNumber())); + } + + int i = deviceMaintenanceJobMainMapper.insert(deviceMaintenanceMain); + + //添加维修工单的设备模具需要更改维修状态为1维修中 + //更新设备模具状态 + if(createReqVO.getType().equals("MOLD")){ + MoldAccountsDO moldAccountsDO = moldAccountsMapper.selectOne("number", createReqVO.getDeviceNumber(), "deleted", 0); + moldAccountsDO.setStatus("1"); + moldAccountsDO.setNumber(createReqVO.getDeviceNumber()); + moldAccountsMapper.updateById(moldAccountsDO); + }else{ + DeviceAccountsDO deviceAccountsDO = deviceAccountsMapper.selectOne("number", createReqVO.getDeviceNumber(), "deleted", 0); + deviceAccountsDO.setStatus("1"); + deviceAccountsDO.setNumber(createReqVO.getDeviceNumber()); + deviceAccountsMapper.updateById(deviceAccountsDO); + } + if(!OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode().equals(deviceMaintenanceMain.getStatus())){//非手动创建的是从报修走的 + //发送邮件 + try { + sendEmails(deviceMaintenanceMain,0); + } catch (Exception e) { + info("发送邮件异常:{}",e); + } + } + try { + UniappPushMessageRespVO respVO = new UniappPushMessageRespVO(); + respVO.setType(createReqVO.getType()); + respVO.setStatus("0"); + respVO.setNumber(number); + respVO.setFactoryAreaNumber(createReqVO.getFactoryAreaNumber()); + respVO.setType(createReqVO.getType()); + uniappPushMessageService.uniappSend(respVO); + } catch (Exception e) { + info("手机消息推送异常:{}",e); + } + // 返回 + return deviceMaintenanceMain.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDeviceMaintenanceMainPC(DeviceMaintenanceJobMainCreateReqVO createReqVO) { + // 插入 + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + DeviceMaintenanceJobMainDO deviceMaintenanceMain = DeviceMaintenanceJobMainConvert.INSTANCE.convert(createReqVO); + String number = serialNumberApi.generateCode(RuleCodeEnum.WEI_XIU_ORDER.getCode()); + deviceMaintenanceMain.setNumber(number); + deviceMaintenanceMain.setDeptId(user.getDeptId()); + if(deviceMaintenanceMain.getStatus()==null || "".equals(deviceMaintenanceMain.getStatus())){//状态为空说明手动创建工单直接已接单 + //通过controller手动创建工单直接直接已接单 + deviceMaintenanceMain.setMaintenance(getLoginUserId());//添加接单人 + deviceMaintenanceMain.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode());//添加已接单 + deviceMaintenanceMain.setReceivingTime(LocalDateTime.now()); + deviceMaintenanceMain.setDeptId(Long.parseLong(createReqVO.getFactoryAreaNumber())); + deviceMaintenanceJobMainMapper.insert(deviceMaintenanceMain); + if(createReqVO.getSubList()!=null&&!"".equals(createReqVO.getSubList())){//PC端传入 + //主子表 + List subDOList = DeviceMaintenanceJobDetailConvert.INSTANCE.convertList03(createReqVO.getSubList()); + for (DeviceMaintenanceJobDetailDO deviceMaintenanceDetail : subDOList) { + deviceMaintenanceDetail.setNumber(number); + deviceMaintenanceDetail.setMasterId(deviceMaintenanceMain.getId()); + //插入子项数据 + int id = deviceMaintenanceJobDetailMapper.insert(deviceMaintenanceDetail); + List> itemList = deviceMaintenanceDetail.getItemNumbers();//备件号集合 + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(itemDOS!=null){ + String numbers = itemDOS.get(0).getNumber(); + DeviceMaintenanceJobDetailItemDO dos = new DeviceMaintenanceJobDetailItemDO(); + dos.setItemNumber(numbers); + dos.setMasterId(deviceMaintenanceDetail.getId()); + dos.setNumber(deviceMaintenanceDetail.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + deviceMaintenanceJobDetailItemMapper.insert(dos); + } + } + } + } + } + }else{ + deviceMaintenanceJobMainMapper.insert(deviceMaintenanceMain); + } + if(deviceMaintenanceMain.getId()!=null){ + //更新设备模具状态 + if(BasicStatusEnum.BASIC_DEVICE.getCode().equals(createReqVO.getType()) ){ + deviceAccountsService.updateDeviceAccountsStatus(createReqVO.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_1.getCode()); + }else if(BasicStatusEnum.BASIC_MOLD.getCode().equals(createReqVO.getType()) ){ + moldAccountsService.updateMoldAccountsStatus(createReqVO.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_1.getCode()); + } + } +// else{//报修申请进来的待接单状态 +// deviceMaintenanceMain.setStatus(OrderStatusEnum.PEND_ORDER_STATUS.getCode());//待接单 +// } +////发送邮件 +// try { +// sendEmails(deviceMaintenanceMain,0); +// } catch (Exception e) { +// info("发送邮件异常:{}",e); +// } + try { + UniappPushMessageRespVO respVO = new UniappPushMessageRespVO(); + respVO.setType(createReqVO.getType()); + respVO.setStatus("0"); + respVO.setNumber(number); + respVO.setFactoryAreaNumber(createReqVO.getFactoryAreaNumber()); + respVO.setType(createReqVO.getType()); + uniappPushMessageService.uniappSend(respVO); + } catch (Exception e) { + info("手机消息推送异常:{}",e); + } + // 返回 + return deviceMaintenanceMain.getId(); + } + + @Override + public Integer updateDeviceMaintenanceMain(DeviceMaintenanceJobMainUpdateReqVO updateReqVO) { + // 校验存在 + // 更新 + DeviceMaintenanceJobMainDO maintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectById(updateReqVO.getId()); + DeviceMaintenanceJobMainDO updateObj = DeviceMaintenanceJobMainConvert.INSTANCE.convert(updateReqVO); + updateObj.setMaintenance(maintenanceJobMainDO.getMaintenance()); + updateObj.setReceivingTime(maintenanceJobMainDO.getReceivingTime()); + return deviceMaintenanceJobMainMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceMaintenanceMain(Long id) { + // 校验存在 + validateDeviceMaintenanceMainExists(id); + // 删除 + return deviceMaintenanceJobMainMapper.deleteById(id); + } + + private void validateDeviceMaintenanceMainExists(Long id) { + if (deviceMaintenanceJobMainMapper.selectById(id) == null) { + throw exception(WEI_XIU_NOT_EXISTS); + } + } + + @Override + public DeviceMaintenanceJobMainDO getDeviceMaintenanceMain(Long id) { + return deviceMaintenanceJobMainMapper.selectById(id); + } + + @Override + public List getDeviceMaintenanceMainList(Collection ids) { + return deviceMaintenanceJobMainMapper.selectBatchIds(ids); + } + + @Override + public List> getDictList(String type) { + return deviceMaintenanceJobMainMapper.getDictList(type); + } + + @Override + public PageResult getDeviceMaintenanceMainPage(DeviceMaintenanceJobMainPageReqVO pageReqVO) { + PageResult deviceMaintenanceJobMainDOPageResult = deviceMaintenanceJobMainMapper.selectPage(pageReqVO); + List deviceRepairList = deviceMaintenanceJobMainDOPageResult.getList(); + List masterIdList = deviceRepairList.stream().map(DeviceMaintenanceJobMainDO::getId).collect(Collectors.toList()); + List deviceMaintenanceJobDetailList = deviceMaintenanceJobDetailMapper.selectByMasterIds(masterIdList); + deviceRepairList.stream().forEach(deviceRepair -> { + if(deviceRepair.getRequestNumber() != null){ + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setFuncCode("request_repair"); + attachmentFileDO.setNumber(deviceRepair.getRequestNumber()); + List list = attachmentFileService.getAttachmentFilePathList(attachmentFileDO); + // 设置filePathList字段 + if(list!= null && list.size() > 0){ + deviceRepair.setFilePathList(list); + } + // 根据requestNumber查询记录,并设置declarer + DeviceRepairRequestDO order = moldRepairRequestService.getOrderByNumber(deviceRepair.getRequestNumber()); + if(order != null){ + deviceRepair.setDeclarer(order.getDeclarer()); + } + } + // 使用Stream API来检查是否存在符合条件的记录 + Optional matchingDetail = deviceMaintenanceJobDetailList.stream() + .filter(deviceMaintenanceJobDetail -> deviceRepair.getId().equals(deviceMaintenanceJobDetail.getMasterId())) + .findAny(); + // 如果找到了至少一条符合条件的记录,返回true + deviceRepair.setHasDetails(matchingDetail.isPresent()); + }); + return deviceMaintenanceJobMainDOPageResult; + } + + @Override + public PageResult getDeviceMaintenanceMainSenior(CustomConditions conditions) { + PageResult deviceMaintenanceJobMainDOPageResult = deviceMaintenanceJobMainMapper.selectSenior(conditions); + List deviceRepairList = deviceMaintenanceJobMainDOPageResult.getList(); + List masterIdList = deviceRepairList.stream().map(DeviceMaintenanceJobMainDO::getId).collect(Collectors.toList()); + List deviceMaintenanceJobDetailList = deviceMaintenanceJobDetailMapper.selectByMasterIds(masterIdList); + deviceRepairList.stream().forEach(deviceRepair -> { + if(deviceRepair.getRequestNumber() != null){ + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setFuncCode("request_repair"); + attachmentFileDO.setNumber(deviceRepair.getRequestNumber()); + List list = attachmentFileService.getAttachmentFilePathList(attachmentFileDO); + // 设置filePathList字段 + if(list!= null && list.size() > 0){ + deviceRepair.setFilePathList(list); + } + // 根据requestNumber查询记录,并设置declarer + DeviceRepairRequestDO order = moldRepairRequestService.getOrderByNumber(deviceRepair.getRequestNumber()); + if(order != null){ + deviceRepair.setDeclarer(order.getDeclarer()); + } + } + // 使用Stream API来检查是否存在符合条件的记录 + Optional matchingDetail = deviceMaintenanceJobDetailList.stream() + .filter(deviceMaintenanceJobDetail -> deviceRepair.getId().equals(deviceMaintenanceJobDetail.getMasterId())) + .findAny(); + // 如果找到了至少一条符合条件的记录,返回true + deviceRepair.setHasDetails(matchingDetail.isPresent()); + }); + return deviceMaintenanceJobMainDOPageResult; + } + + @Override + public List getDeviceMaintenanceMainList(DeviceMaintenanceJobMainExportReqVO exportReqVO) { + return deviceMaintenanceJobMainMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceMaintenanceMainList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_MAINTENANCE_MAIN_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceMaintenanceMainDO obj = deviceMaintenanceMainMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceMaintenanceMainMapper.insert(DeviceMaintenanceMainConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceMaintenanceMainDO deviceMaintenanceMainDO = DeviceMaintenanceMainConvert.INSTANCE.convert(item); +// deviceMaintenanceMainDO.setId(obj.getId()); +// deviceMaintenanceMainMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public int updateStatus(String request_number, Long id, String status) { + return deviceMaintenanceJobMainMapper.updateStatus(request_number, id, status); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int turnTo(String deviceNumber,Long id,String receiverType,Long receiverUserId,String status) { + DeviceMaintenanceJobMainDO Do = deviceMaintenanceJobMainMapper.selectById(id); + String oldtype = Do.getType(); + String olddeviceNumber = Do.getDeviceNumber(); + if(!OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode().equals(Do.getStatus())){//已接单状态才能转办 + throw exception(WEI_XIU_NOT_ZUANBAN); + } +// if(Do.getType().equals(receiverType)){//同种类型不能转办 +// throw exception(WEI_XIU_NOT_TYPE_ZUANBAN); +// } + Long turnToUserId = Do.getMaintenance(); + String deviceNumberold = Do.getDeviceNumber(); + String factoryAreaNumber = Do.getFactoryAreaNumber(); + String turnToType = Do.getType(); + Do.setId(id); + Do.setDeviceNumber(deviceNumber); + Do.setType(receiverType); + if(!"1".equals(status)){//非人员转办的时候是待接单状态 + Do.setStatus(OrderStatusEnum.PEND_ORDER_STATUS.getCode());//变成待接单状态 + Do.setMaintenance(null); + Do.setReceivingTime(null); + }else{ + Do.setMaintenance(receiverUserId);//接单人 + Do.setReceivingTime(LocalDateTime.now());//接单时间 + Do.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode());//变成已接单状态 + } + int i = deviceMaintenanceJobMainMapper.updateById(Do); + //更新报修单 + QueryWrapper objectQueryWrapper = new QueryWrapper<>(); + objectQueryWrapper.eq("number",Do.getRequestNumber()); + objectQueryWrapper.eq("result",OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + List list = deviceRepairRequestMapper.selectList(objectQueryWrapper); + if (list != null && list.size() > 0) { + DeviceRepairRequestDO deviceRepairRequestDO = list.get(0); + deviceRepairRequestDO.setResult(OrderStatusEnum.TRANSFERRED_STATUS.getCode()); + deviceRepairRequestMapper.updateById(deviceRepairRequestDO); + //添加一个新的报修单,单号形同状态不同,此状态应该是和维修工单同步 + deviceRepairRequestDO.setResult(Do.getStatus()); + deviceRepairRequestDO.setType(receiverType); + deviceRepairRequestDO.setId(null); + deviceRepairRequestDO.setDeviceNumber(deviceNumber); + deviceRepairRequestMapper.insert(deviceRepairRequestDO); + } + if(!"1".equals(status)){//设备转办更改状态 + //原报修设备修改更改状态为正常 + if(oldtype.equals("MOLD")){ + MoldAccountsDO moldAccountsDO = moldAccountsMapper.selectOne("number", olddeviceNumber, "deleted", 0); + moldAccountsDO.setStatus("0"); + moldAccountsMapper.updateById(moldAccountsDO); + }else{ + DeviceAccountsDO deviceAccountsDO = deviceAccountsMapper.selectOne("number", olddeviceNumber, "deleted", 0); + deviceAccountsDO.setStatus("0"); + deviceAccountsMapper.updateById(deviceAccountsDO); + } + //转办的设备更改状态为维修 + if(receiverType.equals("MOLD")){ + MoldAccountsDO moldAccountsDO = moldAccountsMapper.selectOne("number", deviceNumber, "deleted", 0); + moldAccountsDO.setStatus("1"); + moldAccountsMapper.updateById(moldAccountsDO); + }else{ + DeviceAccountsDO deviceAccountsDO = deviceAccountsMapper.selectOne("number", deviceNumber, "deleted", 0); + deviceAccountsDO.setStatus("1"); + deviceAccountsMapper.updateById(deviceAccountsDO); + } + } + //转办记录表 + MaintenanceTurntoDO turntoDO = new MaintenanceTurntoDO(); + turntoDO.setMaintenanceNumber(Do.getNumber()); + turntoDO.setDeviceNumberOld(deviceNumberold);//转前设备模具号 + turntoDO.setDeviceNumber(deviceNumber);//转后设备模具号 + turntoDO.setTurnToType(turnToType);//转前类型 + turntoDO.setReceiverType(receiverType);//转后类型 + turntoDO.setTurnToUserid(turnToUserId);//转前接单人 + turntoDO.setFactoryAreaNumber(factoryAreaNumber);//厂区号 + turntoDO.setReceiverUserid(receiverUserId);//转后接单人 + turntoDO.setFactoryAreaNumberOld(factoryAreaNumber); + turntoDO.setStatus(status); + int i1 = maintenanceTurntoMapper.insert(turntoDO); + return i1; + } + @Override + @Transactional(rollbackFor = Exception.class) + public int orderClick(Long id) { + DeviceMaintenanceJobMainDO Do = deviceMaintenanceJobMainMapper.selectById(id); + if (Do == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + Do.setReceivingTime(LocalDateTime.now()); + Do.setMaintenance(getLoginUserId());//接单人 + Do.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + int i = deviceMaintenanceJobMainMapper.updateById(Do); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", Do.getRequestNumber()); + queryWrapper.eq("result", OrderStatusEnum.PEND_ORDER_STATUS.getCode()); + List list = deviceRepairRequestMapper.selectList(queryWrapper); + if (list != null && list.size() > 0) { + DeviceRepairRequestDO deviceRepairRequestDO = list.get(0); + deviceRepairRequestDO.setResult(Do.getStatus()); + return deviceRepairRequestMapper.updateById(deviceRepairRequestDO); + } + return i; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int orderClickFinish(Long id, String result) { + DeviceMaintenanceJobMainDO Do = deviceMaintenanceJobMainMapper.selectById(id); + validateWC(id);//校验 + Do.setCompletionTime(LocalDateTime.now()); + Do.setStatus(OrderStatusEnum.COMPLETED_STATUS.getCode()); + Do.setResult(result); + deviceMaintenanceJobMainMapper.updateById(Do); + //点击完成需要修改设备模具状态为正常 + //更新设备模具需要更改维修状态为0正常 + String deviceNumber = Do.getDeviceNumber(); + MoldAccountsDO moldAccountsDO = moldAccountsMapper.selectOne("number", deviceNumber, "deleted", 0); + moldAccountsDO.setStatus("0"); + moldAccountsDO.setNumber(deviceNumber); + int i = moldAccountsMapper.updateById(moldAccountsDO); + if (Do.getRequestNumber() != null && !Do.getRequestNumber().isEmpty()) {//该维修工单来源于报修申请需要申请人确认 + //给申报人推送消息 + UniappPushMessageRespVO respVO = new UniappPushMessageRespVO(); + respVO.setType(Do.getType()); + respVO.setStatus("1"); + respVO.setNumber(deviceNumber); + respVO.setFactoryAreaNumber(Do.getFactoryAreaNumber()); + respVO.setType(Do.getType()); + respVO.setApplyer(Do.getApplyer()); + uniappPushMessageService.uniappSend(respVO); + } else {//工程师验证 + try { + sendEmails(Do, 1); + } catch (Exception e) { + info("发送邮件异常:{}", e); + } + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", Do.getRequestNumber()); + queryWrapper.eq("result", OrderStatusEnum.PEND_ORDER_STATUS.getCode()); + List list = deviceRepairRequestMapper.selectList(queryWrapper); + if (list != null && list.size() > 0) { + DeviceRepairRequestDO deviceRepairRequestDO = list.get(0); + deviceRepairRequestDO.setResult(Do.getStatus()); + return deviceRepairRequestMapper.updateById(deviceRepairRequestDO); + } + return i; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int orderClickConfirm(Long id,String result, String content) { + DeviceMaintenanceJobMainDO Do = deviceMaintenanceJobMainMapper.selectById(id); + validateSQ(id);//校验 + Do.setApplyTime(LocalDateTime.now()); + if (result == null || result.isEmpty()) { + throw exception(WEI_XIU_ORDER_APPLY_NOT_EMPTY); + } + if (OrderStatusEnum.APPLY_PASS_STATUS.getCode().equals(result)) {//申请人通过流程正常走 + Do.setStatus(result); + Do.setApplyContent(content); + Do.setApplyTime(LocalDateTime.now()); + try { + sendEmails(Do, 1); + } catch (Exception e) { + info("发送邮件异常:{}", e); + } + } else {// 申请人确认驳回需要重置维修工单以及报修工单为已接单状态(暂时申请人确认操作不需要留痕) + Do.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + Do.setApplyContent(content); + Do.setApplyTime(LocalDateTime.now()); + Do.setResult(""); + Do.setCompletionTime(null); + } + int i = deviceMaintenanceJobMainMapper.updateById(Do); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", Do.getRequestNumber()); + queryWrapper.eq("result", OrderStatusEnum.COMPLETED_STATUS.getCode()); + List list = deviceRepairRequestMapper.selectList(queryWrapper); + if (list != null && list.size() > 0) { + DeviceRepairRequestDO deviceRepairRequestDO = list.get(0); + deviceRepairRequestDO.setResult(Do.getStatus()); + return deviceRepairRequestMapper.updateById(deviceRepairRequestDO); + } + return i; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int orderClickVerify(Long id,String status, String content) { + DeviceMaintenanceJobMainDO Do = deviceMaintenanceJobMainMapper.selectById(id); + validateYZ(id);//验证 + Do.setVerifyTime(LocalDateTime.now()); + Do.setVerifyer(getLoginUserId());//验证人 + Do.setVerifyContent(content); + Do.setStatus(OrderStatusEnum.VERIFIED_STATUS.getCode()); + int i = deviceMaintenanceJobMainMapper.updateById(Do); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", Do.getRequestNumber()); + queryWrapper.eq("result", status); + List list = deviceRepairRequestMapper.selectList(queryWrapper); + if (list != null && list.size() > 0) { + DeviceRepairRequestDO deviceRepairRequestDO = list.get(0); + deviceRepairRequestDO.setResult(Do.getStatus()); + return deviceRepairRequestMapper.updateById(deviceRepairRequestDO); + } + return i; + } + + + @Override + public int deleteStatus(String request_number) { + return deviceMaintenanceJobMainMapper.deleteStatus(request_number); + } + + @Override + public PageResult getAppPage(DeviceMaintenanceJobMainPageReqVO pageReqVO) { + pageReqVO.setUserId(getLoginUserId().toString()); + Long factoryAreaNumber = userApi.getUser(getLoginUserId()).getDeptId();//厂区号查询当前厂区下的数据 + pageReqVO.setFactoryAreaNumber(factoryAreaNumber.toString()); + pageReqVO.setClassType("MOLD"); + String b = classTypeMapper.getIdentity("MOLD"); + if (b.equals("2")) { + throw exception(WORKER_ENGINEER_IS_NOT); + } + pageReqVO.setStandType(b); + if ("1".equals(pageReqVO.getFlag())) {//flag 0 首页进入 1我的进入 + //我的里面都是获取的是当前人已经完成的单子 + pageReqVO.setUserId(getLoginUserId().toString()); + IPage pageInfo = deviceMaintenanceJobMainMapper.getAppPage1(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for(DeviceMaintenanceJobMainDO en :pageInfo.getRecords()){ + String deviceNumber = en.getDeviceNumber(); + String type = en.getType(); + if("MOLD".equals(type)){//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + }else{//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + } + + } + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + }if("2".equals(pageReqVO.getFlag())){//报修人确认列表 + IPage pageInfo = deviceMaintenanceJobMainMapper.getAppPage2(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } else { + //首页进入是获取未接单 已接单的单子 + pageReqVO.setFlag("0"); + } + IPage pageInfo = deviceMaintenanceJobMainMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + + @Override + public DeviceMaintenanceJobMainDO getAppByNumber(String number) { + DeviceMaintenanceJobMainDO en = deviceMaintenanceJobMainMapper.getAppByNumber(number); + if (en != null) { + String deviceNumber = en.getDeviceNumber(); + String type = en.getType(); + if("MOLD".equals(type)){//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + }else{//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + } + + return en; + }else{ + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + } + + @Override + public List> getList(String type) { + return deviceMaintenanceJobMainMapper.getList(type); + } + + /** + * 校验能否点击待接单 + * + * @param id + */ + private void validateJD(Long id, String number) { + if (deviceMaintenanceJobMainMapper.selectById(id) == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + DeviceMaintenanceJobMainRespVO reqVO = new DeviceMaintenanceJobMainRespVO(); + reqVO.setNumber(number); + reqVO.setStatus(OrderStatusEnum.PEND_ORDER_STATUS.getCode()); + Long l = deviceMaintenanceJobMainMapper.selectCountByScree(reqVO); + if (l <= 0) {//订单已被接单 + throw exception(WEI_XIU_NOT_DJ); + } + if (!permissionApi.BooleanEngineer() && !permissionApi.BooleanWorker()) { + throw exception(WEI_XIU_NOT_WORKER); + } + + } + + /** + * 校验能否点击完成 + * + * @param id + */ + private void validateWC(Long id) { + long size = 1L; // 声明一个long类型的变量并赋值为10 + DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectById(id); + if (deviceMaintenanceJobMainDO == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + DeviceMaintenanceJobMainRespVO reqVO = new DeviceMaintenanceJobMainRespVO(); + long loginUserId = getLoginUserId(); + long maintenance = deviceMaintenanceJobMainDO.getMaintenance(); + if (loginUserId != maintenance) {//接单人和维修人相等才能点击完成 + throw exception(WEI_XIU_NOT_WC); + } + reqVO.setNumber(deviceMaintenanceJobMainDO.getNumber()); + reqVO.setMaintenance(getLoginUserId()); + reqVO.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + //reqVo.set + Long l = deviceMaintenanceJobMainMapper.selectCountByScree(reqVO); + if (l < size) {//当前状态非待接单 + throw exception(JIAN_XIU_NOT_PENDING); + } + } + + /** + * 校验能否点击验证 + * + * @param id + */ + private void validateYZ(Long id) { + long size = 1L; // 声明一个long类型的变量并赋值为10 + DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectById(id); + if (deviceMaintenanceJobMainDO == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + if (deviceMaintenanceJobMainDO.getRequestNumber() != null && !deviceMaintenanceJobMainDO.getRequestNumber().isEmpty()) {//需要申请人确认通过才能验证 + DeviceMaintenanceJobMainRespVO reqVO = new DeviceMaintenanceJobMainRespVO(); + reqVO.setNumber(deviceMaintenanceJobMainDO.getNumber()); + reqVO.setStatus(OrderStatusEnum.APPLY_PASS_STATUS.getCode()); + //reqVo.set + Long l = deviceMaintenanceJobMainMapper.selectCountByScree(reqVO); + if (l < size) {//当前人无法验证 + throw exception(WEI_XIU_NOT_YZ); + } + } else {//维修工单手动创建的没有申请人节点 + DeviceMaintenanceJobMainRespVO reqVO = new DeviceMaintenanceJobMainRespVO(); + reqVO.setNumber(deviceMaintenanceJobMainDO.getNumber()); + reqVO.setStatus(OrderStatusEnum.COMPLETED_STATUS.getCode()); + //reqVo.set + Long l = deviceMaintenanceJobMainMapper.selectCountByScree(reqVO); + if (l < size) {//当前人无法验证 + throw exception(WEI_XIU_NOT_YZ); + } + + } + + } + + /** + * 申请人能否点击 + * + * @param id + */ + private void validateSQ(Long id) { + long size = 1L; // 声明一个long类型的变量并赋值为10 + DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectById(id); + if (deviceMaintenanceJobMainDO == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + Map detailsByNumber = deviceRepairRequestMapper.getDetailsByNumber(deviceMaintenanceJobMainDO.getRequestNumber(), deviceMaintenanceJobMainDO.getType()); + if (detailsByNumber == null || detailsByNumber.isEmpty()) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS_APPLY); + } else { + long loginUserId = getLoginUserId(); + long applyer = deviceMaintenanceJobMainDO.getApplyer(); + if (applyer != loginUserId) {//申请人与当前操作人不符合 + throw exception(WEI_XIU_ORDER_APPLY_NOT_CONFORM); + } + } + } + + /** + * 维修工单发送邮件 + */ + private void sendEmails(DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO,int flag){ + String type = deviceMaintenanceJobMainDO.getType(); + if (flag == 0) {//走报修创建的未接单的维修工单,待接单邮件提醒 + List userBeanList = classTypeMapper.JudgeIdentity(null, type, "1", deviceMaintenanceJobMainDO.getFactoryAreaNumber()); + userBeanList.stream().forEach(item -> { + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getUserId())); + mailSendSingleToUserReqDTO.setTemplateCode("request-repair-template"); + Map params = new HashMap<>(); + params.put("typeName", "模具"); + params.put("number", deviceMaintenanceJobMainDO.getNumber()); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + } catch (RuntimeException e) { + info("工单编号为" + deviceMaintenanceJobMainDO.getNumber() + "的名为:" + deviceMaintenanceJobMainDO.getDescribes() + "的工单给" + item.getNickname() + "发送的邮件通知失败:{}", e); + } + }); + } else {//维修工单点击完成后需要验证的邮件提醒 + List userBeanList = classTypeMapper.JudgeIdentity(null, type, "1", deviceMaintenanceJobMainDO.getFactoryAreaNumber()); + userBeanList.stream().forEach(item -> { + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getUserId())); + mailSendSingleToUserReqDTO.setTemplateCode("job-maintenance-template"); + Map params = new HashMap<>(); + params.put("typeName","模具"); + params.put("name", item.getNickname()); + params.put("number", deviceMaintenanceJobMainDO.getNumber()); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + } catch (RuntimeException e) { + info("工单编号为" + deviceMaintenanceJobMainDO.getNumber() + "的名为:" + deviceMaintenanceJobMainDO.getDescribes() + "的工单给" + item.getNickname() + "发送的邮件通知失败:{}", e); + } + }); + } + } + +} \ No newline at end of file diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmilestone/MoldMilestoneService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmilestone/MoldMilestoneService.java new file mode 100644 index 0000000..b7a0fc4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmilestone/MoldMilestoneService.java @@ -0,0 +1,93 @@ +package com.win.module.eam.service.moldmilestone; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.moldmilestone.vo.*; +import com.win.module.eam.dal.dataobject.moldmilestone.MoldMilestoneDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 模具里程碑 Service 接口 + * + * @author 超级管理员 + */ +public interface MoldMilestoneService { + + /** + * 创建模具里程碑 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMoldMilestone(@Valid MoldMilestoneCreateReqVO createReqVO); + + /** + * 更新模具里程碑 + * + * @param updateReqVO 更新信息 + */ + Integer updateMoldMilestone(@Valid MoldMilestoneUpdateReqVO updateReqVO); + + /** + * 删除模具里程碑 + * + * @param id 编号 + */ + Integer deleteMoldMilestone(Long id); + + /** + * 获得模具里程碑 + * + * @param id 编号 + * @return 模具里程碑 + */ + MoldMilestoneDO getMoldMilestone(Long id); + + /** + * 获得模具里程碑列表 + * + * @param ids 编号 + * @return 模具里程碑列表 + */ + List getMoldMilestoneList(Collection ids); + + /** + * 获得模具里程碑分页 + * + * @param pageReqVO 分页查询 + * @return 模具里程碑分页 + */ + PageResult getMoldMilestonePage(MoldMilestonePageReqVO pageReqVO); + + /** + * 获得模具里程碑列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 模具里程碑列表 + */ + List getMoldMilestoneList(MoldMilestoneExportReqVO exportReqVO); + + /** + * 导入模具里程碑主信息 + * + * @param datas 导入模具里程碑主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + List importMoldMilestoneList(List datas, Integer mode, boolean updatePart); + + /** + * 新增模具里程碑主信息 + * + * @param moldNumber 模具编号 + */ + void createBatchByMoldNumber(String moldNumber); + + /** + * 每天定时刷里程碑文件通知邮件 + */ + void createMoldMilestoneJob(); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmilestone/MoldMilestoneServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmilestone/MoldMilestoneServiceImpl.java new file mode 100644 index 0000000..f7f5504 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldmilestone/MoldMilestoneServiceImpl.java @@ -0,0 +1,199 @@ +package com.win.module.eam.service.moldmilestone; + +import cn.hutool.core.date.LocalDateTimeUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.moldmilestone.vo.*; +import com.win.module.eam.convert.moldmilestone.MoldMilestoneConvert; +import com.win.module.eam.dal.dataobject.moldmilestone.MoldMilestoneDO; +import com.win.module.eam.dal.mysql.moldmilestone.MoldMilestoneMapper; +import com.win.module.system.api.mail.MailSendApi; +import com.win.module.system.api.mail.dto.MailSendSingleToUserReqDTO; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.api.user.dto.AdminUserRespExpandDTO; +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.util.*; + +import static cn.hutool.log.StaticLog.info; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.eam.enums.ErrorCodeConstants.MOLD_MILESTONE_NOT_EXISTS; + +/** + * 模具里程碑 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MoldMilestoneServiceImpl implements MoldMilestoneService { + + @Resource + private MoldMilestoneMapper moldMilestoneMapper; + @Resource + private AdminUserApi userApi; + + @Resource + private MailSendApi mailSendApi; + + @Override + public Long createMoldMilestone(MoldMilestoneCreateReqVO createReqVO) { + // 插入 + MoldMilestoneDO moldMilestone = MoldMilestoneConvert.INSTANCE.convert(createReqVO); + moldMilestoneMapper.insert(moldMilestone); + // 返回 + return moldMilestone.getId(); + } + + @Override + public Integer updateMoldMilestone(MoldMilestoneUpdateReqVO updateReqVO) { + // 校验存在 + validateMoldMilestoneExists(updateReqVO.getId()); + // 更新 + MoldMilestoneDO updateObj = MoldMilestoneConvert.INSTANCE.convert(updateReqVO); + return moldMilestoneMapper.updateById(updateObj); + } + + @Override + public Integer deleteMoldMilestone(Long id) { + // 校验存在 + validateMoldMilestoneExists(id); + // 删除 + return moldMilestoneMapper.deleteById(id); + } + + private void validateMoldMilestoneExists(Long id) { + if (moldMilestoneMapper.selectById(id) == null) { + throw exception(MOLD_MILESTONE_NOT_EXISTS); + } + } + + @Override + public MoldMilestoneDO getMoldMilestone(Long id) { + return moldMilestoneMapper.selectById(id); + } + + @Override + public List getMoldMilestoneList(Collection ids) { + return moldMilestoneMapper.selectBatchIds(ids); + } + + @Override + public PageResult getMoldMilestonePage(MoldMilestonePageReqVO pageReqVO) { + return moldMilestoneMapper.selectPage(pageReqVO); + } + + @Override + public List getMoldMilestoneList(MoldMilestoneExportReqVO exportReqVO) { + return moldMilestoneMapper.selectList(exportReqVO); + } + + @Override + public List importMoldMilestoneList(List datas, Integer mode, boolean updatePart) { +// if (CollUtil.isEmpty(datas)) { +// throw exception(MOLD_MILESTONE_IMPORT_LIST_IS_EMPTY); +// } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// MoldMilestoneDO obj = moldMilestoneMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// moldMilestoneMapper.insert(MoldMilestoneConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// MoldMilestoneDO moldMilestoneDO = MoldMilestoneConvert.INSTANCE.convert(item); +// moldMilestoneDO.setId(obj.getId()); +// moldMilestoneMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public void createBatchByMoldNumber(String moldNumber) { + List moldMilestoneDOS = new ArrayList<>(); + String[] milestoneStages = {"T0", "T1", "T2", "T3", "T4", "T5", "sop"}; + for (String milestoneStage : milestoneStages) { + MoldMilestoneDO moldMilestoneDO = new MoldMilestoneDO(); + moldMilestoneDO.setNumber(UUID.randomUUID().toString()); + moldMilestoneDO.setMoldNumber(moldNumber); + moldMilestoneDO.setMilestoneStage(milestoneStage); + moldMilestoneDOS.add(moldMilestoneDO); + } + + moldMilestoneMapper.insertBatch(moldMilestoneDOS); + } + + + @Override + public void createMoldMilestoneJob() { + LocalDate today = LocalDate.now(); + // 获取前两天的日期 + LocalDate twoDaysBefore = today.minusDays(2); + // 获取后两天的日期 + LocalDate twoDaysAfter = today.plusDays(2); + // 格式化输出 + String startDate = LocalDateTimeUtil.format(twoDaysBefore, "yyyy-MM-dd"); + String endDate = LocalDateTimeUtil.format(twoDaysAfter, "yyyy-MM-dd"); + List moldMilestoneDOS = moldMilestoneMapper.selectListByMilestoneDate(startDate, endDate); + //发送邮件 + try { + sendEmails(moldMilestoneDOS,twoDaysBefore,twoDaysAfter); + } catch (Exception e) { + info("发送邮件异常:{}", e); + } + } + + private void sendEmails(List moldMilestoneDOS,LocalDate startDate,LocalDate endDate) { + StringBuilder str = new StringBuilder(); + for (MoldMilestoneDO en : moldMilestoneDOS) { + String number = en.getMoldNumber(); + String name = en.getName(); + LocalDateTime date = en.getMilestoneDate(); + String time = LocalDateTimeUtil.format(date, "yyyy-MM-dd"); +// if(startDate.equals(date)){//里程碑日期过后两天 +// str.append(""); +// } +// if(endDate.equals(date)){//里程碑日期提前两天提醒 +// +// } + String stage = en.getMilestoneStage(); + str.append("

   模具名称("); + str.append(name); + str.append(")"); + str.append("模具编码("); + str.append(number); + str.append(")"); + str.append("里程碑阶段("); + str.append(stage); + str.append(")"); + str.append("日期("); + str.append(time); + str.append(")

"); + } + AdminUserRespExpandDTO adminUserRespExpandDTO = new AdminUserRespExpandDTO(); + adminUserRespExpandDTO.setCode(List.of("mold_Engineer_role")); + List userBeanList = userApi.selectByUserIdentity(adminUserRespExpandDTO); + userBeanList.stream().forEach(item -> { + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getId())); + mailSendSingleToUserReqDTO.setTemplateCode("record-spot-inspection-template"); + Map params = new HashMap<>(); + params.put("str", str.toString()); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + } catch (RuntimeException e) { + info("模具里程碑发送的邮件通知失败:{}", e); + } + }); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldrepairrequest/MoldRepairRequestService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldrepairrequest/MoldRepairRequestService.java new file mode 100644 index 0000000..d08abf7 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldrepairrequest/MoldRepairRequestService.java @@ -0,0 +1,113 @@ +package com.win.module.eam.service.moldrepairrequest; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicerepairrequest.vo.*; +import com.win.module.eam.dal.dataobject.devicerepairrequest.DeviceRepairRequestDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 报修申请 Service 接口 + * + * @author 超级管理员 + */ +public interface MoldRepairRequestService { + + /** + * 创建报修申请 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceRepair(@Valid DeviceRepairRequestRequestCreateReqVO createReqVO); + + /** + * 更新报修申请 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceRepair(@Valid DeviceRepairRequestRequestUpdateReqVO updateReqVO); + + /** + * 删除报修申请 + * + * @param id 编号 + */ + Integer deleteDeviceRepair(Long id); + + /** + * 删除报修申请 + * + * @param id 编号 + */ + Integer rejectedDeviceRepair(Long id); + + /** + * 获得报修申请 + * + * @param id 编号 + * @return 报修申请 + */ + DeviceRepairRequestDO getDeviceRepair(Long id); + + /** + * 获得报修申请列表 + * + * @param ids 编号 + * @return 报修申请列表 + */ + List getDeviceRepairList(Collection ids); + + /** + * 获得报修申请分页 + * + * @param pageReqVO 分页查询 + * @return 报修申请分页 + */ + PageResult getDeviceRepairPage(DeviceRepairRequestPageReqVO pageReqVO); + + /** + * 获得报修申请分页 + * + * @param conditions 分页查询 + * @return 报修申请分页 + */ + PageResult getDeviceRepairSenior(CustomConditions conditions); + + PageResult getAppPage(DeviceRepairRequestPageReqVO pageReqVO); + + /** + * 获得报修申请列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 报修申请列表 + */ + List getDeviceRepairList(DeviceRepairRequestExportReqVO exportReqVO); + + /** + * 根据报修申请号查询报修详情 + * @param requestNumber + * @return + */ + Map getDetailsByNumber(String requestNumber,String type); + + /** + * 导入报修申请主信息 + * + * @param datas 导入报修申请主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceRepairList(List datas, Integer mode, boolean updatePart); + + + + DeviceRepairRequestDO getOrderByNumber(String requestNumber); + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldrepairrequest/MoldRepairRequestServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldrepairrequest/MoldRepairRequestServiceImpl.java new file mode 100644 index 0000000..f512255 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldrepairrequest/MoldRepairRequestServiceImpl.java @@ -0,0 +1,361 @@ +package com.win.module.eam.service.moldrepairrequest; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.attachmentfile.vo.UploadFileRequest; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobMainCreateReqVO; +import com.win.module.eam.controller.devicerepairrequest.vo.*; +import com.win.module.eam.convert.devicerepairrequest.DeviceRepairRequestConvert; +import com.win.module.eam.dal.dataobject.attachmentfile.AttachmentFileDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.dal.dataobject.devicerepairrequest.DeviceRepairRequestDO; +import com.win.module.eam.dal.mysql.attachmentfile.AttachmentFileMapper; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobMainMapper; +import com.win.module.eam.dal.mysql.devicerepairrequest.DeviceRepairRequestMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.eam.service.attachmentfile.AttachmentFileService; +import com.win.module.eam.service.deviceaccounts.DeviceAccountsService; +import com.win.module.eam.service.devicemaintenancejob.DeviceMaintenanceJobMainService; +import com.win.module.eam.service.moldaccounts.MoldAccountsService; +import com.win.module.eam.service.moldmaintenancejob.MoldMaintenanceJobMainService; +import com.win.module.system.api.mail.MailSendApi; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.ArrayList; +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.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + + +/** + * 报修申请 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MoldRepairRequestServiceImpl implements MoldRepairRequestService { + + @Resource + private DeviceRepairRequestMapper deviceRepairRequestMapper; + + @Resource + private DeviceMaintenanceJobMainMapper deviceMaintenanceJobMainMapper; + + @Resource + private SerialNumberApi serialNumberApi; + + @Resource + private AdminUserApi userApi; + + + @Resource + private MoldMaintenanceJobMainService deviceMaintenanceJobMainService; + + @Resource + private DeviceAccountsService deviceAccountsService; + + @Resource + private MoldAccountsMapper moldAccountsMapper; + + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + + @Resource + private AttachmentFileService attachmentFileService; + + @Resource + private AttachmentFileMapper attachmentFileMapper; + + @Resource + private MoldAccountsService moldAccountsService; + + @Resource + private AdminUserApi adminUserApi; + + @Resource + private MailSendApi mailSendApi; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDeviceRepair(DeviceRepairRequestRequestCreateReqVO createReqVO) { + // 插入 + DeviceRepairRequestDO deviceRepair = DeviceRepairRequestConvert.INSTANCE.convert(createReqVO); + deviceRepair.setResult(OrderStatusEnum.PEND_ORDER_STATUS.getCode());//待接单 + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + String number = serialNumberApi.generateCode(RuleCodeEnum.REQUEST_REPAIR.getCode()); + deviceRepair.setNumber(number); + deviceRepair.setDeptId(Long.parseLong(createReqVO.getFactoryAreaNumber())); + deviceRepair.setDeclarer(user.getId()); + List filePathList = createReqVO.getFilePathList(); + if(filePathList!=null&&!filePathList.isEmpty()){//有图片 + UploadFileRequest uploadFileRequest = new UploadFileRequest(); + uploadFileRequest.setNumber(number); + uploadFileRequest.setFuncCode("request_repair"); + uploadFileRequest.setFilePathList(filePathList); + attachmentFileService.uploadFile(uploadFileRequest); + } + deviceRepairRequestMapper.insert(deviceRepair); + //添加维修工单 + DeviceMaintenanceJobMainCreateReqVO createReqVOS =new DeviceMaintenanceJobMainCreateReqVO(); + createReqVOS.setRequestNumber(number); + createReqVOS.setType(createReqVO.getType()); + createReqVOS.setDeviceNumber(createReqVO.getDeviceNumber()); + createReqVOS.setFactoryAreaNumber(createReqVO.getFactoryAreaNumber()); + createReqVOS.setDescribes(createReqVO.getDescribes()); + createReqVOS.setStatus(OrderStatusEnum.PEND_ORDER_STATUS.getCode()); + Long deviceMaintenanceMain = deviceMaintenanceJobMainService.createDeviceMaintenanceMain(createReqVOS);// 返回 + //修改台账保修状态 + if(deviceMaintenanceMain!=null){ + //更新设备模具状态 + if(BasicStatusEnum.BASIC_MOLD.getCode().equals(createReqVO.getType()) ){ + moldAccountsService.updateMoldAccountsStatus(createReqVO.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_1.getCode()); + } else { + deviceAccountsService.updateDeviceAccountsStatus(createReqVO.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_1.getCode()); + } + } + return deviceMaintenanceMain; + } + + @Override + public Integer updateDeviceRepair(DeviceRepairRequestRequestUpdateReqVO updateReqVO) { + // 校验存在 + //validateDeviceRepairExists(updateReqVO.getId(),updateReqVO.getNumber(),"1"); + // 更新 + DeviceRepairRequestDO updateObj = DeviceRepairRequestConvert.INSTANCE.convert(updateReqVO); + return deviceRepairRequestMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer deleteDeviceRepair(Long id) { + // 校验存在 + validateDeviceRepairExists(id,"0"); + // 删除 + deviceRepairRequestMapper.deleteById(id); + DeviceRepairRequestDO deviceRepairRequestDO = deviceRepairRequestMapper.selectById(id); + return deviceMaintenanceJobMainService.deleteStatus(deviceRepairRequestDO.getNumber()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer rejectedDeviceRepair(Long id) { + // 校验存在 + validateDeviceRepairExists(id,"1"); + // 删除 + DeviceRepairRequestDO deviceRepairRequestDO1 = deviceRepairRequestMapper.selectById(id); + long declarer = deviceRepairRequestDO1.getDeclarer(); + long loginUserId = getLoginUserId(); + if(declarer!=loginUserId){//只有报修人才能撤销 + throw exception(PEOPLE_NO_NOMAL);//当前人无法执行撤销操作 + } + deviceRepairRequestDO1.setResult(OrderStatusEnum.REJECTED_STATUS.getCode());//已驳回 + int i = deviceRepairRequestMapper.updateById(deviceRepairRequestDO1); + //更新设备模具状态 + if(BasicStatusEnum.BASIC_DEVICE.getCode().equals(deviceRepairRequestDO1.getType()) ){ + deviceAccountsService.updateDeviceAccountsStatus(deviceRepairRequestDO1.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_0.getCode()); + }if(BasicStatusEnum.BASIC_TECH.getCode().equals(deviceRepairRequestDO1.getType()) ){ + deviceAccountsService.updateDeviceAccountsStatus(deviceRepairRequestDO1.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_0.getCode()); + }else if(BasicStatusEnum.BASIC_MOLD.getCode().equals(deviceRepairRequestDO1.getType()) ){ + moldAccountsService.updateMoldAccountsStatus(deviceRepairRequestDO1.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_0.getCode()); + } + List requestNumber = deviceMaintenanceJobMainMapper.selectList("request_number", deviceRepairRequestDO1.getNumber()); + if(requestNumber!=null&&!requestNumber.isEmpty()){ + DeviceMaintenanceJobMainDO maintenanceJobMainDO = requestNumber.get(0); + maintenanceJobMainDO.setStatus(OrderStatusEnum.REJECTED_STATUS.getCode()); + deviceMaintenanceJobMainMapper.updateById(maintenanceJobMainDO); + } + return i; + } + + /** + * 根据id获取该订单是否接单 + * 校验id + * @param type 0删除1驳回 + */ + private void validateDeviceRepairExists(Long id,String type) { + if (deviceRepairRequestMapper.selectById(id) == null) { + throw exception(REQUEST_REPAIR_NOT_EXISTS); + } + Long l = deviceRepairRequestMapper.selectCountById(id, OrderStatusEnum.PEND_ORDER_STATUS.getCode());//待接单 + if(l==0){ + if("0".equals(type)){ + throw exception(REQUEST_REPAIR_DEL_EXISTS);//以接单不能删除 + }else{ + throw exception(REQUEST_REPAIR_PRE_EXISTS);//以接单不能驳回 + } + } + } + + @Override + public DeviceRepairRequestDO getDeviceRepair(Long id) { + return deviceRepairRequestMapper.selectById(id); + } + + @Override + public List getDeviceRepairList(Collection ids) { + return deviceRepairRequestMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceRepairPage(DeviceRepairRequestPageReqVO pageReqVO) { + PageResult deviceRepairDOPageResult = deviceRepairRequestMapper.selectPage(pageReqVO); + List deviceRepairList = deviceRepairDOPageResult.getList(); + deviceRepairList.stream().forEach(deviceRepair -> { + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setFuncCode("request_repair"); + attachmentFileDO.setNumber(deviceRepair.getNumber()); + List list = attachmentFileService.getAttachmentFilePathList(attachmentFileDO); + // 设置filePathList字段 + if(list!= null && list.size() > 0){ + deviceRepair.setFilePathList(list); + } + }); + return deviceRepairDOPageResult; + } + + @Override + public PageResult getDeviceRepairSenior(CustomConditions conditions) { + PageResult deviceRepairDOPageResult = deviceRepairRequestMapper.selectSenior(conditions); + List deviceRepairList = deviceRepairDOPageResult.getList(); + deviceRepairList.stream().forEach(deviceRepair -> { + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setFuncCode("request_repair"); + attachmentFileDO.setNumber(deviceRepair.getNumber()); + List list = attachmentFileService.getAttachmentFilePathList(attachmentFileDO); + // 设置filePathList字段 + if(list!= null && list.size() > 0){ + deviceRepair.setFilePathList(list); + } + }); + return deviceRepairDOPageResult; + } + + @Override + public PageResult getAppPage(DeviceRepairRequestPageReqVO pageReqVO) { + pageReqVO.setUserId(getLoginUserId().toString()); + if("1".equals(pageReqVO.getFlag())){//flag 0 首页进入 1我的进入 + //我的里面都是获取的是当前人已经完成的单子 + IPage pageInfo = deviceRepairRequestMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for(DeviceRepairRequestDO en :pageInfo.getRecords()){ + String deviceNumber = en.getDeviceNumber(); + String type = en.getType(); + if("MOLD".equals(type)){//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + }else{//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + } + //循环申请图片 + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setNumber(en.getNumber()); + attachmentFileDO.setFuncCode("request_repair"); + List attachmentFileList = attachmentFileMapper.getAttachmentFileList(attachmentFileDO); + List list = new ArrayList<>(); + for(AttachmentFileDO attachment:attachmentFileList){ + list.add(attachment.getPath()); + } + en.setFilePathList(list); + } + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + }else{ + //首页进入是获取未接单 已接单的单子 + pageReqVO.setFlag("0"); + } + IPage pageInfo = deviceRepairRequestMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for(DeviceRepairRequestDO en :pageInfo.getRecords()){ + //循环申请图片 + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setNumber(en.getNumber()); + attachmentFileDO.setFuncCode("request_repair"); + List attachmentFileList = attachmentFileMapper.getAttachmentFileList(attachmentFileDO); + List list = new ArrayList<>(); + for(AttachmentFileDO attachment:attachmentFileList){ + list.add(attachment.getPath()); + } + en.setFilePathList(list); + } + return new PageResult<>(pageInfo.getRecords() , pageInfo.getTotal()); + } + return null; + } + + @Override + public List getDeviceRepairList(DeviceRepairRequestExportReqVO exportReqVO) { + return deviceRepairRequestMapper.selectList(exportReqVO); + } + + @Override + public Map getDetailsByNumber(String requestNumber,String type) { + Map en = deviceRepairRequestMapper.getDetailsByNumber(requestNumber, type); + if(en!=null){ + //循环申请图片 + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setNumber(en.get("number").toString()); + attachmentFileDO.setFuncCode("request_repair"); + List attachmentFileList = attachmentFileMapper.getAttachmentFileList(attachmentFileDO); + List list = new ArrayList<>(); + for(AttachmentFileDO attachment:attachmentFileList){ + list.add(attachment.getPath()); + } + en.put("filePathList",list); + } + return en; + } + + @Override + public List importDeviceRepairList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_REPAIR_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceRepairDO obj = deviceRepairMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceRepairMapper.insert(DeviceRepairConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceRepairDO deviceRepairDO = DeviceRepairConvert.INSTANCE.convert(item); +// deviceRepairDO.setId(obj.getId()); +// deviceRepairMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public DeviceRepairRequestDO getOrderByNumber(String requestNumber) { + return deviceRepairRequestMapper.getOrderByNumber(requestNumber); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldspotinspectionrecord/MoldSpotInspectionRecordDetailService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldspotinspectionrecord/MoldSpotInspectionRecordDetailService.java new file mode 100644 index 0000000..70e2aad --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldspotinspectionrecord/MoldSpotInspectionRecordDetailService.java @@ -0,0 +1,87 @@ +package com.win.module.eam.service.moldspotinspectionrecord; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.devicespotinspectionrecord.vo.*; +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 巡检点检记录子 Service 接口 + * + * @author 超级管理员 + */ +public interface MoldSpotInspectionRecordDetailService { + + /** + * 创建巡检点检记录子 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceSpotInspectionRecordDetail(@Valid DeviceSpotInspectionRecordDetailCreateReqVO createReqVO); + + /** + * 更新巡检点检记录子 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceSpotInspectionRecordDetail(@Valid DeviceSpotInspectionRecordDetailUpdateReqVO updateReqVO); + + /** + * 删除巡检点检记录子 + * + * @param id 编号 + */ + Integer deleteDeviceSpotInspectionRecordDetail(Long id); + + /** + * 获得巡检点检记录子 + * + * @param id 编号 + * @return 巡检点检记录子 + */ + DeviceSpotInspectionRecordDetailDO getDeviceSpotInspectionRecordDetail(Long id); + + /** + * 获得巡检点检记录子列表 + * + * @param ids 编号 + * @return 巡检点检记录子列表 + */ + List getDeviceSpotInspectionRecordDetailList(Collection ids); + + /** + * 根据巡检工单号查询子项信息 + * @param number + * @return + */ + List getList(String number); + + /** + * 获得巡检点检记录子分页 + * + * @param pageReqVO 分页查询 + * @return 巡检点检记录子分页 + */ + PageResult getDeviceSpotInspectionRecordDetailPage(DeviceSpotInspectionRecordDetailPageReqVO pageReqVO); + + /** + * 获得巡检点检记录子列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 巡检点检记录子列表 + */ + List getDeviceSpotInspectionRecordDetailList(DeviceSpotInspectionRecordDetailExportReqVO exportReqVO); + + /** + * 导入巡检点检记录子主信息 + * + * @param datas 导入巡检点检记录子主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceSpotInspectionRecordDetailList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldspotinspectionrecord/MoldSpotInspectionRecordDetailServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldspotinspectionrecord/MoldSpotInspectionRecordDetailServiceImpl.java new file mode 100644 index 0000000..1fa2e60 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldspotinspectionrecord/MoldSpotInspectionRecordDetailServiceImpl.java @@ -0,0 +1,111 @@ +package com.win.module.eam.service.moldspotinspectionrecord; + +import cn.hutool.core.collection.CollUtil; +import com.win.module.eam.controller.devicespotinspectionrecord.vo.*; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailDO; +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.convert.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailConvert; +import com.win.module.eam.dal.mysql.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailMapper; + + + +/** + * 巡检点检记录子 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MoldSpotInspectionRecordDetailServiceImpl implements MoldSpotInspectionRecordDetailService { + + @Resource + private DeviceSpotInspectionRecordDetailMapper deviceSpotInspectionRecordDetailMapper; + + @Override + public Long createDeviceSpotInspectionRecordDetail(DeviceSpotInspectionRecordDetailCreateReqVO createReqVO) { + // 插入 + DeviceSpotInspectionRecordDetailDO deviceSpotInspectionRecordDetail = DeviceSpotInspectionRecordDetailConvert.INSTANCE.convert(createReqVO); + deviceSpotInspectionRecordDetailMapper.insert(deviceSpotInspectionRecordDetail); + // 返回 + return deviceSpotInspectionRecordDetail.getId(); + } + + @Override + public Integer updateDeviceSpotInspectionRecordDetail(DeviceSpotInspectionRecordDetailUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceSpotInspectionRecordDetailExists(updateReqVO.getId()); + // 更新 + DeviceSpotInspectionRecordDetailDO updateObj = DeviceSpotInspectionRecordDetailConvert.INSTANCE.convert(updateReqVO); + return deviceSpotInspectionRecordDetailMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceSpotInspectionRecordDetail(Long id) { + // 校验存在 + validateDeviceSpotInspectionRecordDetailExists(id); + // 删除 + return deviceSpotInspectionRecordDetailMapper.deleteById(id); + } + + private void validateDeviceSpotInspectionRecordDetailExists(Long id) { + if (deviceSpotInspectionRecordDetailMapper.selectById(id) == null) { + // throw exception(DEVICE_SPOT_INSPECTION_RECORD_DETAIL_NOT_EXISTS); + } + } + + @Override + public DeviceSpotInspectionRecordDetailDO getDeviceSpotInspectionRecordDetail(Long id) { + return deviceSpotInspectionRecordDetailMapper.selectById(id); + } + + @Override + public List getDeviceSpotInspectionRecordDetailList(Collection ids) { + return deviceSpotInspectionRecordDetailMapper.selectBatchIds(ids); + } + + @Override + public List getList(String number) { + return deviceSpotInspectionRecordDetailMapper.selectList("number",number); + } + + @Override + public PageResult getDeviceSpotInspectionRecordDetailPage(DeviceSpotInspectionRecordDetailPageReqVO pageReqVO) { + return deviceSpotInspectionRecordDetailMapper.selectPage(pageReqVO); + } + + @Override + public List getDeviceSpotInspectionRecordDetailList(DeviceSpotInspectionRecordDetailExportReqVO exportReqVO) { + return deviceSpotInspectionRecordDetailMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceSpotInspectionRecordDetailList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_SPOT_INSPECTION_RECORD_DETAIL_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceSpotInspectionRecordDetailDO obj = deviceSpotInspectionRecordDetailMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceSpotInspectionRecordDetailMapper.insert(DeviceSpotInspectionRecordDetailConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceSpotInspectionRecordDetailDO deviceSpotInspectionRecordDetailDO = DeviceSpotInspectionRecordDetailConvert.INSTANCE.convert(item); +// deviceSpotInspectionRecordDetailDO.setId(obj.getId()); +// deviceSpotInspectionRecordDetailMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldspotinspectionrecord/MoldSpotInspectionRecordMainService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldspotinspectionrecord/MoldSpotInspectionRecordMainService.java new file mode 100644 index 0000000..01d6397 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldspotinspectionrecord/MoldSpotInspectionRecordMainService.java @@ -0,0 +1,129 @@ +package com.win.module.eam.service.moldspotinspectionrecord; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicespotinspectionrecord.vo.*; +import com.win.module.eam.dal.dataobject.devicemolditems.DeviceMoldItemsDO; +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordMainDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 检修工单主 Service 接口 + * + * @author 超级管理员 + */ +public interface MoldSpotInspectionRecordMainService { + + /** + * 创建检修工单主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceSpotInspectionRecordMain(@Valid DeviceSpotInspectionRecordMainCreateReqVO createReqVO); + + /** + * 更新检修工单主 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceSpotInspectionRecordMain(@Valid DeviceSpotInspectionRecordMainUpdateReqVO updateReqVO); + + /** + * 删除检修工单主 + * + * @param id 编号 + */ + Integer deleteDeviceSpotInspectionRecordMain(Long id); + + /** + * 暂无用 + * @param id + * @return + */ + Integer orderClickFinish(Long id); + + /** + * 巡检点检审核 + * @param id 工单id + * @param status APPROVEREJECTED 审核不通过 APPROVEPASS审核通过 + * @param approveOpinion 审核意见 + * @return + */ + Integer orderClickApprove(Long id,String status,String approveOpinion); + + /** + * 获得检修工单主 + * + * @param id 编号 + * @return 检修工单主 + */ + DeviceSpotInspectionRecordMainDO getDeviceSpotInspectionRecordMain(Long id); + + /** + * 获得检修工单主列表 + * + * @param ids 编号 + * @return 检修工单主列表 + */ + List getDeviceSpotInspectionRecordMainList(Collection ids); + + /** + * 获得检修工单主分页 + * + * @param pageReqVO 分页查询 + * @return 检修工单主分页 + */ + PageResult getDeviceSpotInspectionRecordMainPage(DeviceSpotInspectionRecordMainPageReqVO pageReqVO); + + + /** + * 获得检修工单主分页 + * + * @param conditions 分页查询 + * @return 检修工单主分页 + */ + PageResult getDeviceSpotInspectionRecordMainSenior(CustomConditions conditions); + + + /** + * 获得检修工单主列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 检修工单主列表 + */ + List getDeviceSpotInspectionRecordMainList(DeviceSpotInspectionRecordMainExportReqVO exportReqVO); + + /** + * 导入检修工单主主信息 + * + * @param datas 导入检修工单主主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + List importDeviceSpotInspectionRecordMainList(List datas, Integer mode, boolean updatePart); + + /** + * 根据设备或模具编码查询巡检点检项列表 + * @param number + * @return + */ + List getDeviceMoldItemsList(String number); + + /** + * fenye + * @param pageReqVO + * @return + */ + PageResult getAppPage(DeviceSpotInspectionRecordMainPageReqVO pageReqVO); + + /** + * 巡检点检每天的定时任务 + * @param type 0 上午1下午 + */ + void createSpotInspectionTask(int type); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldspotinspectionrecord/MoldSpotInspectionRecordMainServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldspotinspectionrecord/MoldSpotInspectionRecordMainServiceImpl.java new file mode 100644 index 0000000..d8154be --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/moldspotinspectionrecord/MoldSpotInspectionRecordMainServiceImpl.java @@ -0,0 +1,390 @@ +package com.win.module.eam.service.moldspotinspectionrecord; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.module.eam.controller.devicespotinspectionrecord.vo.*; +import com.win.module.eam.convert.devicespotinspectionrecord.DeviceSpotInspectionRecordMainConvert; +import com.win.module.eam.dal.dataobject.classtype.ClassTypeDO; +import com.win.module.eam.dal.dataobject.deviceaccounts.DeviceAccountsDO; +import com.win.module.eam.dal.dataobject.devicemolditems.DeviceMoldItemsDO; +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailDO; +import com.win.module.eam.dal.dataobject.devicespotinspectionrecord.DeviceSpotInspectionRecordMainDO; +import com.win.module.eam.dal.dataobject.moldaccounts.MoldAccountsDO; +import com.win.module.eam.dal.mysql.classtype.ClassTypeMapper; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.devicemolditems.DeviceMoldItemsMapper; +import com.win.module.eam.dal.mysql.devicespotinspectionrecord.DeviceSpotInspectionRecordDetailMapper; +import com.win.module.eam.dal.mysql.devicespotinspectionrecord.DeviceSpotInspectionRecordMainMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.infra.api.config.ApiConfigApi; +import com.win.module.infra.api.config.dto.ConfigDTO; +import com.win.module.system.api.dept.DeptApi; +import com.win.module.system.api.mail.MailSendApi; +import com.win.module.system.api.mail.dto.MailSendSingleToUserReqDTO; +import com.win.module.system.api.permission.PermissionApi; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.api.user.dto.AdminUserRespExpandDTO; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; + +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import com.win.framework.common.pojo.PageResult; + + +import static cn.hutool.log.StaticLog.info; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 检修工单主 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class MoldSpotInspectionRecordMainServiceImpl implements MoldSpotInspectionRecordMainService { + + @Resource + private DeviceSpotInspectionRecordMainMapper deviceSpotInspectionRecordMainMapper; + + @Resource + private DeviceSpotInspectionRecordDetailMapper deviceSpotInspectionRecordDetailMapper; + + @Resource + private DeviceMoldItemsMapper deviceMoldItemsMapper; + + @Resource + private ClassTypeMapper classTypeMapper; + + @Resource + private AdminUserApi userApi; + + @Resource + private ApiConfigApi apiConfigApi; + + @Resource + private MailSendApi mailSendApi; + + @Resource + private PermissionApi permissionApi; + + @Resource + private DeptApi deptApi; + + @Resource + private SerialNumberApi serialNumberApi; + + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + + @Resource + private MoldAccountsMapper moldAccountsMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDeviceSpotInspectionRecordMain(DeviceSpotInspectionRecordMainCreateReqVO createReqVO) { + // 主巡检点检记录插入 + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + DeviceSpotInspectionRecordMainDO deviceSpotInspectionRecordMain = DeviceSpotInspectionRecordMainConvert.INSTANCE.convert(createReqVO); + String number = serialNumberApi.generateCode(RuleCodeEnum.XUN_JIAN_ORDER.getCode()); + deviceSpotInspectionRecordMain.setNumber(number); + deviceSpotInspectionRecordMain.setMaintenance(getLoginUserId()); + deviceSpotInspectionRecordMain.setStatus(OrderStatusEnum.JX_COMPLETED_STATUS.getCode());//完成 + deviceSpotInspectionRecordMain.setCompletionTime(LocalDateTime.now()); + if("MOLD".equals(createReqVO.getType())){//模具 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", createReqVO.getDeviceNumber()); + MoldAccountsDO deviceAccountsDO = moldAccountsMapper.selectOne(queryWrapper); + deviceSpotInspectionRecordMain.setDeptId(Long.parseLong(deviceAccountsDO.getFactoryAreaNumber())); + }else{ + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", createReqVO.getDeviceNumber()); + DeviceAccountsDO deviceAccountsDO = deviceAccountsMapper.selectOne(queryWrapper); + deviceSpotInspectionRecordMain.setDeptId(Long.parseLong(deviceAccountsDO.getFactoryAreaNumber())); + } + int i = deviceSpotInspectionRecordMainMapper.insert(deviceSpotInspectionRecordMain); + deviceSpotInspectionRecordMain.getId(); + //子巡检项信息录入 + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("available", "TRUE"); + itemQueryWrapper.eq("deleted", 0); + itemQueryWrapper.eq("status", "INSPECTION"); + itemQueryWrapper.eq("device_number", createReqVO.getDeviceNumber()); + List deviceMoldItemsDOS = deviceMoldItemsMapper.selectList(itemQueryWrapper); + for(DeviceMoldItemsDO en:deviceMoldItemsDOS){ + DeviceSpotInspectionRecordDetailDO inspectionRecordDetailDO = new DeviceSpotInspectionRecordDetailDO(); + List> subList = createReqVO.getSubList(); + if(!subList.isEmpty()){ + for(Map map:subList){ + long id = Long.parseLong(map.get("id").toString()); + if(id==en.getId()){ + inspectionRecordDetailDO.setIsConform(map.get("isConform")==null?"FALSE":map.get("isConform").toString()); + } + } + } + inspectionRecordDetailDO.setMasterId(deviceSpotInspectionRecordMain.getId()); + inspectionRecordDetailDO.setNumber(number); + inspectionRecordDetailDO.setName(en.getName()); + inspectionRecordDetailDO.setEquipmentPosition(en.getEquipmentParts()); + deviceSpotInspectionRecordDetailMapper.insert(inspectionRecordDetailDO); + } + Long id = deviceSpotInspectionRecordMain.getId(); + //发送邮件 + try { + sendEmails(deviceSpotInspectionRecordMain); + } catch (Exception e) { + info("发送邮件异常:{}",e); + } + return id; + } + + @Override + public Integer updateDeviceSpotInspectionRecordMain(DeviceSpotInspectionRecordMainUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceSpotInspectionRecordMainExists(updateReqVO.getId()); + // 更新 + DeviceSpotInspectionRecordMainDO updateObj = DeviceSpotInspectionRecordMainConvert.INSTANCE.convert(updateReqVO); + return deviceSpotInspectionRecordMainMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceSpotInspectionRecordMain(Long id) { + // 校验存在 + validateDeviceSpotInspectionRecordMainExists(id); + // 删除 + return deviceSpotInspectionRecordMainMapper.deleteById(id); + } + + @Override + public Integer orderClickFinish(Long id) { + DeviceSpotInspectionRecordMainDO mainDO = deviceSpotInspectionRecordMainMapper.selectById(id); + // 校验存在 + if (mainDO == null) { + throw exception(XUN_JIAN_ORDER_NOT_EXISTS); + } + mainDO.setId(id); + //mainDO.setStatus(); + return deviceSpotInspectionRecordMainMapper.updateById(mainDO); + } + + @Override + public Integer orderClickApprove(Long id, String status, String approveOpinion) { + DeviceSpotInspectionRecordMainDO Do = deviceSpotInspectionRecordMainMapper.selectById(id); + // 校验存在 + if (Do == null) { + throw exception(XUN_JIAN_ORDER_NOT_EXISTS); + } + if(!permissionApi.BooleanEngineer()){ + throw exception(WEI_XIU_NOT_ENGINEER); + } + Do.setStatus(status); + Do.setApproveOpinion(approveOpinion); + Do.setVerifyer(getLoginUserId()); + Do.setVerifyTime(LocalDateTime.now()); + //mainDO.setStatus(); + return deviceSpotInspectionRecordMainMapper.updateById(Do); + } + + private void validateDeviceSpotInspectionRecordMainExists(Long id) { + if (deviceSpotInspectionRecordMainMapper.selectById(id) == null) { + throw exception(XUN_JIAN_ORDER_NOT_EXISTS); + } + } + + @Override + public DeviceSpotInspectionRecordMainDO getDeviceSpotInspectionRecordMain(Long id) { + return deviceSpotInspectionRecordMainMapper.selectById(id); + } + + @Override + public List getDeviceSpotInspectionRecordMainList(Collection ids) { + return deviceSpotInspectionRecordMainMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceSpotInspectionRecordMainPage(DeviceSpotInspectionRecordMainPageReqVO pageReqVO) { + return deviceSpotInspectionRecordMainMapper.selectPage(pageReqVO); + } + + + @Override + public PageResult getDeviceSpotInspectionRecordMainSenior(CustomConditions conditions) { + return deviceSpotInspectionRecordMainMapper.selectSenior(conditions); + } + + + @Override + public List getDeviceSpotInspectionRecordMainList(DeviceSpotInspectionRecordMainExportReqVO exportReqVO) { + return deviceSpotInspectionRecordMainMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceSpotInspectionRecordMainList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_SPOT_INSPECTION_RECORD_MAIN_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceSpotInspectionRecordMainDO obj = deviceSpotInspectionRecordMainMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceSpotInspectionRecordMainMapper.insert(DeviceSpotInspectionRecordMainConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceSpotInspectionRecordMainDO deviceSpotInspectionRecordMainDO = DeviceSpotInspectionRecordMainConvert.INSTANCE.convert(item); +// deviceSpotInspectionRecordMainDO.setId(obj.getId()); +// deviceSpotInspectionRecordMainMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public List getDeviceMoldItemsList(String number) { + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("available", "TRUE"); + itemQueryWrapper.eq("deleted", 0); + itemQueryWrapper.eq("device_number", number); + return deviceMoldItemsMapper.selectList(itemQueryWrapper); + } + + @Override + public PageResult getAppPage(DeviceSpotInspectionRecordMainPageReqVO pageReqVO) { + pageReqVO.setUserId(getLoginUserId().toString()); + pageReqVO.setClassType("MOLD"); + IPage pageInfo = deviceSpotInspectionRecordMainMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for(DeviceSpotInspectionRecordMainDO en :pageInfo.getRecords()){ + String deviceNumber = en.getDeviceNumber(); + String type = en.getType(); + if("MOLD".equals(type)){//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + }else{//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + } + + } + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + + + + @Override + public void createSpotInspectionTask(int type) { + String times = null; + String classes = "0"; + if(0==type){//早班巡检 + // 设置为当天的 8:30 + ConfigDTO configByKey = apiConfigApi.getConfigByKey("record_spot_inspection.start_time"); + String value = configByKey.getValue(); + times = LocalDateTimeUtil.format(LocalDate.now(), "yyyy-MM-dd"); + times = times+" "+value; + }else{//晚班巡检 + classes = "1"; + // 设置为当天的 17:30 + ConfigDTO configByKey = apiConfigApi.getConfigByKey("record_spot_inspection.end_time"); + String value = configByKey.getValue(); + times = LocalDateTimeUtil.format(LocalDate.now(), "yyyy-MM-dd"); + times = times+" "+value; + } + List> list2 = deptApi.selectAllFactoryArea(); + for (Map map : list2) { + // 如果Map中已存在该键,则添加 + String factoryAreaNumber = map.get("id").toString(); + List list = deviceSpotInspectionRecordMainMapper.selectSpotInspectionTask(times,factoryAreaNumber,classes); + StringBuilder str = new StringBuilder(); + for(DeviceSpotInspectionRecordMainDO en:list){ + str.append("

  设备名称("); + String name = en.getName(); + str.append(name); + str.append("),"); + str.append("设备号("); + String deviceNumber = en.getDeviceNumber(); + str.append(deviceNumber); + str.append(")

"); + } + //发送邮件 + try { + if(!list.isEmpty()){ + sendEmails(times,str.toString(),factoryAreaNumber); + } + } catch (Exception e) { + info("发送邮件异常:{}",e); + } + } + } + + /** + * 每天定时巡检点检发送邮件 + * @param times + * @param str + * @param factoryAreaNumber + */ + private void sendEmails(String times,String str,String factoryAreaNumber){ + List userBeanList = classTypeMapper.JudgeIdentity(null, "DEVICE", "1", factoryAreaNumber); + userBeanList.stream().forEach(item ->{ + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getUserId())); + mailSendSingleToUserReqDTO.setTemplateCode("record-spot-inspection-template"); + Map params = new HashMap<>(); + params.put("str", str); + params.put("times", times); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + }catch(RuntimeException e){ + info("巡检点检的日期为"+times+",来自"+factoryAreaNumber+"给设备工程师发送的邮件通知失败:{}", e); + } + }); + } + + /** + * 巡检点验证给工程师发邮件 + * @param mainDO + */ + private void sendEmails(DeviceSpotInspectionRecordMainDO mainDO){ + List userBeanList = classTypeMapper.JudgeIdentity(null, mainDO.getType(), "1", mainDO.getFactoryAreaNumber()); + userBeanList.stream().forEach(item ->{ + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getUserId())); + mailSendSingleToUserReqDTO.setTemplateCode("record_spot_inspection_verify"); + Map params = new HashMap<>(); + params.put("typeName","设备"); + params.put("number", mainDO.getNumber()); + params.put("name", item.getNickname()); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + }catch(RuntimeException e){ + info("工单编号为"+mainDO.getNumber()+"的名为:"+mainDO.getDescribes()+"的工单给"+item.getNickname()+"发送的邮件通知失败:{}", e); + } + }); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/monthequipment/BasicMonthEquipmentService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/monthequipment/BasicMonthEquipmentService.java new file mode 100644 index 0000000..c39664a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/monthequipment/BasicMonthEquipmentService.java @@ -0,0 +1,85 @@ +package com.win.module.eam.service.monthequipment; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.monthequipment.vo.*; +import com.win.module.eam.dal.dataobject.monthequipment.BasicMonthEquipmentDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 首页月设备实现指标 Service 接口 + * + * @author 超级管理员 + */ +public interface BasicMonthEquipmentService { + + /** + * 创建首页月设备实现指标 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createBasicMonthEquipment(@Valid BasicMonthEquipmentCreateReqVO createReqVO); + + /** + * 更新首页月设备实现指标 + * + * @param updateReqVO 更新信息 + */ + Integer updateBasicMonthEquipment(@Valid BasicMonthEquipmentUpdateReqVO updateReqVO); + + /** + * 删除首页月设备实现指标 + * + * @param id 编号 + */ + Integer deleteBasicMonthEquipment(Long id); + + /** + * 获得首页月设备实现指标 + * + * @param id 编号 + * @return 首页月设备实现指标 + */ + BasicMonthEquipmentDO getBasicMonthEquipment(Long id); + + /** + * 获得首页月设备实现指标列表 + * + * @param ids 编号 + * @return 首页月设备实现指标列表 + */ + List getBasicMonthEquipmentList(Collection ids); + + /** + * 获得首页月设备实现指标分页 + * + * @param pageReqVO 分页查询 + * @return 首页月设备实现指标分页 + */ + PageResult getBasicMonthEquipmentPage(BasicMonthEquipmentPageReqVO pageReqVO); + + /** + * 获得首页月设备实现指标列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 首页月设备实现指标列表 + */ + List getBasicMonthEquipmentList(BasicMonthEquipmentExportReqVO exportReqVO); + + /** + * 导入首页月设备实现指标主信息 + * + * @param datas 导入首页月设备实现指标主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importBasicMonthEquipmentList(List datas, Integer mode, boolean updatePart); + + /** + * 处理年度指标实际值 + */ + void handleYear(); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/monthequipment/BasicMonthEquipmentServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/monthequipment/BasicMonthEquipmentServiceImpl.java new file mode 100644 index 0000000..5d6b7c3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/monthequipment/BasicMonthEquipmentServiceImpl.java @@ -0,0 +1,224 @@ +package com.win.module.eam.service.monthequipment; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.module.eam.controller.monthequipment.vo.*; +import com.win.module.eam.dal.dataobject.yearequipment.BasciYearEquipmentDO; +import com.win.module.eam.dal.mysql.yearequipment.BasciYearEquipmentMapper; +import com.win.module.eam.enums.monthequipment.MonthequipmentStatusEnum; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; + +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.win.module.eam.dal.dataobject.monthequipment.BasicMonthEquipmentDO; +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.convert.monthequipment.BasicMonthEquipmentConvert; +import com.win.module.eam.dal.mysql.monthequipment.BasicMonthEquipmentMapper; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.common.pojo.CommonResult.error; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 首页月设备实现指标 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class BasicMonthEquipmentServiceImpl implements BasicMonthEquipmentService { + + @Resource + private BasicMonthEquipmentMapper basicMonthEquipmentMapper; + + @Resource + private BasciYearEquipmentMapper basciYearEquipmentMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createBasicMonthEquipment(BasicMonthEquipmentCreateReqVO createReqVO) { + long ll = 1; + try { + String dateStr = createReqVO.getMonthIndex(); + // 提取年份 + int yearEnd = dateStr.indexOf("年"); + String yearStr = dateStr.substring(0, yearEnd); + int year = Integer.parseInt(yearStr); + // 提取月份 + int monthEnd = dateStr.indexOf("月"); + String monthStr = dateStr.substring(yearEnd + 1, monthEnd); + int month = Integer.parseInt(monthStr); + createReqVO.setYear(year); + createReqVO.setMonth(month); + createReqVO.setMonthIndex(dateStr); + // 插入 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("type",createReqVO.getType()); + queryWrapper.eq("factory_type",createReqVO.getFactoryType()); + queryWrapper.eq("month_index",createReqVO.getMonthIndex().trim()); + BasicMonthEquipmentDO basicMonthEquipmentDO = basicMonthEquipmentMapper.selectOne(queryWrapper); + if(basicMonthEquipmentDO!=null){//更新 + createReqVO.setId(basicMonthEquipmentDO.getId()); + BasicMonthEquipmentDO basicMonthEquipment = BasicMonthEquipmentConvert.INSTANCE.convert(createReqVO); + basicMonthEquipmentMapper.updateById(basicMonthEquipment); + }else{//新增 + BasicMonthEquipmentDO basicMonthEquipment = BasicMonthEquipmentConvert.INSTANCE.convert(createReqVO); + basicMonthEquipmentMapper.insert(basicMonthEquipment); + } + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("type",createReqVO.getType()); + queryWrapper1.eq("factory_type",createReqVO.getFactoryType()); + queryWrapper1.eq("year_index",year); + BasciYearEquipmentDO basciYearEquipmentDO = basciYearEquipmentMapper.selectOne(queryWrapper1); + if(basciYearEquipmentDO!=null){//统计一年内的平均值当做年度实际值 + String actual = basicMonthEquipmentMapper.handleData(createReqVO.getType(), createReqVO.getFactoryType(), year); + if (actual!=null&&!"".equals(actual)){ + basciYearEquipmentDO.setActual(actual); + basciYearEquipmentMapper.updateById(basciYearEquipmentDO); + } + } + } catch (NumberFormatException e) { + ll=0; + } + return ll; + } + + @Override + public Integer updateBasicMonthEquipment(BasicMonthEquipmentUpdateReqVO updateReqVO) { + // 校验存在 + validateBasicMonthEquipmentExists(updateReqVO.getId()); + // 更新 + BasicMonthEquipmentDO updateObj = BasicMonthEquipmentConvert.INSTANCE.convert(updateReqVO); + return basicMonthEquipmentMapper.updateById(updateObj); + } + + @Override + @Transactional + public Integer deleteBasicMonthEquipment(Long id) { + BasicMonthEquipmentDO basicMonthEquipmentDO = basicMonthEquipmentMapper.selectById(id); + if (basicMonthEquipmentDO == null) { + throw exception(BASIC_MONTH_EQUIPMENT_NOT_EXISTS); + } + // 删除 + int i = basicMonthEquipmentMapper.deleteById(id); + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("type",basicMonthEquipmentDO.getType()); + queryWrapper1.eq("factory_type",basicMonthEquipmentDO.getFactoryType()); + queryWrapper1.eq("year_index",basicMonthEquipmentDO.getYear()); + BasciYearEquipmentDO basciYearEquipmentDO = basciYearEquipmentMapper.selectOne(queryWrapper1); + if(basciYearEquipmentDO!=null){//统计一年内的平均值当做年度实际值 + String actual = basicMonthEquipmentMapper.handleData(basicMonthEquipmentDO.getType(), basicMonthEquipmentDO.getFactoryType(), basicMonthEquipmentDO.getYear()); + if (actual!=null&&!"".equals(actual)){ + basciYearEquipmentDO.setActual(actual); + basciYearEquipmentMapper.updateById(basciYearEquipmentDO); + }else{ + basciYearEquipmentDO.setActual(""); + basciYearEquipmentMapper.updateById(basciYearEquipmentDO); + } + } + return i; + + } + + private void validateBasicMonthEquipmentExists(Long id) { + if (basicMonthEquipmentMapper.selectById(id) == null) { + //throw exception(BASIC_MONTH_EQUIPMENT_NOT_EXISTS); + } + } + + @Override + public BasicMonthEquipmentDO getBasicMonthEquipment(Long id) { + return basicMonthEquipmentMapper.selectById(id); + } + + @Override + public List getBasicMonthEquipmentList(Collection ids) { + return basicMonthEquipmentMapper.selectBatchIds(ids); + } + + @Override + public PageResult getBasicMonthEquipmentPage(BasicMonthEquipmentPageReqVO pageReqVO) { + return basicMonthEquipmentMapper.selectPage(pageReqVO); + } + + @Override + public List getBasicMonthEquipmentList(BasicMonthEquipmentExportReqVO exportReqVO) { + return basicMonthEquipmentMapper.selectList(exportReqVO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public List importBasicMonthEquipmentList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + throw exception(INVALID_TEMPLATE); + } + List errorList = new ArrayList<>(); + int year = 0; + for(BasicMonthEquipmentExcelVO en:datas){ + try { + String dateStr = en.getMonthIndex(); + // 提取年份 + int yearEnd = dateStr.indexOf("年"); + String yearStr = dateStr.substring(0, yearEnd); + year = Integer.parseInt(yearStr); + // 提取月份 + int monthEnd = dateStr.indexOf("月"); + } catch (Exception e) { + BasicMonthEquipmentErrorVO importErrorVO = BasicMonthEquipmentConvert.INSTANCE.convert(en); + importErrorVO.setImportStatus("失败"); + importErrorVO.setImportRemark("请填写正确日期如2024年3月"); + errorList.add(importErrorVO); + } + if(en.getActual()==null || en.getActual().isEmpty() || en.getMonthIndex()==null || en.getMonthIndex().isEmpty() || en.getType()==null || en.getType().isEmpty() || en.getFactoryType()==null || en.getFactoryType().isEmpty()){ + BasicMonthEquipmentErrorVO importErrorVO = BasicMonthEquipmentConvert.INSTANCE.convert(en); + importErrorVO.setImportStatus("失败"); + importErrorVO.setImportRemark("数据不能为空"); + errorList.add(importErrorVO); + } + try { + Double.valueOf(en.getActual()); + } catch (Exception e) { + BasicMonthEquipmentErrorVO importErrorVO = BasicMonthEquipmentConvert.INSTANCE.convert(en); + importErrorVO.setImportStatus("失败"); + importErrorVO.setImportRemark("请填写正确数值"); + errorList.add(importErrorVO); + } + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("type",en.getType()); + queryWrapper1.eq("factory_type",en.getFactoryType()); + queryWrapper1.eq("year_index",year); + BasciYearEquipmentDO basciYearEquipmentDO = basciYearEquipmentMapper.selectOne(queryWrapper1); + if(basciYearEquipmentDO==null){ + BasicMonthEquipmentErrorVO importErrorVO = BasicMonthEquipmentConvert.INSTANCE.convert(en); + importErrorVO.setImportStatus("失败"); + importErrorVO.setImportRemark("该年份+类型+厂区没有年度指标记录"); + errorList.add(importErrorVO); + } + if(!errorList.isEmpty()){//有错误数据抛出 + return errorList; + } + BasicMonthEquipmentCreateReqVO reqVO = BasicMonthEquipmentConvert.INSTANCE.convert1(en); + reqVO.setMonthIndex(en.getMonthIndex()); + reqVO.setActual(en.getActual()); + + Long l = createBasicMonthEquipment(reqVO); + if(l==0){//有问题 + BasicMonthEquipmentErrorVO importErrorVO = BasicMonthEquipmentConvert.INSTANCE.convert(en); + importErrorVO.setImportStatus("失败"); + errorList.add(importErrorVO); + } + + } + return errorList; + } + + @Override + public void handleYear() { + + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/package-info.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/package-info.java new file mode 100644 index 0000000..11266d5 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/package-info.java @@ -0,0 +1,4 @@ +/** + * System API 包,定义暴露给其它模块的 API + */ +package com.win.module.eam.service; diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/producePlan/ProducePlanService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/producePlan/ProducePlanService.java new file mode 100644 index 0000000..59a4233 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/producePlan/ProducePlanService.java @@ -0,0 +1,66 @@ +package com.win.module.eam.service.producePlan; + +import com.win.module.eam.controller.producePlan.vo.ProducePlanExportReqVO; +import com.win.module.eam.controller.producePlan.vo.ProducePlanUpdateReqVO; +import com.win.module.eam.dal.dataobject.producePlan.ProducePlanDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 生产计划 Service 接口 + * + * @author 超级管理员 + */ +public interface ProducePlanService { + + /** + * 创建生产计划 + * + * @param createReqVO 创建信息 + * @return 编号 + */ +// Long create(@Valid ProducePlanCreateReqVO createReqVO); + + /** + * 更新生产计划 + * + * @param updateReqVO 更新信息 + */ + Integer update(@Valid ProducePlanUpdateReqVO updateReqVO); + + /** + * 删除生产计划 + * + * @param id 编号 + */ + Integer delete(Long id); + + /** + * 获得生产计划 + * + * @param id 编号 + * @return 生产计划 + */ + ProducePlanDO get(Long id); + + /** + * 获得生产计划列表 + * + * @param ids 编号 + * @return 生产计划列表 + */ + List getList(Collection ids); + + /** + * 获得生产计划列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 生产计划列表 + */ + List getList(ProducePlanExportReqVO exportReqVO); + + Long getNewProducePlan(); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/producePlan/ProducePlanServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/producePlan/ProducePlanServiceImpl.java new file mode 100644 index 0000000..b8cd30d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/producePlan/ProducePlanServiceImpl.java @@ -0,0 +1,129 @@ +package com.win.module.eam.service.producePlan; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import com.win.framework.datasource.core.enums.DataSourceEnum; +import com.win.framework.redis.util.RedisCache; +import com.win.module.eam.controller.producePlan.vo.ProducePlanExportReqVO; +import com.win.module.eam.controller.producePlan.vo.ProducePlanUpdateReqVO; +import com.win.module.eam.convert.producePlan.ProducePlanConvert; +import com.win.module.eam.dal.dataobject.producePlan.ProducePlanDO; +import com.win.module.eam.dal.mysql.producePlan.ProducePlanMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.eam.enums.ErrorCodeConstants.ProducePlan_NOT_EXISTS; + +/** + * 生产计划 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class ProducePlanServiceImpl implements ProducePlanService { + + @Resource + private ProducePlanMapper producePlanMapper; + @Autowired + private RedisCache redisCache; + + + @DS(DataSourceEnum.SHARDING) + public Long create(List producePlanDOList) { + // 插入 + for (ProducePlanDO producePlanDO : producePlanDOList) { + producePlanMapper.insert(producePlanDO); + } + // 返回 + return 1L; + } + + @Override + public Integer update(ProducePlanUpdateReqVO updateReqVO) { + + // 校验存在 + validateExists(updateReqVO.getId()); + // 更新 + ProducePlanDO updateObj = ProducePlanConvert.INSTANCE.convert(updateReqVO); + return producePlanMapper.updateById(updateObj); + } + + @Override + public Integer delete(Long id) { + // 校验存在 + validateExists(id); + // 删除 + return producePlanMapper.deleteById(id); + } + + private void validateExists(Long id) { + if (producePlanMapper.selectById(id) == null) { + throw exception(ProducePlan_NOT_EXISTS); + } + } + + @Override + public ProducePlanDO get(Long id) { + return producePlanMapper.selectById(id); + } + + @Override + public List getList(Collection ids) { + return producePlanMapper.selectBatchIds(ids); + } + + @Override + public List getList(ProducePlanExportReqVO exportReqVO) { + return producePlanMapper.selectList(exportReqVO); + } + + @DS(DataSourceEnum.SQL_SERVER_All) + @Override + public Long getNewProducePlan() { + List list = new ArrayList<>(); + //取上一次创建时间,查询新的数据 + LocalDateTime createTime = redisCache.getCacheObject("QCJ_createTime"); + if (createTime != null) { + list = producePlanMapper.getNewProducePlan(createTime); + } else { + LocalDateTime createTimeNew = LocalDateTime.of(2024, 1, 1, 00, 00, 01); + list = producePlanMapper.getNewProducePlan(createTimeNew); + } + List producePlanDOList = new ArrayList<>(); + for (ProducePlanDO producePlanDO : list) { + producePlanDO.setDeleted(Boolean.FALSE); + producePlanDOList.add(producePlanDO); + } + DynamicDataSourceContextHolder.push(DataSourceEnum.SHARDING); + // 数据库操作逻辑 + DynamicDataSourceContextHolder.clear(); + for (ProducePlanDO producePlanDO : producePlanDOList) { + producePlanMapper.insert(producePlanDO);//更新redis zhen + } + //查询最新的创建时间 存入缓存 + redisCache.setCacheObject("QCJ_createTime", producePlanDOList.get(0).getCreateTime()); + DynamicDataSourceContextHolder.push(DataSourceEnum.SQL_SERVER_ONE); + // 数据库操作逻辑 + for (ProducePlanDO producePlanDO : producePlanDOList) { + BigDecimal qty = new BigDecimal(0); + qty = producePlanMapper.getProducePlanQty(producePlanDO.getServiceId()); + producePlanDO.setColumn4(qty); + } + // 数据库操作逻辑 + DynamicDataSourceContextHolder.clear(); + for (ProducePlanDO producePlanDO : producePlanDOList) { + producePlanMapper.updateById(producePlanDO); + } + return 1l; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/supplier/SupplierService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/supplier/SupplierService.java new file mode 100644 index 0000000..25ea1f2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/supplier/SupplierService.java @@ -0,0 +1,90 @@ +package com.win.module.eam.service.supplier; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.supplier.vo.*; +import com.win.module.eam.dal.dataobject.supplier.SupplierDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 供应商 Service 接口 + * + * @author 超级管理员 + */ +public interface SupplierService { + + /** + * 创建供应商 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSupplier(@Valid SupplierCreateReqVO createReqVO); + + /** + * 更新供应商 + * + * @param updateReqVO 更新信息 + */ + Integer updateSupplier(@Valid SupplierUpdateReqVO updateReqVO); + + /** + * 删除供应商 + * + * @param id 编号 + */ + Integer deleteSupplier(Long id); + + /** + * 获得供应商 + * + * @param id 编号 + * @return 供应商 + */ + SupplierDO getSupplier(Long id); + + /** + * 获得供应商列表 + * + * @param ids 编号 + * @return 供应商列表 + */ + List getSupplierList(Collection ids); + + /** + * 获得供应商分页 + * + * @param pageReqVO 分页查询 + * @return 供应商分页 + */ + PageResult getSupplierPage(SupplierPageReqVO pageReqVO); + + /** + * 获得供应商列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 供应商列表 + */ + List getSupplierList(SupplierExportReqVO exportReqVO); + + + /** + * 获得供应商列表 + * + * @param reqVo + * @return 供应商列表 + */ + List getSupplierNoPage(SupplierReqVO reqVo); + + /** + * 获得用高级搜索供应商列表 + * + * @param conditions 分页、排序和自定义条件 + * @return 分页列表 + */ + PageResult getSupplierSenior(CustomConditions conditions); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/supplier/SupplierServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/supplier/SupplierServiceImpl.java new file mode 100644 index 0000000..8a936ad --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/supplier/SupplierServiceImpl.java @@ -0,0 +1,111 @@ +package com.win.module.eam.service.supplier; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.exception.util.ServiceExceptionUtil; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.supplier.vo.*; +import com.win.module.eam.convert.supplier.SupplierConvert; +import com.win.module.eam.dal.dataobject.supplier.SupplierDO; +import com.win.module.eam.dal.mysql.supplier.SupplierMapper; +import com.win.module.infra.api.trends.TrendsApi; +import com.win.module.infra.enums.TrendsTypeEnum; +import com.win.module.system.api.serialnumber.SerialNumberApi; +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; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 供应商 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class SupplierServiceImpl implements SupplierService { + + @Resource + private SupplierMapper supplierMapper; + @Resource + private SerialNumberApi serialNumberApi; + @Resource + private TrendsApi trendsApi; + + @Override + public Long createSupplier(SupplierCreateReqVO createReqVO) { + // 插入 + SupplierDO supplier = SupplierConvert.INSTANCE.convert(createReqVO); + QueryWrapper objectQueryWrapper = new QueryWrapper<>(); + objectQueryWrapper.eq("number", createReqVO.getNumber()); + objectQueryWrapper.eq("deleted", 0); + List supplierDOList = supplierMapper.selectList(objectQueryWrapper); + if (supplierDOList.size() > 0) { + throw ServiceExceptionUtil.exception(SUPPLIER_HAVE_EXISTS); + } + supplier.setCreateTime(LocalDateTime.now()); + supplierMapper.insert(supplier); + trendsApi.createTrends(supplier.getId(), "Supplier", "增加了供应商", TrendsTypeEnum.CREATE); + // 返回 + return supplier.getId(); + } + + @Override + public Integer updateSupplier(SupplierUpdateReqVO updateReqVO) { + // 校验存在 + validateSupplierExists(updateReqVO.getId()); + // 更新 + SupplierDO updateObj = SupplierConvert.INSTANCE.convert(updateReqVO); + return supplierMapper.updateById(updateObj); + } + + @Override + public Integer deleteSupplier(Long id) { + // 校验存在 + validateSupplierExists(id); + // 删除 + return supplierMapper.deleteById(id); + } + + private void validateSupplierExists(Long id) { + if (supplierMapper.selectById(id) == null) { + throw exception(SUPPLIER_NOT_EXISTS); + } + } + + @Override + public SupplierDO getSupplier(Long id) { + return supplierMapper.selectById(id); + } + + @Override + public List getSupplierList(Collection ids) { + return supplierMapper.selectBatchIds(ids); + } + + @Override + public PageResult getSupplierPage(SupplierPageReqVO pageReqVO) { + return supplierMapper.selectPage(pageReqVO); + } + + @Override + public List getSupplierList(SupplierExportReqVO exportReqVO) { + return supplierMapper.selectList(exportReqVO); + } + + @Override + public List getSupplierNoPage(SupplierReqVO reqVo) { + return supplierMapper.selectNoPage(reqVo); + } + @Override + public PageResult getSupplierSenior(CustomConditions conditions) { + return supplierMapper.selectSenior(conditions); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobDetailItemService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobDetailItemService.java new file mode 100644 index 0000000..3ede9be --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobDetailItemService.java @@ -0,0 +1,80 @@ +package com.win.module.eam.service.techinspectionjob; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailItemDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 检修工单子表与备件关系 Service 接口 + * + * @author 超级管理员 + */ +public interface TechInspectionJobDetailItemService { + + /** + * 创建检修工单子表与备件关系 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceInspectionDetailItem(@Valid DeviceInspectionJobDetailItemCreateReqVO createReqVO); + + /** + * 更新检修工单子表与备件关系 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceInspectionDetailItem(@Valid DeviceInspectionJobDetailItemUpdateReqVO updateReqVO); + + /** + * 删除检修工单子表与备件关系 + * + * @param id 编号 + */ + Integer deleteDeviceInspectionDetailItem(Long id); + + /** + * 获得检修工单子表与备件关系 + * + * @param id 编号 + * @return 检修工单子表与备件关系 + */ + DeviceInspectionJobDetailItemDO getDeviceInspectionDetailItem(Long id); + + /** + * 获得检修工单子表与备件关系列表 + * + * @param ids 编号 + * @return 检修工单子表与备件关系列表 + */ + List getDeviceInspectionDetailItemList(Collection ids); + + /** + * 获得检修工单子表与备件关系分页 + * + * @param pageReqVO 分页查询 + * @return 检修工单子表与备件关系分页 + */ + PageResult getDeviceInspectionDetailItemPage(DeviceInspectionJobDetailItemPageReqVO pageReqVO); + + /** + * 获得检修工单子表与备件关系列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 检修工单子表与备件关系列表 + */ + List getDeviceInspectionDetailItemList(DeviceInspectionJobDetailItemExportReqVO exportReqVO); + + /** + * 导入检修工单子表与备件关系主信息 + * + * @param datas 导入检修工单子表与备件关系主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceInspectionDetailItemList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobDetailItemServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobDetailItemServiceImpl.java new file mode 100644 index 0000000..145d3c3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobDetailItemServiceImpl.java @@ -0,0 +1,107 @@ +package com.win.module.eam.service.techinspectionjob; + +import cn.hutool.core.collection.CollUtil; +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailItemDO; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobDetailItemConvert; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobDetailItemMapper; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * 检修工单子表与备件关系 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class TechInspectionJobDetailItemServiceImpl implements TechInspectionJobDetailItemService { + + @Resource + private DeviceInspectionJobDetailItemMapper deviceInspectionDetailItemMapper; + + @Override + public Long createDeviceInspectionDetailItem(DeviceInspectionJobDetailItemCreateReqVO createReqVO) { + // 插入 + DeviceInspectionJobDetailItemDO deviceInspectionDetailItem = DeviceInspectionJobDetailItemConvert.INSTANCE.convert(createReqVO); + deviceInspectionDetailItemMapper.insert(deviceInspectionDetailItem); + // 返回 + return deviceInspectionDetailItem.getId(); + } + + @Override + public Integer updateDeviceInspectionDetailItem(DeviceInspectionJobDetailItemUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceInspectionDetailItemExists(updateReqVO.getId()); + // 更新 + DeviceInspectionJobDetailItemDO updateObj = DeviceInspectionJobDetailItemConvert.INSTANCE.convert(updateReqVO); + return deviceInspectionDetailItemMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceInspectionDetailItem(Long id) { + // 校验存在 + validateDeviceInspectionDetailItemExists(id); + // 删除 + return deviceInspectionDetailItemMapper.deleteById(id); + } + + private void validateDeviceInspectionDetailItemExists(Long id) { + if (deviceInspectionDetailItemMapper.selectById(id) == null) { + //throw exception(DEVICE_INSPECTION_DETAIL_ITEM_NOT_EXISTS); + } + } + + @Override + public DeviceInspectionJobDetailItemDO getDeviceInspectionDetailItem(Long id) { + return deviceInspectionDetailItemMapper.selectById(id); + } + + @Override + public List getDeviceInspectionDetailItemList(Collection ids) { + return deviceInspectionDetailItemMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceInspectionDetailItemPage(DeviceInspectionJobDetailItemPageReqVO pageReqVO) { + return deviceInspectionDetailItemMapper.selectPage(pageReqVO); + } + + @Override + public List getDeviceInspectionDetailItemList(DeviceInspectionJobDetailItemExportReqVO exportReqVO) { + return deviceInspectionDetailItemMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceInspectionDetailItemList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_INSPECTION_DETAIL_ITEM_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceInspectionDetailItemDO obj = deviceInspectionDetailItemMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceInspectionDetailItemMapper.insert(DeviceInspectionDetailItemConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceInspectionDetailItemDO deviceInspectionDetailItemDO = DeviceInspectionDetailItemConvert.INSTANCE.convert(item); +// deviceInspectionDetailItemDO.setId(obj.getId()); +// deviceInspectionDetailItemMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobDetailService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobDetailService.java new file mode 100644 index 0000000..5b4645c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobDetailService.java @@ -0,0 +1,87 @@ +package com.win.module.eam.service.techinspectionjob; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 检修工单子 Service 接口 + * + * @author 超级管理员 + */ +public interface TechInspectionJobDetailService { + + /** + * 创建检修工单子 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceInspectionDetail(@Valid DeviceInspectionJobDetailCreateReqVO createReqVO); + + /** + * 更新检修工单子 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceInspectionDetail(@Valid DeviceInspectionJobDetailUpdateReqVO updateReqVO); + + /** + * 删除检修工单子 + * + * @param id 编号 + */ + Integer deleteDeviceInspectionDetail(Long id); + + /** + * 获得检修工单子 + * + * @param id 编号 + * @return 检修工单子 + */ + DeviceInspectionJobDetailDO getDeviceInspectionDetail(Long id); + + /** + * 获得检修工单子列表 + * + * @param ids 编号 + * @return 检修工单子列表 + */ + List getDeviceInspectionDetailList(Collection ids); + + /** + * 获得检修工单子分页 + * + * @param pageReqVO 分页查询 + * @return 检修工单子分页 + */ + PageResult getDeviceInspectionDetailPage(DeviceInspectionJobDetailPageReqVO pageReqVO); + + /** + * 获得检修工单子列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 检修工单子列表 + */ + List getDeviceInspectionDetailList(DeviceInspectionJobDetailExportReqVO exportReqVO); + + /** + * 导入检修工单子主信息 + * + * @param datas 导入检修工单子主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceInspectionDetailList(List datas, Integer mode, boolean updatePart); + + /** + * 根据维修工单号查询工单子项列表信息 + * @param number + * @return + */ + List selectListByNumber(String number); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobDetailServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobDetailServiceImpl.java new file mode 100644 index 0000000..9ea9e6f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobDetailServiceImpl.java @@ -0,0 +1,242 @@ +package com.win.module.eam.service.techinspectionjob; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobDetailConvert; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailItemDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobMainDO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobDetailItemMapper; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobDetailMapper; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobMainMapper; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +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.module.eam.enums.ErrorCodeConstants.ITEM_NOT_EXISTS; + +/** + * 检修工单子 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class TechInspectionJobDetailServiceImpl implements TechInspectionJobDetailService { + + @Resource + private DeviceInspectionJobDetailMapper deviceInspectionDetailMapper; + + @Resource + ItemMapper itemMapper; + + @Resource + private DeviceInspectionJobDetailItemMapper detailItemMapper; + + @Resource + private DeviceInspectionJobMainMapper deviceInspectionJobMainMapper; + + @Resource + private DeviceInspectionJobDetailItemMapper deviceInspectionJobDetailItemMapper; + + @Resource + private AdminUserApi userApi; + + @Override + public Long createDeviceInspectionDetail(DeviceInspectionJobDetailCreateReqVO createReqVO) { + List mainDO = deviceInspectionJobMainMapper.selectList("number", createReqVO.getNumber()); + // 插入 + DeviceInspectionJobDetailDO deviceInspectionDetail = DeviceInspectionJobDetailConvert.INSTANCE.convert(createReqVO); + deviceInspectionDetail.setMasterId(mainDO.get(0).getId()); + deviceInspectionDetailMapper.insert(deviceInspectionDetail); + List> itemList = createReqVO.getItemNumbers();//备件号集合 + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(!itemDOS.isEmpty()){ + String number = itemDOS.get(0).getNumber(); + DeviceInspectionJobDetailItemDO dos = new DeviceInspectionJobDetailItemDO(); + dos.setMasterId(deviceInspectionDetail.getId()); + dos.setItemNumber(number); + dos.setMasterId(deviceInspectionDetail.getId()); + dos.setNumber(createReqVO.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + detailItemMapper.insert(dos); + }else{ + throw exception(ITEM_NOT_EXISTS); + } + } + } + // 返回 + return deviceInspectionDetail.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateDeviceInspectionDetail(DeviceInspectionJobDetailUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceInspectionDetailExists(updateReqVO.getId()); + // 更新 + DeviceInspectionJobDetailDO updateObj = DeviceInspectionJobDetailConvert.INSTANCE.convert(updateReqVO); + int i = deviceInspectionDetailMapper.updateById(updateObj); + //先删除关联备件 + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("master_id", updateReqVO.getId()); + itemQueryWrapper.eq("deleted", 0); + List deviceInspectionDetailItemDOS = detailItemMapper.selectList(itemQueryWrapper); + for(DeviceInspectionJobDetailItemDO item:deviceInspectionDetailItemDOS){ + detailItemMapper.deleteById(item.getId()); + } + //再添加备件 + List> itemList = updateReqVO.getItemNumbers(); + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(!itemDOS.isEmpty()){ + String number = itemDOS.get(0).getNumber(); + DeviceInspectionJobDetailItemDO dos = new DeviceInspectionJobDetailItemDO(); + dos.setItemNumber(number); + dos.setMasterId(updateReqVO.getId()); + dos.setNumber(updateReqVO.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + detailItemMapper.insert(dos); + }else{ + throw exception(ITEM_NOT_EXISTS); + } + } + } + return i; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer deleteDeviceInspectionDetail(Long id) { + // 校验存在 + validateDeviceInspectionDetailExists(id); + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("master_id", id); + itemQueryWrapper.eq("deleted", 0); + List deviceInspectionDetailItemDOS = detailItemMapper.selectList(itemQueryWrapper); + for(DeviceInspectionJobDetailItemDO item:deviceInspectionDetailItemDOS){ + detailItemMapper.deleteById(item.getId()); + } + // 删除 + return deviceInspectionDetailMapper.deleteById(id); + + + } + + private void validateDeviceInspectionDetailExists(Long id) { + if (deviceInspectionDetailMapper.selectById(id) == null) { + // throw exception(DEVICE_INSPECTION_DETAIL_NOT_EXISTS); + } + } + + @Override + public DeviceInspectionJobDetailDO getDeviceInspectionDetail(Long id) { + return deviceInspectionDetailMapper.selectById(id); + } + + @Override + public List getDeviceInspectionDetailList(Collection ids) { + return deviceInspectionDetailMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceInspectionDetailPage(DeviceInspectionJobDetailPageReqVO pageReqVO) { + PageResult deviceInspectionJobDetailDOList = deviceInspectionDetailMapper.selectPage(pageReqVO); + for(DeviceInspectionJobDetailDO en:deviceInspectionJobDetailDOList.getList()){ + List> list = deviceInspectionJobDetailItemMapper.selectListById(en.getId()); + en.setItemNumbers(list); + } + return deviceInspectionJobDetailDOList; + } + + @Override + public List getDeviceInspectionDetailList(DeviceInspectionJobDetailExportReqVO exportReqVO) { + return deviceInspectionDetailMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceInspectionDetailList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_INSPECTION_DETAIL_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceInspectionDetailDO obj = deviceInspectionDetailMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceInspectionDetailMapper.insert(DeviceInspectionDetailConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceInspectionDetailDO deviceInspectionDetailDO = DeviceInspectionDetailConvert.INSTANCE.convert(item); +// deviceInspectionDetailDO.setId(obj.getId()); +// deviceInspectionDetailMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public List selectListByNumber(String number) { + QueryWrapper detailsDOQueryWrapper = new QueryWrapper<>(); + detailsDOQueryWrapper.eq("number", number); + detailsDOQueryWrapper.eq("available", "TRUE"); + List maintenanceNumber = deviceInspectionDetailMapper.selectList(detailsDOQueryWrapper); + for(DeviceInspectionJobDetailDO en:maintenanceNumber){ + if(en.getStatus().equals("TRUE")){ + en.setStatusName("是"); + }else{ + en.setStatusName("否"); + } + StringBuilder names = new StringBuilder(); + if(!"".equals(en.getChargePeoples())&& en.getChargePeoples()!=null){ + String[] split = en.getChargePeoples().split(","); + for(int i = 0; i < split.length; i++) { + AdminUserRespDTO user = userApi.getUser(Long.parseLong(split[i])); + if (names.length() > 0) { + names.append(", "); + } + if(user!=null){ + String name = user.getNickname(); + names.append(name); + } + + } + en.setChargePeoplesName(names.toString()); + } + List> list = detailItemMapper.selectListById(en.getId()); +// StringBuilder sb = new StringBuilder(); +// for(Map map:list){ +// if (sb.length() > 0) { +// sb.append(", "); +// } +// String name = map.get("name").toString(); +// String qty = map.get("qty").toString(); +// sb.append(name+":"+qty); +// } + en.setItems(list); + } + return maintenanceNumber; + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobMainService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobMainService.java new file mode 100644 index 0000000..f595ae5 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobMainService.java @@ -0,0 +1,146 @@ +package com.win.module.eam.service.techinspectionjob; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobMainDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionReportDo; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 检修工单主 Service 接口 + * + * @author 超级管理员 + */ +public interface TechInspectionJobMainService { + + /** + * 创建检修工单主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceInspectionMain(@Valid DeviceInspectionJobMainCreateReqVO createReqVO); + + /** + * 更新检修工单主 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceInspectionMain(@Valid DeviceInspectionJobMainUpdateReqVO updateReqVO); + + /** + * 删除检修工单主 + * + * @param id 编号 + */ + Integer deleteDeviceInspectionMain(Long id); + + /** + * 获得检修工单主 + * + * @param id 编号 + * @return 检修工单主 + */ + DeviceInspectionJobMainDO getDeviceInspectionMain(Long id); + + /** + * 获得检修工单主列表 + * + * @param ids 编号 + * @return 检修工单主列表 + */ + List getDeviceInspectionMainList(Collection ids); + + /** + * 获得检修工单主分页 + * + * @param pageReqVO 分页查询 + * @return 检修工单主分页 + */ + PageResult getDeviceInspectionMainPage(DeviceInspectionJobMainPageReqVO pageReqVO); + + /** + * 获得备件台账分页 + * + * @param conditions 分页查询 + * @return 备件台账分页 + */ + PageResult getInspectionJobMainSenior(CustomConditions conditions); + + /** + * 获得检修工单主列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 检修工单主列表 + */ + List getDeviceInspectionMainList(DeviceInspectionJobMainExportReqVO exportReqVO); + + /** + * 导入检修工单主主信息 + * + * @param datas 导入检修工单主主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceInspectionMainList(List datas, Integer mode, boolean updatePart); + + /** + * APP检修工单主表分页 + * @param pageReqVO + * @return + */ + PageResult getAppPage(DeviceInspectionJobMainPageReqVO pageReqVO); + + /** + * 检修点击完成 + * @param id 编号 + */ + Integer onClick(Long id); + + /** + * 检修点击验证 + * @param id 编号 + * @param verifyContent 验证内容 + */ + Integer onVerify(Long id,String verifyContent); + + + + /** + * 创建检修工单主PC + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceInspectionMainPC(@Valid DeviceInspectionJobMainCreateReqVO createReqVO); + + + List getDeviceInspectionMainNoPage(DeviceInspectionJobMainPageReqVO pageReqVO); + + + /** + *@Author longlongxiaogege + *@Description //生成保养打印表子内容 + *@Date 13:17 2024/4/18 + *@Param [deviceMaintainJobReportDo] + *@return java.util.List + **/ + List getInspectionReport(DeviceInspectionReportDo deviceInspectionReportDo); + + + /** + *@Author longlongxiaogege + *@Description //生成保养打印表主内容 + *@Date 13:17 2024/4/18 + *@Param [deviceMaintainJobReportDo] + *@return java.util.List + **/ + List getInspectionReportMainInfo(DeviceInspectionReportDo deviceInspectionReportDo); + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobMainServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobMainServiceImpl.java new file mode 100644 index 0000000..fe041cd --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techinspectionjob/TechInspectionJobMainServiceImpl.java @@ -0,0 +1,410 @@ +package com.win.module.eam.service.techinspectionjob; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.deviceinspectionjob.vo.*; +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobDetailConvert; +import com.win.module.eam.convert.deviceinspectionjob.DeviceInspectionJobMainConvert; +import com.win.module.eam.dal.dataobject.classtype.ClassTypeDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobDetailItemDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionJobMainDO; +import com.win.module.eam.dal.dataobject.deviceinspectionjob.DeviceInspectionReportDo; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.mysql.classtype.ClassTypeMapper; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobDetailItemMapper; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobDetailMapper; +import com.win.module.eam.dal.mysql.deviceinspectionjob.DeviceInspectionJobMainMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobMainMapper; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.system.api.dept.DeptApi; +import com.win.module.system.api.mail.MailSendApi; +import com.win.module.system.api.mail.dto.MailSendSingleToUserReqDTO; +import com.win.module.system.api.permission.PermissionApi; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.api.user.dto.AdminUserRespExpandDTO; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; + +import static cn.hutool.log.StaticLog.info; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 检修工单主 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class TechInspectionJobMainServiceImpl implements TechInspectionJobMainService { + + @Resource + private DeviceInspectionJobMainMapper deviceInspectionJobMainMapper; + + @Resource + private DeviceMaintenanceJobMainMapper deviceMaintenanceJobMainMapper; + + @Resource + private SerialNumberApi serialNumberApi; + + @Resource + private AdminUserApi userApi; + + @Resource + private DeptApi deptApi; + + @Resource + private DeviceInspectionJobDetailMapper deviceInspectionDetailMapper; + + @Resource + private ItemMapper itemMapper; + + @Resource + private DeviceInspectionJobDetailItemMapper deviceInspectionDetailItemMapper; + + @Resource + private PermissionApi permissionApi; + + @Resource + private MoldAccountsMapper moldAccountsMapper; + + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + + @Resource + private MailSendApi mailSendApi; + + @Resource + private ClassTypeMapper classTypeMapper; + + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDeviceInspectionMain(DeviceInspectionJobMainCreateReqVO createReqVO) { + if(createReqVO.getMaintenance() == null){ + throw exception(JIAN_XIU_MAINTENANCE_NOT_EMPTY); + } + // 插入 + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + DeviceInspectionJobMainDO deviceInspectionMain = DeviceInspectionJobMainConvert.INSTANCE.convert(createReqVO); + deviceInspectionMain.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode());//已接单 + String number = serialNumberApi.generateCode(RuleCodeEnum.JIAN_XIU_ORDER.getCode()); + deviceInspectionMain.setNumber(number); + //检修工单是否选择了维修工单 + if(createReqVO.getMaintenanceNumber()!=null && !"".equals(createReqVO.getMaintenanceNumber())){ + DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectOne("number",createReqVO.getMaintenanceNumber());//根据维修工单号查询维修 + //校验检修中维修工单唯一性 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("maintenance_number",createReqVO.getNumber()); + queryWrapper.eq("status",OrderStatusEnum.JX_PROCCED_STATUS.getCode()); + List jobMainDOS = deviceInspectionJobMainMapper.selectList(queryWrapper); + if(jobMainDOS!=null&&!jobMainDOS.isEmpty()){//不能重复选择相同维修工单 + throw exception(WEI_XIU_ORITEM_NOMAL); + } + deviceInspectionMain.setDeviceNumber(deviceMaintenanceJobMainDO.getDeviceNumber()); + deviceInspectionMain.setType(deviceMaintenanceJobMainDO.getType()); + deviceInspectionMain.setFactoryAreaNumber(deviceMaintenanceJobMainDO.getFactoryAreaNumber()); + deviceInspectionMain.setDeptId(Long.parseLong(deviceMaintenanceJobMainDO.getFactoryAreaNumber())); + }else{//如果没有选择则传设备模具和type + deviceInspectionMain.setDeviceNumber(createReqVO.getDeviceNumber()); + deviceInspectionMain.setType(createReqVO.getType()); + //校验检修中的设备唯一性 + String deviceNumber = createReqVO.getDeviceNumber(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("device_number",deviceNumber); + queryWrapper.eq("status",OrderStatusEnum.JX_PROCCED_STATUS.getCode()); + List deviceInspectionJobMainDOS = deviceInspectionJobMainMapper.selectList(queryWrapper); + if(deviceInspectionJobMainDOS!=null&&!deviceInspectionJobMainDOS.isEmpty()){//该设备模具已经有正在检修中未完成的不能再选 + throw exception(DEVICE_ORITEM_NOMAL); + } + } + deviceInspectionMain.setReceivingTime(LocalDateTime.now()); + deviceInspectionMain.setDeptId(user.getDeptId()); + deviceInspectionJobMainMapper.insert(deviceInspectionMain); + // 返回 + return deviceInspectionMain.getId(); + } + + @Override + public Integer updateDeviceInspectionMain(DeviceInspectionJobMainUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceInspectionMainExists(updateReqVO.getId()); + // 更新 + DeviceInspectionJobMainDO updateObj = DeviceInspectionJobMainConvert.INSTANCE.convert(updateReqVO); + //检修工单是否选择了维修工单 + if(updateReqVO.getMaintenanceNumber()!=null && !"".equals(updateReqVO.getMaintenanceNumber())){ + DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectOne("number",updateReqVO.getMaintenanceNumber());//根据维修工单号查询维修 + updateObj.setDeviceNumber(deviceMaintenanceJobMainDO.getDeviceNumber()); + updateObj.setType(deviceMaintenanceJobMainDO.getType()); + updateObj.setNumber(deviceMaintenanceJobMainDO.getNumber()); + updateObj.setFactoryAreaNumber(deviceMaintenanceJobMainDO.getFactoryAreaNumber()); + } + return deviceInspectionJobMainMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceInspectionMain(Long id) { + // 校验存在 + validateDeviceInspectionMainExists(id); + // 删除 + return deviceInspectionJobMainMapper.deleteById(id); + } + + private void validateDeviceInspectionMainExists(Long id) { + if (deviceInspectionJobMainMapper.selectById(id) == null) { + throw exception(JIAN_XIU_ORDER_NOT_EXISTS); + } + } + + @Override + public DeviceInspectionJobMainDO getDeviceInspectionMain(Long id) { + return deviceInspectionJobMainMapper.selectById(id); + } + + @Override + public List getDeviceInspectionMainList(Collection ids) { + return deviceInspectionJobMainMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceInspectionMainPage(DeviceInspectionJobMainPageReqVO pageReqVO) { + return deviceInspectionJobMainMapper.selectPage(pageReqVO); + } + + @Override + public List getDeviceInspectionMainList(DeviceInspectionJobMainExportReqVO exportReqVO) { + return deviceInspectionJobMainMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceInspectionMainList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_INSPECTION_MAIN_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceInspectionMainDO obj = deviceInspectionMainMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceInspectionMainMapper.insert(DeviceInspectionMainConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceInspectionMainDO deviceInspectionMainDO = DeviceInspectionMainConvert.INSTANCE.convert(item); +// deviceInspectionMainDO.setId(obj.getId()); +// deviceInspectionMainMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public PageResult getAppPage(DeviceInspectionJobMainPageReqVO pageReqVO) { + pageReqVO.setUserId(getLoginUserId().toString()); + pageReqVO.setClassType("TECH"); + String b = classTypeMapper.getIdentity("TECH"); + if (b.equals("2")) { + throw exception(WORKER_ENGINEER_IS_NOT); + } + pageReqVO.setStandType(b); + if ("1".equals(pageReqVO.getFlag())) {//flag 0 首页进入 1我的进入 + pageReqVO.setUserId(getLoginUserId().toString()); + IPage pageInfo = deviceInspectionJobMainMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for(DeviceInspectionJobMainDO en :pageInfo.getRecords()){ + String deviceNumber = en.getDeviceNumber(); + String type = en.getType(); + if("MOLD".equals(type)){//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + }else{//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + } + } + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } else { + //首页进入是获取未接单 已接单的单子 + pageReqVO.setFlag("0"); + } + IPage pageInfo = deviceInspectionJobMainMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + + @Override + public PageResult getInspectionJobMainSenior(CustomConditions conditions) { + return deviceInspectionJobMainMapper.selectSenior(conditions); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer onClick(Long id) { + // 校验存在 + validateDeviceInspectionMainExists(id); + // 更新 + DeviceInspectionJobMainDO inspectionMainDO = deviceInspectionJobMainMapper.selectById(id);//根据检修id获取检修信息 + long maintenance = inspectionMainDO.getMaintenance(); + long loginUserId = getLoginUserId(); + if(maintenance != loginUserId){//当前人与接单人不一致 + throw exception(JIAN_XIU_PEOPLE_DIFF); + } + //DeviceInspectionJobMainDO updateObj = new DeviceInspectionJobMainDO(); + inspectionMainDO.setId(id); + inspectionMainDO.setStatus(OrderStatusEnum.COMPLETED_STATUS.getCode());//已完成完成 + inspectionMainDO.setCompletionTime(LocalDateTime.now());//完成时间 + int i = deviceInspectionJobMainMapper.updateById(inspectionMainDO); + try { + sendEmails(inspectionMainDO); + } catch (Exception e) { + info("发送邮件异常:{}",e); + } + /*if(inspectionMainDO.getMaintenanceNumber()!=null&&!"".equals(inspectionMainDO.getMaintenanceNumber())){//有临时状态的维修工单需要更改状态 + List number = deviceMaintenanceJobMainMapper.selectList("number", inspectionMainDO.getMaintenanceNumber()); + DeviceMaintenanceJobMainDO maintenanceJobMainDO = number.get(0); + maintenanceJobMainDO.setResult(OrderStatusEnum.RESULT_COMPLETED.getCode()); + deviceMaintenanceJobMainMapper.updateById(maintenanceJobMainDO); + }*/ + return i; + } + + @Override + public Integer onVerify(Long id,String verifyContent) { + // 校验存在 + validateDeviceInspectionMainExists(id); + // 更新 + DeviceInspectionJobMainDO inspectionMainDO = deviceInspectionJobMainMapper.selectById(id);//根据检修id获取检修信息 + if(!OrderStatusEnum.COMPLETED_STATUS.getCode().equals(inspectionMainDO.getStatus())){ + throw exception(JIAN_XIU_NOT_COMPLETED); + } + inspectionMainDO.setVerifyTime(LocalDateTime.now()); + inspectionMainDO.setVerifyContent(verifyContent); + inspectionMainDO.setStatus(OrderStatusEnum.VERIFIED_STATUS.getCode());//已验证 + inspectionMainDO.setVerifyTime(LocalDateTime.now()); + inspectionMainDO.setVerifyer(getLoginUserId());//验证人 + int i = deviceInspectionJobMainMapper.updateById(inspectionMainDO); + if(inspectionMainDO.getMaintenanceNumber()!=null&&!"".equals(inspectionMainDO.getMaintenanceNumber())){//有临时状态的维修工单需要更改状态 + List number = deviceMaintenanceJobMainMapper.selectList("number", inspectionMainDO.getMaintenanceNumber()); + DeviceMaintenanceJobMainDO maintenanceJobMainDO = number.get(0); + maintenanceJobMainDO.setResult(OrderStatusEnum.RESULT_COMPLETED.getCode()); + deviceMaintenanceJobMainMapper.updateById(maintenanceJobMainDO); + } + return i; + } + + @Override + public Long createDeviceInspectionMainPC(DeviceInspectionJobMainCreateReqVO createReqVO) { + // 插入 + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + DeviceInspectionJobMainDO deviceInspectionMain = DeviceInspectionJobMainConvert.INSTANCE.convert(createReqVO); + deviceInspectionMain.setMaintenance(getLoginUserId()); + deviceInspectionMain.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode());//检修中 + String number = serialNumberApi.generateCode(RuleCodeEnum.JIAN_XIU_ORDER.getCode()); + deviceInspectionMain.setNumber(number); + deviceInspectionMain.setDeptId(user.getDeptId()); + //检修工单是否选择了维修工单 + if(createReqVO.getNumber()!=null && !"".equals(createReqVO.getNumber())){ + DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectOne("number",createReqVO.getNumber());//根据维修工单号查询维修 + deviceInspectionMain.setDeviceNumber(deviceMaintenanceJobMainDO.getDeviceNumber()); + deviceInspectionMain.setType(deviceMaintenanceJobMainDO.getType()); + deviceInspectionMain.setNumber(deviceMaintenanceJobMainDO.getNumber()); + deviceInspectionMain.setFactoryAreaNumber(deviceMaintenanceJobMainDO.getFactoryAreaNumber()); + } + if(createReqVO.getSubList()!=null&&!"".equals(createReqVO.getSubList())){//PC端传入 + //主子表 + List subDOList = DeviceInspectionJobDetailConvert.INSTANCE.convertList03(createReqVO.getSubList()); + for (DeviceInspectionJobDetailDO deviceMaintenanceDetail : subDOList) { + deviceMaintenanceDetail.setNumber(number); + //插入子项数据 + int id = deviceInspectionDetailMapper.insert(deviceMaintenanceDetail); + List> itemList = deviceMaintenanceDetail.getItemNumbers();//备件号集合 + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(itemDOS!=null){ + String numbers = itemDOS.get(0).getNumber(); + DeviceInspectionJobDetailItemDO dos = new DeviceInspectionJobDetailItemDO(); + dos.setItemNumber(numbers); + dos.setMasterId(deviceMaintenanceDetail.getId()); + dos.setNumber(deviceMaintenanceDetail.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + deviceInspectionDetailItemMapper.insert(dos); + } + } + } + } + } + deviceInspectionJobMainMapper.insert(deviceInspectionMain); + + // 返回 + return deviceInspectionMain.getId(); + } + + @Override + public List getDeviceInspectionMainNoPage(DeviceInspectionJobMainPageReqVO pageReqVO) { + return deviceInspectionJobMainMapper.selectNoPage(pageReqVO); + } + + @Override + public List getInspectionReport(DeviceInspectionReportDo deviceInspectionReportDo) { + return deviceInspectionJobMainMapper.getInspectionReport(deviceInspectionReportDo); + } + + @Override + public List getInspectionReportMainInfo(DeviceInspectionReportDo deviceInspectionReportDo) { + return deviceInspectionJobMainMapper.getInspectionReportMainInfo(deviceInspectionReportDo); + } + + /** + * 检修工单给工程师发验证邮件 + */ + private void sendEmails(DeviceInspectionJobMainDO inspectionMainDO){ + List userBeanList = classTypeMapper.JudgeIdentity(null, inspectionMainDO.getType(), "1", inspectionMainDO.getFactoryAreaNumber()); + userBeanList.stream().forEach(item -> { + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getUserId())); + mailSendSingleToUserReqDTO.setTemplateCode("job-inspection-verify"); + Map params = new HashMap<>(); + params.put("typeName", "工艺"); + params.put("number", inspectionMainDO.getNumber()); + params.put("name", item.getNickname()); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + } catch (RuntimeException e) { + info("工单编号为" + inspectionMainDO.getNumber() + "的名为:" + inspectionMainDO.getDescribes() + "的工单给" + item.getNickname() + "发送的邮件通知失败:{}", e); + } + }); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobDetailItemService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobDetailItemService.java new file mode 100644 index 0000000..1eae518 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobDetailItemService.java @@ -0,0 +1,79 @@ +package com.win.module.eam.service.techmaintainjob; + +import java.util.*; +import javax.validation.*; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintainjob.MaintainJobDetailItemDO; + +/** + * 保养工单子表与备件关系 Service 接口 + * + * @author 超级管理员 + */ +public interface TechMaintainJobDetailItemService { + + /** + * 创建保养工单子表与备件关系 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMaintainOrderDetailItem(@Valid MaintainJobDetailItemCreateReqVO createReqVO); + + /** + * 更新保养工单子表与备件关系 + * + * @param updateReqVO 更新信息 + */ + Integer updateMaintainOrderDetailItem(@Valid MaintainJobDetailItemUpdateReqVO updateReqVO); + + /** + * 删除保养工单子表与备件关系 + * + * @param id 编号 + */ + Integer deleteMaintainOrderDetailItem(Long id); + + /** + * 获得保养工单子表与备件关系 + * + * @param id 编号 + * @return 保养工单子表与备件关系 + */ + MaintainJobDetailItemDO getMaintainOrderDetailItem(Long id); + + /** + * 获得保养工单子表与备件关系列表 + * + * @param ids 编号 + * @return 保养工单子表与备件关系列表 + */ + List getMaintainOrderDetailItemList(Collection ids); + + /** + * 获得保养工单子表与备件关系分页 + * + * @param pageReqVO 分页查询 + * @return 保养工单子表与备件关系分页 + */ + PageResult getMaintainOrderDetailItemPage(MaintainJobDetailItemPageReqVO pageReqVO); + + /** + * 获得保养工单子表与备件关系列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 保养工单子表与备件关系列表 + */ + List getMaintainOrderDetailItemList(MaintainJobDetailItemExportReqVO exportReqVO); + + /** + * 导入保养工单子表与备件关系主信息 + * + * @param datas 导入保养工单子表与备件关系主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importMaintainOrderDetailItemList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobDetailItemServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobDetailItemServiceImpl.java new file mode 100644 index 0000000..af10731 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobDetailItemServiceImpl.java @@ -0,0 +1,105 @@ +package com.win.module.eam.service.techmaintainjob; + +import cn.hutool.core.collection.CollUtil; +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.convert.devicemaintainjob.MaintainJobDetailItemConvert; +import com.win.module.eam.dal.dataobject.devicemaintainjob.MaintainJobDetailItemDO; +import com.win.module.eam.dal.mysql.devicemaintainjob.MaintainJobDetailItemMapper; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.win.framework.common.pojo.PageResult; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * 保养工单子表与备件关系 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class TechMaintainJobDetailItemServiceImpl implements TechMaintainJobDetailItemService { + + @Resource + private MaintainJobDetailItemMapper maintainJobDetailItemMapper; + + @Override + public Long createMaintainOrderDetailItem(MaintainJobDetailItemCreateReqVO createReqVO) { + // 插入 + MaintainJobDetailItemDO maintainOrderDetailItem = MaintainJobDetailItemConvert.INSTANCE.convert(createReqVO); + maintainJobDetailItemMapper.insert(maintainOrderDetailItem); + // 返回 + return maintainOrderDetailItem.getId(); + } + + @Override + public Integer updateMaintainOrderDetailItem(MaintainJobDetailItemUpdateReqVO updateReqVO) { + // 校验存在 + validateMaintainOrderDetailItemExists(updateReqVO.getId()); + // 更新 + MaintainJobDetailItemDO updateObj = MaintainJobDetailItemConvert.INSTANCE.convert(updateReqVO); + return maintainJobDetailItemMapper.updateById(updateObj); + } + + @Override + public Integer deleteMaintainOrderDetailItem(Long id) { + // 校验存在 + validateMaintainOrderDetailItemExists(id); + // 删除 + return maintainJobDetailItemMapper.deleteById(id); + } + + private void validateMaintainOrderDetailItemExists(Long id) { + if (maintainJobDetailItemMapper.selectById(id) == null) { + //throw exception(MAINTAIN_ORDER_DETAIL_ITEM_NOT_EXISTS); + } + } + + @Override + public MaintainJobDetailItemDO getMaintainOrderDetailItem(Long id) { + return maintainJobDetailItemMapper.selectById(id); + } + + @Override + public List getMaintainOrderDetailItemList(Collection ids) { + return maintainJobDetailItemMapper.selectBatchIds(ids); + } + + @Override + public PageResult getMaintainOrderDetailItemPage(MaintainJobDetailItemPageReqVO pageReqVO) { + return maintainJobDetailItemMapper.selectPage(pageReqVO); + } + + @Override + public List getMaintainOrderDetailItemList(MaintainJobDetailItemExportReqVO exportReqVO) { + return maintainJobDetailItemMapper.selectList(exportReqVO); + } + + @Override + public List importMaintainOrderDetailItemList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(MAINTAIN_ORDER_DETAIL_ITEM_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// MaintainOrderDetailItemDO obj = maintainOrderDetailItemMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// maintainOrderDetailItemMapper.insert(MaintainOrderDetailItemConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// MaintainOrderDetailItemDO maintainOrderDetailItemDO = MaintainOrderDetailItemConvert.INSTANCE.convert(item); +// maintainOrderDetailItemDO.setId(obj.getId()); +// maintainOrderDetailItemMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobDetailService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobDetailService.java new file mode 100644 index 0000000..6442486 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobDetailService.java @@ -0,0 +1,87 @@ +package com.win.module.eam.service.techmaintainjob; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobDetailDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 保养工单子 Service 接口 + * + * @author 超级管理员 + */ +public interface TechMaintainJobDetailService { + + /** + * 创建保养工单子 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintainOrderDetail(@Valid DeviceMaintainJobDetailCreateReqVO createReqVO); + + /** + * 更新保养工单子 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceMaintainOrderDetail(@Valid DeviceMaintainJobDetailUpdateReqVO updateReqVO); + + /** + * 删除保养工单子 + * + * @param id 编号 + */ + Integer deleteDeviceMaintainOrderDetail(Long id); + + /** + * 获得保养工单子 + * + * @param id 编号 + * @return 保养工单子 + */ + DeviceMaintainJobDetailDO getDeviceMaintainOrderDetail(Long id); + + /** + * 获得保养工单子列表 + * + * @param ids 编号 + * @return 保养工单子列表 + */ + List getDeviceMaintainOrderDetailList(Collection ids); + + /** + * 查询保养子项列表 + * @param number + * @return + */ + List selectListByNumber(String number); + + /** + * 获得保养工单子分页 + * + * @param pageReqVO 分页查询 + * @return 保养工单子分页 + */ + PageResult getDeviceMaintainOrderDetailPage(DeviceMaintainJobDetailPageReqVO pageReqVO); + + /** + * 获得保养工单子列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 保养工单子列表 + */ + List getDeviceMaintainOrderDetailList(DeviceMaintainJobDetailExportReqVO exportReqVO); + + /** + * 导入保养工单子主信息 + * + * @param datas 导入保养工单子主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceMaintainOrderDetailList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobDetailServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobDetailServiceImpl.java new file mode 100644 index 0000000..0a25514 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobDetailServiceImpl.java @@ -0,0 +1,220 @@ +package com.win.module.eam.service.techmaintainjob; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.convert.devicemaintainjob.DeviceMaintainJobDetailConvert; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobDetailDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.MaintainJobDetailItemDO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.mysql.devicemaintainjob.DeviceMaintainJobDetailMapper; +import com.win.module.eam.dal.mysql.devicemaintainjob.DeviceMaintainJobMainMapper; +import com.win.module.eam.dal.mysql.devicemaintainjob.MaintainJobDetailItemMapper; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +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.module.eam.enums.ErrorCodeConstants.ITEM_NOT_EXISTS; + + +/** + * 保养工单子 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class TechMaintainJobDetailServiceImpl implements TechMaintainJobDetailService { + + @Resource + private DeviceMaintainJobDetailMapper deviceMaintainJobDetailMapper; + + @Resource + private MaintainJobDetailItemMapper maintainJobDetailItemMapper; + + @Resource + private DeviceMaintainJobMainMapper deviceMaintainJobMainMapper; + + @Resource + private AdminUserApi userApi; + + @Resource + ItemMapper itemMapper; + + @Override + public Long createDeviceMaintainOrderDetail(DeviceMaintainJobDetailCreateReqVO createReqVO) { + List mainDO = deviceMaintainJobMainMapper.selectList("number", createReqVO.getNumber()); + // 插入 + DeviceMaintainJobDetailDO deviceMaintainOrderDetail = DeviceMaintainJobDetailConvert.INSTANCE.convert(createReqVO); + deviceMaintainOrderDetail.setMasterId(mainDO.get(0).getId()); + int i = deviceMaintainJobDetailMapper.insert(deviceMaintainOrderDetail); + List> itemList = createReqVO.getItemNumbers();//备件号集合 + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(!itemDOS.isEmpty()){ + String number = itemDOS.get(0).getNumber(); + MaintainJobDetailItemDO dos = new MaintainJobDetailItemDO(); + dos.setItemNumber(number); + dos.setMasterId(deviceMaintainOrderDetail.getId()); + dos.setNumber(createReqVO.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + maintainJobDetailItemMapper.insert(dos); + }else{ + throw exception(ITEM_NOT_EXISTS); + } + } + } + // 返回 + return deviceMaintainOrderDetail.getId(); + } + + @Override + public Integer updateDeviceMaintainOrderDetail(DeviceMaintainJobDetailUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceMaintainOrderDetailExists(updateReqVO.getId()); + // 更新 + DeviceMaintainJobDetailDO updateObj = DeviceMaintainJobDetailConvert.INSTANCE.convert(updateReqVO); + int i = deviceMaintainJobDetailMapper.updateById(updateObj); + //先删除关联备件 + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("master_id", updateReqVO.getId()); + itemQueryWrapper.eq("deleted", 0); + List maintainJobDetailItemDOS = maintainJobDetailItemMapper.selectList(itemQueryWrapper); + for(MaintainJobDetailItemDO item: maintainJobDetailItemDOS){ + maintainJobDetailItemMapper.deleteById(item.getId()); + } + //再重新添加 + List> itemList = updateReqVO.getItemNumbers();//备件号集合 + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(!itemDOS.isEmpty()){ + String number = itemDOS.get(0).getNumber(); + MaintainJobDetailItemDO dos = new MaintainJobDetailItemDO(); + dos.setItemNumber(number); + dos.setMasterId(updateReqVO.getId()); + dos.setNumber(updateReqVO.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + maintainJobDetailItemMapper.insert(dos); + }else{ + throw exception(ITEM_NOT_EXISTS); + } + } + } + // 返回 + return i; + } + + @Override + public Integer deleteDeviceMaintainOrderDetail(Long id) { + // 校验存在 + validateDeviceMaintainOrderDetailExists(id); + // 删除 + return deviceMaintainJobDetailMapper.deleteById(id); + } + + private void validateDeviceMaintainOrderDetailExists(Long id) { + if (deviceMaintainJobDetailMapper.selectById(id) == null) { + //throw exception(DEVICE_MAINTAIN_ORDER_DETAIL_NOT_EXISTS); + } + } + + @Override + public DeviceMaintainJobDetailDO getDeviceMaintainOrderDetail(Long id) { + return deviceMaintainJobDetailMapper.selectById(id); + } + + @Override + public List getDeviceMaintainOrderDetailList(Collection ids) { + return deviceMaintainJobDetailMapper.selectBatchIds(ids); + } + + @Override + public List selectListByNumber(String number) { + QueryWrapper detailsDOQueryWrapper = new QueryWrapper<>(); + detailsDOQueryWrapper.eq("number", number); + detailsDOQueryWrapper.eq("available", "TRUE"); + List maintenanceNumber = deviceMaintainJobDetailMapper.selectList(detailsDOQueryWrapper); + for(DeviceMaintainJobDetailDO en:maintenanceNumber){ + StringBuilder names = new StringBuilder(); + if(!"".equals(en.getChargePeoples())&& en.getChargePeoples()!=null){ + String[] split = en.getChargePeoples().split(","); + for(int i = 0; i < split.length; i++) { + AdminUserRespDTO user = userApi.getUser(Long.parseLong(split[i])); + if (names.length() > 0) { + names.append(", "); + } + String name = user.getNickname(); + names.append(name); + } + en.setChargePeoplesName(names.toString()); + } + List> list = maintainJobDetailItemMapper.selectListById(en.getId()); +// StringBuilder sb = new StringBuilder(); +// for(Map map:list){ +// if (sb.length() > 0) { +// sb.append(", "); +// } +// String name = map.get("name").toString(); +// String qty = map.get("qty").toString(); +// sb.append(name+":"+qty); +// } + en.setItems(list); + } + return maintenanceNumber; + } + + @Override + public PageResult getDeviceMaintainOrderDetailPage(DeviceMaintainJobDetailPageReqVO pageReqVO) { + + PageResult deviceMaintainJobDetailDOList = deviceMaintainJobDetailMapper.selectPage(pageReqVO); + for(DeviceMaintainJobDetailDO en:deviceMaintainJobDetailDOList.getList()){ + List> list = maintainJobDetailItemMapper.selectListById(en.getId()); + en.setItemNumbers(list); + } + return deviceMaintainJobDetailDOList; + } + + @Override + public List getDeviceMaintainOrderDetailList(DeviceMaintainJobDetailExportReqVO exportReqVO) { + return deviceMaintainJobDetailMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceMaintainOrderDetailList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_MAINTAIN_ORDER_DETAIL_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceMaintainOrderDetailDO obj = deviceMaintainOrderDetailMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceMaintainOrderDetailMapper.insert(DeviceMaintainOrderDetailConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceMaintainOrderDetailDO deviceMaintainOrderDetailDO = DeviceMaintainOrderDetailConvert.INSTANCE.convert(item); +// deviceMaintainOrderDetailDO.setId(obj.getId()); +// deviceMaintainOrderDetailMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobMainService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobMainService.java new file mode 100644 index 0000000..2dbc9d6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobMainService.java @@ -0,0 +1,151 @@ +package com.win.module.eam.service.techmaintainjob; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobReportDo; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 保养工单主 Service 接口 + * + * @author 超级管理员 + */ +public interface TechMaintainJobMainService { + + /** + * 创建保养工单主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintainOrderMain(@Valid DeviceMaintainJobMainCreateReqVO createReqVO); + + /** + * 更新保养工单主 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceMaintainOrderMain(@Valid DeviceMaintainJobMainUpdateReqVO updateReqVO); + + /** + * 删除保养工单主 + * + * @param id 编号 + */ + Integer deleteDeviceMaintainOrderMain(Long id); + + /** + * 获得保养工单主 + * + * @param id 编号 + * @return 保养工单主 + */ + DeviceMaintainJobMainDO getDeviceMaintainOrderMain(Long id); + + /** + * 获得保养工单主列表 + * + * @param ids 编号 + * @return 保养工单主列表 + */ + List getDeviceMaintainOrderMainList(Collection ids); + + /** + * 获得保养工单主分页 + * + * @param pageReqVO 分页查询 + * @return 保养工单主分页 + */ + PageResult getDeviceMaintainOrderMainPage(DeviceMaintainJobMainPageReqVO pageReqVO); + + + /** + * 获得保养工单主分页 + * + * @param conditions 分页查询 + * @return 保养工单主分页 + */ + PageResult getDeviceMaintainOrderMainSenior(CustomConditions conditions); + + + + /** + * APP分页 + * @param pageReqVO + * @return + */ + PageResult getAppPage(DeviceMaintainJobMainPageReqVO pageReqVO); + + /** + * 获得保养工单主列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 保养工单主列表 + */ + List getDeviceMaintainOrderMainList(DeviceMaintainJobMainExportReqVO exportReqVO); + + /** + * 导入保养工单主主信息 + * + * @param datas 导入保养工单主主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceMaintainOrderMainList(List datas, Integer mode, boolean updatePart); + + /** + * 保养工单点击接单 维修人员和工程师都能接单 + * @param id + * @return + */ + int orderClick(Long id); + + /** + * 点击完成 + * @param id + * @return + */ + int orderClickFinish(Long id); + + /** + * 保养工单工程师审核 + * @param id 工单id + * @param verifyContent 审核意见 + * @return + */ + int orderClickVerify(Long id,String verifyContent); + + /** + * 每月月初一号查询上个月未完成的保养和维修工单给主管发邮件 + */ + void createUncompletedOrderTask(); + + /** + *@Author longlongxiaogege + *@Description //生成保养打印表子内容 + *@Date 13:17 2024/4/18 + *@Param [deviceMaintainJobReportDo] + *@return java.util.List + **/ + List getMaintainReport(DeviceMaintainJobReportDo deviceMaintainJobReportDo); + + + /** + *@Author longlongxiaogege + *@Description //生成保养打印表主内容 + *@Date 13:17 2024/4/18 + *@Param [deviceMaintainJobReportDo] + *@return java.util.List + **/ + List getMaintainReportMainInfo(DeviceMaintainJobReportDo deviceMaintainJobReportDo); + + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobMainServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobMainServiceImpl.java new file mode 100644 index 0000000..ce0d23c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintainjob/TechMaintainJobMainServiceImpl.java @@ -0,0 +1,406 @@ +package com.win.module.eam.service.techmaintainjob; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintainjob.vo.*; +import com.win.module.eam.convert.devicemaintainjob.DeviceMaintainJobMainConvert; +import com.win.module.eam.dal.dataobject.classtype.ClassTypeDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobMainDO; +import com.win.module.eam.dal.dataobject.devicemaintainjob.DeviceMaintainJobReportDo; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.dal.mysql.classtype.ClassTypeMapper; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.devicemaintainjob.DeviceMaintainJobMainMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobMainMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.system.api.dept.DeptApi; +import com.win.module.system.api.dept.PostApi; +import com.win.module.system.api.mail.MailSendApi; +import com.win.module.system.api.mail.dto.MailSendSingleToUserReqDTO; +import com.win.module.system.api.permission.PermissionApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.api.user.dto.AdminUserRespExpandDTO; +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.temporal.TemporalAdjusters; +import java.util.*; + +import static cn.hutool.log.StaticLog.info; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 保养工单主 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class TechMaintainJobMainServiceImpl implements TechMaintainJobMainService { + + @Resource + private DeviceMaintainJobMainMapper deviceMaintainJobMainMapper; + + @Resource + private MoldAccountsMapper moldAccountsMapper; + + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + + @Resource + private DeviceMaintenanceJobMainMapper deviceMaintenanceJobMainMapper; + + @Resource + private PostApi postApi; + @Resource + private MailSendApi mailSendApi; + + @Resource + private DeptApi deptApi; + + @Resource + private AdminUserApi userApi; + + @Resource + private PermissionApi permissionApi; + + @Resource + private ClassTypeMapper classTypeMapper; + + @Override + public Long createDeviceMaintainOrderMain(DeviceMaintainJobMainCreateReqVO createReqVO) { + // 插入 + DeviceMaintainJobMainDO deviceMaintainOrderMain = DeviceMaintainJobMainConvert.INSTANCE.convert(createReqVO); + deviceMaintainOrderMain.setDeptId(Long.parseLong(createReqVO.getFactoryAreaNumber())); + deviceMaintainJobMainMapper.insert(deviceMaintainOrderMain); + // 返回 + return deviceMaintainOrderMain.getId(); + } + + @Override + public Integer updateDeviceMaintainOrderMain(DeviceMaintainJobMainUpdateReqVO updateReqVO) { + // 校验存在 + //validateDeviceMaintainOrderMainExists(updateReqVO.getId()); + // 更新 + DeviceMaintainJobMainDO updateObj = DeviceMaintainJobMainConvert.INSTANCE.convert(updateReqVO); + return deviceMaintainJobMainMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceMaintainOrderMain(Long id) { + // 校验存在 + validateDeviceMaintainOrderMainExists(id); + // 删除 + return deviceMaintainJobMainMapper.deleteById(id); + } + + private void validateDeviceMaintainOrderMainExists(Long id) { + if (deviceMaintainJobMainMapper.selectById(id) == null) { + throw exception(JIAN_XIU_ORDER_NOT_EXISTS); + } + } + + @Override + public DeviceMaintainJobMainDO getDeviceMaintainOrderMain(Long id) { + return deviceMaintainJobMainMapper.selectById(id); + } + + @Override + public List getDeviceMaintainOrderMainList(Collection ids) { + return deviceMaintainJobMainMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceMaintainOrderMainPage(DeviceMaintainJobMainPageReqVO pageReqVO) { + return deviceMaintainJobMainMapper.selectPage(pageReqVO); + } + + + @Override + public PageResult getDeviceMaintainOrderMainSenior(CustomConditions conditions) { + return deviceMaintainJobMainMapper.selectSenior(conditions); + } + + + @Override + public PageResult getAppPage(DeviceMaintainJobMainPageReqVO pageReqVO) { + pageReqVO.setUserId(getLoginUserId().toString()); + pageReqVO.setClassType("TECH"); + String b = classTypeMapper.getIdentity("TECH"); + if (b.equals("2")) { + throw exception(WORKER_ENGINEER_IS_NOT); + } + pageReqVO.setStandType(b); + if ("1".equals(pageReqVO.getFlag())) {//flag 0 首页进入 1我的进入 + //我的里面都是获取的是当前人已经完成的单子 + pageReqVO.setUserId(getLoginUserId().toString()); + IPage pageInfo = deviceMaintainJobMainMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for(DeviceMaintainJobMainDO en :pageInfo.getRecords()){ + String deviceNumber = en.getDeviceNumber(); + String type = en.getType(); + if("MOLD".equals(type)){//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + }else{//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + } + + } + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } else { + //首页进入是获取未接单 已接单的单子 + pageReqVO.setFlag("0"); + } + IPage pageInfo = deviceMaintainJobMainMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + + @Override + public List getDeviceMaintainOrderMainList(DeviceMaintainJobMainExportReqVO exportReqVO) { + return deviceMaintainJobMainMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceMaintainOrderMainList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_MAINTAIN_ORDER_MAIN_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); + return errorList; + } + + @Override + public int orderClick(Long id) { + DeviceMaintainJobMainDO mainDO = new DeviceMaintainJobMainDO(); + mainDO.setId(id); + mainDO.setMaintenance(getLoginUserId()); + mainDO.setReceiveTime(LocalDateTime.now()); + mainDO.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + return deviceMaintainJobMainMapper.updateById(mainDO); + } + @Override + public int orderClickFinish(Long id) { + // 校验存在 + DeviceMaintainJobMainDO mainDO = deviceMaintainJobMainMapper.selectById(id); + if (deviceMaintainJobMainMapper.selectById(id) == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + if(!getLoginUserId().equals(mainDO.getMaintenance())){ + throw exception(JIAN_XIU_ORDER_NOT_USER); + } + mainDO.setId(id); + mainDO.setCompletionTime(LocalDateTime.now()); + mainDO.setStatus(OrderStatusEnum.RESULT_COMPLETED.getCode()); + try { + sendEmails(mainDO); + } catch (Exception e) { + info("发送邮件异常:{}",e); + } + int i = deviceMaintainJobMainMapper.updateById(mainDO); + + return i; + } + + @Override + public int orderClickVerify(Long id, String verifyContent) { + DeviceMaintainJobMainDO Do = deviceMaintainJobMainMapper.selectById(id); + // 校验存在 + if (Do == null) { + throw exception(BAO_YANG_JOB_NOT_EXISTS); + } + if(!permissionApi.BooleanEngineer()){ + throw exception(WEI_XIU_NOT_ENGINEER); + } + Do.setStatus(OrderStatusEnum.VERIFIED_STATUS.getCode()); + Do.setVerifyContent(verifyContent); + Do.setVerifyer(getLoginUserId()); + Do.setVerifyTime(LocalDateTime.now()); + return deviceMaintainJobMainMapper.updateById(Do); + } + + @Override + public void createUncompletedOrderTask() { + LocalDate now = LocalDate.now(); + LocalDate firstDayOfLastMonth = now.with(TemporalAdjusters.firstDayOfMonth()).minusMonths(1); + LocalDate lastDayOfLastMonth = now.with(TemporalAdjusters.lastDayOfMonth()).minusMonths(1); + String startDate = LocalDateTimeUtil.format(firstDayOfLastMonth,"yyyy-MM-dd"); + String endDate = LocalDateTimeUtil.format(lastDayOfLastMonth,"yyyy-MM-dd"); + String months = LocalDateTimeUtil.format(lastDayOfLastMonth,"yyyy-MM"); + List deviceMaintain = deviceMaintainJobMainMapper.selectList1(startDate, endDate); + List jobMainDOS = deviceMaintenanceJobMainMapper.selectList1(startDate, endDate); + StringBuilder str = new StringBuilder(); + StringBuilder str1 = new StringBuilder(); + for(DeviceMaintainJobMainDO en:deviceMaintain){ + String type = en.getType(); + String typeName = ""; + if(BasicStatusEnum.BASIC_DEVICE.getCode().equals(type)){ + typeName = "

   设备保养工单"; + }else if(BasicStatusEnum.BASIC_TECH.getCode().equals(type)){ + typeName = "

   工艺保养工单"; + }else if(BasicStatusEnum.BASIC_MOLD.getCode().equals(type)){ + typeName = "

   模具保养工单"; + } + str.append(typeName); + String number = en.getNumber(); + str.append("("); + str.append(number); + str.append(")

"); + } + for(DeviceMaintenanceJobMainDO en:jobMainDOS){ + String type = en.getType(); + String typeName = ""; + if(BasicStatusEnum.BASIC_DEVICE.getCode().equals(type)){ + typeName = "

   设备维修工单"; + }else if(BasicStatusEnum.BASIC_TECH.getCode().equals(type)){ + typeName = "

   工艺维修工单"; + }else if(BasicStatusEnum.BASIC_MOLD.getCode().equals(type)){ + typeName = "

   模具维修工单"; + } + str1.append(typeName); + String number = en.getNumber(); + str1.append("("); + str1.append(number); + str1.append(")

"); + } + if(deviceMaintain.size()>0 || jobMainDOS.size()>0){ + sendEmails(months,str.toString(),str1.toString()); + } + + } + + @Override + public List getMaintainReport(DeviceMaintainJobReportDo deviceMaintainJobReportDo) { + return deviceMaintainJobMainMapper.getMaintainReport(deviceMaintainJobReportDo); + } + + @Override + public List getMaintainReportMainInfo(DeviceMaintainJobReportDo deviceMaintainJobReportDo) { + return deviceMaintainJobMainMapper.getMaintainReportMainInfo(deviceMaintainJobReportDo); + } + + /** + * 校验能否点击待接单 + * @param id + */ + private void validateJD(Long id) { + DeviceMaintainJobMainDO mainDO = deviceMaintainJobMainMapper.selectById(id); + if (deviceMaintainJobMainMapper.selectById(id) == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + if(!OrderStatusEnum.PEND_ORDER_STATUS.getCode().equals(mainDO.getStatus())){ + throw exception(JIAN_XIU_ORDER_NOT_PENDING); + } + +// if(!permissionApi.B&&!b){ +// throw exception(JIAN_XIU_ORDER_NOT_POST); +// } + } + + /** + * 校验能否点击完成 + * @param id + */ + private void validateWC(Long id) { + DeviceMaintainJobMainDO mainDO = deviceMaintainJobMainMapper.selectById(id); + if (deviceMaintainJobMainMapper.selectById(id) == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + if(!getLoginUserId().equals(mainDO.getMaintenance())){ + throw exception(JIAN_XIU_ORDER_NOT_USER); + } +// Boolean a = postApi.booleanWorker(); +// Boolean b = postApi.booleanEngineer(); +// if(!a&&!b){ +// throw exception(JIAN_XIU_ORDER_NOT_POST); +// } + } + + /** + * 校验人员厂区和班组是否匹配 + * @param id + */ + private void validateFactoryAndClassType(Long id) { + DeviceMaintainJobMainDO mainDO = deviceMaintainJobMainMapper.selectById(id); + if (mainDO == null) { + throw exception(BAO_YANG_JOB_NOT_EXISTS); + } + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + Long deptId = user.getDeptId(); + if(!mainDO.getFactoryAreaNumber().equals(deptId.toString())){//厂区不一致 + throw exception(FACTORY_NO_NOMAL); + } + if(!mainDO.getType().equals(permissionApi.getClassType())){//班组不一致 + throw exception(CLASSTYPR_NO_NOMAL); + } + } + /** + * 每个月初查询上个月未完成的保养和维修工单给主管发送邮件 + */ + private void sendEmails(String months,String str,String str1){ + AdminUserRespExpandDTO adminUserRespExpandDTO = new AdminUserRespExpandDTO(); + List list = List.of("device_charge"); + adminUserRespExpandDTO.setCode(list); + List userBeanList = userApi.selectByUserIdentity(adminUserRespExpandDTO); + userBeanList.stream().forEach(item ->{ + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getId())); + mailSendSingleToUserReqDTO.setTemplateCode("month-examine-template"); + Map params = new HashMap<>(); + params.put("months",months); + params.put("str", str); + params.put("str1", str1); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + }catch(RuntimeException e){ + info(months+"未完成的保养和维修工单发送的邮件通知失败:{}", e); + } + }); + } + + /** + * 保养工单给工程师发验证邮件 + */ + private void sendEmails(DeviceMaintainJobMainDO mainDO){ + List userBeanList = classTypeMapper.JudgeIdentity(null, mainDO.getType(), "1", mainDO.getFactoryAreaNumber()); + userBeanList.stream().forEach(item ->{ + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getUserId())); + mailSendSingleToUserReqDTO.setTemplateCode("job-maintain-verify_template"); + Map params = new HashMap<>(); + params.put("typeName","工艺"); + params.put("number", mainDO.getNumber()); + params.put("name", item.getNickname()); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + }catch(RuntimeException e){ + info("工单编号为"+mainDO.getNumber()+"的名为:"+mainDO.getDescribes()+"的工单给"+item.getNickname()+"发送的邮件通知失败:{}", e); + } + }); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobDetailItemService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobDetailItemService.java new file mode 100644 index 0000000..160302d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobDetailItemService.java @@ -0,0 +1,87 @@ +package com.win.module.eam.service.techmaintenancejob; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailItemDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 维修工单子表与备件关系 Service 接口 + * + * @author 超级管理员 + */ +public interface TechMaintenanceJobDetailItemService { + + /** + * 创建维修工单子表与备件关系 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintenanceDetailItem(@Valid DeviceMaintenanceJobDetailItemCreateReqVO createReqVO); + + /** + * 更新维修工单子表与备件关系 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceMaintenanceDetailItem(@Valid DeviceMaintenanceJobDetailItemUpdateReqVO updateReqVO); + + /** + * 删除维修工单子表与备件关系 + * + * @param id 编号 + */ + Integer deleteDeviceMaintenanceDetailItem(Long id); + + /** + * 获得维修工单子表与备件关系 + * + * @param id 编号 + * @return 维修工单子表与备件关系 + */ + DeviceMaintenanceJobDetailItemDO getDeviceMaintenanceDetailItem(Long id); + + /** + * 获得维修工单子表与备件关系列表 + * + * @param ids 编号 + * @return 维修工单子表与备件关系列表 + */ + List getDeviceMaintenanceDetailItemList(Collection ids); + + /** + * 获得维修工单子表与备件关系分页 + * + * @param pageReqVO 分页查询 + * @return 维修工单子表与备件关系分页 + */ + PageResult getDeviceMaintenanceDetailItemPage(DeviceMaintenanceJobDetailItemPageReqVO pageReqVO); + + /** + * 获得维修工单子表与备件关系列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 维修工单子表与备件关系列表 + */ + List getDeviceMaintenanceDetailItemList(DeviceMaintenanceJobDetailItemExportReqVO exportReqVO); + + /** + * 导入维修工单子表与备件关系主信息 + * + * @param datas 导入维修工单子表与备件关系主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceMaintenanceDetailItemList(List datas, Integer mode, boolean updatePart); + + /** + * 根据维修工单子项id获取备件列表 + * @param maintenanceDetailId + * @return + */ + List> selectListById(Long maintenanceDetailId); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobDetailItemServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobDetailItemServiceImpl.java new file mode 100644 index 0000000..32b3975 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobDetailItemServiceImpl.java @@ -0,0 +1,112 @@ +package com.win.module.eam.service.techmaintenancejob; + +import cn.hutool.core.collection.CollUtil; +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailItemDO; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; + +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobDetailItemConvert; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailItemMapper; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; + +/** + * 维修工单子表与备件关系 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class TechMaintenanceJobDetailItemServiceImpl implements TechMaintenanceJobDetailItemService { + + @Resource + private DeviceMaintenanceJobDetailItemMapper deviceMaintenanceJobDetailItemMapper; + + @Override + public Long createDeviceMaintenanceDetailItem(DeviceMaintenanceJobDetailItemCreateReqVO createReqVO) { + // 插入 + DeviceMaintenanceJobDetailItemDO deviceMaintenanceDetailItem = DeviceMaintenanceJobDetailItemConvert.INSTANCE.convert(createReqVO); + deviceMaintenanceJobDetailItemMapper.insert(deviceMaintenanceDetailItem); + // 返回 + return deviceMaintenanceDetailItem.getId(); + } + + @Override + public Integer updateDeviceMaintenanceDetailItem(DeviceMaintenanceJobDetailItemUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceMaintenanceDetailItemExists(updateReqVO.getId()); + // 更新 + DeviceMaintenanceJobDetailItemDO updateObj = DeviceMaintenanceJobDetailItemConvert.INSTANCE.convert(updateReqVO); + return deviceMaintenanceJobDetailItemMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceMaintenanceDetailItem(Long id) { + // 校验存在 + validateDeviceMaintenanceDetailItemExists(id); + // 删除 + return deviceMaintenanceJobDetailItemMapper.deleteById(id); + } + + private void validateDeviceMaintenanceDetailItemExists(Long id) { + if (deviceMaintenanceJobDetailItemMapper.selectById(id) == null) { + //throw exception(DEVICE_MAINTENANCE_DETAIL_ITEM_NOT_EXISTS); + } + } + + @Override + public DeviceMaintenanceJobDetailItemDO getDeviceMaintenanceDetailItem(Long id) { + return deviceMaintenanceJobDetailItemMapper.selectById(id); + } + + @Override + public List getDeviceMaintenanceDetailItemList(Collection ids) { + return deviceMaintenanceJobDetailItemMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceMaintenanceDetailItemPage(DeviceMaintenanceJobDetailItemPageReqVO pageReqVO) { + return deviceMaintenanceJobDetailItemMapper.selectPage(pageReqVO); + } + + @Override + public List getDeviceMaintenanceDetailItemList(DeviceMaintenanceJobDetailItemExportReqVO exportReqVO) { + return deviceMaintenanceJobDetailItemMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceMaintenanceDetailItemList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_MAINTENANCE_DETAIL_ITEM_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceMaintenanceDetailItemDO obj = deviceMaintenanceDetailItemMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceMaintenanceDetailItemMapper.insert(DeviceMaintenanceDetailItemConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceMaintenanceDetailItemDO deviceMaintenanceDetailItemDO = DeviceMaintenanceDetailItemConvert.INSTANCE.convert(item); +// deviceMaintenanceDetailItemDO.setId(obj.getId()); +// deviceMaintenanceDetailItemMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public List> selectListById(Long maintenanceDetailId) { + return deviceMaintenanceJobDetailItemMapper.selectListById(maintenanceDetailId); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobDetailService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobDetailService.java new file mode 100644 index 0000000..33192dc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobDetailService.java @@ -0,0 +1,88 @@ +package com.win.module.eam.service.techmaintenancejob; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailDO; + +/** + * 维修工单子 Service 接口 + * + * @author 超级管理员 + */ +public interface TechMaintenanceJobDetailService { + + /** + * 创建维修工单子 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintenanceDetail(@Valid DeviceMaintenanceJobDetailCreateReqVO createReqVO); + + /** + * 更新维修工单子 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceMaintenanceDetail(@Valid DeviceMaintenanceJobDetailUpdateReqVO updateReqVO); + + /** + * 删除维修工单子 + * + * @param id 编号 + */ + Integer deleteDeviceMaintenanceDetail(Long id); + + /** + * 获得维修工单子 + * + * @param id 编号 + * @return 维修工单子 + */ + DeviceMaintenanceJobDetailDO getDeviceMaintenanceDetail(Long id); + + /** + * 获得维修工单子列表 + * + * @param ids 编号 + * @return 维修工单子列表 + */ + List getDeviceMaintenanceDetailList(Collection ids); + + /** + * 根据维修工单号查询工单子项列表信息 + * @param number + * @return + */ + List selectListByNumber(String number); + + /** + * 获得维修工单子分页 + * + * @param pageReqVO 分页查询 + * @return 维修工单子分页 + */ + PageResult getDeviceMaintenanceDetailPage(DeviceMaintenanceJobDetailPageReqVO pageReqVO); + + + /** + * 获得维修工单子列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 维修工单子列表 + */ + List getDeviceMaintenanceDetailList(DeviceMaintenanceJobDetailExportReqVO exportReqVO); + + /** + * 导入维修工单子主信息 + * + * @param datas 导入维修工单子主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceMaintenanceDetailList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobDetailServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobDetailServiceImpl.java new file mode 100644 index 0000000..c5cc0c1 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobDetailServiceImpl.java @@ -0,0 +1,253 @@ +package com.win.module.eam.service.techmaintenancejob; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobDetailConvert; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailItemDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailItemMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobMainMapper; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +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.module.eam.enums.ErrorCodeConstants.*; + +/** + * 维修工单子 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class TechMaintenanceJobDetailServiceImpl implements TechMaintenanceJobDetailService { + + @Resource + private AdminUserApi userApi; + @Resource + private DeviceMaintenanceJobDetailMapper deviceMaintenanceJobDetailMapper; + + @Resource + private DeviceMaintenanceJobMainMapper deviceMaintenanceJobMainMapper; + @Resource + DeviceMaintenanceJobDetailItemMapper deviceMaintenanceJobDetailItemMapper; + + @Resource + ItemMapper itemMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDeviceMaintenanceDetail(DeviceMaintenanceJobDetailCreateReqVO createReqVO) { + List main = deviceMaintenanceJobMainMapper.selectList("number", createReqVO.getNumber()); + Long mainId = main.get(0).getId(); + // 插入 + DeviceMaintenanceJobDetailDO deviceMaintenanceDetail = DeviceMaintenanceJobDetailConvert.INSTANCE.convert(createReqVO); + deviceMaintenanceDetail.setMasterId(mainId); + int id = deviceMaintenanceJobDetailMapper.insert(deviceMaintenanceDetail); + List> itemList = createReqVO.getItemNumbers();//备件号集合 + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(!itemDOS.isEmpty()){ + String number = itemDOS.get(0).getNumber(); + DeviceMaintenanceJobDetailItemDO dos = new DeviceMaintenanceJobDetailItemDO(); + dos.setItemNumber(number); + dos.setMasterId(deviceMaintenanceDetail.getId()); + dos.setNumber(createReqVO.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + deviceMaintenanceJobDetailItemMapper.insert(dos); + }else{ + throw exception(ITEM_NOT_EXISTS); + } + } + } + // 返回 + return deviceMaintenanceDetail.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer updateDeviceMaintenanceDetail(DeviceMaintenanceJobDetailUpdateReqVO updateReqVO) { + // 校验存在 + validateDeviceMaintenanceDetailExists(updateReqVO.getId()); + // 更新 + DeviceMaintenanceJobDetailDO updateObj = DeviceMaintenanceJobDetailConvert.INSTANCE.convert(updateReqVO); + int i = deviceMaintenanceJobDetailMapper.updateById(updateObj); + //先删除备件关联表 + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("master_id", updateReqVO.getId()); + itemQueryWrapper.eq("deleted", 0); + List deviceMaintenanceJobDetailItemDOS = deviceMaintenanceJobDetailItemMapper.selectList(itemQueryWrapper); + for(DeviceMaintenanceJobDetailItemDO item: deviceMaintenanceJobDetailItemDOS){ + deviceMaintenanceJobDetailItemMapper.deleteById(item.getId()); + } + + //重新加入备件 + List> itemList = updateReqVO.getItemNumbers(); + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(!itemDOS.isEmpty()){ + String number = itemDOS.get(0).getNumber(); + DeviceMaintenanceJobDetailItemDO dos = new DeviceMaintenanceJobDetailItemDO(); + dos.setItemNumber(number); + dos.setMasterId(updateReqVO.getId()); + dos.setNumber(updateReqVO.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + deviceMaintenanceJobDetailItemMapper.insert(dos); + }else{ + throw exception(ITEM_NOT_EXISTS); + } + } + } + return i; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer deleteDeviceMaintenanceDetail(Long id) { + // 校验存在 + validateDeviceMaintenanceDetailExists(id); + // 删除 + QueryWrapper itemQueryWrapper = new QueryWrapper<>(); + itemQueryWrapper.eq("master_id", id); + itemQueryWrapper.eq("deleted", 0); + List deviceMaintenanceJobDetailItemDOS = deviceMaintenanceJobDetailItemMapper.selectList(itemQueryWrapper); + for(DeviceMaintenanceJobDetailItemDO item: deviceMaintenanceJobDetailItemDOS){ + deviceMaintenanceJobDetailItemMapper.deleteById(item.getId()); + } + int i = deviceMaintenanceJobDetailMapper.deleteById(id); + return i ; + } + + private void validateDeviceMaintenanceDetailExists(Long id) { + if (deviceMaintenanceJobDetailMapper.selectById(id) == null) { + throw exception(WEI_XIU_ORDER_DETAILS_NOT_EXISTS); + } + } + + @Override + public DeviceMaintenanceJobDetailDO getDeviceMaintenanceDetail(Long id) { + return deviceMaintenanceJobDetailMapper.selectById(id); + } + + @Override + public List getDeviceMaintenanceDetailList(Collection ids) { + return deviceMaintenanceJobDetailMapper.selectBatchIds(ids); + } + + @Override + public List selectListByNumber(String number) { + QueryWrapper detailsDOQueryWrapper = new QueryWrapper<>(); + detailsDOQueryWrapper.eq("number", number); + detailsDOQueryWrapper.eq("available", "TRUE"); + List maintenanceNumber = deviceMaintenanceJobDetailMapper.selectList(detailsDOQueryWrapper); + for(DeviceMaintenanceJobDetailDO en:maintenanceNumber){ + StringBuilder names = new StringBuilder(); + if(!"".equals(en.getMaintenances())&& en.getMaintenances()!=null){ + String[] split = en.getMaintenances().split(","); + for(int i = 0; i < split.length; i++) { + AdminUserRespDTO user = userApi.getUser(Long.parseLong(split[i])); + if (names.length() > 0) { + names.append(", "); + } + String name = user.getNickname(); + names.append(name); + } + en.setMaintenancesName(names.toString()); + } + List> list = deviceMaintenanceJobDetailItemMapper.selectListById(en.getId()); +// StringBuilder sb = new StringBuilder(); +// for(Map map:list){ +// if (sb.length() > 0) { +// sb.append(", "); +// } +// String name = map.get("name").toString(); +// String qty = map.get("qty").toString(); +// sb.append(name+":"+qty); +// } + en.setItems(list); + } + return maintenanceNumber; + } + + @Override + public PageResult getDeviceMaintenanceDetailPage(DeviceMaintenanceJobDetailPageReqVO pageReqVO) { + PageResult maintenanceNumber = deviceMaintenanceJobDetailMapper.selectPage(pageReqVO); + for(DeviceMaintenanceJobDetailDO en:maintenanceNumber.getList()){ + StringBuilder names = new StringBuilder(); + if(!"".equals(en.getMaintenances())&& en.getMaintenances()!=null){ + String[] split = en.getMaintenances().split(","); + for(int i = 0; i < split.length; i++) { + AdminUserRespDTO user = userApi.getUser(Long.parseLong(split[i])); + if (names.length() > 0) { + names.append(", "); + } + String name = user.getNickname(); + names.append(name); + } + en.setMaintenancesName(names.toString()); + } + List> list = deviceMaintenanceJobDetailItemMapper.selectListById(en.getId()); +// StringBuilder sb = new StringBuilder(); +// for(Map map:list){ +// if (sb.length() > 0) { +// sb.append(", "); +// } +// String name = map.get("name").toString(); +// String qty = map.get("qty").toString(); +// sb.append(name+":"+qty); +// } + en.setItemNumbers(list); + } + return maintenanceNumber; + + //return deviceMaintenanceDetailMapper.selectPage(pageReqVO); + } + + @Override + public List getDeviceMaintenanceDetailList(DeviceMaintenanceJobDetailExportReqVO exportReqVO) { + return deviceMaintenanceJobDetailMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceMaintenanceDetailList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_MAINTENANCE_DETAIL_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceMaintenanceDetailDO obj = deviceMaintenanceDetailMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceMaintenanceDetailMapper.insert(DeviceMaintenanceDetailConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceMaintenanceDetailDO deviceMaintenanceDetailDO = DeviceMaintenanceDetailConvert.INSTANCE.convert(item); +// deviceMaintenanceDetailDO.setId(obj.getId()); +// deviceMaintenanceDetailMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobMainService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobMainService.java new file mode 100644 index 0000000..74d48ce --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobMainService.java @@ -0,0 +1,175 @@ +package com.win.module.eam.service.techmaintenancejob; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 维修工单主 Service 接口 + * + * @author 超级管理员 + */ +public interface TechMaintenanceJobMainService { + + /** + * 创建维修工单主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintenanceMain(@Valid DeviceMaintenanceJobMainCreateReqVO createReqVO); + + /** + * pc创建维修工单主 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceMaintenanceMainPC(@Valid DeviceMaintenanceJobMainCreateReqVO createReqVO); + + /** + * 更新维修工单主 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceMaintenanceMain(@Valid DeviceMaintenanceJobMainUpdateReqVO updateReqVO); + + /** + * 删除维修工单主 + * + * @param id 编号 + */ + Integer deleteDeviceMaintenanceMain(Long id); + + /** + * 获得维修工单主 + * + * @param id 编号 + * @return 维修工单主 + */ + DeviceMaintenanceJobMainDO getDeviceMaintenanceMain(Long id); + + /** + * 获得维修工单主列表 + * + * @param ids 编号 + * @return 维修工单主列表 + */ + List getDeviceMaintenanceMainList(Collection ids); + + List> getDictList(String type); + + /** + * 获得维修工单主分页 + * + * @param pageReqVO 分页查询 + * @return 维修工单主分页 + */ + PageResult getDeviceMaintenanceMainPage(DeviceMaintenanceJobMainPageReqVO pageReqVO); + + + /** + * 获得维修工单主分页 + * + * @param conditions 分页查询 + * @return 维修工单主分页 + */ + PageResult getDeviceMaintenanceMainSenior(CustomConditions conditions); + + + /** + * 获得维修工单主列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 维修工单主列表 + */ + List getDeviceMaintenanceMainList(DeviceMaintenanceJobMainExportReqVO exportReqVO); + + /** + * 导入维修工单主主信息 + * + * @param datas 导入维修工单主主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceMaintenanceMainList(List datas, Integer mode, boolean updatePart); + + /** + * 更改工单主表状态 + * @param request_number 申请工单号 撤回操作 + * @param id 工单主表可以做 + * @param status 工单主表状态枚举 + * @return + */ + int updateStatus(String request_number,Long id,String status); + + /** + * 维修工单转办 + * @param deviceNumber 设备或模具号 + * @param receiverType 转后类型 + * @param receiverUserId 转后userId + * @param id id + * @return + */ + int turnTo(String deviceNumber,Long id,String receiverType,Long receiverUserId,String status); + + /** + *维修工单接单 + * @param id 工单id + * @return + */ + int orderClick(Long id); + /** + *维修工单点击完成 + * @param id 工单id + * @param result 结果临时合还是已完成 + * @return + */ + int orderClickFinish(Long id,String result); + /** + *维修工单报修人确认 + * @param id 工单id + * @param content 内容 + * @param result 通过还是驳回 + * @return + */ + int orderClickConfirm(Long id,String result,String content); + /** + *维修工单工程师验证 + * @param id 工单id + * @param status 当前状态 + * @param content 内容 + * @return + */ + int orderClickVerify(Long id,String status,String content); + + /** + * 根据申请号删除工单 + * @param request_number 申请工单号 撤回操作 + * @return + */ + + /** + * 根据申请号删除工单 + * @param request_number 申请工单号 撤回操作 + * @return + */ + int deleteStatus(String request_number); + + PageResult getAppPage(DeviceMaintenanceJobMainPageReqVO pageReqVO); + + DeviceMaintenanceJobMainDO getAppByNumber(String number); + + /** + * 获取维修工单列表 + * @return + */ + List> getList(String type); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobMainServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobMainServiceImpl.java new file mode 100644 index 0000000..7f7e098 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techmaintenancejob/TechMaintenanceJobMainServiceImpl.java @@ -0,0 +1,868 @@ +package com.win.module.eam.service.techmaintenancejob; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicemaintenancejob.vo.*; +import com.win.module.eam.controller.uniapppushmessage.vo.UniappPushMessageRespVO; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobDetailConvert; +import com.win.module.eam.convert.devicemaintenancejob.DeviceMaintenanceJobMainConvert; +import com.win.module.eam.dal.dataobject.attachmentfile.AttachmentFileDO; +import com.win.module.eam.dal.dataobject.classtype.ClassTypeDO; +import com.win.module.eam.dal.dataobject.deviceaccounts.DeviceAccountsDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobDetailItemDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.dal.dataobject.devicerepairrequest.DeviceRepairRequestDO; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.dataobject.maintenanceturnto.MaintenanceTurntoDO; +import com.win.module.eam.dal.dataobject.moldaccounts.MoldAccountsDO; +import com.win.module.eam.dal.mysql.classtype.ClassTypeMapper; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailItemMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobDetailMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobMainMapper; +import com.win.module.eam.dal.mysql.devicerepairrequest.DeviceRepairRequestMapper; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.eam.dal.mysql.maintenanceturnto.MaintenanceTurntoMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.eam.service.attachmentfile.AttachmentFileService; +import com.win.module.eam.service.deviceaccounts.DeviceAccountsService; +import com.win.module.eam.service.moldaccounts.MoldAccountsService; +import com.win.module.eam.service.techrepairrequest.TechRepairRequestService; +import com.win.module.eam.service.uniapppushmessage.UniappPushMessageService; +import com.win.module.system.api.dept.DeptApi; +import com.win.module.system.api.dept.PostApi; +import com.win.module.system.api.mail.MailSendApi; +import com.win.module.system.api.mail.dto.MailSendSingleToUserReqDTO; +import com.win.module.system.api.permission.PermissionApi; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.api.user.dto.AdminUserRespExpandDTO; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +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 java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +import static cn.hutool.log.StaticLog.info; +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 维修工单主 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class TechMaintenanceJobMainServiceImpl implements TechMaintenanceJobMainService { + + @Resource + private DeviceMaintenanceJobMainMapper deviceMaintenanceJobMainMapper; + + @Resource + private DeviceRepairRequestMapper deviceRepairRequestMapper; + @Lazy + @Resource + private TechRepairRequestService moldRepairRequestService; + + + @Resource + private MaintenanceTurntoMapper maintenanceTurntoMapper; + @Resource + private SerialNumberApi serialNumberApi; + + @Resource + private AdminUserApi userApi; + + @Resource + private DeptApi deptApi; + + @Resource + private PostApi postApi; + + @Resource + private DeviceMaintenanceJobDetailMapper deviceMaintenanceJobDetailMapper; + @Resource + DeviceMaintenanceJobDetailItemMapper deviceMaintenanceJobDetailItemMapper; + + @Resource + ItemMapper itemMapper; + + @Resource + private MoldAccountsMapper moldAccountsMapper; + + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + + @Resource + private AttachmentFileService attachmentFileService; + + @Resource + private DeviceAccountsService deviceAccountsService; + + @Resource + private MoldAccountsService moldAccountsService; + + @Resource + private MailSendApi mailSendApi; + + @Resource + private PermissionApi permissionApi; + @Resource + private AdminUserApi adminUserApi; + + @Resource + private UniappPushMessageService uniappPushMessageService; + + @Resource + private ClassTypeMapper classTypeMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDeviceMaintenanceMain(DeviceMaintenanceJobMainCreateReqVO createReqVO) { + // 插入 + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + DeviceMaintenanceJobMainDO deviceMaintenanceMain = DeviceMaintenanceJobMainConvert.INSTANCE.convert(createReqVO); + String number = serialNumberApi.generateCode(RuleCodeEnum.WEI_XIU_ORDER.getCode()); + deviceMaintenanceMain.setNumber(number); + if(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode().equals(deviceMaintenanceMain.getStatus())){//手动创建的是已接单 + //通过controller手动创建工单直接直接已接单 + deviceMaintenanceMain.setReceivingTime(LocalDateTime.now()); + deviceMaintenanceMain.setDeptId(user.getDeptId()); + }else{ + deviceMaintenanceMain.setApplyer(getLoginUserId()); + deviceMaintenanceMain.setDeptId(Long.parseLong(createReqVO.getFactoryAreaNumber())); + } + + int i = deviceMaintenanceJobMainMapper.insert(deviceMaintenanceMain); + + //添加维修工单的设备模具需要更改维修状态为1维修中 + //更新设备模具状态 + if(createReqVO.getType().equals("MOLD")){ + MoldAccountsDO moldAccountsDO = moldAccountsMapper.selectOne("number", createReqVO.getDeviceNumber(), "deleted", 0); + moldAccountsDO.setStatus("1"); + moldAccountsDO.setNumber(createReqVO.getDeviceNumber()); + moldAccountsMapper.updateById(moldAccountsDO); + }else{ + DeviceAccountsDO deviceAccountsDO = deviceAccountsMapper.selectOne("number", createReqVO.getDeviceNumber(), "deleted", 0); + deviceAccountsDO.setStatus("1"); + deviceAccountsDO.setNumber(createReqVO.getDeviceNumber()); + deviceAccountsMapper.updateById(deviceAccountsDO); + } + if(!OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode().equals(deviceMaintenanceMain.getStatus())){//非手动创建的是从报修走的 + //发送邮件 + try { + sendEmails(deviceMaintenanceMain,0); + } catch (Exception e) { + info("发送邮件异常:{}",e); + } + } + try { + UniappPushMessageRespVO respVO = new UniappPushMessageRespVO(); + respVO.setType(createReqVO.getType()); + respVO.setStatus("0"); + respVO.setNumber(number); + respVO.setFactoryAreaNumber(createReqVO.getFactoryAreaNumber()); + respVO.setType(createReqVO.getType()); + uniappPushMessageService.uniappSend(respVO); + } catch (Exception e) { + info("手机消息推送异常:{}",e); + } + // 返回 + return deviceMaintenanceMain.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDeviceMaintenanceMainPC(DeviceMaintenanceJobMainCreateReqVO createReqVO) { + // 插入 + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + DeviceMaintenanceJobMainDO deviceMaintenanceMain = DeviceMaintenanceJobMainConvert.INSTANCE.convert(createReqVO); + String number = serialNumberApi.generateCode(RuleCodeEnum.WEI_XIU_ORDER.getCode()); + deviceMaintenanceMain.setNumber(number); + deviceMaintenanceMain.setDeptId(user.getDeptId()); + if(deviceMaintenanceMain.getStatus()==null || "".equals(deviceMaintenanceMain.getStatus())){//状态为空说明手动创建工单直接已接单 + //通过controller手动创建工单直接直接已接单 + deviceMaintenanceMain.setMaintenance(getLoginUserId());//添加接单人 + deviceMaintenanceMain.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode());//添加已接单 + deviceMaintenanceMain.setReceivingTime(LocalDateTime.now()); + deviceMaintenanceMain.setDeptId(Long.parseLong(createReqVO.getFactoryAreaNumber())); + deviceMaintenanceJobMainMapper.insert(deviceMaintenanceMain); + if(createReqVO.getSubList()!=null&&!"".equals(createReqVO.getSubList())){//PC端传入 + //主子表 + List subDOList = DeviceMaintenanceJobDetailConvert.INSTANCE.convertList03(createReqVO.getSubList()); + for (DeviceMaintenanceJobDetailDO deviceMaintenanceDetail : subDOList) { + deviceMaintenanceDetail.setNumber(number); + deviceMaintenanceDetail.setMasterId(deviceMaintenanceMain.getId()); + //插入子项数据 + int id = deviceMaintenanceJobDetailMapper.insert(deviceMaintenanceDetail); + List> itemList = deviceMaintenanceDetail.getItemNumbers();//备件号集合 + if(itemList!=null&&itemList.size()>0){ + for(Map map:itemList){ + List itemDOS = itemMapper.selectList("number", map.get("number").toString()); + if(itemDOS!=null){ + String numbers = itemDOS.get(0).getNumber(); + DeviceMaintenanceJobDetailItemDO dos = new DeviceMaintenanceJobDetailItemDO(); + dos.setItemNumber(numbers); + dos.setMasterId(deviceMaintenanceDetail.getId()); + dos.setNumber(deviceMaintenanceDetail.getNumber()); + dos.setQty(new BigDecimal(map.get("qty").toString())); + deviceMaintenanceJobDetailItemMapper.insert(dos); + } + } + } + } + } + }else{ + deviceMaintenanceJobMainMapper.insert(deviceMaintenanceMain); + } + if(deviceMaintenanceMain.getId()!=null){ + //更新设备模具状态 + if(BasicStatusEnum.BASIC_DEVICE.getCode().equals(createReqVO.getType()) ){ + deviceAccountsService.updateDeviceAccountsStatus(createReqVO.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_1.getCode()); + }else if(BasicStatusEnum.BASIC_MOLD.getCode().equals(createReqVO.getType()) ){ + moldAccountsService.updateMoldAccountsStatus(createReqVO.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_1.getCode()); + } + } +// else{//报修申请进来的待接单状态 +// deviceMaintenanceMain.setStatus(OrderStatusEnum.PEND_ORDER_STATUS.getCode());//待接单 +// } +////发送邮件 +// try { +// sendEmails(deviceMaintenanceMain,0); +// } catch (Exception e) { +// info("发送邮件异常:{}",e); +// } + try { + UniappPushMessageRespVO respVO = new UniappPushMessageRespVO(); + respVO.setType(createReqVO.getType()); + respVO.setStatus("0"); + respVO.setNumber(number); + respVO.setFactoryAreaNumber(createReqVO.getFactoryAreaNumber()); + respVO.setType(createReqVO.getType()); + uniappPushMessageService.uniappSend(respVO); + } catch (Exception e) { + info("手机消息推送异常:{}",e); + } + // 返回 + return deviceMaintenanceMain.getId(); + } + + @Override + public Integer updateDeviceMaintenanceMain(DeviceMaintenanceJobMainUpdateReqVO updateReqVO) { + // 校验存在 + // 更新 + DeviceMaintenanceJobMainDO maintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectById(updateReqVO.getId()); + DeviceMaintenanceJobMainDO updateObj = DeviceMaintenanceJobMainConvert.INSTANCE.convert(updateReqVO); + updateObj.setMaintenance(maintenanceJobMainDO.getMaintenance()); + updateObj.setReceivingTime(maintenanceJobMainDO.getReceivingTime()); + return deviceMaintenanceJobMainMapper.updateById(updateObj); + } + + @Override + public Integer deleteDeviceMaintenanceMain(Long id) { + // 校验存在 + validateDeviceMaintenanceMainExists(id); + // 删除 + return deviceMaintenanceJobMainMapper.deleteById(id); + } + + private void validateDeviceMaintenanceMainExists(Long id) { + if (deviceMaintenanceJobMainMapper.selectById(id) == null) { + throw exception(WEI_XIU_NOT_EXISTS); + } + } + + @Override + public DeviceMaintenanceJobMainDO getDeviceMaintenanceMain(Long id) { + return deviceMaintenanceJobMainMapper.selectById(id); + } + + @Override + public List getDeviceMaintenanceMainList(Collection ids) { + return deviceMaintenanceJobMainMapper.selectBatchIds(ids); + } + + @Override + public List> getDictList(String type) { + return deviceMaintenanceJobMainMapper.getDictList(type); + } + + @Override + public PageResult getDeviceMaintenanceMainPage(DeviceMaintenanceJobMainPageReqVO pageReqVO) { + PageResult deviceMaintenanceJobMainDOPageResult = deviceMaintenanceJobMainMapper.selectPage(pageReqVO); + List deviceRepairList = deviceMaintenanceJobMainDOPageResult.getList(); + List masterIdList = deviceRepairList.stream().map(DeviceMaintenanceJobMainDO::getId).collect(Collectors.toList()); + List deviceMaintenanceJobDetailList = deviceMaintenanceJobDetailMapper.selectByMasterIds(masterIdList); + deviceRepairList.stream().forEach(deviceRepair -> { + if(deviceRepair.getRequestNumber() != null){ + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setFuncCode("request_repair"); + attachmentFileDO.setNumber(deviceRepair.getRequestNumber()); + List list = attachmentFileService.getAttachmentFilePathList(attachmentFileDO); + // 设置filePathList字段 + if(list!= null && list.size() > 0){ + deviceRepair.setFilePathList(list); + } + // 根据requestNumber查询记录,并设置declarer + DeviceRepairRequestDO order = moldRepairRequestService.getOrderByNumber(deviceRepair.getRequestNumber()); + if(order != null){ + deviceRepair.setDeclarer(order.getDeclarer()); + } + } + // 使用Stream API来检查是否存在符合条件的记录 + Optional matchingDetail = deviceMaintenanceJobDetailList.stream() + .filter(deviceMaintenanceJobDetail -> deviceRepair.getId().equals(deviceMaintenanceJobDetail.getMasterId())) + .findAny(); + // 如果找到了至少一条符合条件的记录,返回true + deviceRepair.setHasDetails(matchingDetail.isPresent()); + }); + return deviceMaintenanceJobMainDOPageResult; + } + + @Override + public PageResult getDeviceMaintenanceMainSenior(CustomConditions conditions) { + PageResult deviceMaintenanceJobMainDOPageResult = deviceMaintenanceJobMainMapper.selectSenior(conditions); + List deviceRepairList = deviceMaintenanceJobMainDOPageResult.getList(); + List masterIdList = deviceRepairList.stream().map(DeviceMaintenanceJobMainDO::getId).collect(Collectors.toList()); + List deviceMaintenanceJobDetailList = deviceMaintenanceJobDetailMapper.selectByMasterIds(masterIdList); + deviceRepairList.stream().forEach(deviceRepair -> { + if(deviceRepair.getRequestNumber() != null){ + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setFuncCode("request_repair"); + attachmentFileDO.setNumber(deviceRepair.getRequestNumber()); + List list = attachmentFileService.getAttachmentFilePathList(attachmentFileDO); + // 设置filePathList字段 + if(list!= null && list.size() > 0){ + deviceRepair.setFilePathList(list); + } + // 根据requestNumber查询记录,并设置declarer + DeviceRepairRequestDO order = moldRepairRequestService.getOrderByNumber(deviceRepair.getRequestNumber()); + if(order != null){ + deviceRepair.setDeclarer(order.getDeclarer()); + } + } + // 使用Stream API来检查是否存在符合条件的记录 + Optional matchingDetail = deviceMaintenanceJobDetailList.stream() + .filter(deviceMaintenanceJobDetail -> deviceRepair.getId().equals(deviceMaintenanceJobDetail.getMasterId())) + .findAny(); + // 如果找到了至少一条符合条件的记录,返回true + deviceRepair.setHasDetails(matchingDetail.isPresent()); + }); + return deviceMaintenanceJobMainDOPageResult; + } + + @Override + public List getDeviceMaintenanceMainList(DeviceMaintenanceJobMainExportReqVO exportReqVO) { + return deviceMaintenanceJobMainMapper.selectList(exportReqVO); + } + + @Override + public List importDeviceMaintenanceMainList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_MAINTENANCE_MAIN_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceMaintenanceMainDO obj = deviceMaintenanceMainMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceMaintenanceMainMapper.insert(DeviceMaintenanceMainConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceMaintenanceMainDO deviceMaintenanceMainDO = DeviceMaintenanceMainConvert.INSTANCE.convert(item); +// deviceMaintenanceMainDO.setId(obj.getId()); +// deviceMaintenanceMainMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public int updateStatus(String request_number, Long id, String status) { + return deviceMaintenanceJobMainMapper.updateStatus(request_number, id, status); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int turnTo(String deviceNumber,Long id,String receiverType,Long receiverUserId,String status) { + DeviceMaintenanceJobMainDO Do = deviceMaintenanceJobMainMapper.selectById(id); + String oldtype = Do.getType(); + String olddeviceNumber = Do.getDeviceNumber(); + if(!OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode().equals(Do.getStatus())){//已接单状态才能转办 + throw exception(WEI_XIU_NOT_ZUANBAN); + } +// if(Do.getType().equals(receiverType)){//同种类型不能转办 +// throw exception(WEI_XIU_NOT_TYPE_ZUANBAN); +// } + Long turnToUserId = Do.getMaintenance(); + String deviceNumberold = Do.getDeviceNumber(); + String factoryAreaNumber = Do.getFactoryAreaNumber(); + String turnToType = Do.getType(); + Do.setId(id); + Do.setDeviceNumber(deviceNumber); + Do.setType(receiverType); + if(!"1".equals(status)){//非人员转办的时候是待接单状态 + Do.setStatus(OrderStatusEnum.PEND_ORDER_STATUS.getCode());//变成待接单状态 + Do.setMaintenance(null); + Do.setReceivingTime(null); + }else{ + Do.setMaintenance(receiverUserId);//接单人 + Do.setReceivingTime(LocalDateTime.now());//接单时间 + Do.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode());//变成已接单状态 + } + int i = deviceMaintenanceJobMainMapper.updateById(Do); + //更新报修单 + QueryWrapper objectQueryWrapper = new QueryWrapper<>(); + objectQueryWrapper.eq("number",Do.getRequestNumber()); + objectQueryWrapper.eq("result",OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + List list = deviceRepairRequestMapper.selectList(objectQueryWrapper); + if (list != null && list.size() > 0) { + DeviceRepairRequestDO deviceRepairRequestDO = list.get(0); + deviceRepairRequestDO.setResult(OrderStatusEnum.TRANSFERRED_STATUS.getCode()); + deviceRepairRequestMapper.updateById(deviceRepairRequestDO); + //添加一个新的报修单,单号形同状态不同,此状态应该是和维修工单同步 + deviceRepairRequestDO.setResult(Do.getStatus()); + deviceRepairRequestDO.setType(receiverType); + deviceRepairRequestDO.setId(null); + deviceRepairRequestDO.setDeviceNumber(deviceNumber); + deviceRepairRequestMapper.insert(deviceRepairRequestDO); + } + if(!"1".equals(status)){//设备转办更改状态 + //原报修设备修改更改状态为正常 + if(oldtype.equals("MOLD")){ + MoldAccountsDO moldAccountsDO = moldAccountsMapper.selectOne("number", olddeviceNumber, "deleted", 0); + moldAccountsDO.setStatus("0"); + moldAccountsMapper.updateById(moldAccountsDO); + }else{ + DeviceAccountsDO deviceAccountsDO = deviceAccountsMapper.selectOne("number", olddeviceNumber, "deleted", 0); + deviceAccountsDO.setStatus("0"); + deviceAccountsMapper.updateById(deviceAccountsDO); + } + //转办的设备更改状态为维修 + if(receiverType.equals("MOLD")){ + MoldAccountsDO moldAccountsDO = moldAccountsMapper.selectOne("number", deviceNumber, "deleted", 0); + moldAccountsDO.setStatus("1"); + moldAccountsMapper.updateById(moldAccountsDO); + }else{ + DeviceAccountsDO deviceAccountsDO = deviceAccountsMapper.selectOne("number", deviceNumber, "deleted", 0); + deviceAccountsDO.setStatus("1"); + deviceAccountsMapper.updateById(deviceAccountsDO); + } + } + //转办记录表 + MaintenanceTurntoDO turntoDO = new MaintenanceTurntoDO(); + turntoDO.setMaintenanceNumber(Do.getNumber()); + turntoDO.setDeviceNumberOld(deviceNumberold);//转前设备模具号 + turntoDO.setDeviceNumber(deviceNumber);//转后设备模具号 + turntoDO.setTurnToType(turnToType);//转前类型 + turntoDO.setReceiverType(receiverType);//转后类型 + turntoDO.setTurnToUserid(turnToUserId);//转前接单人 + turntoDO.setFactoryAreaNumber(factoryAreaNumber);//厂区号 + turntoDO.setReceiverUserid(receiverUserId);//转后接单人 + turntoDO.setFactoryAreaNumberOld(factoryAreaNumber); + turntoDO.setStatus(status); + int i1 = maintenanceTurntoMapper.insert(turntoDO); + return i1; + } + @Override + @Transactional(rollbackFor = Exception.class) + public int orderClick(Long id) { + DeviceMaintenanceJobMainDO Do = deviceMaintenanceJobMainMapper.selectById(id); + if (Do == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + Do.setReceivingTime(LocalDateTime.now()); + Do.setMaintenance(getLoginUserId());//接单人 + Do.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + int i = deviceMaintenanceJobMainMapper.updateById(Do); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", Do.getRequestNumber()); + queryWrapper.eq("result", OrderStatusEnum.PEND_ORDER_STATUS.getCode()); + List list = deviceRepairRequestMapper.selectList(queryWrapper); + if (list != null && list.size() > 0) { + DeviceRepairRequestDO deviceRepairRequestDO = list.get(0); + deviceRepairRequestDO.setResult(Do.getStatus()); + return deviceRepairRequestMapper.updateById(deviceRepairRequestDO); + } + return i; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int orderClickFinish(Long id, String result) { + DeviceMaintenanceJobMainDO Do = deviceMaintenanceJobMainMapper.selectById(id); + validateWC(id);//校验 + Do.setCompletionTime(LocalDateTime.now()); + Do.setStatus(OrderStatusEnum.COMPLETED_STATUS.getCode()); + Do.setResult(result); + deviceMaintenanceJobMainMapper.updateById(Do); + //点击完成需要修改设备模具状态为正常 + //更新设备模具需要更改维修状态为0正常 + String deviceNumber = Do.getDeviceNumber(); + DeviceAccountsDO deviceAccountsDO = deviceAccountsMapper.selectOne("number", deviceNumber, "deleted", 0); + deviceAccountsDO.setStatus("0"); + deviceAccountsDO.setNumber(deviceNumber); + int i = deviceAccountsMapper.updateById(deviceAccountsDO); + if (Do.getRequestNumber() != null && !Do.getRequestNumber().isEmpty()) {//该维修工单来源于报修申请需要申请人确认 + //给申报人推送消息 + UniappPushMessageRespVO respVO = new UniappPushMessageRespVO(); + respVO.setType(Do.getType()); + respVO.setStatus("1"); + respVO.setNumber(deviceNumber); + respVO.setFactoryAreaNumber(Do.getFactoryAreaNumber()); + respVO.setType(Do.getType()); + respVO.setApplyer(Do.getApplyer()); + uniappPushMessageService.uniappSend(respVO); + } else {//工程师验证 + try { + sendEmails(Do, 1); + } catch (Exception e) { + info("发送邮件异常:{}", e); + } + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", Do.getRequestNumber()); + queryWrapper.eq("result", OrderStatusEnum.PEND_ORDER_STATUS.getCode()); + List list = deviceRepairRequestMapper.selectList(queryWrapper); + if (list != null && list.size() > 0) { + DeviceRepairRequestDO deviceRepairRequestDO = list.get(0); + deviceRepairRequestDO.setResult(Do.getStatus()); + return deviceRepairRequestMapper.updateById(deviceRepairRequestDO); + } + return i; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int orderClickConfirm(Long id,String result, String content) { + DeviceMaintenanceJobMainDO Do = deviceMaintenanceJobMainMapper.selectById(id); + validateSQ(id);//校验 + Do.setApplyTime(LocalDateTime.now()); + if (result == null || result.isEmpty()) { + throw exception(WEI_XIU_ORDER_APPLY_NOT_EMPTY); + } + if (OrderStatusEnum.APPLY_PASS_STATUS.getCode().equals(result)) {//申请人通过流程正常走 + Do.setStatus(result); + Do.setApplyContent(content); + Do.setApplyTime(LocalDateTime.now()); + try { + sendEmails(Do, 1); + } catch (Exception e) { + info("发送邮件异常:{}", e); + } + } else {// 申请人确认驳回需要重置维修工单以及报修工单为已接单状态(暂时申请人确认操作不需要留痕) + Do.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + Do.setApplyContent(content); + Do.setApplyTime(LocalDateTime.now()); + Do.setResult(""); + Do.setCompletionTime(null); + } + int i = deviceMaintenanceJobMainMapper.updateById(Do); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", Do.getRequestNumber()); + queryWrapper.eq("result", OrderStatusEnum.COMPLETED_STATUS.getCode()); + List list = deviceRepairRequestMapper.selectList(queryWrapper); + if (list != null && list.size() > 0) { + DeviceRepairRequestDO deviceRepairRequestDO = list.get(0); + deviceRepairRequestDO.setResult(Do.getStatus()); + return deviceRepairRequestMapper.updateById(deviceRepairRequestDO); + } + return i; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int orderClickVerify(Long id,String status, String content) { + DeviceMaintenanceJobMainDO Do = deviceMaintenanceJobMainMapper.selectById(id); + validateYZ(id);//验证 + Do.setVerifyTime(LocalDateTime.now()); + Do.setVerifyer(getLoginUserId());//验证人 + Do.setVerifyContent(content); + Do.setStatus(OrderStatusEnum.VERIFIED_STATUS.getCode()); + int i = deviceMaintenanceJobMainMapper.updateById(Do); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("number", Do.getRequestNumber()); + queryWrapper.eq("result", status); + List list = deviceRepairRequestMapper.selectList(queryWrapper); + if (list != null && list.size() > 0) { + DeviceRepairRequestDO deviceRepairRequestDO = list.get(0); + deviceRepairRequestDO.setResult(Do.getStatus()); + return deviceRepairRequestMapper.updateById(deviceRepairRequestDO); + } + return i; + } + + + @Override + public int deleteStatus(String request_number) { + return deviceMaintenanceJobMainMapper.deleteStatus(request_number); + } + + @Override + public PageResult getAppPage(DeviceMaintenanceJobMainPageReqVO pageReqVO) { + pageReqVO.setUserId(getLoginUserId().toString()); + pageReqVO.setClassType("TECH"); + String b = classTypeMapper.getIdentity("TECH"); + if (b.equals("2")) { + throw exception(WORKER_ENGINEER_IS_NOT); + } + pageReqVO.setStandType(b); + if ("1".equals(pageReqVO.getFlag())) {//flag 0 首页进入 1我的进入 + //我的里面都是获取的是当前人已经完成的单子 + pageReqVO.setUserId(getLoginUserId().toString()); + IPage pageInfo = deviceMaintenanceJobMainMapper.getAppPage1(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for(DeviceMaintenanceJobMainDO en :pageInfo.getRecords()){ + String deviceNumber = en.getDeviceNumber(); + String type = en.getType(); + if("MOLD".equals(type)){//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + }else{//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + } + + } + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + }if("2".equals(pageReqVO.getFlag())){//报修人确认列表 + IPage pageInfo = deviceMaintenanceJobMainMapper.getAppPage2(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } else { + //首页进入是获取未接单 已接单的单子 + pageReqVO.setFlag("0"); + } + IPage pageInfo = deviceMaintenanceJobMainMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + } + + @Override + public DeviceMaintenanceJobMainDO getAppByNumber(String number) { + DeviceMaintenanceJobMainDO en = deviceMaintenanceJobMainMapper.getAppByNumber(number); + if (en != null) { + String deviceNumber = en.getDeviceNumber(); + String type = en.getType(); + if("MOLD".equals(type)){//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + }else{//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + } + + return en; + }else{ + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + } + + @Override + public List> getList(String type) { + return deviceMaintenanceJobMainMapper.getList(type); + } + + /** + * 校验人员厂区和班组是否匹配 + * @param id + */ + private void validateFactoryAndClassType(Long id) { + String classType = permissionApi.getClassType(); + DeviceMaintenanceJobMainDO mainDO = deviceMaintenanceJobMainMapper.selectById(id); + if (mainDO == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } +// AdminUserRespDTO user = userApi.getUser(getLoginUserId()); +// Long deptId = user.getDeptId(); +// DeptRespDTO dept = deptApi.getDept(deptId); +// if(!mainDO.getFactoryAreaNumber().equals(user.getDeptId().toString())){//厂区不一致 +// throw exception(FACTORY_NO_NOMAL); +// } + if(!mainDO.getType().equals(classType)){//班组不一致 + throw exception(CLASSTYPR_NO_NOMAL); + } + } + + /** + * 校验能否点击待接单 + * + * @param id + */ + private void validateJD(Long id, String number) { + if (deviceMaintenanceJobMainMapper.selectById(id) == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + DeviceMaintenanceJobMainRespVO reqVO = new DeviceMaintenanceJobMainRespVO(); + reqVO.setNumber(number); + reqVO.setStatus(OrderStatusEnum.PEND_ORDER_STATUS.getCode()); + Long l = deviceMaintenanceJobMainMapper.selectCountByScree(reqVO); + if (l <= 0) {//订单已被接单 + throw exception(WEI_XIU_NOT_DJ); + } + if (!permissionApi.BooleanEngineer() && !permissionApi.BooleanWorker()) { + throw exception(WEI_XIU_NOT_WORKER); + } + + } + + /** + * 校验能否点击完成 + * + * @param id + */ + private void validateWC(Long id) { + long size = 1L; // 声明一个long类型的变量并赋值为10 + DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectById(id); + if (deviceMaintenanceJobMainDO == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + DeviceMaintenanceJobMainRespVO reqVO = new DeviceMaintenanceJobMainRespVO(); + long loginUserId = getLoginUserId(); + long maintenance = deviceMaintenanceJobMainDO.getMaintenance(); + if (loginUserId != maintenance) {//接单人和维修人相等才能点击完成 + throw exception(WEI_XIU_NOT_WC); + } + reqVO.setNumber(deviceMaintenanceJobMainDO.getNumber()); + reqVO.setMaintenance(getLoginUserId()); + reqVO.setStatus(OrderStatusEnum.RECEIVED_ORDER_STATUS.getCode()); + //reqVo.set + Long l = deviceMaintenanceJobMainMapper.selectCountByScree(reqVO); + if (l < size) {//当前状态非待接单 + throw exception(JIAN_XIU_NOT_PENDING); + } + } + + /** + * 校验能否点击验证 + * + * @param id + */ + private void validateYZ(Long id) { + long size = 1L; // 声明一个long类型的变量并赋值为10 + DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectById(id); + if (deviceMaintenanceJobMainDO == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + if (deviceMaintenanceJobMainDO.getRequestNumber() != null && !deviceMaintenanceJobMainDO.getRequestNumber().isEmpty()) {//需要申请人确认通过才能验证 + DeviceMaintenanceJobMainRespVO reqVO = new DeviceMaintenanceJobMainRespVO(); + reqVO.setNumber(deviceMaintenanceJobMainDO.getNumber()); + reqVO.setStatus(OrderStatusEnum.APPLY_PASS_STATUS.getCode()); + //reqVo.set + Long l = deviceMaintenanceJobMainMapper.selectCountByScree(reqVO); + if (l < size) {//当前人无法验证 + throw exception(WEI_XIU_NOT_YZ); + } + } else {//维修工单手动创建的没有申请人节点 + DeviceMaintenanceJobMainRespVO reqVO = new DeviceMaintenanceJobMainRespVO(); + reqVO.setNumber(deviceMaintenanceJobMainDO.getNumber()); + reqVO.setStatus(OrderStatusEnum.COMPLETED_STATUS.getCode()); + //reqVo.set + Long l = deviceMaintenanceJobMainMapper.selectCountByScree(reqVO); + if (l < size) {//当前人无法验证 + throw exception(WEI_XIU_NOT_YZ); + } + + } + + } + + /** + * 申请人能否点击 + * + * @param id + */ + private void validateSQ(Long id) { + long size = 1L; // 声明一个long类型的变量并赋值为10 + DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO = deviceMaintenanceJobMainMapper.selectById(id); + if (deviceMaintenanceJobMainDO == null) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS); + } + Map detailsByNumber = deviceRepairRequestMapper.getDetailsByNumber(deviceMaintenanceJobMainDO.getRequestNumber(), deviceMaintenanceJobMainDO.getType()); + if (detailsByNumber == null || detailsByNumber.isEmpty()) { + throw exception(WEI_XIU_ORDER_NOT_EXISTS_APPLY); + } else { + long loginUserId = getLoginUserId(); + long applyer = deviceMaintenanceJobMainDO.getApplyer(); + if (applyer != loginUserId) {//申请人与当前操作人不符合 + throw exception(WEI_XIU_ORDER_APPLY_NOT_CONFORM); + } + } + } + + /** + * 维修工单发送邮件 + */ + private void sendEmails(DeviceMaintenanceJobMainDO deviceMaintenanceJobMainDO,int flag){ + String type = deviceMaintenanceJobMainDO.getType(); + if (flag == 0) {//走报修创建的未接单的维修工单,待接单邮件提醒 + List userBeanList = classTypeMapper.JudgeIdentity(null, type, "1", deviceMaintenanceJobMainDO.getFactoryAreaNumber()); + userBeanList.stream().forEach(item -> { + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getUserId())); + mailSendSingleToUserReqDTO.setTemplateCode("request-repair-template"); + Map params = new HashMap<>(); + params.put("typeName", "工艺"); + params.put("number", deviceMaintenanceJobMainDO.getNumber()); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + } catch (RuntimeException e) { + info("工单编号为" + deviceMaintenanceJobMainDO.getNumber() + "的名为:" + deviceMaintenanceJobMainDO.getDescribes() + "的工单给" + item.getNickname() + "发送的邮件通知失败:{}", e); + } + }); + } else {//维修工单点击完成后需要验证的邮件提醒 + List userBeanList = classTypeMapper.JudgeIdentity(null, type, "1", deviceMaintenanceJobMainDO.getFactoryAreaNumber()); + userBeanList.stream().forEach(item -> { + try { + MailSendSingleToUserReqDTO mailSendSingleToUserReqDTO = new MailSendSingleToUserReqDTO(); + mailSendSingleToUserReqDTO.setUserId(Long.valueOf(item.getUserId())); + mailSendSingleToUserReqDTO.setTemplateCode("job-maintenance-template"); + Map params = new HashMap<>(); + params.put("typeName","工艺"); + params.put("name", item.getNickname()); + params.put("number", deviceMaintenanceJobMainDO.getNumber()); + mailSendSingleToUserReqDTO.setTemplateParams(params); + mailSendApi.sendSingleMailToAdmin(mailSendSingleToUserReqDTO); + } catch (RuntimeException e) { + info("工单编号为" + deviceMaintenanceJobMainDO.getNumber() + "的名为:" + deviceMaintenanceJobMainDO.getDescribes() + "的工单给" + item.getNickname() + "发送的邮件通知失败:{}", e); + } + }); + } + } + +} \ No newline at end of file diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techrepairrequest/TechRepairRequestService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techrepairrequest/TechRepairRequestService.java new file mode 100644 index 0000000..1d7ce44 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techrepairrequest/TechRepairRequestService.java @@ -0,0 +1,113 @@ +package com.win.module.eam.service.techrepairrequest; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.devicerepairrequest.vo.*; +import com.win.module.eam.dal.dataobject.devicerepairrequest.DeviceRepairRequestDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 报修申请 Service 接口 + * + * @author 超级管理员 + */ +public interface TechRepairRequestService { + + /** + * 创建报修申请 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeviceRepair(@Valid DeviceRepairRequestRequestCreateReqVO createReqVO); + + /** + * 更新报修申请 + * + * @param updateReqVO 更新信息 + */ + Integer updateDeviceRepair(@Valid DeviceRepairRequestRequestUpdateReqVO updateReqVO); + + /** + * 删除报修申请 + * + * @param id 编号 + */ + Integer deleteDeviceRepair(Long id); + + /** + * 删除报修申请 + * + * @param id 编号 + */ + Integer rejectedDeviceRepair(Long id); + + /** + * 获得报修申请 + * + * @param id 编号 + * @return 报修申请 + */ + DeviceRepairRequestDO getDeviceRepair(Long id); + + /** + * 获得报修申请列表 + * + * @param ids 编号 + * @return 报修申请列表 + */ + List getDeviceRepairList(Collection ids); + + /** + * 获得报修申请分页 + * + * @param pageReqVO 分页查询 + * @return 报修申请分页 + */ + PageResult getDeviceRepairPage(DeviceRepairRequestPageReqVO pageReqVO); + + /** + * 获得报修申请分页 + * + * @param conditions 分页查询 + * @return 报修申请分页 + */ + PageResult getDeviceRepairSenior(CustomConditions conditions); + + PageResult getAppPage(DeviceRepairRequestPageReqVO pageReqVO); + + /** + * 获得报修申请列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 报修申请列表 + */ + List getDeviceRepairList(DeviceRepairRequestExportReqVO exportReqVO); + + /** + * 根据报修申请号查询报修详情 + * @param requestNumber + * @return + */ + Map getDetailsByNumber(String requestNumber,String type); + + /** + * 导入报修申请主信息 + * + * @param datas 导入报修申请主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importDeviceRepairList(List datas, Integer mode, boolean updatePart); + + + + DeviceRepairRequestDO getOrderByNumber(String requestNumber); + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techrepairrequest/TechRepairRequestServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techrepairrequest/TechRepairRequestServiceImpl.java new file mode 100644 index 0000000..ae3ae2f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/techrepairrequest/TechRepairRequestServiceImpl.java @@ -0,0 +1,360 @@ +package com.win.module.eam.service.techrepairrequest; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.attachmentfile.vo.UploadFileRequest; +import com.win.module.eam.controller.devicemaintenancejob.vo.DeviceMaintenanceJobMainCreateReqVO; +import com.win.module.eam.controller.devicerepairrequest.vo.*; +import com.win.module.eam.convert.devicerepairrequest.DeviceRepairRequestConvert; +import com.win.module.eam.dal.dataobject.attachmentfile.AttachmentFileDO; +import com.win.module.eam.dal.dataobject.devicemaintenancejob.DeviceMaintenanceJobMainDO; +import com.win.module.eam.dal.dataobject.devicerepairrequest.DeviceRepairRequestDO; +import com.win.module.eam.dal.mysql.attachmentfile.AttachmentFileMapper; +import com.win.module.eam.dal.mysql.deviceaccounts.DeviceAccountsMapper; +import com.win.module.eam.dal.mysql.devicemaintenancejob.DeviceMaintenanceJobMainMapper; +import com.win.module.eam.dal.mysql.devicerepairrequest.DeviceRepairRequestMapper; +import com.win.module.eam.dal.mysql.moldaccounts.MoldAccountsMapper; +import com.win.module.eam.enums.basic.BasicStatusEnum; +import com.win.module.eam.enums.order.OrderStatusEnum; +import com.win.module.eam.service.attachmentfile.AttachmentFileService; +import com.win.module.eam.service.deviceaccounts.DeviceAccountsService; +import com.win.module.eam.service.devicemaintenancejob.DeviceMaintenanceJobMainService; +import com.win.module.eam.service.moldaccounts.MoldAccountsService; +import com.win.module.system.api.mail.MailSendApi; +import com.win.module.system.api.serialnumber.SerialNumberApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.enums.serialNumber.RuleCodeEnum; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.ArrayList; +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.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + + +/** + * 报修申请 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class TechRepairRequestServiceImpl implements TechRepairRequestService { + + @Resource + private DeviceRepairRequestMapper deviceRepairRequestMapper; + + @Resource + private DeviceMaintenanceJobMainMapper deviceMaintenanceJobMainMapper; + + @Resource + private SerialNumberApi serialNumberApi; + + @Resource + private AdminUserApi userApi; + + + @Resource + private DeviceMaintenanceJobMainService deviceMaintenanceJobMainService; + + @Resource + private DeviceAccountsService deviceAccountsService; + + @Resource + private MoldAccountsMapper moldAccountsMapper; + + @Resource + private DeviceAccountsMapper deviceAccountsMapper; + + @Resource + private AttachmentFileService attachmentFileService; + + @Resource + private AttachmentFileMapper attachmentFileMapper; + + @Resource + private MoldAccountsService moldAccountsService; + + @Resource + private AdminUserApi adminUserApi; + + @Resource + private MailSendApi mailSendApi; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDeviceRepair(DeviceRepairRequestRequestCreateReqVO createReqVO) { + // 插入 + DeviceRepairRequestDO deviceRepair = DeviceRepairRequestConvert.INSTANCE.convert(createReqVO); + deviceRepair.setResult(OrderStatusEnum.PEND_ORDER_STATUS.getCode());//待接单 + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + String number = serialNumberApi.generateCode(RuleCodeEnum.REQUEST_REPAIR.getCode()); + deviceRepair.setNumber(number); + deviceRepair.setDeptId(Long.parseLong(createReqVO.getFactoryAreaNumber())); + deviceRepair.setDeclarer(user.getId()); + List filePathList = createReqVO.getFilePathList(); + if(filePathList!=null&&!filePathList.isEmpty()){//有图片 + UploadFileRequest uploadFileRequest = new UploadFileRequest(); + uploadFileRequest.setNumber(number); + uploadFileRequest.setFuncCode("request_repair"); + uploadFileRequest.setFilePathList(filePathList); + attachmentFileService.uploadFile(uploadFileRequest); + } + deviceRepairRequestMapper.insert(deviceRepair); + //添加维修工单 + DeviceMaintenanceJobMainCreateReqVO createReqVOS =new DeviceMaintenanceJobMainCreateReqVO(); + createReqVOS.setRequestNumber(number); + createReqVOS.setType(createReqVO.getType()); + createReqVOS.setDeviceNumber(createReqVO.getDeviceNumber()); + createReqVOS.setFactoryAreaNumber(createReqVO.getFactoryAreaNumber()); + createReqVOS.setDescribes(createReqVO.getDescribes()); + createReqVOS.setStatus(OrderStatusEnum.PEND_ORDER_STATUS.getCode()); + Long deviceMaintenanceMain = deviceMaintenanceJobMainService.createDeviceMaintenanceMain(createReqVOS);// 返回 + //修改台账保修状态 + if(deviceMaintenanceMain!=null){ + //更新设备模具状态 + if(BasicStatusEnum.BASIC_MOLD.getCode().equals(createReqVO.getType()) ){ + moldAccountsService.updateMoldAccountsStatus(createReqVO.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_1.getCode()); + } else { + deviceAccountsService.updateDeviceAccountsStatus(createReqVO.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_1.getCode()); + } + } + return deviceMaintenanceMain; + } + + @Override + public Integer updateDeviceRepair(DeviceRepairRequestRequestUpdateReqVO updateReqVO) { + // 校验存在 + //validateDeviceRepairExists(updateReqVO.getId(),updateReqVO.getNumber(),"1"); + // 更新 + DeviceRepairRequestDO updateObj = DeviceRepairRequestConvert.INSTANCE.convert(updateReqVO); + return deviceRepairRequestMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer deleteDeviceRepair(Long id) { + // 校验存在 + validateDeviceRepairExists(id,"0"); + // 删除 + deviceRepairRequestMapper.deleteById(id); + DeviceRepairRequestDO deviceRepairRequestDO = deviceRepairRequestMapper.selectById(id); + return deviceMaintenanceJobMainService.deleteStatus(deviceRepairRequestDO.getNumber()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer rejectedDeviceRepair(Long id) { + // 校验存在 + validateDeviceRepairExists(id,"1"); + // 删除 + DeviceRepairRequestDO deviceRepairRequestDO1 = deviceRepairRequestMapper.selectById(id); + long declarer = deviceRepairRequestDO1.getDeclarer(); + long loginUserId = getLoginUserId(); + if(declarer!=loginUserId){//只有报修人才能撤销 + throw exception(PEOPLE_NO_NOMAL);//当前人无法执行撤销操作 + } + deviceRepairRequestDO1.setResult(OrderStatusEnum.REJECTED_STATUS.getCode());//已驳回 + int i = deviceRepairRequestMapper.updateById(deviceRepairRequestDO1); + //更新设备模具状态 + if(BasicStatusEnum.BASIC_DEVICE.getCode().equals(deviceRepairRequestDO1.getType()) ){ + deviceAccountsService.updateDeviceAccountsStatus(deviceRepairRequestDO1.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_0.getCode()); + }if(BasicStatusEnum.BASIC_TECH.getCode().equals(deviceRepairRequestDO1.getType()) ){ + deviceAccountsService.updateDeviceAccountsStatus(deviceRepairRequestDO1.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_0.getCode()); + }else if(BasicStatusEnum.BASIC_MOLD.getCode().equals(deviceRepairRequestDO1.getType()) ){ + moldAccountsService.updateMoldAccountsStatus(deviceRepairRequestDO1.getDeviceNumber(),BasicStatusEnum.BASIC_STATUS_0.getCode()); + } + List requestNumber = deviceMaintenanceJobMainMapper.selectList("request_number", deviceRepairRequestDO1.getNumber()); + if(requestNumber!=null&&!requestNumber.isEmpty()){ + DeviceMaintenanceJobMainDO maintenanceJobMainDO = requestNumber.get(0); + maintenanceJobMainDO.setStatus(OrderStatusEnum.REJECTED_STATUS.getCode()); + deviceMaintenanceJobMainMapper.updateById(maintenanceJobMainDO); + } + return i; + } + + /** + * 根据id获取该订单是否接单 + * 校验id + * @param type 0删除1驳回 + */ + private void validateDeviceRepairExists(Long id,String type) { + if (deviceRepairRequestMapper.selectById(id) == null) { + throw exception(REQUEST_REPAIR_NOT_EXISTS); + } + Long l = deviceRepairRequestMapper.selectCountById(id, OrderStatusEnum.PEND_ORDER_STATUS.getCode());//待接单 + if(l==0){ + if("0".equals(type)){ + throw exception(REQUEST_REPAIR_DEL_EXISTS);//以接单不能删除 + }else{ + throw exception(REQUEST_REPAIR_PRE_EXISTS);//以接单不能驳回 + } + } + } + + @Override + public DeviceRepairRequestDO getDeviceRepair(Long id) { + return deviceRepairRequestMapper.selectById(id); + } + + @Override + public List getDeviceRepairList(Collection ids) { + return deviceRepairRequestMapper.selectBatchIds(ids); + } + + @Override + public PageResult getDeviceRepairPage(DeviceRepairRequestPageReqVO pageReqVO) { + PageResult deviceRepairDOPageResult = deviceRepairRequestMapper.selectPage(pageReqVO); + List deviceRepairList = deviceRepairDOPageResult.getList(); + deviceRepairList.stream().forEach(deviceRepair -> { + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setFuncCode("request_repair"); + attachmentFileDO.setNumber(deviceRepair.getNumber()); + List list = attachmentFileService.getAttachmentFilePathList(attachmentFileDO); + // 设置filePathList字段 + if(list!= null && list.size() > 0){ + deviceRepair.setFilePathList(list); + } + }); + return deviceRepairDOPageResult; + } + + @Override + public PageResult getDeviceRepairSenior(CustomConditions conditions) { + PageResult deviceRepairDOPageResult = deviceRepairRequestMapper.selectSenior(conditions); + List deviceRepairList = deviceRepairDOPageResult.getList(); + deviceRepairList.stream().forEach(deviceRepair -> { + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setFuncCode("request_repair"); + attachmentFileDO.setNumber(deviceRepair.getNumber()); + List list = attachmentFileService.getAttachmentFilePathList(attachmentFileDO); + // 设置filePathList字段 + if(list!= null && list.size() > 0){ + deviceRepair.setFilePathList(list); + } + }); + return deviceRepairDOPageResult; + } + + @Override + public PageResult getAppPage(DeviceRepairRequestPageReqVO pageReqVO) { + pageReqVO.setUserId(getLoginUserId().toString()); + if("1".equals(pageReqVO.getFlag())){//flag 0 首页进入 1我的进入 + //我的里面都是获取的是当前人已经完成的单子 + IPage pageInfo = deviceRepairRequestMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for(DeviceRepairRequestDO en :pageInfo.getRecords()){ + String deviceNumber = en.getDeviceNumber(); + String type = en.getType(); + if("MOLD".equals(type)){//模具 + Map detailsByNumber = moldAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + }else{//设备 + Map detailsByNumber = deviceAccountsMapper.getDetailsByNumber(deviceNumber); + en.setFactoryAreaNumber(detailsByNumber==null?"":detailsByNumber.get("factoryAreaNumber").toString()); + en.setFactoryAreaName(detailsByNumber==null?"":detailsByNumber.get("factoryAreaName").toString()); + en.setName(detailsByNumber==null?"":detailsByNumber.get("name").toString()); + } + //循环申请图片 + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setNumber(en.getNumber()); + attachmentFileDO.setFuncCode("request_repair"); + List attachmentFileList = attachmentFileMapper.getAttachmentFileList(attachmentFileDO); + List list = new ArrayList<>(); + for(AttachmentFileDO attachment:attachmentFileList){ + list.add(attachment.getPath()); + } + en.setFilePathList(list); + } + return new PageResult<>(pageInfo.getRecords(), pageInfo.getTotal()); + } + return null; + }else{ + //首页进入是获取未接单 已接单的单子 + pageReqVO.setFlag("0"); + } + IPage pageInfo = deviceRepairRequestMapper.getAppPage(new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO); + if (pageInfo != null) { + for(DeviceRepairRequestDO en :pageInfo.getRecords()){ + //循环申请图片 + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setNumber(en.getNumber()); + attachmentFileDO.setFuncCode("request_repair"); + List attachmentFileList = attachmentFileMapper.getAttachmentFileList(attachmentFileDO); + List list = new ArrayList<>(); + for(AttachmentFileDO attachment:attachmentFileList){ + list.add(attachment.getPath()); + } + en.setFilePathList(list); + } + return new PageResult<>(pageInfo.getRecords() , pageInfo.getTotal()); + } + return null; + } + + @Override + public List getDeviceRepairList(DeviceRepairRequestExportReqVO exportReqVO) { + return deviceRepairRequestMapper.selectList(exportReqVO); + } + + @Override + public Map getDetailsByNumber(String requestNumber,String type) { + Map en = deviceRepairRequestMapper.getDetailsByNumber(requestNumber, type); + if(en!=null){ + //循环申请图片 + AttachmentFileDO attachmentFileDO = new AttachmentFileDO(); + attachmentFileDO.setNumber(en.get("number").toString()); + attachmentFileDO.setFuncCode("request_repair"); + List attachmentFileList = attachmentFileMapper.getAttachmentFileList(attachmentFileDO); + List list = new ArrayList<>(); + for(AttachmentFileDO attachment:attachmentFileList){ + list.add(attachment.getPath()); + } + en.put("filePathList",list); + } + return en; + } + + @Override + public List importDeviceRepairList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(DEVICE_REPAIR_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// DeviceRepairDO obj = deviceRepairMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// deviceRepairMapper.insert(DeviceRepairConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// DeviceRepairDO deviceRepairDO = DeviceRepairConvert.INSTANCE.convert(item); +// deviceRepairDO.setId(obj.getId()); +// deviceRepairMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + @Override + public DeviceRepairRequestDO getOrderByNumber(String requestNumber) { + return deviceRepairRequestMapper.getOrderByNumber(requestNumber); + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/transaction/TransactionService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/transaction/TransactionService.java new file mode 100644 index 0000000..d49d11e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/transaction/TransactionService.java @@ -0,0 +1,90 @@ +package com.win.module.eam.service.transaction; + +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.transaction.vo.TransactionCreateReqVO; +import com.win.module.eam.controller.transaction.vo.TransactionExportReqVO; +import com.win.module.eam.controller.transaction.vo.TransactionPageReqVO; +import com.win.module.eam.controller.transaction.vo.TransactionUpdateReqVO; +import com.win.module.eam.dal.dataobject.transaction.TransactionDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 库存事务 Service 接口 + * + * @author 超级管理员 + */ +public interface TransactionService { + + /** + * 创建库存事务 + * + * @param createReqVOList 创建信息 + * @return 编号 + */ + Integer create(@Valid List createReqVOList); + + /** + * 更新库存事务 + * + * @param updateReqVO 更新信息 + */ + Integer update(@Valid TransactionUpdateReqVO updateReqVO); + + /** + * 删除库存事务 + * + * @param id 编号 + */ + Integer delete(Long id); + + /** + * 获得库存事务 + * + * @param id 编号 + * @return 库存事务 + */ + TransactionDO get(Long id); + + /** + * 获得库存事务列表 + * + * @param ids 编号 + * @return 库存事务列表 + */ + List getList(Collection ids); + + /** + * 获得库存事务分页 + * + * @param pageReqVO 分页查询 + * @return 库存事务分页 + */ + PageResult getPage(TransactionPageReqVO pageReqVO); + + /** + * 获得库存事务列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 库存事务列表 + */ + List getList(TransactionExportReqVO exportReqVO); + + /** + * 获得用高级搜索库位分页列表 + * + * @param conditions 分页、排序和自定义条件 + * @return 分页列表 + */ + PageResult getTransactionSenior(CustomConditions conditions); + + /** + * 备件出库操作时需要判断重采购点是否需要给oa发消息(低于重采购点发消息) + * @param number + */ + void SendOa(String number); + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/transaction/TransactionServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/transaction/TransactionServiceImpl.java new file mode 100644 index 0000000..96f3441 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/transaction/TransactionServiceImpl.java @@ -0,0 +1,352 @@ +package com.win.module.eam.service.transaction; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.module.eam.controller.itemaccounts.vo.ItemAccountsCreateReqVO; +import com.win.module.eam.controller.transaction.vo.TransactionCreateReqVO; +import com.win.module.eam.controller.transaction.vo.TransactionExportReqVO; +import com.win.module.eam.controller.transaction.vo.TransactionPageReqVO; +import com.win.module.eam.controller.transaction.vo.TransactionUpdateReqVO; +import com.win.module.eam.convert.transaction.TransactionConvert; +import com.win.module.eam.dal.dataobject.item.ItemDO; +import com.win.module.eam.dal.dataobject.json.*; +import com.win.module.eam.dal.dataobject.transaction.TransactionDO; +import com.win.module.eam.dal.mysql.item.ItemMapper; +import com.win.module.eam.dal.mysql.itemaccounts.ItemAccountsMapper; +import com.win.module.eam.dal.mysql.transaction.TransactionMapper; +import com.win.module.eam.enums.basic.BooleanTypeEnum; +import com.win.module.eam.enums.transaction.TransactionEnum; +import com.win.module.eam.util.SoapUtil; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import org.springframework.beans.BeanUtils; +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.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.UUID; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.TRANSACTION_NOT_EXISTS; + +/** + * 库存事务 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class TransactionServiceImpl implements TransactionService { + + @Resource + private TransactionMapper Mapper; + + @Resource + private ItemAccountsMapper itemAccountsMapper; + + @Resource + private ItemMapper itemMapper; + @Resource + private AdminUserApi userApi; + + + @Override + @Transactional + public Integer create(List createReqVOList) { + int result = 0; + int line = 0; + //如果是采购入库,领用出库,盘点调整,需要调用QAD更新数据 + //领用出库 + List issunpMstr = new ArrayList<>(); + List issunpDet = new ArrayList<>(); + //盘点调整 + List rctunpMstr = new ArrayList<>(); + List rctunpDet = new ArrayList<>(); + //采购入库 + List receiptMstr = new ArrayList<>(); + List receiptDet = new ArrayList<>(); + + JsonTask jsonTask = new JsonTask(); + //填充QAD所需的主表数据以及其他数据 + //每次调用接口都是相同库存动作 + //TransactionEnum.REQUISITION_OUT 领用出库· + if (TransactionEnum.REQUISITION_OUT.getCode().equals(createReqVOList.get(0).getInventoryAction())) {//任务 + jsonTask = this.sendJsonTask("TED_RECEIPT_MSTR", createReqVOList.size()); + TedIssunpMstr tedIssunpMstr = new TedIssunpMstr(); + tedIssunpMstr.setGUID(UUID.randomUUID()); + tedIssunpMstr.setUser(""); + tedIssunpMstr.setUnplanedBillNum(null); + tedIssunpMstr.setDate(jsonTask.getCreateTime()); + tedIssunpMstr.setTime(jsonTask.getCreateTime()); + tedIssunpMstr.setUID(0); + tedIssunpMstr.setCreateUser(jsonTask.getCreateUser()); + tedIssunpMstr.setCreateTime(jsonTask.getCreateTime()); + tedIssunpMstr.setRemark(null); + tedIssunpMstr.setTaskID(jsonTask.getTaskID()); + tedIssunpMstr.setCommandType("A"); + tedIssunpMstr.setDomain(jsonTask.getDomain()); + tedIssunpMstr.setSite(jsonTask.getSite()); + issunpMstr.add(tedIssunpMstr); + + } + //TransactionEnum.PURCHASE_IN 采购入库 + if (TransactionEnum.PURCHASE_IN.getCode().equals(createReqVOList.get(0).getInventoryAction())) { + jsonTask = this.sendJsonTask("TED_ISSUNP_MSTR", createReqVOList.size()); + TedReceiptMstr tedReceiptMstr = new TedReceiptMstr(); + tedReceiptMstr.setUser(jsonTask.getCreateUser());// 操作员 + tedReceiptMstr.setASN("");// 货运单 + tedReceiptMstr.setPurchaseOrder("");// 采购订单 + tedReceiptMstr.setSupplier("");// 供应商 + tedReceiptMstr.setReceiveNbr("");// 收货单号 + tedReceiptMstr.setReceiptDate(jsonTask.getCreateTime());// 收货日期 + tedReceiptMstr.setTime(jsonTask.getCreateTime());// 时间 + tedReceiptMstr.setGUID(UUID.randomUUID());// UUID(一个新的,不重复行) + tedReceiptMstr.setID(UUID.randomUUID());// UUID(一个新的,不重复行) + tedReceiptMstr.setCreateUser(jsonTask.getCreateUser());// 创建人 + tedReceiptMstr.setCreateTime(jsonTask.getCreateTime());// 创建时间 + tedReceiptMstr.setRemark(null);// 备注 + tedReceiptMstr.setTaskID(jsonTask.getTaskID());// 任务编号 + tedReceiptMstr.setCommandType("A");// 命令类型 + tedReceiptMstr.setDataID(UUID.randomUUID());// + tedReceiptMstr.setDomain(jsonTask.getDomain()); + tedReceiptMstr.setSite(jsonTask.getSite()); + receiptMstr.add(tedReceiptMstr); + + } + //TransactionEnum.ADJUST 盘点调整 + if (TransactionEnum.ADJUST.getCode().equals(createReqVOList.get(0).getInventoryAction())) { + jsonTask = this.sendJsonTask("TED_RCTUNP_MSTR", createReqVOList.size()); + TedRctunpMstr tedRctunpMstr = new TedRctunpMstr(); + tedRctunpMstr.setUser(jsonTask.getCreateUser()); + tedRctunpMstr.setReceiveBillNum(null); + tedRctunpMstr.setDate(jsonTask.getCreateTime()); + tedRctunpMstr.setTime(jsonTask.getCreateTime()); + tedRctunpMstr.setGUID(UUID.randomUUID()); + tedRctunpMstr.setUID(0); + tedRctunpMstr.setCreateUser(jsonTask.getCreateUser()); + tedRctunpMstr.setCreateTime(jsonTask.getCreateTime()); + tedRctunpMstr.setRemark(null); + tedRctunpMstr.setTaskID(jsonTask.getTaskID());// 任务编号 + tedRctunpMstr.setCommandType("A");// 命令类型 + tedRctunpMstr.setDataID(UUID.randomUUID());// + tedRctunpMstr.setDomain(jsonTask.getDomain()); + tedRctunpMstr.setSite(jsonTask.getSite()); + rctunpMstr.add(tedRctunpMstr); + + } + for (TransactionCreateReqVO createReqVO : createReqVOList) { + TransactionDO transactionDO = TransactionConvert.INSTANCE.convert(createReqVO); + //生成单据号 + QueryWrapper itemDOQueryWrapper = new QueryWrapper<>(); + itemDOQueryWrapper.eq("number", transactionDO.getItemNumber()); + ItemDO itemDO = itemMapper.selectOne(itemDOQueryWrapper); + transactionDO.setUom(itemDO.getUom()); + result += Mapper.insert(transactionDO); + ItemAccountsCreateReqVO itemAccountsCreateReqVO = new ItemAccountsCreateReqVO(); + BeanUtils.copyProperties(transactionDO, itemAccountsCreateReqVO); + Boolean b = itemAccountsMapper.updateItemAccountsQty(itemAccountsCreateReqVO, transactionDO.getTransactionType(), transactionDO.getInventoryAction()); + //查询备件的库存是否小于等与重采购点,如果满足条件则给oa推送消息 + String inventoryAction = createReqVO.getInventoryAction(); + if (b && TransactionEnum.REQUISITION_OUT.getCode().equals(inventoryAction)) {//领用出库需要判断重采购点与安全库存以便于给oa发通知 + SendOa(createReqVO.getItemNumber()); + } + //填充QAD所需的子表数据 + if (BooleanTypeEnum.Y.getCode().equals(createReqVO.getIsInAccount())) { + + //TransactionEnum.REQUISITION_OUT 领用出库· + if (TransactionEnum.REQUISITION_OUT.getCode().equals(createReqVO.getInventoryAction())) { + TedIssunpDet tedIssunpDet = new TedIssunpDet(); + tedIssunpDet.setDataID(UUID.randomUUID());//(一个新的,不重复行) + tedIssunpDet.setCommandType("A");//命令类型--赋值A + tedIssunpDet.setTaskID(jsonTask.getTaskID());//任务编号 + tedIssunpDet.setRemark("");//备注 + tedIssunpDet.setCreateTime(jsonTask.getCreateTime());//创建时间 + tedIssunpDet.setCreateUser(jsonTask.getCreateUser());// 创建人 + tedIssunpDet.setUID(0);// + tedIssunpDet.setGUID(UUID.randomUUID());//UUID(一个新的,不重复行) + tedIssunpDet.setProject("");// 项目 + tedIssunpDet.setCcAccount("");// 成本中心 + tedIssunpDet.setSubAccount("");// 分账户 + tedIssunpDet.setDomain(jsonTask.getDomain());// 域 + tedIssunpDet.setCreditAccount("");// 科目 + tedIssunpDet.setAddress("");// 地址 + tedIssunpDet.setCustomerNbr("");// 客户单 + tedIssunpDet.setLine(line++);// 行号 + tedIssunpDet.setReference(null);// 参考号 + tedIssunpDet.setLot("");// 批号 批次 + tedIssunpDet.setLocation(createReqVO.getLocationNumber());// 库位 erp库位 + tedIssunpDet.setConversion("");// 转换量 + tedIssunpDet.setQuantity(createReqVO.getQty());// 数量 + tedIssunpDet.setUm(itemDO.getUom());// 单位 + tedIssunpDet.setPartCode(itemDO.getItemNumber());// 物料号 + //通过事务的ID 来判断是哪个事务出现问题 + tedIssunpDet.setUnplanedBillNum(transactionDO.getAssociatedNumber());// 单号 + tedIssunpDet.setRemarks("");// 备注 + tedIssunpDet.setSite(jsonTask.getSite()); + issunpDet.add(tedIssunpDet); + + } + //TransactionEnum.PURCHASE_IN 采购入库 + if (TransactionEnum.PURCHASE_IN.getCode().equals(createReqVO.getInventoryAction())) { + TedReceiptDet tedReceiptDet = new TedReceiptDet(); + tedReceiptDet.setGUID(UUID.randomUUID());// UUID(一个新的,不重复行) + tedReceiptDet.setASN("");// ASN单号 + tedReceiptDet.setPurchaseOrder(transactionDO.getId().toString());// 采购订单 + tedReceiptDet.setLine(line++);// 行号 + tedReceiptDet.setPartCode(itemDO.getItemNumber());// 物料号 + tedReceiptDet.setReceiveNbr(transactionDO.getId().toString());// 收货单号 + tedReceiptDet.setReceiveQuantity(createReqVO.getQty());// 收货数量 + tedReceiptDet.setLocation(createReqVO.getLocationNumber());// 库位 + tedReceiptDet.setUm(itemDO.getUom());// 采购单位 + tedReceiptDet.setLogisticsUm("");// 物流单位 + tedReceiptDet.setLot("");// 批号 + tedReceiptDet.setReference("");// 参考号 + tedReceiptDet.setUID(0);// + tedReceiptDet.setSupplierLot("");// 供应商批次 + tedReceiptDet.setCreateUser(jsonTask.getCreateUser());// 创建人 + tedReceiptDet.setCreateTime(jsonTask.getCreateTime());// 创建时间 + tedReceiptDet.setRemark("");// 备注 + tedReceiptDet.setTaskID(jsonTask.getTaskID());// 任务编号 + tedReceiptDet.setCommandType("A");// 命令类型--赋值A + tedReceiptDet.setDataID(UUID.randomUUID());// + tedReceiptDet.setDomain(jsonTask.getDomain());// 域 + tedReceiptDet.setSite(jsonTask.getSite());// 地点 + receiptDet.add(tedReceiptDet); + } + //TransactionEnum.ADJUST 盘点调整 + if (TransactionEnum.ADJUST.getCode().equals(createReqVO.getInventoryAction())) { + TedRctunpDet tedRctunpDet = new TedRctunpDet(); + tedRctunpDet.setDataID(UUID.randomUUID());// + tedRctunpDet.setCommandType("A");// 命令类型 + tedRctunpDet.setTaskID(jsonTask.getTaskID());// 任务编号 + tedRctunpDet.setRemark("");// 备注 + tedRctunpDet.setCreateTime(jsonTask.getCreateTime());// 创建时间 + tedRctunpDet.setCreateUser(jsonTask.getCreateUser());// 创建人 + tedRctunpDet.setUID(0);// + tedRctunpDet.setGUID(UUID.randomUUID());// UUID(一个新的,不重复行) + tedRctunpDet.setProject("");// 项目 + tedRctunpDet.setCcAccount("");// 成本中心 + tedRctunpDet.setSubAccount("");// 分账户 + tedRctunpDet.setDomain(jsonTask.getDomain());// 域 + tedRctunpDet.setCreditAccount("");// 科目 + tedRctunpDet.setAddress("");// 地址 + tedRctunpDet.setCustomerNbr("");// 客户单 + tedRctunpDet.setLine(line++);// 行号 + tedRctunpDet.setReference("");// 参考号 + tedRctunpDet.setLot("");// 批号 + tedRctunpDet.setLocation(createReqVO.getLocationNumber());// 库位 + tedRctunpDet.setConversion("");// 转换量 + tedRctunpDet.setQuantity(createReqVO.getQty());// 数量 + tedRctunpDet.setUm(itemDO.getUom());// 单位 + tedRctunpDet.setPartCode(itemDO.getItemNumber());// 物料号 + tedRctunpDet.setReceiveBillNum(transactionDO.getAssociatedNumber());// 单号 + tedRctunpDet.setRemarks("");// 备注 + tedRctunpDet.setSite("");// 地点 + rctunpDet.add(tedRctunpDet); + } + } + } + //用事务的关联number来对应qad的主子表单号 + if (issunpDet.size() > 0) { + issunpMstr.get(0).setUnplanedBillNum(issunpDet.get(0).getUnplanedBillNum()); +// SoapUtil.addJob(issunpMstr, issunpDet, jsonTask); + } + if (rctunpDet.size() > 0) { + rctunpMstr.get(0).setReceiveBillNum(rctunpDet.get(0).getReceiveBillNum()); + SoapUtil.addJob(rctunpMstr, rctunpDet, jsonTask); + } + if (receiptDet.size() > 0) { + receiptMstr.get(0).setReceiveNbr(receiptDet.get(0).getReceiveNbr()); +// SoapUtil.addJob(receiptMstr, receiptDet, jsonTask); + } + return result; + } + + public JsonTask sendJsonTask(String tableName, int size) { + JsonTask jsonTask = new JsonTask(); + jsonTask.setTaskID(UUID.randomUUID()); + jsonTask.setTableName(tableName); + jsonTask.setDataCount(size); + jsonTask.setCreator("EAM"); + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + jsonTask.setCreateUser(user.getNickname()); + jsonTask.setDomain("FAWAYQCJ"); //--QAD域 + jsonTask.setSite("1120"); //-- QAD地点 + jsonTask.setCreateTime(LocalDateTime.now()); + return jsonTask; + } + + @Override + public Integer update(TransactionUpdateReqVO updateReqVO) { + // 校验存在 + validateExists(updateReqVO.getId()); + // 更新 + TransactionDO updateObj = TransactionConvert.INSTANCE.convert(updateReqVO); + return Mapper.updateById(updateObj); + } + + @Override + public Integer delete(Long id) { + // 校验存在 + validateExists(id); + // 删除 + return Mapper.deleteById(id); + } + + private void validateExists(Long id) { + if (Mapper.selectById(id) == null) { + throw exception(TRANSACTION_NOT_EXISTS); + } + } + + @Override + public TransactionDO get(Long id) { + return Mapper.selectById(id); + } + + @Override + public List getList(Collection ids) { + return Mapper.selectBatchIds(ids); + } + + @Override + public PageResult getPage(TransactionPageReqVO pageReqVO) { + return Mapper.selectPage(pageReqVO); + } + + @Override + public List getList(TransactionExportReqVO exportReqVO) { + return Mapper.selectList(exportReqVO); + } + + @Override + public PageResult getTransactionSenior(CustomConditions conditions) { + return Mapper.selectSenior(conditions); + } + + @Override + public void SendOa(String number) { + long l = itemAccountsMapper.selectCountByItemNumber(number); + QueryWrapper query = new QueryWrapper<>(); + query.eq("number", number); + query.eq("deleted", 0); + query.eq("available", "TRUE"); + List itemDOS = itemMapper.selectList(query); + if (!itemDOS.isEmpty()) { + ItemDO itemDO = itemDOS.get(0); + long reprocurement = itemDO.getReprocurement(); + long safetyStock = itemDO.getSafetyStock(); + if (reprocurement <= l) {//库存达到重采购点需要给oa发送消息 + long num = safetyStock - l;//给oa发送数量 + System.out.println("向oa发送消息:" + num); + } + } + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/uniapppushmessage/UniappPushMessageService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/uniapppushmessage/UniappPushMessageService.java new file mode 100644 index 0000000..03be4be --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/uniapppushmessage/UniappPushMessageService.java @@ -0,0 +1,84 @@ +package com.win.module.eam.service.uniapppushmessage; + +import java.util.*; +import javax.validation.*; +import com.win.module.eam.controller.uniapppushmessage.vo.*; +import com.win.module.eam.dal.dataobject.uniapppushmessage.UniappPushMessageDO; +import com.win.framework.common.pojo.PageResult; + +/** + * uniapp推送记录 Service 接口 + * + * @author 超级管理员 + */ +public interface UniappPushMessageService { + + /** + * 创建uniapp推送记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUniappPushMessage(@Valid UniappPushMessageCreateReqVO createReqVO); + + /** + * 更新uniapp推送记录 + * + * @param updateReqVO 更新信息 + */ + Integer updateUniappPushMessage(@Valid UniappPushMessageUpdateReqVO updateReqVO); + + /** + * 删除uniapp推送记录 + * + * @param id 编号 + */ + Integer deleteUniappPushMessage(Long id); + + /** + * 获得uniapp推送记录 + * + * @param id 编号 + * @return uniapp推送记录 + */ + UniappPushMessageDO getUniappPushMessage(Long id); + + /** + * 获得uniapp推送记录列表 + * + * @param ids 编号 + * @return uniapp推送记录列表 + */ + List getUniappPushMessageList(Collection ids); + + /** + * 获得uniapp推送记录分页 + * + * @param pageReqVO 分页查询 + * @return uniapp推送记录分页 + */ + PageResult getUniappPushMessagePage(UniappPushMessagePageReqVO pageReqVO); + + /** + * 获得uniapp推送记录列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return uniapp推送记录列表 + */ + List getUniappPushMessageList(UniappPushMessageExportReqVO exportReqVO); + + /** + * 导入uniapp推送记录主信息 + * + * @param datas 导入uniapp推送记录主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importUniappPushMessageList(List datas, Integer mode, boolean updatePart); + + /** + * uniapp给APP推送消息 + */ + void uniappSend(UniappPushMessageRespVO respVO); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/uniapppushmessage/UniappPushMessageServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/uniapppushmessage/UniappPushMessageServiceImpl.java new file mode 100644 index 0000000..50a4acf --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/uniapppushmessage/UniappPushMessageServiceImpl.java @@ -0,0 +1,218 @@ +package com.win.module.eam.service.uniapppushmessage; + +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.win.module.eam.controller.uniapppushmessage.vo.*; +import com.win.module.eam.util.SoapUtil; +import com.win.module.system.api.dept.DeptApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.*; +import com.win.module.eam.dal.dataobject.uniapppushmessage.UniappPushMessageDO; +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.convert.uniapppushmessage.UniappPushMessageConvert; +import com.win.module.eam.dal.mysql.uniapppushmessage.UniappPushMessageMapper; + +import static com.win.framework.web.core.util.WebFrameworkUtils.getLoginUserId; + + +/** + * uniapp推送记录 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class UniappPushMessageServiceImpl implements UniappPushMessageService { + @Value("${win.url.uniapp-url}") + private String uniappUrl; + + @Resource + private AdminUserApi userApi; + + @Resource + private DeptApi deptApi; + + @Resource + private UniappPushMessageMapper uniappPushMessageMapper; + + @Override + public Long createUniappPushMessage(UniappPushMessageCreateReqVO createReqVO) { + // 插入 + UniappPushMessageDO uniappPushMessage = UniappPushMessageConvert.INSTANCE.convert(createReqVO); + uniappPushMessageMapper.insert(uniappPushMessage); + // 返回 + return uniappPushMessage.getId(); + } + + @Override + public Integer updateUniappPushMessage(UniappPushMessageUpdateReqVO updateReqVO) { + // 校验存在 + validateUniappPushMessageExists(updateReqVO.getId()); + // 更新 + UniappPushMessageDO updateObj = UniappPushMessageConvert.INSTANCE.convert(updateReqVO); + return uniappPushMessageMapper.updateById(updateObj); + } + + @Override + public Integer deleteUniappPushMessage(Long id) { + // 校验存在 + validateUniappPushMessageExists(id); + // 删除 + return uniappPushMessageMapper.deleteById(id); + } + + private void validateUniappPushMessageExists(Long id) { + if (uniappPushMessageMapper.selectById(id) == null) { + //throw exception(UNIAPP_PUSH_MESSAGE_NOT_EXISTS); + } + } + + @Override + public UniappPushMessageDO getUniappPushMessage(Long id) { + return uniappPushMessageMapper.selectById(id); + } + + @Override + public List getUniappPushMessageList(Collection ids) { + return uniappPushMessageMapper.selectBatchIds(ids); + } + + @Override + public PageResult getUniappPushMessagePage(UniappPushMessagePageReqVO pageReqVO) { + return uniappPushMessageMapper.selectPage(pageReqVO); + } + + @Override + public List getUniappPushMessageList(UniappPushMessageExportReqVO exportReqVO) { + return uniappPushMessageMapper.selectList(exportReqVO); + } + + @Override + public List importUniappPushMessageList(List datas, Integer mode, boolean updatePart) { +// if (CollUtil.isEmpty(datas)) { +// throw exception(UNIAPP_PUSH_MESSAGE_IMPORT_LIST_IS_EMPTY); +// } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// UniappPushMessageDO obj = uniappPushMessageMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// uniappPushMessageMapper.insert(UniappPushMessageConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// UniappPushMessageDO uniappPushMessageDO = UniappPushMessageConvert.INSTANCE.convert(item); +// uniappPushMessageDO.setId(obj.getId()); +// uniappPushMessageMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } + + /** + * uniapp给APP推送消息 + */ + public void uniappSend(UniappPushMessageRespVO respVO) { + List li = new ArrayList<>(); + if(respVO.getApplyer()!=null){ + AdminUserRespDTO user = userApi.getUser(respVO.getApplyer()); + String cid = user.getCid(); + li.add(cid); + }else{ + List> list = deptApi.selecUserByType(respVO.getType(), respVO.getFactoryAreaNumber(), "0"); + for(Map map:list){ + if(map.get("cid")!=null&&!"".equals(map.get("cid").toString())){ + li.add(map.get("cid").toString()); + } + } + } + Map payload = new HashMap<>(); + payload.put("type",respVO.getType()); + payload.put("status",respVO.getStatus()); + payload.put("number",respVO.getNumber()); + + String title=""; + String content=""; + + + String request_id = UUID.randomUUID().toString();// + HttpClient client = HttpClient.newHttpClient(); + ObjectMapper objectMapper = new ObjectMapper(); // 用于JSON序列化 + + try { + Map map = new HashMap<>(); + map.put("cid",li); + String status = respVO.getStatus(); + switch(status) { + case "0"://维修工单待接单提醒 + // 代码块 + title="维修工单提醒"; + content="您有一个维修工单("+respVO.getNumber()+")待接单,请注意查收!"; + break; + case "1": + // 报修人确认 + title="报修确认提醒"; + content="您有一个维修工单("+respVO.getNumber()+")待确认,请注意查收!"; + break; + case "2"://维修工单待验证提醒 + // 代码块 + title="维修工单提醒"; + content="您有一个维修工单("+respVO.getNumber()+")待验证,请注意查收!"; + break; + default: + // 代码块 + } + map.put("title",title); + map.put("content",content); + map.put("request_id",request_id); + map.put("payload",payload); + // 将Java对象转换为JSON字符串 + String jsonBody = objectMapper.writeValueAsString(map); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(uniappUrl)) + .header("Content-Type", "application/json") + .POST(HttpRequest.BodyPublishers.ofString(jsonBody)) + .build(); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + System.out.println(response.statusCode()); + System.out.println(response.body()); + String body = response.body(); + Map ma = objectMapper.readValue(body, Map.class); + String data = ma.get("data").toString(); + //Map datas = objectMapper.readValue(data, Map.class); + //插入消息推送记录表 + UniappPushMessageDO messageDO = new UniappPushMessageDO(); + messageDO.setTitle(title); + messageDO.setContent(content); + messageDO.setRequestId(request_id); + messageDO.setPayload(payload.toString()); + messageDO.setResultMsg(ma.get("errMsg").toString()); + messageDO.setDeptId(userApi.getUser(getLoginUserId()).getDeptId()); + messageDO.setType(respVO.getType()); + messageDO.setFactoryAreaNumber(respVO.getFactoryAreaNumber()); + messageDO.setCid(String.join(",",li)); + messageDO.setTaskId(data.toString()); + messageDO.setNumber(respVO.getNumber()); + messageDO.setStatus(status); + messageDO.setCodes(response.statusCode()); + uniappPushMessageMapper.insert(messageDO); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/yearequipment/BasciYearEquipmentService.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/yearequipment/BasciYearEquipmentService.java new file mode 100644 index 0000000..e4b699b --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/yearequipment/BasciYearEquipmentService.java @@ -0,0 +1,80 @@ +package com.win.module.eam.service.yearequipment; + +import java.util.*; +import javax.validation.*; + +import com.win.module.eam.controller.yearequipment.vo.*; +import com.win.module.eam.dal.dataobject.yearequipment.BasciYearEquipmentDO; +import com.win.framework.common.pojo.PageResult; + +/** + * 首页年设备指标 Service 接口 + * + * @author 超级管理员 + */ +public interface BasciYearEquipmentService { + + /** + * 创建首页年设备指标 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createBasciYearEquipment(@Valid BasciYearEquipmentCreateReqVO createReqVO); + + /** + * 更新首页年设备指标 + * + * @param updateReqVO 更新信息 + */ + Integer updateBasciYearEquipment(@Valid BasciYearEquipmentUpdateReqVO updateReqVO); + + /** + * 删除首页年设备指标 + * + * @param id 编号 + */ + Integer deleteBasciYearEquipment(Long id); + + /** + * 获得首页年设备指标 + * + * @param id 编号 + * @return 首页年设备指标 + */ + BasciYearEquipmentDO getBasciYearEquipment(Long id); + + /** + * 获得首页年设备指标列表 + * + * @param ids 编号 + * @return 首页年设备指标列表 + */ + List getBasciYearEquipmentList(Collection ids); + + /** + * 获得首页年设备指标分页 + * + * @param pageReqVO 分页查询 + * @return 首页年设备指标分页 + */ + PageResult getBasciYearEquipmentPage(BasciYearEquipmentPageReqVO pageReqVO); + + /** + * 获得首页年设备指标列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 首页年设备指标列表 + */ + List getBasciYearEquipmentList(BasciYearEquipmentExportReqVO exportReqVO); + + /** + * 导入首页年设备指标主信息 + * + * @param datas 导入首页年设备指标主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importBasciYearEquipmentList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/yearequipment/BasciYearEquipmentServiceImpl.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/yearequipment/BasciYearEquipmentServiceImpl.java new file mode 100644 index 0000000..babcbe8 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/service/yearequipment/BasciYearEquipmentServiceImpl.java @@ -0,0 +1,157 @@ +package com.win.module.eam.service.yearequipment; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.module.eam.controller.yearequipment.vo.*; +import com.win.module.eam.dal.dataobject.monthequipment.BasicMonthEquipmentDO; +import com.win.module.eam.dal.mysql.monthequipment.BasicMonthEquipmentMapper; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; + +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import com.win.module.eam.dal.dataobject.yearequipment.BasciYearEquipmentDO; +import com.win.framework.common.pojo.PageResult; + +import com.win.module.eam.convert.yearequipment.BasciYearEquipmentConvert; +import com.win.module.eam.dal.mysql.yearequipment.BasciYearEquipmentMapper; + +import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.eam.enums.ErrorCodeConstants.*; + +/** + * 首页年设备指标 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class BasciYearEquipmentServiceImpl implements BasciYearEquipmentService { + @Resource + private AdminUserApi userApi; + @Resource + private BasciYearEquipmentMapper basciYearEquipmentMapper; + @Resource + private BasicMonthEquipmentMapper basicMonthEquipmentMapper; + + @Override + public Long createBasciYearEquipment(BasciYearEquipmentCreateReqVO createReqVO) { + // 插入 + validateCheckRepetition(null,createReqVO.getFactoryType(),createReqVO.getType(),createReqVO.getYearIndex()); + BasciYearEquipmentDO basciYearEquipment = BasciYearEquipmentConvert.INSTANCE.convert(createReqVO); + AdminUserRespDTO user = userApi.getUser(getLoginUserId()); + basciYearEquipment.setDeptId(user.getDeptId()); + basciYearEquipmentMapper.insert(basciYearEquipment); + // 返回 + return basciYearEquipment.getId(); + } + + @Override + public Integer updateBasciYearEquipment(BasciYearEquipmentUpdateReqVO updateReqVO) { + // 校验存在 + validateCheckRepetition(updateReqVO.getId(),updateReqVO.getFactoryType(),updateReqVO.getType(),updateReqVO.getYearIndex()); + // 更新 + BasciYearEquipmentDO updateObj = BasciYearEquipmentConvert.INSTANCE.convert(updateReqVO); + return basciYearEquipmentMapper.updateById(updateObj); + } + + @Override + @Transactional + public Integer deleteBasciYearEquipment(Long id) { + BasciYearEquipmentDO basciYearEquipmentDO = basciYearEquipmentMapper.selectById(id); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("year",basciYearEquipmentDO.getYearIndex()); + queryWrapper.eq("factory_type",basciYearEquipmentDO.getFactoryType()); + queryWrapper.eq("type",basciYearEquipmentDO.getType()); + List basicMonthEquipmentDOS = basicMonthEquipmentMapper.selectList(queryWrapper); + if(!basicMonthEquipmentDOS.isEmpty()){ + throw exception(YEAR_NOT_DELETE);//当前存在年份厂区类型一致的数据请勿重复添加 + } + // 删除 + return basciYearEquipmentMapper.deleteById(id); + } + + /** + * 校验重复(年份 厂区 类型一致替换原数据) + * @param id id 没有为null + * @param factoryType 厂区类型 + * @param type 类型 + * @param year 年份 + */ + private void validateCheckRepetition(Long id,String factoryType,String type,String year) { + if(id!=null){//更新 + if (basciYearEquipmentMapper.selectById(id) == null) { + throw exception(YEAR_INDEX_NOT_EXISTS); + } + QueryWrapper query = new QueryWrapper<>(); + query.eq("factory_type",factoryType); + query.eq("year_index",year); + query.eq("type",type); + query.ne("id",id); + BasciYearEquipmentDO en = basciYearEquipmentMapper.selectOne(query); + if(en!=null){//说明有数据 + throw exception(YEAR_INDEX_EXISTS);//当前存在年份厂区类型一致的数据请勿重复添加 + } + }else{//新增 + QueryWrapper query = new QueryWrapper<>(); + query.eq("factory_type",factoryType); + query.eq("year_index",year); + query.eq("type",type); + BasciYearEquipmentDO en = basciYearEquipmentMapper.selectOne(query); + if(en!=null){//说明有数据 + throw exception(YEAR_INDEX_EXISTS);//当前存在年份厂区类型一致的数据请勿重复添加 + } + } + + } + + @Override + public BasciYearEquipmentDO getBasciYearEquipment(Long id) { + return basciYearEquipmentMapper.selectById(id); + } + + @Override + public List getBasciYearEquipmentList(Collection ids) { + return basciYearEquipmentMapper.selectBatchIds(ids); + } + + @Override + public PageResult getBasciYearEquipmentPage(BasciYearEquipmentPageReqVO pageReqVO) { + return basciYearEquipmentMapper.selectPage(pageReqVO); + } + + @Override + public List getBasciYearEquipmentList(BasciYearEquipmentExportReqVO exportReqVO) { + return basciYearEquipmentMapper.selectList(exportReqVO); + } + + @Override + public List importBasciYearEquipmentList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + //throw exception(BASCI_YEAR_EQUIPMENT_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); +// datas.forEach(item -> { +// if(errorList == null){ +// // 判断如果不存在,在进行插入 +// BasciYearEquipmentDO obj = basciYearEquipmentMapper.selectByCode(item.getCode()); +// if (obj == null&& mode != 3) { +// basciYearEquipmentMapper.insert(BasciYearEquipmentConvert.INSTANCE.convert(item)); +// } +// else if (obj != null && mode != 2) {// 如果存在,判断是否允许更新 +// BasciYearEquipmentDO basciYearEquipmentDO = BasciYearEquipmentConvert.INSTANCE.convert(item); +// basciYearEquipmentDO.setId(obj.getId()); +// basciYearEquipmentMapper.updateById(obj); +// } +// } +// }); + + return errorList; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/GetRole.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/GetRole.java new file mode 100644 index 0000000..db8c590 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/GetRole.java @@ -0,0 +1,126 @@ +package com.win.module.eam.util; + +import com.win.module.system.api.permission.PermissionApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.api.user.dto.AdminUserRespDTO; + +import javax.annotation.Resource; + +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * 获取当前用户角色来判断 + */ +public class GetRole { + @Resource + private PermissionApi permissionApi; + @Resource + private AdminUserApi userApi; + + /** + * 判断当前人是否是设备普通维修人员 + * @return + */ + public Boolean getDeviceWorkerRole(){ + return permissionApi.hasAnyRoles(Long.parseLong("148"), "device_class_worker_role"); + } + + /** + * 判断当前人是否是设备工程师 + * @return + */ + public Boolean getDeviceEngineerRole(){ + return permissionApi.hasAnyRoles(getLoginUserId(), "device_class_Engineer_role"); + } + + /** + * 判断当前人是否是模具普通维修人员 + * @return + */ + public Boolean getMoldWorkerRole(){ + return permissionApi.hasAnyRoles(getLoginUserId(), "mold_class_worker_role"); + } + + /** + * 判断当前人是否是模具工程师 + * @return + */ + public Boolean getMoldEngineerRole(){ + return permissionApi.hasAnyRoles(getLoginUserId(), "mold_class_Engineer_role"); + } + + /** + * 判断当前人是否是工艺普通维修人员 + * @return + */ + public Boolean getTechWorkerRole(){ + return permissionApi.hasAnyRoles(getLoginUserId(), "tech_class_worker_role"); + } + + /** + * 判断当前人是否是工艺工程师 + * @return + */ + public Boolean getTechEngineerRole(){ + return permissionApi.hasAnyRoles(getLoginUserId(), "tech_class_Engineer_role"); + } + + /** + * 判断当前人是否是普通备件申请审批权限 + * @return + */ + public Boolean getNomalWorkerRole(){ + return permissionApi.hasAnyRoles(getLoginUserId(), "normal_approve"); + } + + /** + * 判断当前人是否是高级备件申请审批权限 + * @return + */ + public Boolean getHighEngineerRole(){ + return permissionApi.hasAnyRoles(getLoginUserId(), "all_approve"); + } + + /** + * 获取当前人所属班组 + * @return + */ + public String getClassType(){ + boolean a = permissionApi.hasAnyRoles(getLoginUserId(), new String[]{"device_class_worker_role", "device_class_Engineer_role"}); + if(a){ + return "DEVICE"; + } + boolean b = permissionApi.hasAnyRoles(getLoginUserId(), new String[]{"mold_class_worker_role", "mold_class_Engineer_role"}); + if(b){ + return "MOLD"; + } + boolean c = permissionApi.hasAnyRoles(getLoginUserId(), new String[]{"tech_class_worker_role", "tech_class_Engineer_role"}); + if(c){ + return "TECH"; + } + return ""; + } + + /** + * 判断当前人是否是工程师 + * @return + */ + public Boolean BooleanEngineer(){ + return permissionApi.hasAnyRoles(getLoginUserId(), "mold_class_Engineer_role", "device_class_Engineer_role","tech_class_Engineer_role"); + } + + /** + * 判断当前人是否是工程师 + * @return + */ + public Boolean BooleanWorker(){ + return permissionApi.hasAnyRoles(getLoginUserId(), "mold_class_worker_role", "tech_class_worker_role","device_class_worker_role"); + } + + public static void main(String[] args) { + GetRole role = new GetRole(); + Boolean deviceWorkerRole = role.getDeviceWorkerRole(); + System.out.println(deviceWorkerRole); + } + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/SessionIdUtil.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/SessionIdUtil.java new file mode 100644 index 0000000..6e006d2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/SessionIdUtil.java @@ -0,0 +1,20 @@ +package com.win.module.eam.util; + +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Component +public class SessionIdUtil { + @Resource + private SoapUtil soapUtil; + + private String sessionId; + + public String getSessionId() { + if (this.sessionId == null) { +// this.sessionId = soapUtil.getSessionId(); + } + return sessionId; + } +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/ShellConfig.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/ShellConfig.java new file mode 100644 index 0000000..a9a0dcc --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/ShellConfig.java @@ -0,0 +1,14 @@ +package com.win.module.eam.util; + + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "win.url") +public class ShellConfig { + //http://192.168.11.3:8008/ExchangeCenterService.asmx/ + private String baseUrl; +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/SoapUtil.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/SoapUtil.java new file mode 100644 index 0000000..ccca55a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/SoapUtil.java @@ -0,0 +1,240 @@ +package com.win.module.eam.util; + +import com.alibaba.fastjson.JSON; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.win.framework.common.util.json.JsonUtils; +import com.win.module.eam.dal.dataobject.json.JsonTask; +import com.win.module.eam.dal.dataobject.json.TedIssunpDet; +import com.win.module.eam.dal.dataobject.json.TedIssunpMstr; +import com.win.module.eam.dal.dataobject.uniapppushmessage.UniappPushMessageDO; +import com.win.module.eam.dal.mysql.uniapppushmessage.UniappPushMessageMapper; +import com.win.module.system.api.user.AdminUserApi; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URI; +import java.net.URL; +import java.net.URLConnection; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.*; + +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Component +public class SoapUtil { + @Value("win.url.base-rl") + private String baseUrl; + + @Value("win.url.uniapp-url") + private String uniappUrl; + + @Resource + private UniappPushMessageMapper uniappPushMessageMapper; + + @Resource + private AdminUserApi userApi; + + //获取sessionID接口 + public static String getSessionId(String systemName, String encryptedPassword, String clientIp) { + systemName = "EAM"; + encryptedPassword = "5C2DE907DB859810"; + clientIp = ""; + String result = "";//访问返回结果 + BufferedReader read = null;//读取访问结果 + try { + //创建url + URL realurl = new URL("http://192.168.11.3:8008/ExchangeCenterService.asmx/GetSessionId?systemName=" + systemName + "&encryptedPassword=" + encryptedPassword + "&clientIp=" + clientIp); + //打开连接 + URLConnection connection = realurl.openConnection(); + // 设置通用的请求属性 + connection.setRequestProperty("accept", "*/*"); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", + "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + //建立连接 + connection.connect(); + // 获取所有响应头字段 + Map> map = connection.getHeaderFields(); + // 遍历所有的响应头字段,获取到cookies等 + for (String key : map.keySet()) { + System.out.println(key + "--->" + map.get(key)); + } + // 定义 BufferedReader输入流来读取URL的响应 + read = new BufferedReader(new InputStreamReader( + connection.getInputStream(), "UTF-8")); + String line;//循环读取 + read.readLine(); + while ((line = read.readLine()) != null) { + result += line; + } + Document doc = DocumentHelper.parseText(result);//报文转成doc对象 + Element root = doc.getRootElement(); + Map mapaa = new HashMap(); + List> lists = new ArrayList>(); + //获取叶子节点的方法 + String json = (String) root.getData(); + lists = JsonUtils.parseObject(json, List.class); + mapaa = lists.get(0); + result = mapaa.get("Data"); + if (read != null) {//关闭流 + try { + read.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } catch (DocumentException e) { + throw new RuntimeException(e); + } + return result; + } + + + + //获取TableID接口 + public static String getTaskID(String sessionId, String tableList, String clientIp) { + //sessionId = "f176e043-3338-4329-bcac-917dd8a02f69"; + clientIp = ""; + tableList = "[\"TES_PART_MSTR\",\"TES_PART_DET\",\"TES_SUPPLIER\",\"TES_CUSTOMER\",\"TES_SUPPLIER_PART\",\"TES_CUSTOMER_PART\",\"TES_PURCHASE_PRICE\",\"TES_SALE_PRICE\",\"TED_MPS_DET\",\"TES_LOCATION\",\"TES_BOM\",\"TES_STAND_COST_PRICE\",\"TES_LINE_PART\",\"TES_DEPARTMENT\",\"TES_CODE\",\"TES_LINE\",\"TES_ROUTING\",\"TES_PARTPRINTBING\"]"; + String result = "";//访问返回结果 + BufferedReader read = null;//读取访问结果 + try { + //创建url + URL realurl = new URL("http://192.168.11.3:8008/ExchangeCenterService.asmx/GetNewTasksByTableList?sessionId=" + sessionId + "&clientIp=" + clientIp + "&tableList=" + tableList); + //打开连接 + URLConnection connection = realurl.openConnection(); + // 设置通用的请求属性 + connection.setRequestProperty("accept", "*/*"); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", + "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + //建立连接 + connection.connect(); + // 获取所有响应头字段 + Map> map = connection.getHeaderFields(); + // 遍历所有的响应头字段,获取到cookies等 + for (String key : map.keySet()) { + System.out.println(key + "--->" + map.get(key)); + } + // 定义 BufferedReader输入流来读取URL的响应 + read = new BufferedReader(new InputStreamReader( + connection.getInputStream(), "UTF-8")); + String line;//循环读取 + read.readLine(); + while ((line = read.readLine()) != null) { + result += line; + } + Document doc = DocumentHelper.parseText(result);//报文转成doc对象 + Element root = doc.getRootElement(); + Map mapaa = new HashMap(); + List lists = new ArrayList(); + //获取叶子节点的方法 + String json = (String) root.getData(); + lists = JsonUtils.parseObject(json, List.class); + String json2 = (String) lists.get(0).get("Data"); + lists = JsonUtils.parseObject(json2, List.class); + result = (String) lists.get(0).get("TaskID"); + if (read != null) {//关闭流 + try { + read.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } catch (DocumentException e) { + throw new RuntimeException(e); + } + return result; + } + + public static void main(String[] args) { + List master=new ArrayList<>(); + TedIssunpMstr tedIssunpMstr = new TedIssunpMstr(); + tedIssunpMstr.setCommandType("asa"); + master.add(tedIssunpMstr); + List slave=new ArrayList<>(); + TedIssunpDet tedIssunpDet = new TedIssunpDet(); + slave.add(tedIssunpDet); +// addJob(master,slave); + } + + public static String addJob(List master, List slave, JsonTask task) { + String result = "";//访问返回结果 + BufferedReader read = null;//读取访问结果 + //String sessionId, List jsonTask, List jsonMaster, List jsonSlave, String zipped + String sessionId = getSessionId("", "", ""); + List taskList=new ArrayList<>(); + taskList.add(task); + String jsonMaster = JSON.toJSONString(master); + String jsonSlave = JSON.toJSONString(slave); + String taskListNew = JSON.toJSONString(taskList); + String zipped = "false"; + try { + //创建url + URL realurl = new URL("http://192.168.11.3:8008/ExchangeCenterService.asmx/GetNewTasksByTableList" + + "?sessionId=" + sessionId + "&jsonTask=" + taskListNew + "&jsonMaster=" + jsonMaster+ "&jsonSlave=" + jsonSlave+ "&zipped=" + zipped); + //打开连接 + URLConnection connection = realurl.openConnection(); + // 设置通用的请求属性 + connection.setRequestProperty("accept", "*/*"); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", + "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + //建立连接 + connection.connect(); + // 获取所有响应头字段 + Map> map = connection.getHeaderFields(); + // 遍历所有的响应头字段,获取到cookies等 + for (String key : map.keySet()) { + System.out.println(key + "--->" + map.get(key)); + } + // 定义 BufferedReader输入流来读取URL的响应 + read = new BufferedReader(new InputStreamReader( + connection.getInputStream(), "UTF-8")); + String line;//循环读取 + read.readLine(); + while ((line = read.readLine()) != null) { + result += line; + } + Document doc = DocumentHelper.parseText(result);//报文转成doc对象 + Element root = doc.getRootElement(); + Map mapaa = new HashMap(); + List lists = new ArrayList(); + //获取叶子节点的方法 + String json = (String) root.getData(); + lists = JsonUtils.parseObject(json, List.class); + String json2 = (String) lists.get(0).get("Data"); + lists = JsonUtils.parseObject(json2, List.class); + result = (String) lists.get(0).get("TaskID"); + if (read != null) {//关闭流 + try { + read.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } catch (DocumentException e) { + throw new RuntimeException(e); + } + return result; + } + + + +} diff --git a/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/package-info.java b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/package-info.java new file mode 100644 index 0000000..bbca20f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/java/com/win/module/eam/util/package-info.java @@ -0,0 +1,4 @@ +/** + * System API 包,定义暴露给其它模块的 API + */ +package com.win.module.eam.util; diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/i18n/eam.properties b/win-module-eam/win-module-eam-biz/src/main/resources/i18n/eam.properties new file mode 100644 index 0000000..6882c29 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/i18n/eam.properties @@ -0,0 +1 @@ +#\u6B64\u6587\u4EF6\u4E0D\u9700\u8981\u586B\u5199 \ No newline at end of file diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/i18n/eam_en_US.properties b/win-module-eam/win-module-eam-biz/src/main/resources/i18n/eam_en_US.properties new file mode 100644 index 0000000..e69de29 diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/i18n/eam_zh_CN.properties b/win-module-eam/win-module-eam-biz/src/main/resources/i18n/eam_zh_CN.properties new file mode 100644 index 0000000..e69de29 diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/adjustRecord/AdjustRecordDetailMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/adjustRecord/AdjustRecordDetailMapper.xml new file mode 100644 index 0000000..ab4ae4d --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/adjustRecord/AdjustRecordDetailMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/adjustRecord/AdjustRecordMainMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/adjustRecord/AdjustRecordMainMapper.xml new file mode 100644 index 0000000..144f7c5 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/adjustRecord/AdjustRecordMainMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/attachmentfile/AttachmentFileMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/attachmentfile/AttachmentFileMapper.xml new file mode 100644 index 0000000..b011201 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/attachmentfile/AttachmentFileMapper.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + update + basic_attachment_file + set + deleted = 1 + + + id = #{item} + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/classtype/ClassTypeMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/classtype/ClassTypeMapper.xml new file mode 100644 index 0000000..decfb1e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/classtype/ClassTypeMapper.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/counRecord/CountRecordDetailMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/counRecord/CountRecordDetailMapper.xml new file mode 100644 index 0000000..14f6c08 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/counRecord/CountRecordDetailMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/counRecord/CountRecordMainMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/counRecord/CountRecordMainMapper.xml new file mode 100644 index 0000000..cb0e841 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/counRecord/CountRecordMainMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/countJobDetail/CountJobDetailMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/countJobDetail/CountJobDetailMapper.xml new file mode 100644 index 0000000..44f5779 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/countJobDetail/CountJobDetailMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/countJobMain/CountJobMainMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/countJobMain/CountJobMainMapper.xml new file mode 100644 index 0000000..505366e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/countJobMain/CountJobMainMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/countadjustPlan/CountadjustPlanMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/countadjustPlan/CountadjustPlanMapper.xml new file mode 100644 index 0000000..f760d8c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/countadjustPlan/CountadjustPlanMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceaccounts/DeviceAccountsMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceaccounts/DeviceAccountsMapper.xml new file mode 100644 index 0000000..b7e046f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceaccounts/DeviceAccountsMapper.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceinspectionjob/DeviceInspectionJobDetailItemMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceinspectionjob/DeviceInspectionJobDetailItemMapper.xml new file mode 100644 index 0000000..bb8796e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceinspectionjob/DeviceInspectionJobDetailItemMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceinspectionjob/DeviceInspectionJobDetailMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceinspectionjob/DeviceInspectionJobDetailMapper.xml new file mode 100644 index 0000000..7795072 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceinspectionjob/DeviceInspectionJobDetailMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceinspectionjob/DeviceInspectionJobMainMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceinspectionjob/DeviceInspectionJobMainMapper.xml new file mode 100644 index 0000000..72264c7 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceinspectionjob/DeviceInspectionJobMainMapper.xml @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceinternalaudit/DeviceInternalAuditMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceinternalaudit/DeviceInternalAuditMapper.xml new file mode 100644 index 0000000..e0d3433 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceinternalaudit/DeviceInternalAuditMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceitem/DeviceItemMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceitem/DeviceItemMapper.xml new file mode 100644 index 0000000..5441c78 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/deviceitem/DeviceItemMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintainjob/DeviceMaintainJobDetailMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintainjob/DeviceMaintainJobDetailMapper.xml new file mode 100644 index 0000000..74316f2 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintainjob/DeviceMaintainJobDetailMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintainjob/DeviceMaintainJobMainMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintainjob/DeviceMaintainJobMainMapper.xml new file mode 100644 index 0000000..b6b9aac --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintainjob/DeviceMaintainJobMainMapper.xml @@ -0,0 +1,389 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintainjob/MaintainJobDetailItemMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintainjob/MaintainJobDetailItemMapper.xml new file mode 100644 index 0000000..d3347c8 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintainjob/MaintainJobDetailItemMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintainplan/DeviceMaintainPlanMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintainplan/DeviceMaintainPlanMapper.xml new file mode 100644 index 0000000..8640a88 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintainplan/DeviceMaintainPlanMapper.xml @@ -0,0 +1,113 @@ + + + + + + + + + + insert into plan_maintain + ( + + `number`, + + + `type`, + + + name, + + + device_number, + + + cycle + + ) + VALUES + ( + + #{number}, + + + #{type}, + + + #{cycleName}, + + + #{deviceNumber}, + + + #{periodCycle} + + ) + + + + + + + + + delete from plan_maintain where device_number = #{deviceNumber} and deleted = 0 and type = #{type} and cycle = #{executePeriod} + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintenancejob/DeviceMaintenanceJobDetailItemMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintenancejob/DeviceMaintenanceJobDetailItemMapper.xml new file mode 100644 index 0000000..128de65 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintenancejob/DeviceMaintenanceJobDetailItemMapper.xml @@ -0,0 +1,24 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintenancejob/DeviceMaintenanceJobDetailMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintenancejob/DeviceMaintenanceJobDetailMapper.xml new file mode 100644 index 0000000..3b87cee --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintenancejob/DeviceMaintenanceJobDetailMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintenancejob/DeviceMaintenanceJobMainMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintenancejob/DeviceMaintenanceJobMainMapper.xml new file mode 100644 index 0000000..cad143f --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemaintenancejob/DeviceMaintenanceJobMainMapper.xml @@ -0,0 +1,770 @@ + + + + + + + + update job_maintenance_main set status = #{status} + + + request_number = #{requestNumber} + + + id = #{id} + + + + + + + update job_maintenance_main set deleted = 1 + + request_number = #{requestNumber} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemolditems/DeviceMoldItemsMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemolditems/DeviceMoldItemsMapper.xml new file mode 100644 index 0000000..d095725 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemolditems/DeviceMoldItemsMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemolditemshistory/DeviceMoldItemsHistoryMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemolditemshistory/DeviceMoldItemsHistoryMapper.xml new file mode 100644 index 0000000..8403695 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicemolditemshistory/DeviceMoldItemsHistoryMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicerepairrequest/DeviceRepairRequestMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicerepairrequest/DeviceRepairRequestMapper.xml new file mode 100644 index 0000000..0cd53cf --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicerepairrequest/DeviceRepairRequestMapper.xml @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailMapper.xml new file mode 100644 index 0000000..68bf4b6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicespotinspectionrecord/DeviceSpotInspectionRecordDetailMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicespotinspectionrecord/DeviceSpotInspectionRecordMainMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicespotinspectionrecord/DeviceSpotInspectionRecordMainMapper.xml new file mode 100644 index 0000000..807f2e8 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/devicespotinspectionrecord/DeviceSpotInspectionRecordMainMapper.xml @@ -0,0 +1,90 @@ + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/factoryarea/FactoryAreaMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/factoryarea/FactoryAreaMapper.xml new file mode 100644 index 0000000..44da208 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/factoryarea/FactoryAreaMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/item/ItemMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/item/ItemMapper.xml new file mode 100644 index 0000000..3381c64 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/item/ItemMapper.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemaccounts/ItemAccountsMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemaccounts/ItemAccountsMapper.xml new file mode 100644 index 0000000..cc349a3 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemaccounts/ItemAccountsMapper.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemapplyrequest/ItemApplyRequestDetailMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemapplyrequest/ItemApplyRequestDetailMapper.xml new file mode 100644 index 0000000..ad8fe8c --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemapplyrequest/ItemApplyRequestDetailMapper.xml @@ -0,0 +1,48 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemapplyrequest/ItemApplyRequestMainMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemapplyrequest/ItemApplyRequestMainMapper.xml new file mode 100644 index 0000000..2f12f43 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemapplyrequest/ItemApplyRequestMainMapper.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/iteminlocation/ItemInLocationMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/iteminlocation/ItemInLocationMapper.xml new file mode 100644 index 0000000..5613204 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/iteminlocation/ItemInLocationMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemlocationreplace/ItemLocationReplaceMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemlocationreplace/ItemLocationReplaceMapper.xml new file mode 100644 index 0000000..b79ef1e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemlocationreplace/ItemLocationReplaceMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemmaintenancerecord/ItemMaintenanceRecordMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemmaintenancerecord/ItemMaintenanceRecordMapper.xml new file mode 100644 index 0000000..c4f773a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemmaintenancerecord/ItemMaintenanceRecordMapper.xml @@ -0,0 +1,42 @@ + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemorder/ItemOrderDetailMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemorder/ItemOrderDetailMapper.xml new file mode 100644 index 0000000..e7129c6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemorder/ItemOrderDetailMapper.xml @@ -0,0 +1,36 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemorder/ItemOrderMainMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemorder/ItemOrderMainMapper.xml new file mode 100644 index 0000000..81a737a --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemorder/ItemOrderMainMapper.xml @@ -0,0 +1,37 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemoutlocation/ItemOutLocationMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemoutlocation/ItemOutLocationMapper.xml new file mode 100644 index 0000000..64f8be4 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/itemoutlocation/ItemOutLocationMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/location/LocationMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/location/LocationMapper.xml new file mode 100644 index 0000000..14b3648 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/location/LocationMapper.xml @@ -0,0 +1,69 @@ + + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/locationarea/LocationAreaMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/locationarea/LocationAreaMapper.xml new file mode 100644 index 0000000..44a8c37 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/locationarea/LocationAreaMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/maintenanceturnto/MaintenanceTurntoMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/maintenanceturnto/MaintenanceTurntoMapper.xml new file mode 100644 index 0000000..ff7d758 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/maintenanceturnto/MaintenanceTurntoMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/moldaccounts/MoldAccountsMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/moldaccounts/MoldAccountsMapper.xml new file mode 100644 index 0000000..b4f2a61 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/moldaccounts/MoldAccountsMapper.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/moldmilestone/MoldMilestoneMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/moldmilestone/MoldMilestoneMapper.xml new file mode 100644 index 0000000..fe16b52 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/moldmilestone/MoldMilestoneMapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/monthequipment/BasicMonthEquipmentMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/monthequipment/BasicMonthEquipmentMapper.xml new file mode 100644 index 0000000..b4a9160 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/monthequipment/BasicMonthEquipmentMapper.xml @@ -0,0 +1,47 @@ + + + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/producePlan/ProducePlanMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/producePlan/ProducePlanMapper.xml new file mode 100644 index 0000000..c2a0876 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/producePlan/ProducePlanMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/supplier/SupplierMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/supplier/SupplierMapper.xml new file mode 100644 index 0000000..9f56348 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/supplier/SupplierMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/transaction/TransactionMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/transaction/TransactionMapper.xml new file mode 100644 index 0000000..a5232a6 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/transaction/TransactionMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/uniapppushmessage/UniappPushMessageMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/uniapppushmessage/UniappPushMessageMapper.xml new file mode 100644 index 0000000..cc8950e --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/uniapppushmessage/UniappPushMessageMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-eam/win-module-eam-biz/src/main/resources/mapper/yearequipment/BasciYearEquipmentMapper.xml b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/yearequipment/BasciYearEquipmentMapper.xml new file mode 100644 index 0000000..9ed9548 --- /dev/null +++ b/win-module-eam/win-module-eam-biz/src/main/resources/mapper/yearequipment/BasciYearEquipmentMapper.xml @@ -0,0 +1,11 @@ + + + + + + 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/config/ApiConfigApi.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/config/ApiConfigApi.java new file mode 100644 index 0000000..7d8f45e --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/config/ApiConfigApi.java @@ -0,0 +1,17 @@ +package com.win.module.infra.api.config; + +import com.win.module.infra.api.config.dto.ConfigDTO; + +/** + * @InterfaceName ApiConfigApi + * @Description TODO + * @Author longlongxiaogege + * @Date 2024/2/18 11:29 + * @Version 1.0 + */ +public interface ApiConfigApi { + + ConfigDTO getConfigByKey(String key); + + +} diff --git a/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/config/dto/ConfigDTO.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/config/dto/ConfigDTO.java new file mode 100644 index 0000000..81d53a5 --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/config/dto/ConfigDTO.java @@ -0,0 +1,79 @@ +package com.win.module.infra.api.config.dto; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 字典数据 Response DTO + * + * @author 闻荫源码 + */ +@Data +public class ConfigDTO { + + /** + * 创建时间 + */ + private LocalDateTime createTime; + /** + * 最后更新时间 + */ + private LocalDateTime updateTime; + /** + * 创建者,目前使用 SysUser 的 id 编号 + * + * 使用 String 类型的原因是,未来可能会存在非数值的情况,留好拓展性。 + */ + private String creator; + /** + * 更新者,目前使用 SysUser 的 id 编号 + * + * 使用 String 类型的原因是,未来可能会存在非数值的情况,留好拓展性。 + */ + private String updater; + /** + * 是否删除 + */ + private Boolean deleted; + + /** + * 参数主键 + */ + 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-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..e94d850 --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/file/FileApi.java @@ -0,0 +1,51 @@ +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/file/dto/FileDTO.java b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/file/dto/FileDTO.java new file mode 100644 index 0000000..9ace70f --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/file/dto/FileDTO.java @@ -0,0 +1,46 @@ +package com.win.module.infra.api.file.dto; + +import java.time.LocalDateTime; + +/** + * @ClassName FileDTO + * @Description TODO + * @Author longlongxiaogege + * @Date 2024/3/27 18:56 + * @Version 1.0 + */ +public class FileDTO { + + private Long id; + + + private Long configId; + + + private String path; + + + private String name; + + + private String url; + + + private String type; + + private Integer size; + + private LocalDateTime createTime; + + + private String tableName; + + private Long tableId; + + private String creator; + + + private String nickname; + + private String avatar; +} 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..17b8538 --- /dev/null +++ b/win-module-infra/win-module-infra-api/src/main/java/com/win/module/infra/api/trends/TrendsApi.java @@ -0,0 +1,16 @@ +package com.win.module.infra.api.trends; + +import com.win.module.infra.enums.TrendsTypeEnum; + +public interface TrendsApi { + + /** + * 创建动态记录 + * @param tableId 表数据id + * @param tableName 表名 + * @param content 内容 + * @param trendsTypeEnum com.win.module.infra.enums.TrendsTypeEnum枚举 + */ + void createTrends(Long tableId, String tableName, String content, TrendsTypeEnum trendsTypeEnum); + +} 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/config/ConfigApiImpl.java b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/config/ConfigApiImpl.java new file mode 100644 index 0000000..8bdb077 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/config/ConfigApiImpl.java @@ -0,0 +1,31 @@ +package com.win.module.infra.api.config; + +import com.win.module.infra.api.config.dto.ConfigDTO; +import com.win.module.infra.convert.config.ConfigConvert; +import com.win.module.infra.dal.dataobject.config.ConfigDO; +import com.win.module.infra.service.config.ConfigService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 文件 API 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +public class ConfigApiImpl implements ApiConfigApi { + + + @Resource + private ConfigService configService; + + + @Override + public ConfigDTO getConfigByKey(String key) { + ConfigDO configDO = configService.getConfigByKey(key); + return ConfigConvert.INSTANCE.convert01(configDO); + } +} 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..de4f6ac --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/file/FileApiImpl.java @@ -0,0 +1,27 @@ +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..3d55a80 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/api/trends/TrendsApiImpl.java @@ -0,0 +1,39 @@ +package com.win.module.infra.api.trends; + +import com.win.module.infra.api.trends.dto.TrendsCreateReqDTO; +import com.win.module.infra.enums.TrendsTypeEnum; +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(Long tableId, String tableName, String content, TrendsTypeEnum trendsTypeEnum) { + TrendsCreateReqDTO createDTO = new TrendsCreateReqDTO(); + createDTO.setTableId(tableId); + createDTO.setTableName(tableName); + createDTO.setType(trendsTypeEnum.getType()); + createDTO.setContent(content); + 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..45e4373 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/file/FileController.java @@ -0,0 +1,127 @@ +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); + } + + + @GetMapping("/selectList") + @Operation(summary = "获得文件列表") +// @PreAuthorize("@ss.hasPermission('infra:file:query')") + public CommonResult> selectList() throws Exception{ + List pageList = fileService.selectList(); + return success(FileConvert.INSTANCE.convertList(pageList)); + } + + + + +} 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..1bda3b5 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/controller/trends/TrendsController.java @@ -0,0 +1,94 @@ +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) { + if(trendsRespVO.getCreator() != null) { + 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..12270c5 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/config/ConfigConvert.java @@ -0,0 +1,36 @@ +package com.win.module.infra.convert.config; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.infra.api.config.dto.ConfigDTO; +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); + + ConfigDTO convert01(ConfigDO bean); + +} 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..5c4853a --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/convert/file/FileConvert.java @@ -0,0 +1,23 @@ +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..6473a1a --- /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,43 @@ +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)); + } + + default List selectList() { + return selectList(new LambdaQueryWrapperX()); + + } + + + +} 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..9276391 --- /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,57 @@ +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("/admin-api/profile/**").anonymous(); + //看板 + registry.antMatchers("/admin-api/wms/board/**").anonymous(); + registry.antMatchers("/admin-api/eam/board/**").permitAll(); + // 文件读取 + 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..7af80a1 --- /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}ServiceTest")) + // 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..98ef8da --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileService.java @@ -0,0 +1,66 @@ +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; + + /** + * 根据路径查文件 + * + * @param path + */ + List selectList() 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..8d677cf --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/java/com/win/module/infra/service/file/FileServiceImpl.java @@ -0,0 +1,131 @@ +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); + } + + @Override + public List selectList() throws Exception { + return fileMapper.selectList(); + } + +} 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..e8600ce --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/controller/controller.vm @@ -0,0 +1,145 @@ +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) { + int result = ${classNameVar}Service.update${simpleClassName}(updateReqVO); + return success(result > 0); + } + + @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) { + int result = ${classNameVar}Service.delete${simpleClassName}(id); + return success(result > 0); + } + + @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..4035b0c --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/enums/errorcode.vm @@ -0,0 +1,3 @@ +// TODO 待办:请将下面的错误码复制到 win-module-${table.moduleName}-api 模块的 ErrorCodeConstants 类中。注意,请给“TODO 补充编号”设置一个错误码编号!!! +// ========== ${table.classComment} TODO 补充编号 ========== +ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS = new ErrorCode(TODO 补充编号, "${table.classComment}不存在"); 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..17ee258 --- /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 更新信息 + */ + Integer update${simpleClassName}(@Valid ${sceneEnum.prefixClass}${table.className}UpdateReqVO updateReqVO); + + /** + * 删除${table.classComment} + * + * @param id 编号 + */ + Integer 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..9695d0b --- /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 Integer update${simpleClassName}(${sceneEnum.prefixClass}${table.className}UpdateReqVO updateReqVO) { + // 校验存在 + validate${simpleClassName}Exists(updateReqVO.getId()); + // 更新 + ${table.className}DO updateObj = ${table.className}Convert.INSTANCE.convert(updateReqVO); + return ${classNameVar}Mapper.updateById(updateObj); + } + + @Override + public Integer delete${simpleClassName}(${primaryColumn.javaType} id) { + // 校验存在 + validate${simpleClassName}Exists(id); + // 删除 + return ${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/java/test/serviceTest.vm.bark b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/test/serviceTest.vm.bark new file mode 100644 index 0000000..6978f24 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/java/test/serviceTest.vm.bark @@ -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}Service} 的单元测试类 + * + * @author ${table.author} + */ +@Import(${table.className}Service.class) +public class ${table.className}ServiceTest extends BaseDbUnitTest { + + @Resource + private ${table.className}Service ${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..0caeaec --- /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..f151bc9 --- /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: 'Select' + }, + #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..91d2f54 --- /dev/null +++ b/win-module-infra/win-module-infra-biz/src/main/resources/codegen/vue3/views/index.vue.vm @@ -0,0 +1,244 @@ + + + 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..25d6dc5 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/DeptApi.java @@ -0,0 +1,77 @@ +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); + } + + /** + * 获取走工单的设备厂区 + * @return + */ + List> selectAllFactoryArea(); + + + /** + * 获取走工单的设备厂区级部门 + * @return + */ + List> selectAllFactoryAreaDept(); + + /** + * 根据厂区和类型获取厂区下普通维修工人或者所有人 + * @param type + * @param factoryAreaNumber + * @param flag 0 所有人 1维修人员2工程师 + * @return + */ + List> selecUserByType(String type, String factoryAreaNumber,String flag); + + +} 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..2f92ea1 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dept/PostApi.java @@ -0,0 +1,24 @@ +package com.win.module.system.api.dept; + +import java.util.Collection; + +/** + * 岗位 API 接口 + * + * @author 闻荫源码 + */ +public interface PostApi { + + /** + * 校验岗位们是否有效。如下情况,视为无效: + * 1. 岗位编号不存在 + * 2. 岗位被禁用 + * + * @param ids 岗位编号数组 + */ + void validPostList(Collection ids); + + Boolean booleanWorker(); + + Boolean booleanEngineer(); +} 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..0ab2263 --- /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,57 @@ +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; + + /** + * 组类 + */ + private String classType; + + /** + * 部门类别 + */ + private String busiType; + + /** + * 部门分组 + */ + private String group; + + /** + * 部门层级 + */ + private String level; + +} 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..89f5e38 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/dict/DictDataApi.java @@ -0,0 +1,70 @@ +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); + + /** + * + * 根据标签值查询字典键值 + * @author chenfang + * @param plabel 字典标签 + * @return + */ + DictDataRespDTO selectDictLabel( String plabel); + + DictDataRespDTO selectDictValue( String value); +} 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..25d1e8c --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/NotifyMessageSendApi.java @@ -0,0 +1,48 @@ +package com.win.module.system.api.notify; + +import com.win.module.system.api.notify.dto.NotifySendSingleToRoleReqDTO; +import com.win.module.system.api.notify.dto.NotifySendSingleToRolesReqDTO; +import com.win.module.system.api.notify.dto.NotifySendSingleToUserReqDTO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 站内信发送 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); + + /** + * 按角色发送站内信 + * + * @param reqDTO 发送请求 + * @return 发送消息 ID + */ + List sendMessageToRole(@Valid NotifySendSingleToRoleReqDTO reqDTO); + + /** + * 按多个角色发送站内信 + * + * @param reqDTO 发送请求 + * @return 发送消息 ID + */ + List sendMessageToRole(@Valid NotifySendSingleToRolesReqDTO reqDTO); +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifySendSingleToRoleReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifySendSingleToRoleReqDTO.java new file mode 100644 index 0000000..6991a76 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifySendSingleToRoleReqDTO.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 NotifySendSingleToRoleReqDTO { + + /** + * 角色编号 + */ + @NotNull(message = "角色编号不能为空") + private Long roleId; + + /** + * 站内信模板编号 + */ + @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/NotifySendSingleToRolesReqDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifySendSingleToRolesReqDTO.java new file mode 100644 index 0000000..9a7b033 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/notify/dto/NotifySendSingleToRolesReqDTO.java @@ -0,0 +1,34 @@ +package com.win.module.system.api.notify.dto; + +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.Map; + +/** + * 站内信发送给 Admin 或者 Member 用户 + * + * @author xrcoder + */ +@Data +public class NotifySendSingleToRolesReqDTO { + + /** + * 角色编号 + */ + @NotNull(message = "角色编号不能为空") + private List roleIdList; + + /** + * 站内信模板编号 + */ + @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/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..34e57c4 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/PermissionApi.java @@ -0,0 +1,123 @@ +package com.win.module.system.api.permission; + +import com.win.module.system.api.permission.dto.DeptDataPermissionRespDTO; +import com.win.module.system.api.permission.dto.PermissionIdentificationRespVO; + +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); + + /** + * 根据用户id获取按钮权限标识符用于APP根据权限访问所有任务数据 + * @return + */ + Object getPermissionIdentifications(); + + /** + * 判断当前人是否是设备普通维修人员 + * @return + */ + Boolean getDeviceWorkerRole(); + + /** + * 判断当前人是否是设备工程师 + * @return + */ + Boolean getDeviceEngineerRole(); + + /** + * 判断当前人是否是模具普通维修人员 + * @return + */ + Boolean getMoldWorkerRole(); + + /** + * 判断当前人是否是模具工程师 + * @return + */ + Boolean getMoldEngineerRole(); + + /** + * 判断当前人是否是工艺普通维修人员 + * @return + */ + Boolean getTechWorkerRole(); + + /** + * 判断当前人是否是工艺工程师 + * @return + */ + Boolean getTechEngineerRole(); + + /** + * 判断当前人是否是普通备件申请审批权限 + * @return + */ + Boolean getNomalWorkerRole(); + + /** + * 判断当前人是否是高级备件申请审批权限 + * @return + */ + Boolean getHighEngineerRole(); + + /** + * 获取当前人所属班组 + * @return + */ + String getClassType(); + + /** + * 判断当前人是否是工程师 + * @return + */ + Boolean BooleanEngineer(); + + /** + * 判断当前人是否是维修人员 + * @return + */ + Boolean BooleanWorker(); + + +} 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/permission/dto/PermissionIdentificationRespVO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/dto/PermissionIdentificationRespVO.java new file mode 100644 index 0000000..d15dd36 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/permission/dto/PermissionIdentificationRespVO.java @@ -0,0 +1,72 @@ +package com.win.module.system.api.permission.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Set; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class PermissionIdentificationRespVO { + + private UserVO user; + + private Set roles; + + private Set permissions; + + private List menus; + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class UserVO { + + private Long id; + + private String nickname; + + private String avatar; + + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class MenuVO { + + private Long id; + + private Long parentId; + + private String name; + + private String path; + + private String component; + + private String componentName; + + private String icon; + + private Boolean visible; + + private Boolean keepAlive; + + private Boolean alwaysShow; + + /** + * 子路由 + */ + private List children; + + } + +} 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..0c5fef5 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/serialnumber/SerialNumberApi.java @@ -0,0 +1,15 @@ +package com.win.module.system.api.serialnumber; + +public interface SerialNumberApi { + + /** + * 根据编码规则生成编码 + * + * @param ruleCode + * @return + */ + String generateCode(String ruleCode); + + String generateCodeByLeftCodeAndPrefix(String ruleCode,String prefix); + +} 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..966fd45 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/AdminUserApi.java @@ -0,0 +1,77 @@ +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 com.win.module.system.api.user.dto.AdminUserRespExpandDTO; + +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); + + /** + * 获取用户信息根据用户身份 + * + * @param adminUserRespExpandDTO + **/ + List selectByUserIdentity(AdminUserRespExpandDTO adminUserRespExpandDTO); + +} 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..ca5ce35 --- /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,52 @@ +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; + + /** + * 设备唯一码 + */ + private String cid; +} diff --git a/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/dto/AdminUserRespExpandDTO.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/dto/AdminUserRespExpandDTO.java new file mode 100644 index 0000000..0bf9af5 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/api/user/dto/AdminUserRespExpandDTO.java @@ -0,0 +1,41 @@ +package com.win.module.system.api.user.dto; + +import lombok.Data; + +import java.util.List; + +/** + * Admin 用户 Response DTO + * + * @author 闻荫源码 + */ +@Data +public class AdminUserRespExpandDTO extends AdminUserRespDTO{ + + /** + * 用户角色id + */ + private Integer roleId; + + /** + *用户厂区id + **/ + private String factoryAreaNumber; + + /** + *用户岗位id + **/ + private Integer postId; + + /** + *班组 + **/ + private String classType; + /** + * 角色标识 + */ + private List code; + + + +} 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..4d918bd --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/ErrorCodeConstants.java @@ -0,0 +1,179 @@ +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, "已经存在该值的字典数据"); + ErrorCode DICT_DATA_NOT_EXIST = new ErrorCode(1_002_007_004, "当前字典数据不存在【{}】"); + ErrorCode DICT_LABLE_NOT_EXIST = new ErrorCode(1_002_007_005, "当前字典标签不存在【{}】"); + // ========== 通知公告 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, "流水号规则长度不足"); + + + ErrorCode CONFIGKAY_IS_NOT_DELETE = new ErrorCode(1_002_026_001, "内置参数【{}】不能删除"); + ErrorCode SYSCONFIG_IS_NOT_CREATE = new ErrorCode(1_002_026_001, "新增参数【{}】失败,参数键名已存在"); + ErrorCode SYSCONFIG_IS_NOT_UPDATE = new ErrorCode(1_002_026_001, "修改参数【{}】失败,参数键名已存在"); + + ErrorCode CONFIG_NOT_EXISTS = new ErrorCode(1_002_026_002, "系统参数为空,请重试"); + ErrorCode CONFIG_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_002_026_002, "导入参数为空,请重试"); + ErrorCode DEPT_BUSI_TYPE_NOT_FOUND = new ErrorCode(1_002_026_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/BooleanTypeEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/dept/BooleanTypeEnum.java new file mode 100644 index 0000000..08e1da3 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/dept/BooleanTypeEnum.java @@ -0,0 +1,28 @@ +package com.win.module.system.enums.dept; + +/** + * Boolean枚举 + * + * @author win + */ +public enum BooleanTypeEnum { + + F("FALSE", "否"), Y("TRUE", "是"); + + private final String code; + private final String info; + + BooleanTypeEnum(String code, String info) { + this.code = code; + this.info = info; + } + + public String getCode() { + return code; + } + + public String getInfo() { + return info; + } + +} 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/dept/DeptLevelEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/dept/DeptLevelEnum.java new file mode 100644 index 0000000..9e7d2ef --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/dept/DeptLevelEnum.java @@ -0,0 +1,28 @@ +package com.win.module.system.enums.dept; + +/** + * Boolean枚举 + * + * @author win + */ +public enum DeptLevelEnum { + + COMPANY(1, "公司"), FactoryArea(2, "厂区"), TEAMSCLASS(3, "班组"); + + private final int code; + private final String info; + + DeptLevelEnum(int code, String info) { + this.code = code; + this.info = info; + } + + public int getCode() { + return code; + } + + public String getInfo() { + return info; + } + +} 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..40cfe3f --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/serialNumber/RuleCodeEnum.java @@ -0,0 +1,41 @@ +package com.win.module.system.enums.serialNumber; + +public enum RuleCodeEnum { + + Factory_Area("FactoryArea"), // 厂区 + Location_Area("LocationArea"), // 库区 + Location("Location"), // 库位 + Supplier("Supplier"), // 供应商 + Item("Item"), // 备件 + FIXED_ASSETS("FixedAssets"), // 固定资产 + REQUEST_REPAIR("REQUESTREPAIR"), // 申请 + WEI_XIU_ORDER("weiXiuOrder"), // 维修工单 + REQUEST_APPLY("RequestApply"), // 备件申请 + DEVICE_ACCOUNT_ORDER("deviceAccount_"), // 设备台账 + JIAN_XIU_ORDER("JianXiuOrder"), // 检修工单 + BAO_YANG_ORDER("BaoYangOrder"), // 保养工单 + + XUN_JIAN_ORDER("XunJianOrder"), // 设备巡检点检 + BJWX_RECORD("BJWXRecord"), // 备件维修记录 + BAO_YANG_JI_HUA_ORDER("BaoYangJiHuaOrder"), // 保养计划 + ITEM_ORDER("ITEMORDER"), // 备件采购订单 + PLAN_COUNT("PLANCOUNT"), // 盘点计划 + COUNT_JOB("COUNTJOB"), // 盘点任务 + COUNT_RECORD("COUNTRECORD"), // 盘点记录 + Adjust_Record("AdjustRecord"), // 盘点调整记录 + Device_Internal_Audit("DeviceInternalAudit"), // 设备内审 + Item_Return("ItemReturn"), //备件归还 + + ; + + 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-api/src/main/java/com/win/module/system/enums/status/AdjustStatusEnum.java b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/status/AdjustStatusEnum.java new file mode 100644 index 0000000..099e170 --- /dev/null +++ b/win-module-system/win-module-system-api/src/main/java/com/win/module/system/enums/status/AdjustStatusEnum.java @@ -0,0 +1,29 @@ +package com.win.module.system.enums.status; + +/** + * Boolean枚举 + * + * @author win + */ +public enum AdjustStatusEnum { + + CANGENERATE("CANGENERATE", "可生成"), NOGENERATE("NOGENERATE", "不需要生成"), COMPLETED("COMPLETED", "已生成"), CANCEL("CANCEL", "作废") + ; + + private final String code; + private final String info; + + AdjustStatusEnum(String code, String info) { + this.code = code; + this.info = info; + } + + public String getCode() { + return code; + } + + public String getInfo() { + return info; + } + +} 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..5b8f488 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dept/DeptApiImpl.java @@ -0,0 +1,61 @@ +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.dal.dataobject.user.AdminUserDO; +import com.win.module.system.service.dept.DeptService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; + +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * 部门 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); + } + @Override + public List> selectAllFactoryArea() { + List> list = deptService.selectAllFactoryArea(); + return list; + } + + @Override + public List> selectAllFactoryAreaDept() { + List> list = deptService.selectAllFactoryAreaDept(); + return list; + } + + @Override + public List> selecUserByType(String classType, String factoryAreaNumber, String flag) { + return deptService.selecUserByType(classType,factoryAreaNumber,flag); + + } + + +} 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..2737ad0 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dept/PostApiImpl.java @@ -0,0 +1,74 @@ +package com.win.module.system.api.dept; + +import com.win.module.system.dal.dataobject.dept.PostDO; +import com.win.module.system.dal.dataobject.dept.UserPostDO; +import com.win.module.system.dal.mysql.dept.PostMapper; +import com.win.module.system.dal.mysql.dept.UserPostMapper; +import com.win.module.system.service.dept.PostService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; + +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * 岗位 API 实现类 + * + * @author 闻荫源码 + */ +@Service +public class PostApiImpl implements PostApi { + + @Resource + private PostService postService; + + @Resource + private UserPostMapper pserPostMapper; + + @Resource + private PostMapper postMapper; + + + @Override + public void validPostList(Collection ids) { + postService.validatePostList(ids); + } + + /** + * 是否为普通维修员 + */ + @Override + public Boolean booleanWorker() { + List list = pserPostMapper.selectList("user_id", getLoginUserId()); + for(UserPostDO en:list){ + PostDO postDO = postMapper.selectById(en.getPostId()); + if("worker".equals(postDO.getCode())){ + return true; + } + } + return false; + } + + /** + * 是否为工程师 + */ + @Override + public Boolean booleanEngineer() { + List list = pserPostMapper.selectList("user_id", getLoginUserId()); + for(UserPostDO en:list){ + PostDO postDO = postMapper.selectById(en.getPostId()); + if("engineer".equals(postDO.getCode())){ + return true; + } + } + return false; + } + +// @Override +// public PostDO getPost(Long id) { +// return postService.selectById(id); +// } + +} 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..754bebf --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/dict/DictDataApiImpl.java @@ -0,0 +1,69 @@ +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); + } + @Override + public DictDataRespDTO selectDictLabel( String plabel){ + DictDataDO dictDataDO = dictDataService.selectDictLabel(plabel); + return DictDataConvert.INSTANCE.convert02(dictDataDO); + } + + @Override + public DictDataRespDTO selectDictValue( String value){ + DictDataDO dictDataDO = dictDataService.selectDictValue(value); + 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..d9ef861 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/notify/NotifyMessageSendApiImpl.java @@ -0,0 +1,62 @@ +package com.win.module.system.api.notify; + +import com.win.module.system.api.notify.dto.NotifySendSingleToRoleReqDTO; +import com.win.module.system.api.notify.dto.NotifySendSingleToRolesReqDTO; +import com.win.module.system.api.notify.dto.NotifySendSingleToUserReqDTO; +import com.win.module.system.service.notify.NotifySendService; +import com.win.module.system.service.permission.PermissionService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +/** + * 站内信发送 API 实现类 + * + * @author xrcoder + */ +@Service +public class NotifyMessageSendApiImpl implements NotifyMessageSendApi { + + @Resource + private NotifySendService notifySendService; + @Resource + private PermissionService permissionService; + + @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()); + } + + @Override + public List sendMessageToRole(NotifySendSingleToRoleReqDTO reqDTO) { + List roleIdList = new ArrayList<>(); + roleIdList.add(reqDTO.getRoleId()); + Set userIdSet = permissionService.getUserRoleIdListByRoleId(roleIdList); + List resultList = new ArrayList<>(); + for(Long userId : userIdSet) { + Long messageId = notifySendService.sendSingleNotifyToMember(userId, reqDTO.getTemplateCode(), reqDTO.getTemplateParams()); + resultList.add(messageId); + } + return resultList; + } + + @Override + public List sendMessageToRole(NotifySendSingleToRolesReqDTO reqDTO) { + Set userIdSet = permissionService.getUserRoleIdListByRoleId(reqDTO.getRoleIdList()); + List resultList = new ArrayList<>(); + for(Long userId : userIdSet) { + Long messageId = notifySendService.sendSingleNotifyToMember(userId, reqDTO.getTemplateCode(), reqDTO.getTemplateParams()); + resultList.add(messageId); + } + return resultList; + } + +} 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..faecadc --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/permission/PermissionApiImpl.java @@ -0,0 +1,189 @@ +package com.win.module.system.api.permission; + +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.module.system.api.permission.dto.DeptDataPermissionRespDTO; +import com.win.module.system.api.permission.dto.PermissionIdentificationRespVO; +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.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 org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Collection; +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; + +/** + * 权限 API 实现类 + * + * @author 闻荫源码 + */ +@Service +public class PermissionApiImpl implements PermissionApi { + + @Resource + private PermissionService permissionService; + + @Resource + private AdminAuthService authService; + @Resource + private AdminUserService userService; + @Resource + private RoleService roleService; + @Resource + private MenuService menuService; + + + @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); + } + + @Override + public Object getPermissionIdentifications() { + // 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 AuthConvert.INSTANCE.convert(user, roles, menuList); + } + + /** + * 判断当前人是否是设备普通维修人员 + * @return + */ + public Boolean getDeviceWorkerRole(){ + return hasAnyRoles(Long.parseLong("148"), "device_class_worker_role"); + } + + /** + * 判断当前人是否是设备工程师 + * @return + */ + public Boolean getDeviceEngineerRole(){ + return hasAnyRoles(getLoginUserId(), "device_class_Engineer_role"); + } + + /** + * 判断当前人是否是模具普通维修人员 + * @return + */ + public Boolean getMoldWorkerRole(){ + return hasAnyRoles(getLoginUserId(), "mold_class_worker_role"); + } + + /** + * 判断当前人是否是模具工程师 + * @return + */ + public Boolean getMoldEngineerRole(){ + return hasAnyRoles(getLoginUserId(), "mold_class_Engineer_role"); + } + + /** + * 判断当前人是否是工艺普通维修人员 + * @return + */ + public Boolean getTechWorkerRole(){ + return hasAnyRoles(getLoginUserId(), "tech_class_worker_role"); + } + + /** + * 判断当前人是否是工艺工程师 + * @return + */ + public Boolean getTechEngineerRole(){ + return hasAnyRoles(getLoginUserId(), "tech_class_Engineer_role"); + } + + /** + * 判断当前人是否是普通备件申请审批权限 + * @return + */ + public Boolean getNomalWorkerRole(){ + return hasAnyRoles(getLoginUserId(), "normal_approve"); + } + + /** + * 判断当前人是否是高级备件申请审批权限 + * @return + */ + public Boolean getHighEngineerRole(){ + return hasAnyRoles(getLoginUserId(), "all_approve"); + } + + /** + * 获取当前人所属班组 + * @return + */ + public String getClassType(){ + boolean a = hasAnyRoles(getLoginUserId(), new String[]{"device_class_worker_role", "device_class_Engineer_role"}); + if(a){ + return "DEVICE"; + } + boolean b = hasAnyRoles(getLoginUserId(), new String[]{"mold_class_worker_role", "mold_class_Engineer_role"}); + if(b){ + return "MOLD"; + } + boolean c = hasAnyRoles(getLoginUserId(), new String[]{"tech_class_worker_role", "tech_class_Engineer_role"}); + if(c){ + return "TECH"; + } + return ""; + } + + /** + * 判断当前人是否是工程师 + * @return + */ + public Boolean BooleanEngineer(){ + return hasAnyRoles(getLoginUserId(), "mold_class_Engineer_role", "device_class_Engineer_role","tech_class_Engineer_role"); + } + + /** + * 判断当前人是否是工程师 + * @return + */ + public Boolean BooleanWorker(){ + return hasAnyRoles(getLoginUserId(), "mold_class_worker_role", "tech_class_worker_role","device_class_worker_role"); + } + +} 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..0897387 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/serialnumber/SerialNumberApiImpl.java @@ -0,0 +1,23 @@ +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); + } + + @Override + public String generateCodeByLeftCodeAndPrefix(String ruleCode,String prefix) { + return smsCodeService.generateCodeByLeftCodeAndPrefix(ruleCode,prefix); + } +} 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..f01d423 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/api/user/AdminUserApiImpl.java @@ -0,0 +1,61 @@ +package com.win.module.system.api.user; + +import com.win.module.system.api.user.dto.AdminUserRespDTO; +import com.win.module.system.api.user.dto.AdminUserRespExpandDTO; +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); + } + + public List selectByUserIdentity(AdminUserRespExpandDTO adminUserRespExpandDTO){ + + List list = userService.selectByUserIdentity(adminUserRespExpandDTO.getCode(),adminUserRespExpandDTO.getFactoryAreaNumber()); + return UserConvert.INSTANCE.convertList4(list); + + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/aspectj/DataScopeAspect.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/aspectj/DataScopeAspect.java new file mode 100644 index 0000000..0a1f767 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/aspectj/DataScopeAspect.java @@ -0,0 +1,216 @@ +package com.win.module.system.aspectj; + + +import cn.hutool.core.convert.Convert; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.win.framework.common.context.DataScopeHolder; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.datapermission.annotation.DataScope; +import com.win.framework.security.config.SecurityProperties; +import com.win.module.system.api.permission.PermissionApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.context.PermissionContextHolder; +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.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 com.win.module.system.util.StringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * @Author longlongxiaogege + * @Description 权限范围控制Wrapper兼容 + * @Date 13:49 2023/6/21 + **/ +@Aspect +@Component +public class DataScopeAspect { + + @Resource + private AdminUserApi adminUserApi; + + @Resource + private PermissionApi permissionApi; + + @Resource + private AdminAuthService authService; + @Resource + private AdminUserService userService; + @Resource + private RoleService roleService; + @Resource + private MenuService menuService; + @Resource + private PermissionService permissionService; + + @Resource + private SecurityProperties securityProperties; + + /** + * 全部数据权限 + */ + public static final String DATA_SCOPE_ALL = "1"; + + /** + * 自定数据权限 + */ + public static final String DATA_SCOPE_CUSTOM = "2"; + + /** + * 部门数据权限 + */ + public static final String DATA_SCOPE_DEPT = "3"; + + /** + * 部门及以下数据权限 + */ + public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; + + /** + * 仅本人数据权限 + */ + public static final String DATA_SCOPE_SELF = "5"; + + /** + * 数据权限过滤关键字 + */ + public static final String DATA_SCOPE = "dataScope"; + + /** + * 定义切点,切点为添加了注解的方法 + */ + @Around("@annotation(controllerDataScope)") + public Object withAnnotationMethods(ProceedingJoinPoint joinPoint, DataScope controllerDataScope) throws Throwable { + handleDataScope(joinPoint, controllerDataScope); + Object obj = joinPoint.proceed(); + if (DataScopeHolder.getDataScopeSql() != null) { + DataScopeHolder.removeDataScopeSql(); + } + return obj; + } + + protected void handleDataScope(final JoinPoint joinPoint, DataScope controllerDataScope) { + // 获取当前的用户 + AdminUserDO user = userService.getUser(getLoginUserId()); + Set roleIds = permissionService.getUserRoleIdListByUserId(getLoginUserId()); + boolean b = roleService.hasAnySuperAdmin(roleIds); + if (!b) { + if (StringUtils.isNotNull(user)) { + String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), PermissionContextHolder.getContext()); + dataScopeFilter(joinPoint, user, controllerDataScope.deptAlias(), controllerDataScope.userAlias(), permission,roleIds); + } + } + } + + /** + * 数据范围过滤 + * + * @param joinPoint 切点 + * @param user 用户 + * @param deptAlias 部门别名 + * @param userAlias 用户别名 + * @param permission 权限字符 + */ + public void dataScopeFilter(JoinPoint joinPoint, AdminUserDO user, String deptAlias, String userAlias, String permission,Set roleIds) { + StringBuilder sqlString = new StringBuilder(); + List conditions = new ArrayList<>(); + HttpServletRequest request = ServletUtils.getRequest(); + String referer = request.getHeader("Referer1"); + if(referer!=null&&!"".equals(referer)){ + referer = referer.substring(referer.lastIndexOf("/") + 1); + } + List roles = roleService.getRoleList(roleIds); + //List menuList = menuService.getMenuList(menuIds); + for (RoleDO role : roles) { + Set meunId = permissionService.getRoleMenuListByRoleId(role.getId()); + //用户只有一个角色不参与 + if (roles.size() > 1&&meunId!=null&&!meunId.isEmpty()) { + List menList = menuService.getMenuList(meunId); + boolean isExists = false; + for (MenuDO sysMenu : menList) { + if (sysMenu.getPath().equals(referer)) { + isExists = true; + } + } + //如果前端路由不在当前角色中直接continue + if (!isExists) { + continue; + } + } + String dataScope = role.getDataScope().toString(); + if (!DATA_SCOPE_CUSTOM.equals(dataScope) && conditions.contains(dataScope)) { + continue; + } + if (StringUtils.isNotEmpty(permission) && StringUtils.isNotEmpty(meunId) && !StringUtils.containsAny(convertToStrings(meunId), Convert.toStrArray(permission))) { + continue; + } + if (DATA_SCOPE_ALL.equals(dataScope)) { + sqlString = new StringBuilder(); + break; + } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) { + //有问题 +// +// if (role.getDataScopeDeptIds() != null&& !"".equals(role.getDataScopeDeptIds())) { +// ObjectMapper mapper = new ObjectMapper(); +// List aa = mapper.readValue(postIds, List.class); +// } + Set longSet = role.getDataScopeDeptIds(); + String inClauseValues=""; + // 检查Set是否为空 + if (!longSet.isEmpty()) { + inClauseValues = longSet.stream().map(Object::toString) + .collect(Collectors.joining(",")); + System.out.println(); + } + // 构建IN子句中的占位符列表 + + sqlString.append(StringUtils.format(" OR {}.dept_id IN ( "+inClauseValues+" ) ", deptAlias, role.getId())); + //sqlString.append(StringUtils.format(" OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, role.getId())); + } else if (DATA_SCOPE_DEPT.equals(dataScope)) { + sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId())); + } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) { + sqlString.append(StringUtils.format(" OR {}.dept_id IN ( SELECT id FROM system_dept WHERE id = {} or find_in_set( {} , parent_id ) )", deptAlias, user.getDeptId(), user.getDeptId())); + } else if (DATA_SCOPE_SELF.equals(dataScope)) { + if (StringUtils.isNotBlank(userAlias)) { + sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getId())); + } else { + // 数据权限为仅本人且没有userAlias别名不查询任何数据 + sqlString.append(StringUtils.format(" OR {}.creator = {} ", deptAlias, user.getId())); + } + } + conditions.add(dataScope); + } + if (StringUtils.isNotBlank(sqlString.toString())) { + DataScopeHolder.addDataScopeSql(sqlString.substring(4)); + } + } + private static Set convertToStrings(Set longSet) { + Set stringSet = new HashSet<>(); + + for (Long num : longSet) { + stringSet.add(num.toString()); + } + + return stringSet; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/aspectj/DataScopeIndividuateAspect.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/aspectj/DataScopeIndividuateAspect.java new file mode 100644 index 0000000..44cbed9 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/aspectj/DataScopeIndividuateAspect.java @@ -0,0 +1,214 @@ +package com.win.module.system.aspectj; + + +import cn.hutool.core.convert.Convert; +import com.win.framework.common.context.DataScopeHolder; +import com.win.framework.common.util.servlet.ServletUtils; +import com.win.framework.datapermission.annotation.DataScopeIndividuate; +import com.win.framework.security.config.SecurityProperties; +import com.win.module.system.api.permission.PermissionApi; +import com.win.module.system.api.user.AdminUserApi; +import com.win.module.system.context.PermissionContextHolder; +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.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 com.win.module.system.util.StringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * @Author longlongxiaogege + * @Description 权限范围控制Wrapper兼容 + * @Date 13:49 2023/6/21 + **/ +@Aspect +@Component +public class DataScopeIndividuateAspect { + + @Resource + private AdminUserApi adminUserApi; + + @Resource + private PermissionApi permissionApi; + + @Resource + private AdminAuthService authService; + @Resource + private AdminUserService userService; + @Resource + private RoleService roleService; + @Resource + private MenuService menuService; + @Resource + private PermissionService permissionService; + + @Resource + private SecurityProperties securityProperties; + + /** + * 全部数据权限 + */ + public static final String DATA_SCOPE_ALL = "1"; + + /** + * 自定数据权限 + */ + public static final String DATA_SCOPE_CUSTOM = "2"; + + /** + * 部门数据权限 + */ + public static final String DATA_SCOPE_DEPT = "3"; + + /** + * 部门及以下数据权限 + */ + public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; + + /** + * 仅本人数据权限 + */ + public static final String DATA_SCOPE_SELF = "5"; + + /** + * 数据权限过滤关键字 + */ + public static final String DATA_SCOPE = "dataScope"; + + /** + * 定义切点,切点为添加了注解的方法 + */ + @Around("@annotation(dataScopeIndividuate)") + public Object withAnnotationMethods(ProceedingJoinPoint joinPoint, DataScopeIndividuate dataScopeIndividuate) throws Throwable { + handleDataScope(joinPoint, dataScopeIndividuate); + Object obj = joinPoint.proceed(); + if (DataScopeHolder.getDataScopeSql() != null) { + DataScopeHolder.removeDataScopeSql(); + } + return obj; + } + + protected void handleDataScope(final JoinPoint joinPoint, DataScopeIndividuate dataScopeIndividuate) { + // 获取当前的用户 + AdminUserDO user = userService.getUser(getLoginUserId()); + Set roleIds = permissionService.getUserRoleIdListByUserId(getLoginUserId()); + boolean b = roleService.hasAnySuperAdmin(roleIds); + if (!b) { + if (StringUtils.isNotNull(user)) { + String permission = StringUtils.defaultIfEmpty(dataScopeIndividuate.permission(), PermissionContextHolder.getContext()); + dataScopeFilter(joinPoint, user, dataScopeIndividuate.deptAlias(), dataScopeIndividuate.userAlias(), permission,roleIds); + } + } + } + + /** + * 数据范围过滤 + * + * @param joinPoint 切点 + * @param user 用户 + * @param deptAlias 部门别名 + * @param userAlias 用户别名 + * @param permission 权限字符 + */ + public void dataScopeFilter(JoinPoint joinPoint, AdminUserDO user, String deptAlias, String userAlias, String permission,Set roleIds) { + StringBuilder sqlString = new StringBuilder(); + List conditions = new ArrayList<>(); + HttpServletRequest request = ServletUtils.getRequest(); + String referer = request.getHeader("Referer1"); + if(referer!=null&&!"".equals(referer)){ + referer = referer.substring(referer.lastIndexOf("/") + 1); + } + List roles = roleService.getRoleList(roleIds); + //List menuList = menuService.getMenuList(menuIds); + for (RoleDO role : roles) { + Set meunId = permissionService.getRoleMenuListByRoleId(role.getId()); + //用户只有一个角色不参与 + if (roles.size() > 1&&meunId!=null&&!meunId.isEmpty()) { + List menList = menuService.getMenuList(meunId); + boolean isExists = false; + for (MenuDO sysMenu : menList) { + if (sysMenu.getPath().equals(referer)) { + isExists = true; + } + } + //如果前端路由不在当前角色中直接continue + if (!isExists) { + continue; + } + } + String dataScope = role.getDataScope().toString(); + if (!DATA_SCOPE_CUSTOM.equals(dataScope) && conditions.contains(dataScope)) { + continue; + } + if (StringUtils.isNotEmpty(permission) && StringUtils.isNotEmpty(meunId) && !StringUtils.containsAny(convertToStrings(meunId), Convert.toStrArray(permission))) { + continue; + } + if (DATA_SCOPE_ALL.equals(dataScope)) { + sqlString = new StringBuilder(); + break; + } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) { + //有问题 +// +// if (role.getDataScopeDeptIds() != null&& !"".equals(role.getDataScopeDeptIds())) { +// ObjectMapper mapper = new ObjectMapper(); +// List aa = mapper.readValue(postIds, List.class); +// } + Set longSet = role.getDataScopeDeptIds(); + String inClauseValues=""; + // 检查Set是否为空 + if (!longSet.isEmpty()) { + inClauseValues = longSet.stream().map(Object::toString) + .collect(Collectors.joining(",")); + System.out.println(); + } + // 构建IN子句中的占位符列表 + + sqlString.append(StringUtils.format(" OR {}.dept_id IN ( "+inClauseValues+" ) ", deptAlias, role.getId())); + //sqlString.append(StringUtils.format(" OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, role.getId())); + } else if (DATA_SCOPE_DEPT.equals(dataScope)) { + sqlString.append(StringUtils.format(" OR {}.dept_id = {} OR {}.maintenance = {} OR {}.request_number in (SELECT e.number from request_repair e where e.declarer = {}) ", deptAlias, user.getDeptId(),deptAlias, user.getId(),deptAlias, user.getId())); + } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) { + sqlString.append(StringUtils.format(" OR {}.dept_id IN ( SELECT id FROM system_dept WHERE id = {} or find_in_set( {} , parent_id ) ) OR {}.maintenance = {} OR {}.request_number in (SELECT e.number from request_repair e where e.declarer = {}) ", deptAlias, user.getDeptId(), user.getDeptId(), deptAlias, user.getId(),deptAlias, user.getId())); + } else if (DATA_SCOPE_SELF.equals(dataScope)) { + if (StringUtils.isNotBlank(userAlias)) { + sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getId())); + } else { + // 数据权限为仅本人且没有userAlias别名不查询任何数据 + sqlString.append(StringUtils.format(" OR {}.creator = {} ", deptAlias, user.getId())); + } + } + conditions.add(dataScope); + } + if (StringUtils.isNotBlank(sqlString.toString())) { + DataScopeHolder.addDataScopeSql(sqlString.substring(4)); + } + } + private static Set convertToStrings(Set longSet) { + Set stringSet = new HashSet<>(); + + for (Long num : longSet) { + stringSet.add(num.toString()); + } + + return stringSet; + } + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/context/AuthenticationContextHolder.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/context/AuthenticationContextHolder.java new file mode 100644 index 0000000..9d1a786 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/context/AuthenticationContextHolder.java @@ -0,0 +1,24 @@ +package com.win.module.system.context; + +import org.springframework.security.core.Authentication; + +/** + * 身份验证信息 + * + * @author win + */ +public class AuthenticationContextHolder { + private static final ThreadLocal contextHolder = new ThreadLocal<>(); + + public static Authentication getContext() { + return contextHolder.get(); + } + + public static void setContext(Authentication context) { + contextHolder.set(context); + } + + public static void clearContext() { + contextHolder.remove(); + } +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/context/PermissionContextHolder.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/context/PermissionContextHolder.java new file mode 100644 index 0000000..085c238 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/context/PermissionContextHolder.java @@ -0,0 +1,24 @@ +package com.win.module.system.context; + +import cn.hutool.core.convert.Convert; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +/** + * 权限信息 + * + * @author win + */ +public class PermissionContextHolder { + private static final String PERMISSION_CONTEXT_ATTRIBUTES = "PERMISSION_CONTEXT"; + + public static void setContext(String permission) { + RequestContextHolder.currentRequestAttributes().setAttribute(PERMISSION_CONTEXT_ATTRIBUTES, permission, + RequestAttributes.SCOPE_REQUEST); + } + + public static String getContext() { + return Convert.toStr(RequestContextHolder.currentRequestAttributes().getAttribute(PERMISSION_CONTEXT_ATTRIBUTES, + RequestAttributes.SCOPE_REQUEST)); + } +} 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..f86b368 --- /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,50 @@ +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; + /** + * uniapp 消息推送唯一编码 + */ + private String cid; + +} \ 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..109b75e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/DeptController.java @@ -0,0 +1,137 @@ +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.CustomConditions; +import com.win.framework.common.pojo.PageResult; +import com.win.framework.datapermission.core.annotation.DataPermission; +import com.win.module.system.controller.dept.vo.dept.*; +import com.win.module.system.controller.permission.vo.role.RoleRespVO; +import com.win.module.system.convert.dept.DeptConvert; +import com.win.module.system.convert.permission.RoleConvert; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.dataobject.permission.RoleDO; +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.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 javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Comparator; +import java.util.List; +import java.util.Map; + +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("/page") + @Operation(summary = "获取部门列表分页") + public CommonResult> getPage(DeptPageReqVO reqVO) { + PageResult page = deptService.getPage(reqVO); + return success(DeptConvert.INSTANCE.convertPage(page)); + } + @PostMapping("/senior") + @Operation(summary = "高级搜索获得库位分页") + public CommonResult> getLocationSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = deptService.getSenior(conditions); + PageResult result = DeptConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + @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))); + } + + @GetMapping("/selecUserByType") + @Operation(summary = "获取当前人所属厂区下班组成员") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @Parameters({ + @Parameter(name = "type", description = "班组类型DEVICE设备班组MOLD模具班组3工艺班组", required = true, example = "1024"), + @Parameter(name = "factoryNreaNumber", description = "厂区编码", required = true, example = "1024"), + @Parameter(name = "flag", description = "1普通维修人员2工程师0或者不传查询全部", required = false, example = "1024") + }) + @DataPermission(enable = false) + //@PreAuthorize("@ss.hasPermission('system:dept:query')") + public CommonResult>> selecUserByType(@RequestParam("classType") String classType, String factoryAreaNumber, String flag) { + return success(deptService.selecUserByType(classType,factoryAreaNumber,flag)); + } + + @GetMapping("/selectAllFactoryArea") + @Operation(summary = "获取所有厂区列表") + //@PreAuthorize("@ss.hasPermission('system:dept:selectAllFactoryArea')") + public CommonResult>> selectAllFactoryArea() { + return success(deptService.selectAllFactoryArea()); + } + + + @GetMapping("/selectAllFactoryAreaDept") + @Operation(summary = "获取所有厂区列表") + //@PreAuthorize("@ss.hasPermission('system:dept:selectAllFactoryAreaDept')") + public CommonResult>> selectAllFactoryAreaDept() { + return success(deptService.selectAllFactoryAreaDept()); + } + +} 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..6402115 --- /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,71 @@ +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; + + /** + * 班组类型 + */ + @Schema(description = "班组类型", example = "1") + private String classType; + + /** + * 部门类别 + */ + @Schema(description = "部门类别", example = "1") + private String busiType; + + /** + * 部门分组 + */ + @Schema(description = "部门分组", example = "1") + private String deptGroup; + + /** + * 部门层级 + */ + @Schema(description = "部门层级", example = "1") + private String level; + +} 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/DeptPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptPageReqVO.java new file mode 100644 index 0000000..9c4587b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dept/vo/dept/DeptPageReqVO.java @@ -0,0 +1,15 @@ +package com.win.module.system.controller.dept.vo.dept; + +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 DeptPageReqVO extends PageParam { + private String deptGroup; +} 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..da7a073 --- /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,32 @@ +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; + + @Schema(description = "部门层级") + private Long level; + + @Schema(description = "部门类别") + private String busiType; + + @Schema(description = "部门分组", example = "1") + private String group; + +} 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..b02e552 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/dict/DictTypeController.java @@ -0,0 +1,125 @@ +package com.win.module.system.controller.dict; + + +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.dict.vo.data.DictDataExportReqVO; +import com.win.module.system.controller.dict.vo.data.DictDataSimpleRespVO; +import com.win.module.system.controller.dict.vo.type.*; +import com.win.module.system.convert.dict.DictDataConvert; +import com.win.module.system.convert.dict.DictTypeConvert; +import com.win.module.system.dal.dataobject.dict.DictDataDO; +import com.win.module.system.dal.dataobject.dict.DictTypeDO; +import com.win.module.system.service.dict.DictDataService; +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 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/dict-type") +@Validated +public class DictTypeController { + + @Resource + private DictTypeService dictTypeService; + + @Resource + private DictDataService dictDataService; + + @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); + } + + @Operation(summary = "/根据类型查询展示类型下所有详细列表") + @PostMapping("/getDictByTypes") + @Parameter(name = "types", description = "字典类型数组", required = false, example = "\"types\":[\"infra_config_type\",\"user_type\"]") + @PreAuthorize("@ss.hasPermission('system:dict:query')") + public CommonResult> getByTypes(@RequestBody Map> map) { + List types = map.get("types"); + List dictByTypes = dictTypeService.getDictByTypes(types, CommonStatusEnum.ENABLE.getStatus()); + List result = DictTypeConvert.INSTANCE.convertList(dictByTypes); + for (DictTypeSimpleRespVO en:result){ + DictDataExportReqVO dictDataExportReqVO = new DictDataExportReqVO(); + dictDataExportReqVO.setDictType(en.getType()); + dictDataExportReqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + List dictDataList = dictDataService.getDictDataList(dictDataExportReqVO); + List dictDataSimpleRespVOS = DictDataConvert.INSTANCE.convertList(dictDataList); + en.setSubList(dictDataSimpleRespVOS); + } + return success(result); + } + +} 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..f84be74 --- /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,28 @@ +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; + + @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/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..919baf7 --- /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,28 @@ +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; + +import java.util.List; + +@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; + + @Schema(description = "字典表子表system_dict_data详细列表", requiredMode = Schema.RequiredMode.REQUIRED) + private List subList; + +} 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..a627da8 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/permission/RoleController.java @@ -0,0 +1,115 @@ +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.CustomConditions; +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)); + } + + @PostMapping("/senior") + @Operation(summary = "高级搜索获得库位分页") + public CommonResult> getLocationSenior(@Valid @RequestBody CustomConditions conditions) { + PageResult pageResult = roleService.getSenior(conditions); + PageResult result = RoleConvert.INSTANCE.convertPage(pageResult); + return success(result); + } + + @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..5829b1f --- /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,42 @@ +package com.win.module.system.controller.serialnumber.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 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/sysconfig/SysConfigController.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/SysConfigController.java new file mode 100644 index 0000000..b94977c --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/SysConfigController.java @@ -0,0 +1,135 @@ +package com.win.module.system.controller.sysconfig; + +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.sysconfig.vo.*; +import com.win.module.system.convert.sysconfig.SysConfigConvert; +import com.win.module.system.dal.dataobject.sysconfig.SysConfigDO; +import com.win.module.system.service.sysconfig.SysConfigService; +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.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 系统参数") +@RestController +@RequestMapping("/sys/config") +@Validated +public class SysConfigController { + + @Resource + private SysConfigService configService; + + @PostMapping("/create") + @Operation(summary = "创建系统参数") + @PreAuthorize("@ss.hasPermission('sys:config:create')") + public CommonResult createConfig(@Valid @RequestBody SysConfigCreateReqVO createReqVO) { + return success(configService.createConfig(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新系统参数") + @PreAuthorize("@ss.hasPermission('sys:config:update')") + public CommonResult updateConfig(@Valid @RequestBody SysConfigUpdateReqVO updateReqVO) { + int result = configService.updateConfig(updateReqVO); + return success(result > 0); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除系统参数") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('sys:config:delete')") + public CommonResult deleteConfig(@RequestParam("id") Long id) { + int result = configService.deleteConfig(id); + return success(result > 0); + } + + @GetMapping("/get") + @Operation(summary = "获得系统参数") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('sys:config:query')") + public CommonResult getConfig(@RequestParam("id") Long id) { + SysConfigDO config = configService.getConfig(id); + return success(SysConfigConvert.INSTANCE.convert(config)); + } + + @GetMapping("/list") + @Operation(summary = "获得系统参数列表") + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048") + @PreAuthorize("@ss.hasPermission('sys:config:query')") + public CommonResult> getConfigList(@RequestParam("ids") Collection ids) { + List list = configService.getConfigList(ids); + return success(SysConfigConvert.INSTANCE.convertList(list)); + } + + @GetMapping("/page") + @Operation(summary = "获得系统参数分页") + @PreAuthorize("@ss.hasPermission('sys:config:query')") + public CommonResult> getConfigPage(@Valid SysConfigPageReqVO pageVO) { + PageResult pageResult = configService.getConfigPage(pageVO); + return success(SysConfigConvert.INSTANCE.convertPage(pageResult)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出系统参数 Excel") + @PreAuthorize("@ss.hasPermission('sys:config:export')") + @OperateLog(type = EXPORT) + public void exportConfigExcel(@Valid SysConfigExportReqVO exportReqVO, + HttpServletResponse response) throws IOException { + List list = configService.getConfigList(exportReqVO); + // 导出 Excel + List datas = SysConfigConvert.INSTANCE.convertList02(list); + ExcelUtils.write(response, "系统参数.xls", "数据", SysConfigExcelVO.class, datas); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入系统参数模板") + public void importTemplate(HttpServletResponse response) throws IOException { + List list = Arrays.asList(); + // 输出 + ExcelUtils.write(response, "系统参数基本信息导入模板.xls", "系统参数基本信息列表", SysConfigExcelVO.class, list); + } + + @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('sys:config:import')") + 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 list = ExcelUtils.read(file, SysConfigExcelVO.class); + List errorList = configService.importSysConfigList(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")) + ".xlsx", "错误列表", 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/sysconfig/vo/SysConfigBaseVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigBaseVO.java new file mode 100644 index 0000000..ba52371 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigBaseVO.java @@ -0,0 +1,31 @@ +package com.win.module.system.controller.sysconfig.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 系统参数 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ +@Data +public class SysConfigBaseVO { + + @Schema(description = "参数名称", example = "王五") + private Long id; + + @Schema(description = "参数名称", example = "王五") + private String configName; + + @Schema(description = "参数键名") + private String configKey; + + @Schema(description = "参数键值") + private String configValue; + + @Schema(description = "系统内置(Y是 N否)", example = "2") + private String configType; + +// @Schema(description = "创建者") +// private String creator; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigCreateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigCreateReqVO.java new file mode 100644 index 0000000..e6f3c6e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigCreateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.system.controller.sysconfig.vo; + +import lombok.*; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "管理后台 - 系统参数创建 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysConfigCreateReqVO extends SysConfigBaseVO { + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigExcelVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigExcelVO.java new file mode 100644 index 0000000..a5dbfd5 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigExcelVO.java @@ -0,0 +1,34 @@ +package com.win.module.system.controller.sysconfig.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 系统参数 Excel VO + * + * @author 超级管理员 + */ +@Data +public class SysConfigExcelVO { + + @ExcelProperty("参数名称") + private String configName; + + @ExcelProperty("参数键名") + private String configKey; + + @ExcelProperty("参数键值") + private String configValue; + + @ExcelProperty("系统内置(Y是 N否)") + private String configType; + + @ExcelProperty("创建者") + private String creator; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigExportReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigExportReqVO.java new file mode 100644 index 0000000..7bb510d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigExportReqVO.java @@ -0,0 +1,37 @@ +package com.win.module.system.controller.sysconfig.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,参数和 SysConfigPageReqVO 是一致的") +@Data +public class SysConfigExportReqVO { + + @Schema(description = "参数主键", example = "22890") + private Long id; + + @Schema(description = "参数名称", example = "王五") + private String configName; + + @Schema(description = "参数键名") + private String configKey; + + @Schema(description = "参数键值") + private String configValue; + + @Schema(description = "系统内置(Y是 N否)", example = "2") + private String configType; + + @Schema(description = "创建者") + private String creator; + + @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/sysconfig/vo/SysConfigPageReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigPageReqVO.java new file mode 100644 index 0000000..7b3125e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigPageReqVO.java @@ -0,0 +1,39 @@ +package com.win.module.system.controller.sysconfig.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 SysConfigPageReqVO extends PageParam { + + @Schema(description = "参数主键", example = "22890") + private Long id; + + @Schema(description = "参数名称", example = "王五") + private String configName; + + @Schema(description = "参数键名") + private String configKey; + + @Schema(description = "参数键值") + private String configValue; + + @Schema(description = "系统内置(Y是 N否)", example = "2") + private String configType; + + @Schema(description = "创建者") + private String creator; + + @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/sysconfig/vo/SysConfigRespVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigRespVO.java new file mode 100644 index 0000000..a4c32ec --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigRespVO.java @@ -0,0 +1,16 @@ +package com.win.module.system.controller.sysconfig.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 SysConfigRespVO extends SysConfigBaseVO { + + @Schema(description = "创建时间") + private LocalDateTime createTime; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigUpdateReqVO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigUpdateReqVO.java new file mode 100644 index 0000000..6956a7f --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/sysconfig/vo/SysConfigUpdateReqVO.java @@ -0,0 +1,12 @@ +package com.win.module.system.controller.sysconfig.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +@Schema(description = "管理后台 - 系统参数更新 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class SysConfigUpdateReqVO extends SysConfigBaseVO { + +} 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..a2b9959 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/controller/user/UserController.java @@ -0,0 +1,208 @@ +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..86b8e5b --- /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,112 @@ +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 = "班组类型DEVICE设备班组MOLD模具班组TECH工艺班组") + private String classType; + + @Schema(description = "当前人所属厂区id") + private String parentId; + + } + + @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 = "岗位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "user") + private String code; + + } + + @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..4c99144 --- /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,40 @@ +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..b790822 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/dept/DeptConvert.java @@ -0,0 +1,36 @@ +package com.win.module.system.convert.dept; + +import com.win.framework.common.pojo.PageResult; +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); + + PageResult convertPage(PageResult page); + + 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..27edf76 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/permission/RoleConvert.java @@ -0,0 +1,30 @@ +package com.win.module.system.convert.permission; + +import com.win.framework.common.pojo.PageResult; +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); + PageResult convertPage(PageResult 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/sysconfig/SysConfigConvert.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/sysconfig/SysConfigConvert.java new file mode 100644 index 0000000..8808e58 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/convert/sysconfig/SysConfigConvert.java @@ -0,0 +1,36 @@ +package com.win.module.system.convert.sysconfig; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.sysconfig.vo.SysConfigCreateReqVO; +import com.win.module.system.controller.sysconfig.vo.SysConfigExcelVO; +import com.win.module.system.controller.sysconfig.vo.SysConfigRespVO; +import com.win.module.system.controller.sysconfig.vo.SysConfigUpdateReqVO; +import com.win.module.system.dal.dataobject.sysconfig.SysConfigDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 系统参数 Convert + * + * @author 超级管理员 + */ +@Mapper +public interface SysConfigConvert { + + SysConfigConvert INSTANCE = Mappers.getMapper(SysConfigConvert.class); + + SysConfigDO convert(SysConfigCreateReqVO bean); + + SysConfigDO convert(SysConfigUpdateReqVO bean); + + SysConfigRespVO convert(SysConfigDO 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..dac1629 --- /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,86 @@ +package com.win.module.system.dal.dataobject.dept; + +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.common.enums.CommonStatusEnum; +import com.win.framework.tenant.core.db.TenantBaseDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +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; + /** + * 班组类型 + */ + private String classType; + /** + * 级别1公司2厂区3班组 + */ + private Long level; + + /** + * 部门类别 + */ + @TableField(value = "`busi_type`") + private String busiType; + + /** + * 部门分组 + */ + private String deptGroup; + + + +} 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/sysconfig/SysConfigDO.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sysconfig/SysConfigDO.java new file mode 100644 index 0000000..4145d98 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/sysconfig/SysConfigDO.java @@ -0,0 +1,56 @@ +package com.win.module.system.dal.dataobject.sysconfig; + +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("sys_config") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SysConfigDO extends BaseDO { + + /** + * 参数主键 + */ + @TableId + private Long id; + /** + * 参数名称 + */ + private String configName; + /** + * 参数键名 + */ + private String configKey; + /** + * 参数键值 + */ + private String configValue; + /** + * 系统内置(Y是 N否) + */ + private String configType; + /** + * 创建者 + */ + private String creator; + /** + * 更新者 + */ + private String updater; + /** + * 备注 + */ + private String remark; + +} 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..918576d --- /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,100 @@ +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; + /** + * uniapp消息推送唯一标识 + */ + private String cid; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/user/AdminUserDOExpand.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/user/AdminUserDOExpand.java new file mode 100644 index 0000000..baac0db --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/dataobject/user/AdminUserDOExpand.java @@ -0,0 +1,41 @@ +package com.win.module.system.dal.dataobject.user; + +import lombok.*; + +import java.util.List; + +/** + * 管理后台的用户 DO + * + * @author 闻荫源码 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@AllArgsConstructor +public class AdminUserDOExpand extends AdminUserDO { + + //角色id + private Integer roleId; + + //岗位id + private Integer postId; + + //部门层级 + private String deptLevel; + + //部门类型 + private String deptType; + + //厂区id + private Integer parentId; + + //班组 + private String classType; + //厂区编码 + private String factoryAreaNumber; + + //班组 + private List code; + +} 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..d0f9ce7 --- /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,82 @@ +package com.win.module.system.dal.mysql.dept; + +import com.win.framework.common.pojo.CustomConditions; +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.util.QueryWrapperUtils; +import com.win.module.system.controller.dept.vo.dept.DeptListReqVO; +import com.win.module.system.controller.dept.vo.dept.DeptPageReqVO; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.dataobject.permission.RoleDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +@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 PageResult selectPage(DeptPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DeptDO::getDeptGroup, reqVO.getDeptGroup()) + .eqIfPresent(DeptDO::getStatus,"0") + .orderByDesc(DeptDO::getId)); + } + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + + default Long selectCountByParentId(Long parentId) { + return selectCount(DeptDO::getParentId, parentId); + } + + default List selectListByParentId(Collection parentIds) { + return selectList(DeptDO::getParentId, parentIds); + } + + /** + * 根据厂区和类型获取厂区下普通维修工人或者所有人 + * @param code 角色标识 + * @param factoryAreaNumber + * @return + */ + List> selecUserByType(@Param("codes") List code,@Param("factoryAreaNumber") String factoryAreaNumber); + + /** + * 根据班组厂区类型获取维修人员 + * @param factoryAreaNumber + * @return + */ + List> selecUserByTypeAndFactoryAreaNumber(@Param("flag") String flag,@Param("type") String type,@Param("factoryAreaNumber") String factoryAreaNumber); + + /** + * 获取所有区域 + * @return + */ + List> selectAllFactoryArea(); + + + /** + * 获取所有厂区级部门 + * @return + */ + List> selectAllFactoryAreaDept(); + + + + +} 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..975c59c --- /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,55 @@ +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.Collection; +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); + + default List selectList(Collection types, Integer statuses) { + return selectList(new LambdaQueryWrapperX() + .inIfPresent(DictTypeDO::getType, types) + .eqIfPresent(DictTypeDO::getStatus, statuses)); + } +} 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..4e55e50 --- /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,54 @@ +package com.win.module.system.dal.mysql.permission; + +import com.win.framework.common.pojo.CustomConditions; +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.framework.mybatis.core.util.QueryWrapperUtils; +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); + } + + default PageResult selectSenior(CustomConditions conditions) { + return selectPage(conditions, QueryWrapperUtils.structure(conditions)); + } + +} 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..f1c24df --- /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,37 @@ +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/sysconfig/SysConfigMapper.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sysconfig/SysConfigMapper.java new file mode 100644 index 0000000..2b74221 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/dal/mysql/sysconfig/SysConfigMapper.java @@ -0,0 +1,45 @@ +package com.win.module.system.dal.mysql.sysconfig; + +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.sysconfig.vo.SysConfigExportReqVO; +import com.win.module.system.controller.sysconfig.vo.SysConfigPageReqVO; +import com.win.module.system.dal.dataobject.sysconfig.SysConfigDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 系统参数 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface SysConfigMapper extends BaseMapperX { + + default PageResult selectPage(SysConfigPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(SysConfigDO::getId, reqVO.getId()) + .likeIfPresent(SysConfigDO::getConfigName, reqVO.getConfigName()) + .eqIfPresent(SysConfigDO::getConfigKey, reqVO.getConfigKey()) + .eqIfPresent(SysConfigDO::getConfigValue, reqVO.getConfigValue()) + .eqIfPresent(SysConfigDO::getConfigType, reqVO.getConfigType()) + .eqIfPresent(SysConfigDO::getCreator, reqVO.getCreator()) + .betweenIfPresent(SysConfigDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SysConfigDO::getCreateTime)); + } + + default List selectList(SysConfigExportReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(SysConfigDO::getId, reqVO.getId()) + .likeIfPresent(SysConfigDO::getConfigName, reqVO.getConfigName()) + .eqIfPresent(SysConfigDO::getConfigKey, reqVO.getConfigKey()) + .eqIfPresent(SysConfigDO::getConfigValue, reqVO.getConfigValue()) + .eqIfPresent(SysConfigDO::getConfigType, reqVO.getConfigType()) + .eqIfPresent(SysConfigDO::getCreator, reqVO.getCreator()) + .betweenIfPresent(SysConfigDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SysConfigDO::getCreateTime)); + } + +} 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..832f091 --- /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,63 @@ +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 com.win.module.system.dal.dataobject.user.AdminUserDOExpand; +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); + } + + List selectByUserIdentity(AdminUserDOExpand adminUserDOExpand); + +} 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..26709bd --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/auth/AdminAuthServiceImpl.java @@ -0,0 +1,192 @@ +package com.win.module.system.service.auth; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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.dal.mysql.user.AdminUserMapper; +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; + + @Resource + private AdminUserMapper adminUserMapper; + + /** + * 验证码的开关,默认为 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) { + if(!"APP".equals(reqVO.getUuid())){//手机端登录方行 + // 校验验证码 + validateCaptcha(reqVO.getUsername(), reqVO.getCode(), reqVO.getUuid()); + } + // 使用账号密码,进行登录 + AdminUserDO user = authenticate(reqVO.getUsername(), reqVO.getPassword()); + if("APP".equals(reqVO.getUuid())){ + user.setCid(reqVO.getCid()); + adminUserMapper.updateById(user); + } + // 创建 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..34d6bb7 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/DeptService.java @@ -0,0 +1,140 @@ +package com.win.module.system.service.dept; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +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.DeptPageReqVO; +import com.win.module.system.controller.dept.vo.dept.DeptUpdateReqVO; +import com.win.module.system.dal.dataobject.dept.DeptDO; +import com.win.module.system.dal.dataobject.permission.RoleDO; + +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); + PageResult getPage(DeptPageReqVO pageReqVO); + + /** + * 筛选部门列表 + * + * @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); + + /** + * 获得系统内所有厂区信息(2级信息) + * @return + */ + List> selectAllFactoryArea(); + + + /** + * 获得系统内所有厂区级部门信息(2级信息) + * @return + */ + List> selectAllFactoryAreaDept(); + + + /** + * 根据厂区和类型获取厂区下普通维修工人或者所有人 + * @param type + * @param factoryAreaNumber + * @param flag 0 所有人 1维修人员2工程师 + * @return + */ + List> selecUserByType(String type, String factoryAreaNumber,String flag); + + /** + * 获得分页列表 + * + * @param conditions 分页、排序和自定义条件 + * @return 分页列表 + */ + PageResult getSenior(CustomConditions conditions); + +} 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..5529259 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dept/DeptServiceImpl.java @@ -0,0 +1,311 @@ +package com.win.module.system.service.dept; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.annotations.VisibleForTesting; +import com.win.framework.common.enums.CommonStatusEnum; +import com.win.framework.common.pojo.CustomConditions; +import com.win.framework.common.pojo.PageResult; +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.DeptPageReqVO; +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.dataobject.dept.PostDO; +import com.win.module.system.dal.dataobject.user.AdminUserDO; +import com.win.module.system.dal.mysql.dept.DeptMapper; +import com.win.module.system.dal.mysql.dept.PostMapper; +import com.win.module.system.dal.mysql.user.AdminUserMapper; +import com.win.module.system.dal.redis.RedisKeyConstants; +import com.win.module.system.enums.dept.BooleanTypeEnum; +import com.win.module.system.enums.dept.DeptIdEnum; +import com.win.module.system.enums.dept.DeptLevelEnum; +import com.win.module.system.service.permission.PermissionService; +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.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.win.module.system.enums.ErrorCodeConstants.*; + +/** + * 部门 Service 实现类 + * + * @author 闻荫源码 + */ +@Service +@Validated +@Slf4j +public class DeptServiceImpl implements DeptService { + + @Resource + private DeptMapper deptMapper; + + @Resource + private PostMapper postMapper; + + @Resource + private AdminUserMapper ddminUserMapper; + + @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 PageResult getPage(DeptPageReqVO pageReqVO) { + return deptMapper.selectPage(pageReqVO); + } + + @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()); + } + }); + } + + @Override + public List> selectAllFactoryArea() { + List> list = deptMapper.selectAllFactoryArea(); + return list; + } + + @Override + public List> selectAllFactoryAreaDept() { + List> list = deptMapper.selectAllFactoryAreaDept(); + return list; + } + +// @Override +// public List> selecUserByType(String classType, String factoryAreaNumber, String flag) { +// if (factoryAreaNumber == null || factoryAreaNumber.isEmpty()) { +// // 获得用户基本信息 +// AdminUserDO adminUserDO = ddminUserMapper.selectById(getLoginUserId()); +// // 获得部门信息 +// if (adminUserDO.getDeptId() != null) { +// factoryAreaNumber = adminUserDO.getDeptId().toString(); +// } +// } +// List> list = new ArrayList<>(); +// List codes = new ArrayList<>(); +// if ("1".equals(flag)) {//只要普通维修人员 +// if("DEVICE".equals(classType)){ +// codes = List.of("device_class_worker_role"); +// }else if("MOLD".equals(classType)){ +// codes = List.of("mold_class_worker_role"); +// }else if("TECH".equals(classType)){ +// codes = List.of("tech_class_worker_role"); +// } +// list = deptMapper.selecUserByType(codes, factoryAreaNumber); +// } else if("2".equals(flag)){//只要工程师 +// if("DEVICE".equals(classType)){ +// codes = List.of("device_class_Engineer_role"); +// }else if("MOLD".equals(classType)){ +// codes = List.of("mold_class_Engineer_role"); +// }else if("TECH".equals(classType)){ +// codes = List.of("tech_class_Engineer_role"); +// } +// list = deptMapper.selecUserByType(codes, factoryAreaNumber); +// }else{//全部 +// if("DEVICE".equals(classType)){ +// codes = Arrays.asList("device_class_Engineer_role","device_class_worker_role"); +// }else if("MOLD".equals(classType)){ +// codes = Arrays.asList("mold_class_Engineer_role","mold_class_worker_role"); +// }else if("TECH".equals(classType)){ +// codes = Arrays.asList("tech_class_Engineer_role","tech_class_worker_role"); +// } +// list = deptMapper.selecUserByType(codes, factoryAreaNumber); +// } +// return list; +// } + + @Override + public List> selecUserByType(String classType, String factoryAreaNumber, String flag) { + if (factoryAreaNumber == null || factoryAreaNumber.isEmpty()) { + // 获得用户基本信息 + AdminUserDO adminUserDO = ddminUserMapper.selectById(getLoginUserId()); + // 获得部门信息 + if (adminUserDO.getDeptId() != null) { + factoryAreaNumber = adminUserDO.getDeptId().toString(); + } + } + List> list = new ArrayList<>(); + List codes = new ArrayList<>(); + if ("1".equals(flag)) {//只要普通维修人员 + list = deptMapper.selecUserByTypeAndFactoryAreaNumber("1",classType,factoryAreaNumber); + } else if("2".equals(flag)){//只要工程师 + list = deptMapper.selecUserByTypeAndFactoryAreaNumber("2",classType,factoryAreaNumber); + }else{//全部 + list = deptMapper.selecUserByTypeAndFactoryAreaNumber("0",classType,factoryAreaNumber); + } + return list; + } + + @Override + public PageResult getSenior(CustomConditions conditions) { + return deptMapper.selectSenior(conditions); + } +} \ No newline at end of file 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..6b20727 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictDataService.java @@ -0,0 +1,114 @@ +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); + + DictDataDO selectDictLabel(String plabel); + + DictDataDO selectDictValue(String value); +} 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..714a950 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictDataServiceImpl.java @@ -0,0 +1,231 @@ +package com.win.module.system.service.dict; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.google.common.annotations.VisibleForTesting; +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.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 exception(DICT_DATA_NOT_EXIST, "字典类型" + ptype + "的数据" + plabel + "无效"); + } + }else { + throw exception(DICT_DATA_NOT_EXIST, "字典类型" + ptype + "无效"); + } + } + + @Override + public DictDataDO selectDictLabel(String plabel){ + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("label",plabel); + DictDataDO dictDataDO = dictDataMapper.selectOne(queryWrapper1); + if(dictDataDO != null && 0 == dictDataDO.getStatus()){ + return dictDataDO; + }else { + throw exception(DICT_LABLE_NOT_EXIST, "未查到字典相关标签"); + } + } + @Override + public DictDataDO selectDictValue(String value){ + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("value",value); + DictDataDO dictDataDO = dictDataMapper.selectOne(queryWrapper1); + if(dictDataDO != null && 0 == dictDataDO.getStatus()){ + return dictDataDO; + }else { + throw exception(DICT_DATA_NOT_EXIST, "未查到字典相关键值"); + } + } +} 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..a97885b --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictTypeService.java @@ -0,0 +1,89 @@ +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 org.springframework.lang.Nullable; + +import java.util.Collection; +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(); + + /** + * 获得符合字典类型组合条件的列表 + * @param types 字典类型数组。如果为空,不进行筛选 + * @return 字典类型列表详细 + */ + List getDictByTypes(@Nullable Collection types, Integer statuses); + +} 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..84f715d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/dict/DictTypeServiceImpl.java @@ -0,0 +1,156 @@ +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.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 +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(); + } + + @Override + public List getDictByTypes(Collection types,Integer statuses) { + return dictTypeMapper.selectList(types,statuses); + } + + 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..8dfa0ca --- /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..7df7918 --- /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 + @Transactional // 多数据源,使用 @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 + @Transactional + @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..f7f59d4 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/RoleService.java @@ -0,0 +1,151 @@ +package com.win.module.system.service.permission; + +import com.win.framework.common.pojo.CustomConditions; +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); + + /** + * 获得库位分页列表 + * + * @param conditions 分页、排序和自定义条件 + * @return 分页列表 + */ + PageResult getSenior(CustomConditions conditions); + +} 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..0c0e57e --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/permission/RoleServiceImpl.java @@ -0,0 +1,263 @@ +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.CustomConditions; +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()); + } + }); + } + + @Override + public PageResult getSenior(CustomConditions conditions) { + return roleMapper.selectSenior(conditions); + } + + /** + * 获得自身的代理对象,解决 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..c077796 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberService.java @@ -0,0 +1,94 @@ +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); + + + /** + * 根据编码规则生成编码 + * + * @param prefix + * @return + */ + String generateCodeByLeftCodeAndPrefix(String ruleCode,String prefix); + + + +} 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..9d63073 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/serialnumber/SerialNumberServiceImpl.java @@ -0,0 +1,183 @@ +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"))); + } + LocalDateTime midnight = null; + if(encodedRule.getPattern().toLowerCase().indexOf("d") > 0) { //包含日 + midnight = LocalDateTime.now().plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(1); + } else if(encodedRule.getPattern().toLowerCase().indexOf("m") > 0) { //包含月 + midnight = LocalDateTime.now().plusMonths(1).plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(1); + } else if(encodedRule.getPattern().toLowerCase().indexOf("y") > 0) { + midnight = LocalDateTime.now().plusYears(1).plusMonths(1).plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(1); + } + long millSeconds = midnight == null ? 0 : ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); + StringBuilder code = new StringBuilder(); + Long increment = redisCache.incr(encodedRule.getRuleCode() + pattern, millSeconds); + code.append(encodedRule.getPrefix()); + code.append(pattern); + if(encodedRule.getSeparator() != null && !encodedRule.getSeparator().isEmpty()) { + 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(); + } + + + + + @Override + public synchronized String generateCodeByLeftCodeAndPrefix(String ruleCode,String prefix) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("prefix", prefix); + queryWrapper.likeRight("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"))); + } + LocalDateTime midnight = null; + if(encodedRule.getPattern().toLowerCase().indexOf("d") > 0) { //包含日 + midnight = LocalDateTime.now().plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(1); + } else if(encodedRule.getPattern().toLowerCase().indexOf("m") > 0) { //包含月 + midnight = LocalDateTime.now().plusMonths(1).plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(1); + } else if(encodedRule.getPattern().toLowerCase().indexOf("y") > 0) { + midnight = LocalDateTime.now().plusYears(1).plusMonths(1).plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(1); + } + long millSeconds = midnight == null ? 0 : ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); + StringBuilder code = new StringBuilder(); + Long increment = redisCache.incr(encodedRule.getRuleCode() + pattern, millSeconds); + code.append(encodedRule.getPrefix()); + code.append(pattern); + if(encodedRule.getSeparator() != null && !encodedRule.getSeparator().isEmpty()) { + 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/sysconfig/SysConfigService.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sysconfig/SysConfigService.java new file mode 100644 index 0000000..97bcfc6 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sysconfig/SysConfigService.java @@ -0,0 +1,81 @@ +package com.win.module.system.service.sysconfig; + +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.sysconfig.vo.*; +import com.win.module.system.dal.dataobject.sysconfig.SysConfigDO; + +import javax.validation.Valid; +import java.util.Collection; +import java.util.List; + +/** + * 系统参数 Service 接口 + * + * @author 超级管理员 + */ +public interface SysConfigService { + + /** + * 创建系统参数 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createConfig(@Valid SysConfigCreateReqVO createReqVO); + + /** + * 更新系统参数 + * + * @param updateReqVO 更新信息 + */ + int updateConfig(@Valid SysConfigUpdateReqVO updateReqVO); + + /** + * 删除系统参数 + * + * @param id 编号 + */ + int deleteConfig(Long id); + + /** + * 获得系统参数 + * + * @param id 编号 + * @return 系统参数 + */ + SysConfigDO getConfig(Long id); + + /** + * 获得系统参数列表 + * + * @param ids 编号 + * @return 系统参数列表 + */ + List getConfigList(Collection ids); + + /** + * 获得系统参数分页 + * + * @param pageReqVO 分页查询 + * @return 系统参数分页 + */ + PageResult getConfigPage(SysConfigPageReqVO pageReqVO); + + /** + * 获得系统参数列表, 用于 Excel 导出 + * + * @param exportReqVO 查询条件 + * @return 系统参数列表 + */ + List getConfigList(SysConfigExportReqVO exportReqVO); + + /** + * 导入系统参数主信息 + * + * @param datas 导入系统参数主信息列表 + * @param mode 导入模式1更新2追加3覆盖 + * @param updatePart 是否支持更新 + * @return 导入结果 + */ + public List importSysConfigList(List datas, Integer mode, boolean updatePart); +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sysconfig/SysConfigServiceImpl.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sysconfig/SysConfigServiceImpl.java new file mode 100644 index 0000000..dd62295 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/sysconfig/SysConfigServiceImpl.java @@ -0,0 +1,94 @@ +package com.win.module.system.service.sysconfig; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.pojo.PageResult; +import com.win.module.system.controller.sysconfig.vo.*; +import com.win.module.system.convert.sysconfig.SysConfigConvert; +import com.win.module.system.dal.dataobject.sysconfig.SysConfigDO; +import com.win.module.system.dal.mysql.sysconfig.SysConfigMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.ArrayList; +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.CONFIG_IMPORT_LIST_IS_EMPTY; +import static com.win.module.system.enums.ErrorCodeConstants.CONFIG_NOT_EXISTS; + +/** + * 系统参数 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class SysConfigServiceImpl implements SysConfigService { + + @Autowired + private SysConfigMapper configMapper; + + @Override + public Long createConfig(SysConfigCreateReqVO createReqVO) { + // 插入 + SysConfigDO config = SysConfigConvert.INSTANCE.convert(createReqVO); + configMapper.insert(config); + // 返回 + return config.getId(); + } + + @Override + public int updateConfig(SysConfigUpdateReqVO updateReqVO) { + // 校验存在 + validateConfigExists(updateReqVO.getId()); + // 更新 + SysConfigDO updateObj = SysConfigConvert.INSTANCE.convert(updateReqVO); + return configMapper.updateById(updateObj); + } + + @Override + public int deleteConfig(Long id) { + // 校验存在 + validateConfigExists(id); + // 删除 + return configMapper.deleteById(id); + } + + private void validateConfigExists(Long id) { + if (configMapper.selectById(id) == null) { + throw exception(CONFIG_NOT_EXISTS); + } + } + + @Override + public SysConfigDO getConfig(Long id) { + return configMapper.selectById(id); + } + + @Override + public List getConfigList(Collection ids) { + return configMapper.selectBatchIds(ids); + } + + @Override + public PageResult getConfigPage(SysConfigPageReqVO pageReqVO) { + return configMapper.selectPage(pageReqVO); + } + + @Override + public List getConfigList(SysConfigExportReqVO exportReqVO) { + return configMapper.selectList(exportReqVO); + } + + @Override + public List importSysConfigList(List datas, Integer mode, boolean updatePart) { + if (CollUtil.isEmpty(datas)) { + throw exception(CONFIG_IMPORT_LIST_IS_EMPTY); + } + + List errorList = new ArrayList<>(); + return errorList; + } +} 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..9af049d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/tenant/TenantPackageServiceImpl.java @@ -0,0 +1,116 @@ +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.transaction.annotation.Transactional; +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 + @Transactional // 多数据源,使用 @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..e22110c --- /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 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.transaction.annotation.Transactional; +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 + @Transactional + 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 + @Transactional + 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 + @Transactional + 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..1b741d2 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/user/AdminUserService.java @@ -0,0 +1,226 @@ +package com.win.module.system.service.user; + +import cn.hutool.core.collection.CollUtil; +import com.win.framework.common.pojo.PageResult; +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.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.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 后台用户 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); + + + /** + * 根据信息查询该角色下的用户 + * + * @param code 角色标识 + * @param factoryAreaNumber 厂区 + * @return 是否匹配 + **/ + List selectByUserIdentity(List code, String factoryAreaNumber); + +} 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..4e17183 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/service/user/AdminUserServiceImpl.java @@ -0,0 +1,470 @@ +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.dataobject.user.AdminUserDOExpand; +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); + } + + + @Override + public List selectByUserIdentity(List code, String factoryAreaNumber) { + AdminUserDOExpand adminUserDOExpand = new AdminUserDOExpand(); + + if (code != null) { + adminUserDOExpand.setCode(code); + } + if (factoryAreaNumber != null) { + adminUserDOExpand.setFactoryAreaNumber(factoryAreaNumber); + } + + return userMapper.selectByUserIdentity(adminUserDOExpand); + } + + + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/Constants.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/Constants.java new file mode 100644 index 0000000..0b4bd08 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/Constants.java @@ -0,0 +1,145 @@ +package com.win.module.system.util; + +/** + * 通用常量信息 + * + * @author win + */ +public class Constants { + /** + * UTF-8 字符集 + */ + public static final String UTF8 = "UTF-8"; + + /** + * GBK 字符集 + */ + public static final String GBK = "GBK"; + + /** + * www主域 + */ + public static final String WWW = "www."; + + /** + * http请求 + */ + public static final String HTTP = "http://"; + + /** + * https请求 + */ + public static final String HTTPS = "https://"; + + /** + * 通用成功标识 + */ + public static final String SUCCESS = "0"; + + /** + * 通用失败标识 + */ + public static final String FAIL = "1"; + + /** + * 登录成功 + */ + public static final String LOGIN_SUCCESS = "Success"; + + /** + * 注销 + */ + public static final String LOGOUT = "Logout"; + + /** + * 注册 + */ + public static final String REGISTER = "Register"; + + /** + * 登录失败 + */ + public static final String LOGIN_FAIL = "Error"; + + /** + * 验证码有效期(分钟) + */ + public static final Integer CAPTCHA_EXPIRATION = 2; + + /** + * 令牌 + */ + public static final String TOKEN = "token"; + + /** + * 令牌前缀 + */ + public static final String TOKEN_PREFIX = "Bearer "; + + /** + * 令牌前缀 + */ + public static final String LOGIN_USER_KEY = "login_user_key"; + + /** + * 用户ID + */ + public static final String JWT_USERID = "userid"; + + /** + * 用户名称 + */ +// public static final String JWT_USERNAME = Claims.SUBJECT; + + /** + * 用户头像 + */ + public static final String JWT_AVATAR = "avatar"; + + /** + * 创建时间 + */ + public static final String JWT_CREATED = "created"; + + /** + * 用户权限 + */ + public static final String JWT_AUTHORITIES = "authorities"; + + /** + * 资源映射路径 前缀 + */ + public static final String RESOURCE_PREFIX = "/profile"; + + /** + * RMI 远程方法调用 + */ + public static final String LOOKUP_RMI = "rmi:"; + + /** + * LDAP 远程方法调用 + */ + public static final String LOOKUP_LDAP = "ldap:"; + + /** + * LDAPS 远程方法调用 + */ + public static final String LOOKUP_LDAPS = "ldaps:"; + + /** + * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) + */ + public static final String[] JOB_WHITELIST_STR = {"com.ruoyi"}; + + /** + * 定时任务违规的字符 + */ + public static final String[] JOB_ERROR_STR = {"java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", + "org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config"}; + + /** + * 登录用户编号 redis key + */ + public static final String LOGIN_USERID_KEY = "login_userid:"; + +} diff --git a/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/StringUtils.java b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/StringUtils.java new file mode 100644 index 0000000..ee479ba --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/java/com/win/module/system/util/StringUtils.java @@ -0,0 +1,516 @@ +package com.win.module.system.util; + +import cn.hutool.core.text.StrFormatter; +import org.springframework.util.AntPathMatcher; + +import java.util.*; + +/** + * 字符串工具类 + * + * @author win + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils { + /** + * 空字符串 + */ + private static final String NULLSTR = ""; + + /** + * 下划线 + */ + private static final char SEPARATOR = '_'; + + /** + * 获取参数不为空值 + * + * @param value defaultValue 要判断的value + * @return value 返回值 + */ + public static T nvl(T value, T defaultValue) { + return value != null ? value : defaultValue; + } + + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection coll) { + return isNull(coll) || coll.isEmpty(); + } + + /** + * * 判断一个Collection是否非空,包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Collection coll) { + return !isEmpty(coll); + } + + /** + * * 判断一个对象数组是否为空 + * + * @param objects 要判断的对象数组 + * * @return true:为空 false:非空 + */ + public static boolean isEmpty(Object[] objects) { + return isNull(objects) || (objects.length == 0); + } + + /** + * * 判断一个对象数组是否非空 + * + * @param objects 要判断的对象数组 + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Object[] objects) { + return !isEmpty(objects); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Map map) { + return isNull(map) || map.isEmpty(); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Map map) { + return !isEmpty(map); + } + + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) { + return isNull(str) || NULLSTR.equals(str.trim()); + } + + /** + * * 判断一个字符串是否为非空串 + * + * @param str String + * @return true:非空串 false:空串 + */ + public static boolean isNotEmpty(String str) { + return !isEmpty(str); + } + + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) { + return object == null; + } + + /** + * * 判断一个对象是否非空 + * + * @param object Object + * @return true:非空 false:空 + */ + public static boolean isNotNull(Object object) { + return !isNull(object); + } + + /** + * * 判断一个对象是否是数组类型(Java基本型别的数组) + * + * @param object 对象 + * @return true:是数组 false:不是数组 + */ + public static boolean isArray(Object object) { + return isNotNull(object) && object.getClass().isArray(); + } + + /** + * 去空格 + */ + public static String trim(String str) { + return (str == null ? "" : str.trim()); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @return 结果 + */ + public static String substring(final String str, int start) { + if (str == null) { + return NULLSTR; + } + + if (start < 0) { + start = str.length() + start; + } + + if (start < 0) { + start = 0; + } + if (start > str.length()) { + return NULLSTR; + } + + return str.substring(start); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @param end 结束 + * @return 结果 + */ + public static String substring(final String str, int start, int end) { + if (str == null) { + return NULLSTR; + } + + if (end < 0) { + end = str.length() + end; + } + if (start < 0) { + start = str.length() + start; + } + + if (end > str.length()) { + end = str.length(); + } + + if (start > end) { + return NULLSTR; + } + + if (start < 0) { + start = 0; + } + if (end < 0) { + end = 0; + } + + return str.substring(start, end); + } + + /** + * 格式化文本, {} 表示占位符
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param params 参数值 + * @return 格式化后的文本 + */ + public static String format(String template, Object... params) { + if (isEmpty(params) || isEmpty(template)) { + return template; + } + return StrFormatter.format(template, params); + } + + /** + * 是否为http(s)://开头 + * + * @param link 链接 + * @return 结果 + */ + public static boolean ishttp(String link) { + return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS); + } + + /** + * 字符串转set + * + * @param str 字符串 + * @param sep 分隔符 + * @return set集合 + */ + public static final Set str2Set(String str, String sep) { + return new HashSet(str2List(str, sep, true, false)); + } + + /** + * 字符串转list + * + * @param str 字符串 + * @param sep 分隔符 + * @param filterBlank 过滤纯空白 + * @param trim 去掉首尾空白 + * @return list集合 + */ + public static final List str2List(String str, String sep, boolean filterBlank, boolean trim) { + List list = new ArrayList(); + if (StringUtils.isEmpty(str)) { + return list; + } + + // 过滤空白字符串 + if (filterBlank && StringUtils.isBlank(str)) { + return list; + } + String[] split = str.split(sep); + for (String string : split) { + if (filterBlank && StringUtils.isBlank(string)) { + continue; + } + if (trim) { + string = string.trim(); + } + list.add(string); + } + + return list; + } + + /** + * 判断给定的set列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value + * + * @param array 给定的数组 + * @return boolean 结果 + */ + public static boolean containsAny(Collection collection, String... array) { + if (isEmpty(collection) || isEmpty(array)) { + return false; + } else { + for (String str : array) { + if (collection.contains(str)) { + return true; + } + } + return false; + } + } + + /** + * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 + * + * @param cs 指定字符串 + * @param searchCharSequences 需要检查的字符串数组 + * @return 是否包含任意一个字符串 + */ + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) { + if (isEmpty(cs) || isEmpty(searchCharSequences)) { + return false; + } + for (CharSequence testStr : searchCharSequences) { + if (containsIgnoreCase(cs, testStr)) { + return true; + } + } + return false; + } + + /** + * 驼峰转下划线命名 + */ + public static String toUnderScoreCase(String str) { + if (str == null) { + return null; + } + StringBuilder sb = new StringBuilder(); + // 前置字符是否大写 + boolean preCharIsUpperCase = true; + // 当前字符是否大写 + boolean curreCharIsUpperCase = true; + // 下一字符是否大写 + boolean nexteCharIsUpperCase = true; + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + if (i > 0) { + preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); + } else { + preCharIsUpperCase = false; + } + + curreCharIsUpperCase = Character.isUpperCase(c); + + if (i < (str.length() - 1)) { + nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); + } + + if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) { + sb.append(SEPARATOR); + } else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) { + sb.append(SEPARATOR); + } + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 是否包含字符串 + * + * @param str 验证字符串 + * @param strs 字符串组 + * @return 包含返回true + */ + public static boolean inStringIgnoreCase(String str, String... strs) { + if (str != null && strs != null) { + for (String s : strs) { + if (str.equalsIgnoreCase(trim(s))) { + return true; + } + } + } + return false; + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) { + // 没必要转换 + return ""; + } else if (!name.contains("_")) { + // 不含下划线,仅将首字母大写 + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + // 用下划线将原始字符串分割 + String[] camels = name.split("_"); + for (String camel : camels) { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) { + continue; + } + // 首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + + /** + * 驼峰式命名法 例如:user_name->userName + */ + public static String toCamelCase(String s) { + if (s == null) { + return null; + } + s = s.toLowerCase(); + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + + if (c == SEPARATOR) { + upperCase = true; + } else if (upperCase) { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } else { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) { + if (isEmpty(str) || isEmpty(strs)) { + return false; + } + for (String pattern : strs) { + if (isMatch(pattern, str)) { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } + + @SuppressWarnings("unchecked") + public static T cast(Object obj) { + return (T) obj; + } + + /** + * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 + * + * @param num 数字对象 + * @param size 字符串指定长度 + * @return 返回数字的字符串格式,该字符串为指定长度。 + */ + public static final String padl(final Number num, final int size) { + return padl(num.toString(), size, '0'); + } + + /** + * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 + * + * @param s 原始字符串 + * @param size 字符串指定长度 + * @param c 用于补齐的字符 + * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 + */ + public static final String padl(final String s, final int size, final char c) { + final StringBuilder sb = new StringBuilder(size); + if (s != null) { + final int len = s.length(); + if (s.length() <= size) { + for (int i = size - len; i > 0; i--) { + sb.append(c); + } + sb.append(s); + } else { + return s.substring(len - size, len); + } + } else { + for (int i = size; i > 0; i--) { + sb.append(c); + } + } + return sb.toString(); + } +} \ No newline at end of file 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/main/resources/mapper/dept/DeptMapper.xml b/win-module-system/win-module-system-biz/src/main/resources/mapper/dept/DeptMapper.xml new file mode 100644 index 0000000..ab76f4d --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/resources/mapper/dept/DeptMapper.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + diff --git a/win-module-system/win-module-system-biz/src/main/resources/mapper/dept/sysconfig/SysConfigMapper.xml b/win-module-system/win-module-system-biz/src/main/resources/mapper/dept/sysconfig/SysConfigMapper.xml new file mode 100644 index 0000000..37855fc --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/resources/mapper/dept/sysconfig/SysConfigMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/win-module-system/win-module-system-biz/src/main/resources/mapper/user/UserMapper.xml b/win-module-system/win-module-system-biz/src/main/resources/mapper/user/UserMapper.xml new file mode 100644 index 0000000..1ff1605 --- /dev/null +++ b/win-module-system/win-module-system-biz/src/main/resources/mapper/user/UserMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + 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/pom.xml b/win-server/pom.xml new file mode 100644 index 0000000..201d3ee --- /dev/null +++ b/win-server/pom.xml @@ -0,0 +1,104 @@ + + + + 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-eam-biz + ${revision} + + + + 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..2c0df86 --- /dev/null +++ b/win-server/src/main/resources/application-dev.yaml @@ -0,0 +1,201 @@ +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/tianhe_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: tianhe + password: Microsoft@2023 + # 读数据源 + slave0: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://dev.ccwin-in.com:23113/tianhe_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: tianhe + password: Microsoft@2023 + # 读数据源 + slave1: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://dev.ccwin-in.com:23113/tianhe_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: tianhe + password: Microsoft@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} + sql-server-one: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + url: jdbc:sqlserver://192.168.11.3:1433;SelectMethod=Cursor;DatabaseName=FWQCJ_WMS_NEWTEST;trustServerCertificate=true + username: sa + password: Microsoft@2022 + sql-server-all: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver + url: jdbc:sqlserver://192.168.11.3:1433;SelectMethod=Cursor;DatabaseName=MES2.0_QCJTEST;trustServerCertificate=true + username: sa + password: Microsoft@2022 + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: dev.ccwin-in.com # 地址 + port: 23114 # 端口 + database: 10 # 数据库索引 +# 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 + +--- #################### 闻荫相关配置 #################### + +# 闻荫配置项,设置当前项目所有自定义的配置 +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 前缀 + url: + base-url: http://192.168.11.3:8008/ExchangeCenterService.asmx/ + uniapp-url: https://fc-mp-85da41a4-57f6-45be-b9f7-35d0f8aa6aa7.next.bspapp.com/test 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-local.yaml b/win-server/src/main/resources/application-local.yaml new file mode 100644 index 0000000..b7e3bb2 --- /dev/null +++ b/win-server/src/main/resources/application-local.yaml @@ -0,0 +1,206 @@ +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_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 +# username: learun +# password: Microdoft@2021 + url: jdbc:mysql://localhost:3306/sfms1218?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 123456 + # 读数据源 + slave0: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver +# url: jdbc:mysql://dev.ccwin-in.com:23113/sfms_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 +# username: learun +# password: Microdoft@2021 + url: jdbc:mysql://localhost:3306/sfms1218?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 123456 + # 读数据源 + slave1: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver +# url: jdbc:mysql://dev.ccwin-in.com:23113/sfms_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 +# username: learun +# password: Microdoft@2021 + url: jdbc:mysql://localhost:3306/sfms1218?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 123456 + # 读写分离类型,如: 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: localhost # 地址 + port: 6379 # 端口 + 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: 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-prod.yaml b/win-server/src/main/resources/application-prod.yaml new file mode 100644 index 0000000..6efad9d --- /dev/null +++ b/win-server/src/main/resources/application-prod.yaml @@ -0,0 +1,187 @@ +server: + port: 90 + +--- #################### 数据库相关配置 #################### + +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://10.62.141.81:3306/sfms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: Microsoft@2021 + # 读数据源 + slave0: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://10.62.141.81:3306/sfms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: Microsoft@2021 + # 读数据源 + slave1: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://10.62.141.81:3306/sfms?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: Microsoft@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 + # 分片算法配置 + 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: 10.62.141.81 # 地址 + port: 6379 # 端口 + database: 0 # 数据库索引 + password: Microsoft@2021 # 密码,建议生产环境开启 + +--- #################### 定时任务相关配置 #################### + +# 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 + +--- #################### 闻荫相关配置 #################### + +# 闻荫配置项,设置当前项目所有自定义的配置 +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 前缀 + url: + uniapp-url: https://fc-mp-85da41a4-57f6-45be-b9f7-35d0f8aa6aa7.next.bspapp.com/test \ 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..48655aa --- /dev/null +++ b/win-server/src/main/resources/application-test.yaml @@ -0,0 +1,186 @@ +server: + port: 25210 + +--- #################### 数据库相关配置 #################### + +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/eam?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: eam + password: Microsoft@2023 + # 读数据源 + slave0: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://dev.ccwin-in.com:23113/eam?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: eam + password: Microsoft@2023 + # 读数据源 + slave1: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://dev.ccwin-in.com:23113/eam?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: eam + password: Microsoft@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: 11 # 数据库索引 +# 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 + +--- #################### 闻荫相关配置 #################### +# 闻荫配置项,设置当前项目所有自定义的配置 +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 前缀 + url: + uniapp-url: https://fc-mp-85da41a4-57f6-45be-b9f7-35d0f8aa6aa7.next.bspapp.com/test \ 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..998908f --- /dev/null +++ b/win-server/src/main/resources/application.yaml @@ -0,0 +1,274 @@ +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: 50MB # 单个文件大小 + max-request-size: 200MB # 设置总上传的文件大小 + 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:25210/ # Admin 管理后台 UI 的地址eam + profile: /opt/profile/eam + 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: true # 是否开启 Redis stream 集群消费,默认为 true。这里设置成 false,可以按需开启 + tenant: # 多租户相关配置项 + enable: false + 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 和租户无关 + - /admin-api/profile/* # 静态资源 和租户无关 + - /admin-api/eam/board/* # 看板 + 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 目录下的静态资源 + file: + path: /users/longlongxiaogege/work/fuweishijing/doc +debug: false + +#积木报表配置 +minidao : + base-package: org.jeecg.modules.jmreport.desreport.dao* + db-type: mysql +#jeecg专用配置 +jeecg: + jmreport: + pageSize: + - 20 + - 50 + - 100 + - 200 + - 500 +# 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 #自动导入模块 + + 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..52957b7 --- /dev/null +++ b/win-server/src/main/resources/logback-spring.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + debug + + + ${CONSOLE_LOG_PATTERN} + + UTF-8 + + + + + + ${log.path}/sys-debug.log + + + + ${log.path}/sys-debug.%d{yyyy-MM-dd}.log + + 7 + + + ${log.pattern} + + + + DEBUG + + ACCEPT + + DENY + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 7 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + + ${log.path}/sys-warn.log + + + + ${log.path}/sys-warn.%d{yyyy-MM-dd}.log + + 7 + + + ${log.pattern} + + + + WARN + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 7 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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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