├── .gitignore ├── LICENSE ├── README.md ├── build.gradle ├── ci-build.sh ├── clear-and-local-run.sh ├── doc ├── 业务运营 │ ├── 举报管理App.md │ ├── 印刷产品App.md │ ├── 应用模板App.md │ ├── 租户管理App.md │ ├── 订单管理App.md │ └── 运营数据App.md └── 技术运营 │ ├── Lombok示例.md │ ├── 生成全国行政地址列表.md │ ├── 编码原则.md │ └── 请求流程.md ├── gradle.properties ├── gradle ├── checkstyle │ ├── checkstyle.gradle │ └── checkstyle.xml ├── docker-compose │ ├── docker-compose.gradle │ ├── docker-compose.yml │ └── mongo-init.js ├── idea.gradle ├── jacoco.gradle ├── spotbugs │ ├── exclude.xml │ └── spotbugs.gradle ├── version-info.gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── idea.sh ├── local-run.sh ├── lombok.config └── src ├── apiTest ├── java │ └── com │ │ └── mryqr │ │ ├── BaseApiTest.java │ │ ├── common │ │ ├── about │ │ │ └── AboutControllerApiTest.java │ │ ├── administrative │ │ │ └── AdministrativeControllerApiTest.java │ │ ├── aliyun │ │ │ └── oss │ │ │ │ ├── OssTokenApi.java │ │ │ │ └── OssTokenControllerApiTest.java │ │ ├── infrastracture │ │ │ ├── MryObjectMapperTest.java │ │ │ └── RateLimiterApiTest.java │ │ └── wx │ │ │ ├── WxApi.java │ │ │ └── WxControllerApiTest.java │ │ ├── core │ │ ├── app │ │ │ ├── AppApi.java │ │ │ ├── AppControllerApiTest.java │ │ │ ├── attribute │ │ │ │ └── AttributeApiTest.java │ │ │ ├── control │ │ │ │ ├── AddressControlApiTest.java │ │ │ │ ├── AnswerReferenceControlApiTest.java │ │ │ │ ├── AttachmentViewControlApiTest.java │ │ │ │ ├── AttributeDashboardControlApiTest.java │ │ │ │ ├── AttributeTableControlApiTest.java │ │ │ │ ├── BarControlApiTest.java │ │ │ │ ├── ButtonPageLinkControlApiTest.java │ │ │ │ ├── CheckboxControlApiTest.java │ │ │ │ ├── ControlApiTest.java │ │ │ │ ├── DateControlApiTest.java │ │ │ │ ├── DoughnutControlApiTest.java │ │ │ │ ├── DropdownControlApiTest.java │ │ │ │ ├── EmailControlApiTest.java │ │ │ │ ├── FileUploadControlApiTest.java │ │ │ │ ├── GeolocationControlApiTest.java │ │ │ │ ├── IconPageLinkControlApiTest.java │ │ │ │ ├── IdentifierControlApiTest.java │ │ │ │ ├── ImageCardLinkControlApiTest.java │ │ │ │ ├── ImageUploadControlApiTest.java │ │ │ │ ├── ImageViewControlApiTest.java │ │ │ │ ├── InstanceListApiTest.java │ │ │ │ ├── InstanceListControlApiTest.java │ │ │ │ ├── ItemCountControlApiTest.java │ │ │ │ ├── ItemStatusControlApiTest.java │ │ │ │ ├── MemberSelectControlApiTest.java │ │ │ │ ├── MobileControlApiTest.java │ │ │ │ ├── MultiLevelSelectionControlApiTest.java │ │ │ │ ├── MultiLineTextControlApiTest.java │ │ │ │ ├── NumberInputControlApiTest.java │ │ │ │ ├── NumberRangeSegmentControlApiTest.java │ │ │ │ ├── NumberRankControlApiTest.java │ │ │ │ ├── ParagraghControlApiTest.java │ │ │ │ ├── PersonNameControlApiTest.java │ │ │ │ ├── PieControlApiTest.java │ │ │ │ ├── PointCheckControlApiTest.java │ │ │ │ ├── RadioControlApiTest.java │ │ │ │ ├── RichTextControlApiTest.java │ │ │ │ ├── RichTextInputControlApiTest.java │ │ │ │ ├── SectionTitleControlApiTest.java │ │ │ │ ├── SeparatorControlApiTest.java │ │ │ │ ├── SignatureControlApiTest.java │ │ │ │ ├── SingleLineTextControlApiTest.java │ │ │ │ ├── SubmissionReferenceControlApiTest.java │ │ │ │ ├── SubmitHistoryControlApiTest.java │ │ │ │ ├── TimeControlApiTest.java │ │ │ │ ├── TimeSegmentControlApiTest.java │ │ │ │ ├── TrendControlApiTest.java │ │ │ │ └── VideoViewControlApiTest.java │ │ │ ├── menu │ │ │ │ └── MenuApiTest.java │ │ │ ├── notification │ │ │ │ └── AppNotificationApiTest.java │ │ │ ├── operationmenu │ │ │ │ └── OperationMenuApiTest.java │ │ │ ├── page │ │ │ │ └── AppPageApiTest.java │ │ │ ├── plate │ │ │ │ └── PlateSettingApiTest.java │ │ │ ├── report │ │ │ │ └── AppReportSettingApiTest.java │ │ │ └── webhook │ │ │ │ └── AppWebhookApiTest.java │ │ ├── appmanual │ │ │ ├── AppManualApi.java │ │ │ └── AppManualApiTest.java │ │ ├── apptemplate │ │ │ ├── AppTemplateApi.java │ │ │ └── AppTemplateControllerApiTest.java │ │ ├── assignment │ │ │ ├── AssignmentApi.java │ │ │ └── AssignmentControllerApiTest.java │ │ ├── assignmentplan │ │ │ ├── AssignmentPlanApi.java │ │ │ └── AssignmentPlanControllerApiTest.java │ │ ├── authentication │ │ │ └── AuthenticationCommonApiTest.java │ │ ├── department │ │ │ ├── DepartmentApi.java │ │ │ └── DepartmentControllerApiTest.java │ │ ├── departmenthierarchy │ │ │ ├── DepartmentHierarchyApi.java │ │ │ └── DepartmentHierarchyControllerApiTest.java │ │ ├── group │ │ │ ├── GroupApi.java │ │ │ └── GroupControllerApiTest.java │ │ ├── grouphierarchy │ │ │ ├── GroupHierarchyApi.java │ │ │ └── GroupHierarchyControllerApiTest.java │ │ ├── job │ │ │ ├── AutoRemoveRangedAttributeValuesJobTest.java │ │ │ ├── CreateAssignmentsJobTest.java │ │ │ ├── DomainEventJobsTest.java │ │ │ ├── ExpireAssignmentJobTest.java │ │ │ ├── MryOperationStatisticsJobTest.java │ │ │ └── NearExpireAssignmentJobTest.java │ │ ├── kanban │ │ │ ├── KanbanApi.java │ │ │ └── KanbanControllerApiTest.java │ │ ├── login │ │ │ ├── LoginApi.java │ │ │ └── LoginControllerApiTest.java │ │ ├── mangement │ │ │ ├── OffenceReportApiTest.java │ │ │ ├── OrderManagementApiTest.java │ │ │ └── TenantManagementApiTest.java │ │ ├── member │ │ │ ├── MemberApi.java │ │ │ └── MemberControllerApiTest.java │ │ ├── order │ │ │ ├── OrderApi.java │ │ │ ├── OrderControllerApiTest.java │ │ │ └── StubOrderPaidNotifyApi.java │ │ ├── plan │ │ │ ├── PlanApi.java │ │ │ └── PlanControllerApiTest.java │ │ ├── platebatch │ │ │ ├── PlateBatchApi.java │ │ │ └── PlateBatchControllerApiTest.java │ │ ├── platetemplate │ │ │ ├── PlateTemplateApi.java │ │ │ └── PlateTemplateControllerApiTest.java │ │ ├── presentation │ │ │ ├── PresentationApi.java │ │ │ └── PresentationControllerApiTest.java │ │ ├── printing │ │ │ ├── PrintingProductApi.java │ │ │ └── PrintingProductControllerApiTest.java │ │ ├── qr │ │ │ ├── QrApi.java │ │ │ └── QrControllerApiTest.java │ │ ├── register │ │ │ ├── RegisterApi.java │ │ │ └── RegisterControllerApiTest.java │ │ ├── report │ │ │ ├── ReportApi.java │ │ │ └── ReportControllerApiTest.java │ │ ├── submission │ │ │ ├── SubmissionApi.java │ │ │ ├── SubmissionControllerApiTest.java │ │ │ └── SubmissionUtils.java │ │ ├── tenant │ │ │ ├── TenantApi.java │ │ │ └── TenantControllerApiTest.java │ │ └── verification │ │ │ ├── VerificationCodeApi.java │ │ │ └── VerificationControllerApiTest.java │ │ ├── integration │ │ ├── IntegrationApi.java │ │ └── IntegrationControllerApiTest.java │ │ ├── support │ │ └── SyncConsumeDomainEventInterceptor.java │ │ └── utils │ │ ├── CreateMemberResponse.java │ │ ├── LoginResponse.java │ │ ├── PreparedAppResponse.java │ │ ├── PreparedQrResponse.java │ │ ├── SetupApi.java │ │ └── apitest │ │ ├── ApiTestStubNotifyController.java │ │ └── ApiTestingWebhookController.java └── resources │ ├── application-ci.yml │ ├── junit-platform.properties │ └── testdata │ ├── administrative │ └── raw-tianditu-district.json │ ├── member │ ├── a-text-file.txt │ ├── empty-import-members.xlsx │ ├── no-name-import-members.xlsx │ └── normal-import-members.xlsx │ └── qr │ ├── a-text-file.txt │ ├── duplicated-qrs-import.xlsx │ ├── no-custom-id-qrs-import.xlsx │ ├── no-name-qrs-import.xlsx │ ├── no-record-qrs-import.xlsx │ ├── normal-qrs-import.xlsx │ └── simple-qrs-import.xlsx ├── main ├── java │ └── com │ │ └── mryqr │ │ ├── MryApplication.java │ │ ├── common │ │ ├── about │ │ │ ├── AboutController.java │ │ │ └── QAboutInfo.java │ │ ├── cache │ │ │ └── CacheConfiguration.java │ │ ├── cors │ │ │ └── CorsConfiguration.java │ │ ├── dns │ │ │ ├── AliyunDnsService.java │ │ │ └── MryDnsService.java │ │ ├── domain │ │ │ ├── Address.java │ │ │ ├── AddressPrecisionType.java │ │ │ ├── AggregateRoot.java │ │ │ ├── AggregateRootType.java │ │ │ ├── CountedItem.java │ │ │ ├── Geolocation.java │ │ │ ├── Geopoint.java │ │ │ ├── OpsLog.java │ │ │ ├── TextOption.java │ │ │ ├── UploadedFile.java │ │ │ ├── ValueType.java │ │ │ ├── administrative │ │ │ │ ├── Administrative.java │ │ │ │ └── AdministrativeProvider.java │ │ │ ├── display │ │ │ │ ├── AddressDisplayValue.java │ │ │ │ ├── BooleanDisplayValue.java │ │ │ │ ├── DisplayValue.java │ │ │ │ ├── DisplayValueType.java │ │ │ │ ├── EmailedMember.java │ │ │ │ ├── EmailedMemberDisplayValue.java │ │ │ │ ├── EmailedMembersDisplayValue.java │ │ │ │ ├── FilesDisplayValue.java │ │ │ │ ├── GeolocationDisplayValue.java │ │ │ │ ├── ItemCountDisplayValue.java │ │ │ │ ├── MobiledMember.java │ │ │ │ ├── MobiledMemberDisplayValue.java │ │ │ │ ├── MobiledMembersDisplayValue.java │ │ │ │ ├── NumberDisplayValue.java │ │ │ │ ├── PointCheckDisplayValue.java │ │ │ │ ├── TextDisplayValue.java │ │ │ │ ├── TextOptionDisplayValue.java │ │ │ │ ├── TextOptionsDisplayValue.java │ │ │ │ └── TimestampDisplayValue.java │ │ │ ├── idnode │ │ │ │ ├── IdTree.java │ │ │ │ ├── IdTreeHierarchy.java │ │ │ │ ├── exception │ │ │ │ │ ├── IdNodeLevelOverflowException.java │ │ │ │ │ ├── IdNodeNotFoundException.java │ │ │ │ │ └── NodeIdFormatException.java │ │ │ │ └── validation │ │ │ │ │ ├── NodeId.java │ │ │ │ │ └── NodeIdValidator.java │ │ │ ├── indexedfield │ │ │ │ ├── IndexedField.java │ │ │ │ ├── IndexedFieldRegistry.java │ │ │ │ ├── IndexedValue.java │ │ │ │ └── IndexedValues.java │ │ │ ├── invoice │ │ │ │ └── InvoiceTitle.java │ │ │ ├── permission │ │ │ │ ├── AppOperatePermissionChecker.java │ │ │ │ ├── AppOperatePermissions.java │ │ │ │ ├── ManagePermissionChecker.java │ │ │ │ ├── Permission.java │ │ │ │ ├── SubmissionPermissionChecker.java │ │ │ │ └── SubmissionPermissions.java │ │ │ ├── report │ │ │ │ ├── CategorizedOptionSegment.java │ │ │ │ ├── NumberAggregationType.java │ │ │ │ ├── NumberRangeSegment.java │ │ │ │ ├── QrReportTimeBasedType.java │ │ │ │ ├── QrSegmentType.java │ │ │ │ ├── ReportRange.java │ │ │ │ ├── SubmissionReportTimeBasedType.java │ │ │ │ ├── SubmissionSegmentType.java │ │ │ │ ├── TimeRange.java │ │ │ │ ├── TimeSegment.java │ │ │ │ └── TimeSegmentInterval.java │ │ │ ├── task │ │ │ │ ├── NonRetryableTask.java │ │ │ │ └── RetryableTask.java │ │ │ └── user │ │ │ │ ├── Role.java │ │ │ │ └── User.java │ │ ├── email │ │ │ ├── DefaultEmailSender.java │ │ │ ├── FakeEmailSender.java │ │ │ └── MryEmailSender.java │ │ ├── event │ │ │ ├── DomainEvent.java │ │ │ ├── DomainEventJobs.java │ │ │ ├── DomainEventType.java │ │ │ ├── consume │ │ │ │ ├── AbstractDomainEventHandler.java │ │ │ │ ├── AbstractTransactionalDomainEventHandler.java │ │ │ │ ├── ConsumingDomainEvent.java │ │ │ │ ├── ConsumingDomainEventDao.java │ │ │ │ ├── DomainEventConsumer.java │ │ │ │ ├── DomainEventHandler.java │ │ │ │ └── infrastructure │ │ │ │ │ ├── MongoConsumingDomainEventDao.java │ │ │ │ │ └── RedisDomainEventConsumeConfiguration.java │ │ │ └── publish │ │ │ │ ├── DomainEventPublishStatus.java │ │ │ │ ├── DomainEventPublisher.java │ │ │ │ ├── DomainEventSender.java │ │ │ │ ├── PublishingDomainEvent.java │ │ │ │ ├── PublishingDomainEventDao.java │ │ │ │ └── infrastructure │ │ │ │ ├── MongoDomainEventPublishConfiguration.java │ │ │ │ ├── MongoPublishingDomainEventDao.java │ │ │ │ └── RedisDomainEventSender.java │ │ ├── exception │ │ │ ├── Error.java │ │ │ ├── ErrorCode.java │ │ │ ├── GlobalExceptionHandler.java │ │ │ ├── MryException.java │ │ │ ├── QErrorResponse.java │ │ │ └── RestErrorController.java │ │ ├── json │ │ │ └── JsonConfiguration.java │ │ ├── lock │ │ │ └── LockConfiguration.java │ │ ├── mongo │ │ │ ├── MongoBaseRepository.java │ │ │ └── MongoConfiguration.java │ │ ├── notification │ │ │ ├── FakeNotificationService.java │ │ │ ├── NotificationService.java │ │ │ ├── consume │ │ │ │ ├── NotificationEventConsumer.java │ │ │ │ ├── NotificationEventListener.java │ │ │ │ └── RedisNotificationContainerConfiguration.java │ │ │ ├── email │ │ │ │ └── EmailNotificationService.java │ │ │ ├── publish │ │ │ │ ├── AsynchronousNotificationEventPublisher.java │ │ │ │ ├── NotificationEventPublisher.java │ │ │ │ ├── RedisNotificationDomainEventSender.java │ │ │ │ └── SynchronousNotificationEventPublisher.java │ │ │ └── wx │ │ │ │ ├── Response.java │ │ │ │ ├── ValueItem.java │ │ │ │ ├── WxNotificationService.java │ │ │ │ └── WxTemplateMessage.java │ │ ├── oss │ │ │ ├── OssTokenController.java │ │ │ ├── command │ │ │ │ ├── OssTokenCommandService.java │ │ │ │ └── RequestOssTokenCommand.java │ │ │ └── domain │ │ │ │ ├── AliyunArmPolicy.java │ │ │ │ ├── AliyunOssTokenGenerator.java │ │ │ │ ├── OssTokenRequestType.java │ │ │ │ ├── QOssToken.java │ │ │ │ └── Statement.java │ │ ├── password │ │ │ ├── MryPasswordEncoder.java │ │ │ ├── PasswordConfiguration.java │ │ │ └── SpringMryPasswordEncoder.java │ │ ├── profile │ │ │ ├── CiProfile.java │ │ │ ├── NonCiProfile.java │ │ │ ├── NonProdProfile.java │ │ │ └── ProdProfile.java │ │ ├── properties │ │ │ ├── AliyunProperties.java │ │ │ ├── CommonProperties.java │ │ │ ├── JwtProperties.java │ │ │ ├── MryRedisProperties.java │ │ │ ├── PayProperties.java │ │ │ ├── PropertyService.java │ │ │ └── WxProperties.java │ │ ├── ratelimit │ │ │ ├── MryRateLimiter.java │ │ │ └── RedisRateLimiter.java │ │ ├── redis │ │ │ └── RedisConfiguration.java │ │ ├── restclient │ │ │ └── RestTemplateConfiguration.java │ │ ├── retry │ │ │ └── RetryConfiguration.java │ │ ├── scheduling │ │ │ └── SchedulingConfiguration.java │ │ ├── security │ │ │ ├── IpJwtCookieUpdater.java │ │ │ ├── MdcFilter.java │ │ │ ├── MryAccessDeniedHandler.java │ │ │ ├── MryAuthenticationEntryPoint.java │ │ │ ├── MryAuthenticationToken.java │ │ │ ├── apikey │ │ │ │ ├── ApiKeyAuthenticationProvider.java │ │ │ │ └── IntegrationWebSecurityConfiguration.java │ │ │ ├── jwt │ │ │ │ ├── AutoRefreshJwtFilter.java │ │ │ │ ├── JwtAnonymousAuthenticationFilter.java │ │ │ │ ├── JwtAuthenticationFilter.java │ │ │ │ ├── JwtAuthenticationProvider.java │ │ │ │ ├── JwtAuthenticationToken.java │ │ │ │ ├── JwtCookieFactory.java │ │ │ │ ├── JwtService.java │ │ │ │ └── JwtWebSecurityConfiguration.java │ │ │ └── wehook │ │ │ │ ├── WebhookAuthenticationProvider.java │ │ │ │ └── WebhookWebSecurityConfiguration.java │ │ ├── sms │ │ │ ├── AliyunSmsSender.java │ │ │ ├── FakeSmsSender.java │ │ │ └── MrySmsSender.java │ │ ├── startup │ │ │ ├── CacheClearer.java │ │ │ ├── MrySystemInitializer.java │ │ │ └── RedisStreamInitializer.java │ │ ├── taskexecutor │ │ │ └── TaskExecutorConfiguration.java │ │ ├── tracing │ │ │ └── MryTracingService.java │ │ ├── utils │ │ │ ├── Command.java │ │ │ ├── CommonUtils.java │ │ │ ├── EasyExcelResult.java │ │ │ ├── Identified.java │ │ │ ├── MapUtils.java │ │ │ ├── MathExpressionEvaluator.java │ │ │ ├── MongoCriteriaUtils.java │ │ │ ├── MryConstants.java │ │ │ ├── MryObjectMapper.java │ │ │ ├── MryRegexConstants.java │ │ │ ├── MryTaskRunner.java │ │ │ ├── PagedList.java │ │ │ ├── Pagination.java │ │ │ ├── Query.java │ │ │ ├── ReturnId.java │ │ │ ├── SnowflakeIdGenerator.java │ │ │ └── UuidGenerator.java │ │ ├── validation │ │ │ ├── ControllerPayloadValidationAspect.java │ │ │ ├── collection │ │ │ │ ├── NoBlankString.java │ │ │ │ ├── NoBlankStringValidator.java │ │ │ │ ├── NoDuplicatedString.java │ │ │ │ ├── NoDuplicatedStringValidator.java │ │ │ │ ├── NoNullElement.java │ │ │ │ └── NoNullElementValidator.java │ │ │ ├── color │ │ │ │ ├── Color.java │ │ │ │ └── ColorValidator.java │ │ │ ├── email │ │ │ │ ├── Email.java │ │ │ │ └── EmailValidator.java │ │ │ ├── id │ │ │ │ ├── app │ │ │ │ │ ├── AppId.java │ │ │ │ │ └── AppIdValidator.java │ │ │ │ ├── assignment │ │ │ │ │ ├── AssignmentId.java │ │ │ │ │ └── AssignmentIdValidator.java │ │ │ │ ├── assignmentplan │ │ │ │ │ ├── AssignmentPlanId.java │ │ │ │ │ └── AssignmentPlanIdValidator.java │ │ │ │ ├── attribute │ │ │ │ │ ├── AttributeId.java │ │ │ │ │ └── AttributeIdValidator.java │ │ │ │ ├── control │ │ │ │ │ ├── ControlId.java │ │ │ │ │ └── ControlIdValidator.java │ │ │ │ ├── custom │ │ │ │ │ ├── CustomId.java │ │ │ │ │ └── CustomIdValidator.java │ │ │ │ ├── department │ │ │ │ │ ├── DepartmentId.java │ │ │ │ │ └── DepartmentIdValidator.java │ │ │ │ ├── group │ │ │ │ │ ├── GroupId.java │ │ │ │ │ └── GroupIdValidator.java │ │ │ │ ├── member │ │ │ │ │ ├── MemberId.java │ │ │ │ │ └── MemberIdValidator.java │ │ │ │ ├── order │ │ │ │ │ ├── OrderId.java │ │ │ │ │ └── OrderIdValidator.java │ │ │ │ ├── page │ │ │ │ │ ├── AllablePageId.java │ │ │ │ │ ├── AllablePageIdValidator.java │ │ │ │ │ ├── PageId.java │ │ │ │ │ └── PageIdValidator.java │ │ │ │ ├── plate │ │ │ │ │ ├── PlateId.java │ │ │ │ │ └── PlateIdValidator.java │ │ │ │ ├── platebatch │ │ │ │ │ ├── PlateBatchId.java │ │ │ │ │ └── PlateBatchIdValidator.java │ │ │ │ ├── qr │ │ │ │ │ ├── QrId.java │ │ │ │ │ └── QrIdValidator.java │ │ │ │ ├── shoruuid │ │ │ │ │ ├── ShortUuid.java │ │ │ │ │ └── ShortUuidValidator.java │ │ │ │ ├── submission │ │ │ │ │ ├── SubmissionId.java │ │ │ │ │ └── SubmissionIdValidator.java │ │ │ │ └── tenant │ │ │ │ │ ├── TenantId.java │ │ │ │ │ └── TenantIdValidator.java │ │ │ ├── mobile │ │ │ │ ├── Mobile.java │ │ │ │ └── MobileNumberValidator.java │ │ │ ├── mobileoremail │ │ │ │ ├── MobileOrEmail.java │ │ │ │ └── MobileOrEmailValidator.java │ │ │ ├── nospace │ │ │ │ ├── NoSpace.java │ │ │ │ └── NoSpaceValidator.java │ │ │ ├── notfuture │ │ │ │ ├── NotFutureTime.java │ │ │ │ └── NotFutureTimeValidator.java │ │ │ ├── password │ │ │ │ ├── Password.java │ │ │ │ └── PasswordValidator.java │ │ │ ├── platetemplateld │ │ │ │ ├── PlateTemplateId.java │ │ │ │ └── PlateTemplateIdValidator.java │ │ │ ├── url │ │ │ │ ├── http │ │ │ │ │ ├── HttpUrl.java │ │ │ │ │ └── HttpUrlValidator.java │ │ │ │ └── webhook │ │ │ │ │ ├── WebhookUrl.java │ │ │ │ │ └── WebhookUrlValidator.java │ │ │ └── verficationcode │ │ │ │ ├── VerificationCode.java │ │ │ │ └── VerificationCodeValidator.java │ │ ├── webhook │ │ │ ├── WebhookPayload.java │ │ │ ├── WebhookPayloadType.java │ │ │ ├── consume │ │ │ │ ├── RedisWebhookContainerConfiguration.java │ │ │ │ ├── WebhookCallService.java │ │ │ │ ├── WebhookCaller.java │ │ │ │ ├── WebhookEventConsumer.java │ │ │ │ └── WebhookEventListener.java │ │ │ ├── publish │ │ │ │ ├── AsynchronousWebhookEventPublisher.java │ │ │ │ ├── MryWebhookEventPublisher.java │ │ │ │ ├── RedisWebhookEventSender.java │ │ │ │ └── SynchronousWebhookEventPublisher.java │ │ │ ├── qr │ │ │ │ ├── BaseQrWebhookPayload.java │ │ │ │ ├── QrCreatedWebhookPayload.java │ │ │ │ ├── QrDeletedWebhookPayload.java │ │ │ │ └── QrUpdatedWebhookPayload.java │ │ │ └── submission │ │ │ │ ├── BaseSubmissionWebhookPayload.java │ │ │ │ ├── SubmissionApprovedWebhookPayload.java │ │ │ │ ├── SubmissionCreatedWebhookPayload.java │ │ │ │ ├── SubmissionDeletedWebhookPayload.java │ │ │ │ └── SubmissionUpdatedWebhookPayload.java │ │ └── wx │ │ │ ├── WxController.java │ │ │ ├── accesstoken │ │ │ └── WxAccessTokenService.java │ │ │ ├── auth │ │ │ ├── mobile │ │ │ │ ├── DefaultMobileWxAuthService.java │ │ │ │ ├── MobileWxAuthAccessTokenInfo.java │ │ │ │ ├── MobileWxAuthService.java │ │ │ │ └── MobileWxAuthUserInfo.java │ │ │ └── pc │ │ │ │ ├── DefaultPcWxAuthService.java │ │ │ │ ├── PcWxAuthAccessTokenInfo.java │ │ │ │ ├── PcWxAuthService.java │ │ │ │ └── PcWxAuthUserInfo.java │ │ │ ├── jssdk │ │ │ ├── FetchWxJsSdkConfigQuery.java │ │ │ ├── QJsSdkConfig.java │ │ │ └── WxJsSdkService.java │ │ │ └── pay │ │ │ ├── DefaultWxPayService.java │ │ │ ├── FakeWxPayService.java │ │ │ ├── WxOrderRequest.java │ │ │ ├── WxPayService.java │ │ │ └── notify │ │ │ ├── WxNotifyResult.java │ │ │ ├── WxPayNotifyController.java │ │ │ └── WxPayNotifyRequest.java │ │ ├── core │ │ ├── app │ │ │ ├── AppController.java │ │ │ ├── command │ │ │ │ ├── AppCommandService.java │ │ │ │ ├── CopyAppCommand.java │ │ │ │ ├── CreateAppCommand.java │ │ │ │ ├── CreateAppResponse.java │ │ │ │ ├── RenameAppCommand.java │ │ │ │ ├── SetAppManagersCommand.java │ │ │ │ ├── UpdateAppReportSettingCommand.java │ │ │ │ ├── UpdateAppResponse.java │ │ │ │ ├── UpdateAppSettingCommand.java │ │ │ │ └── UpdateAppWebhookSettingCommand.java │ │ │ ├── domain │ │ │ │ ├── App.java │ │ │ │ ├── AppDomainService.java │ │ │ │ ├── AppFactory.java │ │ │ │ ├── AppHeaderImageProvider.java │ │ │ │ ├── AppRepository.java │ │ │ │ ├── AppSetting.java │ │ │ │ ├── AppSettingContext.java │ │ │ │ ├── AppTopBar.java │ │ │ │ ├── CreateAppResult.java │ │ │ │ ├── QrWebhookType.java │ │ │ │ ├── TenantCachedApp.java │ │ │ │ ├── TenantCachedApps.java │ │ │ │ ├── UpdateAppSettingResult.java │ │ │ │ ├── WebhookSetting.java │ │ │ │ ├── attribute │ │ │ │ │ ├── Attribute.java │ │ │ │ │ ├── AttributeAware.java │ │ │ │ │ ├── AttributeCheckChangeResult.java │ │ │ │ │ ├── AttributeInfo.java │ │ │ │ │ ├── AttributeStatisticRange.java │ │ │ │ │ └── AttributeType.java │ │ │ │ ├── circulation │ │ │ │ │ ├── CirculationStatusSetting.java │ │ │ │ │ ├── StatusAfterSubmission.java │ │ │ │ │ └── StatusPermission.java │ │ │ │ ├── config │ │ │ │ │ ├── AppConfig.java │ │ │ │ │ └── AppLandingPageType.java │ │ │ │ ├── event │ │ │ │ │ ├── AppAttributesCreatedEvent.java │ │ │ │ │ ├── AppAttributesDeletedEvent.java │ │ │ │ │ ├── AppAwareDomainEvent.java │ │ │ │ │ ├── AppControlOptionsDeletedEvent.java │ │ │ │ │ ├── AppControlsDeletedEvent.java │ │ │ │ │ ├── AppCreatedEvent.java │ │ │ │ │ ├── AppCreatedFromTemplateEvent.java │ │ │ │ │ ├── AppDeletedEvent.java │ │ │ │ │ ├── AppGroupSyncEnabledEvent.java │ │ │ │ │ ├── AppPageChangedToSubmitPerInstanceEvent.java │ │ │ │ │ ├── AppPageChangedToSubmitPerMemberEvent.java │ │ │ │ │ ├── AppPagesDeletedEvent.java │ │ │ │ │ ├── DeletedAttributeInfo.java │ │ │ │ │ ├── DeletedControlInfo.java │ │ │ │ │ └── DeletedTextOptionInfo.java │ │ │ │ ├── operationmenu │ │ │ │ │ ├── OperationMenuItem.java │ │ │ │ │ └── SubmissionListType.java │ │ │ │ ├── page │ │ │ │ │ ├── Page.java │ │ │ │ │ ├── PageAware.java │ │ │ │ │ ├── PageInfo.java │ │ │ │ │ ├── control │ │ │ │ │ │ ├── AbstractTextOptionControl.java │ │ │ │ │ │ ├── AnswerUniqueType.java │ │ │ │ │ │ ├── AutoCalculateAliasContext.java │ │ │ │ │ │ ├── Control.java │ │ │ │ │ │ ├── ControlAware.java │ │ │ │ │ │ ├── ControlFillableSetting.java │ │ │ │ │ │ ├── ControlInfo.java │ │ │ │ │ │ ├── ControlNameSetting.java │ │ │ │ │ │ ├── ControlStyleSetting.java │ │ │ │ │ │ ├── ControlType.java │ │ │ │ │ │ ├── FAddressControl.java │ │ │ │ │ │ ├── FCheckboxControl.java │ │ │ │ │ │ ├── FDateControl.java │ │ │ │ │ │ ├── FDropdownControl.java │ │ │ │ │ │ ├── FEmailControl.java │ │ │ │ │ │ ├── FFileUploadControl.java │ │ │ │ │ │ ├── FGeolocationControl.java │ │ │ │ │ │ ├── FIdentifierControl.java │ │ │ │ │ │ ├── FImageUploadControl.java │ │ │ │ │ │ ├── FItemCountControl.java │ │ │ │ │ │ ├── FItemStatusControl.java │ │ │ │ │ │ ├── FMemberSelectControl.java │ │ │ │ │ │ ├── FMobileNumberControl.java │ │ │ │ │ │ ├── FMultiLevelSelectionControl.java │ │ │ │ │ │ ├── FMultiLineTextControl.java │ │ │ │ │ │ ├── FNumberInputControl.java │ │ │ │ │ │ ├── FNumberRankingControl.java │ │ │ │ │ │ ├── FPersonNameControl.java │ │ │ │ │ │ ├── FPointCheckControl.java │ │ │ │ │ │ ├── FRadioControl.java │ │ │ │ │ │ ├── FRichTextInputControl.java │ │ │ │ │ │ ├── FSignatureControl.java │ │ │ │ │ │ ├── FSingleLineTextControl.java │ │ │ │ │ │ ├── FTimeControl.java │ │ │ │ │ │ ├── FileCategory.java │ │ │ │ │ │ ├── FileCompressType.java │ │ │ │ │ │ ├── IdentifierFormatType.java │ │ │ │ │ │ ├── MultiLevelOption.java │ │ │ │ │ │ ├── MultiLevelSelectionPrecisionType.java │ │ │ │ │ │ ├── PAnswerReferenceControl.java │ │ │ │ │ │ ├── PAttachmentViewControl.java │ │ │ │ │ │ ├── PAttributeDashboardControl.java │ │ │ │ │ │ ├── PAttributeTableControl.java │ │ │ │ │ │ ├── PBarControl.java │ │ │ │ │ │ ├── PButtonPageLinkControl.java │ │ │ │ │ │ ├── PDoughnutControl.java │ │ │ │ │ │ ├── PIconPageLinkControl.java │ │ │ │ │ │ ├── PImageCardLinkControl.java │ │ │ │ │ │ ├── PImageViewControl.java │ │ │ │ │ │ ├── PInstanceListControl.java │ │ │ │ │ │ ├── PNumberRangeSegmentControl.java │ │ │ │ │ │ ├── PParagraphControl.java │ │ │ │ │ │ ├── PPieControl.java │ │ │ │ │ │ ├── PRichTextControl.java │ │ │ │ │ │ ├── PSectionTitleViewControl.java │ │ │ │ │ │ ├── PSeparatorControl.java │ │ │ │ │ │ ├── PSubmissionReferenceControl.java │ │ │ │ │ │ ├── PSubmitHistoryControl.java │ │ │ │ │ │ ├── PTimeSegmentControl.java │ │ │ │ │ │ ├── PTrendControl.java │ │ │ │ │ │ ├── PVideoViewControl.java │ │ │ │ │ │ ├── TextOptionInfo.java │ │ │ │ │ │ └── TrendItem.java │ │ │ │ │ ├── header │ │ │ │ │ │ ├── PageHeader.java │ │ │ │ │ │ └── PageHeaderType.java │ │ │ │ │ ├── menu │ │ │ │ │ │ └── Menu.java │ │ │ │ │ ├── setting │ │ │ │ │ │ ├── AfterSubmitBehaviour.java │ │ │ │ │ │ ├── AfterSubmitNavigationType.java │ │ │ │ │ │ ├── ApprovalSetting.java │ │ │ │ │ │ ├── PageSetting.java │ │ │ │ │ │ ├── SubmissionWebhookType.java │ │ │ │ │ │ ├── SubmitType.java │ │ │ │ │ │ ├── SubmitterUpdateRange.java │ │ │ │ │ │ └── notification │ │ │ │ │ │ │ ├── NotificationRole.java │ │ │ │ │ │ │ └── NotificationSetting.java │ │ │ │ │ ├── submitbutton │ │ │ │ │ │ └── SubmitButton.java │ │ │ │ │ └── title │ │ │ │ │ │ └── PageTitle.java │ │ │ │ ├── plate │ │ │ │ │ ├── PlateConfig.java │ │ │ │ │ ├── PlateNamedTextValue.java │ │ │ │ │ ├── PlateQrImageSetting.java │ │ │ │ │ ├── PlateQrPropertyType.java │ │ │ │ │ ├── PlateSetting.java │ │ │ │ │ ├── PlateSize.java │ │ │ │ │ ├── PlateTextValue.java │ │ │ │ │ ├── PlateTextValueType.java │ │ │ │ │ └── control │ │ │ │ │ │ ├── HeaderImageControl.java │ │ │ │ │ │ ├── KeyValueControl.java │ │ │ │ │ │ ├── PlateControl.java │ │ │ │ │ │ ├── PlateControlType.java │ │ │ │ │ │ ├── QrImageControl.java │ │ │ │ │ │ ├── SingleRowTextControl.java │ │ │ │ │ │ └── TableControl.java │ │ │ │ ├── report │ │ │ │ │ ├── ReportSetting.java │ │ │ │ │ ├── chart │ │ │ │ │ │ ├── ChartReport.java │ │ │ │ │ │ ├── ChartReportConfiguration.java │ │ │ │ │ │ ├── ChartReportSetting.java │ │ │ │ │ │ ├── ChartReportType.java │ │ │ │ │ │ ├── attribute │ │ │ │ │ │ │ ├── AttributeBarReport.java │ │ │ │ │ │ │ ├── AttributeDoughnutReport.java │ │ │ │ │ │ │ ├── AttributeNumberRangeSegmentReport.java │ │ │ │ │ │ │ ├── AttributePieReport.java │ │ │ │ │ │ │ ├── AttributeTimeSegmentReport.java │ │ │ │ │ │ │ └── setting │ │ │ │ │ │ │ │ ├── AttributeCategorizedReportSetting.java │ │ │ │ │ │ │ │ ├── AttributeNumberRangeSegmentReportSetting.java │ │ │ │ │ │ │ │ └── AttributeTimeSegmentReportSetting.java │ │ │ │ │ │ ├── control │ │ │ │ │ │ │ ├── ControlBarReport.java │ │ │ │ │ │ │ ├── ControlDoughnutReport.java │ │ │ │ │ │ │ ├── ControlNumberRangeSegmentReport.java │ │ │ │ │ │ │ ├── ControlPieReport.java │ │ │ │ │ │ │ ├── ControlTimeSegmentReport.java │ │ │ │ │ │ │ └── setting │ │ │ │ │ │ │ │ ├── ControlCategorizedReportSetting.java │ │ │ │ │ │ │ │ ├── ControlNumberRangeSegmentReportSetting.java │ │ │ │ │ │ │ │ └── ControlTimeSegmentReportSetting.java │ │ │ │ │ │ └── style │ │ │ │ │ │ │ ├── BarReportStyle.java │ │ │ │ │ │ │ ├── DoughnutReportStyle.java │ │ │ │ │ │ │ ├── NumberRangeSegmentReportStyle.java │ │ │ │ │ │ │ ├── PieReportStyle.java │ │ │ │ │ │ │ └── TimeSegmentReportStyle.java │ │ │ │ │ └── number │ │ │ │ │ │ ├── NumberReport.java │ │ │ │ │ │ ├── NumberReportConfiguration.java │ │ │ │ │ │ ├── NumberReportSetting.java │ │ │ │ │ │ ├── NumberReportType.java │ │ │ │ │ │ ├── attribute │ │ │ │ │ │ └── AttributeNumberReport.java │ │ │ │ │ │ ├── control │ │ │ │ │ │ └── ControlNumberReport.java │ │ │ │ │ │ ├── instance │ │ │ │ │ │ ├── InstanceNumberReport.java │ │ │ │ │ │ └── InstanceNumberReportType.java │ │ │ │ │ │ └── page │ │ │ │ │ │ ├── PageNumberReport.java │ │ │ │ │ │ └── PageNumberReportType.java │ │ │ │ ├── task │ │ │ │ │ └── RemoveManagerFromAllAppsTask.java │ │ │ │ └── ui │ │ │ │ │ ├── AppearanceStyle.java │ │ │ │ │ ├── BoxedTextStyle.java │ │ │ │ │ ├── ButtonStyle.java │ │ │ │ │ ├── FontStyle.java │ │ │ │ │ ├── ImageCropType.java │ │ │ │ │ ├── MarkdownStyle.java │ │ │ │ │ ├── MinMaxSetting.java │ │ │ │ │ ├── VerticalPosition.java │ │ │ │ │ ├── align │ │ │ │ │ ├── HorizontalAlignType.java │ │ │ │ │ ├── HorizontalPositionType.java │ │ │ │ │ └── VerticalAlignType.java │ │ │ │ │ ├── border │ │ │ │ │ ├── Border.java │ │ │ │ │ ├── BorderSide.java │ │ │ │ │ └── BorderType.java │ │ │ │ │ ├── borderradius │ │ │ │ │ └── BorderRadius.java │ │ │ │ │ ├── pagelink │ │ │ │ │ ├── PageLink.java │ │ │ │ │ └── PageLinkType.java │ │ │ │ │ └── shadow │ │ │ │ │ └── Shadow.java │ │ │ ├── eventhandler │ │ │ │ ├── AppAttributesCreatedEventHandler.java │ │ │ │ ├── AppAttributesDeletedEventHandler.java │ │ │ │ ├── AppControlOptionsDeletedEventHandler.java │ │ │ │ ├── AppControlsDeletedEventHandler.java │ │ │ │ ├── AppCreatedEventHandler.java │ │ │ │ ├── AppCreatedFromTemplateEventHandler.java │ │ │ │ ├── AppDeletedEventHandler.java │ │ │ │ ├── AppPagesDeletedEventHandler.java │ │ │ │ ├── GroupSyncEnabledEventHandler.java │ │ │ │ ├── PageChangedToSubmitPerInstanceEventHandler.java │ │ │ │ └── PageChangedToSubmitPerMemberEventHandler.java │ │ │ ├── infrastructure │ │ │ │ ├── MongoAppRepository.java │ │ │ │ └── MongoCachedAppRepository.java │ │ │ └── query │ │ │ │ ├── AppQueryService.java │ │ │ │ ├── ListMyManagedAppsQuery.java │ │ │ │ ├── QAppFirstQr.java │ │ │ │ ├── QAppResourceUsages.java │ │ │ │ ├── QAppWebhookSetting.java │ │ │ │ ├── QManagedListApp.java │ │ │ │ ├── QOperationalApp.java │ │ │ │ ├── QUpdatableApp.java │ │ │ │ └── QViewableListApp.java │ │ ├── appmanual │ │ │ ├── AppManualController.java │ │ │ ├── command │ │ │ │ ├── AppManualCommandService.java │ │ │ │ └── UpdateAppManualCommand.java │ │ │ ├── domain │ │ │ │ ├── AppManual.java │ │ │ │ ├── AppManualFactory.java │ │ │ │ ├── AppManualRepository.java │ │ │ │ └── task │ │ │ │ │ ├── CloneAppManualTask.java │ │ │ │ │ └── RemoveManualForAppTask.java │ │ │ ├── infrastructure │ │ │ │ └── MongoAppManualRepository.java │ │ │ └── query │ │ │ │ ├── AppManualQueryService.java │ │ │ │ └── QAppManual.java │ │ ├── apptemplate │ │ │ ├── AppTemplateController.java │ │ │ ├── domain │ │ │ │ └── task │ │ │ │ │ └── CountAppTemplateAppliedTask.java │ │ │ └── query │ │ │ │ ├── AppTemplateQueryService.java │ │ │ │ ├── ListAppTemplateQuery.java │ │ │ │ ├── QAppTemplateDemoQr.java │ │ │ │ ├── QDetailedAppTemplate.java │ │ │ │ └── QListAppTemplate.java │ │ ├── assignment │ │ │ ├── AssignmentController.java │ │ │ ├── command │ │ │ │ ├── AssignmentCommandService.java │ │ │ │ └── SetAssignmentOperatorsCommand.java │ │ │ ├── domain │ │ │ │ ├── Assignment.java │ │ │ │ ├── AssignmentFactory.java │ │ │ │ ├── AssignmentFinishedQr.java │ │ │ │ ├── AssignmentRepository.java │ │ │ │ ├── AssignmentStatus.java │ │ │ │ ├── OpenAssignmentPages.java │ │ │ │ └── task │ │ │ │ │ ├── FinishQrForAssignmentsTask.java │ │ │ │ │ ├── RemoveAllAssignmentsForPageTask.java │ │ │ │ │ ├── RemoveAllAssignmentsUnderAppTask.java │ │ │ │ │ ├── RemoveAllAssignmentsUnderAssignmentPlanTask.java │ │ │ │ │ ├── RemoveAllAssignmentsUnderGroupTask.java │ │ │ │ │ └── RemoveOperatorFromAllAssignmentsTask.java │ │ │ ├── event │ │ │ │ └── AssignmentCreatedEvent.java │ │ │ ├── eventhandler │ │ │ │ └── AssignmentCreatedEventNotificationPublishHandler.java │ │ │ ├── infrastructure │ │ │ │ ├── MongoAssignmentRepository.java │ │ │ │ └── MongoCachedAssignmentRepository.java │ │ │ ├── job │ │ │ │ ├── CreateAssignmentsJob.java │ │ │ │ ├── ExpireAssignmentsJob.java │ │ │ │ └── NearExpireAssignmentsJob.java │ │ │ └── query │ │ │ │ ├── AssignmentQueryService.java │ │ │ │ ├── ListAssignmentQrsQuery.java │ │ │ │ ├── ListMyAssignmentsQuery.java │ │ │ │ ├── ListMyManagedAssignmentsQuery.java │ │ │ │ ├── QAssignmentDetail.java │ │ │ │ ├── QAssignmentListQr.java │ │ │ │ ├── QAssignmentQrDetail.java │ │ │ │ └── QListAssignment.java │ │ ├── assignmentplan │ │ │ ├── AssignmentPlanController.java │ │ │ ├── command │ │ │ │ ├── AssignmentPlanCommandService.java │ │ │ │ ├── CreateAssignmentPlanCommand.java │ │ │ │ ├── ExcludeGroupsCommand.java │ │ │ │ ├── SetGroupOperatorsCommand.java │ │ │ │ └── UpdateAssignmentPlanSettingCommand.java │ │ │ ├── domain │ │ │ │ ├── AssignmentFrequency.java │ │ │ │ ├── AssignmentPlan.java │ │ │ │ ├── AssignmentPlanFactory.java │ │ │ │ ├── AssignmentPlanRepository.java │ │ │ │ ├── AssignmentSetting.java │ │ │ │ ├── DateTime.java │ │ │ │ ├── event │ │ │ │ │ └── AssignmentPlanDeletedEvent.java │ │ │ │ └── task │ │ │ │ │ ├── RemoveAllAssignmentPlansForPageTask.java │ │ │ │ │ ├── RemoveAllAssignmentPlansUnderAppTask.java │ │ │ │ │ ├── RemoveGroupFromAllAssignmentPlansTask.java │ │ │ │ │ └── RemoveOperatorFromAllAssignmentPlansTask.java │ │ │ ├── eventhandler │ │ │ │ └── AssignmentPlanDeletedEventHandler.java │ │ │ ├── infrastructure │ │ │ │ └── MongoAssignmentPlanRepository.java │ │ │ └── query │ │ │ │ ├── AssignmentPlanQueryService.java │ │ │ │ ├── QAssignmentPlan.java │ │ │ │ └── QAssignmentPlanSummary.java │ │ ├── department │ │ │ ├── DepartmentController.java │ │ │ ├── command │ │ │ │ ├── CreateDepartmentCommand.java │ │ │ │ ├── DepartmentCommandService.java │ │ │ │ └── RenameDepartmentCommand.java │ │ │ ├── domain │ │ │ │ ├── Department.java │ │ │ │ ├── DepartmentDomainService.java │ │ │ │ ├── DepartmentFactory.java │ │ │ │ ├── DepartmentRepository.java │ │ │ │ ├── TenantCachedDepartment.java │ │ │ │ ├── TenantCachedDepartments.java │ │ │ │ ├── event │ │ │ │ │ ├── DepartmentCreatedEvent.java │ │ │ │ │ ├── DepartmentDeletedEvent.java │ │ │ │ │ ├── DepartmentManagersChangedEvent.java │ │ │ │ │ └── DepartmentRenamedEvent.java │ │ │ │ └── task │ │ │ │ │ ├── CountDepartmentForTenantTask.java │ │ │ │ │ ├── DeltaCountDepartmentForTenantTask.java │ │ │ │ │ └── RemoveManagerFromAllDepartmentsTask.java │ │ │ ├── eventhandler │ │ │ │ ├── DepartmentCreatedEventHandler.java │ │ │ │ ├── DepartmentDeletedEventHandler.java │ │ │ │ ├── DepartmentManagersChangedEventHandler.java │ │ │ │ └── DepartmentRenamedEventHandler.java │ │ │ └── infrastructure │ │ │ │ ├── MongoCachedDepartmentRepository.java │ │ │ │ └── MongoDepartmentRepository.java │ │ ├── departmenthierarchy │ │ │ ├── DepartmentHierarchyController.java │ │ │ ├── command │ │ │ │ ├── DepartmentHierarchyCommandService.java │ │ │ │ └── UpdateDepartmentHierarchyCommand.java │ │ │ ├── domain │ │ │ │ ├── DepartmentHierarchy.java │ │ │ │ ├── DepartmentHierarchyDomainService.java │ │ │ │ ├── DepartmentHierarchyRepository.java │ │ │ │ └── event │ │ │ │ │ └── DepartmentHierarchyChangedEvent.java │ │ │ ├── eventhandler │ │ │ │ └── DepartmentHierarchyChangedEventHandler.java │ │ │ ├── infrastructure │ │ │ │ ├── MongoCachedDepartmentHierarchyRepository.java │ │ │ │ └── MongoDepartmentHierarchyRepository.java │ │ │ └── query │ │ │ │ ├── DepartmentHierarchyQueryService.java │ │ │ │ └── QDepartmentHierarchy.java │ │ ├── group │ │ │ ├── GroupController.java │ │ │ ├── command │ │ │ │ ├── AddGroupManagersCommand.java │ │ │ │ ├── AddGroupMembersCommand.java │ │ │ │ ├── CreateGroupCommand.java │ │ │ │ ├── GroupCommandService.java │ │ │ │ └── RenameGroupCommand.java │ │ │ ├── domain │ │ │ │ ├── AppCachedGroup.java │ │ │ │ ├── AppCachedGroups.java │ │ │ │ ├── Group.java │ │ │ │ ├── GroupAware.java │ │ │ │ ├── GroupDomainService.java │ │ │ │ ├── GroupFactory.java │ │ │ │ ├── GroupRepository.java │ │ │ │ ├── event │ │ │ │ │ ├── GroupActivatedEvent.java │ │ │ │ │ ├── GroupCreatedEvent.java │ │ │ │ │ ├── GroupDeactivatedEvent.java │ │ │ │ │ ├── GroupDeletedEvent.java │ │ │ │ │ └── GroupManagersChangedEvent.java │ │ │ │ └── task │ │ │ │ │ ├── CountGroupForAppTask.java │ │ │ │ │ ├── DeltaCountGroupForAppTask.java │ │ │ │ │ ├── RemoveAllGroupsForAppTask.java │ │ │ │ │ ├── RemoveMemberFromAllGroupsTask.java │ │ │ │ │ ├── SyncAllDepartmentsToGroupTask.java │ │ │ │ │ ├── SyncDepartmentMembersToGroupTask.java │ │ │ │ │ └── SyncDepartmentToGroupTask.java │ │ │ ├── eventhandler │ │ │ │ ├── GroupActivatedEventHandler.java │ │ │ │ ├── GroupCreatedEventHandler.java │ │ │ │ ├── GroupDeactivatedEventHandler.java │ │ │ │ ├── GroupDeletedEventHandler.java │ │ │ │ └── GroupManagersChangedEventHandler.java │ │ │ ├── infrastructure │ │ │ │ ├── MongoCachedGroupRepository.java │ │ │ │ └── MongoGroupRepository.java │ │ │ └── query │ │ │ │ ├── GroupQueryService.java │ │ │ │ ├── ListGroupQrsQuery.java │ │ │ │ ├── QGroupMembers.java │ │ │ │ └── QGroupQr.java │ │ ├── grouphierarchy │ │ │ ├── GroupHierarchyController.java │ │ │ ├── command │ │ │ │ ├── GroupHierarchyCommandService.java │ │ │ │ └── UpdateGroupHierarchyCommand.java │ │ │ ├── domain │ │ │ │ ├── GroupHierarchy.java │ │ │ │ ├── GroupHierarchyDomainService.java │ │ │ │ ├── GroupHierarchyRepository.java │ │ │ │ └── task │ │ │ │ │ └── RemoveGroupHierarchyForAppTask.java │ │ │ ├── infrastructure │ │ │ │ ├── MongoCachedGroupHierarchyRepository.java │ │ │ │ └── MongoGroupHierarchyRepository.java │ │ │ └── query │ │ │ │ ├── GroupHierarchyQueryService.java │ │ │ │ └── QGroupHierarchy.java │ │ ├── kanban │ │ │ ├── KanbanController.java │ │ │ └── query │ │ │ │ ├── FetchKanbanQuery.java │ │ │ │ ├── KanbanQueryService.java │ │ │ │ ├── QAttributeKanban.java │ │ │ │ └── QAttributeOptionCount.java │ │ ├── login │ │ │ ├── LoginController.java │ │ │ ├── MobileWxOAuth2LoginController.java │ │ │ ├── PcWxOAuth2LoginController.java │ │ │ ├── command │ │ │ │ ├── ApiKeyLoginCommand.java │ │ │ │ ├── JwtTokenResponse.java │ │ │ │ ├── LoginCommandService.java │ │ │ │ ├── MobileOrEmailLoginCommand.java │ │ │ │ └── VerificationCodeLoginCommand.java │ │ │ └── domain │ │ │ │ ├── LoginDomainService.java │ │ │ │ ├── WxIdInfo.java │ │ │ │ └── WxJwtService.java │ │ ├── member │ │ │ ├── MemberController.java │ │ │ ├── command │ │ │ │ ├── ChangeMyMobileCommand.java │ │ │ │ ├── ChangeMyPasswordCommand.java │ │ │ │ ├── CreateMemberCommand.java │ │ │ │ ├── FindbackPasswordCommand.java │ │ │ │ ├── IdentifyMyMobileCommand.java │ │ │ │ ├── MemberCommandService.java │ │ │ │ ├── ResetMemberPasswordCommand.java │ │ │ │ ├── UpdateMemberInfoCommand.java │ │ │ │ ├── UpdateMemberRoleCommand.java │ │ │ │ ├── UpdateMyAvatarCommand.java │ │ │ │ ├── UpdateMyBaseSettingCommand.java │ │ │ │ └── importmember │ │ │ │ │ ├── MemberImportParser.java │ │ │ │ │ ├── MemberImportRecord.java │ │ │ │ │ ├── MemberImportResponse.java │ │ │ │ │ ├── MemberImportSaver.java │ │ │ │ │ └── MemberImporter.java │ │ │ ├── domain │ │ │ │ ├── IdentityCard.java │ │ │ │ ├── Member.java │ │ │ │ ├── MemberAware.java │ │ │ │ ├── MemberDomainService.java │ │ │ │ ├── MemberFactory.java │ │ │ │ ├── MemberReference.java │ │ │ │ ├── MemberRepository.java │ │ │ │ ├── TenantCachedMember.java │ │ │ │ ├── TenantCachedMembers.java │ │ │ │ ├── event │ │ │ │ │ ├── MemberAddedToDepartmentEvent.java │ │ │ │ │ ├── MemberCreatedEvent.java │ │ │ │ │ ├── MemberDeletedEvent.java │ │ │ │ │ ├── MemberDepartmentsChangedEvent.java │ │ │ │ │ ├── MemberNameChangedEvent.java │ │ │ │ │ └── MemberRemovedFromDepartmentEvent.java │ │ │ │ └── task │ │ │ │ │ ├── RemoveDepartmentFromAllMembersTask.java │ │ │ │ │ ├── SyncMemberNameToAggregateRootsTask.java │ │ │ │ │ └── SyncTenantActiveStatusToMembersTask.java │ │ │ ├── eventhandler │ │ │ │ ├── MemberAddedToDepartmentEventHandler.java │ │ │ │ ├── MemberCreatedEventHandler.java │ │ │ │ ├── MemberDeletedEventHandler.java │ │ │ │ ├── MemberDepartmentsChangedEventHandler.java │ │ │ │ ├── MemberNameChangedEventHandler.java │ │ │ │ └── MemberRemovedFromDepartmentEventHandler.java │ │ │ ├── infrastructure │ │ │ │ ├── MongoCachedMemberRepository.java │ │ │ │ └── MongoMemberRepository.java │ │ │ └── query │ │ │ │ ├── ListMyManagedMembersQuery.java │ │ │ │ ├── MemberQueryService.java │ │ │ │ ├── QListMember.java │ │ │ │ ├── QMemberBaseSetting.java │ │ │ │ ├── QMemberInfo.java │ │ │ │ ├── QMemberReference.java │ │ │ │ └── profile │ │ │ │ ├── MemberProfileQueryService.java │ │ │ │ ├── QClientMemberProfile.java │ │ │ │ └── QConsoleMemberProfile.java │ │ ├── order │ │ │ ├── OrderController.java │ │ │ ├── command │ │ │ │ ├── CreateOrderCommand.java │ │ │ │ ├── CreateOrderResponse.java │ │ │ │ ├── OrderCommandService.java │ │ │ │ └── RequestInvoiceCommand.java │ │ │ ├── domain │ │ │ │ ├── Order.java │ │ │ │ ├── OrderFactory.java │ │ │ │ ├── OrderPrice.java │ │ │ │ ├── OrderRepository.java │ │ │ │ ├── OrderStatus.java │ │ │ │ ├── PaymentType.java │ │ │ │ ├── delivery │ │ │ │ │ ├── Carrier.java │ │ │ │ │ ├── Consignee.java │ │ │ │ │ └── Delivery.java │ │ │ │ ├── detail │ │ │ │ │ ├── ExtraMemberOrderDetail.java │ │ │ │ │ ├── ExtraSmsAmountType.java │ │ │ │ │ ├── ExtraSmsOrderDetail.java │ │ │ │ │ ├── ExtraStorageOrderDetail.java │ │ │ │ │ ├── ExtraVideoTrafficOrderDetail.java │ │ │ │ │ ├── OrderDetail.java │ │ │ │ │ ├── OrderDetailType.java │ │ │ │ │ ├── PlanOrderDetail.java │ │ │ │ │ └── PlatePrintingOrderDetail.java │ │ │ │ ├── event │ │ │ │ │ ├── OrderBankTransferUpdatedEvent.java │ │ │ │ │ ├── OrderCreatedEvent.java │ │ │ │ │ ├── OrderDeliveryUpdatedEvent.java │ │ │ │ │ ├── OrderInvoiceIssuedEvent.java │ │ │ │ │ ├── OrderInvoiceRequestedEvent.java │ │ │ │ │ ├── OrderRefundUpdatedEvent.java │ │ │ │ │ ├── OrderUpdatedEvent.java │ │ │ │ │ ├── OrderWxPayUpdatedEvent.java │ │ │ │ │ └── OrderWxTransferUpdatedEvent.java │ │ │ │ ├── invoice │ │ │ │ │ ├── Invoice.java │ │ │ │ │ └── InvoiceType.java │ │ │ │ └── task │ │ │ │ │ └── SyncOrderToManagedQrTask.java │ │ │ ├── eventhandler │ │ │ │ ├── OrderCreatedEventHandler.java │ │ │ │ ├── OrderInvoiceIssuedEventHandler.java │ │ │ │ └── OrderUpdatedEventHandler.java │ │ │ ├── infrastructure │ │ │ │ └── MongoOrderRepository.java │ │ │ └── query │ │ │ │ ├── ListOrdersQuery.java │ │ │ │ ├── OrderQueryService.java │ │ │ │ ├── QDetailedOrder.java │ │ │ │ ├── QListOrder.java │ │ │ │ ├── QOrderShipment.java │ │ │ │ ├── QPriceQuotation.java │ │ │ │ ├── QuotePriceQuery.java │ │ │ │ └── ShipmentNode.java │ │ ├── plan │ │ │ ├── PlanController.java │ │ │ ├── domain │ │ │ │ ├── Plan.java │ │ │ │ └── PlanType.java │ │ │ └── query │ │ │ │ ├── PlanQueryService.java │ │ │ │ ├── QEnabledFeature.java │ │ │ │ └── QListPlan.java │ │ ├── plate │ │ │ ├── domain │ │ │ │ ├── Plate.java │ │ │ │ ├── PlateRepository.java │ │ │ │ ├── event │ │ │ │ │ ├── PlateBoundEvent.java │ │ │ │ │ └── PlateUnboundEvent.java │ │ │ │ └── task │ │ │ │ │ ├── CountPlateForTenantTask.java │ │ │ │ │ ├── DeltaCountPlateForTenantTask.java │ │ │ │ │ ├── RemoveAllPlatesUnderAppTask.java │ │ │ │ │ ├── SyncPlateGroupFromQrTask.java │ │ │ │ │ ├── UnbindAllPlatesUnderGroupTask.java │ │ │ │ │ ├── UnbindPlateFromQrTask.java │ │ │ │ │ └── UnsetAllPlatesFromPlateBatchTask.java │ │ │ ├── eventhandler │ │ │ │ ├── PlateBoundEventHandler.java │ │ │ │ └── PlateUnboundEventHandler.java │ │ │ ├── infrastructure │ │ │ │ └── MongoPlateRepository.java │ │ │ └── query │ │ │ │ └── PlateQueryService.java │ │ ├── platebatch │ │ │ ├── PlateBatchController.java │ │ │ ├── command │ │ │ │ ├── CreatePlateBatchCommand.java │ │ │ │ ├── PlateBatchCommandService.java │ │ │ │ └── RenamePlateBatchCommand.java │ │ │ ├── domain │ │ │ │ ├── CreatePlateBatchResult.java │ │ │ │ ├── PlateBatch.java │ │ │ │ ├── PlateBatchDomainService.java │ │ │ │ ├── PlateBatchFactory.java │ │ │ │ ├── PlateBatchRepository.java │ │ │ │ ├── event │ │ │ │ │ ├── PlateBatchCreatedEvent.java │ │ │ │ │ └── PlateBatchDeletedEvent.java │ │ │ │ └── task │ │ │ │ │ ├── CountUsedPlatesForPlateBatchTask.java │ │ │ │ │ ├── DeltaCountUsedPlatesForPlateBatchTask.java │ │ │ │ │ └── RemoveAllPlateBatchesUnderAppTask.java │ │ │ ├── eventhandler │ │ │ │ ├── PlateBatchCreatedEventHandler.java │ │ │ │ └── PlateBatchDeletedEventHandler.java │ │ │ ├── infrastructure │ │ │ │ └── MongoPlateBatchRepository.java │ │ │ └── query │ │ │ │ ├── ListMyManagedPlateBatchesQuery.java │ │ │ │ ├── PlateBatchQueryService.java │ │ │ │ └── QManagedListPlateBatch.java │ │ ├── platetemplate │ │ │ ├── PlateTemplateController.java │ │ │ ├── command │ │ │ │ ├── CreatePlateTemplateCommand.java │ │ │ │ ├── PlateTemplateCommandService.java │ │ │ │ └── UpdatePlateTemplateCommand.java │ │ │ ├── domain │ │ │ │ ├── PlateTemplate.java │ │ │ │ ├── PlateTemplateFactory.java │ │ │ │ └── PlateTemplateRepository.java │ │ │ ├── infrastructure │ │ │ │ └── MongoPlateTemplateRepository.java │ │ │ └── query │ │ │ │ ├── PlateTemplateQueryService.java │ │ │ │ └── QListPlateTemplate.java │ │ ├── presentation │ │ │ ├── PresentationController.java │ │ │ └── query │ │ │ │ ├── AttributePresentationFetcher.java │ │ │ │ ├── ControlPresentationer.java │ │ │ │ ├── PresentationQueryService.java │ │ │ │ ├── QControlPresentation.java │ │ │ │ ├── answerreference │ │ │ │ ├── AnswerReferencePresentationer.java │ │ │ │ └── QAnswerReferencePresentation.java │ │ │ │ ├── attributedashboard │ │ │ │ ├── AttributeDashboardPresentationer.java │ │ │ │ └── QAttributeDashboardPresentation.java │ │ │ │ ├── attributetable │ │ │ │ ├── AttributeTablePresentationer.java │ │ │ │ └── QAttributeTablePresentation.java │ │ │ │ ├── bar │ │ │ │ ├── BarPresentationer.java │ │ │ │ └── QBarPresentation.java │ │ │ │ ├── doughnut │ │ │ │ ├── DoughnutPresentationer.java │ │ │ │ └── QDoughnutPresentation.java │ │ │ │ ├── instancelist │ │ │ │ ├── InstanceListPresentationer.java │ │ │ │ └── QInstanceListPresentation.java │ │ │ │ ├── numberrangesegment │ │ │ │ ├── NumberRangeSegmentPresentationer.java │ │ │ │ └── QNumberRangeSegmentPresentation.java │ │ │ │ ├── pie │ │ │ │ ├── PiePresentationer.java │ │ │ │ └── QPiePresentation.java │ │ │ │ ├── submissionreference │ │ │ │ ├── QSubmissionReferencePresentation.java │ │ │ │ └── SubmissionReferencePresentationer.java │ │ │ │ ├── submithistory │ │ │ │ ├── QSubmitHistoryPresentation.java │ │ │ │ ├── QSubmitHistorySubmission.java │ │ │ │ └── SubmitHistoryPresentationer.java │ │ │ │ ├── timesegment │ │ │ │ ├── QTimeSegmentPresentation.java │ │ │ │ └── TimeSegmentPresentationer.java │ │ │ │ └── trend │ │ │ │ ├── QTrendDataSet.java │ │ │ │ ├── QTrendPresentation.java │ │ │ │ ├── QTrendRecord.java │ │ │ │ └── TrendPresentationer.java │ │ ├── printing │ │ │ ├── PrintingProductController.java │ │ │ ├── domain │ │ │ │ ├── MaterialType.java │ │ │ │ └── PlatePrintingType.java │ │ │ └── query │ │ │ │ ├── PrintingProductQueryService.java │ │ │ │ ├── QPlatePrintingType.java │ │ │ │ └── QPrintingProduct.java │ │ ├── qr │ │ │ ├── QrController.java │ │ │ ├── command │ │ │ │ ├── ChangeQrsGroupCommand.java │ │ │ │ ├── CreateQrCommand.java │ │ │ │ ├── CreateQrFromPlateCommand.java │ │ │ │ ├── CreateQrResponse.java │ │ │ │ ├── DeleteQrsCommand.java │ │ │ │ ├── QrCommandService.java │ │ │ │ ├── RenameQrCommand.java │ │ │ │ ├── ResetQrCirculationStatusCommand.java │ │ │ │ ├── ResetQrPlateCommand.java │ │ │ │ ├── UpdateQrBaseSettingCommand.java │ │ │ │ └── importqr │ │ │ │ │ ├── QrImportBatchSaver.java │ │ │ │ │ ├── QrImportParser.java │ │ │ │ │ ├── QrImportRecord.java │ │ │ │ │ ├── QrImportResponse.java │ │ │ │ │ └── QrImporter.java │ │ │ ├── domain │ │ │ │ ├── AppedQr.java │ │ │ │ ├── PlatedQr.java │ │ │ │ ├── QR.java │ │ │ │ ├── QrCreatedEvent.java │ │ │ │ ├── QrDomainService.java │ │ │ │ ├── QrFactory.java │ │ │ │ ├── QrHouseKeeper.java │ │ │ │ ├── QrReferenceContext.java │ │ │ │ ├── QrRepository.java │ │ │ │ ├── attribute │ │ │ │ │ ├── AddressAttributeValue.java │ │ │ │ │ ├── AttributeValue.java │ │ │ │ │ ├── BooleanAttributeValue.java │ │ │ │ │ ├── CheckboxAttributeValue.java │ │ │ │ │ ├── CirculationStatusAttributeValue.java │ │ │ │ │ ├── DoubleAttributeValue.java │ │ │ │ │ ├── DropdownAttributeValue.java │ │ │ │ │ ├── EmailAttributeValue.java │ │ │ │ │ ├── FilesAttributeValue.java │ │ │ │ │ ├── GeolocationAttributeValue.java │ │ │ │ │ ├── GroupAttributeValue.java │ │ │ │ │ ├── IdentifierAttributeValue.java │ │ │ │ │ ├── ImagesAttributeValue.java │ │ │ │ │ ├── IntegerAttributeValue.java │ │ │ │ │ ├── ItemCountAttributeValue.java │ │ │ │ │ ├── ItemStatusAttributeValue.java │ │ │ │ │ ├── LocalDateAttributeValue.java │ │ │ │ │ ├── LocalTimeAttributeValue.java │ │ │ │ │ ├── MemberAttributeValue.java │ │ │ │ │ ├── MemberEmailAttributeValue.java │ │ │ │ │ ├── MemberMobileAttributeValue.java │ │ │ │ │ ├── MembersAttributeValue.java │ │ │ │ │ ├── MembersEmailAttributeValue.java │ │ │ │ │ ├── MembersMobileAttributeValue.java │ │ │ │ │ ├── MobileAttributeValue.java │ │ │ │ │ ├── MultiLevelSelectionAttributeValue.java │ │ │ │ │ ├── MultiLineTextAttributeValue.java │ │ │ │ │ ├── PointCheckAttributeValue.java │ │ │ │ │ ├── RadioAttributeValue.java │ │ │ │ │ ├── RichTextAttributeValue.java │ │ │ │ │ ├── SignatureAttributeValue.java │ │ │ │ │ ├── TextAttributeValue.java │ │ │ │ │ ├── TimestampAttributeValue.java │ │ │ │ │ └── sync │ │ │ │ │ │ ├── QrAttributeValueSyncer.java │ │ │ │ │ │ └── calculator │ │ │ │ │ │ ├── AttributeValueCalculator.java │ │ │ │ │ │ ├── FirstSubmissionAnswerRefCalculator.java │ │ │ │ │ │ ├── InstanceAccessCountCalculator.java │ │ │ │ │ │ ├── InstanceActiveStatusCalculator.java │ │ │ │ │ │ ├── InstanceCirculationStatusCalculator.java │ │ │ │ │ │ ├── InstanceCreateDateCalculator.java │ │ │ │ │ │ ├── InstanceCreateTimeCalculator.java │ │ │ │ │ │ ├── InstanceCreatorAndEmailCalculator.java │ │ │ │ │ │ ├── InstanceCreatorAndMobileCalculator.java │ │ │ │ │ │ ├── InstanceCreatorCalculator.java │ │ │ │ │ │ ├── InstanceCustomIdCalculator.java │ │ │ │ │ │ ├── InstanceGeolocationCalculator.java │ │ │ │ │ │ ├── InstanceGroupCalculator.java │ │ │ │ │ │ ├── InstanceGroupManagersAndEmailCalculator.java │ │ │ │ │ │ ├── InstanceGroupManagersAndMobileCalculator.java │ │ │ │ │ │ ├── InstanceGroupManagersCalculator.java │ │ │ │ │ │ ├── InstanceNameCalculator.java │ │ │ │ │ │ ├── InstancePlateIdCalculator.java │ │ │ │ │ │ ├── InstanceSubmitCountCalculator.java │ │ │ │ │ │ ├── InstanceTemplateStatusCalculator.java │ │ │ │ │ │ ├── LastSubmissionAnswerRefCalculator.java │ │ │ │ │ │ ├── PageFirstSubmittedDateCalculator.java │ │ │ │ │ │ ├── PageFirstSubmittedTimeCalculator.java │ │ │ │ │ │ ├── PageFirstSubmitterAndEmailCalculator.java │ │ │ │ │ │ ├── PageFirstSubmitterAndMobileCalculator.java │ │ │ │ │ │ ├── PageFirstSubmitterCalculator.java │ │ │ │ │ │ ├── PageLastSubmissionUpdatedDateCalculator.java │ │ │ │ │ │ ├── PageLastSubmissionUpdatedTimeCalculator.java │ │ │ │ │ │ ├── PageLastSubmissionUpdaterCalculator.java │ │ │ │ │ │ ├── PageLastSubmittedDateCalculator.java │ │ │ │ │ │ ├── PageLastSubmittedTimeCalculator.java │ │ │ │ │ │ ├── PageLastSubmitterAndEmailCalculator.java │ │ │ │ │ │ ├── PageLastSubmitterAndMobileCalculator.java │ │ │ │ │ │ ├── PageLastSubmitterCalculator.java │ │ │ │ │ │ ├── PageSubmissionExistsCalculator.java │ │ │ │ │ │ ├── PageSubmitCountCalculator.java │ │ │ │ │ │ └── SubmissionStatisticValueCalculator.java │ │ │ │ ├── event │ │ │ │ │ ├── QrActivatedEvent.java │ │ │ │ │ ├── QrAttributesUpdatedEvent.java │ │ │ │ │ ├── QrBaseSettingUpdatedEvent.java │ │ │ │ │ ├── QrCirculationStatusChangedEvent.java │ │ │ │ │ ├── QrCustomIdUpdatedEvent.java │ │ │ │ │ ├── QrDeactivatedEvent.java │ │ │ │ │ ├── QrDeletedEvent.java │ │ │ │ │ ├── QrDescriptionUpdatedEvent.java │ │ │ │ │ ├── QrGeolocationUpdatedEvent.java │ │ │ │ │ ├── QrGroupChangedEvent.java │ │ │ │ │ ├── QrHeaderImageUpdatedEvent.java │ │ │ │ │ ├── QrMarkedAsTemplateEvent.java │ │ │ │ │ ├── QrPlateResetEvent.java │ │ │ │ │ ├── QrRenamedEvent.java │ │ │ │ │ ├── QrUnMarkedAsTemplateEvent.java │ │ │ │ │ └── QrUpdatedEvent.java │ │ │ │ └── task │ │ │ │ │ ├── CountQrAccessTask.java │ │ │ │ │ ├── CountQrForAppTask.java │ │ │ │ │ ├── DeltaCountQrForAppTask.java │ │ │ │ │ ├── RemoveAllQrsUnderAppTask.java │ │ │ │ │ ├── RemoveAllQrsUnderGroupTask.java │ │ │ │ │ ├── RemoveAttributeValuesForAllQrsUnderAppTask.java │ │ │ │ │ ├── RemoveIndexedOptionUnderAllQrsTask.java │ │ │ │ │ ├── RemoveIndexedValueUnderAllQrsTask.java │ │ │ │ │ ├── SyncAttributeValuesForAllQrsUnderAppTask.java │ │ │ │ │ ├── SyncAttributeValuesForQrTask.java │ │ │ │ │ ├── SyncGroupActiveStatusToQrTask.java │ │ │ │ │ ├── SyncGroupActiveStatusToQrsTask.java │ │ │ │ │ ├── SyncGroupManagerAttributesForAllQrsUnderGroupTask.java │ │ │ │ │ └── SyncSubmissionAwareAttributeValuesForQrTask.java │ │ │ ├── eventhandler │ │ │ │ ├── QrActivatedEventHandler.java │ │ │ │ ├── QrBaseSettingUpdatedEventHandler.java │ │ │ │ ├── QrCirculationStatusChangedEventHandler.java │ │ │ │ ├── QrCreatedEventHandler.java │ │ │ │ ├── QrCreatedEventWebhookPublishHandler.java │ │ │ │ ├── QrCustomIdUpdatedEventHandler.java │ │ │ │ ├── QrDeactivatedEventHandler.java │ │ │ │ ├── QrDeletedEventHandler.java │ │ │ │ ├── QrDeletedEventWebhookPublishHandler.java │ │ │ │ ├── QrGroupChangedEventHandler.java │ │ │ │ ├── QrMarkedAsTemplateEventHandler.java │ │ │ │ ├── QrPlateResetEventHandler.java │ │ │ │ ├── QrRenamedEventHandler.java │ │ │ │ ├── QrUnMarkedAsTemplateEventHandler.java │ │ │ │ └── QrUpdatedEventWebhookPublishHandler.java │ │ │ ├── infrastructure │ │ │ │ └── MongoQrRepository.java │ │ │ ├── job │ │ │ │ └── RemoveQrRangedAttributeValuesForAllTenantsJob.java │ │ │ └── query │ │ │ │ ├── QQrBaseSetting.java │ │ │ │ ├── QQrSummary.java │ │ │ │ ├── QrQueryService.java │ │ │ │ ├── bindplate │ │ │ │ ├── BindPlateQueryService.java │ │ │ │ └── QBindPlateInfo.java │ │ │ │ ├── list │ │ │ │ ├── ListViewableQrsQuery.java │ │ │ │ └── QViewableListQr.java │ │ │ │ ├── plate │ │ │ │ ├── ListPlateAttributeValuesQuery.java │ │ │ │ └── QrPlateAttributeValueQueryService.java │ │ │ │ ├── report │ │ │ │ ├── QrCategorizedAttributeValueSegmentReporter.java │ │ │ │ ├── QrNumberRangeSegmentReporter.java │ │ │ │ └── QrTimeSegmentReporter.java │ │ │ │ └── submission │ │ │ │ ├── QSubmissionAppDetail.java │ │ │ │ ├── QSubmissionQr.java │ │ │ │ ├── QSubmissionQrDetail.java │ │ │ │ ├── QSubmissionQrMemberProfile.java │ │ │ │ └── list │ │ │ │ ├── ListQrSubmissionsQuery.java │ │ │ │ └── QrSubmissionQueryService.java │ │ ├── register │ │ │ ├── RegisterController.java │ │ │ ├── command │ │ │ │ ├── RegisterCommand.java │ │ │ │ ├── RegisterCommandService.java │ │ │ │ └── RegisterResponse.java │ │ │ └── domain │ │ │ │ ├── RegisterDomainService.java │ │ │ │ └── RegisterResult.java │ │ ├── report │ │ │ ├── ReportController.java │ │ │ └── query │ │ │ │ ├── chart │ │ │ │ ├── ChartReportQuery.java │ │ │ │ ├── ChartReportQueryService.java │ │ │ │ ├── QCategorizedOptionSegmentReport.java │ │ │ │ ├── QChartReport.java │ │ │ │ ├── QChartReportType.java │ │ │ │ ├── QNumberRangeSegmentReport.java │ │ │ │ ├── QTimeSegmentReport.java │ │ │ │ └── reporter │ │ │ │ │ ├── ChartReportGenerator.java │ │ │ │ │ ├── attribute │ │ │ │ │ ├── AttributeBarReportGenerator.java │ │ │ │ │ ├── AttributeDoughnutReportGenerator.java │ │ │ │ │ ├── AttributeNumberRangeSegmentReportGenerator.java │ │ │ │ │ ├── AttributePieReportGenerator.java │ │ │ │ │ └── AttributeTimeSegmentReportGenerator.java │ │ │ │ │ └── control │ │ │ │ │ ├── ControlBarReportGenerator.java │ │ │ │ │ ├── ControlDoughnutReportGenerator.java │ │ │ │ │ ├── ControlNumberRangeSegmentReportGenerator.java │ │ │ │ │ ├── ControlPieReportGenerator.java │ │ │ │ │ └── ControlTimeSegmentReportGenerator.java │ │ │ │ └── number │ │ │ │ ├── NumberReportQuery.java │ │ │ │ ├── NumberReportQueryService.java │ │ │ │ ├── NumberResult.java │ │ │ │ ├── QNumberReport.java │ │ │ │ └── reporter │ │ │ │ ├── NumberReportGenerator.java │ │ │ │ ├── attribute │ │ │ │ ├── AttributeNumberReportGenerator.java │ │ │ │ └── AttributeNumberReporter.java │ │ │ │ ├── control │ │ │ │ ├── ControlNumberReportGenerator.java │ │ │ │ └── ControlNumberReporter.java │ │ │ │ ├── instance │ │ │ │ ├── AccessedInstanceCountNumberReporter.java │ │ │ │ ├── InstanceCountNumberReporter.java │ │ │ │ ├── InstanceNumberReportGenerator.java │ │ │ │ ├── InstanceNumberReporter.java │ │ │ │ └── InstanceSubmitCountNumberReporter.java │ │ │ │ └── page │ │ │ │ ├── PageNumberReportGenerator.java │ │ │ │ ├── PageNumberReporter.java │ │ │ │ └── PageSubmitCountNumberReporter.java │ │ ├── submission │ │ │ ├── SubmissionController.java │ │ │ ├── command │ │ │ │ ├── ApproveSubmissionCommand.java │ │ │ │ ├── NewSubmissionCommand.java │ │ │ │ ├── SubmissionCommandService.java │ │ │ │ └── UpdateSubmissionCommand.java │ │ │ ├── domain │ │ │ │ ├── ApprovalStatus.java │ │ │ │ ├── CreateSubmissionWithQrResult.java │ │ │ │ ├── Submission.java │ │ │ │ ├── SubmissionApproval.java │ │ │ │ ├── SubmissionFactory.java │ │ │ │ ├── SubmissionHouseKeeper.java │ │ │ │ ├── SubmissionReferenceContext.java │ │ │ │ ├── SubmissionRepository.java │ │ │ │ ├── answer │ │ │ │ │ ├── AbstractSubmissionAnswerChecker.java │ │ │ │ │ ├── Answer.java │ │ │ │ │ ├── SubmissionAnswerChecker.java │ │ │ │ │ ├── SubmissionDomainService.java │ │ │ │ │ ├── address │ │ │ │ │ │ ├── AddressAnswer.java │ │ │ │ │ │ └── AddressAnswerChecker.java │ │ │ │ │ ├── checkbox │ │ │ │ │ │ ├── CheckboxAnswer.java │ │ │ │ │ │ └── CheckboxAnswerChecker.java │ │ │ │ │ ├── date │ │ │ │ │ │ ├── DateAnswer.java │ │ │ │ │ │ └── DateAnswerChecker.java │ │ │ │ │ ├── dropdown │ │ │ │ │ │ ├── DropdownAnswer.java │ │ │ │ │ │ └── DropdownAnswerChecker.java │ │ │ │ │ ├── email │ │ │ │ │ │ ├── EmailAnswer.java │ │ │ │ │ │ └── EmailAnswerChecker.java │ │ │ │ │ ├── fileupload │ │ │ │ │ │ ├── FileUploadAnswer.java │ │ │ │ │ │ └── FileUploadAnswerChecker.java │ │ │ │ │ ├── geolocation │ │ │ │ │ │ ├── GeolocationAnswer.java │ │ │ │ │ │ └── GeolocationAnswerChecker.java │ │ │ │ │ ├── identifier │ │ │ │ │ │ ├── IdentifierAnswer.java │ │ │ │ │ │ └── IdentifierAnswerChecker.java │ │ │ │ │ ├── imageupload │ │ │ │ │ │ ├── ImageUploadAnswer.java │ │ │ │ │ │ └── ImageUploadAnswerChecker.java │ │ │ │ │ ├── itemcount │ │ │ │ │ │ ├── ItemCountAnswer.java │ │ │ │ │ │ └── ItemCountAnswerChecker.java │ │ │ │ │ ├── itemstatus │ │ │ │ │ │ ├── ItemStatusAnswer.java │ │ │ │ │ │ └── ItemStatusAnswerChecker.java │ │ │ │ │ ├── memberselect │ │ │ │ │ │ ├── MemberSelectAnswer.java │ │ │ │ │ │ └── MemberSelectAnswerChecker.java │ │ │ │ │ ├── mobilenumber │ │ │ │ │ │ ├── MobileNumberAnswer.java │ │ │ │ │ │ └── MobileNumberAnswerChecker.java │ │ │ │ │ ├── multilevelselection │ │ │ │ │ │ ├── MultiLevelSelection.java │ │ │ │ │ │ ├── MultiLevelSelectionAnswer.java │ │ │ │ │ │ └── MultiLevelSelectionAnswerChecker.java │ │ │ │ │ ├── multilinetext │ │ │ │ │ │ ├── MultiLineTextAnswer.java │ │ │ │ │ │ └── MultiLineTextAnswerChecker.java │ │ │ │ │ ├── numberinput │ │ │ │ │ │ ├── NumberInputAnswer.java │ │ │ │ │ │ └── NumberInputAnswerChecker.java │ │ │ │ │ ├── numberranking │ │ │ │ │ │ ├── NumberRankingAnswer.java │ │ │ │ │ │ └── NumberRankingAnswerChecker.java │ │ │ │ │ ├── personname │ │ │ │ │ │ ├── PersonNameAnswer.java │ │ │ │ │ │ └── PersonNameAnswerChecker.java │ │ │ │ │ ├── pointcheck │ │ │ │ │ │ ├── PointCheckAnswer.java │ │ │ │ │ │ ├── PointCheckAnswerChecker.java │ │ │ │ │ │ └── PointCheckValue.java │ │ │ │ │ ├── radio │ │ │ │ │ │ ├── RadioAnswer.java │ │ │ │ │ │ └── RadioAnswerChecker.java │ │ │ │ │ ├── richtext │ │ │ │ │ │ ├── RichTextInputAnswer.java │ │ │ │ │ │ └── RichTextInputAnswerChecker.java │ │ │ │ │ ├── signature │ │ │ │ │ │ ├── SignatureAnswer.java │ │ │ │ │ │ └── SignatureAnswerChecker.java │ │ │ │ │ ├── singlelinetext │ │ │ │ │ │ ├── SingleLineTextAnswer.java │ │ │ │ │ │ └── SingleLineTextAnswerChecker.java │ │ │ │ │ └── time │ │ │ │ │ │ ├── TimeAnswer.java │ │ │ │ │ │ └── TimeAnswerChecker.java │ │ │ │ ├── event │ │ │ │ │ ├── SubmissionApprovedEvent.java │ │ │ │ │ ├── SubmissionCreatedEvent.java │ │ │ │ │ ├── SubmissionDeletedEvent.java │ │ │ │ │ └── SubmissionUpdatedEvent.java │ │ │ │ └── task │ │ │ │ │ ├── CountSubmissionForAppTask.java │ │ │ │ │ ├── DeltaCountSubmissionForAppTask.java │ │ │ │ │ ├── RemoveAllSubmissionsForAppTask.java │ │ │ │ │ ├── RemoveAllSubmissionsForGroupTask.java │ │ │ │ │ ├── RemoveAllSubmissionsForPageTask.java │ │ │ │ │ ├── RemoveAllSubmissionsForQrTask.java │ │ │ │ │ ├── RemoveAnswersForControlsFromAllSubmissionsTask.java │ │ │ │ │ ├── RemoveIndexedValueFromAllSubmissionsTask.java │ │ │ │ │ ├── RemoveSubmissionIndexedOptionForAppTask.java │ │ │ │ │ ├── SyncSubmissionGroupFromQrTask.java │ │ │ │ │ └── SyncSubmissionPlateFromQrTask.java │ │ │ ├── eventhandler │ │ │ │ ├── SubmissionApprovedEventNotificationPublishHandler.java │ │ │ │ ├── SubmissionApprovedEventWebhookPublishHandler.java │ │ │ │ ├── SubmissionCreatedEventHandler.java │ │ │ │ ├── SubmissionCreatedEventNotificationPublishHandler.java │ │ │ │ ├── SubmissionCreatedEventWebhookPublishHandler.java │ │ │ │ ├── SubmissionDeletedEventHandler.java │ │ │ │ ├── SubmissionDeletedEventWebhookPublishHandler.java │ │ │ │ ├── SubmissionUpdatedEventHandler.java │ │ │ │ ├── SubmissionUpdatedEventNotificationPublishHandler.java │ │ │ │ ├── SubmissionUpdatedEventWebhookPublishHandler.java │ │ │ │ └── UpdateCirculationSubmissionCreatedEventHandler.java │ │ │ ├── infrastructure │ │ │ │ └── MongoSubmissionRepository.java │ │ │ └── query │ │ │ │ ├── QDetailedSubmission.java │ │ │ │ ├── QSubmissionApproval.java │ │ │ │ ├── SubmissionQueryService.java │ │ │ │ ├── autocalculate │ │ │ │ ├── AutoCalculateQuery.java │ │ │ │ ├── AutoCalculateQueryService.java │ │ │ │ ├── ItemStatusAutoCalculateResponse.java │ │ │ │ └── NumberInputAutoCalculateResponse.java │ │ │ │ ├── list │ │ │ │ ├── ListSubmissionsQuery.java │ │ │ │ └── QListSubmission.java │ │ │ │ └── report │ │ │ │ ├── SubmissionCategorizedAnswerSegmentReporter.java │ │ │ │ ├── SubmissionNumberRangeSegmentReporter.java │ │ │ │ └── SubmissionTimeSegmentReporter.java │ │ ├── tenant │ │ │ ├── TenantController.java │ │ │ ├── command │ │ │ │ ├── AddConsigneeCommand.java │ │ │ │ ├── TenantCommandService.java │ │ │ │ ├── UpdateConsigneeCommand.java │ │ │ │ ├── UpdateTenantBaseSettingCommand.java │ │ │ │ ├── UpdateTenantInvoiceTitleCommand.java │ │ │ │ ├── UpdateTenantLogoCommand.java │ │ │ │ └── UpdateTenantSubdomainCommand.java │ │ │ ├── domain │ │ │ │ ├── ApiSetting.java │ │ │ │ ├── CreateTenantResult.java │ │ │ │ ├── Packages.java │ │ │ │ ├── PackagesStatus.java │ │ │ │ ├── ResourceUsage.java │ │ │ │ ├── Tenant.java │ │ │ │ ├── TenantDomainService.java │ │ │ │ ├── TenantFactory.java │ │ │ │ ├── TenantRepository.java │ │ │ │ ├── event │ │ │ │ │ ├── TenantActivatedEvent.java │ │ │ │ │ ├── TenantBaseSettingUpdatedEvent.java │ │ │ │ │ ├── TenantCreatedEvent.java │ │ │ │ │ ├── TenantDeactivatedEvent.java │ │ │ │ │ ├── TenantInvoiceTitleUpdatedEvent.java │ │ │ │ │ ├── TenantOrderAppliedEvent.java │ │ │ │ │ ├── TenantPlanUpdatedEvent.java │ │ │ │ │ ├── TenantResourceUsageUpdatedEvent.java │ │ │ │ │ ├── TenantSubdomainReadyStatusUpdatedEvent.java │ │ │ │ │ ├── TenantSubdomainUpdatedEvent.java │ │ │ │ │ └── TenantUpdatedEvent.java │ │ │ │ └── task │ │ │ │ │ ├── CountAppForTenantTask.java │ │ │ │ │ ├── CountMembersForTenantTask.java │ │ │ │ │ ├── CountStorageForTenantTask.java │ │ │ │ │ ├── DeltaCountAppForTenantTask.java │ │ │ │ │ ├── DeltaCountMemberForTenantTask.java │ │ │ │ │ ├── RecordTenantRecentAccessTask.java │ │ │ │ │ ├── RemoveAppUsageFromTenantTask.java │ │ │ │ │ ├── SyncTenantSubdomainToAliyunTask.java │ │ │ │ │ ├── SyncTenantToManagedQrTask.java │ │ │ │ │ └── TenantSmsUsageCountTask.java │ │ │ ├── eventhandler │ │ │ │ ├── TenantActivatedEventHandler.java │ │ │ │ ├── TenantCreatedEventHandler.java │ │ │ │ ├── TenantDeactivatedEventHandler.java │ │ │ │ ├── TenantSubdomainUpdatedEventHandler.java │ │ │ │ └── TenantUpdateEventHandler.java │ │ │ ├── infrastructure │ │ │ │ ├── MongoCachedTenantRepository.java │ │ │ │ └── MongoTenantRepository.java │ │ │ ├── job │ │ │ │ └── CountStorageForAllTenantJob.java │ │ │ └── query │ │ │ │ ├── QConsoleTenantProfile.java │ │ │ │ ├── QPackagesStatus.java │ │ │ │ ├── QTenantApiSetting.java │ │ │ │ ├── QTenantBaseSetting.java │ │ │ │ ├── QTenantInfo.java │ │ │ │ ├── QTenantInvoiceTitle.java │ │ │ │ ├── QTenantLogo.java │ │ │ │ ├── QTenantPublicProfile.java │ │ │ │ ├── QTenantSubdomain.java │ │ │ │ └── TenantQueryService.java │ │ └── verification │ │ │ ├── VerificationController.java │ │ │ ├── command │ │ │ ├── CreateChangeMobileVerificationCodeCommand.java │ │ │ ├── CreateFindbackPasswordVerificationCodeCommand.java │ │ │ ├── CreateLoginVerificationCodeCommand.java │ │ │ ├── CreateRegisterVerificationCodeCommand.java │ │ │ ├── IdentifyMobileVerificationCodeCommand.java │ │ │ └── VerificationCodeCommandService.java │ │ │ ├── domain │ │ │ ├── VerificationCode.java │ │ │ ├── VerificationCodeChecker.java │ │ │ ├── VerificationCodeFactory.java │ │ │ ├── VerificationCodeRepository.java │ │ │ ├── VerificationCodeSender.java │ │ │ └── VerificationCodeType.java │ │ │ └── infrastructure │ │ │ ├── FakeVerificationCodeSender.java │ │ │ ├── MongoVerificationCodeRepository.java │ │ │ └── SmsVerificationCodeSender.java │ │ ├── integration │ │ ├── IntegrationController.java │ │ ├── app │ │ │ ├── command │ │ │ │ └── IntegrationAppCommandService.java │ │ │ └── query │ │ │ │ ├── IntegrationAppQueryService.java │ │ │ │ ├── QIntegrationApp.java │ │ │ │ └── QIntegrationListApp.java │ │ ├── department │ │ │ ├── command │ │ │ │ ├── IntegrationCreateDepartmentCommand.java │ │ │ │ ├── IntegrationDepartmentCommandService.java │ │ │ │ └── IntegrationUpdateDepartmentCustomIdCommand.java │ │ │ └── query │ │ │ │ ├── IntegrationDepartmentQueryService.java │ │ │ │ ├── QIntegrationDepartment.java │ │ │ │ └── QIntegrationListDepartment.java │ │ ├── group │ │ │ ├── command │ │ │ │ ├── IntegrationAddGroupManagersCommand.java │ │ │ │ ├── IntegrationAddGroupMembersCommand.java │ │ │ │ ├── IntegrationCreateGroupCommand.java │ │ │ │ ├── IntegrationCustomAddGroupManagersCommand.java │ │ │ │ ├── IntegrationCustomAddGroupMembersCommand.java │ │ │ │ ├── IntegrationCustomRemoveGroupManagersCommand.java │ │ │ │ ├── IntegrationCustomRemoveGroupMembersCommand.java │ │ │ │ ├── IntegrationGroupCommandService.java │ │ │ │ ├── IntegrationRemoveGroupManagersCommand.java │ │ │ │ ├── IntegrationRemoveGroupMembersCommand.java │ │ │ │ ├── IntegrationRenameGroupCommand.java │ │ │ │ └── IntegrationUpdateGroupCustomIdCommand.java │ │ │ └── query │ │ │ │ ├── IntegrationGroupQueryService.java │ │ │ │ ├── QIntegrationGroup.java │ │ │ │ └── QIntegrationListGroup.java │ │ ├── member │ │ │ ├── command │ │ │ │ ├── IntegrationCreateMemberCommand.java │ │ │ │ ├── IntegrationMemberCommandService.java │ │ │ │ ├── IntegrationUpdateMemberCustomIdCommand.java │ │ │ │ └── IntegrationUpdateMemberInfoCommand.java │ │ │ └── query │ │ │ │ ├── IntegrationMemberQueryService.java │ │ │ │ ├── QIntegrationListMember.java │ │ │ │ └── QIntegrationMember.java │ │ ├── qr │ │ │ ├── command │ │ │ │ ├── IntegrationCreateQrAdvancedCommand.java │ │ │ │ ├── IntegrationCreateQrResponse.java │ │ │ │ ├── IntegrationCreateQrSimpleCommand.java │ │ │ │ ├── IntegrationQrCommandService.java │ │ │ │ ├── IntegrationRenameQrCommand.java │ │ │ │ ├── IntegrationUpdateQrBaseSettingCommand.java │ │ │ │ ├── IntegrationUpdateQrCustomIdCommand.java │ │ │ │ ├── IntegrationUpdateQrDescriptionCommand.java │ │ │ │ ├── IntegrationUpdateQrDirectAttributesCommand.java │ │ │ │ ├── IntegrationUpdateQrGeolocationCommand.java │ │ │ │ └── IntegrationUpdateQrHeaderImageCommand.java │ │ │ └── query │ │ │ │ ├── IntegrationQrQueryService.java │ │ │ │ └── QIntegrationQr.java │ │ └── submission │ │ │ ├── command │ │ │ ├── IntegrationNewSubmissionCommand.java │ │ │ ├── IntegrationSubmissionCommandService.java │ │ │ └── IntegrationUpdateSubmissionCommand.java │ │ │ └── query │ │ │ ├── IntegrationSubmissionQueryService.java │ │ │ └── QIntegrationSubmission.java │ │ └── management │ │ ├── MryManageTenant.java │ │ ├── apptemplate │ │ ├── MryAppTemplateManageApp.java │ │ └── MryAppTemplateTenant.java │ │ ├── common │ │ └── PlanTypeControl.java │ │ ├── crm │ │ ├── MryTenantManageApp.java │ │ └── webhook │ │ │ ├── ClearSubdomainWebhookHandler.java │ │ │ ├── ClearTenantCacheWebhookHandler.java │ │ │ ├── SendDomainEventWebhookHandler.java │ │ │ ├── SetTenantActiveStatusWebhookHandler.java │ │ │ ├── SetTenantFeatureLimitWebhookHandler.java │ │ │ ├── SetTenantPackagesWebhookHandler.java │ │ │ ├── TenantSyncWebhookHandler.java │ │ │ ├── TenantWebhookHandler.java │ │ │ └── UpdateSubdomainReadyStuatusWebhookHandler.java │ │ ├── offencereport │ │ ├── MryOffenceReportApp.java │ │ └── webhook │ │ │ ├── OffenceWebhookHandler.java │ │ │ └── SyncInfoWebhookHandler.java │ │ ├── operation │ │ ├── MryOperationApp.java │ │ └── MrySelfOperationJob.java │ │ ├── order │ │ ├── MryOrderManageApp.java │ │ └── webhook │ │ │ ├── OrderBankTransferWebhookHandler.java │ │ │ ├── OrderDeleteWebhookHandler.java │ │ │ ├── OrderDeliveryWebhookHandler.java │ │ │ ├── OrderInvoiceWebhookHandler.java │ │ │ ├── OrderRefundWebhookHandler.java │ │ │ ├── OrderSyncWebhookHandler.java │ │ │ ├── OrderWebhookHandler.java │ │ │ ├── OrderWxPayWebhookHandler.java │ │ │ └── OrderWxTransferWebhookHandler.java │ │ ├── platform │ │ ├── PlatformController.java │ │ ├── command │ │ │ └── PlatformCommandService.java │ │ ├── domain │ │ │ ├── Platform.java │ │ │ ├── PlatformFactory.java │ │ │ └── PlatformRepository.java │ │ └── infrastructure │ │ │ └── MongoPlatformRepository.java │ │ ├── printingproduct │ │ └── PrintingProductApp.java │ │ └── webhook │ │ ├── MryManagementWebhookController.java │ │ └── MryWebhookDispatcher.java └── resources │ ├── administrative.json │ ├── application-local.yml │ ├── application.yml │ ├── banner.txt │ ├── bootstrap.yml │ ├── public │ └── .gitkeep │ └── wxpay-apiclient-key.pem └── test └── java └── com └── mryqr ├── BaseUnitTest.java ├── common └── domain │ ├── AggregateRootTest.java │ └── idnode │ └── IdTreeTest.java ├── core └── common │ ├── domain │ └── idnode │ │ └── IdTreeHierarchyTest.java │ ├── user │ └── UserTest.java │ └── utils │ ├── IdentifiedTest.java │ └── UuidGeneratorTest.java └── utils ├── RandomTestFixture.java └── TestUtils.java /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | *.iml 3 | *.ipr 4 | *.iws 5 | build 6 | out 7 | .gradle 8 | tmp.json 9 | tmp.xml 10 | tmp.md 11 | tmp.js 12 | tmp.txt 13 | *.log 14 | .shelf 15 | *.retry 16 | .ideaDataSources 17 | .DS_Store 18 | .idea 19 | 20 | #Below are files used for prod deployment 21 | prod-deploy.sh 22 | prod-deploy2.sh 23 | src/main/resources/application-prod.yml 24 | src/main/resources/application-prod2.yml 25 | src/main/resources/logback-spring.xml 26 | src/main/resources/fullchain.pem 27 | src/main/resources/privkey.pem -------------------------------------------------------------------------------- /ci-build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | echo "Start build..." 4 | 5 | #./gradlew composeDown 6 | 7 | ./gradlew clean build 8 | -------------------------------------------------------------------------------- /clear-and-local-run.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ./gradlew composeDown 4 | 5 | ./local-run.sh 6 | -------------------------------------------------------------------------------- /doc/业务运营/举报管理App.md: -------------------------------------------------------------------------------- 1 | # 举报管理 2 | 3 | ## 本地环境 4 | - 以`15111111111`(密码:11111111)登录本地[码如云自运营页面](http://console.mryqrlocal.com/management/my-apps) 5 | - 点击`举报管理`即可进入举报管理页面 6 | 7 | ## 原理 8 | 9 | - 举报管理App中存在一个名为`举报`的举报实例,用户提交的举报表单便针对该实例 10 | - 该实例为模板,因此每次用户提交举报表单,系统都会自动创建一个新的举报实例用于后续操作 11 | - 每次用户提交举报表单后,将发出领域事件,进而触发系统自动获取举报对象的相关信息,比如租户名称等 12 | - 由于用户提交举报表单时`referenceData`中记录了被举报页面的URL,系统在获取相关信息时便使用了该URL中的信息来获得对应的`QR`,`App`和`Tenant` 13 | 14 | ## 误删模板举报实例解决方法 15 | 16 | - 误删后,可以手动添加一个名为`举报`的模板实例即可 17 | - 添加后需要重置码牌编号为`MRY337143110947570688` 18 | - 添加后需要将实例设置为模板 19 | 20 | ## 误删举报实例解决办法 21 | 22 | - 误删后数据将永远丢失,因此无法挽回 -------------------------------------------------------------------------------- /doc/业务运营/印刷产品App.md: -------------------------------------------------------------------------------- 1 | # 印刷产品 2 | 3 | ## 本地环境 4 | - 以`15111111111`(密码:11111111)登录本地[码如云自运营页面](http://console.mryqrlocal.com/management/my-apps) 5 | - 点击`印刷产品`即可进入印刷产品管理页面 6 | 7 | ## 添加印刷产品步骤 8 | 9 | - 新建实例 10 | - 在`编辑基本信息`页面中,设置名称 11 | - 填入首页图片,必填,该图片将显示为图卡封面 12 | - 提交实例首页表单,包含`码牌材质`,`简介`和`详细介绍` 13 | - 到此,便可在[印刷服务](http://console.mryqrlocal.com/public/printing-service) 看到该印刷服务产品了 14 | 15 | ## 注意 16 | 17 | - 码牌材质重复时,创建时间更晚的将胜出 -------------------------------------------------------------------------------- /doc/业务运营/运营数据App.md: -------------------------------------------------------------------------------- 1 | # 运营数据 2 | 3 | ## 本地环境 4 | - 以`15111111111`(密码:11111111)登录本地[码如云自运营页面](http://console.mryqrlocal.com/management/my-apps) 5 | - 点击`运营数据`即可进入运营数据页面 6 | 7 | ## 原理 8 | 9 | - 系统每天早上6点会自动统计运营数据,包含每日总量总计和每日增量统计,并分别提交NEW类型的表单数据到App,可以自行创建统计控件查看数据统计 10 | - 系统会自动创建一个自定义编号为`BvuVczz3Tlaxfy6jytgBZQ`的实例用来承载统计数据,该实例名为`码如云运营数据` 11 | 12 | ## 误删实例解决方法 13 | 14 | 系统存在唯一一个实例(名称`码如云运营数据`)用于查看运营数据,该实例的自定义编号是固定的,系统后台便通过该自定义编号找到实例并提交统计数据,因此请勿删除该实例。 15 | 16 | 如果误删,系统将在下一次运行自动统计时重新创建实例,但是先前提交的数据统计表单将丢失,所以误删的后果还是挺严重的。 17 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx2048m 2 | -------------------------------------------------------------------------------- /gradle/checkstyle/checkstyle.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'checkstyle' 2 | 3 | checkstyle { 4 | sourceSets = [sourceSets.main] 5 | maxWarnings = 0 6 | ignoreFailures = false 7 | configFile file("$projectDir/gradle/checkstyle/checkstyle.xml") //Checkstyle配置文件路径 8 | } 9 | 10 | //配置需要忽略的文件 11 | tasks.withType(Checkstyle) { 12 | exclude 'com/mryqr/common/utils/MryRegexConstants.java' 13 | exclude 'com/mryqr/common/utils/SnowFlakeIdGenerator.java' 14 | exclude 'com/mryqr/common/wx/auth/mobile/DefaultMobileWxAuthService.java' 15 | exclude 'com/mryqr/core/app/domain/page/control/ControlType.java' 16 | } 17 | 18 | 19 | -------------------------------------------------------------------------------- /gradle/docker-compose/docker-compose.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.avast.gradle.docker-compose' 2 | 3 | //dockerCompose.isRequiredBy(apiTest) 4 | 5 | dockerCompose { 6 | useComposeFiles = ['gradle/docker-compose/docker-compose.yml'] 7 | // stopContainers = false 8 | // removeContainers = false 9 | // removeVolumes = false 10 | } 11 | 12 | bootRun.dependsOn composeUp //与isRequiredBy不同的是:使用dependsOn在关闭bootRun后MongoDB不会停止,因此本地开发不用反复启动MongoDB 13 | apiTest.dependsOn composeUp -------------------------------------------------------------------------------- /gradle/docker-compose/mongo-init.js: -------------------------------------------------------------------------------- 1 | rs.initiate({'_id': 'rs0', 'members': [{'_id': 0, 'host': '127.0.0.1:27017'}]}); 2 | -------------------------------------------------------------------------------- /gradle/idea.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'idea' 2 | 3 | configurations.apiTestImplementation.setCanBeResolved(true) 4 | configurations.apiTestRuntimeOnly.setCanBeResolved(true) 5 | 6 | idea { 7 | module { 8 | testSourceDirs += file('src/apiTest/java') 9 | testSourceDirs += file('src/apiTest/resources') 10 | scopes.TEST.plus += [configurations.apiTestImplementation] 11 | scopes.TEST.plus += [configurations.apiTestRuntimeOnly] 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /gradle/spotbugs/exclude.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /gradle/spotbugs/spotbugs.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "com.github.spotbugs" 2 | 3 | 4 | spotbugs { 5 | excludeFilter = file("$projectDir/gradle/spotbugs/exclude.xml")//Spotbug配置文件路径 6 | reportLevel = "high" 7 | } 8 | 9 | spotbugsTest { 10 | enabled = false 11 | } 12 | 13 | spotbugsMain { 14 | reports { 15 | html { 16 | required = true 17 | } 18 | xml { 19 | required = false 20 | } 21 | } 22 | } 23 | 24 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mryqr-com/mry-backend/d57041d4ba78ee9ab3c70f19182764b8b4b2b22d/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /idea.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ./gradlew cleanIdea openIdea 4 | -------------------------------------------------------------------------------- /local-run.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ./gradlew clean bootRun --args='--spring.profiles.active=local' 4 | -------------------------------------------------------------------------------- /lombok.config: -------------------------------------------------------------------------------- 1 | lombok.anyConstructor.addConstructorProperties=true 2 | lombok.addLombokGeneratedAnnotation = true 3 | lombok.equalsAndHashCode.callSuper = call 4 | lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier 5 | -------------------------------------------------------------------------------- /src/apiTest/java/com/mryqr/common/about/AboutControllerApiTest.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.about; 2 | 3 | import com.mryqr.BaseApiTest; 4 | import org.junit.jupiter.api.Test; 5 | 6 | import static org.hamcrest.Matchers.containsString; 7 | 8 | public class AboutControllerApiTest extends BaseApiTest { 9 | 10 | @Test 11 | public void should_display_about_info() { 12 | given() 13 | .when() 14 | .get("/about") 15 | .then() 16 | .statusCode(200) 17 | .body("deployTime", containsString("Asia/Shanghai")); 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /src/apiTest/java/com/mryqr/core/plan/PlanApi.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.plan; 2 | 3 | import com.mryqr.BaseApiTest; 4 | import com.mryqr.core.plan.query.QListPlan; 5 | import io.restassured.common.mapper.TypeRef; 6 | 7 | import java.util.List; 8 | 9 | public class PlanApi { 10 | public static List listPlans() { 11 | return BaseApiTest.given() 12 | .when() 13 | .get("/plans") 14 | .then() 15 | .statusCode(200) 16 | .extract() 17 | .as(new TypeRef<>() { 18 | }); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/apiTest/java/com/mryqr/core/printing/PrintingProductApi.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.printing; 2 | 3 | import com.mryqr.BaseApiTest; 4 | import com.mryqr.core.printing.query.QPrintingProduct; 5 | import io.restassured.common.mapper.TypeRef; 6 | 7 | import java.util.List; 8 | 9 | public class PrintingProductApi { 10 | 11 | public static List listPrintingProducts() { 12 | return BaseApiTest.given() 13 | .when() 14 | .get("/printing-products") 15 | .then() 16 | .statusCode(200) 17 | .extract() 18 | .as(new TypeRef<>() { 19 | }); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/apiTest/java/com/mryqr/utils/LoginResponse.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.utils; 2 | 3 | public class LoginResponse { 4 | private final String tenantId; 5 | private final String memberId; 6 | private final String jwt; 7 | 8 | public LoginResponse(String tenantId, String memberId, String jwt) { 9 | this.tenantId = tenantId; 10 | this.memberId = memberId; 11 | this.jwt = jwt; 12 | } 13 | 14 | public String getTenantId() { 15 | return tenantId; 16 | } 17 | 18 | public String getMemberId() { 19 | return memberId; 20 | } 21 | 22 | public String getJwt() { 23 | return jwt; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/apiTest/resources/junit-platform.properties: -------------------------------------------------------------------------------- 1 | junit.jupiter.execution.parallel.enabled=true 2 | junit.jupiter.execution.parallel.mode.default=concurrent 3 | junit.jupiter.execution.parallel.mode.classes.default=concurrent 4 | junit.jupiter.execution.parallel.config.strategy=dynamic 5 | -------------------------------------------------------------------------------- /src/apiTest/resources/testdata/member/a-text-file.txt: -------------------------------------------------------------------------------- 1 | this is a text file -------------------------------------------------------------------------------- /src/apiTest/resources/testdata/member/empty-import-members.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mryqr-com/mry-backend/d57041d4ba78ee9ab3c70f19182764b8b4b2b22d/src/apiTest/resources/testdata/member/empty-import-members.xlsx -------------------------------------------------------------------------------- /src/apiTest/resources/testdata/member/no-name-import-members.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mryqr-com/mry-backend/d57041d4ba78ee9ab3c70f19182764b8b4b2b22d/src/apiTest/resources/testdata/member/no-name-import-members.xlsx -------------------------------------------------------------------------------- /src/apiTest/resources/testdata/member/normal-import-members.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mryqr-com/mry-backend/d57041d4ba78ee9ab3c70f19182764b8b4b2b22d/src/apiTest/resources/testdata/member/normal-import-members.xlsx -------------------------------------------------------------------------------- /src/apiTest/resources/testdata/qr/a-text-file.txt: -------------------------------------------------------------------------------- 1 | this is a text file -------------------------------------------------------------------------------- /src/apiTest/resources/testdata/qr/duplicated-qrs-import.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mryqr-com/mry-backend/d57041d4ba78ee9ab3c70f19182764b8b4b2b22d/src/apiTest/resources/testdata/qr/duplicated-qrs-import.xlsx -------------------------------------------------------------------------------- /src/apiTest/resources/testdata/qr/no-custom-id-qrs-import.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mryqr-com/mry-backend/d57041d4ba78ee9ab3c70f19182764b8b4b2b22d/src/apiTest/resources/testdata/qr/no-custom-id-qrs-import.xlsx -------------------------------------------------------------------------------- /src/apiTest/resources/testdata/qr/no-name-qrs-import.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mryqr-com/mry-backend/d57041d4ba78ee9ab3c70f19182764b8b4b2b22d/src/apiTest/resources/testdata/qr/no-name-qrs-import.xlsx -------------------------------------------------------------------------------- /src/apiTest/resources/testdata/qr/no-record-qrs-import.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mryqr-com/mry-backend/d57041d4ba78ee9ab3c70f19182764b8b4b2b22d/src/apiTest/resources/testdata/qr/no-record-qrs-import.xlsx -------------------------------------------------------------------------------- /src/apiTest/resources/testdata/qr/normal-qrs-import.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mryqr-com/mry-backend/d57041d4ba78ee9ab3c70f19182764b8b4b2b22d/src/apiTest/resources/testdata/qr/normal-qrs-import.xlsx -------------------------------------------------------------------------------- /src/apiTest/resources/testdata/qr/simple-qrs-import.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mryqr-com/mry-backend/d57041d4ba78ee9ab3c70f19182764b8b4b2b22d/src/apiTest/resources/testdata/qr/simple-qrs-import.xlsx -------------------------------------------------------------------------------- /src/main/java/com/mryqr/MryApplication.java: -------------------------------------------------------------------------------- 1 | package com.mryqr; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class MryApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(MryApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/about/QAboutInfo.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.about; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Value 11 | @Builder 12 | @AllArgsConstructor(access = PRIVATE) 13 | public class QAboutInfo { 14 | private final String buildTime; 15 | private final String deployTime; 16 | private final String gitRevision; 17 | private final String gitBranch; 18 | private final String environment; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/dns/MryDnsService.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.dns; 2 | 3 | public interface MryDnsService { 4 | String addCname(String subdomainPrefix); 5 | 6 | String updateCname(String recordId, String subdomainPrefix); 7 | 8 | void deleteCname(String recordId); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/AddressPrecisionType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain; 2 | 3 | public enum AddressPrecisionType { 4 | PROVINCE, 5 | CITY, 6 | DISTRICT, 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/AggregateRootType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain; 2 | 3 | public enum AggregateRootType { 4 | APP, 5 | QR, 6 | SUBMISSION, 7 | TENANT, 8 | MEMBER, 9 | GROUP, 10 | APP_MANUAL, 11 | ASSIGNMENT, 12 | ASSIGNMENT_PLAN, 13 | DEPARTMENT, 14 | DEPARTMENT_HIERARCHY, 15 | GROUP_HIERARCHY, 16 | ORDER, 17 | PLATE, 18 | PLATE_BATCH, 19 | PLATE_TEMPLATE, 20 | VERIFICATION_CODE 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/OpsLog.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.time.Instant; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class OpsLog { 15 | private final Instant optAt; 16 | private final String optBy; 17 | private final String obn;//operatedByName 18 | private final String note; 19 | 20 | public Instant getOperatedAt() { 21 | return optAt; 22 | } 23 | 24 | public String getOperatedBy() { 25 | return optBy; 26 | } 27 | 28 | public String getOperatedByName() { 29 | return obn; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/display/AddressDisplayValue.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.display; 2 | 3 | 4 | import com.mryqr.common.domain.Address; 5 | import lombok.EqualsAndHashCode; 6 | import lombok.Getter; 7 | import lombok.NoArgsConstructor; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @EqualsAndHashCode(callSuper = true) 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class AddressDisplayValue extends DisplayValue { 15 | private Address address; 16 | 17 | public AddressDisplayValue(String key, Address address) { 18 | super(key, DisplayValueType.ADDRESS_DISPLAY_VALUE); 19 | this.address = address; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/display/BooleanDisplayValue.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.display; 2 | 3 | 4 | import lombok.EqualsAndHashCode; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Getter 11 | @EqualsAndHashCode(callSuper = true) 12 | @NoArgsConstructor(access = PRIVATE) 13 | public class BooleanDisplayValue extends DisplayValue { 14 | private boolean yes; 15 | 16 | public BooleanDisplayValue(String key, boolean yes) { 17 | super(key, DisplayValueType.BOOLEAN_DISPLAY_VALUE); 18 | this.yes = yes; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/display/DisplayValueType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.display; 2 | 3 | public enum DisplayValueType { 4 | TEXT_DISPLAY_VALUE, 5 | ADDRESS_DISPLAY_VALUE, 6 | TEXT_OPTIONS_DISPLAY_VALUE, 7 | FILES_DISPLAY_VALUE, 8 | GEOLOCATION_DISPLAY_VALUE, 9 | ITEM_COUNT_DISPLAY_VALUE, 10 | TEXT_OPTION_DISPLAY_VALUE, 11 | POINT_CHECK_DISPLAY_VALUE, 12 | BOOLEAN_DISPLAY_VALUE, 13 | NUMBER_DISPLAY_VALUE, 14 | EMAILED_MEMBER_DISPLAY_VALUE, 15 | MOBILE_MEMBER_DISPLAY_VALUE, 16 | EMAILED_MEMBERS_DISPLAY_VALUE, 17 | MOBILE_MEMBERS_DISPLAY_VALUE, 18 | TIMESTAMP_DISPLAY_VALUE, 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/display/EmailedMember.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.display; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class EmailedMember { 13 | private String id; 14 | private String name; 15 | private String email; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/display/EmailedMemberDisplayValue.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.display; 2 | 3 | 4 | import lombok.EqualsAndHashCode; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Getter 11 | @EqualsAndHashCode(callSuper = true) 12 | @NoArgsConstructor(access = PRIVATE) 13 | public class EmailedMemberDisplayValue extends DisplayValue { 14 | private EmailedMember member; 15 | 16 | public EmailedMemberDisplayValue(String key, EmailedMember member) { 17 | super(key, DisplayValueType.EMAILED_MEMBER_DISPLAY_VALUE); 18 | this.member = member; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/display/EmailedMembersDisplayValue.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.display; 2 | 3 | 4 | import lombok.EqualsAndHashCode; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.List; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Getter 13 | @EqualsAndHashCode(callSuper = true) 14 | @NoArgsConstructor(access = PRIVATE) 15 | public class EmailedMembersDisplayValue extends DisplayValue { 16 | private List members; 17 | 18 | public EmailedMembersDisplayValue(String key, List members) { 19 | super(key, DisplayValueType.EMAILED_MEMBERS_DISPLAY_VALUE); 20 | this.members = members; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/display/FilesDisplayValue.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.display; 2 | 3 | 4 | import com.mryqr.common.domain.UploadedFile; 5 | import lombok.EqualsAndHashCode; 6 | import lombok.Getter; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.List; 10 | 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Getter 14 | @EqualsAndHashCode(callSuper = true) 15 | @NoArgsConstructor(access = PRIVATE) 16 | public class FilesDisplayValue extends DisplayValue { 17 | private List files; 18 | 19 | 20 | public FilesDisplayValue(String key, List files) { 21 | super(key, DisplayValueType.FILES_DISPLAY_VALUE); 22 | this.files = files; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/display/GeolocationDisplayValue.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.display; 2 | 3 | 4 | import com.mryqr.common.domain.Geolocation; 5 | import lombok.EqualsAndHashCode; 6 | import lombok.Getter; 7 | import lombok.NoArgsConstructor; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @EqualsAndHashCode(callSuper = true) 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class GeolocationDisplayValue extends DisplayValue { 15 | private Geolocation geolocation; 16 | 17 | public GeolocationDisplayValue(String key, Geolocation geolocation) { 18 | super(key, DisplayValueType.GEOLOCATION_DISPLAY_VALUE); 19 | this.geolocation = geolocation; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/display/MobiledMember.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.display; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class MobiledMember { 13 | private String id; 14 | private String name; 15 | private String mobile; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/display/MobiledMemberDisplayValue.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.display; 2 | 3 | 4 | import lombok.EqualsAndHashCode; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Getter 11 | @EqualsAndHashCode(callSuper = true) 12 | @NoArgsConstructor(access = PRIVATE) 13 | public class MobiledMemberDisplayValue extends DisplayValue { 14 | private MobiledMember member; 15 | 16 | public MobiledMemberDisplayValue(String key, MobiledMember member) { 17 | super(key, DisplayValueType.MOBILE_MEMBER_DISPLAY_VALUE); 18 | this.member = member; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/display/MobiledMembersDisplayValue.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.display; 2 | 3 | 4 | import lombok.EqualsAndHashCode; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.List; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Getter 13 | @EqualsAndHashCode(callSuper = true) 14 | @NoArgsConstructor(access = PRIVATE) 15 | public class MobiledMembersDisplayValue extends DisplayValue { 16 | private List members; 17 | 18 | public MobiledMembersDisplayValue(String key, List members) { 19 | super(key, DisplayValueType.MOBILE_MEMBERS_DISPLAY_VALUE); 20 | this.members = members; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/display/NumberDisplayValue.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.display; 2 | 3 | 4 | import lombok.EqualsAndHashCode; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Getter 11 | @EqualsAndHashCode(callSuper = true) 12 | @NoArgsConstructor(access = PRIVATE) 13 | public class NumberDisplayValue extends DisplayValue { 14 | private Double number; 15 | 16 | public NumberDisplayValue(String key, Double number) { 17 | super(key, DisplayValueType.NUMBER_DISPLAY_VALUE); 18 | this.number = number; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/display/PointCheckDisplayValue.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.display; 2 | 3 | 4 | import lombok.EqualsAndHashCode; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Getter 11 | @EqualsAndHashCode(callSuper = true) 12 | @NoArgsConstructor(access = PRIVATE) 13 | public class PointCheckDisplayValue extends DisplayValue { 14 | private boolean pass; 15 | 16 | public PointCheckDisplayValue(String key, boolean pass) { 17 | super(key, DisplayValueType.POINT_CHECK_DISPLAY_VALUE); 18 | this.pass = pass; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/display/TextDisplayValue.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.display; 2 | 3 | 4 | import lombok.EqualsAndHashCode; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import static com.mryqr.common.domain.display.DisplayValueType.TEXT_DISPLAY_VALUE; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @EqualsAndHashCode(callSuper = true) 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class TextDisplayValue extends DisplayValue { 15 | private String text; 16 | 17 | public TextDisplayValue(String key, String text) { 18 | super(key, TEXT_DISPLAY_VALUE); 19 | this.text = text; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/display/TextOptionDisplayValue.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.display; 2 | 3 | 4 | import lombok.EqualsAndHashCode; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Getter 11 | @EqualsAndHashCode(callSuper = true) 12 | @NoArgsConstructor(access = PRIVATE) 13 | public class TextOptionDisplayValue extends DisplayValue { 14 | private String optionId; 15 | 16 | public TextOptionDisplayValue(String key, String optionId) { 17 | super(key, DisplayValueType.TEXT_OPTION_DISPLAY_VALUE); 18 | this.optionId = optionId; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/display/TimestampDisplayValue.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.display; 2 | 3 | 4 | import lombok.EqualsAndHashCode; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.time.Instant; 9 | 10 | import static com.mryqr.common.domain.display.DisplayValueType.TIMESTAMP_DISPLAY_VALUE; 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Getter 14 | @EqualsAndHashCode(callSuper = true) 15 | @NoArgsConstructor(access = PRIVATE) 16 | public class TimestampDisplayValue extends DisplayValue { 17 | private Instant timestamp; 18 | 19 | public TimestampDisplayValue(String key, Instant timestamp) { 20 | super(key, TIMESTAMP_DISPLAY_VALUE); 21 | this.timestamp = timestamp; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/idnode/exception/IdNodeLevelOverflowException.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.idnode.exception; 2 | 3 | public class IdNodeLevelOverflowException extends RuntimeException { 4 | public IdNodeLevelOverflowException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/idnode/exception/IdNodeNotFoundException.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.idnode.exception; 2 | 3 | public class IdNodeNotFoundException extends RuntimeException { 4 | public IdNodeNotFoundException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/idnode/exception/NodeIdFormatException.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.idnode.exception; 2 | 3 | public class NodeIdFormatException extends RuntimeException { 4 | public NodeIdFormatException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/indexedfield/IndexedField.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.indexedfield; 2 | 3 | public enum IndexedField { 4 | f1, 5 | f2, 6 | f3, 7 | f4, 8 | f5, 9 | f6, 10 | f7, 11 | f8, 12 | f9, 13 | f10, 14 | f11, 15 | f12, 16 | f13, 17 | f14, 18 | f15, 19 | f16, 20 | f17, 21 | f18, 22 | f19, 23 | f20, 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/indexedfield/IndexedValue.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.indexedfield; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.util.Set; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class IndexedValue { 15 | private final String rid;//referenceId,引用ID,不能索引,因为MongoDB最大只支持64个索引 16 | private final Double sv;//sortableValue,可排序字段,需要索引 17 | private final Set tv;//textValues,可搜索字段,用于按控件统计或重复数据检查,对于有option的控件为optionIds,对于邮件控件为邮箱地址,需要索引 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/report/CategorizedOptionSegment.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.report; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class CategorizedOptionSegment { 13 | private final String option; 14 | private final Double value; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/report/NumberAggregationType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.report; 2 | 3 | public enum NumberAggregationType { 4 | SUM, 5 | AVG, 6 | MAX, 7 | MIN, 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/report/NumberRangeSegment.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.report; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class NumberRangeSegment { 13 | private final double segment; 14 | private final Double value; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/report/QrReportTimeBasedType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.report; 2 | 3 | public enum QrReportTimeBasedType { 4 | CREATED_AT, 5 | DATE_ATTRIBUTE, 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/report/QrSegmentType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.report; 2 | 3 | public enum QrSegmentType { 4 | QR_COUNT_SUM, 5 | ATTRIBUTE_VALUE_SUM, 6 | ATTRIBUTE_VALUE_AVG, 7 | ATTRIBUTE_VALUE_MAX, 8 | ATTRIBUTE_VALUE_MIN, 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/report/SubmissionReportTimeBasedType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.report; 2 | 3 | public enum SubmissionReportTimeBasedType { 4 | CREATED_AT, 5 | DATE_CONTROL, 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/report/SubmissionSegmentType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.report; 2 | 3 | public enum SubmissionSegmentType { 4 | SUBMIT_COUNT_SUM, 5 | CONTROL_VALUE_SUM, 6 | CONTROL_VALUE_AVG, 7 | CONTROL_VALUE_MAX, 8 | CONTROL_VALUE_MIN, 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/report/TimeRange.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.report; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.time.Instant; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class TimeRange { 15 | private final Instant startAt; 16 | private final Instant endAt; 17 | 18 | public static TimeRange of(Instant startAt, Instant endAt) { 19 | return TimeRange.builder().startAt(startAt).endAt(endAt).build(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/report/TimeSegment.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.report; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class TimeSegment { 13 | private final int year; 14 | private final int period; 15 | private final Double value; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/report/TimeSegmentInterval.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.report; 2 | 3 | public enum TimeSegmentInterval { 4 | PER_MONTH, 5 | PER_SEASON, 6 | PER_YEAR 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/task/NonRetryableTask.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.task; 2 | 3 | //Marker接口,无实际作用 4 | //保证一个Task只做一件事情,即只操作一种聚合,并且task的package跟着其所操作的聚合走 5 | //每个task接收原始数据类型 6 | public interface NonRetryableTask { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/task/RetryableTask.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.task; 2 | 3 | import org.springframework.retry.annotation.Backoff; 4 | import org.springframework.retry.annotation.Retryable; 5 | 6 | //Marker接口,除可配置Retryable外无实际作用 7 | //保证一个Task只做一件事情,即只操作一种聚合,并且task的package跟着其所操作的聚合走 8 | //每个task接收原始数据类型 9 | @Retryable(backoff = @Backoff(delay = 500, multiplier = 3, random = true)) 10 | public interface RetryableTask { 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/domain/user/Role.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.domain.user; 2 | 3 | public enum Role { 4 | TENANT_ADMIN("系统管理员"), 5 | TENANT_MEMBER("普通成员"), 6 | ROBOT("API账号"); 7 | 8 | private final String roleName; 9 | 10 | Role(String roleName) { 11 | this.roleName = roleName; 12 | } 13 | 14 | public String getRoleName() { 15 | return roleName; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/email/MryEmailSender.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.email; 2 | 3 | import com.mryqr.common.domain.UploadedFile; 4 | 5 | import java.util.List; 6 | 7 | public interface MryEmailSender { 8 | void sendVerificationCode(String email, String code); 9 | 10 | void notifyWebhookNotAccessible(List emails, String appName, String webhookUrl); 11 | 12 | void sendInvoice(String email, List invoiceFiles); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/event/consume/ConsumingDomainEventDao.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.event.consume; 2 | 3 | public interface ConsumingDomainEventDao { 4 | // return true means this event has never been consumed before 5 | boolean recordAsConsumed(ConsumingDomainEvent consumingDomainEvent, String handlerName); 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/event/consume/DomainEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.event.consume; 2 | 3 | public interface DomainEventHandler { 4 | 5 | default boolean isIdempotent() { 6 | return false; // By default, all handlers are assumed to be not idempotent 7 | } 8 | 9 | default int priority() { 10 | return 0; // Smaller value means higher priority 11 | } 12 | 13 | void handle(ConsumingDomainEvent consumingDomainEvent); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/event/publish/DomainEventPublishStatus.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.event.publish; 2 | 3 | public enum DomainEventPublishStatus { 4 | CREATED, 5 | PUBLISH_SUCCEED, 6 | PUBLISH_FAILED, 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/event/publish/DomainEventSender.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.event.publish; 2 | 3 | import com.mryqr.common.event.DomainEvent; 4 | 5 | import java.util.concurrent.CompletableFuture; 6 | 7 | public interface DomainEventSender { 8 | CompletableFuture send(DomainEvent domainEvent); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/event/publish/PublishingDomainEventDao.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.event.publish; 2 | 3 | import com.mryqr.common.event.DomainEvent; 4 | 5 | import java.util.List; 6 | 7 | public interface PublishingDomainEventDao { 8 | void stage(List events); 9 | 10 | List stagedEvents(String startId, int limit); 11 | 12 | List byIds(List ids); 13 | 14 | void successPublish(String eventId); 15 | 16 | void failPublish(String eventId); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/exception/QErrorResponse.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.exception; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class QErrorResponse { 13 | private final Error error; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/json/JsonConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.json; 2 | 3 | import com.mryqr.common.utils.MryObjectMapper; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | @Configuration 8 | public class JsonConfiguration { 9 | 10 | @Bean 11 | public MryObjectMapper objectMapper() { 12 | return new MryObjectMapper(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/notification/publish/NotificationEventPublisher.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.notification.publish; 2 | 3 | import com.mryqr.common.event.DomainEvent; 4 | 5 | public interface NotificationEventPublisher { 6 | void publish(DomainEvent domainEvent); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/notification/wx/Response.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.notification.wx; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class Response { 13 | private final int errcode; 14 | private final String errmsg; 15 | private final long msgid; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/notification/wx/ValueItem.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.notification.wx; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class ValueItem { 13 | private final String value; 14 | private final String color; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/oss/domain/AliyunArmPolicy.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.oss.domain; 2 | 3 | import lombok.AccessLevel; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import java.util.List; 9 | 10 | @Value 11 | @Builder 12 | @AllArgsConstructor(access = AccessLevel.PRIVATE) 13 | public class AliyunArmPolicy { 14 | private final String Version; 15 | private final List Statement; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/oss/domain/OssTokenRequestType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.oss.domain; 2 | 3 | public enum OssTokenRequestType { 4 | TENANT_EDIT, 5 | TENANT_ORDER, 6 | APP_EDIT, 7 | QR_MANAGE, 8 | SUBMISSION, 9 | MEMBER_INFO, 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/oss/domain/QOssToken.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.oss.domain; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.time.Instant; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class QOssToken { 15 | private String securityToken; 16 | private String accessKeySecret; 17 | private String accessKeyId; 18 | private String bucket; 19 | private String endpoint; 20 | private boolean secure; 21 | private Instant expiration; 22 | private String folder; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/oss/domain/Statement.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.oss.domain; 2 | 3 | import lombok.AccessLevel; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import java.util.List; 9 | 10 | @Value 11 | @Builder 12 | @AllArgsConstructor(access = AccessLevel.PRIVATE) 13 | public class Statement { 14 | private final String Effect; 15 | private final String Action; 16 | private final List Resource; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/password/MryPasswordEncoder.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.password; 2 | 3 | public interface MryPasswordEncoder { 4 | String encode(CharSequence rawPassword); 5 | 6 | boolean matches(CharSequence rawPassword, String encodedPassword); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/password/PasswordConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.password; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 6 | 7 | @Configuration 8 | public class PasswordConfiguration { 9 | 10 | @Bean 11 | public MryPasswordEncoder passwordEncoder() { 12 | return new SpringMryPasswordEncoder(new BCryptPasswordEncoder()); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/password/SpringMryPasswordEncoder.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.password; 2 | 3 | import lombok.RequiredArgsConstructor; 4 | 5 | @RequiredArgsConstructor 6 | public class SpringMryPasswordEncoder implements MryPasswordEncoder { 7 | 8 | private final org.springframework.security.crypto.password.PasswordEncoder _passwordEncoder; 9 | 10 | @Override 11 | public String encode(CharSequence rawPassword) { 12 | return _passwordEncoder.encode(rawPassword); 13 | } 14 | 15 | @Override 16 | public boolean matches(CharSequence rawPassword, String encodedPassword) { 17 | return _passwordEncoder.matches(rawPassword, encodedPassword); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/profile/CiProfile.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.profile; 2 | 3 | import org.springframework.context.annotation.Profile; 4 | 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Profile("ci") 10 | public @interface CiProfile { 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/profile/NonCiProfile.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.profile; 2 | 3 | import org.springframework.context.annotation.Profile; 4 | 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Profile("!ci") 10 | public @interface NonCiProfile { 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/profile/NonProdProfile.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.profile; 2 | 3 | import org.springframework.context.annotation.Profile; 4 | 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Profile("!prod") 10 | public @interface NonProdProfile { 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/profile/ProdProfile.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.profile; 2 | 3 | import org.springframework.context.annotation.Profile; 4 | 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Profile("prod") 10 | public @interface ProdProfile { 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/properties/PayProperties.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.properties; 2 | 3 | 4 | import jakarta.validation.constraints.NotBlank; 5 | import lombok.Data; 6 | import org.springframework.boot.context.properties.ConfigurationProperties; 7 | import org.springframework.stereotype.Component; 8 | import org.springframework.validation.annotation.Validated; 9 | 10 | @Data 11 | @Component 12 | @Validated 13 | @ConfigurationProperties("mry.pay") 14 | public class PayProperties { 15 | @NotBlank 16 | private String wxMerchantId; 17 | 18 | @NotBlank 19 | private String wxMerchantSerialNumber; 20 | 21 | @NotBlank 22 | private String wxApiV3Key; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/ratelimit/MryRateLimiter.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.ratelimit; 2 | 3 | 4 | public interface MryRateLimiter { 5 | // 建议采用以下策略: 6 | // 最低访问量: 1TPS 7 | // 极低访问量: 5TPS 8 | // 较低访问量: 10TPS 9 | // 正常访问量: 20TPS 10 | // 较高访问量: 50TPS 11 | // 极高访问量: 100TPS 12 | void applyFor(String tenantId, String key, int tps); 13 | 14 | void applyFor(String key, int tps); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/restclient/RestTemplateConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.restclient; 2 | 3 | import org.springframework.boot.web.client.RestTemplateBuilder; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.web.client.RestTemplate; 7 | 8 | import static java.time.Duration.ofSeconds; 9 | 10 | @Configuration 11 | public class RestTemplateConfiguration { 12 | 13 | @Bean 14 | public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) { 15 | return restTemplateBuilder 16 | .connectTimeout(ofSeconds(10)) 17 | .readTimeout(ofSeconds(10)) 18 | .build(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/retry/RetryConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.retry; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.retry.annotation.EnableRetry; 5 | 6 | @EnableRetry 7 | @Configuration 8 | public class RetryConfiguration { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/sms/FakeSmsSender.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.sms; 2 | 3 | import com.mryqr.common.profile.NonProdProfile; 4 | import lombok.RequiredArgsConstructor; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.stereotype.Component; 7 | 8 | @Slf4j 9 | @Component 10 | @NonProdProfile 11 | @RequiredArgsConstructor 12 | public class FakeSmsSender implements MrySmsSender { 13 | 14 | @Override 15 | public boolean sendVerificationCode(String mobile, String code) { 16 | log.info("Verification code for {} is {}", mobile, code); 17 | return true; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/sms/MrySmsSender.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.sms; 2 | 3 | public interface MrySmsSender { 4 | boolean sendVerificationCode(String mobile, String code); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/tracing/MryTracingService.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.tracing; 2 | 3 | import io.micrometer.tracing.ScopedSpan; 4 | import io.micrometer.tracing.Span; 5 | import io.micrometer.tracing.Tracer; 6 | import lombok.RequiredArgsConstructor; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Component 10 | @RequiredArgsConstructor 11 | public class MryTracingService { 12 | private final Tracer tracer; 13 | 14 | public String currentTraceId() { 15 | Span span = tracer.currentSpan(); 16 | return span != null ? span.context().traceId() : null; 17 | } 18 | 19 | public ScopedSpan startNewSpan(String name) { 20 | return tracer.startScopedSpan(name); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/utils/Command.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.utils; 2 | 3 | public interface Command { 4 | default void correctAndValidate() { 5 | 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/utils/EasyExcelResult.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.utils; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Getter; 6 | 7 | import java.util.List; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class EasyExcelResult { 15 | private final List> headers; 16 | private final List> records; 17 | private final String fileName; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/utils/Identified.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.utils; 2 | 3 | import java.util.Collection; 4 | 5 | import static org.apache.commons.collections4.CollectionUtils.isEmpty; 6 | 7 | public interface Identified { 8 | static boolean isDuplicated(Collection collection) { 9 | if (isEmpty(collection)) { 10 | return false; 11 | } 12 | 13 | long count = collection.stream().map(Identified::getIdentifier).distinct().count(); 14 | return count != collection.size(); 15 | } 16 | 17 | String getIdentifier(); 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/utils/MryTaskRunner.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.utils; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | 5 | @Slf4j 6 | public class MryTaskRunner { 7 | 8 | public static void run(Runnable runnable) { 9 | try { 10 | runnable.run(); 11 | } catch (Throwable t) { 12 | log.error("Failed to run task: ", t); 13 | } 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/utils/PagedList.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.utils; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | import java.util.List; 7 | 8 | @Getter 9 | @Builder 10 | public class PagedList { 11 | private final int totalNumber; 12 | private final int pageIndex; 13 | private final int pageSize; 14 | private final List data; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/utils/Query.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.utils; 2 | 3 | public interface Query { 4 | default void correctAndValidate() { 5 | 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/utils/ReturnId.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.utils; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class ReturnId { 13 | private final String id; 14 | 15 | public static ReturnId returnId(String id) { 16 | return ReturnId.builder().id(id).build(); 17 | } 18 | 19 | @Override 20 | public String toString() { 21 | return id; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/utils/UuidGenerator.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.utils; 2 | 3 | import java.nio.ByteBuffer; 4 | import java.util.Base64; 5 | import java.util.UUID; 6 | 7 | /** 8 | * Util class for generating unique IDs in Base64 format based on UUID. 9 | */ 10 | public final class UuidGenerator { 11 | private static final Base64.Encoder encoder = Base64.getUrlEncoder(); 12 | 13 | public static String newShortUuid() { 14 | UUID uuid = UUID.randomUUID(); 15 | byte[] src = ByteBuffer.wrap(new byte[16]) 16 | .putLong(uuid.getMostSignificantBits()) 17 | .putLong(uuid.getLeastSignificantBits()) 18 | .array(); 19 | return encoder.encodeToString(src).substring(0, 22); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/validation/nospace/NoSpaceValidator.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.validation.nospace; 2 | 3 | import jakarta.validation.ConstraintValidator; 4 | import jakarta.validation.ConstraintValidatorContext; 5 | 6 | import static org.apache.commons.lang3.StringUtils.isBlank; 7 | 8 | public class NoSpaceValidator implements ConstraintValidator { 9 | 10 | @Override 11 | public void initialize(NoSpace constraintAnnotation) { 12 | } 13 | 14 | @Override 15 | public boolean isValid(String value, ConstraintValidatorContext context) { 16 | if (isBlank(value)) { 17 | return true; 18 | } 19 | 20 | return !value.contains(" "); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/webhook/WebhookPayloadType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.webhook; 2 | 3 | public enum WebhookPayloadType { 4 | SUBMISSION_CREATED, 5 | SUBMISSION_UPDATED, 6 | SUBMISSION_APPROVED, 7 | SUBMISSION_DELETED, 8 | QR_CREATED, 9 | QR_UPDATED, 10 | QR_DELETED, 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/webhook/publish/AsynchronousWebhookEventPublisher.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.webhook.publish; 2 | 3 | import com.mryqr.common.event.DomainEvent; 4 | import com.mryqr.common.profile.NonCiProfile; 5 | import lombok.RequiredArgsConstructor; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Slf4j 10 | @Component 11 | @NonCiProfile 12 | @RequiredArgsConstructor 13 | public class AsynchronousWebhookEventPublisher implements MryWebhookEventPublisher { 14 | private final RedisWebhookEventSender redisWebhookEventSender; 15 | 16 | @Override 17 | public void publish(DomainEvent domainEvent) { 18 | redisWebhookEventSender.send(domainEvent); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/webhook/publish/MryWebhookEventPublisher.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.webhook.publish; 2 | 3 | import com.mryqr.common.event.DomainEvent; 4 | 5 | public interface MryWebhookEventPublisher { 6 | void publish(DomainEvent domainEvent); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/webhook/qr/QrCreatedWebhookPayload.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.webhook.qr; 2 | 3 | import com.mryqr.core.qr.domain.QR; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | 7 | import static com.mryqr.common.webhook.WebhookPayloadType.QR_CREATED; 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Getter 11 | @NoArgsConstructor(access = PRIVATE) 12 | public class QrCreatedWebhookPayload extends BaseQrWebhookPayload { 13 | public QrCreatedWebhookPayload(QR qr, String eventId) { 14 | super(QR_CREATED, qr, eventId); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/webhook/submission/SubmissionCreatedWebhookPayload.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.webhook.submission; 2 | 3 | import com.mryqr.core.qr.domain.QR; 4 | import com.mryqr.core.submission.domain.Submission; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | import static com.mryqr.common.webhook.WebhookPayloadType.SUBMISSION_CREATED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @NoArgsConstructor(access = PRIVATE) 13 | public class SubmissionCreatedWebhookPayload extends BaseSubmissionWebhookPayload { 14 | public SubmissionCreatedWebhookPayload(Submission submission, QR qr, String eventId) { 15 | super(SUBMISSION_CREATED, submission, qr, eventId); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/wx/auth/mobile/MobileWxAuthAccessTokenInfo.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.wx.auth.mobile; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class MobileWxAuthAccessTokenInfo { 13 | private final String accessToken; 14 | private final String openId; 15 | private final String unionId; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/wx/auth/mobile/MobileWxAuthService.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.wx.auth.mobile; 2 | 3 | import java.util.Optional; 4 | 5 | public interface MobileWxAuthService { 6 | MobileWxAuthAccessTokenInfo fetchAccessToken(String code); 7 | 8 | MobileWxAuthUserInfo fetchUserInfo(String accessToken, String mobileWxOpenId); 9 | 10 | Optional getAccessToken(String unionId); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/wx/auth/mobile/MobileWxAuthUserInfo.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.wx.auth.mobile; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class MobileWxAuthUserInfo { 13 | private final String openId; 14 | private final String nickname; 15 | private final String headerImageUrl; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/wx/auth/pc/PcWxAuthAccessTokenInfo.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.wx.auth.pc; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class PcWxAuthAccessTokenInfo { 13 | private final String accessToken; 14 | private final String openId; 15 | private final String unionId; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/wx/auth/pc/PcWxAuthService.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.wx.auth.pc; 2 | 3 | import java.util.Optional; 4 | 5 | public interface PcWxAuthService { 6 | PcWxAuthAccessTokenInfo fetchAccessToken(String code); 7 | 8 | PcWxAuthUserInfo fetchUserInfo(String accessToken, String pcWxOpenId); 9 | 10 | Optional getAccessToken(String unionId); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/wx/auth/pc/PcWxAuthUserInfo.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.wx.auth.pc; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class PcWxAuthUserInfo { 13 | private final String openId; 14 | private final String nickname; 15 | private final String headerImageUrl; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/wx/jssdk/FetchWxJsSdkConfigQuery.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.wx.jssdk; 2 | 3 | import com.mryqr.common.utils.Query; 4 | import jakarta.validation.constraints.NotBlank; 5 | import jakarta.validation.constraints.Size; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static com.mryqr.common.utils.MryConstants.MAX_URL_LENGTH; 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class FetchWxJsSdkConfigQuery implements Query { 17 | @NotBlank 18 | @Size(max = MAX_URL_LENGTH) 19 | private final String url; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/wx/jssdk/QJsSdkConfig.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.wx.jssdk; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class QJsSdkConfig { 13 | private final String url; 14 | private final String appId; 15 | private final long timestamp; 16 | private final String nonce; 17 | private final String signature; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/wx/pay/WxPayService.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.wx.pay; 2 | 3 | import com.mryqr.common.wx.pay.notify.WxNotifyResult; 4 | import com.mryqr.core.order.domain.Order; 5 | import org.springframework.http.HttpHeaders; 6 | 7 | public interface WxPayService { 8 | 9 | String createWxPayOrder(Order order); 10 | 11 | boolean validateCallbackSignature(HttpHeaders headers, String body); 12 | 13 | WxNotifyResult extractResultFromCallback(String body); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/common/wx/pay/notify/WxNotifyResult.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.common.wx.pay.notify; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.time.Instant; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class WxNotifyResult { 15 | private String wxTxnId; 16 | private String orderId; 17 | private Instant paidAt; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/command/CreateAppCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import jakarta.validation.constraints.NotBlank; 5 | import jakarta.validation.constraints.Size; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static com.mryqr.common.utils.MryConstants.MAX_GENERIC_NAME_LENGTH; 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class CreateAppCommand implements Command { 17 | @NotBlank 18 | @Size(max = MAX_GENERIC_NAME_LENGTH) 19 | private final String name; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/command/CreateAppResponse.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.command; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class CreateAppResponse { 13 | private final String appId; 14 | private final String defaultGroupId; 15 | private final String homePageId; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/command/RenameAppCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import jakarta.validation.constraints.NotBlank; 5 | import jakarta.validation.constraints.Size; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static com.mryqr.common.utils.MryConstants.MAX_GENERIC_NAME_LENGTH; 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class RenameAppCommand implements Command { 17 | @NotBlank 18 | @Size(max = MAX_GENERIC_NAME_LENGTH) 19 | private final String name; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/command/UpdateAppReportSettingCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import com.mryqr.core.app.domain.report.ReportSetting; 5 | import jakarta.validation.Valid; 6 | import jakarta.validation.constraints.NotNull; 7 | import lombok.AllArgsConstructor; 8 | import lombok.Builder; 9 | import lombok.Value; 10 | 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class UpdateAppReportSettingCommand implements Command { 17 | @Valid 18 | @NotNull 19 | private final ReportSetting setting; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/command/UpdateAppResponse.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.command; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class UpdateAppResponse { 13 | private final String updatedVersion; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/command/UpdateAppSettingCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import com.mryqr.core.app.domain.AppSetting; 5 | import jakarta.validation.Valid; 6 | import jakarta.validation.constraints.NotNull; 7 | import jakarta.validation.constraints.Size; 8 | import lombok.AllArgsConstructor; 9 | import lombok.Builder; 10 | import lombok.Value; 11 | 12 | import static lombok.AccessLevel.PRIVATE; 13 | 14 | @Value 15 | @Builder 16 | @AllArgsConstructor(access = PRIVATE) 17 | public class UpdateAppSettingCommand implements Command { 18 | @Valid 19 | @NotNull 20 | private final AppSetting setting; 21 | 22 | @NotNull 23 | @Size(max = 50) 24 | private final String version; 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/CreateAppResult.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain; 2 | 3 | import com.mryqr.core.group.domain.Group; 4 | import com.mryqr.core.grouphierarchy.domain.GroupHierarchy; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Getter; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class CreateAppResult { 15 | private final App app; 16 | private final Group defaultGroup; 17 | private final GroupHierarchy groupHierarchy; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/QrWebhookType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain; 2 | 3 | public enum QrWebhookType { 4 | ON_CREATE, 5 | ON_UPDATE, 6 | ON_DELETE 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/TenantCachedApps.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.util.List; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class TenantCachedApps { 15 | private final List apps; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/UpdateAppSettingResult.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain; 2 | 3 | import com.mryqr.core.app.domain.page.control.ControlType; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import java.util.Set; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class UpdateAppSettingResult { 16 | private final Set newlyAddedControlTypes; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/attribute/AttributeAware.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.attribute; 2 | 3 | import java.util.Set; 4 | 5 | public interface AttributeAware { 6 | 7 | Set awaredAttributeIds(); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/attribute/AttributeCheckChangeResult.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.attribute; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.util.Set; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class AttributeCheckChangeResult { 15 | private final Set createdAttributes; 16 | private final Set deletedAttributes; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/attribute/AttributeInfo.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.attribute; 2 | 3 | import com.mryqr.common.domain.ValueType; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Value 11 | @Builder 12 | @AllArgsConstructor(access = PRIVATE) 13 | public class AttributeInfo { 14 | private String attributeId; 15 | private AttributeType attributeType; 16 | private ValueType valueType; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/config/AppLandingPageType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.config; 2 | 3 | public enum AppLandingPageType { 4 | DEFAULT, 5 | QR_LIST, 6 | GROUP_LIST, 7 | FIRST_QR 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/event/AppAwareDomainEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import com.mryqr.common.event.DomainEvent; 5 | import com.mryqr.common.event.DomainEventType; 6 | import lombok.Getter; 7 | import lombok.NoArgsConstructor; 8 | 9 | import static lombok.AccessLevel.PROTECTED; 10 | 11 | @Getter 12 | @NoArgsConstructor(access = PROTECTED) 13 | public abstract class AppAwareDomainEvent extends DomainEvent { 14 | private String appId; 15 | 16 | public AppAwareDomainEvent(DomainEventType type, String appId, User user) { 17 | super(type, user); 18 | this.appId = appId; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/event/AppCreatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.APP_CREATED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("APP_CREATED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class AppCreatedEvent extends AppAwareDomainEvent { 15 | 16 | public AppCreatedEvent(String appId, User user) { 17 | super(APP_CREATED, appId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/event/AppDeletedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.APP_DELETED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | 12 | @Getter 13 | @TypeAlias("APP_DELETED_EVENT") 14 | @NoArgsConstructor(access = PRIVATE) 15 | public class AppDeletedEvent extends AppAwareDomainEvent { 16 | 17 | public AppDeletedEvent(String appId, User user) { 18 | super(APP_DELETED, appId, user); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/event/AppGroupSyncEnabledEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.APP_GROUP_SYNC_ENABLED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("APP_GROUP_SYNC_ENABLED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class AppGroupSyncEnabledEvent extends AppAwareDomainEvent { 15 | 16 | public AppGroupSyncEnabledEvent(String appId, User user) { 17 | super(APP_GROUP_SYNC_ENABLED, appId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/event/DeletedAttributeInfo.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.event; 2 | 3 | import com.mryqr.common.domain.ValueType; 4 | import com.mryqr.common.domain.indexedfield.IndexedField; 5 | import com.mryqr.core.app.domain.attribute.AttributeType; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class DeletedAttributeInfo { 16 | private String attributeId; 17 | private AttributeType type; 18 | private ValueType valueType; 19 | private IndexedField indexedField; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/event/DeletedControlInfo.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.event; 2 | 3 | import com.mryqr.common.domain.indexedfield.IndexedField; 4 | import com.mryqr.core.app.domain.page.control.ControlType; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Value; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class DeletedControlInfo { 15 | private String pageId; 16 | private String controlId; 17 | private IndexedField indexedField; 18 | private ControlType controlType; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/event/DeletedTextOptionInfo.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.event; 2 | 3 | import com.mryqr.core.app.domain.page.control.ControlType; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Value 11 | @Builder 12 | @AllArgsConstructor(access = PRIVATE) 13 | public class DeletedTextOptionInfo { 14 | private String controlId; 15 | private String pageId; 16 | private ControlType controlType; 17 | private String optionId; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/operationmenu/SubmissionListType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.operationmenu; 2 | 3 | public enum SubmissionListType { 4 | ALL_SUBMIT_HISTORY,//所有提交人的提交历史 5 | SUBMITTER_SUBMISSION,//提交者自己的提交记录 6 | TO_BE_APPROVED//待审批 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/page/PageAware.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.page; 2 | 3 | import java.util.Set; 4 | 5 | public interface PageAware { 6 | 7 | Set awaredPageIds(); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/page/PageInfo.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.page; 2 | 3 | import com.mryqr.core.app.domain.page.control.ControlInfo; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import java.util.Set; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class PageInfo { 16 | private String pageId; 17 | private Set controlInfos; 18 | 19 | public boolean isFillable() { 20 | return controlInfos.stream().anyMatch(info -> info.getControlType().isFillable()); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/page/control/AnswerUniqueType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.page.control; 2 | 3 | public enum AnswerUniqueType { 4 | NONE, 5 | UNIQUE_PER_APP, 6 | UNIQUE_PER_INSTANCE 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/page/control/ControlAware.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.page.control; 2 | 3 | import java.util.Set; 4 | 5 | public interface ControlAware { 6 | Set awaredControlIds(); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/page/control/ControlInfo.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.page.control; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class ControlInfo { 13 | private String pageId; 14 | private String controlId; 15 | private ControlType controlType; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/page/control/FileCategory.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.page.control; 2 | 3 | public enum FileCategory { 4 | ANY, 5 | IMAGE, 6 | DOCUMENT, 7 | VIDEO, 8 | AUDIO, 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/page/control/FileCompressType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.page.control; 2 | 3 | public enum FileCompressType { 4 | VERY_HIGH, 5 | HIGH, 6 | MEDIUM, 7 | LOW, 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/page/control/IdentifierFormatType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.page.control; 2 | 3 | public enum IdentifierFormatType { 4 | NONE, 5 | ID_CARD, 6 | CAR_PLATE_ID, 7 | NUMBER_ONLY, 8 | REGEX 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/page/control/MultiLevelSelectionPrecisionType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.page.control; 2 | 3 | public enum MultiLevelSelectionPrecisionType { 4 | LEVEL1, 5 | LEVEL2, 6 | LEVEL3, 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/page/control/TextOptionInfo.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.page.control; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class TextOptionInfo { 13 | private String controlId; 14 | private ControlType controlType; 15 | private String optionId; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/page/header/PageHeaderType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.page.header; 2 | 3 | public enum PageHeaderType { 4 | CUSTOM,//自定义 5 | INHERITED//继承首页 6 | } 7 | 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/page/setting/AfterSubmitNavigationType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.page.setting; 2 | 3 | public enum AfterSubmitNavigationType { 4 | DEFAULT,//系统默认 5 | INTERNAL_PAGE,//内部页面 6 | EXTERNAL_URL//外部链接 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/page/setting/SubmissionWebhookType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.page.setting; 2 | 3 | public enum SubmissionWebhookType { 4 | ON_CREATE, 5 | ON_UPDATE, 6 | ON_APPROVAL, 7 | ON_DELETE 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/page/setting/SubmitType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.page.setting; 2 | 3 | public enum SubmitType { 4 | NEW, 5 | ONCE_PER_INSTANCE, 6 | ONCE_PER_MEMBER 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/page/setting/notification/NotificationRole.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.page.setting.notification; 2 | 3 | public enum NotificationRole { 4 | APP_MANAGER, 5 | GROUP_MANAGER, 6 | SUBMITTER, 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/plate/PlateQrPropertyType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.plate; 2 | 3 | public enum PlateQrPropertyType { 4 | QR_ID, 5 | QR_NAME, 6 | QR_GROUP_NAME, 7 | QR_CUSTOM_ID, 8 | QR_PLATE_ID, 9 | APP_NAME, 10 | TENANT_NAME 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/plate/PlateTextValueType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.plate; 2 | 3 | public enum PlateTextValueType { 4 | FIXED_TEXT, 5 | QR_PROPERTY, 6 | QR_ATTRIBUTE, 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/plate/control/PlateControlType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.plate.control; 2 | 3 | public enum PlateControlType { 4 | QR_IMAGE, 5 | SINGLE_ROW_TEXT, 6 | TABLE, 7 | KEY_VALUE, 8 | HEADER_IMAGE, 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/report/chart/ChartReportConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.report.chart; 2 | 3 | import jakarta.validation.constraints.Max; 4 | import jakarta.validation.constraints.Min; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Value; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class ChartReportConfiguration { 15 | 16 | @Min(0) 17 | @Max(50) 18 | private final int gutter; 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/report/chart/ChartReportType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.report.chart; 2 | 3 | public enum ChartReportType { 4 | CONTROL_BAR_REPORT, 5 | CONTROL_DOUGHNUT_REPORT, 6 | CONTROL_NUMBER_RANGE_REPORT, 7 | CONTROL_PIE_REPORT, 8 | CONTROL_TIME_SEGMENT_REPORT, 9 | ATTRIBUTE_BAR_REPORT, 10 | ATTRIBUTE_DOUGHNUT_REPORT, 11 | ATTRIBUTE_NUMBER_RANGE_SEGMENT_REPORT, 12 | ATTRIBUTE_PIE_REPORT, 13 | ATTRIBUTE_TIME_SEGMENT_REPORT 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/report/number/NumberReportConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.report.number; 2 | 3 | import jakarta.validation.constraints.Max; 4 | import jakarta.validation.constraints.Min; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Value; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class NumberReportConfiguration { 15 | @Min(3) 16 | @Max(8) 17 | private int reportPerLine;//每行报告数量 18 | 19 | @Min(0) 20 | @Max(50) 21 | private int gutter;//各项报告间隙 22 | 23 | @Min(50) 24 | @Max(200) 25 | private int height;//单个report的高度 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/report/number/NumberReportType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.report.number; 2 | 3 | public enum NumberReportType { 4 | INSTANCE_NUMBER_REPORT, 5 | PAGE_NUMBER_REPORT, 6 | ATTRIBUTE_NUMBER_REPORT, 7 | CONTROL_NUMBER_REPORT, 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/report/number/instance/InstanceNumberReportType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.report.number.instance; 2 | 3 | public enum InstanceNumberReportType { 4 | INSTANCE_COUNT, 5 | INSTANCE_SUBMIT_COUNT, 6 | ACCESSED_INSTANCE_COUNT,//被访问过的QR数量 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/report/number/page/PageNumberReportType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.report.number.page; 2 | 3 | public enum PageNumberReportType { 4 | PAGE_SUBMIT_COUNT, 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/ui/ImageCropType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.ui; 2 | 3 | public enum ImageCropType { 4 | NO_CROP, 5 | ANY_CROP, 6 | TWO_TO_ONE, 7 | FOUR_TO_THREE, 8 | SIXTEEN_TO_NINE, 9 | ONE_TO_ONE, 10 | NINE_TO_SIXTEEN, 11 | THREE_TO_FOUR, 12 | ONE_TO_TWO, 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/ui/MarkdownStyle.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.ui; 2 | 3 | import jakarta.validation.Valid; 4 | import jakarta.validation.constraints.Max; 5 | import jakarta.validation.constraints.Min; 6 | import jakarta.validation.constraints.NotNull; 7 | import lombok.AllArgsConstructor; 8 | import lombok.Builder; 9 | import lombok.Value; 10 | 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class MarkdownStyle { 17 | @Valid 18 | @NotNull 19 | private final FontStyle fontStyle;//字体类型 20 | 21 | @Min(1) 22 | @Max(2) 23 | private final float lineHeight;//行高 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/ui/VerticalPosition.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.ui; 2 | 3 | public enum VerticalPosition { 4 | TOP, 5 | BOTTOM 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/ui/align/HorizontalAlignType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.ui.align; 2 | 3 | public enum HorizontalAlignType { 4 | JUSTIFY,//居左 5 | CENTER,//居中 6 | RIGHT//居右 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/ui/align/HorizontalPositionType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.ui.align; 2 | 3 | public enum HorizontalPositionType { 4 | LEFT, 5 | RIGHT 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/ui/align/VerticalAlignType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.ui.align; 2 | 3 | public enum VerticalAlignType { 4 | TOP, 5 | MIDDLE, 6 | BOTTOM 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/ui/border/BorderSide.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.ui.border; 2 | 3 | public enum BorderSide { 4 | TOP, 5 | BOTTOM, 6 | LEFT, 7 | RIGHT 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/ui/border/BorderType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.ui.border; 2 | 3 | public enum BorderType { 4 | NONE, 5 | SOLID, 6 | DASHED, 7 | DOTTED 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/ui/pagelink/PageLinkType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.ui.pagelink; 2 | 3 | public enum PageLinkType { 4 | EXTERNAL_URL, 5 | PAGE, 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/domain/ui/shadow/Shadow.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.domain.ui.shadow; 2 | 3 | import com.mryqr.common.validation.color.Color; 4 | import jakarta.validation.constraints.Max; 5 | import jakarta.validation.constraints.Min; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class Shadow { 16 | @Min(0) 17 | @Max(100) 18 | private final int width;//边框宽度 19 | 20 | @Color 21 | private final String color;//阴影颜色 22 | 23 | public static Shadow noShadow() { 24 | return Shadow.builder().width(0).color("rgba(0, 0, 0, 0.1)").build(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/query/QAppFirstQr.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.query; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class QAppFirstQr { 13 | private final String id; 14 | private final String plateId; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/query/QAppResourceUsages.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.query; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class QAppResourceUsages { 13 | private final int usedQrCount; 14 | private final int usedGroupCount; 15 | private final int usedSubmissionCount; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/query/QAppWebhookSetting.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.query; 2 | 3 | import com.mryqr.core.app.domain.WebhookSetting; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Value 11 | @Builder 12 | @AllArgsConstructor(access = PRIVATE) 13 | public class QAppWebhookSetting { 14 | private final WebhookSetting webhookSetting; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/query/QManagedListApp.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.query; 2 | 3 | import com.mryqr.common.domain.UploadedFile; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import java.time.Instant; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class QManagedListApp { 16 | private String id; 17 | private String name; 18 | private Instant createdAt; 19 | private String createdBy; 20 | private String creator; 21 | private boolean active; 22 | private boolean locked; 23 | private UploadedFile icon; 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/query/QUpdatableApp.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.query; 2 | 3 | import com.mryqr.core.app.domain.AppSetting; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Value 11 | @Builder 12 | @AllArgsConstructor(access = PRIVATE) 13 | public class QUpdatableApp { 14 | private String id; 15 | private String name; 16 | private String tenantId; 17 | private String version; 18 | private boolean webhookEnabled; 19 | private AppSetting setting; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/app/query/QViewableListApp.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.app.query; 2 | 3 | import com.mryqr.common.domain.UploadedFile; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Value 11 | @Builder 12 | @AllArgsConstructor(access = PRIVATE) 13 | public class QViewableListApp { 14 | private String id; 15 | private String name; 16 | private UploadedFile icon; 17 | private boolean locked; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/appmanual/command/UpdateAppManualCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.appmanual.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import jakarta.validation.constraints.Size; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Value; 8 | 9 | import static com.mryqr.common.utils.MryConstants.MAX_PARAGRAPH_LENGTH; 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class UpdateAppManualCommand implements Command { 16 | 17 | @Size(max = MAX_PARAGRAPH_LENGTH) 18 | private final String content; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/appmanual/domain/AppManualFactory.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.appmanual.domain; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import com.mryqr.core.app.domain.App; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.stereotype.Component; 7 | 8 | @Component 9 | @RequiredArgsConstructor 10 | public class AppManualFactory { 11 | public AppManual create(App app, String content, User user) { 12 | return new AppManual(app, content, user); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/appmanual/domain/AppManualRepository.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.appmanual.domain; 2 | 3 | import java.util.Optional; 4 | 5 | public interface AppManualRepository { 6 | Optional byAppIdOptional(String appId); 7 | 8 | void save(AppManual it); 9 | 10 | int removeAppManual(String appId); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/appmanual/query/QAppManual.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.appmanual.query; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class QAppManual { 13 | private final String id; 14 | private final String appId; 15 | private final String content; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/apptemplate/query/QListAppTemplate.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.apptemplate.query; 2 | 3 | import com.mryqr.common.domain.UploadedFile; 4 | import com.mryqr.core.plan.domain.PlanType; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Value; 8 | 9 | import java.util.List; 10 | 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class QListAppTemplate { 17 | private String id; 18 | private String name; 19 | private UploadedFile poster; 20 | private PlanType planType; 21 | private List features; 22 | private String cardDescription; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/assignment/domain/AssignmentFinishedQr.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.assignment.domain; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.time.Instant; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class AssignmentFinishedQr { 15 | private final String qrId; 16 | private final String submissionId; 17 | private final Instant finishedAt; 18 | private final String operatorId; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/assignment/domain/AssignmentStatus.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.assignment.domain; 2 | 3 | public enum AssignmentStatus { 4 | IN_PROGRESS(false, "进行中"), 5 | NEAR_EXPIRE(false, "即将超期"), 6 | SUCCEED(true, "正常完成"), 7 | FAILED(true, "超期未完成"); 8 | 9 | private final boolean closed; 10 | private final String name; 11 | 12 | AssignmentStatus(boolean closed, String name) { 13 | this.closed = closed; 14 | this.name = name; 15 | } 16 | 17 | public boolean isClosed() { 18 | return closed; 19 | } 20 | 21 | public String getName() { 22 | return name; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/assignment/domain/OpenAssignmentPages.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.assignment.domain; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.util.List; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class OpenAssignmentPages { 15 | private final List pageIds; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/assignmentplan/domain/AssignmentFrequency.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.assignmentplan.domain; 2 | 3 | public enum AssignmentFrequency { 4 | EVERY_DAY(true), 5 | EVERY_WEEK(true), 6 | EVERY_MONTH(false), 7 | EVERY_THREE_MONTH(false), 8 | EVERY_SIX_MONTH(false), 9 | EVERY_YEAR(false); 10 | 11 | private final boolean fixedCycle; 12 | 13 | AssignmentFrequency(boolean fixedTimeCycle) { 14 | this.fixedCycle = fixedTimeCycle; 15 | } 16 | 17 | public boolean isFixedTimeCycle() { 18 | return fixedCycle; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/assignmentplan/query/QAssignmentPlanSummary.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.assignmentplan.query; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class QAssignmentPlanSummary { 13 | private final String id; 14 | private final String name; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/department/command/RenameDepartmentCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.department.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import jakarta.validation.constraints.NotBlank; 5 | import jakarta.validation.constraints.Size; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static com.mryqr.common.utils.MryConstants.MAX_GENERIC_NAME_LENGTH; 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class RenameDepartmentCommand implements Command { 17 | @NotBlank 18 | @Size(max = MAX_GENERIC_NAME_LENGTH) 19 | private final String name; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/department/domain/TenantCachedDepartment.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.department.domain; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.util.List; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class TenantCachedDepartment { 15 | private final String id; 16 | private final String name; 17 | private final List managers; 18 | private String customId; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/department/domain/TenantCachedDepartments.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.department.domain; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.util.List; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class TenantCachedDepartments { 15 | private final List departments; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/departmenthierarchy/command/UpdateDepartmentHierarchyCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.departmenthierarchy.command; 2 | 3 | import com.mryqr.common.domain.idnode.IdTree; 4 | import com.mryqr.common.utils.Command; 5 | import jakarta.validation.Valid; 6 | import jakarta.validation.constraints.NotNull; 7 | import lombok.AllArgsConstructor; 8 | import lombok.Builder; 9 | import lombok.Value; 10 | 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class UpdateDepartmentHierarchyCommand implements Command { 17 | 18 | @Valid 19 | @NotNull 20 | private final IdTree idTree; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/departmenthierarchy/domain/DepartmentHierarchyRepository.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.departmenthierarchy.domain; 2 | 3 | public interface DepartmentHierarchyRepository { 4 | DepartmentHierarchy byTenantId(String tenantId); 5 | 6 | DepartmentHierarchy cachedByTenantId(String tenantId); 7 | 8 | void save(DepartmentHierarchy departmentHierarchy); 9 | 10 | void evictDepartmentHierarchyCache(String tenantId); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/group/command/RenameGroupCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.group.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import jakarta.validation.constraints.NotBlank; 5 | import jakarta.validation.constraints.Size; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static com.mryqr.common.utils.MryConstants.MAX_GENERIC_NAME_LENGTH; 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class RenameGroupCommand implements Command { 17 | @NotBlank 18 | @Size(max = MAX_GENERIC_NAME_LENGTH) 19 | private final String name; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/group/domain/AppCachedGroups.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.group.domain; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.util.List; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class AppCachedGroups { 15 | private final List groups; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/group/domain/GroupAware.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.group.domain; 2 | 3 | import java.util.Set; 4 | 5 | public interface GroupAware { 6 | Set awaredGroupIds(); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/group/domain/task/RemoveAllGroupsForAppTask.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.group.domain.task; 2 | 3 | import com.mryqr.common.domain.task.RetryableTask; 4 | import com.mryqr.core.group.domain.GroupRepository; 5 | import lombok.RequiredArgsConstructor; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Slf4j 10 | @Component 11 | @RequiredArgsConstructor 12 | public class RemoveAllGroupsForAppTask implements RetryableTask { 13 | private final GroupRepository groupRepository; 14 | 15 | public void run(String appId) { 16 | int count = groupRepository.removeAllGroupsUnderApp(appId); 17 | log.info("Removed all {} groups under app[{}].", count, appId); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/group/query/QGroupMembers.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.group.query; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.util.List; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class QGroupMembers { 15 | private final List memberIds; 16 | private final List managerIds; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/group/query/QGroupQr.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.group.query; 2 | 3 | import com.mryqr.common.domain.UploadedFile; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import java.time.Instant; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class QGroupQr { 16 | private final String id; 17 | private final String plateId; 18 | private final String name; 19 | private final String groupId; 20 | private final UploadedFile headerImage; 21 | private final Instant createdAt; 22 | private final boolean active; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/grouphierarchy/command/UpdateGroupHierarchyCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.grouphierarchy.command; 2 | 3 | import com.mryqr.common.domain.idnode.IdTree; 4 | import com.mryqr.common.utils.Command; 5 | import jakarta.validation.Valid; 6 | import jakarta.validation.constraints.NotNull; 7 | import lombok.AllArgsConstructor; 8 | import lombok.Builder; 9 | import lombok.Value; 10 | 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class UpdateGroupHierarchyCommand implements Command { 17 | 18 | @Valid 19 | @NotNull 20 | private final IdTree idTree; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/grouphierarchy/domain/GroupHierarchyRepository.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.grouphierarchy.domain; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | 5 | public interface GroupHierarchyRepository { 6 | GroupHierarchy byAppId(String appId); 7 | 8 | GroupHierarchy byAppIdAndCheckTenantShip(String appId, User user); 9 | 10 | GroupHierarchy cachedByAppId(String appId); 11 | 12 | int count(String tenantId); 13 | 14 | void save(GroupHierarchy groupHierarchy); 15 | 16 | void evictGroupHierarchyCache(String appId); 17 | 18 | int removeGroupHierarchyUnderApp(String appId); 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/kanban/query/QAttributeKanban.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.kanban.query; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.util.List; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class QAttributeKanban { 15 | private final List counts; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/kanban/query/QAttributeOptionCount.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.kanban.query; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class QAttributeOptionCount { 13 | private final String optionId; 14 | private final int count; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/login/command/ApiKeyLoginCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.login.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import jakarta.validation.constraints.NotBlank; 5 | import jakarta.validation.constraints.Size; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class ApiKeyLoginCommand implements Command { 16 | @NotBlank 17 | @Size(max = 50) 18 | private final String apiKey; 19 | 20 | @NotBlank 21 | @Size(max = 50) 22 | private final String apiSecret; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/login/command/JwtTokenResponse.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.login.command; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class JwtTokenResponse { 13 | private String token; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/login/domain/WxIdInfo.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.login.domain; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Value 11 | @Builder 12 | @AllArgsConstructor(access = PRIVATE) 13 | public class WxIdInfo { 14 | private String pcWxOpenId; 15 | private String mobileWxOpenId; 16 | private String wxUnionId; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/member/command/ResetMemberPasswordCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.member.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import com.mryqr.common.validation.password.Password; 5 | import jakarta.validation.constraints.NotNull; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class ResetMemberPasswordCommand implements Command { 16 | @NotNull 17 | @Password 18 | private final String password; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/member/command/UpdateMyAvatarCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.member.command; 2 | 3 | import com.mryqr.common.domain.UploadedFile; 4 | import com.mryqr.common.utils.Command; 5 | import jakarta.validation.Valid; 6 | import jakarta.validation.constraints.NotNull; 7 | import lombok.AllArgsConstructor; 8 | import lombok.Builder; 9 | import lombok.Value; 10 | 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class UpdateMyAvatarCommand implements Command { 17 | 18 | @Valid 19 | @NotNull 20 | private final UploadedFile avatar; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/member/command/UpdateMyBaseSettingCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.member.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import jakarta.validation.constraints.NotBlank; 5 | import jakarta.validation.constraints.Size; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static com.mryqr.common.utils.MryConstants.MAX_GENERIC_NAME_LENGTH; 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class UpdateMyBaseSettingCommand implements Command { 17 | @NotBlank 18 | @Size(max = MAX_GENERIC_NAME_LENGTH) 19 | private final String name; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/member/command/importmember/MemberImportResponse.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.member.command.importmember; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.util.List; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class MemberImportResponse { 15 | private final int readCount; 16 | private final int importedCount; 17 | private final List errorRecords; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/member/domain/IdentityCard.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.member.domain; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class IdentityCard { 13 | private String number; 14 | private String name; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/member/domain/MemberAware.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.member.domain; 2 | 3 | import java.util.Set; 4 | 5 | public interface MemberAware { 6 | Set awaredMemberIds(); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/member/domain/TenantCachedMembers.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.member.domain; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.util.List; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class TenantCachedMembers { 15 | private final List members; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/member/domain/task/SyncMemberNameToAggregateRootsTask.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.member.domain.task; 2 | 3 | import com.mryqr.common.domain.task.RetryableTask; 4 | import com.mryqr.core.member.domain.MemberRepository; 5 | import lombok.RequiredArgsConstructor; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Slf4j 10 | @Component 11 | @RequiredArgsConstructor 12 | public class SyncMemberNameToAggregateRootsTask implements RetryableTask { 13 | private final MemberRepository memberRepository; 14 | 15 | public void run(String memberId) { 16 | memberRepository.byIdOptional(memberId).ifPresent(memberRepository::syncMemberNameToAllArs); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/member/query/QMemberBaseSetting.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.member.query; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class QMemberBaseSetting { 13 | private final String id; 14 | private final String name; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/member/query/QMemberInfo.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.member.query; 2 | 3 | import com.mryqr.common.domain.user.Role; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import java.util.List; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class QMemberInfo { 16 | private String memberId; 17 | private String tenantId; 18 | private String name; 19 | private String email; 20 | private String mobile; 21 | private Role role; 22 | private String wxNickName; 23 | private boolean wxBound; 24 | private List departments; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/member/query/QMemberReference.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.member.query; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class QMemberReference { 13 | private final String id; 14 | private final String showName; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/command/CreateOrderCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import com.mryqr.core.order.domain.PaymentType; 5 | import com.mryqr.core.order.domain.detail.OrderDetail; 6 | import jakarta.validation.Valid; 7 | import jakarta.validation.constraints.NotNull; 8 | import lombok.AllArgsConstructor; 9 | import lombok.Builder; 10 | import lombok.Value; 11 | 12 | import static lombok.AccessLevel.PRIVATE; 13 | 14 | @Value 15 | @Builder 16 | @AllArgsConstructor(access = PRIVATE) 17 | public class CreateOrderCommand implements Command { 18 | @Valid 19 | @NotNull 20 | private final OrderDetail detail; 21 | 22 | @NotNull 23 | private final PaymentType paymentType; 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/domain/OrderPrice.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.domain; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class OrderPrice { 13 | private final String originalUpgradePrice; 14 | private final String originalRenewalPrice; 15 | private final String originalTotalPrice; 16 | 17 | private final String deliveryFee; 18 | 19 | private final String discount; 20 | private final String discountOffsetPrice; 21 | private final String discountedTotalPrice; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/domain/OrderRepository.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.domain; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | 5 | import java.util.Optional; 6 | 7 | public interface OrderRepository { 8 | void save(Order it); 9 | 10 | Order byId(String id); 11 | 12 | Optional byIdOptional(String id); 13 | 14 | Order byIdAndCheckTenantShip(String id, User user); 15 | 16 | void delete(Order it); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/domain/OrderStatus.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.domain; 2 | 3 | public enum OrderStatus { 4 | CREATED("新建"), 5 | PAID("已支付"), 6 | REFUNDED("已退款"); 7 | 8 | private final String name; 9 | 10 | OrderStatus(String name) { 11 | this.name = name; 12 | } 13 | 14 | public String getName() { 15 | return name; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/domain/PaymentType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.domain; 2 | 3 | public enum PaymentType { 4 | WX_NATIVE("在线微信支付"), 5 | WX_TRANSFER("线下微信转账"), 6 | BANK_TRANSFER("银行对公转账"); 7 | 8 | private final String name; 9 | 10 | PaymentType(String name) { 11 | this.name = name; 12 | } 13 | 14 | public String getName() { 15 | return name; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/domain/delivery/Carrier.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.domain.delivery; 2 | 3 | public enum Carrier { 4 | EMS("EMS", "EMS"), 5 | SHUN_FENG("顺丰", "SFEXPRESS"), 6 | YUAN_TONG("圆通", "YTO"), 7 | ZHONG_TONG("中通", "ZTO"), 8 | ZHONG_TONG_56("中通快运", "ZTO56"), 9 | SHEN_TONG("申通", "STO"), 10 | YUN_DA("韵达", "YUNDA"), 11 | YUN_DA_56("韵达快运", "YUNDA56"); 12 | 13 | private final String name; 14 | private final String type; 15 | 16 | Carrier(String name, String type) { 17 | this.name = name; 18 | this.type = type; 19 | } 20 | 21 | public String getName() { 22 | return name; 23 | } 24 | 25 | public String getType() { 26 | return type; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/domain/delivery/Delivery.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.domain.delivery; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class Delivery { 13 | private final Carrier carrier; 14 | private final String deliveryOrderId; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/domain/detail/ExtraSmsAmountType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.domain.detail; 2 | 3 | public enum ExtraSmsAmountType { 4 | ONE_K(1000, 80), 5 | TWO_K(2000, 160), 6 | FIVE_K(5000, 350), 7 | TEN_K(10000, 600), 8 | TWENTY_K(20000, 1000), 9 | FIFTY_K(50000, 2500); 10 | 11 | private final int amount; 12 | private final int price; 13 | 14 | ExtraSmsAmountType(int amount, int price) { 15 | this.amount = amount; 16 | this.price = price; 17 | } 18 | 19 | public int getAmount() { 20 | return amount; 21 | } 22 | 23 | public int getPrice() { 24 | return price; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/domain/detail/OrderDetailType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.domain.detail; 2 | 3 | public enum OrderDetailType { 4 | PLAN("购买套餐"), 5 | EXTRA_MEMBER("增购成员"), 6 | EXTRA_STORAGE("增购存储空间"), 7 | EXTRA_SMS("增购短信量"), 8 | EXTRA_VIDEO_TRAFFIC("增购视频流量"), 9 | PLATE_PRINTING("码牌印刷"); 10 | 11 | private final String name; 12 | 13 | OrderDetailType(String name) { 14 | this.name = name; 15 | } 16 | 17 | public String getName() { 18 | return name; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/domain/event/OrderBankTransferUpdatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.ORDER_BANK_TRANSFER_UPDATED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("ORDER_BANK_TRANSFER_UPDATED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class OrderBankTransferUpdatedEvent extends OrderUpdatedEvent { 15 | 16 | public OrderBankTransferUpdatedEvent(String orderId, User user) { 17 | super(ORDER_BANK_TRANSFER_UPDATED, orderId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/domain/event/OrderDeliveryUpdatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.ORDER_DELIVERY_UPDATED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("ORDER_DELIVERY_UPDATED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class OrderDeliveryUpdatedEvent extends OrderUpdatedEvent { 15 | 16 | public OrderDeliveryUpdatedEvent(String orderId, User user) { 17 | super(ORDER_DELIVERY_UPDATED, orderId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/domain/event/OrderInvoiceIssuedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.ORDER_INVOICE_ISSUED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("ORDER_INVOICE_ISSUED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class OrderInvoiceIssuedEvent extends OrderUpdatedEvent { 15 | 16 | public OrderInvoiceIssuedEvent(String orderId, User user) { 17 | super(ORDER_INVOICE_ISSUED, orderId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/domain/event/OrderInvoiceRequestedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.ORDER_INVOICE_REQUESTED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("ORDER_INVOICE_REQUESTED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class OrderInvoiceRequestedEvent extends OrderUpdatedEvent { 15 | 16 | public OrderInvoiceRequestedEvent(String orderId, User user) { 17 | super(ORDER_INVOICE_REQUESTED, orderId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/domain/event/OrderRefundUpdatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.ORDER_REFUND_UPDATED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("ORDER_REFUND_UPDATE_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class OrderRefundUpdatedEvent extends OrderUpdatedEvent { 15 | 16 | public OrderRefundUpdatedEvent(String orderId, User user) { 17 | super(ORDER_REFUND_UPDATED, orderId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/domain/event/OrderUpdatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import com.mryqr.common.event.DomainEvent; 5 | import com.mryqr.common.event.DomainEventType; 6 | import lombok.Getter; 7 | import lombok.NoArgsConstructor; 8 | 9 | import static lombok.AccessLevel.PROTECTED; 10 | 11 | @Getter 12 | @NoArgsConstructor(access = PROTECTED) 13 | public class OrderUpdatedEvent extends DomainEvent { 14 | private String orderId; 15 | 16 | public OrderUpdatedEvent(DomainEventType type, String orderId, User user) { 17 | super(type, user); 18 | this.orderId = orderId; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/domain/event/OrderWxPayUpdatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.ORDER_WX_PAY_UPDATED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("ORDER_WX_PAY_UPDATED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class OrderWxPayUpdatedEvent extends OrderUpdatedEvent { 15 | 16 | public OrderWxPayUpdatedEvent(String orderId, User user) { 17 | super(ORDER_WX_PAY_UPDATED, orderId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/domain/event/OrderWxTransferUpdatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.ORDER_WX_TRANSFER_UPDATED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("ORDER_WX_TRANSFER_UPDATED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class OrderWxTransferUpdatedEvent extends OrderUpdatedEvent { 15 | 16 | public OrderWxTransferUpdatedEvent(String orderId, User user) { 17 | super(ORDER_WX_TRANSFER_UPDATED, orderId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/domain/invoice/InvoiceType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.domain.invoice; 2 | 3 | public enum InvoiceType { 4 | PERSONAL("个人"), 5 | VAT_NORMAL("增值税普通发票"), 6 | VAT_SPECIAL("增值税专用发票"); 7 | 8 | private final String name; 9 | 10 | InvoiceType(String name) { 11 | this.name = name; 12 | } 13 | 14 | public String getName() { 15 | return name; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/query/ListOrdersQuery.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.query; 2 | 3 | import com.mryqr.common.utils.Query; 4 | import jakarta.validation.constraints.Max; 5 | import jakarta.validation.constraints.Min; 6 | import jakarta.validation.constraints.Size; 7 | import lombok.AllArgsConstructor; 8 | import lombok.Builder; 9 | import lombok.Value; 10 | 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class ListOrdersQuery implements Query { 17 | 18 | @Size(max = 50) 19 | private final String search; 20 | 21 | @Min(1) 22 | private final int pageIndex; 23 | 24 | @Min(10) 25 | @Max(100) 26 | private final int pageSize; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/query/QPriceQuotation.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.query; 2 | 3 | import com.mryqr.core.order.domain.OrderPrice; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Value 11 | @Builder 12 | @AllArgsConstructor(access = PRIVATE) 13 | public class QPriceQuotation { 14 | private final OrderPrice price; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/query/QuotePriceQuery.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.query; 2 | 3 | import com.mryqr.common.utils.Query; 4 | import com.mryqr.core.order.domain.detail.OrderDetail; 5 | import jakarta.validation.Valid; 6 | import jakarta.validation.constraints.NotNull; 7 | import lombok.AllArgsConstructor; 8 | import lombok.Builder; 9 | import lombok.Value; 10 | 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class QuotePriceQuery implements Query { 17 | 18 | @Valid 19 | @NotNull 20 | private final OrderDetail detail; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/order/query/ShipmentNode.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.order.query; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class ShipmentNode { 13 | private final String time; 14 | private final String status; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/plate/domain/task/RemoveAllPlatesUnderAppTask.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.plate.domain.task; 2 | 3 | import com.mryqr.common.domain.task.RetryableTask; 4 | import com.mryqr.core.plate.domain.PlateRepository; 5 | import lombok.RequiredArgsConstructor; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Slf4j 10 | @Component 11 | @RequiredArgsConstructor 12 | public class RemoveAllPlatesUnderAppTask implements RetryableTask { 13 | private final PlateRepository plateRepository; 14 | 15 | public void run(String appId) { 16 | int count = plateRepository.removeAllPlatesUnderApp(appId); 17 | log.info("Removed all {} plates under app[{}].", count, appId); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/plate/domain/task/UnbindAllPlatesUnderGroupTask.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.plate.domain.task; 2 | 3 | import com.mryqr.common.domain.task.RetryableTask; 4 | import com.mryqr.core.plate.domain.PlateRepository; 5 | import lombok.RequiredArgsConstructor; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Slf4j 10 | @Component 11 | @RequiredArgsConstructor 12 | public class UnbindAllPlatesUnderGroupTask implements RetryableTask { 13 | private final PlateRepository plateRepository; 14 | 15 | public void run(String groupId) { 16 | int count = plateRepository.unbindAllPlatesUnderGroup(groupId); 17 | log.info("Unbound {} plates from group[{}].", count, groupId); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/platebatch/command/RenamePlateBatchCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.platebatch.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import jakarta.validation.constraints.NotBlank; 5 | import jakarta.validation.constraints.Size; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static com.mryqr.common.utils.MryConstants.MAX_GENERIC_NAME_LENGTH; 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class RenamePlateBatchCommand implements Command { 17 | @NotBlank 18 | @Size(max = MAX_GENERIC_NAME_LENGTH) 19 | private final String name; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/platebatch/domain/CreatePlateBatchResult.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.platebatch.domain; 2 | 3 | import com.mryqr.core.plate.domain.Plate; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Getter; 7 | 8 | import java.util.List; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Getter 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class CreatePlateBatchResult { 16 | private final PlateBatch plateBatch; 17 | private final List plates; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/platebatch/domain/PlateBatchRepository.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.platebatch.domain; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | 5 | import java.util.Optional; 6 | 7 | public interface PlateBatchRepository { 8 | boolean existsByName(String name, String appId); 9 | 10 | void save(PlateBatch it); 11 | 12 | void delete(PlateBatch it); 13 | 14 | PlateBatch byId(String id); 15 | 16 | Optional byIdOptional(String id); 17 | 18 | PlateBatch byIdAndCheckTenantShip(String id, User user); 19 | 20 | int count(String tenantId); 21 | 22 | int deltaCountUsedPlatesForPlateBatch(String plateBatchId, int delta); 23 | 24 | int removeAllPlateBatchUnderApp(String appId); 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/platebatch/query/QManagedListPlateBatch.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.platebatch.query; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.time.Instant; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class QManagedListPlateBatch { 15 | private final String id; 16 | private final String name; 17 | private final int totalCount; 18 | private final int usedCount; 19 | private final Instant createdAt; 20 | private final String createdBy; 21 | private final String creator; 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/platetemplate/command/UpdatePlateTemplateCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.platetemplate.command; 2 | 3 | import com.mryqr.common.domain.UploadedFile; 4 | import com.mryqr.common.utils.Command; 5 | import jakarta.validation.Valid; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class UpdatePlateTemplateCommand implements Command { 16 | 17 | @Valid 18 | private final UploadedFile image; 19 | 20 | private final int order; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/platetemplate/domain/PlateTemplateFactory.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.platetemplate.domain; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import com.mryqr.core.app.domain.App; 5 | import com.mryqr.core.app.domain.plate.PlateSetting; 6 | import lombok.RequiredArgsConstructor; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Component 10 | @RequiredArgsConstructor 11 | public class PlateTemplateFactory { 12 | 13 | public PlateTemplate create(App app, PlateSetting plateSetting, User user) { 14 | plateSetting.correct(); 15 | plateSetting.validate(app.getSetting().context()); 16 | return new PlateTemplate(plateSetting, user); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/platetemplate/domain/PlateTemplateRepository.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.platetemplate.domain; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | 5 | import java.util.Optional; 6 | 7 | public interface PlateTemplateRepository { 8 | void save(PlateTemplate it); 9 | 10 | void delete(PlateTemplate it); 11 | 12 | PlateTemplate byId(String id); 13 | 14 | Optional byIdOptional(String id); 15 | 16 | PlateTemplate byIdAndCheckTenantShip(String id, User user); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/platetemplate/query/QListPlateTemplate.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.platetemplate.query; 2 | 3 | import com.mryqr.common.domain.UploadedFile; 4 | import com.mryqr.core.app.domain.plate.PlateSetting; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Value; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class QListPlateTemplate { 15 | private final String id; 16 | private final PlateSetting plateSetting; 17 | private final UploadedFile image; 18 | private final int order; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/presentation/query/ControlPresentationer.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.presentation.query; 2 | 3 | import com.mryqr.core.app.domain.App; 4 | import com.mryqr.core.app.domain.page.control.Control; 5 | import com.mryqr.core.qr.domain.QR; 6 | 7 | public interface ControlPresentationer { 8 | boolean canHandle(Control control); 9 | 10 | QControlPresentation present(QR qr, Control control, App app); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/presentation/query/trend/QTrendDataSet.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.presentation.query.trend; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.util.List; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class QTrendDataSet { 15 | private final String label; 16 | private final List records; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/presentation/query/trend/QTrendRecord.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.presentation.query.trend; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class QTrendRecord { 13 | private final String date; 14 | private final Double number; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/printing/domain/MaterialType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.printing.domain; 2 | 3 | public enum MaterialType { 4 | TRANSPARENT_ACRYLIC("透明亚克力"), 5 | PORCELAIN_ACRYLIC("瓷白亚克力"), 6 | PVC_CARD("PVC卡"), 7 | SYNTHETIC_ADHESIVE("PVC不干胶"), 8 | ARGENTOUS_ADHESIVE("亚银不干胶"); 9 | 10 | private final String name; 11 | 12 | MaterialType(String name) { 13 | this.name = name; 14 | } 15 | 16 | public String getName() { 17 | return name; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/printing/query/QPlatePrintingType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.printing.query; 2 | 3 | import com.mryqr.core.printing.domain.MaterialType; 4 | import com.mryqr.core.printing.domain.PlatePrintingType; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Value; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class QPlatePrintingType { 15 | private PlatePrintingType type; 16 | private MaterialType materialType; 17 | private String size; 18 | private double unitPrice; 19 | private double deliveryFee; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/printing/query/QPrintingProduct.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.printing.query; 2 | 3 | import com.mryqr.common.domain.UploadedFile; 4 | import com.mryqr.core.printing.domain.MaterialType; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Value; 8 | 9 | import java.util.List; 10 | 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class QPrintingProduct { 17 | private String id; 18 | private String name; 19 | private UploadedFile image; 20 | private String description; 21 | private String introduction; 22 | private MaterialType materialType; 23 | private List printingTypes; 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/command/CreateQrResponse.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.command; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class CreateQrResponse { 13 | private final String qrId; 14 | private final String plateId; 15 | private final String groupId; 16 | private final String appId; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/command/RenameQrCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import jakarta.validation.constraints.NotBlank; 5 | import jakarta.validation.constraints.Size; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static com.mryqr.common.utils.MryConstants.MAX_GENERIC_NAME_LENGTH; 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class RenameQrCommand implements Command { 17 | @NotBlank 18 | @Size(max = MAX_GENERIC_NAME_LENGTH) 19 | private final String name; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/command/ResetQrCirculationStatusCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import com.mryqr.common.validation.id.shoruuid.ShortUuid; 5 | import jakarta.validation.constraints.NotBlank; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class ResetQrCirculationStatusCommand implements Command { 16 | 17 | @NotBlank 18 | @ShortUuid 19 | private final String circulationOptionId; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/command/ResetQrPlateCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import com.mryqr.common.validation.id.plate.PlateId; 5 | import jakarta.validation.constraints.NotBlank; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class ResetQrPlateCommand implements Command { 16 | @PlateId 17 | @NotBlank 18 | private final String plateId; 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/domain/AppedQr.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.domain; 2 | 3 | import com.mryqr.core.app.domain.App; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | public class AppedQr { 8 | private final QR qr; 9 | private final App app; 10 | 11 | public AppedQr(QR qr, App app) { 12 | if (!qr.getTenantId().equals(app.getTenantId())) { 13 | throw new IllegalStateException("QR and App are not under the same tenant."); 14 | } 15 | this.qr = qr; 16 | this.app = app; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/domain/PlatedQr.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.domain; 2 | 3 | import com.mryqr.core.plate.domain.Plate; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | public class PlatedQr { 8 | private final QR qr; 9 | private final Plate plate; 10 | 11 | public PlatedQr(QR qr, Plate plate) { 12 | if (!qr.getTenantId().equals(plate.getTenantId())) { 13 | throw new IllegalStateException("QR and Plate are not under the same tenant."); 14 | } 15 | this.qr = qr; 16 | this.plate = plate; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/domain/attribute/sync/calculator/AttributeValueCalculator.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.domain.attribute.sync.calculator; 2 | 3 | import com.mryqr.core.app.domain.App; 4 | import com.mryqr.core.app.domain.attribute.Attribute; 5 | import com.mryqr.core.qr.domain.QR; 6 | import com.mryqr.core.qr.domain.attribute.AttributeValue; 7 | 8 | public interface AttributeValueCalculator { 9 | boolean canCalculate(Attribute attribute, App app); 10 | 11 | AttributeValue calculate(Attribute attribute, QR qr, App app); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/domain/event/QrActivatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.QR_ACTIVATED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("QR_ACTIVATED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class QrActivatedEvent extends QrUpdatedEvent { 15 | 16 | public QrActivatedEvent(String qrId, String appId, User user) { 17 | super(QR_ACTIVATED, qrId, appId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/domain/event/QrAttributesUpdatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.QR_ATTRIBUTES_UPDATED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("QR_ATTRIBUTES_UPDATED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class QrAttributesUpdatedEvent extends QrUpdatedEvent { 15 | 16 | public QrAttributesUpdatedEvent(String qrId, String appId, User user) { 17 | super(QR_ATTRIBUTES_UPDATED, qrId, appId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/domain/event/QrBaseSettingUpdatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.QR_BASE_SETTING_UPDATED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("QR_BASE_SETTING_UPDATED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class QrBaseSettingUpdatedEvent extends QrUpdatedEvent { 15 | 16 | public QrBaseSettingUpdatedEvent(String qrId, String appId, User user) { 17 | super(QR_BASE_SETTING_UPDATED, qrId, appId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/domain/event/QrDeactivatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.QR_DEACTIVATED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("QR_DEACTIVATED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class QrDeactivatedEvent extends QrUpdatedEvent { 15 | 16 | public QrDeactivatedEvent(String qrId, String appId, User user) { 17 | super(QR_DEACTIVATED, qrId, appId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/domain/event/QrDescriptionUpdatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.QR_DESCRIPTION_UPDATED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("QR_DESCRIPTION_UPDATED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class QrDescriptionUpdatedEvent extends QrUpdatedEvent { 15 | 16 | public QrDescriptionUpdatedEvent(String qrId, String appId, User user) { 17 | super(QR_DESCRIPTION_UPDATED, qrId, appId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/domain/event/QrGeolocationUpdatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.QR_GEOLOCATION_UPDATED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("QR_GEOLOCATION_UPDATED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class QrGeolocationUpdatedEvent extends QrUpdatedEvent { 15 | 16 | public QrGeolocationUpdatedEvent(String qrId, String appId, User user) { 17 | super(QR_GEOLOCATION_UPDATED, qrId, appId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/domain/event/QrHeaderImageUpdatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.QR_HEADER_IMAGE_UPDATED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("QR_HEADER_IMAGE_UPDATED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class QrHeaderImageUpdatedEvent extends QrUpdatedEvent { 15 | 16 | public QrHeaderImageUpdatedEvent(String qrId, String appId, User user) { 17 | super(QR_HEADER_IMAGE_UPDATED, qrId, appId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/domain/event/QrMarkedAsTemplateEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.QR_MARKED_AS_TEMPLATE; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("QR_MARKED_AS_TEMPLATE_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class QrMarkedAsTemplateEvent extends QrUpdatedEvent { 15 | 16 | public QrMarkedAsTemplateEvent(String qrId, String appId, User user) { 17 | super(QR_MARKED_AS_TEMPLATE, qrId, appId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/domain/event/QrRenamedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.QR_RENAMED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("QR_RENAMED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class QrRenamedEvent extends QrUpdatedEvent { 15 | private String name; 16 | 17 | public QrRenamedEvent(String qrId, String appId, String name, User user) { 18 | super(QR_RENAMED, qrId, appId, user); 19 | this.name = name; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/domain/event/QrUnMarkedAsTemplateEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.QR_UNMARKED_AS_TEMPLATE; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("QR_UNMARKED_AS_TEMPLATE_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class QrUnMarkedAsTemplateEvent extends QrUpdatedEvent { 15 | 16 | public QrUnMarkedAsTemplateEvent(String qrId, String appId, User user) { 17 | super(QR_UNMARKED_AS_TEMPLATE, qrId, appId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/domain/event/QrUpdatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import com.mryqr.common.event.DomainEventType; 5 | import com.mryqr.core.app.domain.event.AppAwareDomainEvent; 6 | import lombok.Getter; 7 | import lombok.NoArgsConstructor; 8 | 9 | import static lombok.AccessLevel.PROTECTED; 10 | 11 | @Getter 12 | @NoArgsConstructor(access = PROTECTED) 13 | public abstract class QrUpdatedEvent extends AppAwareDomainEvent { 14 | private String qrId; 15 | 16 | public QrUpdatedEvent(DomainEventType type, String qrId, String appId, User user) { 17 | super(type, appId, user); 18 | this.qrId = qrId; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/domain/task/RemoveAllQrsUnderAppTask.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.domain.task; 2 | 3 | import com.mryqr.common.domain.task.RetryableTask; 4 | import com.mryqr.core.qr.domain.QrRepository; 5 | import lombok.RequiredArgsConstructor; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Slf4j 10 | @Component 11 | @RequiredArgsConstructor 12 | public class RemoveAllQrsUnderAppTask implements RetryableTask { 13 | private final QrRepository qrRepository; 14 | 15 | public void run(String appId) { 16 | int count = qrRepository.removeAllQrsUnderApp(appId); 17 | log.info("Removed all {} qrs under app[{}].", count, appId); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/domain/task/RemoveAllQrsUnderGroupTask.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.domain.task; 2 | 3 | import com.mryqr.common.domain.task.RetryableTask; 4 | import com.mryqr.core.qr.domain.QrRepository; 5 | import lombok.RequiredArgsConstructor; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Slf4j 10 | @Component 11 | @RequiredArgsConstructor 12 | public class RemoveAllQrsUnderGroupTask implements RetryableTask { 13 | private final QrRepository qrRepository; 14 | 15 | public void run(String groupId) { 16 | int count = qrRepository.removeAllQrsUnderGroup(groupId); 17 | log.info("Removed all {} qrs under group[{}].", count, groupId); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/query/QQrBaseSetting.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.query; 2 | 3 | import com.mryqr.common.domain.Geolocation; 4 | import com.mryqr.common.domain.UploadedFile; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Value; 8 | 9 | import java.util.Map; 10 | 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class QQrBaseSetting { 17 | private String id; 18 | private String name; 19 | private String description; 20 | private UploadedFile headerImage; 21 | private Map manualAttributeValues; 22 | private Geolocation geolocation; 23 | private String customId; 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/query/QQrSummary.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.query; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class QQrSummary { 13 | private String id; 14 | private String name; 15 | private String plateId; 16 | private String appId; 17 | private String groupId; 18 | private boolean template; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/query/bindplate/QBindPlateInfo.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.query.bindplate; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.util.Map; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class QBindPlateInfo { 15 | private final String plateId; 16 | private final String memberId; 17 | private final String appId; 18 | private final String appName; 19 | private final String instanceDesignation; 20 | private final String groupDesignation; 21 | private final String homePageId; 22 | private final Map selectableGroups; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/qr/query/submission/QSubmissionAppDetail.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.qr.query.submission; 2 | 3 | import com.mryqr.core.app.domain.AppSetting; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Value 11 | @Builder 12 | @AllArgsConstructor(access = PRIVATE) 13 | public class QSubmissionAppDetail { 14 | private final String id; 15 | private final String name; 16 | private final String version; 17 | private final AppSetting setting; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/register/command/RegisterResponse.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.register.command; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class RegisterResponse { 13 | private String tenantId; 14 | private String memberId; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/register/domain/RegisterResult.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.register.domain; 2 | 3 | import com.mryqr.core.departmenthierarchy.domain.DepartmentHierarchy; 4 | import com.mryqr.core.member.domain.Member; 5 | import com.mryqr.core.tenant.domain.Tenant; 6 | import lombok.Builder; 7 | import lombok.Getter; 8 | 9 | @Getter 10 | @Builder 11 | public class RegisterResult { 12 | private final Member member; 13 | private final Tenant tenant; 14 | private final DepartmentHierarchy departmentHierarchy; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/report/query/chart/QChartReportType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.report.query.chart; 2 | 3 | public enum QChartReportType { 4 | CATEGORIZED_OPTION_SEGMENT, 5 | NUMBER_RANGE_SEGMENT, 6 | TIME_SEGMENT 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/report/query/chart/reporter/ChartReportGenerator.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.report.query.chart.reporter; 2 | 3 | import com.mryqr.core.app.domain.App; 4 | import com.mryqr.core.app.domain.report.chart.ChartReport; 5 | import com.mryqr.core.report.query.chart.QChartReport; 6 | 7 | import java.util.Set; 8 | 9 | public interface ChartReportGenerator { 10 | boolean supports(ChartReport report); 11 | 12 | QChartReport generate(ChartReport report, Set groupIds, App app); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/report/query/number/NumberResult.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.report.query.number; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class NumberResult { 13 | private final Double value; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/report/query/number/QNumberReport.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.report.query.number; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class QNumberReport { 13 | private final Double number; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/report/query/number/reporter/NumberReportGenerator.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.report.query.number.reporter; 2 | 3 | import com.mryqr.core.app.domain.App; 4 | import com.mryqr.core.app.domain.report.number.NumberReport; 5 | 6 | import java.util.Set; 7 | 8 | public interface NumberReportGenerator { 9 | boolean supports(NumberReport report); 10 | 11 | Double generate(NumberReport report, Set groupIds, App app); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/report/query/number/reporter/instance/InstanceNumberReporter.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.report.query.number.reporter.instance; 2 | 3 | import com.mryqr.common.domain.report.ReportRange; 4 | import com.mryqr.core.app.domain.report.number.instance.InstanceNumberReport; 5 | 6 | import java.util.Set; 7 | 8 | public interface InstanceNumberReporter { 9 | boolean supports(InstanceNumberReport report); 10 | 11 | Double report(Set groupIds, ReportRange range); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/report/query/number/reporter/page/PageNumberReporter.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.report.query.number.reporter.page; 2 | 3 | import com.mryqr.common.domain.report.ReportRange; 4 | import com.mryqr.core.app.domain.report.number.page.PageNumberReport; 5 | 6 | import java.util.Set; 7 | 8 | public interface PageNumberReporter { 9 | boolean supports(PageNumberReport report); 10 | 11 | Double report(String pageId, Set groupIds, ReportRange range); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/submission/command/ApproveSubmissionCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.submission.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import jakarta.validation.constraints.Size; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Value; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class ApproveSubmissionCommand implements Command { 15 | 16 | private final boolean passed; 17 | 18 | @Size(max = 1000) 19 | private final String note; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/submission/domain/ApprovalStatus.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.submission.domain; 2 | 3 | public enum ApprovalStatus { 4 | PASSED, 5 | NOT_PASSED, 6 | NONE; 7 | 8 | public static ApprovalStatus statusOf(SubmissionApproval approval) { 9 | if (approval == null) { 10 | return NONE; 11 | } 12 | return approval.isPassed() ? PASSED : NOT_PASSED; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/submission/domain/CreateSubmissionWithQrResult.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.submission.domain; 2 | 3 | import com.mryqr.core.plate.domain.Plate; 4 | import com.mryqr.core.qr.domain.QR; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Getter; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class CreateSubmissionWithQrResult { 15 | private final Submission submission; 16 | private final QR qr; 17 | private final Plate plate; 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/submission/domain/SubmissionApproval.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.submission.domain; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.time.Instant; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class SubmissionApproval { 15 | private final boolean passed; 16 | private final String note; 17 | private final Instant approvedAt; 18 | private final String approvedBy; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/submission/domain/answer/pointcheck/PointCheckValue.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.submission.domain.answer.pointcheck; 2 | 3 | public enum PointCheckValue { 4 | YES, 5 | NO, 6 | NONE 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/submission/query/QSubmissionApproval.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.submission.query; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.time.Instant; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class QSubmissionApproval { 15 | private final boolean passed; 16 | private final String note; 17 | private final Instant approvedAt; 18 | private final String approvedBy; 19 | private final String approverName; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/submission/query/autocalculate/ItemStatusAutoCalculateResponse.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.submission.query.autocalculate; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class ItemStatusAutoCalculateResponse { 13 | private final String optionId; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/submission/query/autocalculate/NumberInputAutoCalculateResponse.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.submission.query.autocalculate; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class NumberInputAutoCalculateResponse { 13 | private final Double number; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/tenant/command/AddConsigneeCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.tenant.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import com.mryqr.core.order.domain.delivery.Consignee; 5 | import jakarta.validation.Valid; 6 | import jakarta.validation.constraints.NotNull; 7 | import lombok.AllArgsConstructor; 8 | import lombok.Builder; 9 | import lombok.Value; 10 | 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class AddConsigneeCommand implements Command { 17 | 18 | @Valid 19 | @NotNull 20 | private final Consignee consignee; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/tenant/command/UpdateConsigneeCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.tenant.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import com.mryqr.core.order.domain.delivery.Consignee; 5 | import jakarta.validation.Valid; 6 | import jakarta.validation.constraints.NotNull; 7 | import lombok.AllArgsConstructor; 8 | import lombok.Builder; 9 | import lombok.Value; 10 | 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class UpdateConsigneeCommand implements Command { 17 | 18 | @Valid 19 | @NotNull 20 | private final Consignee consignee; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/tenant/command/UpdateTenantInvoiceTitleCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.tenant.command; 2 | 3 | import com.mryqr.common.domain.invoice.InvoiceTitle; 4 | import com.mryqr.common.utils.Command; 5 | import jakarta.validation.Valid; 6 | import jakarta.validation.constraints.NotNull; 7 | import lombok.AllArgsConstructor; 8 | import lombok.Builder; 9 | import lombok.Value; 10 | 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class UpdateTenantInvoiceTitleCommand implements Command { 17 | 18 | @Valid 19 | @NotNull 20 | private final InvoiceTitle title; 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/tenant/command/UpdateTenantLogoCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.tenant.command; 2 | 3 | import com.mryqr.common.domain.UploadedFile; 4 | import com.mryqr.common.utils.Command; 5 | import jakarta.validation.Valid; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class UpdateTenantLogoCommand implements Command { 16 | 17 | @Valid 18 | private final UploadedFile logo; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/tenant/domain/CreateTenantResult.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.tenant.domain; 2 | 3 | import com.mryqr.core.departmenthierarchy.domain.DepartmentHierarchy; 4 | import com.mryqr.core.member.domain.Member; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Getter; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class CreateTenantResult { 15 | private final Tenant tenant; 16 | private final Member member; 17 | private final DepartmentHierarchy departmentHierarchy; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/tenant/domain/event/TenantActivatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.tenant.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.TENANT_ACTIVATED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("TENANT_ACTIVATED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class TenantActivatedEvent extends TenantUpdatedEvent { 15 | 16 | public TenantActivatedEvent(String tenantId, User user) { 17 | super(TENANT_ACTIVATED, tenantId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/tenant/domain/event/TenantBaseSettingUpdatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.tenant.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.TENANT_BASE_SETTING_UPDATED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("TENANT_BASE_SETTING_UPDATED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class TenantBaseSettingUpdatedEvent extends TenantUpdatedEvent { 15 | 16 | public TenantBaseSettingUpdatedEvent(String tenantId, User user) { 17 | super(TENANT_BASE_SETTING_UPDATED, tenantId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/tenant/domain/event/TenantDeactivatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.tenant.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.data.annotation.TypeAlias; 7 | 8 | import static com.mryqr.common.event.DomainEventType.TENANT_DEACTIVATED; 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Getter 12 | @TypeAlias("TENANT_DEACTIVATED_EVENT") 13 | @NoArgsConstructor(access = PRIVATE) 14 | public class TenantDeactivatedEvent extends TenantUpdatedEvent { 15 | 16 | public TenantDeactivatedEvent(String tenantId, User user) { 17 | super(TENANT_DEACTIVATED, tenantId, user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/tenant/domain/event/TenantUpdatedEvent.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.tenant.domain.event; 2 | 3 | import com.mryqr.common.domain.user.User; 4 | import com.mryqr.common.event.DomainEvent; 5 | import com.mryqr.common.event.DomainEventType; 6 | import lombok.Getter; 7 | import lombok.NoArgsConstructor; 8 | 9 | import static lombok.AccessLevel.PROTECTED; 10 | 11 | @Getter 12 | @NoArgsConstructor(access = PROTECTED) 13 | public abstract class TenantUpdatedEvent extends DomainEvent { 14 | private String tenantId; 15 | 16 | public TenantUpdatedEvent(DomainEventType type, String tenantId, User user) { 17 | super(type, user); 18 | this.tenantId = tenantId; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/tenant/query/QConsoleTenantProfile.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.tenant.query; 2 | 3 | import com.mryqr.common.domain.UploadedFile; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Value 11 | @Builder 12 | @AllArgsConstructor(access = PRIVATE) 13 | public class QConsoleTenantProfile { 14 | private String tenantId; 15 | private String name; 16 | private UploadedFile logo; 17 | private String subdomainPrefix; 18 | private String baseDomainName; 19 | private boolean subdomainReady; 20 | private QPackagesStatus packagesStatus; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/tenant/query/QTenantApiSetting.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.tenant.query; 2 | 3 | import com.mryqr.core.tenant.domain.ApiSetting; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Value 11 | @Builder 12 | @AllArgsConstructor(access = PRIVATE) 13 | public class QTenantApiSetting { 14 | private final ApiSetting apiSetting; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/tenant/query/QTenantBaseSetting.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.tenant.query; 2 | 3 | import com.mryqr.common.domain.UploadedFile; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Value 11 | @Builder 12 | @AllArgsConstructor(access = PRIVATE) 13 | public class QTenantBaseSetting { 14 | private final String id; 15 | private final String name; 16 | private final UploadedFile loginBackground; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/tenant/query/QTenantInvoiceTitle.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.tenant.query; 2 | 3 | import com.mryqr.common.domain.invoice.InvoiceTitle; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Value 11 | @Builder 12 | @AllArgsConstructor(access = PRIVATE) 13 | public class QTenantInvoiceTitle { 14 | private final InvoiceTitle title; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/tenant/query/QTenantLogo.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.tenant.query; 2 | 3 | import com.mryqr.common.domain.UploadedFile; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Value 11 | @Builder 12 | @AllArgsConstructor(access = PRIVATE) 13 | public class QTenantLogo { 14 | private final UploadedFile logo; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/tenant/query/QTenantPublicProfile.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.tenant.query; 2 | 3 | import com.mryqr.common.domain.UploadedFile; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Value 11 | @Builder 12 | @AllArgsConstructor(access = PRIVATE) 13 | public class QTenantPublicProfile { 14 | private final String tenantId; 15 | private final String name; 16 | private final UploadedFile logo; 17 | private final UploadedFile loginBackground; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/tenant/query/QTenantSubdomain.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.tenant.query; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class QTenantSubdomain { 13 | private final String subdomainPrefix; 14 | private final boolean updatable; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/verification/command/CreateChangeMobileVerificationCodeCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.verification.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import com.mryqr.common.validation.mobile.Mobile; 5 | import jakarta.validation.constraints.NotBlank; 6 | import jakarta.validation.constraints.Size; 7 | import lombok.AllArgsConstructor; 8 | import lombok.Builder; 9 | import lombok.Value; 10 | 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class CreateChangeMobileVerificationCodeCommand implements Command { 17 | 18 | @Mobile 19 | @NotBlank 20 | @Size(max = 11) 21 | private final String mobile; 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/verification/command/CreateFindbackPasswordVerificationCodeCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.verification.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import com.mryqr.common.validation.mobileoremail.MobileOrEmail; 5 | import jakarta.validation.constraints.NotBlank; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class CreateFindbackPasswordVerificationCodeCommand implements Command { 16 | 17 | @NotBlank 18 | @MobileOrEmail 19 | private final String mobileOrEmail; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/verification/command/CreateLoginVerificationCodeCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.verification.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import com.mryqr.common.validation.mobileoremail.MobileOrEmail; 5 | import jakarta.validation.constraints.NotBlank; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class CreateLoginVerificationCodeCommand implements Command { 16 | 17 | @NotBlank 18 | @MobileOrEmail 19 | private final String mobileOrEmail; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/verification/command/CreateRegisterVerificationCodeCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.verification.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import com.mryqr.common.validation.mobileoremail.MobileOrEmail; 5 | import jakarta.validation.constraints.NotBlank; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class CreateRegisterVerificationCodeCommand implements Command { 16 | 17 | @NotBlank 18 | @MobileOrEmail 19 | private final String mobileOrEmail; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/verification/command/IdentifyMobileVerificationCodeCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.verification.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import com.mryqr.common.validation.mobile.Mobile; 5 | import jakarta.validation.constraints.NotBlank; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class IdentifyMobileVerificationCodeCommand implements Command { 16 | 17 | @Mobile 18 | @NotBlank 19 | private final String mobile; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/verification/domain/VerificationCodeRepository.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.verification.domain; 2 | 3 | import java.util.Optional; 4 | 5 | public interface VerificationCodeRepository { 6 | Optional findValidOptional(String mobileOrEmail, String code, VerificationCodeType type); 7 | 8 | boolean existsWithinOneMinutes(String mobileOrEmail, VerificationCodeType type); 9 | 10 | long totalCodeCountOfTodayFor(String mobileOrEmail); 11 | 12 | void save(VerificationCode it); 13 | 14 | VerificationCode byId(String id); 15 | 16 | boolean exists(String arId); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/verification/domain/VerificationCodeSender.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.verification.domain; 2 | 3 | public interface VerificationCodeSender { 4 | void send(VerificationCode code); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/core/verification/domain/VerificationCodeType.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.verification.domain; 2 | 3 | public enum VerificationCodeType { 4 | REGISTER, 5 | LOGIN, 6 | FINDBACK_PASSWORD, 7 | CHANGE_MOBILE, 8 | IDENTIFY_MOBILE, 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/integration/app/query/QIntegrationListApp.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.integration.app.query; 2 | 3 | import com.mryqr.common.domain.permission.Permission; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import static lombok.AccessLevel.PRIVATE; 9 | 10 | @Value 11 | @Builder 12 | @AllArgsConstructor(access = PRIVATE) 13 | public class QIntegrationListApp { 14 | private final String id; 15 | private final String name; 16 | private final boolean active; 17 | private final boolean locked; 18 | private final String version; 19 | private final Permission permission; 20 | private final Permission operationPermission; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/integration/department/command/IntegrationUpdateDepartmentCustomIdCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.integration.department.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import com.mryqr.common.validation.id.custom.CustomId; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Value; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class IntegrationUpdateDepartmentCustomIdCommand implements Command { 15 | @CustomId 16 | private final String customId; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/integration/department/query/QIntegrationDepartment.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.integration.department.query; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import java.time.Instant; 8 | import java.util.List; 9 | import java.util.Set; 10 | 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class QIntegrationDepartment { 17 | private final String id; 18 | private final String name; 19 | private String customId; 20 | private List managers; 21 | private Set members; 22 | private Instant createdAt; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/integration/department/query/QIntegrationListDepartment.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.integration.department.query; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class QIntegrationListDepartment { 13 | private final String id; 14 | private final String name; 15 | private String customId; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/integration/group/command/IntegrationRenameGroupCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.integration.group.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import jakarta.validation.constraints.NotBlank; 5 | import jakarta.validation.constraints.Size; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static com.mryqr.common.utils.MryConstants.MAX_GENERIC_NAME_LENGTH; 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class IntegrationRenameGroupCommand implements Command { 17 | @NotBlank 18 | @Size(max = MAX_GENERIC_NAME_LENGTH) 19 | private final String name; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/integration/group/command/IntegrationUpdateGroupCustomIdCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.integration.group.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import com.mryqr.common.validation.id.custom.CustomId; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Value; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class IntegrationUpdateGroupCustomIdCommand implements Command { 15 | @CustomId 16 | private final String customId; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/integration/group/query/QIntegrationListGroup.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.integration.group.query; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class QIntegrationListGroup { 13 | private final String id; 14 | private final String name; 15 | private final String appId; 16 | private final String customId; 17 | private final boolean archived; 18 | private final boolean active; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/integration/member/command/IntegrationUpdateMemberCustomIdCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.integration.member.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import com.mryqr.common.validation.id.custom.CustomId; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Value; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class IntegrationUpdateMemberCustomIdCommand implements Command { 15 | @CustomId 16 | private final String customId; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/integration/member/query/QIntegrationListMember.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.integration.member.query; 2 | 3 | import com.mryqr.common.domain.user.Role; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Value; 7 | 8 | import java.util.List; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class QIntegrationListMember { 16 | private final String id; 17 | private final String name; 18 | private final Role role; 19 | private final String mobile; 20 | private final String email; 21 | private final boolean active; 22 | private final String customId; 23 | private final List departmentIds; 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/integration/qr/command/IntegrationCreateQrResponse.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.integration.qr.command; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Value; 6 | 7 | import static lombok.AccessLevel.PRIVATE; 8 | 9 | @Value 10 | @Builder 11 | @AllArgsConstructor(access = PRIVATE) 12 | public class IntegrationCreateQrResponse { 13 | private final String qrId; 14 | private final String plateId; 15 | private final String groupId; 16 | private final String appId; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/integration/qr/command/IntegrationRenameQrCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.integration.qr.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import jakarta.validation.constraints.NotBlank; 5 | import jakarta.validation.constraints.Size; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static com.mryqr.common.utils.MryConstants.MAX_GENERIC_NAME_LENGTH; 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class IntegrationRenameQrCommand implements Command { 17 | @NotBlank 18 | @Size(max = MAX_GENERIC_NAME_LENGTH) 19 | private final String name; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/integration/qr/command/IntegrationUpdateQrCustomIdCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.integration.qr.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import com.mryqr.common.validation.id.custom.CustomId; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Value; 8 | 9 | import static lombok.AccessLevel.PRIVATE; 10 | 11 | @Value 12 | @Builder 13 | @AllArgsConstructor(access = PRIVATE) 14 | public class IntegrationUpdateQrCustomIdCommand implements Command { 15 | @CustomId 16 | private final String customId; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/integration/qr/command/IntegrationUpdateQrDescriptionCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.integration.qr.command; 2 | 3 | 4 | import com.mryqr.common.utils.Command; 5 | import jakarta.validation.constraints.Size; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static com.mryqr.common.utils.MryConstants.MAX_PARAGRAPH_LENGTH; 11 | import static lombok.AccessLevel.PRIVATE; 12 | 13 | @Value 14 | @Builder 15 | @AllArgsConstructor(access = PRIVATE) 16 | public class IntegrationUpdateQrDescriptionCommand implements Command { 17 | 18 | @Size(max = MAX_PARAGRAPH_LENGTH) 19 | private final String description; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/integration/qr/command/IntegrationUpdateQrGeolocationCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.integration.qr.command; 2 | 3 | import com.mryqr.common.domain.Geolocation; 4 | import com.mryqr.common.utils.Command; 5 | import jakarta.validation.Valid; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Value; 9 | 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class IntegrationUpdateQrGeolocationCommand implements Command { 16 | @Valid 17 | private final Geolocation geolocation; 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/integration/qr/command/IntegrationUpdateQrHeaderImageCommand.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.integration.qr.command; 2 | 3 | import com.mryqr.common.utils.Command; 4 | import jakarta.validation.constraints.Size; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Value; 8 | 9 | import static com.mryqr.common.utils.MryConstants.MAX_URL_LENGTH; 10 | import static lombok.AccessLevel.PRIVATE; 11 | 12 | @Value 13 | @Builder 14 | @AllArgsConstructor(access = PRIVATE) 15 | public class IntegrationUpdateQrHeaderImageCommand implements Command { 16 | 17 | @Size(max = MAX_URL_LENGTH) 18 | private final String headerImageUrl; 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/management/crm/webhook/TenantWebhookHandler.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.management.crm.webhook; 2 | 3 | import com.mryqr.common.webhook.submission.BaseSubmissionWebhookPayload; 4 | 5 | public interface TenantWebhookHandler { 6 | boolean canHandle(BaseSubmissionWebhookPayload payload); 7 | 8 | void handle(BaseSubmissionWebhookPayload payload); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/management/offencereport/webhook/OffenceWebhookHandler.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.management.offencereport.webhook; 2 | 3 | import com.mryqr.common.webhook.submission.BaseSubmissionWebhookPayload; 4 | 5 | public interface OffenceWebhookHandler { 6 | boolean canHandle(BaseSubmissionWebhookPayload payload); 7 | 8 | void handle(BaseSubmissionWebhookPayload payload); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/management/order/webhook/OrderWebhookHandler.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.management.order.webhook; 2 | 3 | import com.mryqr.common.webhook.submission.BaseSubmissionWebhookPayload; 4 | 5 | public interface OrderWebhookHandler { 6 | boolean canHandle(BaseSubmissionWebhookPayload payload); 7 | 8 | void handle(BaseSubmissionWebhookPayload payload); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/management/platform/command/PlatformCommandService.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.management.platform.command; 2 | 3 | 4 | import com.mryqr.management.platform.domain.PlatformRepository; 5 | import lombok.RequiredArgsConstructor; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Slf4j 10 | @Component 11 | @RequiredArgsConstructor 12 | public class PlatformCommandService { 13 | private final PlatformRepository platformRepository; 14 | 15 | public void recordQrGeneration() { 16 | this.platformRepository.recordQrGeneration(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/management/platform/domain/PlatformFactory.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.management.platform.domain; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | import static com.mryqr.common.domain.user.User.robotUser; 6 | import static com.mryqr.management.MryManageTenant.MRY_MANAGE_TENANT_ID; 7 | 8 | @Component 9 | public class PlatformFactory { 10 | public Platform createPlatform() { 11 | return new Platform(robotUser(MRY_MANAGE_TENANT_ID)); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/mryqr/management/platform/domain/PlatformRepository.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.management.platform.domain; 2 | 3 | public interface PlatformRepository { 4 | 5 | Platform getPlatform(); 6 | 7 | void save(Platform it); 8 | 9 | boolean platformExists(); 10 | 11 | void recordQrGeneration(); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | buildTime: ${buildTime} 2 | gitRevision: ${gitRevision} 3 | gitBranch: ${gitBranch} 4 | 5 | spring: 6 | application: 7 | name: mry-backend 8 | profiles: 9 | active: local # default profile 10 | banner: 11 | location: classpath:banner.txt 12 | task: 13 | scheduling: 14 | pool: 15 | size: 5 16 | 17 | server: 18 | shutdown: graceful 19 | tomcat: 20 | accept-count: 100 21 | max-swallow-size: 50 22 | max-keep-alive-requests: 200 23 | threads: 24 | max: 500 25 | 26 | logging: 27 | pattern: 28 | level: "%5p [mry-backend,%X{traceId:-},%X{spanId:-}]" 29 | level: 30 | org: 31 | ansj: WARN 32 | 33 | tracing: 34 | sampling: 35 | probability: 1.0 36 | -------------------------------------------------------------------------------- /src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | __ ___ __ __ 2 | / |/ /____ \ \/ / 3 | / /|_/ // __/_ \ / 4 | /_/ /_//_/ (_)/_/ 5 | -------------------------------------------------------------------------------- /src/main/resources/bootstrap.yml: -------------------------------------------------------------------------------- 1 | spring.application.name: mry-backend 2 | -------------------------------------------------------------------------------- /src/main/resources/public/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mryqr-com/mry-backend/d57041d4ba78ee9ab3c70f19182764b8b4b2b22d/src/main/resources/public/.gitkeep -------------------------------------------------------------------------------- /src/main/resources/wxpay-apiclient-key.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | 如需微信支付,请添加你自己的微信支付私钥 3 | -----END PRIVATE KEY----- 4 | -------------------------------------------------------------------------------- /src/test/java/com/mryqr/BaseUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.mryqr; 2 | 3 | import org.junit.jupiter.api.BeforeEach; 4 | 5 | public class BaseUnitTest { 6 | @BeforeEach 7 | public void init() { 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/test/java/com/mryqr/core/common/utils/UuidGeneratorTest.java: -------------------------------------------------------------------------------- 1 | package com.mryqr.core.common.utils; 2 | 3 | import com.mryqr.common.utils.UuidGenerator; 4 | import org.junit.jupiter.api.Test; 5 | 6 | import static org.hamcrest.MatcherAssert.assertThat; 7 | import static org.hamcrest.Matchers.is; 8 | 9 | 10 | public class UuidGeneratorTest { 11 | 12 | @Test 13 | public void should_generate_random_base64_uuid() { 14 | String uuid = UuidGenerator.newShortUuid(); 15 | assertThat(uuid.length(), is(22)); 16 | } 17 | 18 | } --------------------------------------------------------------------------------