├── .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 extends Identified> 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 | }
--------------------------------------------------------------------------------