gitextract_j9akw6z5/ ├── .gitee/ │ └── ISSUE_TEMPLATE.zh-CN.md ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ └── question.md │ └── workflows/ │ └── maven.yml ├── .gitignore ├── LICENSE ├── README.md ├── lombok.config ├── pom.xml ├── script/ │ ├── docker/ │ │ └── docker-compose.yml │ └── idea/ │ └── http-client.env.json ├── sql/ │ ├── db2/ │ │ └── README.md │ ├── dm/ │ │ ├── flowable-patch/ │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ ├── liquibase/ │ │ │ │ │ ├── database/ │ │ │ │ │ │ └── core/ │ │ │ │ │ │ └── DmDatabase.java │ │ │ │ │ └── datatype/ │ │ │ │ │ └── core/ │ │ │ │ │ └── BooleanType.java │ │ │ │ └── org/ │ │ │ │ └── flowable/ │ │ │ │ └── common/ │ │ │ │ └── engine/ │ │ │ │ └── impl/ │ │ │ │ └── AbstractEngineConfiguration.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ ├── package-info.md │ │ │ └── services/ │ │ │ └── liquibase.database.Database │ │ ├── quartz.sql │ │ └── ruoyi-vue-pro-dm8.sql │ ├── kingbase/ │ │ ├── quartz.sql │ │ └── ruoyi-vue-pro.sql │ ├── mysql/ │ │ ├── quartz.sql │ │ └── ruoyi-vue-pro.sql │ ├── opengauss/ │ │ ├── quartz.sql │ │ └── ruoyi-vue-pro.sql │ ├── oracle/ │ │ ├── quartz.sql │ │ └── ruoyi-vue-pro.sql │ ├── postgresql/ │ │ ├── quartz.sql │ │ └── ruoyi-vue-pro.sql │ ├── sqlserver/ │ │ ├── quartz.sql │ │ └── ruoyi-vue-pro.sql │ └── tools/ │ ├── .gitignore │ ├── README.md │ ├── convertor.py │ ├── docker-compose.yaml │ ├── oracle/ │ │ ├── 1_create_user.sql │ │ └── 2_create_schema.sh │ └── sqlserver/ │ └── create_schema.sh ├── yudao-dependencies/ │ └── pom.xml ├── yudao-framework/ │ ├── pom.xml │ ├── yudao-common/ │ │ ├── pom.xml │ │ ├── src/ │ │ │ ├── main/ │ │ │ │ └── java/ │ │ │ │ ├── cn/ │ │ │ │ │ └── iocoder/ │ │ │ │ │ └── yudao/ │ │ │ │ │ └── framework/ │ │ │ │ │ └── common/ │ │ │ │ │ ├── biz/ │ │ │ │ │ │ ├── infra/ │ │ │ │ │ │ │ ├── logger/ │ │ │ │ │ │ │ │ ├── ApiAccessLogCommonApi.java │ │ │ │ │ │ │ │ ├── ApiErrorLogCommonApi.java │ │ │ │ │ │ │ │ └── dto/ │ │ │ │ │ │ │ │ ├── ApiAccessLogCreateReqDTO.java │ │ │ │ │ │ │ │ └── ApiErrorLogCreateReqDTO.java │ │ │ │ │ │ │ └── package-info.java │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ └── system/ │ │ │ │ │ │ ├── dict/ │ │ │ │ │ │ │ ├── DictDataCommonApi.java │ │ │ │ │ │ │ └── dto/ │ │ │ │ │ │ │ └── DictDataRespDTO.java │ │ │ │ │ │ ├── logger/ │ │ │ │ │ │ │ ├── OperateLogCommonApi.java │ │ │ │ │ │ │ └── dto/ │ │ │ │ │ │ │ └── OperateLogCreateReqDTO.java │ │ │ │ │ │ ├── oauth2/ │ │ │ │ │ │ │ ├── OAuth2TokenCommonApi.java │ │ │ │ │ │ │ └── dto/ │ │ │ │ │ │ │ ├── OAuth2AccessTokenCheckRespDTO.java │ │ │ │ │ │ │ ├── OAuth2AccessTokenCreateReqDTO.java │ │ │ │ │ │ │ └── OAuth2AccessTokenRespDTO.java │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ ├── permission/ │ │ │ │ │ │ │ ├── PermissionCommonApi.java │ │ │ │ │ │ │ └── dto/ │ │ │ │ │ │ │ └── DeptDataPermissionRespDTO.java │ │ │ │ │ │ └── tenant/ │ │ │ │ │ │ └── TenantCommonApi.java │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── ArrayValuable.java │ │ │ │ │ │ └── KeyValue.java │ │ │ │ │ ├── enums/ │ │ │ │ │ │ ├── CommonStatusEnum.java │ │ │ │ │ │ ├── DateIntervalEnum.java │ │ │ │ │ │ ├── DocumentEnum.java │ │ │ │ │ │ ├── RpcConstants.java │ │ │ │ │ │ ├── TerminalEnum.java │ │ │ │ │ │ ├── UserTypeEnum.java │ │ │ │ │ │ └── WebFilterOrderEnum.java │ │ │ │ │ ├── exception/ │ │ │ │ │ │ ├── ErrorCode.java │ │ │ │ │ │ ├── ServerException.java │ │ │ │ │ │ ├── ServiceException.java │ │ │ │ │ │ ├── enums/ │ │ │ │ │ │ │ ├── GlobalErrorCodeConstants.java │ │ │ │ │ │ │ └── ServiceErrorCodeRange.java │ │ │ │ │ │ └── util/ │ │ │ │ │ │ └── ServiceExceptionUtil.java │ │ │ │ │ ├── package-info.java │ │ │ │ │ ├── pojo/ │ │ │ │ │ │ ├── CommonResult.java │ │ │ │ │ │ ├── PageParam.java │ │ │ │ │ │ ├── PageResult.java │ │ │ │ │ │ ├── SortablePageParam.java │ │ │ │ │ │ └── SortingField.java │ │ │ │ │ ├── util/ │ │ │ │ │ │ ├── cache/ │ │ │ │ │ │ │ └── CacheUtils.java │ │ │ │ │ │ ├── collection/ │ │ │ │ │ │ │ ├── ArrayUtils.java │ │ │ │ │ │ │ ├── CollectionUtils.java │ │ │ │ │ │ │ ├── MapUtils.java │ │ │ │ │ │ │ └── SetUtils.java │ │ │ │ │ │ ├── date/ │ │ │ │ │ │ │ ├── DateUtils.java │ │ │ │ │ │ │ └── LocalDateTimeUtils.java │ │ │ │ │ │ ├── http/ │ │ │ │ │ │ │ └── HttpUtils.java │ │ │ │ │ │ ├── io/ │ │ │ │ │ │ │ ├── FileUtils.java │ │ │ │ │ │ │ └── IoUtils.java │ │ │ │ │ │ ├── json/ │ │ │ │ │ │ │ ├── JsonUtils.java │ │ │ │ │ │ │ └── databind/ │ │ │ │ │ │ │ ├── NumberSerializer.java │ │ │ │ │ │ │ ├── TimestampLocalDateTimeDeserializer.java │ │ │ │ │ │ │ └── TimestampLocalDateTimeSerializer.java │ │ │ │ │ │ ├── monitor/ │ │ │ │ │ │ │ └── TracerUtils.java │ │ │ │ │ │ ├── number/ │ │ │ │ │ │ │ ├── MoneyUtils.java │ │ │ │ │ │ │ └── NumberUtils.java │ │ │ │ │ │ ├── object/ │ │ │ │ │ │ │ ├── BeanUtils.java │ │ │ │ │ │ │ ├── ObjectUtils.java │ │ │ │ │ │ │ └── PageUtils.java │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ ├── servlet/ │ │ │ │ │ │ │ └── ServletUtils.java │ │ │ │ │ │ ├── spring/ │ │ │ │ │ │ │ ├── SpringExpressionUtils.java │ │ │ │ │ │ │ └── SpringUtils.java │ │ │ │ │ │ ├── string/ │ │ │ │ │ │ │ └── StrUtils.java │ │ │ │ │ │ └── validation/ │ │ │ │ │ │ └── ValidationUtils.java │ │ │ │ │ └── validation/ │ │ │ │ │ ├── InEnum.java │ │ │ │ │ ├── InEnumCollectionValidator.java │ │ │ │ │ ├── InEnumValidator.java │ │ │ │ │ ├── Mobile.java │ │ │ │ │ ├── MobileValidator.java │ │ │ │ │ ├── Telephone.java │ │ │ │ │ ├── TelephoneValidator.java │ │ │ │ │ └── package-info.java │ │ │ │ └── com/ │ │ │ │ └── fhs/ │ │ │ │ └── trans/ │ │ │ │ └── service/ │ │ │ │ └── AutoTransable.java │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── framework/ │ │ │ └── common/ │ │ │ └── util/ │ │ │ └── collection/ │ │ │ └── CollectionUtilsTest.java │ │ └── 《芋道 Spring Boot 参数校验 Validation 入门》.md │ ├── yudao-spring-boot-starter-biz-data-permission/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── iocoder/ │ │ │ │ └── yudao/ │ │ │ │ └── framework/ │ │ │ │ └── datapermission/ │ │ │ │ ├── config/ │ │ │ │ │ ├── YudaoDataPermissionAutoConfiguration.java │ │ │ │ │ ├── YudaoDataPermissionRpcAutoConfiguration.java │ │ │ │ │ └── YudaoDeptDataPermissionAutoConfiguration.java │ │ │ │ ├── core/ │ │ │ │ │ ├── annotation/ │ │ │ │ │ │ └── DataPermission.java │ │ │ │ │ ├── aop/ │ │ │ │ │ │ ├── DataPermissionAnnotationAdvisor.java │ │ │ │ │ │ ├── DataPermissionAnnotationInterceptor.java │ │ │ │ │ │ └── DataPermissionContextHolder.java │ │ │ │ │ ├── db/ │ │ │ │ │ │ └── DataPermissionRuleHandler.java │ │ │ │ │ ├── rpc/ │ │ │ │ │ │ ├── DataPermissionRequestInterceptor.java │ │ │ │ │ │ └── DataPermissionRpcWebFilter.java │ │ │ │ │ ├── rule/ │ │ │ │ │ │ ├── DataPermissionRule.java │ │ │ │ │ │ ├── DataPermissionRuleFactory.java │ │ │ │ │ │ ├── DataPermissionRuleFactoryImpl.java │ │ │ │ │ │ └── dept/ │ │ │ │ │ │ ├── DeptDataPermissionRule.java │ │ │ │ │ │ ├── DeptDataPermissionRuleCustomizer.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── util/ │ │ │ │ │ └── DataPermissionUtils.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── framework/ │ │ └── datapermission/ │ │ └── core/ │ │ ├── aop/ │ │ │ ├── DataPermissionAnnotationInterceptorTest.java │ │ │ └── DataPermissionContextHolderTest.java │ │ ├── db/ │ │ │ └── DataPermissionRuleHandlerTest.java │ │ ├── rule/ │ │ │ ├── DataPermissionRuleFactoryImplTest.java │ │ │ └── dept/ │ │ │ └── DeptDataPermissionRuleTest.java │ │ └── util/ │ │ └── DataPermissionUtilsTest.java │ ├── yudao-spring-boot-starter-biz-ip/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── iocoder/ │ │ │ │ └── yudao/ │ │ │ │ └── framework/ │ │ │ │ └── ip/ │ │ │ │ ├── core/ │ │ │ │ │ ├── Area.java │ │ │ │ │ ├── enums/ │ │ │ │ │ │ └── AreaTypeEnum.java │ │ │ │ │ └── utils/ │ │ │ │ │ ├── AreaUtils.java │ │ │ │ │ └── IPUtils.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ ├── area.csv │ │ │ └── ip2region.xdb │ │ └── test/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── framework/ │ │ └── ip/ │ │ └── core/ │ │ └── utils/ │ │ ├── AreaUtilsTest.java │ │ └── IPUtilsTest.java │ ├── yudao-spring-boot-starter-biz-tenant/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ ├── cn/ │ │ │ │ └── iocoder/ │ │ │ │ └── yudao/ │ │ │ │ └── framework/ │ │ │ │ └── tenant/ │ │ │ │ ├── config/ │ │ │ │ │ ├── TenantProperties.java │ │ │ │ │ ├── YudaoTenantAutoConfiguration.java │ │ │ │ │ └── YudaoTenantRpcAutoConfiguration.java │ │ │ │ ├── core/ │ │ │ │ │ ├── aop/ │ │ │ │ │ │ ├── TenantIgnore.java │ │ │ │ │ │ └── TenantIgnoreAspect.java │ │ │ │ │ ├── context/ │ │ │ │ │ │ └── TenantContextHolder.java │ │ │ │ │ ├── db/ │ │ │ │ │ │ ├── TenantBaseDO.java │ │ │ │ │ │ └── TenantDatabaseInterceptor.java │ │ │ │ │ ├── job/ │ │ │ │ │ │ ├── TenantJob.java │ │ │ │ │ │ └── TenantJobAspect.java │ │ │ │ │ ├── mq/ │ │ │ │ │ │ ├── kafka/ │ │ │ │ │ │ │ ├── TenantKafkaEnvironmentPostProcessor.java │ │ │ │ │ │ │ └── TenantKafkaProducerInterceptor.java │ │ │ │ │ │ ├── rabbitmq/ │ │ │ │ │ │ │ ├── TenantRabbitMQInitializer.java │ │ │ │ │ │ │ └── TenantRabbitMQMessagePostProcessor.java │ │ │ │ │ │ ├── redis/ │ │ │ │ │ │ │ └── TenantRedisMessageInterceptor.java │ │ │ │ │ │ └── rocketmq/ │ │ │ │ │ │ ├── TenantRocketMQConsumeMessageHook.java │ │ │ │ │ │ ├── TenantRocketMQInitializer.java │ │ │ │ │ │ └── TenantRocketMQSendMessageHook.java │ │ │ │ │ ├── redis/ │ │ │ │ │ │ └── TenantRedisCacheManager.java │ │ │ │ │ ├── rpc/ │ │ │ │ │ │ └── TenantRequestInterceptor.java │ │ │ │ │ ├── security/ │ │ │ │ │ │ └── TenantSecurityWebFilter.java │ │ │ │ │ ├── service/ │ │ │ │ │ │ ├── TenantFrameworkService.java │ │ │ │ │ │ └── TenantFrameworkServiceImpl.java │ │ │ │ │ ├── util/ │ │ │ │ │ │ └── TenantUtils.java │ │ │ │ │ └── web/ │ │ │ │ │ ├── TenantContextWebFilter.java │ │ │ │ │ └── TenantVisitContextInterceptor.java │ │ │ │ └── package-info.java │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── messaging/ │ │ │ └── handler/ │ │ │ └── invocation/ │ │ │ └── InvocableHandlerMethod.java │ │ └── resources/ │ │ └── META-INF/ │ │ ├── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── spring.factories │ ├── yudao-spring-boot-starter-env/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── framework/ │ │ │ └── env/ │ │ │ ├── config/ │ │ │ │ ├── EnvEnvironmentPostProcessor.java │ │ │ │ ├── EnvProperties.java │ │ │ │ ├── YudaoEnvRpcAutoConfiguration.java │ │ │ │ └── YudaoEnvWebAutoConfiguration.java │ │ │ ├── core/ │ │ │ │ ├── context/ │ │ │ │ │ └── EnvContextHolder.java │ │ │ │ ├── fegin/ │ │ │ │ │ ├── EnvLoadBalancerClient.java │ │ │ │ │ ├── EnvLoadBalancerClientFactory.java │ │ │ │ │ └── EnvRequestInterceptor.java │ │ │ │ ├── package-info.java │ │ │ │ ├── util/ │ │ │ │ │ └── EnvUtils.java │ │ │ │ └── web/ │ │ │ │ └── EnvWebFilter.java │ │ │ └── package-info.java │ │ └── resources/ │ │ └── META-INF/ │ │ ├── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── spring.factories │ ├── yudao-spring-boot-starter-excel/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── iocoder/ │ │ │ │ └── yudao/ │ │ │ │ └── framework/ │ │ │ │ ├── dict/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── YudaoDictAutoConfiguration.java │ │ │ │ │ │ └── YudaoDictRpcAutoConfiguration.java │ │ │ │ │ ├── core/ │ │ │ │ │ │ └── DictFrameworkUtils.java │ │ │ │ │ ├── package-info.java │ │ │ │ │ └── validation/ │ │ │ │ │ ├── InDict.java │ │ │ │ │ ├── InDictCollectionValidator.java │ │ │ │ │ └── InDictValidator.java │ │ │ │ └── excel/ │ │ │ │ ├── core/ │ │ │ │ │ ├── annotations/ │ │ │ │ │ │ ├── DictFormat.java │ │ │ │ │ │ └── ExcelColumnSelect.java │ │ │ │ │ ├── convert/ │ │ │ │ │ │ ├── AreaConvert.java │ │ │ │ │ │ ├── DictConvert.java │ │ │ │ │ │ ├── JsonConvert.java │ │ │ │ │ │ └── MoneyConvert.java │ │ │ │ │ ├── function/ │ │ │ │ │ │ └── ExcelColumnSelectFunction.java │ │ │ │ │ ├── handler/ │ │ │ │ │ │ ├── ColumnWidthMatchStyleStrategy.java │ │ │ │ │ │ └── SelectSheetWriteHandler.java │ │ │ │ │ └── util/ │ │ │ │ │ └── ExcelUtils.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── framework/ │ │ └── dict/ │ │ └── core/ │ │ └── util/ │ │ └── DictFrameworkUtilsTest.java │ ├── yudao-spring-boot-starter-job/ │ │ ├── pom.xml │ │ ├── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── iocoder/ │ │ │ │ └── yudao/ │ │ │ │ └── framework/ │ │ │ │ └── quartz/ │ │ │ │ ├── config/ │ │ │ │ │ ├── XxlJobProperties.java │ │ │ │ │ ├── YudaoAsyncAutoConfiguration.java │ │ │ │ │ └── YudaoXxlJobAutoConfiguration.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ ├── 《芋道 Spring Boot 定时任务入门》.md │ │ └── 《芋道 Spring Boot 异步任务入门》.md │ ├── yudao-spring-boot-starter-monitor/ │ │ ├── pom.xml │ │ ├── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── iocoder/ │ │ │ │ └── yudao/ │ │ │ │ └── framework/ │ │ │ │ └── tracer/ │ │ │ │ ├── config/ │ │ │ │ │ ├── TracerProperties.java │ │ │ │ │ ├── YudaoMetricsAutoConfiguration.java │ │ │ │ │ └── YudaoTracerAutoConfiguration.java │ │ │ │ ├── core/ │ │ │ │ │ ├── annotation/ │ │ │ │ │ │ └── BizTrace.java │ │ │ │ │ ├── aop/ │ │ │ │ │ │ └── BizTraceAspect.java │ │ │ │ │ ├── filter/ │ │ │ │ │ │ └── TraceFilter.java │ │ │ │ │ └── util/ │ │ │ │ │ └── TracerFrameworkUtils.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ ├── 《芋道 Spring Boot 监控工具 Admin 入门》.md │ │ ├── 《芋道 Spring Boot 监控端点 Actuator 入门》.md │ │ └── 《芋道 Spring Boot 链路追踪 SkyWalking 入门》.md │ ├── yudao-spring-boot-starter-mq/ │ │ ├── pom.xml │ │ ├── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── iocoder/ │ │ │ │ └── yudao/ │ │ │ │ └── framework/ │ │ │ │ └── mq/ │ │ │ │ ├── package-info.java │ │ │ │ ├── rabbitmq/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── YudaoRabbitMQAutoConfiguration.java │ │ │ │ │ ├── core/ │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── package-info.java │ │ │ │ └── redis/ │ │ │ │ ├── config/ │ │ │ │ │ ├── YudaoRedisMQConsumerAutoConfiguration.java │ │ │ │ │ └── YudaoRedisMQProducerAutoConfiguration.java │ │ │ │ ├── core/ │ │ │ │ │ ├── RedisMQTemplate.java │ │ │ │ │ ├── interceptor/ │ │ │ │ │ │ └── RedisMessageInterceptor.java │ │ │ │ │ ├── job/ │ │ │ │ │ │ ├── RedisPendingMessageResendJob.java │ │ │ │ │ │ └── RedisStreamMessageCleanupJob.java │ │ │ │ │ ├── message/ │ │ │ │ │ │ └── AbstractRedisMessage.java │ │ │ │ │ ├── pubsub/ │ │ │ │ │ │ ├── AbstractRedisChannelMessage.java │ │ │ │ │ │ └── AbstractRedisChannelMessageListener.java │ │ │ │ │ └── stream/ │ │ │ │ │ ├── AbstractRedisStreamMessage.java │ │ │ │ │ └── AbstractRedisStreamMessageListener.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ ├── 《芋道 Spring Boot 事件机制 Event 入门》.md │ │ ├── 《芋道 Spring Boot 消息队列 Kafka 入门》.md │ │ ├── 《芋道 Spring Boot 消息队列 RabbitMQ 入门》.md │ │ └── 《芋道 Spring Boot 消息队列 RocketMQ 入门》.md │ ├── yudao-spring-boot-starter-mybatis/ │ │ ├── pom.xml │ │ ├── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── iocoder/ │ │ │ │ └── yudao/ │ │ │ │ └── framework/ │ │ │ │ ├── datasource/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── YudaoDataSourceAutoConfiguration.java │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── enums/ │ │ │ │ │ │ │ └── DataSourceEnum.java │ │ │ │ │ │ └── filter/ │ │ │ │ │ │ └── DruidAdRemoveFilter.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── mybatis/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── IdTypeEnvironmentPostProcessor.java │ │ │ │ │ │ └── YudaoMybatisAutoConfiguration.java │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── dataobject/ │ │ │ │ │ │ │ └── BaseDO.java │ │ │ │ │ │ ├── enums/ │ │ │ │ │ │ │ └── DbTypeEnum.java │ │ │ │ │ │ ├── handler/ │ │ │ │ │ │ │ └── DefaultDBFieldHandler.java │ │ │ │ │ │ ├── mapper/ │ │ │ │ │ │ │ └── BaseMapperX.java │ │ │ │ │ │ ├── query/ │ │ │ │ │ │ │ ├── LambdaQueryWrapperX.java │ │ │ │ │ │ │ ├── MPJLambdaWrapperX.java │ │ │ │ │ │ │ └── QueryWrapperX.java │ │ │ │ │ │ ├── type/ │ │ │ │ │ │ │ ├── EncryptTypeHandler.java │ │ │ │ │ │ │ ├── IntegerListTypeHandler.java │ │ │ │ │ │ │ ├── LongListTypeHandler.java │ │ │ │ │ │ │ ├── LongSetTypeHandler.java │ │ │ │ │ │ │ └── StringListTypeHandler.java │ │ │ │ │ │ └── util/ │ │ │ │ │ │ ├── JdbcUtils.java │ │ │ │ │ │ └── MyBatisUtils.java │ │ │ │ │ └── package-info.java │ │ │ │ └── translate/ │ │ │ │ ├── config/ │ │ │ │ │ └── YudaoTranslateAutoConfiguration.java │ │ │ │ ├── core/ │ │ │ │ │ └── TranslateUtils.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ ├── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── spring.factories │ │ ├── 《芋道 Spring Boot MyBatis 入门》.md │ │ ├── 《芋道 Spring Boot 多数据源(读写分离)入门》.md │ │ └── 《芋道 Spring Boot 数据库连接池入门》.md │ ├── yudao-spring-boot-starter-protection/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── iocoder/ │ │ │ │ └── yudao/ │ │ │ │ └── framework/ │ │ │ │ ├── idempotent/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── YudaoIdempotentConfiguration.java │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── annotation/ │ │ │ │ │ │ │ └── Idempotent.java │ │ │ │ │ │ ├── aop/ │ │ │ │ │ │ │ └── IdempotentAspect.java │ │ │ │ │ │ ├── keyresolver/ │ │ │ │ │ │ │ ├── IdempotentKeyResolver.java │ │ │ │ │ │ │ └── impl/ │ │ │ │ │ │ │ ├── DefaultIdempotentKeyResolver.java │ │ │ │ │ │ │ ├── ExpressionIdempotentKeyResolver.java │ │ │ │ │ │ │ └── UserIdempotentKeyResolver.java │ │ │ │ │ │ └── redis/ │ │ │ │ │ │ └── IdempotentRedisDAO.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── lock4j/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── YudaoLock4jConfiguration.java │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── DefaultLockFailureStrategy.java │ │ │ │ │ │ └── Lock4jRedisKeyConstants.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── ratelimiter/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── YudaoRateLimiterConfiguration.java │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── annotation/ │ │ │ │ │ │ │ └── RateLimiter.java │ │ │ │ │ │ ├── aop/ │ │ │ │ │ │ │ └── RateLimiterAspect.java │ │ │ │ │ │ ├── keyresolver/ │ │ │ │ │ │ │ ├── RateLimiterKeyResolver.java │ │ │ │ │ │ │ └── impl/ │ │ │ │ │ │ │ ├── ClientIpRateLimiterKeyResolver.java │ │ │ │ │ │ │ ├── DefaultRateLimiterKeyResolver.java │ │ │ │ │ │ │ ├── ExpressionRateLimiterKeyResolver.java │ │ │ │ │ │ │ ├── ServerNodeRateLimiterKeyResolver.java │ │ │ │ │ │ │ └── UserRateLimiterKeyResolver.java │ │ │ │ │ │ └── redis/ │ │ │ │ │ │ └── RateLimiterRedisDAO.java │ │ │ │ │ └── package-info.java │ │ │ │ └── signature/ │ │ │ │ ├── config/ │ │ │ │ │ └── YudaoApiSignatureAutoConfiguration.java │ │ │ │ ├── core/ │ │ │ │ │ ├── annotation/ │ │ │ │ │ │ └── ApiSignature.java │ │ │ │ │ ├── aop/ │ │ │ │ │ │ └── ApiSignatureAspect.java │ │ │ │ │ └── redis/ │ │ │ │ │ └── ApiSignatureRedisDAO.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── framework/ │ │ └── signature/ │ │ └── core/ │ │ └── ApiSignatureTest.java │ ├── yudao-spring-boot-starter-redis/ │ │ ├── pom.xml │ │ ├── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── iocoder/ │ │ │ │ └── yudao/ │ │ │ │ └── framework/ │ │ │ │ └── redis/ │ │ │ │ ├── config/ │ │ │ │ │ ├── YudaoCacheAutoConfiguration.java │ │ │ │ │ ├── YudaoCacheProperties.java │ │ │ │ │ └── YudaoRedisAutoConfiguration.java │ │ │ │ ├── core/ │ │ │ │ │ └── TimeoutRedisCacheManager.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ ├── 《芋道 Spring Boot Cache 入门》.md │ │ └── 《芋道 Spring Boot Redis 入门》.md │ ├── yudao-spring-boot-starter-rpc/ │ │ ├── pom.xml │ │ ├── src/ │ │ │ └── main/ │ │ │ └── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── framework/ │ │ │ └── rpc/ │ │ │ ├── config/ │ │ │ │ └── package-info.java │ │ │ ├── core/ │ │ │ │ └── package-info.java │ │ │ └── package-info.java │ │ ├── 《芋道 Spring Boot 声明式调用 Feign 入门》.md │ │ └── 《芋道 Spring Cloud 声明式调用 Feign 入门》.md │ ├── yudao-spring-boot-starter-security/ │ │ ├── pom.xml │ │ ├── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── iocoder/ │ │ │ │ └── yudao/ │ │ │ │ └── framework/ │ │ │ │ ├── operatelog/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── YudaoOperateLogConfiguration.java │ │ │ │ │ │ └── YudaoOperateLogRpcAutoConfiguration.java │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ └── service/ │ │ │ │ │ │ └── LogRecordServiceImpl.java │ │ │ │ │ └── package-info.java │ │ │ │ └── security/ │ │ │ │ ├── config/ │ │ │ │ │ ├── AuthorizeRequestsCustomizer.java │ │ │ │ │ ├── SecurityProperties.java │ │ │ │ │ ├── YudaoSecurityAutoConfiguration.java │ │ │ │ │ ├── YudaoSecurityRpcAutoConfiguration.java │ │ │ │ │ └── YudaoWebSecurityConfigurerAdapter.java │ │ │ │ ├── core/ │ │ │ │ │ ├── LoginUser.java │ │ │ │ │ ├── context/ │ │ │ │ │ │ └── TransmittableThreadLocalSecurityContextHolderStrategy.java │ │ │ │ │ ├── filter/ │ │ │ │ │ │ └── TokenAuthenticationFilter.java │ │ │ │ │ ├── handler/ │ │ │ │ │ │ ├── AccessDeniedHandlerImpl.java │ │ │ │ │ │ └── AuthenticationEntryPointImpl.java │ │ │ │ │ ├── rpc/ │ │ │ │ │ │ └── LoginUserRequestInterceptor.java │ │ │ │ │ ├── service/ │ │ │ │ │ │ ├── SecurityFrameworkService.java │ │ │ │ │ │ └── SecurityFrameworkServiceImpl.java │ │ │ │ │ └── util/ │ │ │ │ │ └── SecurityFrameworkUtils.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── 《芋道 Spring Boot 安全框架 Spring Security 入门》.md │ ├── yudao-spring-boot-starter-test/ │ │ ├── pom.xml │ │ ├── src/ │ │ │ └── main/ │ │ │ └── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── framework/ │ │ │ └── test/ │ │ │ ├── config/ │ │ │ │ ├── RedisTestConfiguration.java │ │ │ │ └── SqlInitializationTestConfiguration.java │ │ │ ├── core/ │ │ │ │ ├── ut/ │ │ │ │ │ ├── BaseDbAndRedisUnitTest.java │ │ │ │ │ ├── BaseDbUnitTest.java │ │ │ │ │ ├── BaseMockitoUnitTest.java │ │ │ │ │ ├── BaseRedisUnitTest.java │ │ │ │ │ └── package-info.java │ │ │ │ └── util/ │ │ │ │ ├── AssertUtils.java │ │ │ │ └── RandomUtils.java │ │ │ └── package-info.java │ │ └── 《芋道 Spring Boot 单元测试 Test 入门》.md │ ├── yudao-spring-boot-starter-web/ │ │ ├── pom.xml │ │ ├── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── cn/ │ │ │ │ │ └── iocoder/ │ │ │ │ │ └── yudao/ │ │ │ │ │ └── framework/ │ │ │ │ │ ├── apilog/ │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ ├── YudaoApiLogAutoConfiguration.java │ │ │ │ │ │ │ └── YudaoApiLogRpcAutoConfiguration.java │ │ │ │ │ │ ├── core/ │ │ │ │ │ │ │ ├── annotation/ │ │ │ │ │ │ │ │ └── ApiAccessLog.java │ │ │ │ │ │ │ ├── enums/ │ │ │ │ │ │ │ │ └── OperateTypeEnum.java │ │ │ │ │ │ │ ├── filter/ │ │ │ │ │ │ │ │ └── ApiAccessLogFilter.java │ │ │ │ │ │ │ └── interceptor/ │ │ │ │ │ │ │ └── ApiAccessLogInterceptor.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── banner/ │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ └── YudaoBannerAutoConfiguration.java │ │ │ │ │ │ ├── core/ │ │ │ │ │ │ │ └── BannerApplicationRunner.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── desensitize/ │ │ │ │ │ │ ├── core/ │ │ │ │ │ │ │ ├── base/ │ │ │ │ │ │ │ │ ├── annotation/ │ │ │ │ │ │ │ │ │ └── DesensitizeBy.java │ │ │ │ │ │ │ │ ├── handler/ │ │ │ │ │ │ │ │ │ └── DesensitizationHandler.java │ │ │ │ │ │ │ │ └── serializer/ │ │ │ │ │ │ │ │ └── StringDesensitizeSerializer.java │ │ │ │ │ │ │ ├── regex/ │ │ │ │ │ │ │ │ ├── annotation/ │ │ │ │ │ │ │ │ │ ├── EmailDesensitize.java │ │ │ │ │ │ │ │ │ └── RegexDesensitize.java │ │ │ │ │ │ │ │ └── handler/ │ │ │ │ │ │ │ │ ├── AbstractRegexDesensitizationHandler.java │ │ │ │ │ │ │ │ ├── DefaultRegexDesensitizationHandler.java │ │ │ │ │ │ │ │ └── EmailDesensitizationHandler.java │ │ │ │ │ │ │ └── slider/ │ │ │ │ │ │ │ ├── annotation/ │ │ │ │ │ │ │ │ ├── BankCardDesensitize.java │ │ │ │ │ │ │ │ ├── CarLicenseDesensitize.java │ │ │ │ │ │ │ │ ├── ChineseNameDesensitize.java │ │ │ │ │ │ │ │ ├── FixedPhoneDesensitize.java │ │ │ │ │ │ │ │ ├── IdCardDesensitize.java │ │ │ │ │ │ │ │ ├── MobileDesensitize.java │ │ │ │ │ │ │ │ ├── PasswordDesensitize.java │ │ │ │ │ │ │ │ └── SliderDesensitize.java │ │ │ │ │ │ │ └── handler/ │ │ │ │ │ │ │ ├── AbstractSliderDesensitizationHandler.java │ │ │ │ │ │ │ ├── BankCardDesensitization.java │ │ │ │ │ │ │ ├── CarLicenseDesensitization.java │ │ │ │ │ │ │ ├── ChineseNameDesensitization.java │ │ │ │ │ │ │ ├── DefaultDesensitizationHandler.java │ │ │ │ │ │ │ ├── FixedPhoneDesensitization.java │ │ │ │ │ │ │ ├── IdCardDesensitization.java │ │ │ │ │ │ │ ├── MobileDesensitization.java │ │ │ │ │ │ │ └── PasswordDesensitization.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── encrypt/ │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ ├── ApiEncryptProperties.java │ │ │ │ │ │ │ └── YudaoApiEncryptAutoConfiguration.java │ │ │ │ │ │ ├── core/ │ │ │ │ │ │ │ ├── annotation/ │ │ │ │ │ │ │ │ └── ApiEncrypt.java │ │ │ │ │ │ │ └── filter/ │ │ │ │ │ │ │ ├── ApiDecryptRequestWrapper.java │ │ │ │ │ │ │ ├── ApiEncryptFilter.java │ │ │ │ │ │ │ └── ApiEncryptResponseWrapper.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── jackson/ │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ └── YudaoJacksonAutoConfiguration.java │ │ │ │ │ │ └── core/ │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── package-info.java │ │ │ │ │ ├── swagger/ │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ ├── Knife4jOpenApiCustomizer.java │ │ │ │ │ │ │ ├── SwaggerProperties.java │ │ │ │ │ │ │ └── YudaoSwaggerAutoConfiguration.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── web/ │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ ├── WebProperties.java │ │ │ │ │ │ │ └── YudaoWebAutoConfiguration.java │ │ │ │ │ │ ├── core/ │ │ │ │ │ │ │ ├── filter/ │ │ │ │ │ │ │ │ ├── ApiRequestFilter.java │ │ │ │ │ │ │ │ ├── CacheRequestBodyFilter.java │ │ │ │ │ │ │ │ ├── CacheRequestBodyWrapper.java │ │ │ │ │ │ │ │ └── DemoFilter.java │ │ │ │ │ │ │ ├── handler/ │ │ │ │ │ │ │ │ ├── GlobalExceptionHandler.java │ │ │ │ │ │ │ │ └── GlobalResponseBodyHandler.java │ │ │ │ │ │ │ └── util/ │ │ │ │ │ │ │ └── WebFrameworkUtils.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── xss/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── XssProperties.java │ │ │ │ │ │ └── YudaoXssAutoConfiguration.java │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── clean/ │ │ │ │ │ │ │ ├── JsoupXssCleaner.java │ │ │ │ │ │ │ └── XssCleaner.java │ │ │ │ │ │ ├── filter/ │ │ │ │ │ │ │ ├── XssFilter.java │ │ │ │ │ │ │ └── XssRequestWrapper.java │ │ │ │ │ │ └── json/ │ │ │ │ │ │ └── XssStringJsonDeserializer.java │ │ │ │ │ └── package-info.java │ │ │ │ └── resources/ │ │ │ │ ├── META-INF/ │ │ │ │ │ └── spring/ │ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ │ └── banner.txt │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── framework/ │ │ │ ├── desensitize/ │ │ │ │ └── core/ │ │ │ │ ├── DesensitizeTest.java │ │ │ │ ├── annotation/ │ │ │ │ │ └── Address.java │ │ │ │ └── handler/ │ │ │ │ └── AddressHandler.java │ │ │ └── encrypt/ │ │ │ └── ApiEncryptTest.java │ │ ├── 《芋道 Spring Boot API 接口文档 Swagger 入门》.md │ │ └── 《芋道 Spring Boot SpringMVC 入门》.md │ └── yudao-spring-boot-starter-websocket/ │ ├── pom.xml │ ├── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── framework/ │ │ │ └── websocket/ │ │ │ ├── config/ │ │ │ │ ├── WebSocketProperties.java │ │ │ │ └── YudaoWebSocketAutoConfiguration.java │ │ │ ├── core/ │ │ │ │ ├── handler/ │ │ │ │ │ └── JsonWebSocketMessageHandler.java │ │ │ │ ├── listener/ │ │ │ │ │ └── WebSocketMessageListener.java │ │ │ │ ├── message/ │ │ │ │ │ └── JsonWebSocketMessage.java │ │ │ │ ├── security/ │ │ │ │ │ ├── LoginUserHandshakeInterceptor.java │ │ │ │ │ └── WebSocketAuthorizeRequestsCustomizer.java │ │ │ │ ├── sender/ │ │ │ │ │ ├── AbstractWebSocketMessageSender.java │ │ │ │ │ ├── WebSocketMessageSender.java │ │ │ │ │ ├── kafka/ │ │ │ │ │ │ ├── KafkaWebSocketMessage.java │ │ │ │ │ │ ├── KafkaWebSocketMessageConsumer.java │ │ │ │ │ │ └── KafkaWebSocketMessageSender.java │ │ │ │ │ ├── local/ │ │ │ │ │ │ └── LocalWebSocketMessageSender.java │ │ │ │ │ ├── rabbitmq/ │ │ │ │ │ │ ├── RabbitMQWebSocketMessage.java │ │ │ │ │ │ ├── RabbitMQWebSocketMessageConsumer.java │ │ │ │ │ │ └── RabbitMQWebSocketMessageSender.java │ │ │ │ │ ├── redis/ │ │ │ │ │ │ ├── RedisWebSocketMessage.java │ │ │ │ │ │ ├── RedisWebSocketMessageConsumer.java │ │ │ │ │ │ └── RedisWebSocketMessageSender.java │ │ │ │ │ └── rocketmq/ │ │ │ │ │ ├── RocketMQWebSocketMessage.java │ │ │ │ │ ├── RocketMQWebSocketMessageConsumer.java │ │ │ │ │ └── RocketMQWebSocketMessageSender.java │ │ │ │ ├── session/ │ │ │ │ │ ├── WebSocketSessionHandlerDecorator.java │ │ │ │ │ ├── WebSocketSessionManager.java │ │ │ │ │ └── WebSocketSessionManagerImpl.java │ │ │ │ └── util/ │ │ │ │ └── WebSocketFrameworkUtils.java │ │ │ └── package-info.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── spring/ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ └── 《芋道 Spring Boot WebSocket 入门》.md ├── yudao-gateway/ │ ├── Dockerfile │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── gateway/ │ │ │ ├── GatewayServerApplication.java │ │ │ ├── filter/ │ │ │ │ ├── cors/ │ │ │ │ │ └── CorsFilter.java │ │ │ │ ├── grey/ │ │ │ │ │ ├── GrayLoadBalancer.java │ │ │ │ │ └── GrayReactiveLoadBalancerClientFilter.java │ │ │ │ ├── logging/ │ │ │ │ │ ├── AccessLog.java │ │ │ │ │ └── AccessLogFilter.java │ │ │ │ └── security/ │ │ │ │ ├── LoginUser.java │ │ │ │ └── TokenAuthenticationFilter.java │ │ │ ├── handler/ │ │ │ │ └── GlobalExceptionHandler.java │ │ │ ├── jackson/ │ │ │ │ └── GatewayJacksonAutoConfiguration.java │ │ │ ├── route/ │ │ │ │ ├── dynamic/ │ │ │ │ │ └── package-info.java │ │ │ │ └── package-info.java │ │ │ └── util/ │ │ │ ├── BannerApplicationRunner.java │ │ │ ├── EnvUtils.java │ │ │ ├── SecurityFrameworkUtils.java │ │ │ └── WebFrameworkUtils.java │ │ └── resources/ │ │ ├── application-dev.yaml │ │ ├── application-local.yaml │ │ ├── application.yaml │ │ ├── banner.txt │ │ └── logback-spring.xml │ └── test/ │ └── java/ │ └── cn/ │ └── iocoder/ │ └── yudao/ │ └── ProjectReactor.java ├── yudao-module-ai/ │ ├── pom.xml │ ├── yudao-module-ai-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── ai/ │ │ ├── api/ │ │ │ └── package-info.java │ │ └── enums/ │ │ ├── AiChatRoleEnum.java │ │ ├── AiDocumentSplitStrategyEnum.java │ │ ├── DictTypeConstants.java │ │ ├── ErrorCodeConstants.java │ │ ├── image/ │ │ │ └── AiImageStatusEnum.java │ │ ├── model/ │ │ │ ├── AiModelTypeEnum.java │ │ │ └── AiPlatformEnum.java │ │ ├── music/ │ │ │ ├── AiMusicGenerateModeEnum.java │ │ │ └── AiMusicStatusEnum.java │ │ └── write/ │ │ └── AiWriteTypeEnum.java │ └── yudao-module-ai-server/ │ ├── Dockerfile │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── module/ │ │ │ └── ai/ │ │ │ ├── AiServerApplication.java │ │ │ ├── controller/ │ │ │ │ ├── admin/ │ │ │ │ │ ├── chat/ │ │ │ │ │ │ ├── AiChatConversationController.java │ │ │ │ │ │ ├── AiChatMessageController.http │ │ │ │ │ │ ├── AiChatMessageController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── conversation/ │ │ │ │ │ │ │ ├── AiChatConversationCreateMyReqVO.java │ │ │ │ │ │ │ ├── AiChatConversationPageReqVO.java │ │ │ │ │ │ │ ├── AiChatConversationRespVO.java │ │ │ │ │ │ │ └── AiChatConversationUpdateMyReqVO.java │ │ │ │ │ │ └── message/ │ │ │ │ │ │ ├── AiChatMessagePageReqVO.java │ │ │ │ │ │ ├── AiChatMessageRespVO.java │ │ │ │ │ │ ├── AiChatMessageSendReqVO.java │ │ │ │ │ │ └── AiChatMessageSendRespVO.java │ │ │ │ │ ├── image/ │ │ │ │ │ │ ├── AiImageController.http │ │ │ │ │ │ ├── AiImageController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AiImageDrawReqVO.java │ │ │ │ │ │ ├── AiImagePageReqVO.java │ │ │ │ │ │ ├── AiImagePublicPageReqVO.java │ │ │ │ │ │ ├── AiImageRespVO.java │ │ │ │ │ │ ├── AiImageUpdateReqVO.java │ │ │ │ │ │ └── midjourney/ │ │ │ │ │ │ ├── AiMidjourneyActionReqVO.java │ │ │ │ │ │ └── AiMidjourneyImagineReqVO.java │ │ │ │ │ ├── knowledge/ │ │ │ │ │ │ ├── AiKnowledgeController.http │ │ │ │ │ │ ├── AiKnowledgeController.java │ │ │ │ │ │ ├── AiKnowledgeDocumentController.http │ │ │ │ │ │ ├── AiKnowledgeDocumentController.java │ │ │ │ │ │ ├── AiKnowledgeSegmentController.http │ │ │ │ │ │ ├── AiKnowledgeSegmentController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── document/ │ │ │ │ │ │ │ ├── AiKnowledgeDocumentCreateListReqVO.java │ │ │ │ │ │ │ ├── AiKnowledgeDocumentPageReqVO.java │ │ │ │ │ │ │ ├── AiKnowledgeDocumentRespVO.java │ │ │ │ │ │ │ ├── AiKnowledgeDocumentUpdateReqVO.java │ │ │ │ │ │ │ └── AiKnowledgeDocumentUpdateStatusReqVO.java │ │ │ │ │ │ ├── knowledge/ │ │ │ │ │ │ │ ├── AiKnowledgeDocumentCreateReqVO.java │ │ │ │ │ │ │ ├── AiKnowledgePageReqVO.java │ │ │ │ │ │ │ ├── AiKnowledgeRespVO.java │ │ │ │ │ │ │ └── AiKnowledgeSaveReqVO.java │ │ │ │ │ │ └── segment/ │ │ │ │ │ │ ├── AiKnowledgeSegmentPageReqVO.java │ │ │ │ │ │ ├── AiKnowledgeSegmentProcessRespVO.java │ │ │ │ │ │ ├── AiKnowledgeSegmentRespVO.java │ │ │ │ │ │ ├── AiKnowledgeSegmentSaveReqVO.java │ │ │ │ │ │ ├── AiKnowledgeSegmentSearchReqVO.java │ │ │ │ │ │ ├── AiKnowledgeSegmentSearchRespVO.java │ │ │ │ │ │ └── AiKnowledgeSegmentUpdateStatusReqVO.java │ │ │ │ │ ├── mindmap/ │ │ │ │ │ │ ├── AiMindMapController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AiMindMapGenerateReqVO.java │ │ │ │ │ │ ├── AiMindMapPageReqVO.java │ │ │ │ │ │ └── AiMindMapRespVO.java │ │ │ │ │ ├── model/ │ │ │ │ │ │ ├── AiApiKeyController.java │ │ │ │ │ │ ├── AiChatRoleController.java │ │ │ │ │ │ ├── AiModelController.java │ │ │ │ │ │ ├── AiToolController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── apikey/ │ │ │ │ │ │ │ ├── AiApiKeyPageReqVO.java │ │ │ │ │ │ │ ├── AiApiKeyRespVO.java │ │ │ │ │ │ │ └── AiApiKeySaveReqVO.java │ │ │ │ │ │ ├── chatRole/ │ │ │ │ │ │ │ ├── AiChatRolePageReqVO.java │ │ │ │ │ │ │ ├── AiChatRoleRespVO.java │ │ │ │ │ │ │ ├── AiChatRoleSaveMyReqVO.java │ │ │ │ │ │ │ └── AiChatRoleSaveReqVO.java │ │ │ │ │ │ ├── model/ │ │ │ │ │ │ │ ├── AiModelPageReqVO.java │ │ │ │ │ │ │ ├── AiModelRespVO.java │ │ │ │ │ │ │ └── AiModelSaveReqVO.java │ │ │ │ │ │ └── tool/ │ │ │ │ │ │ ├── AiToolPageReqVO.java │ │ │ │ │ │ ├── AiToolRespVO.java │ │ │ │ │ │ └── AiToolSaveReqVO.java │ │ │ │ │ ├── music/ │ │ │ │ │ │ ├── AiMusicController.http │ │ │ │ │ │ ├── AiMusicController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AiMusicPageReqVO.java │ │ │ │ │ │ ├── AiMusicRespVO.java │ │ │ │ │ │ ├── AiMusicUpdateMyReqVO.java │ │ │ │ │ │ ├── AiMusicUpdateReqVO.java │ │ │ │ │ │ └── AiSunoGenerateReqVO.java │ │ │ │ │ ├── workflow/ │ │ │ │ │ │ ├── AiWorkflowController.http │ │ │ │ │ │ ├── AiWorkflowController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AiWorkflowPageReqVO.java │ │ │ │ │ │ ├── AiWorkflowRespVO.java │ │ │ │ │ │ ├── AiWorkflowSaveReqVO.java │ │ │ │ │ │ └── AiWorkflowTestReqVO.java │ │ │ │ │ └── write/ │ │ │ │ │ ├── AiWriteController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── AiWriteGenerateReqVO.java │ │ │ │ │ ├── AiWritePageReqVO.java │ │ │ │ │ └── AiWriteRespVO.java │ │ │ │ ├── app/ │ │ │ │ │ └── package-info.java │ │ │ │ └── package-info.java │ │ │ ├── dal/ │ │ │ │ ├── dataobject/ │ │ │ │ │ ├── chat/ │ │ │ │ │ │ ├── AiChatConversationDO.java │ │ │ │ │ │ └── AiChatMessageDO.java │ │ │ │ │ ├── image/ │ │ │ │ │ │ └── AiImageDO.java │ │ │ │ │ ├── knowledge/ │ │ │ │ │ │ ├── AiKnowledgeDO.java │ │ │ │ │ │ ├── AiKnowledgeDocumentDO.java │ │ │ │ │ │ └── AiKnowledgeSegmentDO.java │ │ │ │ │ ├── mindmap/ │ │ │ │ │ │ └── AiMindMapDO.java │ │ │ │ │ ├── model/ │ │ │ │ │ │ ├── AiApiKeyDO.java │ │ │ │ │ │ ├── AiChatRoleDO.java │ │ │ │ │ │ ├── AiModelDO.java │ │ │ │ │ │ └── AiToolDO.java │ │ │ │ │ ├── music/ │ │ │ │ │ │ └── AiMusicDO.java │ │ │ │ │ ├── workflow/ │ │ │ │ │ │ └── AiWorkflowDO.java │ │ │ │ │ └── write/ │ │ │ │ │ └── AiWriteDO.java │ │ │ │ └── mysql/ │ │ │ │ ├── chat/ │ │ │ │ │ ├── AiChatConversationMapper.java │ │ │ │ │ └── AiChatMessageMapper.java │ │ │ │ ├── image/ │ │ │ │ │ └── AiImageMapper.java │ │ │ │ ├── knowledge/ │ │ │ │ │ ├── AiKnowledgeDocumentMapper.java │ │ │ │ │ ├── AiKnowledgeMapper.java │ │ │ │ │ └── AiKnowledgeSegmentMapper.java │ │ │ │ ├── mindmap/ │ │ │ │ │ └── AiMindMapMapper.java │ │ │ │ ├── model/ │ │ │ │ │ ├── AiApiKeyMapper.java │ │ │ │ │ ├── AiChatMapper.java │ │ │ │ │ ├── AiChatRoleMapper.java │ │ │ │ │ └── AiToolMapper.java │ │ │ │ ├── music/ │ │ │ │ │ └── AiMusicMapper.java │ │ │ │ ├── workflow/ │ │ │ │ │ └── AiWorkflowMapper.java │ │ │ │ └── write/ │ │ │ │ └── AiWriteMapper.java │ │ │ ├── framework/ │ │ │ │ ├── ai/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── AiAutoConfiguration.java │ │ │ │ │ │ └── YudaoAiProperties.java │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── model/ │ │ │ │ │ │ │ ├── AiModelFactory.java │ │ │ │ │ │ │ ├── AiModelFactoryImpl.java │ │ │ │ │ │ │ ├── baichuan/ │ │ │ │ │ │ │ │ └── BaiChuanChatModel.java │ │ │ │ │ │ │ ├── doubao/ │ │ │ │ │ │ │ │ └── DouBaoChatModel.java │ │ │ │ │ │ │ ├── gemini/ │ │ │ │ │ │ │ │ └── GeminiChatModel.java │ │ │ │ │ │ │ ├── grok/ │ │ │ │ │ │ │ │ └── GrokChatModel.java │ │ │ │ │ │ │ ├── hunyuan/ │ │ │ │ │ │ │ │ └── HunYuanChatModel.java │ │ │ │ │ │ │ ├── midjourney/ │ │ │ │ │ │ │ │ └── api/ │ │ │ │ │ │ │ │ └── MidjourneyApi.java │ │ │ │ │ │ │ ├── siliconflow/ │ │ │ │ │ │ │ │ ├── SiliconFlowApiConstants.java │ │ │ │ │ │ │ │ ├── SiliconFlowChatModel.java │ │ │ │ │ │ │ │ ├── SiliconFlowImageApi.java │ │ │ │ │ │ │ │ ├── SiliconFlowImageModel.java │ │ │ │ │ │ │ │ └── SiliconFlowImageOptions.java │ │ │ │ │ │ │ ├── suno/ │ │ │ │ │ │ │ │ └── api/ │ │ │ │ │ │ │ │ └── SunoApi.java │ │ │ │ │ │ │ ├── wenduoduo/ │ │ │ │ │ │ │ │ └── api/ │ │ │ │ │ │ │ │ └── WenDuoDuoPptApi.java │ │ │ │ │ │ │ └── xinghuo/ │ │ │ │ │ │ │ ├── XingHuoChatModel.java │ │ │ │ │ │ │ └── api/ │ │ │ │ │ │ │ └── XunFeiPptApi.java │ │ │ │ │ │ └── webserch/ │ │ │ │ │ │ ├── AiWebSearchClient.java │ │ │ │ │ │ ├── AiWebSearchRequest.java │ │ │ │ │ │ ├── AiWebSearchResponse.java │ │ │ │ │ │ └── bocha/ │ │ │ │ │ │ └── AiBoChaWebSearchClient.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── package-info.java │ │ │ │ ├── rpc/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── RpcConfiguration.java │ │ │ │ │ └── package-info.java │ │ │ │ └── security/ │ │ │ │ ├── config/ │ │ │ │ │ └── SecurityConfiguration.java │ │ │ │ └── core/ │ │ │ │ └── package-info.java │ │ │ ├── job/ │ │ │ │ ├── image/ │ │ │ │ │ └── AiMidjourneySyncJob.java │ │ │ │ └── music/ │ │ │ │ └── AiSunoSyncJob.java │ │ │ ├── package-info.java │ │ │ ├── service/ │ │ │ │ ├── chat/ │ │ │ │ │ ├── AiChatConversationService.java │ │ │ │ │ ├── AiChatConversationServiceImpl.java │ │ │ │ │ ├── AiChatMessageService.java │ │ │ │ │ └── AiChatMessageServiceImpl.java │ │ │ │ ├── image/ │ │ │ │ │ ├── AiImageService.java │ │ │ │ │ └── AiImageServiceImpl.java │ │ │ │ ├── knowledge/ │ │ │ │ │ ├── AiKnowledgeDocumentService.java │ │ │ │ │ ├── AiKnowledgeDocumentServiceImpl.java │ │ │ │ │ ├── AiKnowledgeSegmentService.java │ │ │ │ │ ├── AiKnowledgeSegmentServiceImpl.java │ │ │ │ │ ├── AiKnowledgeService.java │ │ │ │ │ ├── AiKnowledgeServiceImpl.java │ │ │ │ │ ├── bo/ │ │ │ │ │ │ ├── AiKnowledgeSegmentSearchReqBO.java │ │ │ │ │ │ └── AiKnowledgeSegmentSearchRespBO.java │ │ │ │ │ └── splitter/ │ │ │ │ │ ├── MarkdownQaSplitter.java │ │ │ │ │ └── SemanticTextSplitter.java │ │ │ │ ├── mindmap/ │ │ │ │ │ ├── AiMindMapService.java │ │ │ │ │ └── AiMindMapServiceImpl.java │ │ │ │ ├── model/ │ │ │ │ │ ├── AiApiKeyService.java │ │ │ │ │ ├── AiApiKeyServiceImpl.java │ │ │ │ │ ├── AiChatRoleService.java │ │ │ │ │ ├── AiChatRoleServiceImpl.java │ │ │ │ │ ├── AiModelService.java │ │ │ │ │ ├── AiModelServiceImpl.java │ │ │ │ │ ├── AiToolService.java │ │ │ │ │ └── AiToolServiceImpl.java │ │ │ │ ├── music/ │ │ │ │ │ ├── AiMusicService.java │ │ │ │ │ └── AiMusicServiceImpl.java │ │ │ │ ├── workflow/ │ │ │ │ │ ├── AiWorkflowService.java │ │ │ │ │ └── AiWorkflowServiceImpl.java │ │ │ │ └── write/ │ │ │ │ ├── AiWriteService.java │ │ │ │ └── AiWriteServiceImpl.java │ │ │ ├── tool/ │ │ │ │ ├── function/ │ │ │ │ │ ├── DirectoryListToolFunction.java │ │ │ │ │ ├── UserProfileQueryToolFunction.java │ │ │ │ │ ├── WeatherQueryToolFunction.java │ │ │ │ │ └── package-info.java │ │ │ │ └── method/ │ │ │ │ ├── Person.java │ │ │ │ ├── PersonService.java │ │ │ │ ├── PersonServiceImpl.java │ │ │ │ └── package-info.java │ │ │ └── util/ │ │ │ ├── AiUtils.java │ │ │ └── FileTypeUtils.java │ │ └── resources/ │ │ ├── application-dev.yaml │ │ ├── application-local.yaml │ │ ├── application.yaml │ │ └── logback-spring.xml │ └── test/ │ └── java/ │ └── cn/ │ └── iocoder/ │ └── yudao/ │ └── module/ │ └── ai/ │ └── framework/ │ └── ai/ │ └── core/ │ ├── model/ │ │ ├── chat/ │ │ │ ├── AnthropicChatModelTest.java │ │ │ ├── AzureOpenAIChatModelTests.java │ │ │ ├── BaiChuanChatModelTests.java │ │ │ ├── CozeChatModelTests.java │ │ │ ├── DeepSeekChatModelTests.java │ │ │ ├── DifyChatModelTests.java │ │ │ ├── DouBaoChatModelTests.java │ │ │ ├── FastGPTChatModelTests.java │ │ │ ├── GeminiChatModelTests.java │ │ │ ├── HunYuanChatModelTests.java │ │ │ ├── LlamaChatModelTests.java │ │ │ ├── MiniMaxChatModelTests.java │ │ │ ├── MoonshotChatModelTests.java │ │ │ ├── OllamaChatModelTests.java │ │ │ ├── OpenAIChatModelTests.java │ │ │ ├── SiliconFlowChatModelTests.java │ │ │ ├── TongYiChatModelTests.java │ │ │ ├── XingHuoChatModelTests.java │ │ │ ├── YiYanChatModelTests.java │ │ │ └── ZhiPuAiChatModelTests.java │ │ ├── image/ │ │ │ ├── MidjourneyApiTests.java │ │ │ ├── OpenAiImageModelTests.java │ │ │ ├── QianFanImageTests.java │ │ │ ├── SiliconFlowImageModelTests.java │ │ │ ├── StabilityAiImageModelTests.java │ │ │ ├── TongYiImagesModelTest.java │ │ │ └── ZhiPuAiImageModelTests.java │ │ ├── mcp/ │ │ │ └── DouBaoMcpTests.java │ │ ├── music/ │ │ │ └── SunoApiTests.java │ │ └── ppt/ │ │ ├── wdd/ │ │ │ └── WenDuoDuoPptApiTests.java │ │ └── xunfei/ │ │ └── XunFeiPptApiTests.java │ └── websearch/ │ └── AiBoChaWebSearchClientTest.java ├── yudao-module-bpm/ │ ├── pom.xml │ ├── yudao-module-bpm-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── bpm/ │ │ ├── api/ │ │ │ ├── event/ │ │ │ │ ├── BpmProcessInstanceStatusEvent.java │ │ │ │ └── BpmProcessInstanceStatusEventListener.java │ │ │ ├── package-info.java │ │ │ └── task/ │ │ │ ├── BpmProcessInstanceApi.java │ │ │ └── dto/ │ │ │ └── BpmProcessInstanceCreateReqDTO.java │ │ └── enums/ │ │ ├── ApiConstants.java │ │ ├── DictTypeConstants.java │ │ ├── ErrorCodeConstants.java │ │ ├── definition/ │ │ │ ├── BpmAutoApproveTypeEnum.java │ │ │ ├── BpmBoundaryEventTypeEnum.java │ │ │ ├── BpmChildProcessMultiInstanceSourceTypeEnum.java │ │ │ ├── BpmChildProcessStartUserEmptyTypeEnum.java │ │ │ ├── BpmChildProcessStartUserTypeEnum.java │ │ │ ├── BpmDelayTimerTypeEnum.java │ │ │ ├── BpmFieldPermissionEnum.java │ │ │ ├── BpmHttpRequestParamTypeEnum.java │ │ │ ├── BpmModelFormTypeEnum.java │ │ │ ├── BpmModelTypeEnum.java │ │ │ ├── BpmProcessListenerTypeEnum.java │ │ │ ├── BpmProcessListenerValueTypeEnum.java │ │ │ ├── BpmSimpleModeConditionTypeEnum.java │ │ │ ├── BpmSimpleModelNodeTypeEnum.java │ │ │ ├── BpmTriggerTypeEnum.java │ │ │ ├── BpmUserTaskApproveMethodEnum.java │ │ │ ├── BpmUserTaskApproveTypeEnum.java │ │ │ ├── BpmUserTaskAssignEmptyHandlerTypeEnum.java │ │ │ ├── BpmUserTaskAssignStartUserHandlerTypeEnum.java │ │ │ ├── BpmUserTaskRejectHandlerTypeEnum.java │ │ │ └── BpmUserTaskTimeoutHandlerTypeEnum.java │ │ ├── message/ │ │ │ └── BpmMessageEnum.java │ │ └── task/ │ │ ├── BpmCommentTypeEnum.java │ │ ├── BpmProcessInstanceStatusEnum.java │ │ ├── BpmReasonEnum.java │ │ ├── BpmTaskSignTypeEnum.java │ │ └── BpmTaskStatusEnum.java │ └── yudao-module-bpm-server/ │ ├── Dockerfile │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── module/ │ │ │ └── bpm/ │ │ │ ├── BpmServerApplication.java │ │ │ ├── api/ │ │ │ │ ├── event/ │ │ │ │ │ ├── CrmContractStatusListener.java │ │ │ │ │ └── CrmReceivableStatusListener.java │ │ │ │ ├── package-info.java │ │ │ │ └── task/ │ │ │ │ └── BpmProcessInstanceApiImpl.java │ │ │ ├── controller/ │ │ │ │ ├── admin/ │ │ │ │ │ ├── base/ │ │ │ │ │ │ ├── dept/ │ │ │ │ │ │ │ └── DeptSimpleBaseVO.java │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ └── user/ │ │ │ │ │ │ └── UserSimpleBaseVO.java │ │ │ │ │ ├── definition/ │ │ │ │ │ │ ├── BpmCategoryController.java │ │ │ │ │ │ ├── BpmFormController.java │ │ │ │ │ │ ├── BpmModelController.java │ │ │ │ │ │ ├── BpmProcessDefinitionController.java │ │ │ │ │ │ ├── BpmProcessExpressionController.java │ │ │ │ │ │ ├── BpmProcessListenerController.java │ │ │ │ │ │ ├── BpmUserGroupController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── category/ │ │ │ │ │ │ │ ├── BpmCategoryPageReqVO.java │ │ │ │ │ │ │ ├── BpmCategoryRespVO.java │ │ │ │ │ │ │ └── BpmCategorySaveReqVO.java │ │ │ │ │ │ ├── expression/ │ │ │ │ │ │ │ ├── BpmProcessExpressionPageReqVO.java │ │ │ │ │ │ │ ├── BpmProcessExpressionRespVO.java │ │ │ │ │ │ │ └── BpmProcessExpressionSaveReqVO.java │ │ │ │ │ │ ├── form/ │ │ │ │ │ │ │ ├── BpmFormFieldVO.java │ │ │ │ │ │ │ ├── BpmFormPageReqVO.java │ │ │ │ │ │ │ ├── BpmFormRespVO.java │ │ │ │ │ │ │ └── BpmFormSaveReqVO.java │ │ │ │ │ │ ├── group/ │ │ │ │ │ │ │ ├── BpmUserGroupPageReqVO.java │ │ │ │ │ │ │ ├── BpmUserGroupRespVO.java │ │ │ │ │ │ │ └── BpmUserGroupSaveReqVO.java │ │ │ │ │ │ ├── listener/ │ │ │ │ │ │ │ ├── BpmProcessListenerPageReqVO.java │ │ │ │ │ │ │ ├── BpmProcessListenerRespVO.java │ │ │ │ │ │ │ └── BpmProcessListenerSaveReqVO.java │ │ │ │ │ │ ├── model/ │ │ │ │ │ │ │ ├── BpmModeUpdateBpmnReqVO.java │ │ │ │ │ │ │ ├── BpmModelMetaInfoVO.java │ │ │ │ │ │ │ ├── BpmModelRespVO.java │ │ │ │ │ │ │ ├── BpmModelSaveReqVO.java │ │ │ │ │ │ │ ├── BpmModelUpdateStateReqVO.java │ │ │ │ │ │ │ └── simple/ │ │ │ │ │ │ │ ├── BpmSimpleModelNodeVO.java │ │ │ │ │ │ │ └── BpmSimpleModelUpdateReqVO.java │ │ │ │ │ │ └── process/ │ │ │ │ │ │ ├── BpmProcessDefinitionPageReqVO.java │ │ │ │ │ │ └── BpmProcessDefinitionRespVO.java │ │ │ │ │ ├── oa/ │ │ │ │ │ │ ├── BpmOALeaveController.http │ │ │ │ │ │ ├── BpmOALeaveController.java │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── BpmOALeaveCreateReqVO.java │ │ │ │ │ │ ├── BpmOALeavePageReqVO.java │ │ │ │ │ │ └── BpmOALeaveRespVO.java │ │ │ │ │ └── task/ │ │ │ │ │ ├── BpmProcessInstanceController.http │ │ │ │ │ ├── BpmProcessInstanceController.java │ │ │ │ │ ├── BpmProcessInstanceCopyController.java │ │ │ │ │ ├── BpmTaskController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── activity/ │ │ │ │ │ │ └── BpmActivityRespVO.java │ │ │ │ │ ├── cc/ │ │ │ │ │ │ └── BpmProcessInstanceCopyRespVO.java │ │ │ │ │ ├── instance/ │ │ │ │ │ │ ├── BpmApprovalDetailReqVO.java │ │ │ │ │ │ ├── BpmApprovalDetailRespVO.java │ │ │ │ │ │ ├── BpmProcessInstanceBpmnModelViewRespVO.java │ │ │ │ │ │ ├── BpmProcessInstanceCancelReqVO.java │ │ │ │ │ │ ├── BpmProcessInstanceCopyPageReqVO.java │ │ │ │ │ │ ├── BpmProcessInstanceCreateReqVO.java │ │ │ │ │ │ ├── BpmProcessInstancePageReqVO.java │ │ │ │ │ │ ├── BpmProcessInstanceRespVO.java │ │ │ │ │ │ └── BpmProcessPrintDataRespVO.java │ │ │ │ │ └── task/ │ │ │ │ │ ├── BpmTaskApproveReqVO.java │ │ │ │ │ ├── BpmTaskCopyReqVO.java │ │ │ │ │ ├── BpmTaskDelegateReqVO.java │ │ │ │ │ ├── BpmTaskPageReqVO.java │ │ │ │ │ ├── BpmTaskRejectReqVO.java │ │ │ │ │ ├── BpmTaskRespVO.java │ │ │ │ │ ├── BpmTaskReturnReqVO.java │ │ │ │ │ ├── BpmTaskSignCreateReqVO.java │ │ │ │ │ ├── BpmTaskSignDeleteReqVO.java │ │ │ │ │ └── BpmTaskTransferReqVO.java │ │ │ │ ├── app/ │ │ │ │ │ └── package-info.java │ │ │ │ └── package-info.java │ │ │ ├── convert/ │ │ │ │ ├── definition/ │ │ │ │ │ ├── BpmModelConvert.java │ │ │ │ │ └── BpmProcessDefinitionConvert.java │ │ │ │ ├── message/ │ │ │ │ │ └── BpmMessageConvert.java │ │ │ │ ├── package-info.java │ │ │ │ ├── task/ │ │ │ │ │ ├── BpmProcessInstanceConvert.java │ │ │ │ │ └── BpmTaskConvert.java │ │ │ │ └── 《芋道 Spring Boot 对象转换 MapStruct 入门》.md │ │ │ ├── dal/ │ │ │ │ ├── dataobject/ │ │ │ │ │ ├── definition/ │ │ │ │ │ │ ├── BpmCategoryDO.java │ │ │ │ │ │ ├── BpmFormDO.java │ │ │ │ │ │ ├── BpmProcessDefinitionInfoDO.java │ │ │ │ │ │ ├── BpmProcessExpressionDO.java │ │ │ │ │ │ ├── BpmProcessListenerDO.java │ │ │ │ │ │ └── BpmUserGroupDO.java │ │ │ │ │ ├── oa/ │ │ │ │ │ │ └── BpmOALeaveDO.java │ │ │ │ │ └── task/ │ │ │ │ │ └── BpmProcessInstanceCopyDO.java │ │ │ │ ├── mysql/ │ │ │ │ │ ├── category/ │ │ │ │ │ │ └── BpmCategoryMapper.java │ │ │ │ │ ├── definition/ │ │ │ │ │ │ ├── BpmFormMapper.java │ │ │ │ │ │ ├── BpmProcessDefinitionInfoMapper.java │ │ │ │ │ │ ├── BpmProcessExpressionMapper.java │ │ │ │ │ │ ├── BpmProcessListenerMapper.java │ │ │ │ │ │ └── BpmUserGroupMapper.java │ │ │ │ │ ├── oa/ │ │ │ │ │ │ └── BpmOALeaveMapper.java │ │ │ │ │ └── task/ │ │ │ │ │ └── BpmProcessInstanceCopyMapper.java │ │ │ │ └── redis/ │ │ │ │ ├── BpmProcessIdRedisDAO.java │ │ │ │ └── RedisKeyConstants.java │ │ │ ├── framework/ │ │ │ │ ├── flowable/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── BpmFlowableConfiguration.java │ │ │ │ │ └── core/ │ │ │ │ │ ├── behavior/ │ │ │ │ │ │ ├── BpmActivityBehaviorFactory.java │ │ │ │ │ │ ├── BpmParallelMultiInstanceBehavior.java │ │ │ │ │ │ ├── BpmSequentialMultiInstanceBehavior.java │ │ │ │ │ │ └── BpmUserTaskActivityBehavior.java │ │ │ │ │ ├── candidate/ │ │ │ │ │ │ ├── BpmTaskCandidateInvoker.java │ │ │ │ │ │ ├── BpmTaskCandidateStrategy.java │ │ │ │ │ │ ├── expression/ │ │ │ │ │ │ │ ├── BpmTaskAssignLeaderExpression.java │ │ │ │ │ │ │ └── BpmTaskAssignStartUserExpression.java │ │ │ │ │ │ └── strategy/ │ │ │ │ │ │ ├── dept/ │ │ │ │ │ │ │ ├── AbstractBpmTaskCandidateDeptLeaderStrategy.java │ │ │ │ │ │ │ ├── BpmTaskCandidateApproveUserSelectStrategy.java │ │ │ │ │ │ │ ├── BpmTaskCandidateDeptLeaderMultiStrategy.java │ │ │ │ │ │ │ ├── BpmTaskCandidateDeptLeaderStrategy.java │ │ │ │ │ │ │ ├── BpmTaskCandidateDeptMemberStrategy.java │ │ │ │ │ │ │ ├── BpmTaskCandidateStartUserDeptLeaderMultiStrategy.java │ │ │ │ │ │ │ ├── BpmTaskCandidateStartUserDeptLeaderStrategy.java │ │ │ │ │ │ │ └── BpmTaskCandidateStartUserSelectStrategy.java │ │ │ │ │ │ ├── form/ │ │ │ │ │ │ │ ├── BpmTaskCandidateFormDeptLeaderStrategy.java │ │ │ │ │ │ │ └── BpmTaskCandidateFormUserStrategy.java │ │ │ │ │ │ ├── other/ │ │ │ │ │ │ │ ├── BpmTaskCandidateAssignEmptyStrategy.java │ │ │ │ │ │ │ └── BpmTaskCandidateExpressionStrategy.java │ │ │ │ │ │ └── user/ │ │ │ │ │ │ ├── BpmTaskCandidateGroupStrategy.java │ │ │ │ │ │ ├── BpmTaskCandidatePostStrategy.java │ │ │ │ │ │ ├── BpmTaskCandidateRoleStrategy.java │ │ │ │ │ │ ├── BpmTaskCandidateStartUserStrategy.java │ │ │ │ │ │ └── BpmTaskCandidateUserStrategy.java │ │ │ │ │ ├── el/ │ │ │ │ │ │ └── VariableConvertByTypeExpressionFunction.java │ │ │ │ │ ├── enums/ │ │ │ │ │ │ ├── BpmTaskCandidateStrategyEnum.java │ │ │ │ │ │ ├── BpmnModelConstants.java │ │ │ │ │ │ └── BpmnVariableConstants.java │ │ │ │ │ ├── event/ │ │ │ │ │ │ └── BpmProcessInstanceEventPublisher.java │ │ │ │ │ ├── listener/ │ │ │ │ │ │ ├── BpmCopyTaskDelegate.java │ │ │ │ │ │ ├── BpmProcessInstanceEventListener.java │ │ │ │ │ │ ├── BpmTaskEventListener.java │ │ │ │ │ │ ├── BpmTriggerTaskDelegate.java │ │ │ │ │ │ └── demo/ │ │ │ │ │ │ ├── exection/ │ │ │ │ │ │ │ ├── DemoDelegateClassExecutionListener.java │ │ │ │ │ │ │ ├── DemoDelegateExpressionExecutionListener.java │ │ │ │ │ │ │ └── DemoSpringExpressionExecutionListener.java │ │ │ │ │ │ └── task/ │ │ │ │ │ │ ├── DemoDelegateClassTaskListener.java │ │ │ │ │ │ ├── DemoDelegateExpressionTaskListener.java │ │ │ │ │ │ └── DemoSpringExpressionTaskListener.java │ │ │ │ │ └── util/ │ │ │ │ │ ├── BpmHttpRequestUtils.java │ │ │ │ │ ├── BpmnModelUtils.java │ │ │ │ │ ├── FlowableUtils.java │ │ │ │ │ └── SimpleModelUtils.java │ │ │ │ ├── package-info.java │ │ │ │ ├── rpc/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── RpcConfiguration.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── security/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── SecurityConfiguration.java │ │ │ │ │ └── core/ │ │ │ │ │ └── package-info.java │ │ │ │ └── web/ │ │ │ │ ├── config/ │ │ │ │ │ └── BpmWebConfiguration.java │ │ │ │ ├── core/ │ │ │ │ │ └── FlowableWebFilter.java │ │ │ │ └── package-info.java │ │ │ ├── package-info.java │ │ │ └── service/ │ │ │ ├── definition/ │ │ │ │ ├── BpmCategoryService.java │ │ │ │ ├── BpmCategoryServiceImpl.java │ │ │ │ ├── BpmFormService.java │ │ │ │ ├── BpmFormServiceImpl.java │ │ │ │ ├── BpmModelService.java │ │ │ │ ├── BpmModelServiceImpl.java │ │ │ │ ├── BpmProcessDefinitionService.java │ │ │ │ ├── BpmProcessDefinitionServiceImpl.java │ │ │ │ ├── BpmProcessExpressionService.java │ │ │ │ ├── BpmProcessExpressionServiceImpl.java │ │ │ │ ├── BpmProcessListenerService.java │ │ │ │ ├── BpmProcessListenerServiceImpl.java │ │ │ │ ├── BpmUserGroupService.java │ │ │ │ ├── BpmUserGroupServiceImpl.java │ │ │ │ └── dto/ │ │ │ │ ├── BpmFormFieldRespDTO.java │ │ │ │ ├── BpmModelMetaInfoRespDTO.java │ │ │ │ └── BpmProcessDefinitionCreateReqDTO.java │ │ │ ├── message/ │ │ │ │ ├── BpmMessageService.java │ │ │ │ ├── BpmMessageServiceImpl.java │ │ │ │ └── dto/ │ │ │ │ ├── BpmMessageSendWhenProcessInstanceApproveReqDTO.java │ │ │ │ ├── BpmMessageSendWhenProcessInstanceRejectReqDTO.java │ │ │ │ ├── BpmMessageSendWhenTaskCreatedReqDTO.java │ │ │ │ └── BpmMessageSendWhenTaskTimeoutReqDTO.java │ │ │ ├── oa/ │ │ │ │ ├── BpmOALeaveService.java │ │ │ │ ├── BpmOALeaveServiceImpl.java │ │ │ │ └── listener/ │ │ │ │ └── BpmOALeaveStatusListener.java │ │ │ └── task/ │ │ │ ├── BpmProcessInstanceCopyService.java │ │ │ ├── BpmProcessInstanceCopyServiceImpl.java │ │ │ ├── BpmProcessInstanceService.java │ │ │ ├── BpmProcessInstanceServiceImpl.java │ │ │ ├── BpmTaskService.java │ │ │ ├── BpmTaskServiceImpl.java │ │ │ ├── listener/ │ │ │ │ ├── BpmCallActivityListener.java │ │ │ │ └── BpmUserTaskListener.java │ │ │ └── trigger/ │ │ │ ├── BpmTrigger.java │ │ │ ├── form/ │ │ │ │ ├── BpmFormDeleteTrigger.java │ │ │ │ └── BpmFormUpdateTrigger.java │ │ │ └── http/ │ │ │ ├── BpmAbstractHttpRequestTrigger.java │ │ │ ├── BpmHttpCallbackTrigger.java │ │ │ └── BpmSyncHttpRequestTrigger.java │ │ └── resources/ │ │ ├── application-dev.yaml │ │ ├── application-local.yaml │ │ ├── application.yaml │ │ └── logback-spring.xml │ └── test/ │ ├── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── bpm/ │ │ ├── framework/ │ │ │ └── flowable/ │ │ │ └── core/ │ │ │ └── candidate/ │ │ │ ├── BpmTaskCandidateInvokerTest.java │ │ │ ├── expression/ │ │ │ │ └── BpmTaskAssignLeaderExpressionTest.java │ │ │ └── strategy/ │ │ │ ├── dept/ │ │ │ │ ├── BpmTaskCandidateDeptLeaderMultiStrategyTest.java │ │ │ │ ├── BpmTaskCandidateDeptLeaderStrategyTest.java │ │ │ │ ├── BpmTaskCandidateDeptMemberStrategyTest.java │ │ │ │ ├── BpmTaskCandidateStartUserDeptLeaderMultiStrategyTest.java │ │ │ │ ├── BpmTaskCandidateStartUserDeptLeaderStrategyTest.java │ │ │ │ └── BpmTaskCandidateStartUserSelectStrategyTest.java │ │ │ ├── other/ │ │ │ │ ├── BpmTaskCandidateAssignEmptyStrategyTest.java │ │ │ │ └── BpmTaskCandidateExpressionStrategyTest.java │ │ │ └── user/ │ │ │ ├── BpmTaskCandidateGroupStrategyTest.java │ │ │ ├── BpmTaskCandidatePostStrategyTest.java │ │ │ ├── BpmTaskCandidateRoleStrategyTest.java │ │ │ ├── BpmTaskCandidateStartUserStrategyTest.java │ │ │ └── BpmTaskCandidateUserStrategyTest.java │ │ └── service/ │ │ ├── category/ │ │ │ └── BpmCategoryServiceImplTest.java │ │ └── definition/ │ │ ├── BpmFormServiceTest.java │ │ └── BpmUserGroupServiceTest.java │ └── resources/ │ ├── application-unit-test.yaml │ ├── logback.xml │ └── sql/ │ ├── clean.sql │ └── create_tables.sql ├── yudao-module-crm/ │ ├── pom.xml │ ├── yudao-module-crm-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── crm/ │ │ ├── api/ │ │ │ └── package-info.java │ │ └── enums/ │ │ ├── ApiConstants.java │ │ ├── DictTypeConstants.java │ │ ├── ErrorCodeConstants.java │ │ ├── LogRecordConstants.java │ │ ├── business/ │ │ │ └── CrmBusinessEndStatusEnum.java │ │ ├── common/ │ │ │ ├── CrmAuditStatusEnum.java │ │ │ ├── CrmBizTypeEnum.java │ │ │ └── CrmSceneTypeEnum.java │ │ ├── customer/ │ │ │ ├── CrmCustomerLevelEnum.java │ │ │ └── CrmCustomerLimitConfigTypeEnum.java │ │ ├── permission/ │ │ │ └── CrmPermissionLevelEnum.java │ │ ├── product/ │ │ │ └── CrmProductStatusEnum.java │ │ └── receivable/ │ │ └── CrmReceivableReturnTypeEnum.java │ └── yudao-module-crm-server/ │ ├── Dockerfile │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── module/ │ │ │ └── crm/ │ │ │ ├── CrmServerApplication.java │ │ │ ├── api/ │ │ │ │ └── package-info.java │ │ │ ├── controller/ │ │ │ │ ├── admin/ │ │ │ │ │ ├── business/ │ │ │ │ │ │ ├── CrmBusinessController.java │ │ │ │ │ │ ├── CrmBusinessStatusController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── business/ │ │ │ │ │ │ │ ├── CrmBusinessPageReqVO.java │ │ │ │ │ │ │ ├── CrmBusinessRespVO.java │ │ │ │ │ │ │ ├── CrmBusinessSaveReqVO.java │ │ │ │ │ │ │ ├── CrmBusinessTransferReqVO.java │ │ │ │ │ │ │ └── CrmBusinessUpdateStatusReqVO.java │ │ │ │ │ │ └── status/ │ │ │ │ │ │ ├── CrmBusinessStatusRespVO.java │ │ │ │ │ │ └── CrmBusinessStatusSaveReqVO.java │ │ │ │ │ ├── clue/ │ │ │ │ │ │ ├── CrmClueController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── CrmCluePageReqVO.java │ │ │ │ │ │ ├── CrmClueRespVO.java │ │ │ │ │ │ ├── CrmClueSaveReqVO.java │ │ │ │ │ │ └── CrmClueTransferReqVO.java │ │ │ │ │ ├── contact/ │ │ │ │ │ │ ├── CrmContactController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── CrmContactBusiness2ReqVO.java │ │ │ │ │ │ ├── CrmContactBusinessReqVO.java │ │ │ │ │ │ ├── CrmContactPageReqVO.java │ │ │ │ │ │ ├── CrmContactRespVO.java │ │ │ │ │ │ ├── CrmContactSaveReqVO.java │ │ │ │ │ │ └── CrmContactTransferReqVO.java │ │ │ │ │ ├── contract/ │ │ │ │ │ │ ├── CrmContractConfigController.java │ │ │ │ │ │ ├── CrmContractController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ ├── CrmContractConfigRespVO.java │ │ │ │ │ │ │ └── CrmContractConfigSaveReqVO.java │ │ │ │ │ │ └── contract/ │ │ │ │ │ │ ├── CrmContractPageReqVO.java │ │ │ │ │ │ ├── CrmContractRespVO.java │ │ │ │ │ │ ├── CrmContractSaveReqVO.java │ │ │ │ │ │ └── CrmContractTransferReqVO.java │ │ │ │ │ ├── customer/ │ │ │ │ │ │ ├── CrmCustomerController.java │ │ │ │ │ │ ├── CrmCustomerLimitConfigController.java │ │ │ │ │ │ ├── CrmCustomerPoolConfigController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── customer/ │ │ │ │ │ │ │ ├── CrmCustomerDistributeReqVO.java │ │ │ │ │ │ │ ├── CrmCustomerImportExcelVO.java │ │ │ │ │ │ │ ├── CrmCustomerImportReqVO.java │ │ │ │ │ │ │ ├── CrmCustomerImportRespVO.java │ │ │ │ │ │ │ ├── CrmCustomerLockReqVO.java │ │ │ │ │ │ │ ├── CrmCustomerPageReqVO.java │ │ │ │ │ │ │ ├── CrmCustomerRespVO.java │ │ │ │ │ │ │ ├── CrmCustomerSaveReqVO.java │ │ │ │ │ │ │ └── CrmCustomerTransferReqVO.java │ │ │ │ │ │ ├── limitconfig/ │ │ │ │ │ │ │ ├── CrmCustomerLimitConfigPageReqVO.java │ │ │ │ │ │ │ ├── CrmCustomerLimitConfigRespVO.java │ │ │ │ │ │ │ └── CrmCustomerLimitConfigSaveReqVO.java │ │ │ │ │ │ └── poolconfig/ │ │ │ │ │ │ ├── CrmCustomerPoolConfigRespVO.java │ │ │ │ │ │ └── CrmCustomerPoolConfigSaveReqVO.java │ │ │ │ │ ├── followup/ │ │ │ │ │ │ ├── CrmFollowUpRecordController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── CrmFollowUpRecordPageReqVO.java │ │ │ │ │ │ ├── CrmFollowUpRecordRespVO.java │ │ │ │ │ │ └── CrmFollowUpRecordSaveReqVO.java │ │ │ │ │ ├── operatelog/ │ │ │ │ │ │ ├── CrmOperateLogController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── CrmOperateLogPageReqVO.java │ │ │ │ │ │ └── CrmOperateLogRespVO.java │ │ │ │ │ ├── permission/ │ │ │ │ │ │ ├── CrmPermissionController.http │ │ │ │ │ │ ├── CrmPermissionController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── CrmPermissionRespVO.java │ │ │ │ │ │ ├── CrmPermissionSaveReqVO.java │ │ │ │ │ │ └── CrmPermissionUpdateReqVO.java │ │ │ │ │ ├── product/ │ │ │ │ │ │ ├── CrmProductCategoryController.java │ │ │ │ │ │ ├── CrmProductController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── category/ │ │ │ │ │ │ │ ├── CrmProductCategoryCreateReqVO.java │ │ │ │ │ │ │ ├── CrmProductCategoryListReqVO.java │ │ │ │ │ │ │ └── CrmProductCategoryRespVO.java │ │ │ │ │ │ └── product/ │ │ │ │ │ │ ├── CrmProductPageReqVO.java │ │ │ │ │ │ ├── CrmProductRespVO.java │ │ │ │ │ │ └── CrmProductSaveReqVO.java │ │ │ │ │ ├── receivable/ │ │ │ │ │ │ ├── CrmReceivableController.java │ │ │ │ │ │ ├── CrmReceivablePlanController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── plan/ │ │ │ │ │ │ │ ├── CrmReceivablePlanPageReqVO.java │ │ │ │ │ │ │ ├── CrmReceivablePlanRespVO.java │ │ │ │ │ │ │ └── CrmReceivablePlanSaveReqVO.java │ │ │ │ │ │ └── receivable/ │ │ │ │ │ │ ├── CrmReceivablePageReqVO.java │ │ │ │ │ │ ├── CrmReceivableRespVO.java │ │ │ │ │ │ └── CrmReceivableSaveReqVO.java │ │ │ │ │ └── statistics/ │ │ │ │ │ ├── CrmStatisticsCustomerController.http │ │ │ │ │ ├── CrmStatisticsCustomerController.java │ │ │ │ │ ├── CrmStatisticsFunnelController.java │ │ │ │ │ ├── CrmStatisticsPerformanceController.java │ │ │ │ │ ├── CrmStatisticsPortraitController.java │ │ │ │ │ ├── CrmStatisticsRankController.http │ │ │ │ │ ├── CrmStatisticsRankController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── customer/ │ │ │ │ │ │ ├── CrmStatisticsCustomerByUserBaseRespVO.java │ │ │ │ │ │ ├── CrmStatisticsCustomerContractSummaryRespVO.java │ │ │ │ │ │ ├── CrmStatisticsCustomerDealCycleByAreaRespVO.java │ │ │ │ │ │ ├── CrmStatisticsCustomerDealCycleByDateRespVO.java │ │ │ │ │ │ ├── CrmStatisticsCustomerDealCycleByProductRespVO.java │ │ │ │ │ │ ├── CrmStatisticsCustomerDealCycleByUserRespVO.java │ │ │ │ │ │ ├── CrmStatisticsCustomerReqVO.java │ │ │ │ │ │ ├── CrmStatisticsCustomerSummaryByDateRespVO.java │ │ │ │ │ │ ├── CrmStatisticsCustomerSummaryByUserRespVO.java │ │ │ │ │ │ ├── CrmStatisticsFollowUpSummaryByDateRespVO.java │ │ │ │ │ │ ├── CrmStatisticsFollowUpSummaryByTypeRespVO.java │ │ │ │ │ │ ├── CrmStatisticsFollowUpSummaryByUserRespVO.java │ │ │ │ │ │ ├── CrmStatisticsPoolSummaryByDateRespVO.java │ │ │ │ │ │ └── CrmStatisticsPoolSummaryByUserRespVO.java │ │ │ │ │ ├── funnel/ │ │ │ │ │ │ ├── CrmStatisticFunnelSummaryRespVO.java │ │ │ │ │ │ ├── CrmStatisticsBusinessInversionRateSummaryByDateRespVO.java │ │ │ │ │ │ ├── CrmStatisticsBusinessSummaryByDateRespVO.java │ │ │ │ │ │ ├── CrmStatisticsBusinessSummaryByEndStatusRespVO.java │ │ │ │ │ │ └── CrmStatisticsFunnelReqVO.java │ │ │ │ │ ├── performance/ │ │ │ │ │ │ ├── CrmStatisticsPerformanceReqVO.java │ │ │ │ │ │ └── CrmStatisticsPerformanceRespVO.java │ │ │ │ │ ├── portrait/ │ │ │ │ │ │ ├── CrmStatisticCustomerAreaRespVO.java │ │ │ │ │ │ ├── CrmStatisticCustomerIndustryRespVO.java │ │ │ │ │ │ ├── CrmStatisticCustomerLevelRespVO.java │ │ │ │ │ │ ├── CrmStatisticCustomerSourceRespVO.java │ │ │ │ │ │ └── CrmStatisticsPortraitReqVO.java │ │ │ │ │ └── rank/ │ │ │ │ │ ├── CrmStatisticsRankReqVO.java │ │ │ │ │ └── CrmStatisticsRankRespVO.java │ │ │ │ ├── app/ │ │ │ │ │ └── package-info.java │ │ │ │ └── package-info.java │ │ │ ├── convert/ │ │ │ │ ├── package-info.java │ │ │ │ └── 《芋道 Spring Boot 对象转换 MapStruct 入门》.md │ │ │ ├── dal/ │ │ │ │ ├── dataobject/ │ │ │ │ │ ├── business/ │ │ │ │ │ │ ├── CrmBusinessDO.java │ │ │ │ │ │ ├── CrmBusinessProductDO.java │ │ │ │ │ │ ├── CrmBusinessStatusDO.java │ │ │ │ │ │ └── CrmBusinessStatusTypeDO.java │ │ │ │ │ ├── clue/ │ │ │ │ │ │ ├── CrmClueDO.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── contact/ │ │ │ │ │ │ ├── CrmContactBusinessDO.java │ │ │ │ │ │ ├── CrmContactDO.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── contract/ │ │ │ │ │ │ ├── CrmContractConfigDO.java │ │ │ │ │ │ ├── CrmContractDO.java │ │ │ │ │ │ └── CrmContractProductDO.java │ │ │ │ │ ├── customer/ │ │ │ │ │ │ ├── CrmCustomerDO.java │ │ │ │ │ │ ├── CrmCustomerLimitConfigDO.java │ │ │ │ │ │ └── CrmCustomerPoolConfigDO.java │ │ │ │ │ ├── followup/ │ │ │ │ │ │ └── CrmFollowUpRecordDO.java │ │ │ │ │ ├── permission/ │ │ │ │ │ │ └── CrmPermissionDO.java │ │ │ │ │ ├── product/ │ │ │ │ │ │ ├── CrmProductCategoryDO.java │ │ │ │ │ │ ├── CrmProductDO.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── receivable/ │ │ │ │ │ ├── CrmReceivableDO.java │ │ │ │ │ └── CrmReceivablePlanDO.java │ │ │ │ ├── mysql/ │ │ │ │ │ ├── business/ │ │ │ │ │ │ ├── CrmBusinessMapper.java │ │ │ │ │ │ ├── CrmBusinessProductMapper.java │ │ │ │ │ │ ├── CrmBusinessStatusMapper.java │ │ │ │ │ │ └── CrmBusinessStatusTypeMapper.java │ │ │ │ │ ├── clue/ │ │ │ │ │ │ ├── CrmClueMapper.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── contact/ │ │ │ │ │ │ ├── CrmContactBusinessMapper.java │ │ │ │ │ │ └── CrmContactMapper.java │ │ │ │ │ ├── contract/ │ │ │ │ │ │ ├── CrmContractConfigMapper.java │ │ │ │ │ │ ├── CrmContractMapper.java │ │ │ │ │ │ └── CrmContractProductMapper.java │ │ │ │ │ ├── customer/ │ │ │ │ │ │ ├── CrmCustomerLimitConfigMapper.java │ │ │ │ │ │ ├── CrmCustomerMapper.java │ │ │ │ │ │ └── CrmCustomerPoolConfigMapper.java │ │ │ │ │ ├── followup/ │ │ │ │ │ │ └── CrmFollowUpRecordMapper.java │ │ │ │ │ ├── permission/ │ │ │ │ │ │ ├── CrmPermissionMapper.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── product/ │ │ │ │ │ │ ├── CrmProductCategoryMapper.java │ │ │ │ │ │ └── CrmProductMapper.java │ │ │ │ │ ├── receivable/ │ │ │ │ │ │ ├── CrmReceivableMapper.java │ │ │ │ │ │ └── CrmReceivablePlanMapper.java │ │ │ │ │ └── statistics/ │ │ │ │ │ ├── CrmStatisticsCustomerMapper.java │ │ │ │ │ ├── CrmStatisticsFunnelMapper.java │ │ │ │ │ ├── CrmStatisticsPerformanceMapper.java │ │ │ │ │ ├── CrmStatisticsPortraitMapper.java │ │ │ │ │ └── CrmStatisticsRankMapper.java │ │ │ │ └── redis/ │ │ │ │ ├── RedisKeyConstants.java │ │ │ │ └── no/ │ │ │ │ └── CrmNoRedisDAO.java │ │ │ ├── framework/ │ │ │ │ ├── excel/ │ │ │ │ │ ├── core/ │ │ │ │ │ │ └── AreaExcelColumnSelectFunction.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── operatelog/ │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── CrmBusinessParseFunction.java │ │ │ │ │ │ ├── CrmContactParseFunction.java │ │ │ │ │ │ ├── CrmContractParseFunction.java │ │ │ │ │ │ ├── CrmCustomerIndustryParseFunction.java │ │ │ │ │ │ ├── CrmCustomerLevelParseFunction.java │ │ │ │ │ │ ├── CrmCustomerParseFunction.java │ │ │ │ │ │ ├── CrmCustomerSourceParseFunction.java │ │ │ │ │ │ ├── CrmProductStatusParseFunction.java │ │ │ │ │ │ ├── CrmProductUnitParseFunction.java │ │ │ │ │ │ ├── CrmReceivablePlanParseFunction.java │ │ │ │ │ │ ├── CrmReceivableReturnTypeParseFunction.java │ │ │ │ │ │ ├── SysAdminUserParseFunction.java │ │ │ │ │ │ ├── SysAreaParseFunction.java │ │ │ │ │ │ ├── SysBooleanParseFunction.java │ │ │ │ │ │ ├── SysDeptParseFunction.java │ │ │ │ │ │ └── SysSexParseFunction.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── package-info.java │ │ │ │ ├── permission/ │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── annotations/ │ │ │ │ │ │ │ └── CrmPermission.java │ │ │ │ │ │ ├── aop/ │ │ │ │ │ │ │ └── CrmPermissionAspect.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── rpc/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── RpcConfiguration.java │ │ │ │ │ └── package-info.java │ │ │ │ └── security/ │ │ │ │ ├── config/ │ │ │ │ │ └── SecurityConfiguration.java │ │ │ │ └── core/ │ │ │ │ └── package-info.java │ │ │ ├── job/ │ │ │ │ ├── customer/ │ │ │ │ │ └── CrmCustomerAutoPutPoolJob.java │ │ │ │ └── package-info.java │ │ │ ├── package-info.java │ │ │ ├── service/ │ │ │ │ ├── business/ │ │ │ │ │ ├── CrmBusinessService.java │ │ │ │ │ ├── CrmBusinessServiceImpl.java │ │ │ │ │ ├── CrmBusinessStatusService.java │ │ │ │ │ └── CrmBusinessStatusServiceImpl.java │ │ │ │ ├── clue/ │ │ │ │ │ ├── CrmClueService.java │ │ │ │ │ └── CrmClueServiceImpl.java │ │ │ │ ├── contact/ │ │ │ │ │ ├── CrmContactBusinessService.java │ │ │ │ │ ├── CrmContactBusinessServiceImpl.java │ │ │ │ │ ├── CrmContactService.java │ │ │ │ │ └── CrmContactServiceImpl.java │ │ │ │ ├── contract/ │ │ │ │ │ ├── CrmContractConfigService.java │ │ │ │ │ ├── CrmContractConfigServiceImpl.java │ │ │ │ │ ├── CrmContractService.java │ │ │ │ │ ├── CrmContractServiceImpl.java │ │ │ │ │ └── listener/ │ │ │ │ │ └── CrmContractStatusListener.java │ │ │ │ ├── customer/ │ │ │ │ │ ├── CrmCustomerLimitConfigService.java │ │ │ │ │ ├── CrmCustomerLimitConfigServiceImpl.java │ │ │ │ │ ├── CrmCustomerPoolConfigService.java │ │ │ │ │ ├── CrmCustomerPoolConfigServiceImpl.java │ │ │ │ │ ├── CrmCustomerService.java │ │ │ │ │ ├── CrmCustomerServiceImpl.java │ │ │ │ │ └── bo/ │ │ │ │ │ └── CrmCustomerCreateReqBO.java │ │ │ │ ├── followup/ │ │ │ │ │ ├── CrmFollowUpRecordService.java │ │ │ │ │ ├── CrmFollowUpRecordServiceImpl.java │ │ │ │ │ └── bo/ │ │ │ │ │ └── CrmFollowUpCreateReqBO.java │ │ │ │ ├── permission/ │ │ │ │ │ ├── CrmPermissionService.java │ │ │ │ │ ├── CrmPermissionServiceImpl.java │ │ │ │ │ └── bo/ │ │ │ │ │ ├── CrmPermissionCreateReqBO.java │ │ │ │ │ └── CrmPermissionTransferReqBO.java │ │ │ │ ├── product/ │ │ │ │ │ ├── CrmProductCategoryService.java │ │ │ │ │ ├── CrmProductCategoryServiceImpl.java │ │ │ │ │ ├── CrmProductService.java │ │ │ │ │ └── CrmProductServiceImpl.java │ │ │ │ ├── receivable/ │ │ │ │ │ ├── CrmReceivablePlanService.java │ │ │ │ │ ├── CrmReceivablePlanServiceImpl.java │ │ │ │ │ ├── CrmReceivableService.java │ │ │ │ │ ├── CrmReceivableServiceImpl.java │ │ │ │ │ └── listener/ │ │ │ │ │ └── CrmReceivableStatusListener.java │ │ │ │ └── statistics/ │ │ │ │ ├── CrmStatisticsCustomerService.java │ │ │ │ ├── CrmStatisticsCustomerServiceImpl.java │ │ │ │ ├── CrmStatisticsFunnelService.java │ │ │ │ ├── CrmStatisticsFunnelServiceImpl.java │ │ │ │ ├── CrmStatisticsPerformanceService.java │ │ │ │ ├── CrmStatisticsPerformanceServiceImpl.java │ │ │ │ ├── CrmStatisticsPortraitService.java │ │ │ │ ├── CrmStatisticsPortraitServiceImpl.java │ │ │ │ ├── CrmStatisticsRankService.java │ │ │ │ └── CrmStatisticsRankServiceImpl.java │ │ │ └── util/ │ │ │ ├── CrmAuditStatusUtils.java │ │ │ └── CrmPermissionUtils.java │ │ └── resources/ │ │ ├── application-dev.yaml │ │ ├── application-local.yaml │ │ ├── application.yaml │ │ ├── logback-spring.xml │ │ └── mapper/ │ │ └── statistics/ │ │ ├── CrmStatisticsCustomerMapper.xml │ │ ├── CrmStatisticsFunnelMapper.xml │ │ ├── CrmStatisticsPerformanceMapper.xml │ │ ├── CrmStatisticsPortraitMapper.xml │ │ └── CrmStatisticsRankMapper.xml │ └── test/ │ └── resources/ │ ├── application-unit-test.yaml │ └── logback.xml ├── yudao-module-erp/ │ ├── pom.xml │ ├── yudao-module-erp-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── erp/ │ │ ├── api/ │ │ │ └── package-info.java │ │ └── enums/ │ │ ├── ApiConstants.java │ │ ├── DictTypeConstants.java │ │ ├── ErpAuditStatus.java │ │ ├── ErrorCodeConstants.java │ │ ├── LogRecordConstants.java │ │ ├── common/ │ │ │ └── ErpBizTypeEnum.java │ │ └── stock/ │ │ └── ErpStockRecordBizTypeEnum.java │ └── yudao-module-erp-server/ │ ├── Dockerfile │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── erp/ │ │ ├── ErpServerApplication.java │ │ ├── controller/ │ │ │ ├── admin/ │ │ │ │ ├── finance/ │ │ │ │ │ ├── ErpAccountController.java │ │ │ │ │ ├── ErpFinancePaymentController.java │ │ │ │ │ ├── ErpFinanceReceiptController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── account/ │ │ │ │ │ │ ├── ErpAccountPageReqVO.java │ │ │ │ │ │ ├── ErpAccountRespVO.java │ │ │ │ │ │ └── ErpAccountSaveReqVO.java │ │ │ │ │ ├── payment/ │ │ │ │ │ │ ├── ErpFinancePaymentPageReqVO.java │ │ │ │ │ │ ├── ErpFinancePaymentRespVO.java │ │ │ │ │ │ └── ErpFinancePaymentSaveReqVO.java │ │ │ │ │ └── receipt/ │ │ │ │ │ ├── ErpFinanceReceiptPageReqVO.java │ │ │ │ │ ├── ErpFinanceReceiptRespVO.java │ │ │ │ │ └── ErpFinanceReceiptSaveReqVO.java │ │ │ │ ├── product/ │ │ │ │ │ ├── ErpProductCategoryController.java │ │ │ │ │ ├── ErpProductController.java │ │ │ │ │ ├── ErpProductUnitController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── category/ │ │ │ │ │ │ ├── ErpProductCategoryListReqVO.java │ │ │ │ │ │ ├── ErpProductCategoryRespVO.java │ │ │ │ │ │ └── ErpProductCategorySaveReqVO.java │ │ │ │ │ ├── product/ │ │ │ │ │ │ ├── ErpProductPageReqVO.java │ │ │ │ │ │ ├── ErpProductRespVO.java │ │ │ │ │ │ └── ProductSaveReqVO.java │ │ │ │ │ └── unit/ │ │ │ │ │ ├── ErpProductUnitPageReqVO.java │ │ │ │ │ ├── ErpProductUnitRespVO.java │ │ │ │ │ └── ErpProductUnitSaveReqVO.java │ │ │ │ ├── purchase/ │ │ │ │ │ ├── ErpPurchaseInController.java │ │ │ │ │ ├── ErpPurchaseOrderController.java │ │ │ │ │ ├── ErpPurchaseReturnController.java │ │ │ │ │ ├── ErpSupplierController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── in/ │ │ │ │ │ │ ├── ErpPurchaseInPageReqVO.java │ │ │ │ │ │ ├── ErpPurchaseInRespVO.java │ │ │ │ │ │ └── ErpPurchaseInSaveReqVO.java │ │ │ │ │ ├── order/ │ │ │ │ │ │ ├── ErpPurchaseOrderPageReqVO.java │ │ │ │ │ │ ├── ErpPurchaseOrderRespVO.java │ │ │ │ │ │ └── ErpPurchaseOrderSaveReqVO.java │ │ │ │ │ ├── returns/ │ │ │ │ │ │ ├── ErpPurchaseReturnPageReqVO.java │ │ │ │ │ │ ├── ErpPurchaseReturnRespVO.java │ │ │ │ │ │ └── ErpPurchaseReturnSaveReqVO.java │ │ │ │ │ └── supplier/ │ │ │ │ │ ├── ErpSupplierPageReqVO.java │ │ │ │ │ ├── ErpSupplierRespVO.java │ │ │ │ │ └── ErpSupplierSaveReqVO.java │ │ │ │ ├── sale/ │ │ │ │ │ ├── ErpCustomerController.java │ │ │ │ │ ├── ErpSaleOrderController.java │ │ │ │ │ ├── ErpSaleOutController.java │ │ │ │ │ ├── ErpSaleReturnController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── customer/ │ │ │ │ │ │ ├── ErpCustomerPageReqVO.java │ │ │ │ │ │ ├── ErpCustomerRespVO.java │ │ │ │ │ │ └── ErpCustomerSaveReqVO.java │ │ │ │ │ ├── order/ │ │ │ │ │ │ ├── ErpSaleOrderPageReqVO.java │ │ │ │ │ │ ├── ErpSaleOrderRespVO.java │ │ │ │ │ │ └── ErpSaleOrderSaveReqVO.java │ │ │ │ │ ├── out/ │ │ │ │ │ │ ├── ErpSaleOutPageReqVO.java │ │ │ │ │ │ ├── ErpSaleOutRespVO.java │ │ │ │ │ │ └── ErpSaleOutSaveReqVO.java │ │ │ │ │ └── returns/ │ │ │ │ │ ├── ErpSaleReturnPageReqVO.java │ │ │ │ │ ├── ErpSaleReturnRespVO.java │ │ │ │ │ └── ErpSaleReturnSaveReqVO.java │ │ │ │ ├── statistics/ │ │ │ │ │ ├── ErpPurchaseStatisticsController.java │ │ │ │ │ ├── ErpSaleStatisticsController.http │ │ │ │ │ ├── ErpSaleStatisticsController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── purchase/ │ │ │ │ │ │ ├── ErpPurchaseSummaryRespVO.java │ │ │ │ │ │ └── ErpPurchaseTimeSummaryRespVO.java │ │ │ │ │ └── sale/ │ │ │ │ │ ├── ErpSaleSummaryRespVO.java │ │ │ │ │ └── ErpSaleTimeSummaryRespVO.java │ │ │ │ └── stock/ │ │ │ │ ├── ErpStockCheckController.java │ │ │ │ ├── ErpStockController.java │ │ │ │ ├── ErpStockInController.java │ │ │ │ ├── ErpStockMoveController.java │ │ │ │ ├── ErpStockOutController.java │ │ │ │ ├── ErpStockRecordController.java │ │ │ │ ├── ErpWarehouseController.java │ │ │ │ └── vo/ │ │ │ │ ├── check/ │ │ │ │ │ ├── ErpStockCheckPageReqVO.java │ │ │ │ │ ├── ErpStockCheckRespVO.java │ │ │ │ │ └── ErpStockCheckSaveReqVO.java │ │ │ │ ├── in/ │ │ │ │ │ ├── ErpStockInPageReqVO.java │ │ │ │ │ ├── ErpStockInRespVO.java │ │ │ │ │ └── ErpStockInSaveReqVO.java │ │ │ │ ├── move/ │ │ │ │ │ ├── ErpStockMovePageReqVO.java │ │ │ │ │ ├── ErpStockMoveRespVO.java │ │ │ │ │ └── ErpStockMoveSaveReqVO.java │ │ │ │ ├── out/ │ │ │ │ │ ├── ErpStockOutPageReqVO.java │ │ │ │ │ ├── ErpStockOutRespVO.java │ │ │ │ │ └── ErpStockOutSaveReqVO.java │ │ │ │ ├── record/ │ │ │ │ │ ├── ErpStockRecordPageReqVO.java │ │ │ │ │ └── ErpStockRecordRespVO.java │ │ │ │ ├── stock/ │ │ │ │ │ ├── ErpStockPageReqVO.java │ │ │ │ │ └── ErpStockRespVO.java │ │ │ │ └── warehouse/ │ │ │ │ ├── ErpWarehousePageReqVO.java │ │ │ │ ├── ErpWarehouseRespVO.java │ │ │ │ └── ErpWarehouseSaveReqVO.java │ │ │ └── package-info.java │ │ ├── dal/ │ │ │ ├── dataobject/ │ │ │ │ ├── finance/ │ │ │ │ │ ├── ErpAccountDO.java │ │ │ │ │ ├── ErpFinancePaymentDO.java │ │ │ │ │ ├── ErpFinancePaymentItemDO.java │ │ │ │ │ ├── ErpFinanceReceiptDO.java │ │ │ │ │ └── ErpFinanceReceiptItemDO.java │ │ │ │ ├── product/ │ │ │ │ │ ├── ErpProductCategoryDO.java │ │ │ │ │ ├── ErpProductDO.java │ │ │ │ │ └── ErpProductUnitDO.java │ │ │ │ ├── purchase/ │ │ │ │ │ ├── ErpPurchaseInDO.java │ │ │ │ │ ├── ErpPurchaseInItemDO.java │ │ │ │ │ ├── ErpPurchaseOrderDO.java │ │ │ │ │ ├── ErpPurchaseOrderItemDO.java │ │ │ │ │ ├── ErpPurchaseReturnDO.java │ │ │ │ │ ├── ErpPurchaseReturnItemDO.java │ │ │ │ │ └── ErpSupplierDO.java │ │ │ │ ├── sale/ │ │ │ │ │ ├── ErpCustomerDO.java │ │ │ │ │ ├── ErpSaleOrderDO.java │ │ │ │ │ ├── ErpSaleOrderItemDO.java │ │ │ │ │ ├── ErpSaleOutDO.java │ │ │ │ │ ├── ErpSaleOutItemDO.java │ │ │ │ │ ├── ErpSaleReturnDO.java │ │ │ │ │ └── ErpSaleReturnItemDO.java │ │ │ │ └── stock/ │ │ │ │ ├── ErpStockCheckDO.java │ │ │ │ ├── ErpStockCheckItemDO.java │ │ │ │ ├── ErpStockDO.java │ │ │ │ ├── ErpStockInDO.java │ │ │ │ ├── ErpStockInItemDO.java │ │ │ │ ├── ErpStockMoveDO.java │ │ │ │ ├── ErpStockMoveItemDO.java │ │ │ │ ├── ErpStockOutDO.java │ │ │ │ ├── ErpStockOutItemDO.java │ │ │ │ ├── ErpStockRecordDO.java │ │ │ │ └── ErpWarehouseDO.java │ │ │ ├── mysql/ │ │ │ │ ├── finance/ │ │ │ │ │ ├── ErpAccountMapper.java │ │ │ │ │ ├── ErpFinancePaymentItemMapper.java │ │ │ │ │ ├── ErpFinancePaymentMapper.java │ │ │ │ │ ├── ErpFinanceReceiptItemMapper.java │ │ │ │ │ └── ErpFinanceReceiptMapper.java │ │ │ │ ├── product/ │ │ │ │ │ ├── ErpProductCategoryMapper.java │ │ │ │ │ ├── ErpProductMapper.java │ │ │ │ │ └── ErpProductUnitMapper.java │ │ │ │ ├── purchase/ │ │ │ │ │ ├── ErpPurchaseInItemMapper.java │ │ │ │ │ ├── ErpPurchaseInMapper.java │ │ │ │ │ ├── ErpPurchaseOrderItemMapper.java │ │ │ │ │ ├── ErpPurchaseOrderMapper.java │ │ │ │ │ ├── ErpPurchaseReturnItemMapper.java │ │ │ │ │ ├── ErpPurchaseReturnMapper.java │ │ │ │ │ └── ErpSupplierMapper.java │ │ │ │ ├── sale/ │ │ │ │ │ ├── ErpCustomerMapper.java │ │ │ │ │ ├── ErpSaleOrderItemMapper.java │ │ │ │ │ ├── ErpSaleOrderMapper.java │ │ │ │ │ ├── ErpSaleOutItemMapper.java │ │ │ │ │ ├── ErpSaleOutMapper.java │ │ │ │ │ ├── ErpSaleReturnItemMapper.java │ │ │ │ │ └── ErpSaleReturnMapper.java │ │ │ │ ├── statistics/ │ │ │ │ │ ├── ErpPurchaseStatisticsMapper.java │ │ │ │ │ └── ErpSaleStatisticsMapper.java │ │ │ │ └── stock/ │ │ │ │ ├── ErpStockCheckItemMapper.java │ │ │ │ ├── ErpStockCheckMapper.java │ │ │ │ ├── ErpStockInItemMapper.java │ │ │ │ ├── ErpStockInMapper.java │ │ │ │ ├── ErpStockMapper.java │ │ │ │ ├── ErpStockMoveItemMapper.java │ │ │ │ ├── ErpStockMoveMapper.java │ │ │ │ ├── ErpStockOutItemMapper.java │ │ │ │ ├── ErpStockOutMapper.java │ │ │ │ ├── ErpStockRecordMapper.java │ │ │ │ └── ErpWarehouseMapper.java │ │ │ └── redis/ │ │ │ ├── RedisKeyConstants.java │ │ │ └── no/ │ │ │ └── ErpNoRedisDAO.java │ │ ├── framework/ │ │ │ ├── package-info.java │ │ │ ├── rpc/ │ │ │ │ ├── config/ │ │ │ │ │ └── RpcConfiguration.java │ │ │ │ └── package-info.java │ │ │ └── security/ │ │ │ ├── config/ │ │ │ │ └── SecurityConfiguration.java │ │ │ └── core/ │ │ │ └── package-info.java │ │ ├── package-info.java │ │ └── service/ │ │ ├── finance/ │ │ │ ├── ErpAccountService.java │ │ │ ├── ErpAccountServiceImpl.java │ │ │ ├── ErpFinancePaymentService.java │ │ │ ├── ErpFinancePaymentServiceImpl.java │ │ │ ├── ErpFinanceReceiptService.java │ │ │ └── ErpFinanceReceiptServiceImpl.java │ │ ├── product/ │ │ │ ├── ErpProductCategoryService.java │ │ │ ├── ErpProductCategoryServiceImpl.java │ │ │ ├── ErpProductService.java │ │ │ ├── ErpProductServiceImpl.java │ │ │ ├── ErpProductUnitService.java │ │ │ └── ErpProductUnitServiceImpl.java │ │ ├── purchase/ │ │ │ ├── ErpPurchaseInService.java │ │ │ ├── ErpPurchaseInServiceImpl.java │ │ │ ├── ErpPurchaseOrderService.java │ │ │ ├── ErpPurchaseOrderServiceImpl.java │ │ │ ├── ErpPurchaseReturnService.java │ │ │ ├── ErpPurchaseReturnServiceImpl.java │ │ │ ├── ErpSupplierService.java │ │ │ └── ErpSupplierServiceImpl.java │ │ ├── sale/ │ │ │ ├── ErpCustomerService.java │ │ │ ├── ErpCustomerServiceImpl.java │ │ │ ├── ErpSaleOrderService.java │ │ │ ├── ErpSaleOrderServiceImpl.java │ │ │ ├── ErpSaleOutService.java │ │ │ ├── ErpSaleOutServiceImpl.java │ │ │ ├── ErpSaleReturnService.java │ │ │ └── ErpSaleReturnServiceImpl.java │ │ ├── statistics/ │ │ │ ├── ErpPurchaseStatisticsService.java │ │ │ ├── ErpPurchaseStatisticsServiceImpl.java │ │ │ ├── ErpSaleStatisticsService.java │ │ │ └── ErpSaleStatisticsServiceImpl.java │ │ └── stock/ │ │ ├── ErpStockCheckService.java │ │ ├── ErpStockCheckServiceImpl.java │ │ ├── ErpStockInService.java │ │ ├── ErpStockInServiceImpl.java │ │ ├── ErpStockMoveService.java │ │ ├── ErpStockMoveServiceImpl.java │ │ ├── ErpStockOutService.java │ │ ├── ErpStockOutServiceImpl.java │ │ ├── ErpStockRecordService.java │ │ ├── ErpStockRecordServiceImpl.java │ │ ├── ErpStockService.java │ │ ├── ErpStockServiceImpl.java │ │ ├── ErpWarehouseService.java │ │ ├── ErpWarehouseServiceImpl.java │ │ └── bo/ │ │ └── ErpStockRecordCreateReqBO.java │ └── resources/ │ ├── application-dev.yaml │ ├── application-local.yaml │ ├── application.yaml │ ├── logback-spring.xml │ └── mapper/ │ └── statistics/ │ ├── ErpPurchaseStatisticsMapper.xml │ └── ErpSaleStatisticsMapper.xml ├── yudao-module-infra/ │ ├── pom.xml │ ├── yudao-module-infra-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── infra/ │ │ ├── api/ │ │ │ ├── config/ │ │ │ │ └── ConfigApi.java │ │ │ ├── file/ │ │ │ │ ├── FileApi.java │ │ │ │ └── dto/ │ │ │ │ └── FileCreateReqDTO.java │ │ │ ├── package-info.java │ │ │ └── websocket/ │ │ │ ├── WebSocketSenderApi.java │ │ │ └── dto/ │ │ │ └── WebSocketSendReqDTO.java │ │ └── enums/ │ │ ├── ApiConstants.java │ │ ├── DictTypeConstants.java │ │ ├── ErrorCodeConstants.java │ │ ├── codegen/ │ │ │ ├── CodegenColumnHtmlTypeEnum.java │ │ │ ├── CodegenColumnListConditionEnum.java │ │ │ ├── CodegenFrontTypeEnum.java │ │ │ ├── CodegenSceneEnum.java │ │ │ ├── CodegenTemplateTypeEnum.java │ │ │ └── CodegenVOTypeEnum.java │ │ ├── config/ │ │ │ └── ConfigTypeEnum.java │ │ ├── logger/ │ │ │ └── ApiErrorLogProcessStatusEnum.java │ │ └── package-info.java │ └── yudao-module-infra-server/ │ ├── Dockerfile │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── module/ │ │ │ └── infra/ │ │ │ ├── InfraServerApplication.java │ │ │ ├── api/ │ │ │ │ ├── config/ │ │ │ │ │ └── ConfigApiImpl.java │ │ │ │ ├── file/ │ │ │ │ │ └── FileApiImpl.java │ │ │ │ ├── logger/ │ │ │ │ │ ├── ApiAccessLogApiImpl.java │ │ │ │ │ └── ApiErrorLogApiImpl.java │ │ │ │ ├── package-info.java │ │ │ │ └── websocket/ │ │ │ │ └── WebSocketSenderApiImpl.java │ │ │ ├── controller/ │ │ │ │ ├── admin/ │ │ │ │ │ ├── codegen/ │ │ │ │ │ │ ├── CodegenController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── CodegenCreateListReqVO.java │ │ │ │ │ │ ├── CodegenDetailRespVO.java │ │ │ │ │ │ ├── CodegenPreviewRespVO.java │ │ │ │ │ │ ├── CodegenUpdateReqVO.java │ │ │ │ │ │ ├── column/ │ │ │ │ │ │ │ ├── CodegenColumnRespVO.java │ │ │ │ │ │ │ └── CodegenColumnSaveReqVO.java │ │ │ │ │ │ └── table/ │ │ │ │ │ │ ├── CodegenTablePageReqVO.java │ │ │ │ │ │ ├── CodegenTableRespVO.java │ │ │ │ │ │ ├── CodegenTableSaveReqVO.java │ │ │ │ │ │ └── DatabaseTableRespVO.java │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── ConfigController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── ConfigPageReqVO.java │ │ │ │ │ │ ├── ConfigRespVO.java │ │ │ │ │ │ └── ConfigSaveReqVO.java │ │ │ │ │ ├── db/ │ │ │ │ │ │ ├── DataSourceConfigController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── DataSourceConfigRespVO.java │ │ │ │ │ │ └── DataSourceConfigSaveReqVO.java │ │ │ │ │ ├── demo/ │ │ │ │ │ │ ├── demo01/ │ │ │ │ │ │ │ ├── Demo01ContactController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── Demo01ContactPageReqVO.java │ │ │ │ │ │ │ ├── Demo01ContactRespVO.java │ │ │ │ │ │ │ └── Demo01ContactSaveReqVO.java │ │ │ │ │ │ ├── demo02/ │ │ │ │ │ │ │ ├── Demo02CategoryController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── Demo02CategoryListReqVO.java │ │ │ │ │ │ │ ├── Demo02CategoryRespVO.java │ │ │ │ │ │ │ └── Demo02CategorySaveReqVO.java │ │ │ │ │ │ ├── demo03/ │ │ │ │ │ │ │ ├── erp/ │ │ │ │ │ │ │ │ ├── Demo03StudentErpController.java │ │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ │ ├── Demo03StudentErpPageReqVO.java │ │ │ │ │ │ │ │ ├── Demo03StudentErpRespVO.java │ │ │ │ │ │ │ │ └── Demo03StudentErpSaveReqVO.java │ │ │ │ │ │ │ ├── inner/ │ │ │ │ │ │ │ │ ├── Demo03StudentInnerController.java │ │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ │ ├── Demo03StudentInnerPageReqVO.java │ │ │ │ │ │ │ │ ├── Demo03StudentInnerRespVO.java │ │ │ │ │ │ │ │ └── Demo03StudentInnerSaveReqVO.java │ │ │ │ │ │ │ └── normal/ │ │ │ │ │ │ │ ├── Demo03StudentNormalController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── Demo03StudentNormalPageReqVO.java │ │ │ │ │ │ │ ├── Demo03StudentNormalRespVO.java │ │ │ │ │ │ │ └── Demo03StudentNormalSaveReqVO.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── file/ │ │ │ │ │ │ ├── FileConfigController.http │ │ │ │ │ │ ├── FileConfigController.java │ │ │ │ │ │ ├── FileController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ ├── FileConfigPageReqVO.java │ │ │ │ │ │ │ ├── FileConfigRespVO.java │ │ │ │ │ │ │ └── FileConfigSaveReqVO.java │ │ │ │ │ │ └── file/ │ │ │ │ │ │ ├── FileCreateReqVO.java │ │ │ │ │ │ ├── FilePageReqVO.java │ │ │ │ │ │ ├── FilePresignedUrlRespVO.java │ │ │ │ │ │ ├── FileRespVO.java │ │ │ │ │ │ └── FileUploadReqVO.java │ │ │ │ │ ├── logger/ │ │ │ │ │ │ ├── ApiAccessLogController.java │ │ │ │ │ │ ├── ApiErrorLogController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── apiaccesslog/ │ │ │ │ │ │ │ ├── ApiAccessLogPageReqVO.java │ │ │ │ │ │ │ └── ApiAccessLogRespVO.java │ │ │ │ │ │ └── apierrorlog/ │ │ │ │ │ │ ├── ApiErrorLogPageReqVO.java │ │ │ │ │ │ └── ApiErrorLogRespVO.java │ │ │ │ │ └── redis/ │ │ │ │ │ ├── RedisController.http │ │ │ │ │ ├── RedisController.java │ │ │ │ │ └── vo/ │ │ │ │ │ └── RedisMonitorRespVO.java │ │ │ │ ├── app/ │ │ │ │ │ ├── file/ │ │ │ │ │ │ ├── AppFileController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ └── AppFileUploadReqVO.java │ │ │ │ │ └── package-info.java │ │ │ │ └── package-info.java │ │ │ ├── convert/ │ │ │ │ ├── codegen/ │ │ │ │ │ └── CodegenConvert.java │ │ │ │ ├── config/ │ │ │ │ │ └── ConfigConvert.java │ │ │ │ ├── file/ │ │ │ │ │ └── FileConfigConvert.java │ │ │ │ ├── package-info.java │ │ │ │ ├── redis/ │ │ │ │ │ └── RedisConvert.java │ │ │ │ └── 《芋道 Spring Boot 对象转换 MapStruct 入门》.md │ │ │ ├── dal/ │ │ │ │ ├── dataobject/ │ │ │ │ │ ├── codegen/ │ │ │ │ │ │ ├── CodegenColumnDO.java │ │ │ │ │ │ └── CodegenTableDO.java │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── ConfigDO.java │ │ │ │ │ ├── db/ │ │ │ │ │ │ └── DataSourceConfigDO.java │ │ │ │ │ ├── demo/ │ │ │ │ │ │ ├── demo01/ │ │ │ │ │ │ │ └── Demo01ContactDO.java │ │ │ │ │ │ ├── demo02/ │ │ │ │ │ │ │ └── Demo02CategoryDO.java │ │ │ │ │ │ └── demo03/ │ │ │ │ │ │ ├── Demo03CourseDO.java │ │ │ │ │ │ ├── Demo03GradeDO.java │ │ │ │ │ │ └── Demo03StudentDO.java │ │ │ │ │ ├── file/ │ │ │ │ │ │ ├── FileConfigDO.java │ │ │ │ │ │ ├── FileContentDO.java │ │ │ │ │ │ └── FileDO.java │ │ │ │ │ └── logger/ │ │ │ │ │ ├── ApiAccessLogDO.java │ │ │ │ │ └── ApiErrorLogDO.java │ │ │ │ └── mysql/ │ │ │ │ ├── codegen/ │ │ │ │ │ ├── CodegenColumnMapper.java │ │ │ │ │ └── CodegenTableMapper.java │ │ │ │ ├── config/ │ │ │ │ │ └── ConfigMapper.java │ │ │ │ ├── db/ │ │ │ │ │ └── DataSourceConfigMapper.java │ │ │ │ ├── demo/ │ │ │ │ │ ├── demo01/ │ │ │ │ │ │ └── Demo01ContactMapper.java │ │ │ │ │ ├── demo02/ │ │ │ │ │ │ └── Demo02CategoryMapper.java │ │ │ │ │ └── demo03/ │ │ │ │ │ ├── erp/ │ │ │ │ │ │ ├── Demo03CourseErpMapper.java │ │ │ │ │ │ ├── Demo03GradeErpMapper.java │ │ │ │ │ │ └── Demo03StudentErpMapper.java │ │ │ │ │ ├── inner/ │ │ │ │ │ │ ├── Demo03CourseInnerMapper.java │ │ │ │ │ │ ├── Demo03GradeInnerMapper.java │ │ │ │ │ │ └── Demo03StudentInnerMapper.java │ │ │ │ │ └── normal/ │ │ │ │ │ ├── Demo03CourseNormalMapper.java │ │ │ │ │ ├── Demo03GradeNormalMapper.java │ │ │ │ │ └── Demo03StudentNormalMapper.java │ │ │ │ ├── file/ │ │ │ │ │ ├── FileConfigMapper.java │ │ │ │ │ ├── FileContentMapper.java │ │ │ │ │ └── FileMapper.java │ │ │ │ └── logger/ │ │ │ │ ├── ApiAccessLogMapper.java │ │ │ │ └── ApiErrorLogMapper.java │ │ │ ├── framework/ │ │ │ │ ├── codegen/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── CodegenConfiguration.java │ │ │ │ │ │ └── CodegenProperties.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── file/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── YudaoFileAutoConfiguration.java │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ ├── AbstractFileClient.java │ │ │ │ │ │ │ ├── FileClient.java │ │ │ │ │ │ │ ├── FileClientConfig.java │ │ │ │ │ │ │ ├── FileClientFactory.java │ │ │ │ │ │ │ ├── FileClientFactoryImpl.java │ │ │ │ │ │ │ ├── db/ │ │ │ │ │ │ │ │ ├── DBFileClient.java │ │ │ │ │ │ │ │ └── DBFileClientConfig.java │ │ │ │ │ │ │ ├── ftp/ │ │ │ │ │ │ │ │ ├── FtpFileClient.java │ │ │ │ │ │ │ │ └── FtpFileClientConfig.java │ │ │ │ │ │ │ ├── local/ │ │ │ │ │ │ │ │ ├── LocalFileClient.java │ │ │ │ │ │ │ │ └── LocalFileClientConfig.java │ │ │ │ │ │ │ ├── s3/ │ │ │ │ │ │ │ │ ├── S3FileClient.java │ │ │ │ │ │ │ │ └── S3FileClientConfig.java │ │ │ │ │ │ │ └── sftp/ │ │ │ │ │ │ │ ├── SftpFileClient.java │ │ │ │ │ │ │ └── SftpFileClientConfig.java │ │ │ │ │ │ ├── enums/ │ │ │ │ │ │ │ └── FileStorageEnum.java │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ └── FileTypeUtils.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── monitor/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── AdminServerConfiguration.java │ │ │ │ │ ├── package-info.java │ │ │ │ │ └── 《芋道 Spring Boot 监控工具 Admin 入门》.md │ │ │ │ ├── package-info.java │ │ │ │ ├── rpc/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── RpcConfiguration.java │ │ │ │ │ └── package-info.java │ │ │ │ └── security/ │ │ │ │ ├── config/ │ │ │ │ │ └── SecurityConfiguration.java │ │ │ │ └── core/ │ │ │ │ └── package-info.java │ │ │ ├── job/ │ │ │ │ ├── logger/ │ │ │ │ │ ├── AccessLogCleanJob.java │ │ │ │ │ └── ErrorLogCleanJob.java │ │ │ │ └── package-info.java │ │ │ ├── mq/ │ │ │ │ ├── consumer/ │ │ │ │ │ └── package-info.java │ │ │ │ ├── message/ │ │ │ │ │ └── package-info.java │ │ │ │ └── producer/ │ │ │ │ └── package-info.java │ │ │ ├── package-info.java │ │ │ ├── service/ │ │ │ │ ├── codegen/ │ │ │ │ │ ├── CodegenService.java │ │ │ │ │ ├── CodegenServiceImpl.java │ │ │ │ │ └── inner/ │ │ │ │ │ ├── CodegenBuilder.java │ │ │ │ │ └── CodegenEngine.java │ │ │ │ ├── config/ │ │ │ │ │ ├── ConfigService.java │ │ │ │ │ └── ConfigServiceImpl.java │ │ │ │ ├── db/ │ │ │ │ │ ├── DataSourceConfigService.java │ │ │ │ │ ├── DataSourceConfigServiceImpl.java │ │ │ │ │ ├── DatabaseTableService.java │ │ │ │ │ └── DatabaseTableServiceImpl.java │ │ │ │ ├── demo/ │ │ │ │ │ ├── demo01/ │ │ │ │ │ │ ├── Demo01ContactService.java │ │ │ │ │ │ └── Demo01ContactServiceImpl.java │ │ │ │ │ ├── demo02/ │ │ │ │ │ │ ├── Demo02CategoryService.java │ │ │ │ │ │ └── Demo02CategoryServiceImpl.java │ │ │ │ │ └── demo03/ │ │ │ │ │ ├── erp/ │ │ │ │ │ │ ├── Demo03StudentErpService.java │ │ │ │ │ │ └── Demo03StudentErpServiceImpl.java │ │ │ │ │ ├── inner/ │ │ │ │ │ │ ├── Demo03StudentInnerService.java │ │ │ │ │ │ └── Demo03StudentInnerServiceImpl.java │ │ │ │ │ └── normal/ │ │ │ │ │ ├── Demo03StudentNormalService.java │ │ │ │ │ └── Demo03StudentNormalServiceImpl.java │ │ │ │ ├── file/ │ │ │ │ │ ├── FileConfigService.java │ │ │ │ │ ├── FileConfigServiceImpl.java │ │ │ │ │ ├── FileService.java │ │ │ │ │ └── FileServiceImpl.java │ │ │ │ └── logger/ │ │ │ │ ├── ApiAccessLogService.java │ │ │ │ ├── ApiAccessLogServiceImpl.java │ │ │ │ ├── ApiErrorLogService.java │ │ │ │ └── ApiErrorLogServiceImpl.java │ │ │ └── websocket/ │ │ │ ├── DemoWebSocketMessageListener.java │ │ │ └── message/ │ │ │ ├── DemoReceiveMessage.java │ │ │ └── DemoSendMessage.java │ │ └── resources/ │ │ ├── application-dev.yaml │ │ ├── application-local.yaml │ │ ├── application.yaml │ │ ├── codegen/ │ │ │ ├── java/ │ │ │ │ ├── controller/ │ │ │ │ │ ├── controller.vm │ │ │ │ │ └── vo/ │ │ │ │ │ ├── listReqVO.vm │ │ │ │ │ ├── pageReqVO.vm │ │ │ │ │ ├── respVO.vm │ │ │ │ │ └── saveReqVO.vm │ │ │ │ ├── dal/ │ │ │ │ │ ├── do.vm │ │ │ │ │ ├── do_sub.vm │ │ │ │ │ ├── mapper.vm │ │ │ │ │ ├── mapper.xml.vm │ │ │ │ │ └── mapper_sub.vm │ │ │ │ ├── enums/ │ │ │ │ │ └── errorcode.vm │ │ │ │ ├── service/ │ │ │ │ │ ├── service.vm │ │ │ │ │ └── serviceImpl.vm │ │ │ │ └── test/ │ │ │ │ └── serviceTest.vm │ │ │ ├── sql/ │ │ │ │ ├── h2.vm │ │ │ │ └── sql.vm │ │ │ ├── vue/ │ │ │ │ ├── api/ │ │ │ │ │ └── api.js.vm │ │ │ │ └── views/ │ │ │ │ ├── components/ │ │ │ │ │ ├── form_sub_erp.vue.vm │ │ │ │ │ ├── form_sub_inner.vue.vm │ │ │ │ │ ├── form_sub_normal.vue.vm │ │ │ │ │ ├── list_sub_erp.vue.vm │ │ │ │ │ └── list_sub_inner.vue.vm │ │ │ │ ├── form.vue.vm │ │ │ │ └── index.vue.vm │ │ │ ├── vue3/ │ │ │ │ ├── api/ │ │ │ │ │ └── api.ts.vm │ │ │ │ └── views/ │ │ │ │ ├── components/ │ │ │ │ │ ├── form_sub_erp.vue.vm │ │ │ │ │ ├── form_sub_inner.vue.vm │ │ │ │ │ ├── form_sub_normal.vue.vm │ │ │ │ │ ├── list_sub_erp.vue.vm │ │ │ │ │ └── list_sub_inner.vue.vm │ │ │ │ ├── form.vue.vm │ │ │ │ └── index.vue.vm │ │ │ ├── vue3_admin_uniapp/ │ │ │ │ ├── components/ │ │ │ │ │ └── search-form.vue.vm │ │ │ │ └── views/ │ │ │ │ ├── detail/ │ │ │ │ │ └── index.vue.vm │ │ │ │ ├── form/ │ │ │ │ │ └── index.vue.vm │ │ │ │ └── index.vue.vm │ │ │ ├── vue3_vben/ │ │ │ │ ├── api/ │ │ │ │ │ └── api.ts.vm │ │ │ │ └── views/ │ │ │ │ ├── data.ts.vm │ │ │ │ ├── form.vue.vm │ │ │ │ └── index.vue.vm │ │ │ ├── vue3_vben5_antd/ │ │ │ │ ├── general/ │ │ │ │ │ ├── api/ │ │ │ │ │ │ └── api.ts.vm │ │ │ │ │ └── views/ │ │ │ │ │ ├── form.vue.vm │ │ │ │ │ ├── index.vue.vm │ │ │ │ │ └── modules/ │ │ │ │ │ ├── form_sub_erp.vue.vm │ │ │ │ │ ├── form_sub_inner.vue.vm │ │ │ │ │ ├── form_sub_normal.vue.vm │ │ │ │ │ ├── list_sub_erp.vue.vm │ │ │ │ │ └── list_sub_inner.vue.vm │ │ │ │ └── schema/ │ │ │ │ ├── api/ │ │ │ │ │ └── api.ts.vm │ │ │ │ └── views/ │ │ │ │ ├── data.ts.vm │ │ │ │ ├── form.vue.vm │ │ │ │ ├── index.vue.vm │ │ │ │ └── modules/ │ │ │ │ ├── form_sub_erp.vue.vm │ │ │ │ ├── form_sub_inner.vue.vm │ │ │ │ ├── form_sub_normal.vue.vm │ │ │ │ ├── list_sub_erp.vue.vm │ │ │ │ └── list_sub_inner.vue.vm │ │ │ └── vue3_vben5_ele/ │ │ │ ├── general/ │ │ │ │ ├── api/ │ │ │ │ │ └── api.ts.vm │ │ │ │ └── views/ │ │ │ │ ├── form.vue.vm │ │ │ │ ├── index.vue.vm │ │ │ │ └── modules/ │ │ │ │ ├── form_sub_erp.vue.vm │ │ │ │ ├── form_sub_inner.vue.vm │ │ │ │ ├── form_sub_normal.vue.vm │ │ │ │ ├── list_sub_erp.vue.vm │ │ │ │ └── list_sub_inner.vue.vm │ │ │ └── schema/ │ │ │ ├── api/ │ │ │ │ └── api.ts.vm │ │ │ └── views/ │ │ │ ├── data.ts.vm │ │ │ ├── form.vue.vm │ │ │ ├── index.vue.vm │ │ │ └── modules/ │ │ │ ├── form_sub_erp.vue.vm │ │ │ ├── form_sub_inner.vue.vm │ │ │ ├── form_sub_normal.vue.vm │ │ │ ├── list_sub_erp.vue.vm │ │ │ └── list_sub_inner.vue.vm │ │ └── logback-spring.xml │ └── test/ │ ├── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── infra/ │ │ ├── framework/ │ │ │ └── file/ │ │ │ └── core/ │ │ │ ├── ftp/ │ │ │ │ └── FtpFileClientTest.java │ │ │ ├── local/ │ │ │ │ └── LocalFileClientTest.java │ │ │ ├── s3/ │ │ │ │ └── S3FileClientTest.java │ │ │ └── sftp/ │ │ │ └── SftpFileClientTest.java │ │ └── service/ │ │ ├── DefaultDatabaseQueryTest.java │ │ ├── codegen/ │ │ │ ├── CodegenServiceImplTest.java │ │ │ └── inner/ │ │ │ ├── CodegenBuilderTest.java │ │ │ ├── CodegenEngineAbstractTest.java │ │ │ ├── CodegenEngineVue2Test.java │ │ │ └── CodegenEngineVue3Test.java │ │ ├── config/ │ │ │ └── ConfigServiceImplTest.java │ │ ├── db/ │ │ │ ├── DataSourceConfigServiceImplTest.java │ │ │ └── DatabaseTableServiceImplTest.java │ │ ├── file/ │ │ │ ├── FileConfigServiceImplTest.java │ │ │ └── FileServiceImplTest.java │ │ └── logger/ │ │ ├── ApiAccessLogServiceImplTest.java │ │ └── ApiErrorLogServiceImplTest.java │ └── resources/ │ ├── application-unit-test.yaml │ ├── codegen/ │ │ ├── table/ │ │ │ ├── category.json │ │ │ ├── contact.json │ │ │ ├── student.json │ │ │ └── teacher.json │ │ └── windows10/ │ │ ├── vue2_master_erp/ │ │ │ ├── assert.json │ │ │ ├── java/ │ │ │ │ ├── ErrorCodeConstants_手动操作 │ │ │ │ ├── InfraStudentContactDO │ │ │ │ ├── InfraStudentContactMapper │ │ │ │ ├── InfraStudentController │ │ │ │ ├── InfraStudentDO │ │ │ │ ├── InfraStudentMapper │ │ │ │ ├── InfraStudentPageReqVO │ │ │ │ ├── InfraStudentRespVO │ │ │ │ ├── InfraStudentSaveReqVO │ │ │ │ ├── InfraStudentService │ │ │ │ ├── InfraStudentServiceImpl │ │ │ │ ├── InfraStudentServiceImplTest │ │ │ │ ├── InfraStudentTeacherDO │ │ │ │ └── InfraStudentTeacherMapper │ │ │ ├── js/ │ │ │ │ └── index │ │ │ ├── sql/ │ │ │ │ ├── h2 │ │ │ │ └── sql │ │ │ ├── vue/ │ │ │ │ ├── StudentContactForm │ │ │ │ ├── StudentContactList │ │ │ │ ├── StudentForm │ │ │ │ ├── StudentTeacherForm │ │ │ │ ├── StudentTeacherList │ │ │ │ └── index │ │ │ └── xml/ │ │ │ └── InfraStudentMapper │ │ ├── vue2_master_inner/ │ │ │ ├── assert.json │ │ │ ├── java/ │ │ │ │ ├── ErrorCodeConstants_手动操作 │ │ │ │ ├── InfraStudentContactDO │ │ │ │ ├── InfraStudentContactMapper │ │ │ │ ├── InfraStudentController │ │ │ │ ├── InfraStudentDO │ │ │ │ ├── InfraStudentMapper │ │ │ │ ├── InfraStudentPageReqVO │ │ │ │ ├── InfraStudentRespVO │ │ │ │ ├── InfraStudentSaveReqVO │ │ │ │ ├── InfraStudentService │ │ │ │ ├── InfraStudentServiceImpl │ │ │ │ ├── InfraStudentServiceImplTest │ │ │ │ ├── InfraStudentTeacherDO │ │ │ │ └── InfraStudentTeacherMapper │ │ │ ├── js/ │ │ │ │ └── index │ │ │ ├── sql/ │ │ │ │ ├── h2 │ │ │ │ └── sql │ │ │ ├── vue/ │ │ │ │ ├── StudentContactForm │ │ │ │ ├── StudentContactList │ │ │ │ ├── StudentForm │ │ │ │ ├── StudentTeacherForm │ │ │ │ ├── StudentTeacherList │ │ │ │ └── index │ │ │ └── xml/ │ │ │ └── InfraStudentMapper │ │ ├── vue2_master_normal/ │ │ │ ├── assert.json │ │ │ ├── java/ │ │ │ │ ├── ErrorCodeConstants_手动操作 │ │ │ │ ├── InfraStudentContactDO │ │ │ │ ├── InfraStudentContactMapper │ │ │ │ ├── InfraStudentController │ │ │ │ ├── InfraStudentDO │ │ │ │ ├── InfraStudentMapper │ │ │ │ ├── InfraStudentPageReqVO │ │ │ │ ├── InfraStudentRespVO │ │ │ │ ├── InfraStudentSaveReqVO │ │ │ │ ├── InfraStudentService │ │ │ │ ├── InfraStudentServiceImpl │ │ │ │ ├── InfraStudentServiceImplTest │ │ │ │ ├── InfraStudentTeacherDO │ │ │ │ └── InfraStudentTeacherMapper │ │ │ ├── js/ │ │ │ │ └── index │ │ │ ├── sql/ │ │ │ │ ├── h2 │ │ │ │ └── sql │ │ │ ├── vue/ │ │ │ │ ├── StudentContactForm │ │ │ │ ├── StudentForm │ │ │ │ ├── StudentTeacherForm │ │ │ │ └── index │ │ │ └── xml/ │ │ │ └── InfraStudentMapper │ │ ├── vue2_one/ │ │ │ ├── assert.json │ │ │ ├── java/ │ │ │ │ ├── ErrorCodeConstants_手动操作 │ │ │ │ ├── InfraStudentController │ │ │ │ ├── InfraStudentDO │ │ │ │ ├── InfraStudentMapper │ │ │ │ ├── InfraStudentPageReqVO │ │ │ │ ├── InfraStudentRespVO │ │ │ │ ├── InfraStudentSaveReqVO │ │ │ │ ├── InfraStudentService │ │ │ │ ├── InfraStudentServiceImpl │ │ │ │ └── InfraStudentServiceImplTest │ │ │ ├── js/ │ │ │ │ └── index │ │ │ ├── sql/ │ │ │ │ ├── h2 │ │ │ │ └── sql │ │ │ ├── vue/ │ │ │ │ ├── StudentForm │ │ │ │ └── index │ │ │ └── xml/ │ │ │ └── InfraStudentMapper │ │ ├── vue2_tree/ │ │ │ ├── assert.json │ │ │ ├── java/ │ │ │ │ ├── ErrorCodeConstants_手动操作 │ │ │ │ ├── InfraCategoryController │ │ │ │ ├── InfraCategoryDO │ │ │ │ ├── InfraCategoryListReqVO │ │ │ │ ├── InfraCategoryMapper │ │ │ │ ├── InfraCategoryRespVO │ │ │ │ ├── InfraCategorySaveReqVO │ │ │ │ ├── InfraCategoryService │ │ │ │ ├── InfraCategoryServiceImpl │ │ │ │ └── InfraCategoryServiceImplTest │ │ │ ├── js/ │ │ │ │ └── index │ │ │ ├── sql/ │ │ │ │ ├── h2 │ │ │ │ └── sql │ │ │ ├── vue/ │ │ │ │ ├── CategoryForm │ │ │ │ └── index │ │ │ └── xml/ │ │ │ └── InfraCategoryMapper │ │ ├── vue3_master_erp/ │ │ │ ├── assert.json │ │ │ ├── java/ │ │ │ │ ├── ErrorCodeConstants_手动操作 │ │ │ │ ├── InfraStudentContactDO │ │ │ │ ├── InfraStudentContactMapper │ │ │ │ ├── InfraStudentController │ │ │ │ ├── InfraStudentDO │ │ │ │ ├── InfraStudentMapper │ │ │ │ ├── InfraStudentPageReqVO │ │ │ │ ├── InfraStudentRespVO │ │ │ │ ├── InfraStudentSaveReqVO │ │ │ │ ├── InfraStudentService │ │ │ │ ├── InfraStudentServiceImpl │ │ │ │ ├── InfraStudentServiceImplTest │ │ │ │ ├── InfraStudentTeacherDO │ │ │ │ └── InfraStudentTeacherMapper │ │ │ ├── sql/ │ │ │ │ ├── h2 │ │ │ │ └── sql │ │ │ ├── ts/ │ │ │ │ └── index │ │ │ ├── vue/ │ │ │ │ ├── StudentContactForm │ │ │ │ ├── StudentContactList │ │ │ │ ├── StudentForm │ │ │ │ ├── StudentTeacherForm │ │ │ │ ├── StudentTeacherList │ │ │ │ └── index │ │ │ └── xml/ │ │ │ └── InfraStudentMapper │ │ ├── vue3_master_inner/ │ │ │ ├── assert.json │ │ │ ├── java/ │ │ │ │ ├── ErrorCodeConstants_手动操作 │ │ │ │ ├── InfraStudentContactDO │ │ │ │ ├── InfraStudentContactMapper │ │ │ │ ├── InfraStudentController │ │ │ │ ├── InfraStudentDO │ │ │ │ ├── InfraStudentMapper │ │ │ │ ├── InfraStudentPageReqVO │ │ │ │ ├── InfraStudentRespVO │ │ │ │ ├── InfraStudentSaveReqVO │ │ │ │ ├── InfraStudentService │ │ │ │ ├── InfraStudentServiceImpl │ │ │ │ ├── InfraStudentServiceImplTest │ │ │ │ ├── InfraStudentTeacherDO │ │ │ │ └── InfraStudentTeacherMapper │ │ │ ├── sql/ │ │ │ │ ├── h2 │ │ │ │ └── sql │ │ │ ├── ts/ │ │ │ │ └── index │ │ │ ├── vue/ │ │ │ │ ├── StudentContactForm │ │ │ │ ├── StudentContactList │ │ │ │ ├── StudentForm │ │ │ │ ├── StudentTeacherForm │ │ │ │ ├── StudentTeacherList │ │ │ │ └── index │ │ │ └── xml/ │ │ │ └── InfraStudentMapper │ │ ├── vue3_master_normal/ │ │ │ ├── assert.json │ │ │ ├── java/ │ │ │ │ ├── ErrorCodeConstants_手动操作 │ │ │ │ ├── InfraStudentContactDO │ │ │ │ ├── InfraStudentContactMapper │ │ │ │ ├── InfraStudentController │ │ │ │ ├── InfraStudentDO │ │ │ │ ├── InfraStudentMapper │ │ │ │ ├── InfraStudentPageReqVO │ │ │ │ ├── InfraStudentRespVO │ │ │ │ ├── InfraStudentSaveReqVO │ │ │ │ ├── InfraStudentService │ │ │ │ ├── InfraStudentServiceImpl │ │ │ │ ├── InfraStudentServiceImplTest │ │ │ │ ├── InfraStudentTeacherDO │ │ │ │ └── InfraStudentTeacherMapper │ │ │ ├── sql/ │ │ │ │ ├── h2 │ │ │ │ └── sql │ │ │ ├── ts/ │ │ │ │ └── index │ │ │ ├── vue/ │ │ │ │ ├── StudentContactForm │ │ │ │ ├── StudentForm │ │ │ │ ├── StudentTeacherForm │ │ │ │ └── index │ │ │ └── xml/ │ │ │ └── InfraStudentMapper │ │ ├── vue3_one/ │ │ │ ├── assert.json │ │ │ ├── java/ │ │ │ │ ├── ErrorCodeConstants_手动操作 │ │ │ │ ├── InfraStudentController │ │ │ │ ├── InfraStudentDO │ │ │ │ ├── InfraStudentMapper │ │ │ │ ├── InfraStudentPageReqVO │ │ │ │ ├── InfraStudentRespVO │ │ │ │ ├── InfraStudentSaveReqVO │ │ │ │ ├── InfraStudentService │ │ │ │ ├── InfraStudentServiceImpl │ │ │ │ └── InfraStudentServiceImplTest │ │ │ ├── sql/ │ │ │ │ ├── h2 │ │ │ │ └── sql │ │ │ ├── ts/ │ │ │ │ └── index │ │ │ ├── vue/ │ │ │ │ ├── StudentForm │ │ │ │ └── index │ │ │ └── xml/ │ │ │ └── InfraStudentMapper │ │ └── vue3_tree/ │ │ ├── assert.json │ │ ├── java/ │ │ │ ├── ErrorCodeConstants_手动操作 │ │ │ ├── InfraCategoryController │ │ │ ├── InfraCategoryDO │ │ │ ├── InfraCategoryListReqVO │ │ │ ├── InfraCategoryMapper │ │ │ ├── InfraCategoryRespVO │ │ │ ├── InfraCategorySaveReqVO │ │ │ ├── InfraCategoryService │ │ │ ├── InfraCategoryServiceImpl │ │ │ └── InfraCategoryServiceImplTest │ │ ├── sql/ │ │ │ ├── h2 │ │ │ └── sql │ │ ├── ts/ │ │ │ └── index │ │ ├── vue/ │ │ │ ├── CategoryForm │ │ │ └── index │ │ └── xml/ │ │ └── InfraCategoryMapper │ ├── logback.xml │ └── sql/ │ ├── clean.sql │ └── create_tables.sql ├── yudao-module-iot/ │ ├── pom.xml │ ├── yudao-module-iot-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── iot/ │ │ ├── api/ │ │ │ └── package-info.java │ │ └── enums/ │ │ ├── ApiConstants.java │ │ ├── DictTypeConstants.java │ │ ├── ErrorCodeConstants.java │ │ ├── alert/ │ │ │ └── IotAlertReceiveTypeEnum.java │ │ ├── ota/ │ │ │ ├── IotOtaTaskDeviceScopeEnum.java │ │ │ ├── IotOtaTaskRecordStatusEnum.java │ │ │ └── IotOtaTaskStatusEnum.java │ │ ├── product/ │ │ │ ├── IotNetTypeEnum.java │ │ │ ├── IotProductDeviceTypeEnum.java │ │ │ └── IotProductStatusEnum.java │ │ ├── rule/ │ │ │ ├── IotDataSinkTypeEnum.java │ │ │ ├── IotRedisDataStructureEnum.java │ │ │ ├── IotSceneRuleActionTypeEnum.java │ │ │ ├── IotSceneRuleConditionOperatorEnum.java │ │ │ ├── IotSceneRuleConditionTypeEnum.java │ │ │ └── IotSceneRuleTriggerTypeEnum.java │ │ └── thingmodel/ │ │ ├── IotDataSpecsDataTypeEnum.java │ │ ├── IotThingModelAccessModeEnum.java │ │ ├── IotThingModelParamDirectionEnum.java │ │ ├── IotThingModelServiceCallTypeEnum.java │ │ ├── IotThingModelServiceEventTypeEnum.java │ │ └── IotThingModelTypeEnum.java │ ├── yudao-module-iot-core/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── iocoder/ │ │ │ │ └── yudao/ │ │ │ │ └── module/ │ │ │ │ └── iot/ │ │ │ │ └── core/ │ │ │ │ ├── biz/ │ │ │ │ │ ├── IotDeviceCommonApi.java │ │ │ │ │ └── dto/ │ │ │ │ │ ├── IotDeviceAuthReqDTO.java │ │ │ │ │ ├── IotDeviceGetReqDTO.java │ │ │ │ │ ├── IotDeviceRespDTO.java │ │ │ │ │ ├── IotModbusDeviceConfigListReqDTO.java │ │ │ │ │ ├── IotModbusDeviceConfigRespDTO.java │ │ │ │ │ ├── IotModbusPointRespDTO.java │ │ │ │ │ └── IotSubDeviceRegisterFullReqDTO.java │ │ │ │ ├── enums/ │ │ │ │ │ ├── IotDeviceMessageMethodEnum.java │ │ │ │ │ ├── IotProtocolTypeEnum.java │ │ │ │ │ ├── IotSerializeTypeEnum.java │ │ │ │ │ ├── device/ │ │ │ │ │ │ └── IotDeviceStateEnum.java │ │ │ │ │ └── modbus/ │ │ │ │ │ ├── IotModbusByteOrderEnum.java │ │ │ │ │ ├── IotModbusFrameFormatEnum.java │ │ │ │ │ ├── IotModbusModeEnum.java │ │ │ │ │ └── IotModbusRawDataTypeEnum.java │ │ │ │ ├── messagebus/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── IotMessageBusAutoConfiguration.java │ │ │ │ │ │ └── IotMessageBusProperties.java │ │ │ │ │ └── core/ │ │ │ │ │ ├── IotMessageBus.java │ │ │ │ │ ├── IotMessageSubscriber.java │ │ │ │ │ ├── local/ │ │ │ │ │ │ ├── IotLocalMessage.java │ │ │ │ │ │ └── IotLocalMessageBus.java │ │ │ │ │ ├── redis/ │ │ │ │ │ │ └── IotRedisMessageBus.java │ │ │ │ │ └── rocketmq/ │ │ │ │ │ └── IotRocketMQMessageBus.java │ │ │ │ ├── mq/ │ │ │ │ │ ├── message/ │ │ │ │ │ │ └── IotDeviceMessage.java │ │ │ │ │ └── producer/ │ │ │ │ │ └── IotDeviceMessageProducer.java │ │ │ │ ├── topic/ │ │ │ │ │ ├── IotDeviceIdentity.java │ │ │ │ │ ├── auth/ │ │ │ │ │ │ ├── IotDeviceRegisterReqDTO.java │ │ │ │ │ │ ├── IotDeviceRegisterRespDTO.java │ │ │ │ │ │ ├── IotSubDeviceRegisterReqDTO.java │ │ │ │ │ │ └── IotSubDeviceRegisterRespDTO.java │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── IotDeviceConfigPushReqDTO.java │ │ │ │ │ ├── event/ │ │ │ │ │ │ └── IotDeviceEventPostReqDTO.java │ │ │ │ │ ├── ota/ │ │ │ │ │ │ ├── IotDeviceOtaProgressReqDTO.java │ │ │ │ │ │ └── IotDeviceOtaUpgradeReqDTO.java │ │ │ │ │ ├── package-info.java │ │ │ │ │ ├── property/ │ │ │ │ │ │ ├── IotDevicePropertyPackPostReqDTO.java │ │ │ │ │ │ ├── IotDevicePropertyPostReqDTO.java │ │ │ │ │ │ └── IotDevicePropertySetReqDTO.java │ │ │ │ │ ├── service/ │ │ │ │ │ │ └── IotDeviceServiceInvokeReqDTO.java │ │ │ │ │ ├── state/ │ │ │ │ │ │ └── IotDeviceStateUpdateReqDTO.java │ │ │ │ │ └── topo/ │ │ │ │ │ ├── IotDeviceTopoAddReqDTO.java │ │ │ │ │ ├── IotDeviceTopoChangeReqDTO.java │ │ │ │ │ ├── IotDeviceTopoDeleteReqDTO.java │ │ │ │ │ ├── IotDeviceTopoGetReqDTO.java │ │ │ │ │ └── IotDeviceTopoGetRespDTO.java │ │ │ │ └── util/ │ │ │ │ ├── IotDeviceAuthUtils.java │ │ │ │ ├── IotDeviceMessageUtils.java │ │ │ │ └── IotProductAuthUtils.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── iot/ │ │ └── core/ │ │ ├── messagebus/ │ │ │ └── core/ │ │ │ ├── TestMessage.java │ │ │ ├── local/ │ │ │ │ └── LocalIotMessageBusIntegrationTest.java │ │ │ └── rocketmq/ │ │ │ └── RocketMQIotMessageBusTest.java │ │ └── util/ │ │ └── IotDeviceMessageUtilsTest.java │ ├── yudao-module-iot-gateway/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── iocoder/ │ │ │ │ └── yudao/ │ │ │ │ └── module/ │ │ │ │ └── iot/ │ │ │ │ └── gateway/ │ │ │ │ ├── IotGatewayServerApplication.java │ │ │ │ ├── config/ │ │ │ │ │ ├── IotGatewayConfiguration.java │ │ │ │ │ └── IotGatewayProperties.java │ │ │ │ ├── enums/ │ │ │ │ │ └── ErrorCodeConstants.java │ │ │ │ ├── protocol/ │ │ │ │ │ ├── AbstractIotProtocolDownstreamSubscriber.java │ │ │ │ │ ├── IotProtocol.java │ │ │ │ │ ├── IotProtocolManager.java │ │ │ │ │ ├── coap/ │ │ │ │ │ │ ├── IotCoapConfig.java │ │ │ │ │ │ ├── IotCoapProtocol.java │ │ │ │ │ │ ├── handler/ │ │ │ │ │ │ │ ├── downstream/ │ │ │ │ │ │ │ │ └── IotCoapDownstreamSubscriber.java │ │ │ │ │ │ │ └── upstream/ │ │ │ │ │ │ │ ├── IotCoapAbstractHandler.java │ │ │ │ │ │ │ ├── IotCoapAuthHandler.java │ │ │ │ │ │ │ ├── IotCoapAuthResource.java │ │ │ │ │ │ │ ├── IotCoapRegisterHandler.java │ │ │ │ │ │ │ ├── IotCoapRegisterResource.java │ │ │ │ │ │ │ ├── IotCoapRegisterSubHandler.java │ │ │ │ │ │ │ ├── IotCoapRegisterSubResource.java │ │ │ │ │ │ │ ├── IotCoapUpstreamHandler.java │ │ │ │ │ │ │ └── IotCoapUpstreamTopicResource.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── emqx/ │ │ │ │ │ │ ├── IotEmqxConfig.java │ │ │ │ │ │ ├── IotEmqxProtocol.java │ │ │ │ │ │ ├── handler/ │ │ │ │ │ │ │ ├── downstream/ │ │ │ │ │ │ │ │ ├── IotEmqxDownstreamHandler.java │ │ │ │ │ │ │ │ └── IotEmqxDownstreamSubscriber.java │ │ │ │ │ │ │ └── upstream/ │ │ │ │ │ │ │ ├── IotEmqxAuthEventHandler.java │ │ │ │ │ │ │ └── IotEmqxUpstreamHandler.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── http/ │ │ │ │ │ │ ├── IotHttpConfig.java │ │ │ │ │ │ ├── IotHttpProtocol.java │ │ │ │ │ │ ├── handler/ │ │ │ │ │ │ │ ├── downstream/ │ │ │ │ │ │ │ │ └── IotHttpDownstreamSubscriber.java │ │ │ │ │ │ │ └── upstream/ │ │ │ │ │ │ │ ├── IotHttpAbstractHandler.java │ │ │ │ │ │ │ ├── IotHttpAuthHandler.java │ │ │ │ │ │ │ ├── IotHttpRegisterHandler.java │ │ │ │ │ │ │ ├── IotHttpRegisterSubHandler.java │ │ │ │ │ │ │ └── IotHttpUpstreamHandler.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── modbus/ │ │ │ │ │ │ ├── common/ │ │ │ │ │ │ │ ├── manager/ │ │ │ │ │ │ │ │ └── AbstractIotModbusPollScheduler.java │ │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ │ ├── IotModbusCommonUtils.java │ │ │ │ │ │ │ └── IotModbusTcpClientUtils.java │ │ │ │ │ │ ├── tcpclient/ │ │ │ │ │ │ │ ├── IotModbusTcpClientConfig.java │ │ │ │ │ │ │ ├── IotModbusTcpClientProtocol.java │ │ │ │ │ │ │ ├── handler/ │ │ │ │ │ │ │ │ ├── downstream/ │ │ │ │ │ │ │ │ │ ├── IotModbusTcpClientDownstreamHandler.java │ │ │ │ │ │ │ │ │ └── IotModbusTcpClientDownstreamSubscriber.java │ │ │ │ │ │ │ │ └── upstream/ │ │ │ │ │ │ │ │ └── IotModbusTcpClientUpstreamHandler.java │ │ │ │ │ │ │ ├── manager/ │ │ │ │ │ │ │ │ ├── IotModbusTcpClientConfigCacheService.java │ │ │ │ │ │ │ │ ├── IotModbusTcpClientConnectionManager.java │ │ │ │ │ │ │ │ └── IotModbusTcpClientPollScheduler.java │ │ │ │ │ │ │ └── package-info.java │ │ │ │ │ │ └── tcpserver/ │ │ │ │ │ │ ├── IotModbusTcpServerConfig.java │ │ │ │ │ │ ├── IotModbusTcpServerProtocol.java │ │ │ │ │ │ ├── codec/ │ │ │ │ │ │ │ ├── IotModbusFrame.java │ │ │ │ │ │ │ ├── IotModbusFrameDecoder.java │ │ │ │ │ │ │ └── IotModbusFrameEncoder.java │ │ │ │ │ │ ├── handler/ │ │ │ │ │ │ │ ├── downstream/ │ │ │ │ │ │ │ │ ├── IotModbusTcpServerDownstreamHandler.java │ │ │ │ │ │ │ │ └── IotModbusTcpServerDownstreamSubscriber.java │ │ │ │ │ │ │ └── upstream/ │ │ │ │ │ │ │ └── IotModbusTcpServerUpstreamHandler.java │ │ │ │ │ │ ├── manager/ │ │ │ │ │ │ │ ├── IotModbusTcpServerConfigCacheService.java │ │ │ │ │ │ │ ├── IotModbusTcpServerConnectionManager.java │ │ │ │ │ │ │ ├── IotModbusTcpServerPendingRequestManager.java │ │ │ │ │ │ │ └── IotModbusTcpServerPollScheduler.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── mqtt/ │ │ │ │ │ │ ├── IotMqttConfig.java │ │ │ │ │ │ ├── IotMqttProtocol.java │ │ │ │ │ │ ├── handler/ │ │ │ │ │ │ │ ├── downstream/ │ │ │ │ │ │ │ │ ├── IotMqttDownstreamHandler.java │ │ │ │ │ │ │ │ └── IotMqttDownstreamSubscriber.java │ │ │ │ │ │ │ └── upstream/ │ │ │ │ │ │ │ ├── IotMqttAbstractHandler.java │ │ │ │ │ │ │ ├── IotMqttAuthHandler.java │ │ │ │ │ │ │ ├── IotMqttRegisterHandler.java │ │ │ │ │ │ │ └── IotMqttUpstreamHandler.java │ │ │ │ │ │ ├── manager/ │ │ │ │ │ │ │ └── IotMqttConnectionManager.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── package-info.java │ │ │ │ │ ├── tcp/ │ │ │ │ │ │ ├── IotTcpConfig.java │ │ │ │ │ │ ├── IotTcpProtocol.java │ │ │ │ │ │ ├── codec/ │ │ │ │ │ │ │ ├── IotTcpCodecTypeEnum.java │ │ │ │ │ │ │ ├── IotTcpFrameCodec.java │ │ │ │ │ │ │ ├── IotTcpFrameCodecFactory.java │ │ │ │ │ │ │ ├── delimiter/ │ │ │ │ │ │ │ │ └── IotTcpDelimiterFrameCodec.java │ │ │ │ │ │ │ └── length/ │ │ │ │ │ │ │ ├── IotTcpFixedLengthFrameCodec.java │ │ │ │ │ │ │ └── IotTcpLengthFieldFrameCodec.java │ │ │ │ │ │ ├── handler/ │ │ │ │ │ │ │ ├── downstream/ │ │ │ │ │ │ │ │ ├── IotTcpDownstreamHandler.java │ │ │ │ │ │ │ │ └── IotTcpDownstreamSubscriber.java │ │ │ │ │ │ │ └── upstream/ │ │ │ │ │ │ │ └── IotTcpUpstreamHandler.java │ │ │ │ │ │ ├── manager/ │ │ │ │ │ │ │ └── IotTcpConnectionManager.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── udp/ │ │ │ │ │ │ ├── IotUdpConfig.java │ │ │ │ │ │ ├── IotUdpProtocol.java │ │ │ │ │ │ ├── handler/ │ │ │ │ │ │ │ ├── downstream/ │ │ │ │ │ │ │ │ ├── IotUdpDownstreamHandler.java │ │ │ │ │ │ │ │ └── IotUdpDownstreamSubscriber.java │ │ │ │ │ │ │ └── upstream/ │ │ │ │ │ │ │ └── IotUdpUpstreamHandler.java │ │ │ │ │ │ ├── manager/ │ │ │ │ │ │ │ └── IotUdpSessionManager.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── websocket/ │ │ │ │ │ ├── IotWebSocketConfig.java │ │ │ │ │ ├── IotWebSocketProtocol.java │ │ │ │ │ ├── handler/ │ │ │ │ │ │ ├── downstream/ │ │ │ │ │ │ │ ├── IotWebSocketDownstreamHandler.java │ │ │ │ │ │ │ └── IotWebSocketDownstreamSubscriber.java │ │ │ │ │ │ └── upstream/ │ │ │ │ │ │ └── IotWebSocketUpstreamHandler.java │ │ │ │ │ └── manager/ │ │ │ │ │ └── IotWebSocketConnectionManager.java │ │ │ │ ├── serialize/ │ │ │ │ │ ├── IotMessageSerializer.java │ │ │ │ │ ├── IotMessageSerializerManager.java │ │ │ │ │ ├── binary/ │ │ │ │ │ │ └── IotBinarySerializer.java │ │ │ │ │ ├── json/ │ │ │ │ │ │ └── IotJsonSerializer.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── service/ │ │ │ │ │ ├── auth/ │ │ │ │ │ │ ├── IotDeviceTokenService.java │ │ │ │ │ │ └── IotDeviceTokenServiceImpl.java │ │ │ │ │ └── device/ │ │ │ │ │ ├── IotDeviceService.java │ │ │ │ │ ├── IotDeviceServiceImpl.java │ │ │ │ │ ├── message/ │ │ │ │ │ │ ├── IotDeviceMessageService.java │ │ │ │ │ │ └── IotDeviceMessageServiceImpl.java │ │ │ │ │ └── remote/ │ │ │ │ │ └── IotDeviceApiImpl.java │ │ │ │ └── util/ │ │ │ │ └── IotMqttTopicUtils.java │ │ │ └── resources/ │ │ │ └── application.yaml │ │ └── test/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── module/ │ │ │ └── iot/ │ │ │ └── gateway/ │ │ │ └── protocol/ │ │ │ ├── coap/ │ │ │ │ ├── IotDirectDeviceCoapProtocolIntegrationTest.java │ │ │ │ ├── IotGatewayDeviceCoapProtocolIntegrationTest.java │ │ │ │ └── IotGatewaySubDeviceCoapProtocolIntegrationTest.java │ │ │ ├── emqx/ │ │ │ │ └── package-info.java │ │ │ ├── http/ │ │ │ │ ├── IotDirectDeviceHttpProtocolIntegrationTest.java │ │ │ │ ├── IotGatewayDeviceHttpProtocolIntegrationTest.java │ │ │ │ └── IotGatewaySubDeviceHttpProtocolIntegrationTest.java │ │ │ ├── modbus/ │ │ │ │ ├── ModbusRtuOverTcpDemo.java │ │ │ │ ├── tcpclient/ │ │ │ │ │ └── IoTModbusTcpClientIntegrationTest.java │ │ │ │ └── tcpserver/ │ │ │ │ ├── IotModbusTcpServerRtuIntegrationTest.java │ │ │ │ └── IotModbusTcpServerTcpIntegrationTest.java │ │ │ ├── mqtt/ │ │ │ │ ├── IotDirectDeviceMqttProtocolIntegrationTest.java │ │ │ │ ├── IotGatewayDeviceMqttProtocolIntegrationTest.java │ │ │ │ └── IotGatewaySubDeviceMqttProtocolIntegrationTest.java │ │ │ ├── tcp/ │ │ │ │ ├── IotDirectDeviceTcpProtocolIntegrationTest.java │ │ │ │ ├── IotGatewayDeviceTcpProtocolIntegrationTest.java │ │ │ │ ├── IotGatewaySubDeviceTcpProtocolIntegrationTest.java │ │ │ │ ├── tcp-binary-packet-examples.md │ │ │ │ └── tcp-json-packet-examples.md │ │ │ ├── udp/ │ │ │ │ ├── IotDirectDeviceUdpProtocolIntegrationTest.java │ │ │ │ ├── IotGatewayDeviceUdpProtocolIntegrationTest.java │ │ │ │ └── IotGatewaySubDeviceUdpProtocolIntegrationTest.java │ │ │ └── websocket/ │ │ │ ├── IotDirectDeviceWebSocketProtocolIntegrationTest.java │ │ │ ├── IotGatewayDeviceWebSocketProtocolIntegrationTest.java │ │ │ └── IotGatewaySubDeviceWebSocketProtocolIntegrationTest.java │ │ └── resources/ │ │ ├── tcp-binary-packet-examples.md │ │ └── tcp-json-packet-examples.md │ └── yudao-module-iot-server/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── module/ │ │ │ └── iot/ │ │ │ ├── IoTServerApplication.java │ │ │ ├── api/ │ │ │ │ ├── device/ │ │ │ │ │ └── IoTDeviceApiImpl.java │ │ │ │ └── package-info.java │ │ │ ├── controller/ │ │ │ │ ├── admin/ │ │ │ │ │ ├── alert/ │ │ │ │ │ │ ├── IotAlertConfigController.java │ │ │ │ │ │ ├── IotAlertRecordController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ ├── IotAlertConfigPageReqVO.java │ │ │ │ │ │ │ ├── IotAlertConfigRespVO.java │ │ │ │ │ │ │ └── IotAlertConfigSaveReqVO.java │ │ │ │ │ │ └── recrod/ │ │ │ │ │ │ ├── IotAlertRecordPageReqVO.java │ │ │ │ │ │ ├── IotAlertRecordProcessReqVO.java │ │ │ │ │ │ └── IotAlertRecordRespVO.java │ │ │ │ │ ├── device/ │ │ │ │ │ │ ├── IotDeviceController.java │ │ │ │ │ │ ├── IotDeviceGroupController.java │ │ │ │ │ │ ├── IotDeviceMessageController.http │ │ │ │ │ │ ├── IotDeviceMessageController.java │ │ │ │ │ │ ├── IotDeviceModbusConfigController.java │ │ │ │ │ │ ├── IotDeviceModbusPointController.java │ │ │ │ │ │ ├── IotDevicePropertyController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── device/ │ │ │ │ │ │ │ ├── IotDeviceAuthInfoRespVO.java │ │ │ │ │ │ │ ├── IotDeviceBindGatewayReqVO.java │ │ │ │ │ │ │ ├── IotDeviceByProductKeyAndNamesReqVO.java │ │ │ │ │ │ │ ├── IotDeviceImportExcelVO.java │ │ │ │ │ │ │ ├── IotDeviceImportRespVO.java │ │ │ │ │ │ │ ├── IotDevicePageReqVO.java │ │ │ │ │ │ │ ├── IotDeviceRespVO.java │ │ │ │ │ │ │ ├── IotDeviceSaveReqVO.java │ │ │ │ │ │ │ ├── IotDeviceUnbindGatewayReqVO.java │ │ │ │ │ │ │ └── IotDeviceUpdateGroupReqVO.java │ │ │ │ │ │ ├── group/ │ │ │ │ │ │ │ ├── IotDeviceGroupPageReqVO.java │ │ │ │ │ │ │ ├── IotDeviceGroupRespVO.java │ │ │ │ │ │ │ └── IotDeviceGroupSaveReqVO.java │ │ │ │ │ │ ├── message/ │ │ │ │ │ │ │ ├── IotDeviceMessagePageReqVO.java │ │ │ │ │ │ │ ├── IotDeviceMessageRespPairVO.java │ │ │ │ │ │ │ ├── IotDeviceMessageRespVO.java │ │ │ │ │ │ │ └── IotDeviceMessageSendReqVO.java │ │ │ │ │ │ ├── modbus/ │ │ │ │ │ │ │ ├── IotDeviceModbusConfigRespVO.java │ │ │ │ │ │ │ ├── IotDeviceModbusConfigSaveReqVO.java │ │ │ │ │ │ │ ├── IotDeviceModbusPointPageReqVO.java │ │ │ │ │ │ │ ├── IotDeviceModbusPointRespVO.java │ │ │ │ │ │ │ └── IotDeviceModbusPointSaveReqVO.java │ │ │ │ │ │ └── property/ │ │ │ │ │ │ ├── IotDevicePropertyDetailRespVO.java │ │ │ │ │ │ ├── IotDevicePropertyHistoryListReqVO.java │ │ │ │ │ │ └── IotDevicePropertyRespVO.java │ │ │ │ │ ├── ota/ │ │ │ │ │ │ ├── IotOtaFirmwareController.java │ │ │ │ │ │ ├── IotOtaTaskController.java │ │ │ │ │ │ ├── IotOtaTaskRecordController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── firmware/ │ │ │ │ │ │ │ ├── IotOtaFirmwareCreateReqVO.java │ │ │ │ │ │ │ ├── IotOtaFirmwarePageReqVO.java │ │ │ │ │ │ │ ├── IotOtaFirmwareRespVO.java │ │ │ │ │ │ │ └── IotOtaFirmwareUpdateReqVO.java │ │ │ │ │ │ └── task/ │ │ │ │ │ │ ├── IotOtaTaskCreateReqVO.java │ │ │ │ │ │ ├── IotOtaTaskPageReqVO.java │ │ │ │ │ │ ├── IotOtaTaskRespVO.java │ │ │ │ │ │ └── record/ │ │ │ │ │ │ ├── IotOtaTaskRecordPageReqVO.java │ │ │ │ │ │ └── IotOtaTaskRecordRespVO.java │ │ │ │ │ ├── product/ │ │ │ │ │ │ ├── IotProductCategoryController.java │ │ │ │ │ │ ├── IotProductController.http │ │ │ │ │ │ ├── IotProductController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── category/ │ │ │ │ │ │ │ ├── IotProductCategoryPageReqVO.java │ │ │ │ │ │ │ ├── IotProductCategoryRespVO.java │ │ │ │ │ │ │ └── IotProductCategorySaveReqVO.java │ │ │ │ │ │ └── product/ │ │ │ │ │ │ ├── IotProductPageReqVO.java │ │ │ │ │ │ ├── IotProductRespVO.java │ │ │ │ │ │ └── IotProductSaveReqVO.java │ │ │ │ │ ├── rule/ │ │ │ │ │ │ ├── IotDataRuleController.java │ │ │ │ │ │ ├── IotDataSinkController.java │ │ │ │ │ │ ├── IotSceneRuleController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── data/ │ │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ │ ├── rule/ │ │ │ │ │ │ │ │ ├── IotDataRulePageReqVO.java │ │ │ │ │ │ │ │ ├── IotDataRuleRespVO.java │ │ │ │ │ │ │ │ └── IotDataRuleSaveReqVO.java │ │ │ │ │ │ │ └── sink/ │ │ │ │ │ │ │ ├── IotDataSinkPageReqVO.java │ │ │ │ │ │ │ ├── IotDataSinkRespVO.java │ │ │ │ │ │ │ └── IotDataSinkSaveReqVO.java │ │ │ │ │ │ └── scene/ │ │ │ │ │ │ ├── IotSceneRulePageReqVO.java │ │ │ │ │ │ ├── IotSceneRuleRespVO.java │ │ │ │ │ │ ├── IotSceneRuleSaveReqVO.java │ │ │ │ │ │ └── IotSceneRuleUpdateStatusReqVO.java │ │ │ │ │ ├── statistics/ │ │ │ │ │ │ ├── IotStatisticsController.http │ │ │ │ │ │ ├── IotStatisticsController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── IotStatisticsDeviceMessageReqVO.java │ │ │ │ │ │ ├── IotStatisticsDeviceMessageSummaryByDateRespVO.java │ │ │ │ │ │ └── IotStatisticsSummaryRespVO.java │ │ │ │ │ └── thingmodel/ │ │ │ │ │ ├── IotThingModelController.http │ │ │ │ │ ├── IotThingModelController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── IotThingModelListReqVO.java │ │ │ │ │ ├── IotThingModelPageReqVO.java │ │ │ │ │ ├── IotThingModelRespVO.java │ │ │ │ │ ├── IotThingModelSaveReqVO.java │ │ │ │ │ └── IotThingModelTSLRespVO.java │ │ │ │ └── package-info.java │ │ │ ├── convert/ │ │ │ │ ├── package-info.java │ │ │ │ └── thingmodel/ │ │ │ │ └── IotThingModelConvert.java │ │ │ ├── dal/ │ │ │ │ ├── dataobject/ │ │ │ │ │ ├── alert/ │ │ │ │ │ │ ├── IotAlertConfigDO.java │ │ │ │ │ │ └── IotAlertRecordDO.java │ │ │ │ │ ├── device/ │ │ │ │ │ │ ├── IotDeviceDO.java │ │ │ │ │ │ ├── IotDeviceGroupDO.java │ │ │ │ │ │ ├── IotDeviceMessageDO.java │ │ │ │ │ │ ├── IotDeviceModbusConfigDO.java │ │ │ │ │ │ ├── IotDeviceModbusPointDO.java │ │ │ │ │ │ └── IotDevicePropertyDO.java │ │ │ │ │ ├── ota/ │ │ │ │ │ │ ├── IotOtaFirmwareDO.java │ │ │ │ │ │ ├── IotOtaTaskDO.java │ │ │ │ │ │ └── IotOtaTaskRecordDO.java │ │ │ │ │ ├── product/ │ │ │ │ │ │ ├── IotProductCategoryDO.java │ │ │ │ │ │ └── IotProductDO.java │ │ │ │ │ ├── rule/ │ │ │ │ │ │ ├── IotDataRuleDO.java │ │ │ │ │ │ ├── IotDataSinkDO.java │ │ │ │ │ │ ├── IotSceneRuleDO.java │ │ │ │ │ │ └── config/ │ │ │ │ │ │ ├── IotAbstractDataSinkConfig.java │ │ │ │ │ │ ├── IotDataSinkHttpConfig.java │ │ │ │ │ │ ├── IotDataSinkKafkaConfig.java │ │ │ │ │ │ ├── IotDataSinkMqttConfig.java │ │ │ │ │ │ ├── IotDataSinkRabbitMQConfig.java │ │ │ │ │ │ ├── IotDataSinkRedisConfig.java │ │ │ │ │ │ ├── IotDataSinkRocketMQConfig.java │ │ │ │ │ │ ├── IotDataSinkTcpConfig.java │ │ │ │ │ │ └── IotDataSinkWebSocketConfig.java │ │ │ │ │ └── thingmodel/ │ │ │ │ │ ├── IotThingModelDO.java │ │ │ │ │ └── model/ │ │ │ │ │ ├── ThingModelEvent.java │ │ │ │ │ ├── ThingModelParam.java │ │ │ │ │ ├── ThingModelProperty.java │ │ │ │ │ ├── ThingModelService.java │ │ │ │ │ └── dataType/ │ │ │ │ │ ├── ThingModelArrayDataSpecs.java │ │ │ │ │ ├── ThingModelBoolOrEnumDataSpecs.java │ │ │ │ │ ├── ThingModelDataSpecs.java │ │ │ │ │ ├── ThingModelDateOrTextDataSpecs.java │ │ │ │ │ ├── ThingModelNumericDataSpec.java │ │ │ │ │ └── ThingModelStructDataSpecs.java │ │ │ │ ├── mysql/ │ │ │ │ │ ├── alert/ │ │ │ │ │ │ ├── IotAlertConfigMapper.java │ │ │ │ │ │ └── IotAlertRecordMapper.java │ │ │ │ │ ├── device/ │ │ │ │ │ │ ├── IotDeviceGroupMapper.java │ │ │ │ │ │ ├── IotDeviceMapper.java │ │ │ │ │ │ ├── IotDeviceModbusConfigMapper.java │ │ │ │ │ │ └── IotDeviceModbusPointMapper.java │ │ │ │ │ ├── ota/ │ │ │ │ │ │ ├── IotOtaFirmwareMapper.java │ │ │ │ │ │ ├── IotOtaTaskMapper.java │ │ │ │ │ │ └── IotOtaTaskRecordMapper.java │ │ │ │ │ ├── product/ │ │ │ │ │ │ ├── IotProductCategoryMapper.java │ │ │ │ │ │ └── IotProductMapper.java │ │ │ │ │ ├── rule/ │ │ │ │ │ │ ├── IotDataRuleMapper.java │ │ │ │ │ │ ├── IotDataSinkMapper.java │ │ │ │ │ │ └── IotSceneRuleMapper.java │ │ │ │ │ └── thingmodel/ │ │ │ │ │ └── IotThingModelMapper.java │ │ │ │ ├── redis/ │ │ │ │ │ ├── RedisKeyConstants.java │ │ │ │ │ └── device/ │ │ │ │ │ ├── DevicePropertyRedisDAO.java │ │ │ │ │ ├── DeviceReportTimeRedisDAO.java │ │ │ │ │ └── DeviceServerIdRedisDAO.java │ │ │ │ └── tdengine/ │ │ │ │ ├── IotDeviceMessageMapper.java │ │ │ │ └── IotDevicePropertyMapper.java │ │ │ ├── framework/ │ │ │ │ ├── iot/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── YudaoIotProperties.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── job/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── IotJobConfiguration.java │ │ │ │ │ └── core/ │ │ │ │ │ └── IotSchedulerManager.java │ │ │ │ ├── package-info.java │ │ │ │ ├── rpc/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── RpcConfiguration.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── security/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── SecurityConfiguration.java │ │ │ │ │ └── core/ │ │ │ │ │ └── package-info.java │ │ │ │ ├── tdengine/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── TDengineTableInitRunner.java │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── TDengineTableField.java │ │ │ │ │ │ └── annotation/ │ │ │ │ │ │ └── TDengineDS.java │ │ │ │ │ └── package-info.java │ │ │ │ └── web/ │ │ │ │ ├── config/ │ │ │ │ │ └── IotWebConfiguration.java │ │ │ │ └── package-info.java │ │ │ ├── job/ │ │ │ │ ├── device/ │ │ │ │ │ └── IotDeviceOfflineCheckJob.java │ │ │ │ ├── ota/ │ │ │ │ │ └── IotOtaUpgradeJob.java │ │ │ │ └── rule/ │ │ │ │ └── IotSceneRuleJob.java │ │ │ ├── mq/ │ │ │ │ ├── consumer/ │ │ │ │ │ ├── device/ │ │ │ │ │ │ └── IotDeviceMessageSubscriber.java │ │ │ │ │ └── rule/ │ │ │ │ │ ├── IotDataRuleMessageSubscriber.java │ │ │ │ │ └── IotSceneRuleMessageSubscriber.java │ │ │ │ └── producer/ │ │ │ │ └── package-info.java │ │ │ ├── package-info.java │ │ │ └── service/ │ │ │ ├── alert/ │ │ │ │ ├── IotAlertConfigService.java │ │ │ │ ├── IotAlertConfigServiceImpl.java │ │ │ │ ├── IotAlertRecordService.java │ │ │ │ └── IotAlertRecordServiceImpl.java │ │ │ ├── device/ │ │ │ │ ├── IotDeviceGroupService.java │ │ │ │ ├── IotDeviceGroupServiceImpl.java │ │ │ │ ├── IotDeviceModbusConfigService.java │ │ │ │ ├── IotDeviceModbusConfigServiceImpl.java │ │ │ │ ├── IotDeviceModbusPointService.java │ │ │ │ ├── IotDeviceModbusPointServiceImpl.java │ │ │ │ ├── IotDeviceService.java │ │ │ │ ├── IotDeviceServiceImpl.java │ │ │ │ ├── message/ │ │ │ │ │ ├── IotDeviceMessageService.java │ │ │ │ │ └── IotDeviceMessageServiceImpl.java │ │ │ │ └── property/ │ │ │ │ ├── IotDevicePropertyService.java │ │ │ │ └── IotDevicePropertyServiceImpl.java │ │ │ ├── ota/ │ │ │ │ ├── IotOtaFirmwareService.java │ │ │ │ ├── IotOtaFirmwareServiceImpl.java │ │ │ │ ├── IotOtaTaskRecordService.java │ │ │ │ ├── IotOtaTaskRecordServiceImpl.java │ │ │ │ ├── IotOtaTaskService.java │ │ │ │ └── IotOtaTaskServiceImpl.java │ │ │ ├── product/ │ │ │ │ ├── IotProductCategoryService.java │ │ │ │ ├── IotProductCategoryServiceImpl.java │ │ │ │ ├── IotProductService.java │ │ │ │ └── IotProductServiceImpl.java │ │ │ ├── rule/ │ │ │ │ ├── data/ │ │ │ │ │ ├── IotDataRuleService.java │ │ │ │ │ ├── IotDataRuleServiceImpl.java │ │ │ │ │ ├── IotDataSinkService.java │ │ │ │ │ ├── IotDataSinkServiceImpl.java │ │ │ │ │ └── action/ │ │ │ │ │ ├── IotDataRuleAction.java │ │ │ │ │ ├── IotDataRuleCacheableAction.java │ │ │ │ │ ├── IotHttpDataSinkAction.java │ │ │ │ │ ├── IotKafkaDataRuleAction.java │ │ │ │ │ ├── IotRabbitMQDataRuleAction.java │ │ │ │ │ ├── IotRedisRuleAction.java │ │ │ │ │ ├── IotRocketMQDataRuleAction.java │ │ │ │ │ ├── IotTcpDataRuleAction.java │ │ │ │ │ ├── IotWebSocketDataRuleAction.java │ │ │ │ │ ├── tcp/ │ │ │ │ │ │ └── IotTcpClient.java │ │ │ │ │ └── websocket/ │ │ │ │ │ └── IotWebSocketClient.java │ │ │ │ └── scene/ │ │ │ │ ├── IotSceneRuleService.java │ │ │ │ ├── IotSceneRuleServiceImpl.java │ │ │ │ ├── IotSceneRuleTimeHelper.java │ │ │ │ ├── action/ │ │ │ │ │ ├── IotAlertRecoverSceneRuleAction.java │ │ │ │ │ ├── IotAlertTriggerSceneRuleAction.java │ │ │ │ │ ├── IotDevicePropertySetSceneRuleAction.java │ │ │ │ │ ├── IotDeviceServiceInvokeSceneRuleAction.java │ │ │ │ │ └── IotSceneRuleAction.java │ │ │ │ ├── matcher/ │ │ │ │ │ ├── IotSceneRuleMatcher.java │ │ │ │ │ ├── IotSceneRuleMatcherHelper.java │ │ │ │ │ ├── IotSceneRuleMatcherManager.java │ │ │ │ │ ├── condition/ │ │ │ │ │ │ ├── IotCurrentTimeConditionMatcher.java │ │ │ │ │ │ ├── IotDevicePropertyConditionMatcher.java │ │ │ │ │ │ ├── IotDeviceStateConditionMatcher.java │ │ │ │ │ │ └── IotSceneRuleConditionMatcher.java │ │ │ │ │ └── trigger/ │ │ │ │ │ ├── IotDeviceEventPostTriggerMatcher.java │ │ │ │ │ ├── IotDevicePropertyPostTriggerMatcher.java │ │ │ │ │ ├── IotDeviceServiceInvokeTriggerMatcher.java │ │ │ │ │ ├── IotDeviceStateUpdateTriggerMatcher.java │ │ │ │ │ ├── IotSceneRuleTriggerMatcher.java │ │ │ │ │ └── IotTimerTriggerMatcher.java │ │ │ │ └── timer/ │ │ │ │ ├── IotSceneRuleTimerHandler.java │ │ │ │ └── IotTimerConditionEvaluator.java │ │ │ └── thingmodel/ │ │ │ ├── IotThingModelService.java │ │ │ └── IotThingModelServiceImpl.java │ │ └── resources/ │ │ ├── application-dev.yaml │ │ ├── application-local.yaml │ │ ├── application.yaml │ │ ├── logback-spring.xml │ │ └── mapper/ │ │ └── device/ │ │ ├── IotDeviceMessageMapper.xml │ │ └── IotDevicePropertyMapper.xml │ └── test/ │ ├── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── iot/ │ │ └── service/ │ │ └── rule/ │ │ ├── action/ │ │ │ └── databridge/ │ │ │ └── IotDataBridgeExecuteTest.java │ │ ├── data/ │ │ │ └── action/ │ │ │ ├── IotTcpDataRuleActionTest.java │ │ │ ├── tcp/ │ │ │ │ └── IotTcpClientTest.java │ │ │ └── websocket/ │ │ │ └── IotWebSocketClientTest.java │ │ └── scene/ │ │ ├── IotSceneRuleServiceSimpleTest.java │ │ ├── IotSceneRuleTimerConditionIntegrationTest.java │ │ ├── matcher/ │ │ │ ├── IotBaseConditionMatcherTest.java │ │ │ ├── condition/ │ │ │ │ ├── IotCurrentTimeConditionMatcherTest.java │ │ │ │ ├── IotDevicePropertyConditionMatcherTest.java │ │ │ │ └── IotDeviceStateConditionMatcherTest.java │ │ │ └── trigger/ │ │ │ ├── IotDeviceEventPostTriggerMatcherTest.java │ │ │ ├── IotDevicePropertyPostTriggerMatcherTest.java │ │ │ ├── IotDeviceServiceInvokeTriggerMatcherTest.java │ │ │ ├── IotDeviceStateUpdateTriggerMatcherTest.java │ │ │ └── IotTimerTriggerMatcherTest.java │ │ └── timer/ │ │ └── IotSceneRuleTimerHandlerTest.java │ └── resources/ │ ├── application-unit-test.yaml │ ├── logback.xml │ └── sql/ │ ├── clean.sql │ └── create_tables.sql ├── yudao-module-mall/ │ ├── pom.xml │ ├── yudao-module-product-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── product/ │ │ ├── api/ │ │ │ ├── category/ │ │ │ │ └── ProductCategoryApi.java │ │ │ ├── comment/ │ │ │ │ ├── ProductCommentApi.java │ │ │ │ └── dto/ │ │ │ │ └── ProductCommentCreateReqDTO.java │ │ │ ├── package-info.java │ │ │ ├── property/ │ │ │ │ └── dto/ │ │ │ │ └── ProductPropertyValueDetailRespDTO.java │ │ │ ├── sku/ │ │ │ │ ├── ProductSkuApi.java │ │ │ │ └── dto/ │ │ │ │ ├── ProductSkuRespDTO.java │ │ │ │ └── ProductSkuUpdateStockReqDTO.java │ │ │ └── spu/ │ │ │ ├── ProductSpuApi.java │ │ │ └── dto/ │ │ │ └── ProductSpuRespDTO.java │ │ └── enums/ │ │ ├── ApiConstants.java │ │ ├── DictTypeConstants.java │ │ ├── ErrorCodeConstants.java │ │ ├── ProductConstants.java │ │ ├── comment/ │ │ │ ├── ProductCommentAuditStatusEnum.java │ │ │ └── ProductCommentScoresEnum.java │ │ └── spu/ │ │ └── ProductSpuStatusEnum.java │ ├── yudao-module-product-server/ │ │ ├── Dockerfile │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── iocoder/ │ │ │ │ └── yudao/ │ │ │ │ └── module/ │ │ │ │ └── product/ │ │ │ │ ├── ProductServerApplication.java │ │ │ │ ├── api/ │ │ │ │ │ ├── category/ │ │ │ │ │ │ └── ProductCategoryApiImpl.java │ │ │ │ │ ├── comment/ │ │ │ │ │ │ └── ProductCommentApiImpl.java │ │ │ │ │ ├── package-info.java │ │ │ │ │ ├── sku/ │ │ │ │ │ │ └── ProductSkuApiImpl.java │ │ │ │ │ └── spu/ │ │ │ │ │ └── ProductSpuApiImpl.java │ │ │ │ ├── controller/ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ ├── brand/ │ │ │ │ │ │ │ ├── ProductBrandController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── ProductBrandBaseVO.java │ │ │ │ │ │ │ ├── ProductBrandCreateReqVO.java │ │ │ │ │ │ │ ├── ProductBrandListReqVO.java │ │ │ │ │ │ │ ├── ProductBrandPageReqVO.java │ │ │ │ │ │ │ ├── ProductBrandRespVO.java │ │ │ │ │ │ │ ├── ProductBrandSimpleRespVO.java │ │ │ │ │ │ │ └── ProductBrandUpdateReqVO.java │ │ │ │ │ │ ├── category/ │ │ │ │ │ │ │ ├── ProductCategoryController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── ProductCategoryListReqVO.java │ │ │ │ │ │ │ ├── ProductCategoryRespVO.java │ │ │ │ │ │ │ └── ProductCategorySaveReqVO.java │ │ │ │ │ │ ├── comment/ │ │ │ │ │ │ │ ├── ProductCommentController.http │ │ │ │ │ │ │ ├── ProductCommentController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── ProductCommentCreateReqVO.java │ │ │ │ │ │ │ ├── ProductCommentPageReqVO.java │ │ │ │ │ │ │ ├── ProductCommentReplyReqVO.java │ │ │ │ │ │ │ ├── ProductCommentRespVO.java │ │ │ │ │ │ │ └── ProductCommentUpdateVisibleReqVO.java │ │ │ │ │ │ ├── favorite/ │ │ │ │ │ │ │ ├── ProductFavoriteController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── ProductFavoriteBaseVO.java │ │ │ │ │ │ │ ├── ProductFavoritePageReqVO.java │ │ │ │ │ │ │ ├── ProductFavoriteReqVO.java │ │ │ │ │ │ │ └── ProductFavoriteRespVO.java │ │ │ │ │ │ ├── history/ │ │ │ │ │ │ │ ├── ProductBrowseHistoryController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── ProductBrowseHistoryPageReqVO.java │ │ │ │ │ │ │ └── ProductBrowseHistoryRespVO.java │ │ │ │ │ │ ├── property/ │ │ │ │ │ │ │ ├── ProductPropertyController.java │ │ │ │ │ │ │ ├── ProductPropertyValueController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── property/ │ │ │ │ │ │ │ │ ├── ProductPropertyPageReqVO.java │ │ │ │ │ │ │ │ ├── ProductPropertyRespVO.java │ │ │ │ │ │ │ │ └── ProductPropertySaveReqVO.java │ │ │ │ │ │ │ └── value/ │ │ │ │ │ │ │ ├── ProductPropertyValuePageReqVO.java │ │ │ │ │ │ │ ├── ProductPropertyValueRespVO.java │ │ │ │ │ │ │ └── ProductPropertyValueSaveReqVO.java │ │ │ │ │ │ └── spu/ │ │ │ │ │ │ ├── ProductSpuController.http │ │ │ │ │ │ ├── ProductSpuController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── ProductSkuRespVO.java │ │ │ │ │ │ ├── ProductSkuSaveReqVO.java │ │ │ │ │ │ ├── ProductSpuPageReqVO.java │ │ │ │ │ │ ├── ProductSpuRespVO.java │ │ │ │ │ │ ├── ProductSpuSaveReqVO.java │ │ │ │ │ │ ├── ProductSpuSimpleRespVO.java │ │ │ │ │ │ └── ProductSpuUpdateStatusReqVO.java │ │ │ │ │ └── app/ │ │ │ │ │ ├── category/ │ │ │ │ │ │ ├── AppCategoryController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ └── AppCategoryRespVO.java │ │ │ │ │ ├── comment/ │ │ │ │ │ │ ├── AppCommentController.http │ │ │ │ │ │ ├── AppProductCommentController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AppCommentPageReqVO.java │ │ │ │ │ │ └── AppProductCommentRespVO.java │ │ │ │ │ ├── favorite/ │ │ │ │ │ │ ├── AppFavoriteController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AppFavoriteBatchReqVO.java │ │ │ │ │ │ ├── AppFavoritePageReqVO.java │ │ │ │ │ │ ├── AppFavoriteReqVO.java │ │ │ │ │ │ └── AppFavoriteRespVO.java │ │ │ │ │ ├── history/ │ │ │ │ │ │ ├── AppProductBrowseHistoryController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AppProductBrowseHistoryDeleteReqVO.java │ │ │ │ │ │ ├── AppProductBrowseHistoryPageReqVO.java │ │ │ │ │ │ └── AppProductBrowseHistoryRespVO.java │ │ │ │ │ ├── property/ │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── property/ │ │ │ │ │ │ │ └── package-info.java │ │ │ │ │ │ └── value/ │ │ │ │ │ │ └── AppProductPropertyValueDetailRespVO.java │ │ │ │ │ └── spu/ │ │ │ │ │ ├── AppProductSpuController.http │ │ │ │ │ ├── AppProductSpuController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── AppProductSpuDetailRespVO.java │ │ │ │ │ ├── AppProductSpuPageReqVO.java │ │ │ │ │ └── AppProductSpuRespVO.java │ │ │ │ ├── convert/ │ │ │ │ │ ├── brand/ │ │ │ │ │ │ └── ProductBrandConvert.java │ │ │ │ │ ├── comment/ │ │ │ │ │ │ └── ProductCommentConvert.java │ │ │ │ │ ├── favorite/ │ │ │ │ │ │ └── ProductFavoriteConvert.java │ │ │ │ │ ├── sku/ │ │ │ │ │ │ └── ProductSkuConvert.java │ │ │ │ │ └── spu/ │ │ │ │ │ └── ProductSpuConvert.java │ │ │ │ ├── dal/ │ │ │ │ │ ├── dataobject/ │ │ │ │ │ │ ├── brand/ │ │ │ │ │ │ │ └── ProductBrandDO.java │ │ │ │ │ │ ├── category/ │ │ │ │ │ │ │ └── ProductCategoryDO.java │ │ │ │ │ │ ├── comment/ │ │ │ │ │ │ │ └── ProductCommentDO.java │ │ │ │ │ │ ├── favorite/ │ │ │ │ │ │ │ └── ProductFavoriteDO.java │ │ │ │ │ │ ├── history/ │ │ │ │ │ │ │ └── ProductBrowseHistoryDO.java │ │ │ │ │ │ ├── property/ │ │ │ │ │ │ │ ├── ProductPropertyDO.java │ │ │ │ │ │ │ └── ProductPropertyValueDO.java │ │ │ │ │ │ ├── sku/ │ │ │ │ │ │ │ └── ProductSkuDO.java │ │ │ │ │ │ └── spu/ │ │ │ │ │ │ └── ProductSpuDO.java │ │ │ │ │ └── mysql/ │ │ │ │ │ ├── brand/ │ │ │ │ │ │ └── ProductBrandMapper.java │ │ │ │ │ ├── category/ │ │ │ │ │ │ └── ProductCategoryMapper.java │ │ │ │ │ ├── comment/ │ │ │ │ │ │ └── ProductCommentMapper.java │ │ │ │ │ ├── favorite/ │ │ │ │ │ │ └── ProductFavoriteMapper.java │ │ │ │ │ ├── history/ │ │ │ │ │ │ └── ProductBrowseHistoryMapper.java │ │ │ │ │ ├── property/ │ │ │ │ │ │ ├── ProductPropertyMapper.java │ │ │ │ │ │ └── ProductPropertyValueMapper.java │ │ │ │ │ ├── sku/ │ │ │ │ │ │ └── ProductSkuMapper.java │ │ │ │ │ └── spu/ │ │ │ │ │ └── ProductSpuMapper.java │ │ │ │ ├── framework/ │ │ │ │ │ ├── package-info.java │ │ │ │ │ ├── rpc/ │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ └── RpcConfiguration.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── security/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── SecurityConfiguration.java │ │ │ │ │ └── core/ │ │ │ │ │ └── package-info.java │ │ │ │ ├── package-info.java │ │ │ │ └── service/ │ │ │ │ ├── brand/ │ │ │ │ │ ├── ProductBrandService.java │ │ │ │ │ └── ProductBrandServiceImpl.java │ │ │ │ ├── category/ │ │ │ │ │ ├── ProductCategoryService.java │ │ │ │ │ └── ProductCategoryServiceImpl.java │ │ │ │ ├── comment/ │ │ │ │ │ ├── ProductCommentService.java │ │ │ │ │ └── ProductCommentServiceImpl.java │ │ │ │ ├── favorite/ │ │ │ │ │ ├── ProductFavoriteService.java │ │ │ │ │ └── ProductFavoriteServiceImpl.java │ │ │ │ ├── history/ │ │ │ │ │ ├── ProductBrowseHistoryService.java │ │ │ │ │ └── ProductBrowseHistoryServiceImpl.java │ │ │ │ ├── property/ │ │ │ │ │ ├── ProductPropertyService.java │ │ │ │ │ ├── ProductPropertyServiceImpl.java │ │ │ │ │ ├── ProductPropertyValueService.java │ │ │ │ │ └── ProductPropertyValueServiceImpl.java │ │ │ │ ├── sku/ │ │ │ │ │ ├── ProductSkuService.java │ │ │ │ │ └── ProductSkuServiceImpl.java │ │ │ │ └── spu/ │ │ │ │ ├── ProductSpuService.java │ │ │ │ └── ProductSpuServiceImpl.java │ │ │ └── resources/ │ │ │ ├── application-dev.yaml │ │ │ ├── application-local.yaml │ │ │ ├── application.yaml │ │ │ └── logback-spring.xml │ │ └── test/ │ │ └── resources/ │ │ ├── application-unit-test.yaml │ │ ├── logback.xml │ │ └── sql/ │ │ ├── clean.sql │ │ └── create_tables.sql │ ├── yudao-module-promotion-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── promotion/ │ │ ├── api/ │ │ │ ├── bargain/ │ │ │ │ ├── BargainActivityApi.java │ │ │ │ ├── BargainRecordApi.java │ │ │ │ └── dto/ │ │ │ │ └── BargainValidateJoinRespDTO.java │ │ │ ├── combination/ │ │ │ │ ├── CombinationRecordApi.java │ │ │ │ └── dto/ │ │ │ │ ├── CombinationRecordCreateReqDTO.java │ │ │ │ ├── CombinationRecordCreateRespDTO.java │ │ │ │ ├── CombinationRecordRespDTO.java │ │ │ │ └── CombinationValidateJoinRespDTO.java │ │ │ ├── coupon/ │ │ │ │ ├── CouponApi.java │ │ │ │ └── dto/ │ │ │ │ ├── CouponRespDTO.java │ │ │ │ ├── CouponTemplateRespDTO.java │ │ │ │ ├── CouponUseReqDTO.java │ │ │ │ └── CouponValidReqDTO.java │ │ │ ├── discount/ │ │ │ │ ├── DiscountActivityApi.java │ │ │ │ └── dto/ │ │ │ │ └── DiscountProductRespDTO.java │ │ │ ├── point/ │ │ │ │ ├── PointActivityApi.java │ │ │ │ └── dto/ │ │ │ │ └── PointValidateJoinRespDTO.java │ │ │ ├── reward/ │ │ │ │ ├── RewardActivityApi.java │ │ │ │ └── dto/ │ │ │ │ └── RewardActivityMatchRespDTO.java │ │ │ └── seckill/ │ │ │ ├── SeckillActivityApi.java │ │ │ └── dto/ │ │ │ └── SeckillValidateJoinRespDTO.java │ │ └── enums/ │ │ ├── ApiConstants.java │ │ ├── DictTypeConstants.java │ │ ├── ErrorCodeConstants.java │ │ ├── MessageTemplateConstants.java │ │ ├── WebSocketMessageTypeConstants.java │ │ ├── banner/ │ │ │ └── BannerPositionEnum.java │ │ ├── bargain/ │ │ │ └── BargainRecordStatusEnum.java │ │ ├── combination/ │ │ │ └── CombinationRecordStatusEnum.java │ │ ├── common/ │ │ │ ├── PromotionActivityStatusEnum.java │ │ │ ├── PromotionConditionTypeEnum.java │ │ │ ├── PromotionDiscountTypeEnum.java │ │ │ ├── PromotionProductScopeEnum.java │ │ │ └── PromotionTypeEnum.java │ │ ├── coupon/ │ │ │ ├── CouponStatusEnum.java │ │ │ ├── CouponTakeTypeEnum.java │ │ │ └── CouponTemplateValidityTypeEnum.java │ │ ├── decorate/ │ │ │ └── DecorateComponentEnum.java │ │ ├── diy/ │ │ │ └── DiyPageEnum.java │ │ └── kefu/ │ │ └── KeFuMessageContentTypeEnum.java │ ├── yudao-module-promotion-server/ │ │ ├── Dockerfile │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── iocoder/ │ │ │ │ └── yudao/ │ │ │ │ └── module/ │ │ │ │ └── promotion/ │ │ │ │ ├── PromotionServerApplication.java │ │ │ │ ├── api/ │ │ │ │ │ ├── bargain/ │ │ │ │ │ │ ├── BargainActivityApiImpl.java │ │ │ │ │ │ └── BargainRecordApiImpl.java │ │ │ │ │ ├── combination/ │ │ │ │ │ │ └── CombinationRecordApiImpl.java │ │ │ │ │ ├── coupon/ │ │ │ │ │ │ └── CouponApiImpl.java │ │ │ │ │ ├── discount/ │ │ │ │ │ │ └── DiscountActivityApiImpl.java │ │ │ │ │ ├── point/ │ │ │ │ │ │ └── PointActivityApiImpl.java │ │ │ │ │ ├── reward/ │ │ │ │ │ │ └── RewardActivityApiImpl.java │ │ │ │ │ └── seckill/ │ │ │ │ │ └── SeckillActivityApiImpl.java │ │ │ │ ├── controller/ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ ├── article/ │ │ │ │ │ │ │ ├── ArticleCategoryController.java │ │ │ │ │ │ │ ├── ArticleController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── article/ │ │ │ │ │ │ │ │ ├── ArticleBaseVO.java │ │ │ │ │ │ │ │ ├── ArticleCreateReqVO.java │ │ │ │ │ │ │ │ ├── ArticlePageReqVO.java │ │ │ │ │ │ │ │ ├── ArticleRespVO.java │ │ │ │ │ │ │ │ └── ArticleUpdateReqVO.java │ │ │ │ │ │ │ └── category/ │ │ │ │ │ │ │ ├── ArticleCategoryBaseVO.java │ │ │ │ │ │ │ ├── ArticleCategoryCreateReqVO.java │ │ │ │ │ │ │ ├── ArticleCategoryPageReqVO.java │ │ │ │ │ │ │ ├── ArticleCategoryRespVO.java │ │ │ │ │ │ │ ├── ArticleCategorySimpleRespVO.java │ │ │ │ │ │ │ └── ArticleCategoryUpdateReqVO.java │ │ │ │ │ │ ├── banner/ │ │ │ │ │ │ │ ├── BannerController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── BannerBaseVO.java │ │ │ │ │ │ │ ├── BannerCreateReqVO.java │ │ │ │ │ │ │ ├── BannerPageReqVO.java │ │ │ │ │ │ │ ├── BannerRespVO.java │ │ │ │ │ │ │ └── BannerUpdateReqVO.java │ │ │ │ │ │ ├── bargain/ │ │ │ │ │ │ │ ├── BargainActivityController.java │ │ │ │ │ │ │ ├── BargainHelpController.java │ │ │ │ │ │ │ ├── BargainRecordController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── activity/ │ │ │ │ │ │ │ │ ├── BargainActivityBaseVO.java │ │ │ │ │ │ │ │ ├── BargainActivityCreateReqVO.java │ │ │ │ │ │ │ │ ├── BargainActivityPageItemRespVO.java │ │ │ │ │ │ │ │ ├── BargainActivityPageReqVO.java │ │ │ │ │ │ │ │ ├── BargainActivityRespVO.java │ │ │ │ │ │ │ │ └── BargainActivityUpdateReqVO.java │ │ │ │ │ │ │ ├── help/ │ │ │ │ │ │ │ │ ├── BargainHelpBaseVO.java │ │ │ │ │ │ │ │ ├── BargainHelpPageReqVO.java │ │ │ │ │ │ │ │ └── BargainHelpRespVO.java │ │ │ │ │ │ │ └── recrod/ │ │ │ │ │ │ │ ├── BargainRecordBaseVO.java │ │ │ │ │ │ │ ├── BargainRecordPageItemRespVO.java │ │ │ │ │ │ │ └── BargainRecordPageReqVO.java │ │ │ │ │ │ ├── combination/ │ │ │ │ │ │ │ ├── CombinationActivityController.java │ │ │ │ │ │ │ ├── CombinationRecordController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── activity/ │ │ │ │ │ │ │ │ ├── CombinationActivityBaseVO.java │ │ │ │ │ │ │ │ ├── CombinationActivityCreateReqVO.java │ │ │ │ │ │ │ │ ├── CombinationActivityPageItemRespVO.java │ │ │ │ │ │ │ │ ├── CombinationActivityPageReqVO.java │ │ │ │ │ │ │ │ ├── CombinationActivityRespVO.java │ │ │ │ │ │ │ │ └── CombinationActivityUpdateReqVO.java │ │ │ │ │ │ │ ├── product/ │ │ │ │ │ │ │ │ ├── CombinationProductBaseVO.java │ │ │ │ │ │ │ │ ├── CombinationProductPageReqVO.java │ │ │ │ │ │ │ │ └── CombinationProductRespVO.java │ │ │ │ │ │ │ └── recrod/ │ │ │ │ │ │ │ ├── CombinationRecordBaseVO.java │ │ │ │ │ │ │ ├── CombinationRecordPageItemRespVO.java │ │ │ │ │ │ │ ├── CombinationRecordReqPage2VO.java │ │ │ │ │ │ │ ├── CombinationRecordReqPageVO.java │ │ │ │ │ │ │ └── CombinationRecordSummaryVO.java │ │ │ │ │ │ ├── coupon/ │ │ │ │ │ │ │ ├── CouponController.java │ │ │ │ │ │ │ ├── CouponTemplateController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── coupon/ │ │ │ │ │ │ │ │ ├── CouponBaseVO.java │ │ │ │ │ │ │ │ ├── CouponPageItemRespVO.java │ │ │ │ │ │ │ │ ├── CouponPageReqVO.java │ │ │ │ │ │ │ │ ├── CouponRespVO.java │ │ │ │ │ │ │ │ └── CouponSendReqVO.java │ │ │ │ │ │ │ └── template/ │ │ │ │ │ │ │ ├── CouponTemplateBaseVO.java │ │ │ │ │ │ │ ├── CouponTemplateCreateReqVO.java │ │ │ │ │ │ │ ├── CouponTemplatePageReqVO.java │ │ │ │ │ │ │ ├── CouponTemplateRespVO.java │ │ │ │ │ │ │ ├── CouponTemplateUpdateReqVO.java │ │ │ │ │ │ │ └── CouponTemplateUpdateStatusReqVO.java │ │ │ │ │ │ ├── discount/ │ │ │ │ │ │ │ ├── DiscountActivityController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── DiscountActivityBaseVO.java │ │ │ │ │ │ │ ├── DiscountActivityCreateReqVO.java │ │ │ │ │ │ │ ├── DiscountActivityPageReqVO.java │ │ │ │ │ │ │ ├── DiscountActivityRespVO.java │ │ │ │ │ │ │ └── DiscountActivityUpdateReqVO.java │ │ │ │ │ │ ├── diy/ │ │ │ │ │ │ │ ├── DiyPageController.java │ │ │ │ │ │ │ ├── DiyTemplateController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── page/ │ │ │ │ │ │ │ │ ├── DiyPageBaseVO.java │ │ │ │ │ │ │ │ ├── DiyPageCreateReqVO.java │ │ │ │ │ │ │ │ ├── DiyPagePageReqVO.java │ │ │ │ │ │ │ │ ├── DiyPagePropertyRespVO.java │ │ │ │ │ │ │ │ ├── DiyPagePropertyUpdateRequestVO.java │ │ │ │ │ │ │ │ ├── DiyPageRespVO.java │ │ │ │ │ │ │ │ └── DiyPageUpdateReqVO.java │ │ │ │ │ │ │ └── template/ │ │ │ │ │ │ │ ├── DiyTemplateBaseVO.java │ │ │ │ │ │ │ ├── DiyTemplateCreateReqVO.java │ │ │ │ │ │ │ ├── DiyTemplatePageReqVO.java │ │ │ │ │ │ │ ├── DiyTemplatePropertyRespVO.java │ │ │ │ │ │ │ ├── DiyTemplatePropertyUpdateRequestVO.java │ │ │ │ │ │ │ ├── DiyTemplateRespVO.java │ │ │ │ │ │ │ └── DiyTemplateUpdateReqVO.java │ │ │ │ │ │ ├── kefu/ │ │ │ │ │ │ │ ├── KeFuConversationController.java │ │ │ │ │ │ │ ├── KeFuMessageController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── conversation/ │ │ │ │ │ │ │ │ ├── KeFuConversationRespVO.java │ │ │ │ │ │ │ │ └── KeFuConversationUpdatePinnedReqVO.java │ │ │ │ │ │ │ └── message/ │ │ │ │ │ │ │ ├── KeFuMessageListReqVO.java │ │ │ │ │ │ │ ├── KeFuMessageRespVO.java │ │ │ │ │ │ │ └── KeFuMessageSendReqVO.java │ │ │ │ │ │ ├── point/ │ │ │ │ │ │ │ ├── PointActivityController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── activity/ │ │ │ │ │ │ │ │ ├── PointActivityPageReqVO.java │ │ │ │ │ │ │ │ ├── PointActivityRespVO.java │ │ │ │ │ │ │ │ └── PointActivitySaveReqVO.java │ │ │ │ │ │ │ └── product/ │ │ │ │ │ │ │ ├── PointProductRespVO.java │ │ │ │ │ │ │ └── PointProductSaveReqVO.java │ │ │ │ │ │ ├── reward/ │ │ │ │ │ │ │ ├── RewardActivityController.java │ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ │ ├── RewardActivityBaseVO.java │ │ │ │ │ │ │ ├── RewardActivityCreateReqVO.java │ │ │ │ │ │ │ ├── RewardActivityPageReqVO.java │ │ │ │ │ │ │ ├── RewardActivityRespVO.java │ │ │ │ │ │ │ └── RewardActivityUpdateReqVO.java │ │ │ │ │ │ └── seckill/ │ │ │ │ │ │ ├── SeckillActivityController.java │ │ │ │ │ │ ├── SeckillConfigController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── activity/ │ │ │ │ │ │ │ ├── SeckillActivityBaseVO.java │ │ │ │ │ │ │ ├── SeckillActivityCreateReqVO.java │ │ │ │ │ │ │ ├── SeckillActivityDetailRespVO.java │ │ │ │ │ │ │ ├── SeckillActivityPageReqVO.java │ │ │ │ │ │ │ ├── SeckillActivityRespVO.java │ │ │ │ │ │ │ └── SeckillActivityUpdateReqVO.java │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ ├── SeckillConfigBaseVO.java │ │ │ │ │ │ │ ├── SeckillConfigCreateReqVO.java │ │ │ │ │ │ │ ├── SeckillConfigPageReqVO.java │ │ │ │ │ │ │ ├── SeckillConfigRespVO.java │ │ │ │ │ │ │ ├── SeckillConfigSimpleRespVO.java │ │ │ │ │ │ │ ├── SeckillConfigUpdateReqVO.java │ │ │ │ │ │ │ └── SeckillConfigUpdateStatusReqVo.java │ │ │ │ │ │ └── product/ │ │ │ │ │ │ ├── SeckillProductBaseVO.java │ │ │ │ │ │ └── SeckillProductRespVO.java │ │ │ │ │ └── app/ │ │ │ │ │ ├── activity/ │ │ │ │ │ │ ├── AppActivityController.http │ │ │ │ │ │ ├── AppActivityController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ └── AppActivityRespVO.java │ │ │ │ │ ├── article/ │ │ │ │ │ │ ├── AppArticleCategoryController.java │ │ │ │ │ │ ├── AppArticleController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── article/ │ │ │ │ │ │ │ ├── AppArticlePageReqVO.java │ │ │ │ │ │ │ └── AppArticleRespVO.java │ │ │ │ │ │ └── category/ │ │ │ │ │ │ └── AppArticleCategoryRespVO.java │ │ │ │ │ ├── banner/ │ │ │ │ │ │ ├── AppBannerController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ └── AppBannerRespVO.java │ │ │ │ │ ├── bargain/ │ │ │ │ │ │ ├── AppBargainActivityController.java │ │ │ │ │ │ ├── AppBargainHelpController.http │ │ │ │ │ │ ├── AppBargainHelpController.java │ │ │ │ │ │ ├── AppBargainRecordController.http │ │ │ │ │ │ ├── AppBargainRecordController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── activity/ │ │ │ │ │ │ │ ├── AppBargainActivityDetailRespVO.java │ │ │ │ │ │ │ └── AppBargainActivityRespVO.java │ │ │ │ │ │ ├── help/ │ │ │ │ │ │ │ ├── AppBargainHelpCreateReqVO.java │ │ │ │ │ │ │ └── AppBargainHelpRespVO.java │ │ │ │ │ │ └── record/ │ │ │ │ │ │ ├── AppBargainRecordCreateReqVO.java │ │ │ │ │ │ ├── AppBargainRecordDetailRespVO.java │ │ │ │ │ │ ├── AppBargainRecordRespVO.java │ │ │ │ │ │ └── AppBargainRecordSummaryRespVO.java │ │ │ │ │ ├── combination/ │ │ │ │ │ │ ├── AppCombinationActivityController.java │ │ │ │ │ │ ├── AppCombinationRecordController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── activity/ │ │ │ │ │ │ │ ├── AppCombinationActivityDetailRespVO.java │ │ │ │ │ │ │ └── AppCombinationActivityRespVO.java │ │ │ │ │ │ └── record/ │ │ │ │ │ │ ├── AppCombinationRecordDetailRespVO.java │ │ │ │ │ │ ├── AppCombinationRecordPageReqVO.java │ │ │ │ │ │ ├── AppCombinationRecordRespVO.java │ │ │ │ │ │ └── AppCombinationRecordSummaryRespVO.java │ │ │ │ │ ├── coupon/ │ │ │ │ │ │ ├── AppCouponController.java │ │ │ │ │ │ ├── AppCouponTemplateController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── coupon/ │ │ │ │ │ │ │ ├── AppCouponPageReqVO.java │ │ │ │ │ │ │ ├── AppCouponRespVO.java │ │ │ │ │ │ │ └── AppCouponTakeReqVO.java │ │ │ │ │ │ └── template/ │ │ │ │ │ │ ├── AppCouponTemplatePageReqVO.java │ │ │ │ │ │ └── AppCouponTemplateRespVO.java │ │ │ │ │ ├── diy/ │ │ │ │ │ │ ├── AppDiyPageController.java │ │ │ │ │ │ ├── AppDiyTemplateController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AppDiyPagePropertyRespVO.java │ │ │ │ │ │ └── AppDiyTemplatePropertyRespVO.java │ │ │ │ │ ├── kefu/ │ │ │ │ │ │ ├── AppKeFuMessageController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── message/ │ │ │ │ │ │ │ ├── AppKeFuMessagePageReqVO.java │ │ │ │ │ │ │ └── AppKeFuMessageSendReqVO.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── point/ │ │ │ │ │ │ ├── AppPointActivityController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AppPointActivityDetailRespVO.java │ │ │ │ │ │ ├── AppPointActivityPageReqVO.java │ │ │ │ │ │ └── AppPointActivityRespVO.java │ │ │ │ │ ├── reward/ │ │ │ │ │ │ ├── AppRewardActivityController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ └── AppRewardActivityRespVO.java │ │ │ │ │ └── seckill/ │ │ │ │ │ ├── AppSeckillActivityController.java │ │ │ │ │ ├── AppSeckillConfigController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── activity/ │ │ │ │ │ │ ├── AppSeckillActivityDetailRespVO.java │ │ │ │ │ │ ├── AppSeckillActivityNowRespVO.java │ │ │ │ │ │ ├── AppSeckillActivityPageReqVO.java │ │ │ │ │ │ └── AppSeckillActivityRespVO.java │ │ │ │ │ └── config/ │ │ │ │ │ └── AppSeckillConfigRespVO.java │ │ │ │ ├── convert/ │ │ │ │ │ ├── article/ │ │ │ │ │ │ ├── ArticleCategoryConvert.java │ │ │ │ │ │ └── ArticleConvert.java │ │ │ │ │ ├── banner/ │ │ │ │ │ │ └── BannerConvert.java │ │ │ │ │ ├── bargain/ │ │ │ │ │ │ ├── BargainActivityConvert.java │ │ │ │ │ │ ├── BargainHelpConvert.java │ │ │ │ │ │ └── BargainRecordConvert.java │ │ │ │ │ ├── combination/ │ │ │ │ │ │ └── CombinationActivityConvert.java │ │ │ │ │ ├── coupon/ │ │ │ │ │ │ ├── CouponConvert.java │ │ │ │ │ │ └── CouponTemplateConvert.java │ │ │ │ │ ├── discount/ │ │ │ │ │ │ └── DiscountActivityConvert.java │ │ │ │ │ ├── diy/ │ │ │ │ │ │ ├── DiyPageConvert.java │ │ │ │ │ │ └── DiyTemplateConvert.java │ │ │ │ │ └── seckill/ │ │ │ │ │ ├── SeckillActivityConvert.java │ │ │ │ │ └── SeckillConfigConvert.java │ │ │ │ ├── dal/ │ │ │ │ │ ├── dataobject/ │ │ │ │ │ │ ├── article/ │ │ │ │ │ │ │ ├── ArticleCategoryDO.java │ │ │ │ │ │ │ └── ArticleDO.java │ │ │ │ │ │ ├── banner/ │ │ │ │ │ │ │ └── BannerDO.java │ │ │ │ │ │ ├── bargain/ │ │ │ │ │ │ │ ├── BargainActivityDO.java │ │ │ │ │ │ │ ├── BargainHelpDO.java │ │ │ │ │ │ │ └── BargainRecordDO.java │ │ │ │ │ │ ├── combination/ │ │ │ │ │ │ │ ├── CombinationActivityDO.java │ │ │ │ │ │ │ ├── CombinationProductDO.java │ │ │ │ │ │ │ └── CombinationRecordDO.java │ │ │ │ │ │ ├── coupon/ │ │ │ │ │ │ │ ├── CouponDO.java │ │ │ │ │ │ │ └── CouponTemplateDO.java │ │ │ │ │ │ ├── discount/ │ │ │ │ │ │ │ ├── DiscountActivityDO.java │ │ │ │ │ │ │ └── DiscountProductDO.java │ │ │ │ │ │ ├── diy/ │ │ │ │ │ │ │ ├── DiyPageDO.java │ │ │ │ │ │ │ └── DiyTemplateDO.java │ │ │ │ │ │ ├── kefu/ │ │ │ │ │ │ │ ├── KeFuConversationDO.java │ │ │ │ │ │ │ └── KeFuMessageDO.java │ │ │ │ │ │ ├── point/ │ │ │ │ │ │ │ ├── PointActivityDO.java │ │ │ │ │ │ │ └── PointProductDO.java │ │ │ │ │ │ ├── reward/ │ │ │ │ │ │ │ └── RewardActivityDO.java │ │ │ │ │ │ └── seckill/ │ │ │ │ │ │ ├── SeckillActivityDO.java │ │ │ │ │ │ ├── SeckillConfigDO.java │ │ │ │ │ │ └── SeckillProductDO.java │ │ │ │ │ └── mysql/ │ │ │ │ │ ├── article/ │ │ │ │ │ │ ├── ArticleCategoryMapper.java │ │ │ │ │ │ └── ArticleMapper.java │ │ │ │ │ ├── banner/ │ │ │ │ │ │ └── BannerMapper.java │ │ │ │ │ ├── bargain/ │ │ │ │ │ │ ├── BargainActivityMapper.java │ │ │ │ │ │ ├── BargainHelpMapper.java │ │ │ │ │ │ └── BargainRecordMapper.java │ │ │ │ │ ├── combination/ │ │ │ │ │ │ ├── CombinationActivityMapper.java │ │ │ │ │ │ ├── CombinationProductMapper.java │ │ │ │ │ │ └── CombinationRecordMapper.java │ │ │ │ │ ├── coupon/ │ │ │ │ │ │ ├── CouponMapper.java │ │ │ │ │ │ └── CouponTemplateMapper.java │ │ │ │ │ ├── discount/ │ │ │ │ │ │ ├── DiscountActivityMapper.java │ │ │ │ │ │ └── DiscountProductMapper.java │ │ │ │ │ ├── diy/ │ │ │ │ │ │ ├── DiyPageMapper.java │ │ │ │ │ │ └── DiyTemplateMapper.java │ │ │ │ │ ├── kefu/ │ │ │ │ │ │ ├── KeFuConversationMapper.java │ │ │ │ │ │ └── KeFuMessageMapper.java │ │ │ │ │ ├── point/ │ │ │ │ │ │ ├── PointActivityMapper.java │ │ │ │ │ │ └── PointProductMapper.java │ │ │ │ │ ├── reward/ │ │ │ │ │ │ └── RewardActivityMapper.java │ │ │ │ │ └── seckill/ │ │ │ │ │ ├── seckillactivity/ │ │ │ │ │ │ ├── SeckillActivityMapper.java │ │ │ │ │ │ └── SeckillProductMapper.java │ │ │ │ │ └── seckillconfig/ │ │ │ │ │ └── SeckillConfigMapper.java │ │ │ │ ├── framework/ │ │ │ │ │ ├── package-info.java │ │ │ │ │ ├── rpc/ │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ └── RpcConfiguration.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── security/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── SecurityConfiguration.java │ │ │ │ │ └── core/ │ │ │ │ │ └── package-info.java │ │ │ │ ├── job/ │ │ │ │ │ ├── combination/ │ │ │ │ │ │ └── CombinationRecordExpireJob.java │ │ │ │ │ ├── coupon/ │ │ │ │ │ │ └── CouponExpireJob.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── mq/ │ │ │ │ │ ├── consumer/ │ │ │ │ │ │ ├── coupon/ │ │ │ │ │ │ │ └── CouponTakeByRegisterConsumer.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── message/ │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── producer/ │ │ │ │ │ └── package-info.java │ │ │ │ ├── package-info.java │ │ │ │ └── service/ │ │ │ │ ├── article/ │ │ │ │ │ ├── ArticleCategoryService.java │ │ │ │ │ ├── ArticleCategoryServiceImpl.java │ │ │ │ │ ├── ArticleService.java │ │ │ │ │ └── ArticleServiceImpl.java │ │ │ │ ├── banner/ │ │ │ │ │ ├── BannerService.java │ │ │ │ │ └── BannerServiceImpl.java │ │ │ │ ├── bargain/ │ │ │ │ │ ├── BargainActivityService.java │ │ │ │ │ ├── BargainActivityServiceImpl.java │ │ │ │ │ ├── BargainHelpService.java │ │ │ │ │ ├── BargainHelpServiceImpl.java │ │ │ │ │ ├── BargainRecordService.java │ │ │ │ │ └── BargainRecordServiceImpl.java │ │ │ │ ├── combination/ │ │ │ │ │ ├── CombinationActivityService.java │ │ │ │ │ ├── CombinationActivityServiceImpl.java │ │ │ │ │ ├── CombinationRecordService.java │ │ │ │ │ └── CombinationRecordServiceImpl.java │ │ │ │ ├── coupon/ │ │ │ │ │ ├── CouponService.java │ │ │ │ │ ├── CouponServiceImpl.java │ │ │ │ │ ├── CouponTemplateService.java │ │ │ │ │ └── CouponTemplateServiceImpl.java │ │ │ │ ├── discount/ │ │ │ │ │ ├── DiscountActivityService.java │ │ │ │ │ └── DiscountActivityServiceImpl.java │ │ │ │ ├── diy/ │ │ │ │ │ ├── DiyPageService.java │ │ │ │ │ ├── DiyPageServiceImpl.java │ │ │ │ │ ├── DiyTemplateService.java │ │ │ │ │ └── DiyTemplateServiceImpl.java │ │ │ │ ├── kefu/ │ │ │ │ │ ├── KeFuConversationService.java │ │ │ │ │ ├── KeFuConversationServiceImpl.java │ │ │ │ │ ├── KeFuMessageService.java │ │ │ │ │ └── KeFuMessageServiceImpl.java │ │ │ │ ├── point/ │ │ │ │ │ ├── PointActivityService.java │ │ │ │ │ └── PointActivityServiceImpl.java │ │ │ │ ├── reward/ │ │ │ │ │ ├── RewardActivityService.java │ │ │ │ │ └── RewardActivityServiceImpl.java │ │ │ │ └── seckill/ │ │ │ │ ├── SeckillActivityService.java │ │ │ │ ├── SeckillActivityServiceImpl.java │ │ │ │ ├── SeckillConfigService.java │ │ │ │ └── SeckillConfigServiceImpl.java │ │ │ └── resources/ │ │ │ ├── application-dev.yaml │ │ │ ├── application-local.yaml │ │ │ ├── application.yaml │ │ │ └── logback-spring.xml │ │ └── test/ │ │ └── resources/ │ │ ├── application-unit-test.yaml │ │ ├── logback.xml │ │ └── sql/ │ │ ├── clean.sql │ │ └── create_tables.sql │ ├── yudao-module-statistics-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── statistics/ │ │ ├── api/ │ │ │ └── package-info.java │ │ └── enums/ │ │ ├── TimeRangeTypeEnum.java │ │ └── package-info.java │ ├── yudao-module-statistics-server/ │ │ ├── Dockerfile │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── module/ │ │ │ └── statistics/ │ │ │ ├── StatisticsServerApplication.java │ │ │ ├── controller/ │ │ │ │ ├── admin/ │ │ │ │ │ ├── common/ │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ └── DataComparisonRespVO.java │ │ │ │ │ ├── member/ │ │ │ │ │ │ ├── MemberStatisticsController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── MemberAnalyseDataRespVO.java │ │ │ │ │ │ ├── MemberAnalyseReqVO.java │ │ │ │ │ │ ├── MemberAnalyseRespVO.java │ │ │ │ │ │ ├── MemberAreaStatisticsRespVO.java │ │ │ │ │ │ ├── MemberCountRespVO.java │ │ │ │ │ │ ├── MemberRegisterCountRespVO.java │ │ │ │ │ │ ├── MemberSexStatisticsRespVO.java │ │ │ │ │ │ ├── MemberSummaryRespVO.java │ │ │ │ │ │ └── MemberTerminalStatisticsRespVO.java │ │ │ │ │ ├── pay/ │ │ │ │ │ │ ├── PayStatisticsController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ └── PaySummaryRespVO.java │ │ │ │ │ ├── product/ │ │ │ │ │ │ ├── ProductStatisticsController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── ProductStatisticsReqVO.java │ │ │ │ │ │ └── ProductStatisticsRespVO.java │ │ │ │ │ └── trade/ │ │ │ │ │ ├── TradeStatisticsController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── TradeOrderCountRespVO.java │ │ │ │ │ ├── TradeOrderSummaryRespVO.java │ │ │ │ │ ├── TradeOrderTrendReqVO.java │ │ │ │ │ ├── TradeOrderTrendRespVO.java │ │ │ │ │ ├── TradeSummaryRespVO.java │ │ │ │ │ ├── TradeTrendReqVO.java │ │ │ │ │ ├── TradeTrendSummaryExcelVO.java │ │ │ │ │ └── TradeTrendSummaryRespVO.java │ │ │ │ └── app/ │ │ │ │ └── package-info.java │ │ │ ├── convert/ │ │ │ │ ├── member/ │ │ │ │ │ └── MemberStatisticsConvert.java │ │ │ │ ├── pay/ │ │ │ │ │ └── PayStatisticsConvert.java │ │ │ │ └── trade/ │ │ │ │ └── TradeStatisticsConvert.java │ │ │ ├── dal/ │ │ │ │ ├── dataobject/ │ │ │ │ │ ├── package-info.java │ │ │ │ │ ├── product/ │ │ │ │ │ │ └── ProductStatisticsDO.java │ │ │ │ │ └── trade/ │ │ │ │ │ └── TradeStatisticsDO.java │ │ │ │ └── mysql/ │ │ │ │ ├── infra/ │ │ │ │ │ └── ApiAccessLogStatisticsMapper.java │ │ │ │ ├── member/ │ │ │ │ │ └── MemberStatisticsMapper.java │ │ │ │ ├── pay/ │ │ │ │ │ └── PayWalletStatisticsMapper.java │ │ │ │ ├── product/ │ │ │ │ │ └── ProductStatisticsMapper.java │ │ │ │ └── trade/ │ │ │ │ ├── AfterSaleStatisticsMapper.java │ │ │ │ ├── BrokerageStatisticsMapper.java │ │ │ │ ├── TradeOrderStatisticsMapper.java │ │ │ │ └── TradeStatisticsMapper.java │ │ │ ├── framework/ │ │ │ │ ├── package-info.java │ │ │ │ ├── rpc/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── RpcConfiguration.java │ │ │ │ │ └── package-info.java │ │ │ │ └── security/ │ │ │ │ ├── config/ │ │ │ │ │ └── SecurityConfiguration.java │ │ │ │ └── core/ │ │ │ │ └── package-info.java │ │ │ ├── job/ │ │ │ │ ├── package-info.java │ │ │ │ ├── product/ │ │ │ │ │ └── ProductStatisticsJob.java │ │ │ │ └── trade/ │ │ │ │ └── TradeStatisticsJob.java │ │ │ ├── package-info.java │ │ │ └── service/ │ │ │ ├── infra/ │ │ │ │ ├── ApiAccessLogStatisticsService.java │ │ │ │ └── ApiAccessLogStatisticsServiceImpl.java │ │ │ ├── member/ │ │ │ │ ├── MemberStatisticsService.java │ │ │ │ ├── MemberStatisticsServiceImpl.java │ │ │ │ └── bo/ │ │ │ │ └── MemberAreaStatisticsRespBO.java │ │ │ ├── pay/ │ │ │ │ ├── PayWalletStatisticsService.java │ │ │ │ ├── PayWalletStatisticsServiceImpl.java │ │ │ │ └── bo/ │ │ │ │ └── RechargeSummaryRespBO.java │ │ │ ├── product/ │ │ │ │ ├── ProductStatisticsService.java │ │ │ │ └── ProductStatisticsServiceImpl.java │ │ │ └── trade/ │ │ │ ├── AfterSaleStatisticsService.java │ │ │ ├── AfterSaleStatisticsServiceImpl.java │ │ │ ├── BrokerageStatisticsService.java │ │ │ ├── BrokerageStatisticsServiceImpl.java │ │ │ ├── TradeOrderStatisticsService.java │ │ │ ├── TradeOrderStatisticsServiceImpl.java │ │ │ ├── TradeStatisticsService.java │ │ │ ├── TradeStatisticsServiceImpl.java │ │ │ └── bo/ │ │ │ ├── AfterSaleSummaryRespBO.java │ │ │ ├── MemberAreaStatisticsRespBO.java │ │ │ ├── TradeOrderSummaryRespBO.java │ │ │ ├── TradeSummaryRespBO.java │ │ │ └── WalletSummaryRespBO.java │ │ └── resources/ │ │ ├── application-dev.yaml │ │ ├── application-local.yaml │ │ ├── application.yaml │ │ ├── logback-spring.xml │ │ └── mapper/ │ │ ├── infra/ │ │ │ └── ApiAccessLogStatisticsMapper.xml │ │ ├── member/ │ │ │ └── MemberStatisticsMapper.xml │ │ ├── pay/ │ │ │ └── PayWalletStatisticsMapper.xml │ │ ├── product/ │ │ │ └── ProductStatisticsMapper.xml │ │ └── trade/ │ │ ├── AfterSaleStatisticsMapper.xml │ │ ├── BrokerageStatisticsMapper.xml │ │ ├── TradeOrderStatisticsMapper.xml │ │ └── TradeStatisticsMapper.xml │ ├── yudao-module-trade-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── trade/ │ │ ├── api/ │ │ │ ├── order/ │ │ │ │ ├── TradeOrderApi.java │ │ │ │ └── dto/ │ │ │ │ └── TradeOrderRespDTO.java │ │ │ └── package-info.java │ │ └── enums/ │ │ ├── ApiConstants.java │ │ ├── DictTypeConstants.java │ │ ├── ErrorCodeConstants.java │ │ ├── MessageTemplateConstants.java │ │ ├── aftersale/ │ │ │ ├── AfterSaleOperateTypeEnum.java │ │ │ ├── AfterSaleStatusEnum.java │ │ │ ├── AfterSaleTypeEnum.java │ │ │ └── AfterSaleWayEnum.java │ │ ├── brokerage/ │ │ │ ├── BrokerageBindModeEnum.java │ │ │ ├── BrokerageEnabledConditionEnum.java │ │ │ ├── BrokerageRecordBizTypeEnum.java │ │ │ ├── BrokerageRecordStatusEnum.java │ │ │ ├── BrokerageWithdrawStatusEnum.java │ │ │ └── BrokerageWithdrawTypeEnum.java │ │ ├── delivery/ │ │ │ ├── DeliveryExpressChargeModeEnum.java │ │ │ └── DeliveryTypeEnum.java │ │ ├── notify/ │ │ │ └── TradeNotifyEnums.java │ │ └── order/ │ │ ├── TradeOrderCancelTypeEnum.java │ │ ├── TradeOrderItemAfterSaleStatusEnum.java │ │ ├── TradeOrderOperateTypeEnum.java │ │ ├── TradeOrderRefundStatusEnum.java │ │ ├── TradeOrderStatusEnum.java │ │ └── TradeOrderTypeEnum.java │ └── yudao-module-trade-server/ │ ├── Dockerfile │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── module/ │ │ │ └── trade/ │ │ │ ├── TradeServerApplication.java │ │ │ ├── api/ │ │ │ │ ├── order/ │ │ │ │ │ └── TradeOrderApiImpl.java │ │ │ │ └── package-info.java │ │ │ ├── controller/ │ │ │ │ ├── admin/ │ │ │ │ │ ├── aftersale/ │ │ │ │ │ │ ├── AfterSaleController.java │ │ │ │ │ │ ├── TradeAfterSaleController.http │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AfterSaleBaseVO.java │ │ │ │ │ │ ├── AfterSaleDetailRespVO.java │ │ │ │ │ │ ├── AfterSaleDisagreeReqVO.java │ │ │ │ │ │ ├── AfterSalePageReqVO.java │ │ │ │ │ │ ├── AfterSaleRefuseReqVO.java │ │ │ │ │ │ ├── AfterSaleRespPageItemVO.java │ │ │ │ │ │ └── log/ │ │ │ │ │ │ └── AfterSaleLogRespVO.java │ │ │ │ │ ├── base/ │ │ │ │ │ │ ├── member/ │ │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ │ └── user/ │ │ │ │ │ │ │ └── MemberUserRespVO.java │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ ├── product/ │ │ │ │ │ │ │ └── property/ │ │ │ │ │ │ │ └── ProductPropertyValueDetailRespVO.java │ │ │ │ │ │ └── system/ │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ └── user/ │ │ │ │ │ │ └── UserSimpleBaseVO.java │ │ │ │ │ ├── brokerage/ │ │ │ │ │ │ ├── BrokerageRecordController.java │ │ │ │ │ │ ├── BrokerageUserController.java │ │ │ │ │ │ ├── BrokerageWithdrawController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── record/ │ │ │ │ │ │ │ ├── BrokerageRecordBaseVO.java │ │ │ │ │ │ │ ├── BrokerageRecordPageReqVO.java │ │ │ │ │ │ │ └── BrokerageRecordRespVO.java │ │ │ │ │ │ ├── user/ │ │ │ │ │ │ │ ├── BrokerageUserBaseVO.java │ │ │ │ │ │ │ ├── BrokerageUserClearBrokerageUserReqVO.java │ │ │ │ │ │ │ ├── BrokerageUserCreateReqVO.java │ │ │ │ │ │ │ ├── BrokerageUserPageReqVO.java │ │ │ │ │ │ │ ├── BrokerageUserRespVO.java │ │ │ │ │ │ │ ├── BrokerageUserUpdateBrokerageEnabledReqVO.java │ │ │ │ │ │ │ └── BrokerageUserUpdateBrokerageUserReqVO.java │ │ │ │ │ │ └── withdraw/ │ │ │ │ │ │ ├── BrokerageWithdrawPageReqVO.java │ │ │ │ │ │ ├── BrokerageWithdrawRejectReqVO.java │ │ │ │ │ │ └── BrokerageWithdrawRespVO.java │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── TradeConfigController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── TradeConfigBaseVO.java │ │ │ │ │ │ ├── TradeConfigRespVO.java │ │ │ │ │ │ └── TradeConfigSaveReqVO.java │ │ │ │ │ ├── delivery/ │ │ │ │ │ │ ├── DeliveryExpressController.java │ │ │ │ │ │ ├── DeliveryExpressTemplateController.java │ │ │ │ │ │ ├── DeliveryPickUpStoreController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── express/ │ │ │ │ │ │ │ ├── DeliveryExpressBaseVO.java │ │ │ │ │ │ │ ├── DeliveryExpressCreateReqVO.java │ │ │ │ │ │ │ ├── DeliveryExpressExcelVO.java │ │ │ │ │ │ │ ├── DeliveryExpressExportReqVO.java │ │ │ │ │ │ │ ├── DeliveryExpressPageReqVO.java │ │ │ │ │ │ │ ├── DeliveryExpressRespVO.java │ │ │ │ │ │ │ ├── DeliveryExpressSimpleRespVO.java │ │ │ │ │ │ │ └── DeliveryExpressUpdateReqVO.java │ │ │ │ │ │ ├── expresstemplate/ │ │ │ │ │ │ │ ├── DeliveryExpressTemplateBaseVO.java │ │ │ │ │ │ │ ├── DeliveryExpressTemplateChargeBaseVO.java │ │ │ │ │ │ │ ├── DeliveryExpressTemplateCreateReqVO.java │ │ │ │ │ │ │ ├── DeliveryExpressTemplateDetailRespVO.java │ │ │ │ │ │ │ ├── DeliveryExpressTemplateFreeBaseVO.java │ │ │ │ │ │ │ ├── DeliveryExpressTemplatePageReqVO.java │ │ │ │ │ │ │ ├── DeliveryExpressTemplateRespVO.java │ │ │ │ │ │ │ ├── DeliveryExpressTemplateSimpleRespVO.java │ │ │ │ │ │ │ └── DeliveryExpressTemplateUpdateReqVO.java │ │ │ │ │ │ └── pickup/ │ │ │ │ │ │ ├── DeliveryPickUpBindReqVO.java │ │ │ │ │ │ ├── DeliveryPickUpStoreBaseVO.java │ │ │ │ │ │ ├── DeliveryPickUpStoreCreateReqVO.java │ │ │ │ │ │ ├── DeliveryPickUpStorePageReqVO.java │ │ │ │ │ │ ├── DeliveryPickUpStoreRespVO.java │ │ │ │ │ │ ├── DeliveryPickUpStoreSimpleRespVO.java │ │ │ │ │ │ └── DeliveryPickUpStoreUpdateReqVO.java │ │ │ │ │ └── order/ │ │ │ │ │ ├── TradeOrderController.http │ │ │ │ │ ├── TradeOrderController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── TradeOrderBaseVO.java │ │ │ │ │ ├── TradeOrderDeliveryReqVO.java │ │ │ │ │ ├── TradeOrderDetailRespVO.java │ │ │ │ │ ├── TradeOrderItemBaseVO.java │ │ │ │ │ ├── TradeOrderPageItemRespVO.java │ │ │ │ │ ├── TradeOrderPageReqVO.java │ │ │ │ │ ├── TradeOrderRemarkReqVO.java │ │ │ │ │ ├── TradeOrderSummaryRespVO.java │ │ │ │ │ ├── TradeOrderUpdateAddressReqVO.java │ │ │ │ │ └── TradeOrderUpdatePriceReqVO.java │ │ │ │ ├── app/ │ │ │ │ │ ├── aftersale/ │ │ │ │ │ │ ├── AppAfterSaleController.java │ │ │ │ │ │ ├── AppAfterSaleLogController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AppAfterSaleCreateReqVO.java │ │ │ │ │ │ ├── AppAfterSaleDeliveryReqVO.java │ │ │ │ │ │ ├── AppAfterSalePageReqVO.java │ │ │ │ │ │ ├── AppAfterSaleRespVO.java │ │ │ │ │ │ └── log/ │ │ │ │ │ │ └── AppAfterSaleLogRespVO.java │ │ │ │ │ ├── base/ │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ ├── property/ │ │ │ │ │ │ │ └── AppProductPropertyValueDetailRespVO.java │ │ │ │ │ │ ├── sku/ │ │ │ │ │ │ │ └── AppProductSkuBaseRespVO.java │ │ │ │ │ │ └── spu/ │ │ │ │ │ │ └── AppProductSpuBaseRespVO.java │ │ │ │ │ ├── brokerage/ │ │ │ │ │ │ ├── AppBrokerageRecordController.java │ │ │ │ │ │ ├── AppBrokerageUserController.java │ │ │ │ │ │ ├── AppBrokerageWithdrawController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── record/ │ │ │ │ │ │ │ ├── AppBrokerageProductPriceRespVO.java │ │ │ │ │ │ │ ├── AppBrokerageRecordPageReqVO.java │ │ │ │ │ │ │ └── AppBrokerageRecordRespVO.java │ │ │ │ │ │ ├── user/ │ │ │ │ │ │ │ ├── AppBrokerageUserBindReqVO.java │ │ │ │ │ │ │ ├── AppBrokerageUserChildSummaryPageReqVO.java │ │ │ │ │ │ │ ├── AppBrokerageUserChildSummaryRespVO.java │ │ │ │ │ │ │ ├── AppBrokerageUserMySummaryRespVO.java │ │ │ │ │ │ │ ├── AppBrokerageUserRankByPriceRespVO.java │ │ │ │ │ │ │ ├── AppBrokerageUserRankByUserCountRespVO.java │ │ │ │ │ │ │ ├── AppBrokerageUserRankPageReqVO.java │ │ │ │ │ │ │ └── AppBrokerageUserRespVO.java │ │ │ │ │ │ └── withdraw/ │ │ │ │ │ │ ├── AppBrokerageWithdrawCreateReqVO.java │ │ │ │ │ │ ├── AppBrokerageWithdrawPageReqVO.java │ │ │ │ │ │ └── AppBrokerageWithdrawRespVO.java │ │ │ │ │ ├── cart/ │ │ │ │ │ │ ├── AppCartController.http │ │ │ │ │ │ ├── AppCartController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AppCartAddReqVO.java │ │ │ │ │ │ ├── AppCartDetailRespVO.java │ │ │ │ │ │ ├── AppCartListRespVO.java │ │ │ │ │ │ ├── AppCartResetReqVO.java │ │ │ │ │ │ ├── AppCartUpdateCountReqVO.java │ │ │ │ │ │ └── AppCartUpdateSelectedReqVO.java │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── AppTradeConfigController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ └── AppTradeConfigRespVO.java │ │ │ │ │ ├── delivery/ │ │ │ │ │ │ ├── AppDeliverExpressController.java │ │ │ │ │ │ ├── AppDeliverPickUpStoreController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ └── AppDeliveryConfigRespVO.java │ │ │ │ │ │ ├── express/ │ │ │ │ │ │ │ └── AppDeliveryExpressRespVO.java │ │ │ │ │ │ └── pickup/ │ │ │ │ │ │ └── AppDeliveryPickUpStoreRespVO.java │ │ │ │ │ └── order/ │ │ │ │ │ ├── AppTradeOrderController.http │ │ │ │ │ ├── AppTradeOrderController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── AppOrderExpressTrackRespDTO.java │ │ │ │ │ ├── AppTradeOrderCreateReqVO.java │ │ │ │ │ ├── AppTradeOrderCreateRespVO.java │ │ │ │ │ ├── AppTradeOrderDetailRespVO.java │ │ │ │ │ ├── AppTradeOrderPageItemRespVO.java │ │ │ │ │ ├── AppTradeOrderPageReqVO.java │ │ │ │ │ ├── AppTradeOrderSettlementReqVO.java │ │ │ │ │ ├── AppTradeOrderSettlementRespVO.java │ │ │ │ │ ├── AppTradeProductSettlementRespVO.java │ │ │ │ │ └── item/ │ │ │ │ │ ├── AppTradeOrderItemCommentCreateReqVO.java │ │ │ │ │ └── AppTradeOrderItemRespVO.java │ │ │ │ └── package-info.java │ │ │ ├── convert/ │ │ │ │ ├── aftersale/ │ │ │ │ │ ├── AfterSaleConvert.java │ │ │ │ │ └── AfterSaleLogConvert.java │ │ │ │ ├── brokerage/ │ │ │ │ │ ├── BrokerageRecordConvert.java │ │ │ │ │ ├── BrokerageUserConvert.java │ │ │ │ │ └── BrokerageWithdrawConvert.java │ │ │ │ ├── cart/ │ │ │ │ │ └── TradeCartConvert.java │ │ │ │ ├── config/ │ │ │ │ │ └── TradeConfigConvert.java │ │ │ │ ├── delivery/ │ │ │ │ │ ├── DeliveryExpressConvert.java │ │ │ │ │ ├── DeliveryExpressTemplateConvert.java │ │ │ │ │ └── DeliveryPickUpStoreConvert.java │ │ │ │ └── order/ │ │ │ │ ├── TradeOrderConvert.java │ │ │ │ └── TradeOrderLogConvert.java │ │ │ ├── dal/ │ │ │ │ ├── dataobject/ │ │ │ │ │ ├── aftersale/ │ │ │ │ │ │ ├── AfterSaleDO.java │ │ │ │ │ │ └── AfterSaleLogDO.java │ │ │ │ │ ├── brokerage/ │ │ │ │ │ │ ├── BrokerageRecordDO.java │ │ │ │ │ │ ├── BrokerageUserDO.java │ │ │ │ │ │ └── BrokerageWithdrawDO.java │ │ │ │ │ ├── cart/ │ │ │ │ │ │ └── CartDO.java │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── TradeConfigDO.java │ │ │ │ │ ├── delivery/ │ │ │ │ │ │ ├── DeliveryExpressDO.java │ │ │ │ │ │ ├── DeliveryExpressTemplateChargeDO.java │ │ │ │ │ │ ├── DeliveryExpressTemplateDO.java │ │ │ │ │ │ ├── DeliveryExpressTemplateFreeDO.java │ │ │ │ │ │ └── DeliveryPickUpStoreDO.java │ │ │ │ │ └── order/ │ │ │ │ │ ├── TradeOrderDO.java │ │ │ │ │ ├── TradeOrderItemDO.java │ │ │ │ │ └── TradeOrderLogDO.java │ │ │ │ ├── mysql/ │ │ │ │ │ ├── aftersale/ │ │ │ │ │ │ ├── AfterSaleLogMapper.java │ │ │ │ │ │ └── AfterSaleMapper.java │ │ │ │ │ ├── brokerage/ │ │ │ │ │ │ ├── BrokerageRecordMapper.java │ │ │ │ │ │ ├── BrokerageUserMapper.java │ │ │ │ │ │ └── BrokerageWithdrawMapper.java │ │ │ │ │ ├── cart/ │ │ │ │ │ │ └── CartMapper.java │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── TradeConfigMapper.java │ │ │ │ │ ├── delivery/ │ │ │ │ │ │ ├── DeliveryExpressMapper.java │ │ │ │ │ │ ├── DeliveryExpressTemplateChargeMapper.java │ │ │ │ │ │ ├── DeliveryExpressTemplateFreeMapper.java │ │ │ │ │ │ ├── DeliveryExpressTemplateMapper.java │ │ │ │ │ │ └── DeliveryPickUpStoreMapper.java │ │ │ │ │ └── order/ │ │ │ │ │ ├── TradeOrderItemMapper.java │ │ │ │ │ ├── TradeOrderLogMapper.java │ │ │ │ │ └── TradeOrderMapper.java │ │ │ │ └── redis/ │ │ │ │ ├── RedisKeyConstants.java │ │ │ │ └── no/ │ │ │ │ └── TradeNoRedisDAO.java │ │ │ ├── framework/ │ │ │ │ ├── aftersale/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── AfterSaleLogConfiguration.java │ │ │ │ │ └── core/ │ │ │ │ │ ├── annotations/ │ │ │ │ │ │ └── AfterSaleLog.java │ │ │ │ │ ├── aop/ │ │ │ │ │ │ └── AfterSaleLogAspect.java │ │ │ │ │ └── utils/ │ │ │ │ │ └── AfterSaleLogUtils.java │ │ │ │ ├── delivery/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── ExpressClientConfig.java │ │ │ │ │ │ └── TradeExpressProperties.java │ │ │ │ │ └── core/ │ │ │ │ │ ├── client/ │ │ │ │ │ │ ├── ExpressClient.java │ │ │ │ │ │ ├── ExpressClientFactory.java │ │ │ │ │ │ ├── convert/ │ │ │ │ │ │ │ └── ExpressQueryConvert.java │ │ │ │ │ │ ├── dto/ │ │ │ │ │ │ │ ├── ExpressTrackQueryReqDTO.java │ │ │ │ │ │ │ ├── ExpressTrackRespDTO.java │ │ │ │ │ │ │ ├── kd100/ │ │ │ │ │ │ │ │ ├── Kd100ExpressQueryReqDTO.java │ │ │ │ │ │ │ │ └── Kd100ExpressQueryRespDTO.java │ │ │ │ │ │ │ └── kdniao/ │ │ │ │ │ │ │ ├── KdNiaoExpressQueryReqDTO.java │ │ │ │ │ │ │ └── KdNiaoExpressQueryRespDTO.java │ │ │ │ │ │ └── impl/ │ │ │ │ │ │ ├── ExpressClientFactoryImpl.java │ │ │ │ │ │ ├── NoProvideExpressClient.java │ │ │ │ │ │ ├── kd100/ │ │ │ │ │ │ │ └── Kd100ExpressClient.java │ │ │ │ │ │ └── kdniao/ │ │ │ │ │ │ └── KdNiaoExpressClient.java │ │ │ │ │ └── enums/ │ │ │ │ │ └── ExpressClientEnum.java │ │ │ │ ├── order/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── TradeOrderConfig.java │ │ │ │ │ │ └── TradeOrderProperties.java │ │ │ │ │ └── core/ │ │ │ │ │ ├── annotations/ │ │ │ │ │ │ └── TradeOrderLog.java │ │ │ │ │ ├── aop/ │ │ │ │ │ │ └── TradeOrderLogAspect.java │ │ │ │ │ └── utils/ │ │ │ │ │ └── TradeOrderLogUtils.java │ │ │ │ ├── package-info.java │ │ │ │ ├── rpc/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── RpcConfiguration.java │ │ │ │ │ └── package-info.java │ │ │ │ └── security/ │ │ │ │ ├── config/ │ │ │ │ │ └── SecurityConfiguration.java │ │ │ │ └── core/ │ │ │ │ └── package-info.java │ │ │ ├── job/ │ │ │ │ ├── brokerage/ │ │ │ │ │ └── BrokerageRecordUnfreezeJob.java │ │ │ │ └── order/ │ │ │ │ ├── TradeOrderAutoCancelJob.java │ │ │ │ ├── TradeOrderAutoCommentJob.java │ │ │ │ └── TradeOrderAutoReceiveJob.java │ │ │ ├── package-info.java │ │ │ └── service/ │ │ │ ├── aftersale/ │ │ │ │ ├── AfterSaleLogService.java │ │ │ │ ├── AfterSaleLogServiceImpl.java │ │ │ │ ├── AfterSaleService.java │ │ │ │ ├── AfterSaleServiceImpl.java │ │ │ │ └── bo/ │ │ │ │ └── AfterSaleLogCreateReqBO.java │ │ │ ├── brokerage/ │ │ │ │ ├── BrokerageRecordService.java │ │ │ │ ├── BrokerageRecordServiceImpl.java │ │ │ │ ├── BrokerageUserService.java │ │ │ │ ├── BrokerageUserServiceImpl.java │ │ │ │ ├── BrokerageWithdrawService.java │ │ │ │ ├── BrokerageWithdrawServiceImpl.java │ │ │ │ └── bo/ │ │ │ │ ├── BrokerageAddReqBO.java │ │ │ │ ├── BrokerageWithdrawSummaryRespBO.java │ │ │ │ └── UserBrokerageSummaryRespBO.java │ │ │ ├── cart/ │ │ │ │ ├── CartService.java │ │ │ │ └── CartServiceImpl.java │ │ │ ├── config/ │ │ │ │ ├── TradeConfigService.java │ │ │ │ └── TradeConfigServiceImpl.java │ │ │ ├── delivery/ │ │ │ │ ├── DeliveryExpressService.java │ │ │ │ ├── DeliveryExpressServiceImpl.java │ │ │ │ ├── DeliveryExpressTemplateService.java │ │ │ │ ├── DeliveryExpressTemplateServiceImpl.java │ │ │ │ ├── DeliveryPickUpStoreService.java │ │ │ │ ├── DeliveryPickUpStoreServiceImpl.java │ │ │ │ └── bo/ │ │ │ │ └── DeliveryExpressTemplateRespBO.java │ │ │ ├── message/ │ │ │ │ ├── TradeMessageService.java │ │ │ │ ├── TradeMessageServiceImpl.java │ │ │ │ └── bo/ │ │ │ │ └── TradeOrderMessageWhenDeliveryOrderReqBO.java │ │ │ ├── order/ │ │ │ │ ├── TradeOrderLogService.java │ │ │ │ ├── TradeOrderLogServiceImpl.java │ │ │ │ ├── TradeOrderQueryService.java │ │ │ │ ├── TradeOrderQueryServiceImpl.java │ │ │ │ ├── TradeOrderUpdateService.java │ │ │ │ ├── TradeOrderUpdateServiceImpl.java │ │ │ │ ├── bo/ │ │ │ │ │ └── TradeOrderLogCreateReqBO.java │ │ │ │ └── handler/ │ │ │ │ ├── TradeBargainOrderHandler.java │ │ │ │ ├── TradeBrokerageOrderHandler.java │ │ │ │ ├── TradeCombinationOrderHandler.java │ │ │ │ ├── TradeCouponOrderHandler.java │ │ │ │ ├── TradeMemberPointOrderHandler.java │ │ │ │ ├── TradeOrderHandler.java │ │ │ │ ├── TradePointOrderHandler.java │ │ │ │ ├── TradeProductSkuOrderHandler.java │ │ │ │ ├── TradeSeckillOrderHandler.java │ │ │ │ └── TradeStatusSyncToWxaOrderHandler.java │ │ │ └── price/ │ │ │ ├── TradePriceService.java │ │ │ ├── TradePriceServiceImpl.java │ │ │ ├── bo/ │ │ │ │ ├── TradePriceCalculateReqBO.java │ │ │ │ └── TradePriceCalculateRespBO.java │ │ │ └── calculator/ │ │ │ ├── TradeBargainActivityPriceCalculator.java │ │ │ ├── TradeCombinationActivityPriceCalculator.java │ │ │ ├── TradeCouponPriceCalculator.java │ │ │ ├── TradeDeliveryPriceCalculator.java │ │ │ ├── TradeDiscountActivityPriceCalculator.java │ │ │ ├── TradePointActivityPriceCalculator.java │ │ │ ├── TradePointGiveCalculator.java │ │ │ ├── TradePointUsePriceCalculator.java │ │ │ ├── TradePriceCalculator.java │ │ │ ├── TradePriceCalculatorHelper.java │ │ │ ├── TradeRewardActivityPriceCalculator.java │ │ │ └── TradeSeckillActivityPriceCalculator.java │ │ └── resources/ │ │ ├── application-dev.yaml │ │ ├── application-local.yaml │ │ ├── application.yaml │ │ ├── logback-spring.xml │ │ └── mapper/ │ │ └── brokerage/ │ │ └── BrokerageUserMapper.xml │ └── test/ │ └── resources/ │ ├── application-unit-test.yaml │ ├── logback.xml │ └── sql/ │ ├── clean.sql │ └── create_tables.sql ├── yudao-module-member/ │ ├── pom.xml │ ├── yudao-module-member-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── member/ │ │ ├── api/ │ │ │ ├── address/ │ │ │ │ ├── MemberAddressApi.java │ │ │ │ └── dto/ │ │ │ │ └── MemberAddressRespDTO.java │ │ │ ├── config/ │ │ │ │ ├── MemberConfigApi.java │ │ │ │ └── dto/ │ │ │ │ └── MemberConfigRespDTO.java │ │ │ ├── level/ │ │ │ │ ├── MemberLevelApi.java │ │ │ │ └── dto/ │ │ │ │ └── MemberLevelRespDTO.java │ │ │ ├── message/ │ │ │ │ ├── package-info.java │ │ │ │ └── user/ │ │ │ │ └── MemberUserCreateMessage.java │ │ │ ├── package-info.java │ │ │ ├── point/ │ │ │ │ └── MemberPointApi.java │ │ │ └── user/ │ │ │ ├── MemberUserApi.java │ │ │ └── dto/ │ │ │ └── MemberUserRespDTO.java │ │ └── enums/ │ │ ├── ApiConstants.java │ │ ├── DictTypeConstants.java │ │ ├── ErrorCodeConstants.java │ │ ├── MemberExperienceBizTypeEnum.java │ │ └── point/ │ │ └── MemberPointBizTypeEnum.java │ └── yudao-module-member-server/ │ ├── Dockerfile │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── module/ │ │ │ └── member/ │ │ │ ├── MemberServerApplication.java │ │ │ ├── api/ │ │ │ │ ├── address/ │ │ │ │ │ └── MemberAddressApiImpl.java │ │ │ │ ├── config/ │ │ │ │ │ └── MemberConfigApiImpl.java │ │ │ │ ├── level/ │ │ │ │ │ └── MemberLevelApiImpl.java │ │ │ │ ├── package-info.java │ │ │ │ ├── point/ │ │ │ │ │ └── MemberPointApiImpl.java │ │ │ │ └── user/ │ │ │ │ └── MemberUserApiImpl.java │ │ │ ├── controller/ │ │ │ │ ├── admin/ │ │ │ │ │ ├── address/ │ │ │ │ │ │ ├── AddressController.java │ │ │ │ │ │ ├── package-info.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AddressBaseVO.java │ │ │ │ │ │ └── AddressRespVO.java │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── MemberConfigController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── MemberConfigBaseVO.java │ │ │ │ │ │ ├── MemberConfigRespVO.java │ │ │ │ │ │ └── MemberConfigSaveReqVO.java │ │ │ │ │ ├── group/ │ │ │ │ │ │ ├── MemberGroupController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── MemberGroupBaseVO.java │ │ │ │ │ │ ├── MemberGroupCreateReqVO.java │ │ │ │ │ │ ├── MemberGroupPageReqVO.java │ │ │ │ │ │ ├── MemberGroupRespVO.java │ │ │ │ │ │ ├── MemberGroupSimpleRespVO.java │ │ │ │ │ │ └── MemberGroupUpdateReqVO.java │ │ │ │ │ ├── level/ │ │ │ │ │ │ ├── MemberExperienceRecordController.java │ │ │ │ │ │ ├── MemberLevelController.java │ │ │ │ │ │ ├── MemberLevelRecordController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── experience/ │ │ │ │ │ │ │ ├── MemberExperienceRecordBaseVO.java │ │ │ │ │ │ │ ├── MemberExperienceRecordPageReqVO.java │ │ │ │ │ │ │ └── MemberExperienceRecordRespVO.java │ │ │ │ │ │ ├── level/ │ │ │ │ │ │ │ ├── MemberLevelBaseVO.java │ │ │ │ │ │ │ ├── MemberLevelCreateReqVO.java │ │ │ │ │ │ │ ├── MemberLevelListReqVO.java │ │ │ │ │ │ │ ├── MemberLevelRespVO.java │ │ │ │ │ │ │ ├── MemberLevelSimpleRespVO.java │ │ │ │ │ │ │ └── MemberLevelUpdateReqVO.java │ │ │ │ │ │ └── record/ │ │ │ │ │ │ ├── MemberLevelRecordBaseVO.java │ │ │ │ │ │ ├── MemberLevelRecordPageReqVO.java │ │ │ │ │ │ └── MemberLevelRecordRespVO.java │ │ │ │ │ ├── point/ │ │ │ │ │ │ ├── MemberPointRecordController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ └── recrod/ │ │ │ │ │ │ ├── MemberPointRecordPageReqVO.java │ │ │ │ │ │ └── MemberPointRecordRespVO.java │ │ │ │ │ ├── signin/ │ │ │ │ │ │ ├── MemberSignInConfigController.java │ │ │ │ │ │ ├── MemberSignInRecordController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ ├── MemberSignInConfigBaseVO.java │ │ │ │ │ │ │ ├── MemberSignInConfigCreateReqVO.java │ │ │ │ │ │ │ ├── MemberSignInConfigRespVO.java │ │ │ │ │ │ │ └── MemberSignInConfigUpdateReqVO.java │ │ │ │ │ │ └── record/ │ │ │ │ │ │ ├── MemberSignInRecordPageReqVO.java │ │ │ │ │ │ └── MemberSignInRecordRespVO.java │ │ │ │ │ ├── tag/ │ │ │ │ │ │ ├── MemberTagController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── MemberTagBaseVO.java │ │ │ │ │ │ ├── MemberTagCreateReqVO.java │ │ │ │ │ │ ├── MemberTagPageReqVO.java │ │ │ │ │ │ ├── MemberTagRespVO.java │ │ │ │ │ │ └── MemberTagUpdateReqVO.java │ │ │ │ │ └── user/ │ │ │ │ │ ├── MemberUserController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── MemberUserBaseVO.java │ │ │ │ │ ├── MemberUserPageReqVO.java │ │ │ │ │ ├── MemberUserRespVO.java │ │ │ │ │ ├── MemberUserUpdateLevelReqVO.java │ │ │ │ │ ├── MemberUserUpdatePointReqVO.java │ │ │ │ │ └── MemberUserUpdateReqVO.java │ │ │ │ ├── app/ │ │ │ │ │ ├── address/ │ │ │ │ │ │ ├── AppAddressController.http │ │ │ │ │ │ ├── AppAddressController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AppAddressBaseVO.java │ │ │ │ │ │ ├── AppAddressCreateReqVO.java │ │ │ │ │ │ ├── AppAddressRespVO.java │ │ │ │ │ │ └── AppAddressUpdateReqVO.java │ │ │ │ │ ├── auth/ │ │ │ │ │ │ ├── AppAuthController.http │ │ │ │ │ │ ├── AppAuthController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AppAuthCheckCodeReqVO.java │ │ │ │ │ │ ├── AppAuthLoginReqVO.java │ │ │ │ │ │ ├── AppAuthLoginRespVO.java │ │ │ │ │ │ ├── AppAuthSmsLoginReqVO.java │ │ │ │ │ │ ├── AppAuthSmsSendReqVO.java │ │ │ │ │ │ ├── AppAuthSmsValidateReqVO.java │ │ │ │ │ │ ├── AppAuthSocialLoginReqVO.java │ │ │ │ │ │ ├── AppAuthWeixinMiniAppLoginReqVO.java │ │ │ │ │ │ └── AuthWeixinJsapiSignatureRespVO.java │ │ │ │ │ ├── level/ │ │ │ │ │ │ ├── AppMemberExperienceRecordController.java │ │ │ │ │ │ ├── AppMemberLevelController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── experience/ │ │ │ │ │ │ │ └── AppMemberExperienceRecordRespVO.java │ │ │ │ │ │ └── level/ │ │ │ │ │ │ └── AppMemberLevelRespVO.java │ │ │ │ │ ├── point/ │ │ │ │ │ │ ├── AppMemberPointRecordController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AppMemberPointRecordPageReqVO.java │ │ │ │ │ │ └── AppMemberPointRecordRespVO.java │ │ │ │ │ ├── signin/ │ │ │ │ │ │ ├── AppMemberSignInConfigController.java │ │ │ │ │ │ ├── AppMemberSignInRecordController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── config/ │ │ │ │ │ │ │ └── AppMemberSignInConfigRespVO.java │ │ │ │ │ │ └── record/ │ │ │ │ │ │ ├── AppMemberSignInRecordRespVO.java │ │ │ │ │ │ └── AppMemberSignInRecordSummaryRespVO.java │ │ │ │ │ ├── social/ │ │ │ │ │ │ ├── AppSocialUserController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AppSocialUserBindReqVO.java │ │ │ │ │ │ ├── AppSocialUserRespVO.java │ │ │ │ │ │ ├── AppSocialUserUnbindReqVO.java │ │ │ │ │ │ ├── AppSocialWxaQrcodeReqVO.java │ │ │ │ │ │ └── AppSocialWxaSubscribeTemplateRespVO.java │ │ │ │ │ └── user/ │ │ │ │ │ ├── AppMemberUserController.http │ │ │ │ │ ├── AppMemberUserController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── AppMemberUserInfoRespVO.java │ │ │ │ │ ├── AppMemberUserResetPasswordReqVO.java │ │ │ │ │ ├── AppMemberUserUpdateMobileByWeixinReqVO.java │ │ │ │ │ ├── AppMemberUserUpdateMobileReqVO.java │ │ │ │ │ ├── AppMemberUserUpdatePasswordReqVO.java │ │ │ │ │ └── AppMemberUserUpdateReqVO.java │ │ │ │ └── package-info.java │ │ │ ├── convert/ │ │ │ │ ├── address/ │ │ │ │ │ └── AddressConvert.java │ │ │ │ ├── auth/ │ │ │ │ │ └── AuthConvert.java │ │ │ │ ├── config/ │ │ │ │ │ └── MemberConfigConvert.java │ │ │ │ ├── group/ │ │ │ │ │ └── MemberGroupConvert.java │ │ │ │ ├── level/ │ │ │ │ │ ├── MemberExperienceRecordConvert.java │ │ │ │ │ ├── MemberLevelConvert.java │ │ │ │ │ └── MemberLevelRecordConvert.java │ │ │ │ ├── package-info.java │ │ │ │ ├── point/ │ │ │ │ │ └── MemberPointRecordConvert.java │ │ │ │ ├── signin/ │ │ │ │ │ ├── MemberSignInConfigConvert.java │ │ │ │ │ └── MemberSignInRecordConvert.java │ │ │ │ ├── tag/ │ │ │ │ │ └── MemberTagConvert.java │ │ │ │ ├── user/ │ │ │ │ │ └── MemberUserConvert.java │ │ │ │ └── 《芋道 Spring Boot 对象转换 MapStruct 入门》.md │ │ │ ├── dal/ │ │ │ │ ├── dataobject/ │ │ │ │ │ ├── address/ │ │ │ │ │ │ └── MemberAddressDO.java │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── MemberConfigDO.java │ │ │ │ │ ├── group/ │ │ │ │ │ │ └── MemberGroupDO.java │ │ │ │ │ ├── level/ │ │ │ │ │ │ ├── MemberExperienceRecordDO.java │ │ │ │ │ │ ├── MemberLevelDO.java │ │ │ │ │ │ └── MemberLevelRecordDO.java │ │ │ │ │ ├── point/ │ │ │ │ │ │ └── MemberPointRecordDO.java │ │ │ │ │ ├── signin/ │ │ │ │ │ │ ├── MemberSignInConfigDO.java │ │ │ │ │ │ └── MemberSignInRecordDO.java │ │ │ │ │ ├── tag/ │ │ │ │ │ │ └── MemberTagDO.java │ │ │ │ │ └── user/ │ │ │ │ │ └── MemberUserDO.java │ │ │ │ ├── mysql/ │ │ │ │ │ ├── address/ │ │ │ │ │ │ └── MemberAddressMapper.java │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── MemberConfigMapper.java │ │ │ │ │ ├── group/ │ │ │ │ │ │ └── MemberGroupMapper.java │ │ │ │ │ ├── level/ │ │ │ │ │ │ ├── MemberExperienceRecordMapper.java │ │ │ │ │ │ ├── MemberLevelMapper.java │ │ │ │ │ │ └── MemberLevelRecordMapper.java │ │ │ │ │ ├── point/ │ │ │ │ │ │ └── MemberPointRecordMapper.java │ │ │ │ │ ├── signin/ │ │ │ │ │ │ ├── MemberSignInConfigMapper.java │ │ │ │ │ │ └── MemberSignInRecordMapper.java │ │ │ │ │ ├── tag/ │ │ │ │ │ │ └── MemberTagMapper.java │ │ │ │ │ └── user/ │ │ │ │ │ └── MemberUserMapper.java │ │ │ │ ├── package-info.java │ │ │ │ └── redis/ │ │ │ │ └── package-info.java │ │ │ ├── framework/ │ │ │ │ ├── package-info.java │ │ │ │ ├── rpc/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── RpcConfiguration.java │ │ │ │ │ └── package-info.java │ │ │ │ └── security/ │ │ │ │ ├── config/ │ │ │ │ │ └── SecurityConfiguration.java │ │ │ │ └── core/ │ │ │ │ └── package-info.java │ │ │ ├── mq/ │ │ │ │ ├── consumer/ │ │ │ │ │ └── package-info.java │ │ │ │ ├── message/ │ │ │ │ │ └── package-info.java │ │ │ │ └── producer/ │ │ │ │ ├── package-info.java │ │ │ │ └── user/ │ │ │ │ └── MemberUserProducer.java │ │ │ ├── package-info.java │ │ │ └── service/ │ │ │ ├── address/ │ │ │ │ ├── AddressService.java │ │ │ │ └── AddressServiceImpl.java │ │ │ ├── auth/ │ │ │ │ ├── MemberAuthService.java │ │ │ │ └── MemberAuthServiceImpl.java │ │ │ ├── config/ │ │ │ │ ├── MemberConfigService.java │ │ │ │ └── MemberConfigServiceImpl.java │ │ │ ├── group/ │ │ │ │ ├── MemberGroupService.java │ │ │ │ └── MemberGroupServiceImpl.java │ │ │ ├── level/ │ │ │ │ ├── MemberExperienceRecordService.java │ │ │ │ ├── MemberExperienceRecordServiceImpl.java │ │ │ │ ├── MemberLevelRecordService.java │ │ │ │ ├── MemberLevelRecordServiceImpl.java │ │ │ │ ├── MemberLevelService.java │ │ │ │ └── MemberLevelServiceImpl.java │ │ │ ├── point/ │ │ │ │ ├── MemberPointRecordService.java │ │ │ │ └── MemberPointRecordServiceImpl.java │ │ │ ├── signin/ │ │ │ │ ├── MemberSignInConfigService.java │ │ │ │ ├── MemberSignInConfigServiceImpl.java │ │ │ │ ├── MemberSignInRecordService.java │ │ │ │ └── MemberSignInRecordServiceImpl.java │ │ │ ├── tag/ │ │ │ │ ├── MemberTagService.java │ │ │ │ └── MemberTagServiceImpl.java │ │ │ └── user/ │ │ │ ├── MemberUserService.java │ │ │ └── MemberUserServiceImpl.java │ │ └── resources/ │ │ ├── application-dev.yaml │ │ ├── application-local.yaml │ │ ├── application.yaml │ │ └── logback-spring.xml │ └── test/ │ └── resources/ │ ├── application-unit-test.yaml │ ├── logback.xml │ └── sql/ │ ├── clean.sql │ └── create_tables.sql ├── yudao-module-mp/ │ ├── pom.xml │ ├── yudao-module-mp-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── mp/ │ │ ├── enums/ │ │ │ ├── ErrorCodeConstants.java │ │ │ └── message/ │ │ │ ├── MpAutoReplyMatchEnum.java │ │ │ ├── MpAutoReplyTypeEnum.java │ │ │ └── MpMessageSendFromEnum.java │ │ └── package-info.java │ └── yudao-module-mp-server/ │ ├── Dockerfile │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── mp/ │ │ ├── MpServerApplication.java │ │ ├── controller/ │ │ │ ├── admin/ │ │ │ │ ├── account/ │ │ │ │ │ ├── MpAccountController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── MpAccountBaseVO.java │ │ │ │ │ ├── MpAccountCreateReqVO.java │ │ │ │ │ ├── MpAccountPageReqVO.java │ │ │ │ │ ├── MpAccountRespVO.java │ │ │ │ │ ├── MpAccountSimpleRespVO.java │ │ │ │ │ └── MpAccountUpdateReqVO.java │ │ │ │ ├── material/ │ │ │ │ │ ├── MpMaterialController.http │ │ │ │ │ ├── MpMaterialController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── MpMaterialPageReqVO.java │ │ │ │ │ ├── MpMaterialRespVO.java │ │ │ │ │ ├── MpMaterialUploadNewsImageReqVO.java │ │ │ │ │ ├── MpMaterialUploadPermanentReqVO.java │ │ │ │ │ ├── MpMaterialUploadRespVO.java │ │ │ │ │ └── MpMaterialUploadTemporaryReqVO.java │ │ │ │ ├── menu/ │ │ │ │ │ ├── MpMenuController.http │ │ │ │ │ ├── MpMenuController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── MpMenuBaseVO.java │ │ │ │ │ ├── MpMenuRespVO.java │ │ │ │ │ └── MpMenuSaveReqVO.java │ │ │ │ ├── message/ │ │ │ │ │ ├── MpAutoReplyController.http │ │ │ │ │ ├── MpAutoReplyController.java │ │ │ │ │ ├── MpMessageController.http │ │ │ │ │ ├── MpMessageController.java │ │ │ │ │ ├── MpMessageTemplateController.http │ │ │ │ │ ├── MpMessageTemplateController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── autoreply/ │ │ │ │ │ │ ├── MpAutoReplyBaseVO.java │ │ │ │ │ │ ├── MpAutoReplyCreateReqVO.java │ │ │ │ │ │ ├── MpAutoReplyPageReqVO.java │ │ │ │ │ │ ├── MpAutoReplyRespVO.java │ │ │ │ │ │ └── MpAutoReplyUpdateReqVO.java │ │ │ │ │ ├── message/ │ │ │ │ │ │ ├── MpMessagePageReqVO.java │ │ │ │ │ │ ├── MpMessageRespVO.java │ │ │ │ │ │ └── MpMessageSendReqVO.java │ │ │ │ │ └── template/ │ │ │ │ │ ├── MpMessageTemplateListReqVO.java │ │ │ │ │ ├── MpMessageTemplateRespVO.java │ │ │ │ │ └── MpMessageTemplateSendReqVO.java │ │ │ │ ├── news/ │ │ │ │ │ ├── MpDraftController.http │ │ │ │ │ ├── MpDraftController.java │ │ │ │ │ ├── MpFreePublishController.http │ │ │ │ │ ├── MpFreePublishController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── MpDraftPageReqVO.java │ │ │ │ │ └── MpFreePublishPageReqVO.java │ │ │ │ ├── open/ │ │ │ │ │ ├── MpOpenController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── MpOpenCheckSignatureReqVO.java │ │ │ │ │ └── MpOpenHandleMessageReqVO.java │ │ │ │ ├── statistics/ │ │ │ │ │ ├── MpStatisticsController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── MpStatisticsGetReqVO.java │ │ │ │ │ ├── MpStatisticsInterfaceSummaryRespVO.java │ │ │ │ │ ├── MpStatisticsUpstreamMessageRespVO.java │ │ │ │ │ ├── MpStatisticsUserCumulateRespVO.java │ │ │ │ │ └── MpStatisticsUserSummaryRespVO.java │ │ │ │ ├── tag/ │ │ │ │ │ ├── MpTagController.http │ │ │ │ │ ├── MpTagController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── MpTagBaseVO.java │ │ │ │ │ ├── MpTagCreateReqVO.java │ │ │ │ │ ├── MpTagPageReqVO.java │ │ │ │ │ ├── MpTagRespVO.java │ │ │ │ │ ├── MpTagSimpleRespVO.java │ │ │ │ │ └── MpTagUpdateReqVO.java │ │ │ │ └── user/ │ │ │ │ ├── MpUserController.http │ │ │ │ ├── MpUserController.java │ │ │ │ └── vo/ │ │ │ │ ├── MpUserPageReqVO.java │ │ │ │ ├── MpUserRespVO.java │ │ │ │ └── MpUserUpdateReqVO.java │ │ │ └── package-info.java │ │ ├── convert/ │ │ │ ├── account/ │ │ │ │ └── MpAccountConvert.java │ │ │ ├── material/ │ │ │ │ └── MpMaterialConvert.java │ │ │ ├── menu/ │ │ │ │ └── MpMenuConvert.java │ │ │ ├── message/ │ │ │ │ ├── MpAutoReplyConvert.java │ │ │ │ └── MpMessageConvert.java │ │ │ ├── statistics/ │ │ │ │ └── MpStatisticsConvert.java │ │ │ ├── tag/ │ │ │ │ └── MpTagConvert.java │ │ │ └── user/ │ │ │ └── MpUserConvert.java │ │ ├── dal/ │ │ │ ├── dataobject/ │ │ │ │ ├── account/ │ │ │ │ │ └── MpAccountDO.java │ │ │ │ ├── material/ │ │ │ │ │ └── MpMaterialDO.java │ │ │ │ ├── menu/ │ │ │ │ │ └── MpMenuDO.java │ │ │ │ ├── message/ │ │ │ │ │ ├── MpAutoReplyDO.java │ │ │ │ │ ├── MpMessageDO.java │ │ │ │ │ └── MpMessageTemplateDO.java │ │ │ │ ├── tag/ │ │ │ │ │ └── MpTagDO.java │ │ │ │ └── user/ │ │ │ │ └── MpUserDO.java │ │ │ └── mysql/ │ │ │ ├── account/ │ │ │ │ └── MpAccountMapper.java │ │ │ ├── material/ │ │ │ │ └── MpMaterialMapper.java │ │ │ ├── menu/ │ │ │ │ └── MpMenuMapper.java │ │ │ ├── message/ │ │ │ │ ├── MpAutoReplyMapper.java │ │ │ │ ├── MpMessageMapper.java │ │ │ │ └── MpMessageTemplateMapper.java │ │ │ ├── tag/ │ │ │ │ └── MpTagMapper.java │ │ │ └── user/ │ │ │ └── MpUserMapper.java │ │ ├── framework/ │ │ │ ├── mp/ │ │ │ │ ├── config/ │ │ │ │ │ └── MpConfiguration.java │ │ │ │ └── core/ │ │ │ │ ├── DefaultMpServiceFactory.java │ │ │ │ ├── MpServiceFactory.java │ │ │ │ ├── context/ │ │ │ │ │ └── MpContextHolder.java │ │ │ │ └── util/ │ │ │ │ └── MpUtils.java │ │ │ ├── package-info.java │ │ │ ├── rpc/ │ │ │ │ ├── config/ │ │ │ │ │ └── RpcConfiguration.java │ │ │ │ └── package-info.java │ │ │ └── security/ │ │ │ ├── config/ │ │ │ │ └── SecurityConfiguration.java │ │ │ └── core/ │ │ │ └── package-info.java │ │ ├── package-info.java │ │ └── service/ │ │ ├── account/ │ │ │ ├── MpAccountService.java │ │ │ └── MpAccountServiceImpl.java │ │ ├── handler/ │ │ │ ├── menu/ │ │ │ │ └── MenuHandler.java │ │ │ ├── message/ │ │ │ │ ├── MessageAutoReplyHandler.java │ │ │ │ └── MessageReceiveHandler.java │ │ │ ├── other/ │ │ │ │ ├── KfSessionHandler.java │ │ │ │ ├── NullHandler.java │ │ │ │ ├── ScanHandler.java │ │ │ │ ├── StoreCheckNotifyHandler.java │ │ │ │ └── package-info.java │ │ │ └── user/ │ │ │ ├── LocationHandler.java │ │ │ ├── SubscribeHandler.java │ │ │ └── UnsubscribeHandler.java │ │ ├── material/ │ │ │ ├── MpMaterialService.java │ │ │ └── MpMaterialServiceImpl.java │ │ ├── menu/ │ │ │ ├── MpMenuService.java │ │ │ └── MpMenuServiceImpl.java │ │ ├── message/ │ │ │ ├── MpAutoReplyService.java │ │ │ ├── MpAutoReplyServiceImpl.java │ │ │ ├── MpMessageService.java │ │ │ ├── MpMessageServiceImpl.java │ │ │ ├── MpMessageTemplateService.java │ │ │ ├── MpMessageTemplateServiceImpl.java │ │ │ └── bo/ │ │ │ └── MpMessageSendOutReqBO.java │ │ ├── statistics/ │ │ │ ├── MpStatisticsService.java │ │ │ └── MpStatisticsServiceImpl.java │ │ ├── tag/ │ │ │ ├── MpTagService.java │ │ │ └── MpTagServiceImpl.java │ │ └── user/ │ │ ├── MpUserService.java │ │ └── MpUserServiceImpl.java │ └── resources/ │ ├── application-dev.yaml │ ├── application-local.yaml │ ├── application.yaml │ └── logback-spring.xml ├── yudao-module-pay/ │ ├── pom.xml │ ├── yudao-module-pay-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── pay/ │ │ ├── api/ │ │ │ ├── notify/ │ │ │ │ ├── dto/ │ │ │ │ │ ├── PayOrderNotifyReqDTO.java │ │ │ │ │ ├── PayRefundNotifyReqDTO.java │ │ │ │ │ └── PayTransferNotifyReqDTO.java │ │ │ │ └── package-info.java │ │ │ ├── order/ │ │ │ │ ├── PayOrderApi.java │ │ │ │ └── dto/ │ │ │ │ ├── PayOrderCreateReqDTO.java │ │ │ │ └── PayOrderRespDTO.java │ │ │ ├── refund/ │ │ │ │ ├── PayRefundApi.java │ │ │ │ └── dto/ │ │ │ │ ├── PayRefundCreateReqDTO.java │ │ │ │ └── PayRefundRespDTO.java │ │ │ ├── transfer/ │ │ │ │ ├── PayTransferApi.java │ │ │ │ └── dto/ │ │ │ │ ├── PayTransferCreateReqDTO.java │ │ │ │ ├── PayTransferCreateRespDTO.java │ │ │ │ └── PayTransferRespDTO.java │ │ │ └── wallet/ │ │ │ ├── PayWalletApi.java │ │ │ └── dto/ │ │ │ ├── PayWalletAddBalanceReqDTO.java │ │ │ └── PayWalletRespDTO.java │ │ └── enums/ │ │ ├── ApiConstants.java │ │ ├── DictTypeConstants.java │ │ ├── ErrorCodeConstants.java │ │ ├── MessageTemplateConstants.java │ │ ├── PayChannelEnum.java │ │ ├── demo/ │ │ │ ├── PayDemoWithdrawStatusEnum.java │ │ │ └── PayDemoWithdrawTypeEnum.java │ │ ├── notify/ │ │ │ ├── PayNotifyStatusEnum.java │ │ │ └── PayNotifyTypeEnum.java │ │ ├── order/ │ │ │ └── PayOrderStatusEnum.java │ │ ├── refund/ │ │ │ └── PayRefundStatusEnum.java │ │ ├── transfer/ │ │ │ └── PayTransferStatusEnum.java │ │ └── wallet/ │ │ └── PayWalletBizTypeEnum.java │ └── yudao-module-pay-server/ │ ├── Dockerfile │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── module/ │ │ │ └── pay/ │ │ │ ├── PayServerApplication.java │ │ │ ├── api/ │ │ │ │ ├── order/ │ │ │ │ │ └── PayOrderApiImpl.java │ │ │ │ ├── refund/ │ │ │ │ │ └── PayRefundApiImpl.java │ │ │ │ ├── transfer/ │ │ │ │ │ └── PayTransferApiImpl.java │ │ │ │ └── wallet/ │ │ │ │ └── PayWalletApiImpl.java │ │ │ ├── controller/ │ │ │ │ ├── admin/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ ├── PayAppController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── PayAppBaseVO.java │ │ │ │ │ │ ├── PayAppCreateReqVO.java │ │ │ │ │ │ ├── PayAppPageItemRespVO.java │ │ │ │ │ │ ├── PayAppPageReqVO.java │ │ │ │ │ │ ├── PayAppRespVO.java │ │ │ │ │ │ ├── PayAppUpdateReqVO.java │ │ │ │ │ │ └── PayAppUpdateStatusReqVO.java │ │ │ │ │ ├── channel/ │ │ │ │ │ │ ├── PayChannelController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── PayChannelBaseVO.java │ │ │ │ │ │ ├── PayChannelCreateReqVO.java │ │ │ │ │ │ ├── PayChannelRespVO.java │ │ │ │ │ │ └── PayChannelUpdateReqVO.java │ │ │ │ │ ├── demo/ │ │ │ │ │ │ ├── PayDemoOrderController.java │ │ │ │ │ │ ├── PayDemoWithdrawController.http │ │ │ │ │ │ ├── PayDemoWithdrawController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── order/ │ │ │ │ │ │ │ ├── PayDemoOrderCreateReqVO.java │ │ │ │ │ │ │ └── PayDemoOrderRespVO.java │ │ │ │ │ │ └── withdraw/ │ │ │ │ │ │ ├── PayDemoWithdrawCreateReqVO.java │ │ │ │ │ │ └── PayDemoWithdrawRespVO.java │ │ │ │ │ ├── notify/ │ │ │ │ │ │ ├── PayNotifyController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── PayNotifyTaskDetailRespVO.java │ │ │ │ │ │ ├── PayNotifyTaskPageReqVO.java │ │ │ │ │ │ └── PayNotifyTaskRespVO.java │ │ │ │ │ ├── order/ │ │ │ │ │ │ ├── PayOrderController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── PayOrderBaseVO.java │ │ │ │ │ │ ├── PayOrderDetailsRespVO.java │ │ │ │ │ │ ├── PayOrderExcelVO.java │ │ │ │ │ │ ├── PayOrderExportReqVO.java │ │ │ │ │ │ ├── PayOrderPageItemRespVO.java │ │ │ │ │ │ ├── PayOrderPageReqVO.java │ │ │ │ │ │ ├── PayOrderRespVO.java │ │ │ │ │ │ ├── PayOrderSubmitReqVO.java │ │ │ │ │ │ └── PayOrderSubmitRespVO.java │ │ │ │ │ ├── refund/ │ │ │ │ │ │ ├── PayRefundController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── PayRefundBaseVO.java │ │ │ │ │ │ ├── PayRefundDetailsRespVO.java │ │ │ │ │ │ ├── PayRefundExcelVO.java │ │ │ │ │ │ ├── PayRefundExportReqVO.java │ │ │ │ │ │ ├── PayRefundPageItemRespVO.java │ │ │ │ │ │ └── PayRefundPageReqVO.java │ │ │ │ │ ├── transfer/ │ │ │ │ │ │ ├── PayTransferController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── PayTransferCreateRespVO.java │ │ │ │ │ │ ├── PayTransferPageReqVO.java │ │ │ │ │ │ └── PayTransferRespVO.java │ │ │ │ │ └── wallet/ │ │ │ │ │ ├── PayWalletController.java │ │ │ │ │ ├── PayWalletRechargeController.java │ │ │ │ │ ├── PayWalletRechargePackageController.java │ │ │ │ │ ├── PayWalletTransactionController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── rechargepackage/ │ │ │ │ │ │ ├── WalletRechargePackageBaseVO.java │ │ │ │ │ │ ├── WalletRechargePackageCreateReqVO.java │ │ │ │ │ │ ├── WalletRechargePackagePageReqVO.java │ │ │ │ │ │ ├── WalletRechargePackageRespVO.java │ │ │ │ │ │ └── WalletRechargePackageUpdateReqVO.java │ │ │ │ │ ├── transaction/ │ │ │ │ │ │ ├── PayWalletTransactionPageReqVO.java │ │ │ │ │ │ └── PayWalletTransactionRespVO.java │ │ │ │ │ └── wallet/ │ │ │ │ │ ├── PayWalletBaseVO.java │ │ │ │ │ ├── PayWalletPageReqVO.java │ │ │ │ │ ├── PayWalletRespVO.java │ │ │ │ │ ├── PayWalletUpdateBalanceReqVO.java │ │ │ │ │ └── PayWalletUserReqVO.java │ │ │ │ ├── app/ │ │ │ │ │ ├── channel/ │ │ │ │ │ │ └── AppPayChannelController.java │ │ │ │ │ ├── order/ │ │ │ │ │ │ ├── AppPayOrderController.http │ │ │ │ │ │ ├── AppPayOrderController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AppPayOrderSubmitReqVO.java │ │ │ │ │ │ └── AppPayOrderSubmitRespVO.java │ │ │ │ │ ├── transfer/ │ │ │ │ │ │ └── AppPayTransferController.java │ │ │ │ │ └── wallet/ │ │ │ │ │ ├── AppPayWalletController.java │ │ │ │ │ ├── AppPayWalletRechargeController.java │ │ │ │ │ ├── AppPayWalletRechargePackageController.java │ │ │ │ │ ├── AppPayWalletTransactionController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── recharge/ │ │ │ │ │ │ ├── AppPayWalletPackageRespVO.java │ │ │ │ │ │ ├── AppPayWalletRechargeCreateReqVO.java │ │ │ │ │ │ ├── AppPayWalletRechargeCreateRespVO.java │ │ │ │ │ │ └── AppPayWalletRechargeRespVO.java │ │ │ │ │ ├── transaction/ │ │ │ │ │ │ ├── AppPayWalletTransactionPageReqVO.java │ │ │ │ │ │ ├── AppPayWalletTransactionRespVO.java │ │ │ │ │ │ └── AppPayWalletTransactionSummaryRespVO.java │ │ │ │ │ └── wallet/ │ │ │ │ │ └── AppPayWalletRespVO.java │ │ │ │ └── package-info.java │ │ │ ├── convert/ │ │ │ │ ├── app/ │ │ │ │ │ └── PayAppConvert.java │ │ │ │ ├── channel/ │ │ │ │ │ └── PayChannelConvert.java │ │ │ │ ├── order/ │ │ │ │ │ └── PayOrderConvert.java │ │ │ │ ├── package-info.java │ │ │ │ ├── refund/ │ │ │ │ │ └── PayRefundConvert.java │ │ │ │ ├── wallet/ │ │ │ │ │ ├── PayWalletConvert.java │ │ │ │ │ ├── PayWalletRechargeConvert.java │ │ │ │ │ ├── PayWalletRechargePackageConvert.java │ │ │ │ │ └── PayWalletTransactionConvert.java │ │ │ │ └── 《芋道 Spring Boot 对象转换 MapStruct 入门》.md │ │ │ ├── dal/ │ │ │ │ ├── dataobject/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── PayAppDO.java │ │ │ │ │ ├── channel/ │ │ │ │ │ │ └── PayChannelDO.java │ │ │ │ │ ├── demo/ │ │ │ │ │ │ ├── PayDemoOrderDO.java │ │ │ │ │ │ └── PayDemoWithdrawDO.java │ │ │ │ │ ├── notify/ │ │ │ │ │ │ ├── PayNotifyLogDO.java │ │ │ │ │ │ └── PayNotifyTaskDO.java │ │ │ │ │ ├── order/ │ │ │ │ │ │ ├── PayOrderDO.java │ │ │ │ │ │ └── PayOrderExtensionDO.java │ │ │ │ │ ├── refund/ │ │ │ │ │ │ └── PayRefundDO.java │ │ │ │ │ ├── transfer/ │ │ │ │ │ │ └── PayTransferDO.java │ │ │ │ │ └── wallet/ │ │ │ │ │ ├── PayWalletDO.java │ │ │ │ │ ├── PayWalletRechargeDO.java │ │ │ │ │ ├── PayWalletRechargePackageDO.java │ │ │ │ │ └── PayWalletTransactionDO.java │ │ │ │ ├── mysql/ │ │ │ │ │ ├── app/ │ │ │ │ │ │ └── PayAppMapper.java │ │ │ │ │ ├── channel/ │ │ │ │ │ │ └── PayChannelMapper.java │ │ │ │ │ ├── demo/ │ │ │ │ │ │ ├── PayDemoOrderMapper.java │ │ │ │ │ │ └── PayDemoWithdrawMapper.java │ │ │ │ │ ├── notify/ │ │ │ │ │ │ ├── PayNotifyLogMapper.java │ │ │ │ │ │ └── PayNotifyTaskMapper.java │ │ │ │ │ ├── order/ │ │ │ │ │ │ ├── PayOrderExtensionMapper.java │ │ │ │ │ │ └── PayOrderMapper.java │ │ │ │ │ ├── refund/ │ │ │ │ │ │ └── PayRefundMapper.java │ │ │ │ │ ├── transfer/ │ │ │ │ │ │ └── PayTransferMapper.java │ │ │ │ │ └── wallet/ │ │ │ │ │ ├── PayWalletMapper.java │ │ │ │ │ ├── PayWalletRechargeMapper.java │ │ │ │ │ ├── PayWalletRechargePackageMapper.java │ │ │ │ │ └── PayWalletTransactionMapper.java │ │ │ │ └── redis/ │ │ │ │ ├── RedisKeyConstants.java │ │ │ │ ├── no/ │ │ │ │ │ └── PayNoRedisDAO.java │ │ │ │ ├── notify/ │ │ │ │ │ └── PayNotifyLockRedisDAO.java │ │ │ │ └── wallet/ │ │ │ │ └── PayWalletLockRedisDAO.java │ │ │ ├── framework/ │ │ │ │ ├── job/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── PayJobConfiguration.java │ │ │ │ │ └── core/ │ │ │ │ │ └── package-info.java │ │ │ │ ├── package-info.java │ │ │ │ ├── pay/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── PayConfiguration.java │ │ │ │ │ │ └── PayProperties.java │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ ├── PayClient.java │ │ │ │ │ │ │ ├── PayClientConfig.java │ │ │ │ │ │ │ ├── PayClientFactory.java │ │ │ │ │ │ │ ├── dto/ │ │ │ │ │ │ │ │ ├── order/ │ │ │ │ │ │ │ │ │ ├── PayOrderRespDTO.java │ │ │ │ │ │ │ │ │ └── PayOrderUnifiedReqDTO.java │ │ │ │ │ │ │ │ ├── refund/ │ │ │ │ │ │ │ │ │ ├── PayRefundRespDTO.java │ │ │ │ │ │ │ │ │ └── PayRefundUnifiedReqDTO.java │ │ │ │ │ │ │ │ └── transfer/ │ │ │ │ │ │ │ │ ├── PayTransferRespDTO.java │ │ │ │ │ │ │ │ └── PayTransferUnifiedReqDTO.java │ │ │ │ │ │ │ ├── exception/ │ │ │ │ │ │ │ │ └── PayClientException.java │ │ │ │ │ │ │ └── impl/ │ │ │ │ │ │ │ ├── AbstractPayClient.java │ │ │ │ │ │ │ ├── NonePayClientConfig.java │ │ │ │ │ │ │ ├── PayClientFactoryImpl.java │ │ │ │ │ │ │ ├── alipay/ │ │ │ │ │ │ │ │ ├── AbstractAlipayPayClient.java │ │ │ │ │ │ │ │ ├── AlipayAppPayClient.java │ │ │ │ │ │ │ │ ├── AlipayBarPayClient.java │ │ │ │ │ │ │ │ ├── AlipayPayClientConfig.java │ │ │ │ │ │ │ │ ├── AlipayPcPayClient.java │ │ │ │ │ │ │ │ ├── AlipayQrPayClient.java │ │ │ │ │ │ │ │ └── AlipayWapPayClient.java │ │ │ │ │ │ │ ├── mock/ │ │ │ │ │ │ │ │ └── MockPayClient.java │ │ │ │ │ │ │ ├── wallet/ │ │ │ │ │ │ │ │ └── WalletPayClient.java │ │ │ │ │ │ │ └── weixin/ │ │ │ │ │ │ │ ├── AbstractWxPayClient.java │ │ │ │ │ │ │ ├── WxAppPayClient.java │ │ │ │ │ │ │ ├── WxBarPayClient.java │ │ │ │ │ │ │ ├── WxLitePayClient.java │ │ │ │ │ │ │ ├── WxNativePayClient.java │ │ │ │ │ │ │ ├── WxPayClientConfig.java │ │ │ │ │ │ │ ├── WxPubPayClient.java │ │ │ │ │ │ │ └── WxWapPayClient.java │ │ │ │ │ │ └── enums/ │ │ │ │ │ │ └── PayOrderDisplayModeEnum.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── rpc/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── RpcConfiguration.java │ │ │ │ │ └── package-info.java │ │ │ │ └── security/ │ │ │ │ ├── config/ │ │ │ │ │ └── SecurityConfiguration.java │ │ │ │ └── core/ │ │ │ │ └── package-info.java │ │ │ ├── job/ │ │ │ │ ├── notify/ │ │ │ │ │ └── PayNotifyJob.java │ │ │ │ ├── order/ │ │ │ │ │ ├── PayOrderExpireJob.java │ │ │ │ │ └── PayOrderSyncJob.java │ │ │ │ ├── refund/ │ │ │ │ │ └── PayRefundSyncJob.java │ │ │ │ └── transfer/ │ │ │ │ └── PayTransferSyncJob.java │ │ │ ├── package-info.java │ │ │ └── service/ │ │ │ ├── app/ │ │ │ │ ├── PayAppService.java │ │ │ │ └── PayAppServiceImpl.java │ │ │ ├── channel/ │ │ │ │ ├── PayChannelService.java │ │ │ │ └── PayChannelServiceImpl.java │ │ │ ├── demo/ │ │ │ │ ├── PayDemoOrderService.java │ │ │ │ ├── PayDemoOrderServiceImpl.java │ │ │ │ ├── PayDemoWithdrawService.java │ │ │ │ └── PayDemoWithdrawServiceImpl.java │ │ │ ├── notify/ │ │ │ │ ├── PayNotifyService.java │ │ │ │ └── PayNotifyServiceImpl.java │ │ │ ├── order/ │ │ │ │ ├── PayOrderService.java │ │ │ │ └── PayOrderServiceImpl.java │ │ │ ├── refund/ │ │ │ │ ├── PayRefundService.java │ │ │ │ └── PayRefundServiceImpl.java │ │ │ ├── transfer/ │ │ │ │ ├── PayTransferService.java │ │ │ │ └── PayTransferServiceImpl.java │ │ │ └── wallet/ │ │ │ ├── PayWalletRechargePackageService.java │ │ │ ├── PayWalletRechargePackageServiceImpl.java │ │ │ ├── PayWalletRechargeService.java │ │ │ ├── PayWalletRechargeServiceImpl.java │ │ │ ├── PayWalletService.java │ │ │ ├── PayWalletServiceImpl.java │ │ │ ├── PayWalletTransactionService.java │ │ │ ├── PayWalletTransactionServiceImpl.java │ │ │ └── bo/ │ │ │ └── WalletTransactionCreateReqBO.java │ │ └── resources/ │ │ ├── application-dev.yaml │ │ ├── application-local.yaml │ │ ├── application.yaml │ │ └── logback-spring.xml │ └── test/ │ ├── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── pay/ │ │ ├── framework/ │ │ │ └── pay/ │ │ │ └── core/ │ │ │ └── client/ │ │ │ └── impl/ │ │ │ ├── PayClientFactoryImplIntegrationTest.java │ │ │ ├── alipay/ │ │ │ │ ├── AbstractAlipayClientTest.java │ │ │ │ ├── AlipayBarPayClientTest.java │ │ │ │ ├── AlipayPcPayClientTest.java │ │ │ │ ├── AlipayQrPayClientTest.java │ │ │ │ └── AlipayWapPayClientTest.java │ │ │ └── weixin/ │ │ │ ├── WxBarPayClientIntegrationTest.java │ │ │ └── WxNativePayClientIntegrationTest.java │ │ └── service/ │ │ ├── app/ │ │ │ └── PayAppServiceTest.java │ │ ├── channel/ │ │ │ └── PayChannelServiceTest.java │ │ ├── notify/ │ │ │ └── PayNotifyServiceTest.java │ │ ├── order/ │ │ │ └── PayOrderServiceTest.java │ │ └── refund/ │ │ └── PayRefundServiceTest.java │ └── resources/ │ ├── application-unit-test.yaml │ ├── logback.xml │ └── sql/ │ ├── clean.sql │ └── create_tables.sql ├── yudao-module-report/ │ ├── pom.xml │ ├── yudao-module-report-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── report/ │ │ ├── api/ │ │ │ └── package-info.java │ │ └── enums/ │ │ └── ErrorCodeConstants.java │ └── yudao-module-report-server/ │ ├── Dockerfile │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── module/ │ │ │ └── report/ │ │ │ ├── ReportServerApplication.java │ │ │ ├── controller/ │ │ │ │ ├── admin/ │ │ │ │ │ ├── ajreport/ │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── goview/ │ │ │ │ │ ├── GoViewDataController.java │ │ │ │ │ ├── GoViewProjectController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── data/ │ │ │ │ │ │ ├── GoViewDataGetBySqlReqVO.java │ │ │ │ │ │ └── GoViewDataRespVO.java │ │ │ │ │ └── project/ │ │ │ │ │ ├── GoViewProjectCreateReqVO.java │ │ │ │ │ ├── GoViewProjectRespVO.java │ │ │ │ │ └── GoViewProjectUpdateReqVO.java │ │ │ │ └── package-info.java │ │ │ ├── convert/ │ │ │ │ ├── ajreport/ │ │ │ │ │ └── package-info.java │ │ │ │ └── goview/ │ │ │ │ └── GoViewProjectConvert.java │ │ │ ├── dal/ │ │ │ │ ├── dataobject/ │ │ │ │ │ ├── ajreport/ │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── goview/ │ │ │ │ │ └── GoViewProjectDO.java │ │ │ │ └── mysql/ │ │ │ │ ├── ajreport/ │ │ │ │ │ └── package-info.java │ │ │ │ └── goview/ │ │ │ │ └── GoViewProjectMapper.java │ │ │ ├── framework/ │ │ │ │ ├── jmreport/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── JmReportConfiguration.java │ │ │ │ │ └── core/ │ │ │ │ │ ├── service/ │ │ │ │ │ │ ├── JmOnlDragExternalServiceImpl.java │ │ │ │ │ │ └── JmReportTokenServiceImpl.java │ │ │ │ │ └── web/ │ │ │ │ │ └── package-info.java │ │ │ │ ├── package-info.java │ │ │ │ ├── rpc/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── RpcConfiguration.java │ │ │ │ │ └── package-info.java │ │ │ │ └── security/ │ │ │ │ ├── config/ │ │ │ │ │ └── SecurityConfiguration.java │ │ │ │ └── core/ │ │ │ │ └── package-info.java │ │ │ ├── package-info.java │ │ │ └── service/ │ │ │ ├── ajreport/ │ │ │ │ └── package-info.java │ │ │ └── goview/ │ │ │ ├── GoViewDataService.java │ │ │ ├── GoViewDataServiceImpl.java │ │ │ ├── GoViewProjectService.java │ │ │ └── GoViewProjectServiceImpl.java │ │ └── resources/ │ │ ├── application-dev.yaml │ │ ├── application-local.yaml │ │ ├── application.yaml │ │ └── logback-spring.xml │ └── test/ │ ├── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── report/ │ │ └── service/ │ │ └── goview/ │ │ ├── GoViewDataServiceImplTest.java │ │ └── GoViewProjectServiceImplTest.java │ └── resources/ │ ├── application-unit-test.yaml │ ├── logback.xml │ └── sql/ │ ├── clean.sql │ └── create_tables.sql ├── yudao-module-system/ │ ├── pom.xml │ ├── yudao-module-system-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── system/ │ │ ├── api/ │ │ │ ├── dept/ │ │ │ │ ├── DeptApi.java │ │ │ │ ├── PostApi.java │ │ │ │ └── dto/ │ │ │ │ ├── DeptRespDTO.java │ │ │ │ └── PostRespDTO.java │ │ │ ├── dict/ │ │ │ │ └── DictDataApi.java │ │ │ ├── logger/ │ │ │ │ ├── LoginLogApi.java │ │ │ │ ├── OperateLogApi.java │ │ │ │ └── dto/ │ │ │ │ ├── LoginLogCreateReqDTO.java │ │ │ │ ├── OperateLogPageReqDTO.java │ │ │ │ └── OperateLogRespDTO.java │ │ │ ├── mail/ │ │ │ │ ├── MailSendApi.java │ │ │ │ └── dto/ │ │ │ │ └── MailSendSingleToUserReqDTO.java │ │ │ ├── notify/ │ │ │ │ ├── NotifyMessageSendApi.java │ │ │ │ └── dto/ │ │ │ │ └── NotifySendSingleToUserReqDTO.java │ │ │ ├── package-info.java │ │ │ ├── permission/ │ │ │ │ ├── PermissionApi.java │ │ │ │ └── RoleApi.java │ │ │ ├── sms/ │ │ │ │ ├── SmsCodeApi.java │ │ │ │ ├── SmsSendApi.java │ │ │ │ └── dto/ │ │ │ │ ├── code/ │ │ │ │ │ ├── SmsCodeSendReqDTO.java │ │ │ │ │ ├── SmsCodeUseReqDTO.java │ │ │ │ │ └── SmsCodeValidateReqDTO.java │ │ │ │ └── send/ │ │ │ │ └── SmsSendSingleToUserReqDTO.java │ │ │ ├── social/ │ │ │ │ ├── SocialClientApi.java │ │ │ │ ├── SocialUserApi.java │ │ │ │ └── dto/ │ │ │ │ ├── SocialUserBindReqDTO.java │ │ │ │ ├── SocialUserRespDTO.java │ │ │ │ ├── SocialUserUnbindReqDTO.java │ │ │ │ ├── SocialWxJsapiSignatureRespDTO.java │ │ │ │ ├── SocialWxPhoneNumberInfoRespDTO.java │ │ │ │ ├── SocialWxQrcodeReqDTO.java │ │ │ │ ├── SocialWxaOrderNotifyConfirmReceiveReqDTO.java │ │ │ │ ├── SocialWxaOrderUploadShippingInfoReqDTO.java │ │ │ │ ├── SocialWxaSubscribeMessageSendReqDTO.java │ │ │ │ └── SocialWxaSubscribeTemplateRespDTO.java │ │ │ └── user/ │ │ │ ├── AdminUserApi.java │ │ │ └── dto/ │ │ │ └── AdminUserRespDTO.java │ │ └── enums/ │ │ ├── ApiConstants.java │ │ ├── DictTypeConstants.java │ │ ├── ErrorCodeConstants.java │ │ ├── LogRecordConstants.java │ │ ├── common/ │ │ │ └── SexEnum.java │ │ ├── logger/ │ │ │ ├── LoginLogTypeEnum.java │ │ │ └── LoginResultEnum.java │ │ ├── mail/ │ │ │ └── MailSendStatusEnum.java │ │ ├── notice/ │ │ │ └── NoticeTypeEnum.java │ │ ├── notify/ │ │ │ └── NotifyTemplateTypeEnum.java │ │ ├── oauth2/ │ │ │ ├── OAuth2ClientConstants.java │ │ │ └── OAuth2GrantTypeEnum.java │ │ ├── permission/ │ │ │ ├── DataScopeEnum.java │ │ │ ├── MenuTypeEnum.java │ │ │ ├── RoleCodeEnum.java │ │ │ └── RoleTypeEnum.java │ │ ├── sms/ │ │ │ ├── SmsReceiveStatusEnum.java │ │ │ ├── SmsSceneEnum.java │ │ │ ├── SmsSendStatusEnum.java │ │ │ └── SmsTemplateTypeEnum.java │ │ └── social/ │ │ └── SocialTypeEnum.java │ └── yudao-module-system-server/ │ ├── Dockerfile │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── iocoder/ │ │ │ └── yudao/ │ │ │ └── module/ │ │ │ └── system/ │ │ │ ├── SystemServerApplication.java │ │ │ ├── api/ │ │ │ │ ├── dept/ │ │ │ │ │ ├── DeptApiImpl.java │ │ │ │ │ └── PostApiImpl.java │ │ │ │ ├── dict/ │ │ │ │ │ └── DictDataApiImpl.java │ │ │ │ ├── logger/ │ │ │ │ │ ├── LoginLogApiImpl.java │ │ │ │ │ └── OperateLogApiImpl.java │ │ │ │ ├── mail/ │ │ │ │ │ └── MailSendApiImpl.java │ │ │ │ ├── notify/ │ │ │ │ │ └── NotifyMessageSendApiImpl.java │ │ │ │ ├── oauth2/ │ │ │ │ │ └── OAuth2TokenApiImpl.java │ │ │ │ ├── permission/ │ │ │ │ │ ├── PermissionApiImpl.java │ │ │ │ │ └── RoleApiImpl.java │ │ │ │ ├── sms/ │ │ │ │ │ ├── SmsCodeApiImpl.java │ │ │ │ │ └── SmsSendApiImpl.java │ │ │ │ ├── social/ │ │ │ │ │ ├── SocialClientApiImpl.java │ │ │ │ │ └── SocialUserApiImpl.java │ │ │ │ ├── tenant/ │ │ │ │ │ └── TenantApiImpl.java │ │ │ │ └── user/ │ │ │ │ └── AdminUserApiImpl.java │ │ │ ├── controller/ │ │ │ │ ├── admin/ │ │ │ │ │ ├── auth/ │ │ │ │ │ │ ├── AuthController.http │ │ │ │ │ │ ├── AuthController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── AuthLoginReqVO.java │ │ │ │ │ │ ├── AuthLoginRespVO.java │ │ │ │ │ │ ├── AuthMenuRespVO.java │ │ │ │ │ │ ├── AuthPermissionInfoRespVO.java │ │ │ │ │ │ ├── AuthRegisterReqVO.java │ │ │ │ │ │ ├── AuthResetPasswordReqVO.java │ │ │ │ │ │ ├── AuthSmsLoginReqVO.java │ │ │ │ │ │ ├── AuthSmsSendReqVO.java │ │ │ │ │ │ ├── AuthSocialLoginReqVO.java │ │ │ │ │ │ └── CaptchaVerificationReqVO.java │ │ │ │ │ ├── captcha/ │ │ │ │ │ │ └── CaptchaController.java │ │ │ │ │ ├── dept/ │ │ │ │ │ │ ├── DeptController.java │ │ │ │ │ │ ├── PostController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── dept/ │ │ │ │ │ │ │ ├── DeptListReqVO.java │ │ │ │ │ │ │ ├── DeptRespVO.java │ │ │ │ │ │ │ ├── DeptSaveReqVO.java │ │ │ │ │ │ │ └── DeptSimpleRespVO.java │ │ │ │ │ │ └── post/ │ │ │ │ │ │ ├── PostPageReqVO.java │ │ │ │ │ │ ├── PostRespVO.java │ │ │ │ │ │ ├── PostSaveReqVO.java │ │ │ │ │ │ └── PostSimpleRespVO.java │ │ │ │ │ ├── dict/ │ │ │ │ │ │ ├── DictDataController.http │ │ │ │ │ │ ├── DictDataController.java │ │ │ │ │ │ ├── DictTypeController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── data/ │ │ │ │ │ │ │ ├── DictDataPageReqVO.java │ │ │ │ │ │ │ ├── DictDataRespVO.java │ │ │ │ │ │ │ ├── DictDataSaveReqVO.java │ │ │ │ │ │ │ └── DictDataSimpleRespVO.java │ │ │ │ │ │ └── type/ │ │ │ │ │ │ ├── DictTypePageReqVO.java │ │ │ │ │ │ ├── DictTypeRespVO.java │ │ │ │ │ │ ├── DictTypeSaveReqVO.java │ │ │ │ │ │ └── DictTypeSimpleRespVO.java │ │ │ │ │ ├── ip/ │ │ │ │ │ │ ├── AreaController.http │ │ │ │ │ │ ├── AreaController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ └── AreaNodeRespVO.java │ │ │ │ │ ├── logger/ │ │ │ │ │ │ ├── LoginLogController.java │ │ │ │ │ │ ├── OperateLogController.http │ │ │ │ │ │ ├── OperateLogController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── loginlog/ │ │ │ │ │ │ │ ├── LoginLogPageReqVO.java │ │ │ │ │ │ │ └── LoginLogRespVO.java │ │ │ │ │ │ └── operatelog/ │ │ │ │ │ │ ├── OperateLogPageReqVO.java │ │ │ │ │ │ └── OperateLogRespVO.java │ │ │ │ │ ├── mail/ │ │ │ │ │ │ ├── MailAccountController.java │ │ │ │ │ │ ├── MailLogController.java │ │ │ │ │ │ ├── MailTemplateController.http │ │ │ │ │ │ ├── MailTemplateController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── account/ │ │ │ │ │ │ │ ├── MailAccountPageReqVO.java │ │ │ │ │ │ │ ├── MailAccountRespVO.java │ │ │ │ │ │ │ ├── MailAccountSaveReqVO.java │ │ │ │ │ │ │ └── MailAccountSimpleRespVO.java │ │ │ │ │ │ ├── log/ │ │ │ │ │ │ │ ├── MailLogPageReqVO.java │ │ │ │ │ │ │ └── MailLogRespVO.java │ │ │ │ │ │ └── template/ │ │ │ │ │ │ ├── MailTemplatePageReqVO.java │ │ │ │ │ │ ├── MailTemplateRespVO.java │ │ │ │ │ │ ├── MailTemplateSaveReqVO.java │ │ │ │ │ │ ├── MailTemplateSendReqVO.java │ │ │ │ │ │ └── MailTemplateSimpleRespVO.java │ │ │ │ │ ├── notice/ │ │ │ │ │ │ ├── NoticeController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── NoticePageReqVO.java │ │ │ │ │ │ ├── NoticeRespVO.java │ │ │ │ │ │ └── NoticeSaveReqVO.java │ │ │ │ │ ├── notify/ │ │ │ │ │ │ ├── NotifyMessageController.java │ │ │ │ │ │ ├── NotifyTemplateController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── message/ │ │ │ │ │ │ │ ├── NotifyMessageMyPageReqVO.java │ │ │ │ │ │ │ ├── NotifyMessagePageReqVO.java │ │ │ │ │ │ │ └── NotifyMessageRespVO.java │ │ │ │ │ │ └── template/ │ │ │ │ │ │ ├── NotifyTemplatePageReqVO.java │ │ │ │ │ │ ├── NotifyTemplateRespVO.java │ │ │ │ │ │ ├── NotifyTemplateSaveReqVO.java │ │ │ │ │ │ └── NotifyTemplateSendReqVO.java │ │ │ │ │ ├── oauth2/ │ │ │ │ │ │ ├── OAuth2ClientController.http │ │ │ │ │ │ ├── OAuth2ClientController.java │ │ │ │ │ │ ├── OAuth2OpenController.http │ │ │ │ │ │ ├── OAuth2OpenController.java │ │ │ │ │ │ ├── OAuth2TokenController.java │ │ │ │ │ │ ├── OAuth2UserController.http │ │ │ │ │ │ ├── OAuth2UserController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ ├── OAuth2ClientPageReqVO.java │ │ │ │ │ │ │ ├── OAuth2ClientRespVO.java │ │ │ │ │ │ │ └── OAuth2ClientSaveReqVO.java │ │ │ │ │ │ ├── open/ │ │ │ │ │ │ │ ├── OAuth2OpenAccessTokenRespVO.java │ │ │ │ │ │ │ ├── OAuth2OpenAuthorizeInfoRespVO.java │ │ │ │ │ │ │ └── OAuth2OpenCheckTokenRespVO.java │ │ │ │ │ │ ├── token/ │ │ │ │ │ │ │ ├── OAuth2AccessTokenPageReqVO.java │ │ │ │ │ │ │ └── OAuth2AccessTokenRespVO.java │ │ │ │ │ │ └── user/ │ │ │ │ │ │ ├── OAuth2UserInfoRespVO.java │ │ │ │ │ │ └── OAuth2UserUpdateReqVO.java │ │ │ │ │ ├── permission/ │ │ │ │ │ │ ├── MenuController.http │ │ │ │ │ │ ├── MenuController.java │ │ │ │ │ │ ├── PermissionController.java │ │ │ │ │ │ ├── RoleController.http │ │ │ │ │ │ ├── RoleController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── menu/ │ │ │ │ │ │ │ ├── MenuListReqVO.java │ │ │ │ │ │ │ ├── MenuRespVO.java │ │ │ │ │ │ │ ├── MenuSaveVO.java │ │ │ │ │ │ │ └── MenuSimpleRespVO.java │ │ │ │ │ │ ├── permission/ │ │ │ │ │ │ │ ├── PermissionAssignRoleDataScopeReqVO.java │ │ │ │ │ │ │ ├── PermissionAssignRoleMenuReqVO.java │ │ │ │ │ │ │ └── PermissionAssignUserRoleReqVO.java │ │ │ │ │ │ └── role/ │ │ │ │ │ │ ├── RolePageReqVO.java │ │ │ │ │ │ ├── RoleRespVO.java │ │ │ │ │ │ ├── RoleSaveReqVO.java │ │ │ │ │ │ └── RoleSimpleRespVO.java │ │ │ │ │ ├── sms/ │ │ │ │ │ │ ├── SmsCallbackController.java │ │ │ │ │ │ ├── SmsChannelController.java │ │ │ │ │ │ ├── SmsLogController.java │ │ │ │ │ │ ├── SmsTemplateController.http │ │ │ │ │ │ ├── SmsTemplateController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── channel/ │ │ │ │ │ │ │ ├── SmsChannelPageReqVO.java │ │ │ │ │ │ │ ├── SmsChannelRespVO.java │ │ │ │ │ │ │ ├── SmsChannelSaveReqVO.java │ │ │ │ │ │ │ └── SmsChannelSimpleRespVO.java │ │ │ │ │ │ ├── log/ │ │ │ │ │ │ │ ├── SmsLogPageReqVO.java │ │ │ │ │ │ │ └── SmsLogRespVO.java │ │ │ │ │ │ └── template/ │ │ │ │ │ │ ├── SmsTemplatePageReqVO.java │ │ │ │ │ │ ├── SmsTemplateRespVO.java │ │ │ │ │ │ ├── SmsTemplateSaveReqVO.java │ │ │ │ │ │ └── SmsTemplateSendReqVO.java │ │ │ │ │ ├── socail/ │ │ │ │ │ │ ├── SocialClientController.http │ │ │ │ │ │ ├── SocialClientController.java │ │ │ │ │ │ ├── SocialUserController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ ├── SocialClientPageReqVO.java │ │ │ │ │ │ │ ├── SocialClientRespVO.java │ │ │ │ │ │ │ └── SocialClientSaveReqVO.java │ │ │ │ │ │ └── user/ │ │ │ │ │ │ ├── SocialUserBindReqVO.java │ │ │ │ │ │ ├── SocialUserPageReqVO.java │ │ │ │ │ │ ├── SocialUserRespVO.java │ │ │ │ │ │ └── SocialUserUnbindReqVO.java │ │ │ │ │ ├── tenant/ │ │ │ │ │ │ ├── TenantController.http │ │ │ │ │ │ ├── TenantController.java │ │ │ │ │ │ ├── TenantPackageController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ ├── packages/ │ │ │ │ │ │ │ ├── TenantPackagePageReqVO.java │ │ │ │ │ │ │ ├── TenantPackageRespVO.java │ │ │ │ │ │ │ ├── TenantPackageSaveReqVO.java │ │ │ │ │ │ │ └── TenantPackageSimpleRespVO.java │ │ │ │ │ │ └── tenant/ │ │ │ │ │ │ ├── TenantPageReqVO.java │ │ │ │ │ │ ├── TenantRespVO.java │ │ │ │ │ │ └── TenantSaveReqVO.java │ │ │ │ │ └── user/ │ │ │ │ │ ├── UserController.http │ │ │ │ │ ├── UserController.java │ │ │ │ │ ├── UserProfileController.http │ │ │ │ │ ├── UserProfileController.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── UserProfileRespVO.java │ │ │ │ │ │ ├── UserProfileUpdatePasswordReqVO.java │ │ │ │ │ │ └── UserProfileUpdateReqVO.java │ │ │ │ │ └── user/ │ │ │ │ │ ├── UserImportExcelVO.java │ │ │ │ │ ├── UserImportRespVO.java │ │ │ │ │ ├── UserPageReqVO.java │ │ │ │ │ ├── UserRespVO.java │ │ │ │ │ ├── UserSaveReqVO.java │ │ │ │ │ ├── UserSimpleRespVO.java │ │ │ │ │ ├── UserUpdatePasswordReqVO.java │ │ │ │ │ └── UserUpdateStatusReqVO.java │ │ │ │ ├── app/ │ │ │ │ │ ├── dict/ │ │ │ │ │ │ ├── AppDictDataController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ └── AppDictDataRespVO.java │ │ │ │ │ ├── ip/ │ │ │ │ │ │ ├── AppAreaController.java │ │ │ │ │ │ └── vo/ │ │ │ │ │ │ └── AppAreaNodeRespVO.java │ │ │ │ │ ├── package-info.java │ │ │ │ │ └── tenant/ │ │ │ │ │ ├── AppTenantController.java │ │ │ │ │ └── vo/ │ │ │ │ │ └── AppTenantRespVO.java │ │ │ │ └── package-info.java │ │ │ ├── convert/ │ │ │ │ ├── auth/ │ │ │ │ │ └── AuthConvert.java │ │ │ │ ├── oauth2/ │ │ │ │ │ └── OAuth2OpenConvert.java │ │ │ │ ├── package-info.java │ │ │ │ ├── tenant/ │ │ │ │ │ └── TenantConvert.java │ │ │ │ ├── user/ │ │ │ │ │ └── UserConvert.java │ │ │ │ └── 《芋道 Spring Boot 对象转换 MapStruct 入门》.md │ │ │ ├── dal/ │ │ │ │ ├── dataobject/ │ │ │ │ │ ├── dept/ │ │ │ │ │ │ ├── DeptDO.java │ │ │ │ │ │ ├── PostDO.java │ │ │ │ │ │ └── UserPostDO.java │ │ │ │ │ ├── dict/ │ │ │ │ │ │ ├── DictDataDO.java │ │ │ │ │ │ └── DictTypeDO.java │ │ │ │ │ ├── logger/ │ │ │ │ │ │ ├── LoginLogDO.java │ │ │ │ │ │ └── OperateLogDO.java │ │ │ │ │ ├── mail/ │ │ │ │ │ │ ├── MailAccountDO.java │ │ │ │ │ │ ├── MailLogDO.java │ │ │ │ │ │ └── MailTemplateDO.java │ │ │ │ │ ├── notice/ │ │ │ │ │ │ └── NoticeDO.java │ │ │ │ │ ├── notify/ │ │ │ │ │ │ ├── NotifyMessageDO.java │ │ │ │ │ │ └── NotifyTemplateDO.java │ │ │ │ │ ├── oauth2/ │ │ │ │ │ │ ├── OAuth2AccessTokenDO.java │ │ │ │ │ │ ├── OAuth2ApproveDO.java │ │ │ │ │ │ ├── OAuth2ClientDO.java │ │ │ │ │ │ ├── OAuth2CodeDO.java │ │ │ │ │ │ └── OAuth2RefreshTokenDO.java │ │ │ │ │ ├── permission/ │ │ │ │ │ │ ├── MenuDO.java │ │ │ │ │ │ ├── RoleDO.java │ │ │ │ │ │ ├── RoleMenuDO.java │ │ │ │ │ │ └── UserRoleDO.java │ │ │ │ │ ├── sms/ │ │ │ │ │ │ ├── SmsChannelDO.java │ │ │ │ │ │ ├── SmsCodeDO.java │ │ │ │ │ │ ├── SmsLogDO.java │ │ │ │ │ │ └── SmsTemplateDO.java │ │ │ │ │ ├── social/ │ │ │ │ │ │ ├── SocialClientDO.java │ │ │ │ │ │ ├── SocialUserBindDO.java │ │ │ │ │ │ └── SocialUserDO.java │ │ │ │ │ ├── tenant/ │ │ │ │ │ │ ├── TenantDO.java │ │ │ │ │ │ └── TenantPackageDO.java │ │ │ │ │ └── user/ │ │ │ │ │ └── AdminUserDO.java │ │ │ │ ├── mysql/ │ │ │ │ │ ├── dept/ │ │ │ │ │ │ ├── DeptMapper.java │ │ │ │ │ │ ├── PostMapper.java │ │ │ │ │ │ └── UserPostMapper.java │ │ │ │ │ ├── dict/ │ │ │ │ │ │ ├── DictDataMapper.java │ │ │ │ │ │ └── DictTypeMapper.java │ │ │ │ │ ├── logger/ │ │ │ │ │ │ ├── LoginLogMapper.java │ │ │ │ │ │ └── OperateLogMapper.java │ │ │ │ │ ├── mail/ │ │ │ │ │ │ ├── MailAccountMapper.java │ │ │ │ │ │ ├── MailLogMapper.java │ │ │ │ │ │ └── MailTemplateMapper.java │ │ │ │ │ ├── notice/ │ │ │ │ │ │ └── NoticeMapper.java │ │ │ │ │ ├── notify/ │ │ │ │ │ │ ├── NotifyMessageMapper.java │ │ │ │ │ │ └── NotifyTemplateMapper.java │ │ │ │ │ ├── oauth2/ │ │ │ │ │ │ ├── OAuth2AccessTokenMapper.java │ │ │ │ │ │ ├── OAuth2ApproveMapper.java │ │ │ │ │ │ ├── OAuth2ClientMapper.java │ │ │ │ │ │ ├── OAuth2CodeMapper.java │ │ │ │ │ │ └── OAuth2RefreshTokenMapper.java │ │ │ │ │ ├── package-info.java │ │ │ │ │ ├── permission/ │ │ │ │ │ │ ├── MenuMapper.java │ │ │ │ │ │ ├── RoleMapper.java │ │ │ │ │ │ ├── RoleMenuMapper.java │ │ │ │ │ │ └── UserRoleMapper.java │ │ │ │ │ ├── sms/ │ │ │ │ │ │ ├── SmsChannelMapper.java │ │ │ │ │ │ ├── SmsCodeMapper.java │ │ │ │ │ │ ├── SmsLogMapper.java │ │ │ │ │ │ └── SmsTemplateMapper.java │ │ │ │ │ ├── social/ │ │ │ │ │ │ ├── SocialClientMapper.java │ │ │ │ │ │ ├── SocialUserBindMapper.java │ │ │ │ │ │ └── SocialUserMapper.java │ │ │ │ │ ├── tenant/ │ │ │ │ │ │ ├── TenantMapper.java │ │ │ │ │ │ └── TenantPackageMapper.java │ │ │ │ │ └── user/ │ │ │ │ │ └── AdminUserMapper.java │ │ │ │ └── redis/ │ │ │ │ ├── RedisKeyConstants.java │ │ │ │ └── oauth2/ │ │ │ │ └── OAuth2AccessTokenRedisDAO.java │ │ │ ├── framework/ │ │ │ │ ├── captcha/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── YudaoCaptchaConfiguration.java │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── PictureWordCaptchaServiceImpl.java │ │ │ │ │ │ └── RedisCaptchaServiceImpl.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── datapermission/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── DataPermissionConfiguration.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── justauth/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── YudaoJustAuthConfiguration.java │ │ │ │ │ ├── core/ │ │ │ │ │ │ └── AuthRequestFactory.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── operatelog/ │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── AdminUserParseFunction.java │ │ │ │ │ │ ├── AreaParseFunction.java │ │ │ │ │ │ ├── BooleanParseFunction.java │ │ │ │ │ │ ├── DeptParseFunction.java │ │ │ │ │ │ ├── PostParseFunction.java │ │ │ │ │ │ └── SexParseFunction.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── package-info.java │ │ │ │ ├── rpc/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── RpcConfiguration.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── security/ │ │ │ │ │ ├── config/ │ │ │ │ │ │ └── SecurityConfiguration.java │ │ │ │ │ └── core/ │ │ │ │ │ └── package-info.java │ │ │ │ └── sms/ │ │ │ │ ├── config/ │ │ │ │ │ ├── SmsCodeProperties.java │ │ │ │ │ └── SmsConfiguration.java │ │ │ │ └── core/ │ │ │ │ ├── client/ │ │ │ │ │ ├── SmsClient.java │ │ │ │ │ ├── SmsClientFactory.java │ │ │ │ │ ├── dto/ │ │ │ │ │ │ ├── SmsReceiveRespDTO.java │ │ │ │ │ │ ├── SmsSendRespDTO.java │ │ │ │ │ │ └── SmsTemplateRespDTO.java │ │ │ │ │ └── impl/ │ │ │ │ │ ├── AbstractSmsClient.java │ │ │ │ │ ├── AliyunSmsClient.java │ │ │ │ │ ├── DebugDingTalkSmsClient.java │ │ │ │ │ ├── HuaweiSmsClient.java │ │ │ │ │ ├── QiniuSmsClient.java │ │ │ │ │ ├── SmsClientFactoryImpl.java │ │ │ │ │ └── TencentSmsClient.java │ │ │ │ ├── enums/ │ │ │ │ │ ├── SmsChannelEnum.java │ │ │ │ │ └── SmsTemplateAuditStatusEnum.java │ │ │ │ └── property/ │ │ │ │ └── SmsChannelProperties.java │ │ │ ├── job/ │ │ │ │ ├── demo/ │ │ │ │ │ └── DemoJob.java │ │ │ │ └── package-info.java │ │ │ ├── mq/ │ │ │ │ ├── consumer/ │ │ │ │ │ ├── mail/ │ │ │ │ │ │ └── MailSendConsumer.java │ │ │ │ │ └── sms/ │ │ │ │ │ └── SmsSendConsumer.java │ │ │ │ ├── message/ │ │ │ │ │ ├── mail/ │ │ │ │ │ │ └── MailSendMessage.java │ │ │ │ │ └── sms/ │ │ │ │ │ └── SmsSendMessage.java │ │ │ │ └── producer/ │ │ │ │ ├── mail/ │ │ │ │ │ └── MailProducer.java │ │ │ │ └── sms/ │ │ │ │ └── SmsProducer.java │ │ │ ├── package-info.java │ │ │ ├── service/ │ │ │ │ ├── auth/ │ │ │ │ │ ├── AdminAuthService.java │ │ │ │ │ └── AdminAuthServiceImpl.java │ │ │ │ ├── dept/ │ │ │ │ │ ├── DeptService.java │ │ │ │ │ ├── DeptServiceImpl.java │ │ │ │ │ ├── PostService.java │ │ │ │ │ └── PostServiceImpl.java │ │ │ │ ├── dict/ │ │ │ │ │ ├── DictDataService.java │ │ │ │ │ ├── DictDataServiceImpl.java │ │ │ │ │ ├── DictTypeService.java │ │ │ │ │ └── DictTypeServiceImpl.java │ │ │ │ ├── logger/ │ │ │ │ │ ├── LoginLogService.java │ │ │ │ │ ├── LoginLogServiceImpl.java │ │ │ │ │ ├── OperateLogService.java │ │ │ │ │ └── OperateLogServiceImpl.java │ │ │ │ ├── mail/ │ │ │ │ │ ├── MailAccountService.java │ │ │ │ │ ├── MailAccountServiceImpl.java │ │ │ │ │ ├── MailLogService.java │ │ │ │ │ ├── MailLogServiceImpl.java │ │ │ │ │ ├── MailSendService.java │ │ │ │ │ ├── MailSendServiceImpl.java │ │ │ │ │ ├── MailTemplateService.java │ │ │ │ │ └── MailTemplateServiceImpl.java │ │ │ │ ├── member/ │ │ │ │ │ ├── MemberService.java │ │ │ │ │ ├── MemberServiceImpl.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── notice/ │ │ │ │ │ ├── NoticeService.java │ │ │ │ │ └── NoticeServiceImpl.java │ │ │ │ ├── notify/ │ │ │ │ │ ├── NotifyMessageService.java │ │ │ │ │ ├── NotifyMessageServiceImpl.java │ │ │ │ │ ├── NotifySendService.java │ │ │ │ │ ├── NotifySendServiceImpl.java │ │ │ │ │ ├── NotifyTemplateService.java │ │ │ │ │ └── NotifyTemplateServiceImpl.java │ │ │ │ ├── oauth2/ │ │ │ │ │ ├── OAuth2ApproveService.java │ │ │ │ │ ├── OAuth2ApproveServiceImpl.java │ │ │ │ │ ├── OAuth2ClientService.java │ │ │ │ │ ├── OAuth2ClientServiceImpl.java │ │ │ │ │ ├── OAuth2CodeService.java │ │ │ │ │ ├── OAuth2CodeServiceImpl.java │ │ │ │ │ ├── OAuth2GrantService.java │ │ │ │ │ ├── OAuth2GrantServiceImpl.java │ │ │ │ │ ├── OAuth2TokenService.java │ │ │ │ │ └── OAuth2TokenServiceImpl.java │ │ │ │ ├── permission/ │ │ │ │ │ ├── MenuService.java │ │ │ │ │ ├── MenuServiceImpl.java │ │ │ │ │ ├── PermissionService.java │ │ │ │ │ ├── PermissionServiceImpl.java │ │ │ │ │ ├── RoleService.java │ │ │ │ │ └── RoleServiceImpl.java │ │ │ │ ├── sms/ │ │ │ │ │ ├── SmsChannelService.java │ │ │ │ │ ├── SmsChannelServiceImpl.java │ │ │ │ │ ├── SmsCodeService.java │ │ │ │ │ ├── SmsCodeServiceImpl.java │ │ │ │ │ ├── SmsLogService.java │ │ │ │ │ ├── SmsLogServiceImpl.java │ │ │ │ │ ├── SmsSendService.java │ │ │ │ │ ├── SmsSendServiceImpl.java │ │ │ │ │ ├── SmsTemplateService.java │ │ │ │ │ └── SmsTemplateServiceImpl.java │ │ │ │ ├── social/ │ │ │ │ │ ├── SocialClientService.java │ │ │ │ │ ├── SocialClientServiceImpl.java │ │ │ │ │ ├── SocialUserService.java │ │ │ │ │ └── SocialUserServiceImpl.java │ │ │ │ ├── tenant/ │ │ │ │ │ ├── TenantPackageService.java │ │ │ │ │ ├── TenantPackageServiceImpl.java │ │ │ │ │ ├── TenantService.java │ │ │ │ │ ├── TenantServiceImpl.java │ │ │ │ │ └── handler/ │ │ │ │ │ ├── TenantInfoHandler.java │ │ │ │ │ └── TenantMenuHandler.java │ │ │ │ └── user/ │ │ │ │ ├── AdminUserService.java │ │ │ │ └── AdminUserServiceImpl.java │ │ │ └── util/ │ │ │ ├── oauth2/ │ │ │ │ └── OAuth2Utils.java │ │ │ └── package-info.java │ │ └── resources/ │ │ ├── META-INF/ │ │ │ └── services/ │ │ │ ├── com.anji.captcha.service.CaptchaCacheService │ │ │ └── com.anji.captcha.service.CaptchaService │ │ ├── application-dev.yaml │ │ ├── application-local.yaml │ │ ├── application.yaml │ │ └── logback-spring.xml │ └── test/ │ ├── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── module/ │ │ └── system/ │ │ ├── controller/ │ │ │ └── admin/ │ │ │ └── oauth2/ │ │ │ └── OAuth2OpenControllerTest.java │ │ ├── framework/ │ │ │ └── sms/ │ │ │ └── core/ │ │ │ └── client/ │ │ │ └── impl/ │ │ │ ├── AliyunSmsClientTest.java │ │ │ ├── HuaweiSmsClientTest.java │ │ │ ├── QiniuSmsClientTest.java │ │ │ ├── SmsClientTests.java │ │ │ └── TencentSmsClientTest.java │ │ └── service/ │ │ ├── auth/ │ │ │ └── AdminAuthServiceImplTest.java │ │ ├── dept/ │ │ │ ├── DeptServiceImplTest.java │ │ │ └── PostServiceImplTest.java │ │ ├── dict/ │ │ │ ├── DictDataServiceImplTest.java │ │ │ └── DictTypeServiceImplTest.java │ │ ├── logger/ │ │ │ ├── LoginLogServiceImplTest.java │ │ │ └── OperateLogServiceImplTest.java │ │ ├── mail/ │ │ │ ├── MailAccountServiceImplTest.java │ │ │ ├── MailLogServiceImplTest.java │ │ │ ├── MailSendServiceImplTest.java │ │ │ └── MailTemplateServiceImplTest.java │ │ ├── notice/ │ │ │ └── NoticeServiceImplTest.java │ │ ├── notify/ │ │ │ ├── NotifyMessageServiceImplTest.java │ │ │ ├── NotifySendServiceImplTest.java │ │ │ └── NotifyTemplateServiceImplTest.java │ │ ├── oauth2/ │ │ │ ├── OAuth2ApproveServiceImplTest.java │ │ │ ├── OAuth2ClientServiceImplTest.java │ │ │ ├── OAuth2CodeServiceImplTest.java │ │ │ ├── OAuth2GrantServiceImplTest.java │ │ │ └── OAuth2TokenServiceImplTest.java │ │ ├── permission/ │ │ │ ├── MenuServiceImplTest.java │ │ │ ├── PermissionServiceTest.java │ │ │ └── RoleServiceImplTest.java │ │ ├── sms/ │ │ │ ├── SmsChannelServiceTest.java │ │ │ ├── SmsCodeServiceImplTest.java │ │ │ ├── SmsLogServiceImplTest.java │ │ │ ├── SmsSendServiceImplTest.java │ │ │ └── SmsTemplateServiceImplTest.java │ │ ├── social/ │ │ │ ├── SocialClientServiceImplTest.java │ │ │ └── SocialUserServiceImplTest.java │ │ ├── tenant/ │ │ │ ├── TenantPackageServiceImplTest.java │ │ │ └── TenantServiceImplTest.java │ │ └── user/ │ │ └── AdminUserServiceImplTest.java │ └── resources/ │ ├── application-unit-test.yaml │ ├── logback.xml │ └── sql/ │ ├── clean.sql │ └── create_tables.sql ├── yudao-server/ │ ├── Dockerfile │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── cn/ │ │ └── iocoder/ │ │ └── yudao/ │ │ └── server/ │ │ ├── YudaoServerApplication.java │ │ └── controller/ │ │ └── DefaultController.java │ └── resources/ │ ├── application-dev.yaml │ ├── application-local.yaml │ ├── application.yaml │ └── logback-spring.xml └── yudao-ui/ ├── yudao-ui-admin-uniapp/ │ └── README.md ├── yudao-ui-admin-vben/ │ └── README.md ├── yudao-ui-admin-vue2/ │ └── README.md ├── yudao-ui-admin-vue3/ │ └── README.md └── yudao-ui-mall-uniapp/ └── README.md