From 94d6c105226636afb2306a5fd872a198c3c418f1 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Mon, 15 Jan 2024 15:41:07 +0800 Subject: [PATCH 01/93] =?UTF-8?q?TASK:=E5=85=8D=E5=AF=86=E7=99=BB=E5=BD=95?= =?UTF-8?q?;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ai/da/controller/AccountController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ai/da/controller/AccountController.java b/src/main/java/com/ai/da/controller/AccountController.java index 4e5c54e2..d62d7335 100644 --- a/src/main/java/com/ai/da/controller/AccountController.java +++ b/src/main/java/com/ai/da/controller/AccountController.java @@ -146,7 +146,7 @@ public class AccountController { @ApiOperation(value = "查询账号到期时间") @PostMapping("/noLoginRequired") - public Response noLoginRequired(NoLoginRequiredDTO noLoginRequiredDTO){ + public Response noLoginRequired(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO){ return Response.success(accountService.noLoginRequired(noLoginRequiredDTO)); } } From a75cdffe5928774c3477f8832e55966e8574c77d Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Mon, 15 Jan 2024 15:57:40 +0800 Subject: [PATCH 02/93] TASK:design NEW; --- .../ai/da/common/config/DataSourceConfig.java | 27 +++++++++++++++++++ .../resources/application-prod.properties | 19 ++++++++++--- 2 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/ai/da/common/config/DataSourceConfig.java diff --git a/src/main/java/com/ai/da/common/config/DataSourceConfig.java b/src/main/java/com/ai/da/common/config/DataSourceConfig.java new file mode 100644 index 00000000..2d5b1a65 --- /dev/null +++ b/src/main/java/com/ai/da/common/config/DataSourceConfig.java @@ -0,0 +1,27 @@ +package com.ai.da.common.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import javax.sql.DataSource; + +@Configuration +public class DataSourceConfig { + + @Primary + @Bean(name = "primaryDataSource") + @ConfigurationProperties(prefix = "spring.datasource.primary") + public DataSource dataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean(name = "secondaryDataSource") + @ConfigurationProperties(prefix = "spring.datasource.secondary") + public DataSource dataSourceSecondary() { + return DataSourceBuilder.create().build(); + } +} + diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index ff77a4e2..a2f7a528 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -1,11 +1,22 @@ server.port=5567 #datasource -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.url=jdbc:mysql://18.167.251.121:33008/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true -spring.datasource.username=aida_con -spring.datasource.password=123456 +#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +#spring.datasource.url=jdbc:mysql://18.167.251.121:33008/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +#spring.datasource.username=aida_con +#spring.datasource.password=123456 #spring.datasource.password=QWa998345 +spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.primary.url=jdbc:mysql://18.167.251.121:33008/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +spring.datasource.primary.username=aida_con +spring.datasource.primary.password=123456 + +spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.secondary.url=jdbc:mysql://18.167.251.121:33008/attribute_retrieval?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +spring.datasource.secondary.username=aida_con +spring.datasource.secondary.password=123456 + + #security spring.security.jwtSecret=JWTSECRET From 471426e93109e117d818702c2dbfa3696c7700be Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Fri, 19 Jan 2024 16:36:34 +0800 Subject: [PATCH 03/93] =?UTF-8?q?TASK:=E5=A4=9A=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/da/common/config/DataSourceConfig.java | 27 --- .../ai/da/common/config/MyTaskScheduler.java | 5 +- .../{mybatis/plus => }/MybatisPlusConfig.java | 46 ++-- .../config/PrimaryDataSourceConfig.java | 53 +++++ .../config/SecondaryDataSourceConfig.java | 49 ++++ .../config/mybatis/plus/CommonMapper.java | 24 +- .../mybatis/plus/CommonServiceImpl.java | 96 ++++---- .../mybatis/plus/CustomerSqlInjector.java | 38 ++-- .../config/mybatis/plus/QueryCriteria.java | 170 +++++++------- .../config/mybatis/plus/SelectVoPage.java | 44 ++-- .../ai/da/common/utils/LocalCacheUtils.java | 4 - .../com/ai/da/common/utils/MinioUtil.java | 10 +- .../com/ai/da/common/utils/SendEmailUtil.java | 4 +- .../ai/da/controller/AccountController.java | 13 +- .../controller/ClassificationController.java | 8 - .../ai/da/controller/LibraryController.java | 7 +- .../ai/da/controller/PythonController.java | 2 +- .../controller/SavedCollectionController.java | 8 +- .../ai/da/controller/WorkspaceController.java | 6 +- .../{ => primary}/AccountLoginLogMapper.java | 31 ++- .../mapper/{ => primary}/AccountMapper.java | 64 +++--- .../mapper/{ => primary}/ChatRobotMapper.java | 6 +- .../{ => primary}/ClassificationMapper.java | 5 +- .../ClassificationRelLibraryMapper.java | 5 +- .../CollectionElementMapper.java | 30 ++- .../{ => primary}/CollectionMapper.java | 33 ++- .../{ => primary}/ColorLoopUpTableMapper.java | 28 +-- .../{ => primary}/DesignHistoryMapper.java | 29 ++- .../{ => primary}/DesignItemDetailMapper.java | 29 ++- .../DesignItemDetailPrintMapper.java | 4 +- .../{ => primary}/DesignItemMapper.java | 31 ++- .../da/mapper/{ => primary}/DesignMapper.java | 33 ++- .../{ => primary}/GenerateDetailMapper.java | 4 +- .../mapper/{ => primary}/GenerateMapper.java | 4 +- .../mapper/{ => primary}/LibraryMapper.java | 29 ++- .../LibraryModelPointMapper.java | 29 ++- .../mapper/{ => primary}/PanToneMapper.java | 39 ++-- .../{ => primary}/PythonTAllInfoMapper.java | 8 +- .../mapper/{ => primary}/SysFileMapper.java | 29 ++- .../TCollectionElementRelationMapper.java | 4 +- .../TDesignPythonOutfitDetailMapper.java | 4 +- .../TDesignPythonOutfitMapper.java | 4 +- .../{ => primary}/TrialOrderMapper.java | 7 +- .../{ => primary}/UserLikeGroupMapper.java | 31 ++- .../mapper/{ => primary}/UserLikeMapper.java | 28 +-- .../mapper/{ => primary}/WorkspaceMapper.java | 4 +- .../mapper/{ => primary}/entity/Account.java | 166 +++++++------- .../{ => primary}/entity/AccountLoginLog.java | 106 ++++----- .../{ => primary}/entity/ChatRobot.java | 3 +- .../{ => primary}/entity/Classification.java | 3 +- .../entity/ClassificationRelLibrary.java | 2 +- .../{ => primary}/entity/Collection.java | 105 +++++---- .../entity/CollectionElement.java | 174 +++++++------- .../entity/ColorLookupTable.java | 67 +++--- .../mapper/{ => primary}/entity/Design.java | 145 ++++++------ .../{ => primary}/entity/DesignHistory.java | 110 ++++----- .../{ => primary}/entity/DesignItem.java | 150 ++++++------- .../entity/DesignItemDetail.java | 212 +++++++++--------- .../entity/DesignItemDetailPrint.java | 2 +- .../mapper/{ => primary}/entity/Generate.java | 2 +- .../{ => primary}/entity/GenerateDetail.java | 2 +- .../mapper/{ => primary}/entity/Library.java | 167 +++++++------- .../entity/LibraryModelPoint.java | 162 ++++++------- .../{ => primary}/entity/ObjectItem.java | 2 +- .../mapper/{ => primary}/entity/PanTone.java | 142 ++++++------ .../{ => primary}/entity/PythonTAllInfo.java | 2 +- .../mapper/{ => primary}/entity/Sketches.java | 2 +- .../entity/SketchesBoundingBox.java | 2 +- .../mapper/{ => primary}/entity/SysFile.java | 162 ++++++------- .../entity/TCollectionElementRelation.java | 3 +- .../entity/TDesignPythonOutfit.java | 3 +- .../entity/TDesignPythonOutfitDetail.java | 3 +- .../{ => primary}/entity/TrialOrder.java | 4 +- .../mapper/{ => primary}/entity/UserLike.java | 124 +++++----- .../{ => primary}/entity/UserLikeGroup.java | 110 ++++----- .../{ => primary}/entity/Workspace.java | 5 +- .../mapper/secondary/FemaleDressMapper.java | 16 ++ .../mapper/secondary/entity/FemaleDress.java | 25 +++ .../com/ai/da/model/dto/AccountTrialDTO.java | 3 +- .../ai/da/model/dto/ClassificationDTO.java | 2 +- .../com/ai/da/model/dto/WorkspaceDTO.java | 1 - .../java/com/ai/da/model/vo/ChatRobotVO.java | 2 +- .../com/ai/da/model/vo/ClassificationVO.java | 2 +- .../model/vo/TDesignPythonOutfitDetailVO.java | 2 +- .../ai/da/model/vo/TDesignPythonOutfitVO.java | 2 +- .../com/ai/da/model/vo/ValidateElementVO.java | 2 +- .../java/com/ai/da/model/vo/WorkspaceVO.java | 6 +- .../java/com/ai/da/python/PythonService.java | 5 +- .../ai/da/python/vo/DesignPythonObjects.java | 2 +- .../ai/da/service/AccountLoginLogService.java | 4 +- .../com/ai/da/service/AccountService.java | 10 +- .../com/ai/da/service/ChatRobotService.java | 4 +- .../ai/da/service/ClassificationService.java | 8 +- .../da/service/CollectionElementService.java | 4 +- .../com/ai/da/service/CollectionService.java | 10 +- .../da/service/ColorLoopUpTableService.java | 3 +- .../ai/da/service/DesignHistoryService.java | 3 +- .../service/DesignItemDetailPrintService.java | 2 +- .../da/service/DesignItemDetailService.java | 3 +- .../com/ai/da/service/DesignItemService.java | 2 +- .../java/com/ai/da/service/DesignService.java | 3 +- .../com/ai/da/service/GenerateService.java | 4 +- .../ITDesignPythonOutfitDetailService.java | 2 +- .../service/ITDesignPythonOutfitService.java | 2 +- .../da/service/LibraryModelPointService.java | 5 +- .../com/ai/da/service/LibraryService.java | 6 +- .../com/ai/da/service/PanToneService.java | 2 +- .../ai/da/service/PythonTAllInfoService.java | 2 +- .../com/ai/da/service/SysFileService.java | 2 +- .../TCollectionElementRelationService.java | 2 +- .../ai/da/service/UserLikeGroupService.java | 7 +- .../com/ai/da/service/UserLikeService.java | 2 +- .../com/ai/da/service/WorkspaceService.java | 3 +- .../impl/AccountLoginLogServiceImpl.java | 4 +- .../da/service/impl/AccountServiceImpl.java | 23 +- .../da/service/impl/ChatRobotServiceImpl.java | 8 +- .../impl/ClassificationServiceImpl.java | 8 +- .../impl/CollectionElementServiceImpl.java | 6 +- .../service/impl/CollectionServiceImpl.java | 6 +- .../impl/ColorLoopUpTableServiceImpl.java | 4 +- .../impl/DesignHistoryServiceImpl.java | 4 +- .../DesignItemDetailPrintServiceImpl.java | 5 +- .../impl/DesignItemDetailServiceImpl.java | 4 +- .../service/impl/DesignItemServiceImpl.java | 4 +- .../ai/da/service/impl/DesignServiceImpl.java | 11 +- .../da/service/impl/GenerateServiceImpl.java | 8 +- .../impl/LibraryModelPointServiceImpl.java | 5 +- .../da/service/impl/LibraryServiceImpl.java | 6 +- .../da/service/impl/PanToneServiceImpl.java | 7 +- .../impl/PythonTAllInfoServiceImpl.java | 4 +- .../da/service/impl/SysFileServiceImpl.java | 4 +- ...TCollectionElementRelationServiceImpl.java | 6 +- .../TDesignPythonOutfitDetailServiceImpl.java | 5 +- .../impl/TDesignPythonOutfitServiceImpl.java | 4 +- .../impl/UserLikeGroupServiceImpl.java | 10 +- .../da/service/impl/UserLikeServiceImpl.java | 8 +- .../da/service/impl/WorkspaceServiceImpl.java | 18 +- .../resources/application-prod.properties | 7 +- .../mapper/{ => primary}/AccountMapper.xml | 54 ++--- .../mapper/{ => primary}/ChatRobotMapper.xml | 4 +- .../{ => primary}/ClassificationMapper.xml | 4 +- .../ClassificationRelLibraryMapper.xml | 4 +- .../mapper/{ => primary}/CollectionMapper.xml | 42 ++-- .../mapper/{ => primary}/DesignItemMapper.xml | 66 +++--- .../mapper/{ => primary}/DesignMapper.xml | 58 ++--- .../{ => primary}/GenerateDetailMapper.xml | 2 +- .../mapper/{ => primary}/PantoneMapper.xml | 56 ++--- .../{ => primary}/PythonTAllInfoMapper.xml | 4 +- .../TDesignPythonOutfitDetailMapper.xml | 4 +- .../TDesignPythonOutfitMapper.xml | 4 +- .../mapper/{ => primary}/TrialOrderMapper.xml | 4 +- .../{ => primary}/UserLikeGroupMapper.xml | 52 ++--- .../mapper/{ => primary}/WorkspaceMapper.xml | 4 +- .../mapper/secondary/FemaleDressMapper.xml | 8 + 154 files changed, 2016 insertions(+), 2006 deletions(-) delete mode 100644 src/main/java/com/ai/da/common/config/DataSourceConfig.java rename src/main/java/com/ai/da/common/config/{mybatis/plus => }/MybatisPlusConfig.java (56%) create mode 100644 src/main/java/com/ai/da/common/config/PrimaryDataSourceConfig.java create mode 100644 src/main/java/com/ai/da/common/config/SecondaryDataSourceConfig.java rename src/main/java/com/ai/da/mapper/{ => primary}/AccountLoginLogMapper.java (58%) rename src/main/java/com/ai/da/mapper/{ => primary}/AccountMapper.java (83%) rename src/main/java/com/ai/da/mapper/{ => primary}/ChatRobotMapper.java (68%) rename src/main/java/com/ai/da/mapper/{ => primary}/ClassificationMapper.java (64%) rename src/main/java/com/ai/da/mapper/{ => primary}/ClassificationRelLibraryMapper.java (63%) rename src/main/java/com/ai/da/mapper/{ => primary}/CollectionElementMapper.java (64%) rename src/main/java/com/ai/da/mapper/{ => primary}/CollectionMapper.java (66%) rename src/main/java/com/ai/da/mapper/{ => primary}/ColorLoopUpTableMapper.java (70%) rename src/main/java/com/ai/da/mapper/{ => primary}/DesignHistoryMapper.java (61%) rename src/main/java/com/ai/da/mapper/{ => primary}/DesignItemDetailMapper.java (62%) rename src/main/java/com/ai/da/mapper/{ => primary}/DesignItemDetailPrintMapper.java (61%) rename src/main/java/com/ai/da/mapper/{ => primary}/DesignItemMapper.java (67%) rename src/main/java/com/ai/da/mapper/{ => primary}/DesignMapper.java (69%) rename src/main/java/com/ai/da/mapper/{ => primary}/GenerateDetailMapper.java (83%) rename src/main/java/com/ai/da/mapper/{ => primary}/GenerateMapper.java (60%) rename src/main/java/com/ai/da/mapper/{ => primary}/LibraryMapper.java (62%) rename src/main/java/com/ai/da/mapper/{ => primary}/LibraryModelPointMapper.java (62%) rename src/main/java/com/ai/da/mapper/{ => primary}/PanToneMapper.java (75%) rename src/main/java/com/ai/da/mapper/{ => primary}/PythonTAllInfoMapper.java (56%) rename src/main/java/com/ai/da/mapper/{ => primary}/SysFileMapper.java (62%) rename src/main/java/com/ai/da/mapper/{ => primary}/TCollectionElementRelationMapper.java (76%) rename src/main/java/com/ai/da/mapper/{ => primary}/TDesignPythonOutfitDetailMapper.java (86%) rename src/main/java/com/ai/da/mapper/{ => primary}/TDesignPythonOutfitMapper.java (86%) rename src/main/java/com/ai/da/mapper/{ => primary}/TrialOrderMapper.java (61%) rename src/main/java/com/ai/da/mapper/{ => primary}/UserLikeGroupMapper.java (71%) rename src/main/java/com/ai/da/mapper/{ => primary}/UserLikeMapper.java (70%) rename src/main/java/com/ai/da/mapper/{ => primary}/WorkspaceMapper.java (85%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/Account.java (92%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/AccountLoginLog.java (91%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/ChatRobot.java (94%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/Classification.java (95%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/ClassificationRelLibrary.java (96%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/Collection.java (86%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/CollectionElement.java (92%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/ColorLookupTable.java (75%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/Design.java (89%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/DesignHistory.java (91%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/DesignItem.java (93%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/DesignItemDetail.java (93%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/DesignItemDetailPrint.java (96%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/Generate.java (96%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/GenerateDetail.java (96%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/Library.java (89%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/LibraryModelPoint.java (92%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/ObjectItem.java (73%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/PanTone.java (84%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/PythonTAllInfo.java (97%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/Sketches.java (78%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/SketchesBoundingBox.java (75%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/SysFile.java (93%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/TCollectionElementRelation.java (94%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/TDesignPythonOutfit.java (96%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/TDesignPythonOutfitDetail.java (97%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/TrialOrder.java (96%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/UserLike.java (92%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/UserLikeGroup.java (92%) rename src/main/java/com/ai/da/mapper/{ => primary}/entity/Workspace.java (92%) create mode 100644 src/main/java/com/ai/da/mapper/secondary/FemaleDressMapper.java create mode 100644 src/main/java/com/ai/da/mapper/secondary/entity/FemaleDress.java rename src/main/resources/mapper/{ => primary}/AccountMapper.xml (75%) rename src/main/resources/mapper/{ => primary}/ChatRobotMapper.xml (85%) rename src/main/resources/mapper/{ => primary}/ClassificationMapper.xml (81%) rename src/main/resources/mapper/{ => primary}/ClassificationRelLibraryMapper.xml (78%) rename src/main/resources/mapper/{ => primary}/CollectionMapper.xml (66%) rename src/main/resources/mapper/{ => primary}/DesignItemMapper.xml (79%) rename src/main/resources/mapper/{ => primary}/DesignMapper.xml (77%) rename src/main/resources/mapper/{ => primary}/GenerateDetailMapper.xml (87%) rename src/main/resources/mapper/{ => primary}/PantoneMapper.xml (81%) rename src/main/resources/mapper/{ => primary}/PythonTAllInfoMapper.xml (92%) rename src/main/resources/mapper/{ => primary}/TDesignPythonOutfitDetailMapper.xml (90%) rename src/main/resources/mapper/{ => primary}/TDesignPythonOutfitMapper.xml (89%) rename src/main/resources/mapper/{ => primary}/TrialOrderMapper.xml (84%) rename src/main/resources/mapper/{ => primary}/UserLikeGroupMapper.xml (71%) rename src/main/resources/mapper/{ => primary}/WorkspaceMapper.xml (87%) create mode 100644 src/main/resources/mapper/secondary/FemaleDressMapper.xml diff --git a/src/main/java/com/ai/da/common/config/DataSourceConfig.java b/src/main/java/com/ai/da/common/config/DataSourceConfig.java deleted file mode 100644 index 2d5b1a65..00000000 --- a/src/main/java/com/ai/da/common/config/DataSourceConfig.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.ai.da.common.config; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; - -import javax.sql.DataSource; - -@Configuration -public class DataSourceConfig { - - @Primary - @Bean(name = "primaryDataSource") - @ConfigurationProperties(prefix = "spring.datasource.primary") - public DataSource dataSource() { - return DataSourceBuilder.create().build(); - } - - @Bean(name = "secondaryDataSource") - @ConfigurationProperties(prefix = "spring.datasource.secondary") - public DataSource dataSourceSecondary() { - return DataSourceBuilder.create().build(); - } -} - diff --git a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java index 00a3b0c8..893c3771 100644 --- a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java +++ b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java @@ -1,10 +1,9 @@ package com.ai.da.common.config; import com.ai.da.common.utils.SendEmailUtil; -import com.ai.da.mapper.AccountMapper; -import com.ai.da.mapper.entity.Account; +import com.ai.da.mapper.primary.AccountMapper; +import com.ai.da.mapper.primary.entity.Account; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/ai/da/common/config/mybatis/plus/MybatisPlusConfig.java b/src/main/java/com/ai/da/common/config/MybatisPlusConfig.java similarity index 56% rename from src/main/java/com/ai/da/common/config/mybatis/plus/MybatisPlusConfig.java rename to src/main/java/com/ai/da/common/config/MybatisPlusConfig.java index a0bdb29a..b49f7a65 100644 --- a/src/main/java/com/ai/da/common/config/mybatis/plus/MybatisPlusConfig.java +++ b/src/main/java/com/ai/da/common/config/MybatisPlusConfig.java @@ -1,20 +1,26 @@ -package com.ai.da.common.config.mybatis.plus; - -import com.baomidou.mybatisplus.annotation.DbType; -import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; -import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@MapperScan("com.ai.da.mapper") -public class MybatisPlusConfig { - - @Bean - public MybatisPlusInterceptor mybatisPlusInterceptor() { - MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); - interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); - return interceptor; - } -} +package com.ai.da.common.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class MybatisPlusConfig { + + @Bean(name = "primaryMybatisPlusInterceptor") + public MybatisPlusInterceptor primaryMybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } + + @Bean(name = "secondaryMybatisPlusInterceptor") + public MybatisPlusInterceptor secondaryMybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } +} diff --git a/src/main/java/com/ai/da/common/config/PrimaryDataSourceConfig.java b/src/main/java/com/ai/da/common/config/PrimaryDataSourceConfig.java new file mode 100644 index 00000000..c12182db --- /dev/null +++ b/src/main/java/com/ai/da/common/config/PrimaryDataSourceConfig.java @@ -0,0 +1,53 @@ +package com.ai.da.common.config; + +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import javax.sql.DataSource; + +@Configuration +@MapperScan(basePackages = "com.ai.da.mapper.primary", sqlSessionFactoryRef = "primarySqlSessionFactory") +public class PrimaryDataSourceConfig { + + @Primary + @Bean(name = "primaryDataSource") + @ConfigurationProperties(prefix = "spring.datasource.primary") + public DataSource dataSource() { + return DataSourceBuilder.create().build(); + } + + @Primary + @Bean(name = "primarySqlSessionFactory") + public SqlSessionFactory sqlSessionFactory( + @Qualifier("primaryDataSource") DataSource dataSource, + ApplicationContext applicationContext, + @Qualifier("primaryMybatisPlusInterceptor") MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception { + MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean(); + bean.setDataSource(dataSource); + bean.setMapperLocations(applicationContext.getResources("classpath:mapper/primary/*.xml")); + bean.setPlugins(mybatisPlusInterceptor); + return bean.getObject(); + } + + @Primary + @Bean(name = "primarySqlSessionTemplate") + public SqlSessionTemplate sqlSessionTemplate( + @Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) { + return new SqlSessionTemplate(sqlSessionFactory); + } +} + + + + diff --git a/src/main/java/com/ai/da/common/config/SecondaryDataSourceConfig.java b/src/main/java/com/ai/da/common/config/SecondaryDataSourceConfig.java new file mode 100644 index 00000000..eb6f3db5 --- /dev/null +++ b/src/main/java/com/ai/da/common/config/SecondaryDataSourceConfig.java @@ -0,0 +1,49 @@ +package com.ai.da.common.config; + +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.SqlSessionTemplate; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.sql.DataSource; + +@Configuration +@MapperScan(basePackages = "com.ai.da.mapper.secondary", sqlSessionFactoryRef = "secondarySqlSessionFactory") +public class SecondaryDataSourceConfig { + + @Bean(name = "secondaryDataSource") + @ConfigurationProperties(prefix = "spring.datasource.secondary") + public DataSource dataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean(name = "secondarySqlSessionFactory") + public SqlSessionFactory sqlSessionFactory( + @Qualifier("secondaryDataSource") DataSource dataSource, + ApplicationContext applicationContext, + @Qualifier("secondaryMybatisPlusInterceptor") MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception { + MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean(); +// SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); + bean.setDataSource(dataSource); + bean.setMapperLocations(applicationContext.getResources("classpath:mapper/secondary/*.xml")); + bean.setPlugins(mybatisPlusInterceptor); + return bean.getObject(); + } + + @Bean(name = "secondarySqlSessionTemplate") + public SqlSessionTemplate sqlSessionTemplate( + @Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) { + return new SqlSessionTemplate(sqlSessionFactory); + } +} + + + diff --git a/src/main/java/com/ai/da/common/config/mybatis/plus/CommonMapper.java b/src/main/java/com/ai/da/common/config/mybatis/plus/CommonMapper.java index f39599e3..aed7e897 100644 --- a/src/main/java/com/ai/da/common/config/mybatis/plus/CommonMapper.java +++ b/src/main/java/com/ai/da/common/config/mybatis/plus/CommonMapper.java @@ -1,12 +1,12 @@ -package com.ai.da.common.config.mybatis.plus; - -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Constants; -import org.apache.ibatis.annotations.Param; - -public interface CommonMapper extends BaseMapper { - - IPage voPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); -} +package com.ai.da.common.config.mybatis.plus; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; + +public interface CommonMapper extends BaseMapper { + + IPage voPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper); +} diff --git a/src/main/java/com/ai/da/common/config/mybatis/plus/CommonServiceImpl.java b/src/main/java/com/ai/da/common/config/mybatis/plus/CommonServiceImpl.java index 795bd998..fc647498 100644 --- a/src/main/java/com/ai/da/common/config/mybatis/plus/CommonServiceImpl.java +++ b/src/main/java/com/ai/da/common/config/mybatis/plus/CommonServiceImpl.java @@ -1,48 +1,48 @@ -package com.ai.da.common.config.mybatis.plus; - -import cn.hutool.core.collection.CollUtil; -import com.ai.da.common.response.PageResponse; -import com.ai.da.common.response.Response; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; - -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.stream.Collectors; - - -public class CommonServiceImpl, T, E> extends ServiceImpl { - - public PageResponse voPage(QueryCriteria criteria) { - IPage tPage = baseMapper.voPage(new Page<>(criteria.getPage(), criteria.getLimit()), criteria.buildWrapper()); - if (criteria.getMapper() != null && tPage != null && CollUtil.isNotEmpty(tPage.getRecords())) { - List convert = convert(tPage, criteria.getMapper(), criteria); - Response> response = Response.success(convert); - PageResponse pageResponse = new PageResponse<>(response, tPage.getCurrent(), tPage.getSize(), tPage.getTotal(), tPage.getPages()); - if (criteria.getPeekAllAfter() != null) { - Consumer> peekAllAfter = criteria.getPeekAllAfter(); - peekAllAfter.accept(pageResponse.getData()); - } - return pageResponse; - } - PageResponse pageResponse = new PageResponse<>(null, criteria.getPage(), criteria.getLimit(), 0, 0); - if (criteria.getPeekAllAfter() != null) { - Consumer> peekAllAfter = criteria.getPeekAllAfter(); - peekAllAfter.accept(pageResponse.getData()); - } - return pageResponse; - } - - List convert(IPage page, Function mapper, QueryCriteria criteria) { - if (criteria.getPeekBefore() != null && criteria.getPeekAfter() != null) { - return page.getRecords().stream().peek(criteria.getPeekBefore()).map(mapper).peek(criteria.getPeekAfter()).collect(Collectors.toList()); - } else if (criteria.getPeekBefore() != null && criteria.getPeekAfter() == null) { - return page.getRecords().stream().peek(criteria.getPeekBefore()).map(mapper).collect(Collectors.toList()); - } else if (criteria.getPeekBefore() == null && criteria.getPeekAfter() != null) { - return page.getRecords().stream().map(mapper).peek(criteria.getPeekAfter()).collect(Collectors.toList()); - } - return page.getRecords().stream().map(mapper).collect(Collectors.toList()); - } -} +package com.ai.da.common.config.mybatis.plus; + +import cn.hutool.core.collection.CollUtil; +import com.ai.da.common.response.PageResponse; +import com.ai.da.common.response.Response; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; + + +public class CommonServiceImpl, T, E> extends ServiceImpl { + + public PageResponse voPage(QueryCriteria criteria) { + IPage tPage = baseMapper.voPage(new Page<>(criteria.getPage(), criteria.getLimit()), criteria.buildWrapper()); + if (criteria.getMapper() != null && tPage != null && CollUtil.isNotEmpty(tPage.getRecords())) { + List convert = convert(tPage, criteria.getMapper(), criteria); + Response> response = Response.success(convert); + PageResponse pageResponse = new PageResponse<>(response, tPage.getCurrent(), tPage.getSize(), tPage.getTotal(), tPage.getPages()); + if (criteria.getPeekAllAfter() != null) { + Consumer> peekAllAfter = criteria.getPeekAllAfter(); + peekAllAfter.accept(pageResponse.getData()); + } + return pageResponse; + } + PageResponse pageResponse = new PageResponse<>(null, criteria.getPage(), criteria.getLimit(), 0, 0); + if (criteria.getPeekAllAfter() != null) { + Consumer> peekAllAfter = criteria.getPeekAllAfter(); + peekAllAfter.accept(pageResponse.getData()); + } + return pageResponse; + } + + List convert(IPage page, Function mapper, QueryCriteria criteria) { + if (criteria.getPeekBefore() != null && criteria.getPeekAfter() != null) { + return page.getRecords().stream().peek(criteria.getPeekBefore()).map(mapper).peek(criteria.getPeekAfter()).collect(Collectors.toList()); + } else if (criteria.getPeekBefore() != null && criteria.getPeekAfter() == null) { + return page.getRecords().stream().peek(criteria.getPeekBefore()).map(mapper).collect(Collectors.toList()); + } else if (criteria.getPeekBefore() == null && criteria.getPeekAfter() != null) { + return page.getRecords().stream().map(mapper).peek(criteria.getPeekAfter()).collect(Collectors.toList()); + } + return page.getRecords().stream().map(mapper).collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/ai/da/common/config/mybatis/plus/CustomerSqlInjector.java b/src/main/java/com/ai/da/common/config/mybatis/plus/CustomerSqlInjector.java index cf81a83a..047f2f00 100644 --- a/src/main/java/com/ai/da/common/config/mybatis/plus/CustomerSqlInjector.java +++ b/src/main/java/com/ai/da/common/config/mybatis/plus/CustomerSqlInjector.java @@ -1,19 +1,19 @@ -package com.ai.da.common.config.mybatis.plus; - -import com.baomidou.mybatisplus.core.injector.AbstractMethod; -import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; -import com.baomidou.mybatisplus.core.metadata.TableInfo; -import org.springframework.context.annotation.Configuration; - -import java.util.List; - -@Configuration -public class CustomerSqlInjector extends DefaultSqlInjector { - - @Override - public List getMethodList(Class mapperClass, TableInfo tableInfo) { - List methodList = super.getMethodList(mapperClass, tableInfo); - methodList.add(new SelectVoPage()); - return methodList; - } -} +package com.ai.da.common.config.mybatis.plus; + +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +@Configuration +public class CustomerSqlInjector extends DefaultSqlInjector { + + @Override + public List getMethodList(Class mapperClass, TableInfo tableInfo) { + List methodList = super.getMethodList(mapperClass, tableInfo); + methodList.add(new SelectVoPage()); + return methodList; + } +} diff --git a/src/main/java/com/ai/da/common/config/mybatis/plus/QueryCriteria.java b/src/main/java/com/ai/da/common/config/mybatis/plus/QueryCriteria.java index 9942af90..13b674fa 100644 --- a/src/main/java/com/ai/da/common/config/mybatis/plus/QueryCriteria.java +++ b/src/main/java/com/ai/da/common/config/mybatis/plus/QueryCriteria.java @@ -1,85 +1,85 @@ -package com.ai.da.common.config.mybatis.plus; - -import cn.hutool.core.util.StrUtil; -import com.ai.da.common.annotation.Condition; -import com.ai.da.common.annotation.Order; -import com.ai.da.common.enums.ConditionType; -import com.ai.da.common.utils.ConvertUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; - -import java.lang.reflect.Field; -import java.util.Collection; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; - -/** - * @author: dangweijian - * @description: - * @create: 2020-09-14 15:47 - **/ -@Data -@Slf4j -public abstract class QueryCriteria { - - private long page = 1; - private long limit = 10; - private Function mapper; - private Consumer> appendWrapper; - private Consumer peekBefore; - private Consumer peekAfter; - private Consumer> peekAllAfter; - - public QueryCriteria(Function mapper) { - this.mapper = mapper; - } - - public QueryWrapper buildWrapper() { - QueryWrapper wrapper = new QueryWrapper<>(); - Field[] fields = this.getClass().getDeclaredFields(); - for (Field field : fields) { - Condition condition = field.getAnnotation(Condition.class); - if (condition != null) { - field.setAccessible(true); - Object value = null; - try { - value = field.get(this); - } catch (IllegalAccessException e) { - log.warn("reflection anomaly!"); - } - if (!StrUtil.isEmptyIfStr(value)) { - switch (condition.type()) { - case EQ: - wrapper.eq(ConvertUtil.humpToLine2(field.getName()), value); - break; - case LIKE: - wrapper.like(ConvertUtil.humpToLine2(field.getName()), value); - case BETWEEN: - if (value instanceof Collection && ((List) value).size() >= 2) { - wrapper.between(ConvertUtil.humpToLine2(field.getName()), ((List) value).get(0), ((List) value).get(1)); - } - default: - } - } else if (condition.isNull()) { - wrapper.isNull(ConvertUtil.humpToLine2(field.getName())); - } - } - Order order = field.getAnnotation(Order.class); - if (order != null) { - if (!StrUtil.isEmptyIfStr(order.order())) { - switch (order.order()) { - case DESC: - wrapper.orderByDesc(ConvertUtil.humpToLine2(field.getName())); - break; - case ASC: - wrapper.orderByAsc(ConvertUtil.humpToLine2(field.getName())); - } - } - } - } - wrapper.func(this.getAppendWrapper() != null, this.getAppendWrapper()); - return wrapper; - } -} +package com.ai.da.common.config.mybatis.plus; + +import cn.hutool.core.util.StrUtil; +import com.ai.da.common.annotation.Condition; +import com.ai.da.common.annotation.Order; +import com.ai.da.common.enums.ConditionType; +import com.ai.da.common.utils.ConvertUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.lang.reflect.Field; +import java.util.Collection; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; + +/** + * @author: dangweijian + * @description: + * @create: 2020-09-14 15:47 + **/ +@Data +@Slf4j +public abstract class QueryCriteria { + + private long page = 1; + private long limit = 10; + private Function mapper; + private Consumer> appendWrapper; + private Consumer peekBefore; + private Consumer peekAfter; + private Consumer> peekAllAfter; + + public QueryCriteria(Function mapper) { + this.mapper = mapper; + } + + public QueryWrapper buildWrapper() { + QueryWrapper wrapper = new QueryWrapper<>(); + Field[] fields = this.getClass().getDeclaredFields(); + for (Field field : fields) { + Condition condition = field.getAnnotation(Condition.class); + if (condition != null) { + field.setAccessible(true); + Object value = null; + try { + value = field.get(this); + } catch (IllegalAccessException e) { + log.warn("reflection anomaly!"); + } + if (!StrUtil.isEmptyIfStr(value)) { + switch (condition.type()) { + case EQ: + wrapper.eq(ConvertUtil.humpToLine2(field.getName()), value); + break; + case LIKE: + wrapper.like(ConvertUtil.humpToLine2(field.getName()), value); + case BETWEEN: + if (value instanceof Collection && ((List) value).size() >= 2) { + wrapper.between(ConvertUtil.humpToLine2(field.getName()), ((List) value).get(0), ((List) value).get(1)); + } + default: + } + } else if (condition.isNull()) { + wrapper.isNull(ConvertUtil.humpToLine2(field.getName())); + } + } + Order order = field.getAnnotation(Order.class); + if (order != null) { + if (!StrUtil.isEmptyIfStr(order.order())) { + switch (order.order()) { + case DESC: + wrapper.orderByDesc(ConvertUtil.humpToLine2(field.getName())); + break; + case ASC: + wrapper.orderByAsc(ConvertUtil.humpToLine2(field.getName())); + } + } + } + } + wrapper.func(this.getAppendWrapper() != null, this.getAppendWrapper()); + return wrapper; + } +} diff --git a/src/main/java/com/ai/da/common/config/mybatis/plus/SelectVoPage.java b/src/main/java/com/ai/da/common/config/mybatis/plus/SelectVoPage.java index 968b0bc3..57449caa 100644 --- a/src/main/java/com/ai/da/common/config/mybatis/plus/SelectVoPage.java +++ b/src/main/java/com/ai/da/common/config/mybatis/plus/SelectVoPage.java @@ -1,22 +1,22 @@ -package com.ai.da.common.config.mybatis.plus; - -import com.baomidou.mybatisplus.core.enums.SqlMethod; -import com.baomidou.mybatisplus.core.injector.AbstractMethod; -import com.baomidou.mybatisplus.core.metadata.TableInfo; -import org.apache.ibatis.mapping.MappedStatement; -import org.apache.ibatis.mapping.SqlSource; - -public class SelectVoPage extends AbstractMethod { - - private static final String MAPPER_METHOD = "voPage"; - - public SelectVoPage() { - super(MAPPER_METHOD); - } - - public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { - String sql = String.format(SqlMethod.SELECT_PAGE.getSql(), this.sqlFirst(), this.sqlSelectColumns(tableInfo, true), tableInfo.getTableName(), this.sqlWhereEntityWrapper(true, tableInfo), this.sqlOrderBy(tableInfo), this.sqlComment()); - SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass); - return this.addSelectMappedStatementForTable(mapperClass, MAPPER_METHOD, sqlSource, tableInfo); - } -} +package com.ai.da.common.config.mybatis.plus; + +import com.baomidou.mybatisplus.core.enums.SqlMethod; +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlSource; + +public class SelectVoPage extends AbstractMethod { + + private static final String MAPPER_METHOD = "voPage"; + + public SelectVoPage() { + super(MAPPER_METHOD); + } + + public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { + String sql = String.format(SqlMethod.SELECT_PAGE.getSql(), this.sqlFirst(), this.sqlSelectColumns(tableInfo, true), tableInfo.getTableName(), this.sqlWhereEntityWrapper(true, tableInfo), this.sqlOrderBy(tableInfo), this.sqlComment()); + SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass); + return this.addSelectMappedStatementForTable(mapperClass, MAPPER_METHOD, sqlSource, tableInfo); + } +} diff --git a/src/main/java/com/ai/da/common/utils/LocalCacheUtils.java b/src/main/java/com/ai/da/common/utils/LocalCacheUtils.java index 48291bb8..82235e8c 100644 --- a/src/main/java/com/ai/da/common/utils/LocalCacheUtils.java +++ b/src/main/java/com/ai/da/common/utils/LocalCacheUtils.java @@ -1,11 +1,7 @@ package com.ai.da.common.utils; -import com.ai.da.mapper.entity.Collection; -import com.ai.da.mapper.entity.SysFile; import com.ai.da.model.vo.SysFileVO; import com.google.common.cache.*; -import com.google.common.collect.Lists; -import io.swagger.models.auth.In; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; diff --git a/src/main/java/com/ai/da/common/utils/MinioUtil.java b/src/main/java/com/ai/da/common/utils/MinioUtil.java index 5a8f90a1..5e98eecb 100644 --- a/src/main/java/com/ai/da/common/utils/MinioUtil.java +++ b/src/main/java/com/ai/da/common/utils/MinioUtil.java @@ -1,29 +1,21 @@ package com.ai.da.common.utils; import com.ai.da.common.config.exception.BusinessException; -import com.ai.da.mapper.entity.ObjectItem; +import com.ai.da.mapper.primary.entity.ObjectItem; import io.minio.*; import io.minio.errors.MinioException; import io.minio.http.Method; import io.minio.messages.DeleteError; import io.minio.messages.DeleteObject; import io.minio.messages.Item; -import org.apache.tomcat.util.http.fileupload.IOUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import java.io.*; -import java.net.URLEncoder; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; diff --git a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java index a14975a4..b4f7969c 100644 --- a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java +++ b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java @@ -1,7 +1,7 @@ package com.ai.da.common.utils; -import com.ai.da.mapper.entity.Account; -import com.ai.da.mapper.entity.TrialOrder; +import com.ai.da.mapper.primary.entity.Account; +import com.ai.da.mapper.primary.entity.TrialOrder; import com.alibaba.fastjson.JSONObject; import com.ai.da.common.config.exception.BusinessException; import com.tencentcloudapi.common.Credential; diff --git a/src/main/java/com/ai/da/controller/AccountController.java b/src/main/java/com/ai/da/controller/AccountController.java index 1a91a5e5..73aa3bc2 100644 --- a/src/main/java/com/ai/da/controller/AccountController.java +++ b/src/main/java/com/ai/da/controller/AccountController.java @@ -2,13 +2,11 @@ package com.ai.da.controller; import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.Response; -import com.ai.da.common.security.jwt.JWTTokenHelper; -import com.ai.da.mapper.entity.TrialOrder; +import com.ai.da.mapper.primary.entity.TrialOrder; +import com.ai.da.mapper.secondary.entity.FemaleDress; import com.ai.da.model.dto.*; -import com.ai.da.model.enums.Language; import com.ai.da.model.vo.AccountLoginVO; import com.ai.da.model.vo.AccountPreLoginVO; -import com.ai.da.model.vo.QueryLibraryPageVO; import com.ai.da.service.AccountService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -149,4 +147,11 @@ public class AccountController { public Response noLoginRequired(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request){ return Response.success(accountService.noLoginRequired(noLoginRequiredDTO, request)); } + + @ApiOperation(value = "免密登录") + @PostMapping("/test") + public Response test(){ + return Response.success(accountService.test()); + } + } diff --git a/src/main/java/com/ai/da/controller/ClassificationController.java b/src/main/java/com/ai/da/controller/ClassificationController.java index cbe95c14..75c4e556 100644 --- a/src/main/java/com/ai/da/controller/ClassificationController.java +++ b/src/main/java/com/ai/da/controller/ClassificationController.java @@ -1,27 +1,19 @@ package com.ai.da.controller; import com.ai.da.common.response.Response; -import com.ai.da.mapper.entity.Workspace; import com.ai.da.model.dto.ClassificationDTO; -import com.ai.da.model.dto.WorkspaceDTO; -import com.ai.da.model.enums.BizJson; import com.ai.da.model.vo.ClassificationVO; -import com.ai.da.model.vo.ModelsVO; -import com.ai.da.model.vo.WorkspaceVO; import com.ai.da.service.ClassificationService; -import com.ai.da.service.WorkspaceService; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; -import java.io.FileNotFoundException; import java.util.List; /** diff --git a/src/main/java/com/ai/da/controller/LibraryController.java b/src/main/java/com/ai/da/controller/LibraryController.java index 15c58b5d..09263d09 100644 --- a/src/main/java/com/ai/da/controller/LibraryController.java +++ b/src/main/java/com/ai/da/controller/LibraryController.java @@ -7,10 +7,9 @@ import com.ai.da.common.enums.LibraryLevel1TypeEnum; import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.Response; import com.ai.da.common.utils.*; -import com.ai.da.mapper.entity.Library; -import com.ai.da.mapper.entity.LibraryModelPoint; +import com.ai.da.mapper.primary.entity.Library; +import com.ai.da.mapper.primary.entity.LibraryModelPoint; import com.ai.da.model.dto.*; -import com.ai.da.model.enums.ModelType; import com.ai.da.model.vo.*; import com.ai.da.service.LibraryModelPointService; import com.ai.da.service.LibraryService; @@ -20,7 +19,6 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; -import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -29,7 +27,6 @@ import javax.annotation.Resource; import javax.validation.Valid; import java.io.File; import java.util.Date; -import java.util.List; import java.util.Objects; import java.util.UUID; diff --git a/src/main/java/com/ai/da/controller/PythonController.java b/src/main/java/com/ai/da/controller/PythonController.java index da4a8d3f..ea33fe7f 100644 --- a/src/main/java/com/ai/da/controller/PythonController.java +++ b/src/main/java/com/ai/da/controller/PythonController.java @@ -3,7 +3,7 @@ package com.ai.da.controller; import com.ai.da.common.enums.CollectionLevel1TypeEnum; import com.ai.da.common.response.Response; import com.ai.da.common.utils.CopyUtil; -import com.ai.da.mapper.entity.Library; +import com.ai.da.mapper.primary.entity.Library; import com.ai.da.model.dto.ChatFlushDTO; import com.ai.da.model.dto.ChatRobotLibraryDTO; import com.ai.da.model.dto.ChatSendDTO; diff --git a/src/main/java/com/ai/da/controller/SavedCollectionController.java b/src/main/java/com/ai/da/controller/SavedCollectionController.java index 4373dc8b..95df703f 100644 --- a/src/main/java/com/ai/da/controller/SavedCollectionController.java +++ b/src/main/java/com/ai/da/controller/SavedCollectionController.java @@ -6,10 +6,10 @@ import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.Response; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.MinioUtil; -import com.ai.da.mapper.TDesignPythonOutfitMapper; -import com.ai.da.mapper.entity.Account; -import com.ai.da.mapper.entity.TDesignPythonOutfit; -import com.ai.da.mapper.entity.UserLikeGroup; +import com.ai.da.mapper.primary.TDesignPythonOutfitMapper; +import com.ai.da.mapper.primary.entity.Account; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfit; +import com.ai.da.mapper.primary.entity.UserLikeGroup; import com.ai.da.model.dto.*; import com.ai.da.model.vo.*; import com.ai.da.service.*; diff --git a/src/main/java/com/ai/da/controller/WorkspaceController.java b/src/main/java/com/ai/da/controller/WorkspaceController.java index 1de7008a..b0c089f0 100644 --- a/src/main/java/com/ai/da/controller/WorkspaceController.java +++ b/src/main/java/com/ai/da/controller/WorkspaceController.java @@ -1,9 +1,7 @@ package com.ai.da.controller; import com.ai.da.common.response.Response; -import com.ai.da.common.utils.MinioUtil; -import com.ai.da.mapper.entity.Workspace; -import com.ai.da.model.dto.ModelsDotDTO; +import com.ai.da.mapper.primary.entity.Workspace; import com.ai.da.model.dto.WorkspaceDTO; import com.ai.da.model.enums.BizJson; import com.ai.da.model.vo.ModelsVO; @@ -19,9 +17,7 @@ import javax.annotation.Resource; import javax.validation.Valid; import lombok.NoArgsConstructor; -import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; import java.io.FileNotFoundException; import java.util.List; diff --git a/src/main/java/com/ai/da/mapper/AccountLoginLogMapper.java b/src/main/java/com/ai/da/mapper/primary/AccountLoginLogMapper.java similarity index 58% rename from src/main/java/com/ai/da/mapper/AccountLoginLogMapper.java rename to src/main/java/com/ai/da/mapper/primary/AccountLoginLogMapper.java index 46d6e221..4d045456 100644 --- a/src/main/java/com/ai/da/mapper/AccountLoginLogMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/AccountLoginLogMapper.java @@ -1,17 +1,14 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Account; -import com.ai.da.mapper.entity.AccountLoginLog; - -import java.util.List; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface AccountLoginLogMapper extends CommonMapper { - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.AccountLoginLog; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface AccountLoginLogMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/AccountMapper.java b/src/main/java/com/ai/da/mapper/primary/AccountMapper.java similarity index 83% rename from src/main/java/com/ai/da/mapper/AccountMapper.java rename to src/main/java/com/ai/da/mapper/primary/AccountMapper.java index dc8cb900..d9afae89 100644 --- a/src/main/java/com/ai/da/mapper/AccountMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/AccountMapper.java @@ -1,32 +1,32 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Account; - -import java.util.List; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface AccountMapper extends CommonMapper { - - /** - * 手机号批量查询 - * - * @param phoneList - * @return - */ - List findByPhoneList(List phoneList); - - /** - * 主键查询 - * - * @param id - * @return - */ - Account findById(String id); - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.Account; + +import java.util.List; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface AccountMapper extends CommonMapper { + + /** + * 手机号批量查询 + * + * @param phoneList + * @return + */ + List findByPhoneList(List phoneList); + + /** + * 主键查询 + * + * @param id + * @return + */ + Account findById(String id); + +} diff --git a/src/main/java/com/ai/da/mapper/ChatRobotMapper.java b/src/main/java/com/ai/da/mapper/primary/ChatRobotMapper.java similarity index 68% rename from src/main/java/com/ai/da/mapper/ChatRobotMapper.java rename to src/main/java/com/ai/da/mapper/primary/ChatRobotMapper.java index c404a90e..39b0690d 100644 --- a/src/main/java/com/ai/da/mapper/ChatRobotMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/ChatRobotMapper.java @@ -1,9 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.ChatRobot; - -import java.util.List; +import com.ai.da.mapper.primary.entity.ChatRobot; /** * Mapper 接口 diff --git a/src/main/java/com/ai/da/mapper/ClassificationMapper.java b/src/main/java/com/ai/da/mapper/primary/ClassificationMapper.java similarity index 64% rename from src/main/java/com/ai/da/mapper/ClassificationMapper.java rename to src/main/java/com/ai/da/mapper/primary/ClassificationMapper.java index fdc13893..16a692f7 100644 --- a/src/main/java/com/ai/da/mapper/ClassificationMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/ClassificationMapper.java @@ -1,8 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.ChatRobot; -import com.ai.da.mapper.entity.Classification; +import com.ai.da.mapper.primary.entity.Classification; /** * Mapper 接口 diff --git a/src/main/java/com/ai/da/mapper/ClassificationRelLibraryMapper.java b/src/main/java/com/ai/da/mapper/primary/ClassificationRelLibraryMapper.java similarity index 63% rename from src/main/java/com/ai/da/mapper/ClassificationRelLibraryMapper.java rename to src/main/java/com/ai/da/mapper/primary/ClassificationRelLibraryMapper.java index f9094830..a778a40f 100644 --- a/src/main/java/com/ai/da/mapper/ClassificationRelLibraryMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/ClassificationRelLibraryMapper.java @@ -1,8 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Classification; -import com.ai.da.mapper.entity.ClassificationRelLibrary; +import com.ai.da.mapper.primary.entity.ClassificationRelLibrary; /** * Mapper 接口 diff --git a/src/main/java/com/ai/da/mapper/CollectionElementMapper.java b/src/main/java/com/ai/da/mapper/primary/CollectionElementMapper.java similarity index 64% rename from src/main/java/com/ai/da/mapper/CollectionElementMapper.java rename to src/main/java/com/ai/da/mapper/primary/CollectionElementMapper.java index 0c8a0613..55a3188a 100644 --- a/src/main/java/com/ai/da/mapper/CollectionElementMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/CollectionElementMapper.java @@ -1,16 +1,14 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.CollectionElement; - -import java.util.List; - -/** - * Mapper 接口 - * - * @author yanglei - * @since 2022-10-13 - */ -public interface CollectionElementMapper extends CommonMapper { - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.CollectionElement; + +/** + * Mapper 接口 + * + * @author yanglei + * @since 2022-10-13 + */ +public interface CollectionElementMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/CollectionMapper.java b/src/main/java/com/ai/da/mapper/primary/CollectionMapper.java similarity index 66% rename from src/main/java/com/ai/da/mapper/CollectionMapper.java rename to src/main/java/com/ai/da/mapper/primary/CollectionMapper.java index 582de4ef..b9a7bd1e 100644 --- a/src/main/java/com/ai/da/mapper/CollectionMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/CollectionMapper.java @@ -1,18 +1,15 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Account; -import com.ai.da.mapper.entity.Collection; - -import java.util.List; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface CollectionMapper extends CommonMapper { - //返回插入数据后生成的主键 - Long insertCollection(Collection collection); -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.Collection; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface CollectionMapper extends CommonMapper { + //返回插入数据后生成的主键 + Long insertCollection(Collection collection); +} diff --git a/src/main/java/com/ai/da/mapper/ColorLoopUpTableMapper.java b/src/main/java/com/ai/da/mapper/primary/ColorLoopUpTableMapper.java similarity index 70% rename from src/main/java/com/ai/da/mapper/ColorLoopUpTableMapper.java rename to src/main/java/com/ai/da/mapper/primary/ColorLoopUpTableMapper.java index 9dcd8892..5accffbb 100644 --- a/src/main/java/com/ai/da/mapper/ColorLoopUpTableMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/ColorLoopUpTableMapper.java @@ -1,14 +1,14 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.ColorLookupTable; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-09-30 - */ -public interface ColorLoopUpTableMapper extends CommonMapper { - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.ColorLookupTable; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-09-30 + */ +public interface ColorLoopUpTableMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/DesignHistoryMapper.java b/src/main/java/com/ai/da/mapper/primary/DesignHistoryMapper.java similarity index 61% rename from src/main/java/com/ai/da/mapper/DesignHistoryMapper.java rename to src/main/java/com/ai/da/mapper/primary/DesignHistoryMapper.java index 65ad15c2..c850e88a 100644 --- a/src/main/java/com/ai/da/mapper/DesignHistoryMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/DesignHistoryMapper.java @@ -1,15 +1,14 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.AccountLoginLog; -import com.ai.da.mapper.entity.DesignHistory; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface DesignHistoryMapper extends CommonMapper { - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.DesignHistory; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface DesignHistoryMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/DesignItemDetailMapper.java b/src/main/java/com/ai/da/mapper/primary/DesignItemDetailMapper.java similarity index 62% rename from src/main/java/com/ai/da/mapper/DesignItemDetailMapper.java rename to src/main/java/com/ai/da/mapper/primary/DesignItemDetailMapper.java index 6d299294..69add05d 100644 --- a/src/main/java/com/ai/da/mapper/DesignItemDetailMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/DesignItemDetailMapper.java @@ -1,15 +1,14 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.DesignItem; -import com.ai.da.mapper.entity.DesignItemDetail; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface DesignItemDetailMapper extends CommonMapper { - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.DesignItemDetail; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface DesignItemDetailMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/DesignItemDetailPrintMapper.java b/src/main/java/com/ai/da/mapper/primary/DesignItemDetailPrintMapper.java similarity index 61% rename from src/main/java/com/ai/da/mapper/DesignItemDetailPrintMapper.java rename to src/main/java/com/ai/da/mapper/primary/DesignItemDetailPrintMapper.java index 7f522fb1..5a1bdbb5 100644 --- a/src/main/java/com/ai/da/mapper/DesignItemDetailPrintMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/DesignItemDetailPrintMapper.java @@ -1,7 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.DesignItemDetailPrint; +import com.ai.da.mapper.primary.entity.DesignItemDetailPrint; public interface DesignItemDetailPrintMapper extends CommonMapper { diff --git a/src/main/java/com/ai/da/mapper/DesignItemMapper.java b/src/main/java/com/ai/da/mapper/primary/DesignItemMapper.java similarity index 67% rename from src/main/java/com/ai/da/mapper/DesignItemMapper.java rename to src/main/java/com/ai/da/mapper/primary/DesignItemMapper.java index 26222874..cdede99b 100644 --- a/src/main/java/com/ai/da/mapper/DesignItemMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/DesignItemMapper.java @@ -1,16 +1,15 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Design; -import com.ai.da.mapper.entity.DesignItem; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface DesignItemMapper extends CommonMapper { - - Long insertDesignItem(DesignItem designItem); -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.DesignItem; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface DesignItemMapper extends CommonMapper { + + Long insertDesignItem(DesignItem designItem); +} diff --git a/src/main/java/com/ai/da/mapper/DesignMapper.java b/src/main/java/com/ai/da/mapper/primary/DesignMapper.java similarity index 69% rename from src/main/java/com/ai/da/mapper/DesignMapper.java rename to src/main/java/com/ai/da/mapper/primary/DesignMapper.java index 31fc4a18..5a7e201d 100644 --- a/src/main/java/com/ai/da/mapper/DesignMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/DesignMapper.java @@ -1,17 +1,16 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Collection; -import com.ai.da.mapper.entity.Design; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface DesignMapper extends CommonMapper { - - //返回插入数据后生成的主键 - Long insertDesign(Design design); -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.Design; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface DesignMapper extends CommonMapper { + + //返回插入数据后生成的主键 + Long insertDesign(Design design); +} diff --git a/src/main/java/com/ai/da/mapper/GenerateDetailMapper.java b/src/main/java/com/ai/da/mapper/primary/GenerateDetailMapper.java similarity index 83% rename from src/main/java/com/ai/da/mapper/GenerateDetailMapper.java rename to src/main/java/com/ai/da/mapper/primary/GenerateDetailMapper.java index d4c0212d..6c0ed893 100644 --- a/src/main/java/com/ai/da/mapper/GenerateDetailMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/GenerateDetailMapper.java @@ -1,7 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.GenerateDetail; +import com.ai.da.mapper.primary.entity.GenerateDetail; import java.util.List; import java.util.Map; diff --git a/src/main/java/com/ai/da/mapper/GenerateMapper.java b/src/main/java/com/ai/da/mapper/primary/GenerateMapper.java similarity index 60% rename from src/main/java/com/ai/da/mapper/GenerateMapper.java rename to src/main/java/com/ai/da/mapper/primary/GenerateMapper.java index 43436d81..9da22dbb 100644 --- a/src/main/java/com/ai/da/mapper/GenerateMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/GenerateMapper.java @@ -1,7 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Generate; +import com.ai.da.mapper.primary.entity.Generate; public interface GenerateMapper extends CommonMapper { } diff --git a/src/main/java/com/ai/da/mapper/LibraryMapper.java b/src/main/java/com/ai/da/mapper/primary/LibraryMapper.java similarity index 62% rename from src/main/java/com/ai/da/mapper/LibraryMapper.java rename to src/main/java/com/ai/da/mapper/primary/LibraryMapper.java index 6e438d74..c78aa467 100644 --- a/src/main/java/com/ai/da/mapper/LibraryMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/LibraryMapper.java @@ -1,15 +1,14 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Design; -import com.ai.da.mapper.entity.Library; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface LibraryMapper extends CommonMapper { - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.Library; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface LibraryMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/LibraryModelPointMapper.java b/src/main/java/com/ai/da/mapper/primary/LibraryModelPointMapper.java similarity index 62% rename from src/main/java/com/ai/da/mapper/LibraryModelPointMapper.java rename to src/main/java/com/ai/da/mapper/primary/LibraryModelPointMapper.java index c1cfd1ba..ee79efad 100644 --- a/src/main/java/com/ai/da/mapper/LibraryModelPointMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/LibraryModelPointMapper.java @@ -1,15 +1,14 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.LibraryModelPoint; -import com.ai.da.mapper.entity.SysFile; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-11-11 - */ -public interface LibraryModelPointMapper extends CommonMapper { - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.LibraryModelPoint; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-11-11 + */ +public interface LibraryModelPointMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/PanToneMapper.java b/src/main/java/com/ai/da/mapper/primary/PanToneMapper.java similarity index 75% rename from src/main/java/com/ai/da/mapper/PanToneMapper.java rename to src/main/java/com/ai/da/mapper/primary/PanToneMapper.java index a83be55a..81e47ed0 100644 --- a/src/main/java/com/ai/da/mapper/PanToneMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/PanToneMapper.java @@ -1,20 +1,19 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.PanTone; -import com.ai.da.model.dto.GetRgbByHsvBatchDTO; -import io.swagger.v3.oas.annotations.Parameter; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface PanToneMapper extends CommonMapper { - - List getRgbByHsvBatch(@Param("rgbByHsvBatch") List rgbByHsvBatch); -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.PanTone; +import com.ai.da.model.dto.GetRgbByHsvBatchDTO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface PanToneMapper extends CommonMapper { + + List getRgbByHsvBatch(@Param("rgbByHsvBatch") List rgbByHsvBatch); +} diff --git a/src/main/java/com/ai/da/mapper/PythonTAllInfoMapper.java b/src/main/java/com/ai/da/mapper/primary/PythonTAllInfoMapper.java similarity index 56% rename from src/main/java/com/ai/da/mapper/PythonTAllInfoMapper.java rename to src/main/java/com/ai/da/mapper/primary/PythonTAllInfoMapper.java index 9b4bbd14..b5e7a49c 100644 --- a/src/main/java/com/ai/da/mapper/PythonTAllInfoMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/PythonTAllInfoMapper.java @@ -1,11 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.PythonTAllInfo; -import org.apache.ibatis.annotations.Param; -import org.springframework.data.domain.Pageable; - -import java.util.List; +import com.ai.da.mapper.primary.entity.PythonTAllInfo; /** * (PythonTAllInfo)表数据库访问层 diff --git a/src/main/java/com/ai/da/mapper/SysFileMapper.java b/src/main/java/com/ai/da/mapper/primary/SysFileMapper.java similarity index 62% rename from src/main/java/com/ai/da/mapper/SysFileMapper.java rename to src/main/java/com/ai/da/mapper/primary/SysFileMapper.java index ab4d995d..94842a00 100644 --- a/src/main/java/com/ai/da/mapper/SysFileMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/SysFileMapper.java @@ -1,15 +1,14 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Design; -import com.ai.da.mapper.entity.SysFile; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-10-6 - */ -public interface SysFileMapper extends CommonMapper { - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.SysFile; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-10-6 + */ +public interface SysFileMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/TCollectionElementRelationMapper.java b/src/main/java/com/ai/da/mapper/primary/TCollectionElementRelationMapper.java similarity index 76% rename from src/main/java/com/ai/da/mapper/TCollectionElementRelationMapper.java rename to src/main/java/com/ai/da/mapper/primary/TCollectionElementRelationMapper.java index a09b17bf..508a7533 100644 --- a/src/main/java/com/ai/da/mapper/TCollectionElementRelationMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/TCollectionElementRelationMapper.java @@ -1,7 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.TCollectionElementRelation; +import com.ai.da.mapper.primary.entity.TCollectionElementRelation; import org.apache.ibatis.annotations.Mapper; /** diff --git a/src/main/java/com/ai/da/mapper/TDesignPythonOutfitDetailMapper.java b/src/main/java/com/ai/da/mapper/primary/TDesignPythonOutfitDetailMapper.java similarity index 86% rename from src/main/java/com/ai/da/mapper/TDesignPythonOutfitDetailMapper.java rename to src/main/java/com/ai/da/mapper/primary/TDesignPythonOutfitDetailMapper.java index 68f42c82..ecdf8b45 100644 --- a/src/main/java/com/ai/da/mapper/TDesignPythonOutfitDetailMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/TDesignPythonOutfitDetailMapper.java @@ -1,7 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.TDesignPythonOutfitDetail; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfitDetail; import com.ai.da.model.vo.TDesignPythonOutfitDetailVO; import com.baomidou.mybatisplus.core.metadata.IPage; diff --git a/src/main/java/com/ai/da/mapper/TDesignPythonOutfitMapper.java b/src/main/java/com/ai/da/mapper/primary/TDesignPythonOutfitMapper.java similarity index 86% rename from src/main/java/com/ai/da/mapper/TDesignPythonOutfitMapper.java rename to src/main/java/com/ai/da/mapper/primary/TDesignPythonOutfitMapper.java index 1423c794..c3284391 100644 --- a/src/main/java/com/ai/da/mapper/TDesignPythonOutfitMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/TDesignPythonOutfitMapper.java @@ -1,8 +1,8 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.TDesignPythonOutfit; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfit; import com.ai.da.model.vo.TDesignPythonOutfitVO; import com.baomidou.mybatisplus.core.metadata.IPage; diff --git a/src/main/java/com/ai/da/mapper/TrialOrderMapper.java b/src/main/java/com/ai/da/mapper/primary/TrialOrderMapper.java similarity index 61% rename from src/main/java/com/ai/da/mapper/TrialOrderMapper.java rename to src/main/java/com/ai/da/mapper/primary/TrialOrderMapper.java index 45a9a621..39def53f 100644 --- a/src/main/java/com/ai/da/mapper/TrialOrderMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/TrialOrderMapper.java @@ -1,10 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Account; -import com.ai.da.mapper.entity.TrialOrder; - -import java.util.List; +import com.ai.da.mapper.primary.entity.TrialOrder; /** * Mapper 接口 diff --git a/src/main/java/com/ai/da/mapper/UserLikeGroupMapper.java b/src/main/java/com/ai/da/mapper/primary/UserLikeGroupMapper.java similarity index 71% rename from src/main/java/com/ai/da/mapper/UserLikeGroupMapper.java rename to src/main/java/com/ai/da/mapper/primary/UserLikeGroupMapper.java index df5f4629..4d71e0b2 100644 --- a/src/main/java/com/ai/da/mapper/UserLikeGroupMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/UserLikeGroupMapper.java @@ -1,16 +1,15 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Design; -import com.ai.da.mapper.entity.UserLikeGroup; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface UserLikeGroupMapper extends CommonMapper { - //返回插入数据后生成的主键 - Long insertUserLikeGroup(UserLikeGroup userLikeGroup); -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.UserLikeGroup; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface UserLikeGroupMapper extends CommonMapper { + //返回插入数据后生成的主键 + Long insertUserLikeGroup(UserLikeGroup userLikeGroup); +} diff --git a/src/main/java/com/ai/da/mapper/UserLikeMapper.java b/src/main/java/com/ai/da/mapper/primary/UserLikeMapper.java similarity index 70% rename from src/main/java/com/ai/da/mapper/UserLikeMapper.java rename to src/main/java/com/ai/da/mapper/primary/UserLikeMapper.java index 35ae30df..1d5e4761 100644 --- a/src/main/java/com/ai/da/mapper/UserLikeMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/UserLikeMapper.java @@ -1,14 +1,14 @@ -package com.ai.da.mapper; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.UserLike; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface UserLikeMapper extends CommonMapper { - -} +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.UserLike; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface UserLikeMapper extends CommonMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/WorkspaceMapper.java b/src/main/java/com/ai/da/mapper/primary/WorkspaceMapper.java similarity index 85% rename from src/main/java/com/ai/da/mapper/WorkspaceMapper.java rename to src/main/java/com/ai/da/mapper/primary/WorkspaceMapper.java index e1525d4a..214e97c0 100644 --- a/src/main/java/com/ai/da/mapper/WorkspaceMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/WorkspaceMapper.java @@ -1,7 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Workspace; +import com.ai.da.mapper.primary.entity.Workspace; import com.ai.da.model.vo.WorkspaceVO; import com.baomidou.mybatisplus.core.metadata.IPage; diff --git a/src/main/java/com/ai/da/mapper/entity/Account.java b/src/main/java/com/ai/da/mapper/primary/entity/Account.java similarity index 92% rename from src/main/java/com/ai/da/mapper/entity/Account.java rename to src/main/java/com/ai/da/mapper/primary/entity/Account.java index 3dd607b6..bca34dec 100644 --- a/src/main/java/com/ai/da/mapper/entity/Account.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Account.java @@ -1,83 +1,83 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_account") -public class Account implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 邮箱 - */ - private String userEmail; - - /** - * 用户名 - */ - private String userName; - - /** - * 密码 - */ - private String userPassword; - - /** - * 语言 - */ - private String language; - - /** - * 城市 - */ - private String country; - - /** - * 账户有效期开始时间 - */ - private Long validStartTime; - - /** - * 账户有效期结束时间 - */ - private Long validEndTime; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; - - private Integer isTrial; - - private Integer isBeginner; - - private String browserIdentifiers; -} +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_account") +public class Account implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 邮箱 + */ + private String userEmail; + + /** + * 用户名 + */ + private String userName; + + /** + * 密码 + */ + private String userPassword; + + /** + * 语言 + */ + private String language; + + /** + * 城市 + */ + private String country; + + /** + * 账户有效期开始时间 + */ + private Long validStartTime; + + /** + * 账户有效期结束时间 + */ + private Long validEndTime; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; + + private Integer isTrial; + + private Integer isBeginner; + + private String browserIdentifiers; +} diff --git a/src/main/java/com/ai/da/mapper/entity/AccountLoginLog.java b/src/main/java/com/ai/da/mapper/primary/entity/AccountLoginLog.java similarity index 91% rename from src/main/java/com/ai/da/mapper/entity/AccountLoginLog.java rename to src/main/java/com/ai/da/mapper/primary/entity/AccountLoginLog.java index 9218813e..1eb5fb30 100644 --- a/src/main/java/com/ai/da/mapper/entity/AccountLoginLog.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/AccountLoginLog.java @@ -1,53 +1,53 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - * 账户登入日志 - * - * @author yl - * @since 2022-09-03 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_account_login_log") -public class AccountLoginLog implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 账户id - */ - private Long accountId; - - /** - * ip - */ - private String ip; - - /** - * ip地址 - */ - private String ipAddr; - - /** - * 创建时间 - */ - private Date createDate; - -} +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 账户登入日志 + * + * @author yl + * @since 2022-09-03 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_account_login_log") +public class AccountLoginLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 账户id + */ + private Long accountId; + + /** + * ip + */ + private String ip; + + /** + * ip地址 + */ + private String ipAddr; + + /** + * 创建时间 + */ + private Date createDate; + +} diff --git a/src/main/java/com/ai/da/mapper/entity/ChatRobot.java b/src/main/java/com/ai/da/mapper/primary/entity/ChatRobot.java similarity index 94% rename from src/main/java/com/ai/da/mapper/entity/ChatRobot.java rename to src/main/java/com/ai/da/mapper/primary/entity/ChatRobot.java index dd470187..31397ada 100644 --- a/src/main/java/com/ai/da/mapper/entity/ChatRobot.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/ChatRobot.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -11,7 +11,6 @@ import lombok.experimental.Accessors; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.Date; @Data @EqualsAndHashCode(callSuper = false) diff --git a/src/main/java/com/ai/da/mapper/entity/Classification.java b/src/main/java/com/ai/da/mapper/primary/entity/Classification.java similarity index 95% rename from src/main/java/com/ai/da/mapper/entity/Classification.java rename to src/main/java/com/ai/da/mapper/primary/entity/Classification.java index 65a8c238..b41a2b0f 100644 --- a/src/main/java/com/ai/da/mapper/entity/Classification.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Classification.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -10,7 +10,6 @@ import lombok.experimental.Accessors; import java.io.Serializable; import java.time.LocalDateTime; -import java.util.Date; @Data @EqualsAndHashCode(callSuper = false) diff --git a/src/main/java/com/ai/da/mapper/entity/ClassificationRelLibrary.java b/src/main/java/com/ai/da/mapper/primary/entity/ClassificationRelLibrary.java similarity index 96% rename from src/main/java/com/ai/da/mapper/entity/ClassificationRelLibrary.java rename to src/main/java/com/ai/da/mapper/primary/entity/ClassificationRelLibrary.java index c8449830..41649ab3 100644 --- a/src/main/java/com/ai/da/mapper/entity/ClassificationRelLibrary.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/ClassificationRelLibrary.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/src/main/java/com/ai/da/mapper/entity/Collection.java b/src/main/java/com/ai/da/mapper/primary/entity/Collection.java similarity index 86% rename from src/main/java/com/ai/da/mapper/entity/Collection.java rename to src/main/java/com/ai/da/mapper/primary/entity/Collection.java index 1ff7cbb2..73f9a769 100644 --- a/src/main/java/com/ai/da/mapper/entity/Collection.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Collection.java @@ -1,53 +1,52 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_collection") -public class Collection implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 用户ID - */ - private Long accountId; - - /** - * mood模板id - */ - private String moodTemplateId; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; -} +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_collection") +public class Collection implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + */ + private Long accountId; + + /** + * mood模板id + */ + private String moodTemplateId; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/CollectionElement.java b/src/main/java/com/ai/da/mapper/primary/entity/CollectionElement.java similarity index 92% rename from src/main/java/com/ai/da/mapper/entity/CollectionElement.java rename to src/main/java/com/ai/da/mapper/primary/entity/CollectionElement.java index 320a8ed7..b15b9418 100644 --- a/src/main/java/com/ai/da/mapper/entity/CollectionElement.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/CollectionElement.java @@ -1,87 +1,87 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_collection_element") -public class CollectionElement implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 用户ID - */ - private Long accountId; - /** - * collectionId - */ - private Long collectionId; - - private String type; - - /** - * 一级类型 - */ - private String level1Type; - - /** - * 二级类型 - */ - private String level2Type; - - /** - * 元素名(如果是颜色board 存潘通id+潘通名字 形式 ""11_mds") - */ - private String name; - - /** - * 元素存放地址 - */ - private String url; - /** - * 是否pin 1pin 0 不pin - */ - @TableField("is_pin") - private Byte hasPin; - /** - * 颜色的rgb值 空格分割 - */ - private String colorRgb; - /** - * md5值 - */ - private String md5; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; -} +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_collection_element") +public class CollectionElement implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + */ + private Long accountId; + /** + * collectionId + */ + private Long collectionId; + + private String type; + + /** + * 一级类型 + */ + private String level1Type; + + /** + * 二级类型 + */ + private String level2Type; + + /** + * 元素名(如果是颜色board 存潘通id+潘通名字 形式 ""11_mds") + */ + private String name; + + /** + * 元素存放地址 + */ + private String url; + /** + * 是否pin 1pin 0 不pin + */ + @TableField("is_pin") + private Byte hasPin; + /** + * 颜色的rgb值 空格分割 + */ + private String colorRgb; + /** + * md5值 + */ + private String md5; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/ColorLookupTable.java b/src/main/java/com/ai/da/mapper/primary/entity/ColorLookupTable.java similarity index 75% rename from src/main/java/com/ai/da/mapper/entity/ColorLookupTable.java rename to src/main/java/com/ai/da/mapper/primary/entity/ColorLookupTable.java index b26cec78..04515738 100644 --- a/src/main/java/com/ai/da/mapper/entity/ColorLookupTable.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/ColorLookupTable.java @@ -1,35 +1,32 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-09-30 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("color_lookup_table") -public class ColorLookupTable implements Serializable { - - private static final long serialVersionUID = 1L; - /** - * colorValue - */ - private Integer colorValue; - - /** - * color_index - */ - private Integer colorIndex; -} +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-09-30 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("color_lookup_table") +public class ColorLookupTable implements Serializable { + + private static final long serialVersionUID = 1L; + /** + * colorValue + */ + private Integer colorValue; + + /** + * color_index + */ + private Integer colorIndex; +} diff --git a/src/main/java/com/ai/da/mapper/entity/Design.java b/src/main/java/com/ai/da/mapper/primary/entity/Design.java similarity index 89% rename from src/main/java/com/ai/da/mapper/entity/Design.java rename to src/main/java/com/ai/da/mapper/primary/entity/Design.java index 8c990b6f..f891ab78 100644 --- a/src/main/java/com/ai/da/mapper/entity/Design.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Design.java @@ -1,73 +1,72 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.math.BigDecimal; -import java.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_design") -public class Design implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - /** - * 用户ID - */ - private Long accountId; - /** - * collectionId - */ - private Long collectionId; - /** - * 模特id - */ - private Long templateId; - - private String modelType; - - /** - * system scale值 - */ - private BigDecimal systemScale; - - /** - * 控制生成类型的参数,两个选项:“overall”或“single” - */ - private String singleOverall; - - /** - * single模式下的类别选择参数 选项有outwear,dress,blouse,skirt,trousers - */ - private String switchCategory; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; -} +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_design") +public class Design implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 用户ID + */ + private Long accountId; + /** + * collectionId + */ + private Long collectionId; + /** + * 模特id + */ + private Long templateId; + + private String modelType; + + /** + * system scale值 + */ + private BigDecimal systemScale; + + /** + * 控制生成类型的参数,两个选项:“overall”或“single” + */ + private String singleOverall; + + /** + * single模式下的类别选择参数 选项有outwear,dress,blouse,skirt,trousers + */ + private String switchCategory; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/DesignHistory.java b/src/main/java/com/ai/da/mapper/primary/entity/DesignHistory.java similarity index 91% rename from src/main/java/com/ai/da/mapper/entity/DesignHistory.java rename to src/main/java/com/ai/da/mapper/primary/entity/DesignHistory.java index 87f11e7f..6d9af783 100644 --- a/src/main/java/com/ai/da/mapper/entity/DesignHistory.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/DesignHistory.java @@ -1,55 +1,55 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_design_history") -public class DesignHistory implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - /** - * 用户ID - */ - private Long accountId; - - /** - * collectionId - */ - private Long collectionId; - - /** - * md5值 - */ - private String md5; - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; -} +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_design_history") +public class DesignHistory implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 用户ID + */ + private Long accountId; + + /** + * collectionId + */ + private Long collectionId; + + /** + * md5值 + */ + private String md5; + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/DesignItem.java b/src/main/java/com/ai/da/mapper/primary/entity/DesignItem.java similarity index 93% rename from src/main/java/com/ai/da/mapper/entity/DesignItem.java rename to src/main/java/com/ai/da/mapper/primary/entity/DesignItem.java index 7a47111b..f6532eea 100644 --- a/src/main/java/com/ai/da/mapper/entity/DesignItem.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/DesignItem.java @@ -1,75 +1,75 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_design_item") -public class DesignItem implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - /** - * 用户ID - */ - private Long accountId; - /** - * collectionId - */ - private Long collectionId; - /** - * designId - */ - private Long designId; - - /** - * print scale值 - */ - private String printScale; - - /** - * design后的用户文件地址(python 返回) - */ - private String designUrl; - - /** - * 二次(高级,基础design的图再次design)design后的用户文件地址(python 返回) - */ - private String highDesignUrl; - /** - * 是否like 0 否 1是 - */ - @TableField("is_like") - private Byte hasLike; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; -} +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_design_item") +public class DesignItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 用户ID + */ + private Long accountId; + /** + * collectionId + */ + private Long collectionId; + /** + * designId + */ + private Long designId; + + /** + * print scale值 + */ + private String printScale; + + /** + * design后的用户文件地址(python 返回) + */ + private String designUrl; + + /** + * 二次(高级,基础design的图再次design)design后的用户文件地址(python 返回) + */ + private String highDesignUrl; + /** + * 是否like 0 否 1是 + */ + @TableField("is_like") + private Byte hasLike; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/DesignItemDetail.java b/src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetail.java similarity index 93% rename from src/main/java/com/ai/da/mapper/entity/DesignItemDetail.java rename to src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetail.java index f3a866b9..437a9264 100644 --- a/src/main/java/com/ai/da/mapper/entity/DesignItemDetail.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetail.java @@ -1,106 +1,106 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_design_item_detail") -public class DesignItemDetail implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - /** - * 用户ID - */ - private Long accountId; - - /** - * designId - */ - private Long designId; - - /** - * designItemId - */ - private Long designItemId; - - /** - * elemntId - */ - private Long collectionElementId; - - /** - * 生成item实际对应的类型 有:outwear,dress,blouse,skirt,trousers Shoes Hairstyle Earring Body - */ - private String type; - - /** - * 对应的图片的绝对路径 - */ - private String path; - - /** - * 颜色 存 RGB值 中间空格分隔 比如 "58 58 169" - */ - private String color; - - /** - * 对应的print图片的绝对路径 - */ - private String printPath; - - /** - * 对应的icon的绝对路径 - */ - private String iconPath; - - /** - * 对应上游业务id - */ - private Long businessId; - - /** - * 存储print打点的的参数json对象 - */ - private String printJson; - - /** - * item的优先级 - */ - private Integer priority; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; - - /** - * 逻辑删除 1->删除 0->未删除 默认null - */ - private Byte isDeleted; -} +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_design_item_detail") +public class DesignItemDetail implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 用户ID + */ + private Long accountId; + + /** + * designId + */ + private Long designId; + + /** + * designItemId + */ + private Long designItemId; + + /** + * elemntId + */ + private Long collectionElementId; + + /** + * 生成item实际对应的类型 有:outwear,dress,blouse,skirt,trousers Shoes Hairstyle Earring Body + */ + private String type; + + /** + * 对应的图片的绝对路径 + */ + private String path; + + /** + * 颜色 存 RGB值 中间空格分隔 比如 "58 58 169" + */ + private String color; + + /** + * 对应的print图片的绝对路径 + */ + private String printPath; + + /** + * 对应的icon的绝对路径 + */ + private String iconPath; + + /** + * 对应上游业务id + */ + private Long businessId; + + /** + * 存储print打点的的参数json对象 + */ + private String printJson; + + /** + * item的优先级 + */ + private Integer priority; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; + + /** + * 逻辑删除 1->删除 0->未删除 默认null + */ + private Byte isDeleted; +} diff --git a/src/main/java/com/ai/da/mapper/entity/DesignItemDetailPrint.java b/src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetailPrint.java similarity index 96% rename from src/main/java/com/ai/da/mapper/entity/DesignItemDetailPrint.java rename to src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetailPrint.java index be009476..e6800e69 100644 --- a/src/main/java/com/ai/da/mapper/entity/DesignItemDetailPrint.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetailPrint.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/src/main/java/com/ai/da/mapper/entity/Generate.java b/src/main/java/com/ai/da/mapper/primary/entity/Generate.java similarity index 96% rename from src/main/java/com/ai/da/mapper/entity/Generate.java rename to src/main/java/com/ai/da/mapper/primary/entity/Generate.java index fc1f4e33..009e7fe0 100644 --- a/src/main/java/com/ai/da/mapper/entity/Generate.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Generate.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; diff --git a/src/main/java/com/ai/da/mapper/entity/GenerateDetail.java b/src/main/java/com/ai/da/mapper/primary/entity/GenerateDetail.java similarity index 96% rename from src/main/java/com/ai/da/mapper/entity/GenerateDetail.java rename to src/main/java/com/ai/da/mapper/primary/entity/GenerateDetail.java index cce89e29..b016e7fa 100644 --- a/src/main/java/com/ai/da/mapper/entity/GenerateDetail.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/GenerateDetail.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; diff --git a/src/main/java/com/ai/da/mapper/entity/Library.java b/src/main/java/com/ai/da/mapper/primary/entity/Library.java similarity index 89% rename from src/main/java/com/ai/da/mapper/entity/Library.java rename to src/main/java/com/ai/da/mapper/primary/entity/Library.java index 5ed6f488..cc5250a4 100644 --- a/src/main/java/com/ai/da/mapper/entity/Library.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Library.java @@ -1,84 +1,83 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_library") -public class Library implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 用户ID - */ - private Long accountId; - - /** - * 一级类型 - */ - private String level1Type; - - /** - * 二级类型 - */ - private String level2Type; - - private String level3Type; - - /** - * 元素名 - */ - private String name; - - /** - * 元素存放地址 - */ - private String url; - /** - * md5值 - */ - private String md5; - /** - * 图片高度,目前只争对 models类型 - */ - private Integer high; - /** - * 图片宽度,目前只争对 models类型 - */ - private Integer width; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; - -// private Integer isCopy; -} +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_library") +public class Library implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + */ + private Long accountId; + + /** + * 一级类型 + */ + private String level1Type; + + /** + * 二级类型 + */ + private String level2Type; + + private String level3Type; + + /** + * 元素名 + */ + private String name; + + /** + * 元素存放地址 + */ + private String url; + /** + * md5值 + */ + private String md5; + /** + * 图片高度,目前只争对 models类型 + */ + private Integer high; + /** + * 图片宽度,目前只争对 models类型 + */ + private Integer width; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; + +// private Integer isCopy; +} diff --git a/src/main/java/com/ai/da/mapper/entity/LibraryModelPoint.java b/src/main/java/com/ai/da/mapper/primary/entity/LibraryModelPoint.java similarity index 92% rename from src/main/java/com/ai/da/mapper/entity/LibraryModelPoint.java rename to src/main/java/com/ai/da/mapper/primary/entity/LibraryModelPoint.java index 01adf7b7..d3e1fbdf 100644 --- a/src/main/java/com/ai/da/mapper/entity/LibraryModelPoint.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/LibraryModelPoint.java @@ -1,81 +1,81 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-11-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_library_model_point") -public class LibraryModelPoint implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * modelType - */ - private String modelType; - - /** - * 关联的 library或sys Id - */ - private Long relationId; - - /** - * 左肩 - */ - private String shoulderLeft; - - /** - * 右肩 - */ - private String shoulderRight; - - /** - * 左腰 - */ - private String waistbandLeft; - - /** - * 右腰 - */ - private String waistbandRight; - /** - * 左手 - */ - private String handLeft; - - /** - * 右手 - */ - private String handRight; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; -} +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-11-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_library_model_point") +public class LibraryModelPoint implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * modelType + */ + private String modelType; + + /** + * 关联的 library或sys Id + */ + private Long relationId; + + /** + * 左肩 + */ + private String shoulderLeft; + + /** + * 右肩 + */ + private String shoulderRight; + + /** + * 左腰 + */ + private String waistbandLeft; + + /** + * 右腰 + */ + private String waistbandRight; + /** + * 左手 + */ + private String handLeft; + + /** + * 右手 + */ + private String handRight; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/ObjectItem.java b/src/main/java/com/ai/da/mapper/primary/entity/ObjectItem.java similarity index 73% rename from src/main/java/com/ai/da/mapper/entity/ObjectItem.java rename to src/main/java/com/ai/da/mapper/primary/entity/ObjectItem.java index 80d33e2d..631d6db1 100644 --- a/src/main/java/com/ai/da/mapper/entity/ObjectItem.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/ObjectItem.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import lombok.Data; diff --git a/src/main/java/com/ai/da/mapper/entity/PanTone.java b/src/main/java/com/ai/da/mapper/primary/entity/PanTone.java similarity index 84% rename from src/main/java/com/ai/da/mapper/entity/PanTone.java rename to src/main/java/com/ai/da/mapper/primary/entity/PanTone.java index dc14ae1a..bc854838 100644 --- a/src/main/java/com/ai/da/mapper/entity/PanTone.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/PanTone.java @@ -1,72 +1,70 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("pantone") -public class PanTone implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * pantone_index - */ - @TableId("pantone_index") - private Integer pantoneIndex; - - /** - * name - */ - private String name; - - /** - * TCX - */ - private String tcx; - - /** - * R - */ - private Integer r; - - /** - * G - */ - private Integer g; - - /** - * B - */ - private Integer b; - - /** - * H - */ - private Integer h; - - /** - * S - */ - private Integer s; - - /** - * V - */ - private Integer v; -} +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("pantone") +public class PanTone implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * pantone_index + */ + @TableId("pantone_index") + private Integer pantoneIndex; + + /** + * name + */ + private String name; + + /** + * TCX + */ + private String tcx; + + /** + * R + */ + private Integer r; + + /** + * G + */ + private Integer g; + + /** + * B + */ + private Integer b; + + /** + * H + */ + private Integer h; + + /** + * S + */ + private Integer s; + + /** + * V + */ + private Integer v; +} diff --git a/src/main/java/com/ai/da/mapper/entity/PythonTAllInfo.java b/src/main/java/com/ai/da/mapper/primary/entity/PythonTAllInfo.java similarity index 97% rename from src/main/java/com/ai/da/mapper/entity/PythonTAllInfo.java rename to src/main/java/com/ai/da/mapper/primary/entity/PythonTAllInfo.java index ae16fdd8..40f89ff2 100644 --- a/src/main/java/com/ai/da/mapper/entity/PythonTAllInfo.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/PythonTAllInfo.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/src/main/java/com/ai/da/mapper/entity/Sketches.java b/src/main/java/com/ai/da/mapper/primary/entity/Sketches.java similarity index 78% rename from src/main/java/com/ai/da/mapper/entity/Sketches.java rename to src/main/java/com/ai/da/mapper/primary/entity/Sketches.java index a3fb57b4..a6bc9460 100644 --- a/src/main/java/com/ai/da/mapper/entity/Sketches.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Sketches.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import lombok.Data; diff --git a/src/main/java/com/ai/da/mapper/entity/SketchesBoundingBox.java b/src/main/java/com/ai/da/mapper/primary/entity/SketchesBoundingBox.java similarity index 75% rename from src/main/java/com/ai/da/mapper/entity/SketchesBoundingBox.java rename to src/main/java/com/ai/da/mapper/primary/entity/SketchesBoundingBox.java index 24c5b1df..6c687e25 100644 --- a/src/main/java/com/ai/da/mapper/entity/SketchesBoundingBox.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/SketchesBoundingBox.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import lombok.Data; diff --git a/src/main/java/com/ai/da/mapper/entity/SysFile.java b/src/main/java/com/ai/da/mapper/primary/entity/SysFile.java similarity index 93% rename from src/main/java/com/ai/da/mapper/entity/SysFile.java rename to src/main/java/com/ai/da/mapper/primary/entity/SysFile.java index f4977130..24466611 100644 --- a/src/main/java/com/ai/da/mapper/entity/SysFile.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/SysFile.java @@ -1,81 +1,81 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - * Attendance - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_sys_file") -public class SysFile implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 一级类型 accessories icon Images - */ - private String level1Type; - - /** - * 二级类型 目前有outwear,dress,blouse,skirt,trousers Shoes Hairstyle Earring - */ - private String level2Type; - - private String level3Type; - - /** - * 名字 - */ - private String name; - - /** - * md5值 - */ - private String md5; - - /** - * 路径 绝对路径 - */ - private String url; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; - - public SysFile() { - } - - public SysFile(String level1Type, String level2Type, String name, String md5, String url, Date createDate) { - this.level1Type = level1Type; - this.level2Type = level2Type; - this.name = name; - this.md5 = md5; - this.url = url; - this.createDate = createDate; - } -} +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_sys_file") +public class SysFile implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 一级类型 accessories icon Images + */ + private String level1Type; + + /** + * 二级类型 目前有outwear,dress,blouse,skirt,trousers Shoes Hairstyle Earring + */ + private String level2Type; + + private String level3Type; + + /** + * 名字 + */ + private String name; + + /** + * md5值 + */ + private String md5; + + /** + * 路径 绝对路径 + */ + private String url; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; + + public SysFile() { + } + + public SysFile(String level1Type, String level2Type, String name, String md5, String url, Date createDate) { + this.level1Type = level1Type; + this.level2Type = level2Type; + this.name = name; + this.md5 = md5; + this.url = url; + this.createDate = createDate; + } +} diff --git a/src/main/java/com/ai/da/mapper/entity/TCollectionElementRelation.java b/src/main/java/com/ai/da/mapper/primary/entity/TCollectionElementRelation.java similarity index 94% rename from src/main/java/com/ai/da/mapper/entity/TCollectionElementRelation.java rename to src/main/java/com/ai/da/mapper/primary/entity/TCollectionElementRelation.java index cb6dbbcd..dac90348 100644 --- a/src/main/java/com/ai/da/mapper/entity/TCollectionElementRelation.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/TCollectionElementRelation.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; @@ -7,7 +7,6 @@ import lombok.*; import lombok.experimental.Accessors; import java.io.Serializable; -import java.time.LocalDateTime; import java.util.Date; diff --git a/src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfit.java b/src/main/java/com/ai/da/mapper/primary/entity/TDesignPythonOutfit.java similarity index 96% rename from src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfit.java rename to src/main/java/com/ai/da/mapper/primary/entity/TDesignPythonOutfit.java index 8fe281a6..e08f19bc 100644 --- a/src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfit.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/TDesignPythonOutfit.java @@ -1,5 +1,5 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -8,7 +8,6 @@ import java.time.LocalDateTime; import java.io.Serializable; import lombok.Data; -import lombok.EqualsAndHashCode; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfitDetail.java b/src/main/java/com/ai/da/mapper/primary/entity/TDesignPythonOutfitDetail.java similarity index 97% rename from src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfitDetail.java rename to src/main/java/com/ai/da/mapper/primary/entity/TDesignPythonOutfitDetail.java index f49ea93e..3d69de8e 100644 --- a/src/main/java/com/ai/da/mapper/entity/TDesignPythonOutfitDetail.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/TDesignPythonOutfitDetail.java @@ -1,5 +1,5 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -8,7 +8,6 @@ import java.time.LocalDateTime; import java.io.Serializable; import lombok.Data; -import lombok.EqualsAndHashCode; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; diff --git a/src/main/java/com/ai/da/mapper/entity/TrialOrder.java b/src/main/java/com/ai/da/mapper/primary/entity/TrialOrder.java similarity index 96% rename from src/main/java/com/ai/da/mapper/entity/TrialOrder.java rename to src/main/java/com/ai/da/mapper/primary/entity/TrialOrder.java index 904d1a75..cf37aeee 100644 --- a/src/main/java/com/ai/da/mapper/entity/TrialOrder.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/TrialOrder.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -10,7 +10,7 @@ import lombok.experimental.Accessors; import java.io.Serializable; import java.time.LocalDateTime; -import java.util.Date; + @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) diff --git a/src/main/java/com/ai/da/mapper/entity/UserLike.java b/src/main/java/com/ai/da/mapper/primary/entity/UserLike.java similarity index 92% rename from src/main/java/com/ai/da/mapper/entity/UserLike.java rename to src/main/java/com/ai/da/mapper/primary/entity/UserLike.java index c35ed12f..61a4deee 100644 --- a/src/main/java/com/ai/da/mapper/entity/UserLike.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/UserLike.java @@ -1,62 +1,62 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - * UserLikeGroup - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_user_like") -public class UserLike implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - /** - * 关联的用户收藏分组 ID - */ - private Long userLikeGroupId; - /** - * 关联的design ID - */ - private Long designId; - /** - * 关联的design_item ID - */ - private Long designItemId; - /** - * 关联的design_python_outfit ID - */ - private Long designOutfitId; - /** - * 图片地址 - */ - private String url; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; -} +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * UserLikeGroup + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_user_like") +public class UserLike implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 关联的用户收藏分组 ID + */ + private Long userLikeGroupId; + /** + * 关联的design ID + */ + private Long designId; + /** + * 关联的design_item ID + */ + private Long designItemId; + /** + * 关联的design_python_outfit ID + */ + private Long designOutfitId; + /** + * 图片地址 + */ + private String url; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/UserLikeGroup.java b/src/main/java/com/ai/da/mapper/primary/entity/UserLikeGroup.java similarity index 92% rename from src/main/java/com/ai/da/mapper/entity/UserLikeGroup.java rename to src/main/java/com/ai/da/mapper/primary/entity/UserLikeGroup.java index 496cf9ab..2aa8cc0e 100644 --- a/src/main/java/com/ai/da/mapper/entity/UserLikeGroup.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/UserLikeGroup.java @@ -1,55 +1,55 @@ -package com.ai.da.mapper.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - * UserLikeGroup - * - * @author easy-generator - * @since 2022-06-13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("t_user_like_group") -public class UserLikeGroup implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * ID - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - /** - * 用户ID - */ - private Long accountId; - /** - * collectionId - */ - private Long collectionId; - - /** - * 用户收藏分组表 - */ - private String name; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新时间 - */ - private Date updateDate; -} +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * UserLikeGroup + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_user_like_group") +public class UserLikeGroup implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 用户ID + */ + private Long accountId; + /** + * collectionId + */ + private Long collectionId; + + /** + * 用户收藏分组表 + */ + private String name; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/entity/Workspace.java b/src/main/java/com/ai/da/mapper/primary/entity/Workspace.java similarity index 92% rename from src/main/java/com/ai/da/mapper/entity/Workspace.java rename to src/main/java/com/ai/da/mapper/primary/entity/Workspace.java index 16e520a1..5fcc49cc 100644 --- a/src/main/java/com/ai/da/mapper/entity/Workspace.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Workspace.java @@ -1,17 +1,14 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.*; import java.time.LocalDateTime; import java.io.Serializable; -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import org.springframework.format.annotation.DateTimeFormat; /** * 实体类 diff --git a/src/main/java/com/ai/da/mapper/secondary/FemaleDressMapper.java b/src/main/java/com/ai/da/mapper/secondary/FemaleDressMapper.java new file mode 100644 index 00000000..4f63c7a7 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/secondary/FemaleDressMapper.java @@ -0,0 +1,16 @@ +package com.ai.da.mapper.secondary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.secondary.entity.FemaleDress; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface FemaleDressMapper extends CommonMapper { + + + +} diff --git a/src/main/java/com/ai/da/mapper/secondary/entity/FemaleDress.java b/src/main/java/com/ai/da/mapper/secondary/entity/FemaleDress.java new file mode 100644 index 00000000..7c64bd9f --- /dev/null +++ b/src/main/java/com/ai/da/mapper/secondary/entity/FemaleDress.java @@ -0,0 +1,25 @@ +package com.ai.da.mapper.secondary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("female_dress") +public class FemaleDress implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + private String imgName; +} \ No newline at end of file diff --git a/src/main/java/com/ai/da/model/dto/AccountTrialDTO.java b/src/main/java/com/ai/da/model/dto/AccountTrialDTO.java index 49d59692..700426a2 100644 --- a/src/main/java/com/ai/da/model/dto/AccountTrialDTO.java +++ b/src/main/java/com/ai/da/model/dto/AccountTrialDTO.java @@ -1,8 +1,7 @@ package com.ai.da.model.dto; -import com.ai.da.mapper.entity.TrialOrder; +import com.ai.da.mapper.primary.entity.TrialOrder; import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/ai/da/model/dto/ClassificationDTO.java b/src/main/java/com/ai/da/model/dto/ClassificationDTO.java index 22abc61d..8a24260c 100644 --- a/src/main/java/com/ai/da/model/dto/ClassificationDTO.java +++ b/src/main/java/com/ai/da/model/dto/ClassificationDTO.java @@ -1,6 +1,6 @@ package com.ai.da.model.dto; -import com.ai.da.mapper.entity.Classification; +import com.ai.da.mapper.primary.entity.Classification; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/ai/da/model/dto/WorkspaceDTO.java b/src/main/java/com/ai/da/model/dto/WorkspaceDTO.java index 68c33673..4ffe191c 100644 --- a/src/main/java/com/ai/da/model/dto/WorkspaceDTO.java +++ b/src/main/java/com/ai/da/model/dto/WorkspaceDTO.java @@ -1,7 +1,6 @@ package com.ai.da.model.dto; -import com.ai.da.mapper.entity.Workspace; import com.ai.da.model.vo.PageQueryBaseVo; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/ai/da/model/vo/ChatRobotVO.java b/src/main/java/com/ai/da/model/vo/ChatRobotVO.java index 9ef86aa7..05b2ee43 100644 --- a/src/main/java/com/ai/da/model/vo/ChatRobotVO.java +++ b/src/main/java/com/ai/da/model/vo/ChatRobotVO.java @@ -1,6 +1,6 @@ package com.ai.da.model.vo; -import com.ai.da.mapper.entity.ChatRobot; +import com.ai.da.mapper.primary.entity.ChatRobot; import lombok.Data; import java.util.List; diff --git a/src/main/java/com/ai/da/model/vo/ClassificationVO.java b/src/main/java/com/ai/da/model/vo/ClassificationVO.java index 88506041..1bb7062a 100644 --- a/src/main/java/com/ai/da/model/vo/ClassificationVO.java +++ b/src/main/java/com/ai/da/model/vo/ClassificationVO.java @@ -1,6 +1,6 @@ package com.ai.da.model.vo; -import com.ai.da.mapper.entity.Classification; +import com.ai.da.mapper.primary.entity.Classification; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitDetailVO.java b/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitDetailVO.java index 028e7ba8..72c28642 100644 --- a/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitDetailVO.java +++ b/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitDetailVO.java @@ -1,7 +1,7 @@ package com.ai.da.model.vo; -import com.ai.da.mapper.entity.TDesignPythonOutfitDetail; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfitDetail; import lombok.Data; import lombok.EqualsAndHashCode; import io.swagger.annotations.ApiModel; diff --git a/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitVO.java b/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitVO.java index 8afb8629..065d963b 100644 --- a/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitVO.java +++ b/src/main/java/com/ai/da/model/vo/TDesignPythonOutfitVO.java @@ -2,7 +2,7 @@ package com.ai.da.model.vo; -import com.ai.da.mapper.entity.TDesignPythonOutfit; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfit; import lombok.Data; import lombok.EqualsAndHashCode; import io.swagger.annotations.ApiModel; diff --git a/src/main/java/com/ai/da/model/vo/ValidateElementVO.java b/src/main/java/com/ai/da/model/vo/ValidateElementVO.java index cceef691..563c4ab1 100644 --- a/src/main/java/com/ai/da/model/vo/ValidateElementVO.java +++ b/src/main/java/com/ai/da/model/vo/ValidateElementVO.java @@ -1,6 +1,6 @@ package com.ai.da.model.vo; -import com.ai.da.mapper.entity.CollectionElement; +import com.ai.da.mapper.primary.entity.CollectionElement; import com.ai.da.model.dto.CollectionColorDTO; import com.ai.da.python.vo.DesignPythonItemPrint; import com.google.common.collect.Lists; diff --git a/src/main/java/com/ai/da/model/vo/WorkspaceVO.java b/src/main/java/com/ai/da/model/vo/WorkspaceVO.java index 209563f2..378014d9 100644 --- a/src/main/java/com/ai/da/model/vo/WorkspaceVO.java +++ b/src/main/java/com/ai/da/model/vo/WorkspaceVO.java @@ -2,12 +2,8 @@ package com.ai.da.model.vo; import com.ai.da.common.response.PageBaseResponse; -import com.ai.da.mapper.entity.Workspace; +import com.ai.da.mapper.primary.entity.Workspace; import com.ai.da.model.enums.BizJson; -import com.ai.da.model.enums.FemalePosition; -import com.ai.da.model.enums.Position; -import com.ai.da.model.enums.Sex; -import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; import io.swagger.annotations.ApiModel; diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 578de9ef..afe992a4 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -6,8 +6,8 @@ import com.ai.da.common.config.FileProperties; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.enums.*; import com.ai.da.common.utils.*; -import com.ai.da.mapper.entity.CollectionElement; -import com.ai.da.mapper.entity.DesignHistory; +import com.ai.da.mapper.primary.entity.CollectionElement; +import com.ai.da.mapper.primary.entity.DesignHistory; import com.ai.da.model.dto.*; import com.ai.da.model.enums.MalePosition; import com.ai.da.model.enums.Sex; @@ -23,7 +23,6 @@ import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import io.netty.util.internal.StringUtil; import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.springframework.beans.factory.annotation.Value; diff --git a/src/main/java/com/ai/da/python/vo/DesignPythonObjects.java b/src/main/java/com/ai/da/python/vo/DesignPythonObjects.java index 22563da6..af5fa3be 100644 --- a/src/main/java/com/ai/da/python/vo/DesignPythonObjects.java +++ b/src/main/java/com/ai/da/python/vo/DesignPythonObjects.java @@ -1,6 +1,6 @@ package com.ai.da.python.vo; -import com.ai.da.mapper.entity.Library; +import com.ai.da.mapper.primary.entity.Library; import lombok.Data; import java.util.List; diff --git a/src/main/java/com/ai/da/service/AccountLoginLogService.java b/src/main/java/com/ai/da/service/AccountLoginLogService.java index 773f49a5..575f5e69 100644 --- a/src/main/java/com/ai/da/service/AccountLoginLogService.java +++ b/src/main/java/com/ai/da/service/AccountLoginLogService.java @@ -1,8 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.AccountLoginLog; -import com.ai.da.model.dto.EmailSendDTO; -import com.ai.da.model.dto.NoteSendDTO; +import com.ai.da.mapper.primary.entity.AccountLoginLog; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java index 86293174..8df6b601 100644 --- a/src/main/java/com/ai/da/service/AccountService.java +++ b/src/main/java/com/ai/da/service/AccountService.java @@ -1,17 +1,15 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.Account; -import com.ai.da.mapper.entity.TrialOrder; +import com.ai.da.mapper.primary.entity.Account; +import com.ai.da.mapper.primary.entity.TrialOrder; +import com.ai.da.mapper.secondary.entity.FemaleDress; import com.ai.da.model.dto.*; -import com.ai.da.model.enums.Language; import com.ai.da.model.vo.AccountLoginVO; import com.ai.da.model.vo.AccountPreLoginVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; -import org.springframework.web.bind.annotation.RequestBody; import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; import java.util.List; /** @@ -127,4 +125,6 @@ public interface AccountService extends IService { String addNoLoginRequiredNew(NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request); Boolean deleteNoLoginRequiredNew(NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request); + + FemaleDress test(); } diff --git a/src/main/java/com/ai/da/service/ChatRobotService.java b/src/main/java/com/ai/da/service/ChatRobotService.java index a48efc00..1deaa19d 100644 --- a/src/main/java/com/ai/da/service/ChatRobotService.java +++ b/src/main/java/com/ai/da/service/ChatRobotService.java @@ -1,12 +1,10 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.Library; +import com.ai.da.mapper.primary.entity.Library; import com.ai.da.model.dto.ChatFlushDTO; import com.ai.da.model.dto.ChatRobotLibraryDTO; import com.ai.da.model.dto.ChatSendDTO; -import com.ai.da.model.vo.ChatRobotLibraryVO; import com.ai.da.model.vo.ChatRobotVO; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.math.BigDecimal; diff --git a/src/main/java/com/ai/da/service/ClassificationService.java b/src/main/java/com/ai/da/service/ClassificationService.java index 2cdbe5de..c68db66b 100644 --- a/src/main/java/com/ai/da/service/ClassificationService.java +++ b/src/main/java/com/ai/da/service/ClassificationService.java @@ -1,15 +1,9 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.Classification; -import com.ai.da.mapper.entity.Library; -import com.ai.da.model.dto.ChatFlushDTO; -import com.ai.da.model.dto.ChatRobotLibraryDTO; -import com.ai.da.model.dto.ChatSendDTO; +import com.ai.da.mapper.primary.entity.Classification; import com.ai.da.model.dto.ClassificationDTO; -import com.ai.da.model.vo.ChatRobotVO; import com.ai.da.model.vo.ClassificationVO; -import java.math.BigDecimal; import java.util.List; /** diff --git a/src/main/java/com/ai/da/service/CollectionElementService.java b/src/main/java/com/ai/da/service/CollectionElementService.java index a32b3b75..489e08f8 100644 --- a/src/main/java/com/ai/da/service/CollectionElementService.java +++ b/src/main/java/com/ai/da/service/CollectionElementService.java @@ -1,7 +1,7 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.CollectionElement; -import com.ai.da.mapper.entity.LibraryModelPoint; +import com.ai.da.mapper.primary.entity.CollectionElement; +import com.ai.da.mapper.primary.entity.LibraryModelPoint; import com.ai.da.model.dto.*; import com.ai.da.model.vo.*; import com.baomidou.mybatisplus.extension.service.IService; diff --git a/src/main/java/com/ai/da/service/CollectionService.java b/src/main/java/com/ai/da/service/CollectionService.java index 5efe520d..919ebf4f 100644 --- a/src/main/java/com/ai/da/service/CollectionService.java +++ b/src/main/java/com/ai/da/service/CollectionService.java @@ -1,17 +1,9 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.Collection; -import com.ai.da.mapper.entity.CollectionElement; -import com.ai.da.model.dto.CollectionElementUploadDTO; -import com.ai.da.model.dto.CollectionGeneratePrintDTO; -import com.ai.da.model.dto.CollectionSavePrintDTO; -import com.ai.da.model.vo.CollectionElementVO; -import com.ai.da.model.vo.CollectionGeneratePrintVO; +import com.ai.da.mapper.primary.entity.Collection; import com.ai.da.model.vo.UserLikeCollectionVO; import com.baomidou.mybatisplus.extension.service.IService; -import java.util.List; - /** * 服务类 * diff --git a/src/main/java/com/ai/da/service/ColorLoopUpTableService.java b/src/main/java/com/ai/da/service/ColorLoopUpTableService.java index 3d9721f4..833b93ed 100644 --- a/src/main/java/com/ai/da/service/ColorLoopUpTableService.java +++ b/src/main/java/com/ai/da/service/ColorLoopUpTableService.java @@ -1,7 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.ColorLookupTable; -import com.ai.da.mapper.entity.PanTone; +import com.ai.da.mapper.primary.entity.ColorLookupTable; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; diff --git a/src/main/java/com/ai/da/service/DesignHistoryService.java b/src/main/java/com/ai/da/service/DesignHistoryService.java index 249bc2c2..80235cf3 100644 --- a/src/main/java/com/ai/da/service/DesignHistoryService.java +++ b/src/main/java/com/ai/da/service/DesignHistoryService.java @@ -1,7 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.DesignHistory; -import com.ai.da.mapper.entity.Library; +import com.ai.da.mapper.primary.entity.DesignHistory; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; diff --git a/src/main/java/com/ai/da/service/DesignItemDetailPrintService.java b/src/main/java/com/ai/da/service/DesignItemDetailPrintService.java index a8a33cc4..9e8b0b3d 100644 --- a/src/main/java/com/ai/da/service/DesignItemDetailPrintService.java +++ b/src/main/java/com/ai/da/service/DesignItemDetailPrintService.java @@ -1,6 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.DesignItemDetailPrint; +import com.ai.da.mapper.primary.entity.DesignItemDetailPrint; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; diff --git a/src/main/java/com/ai/da/service/DesignItemDetailService.java b/src/main/java/com/ai/da/service/DesignItemDetailService.java index 1f5663b5..77836af0 100644 --- a/src/main/java/com/ai/da/service/DesignItemDetailService.java +++ b/src/main/java/com/ai/da/service/DesignItemDetailService.java @@ -1,8 +1,7 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.DesignItemDetail; +import com.ai.da.mapper.primary.entity.DesignItemDetail; import com.baomidou.mybatisplus.extension.service.IService; -import sun.security.krb5.internal.crypto.Des; import java.util.List; diff --git a/src/main/java/com/ai/da/service/DesignItemService.java b/src/main/java/com/ai/da/service/DesignItemService.java index 26163bf1..26e87015 100644 --- a/src/main/java/com/ai/da/service/DesignItemService.java +++ b/src/main/java/com/ai/da/service/DesignItemService.java @@ -1,6 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.DesignItem; +import com.ai.da.mapper.primary.entity.DesignItem; import com.ai.da.model.dto.DesignSingleDTO; import com.ai.da.model.dto.DesignSingleIncludeLayersDTO; import com.ai.da.model.vo.*; diff --git a/src/main/java/com/ai/da/service/DesignService.java b/src/main/java/com/ai/da/service/DesignService.java index bbca6f7f..839ce443 100644 --- a/src/main/java/com/ai/da/service/DesignService.java +++ b/src/main/java/com/ai/da/service/DesignService.java @@ -1,13 +1,12 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.Design; +import com.ai.da.mapper.primary.entity.Design; import com.ai.da.model.dto.*; import com.ai.da.model.vo.CollectionSketchVO; import com.ai.da.model.vo.DesignCollectionVO; import com.ai.da.model.vo.DesignItemDetailVO; import com.ai.da.model.vo.DesignLikeVO; import com.ai.da.python.vo.DesignPythonObjects; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.service.IService; import java.math.BigDecimal; diff --git a/src/main/java/com/ai/da/service/GenerateService.java b/src/main/java/com/ai/da/service/GenerateService.java index 0d92a07f..762ffbe9 100644 --- a/src/main/java/com/ai/da/service/GenerateService.java +++ b/src/main/java/com/ai/da/service/GenerateService.java @@ -1,7 +1,7 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.Generate; -import com.ai.da.mapper.entity.GenerateDetail; +import com.ai.da.mapper.primary.entity.Generate; +import com.ai.da.mapper.primary.entity.GenerateDetail; import com.ai.da.model.dto.GenerateLikeDTO; import com.ai.da.model.dto.GenerateThroughImageTextDTO; import com.ai.da.model.vo.GenerateCaptionVO; diff --git a/src/main/java/com/ai/da/service/ITDesignPythonOutfitDetailService.java b/src/main/java/com/ai/da/service/ITDesignPythonOutfitDetailService.java index e5296840..c11bb759 100644 --- a/src/main/java/com/ai/da/service/ITDesignPythonOutfitDetailService.java +++ b/src/main/java/com/ai/da/service/ITDesignPythonOutfitDetailService.java @@ -1,7 +1,7 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.TDesignPythonOutfitDetail; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfitDetail; import com.ai.da.model.vo.DesignPythonOutfitVO; import com.ai.da.model.vo.TDesignPythonOutfitDetailVO; import com.baomidou.mybatisplus.core.metadata.IPage; diff --git a/src/main/java/com/ai/da/service/ITDesignPythonOutfitService.java b/src/main/java/com/ai/da/service/ITDesignPythonOutfitService.java index ab98f0ab..a6b5b749 100644 --- a/src/main/java/com/ai/da/service/ITDesignPythonOutfitService.java +++ b/src/main/java/com/ai/da/service/ITDesignPythonOutfitService.java @@ -1,6 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.TDesignPythonOutfit; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfit; import com.ai.da.model.vo.TDesignPythonOutfitVO; import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.core.metadata.IPage; diff --git a/src/main/java/com/ai/da/service/LibraryModelPointService.java b/src/main/java/com/ai/da/service/LibraryModelPointService.java index 24dc3331..adeb61d5 100644 --- a/src/main/java/com/ai/da/service/LibraryModelPointService.java +++ b/src/main/java/com/ai/da/service/LibraryModelPointService.java @@ -1,13 +1,10 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.LibraryModelPoint; -import com.ai.da.model.dto.DesignSingleDTO; +import com.ai.da.mapper.primary.entity.LibraryModelPoint; import com.ai.da.model.dto.LibraryModelPointDTO; import com.ai.da.model.dto.ModelsDotDTO; import com.ai.da.model.vo.LibraryModelPointVO; -import com.ai.da.model.vo.LibraryUpdateVo; import com.baomidou.mybatisplus.extension.service.IService; -import org.springframework.web.bind.annotation.RequestBody; import java.util.List; diff --git a/src/main/java/com/ai/da/service/LibraryService.java b/src/main/java/com/ai/da/service/LibraryService.java index 7ae5fc4a..440a9577 100644 --- a/src/main/java/com/ai/da/service/LibraryService.java +++ b/src/main/java/com/ai/da/service/LibraryService.java @@ -1,17 +1,13 @@ package com.ai.da.service; import com.ai.da.common.response.PageBaseResponse; -import com.ai.da.mapper.entity.Library; -import com.ai.da.mapper.entity.UserLike; +import com.ai.da.mapper.primary.entity.Library; import com.ai.da.model.dto.*; -import com.ai.da.model.vo.CollectionElementVO; import com.ai.da.model.vo.LibraryUpdateVo; import com.ai.da.model.vo.LibraryVo; import com.ai.da.model.vo.QueryLibraryPageVO; import com.baomidou.mybatisplus.extension.service.IService; -import org.springframework.web.bind.annotation.RequestBody; -import javax.validation.Valid; import java.util.List; /** diff --git a/src/main/java/com/ai/da/service/PanToneService.java b/src/main/java/com/ai/da/service/PanToneService.java index 77effded..344ff885 100644 --- a/src/main/java/com/ai/da/service/PanToneService.java +++ b/src/main/java/com/ai/da/service/PanToneService.java @@ -1,6 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.PanTone; +import com.ai.da.mapper.primary.entity.PanTone; import com.ai.da.model.dto.GetRgbByHsvBatchDTO; import com.ai.da.model.vo.PantoneVO; import com.baomidou.mybatisplus.extension.service.IService; diff --git a/src/main/java/com/ai/da/service/PythonTAllInfoService.java b/src/main/java/com/ai/da/service/PythonTAllInfoService.java index 904aed88..8fd59225 100644 --- a/src/main/java/com/ai/da/service/PythonTAllInfoService.java +++ b/src/main/java/com/ai/da/service/PythonTAllInfoService.java @@ -1,7 +1,7 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.PythonTAllInfo; +import com.ai.da.mapper.primary.entity.PythonTAllInfo; import com.baomidou.mybatisplus.extension.service.IService; /** diff --git a/src/main/java/com/ai/da/service/SysFileService.java b/src/main/java/com/ai/da/service/SysFileService.java index 0cef4818..d7d1a454 100644 --- a/src/main/java/com/ai/da/service/SysFileService.java +++ b/src/main/java/com/ai/da/service/SysFileService.java @@ -1,6 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.SysFile; +import com.ai.da.mapper.primary.entity.SysFile; import com.ai.da.model.vo.SysFileVO; import com.baomidou.mybatisplus.extension.service.IService; diff --git a/src/main/java/com/ai/da/service/TCollectionElementRelationService.java b/src/main/java/com/ai/da/service/TCollectionElementRelationService.java index 860618ab..20bead1e 100644 --- a/src/main/java/com/ai/da/service/TCollectionElementRelationService.java +++ b/src/main/java/com/ai/da/service/TCollectionElementRelationService.java @@ -1,6 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.TCollectionElementRelation; +import com.ai.da.mapper.primary.entity.TCollectionElementRelation; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; diff --git a/src/main/java/com/ai/da/service/UserLikeGroupService.java b/src/main/java/com/ai/da/service/UserLikeGroupService.java index 5ec308fd..dd4d7c86 100644 --- a/src/main/java/com/ai/da/service/UserLikeGroupService.java +++ b/src/main/java/com/ai/da/service/UserLikeGroupService.java @@ -1,14 +1,9 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.UserLikeGroup; +import com.ai.da.mapper.primary.entity.UserLikeGroup; import com.ai.da.model.vo.HistoryUpdateVO; import com.ai.da.model.vo.UserLikeChooseVO; -import com.ai.da.model.vo.UserLikeGroupVO; import com.baomidou.mybatisplus.extension.service.IService; -import io.swagger.annotations.ApiParam; -import org.springframework.web.bind.annotation.RequestParam; - -import java.util.List; /** * 服务类 diff --git a/src/main/java/com/ai/da/service/UserLikeService.java b/src/main/java/com/ai/da/service/UserLikeService.java index 6bb3bc01..510d1e0c 100644 --- a/src/main/java/com/ai/da/service/UserLikeService.java +++ b/src/main/java/com/ai/da/service/UserLikeService.java @@ -1,6 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.UserLike; +import com.ai.da.mapper.primary.entity.UserLike; import com.ai.da.model.vo.UserLikeVO; import com.baomidou.mybatisplus.extension.service.IService; diff --git a/src/main/java/com/ai/da/service/WorkspaceService.java b/src/main/java/com/ai/da/service/WorkspaceService.java index 324ceeed..17a66f29 100644 --- a/src/main/java/com/ai/da/service/WorkspaceService.java +++ b/src/main/java/com/ai/da/service/WorkspaceService.java @@ -1,7 +1,7 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.Workspace; +import com.ai.da.mapper.primary.entity.Workspace; import com.ai.da.model.dto.WorkspaceDTO; import com.ai.da.model.enums.BizJson; import com.ai.da.model.vo.ModelsVO; @@ -9,7 +9,6 @@ import com.ai.da.model.vo.WorkspaceVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; -import javax.servlet.http.HttpServletRequest; import java.io.FileNotFoundException; import java.util.List; diff --git a/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java index f7b80773..e5c24f73 100644 --- a/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountLoginLogServiceImpl.java @@ -1,7 +1,7 @@ package com.ai.da.service.impl; -import com.ai.da.mapper.AccountLoginLogMapper; -import com.ai.da.mapper.entity.AccountLoginLog; +import com.ai.da.mapper.primary.AccountLoginLogMapper; +import com.ai.da.mapper.primary.entity.AccountLoginLog; import com.ai.da.service.AccountLoginLogService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; diff --git a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java index 97ad6bc6..446186c6 100644 --- a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java @@ -8,13 +8,13 @@ import com.ai.da.common.enums.AuthenticationOperationTypeEnum; import com.ai.da.common.response.ResultEnum; import com.ai.da.common.security.jwt.JWTTokenHelper; import com.ai.da.common.utils.*; -import com.ai.da.mapper.AccountMapper; -import com.ai.da.mapper.LibraryMapper; -import com.ai.da.mapper.TrialOrderMapper; -import com.ai.da.mapper.UserLikeGroupMapper; -import com.ai.da.mapper.entity.Account; -import com.ai.da.mapper.entity.AccountLoginLog; -import com.ai.da.mapper.entity.TrialOrder; +import com.ai.da.mapper.primary.AccountMapper; +import com.ai.da.mapper.primary.TrialOrderMapper; +import com.ai.da.mapper.primary.entity.Account; +import com.ai.da.mapper.primary.entity.AccountLoginLog; +import com.ai.da.mapper.primary.entity.TrialOrder; +import com.ai.da.mapper.secondary.FemaleDressMapper; +import com.ai.da.mapper.secondary.entity.FemaleDress; import com.ai.da.model.dto.*; import com.ai.da.model.enums.AutoApproved; import com.ai.da.model.enums.Language; @@ -32,7 +32,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.checkerframework.checker.units.qual.A; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; @@ -834,4 +834,11 @@ public class AccountServiceImpl extends ServiceImpl impl } return Boolean.TRUE; } + + @Resource + private FemaleDressMapper femaleDressMapper; + @Override + public FemaleDress test() { + return femaleDressMapper.selectById(33056); + } } diff --git a/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java index 5f06a194..fb56d871 100644 --- a/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java @@ -9,10 +9,10 @@ import com.ai.da.common.enums.LibraryLevel1TypeEnum; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.MD5Utils; import com.ai.da.common.utils.MinioUtil; -import com.ai.da.mapper.LibraryMapper; -import com.ai.da.mapper.entity.ChatRobot; -import com.ai.da.mapper.ChatRobotMapper; -import com.ai.da.mapper.entity.Library; +import com.ai.da.mapper.primary.LibraryMapper; +import com.ai.da.mapper.primary.entity.ChatRobot; +import com.ai.da.mapper.primary.ChatRobotMapper; +import com.ai.da.mapper.primary.entity.Library; import com.ai.da.model.dto.ChatFlushDTO; import com.ai.da.model.dto.ChatRobotLibraryDTO; import com.ai.da.model.dto.ChatSendDTO; diff --git a/src/main/java/com/ai/da/service/impl/ClassificationServiceImpl.java b/src/main/java/com/ai/da/service/impl/ClassificationServiceImpl.java index 089052d1..1cd31f03 100644 --- a/src/main/java/com/ai/da/service/impl/ClassificationServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/ClassificationServiceImpl.java @@ -8,10 +8,10 @@ import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.context.UserContext; import com.ai.da.common.response.ResultEnum; import com.ai.da.common.utils.CopyUtil; -import com.ai.da.mapper.ClassificationMapper; -import com.ai.da.mapper.ClassificationRelLibraryMapper; -import com.ai.da.mapper.entity.Classification; -import com.ai.da.mapper.entity.ClassificationRelLibrary; +import com.ai.da.mapper.primary.ClassificationMapper; +import com.ai.da.mapper.primary.ClassificationRelLibraryMapper; +import com.ai.da.mapper.primary.entity.Classification; +import com.ai.da.mapper.primary.entity.ClassificationRelLibrary; import com.ai.da.model.dto.ClassificationDTO; import com.ai.da.model.vo.AuthPrincipalVo; import com.ai.da.model.vo.ClassificationVO; diff --git a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java index 1c6307d9..5b9d3710 100644 --- a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java @@ -7,9 +7,9 @@ import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.*; import com.ai.da.common.response.ResultEnum; import com.ai.da.common.utils.*; -import com.ai.da.mapper.CollectionElementMapper; -import com.ai.da.mapper.GenerateDetailMapper; -import com.ai.da.mapper.entity.*; +import com.ai.da.mapper.primary.CollectionElementMapper; +import com.ai.da.mapper.primary.GenerateDetailMapper; +import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.*; import com.ai.da.model.enums.ModelType; import com.ai.da.model.enums.Sex; diff --git a/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java b/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java index 5a20b7de..6b911d49 100644 --- a/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CollectionServiceImpl.java @@ -6,9 +6,9 @@ import com.ai.da.common.enums.DesignTypeEnum; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.DateUtil; import com.ai.da.common.utils.MinioUtil; -import com.ai.da.mapper.CollectionMapper; -import com.ai.da.mapper.entity.Collection; -import com.ai.da.mapper.entity.CollectionElement; +import com.ai.da.mapper.primary.CollectionMapper; +import com.ai.da.mapper.primary.entity.Collection; +import com.ai.da.mapper.primary.entity.CollectionElement; import com.ai.da.model.vo.CollectionColorVO; import com.ai.da.model.vo.CollectionElementVO; import com.ai.da.model.vo.UserLikeCollectionVO; diff --git a/src/main/java/com/ai/da/service/impl/ColorLoopUpTableServiceImpl.java b/src/main/java/com/ai/da/service/impl/ColorLoopUpTableServiceImpl.java index 74aa581d..171f5c08 100644 --- a/src/main/java/com/ai/da/service/impl/ColorLoopUpTableServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/ColorLoopUpTableServiceImpl.java @@ -1,7 +1,7 @@ package com.ai.da.service.impl; -import com.ai.da.mapper.ColorLoopUpTableMapper; -import com.ai.da.mapper.entity.ColorLookupTable; +import com.ai.da.mapper.primary.ColorLoopUpTableMapper; +import com.ai.da.mapper.primary.entity.ColorLookupTable; import com.ai.da.service.ColorLoopUpTableService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; diff --git a/src/main/java/com/ai/da/service/impl/DesignHistoryServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignHistoryServiceImpl.java index 8532c905..8937556f 100644 --- a/src/main/java/com/ai/da/service/impl/DesignHistoryServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignHistoryServiceImpl.java @@ -1,7 +1,7 @@ package com.ai.da.service.impl; -import com.ai.da.mapper.DesignHistoryMapper; -import com.ai.da.mapper.entity.DesignHistory; +import com.ai.da.mapper.primary.DesignHistoryMapper; +import com.ai.da.mapper.primary.entity.DesignHistory; import com.ai.da.service.DesignHistoryService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; diff --git a/src/main/java/com/ai/da/service/impl/DesignItemDetailPrintServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemDetailPrintServiceImpl.java index 189bca2e..1489c11a 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemDetailPrintServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemDetailPrintServiceImpl.java @@ -1,8 +1,7 @@ package com.ai.da.service.impl; -import com.ai.da.mapper.DesignItemDetailPrintMapper; -import com.ai.da.mapper.entity.DesignItemDetailPrint; -import com.ai.da.mapper.entity.TDesignPythonOutfitDetail; +import com.ai.da.mapper.primary.DesignItemDetailPrintMapper; +import com.ai.da.mapper.primary.entity.DesignItemDetailPrint; import com.ai.da.service.DesignItemDetailPrintService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; diff --git a/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java index 30ff7c1b..e35c0ea3 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemDetailServiceImpl.java @@ -2,8 +2,8 @@ package com.ai.da.service.impl; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.enums.LayersPriorityEnum; -import com.ai.da.mapper.DesignItemDetailMapper; -import com.ai.da.mapper.entity.DesignItemDetail; +import com.ai.da.mapper.primary.DesignItemDetailMapper; +import com.ai.da.mapper.primary.entity.DesignItemDetail; import com.ai.da.service.DesignItemDetailService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; diff --git a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java index 7b8853ca..64bc25d4 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java @@ -9,8 +9,8 @@ import com.ai.da.common.enums.SysFileLevel2TypeEnum; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.DateUtil; import com.ai.da.common.utils.MinioUtil; -import com.ai.da.mapper.DesignItemMapper; -import com.ai.da.mapper.entity.*; +import com.ai.da.mapper.primary.DesignItemMapper; +import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.*; import com.ai.da.model.enums.ModelType; import com.ai.da.model.vo.*; diff --git a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java index d24874c2..783b2038 100644 --- a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java @@ -7,11 +7,11 @@ import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.*; import com.ai.da.common.utils.*; -import com.ai.da.mapper.DesignMapper; -import com.ai.da.mapper.GenerateDetailMapper; -import com.ai.da.mapper.TDesignPythonOutfitMapper; -import com.ai.da.mapper.entity.*; -import com.ai.da.mapper.entity.Collection; +import com.ai.da.mapper.primary.DesignMapper; +import com.ai.da.mapper.primary.GenerateDetailMapper; +import com.ai.da.mapper.primary.TDesignPythonOutfitMapper; +import com.ai.da.mapper.primary.entity.*; +import com.ai.da.mapper.primary.entity.Collection; import com.ai.da.model.dto.*; import com.ai.da.model.vo.*; import com.ai.da.python.PythonService; @@ -43,7 +43,6 @@ import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import static com.ai.da.common.enums.LayersPriorityEnum.BODY; import static com.ai.da.python.vo.DesignPythonItem.*; /** diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index 1b10420f..05f59ef2 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -7,10 +7,10 @@ import com.ai.da.common.enums.ModelNameEnum; import com.ai.da.common.utils.DateUtil; import com.ai.da.common.utils.MD5Utils; import com.ai.da.common.utils.MinioUtil; -import com.ai.da.mapper.CollectionElementMapper; -import com.ai.da.mapper.GenerateDetailMapper; -import com.ai.da.mapper.GenerateMapper; -import com.ai.da.mapper.entity.*; +import com.ai.da.mapper.primary.CollectionElementMapper; +import com.ai.da.mapper.primary.GenerateDetailMapper; +import com.ai.da.mapper.primary.GenerateMapper; +import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.GenerateLikeDTO; import com.ai.da.model.dto.GenerateThroughImageTextDTO; import com.ai.da.model.vo.*; diff --git a/src/main/java/com/ai/da/service/impl/LibraryModelPointServiceImpl.java b/src/main/java/com/ai/da/service/impl/LibraryModelPointServiceImpl.java index f8a33ca1..2f643368 100644 --- a/src/main/java/com/ai/da/service/impl/LibraryModelPointServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/LibraryModelPointServiceImpl.java @@ -5,8 +5,8 @@ import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.enums.SingleOverallEnum; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.DateUtil; -import com.ai.da.mapper.LibraryModelPointMapper; -import com.ai.da.mapper.entity.*; +import com.ai.da.mapper.primary.LibraryModelPointMapper; +import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.LibraryModelPointDTO; import com.ai.da.model.dto.ModelsDotDTO; import com.ai.da.model.enums.ModelType; @@ -22,7 +22,6 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; -import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; diff --git a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java index bde22e96..dbe6bd31 100644 --- a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java @@ -11,9 +11,9 @@ import com.ai.da.common.response.ResultEnum; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.DateUtil; import com.ai.da.common.utils.MinioUtil; -import com.ai.da.mapper.LibraryMapper; -import com.ai.da.mapper.SysFileMapper; -import com.ai.da.mapper.entity.*; +import com.ai.da.mapper.primary.LibraryMapper; +import com.ai.da.mapper.primary.SysFileMapper; +import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.*; import com.ai.da.model.enums.*; import com.ai.da.model.vo.*; diff --git a/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java b/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java index 04b02eef..83c3c3f9 100644 --- a/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PanToneServiceImpl.java @@ -5,9 +5,9 @@ import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.response.ResultEnum; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.PantoneUtils; -import com.ai.da.mapper.entity.ColorLookupTable; -import com.ai.da.mapper.entity.PanTone; -import com.ai.da.mapper.PanToneMapper; +import com.ai.da.mapper.primary.entity.ColorLookupTable; +import com.ai.da.mapper.primary.entity.PanTone; +import com.ai.da.mapper.primary.PanToneMapper; import com.ai.da.model.dto.GetRgbByHsvBatchDTO; import com.ai.da.model.vo.PantoneVO; import com.ai.da.service.ColorLoopUpTableService; @@ -17,7 +17,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import io.netty.util.internal.StringUtil; -import org.checkerframework.checker.units.qual.A; import org.springframework.stereotype.Service; import javax.annotation.Resource; diff --git a/src/main/java/com/ai/da/service/impl/PythonTAllInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/PythonTAllInfoServiceImpl.java index 9364ecb1..03d003c3 100644 --- a/src/main/java/com/ai/da/service/impl/PythonTAllInfoServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PythonTAllInfoServiceImpl.java @@ -2,8 +2,8 @@ package com.ai.da.service.impl; import com.ai.da.common.config.exception.BusinessException; -import com.ai.da.mapper.PythonTAllInfoMapper; -import com.ai.da.mapper.entity.PythonTAllInfo; +import com.ai.da.mapper.primary.PythonTAllInfoMapper; +import com.ai.da.mapper.primary.entity.PythonTAllInfo; import com.ai.da.service.PythonTAllInfoService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; diff --git a/src/main/java/com/ai/da/service/impl/SysFileServiceImpl.java b/src/main/java/com/ai/da/service/impl/SysFileServiceImpl.java index ea2a0de3..2872409f 100644 --- a/src/main/java/com/ai/da/service/impl/SysFileServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/SysFileServiceImpl.java @@ -6,8 +6,8 @@ import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.enums.SysFileLevel1TypeEnum; import com.ai.da.common.enums.SysFileLevel2TypeEnum; import com.ai.da.common.utils.*; -import com.ai.da.mapper.SysFileMapper; -import com.ai.da.mapper.entity.SysFile; +import com.ai.da.mapper.primary.SysFileMapper; +import com.ai.da.mapper.primary.entity.SysFile; import com.ai.da.model.vo.SysFileVO; import com.ai.da.service.SysFileService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; diff --git a/src/main/java/com/ai/da/service/impl/TCollectionElementRelationServiceImpl.java b/src/main/java/com/ai/da/service/impl/TCollectionElementRelationServiceImpl.java index 22c2e0e4..e15aac6b 100644 --- a/src/main/java/com/ai/da/service/impl/TCollectionElementRelationServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/TCollectionElementRelationServiceImpl.java @@ -1,9 +1,7 @@ package com.ai.da.service.impl; -import com.ai.da.mapper.TCollectionElementRelationMapper; -import com.ai.da.mapper.UserLikeMapper; -import com.ai.da.mapper.entity.TCollectionElementRelation; -import com.ai.da.mapper.entity.UserLike; +import com.ai.da.mapper.primary.TCollectionElementRelationMapper; +import com.ai.da.mapper.primary.entity.TCollectionElementRelation; import com.ai.da.service.TCollectionElementRelationService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; diff --git a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java index b24ba13e..a83b84d8 100644 --- a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java @@ -1,11 +1,10 @@ package com.ai.da.service.impl; -import cn.hutool.core.collection.CollectionUtil; import com.ai.da.common.enums.LayersPriorityEnum; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.MinioUtil; -import com.ai.da.mapper.TDesignPythonOutfitDetailMapper; -import com.ai.da.mapper.entity.TDesignPythonOutfitDetail; +import com.ai.da.mapper.primary.TDesignPythonOutfitDetailMapper; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfitDetail; import com.ai.da.model.vo.DesignPythonOutfitVO; import com.ai.da.model.vo.TDesignPythonOutfitDetailVO; import com.ai.da.service.ITDesignPythonOutfitDetailService; diff --git a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitServiceImpl.java b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitServiceImpl.java index 59ddda04..fad8e6e7 100644 --- a/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/TDesignPythonOutfitServiceImpl.java @@ -1,7 +1,7 @@ package com.ai.da.service.impl; -import com.ai.da.mapper.TDesignPythonOutfitMapper; -import com.ai.da.mapper.entity.TDesignPythonOutfit; +import com.ai.da.mapper.primary.TDesignPythonOutfitMapper; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfit; import com.ai.da.model.vo.TDesignPythonOutfitVO; import com.ai.da.service.ITDesignPythonOutfitService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; diff --git a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java index 6749de7a..29d70e13 100644 --- a/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java @@ -4,12 +4,10 @@ import cn.hutool.core.collection.CollectionUtil; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.utils.DateUtil; import com.ai.da.common.utils.MinioUtil; -import com.ai.da.mapper.*; -import com.ai.da.mapper.entity.Design; -import com.ai.da.mapper.entity.TDesignPythonOutfit; -import com.ai.da.mapper.entity.UserLike; -import com.ai.da.mapper.entity.UserLikeGroup; -import com.ai.da.model.enums.ModelType; +import com.ai.da.mapper.primary.*; +import com.ai.da.mapper.primary.entity.TDesignPythonOutfit; +import com.ai.da.mapper.primary.entity.UserLike; +import com.ai.da.mapper.primary.entity.UserLikeGroup; import com.ai.da.model.vo.*; import com.ai.da.service.AccountService; import com.ai.da.service.CollectionService; diff --git a/src/main/java/com/ai/da/service/impl/UserLikeServiceImpl.java b/src/main/java/com/ai/da/service/impl/UserLikeServiceImpl.java index 9006479a..29b53710 100644 --- a/src/main/java/com/ai/da/service/impl/UserLikeServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/UserLikeServiceImpl.java @@ -2,10 +2,8 @@ package com.ai.da.service.impl; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.DateUtil; -import com.ai.da.mapper.UserLikeMapper; -import com.ai.da.mapper.entity.Collection; -import com.ai.da.mapper.entity.DesignItem; -import com.ai.da.mapper.entity.UserLike; +import com.ai.da.mapper.primary.UserLikeMapper; +import com.ai.da.mapper.primary.entity.UserLike; import com.ai.da.model.vo.UserLikeVO; import com.ai.da.service.UserLikeService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,8 +17,6 @@ import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; /** * 服务实现类 diff --git a/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java b/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java index 01f2064a..69574b35 100644 --- a/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java @@ -3,22 +3,18 @@ package com.ai.da.service.impl; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.LibraryLevel1TypeEnum; -import com.ai.da.common.enums.SysFileLevel1TypeEnum; -import com.ai.da.common.enums.SysFileLevel2TypeEnum; import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.ResultEnum; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.FileUtil; import com.ai.da.common.utils.MD5Utils; import com.ai.da.common.utils.MinioUtil; -import com.ai.da.mapper.LibraryMapper; -import com.ai.da.mapper.SysFileMapper; -import com.ai.da.mapper.UserLikeMapper; -import com.ai.da.mapper.WorkspaceMapper; -import com.ai.da.mapper.entity.Library; -import com.ai.da.mapper.entity.SysFile; -import com.ai.da.mapper.entity.UserLike; -import com.ai.da.mapper.entity.Workspace; +import com.ai.da.mapper.primary.LibraryMapper; +import com.ai.da.mapper.primary.SysFileMapper; +import com.ai.da.mapper.primary.WorkspaceMapper; +import com.ai.da.mapper.primary.entity.Library; +import com.ai.da.mapper.primary.entity.SysFile; +import com.ai.da.mapper.primary.entity.Workspace; import com.ai.da.model.dto.WorkspaceDTO; import com.ai.da.model.enums.*; import com.ai.da.model.vo.AuthPrincipalVo; @@ -35,7 +31,6 @@ import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; @@ -47,7 +42,6 @@ import java.nio.file.Files; import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 4c401b7d..4e2bb172 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -7,12 +7,12 @@ server.port=5567 #spring.datasource.password=123456 #spring.datasource.password=QWa998345 spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.primary.url=jdbc:mysql://18.167.251.121:33008/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +spring.datasource.primary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true spring.datasource.primary.username=aida_con spring.datasource.primary.password=123456 spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.secondary.url=jdbc:mysql://18.167.251.121:33008/attribute_retrieval?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +spring.datasource.secondary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/attribute_retrieval?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true spring.datasource.secondary.username=aida_con spring.datasource.secondary.password=123456 @@ -34,7 +34,8 @@ rsa.private_key=MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8 #mybatis mybatis-plus.global-config.banner=false -mybatis-plus.mapper-locations=classpath:mapper/*Mapper.xml +#mybatis-plus.mapper-locations=classpath:mapper/secondary/*.xml +mybatis-plus.mapper-locations=classpath:mapper/*/*.xml #mybatis-plus.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl mybatis-plus.global-config.db-config.logic-delete-field=isDeleted mybatis-plus.global-config.db-config.logic-delete-value=1 diff --git a/src/main/resources/mapper/AccountMapper.xml b/src/main/resources/mapper/primary/AccountMapper.xml similarity index 75% rename from src/main/resources/mapper/AccountMapper.xml rename to src/main/resources/mapper/primary/AccountMapper.xml index 2e2bd6b6..d38f734a 100644 --- a/src/main/resources/mapper/AccountMapper.xml +++ b/src/main/resources/mapper/primary/AccountMapper.xml @@ -1,27 +1,27 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/ChatRobotMapper.xml b/src/main/resources/mapper/primary/ChatRobotMapper.xml similarity index 85% rename from src/main/resources/mapper/ChatRobotMapper.xml rename to src/main/resources/mapper/primary/ChatRobotMapper.xml index 5a379683..0dc78d00 100644 --- a/src/main/resources/mapper/ChatRobotMapper.xml +++ b/src/main/resources/mapper/primary/ChatRobotMapper.xml @@ -1,9 +1,9 @@ - + - + diff --git a/src/main/resources/mapper/ClassificationMapper.xml b/src/main/resources/mapper/primary/ClassificationMapper.xml similarity index 81% rename from src/main/resources/mapper/ClassificationMapper.xml rename to src/main/resources/mapper/primary/ClassificationMapper.xml index 20ea5ce1..689bbc7a 100644 --- a/src/main/resources/mapper/ClassificationMapper.xml +++ b/src/main/resources/mapper/primary/ClassificationMapper.xml @@ -1,9 +1,9 @@ - + - + diff --git a/src/main/resources/mapper/ClassificationRelLibraryMapper.xml b/src/main/resources/mapper/primary/ClassificationRelLibraryMapper.xml similarity index 78% rename from src/main/resources/mapper/ClassificationRelLibraryMapper.xml rename to src/main/resources/mapper/primary/ClassificationRelLibraryMapper.xml index 3db8b654..2ffa0dd4 100644 --- a/src/main/resources/mapper/ClassificationRelLibraryMapper.xml +++ b/src/main/resources/mapper/primary/ClassificationRelLibraryMapper.xml @@ -1,9 +1,9 @@ - + - + diff --git a/src/main/resources/mapper/CollectionMapper.xml b/src/main/resources/mapper/primary/CollectionMapper.xml similarity index 66% rename from src/main/resources/mapper/CollectionMapper.xml rename to src/main/resources/mapper/primary/CollectionMapper.xml index 3dddf4ec..055fb4be 100644 --- a/src/main/resources/mapper/CollectionMapper.xml +++ b/src/main/resources/mapper/primary/CollectionMapper.xml @@ -1,21 +1,21 @@ - - - - - - - - - - - - - - insert into t_collection - (account_id,create_date) - values( - #{accountId}, - #{createDate}); - - - + + + + + + + + + + + + + + insert into t_collection + (account_id,create_date) + values( + #{accountId}, + #{createDate}); + + + diff --git a/src/main/resources/mapper/DesignItemMapper.xml b/src/main/resources/mapper/primary/DesignItemMapper.xml similarity index 79% rename from src/main/resources/mapper/DesignItemMapper.xml rename to src/main/resources/mapper/primary/DesignItemMapper.xml index b4a089d8..c6b9689d 100644 --- a/src/main/resources/mapper/DesignItemMapper.xml +++ b/src/main/resources/mapper/primary/DesignItemMapper.xml @@ -1,33 +1,33 @@ - - - - - - - - - - - - - - - - - - - - insert into t_design_item - (account_id,design_id,collection_id,print_scale,design_url,high_design_url,is_like,create_date) - values( - #{accountId}, - #{designId}, - #{collectionId}, - #{printScale}, - #{designUrl}, - #{highDesignUrl}, - #{hasLike}, - #{createDate}); - - - + + + + + + + + + + + + + + + + + + + + insert into t_design_item + (account_id,design_id,collection_id,print_scale,design_url,high_design_url,is_like,create_date) + values( + #{accountId}, + #{designId}, + #{collectionId}, + #{printScale}, + #{designUrl}, + #{highDesignUrl}, + #{hasLike}, + #{createDate}); + + + diff --git a/src/main/resources/mapper/DesignMapper.xml b/src/main/resources/mapper/primary/DesignMapper.xml similarity index 77% rename from src/main/resources/mapper/DesignMapper.xml rename to src/main/resources/mapper/primary/DesignMapper.xml index 4c4e029c..b71f0f60 100644 --- a/src/main/resources/mapper/DesignMapper.xml +++ b/src/main/resources/mapper/primary/DesignMapper.xml @@ -1,29 +1,29 @@ - - - - - - - - - - - - - - - - - - insert into t_design - (account_id,collection_id,system_scale,single_overall,switch_category,create_date) - values( - #{accountId}, - #{collectionId}, - #{systemScale}, - #{singleOverall}, - #{switchCategory}, - #{createDate}); - - - + + + + + + + + + + + + + + + + + + insert into t_design + (account_id,collection_id,system_scale,single_overall,switch_category,create_date) + values( + #{accountId}, + #{collectionId}, + #{systemScale}, + #{singleOverall}, + #{switchCategory}, + #{createDate}); + + + diff --git a/src/main/resources/mapper/GenerateDetailMapper.xml b/src/main/resources/mapper/primary/GenerateDetailMapper.xml similarity index 87% rename from src/main/resources/mapper/GenerateDetailMapper.xml rename to src/main/resources/mapper/primary/GenerateDetailMapper.xml index 3dd87411..b3c0e9e3 100644 --- a/src/main/resources/mapper/GenerateDetailMapper.xml +++ b/src/main/resources/mapper/primary/GenerateDetailMapper.xml @@ -1,6 +1,6 @@ - + - select * from pantone - - - - r = #{item.r} and g = #{item.g} and b = #{item.b} - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/PythonTAllInfoMapper.xml b/src/main/resources/mapper/primary/PythonTAllInfoMapper.xml similarity index 92% rename from src/main/resources/mapper/PythonTAllInfoMapper.xml rename to src/main/resources/mapper/primary/PythonTAllInfoMapper.xml index b661a036..0fdcd2b3 100644 --- a/src/main/resources/mapper/PythonTAllInfoMapper.xml +++ b/src/main/resources/mapper/primary/PythonTAllInfoMapper.xml @@ -1,8 +1,8 @@ - + - + diff --git a/src/main/resources/mapper/TDesignPythonOutfitDetailMapper.xml b/src/main/resources/mapper/primary/TDesignPythonOutfitDetailMapper.xml similarity index 90% rename from src/main/resources/mapper/TDesignPythonOutfitDetailMapper.xml rename to src/main/resources/mapper/primary/TDesignPythonOutfitDetailMapper.xml index b231cdcb..b7b9b67d 100644 --- a/src/main/resources/mapper/TDesignPythonOutfitDetailMapper.xml +++ b/src/main/resources/mapper/primary/TDesignPythonOutfitDetailMapper.xml @@ -1,9 +1,9 @@ - + - + diff --git a/src/main/resources/mapper/TDesignPythonOutfitMapper.xml b/src/main/resources/mapper/primary/TDesignPythonOutfitMapper.xml similarity index 89% rename from src/main/resources/mapper/TDesignPythonOutfitMapper.xml rename to src/main/resources/mapper/primary/TDesignPythonOutfitMapper.xml index b739bdfe..9079c1b0 100644 --- a/src/main/resources/mapper/TDesignPythonOutfitMapper.xml +++ b/src/main/resources/mapper/primary/TDesignPythonOutfitMapper.xml @@ -1,9 +1,9 @@ - + - + diff --git a/src/main/resources/mapper/TrialOrderMapper.xml b/src/main/resources/mapper/primary/TrialOrderMapper.xml similarity index 84% rename from src/main/resources/mapper/TrialOrderMapper.xml rename to src/main/resources/mapper/primary/TrialOrderMapper.xml index 71abbf01..30f62bf0 100644 --- a/src/main/resources/mapper/TrialOrderMapper.xml +++ b/src/main/resources/mapper/primary/TrialOrderMapper.xml @@ -1,9 +1,9 @@ - + - + diff --git a/src/main/resources/mapper/UserLikeGroupMapper.xml b/src/main/resources/mapper/primary/UserLikeGroupMapper.xml similarity index 71% rename from src/main/resources/mapper/UserLikeGroupMapper.xml rename to src/main/resources/mapper/primary/UserLikeGroupMapper.xml index 66bbecc3..463fc854 100644 --- a/src/main/resources/mapper/UserLikeGroupMapper.xml +++ b/src/main/resources/mapper/primary/UserLikeGroupMapper.xml @@ -1,26 +1,26 @@ - - - - - - - - - - - - - - - - insert into t_user_like_group - (account_id,collection_id,`name`,create_date,update_date) - values( - #{accountId}, - #{collectionId}, - #{name}, - #{createDate}, - #{updateDate}); - - - + + + + + + + + + + + + + + + + insert into t_user_like_group + (account_id,collection_id,`name`,create_date,update_date) + values( + #{accountId}, + #{collectionId}, + #{name}, + #{createDate}, + #{updateDate}); + + + diff --git a/src/main/resources/mapper/WorkspaceMapper.xml b/src/main/resources/mapper/primary/WorkspaceMapper.xml similarity index 87% rename from src/main/resources/mapper/WorkspaceMapper.xml rename to src/main/resources/mapper/primary/WorkspaceMapper.xml index 72ff882e..9f36d5f6 100644 --- a/src/main/resources/mapper/WorkspaceMapper.xml +++ b/src/main/resources/mapper/primary/WorkspaceMapper.xml @@ -1,9 +1,9 @@ - + - + diff --git a/src/main/resources/mapper/secondary/FemaleDressMapper.xml b/src/main/resources/mapper/secondary/FemaleDressMapper.xml new file mode 100644 index 00000000..abaf4205 --- /dev/null +++ b/src/main/resources/mapper/secondary/FemaleDressMapper.xml @@ -0,0 +1,8 @@ + + + + + + + + From 6b8e96ec74447cae34869f7280510f254517d6bb Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Wed, 24 Jan 2024 10:23:58 +0800 Subject: [PATCH 04/93] TASK:design new; --- .../java/com/ai/da/python/PythonService.java | 142 ++++++++++-------- 1 file changed, 82 insertions(+), 60 deletions(-) diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index afe992a4..42fa011a 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -218,66 +218,88 @@ public class PythonService { //系统比列 BigDecimal sysRatio = systemScale; - int pinPictureNum = calculatePinPictureNum(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List()); - int sysPictureNum = calculateSysPictureNum(sysRatio, pinPictureNum); - int userPictureNum = calculateUserLibraryPictureNum(sysPictureNum, pinPictureNum); - int noPinPictureNum = 8 - pinPictureNum - sysPictureNum - userPictureNum; + int pinSketchNum = calculatePinSketchNum(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List()); + int sysSketchNum = calculateSysSketchNum(sysRatio, pinSketchNum); +// int noPinSketchNum = calculateNoPinSketchNum(pinSketchNum, sysSketchNum); +// int sysPictureNum = calculateSysPictureNum(sysRatio, pinPictureNum); +// int userPictureNum = calculateUserLibraryPictureNum(sysPictureNum, pinPictureNum); +// int noPinPictureNum = 8 - pinPictureNum - sysPictureNum - userPictureNum; - for (int i = 0; i < 8; i++) { - //sketch计算 - CurrentDesignPictureTypeEnum designPictureType = - calculateCurrentDesignPictureType(pinPictureNum, sysPictureNum, userPictureNum, noPinPictureNum); - if (Objects.isNull(designPictureType)) { - break; - } - switch (designPictureType) { - case PIN: - pinPictureNum--; - break; - case USER_LIBRARY: - userPictureNum--; - break; - case SYS_FILE: - sysPictureNum--; - break; - case NO_PIN: - noPinPictureNum--; - break; - default: - } - //print计算 - CurrentDesignPrintPictureTypeEnum designPrintPictureType = - calculateCurrentDesignPintPictureType(pinPrintNum, noPinPrintNum, noPrintNum); - if (Objects.isNull(designPrintPictureType)) { - break; - } - switch (designPrintPictureType) { - case PIN: - pinPrintNum--; - break; - case NO_PIN: - noPinPrintNum--; - break; - case NO: - noPrintNum--; - break; - default: - } - //确定本次designSingle是否print - DesignPythonItemPrint designPythonItemPrint = getRandomPrint(elementVO, designPrintPictureType); - elementVO.setDesignPythonItemPrint(designPythonItemPrint); - //参数透传 确定本次designSingle如果需要print对应的种类 - elementVO.setDesignPrintPictureTypeLayoutList(calculateCurrentDesignPintPictureTypeLayout(elementVO.getModelSex())); - //designSingle具体参数组装 - DesignPythonObject pythonObject = new DesignPythonObject(); - pythonObject.setItems(coverToDesignPythonItem(elementVO, designPictureType)); - pythonObject.setBasic(coverToBasic(pythonObject.getItems().get(0), - singleOverall, switchCategory, elementVO.getDesignLibraryModelPoint())); - objects.add(pythonObject); - } +// for (int i = 0; i < 8; i++) { +// //sketch计算 +// CurrentDesignPictureTypeEnum designPictureType = +// calculateCurrentDesignPictureType(pinPictureNum, sysPictureNum, userPictureNum, noPinPictureNum); +// if (Objects.isNull(designPictureType)) { +// break; +// } +// switch (designPictureType) { +// case PIN: +// pinPictureNum--; +// break; +// case USER_LIBRARY: +// userPictureNum--; +// break; +// case SYS_FILE: +// sysPictureNum--; +// break; +// case NO_PIN: +// noPinPictureNum--; +// break; +// default: +// } +// //print计算 +// CurrentDesignPrintPictureTypeEnum designPrintPictureType = +// calculateCurrentDesignPintPictureType(pinPrintNum, noPinPrintNum, noPrintNum); +// if (Objects.isNull(designPrintPictureType)) { +// break; +// } +// switch (designPrintPictureType) { +// case PIN: +// pinPrintNum--; +// break; +// case NO_PIN: +// noPinPrintNum--; +// break; +// case NO: +// noPrintNum--; +// break; +// default: +// } +// //确定本次designSingle是否print +// DesignPythonItemPrint designPythonItemPrint = getRandomPrint(elementVO, designPrintPictureType); +// elementVO.setDesignPythonItemPrint(designPythonItemPrint); +// //参数透传 确定本次designSingle如果需要print对应的种类 +// elementVO.setDesignPrintPictureTypeLayoutList(calculateCurrentDesignPintPictureTypeLayout(elementVO.getModelSex())); +// //designSingle具体参数组装 +// DesignPythonObject pythonObject = new DesignPythonObject(); +// pythonObject.setItems(coverToDesignPythonItem(elementVO, designPictureType)); +// pythonObject.setBasic(coverToBasic(pythonObject.getItems().get(0), +// singleOverall, switchCategory, elementVO.getDesignLibraryModelPoint())); +// objects.add(pythonObject); +// } return designPythonObjects; } + private int calculateSysSketchNum(BigDecimal sysRatio, int pinSketchNum) { + return 0; + } + + private int calculatePinSketchNum(List sketchBoardElements, List hasUseMd5List) { + List pinData = getPinData(sketchBoardElements, hasUseMd5List); + if (CollectionUtil.isEmpty(pinData)) { + return 0; + } +// long topNum = sketchBoardElements.stream() +// .filter(skecth -> skecth.getHasPin() == 1 +// && DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(skecth.getLevel2Type())).count(); +// long bottomNum = sketchBoardElements.stream() +// .filter(skecth -> skecth.getHasPin() == 1 +// && DesignPythonItem.SKIRT_TROUSERS.contains(skecth.getLevel2Type())).count(); +// int num = Arrays.asList(topNum, bottomNum).stream().max(Comparator.comparing(Long::valueOf)).get().intValue(); + int num = pinData.size(); + return Math.min(num, 8); + } + //计算当前的图片类型 private CurrentDesignPictureTypeEnum calculateCurrentDesignPictureType(int pinPictureNum, int sysPictureNum, int userPictureNum, int noPinPictureNum) { List codes = Lists.newArrayList(); @@ -1451,10 +1473,10 @@ public class PythonService { if (CollectionUtils.isEmpty(sketchBoardPins)) { return null; } - List response = resolveElementFilterHistoryMd5(sketchBoardPins); - if (CollectionUtils.isEmpty(response)) { - return null; - } +// List response = resolveElementFilterHistoryMd5(sketchBoardPins); +// if (CollectionUtils.isEmpty(response)) { +// return null; +// } return CopyUtil.copyList(sketchBoardPins, CollectionElement.class); } From a5cbca8d74de9eb4066235306cf1eff6e17ecb5d Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Mon, 29 Jan 2024 11:18:32 +0800 Subject: [PATCH 05/93] =?UTF-8?q?TASK:=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/application-test.properties | 37 ++++++++++--------- src/main/resources/application.properties | 2 +- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index 9027b77f..1e4491a9 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -1,15 +1,22 @@ server.port=5567 #datasource -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.url=jdbc:mysql://18.167.251.121:33008/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true -spring.datasource.username=aida_con -spring.datasource.password=123456 +#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +#spring.datasource.url=jdbc:mysql://18.167.251.121:33008/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +#spring.datasource.username=aida_con +#spring.datasource.password=123456 +#spring.datasource.password=QWa998345 +spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.primary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +spring.datasource.primary.username=aida_con +spring.datasource.primary.password=123456 + +spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.secondary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/attribute_retrieval?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +spring.datasource.secondary.username=aida_con +spring.datasource.secondary.password=123456 + -#??? -spring.datasource.hikari.minimum-idle=5 -spring.datasource.hikari.maximum-pool-size=40 -spring.datasource.hikari.idle-timeout=60000 #security spring.security.jwtSecret=JWTSECRET @@ -27,7 +34,8 @@ rsa.private_key=MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8 #mybatis mybatis-plus.global-config.banner=false -mybatis-plus.mapper-locations=classpath:mapper/*Mapper.xml +#mybatis-plus.mapper-locations=classpath:mapper/secondary/*.xml +mybatis-plus.mapper-locations=classpath:mapper/*/*.xml #mybatis-plus.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl mybatis-plus.global-config.db-config.logic-delete-field=isDeleted mybatis-plus.global-config.db-config.logic-delete-value=1 @@ -38,30 +46,23 @@ spring.mvc.pathmatch.matching-strategy=ant_path_matcher file.mac.path=~/file/ file.linux.path=/workspace/home/aida/file/ #linux服务器域名(预览和下载用) -#file.linuxDomain=http://18.162.111.141:5568/download/ -#file.linuxDomain=http://18.167.251.121:5568/download/ file.linuxDomain=https://www.aida.com.hk/download/ file.windows.path=D:\\upload\\ - spring.servlet.multipart.max-file-size = 5MB spring.servlet.multipart.max-request-size= 5MB - #访问python服务的ip(对应环境) #access.python.ip=http://43.198.80.117 access.python.ip=http://18.167.251.121 #access.python.ip=http://18.167.251.121:9991/ -#access.python.port=9992 access.python.port=9990 -# minIO服务配置之信息 minio.endpoint=https://www.minio.aida.com.hk:9000 minio.accessKey=admin minio.secretKey=admin123 minio.bucketName.clothing=aida-clothing +minio.bucketName.mannequins=aida-mannequins minio.bucketName.results=aida-results minio.bucketName.sysImage=aida-sys-image minio.bucketName.users=aida-users minio.bucketName.collectionElement=aida-collection-element - - - +redirect_url=http://18.167.251.121:7788 \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8550475d..47a99eb3 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,7 +2,7 @@ #spring.profiles.active=test #����application-prod�ļ�(��������) -spring.profiles.active=prod +spring.profiles.active=test #����application-dev�ļ�(��������) #spring.profiles.active=dev From 9a5ee2b264fe52b9f07aeb4f00156e1625cff082 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Mon, 29 Jan 2024 11:20:26 +0800 Subject: [PATCH 06/93] =?UTF-8?q?TASK:=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/application-test.properties | 22 +++++-------------- src/main/resources/application.properties | 2 +- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index 01678779..59ce6439 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -5,11 +5,7 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://18.167.251.121:33008/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true spring.datasource.username=aida_con spring.datasource.password=123456 - -#??? -spring.datasource.hikari.minimum-idle=5 -spring.datasource.hikari.maximum-pool-size=40 -spring.datasource.hikari.idle-timeout=60000 +#spring.datasource.password=QWa998345 #security spring.security.jwtSecret=JWTSECRET @@ -38,26 +34,21 @@ spring.mvc.pathmatch.matching-strategy=ant_path_matcher file.mac.path=~/file/ file.linux.path=/workspace/home/aida/file/ #linux服务器域名(预览和下载用) -#file.linuxDomain=http://18.162.111.141:5568/download/ -#file.linuxDomain=http://18.167.251.121:5568/download/ file.linuxDomain=https://www.aida.com.hk/download/ file.windows.path=D:\\upload\\ - -spring.servlet.multipart.max-file-size = 5MB -spring.servlet.multipart.max-request-size= 5MB - +spring.servlet.multipart.max-file-size = 10MB +spring.servlet.multipart.max-request-size= 10MB #访问python服务的ip(对应环境) #access.python.ip=http://43.198.80.117 access.python.ip=http://18.167.251.121 #access.python.ip=http://18.167.251.121:9991/ -access.python.port=9992 -#access.python.port=9991 +access.python.port=9990 -# minIO服务配置之信息 minio.endpoint=https://www.minio.aida.com.hk:9000 minio.accessKey=admin minio.secretKey=admin123 minio.bucketName.clothing=aida-clothing +minio.bucketName.mannequins=aida-mannequins minio.bucketName.results=aida-results minio.bucketName.sysImage=aida-sys-image minio.bucketName.users=aida-users @@ -83,5 +74,4 @@ spring.redis.lettuce.pool.max-wait=5 redis.key.consumptionOrder=ConsumptionOrder redis.key.cancelSet=CancelSet redis.key.exceptionMap=ExceptionMap -redis.key.resultMap=ResultMap - +redis.key.resultMap=ResultMap \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f00b793a..47a99eb3 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,7 +2,7 @@ #spring.profiles.active=test #����application-prod�ļ�(��������) -spring.profiles.active=dev +spring.profiles.active=test #����application-dev�ļ�(��������) #spring.profiles.active=dev From 98d98b1131408c00ec53594123dc8b70c7aa6dc6 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Mon, 29 Jan 2024 11:32:41 +0800 Subject: [PATCH 07/93] =?UTF-8?q?TASK:=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 47a99eb3..f00b793a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,7 +2,7 @@ #spring.profiles.active=test #����application-prod�ļ�(��������) -spring.profiles.active=test +spring.profiles.active=dev #����application-dev�ļ�(��������) #spring.profiles.active=dev From 5c2c9f22cef94460bdd96616f48352a084ac9ab0 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Mon, 29 Jan 2024 11:33:28 +0800 Subject: [PATCH 08/93] =?UTF-8?q?TASK:=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 47a99eb3..f00b793a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,7 +2,7 @@ #spring.profiles.active=test #����application-prod�ļ�(��������) -spring.profiles.active=test +spring.profiles.active=dev #����application-dev�ļ�(��������) #spring.profiles.active=dev From 12cd9e8f1fa915678bbd5a6fc30443ee2df6c6be Mon Sep 17 00:00:00 2001 From: zchengrong <124802516+zchengrong@users.noreply.github.com> Date: Tue, 30 Jan 2024 14:52:40 +0800 Subject: [PATCH 09/93] Delete docker-compose.yml --- docker-compose.yml | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index a37c5319..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,10 +0,0 @@ -version: "3" -services: - aida_back: - container_name: stable-version-aida-back - build: . -# volumes: -# # 数据挂载 -# - /workspace/home/aida/file/:/workspace/home/aida/file/ - ports: - - "10086:5567" \ No newline at end of file From 69fe9275766141055782d1682e7534bf9114bd6b Mon Sep 17 00:00:00 2001 From: xupei Date: Wed, 31 Jan 2024 16:01:06 +0800 Subject: [PATCH 10/93] =?UTF-8?q?=E6=96=B0=E5=A2=9Egenerate-queue-dev?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E9=98=9F=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java | 3 ++- src/main/resources/application.properties | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java index 208075fd..bb4aa412 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java @@ -17,7 +17,8 @@ public class MQConfig { public static final String GENERATE_EXCHANGE_FANOUT = "generate-exchange"; // public static final String GENERATE_QUEUE = "generate-queue-prod"; - public static final String GENERATE_QUEUE = "generate-queue-test"; +// public static final String GENERATE_QUEUE = "generate-queue-test"; + public static final String GENERATE_QUEUE = "generate-queue-dev"; public MQConfig() { } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ec94939b..974fee23 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,8 +1,8 @@ #����application-test�ļ�(���Ի���) -spring.profiles.active=test +#spring.profiles.active=test #����application-prod�ļ�(��������) #spring.profiles.active=prod #����application-dev�ļ�(��������) -#spring.profiles.active=dev +spring.profiles.active=dev From 92dafd74c9ca040a11bb557cda95be0177d841ba Mon Sep 17 00:00:00 2001 From: xupei Date: Thu, 1 Feb 2024 13:28:48 +0800 Subject: [PATCH 11/93] =?UTF-8?q?=E5=9C=A8=E8=BF=87=E6=BB=A4=E5=99=A8?= =?UTF-8?q?=E4=B8=AD=E6=B7=BB=E5=8A=A0=E6=9C=AA=E6=90=BA=E5=B8=A6token?= =?UTF-8?q?=E7=9A=84=E8=AF=B7=E6=B1=82ip=E6=97=A5=E5=BF=97=E6=89=93?= =?UTF-8?q?=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ai/da/common/security/filter/AuthenticationFilter.java | 3 +++ src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java index 6efefd84..ad01d2ba 100644 --- a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java +++ b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java @@ -7,6 +7,7 @@ import com.ai.da.common.security.jwt.JWTTokenHelper; import com.ai.da.common.utils.LocalCacheUtils; import com.ai.da.common.utils.MultiReadHttpServletRequest; import com.ai.da.common.utils.MultiReadHttpServletResponse; +import com.ai.da.common.utils.RequestInfoUtil; import com.ai.da.model.vo.AuthPrincipalVo; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration; @@ -92,6 +93,8 @@ public class AuthenticationFilter extends OncePerRequestFilter { log.debug("后台检查令牌:{}", jwtToken); if (StrUtil.isBlank(jwtToken)) { + String ipAddress = RequestInfoUtil.getIpAddress(request); + log.info("本次请求的ip为 : " + ipAddress); throw new RuntimeException("请传入token!"); } if(jwtToken.equals("Bearer-eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiIyIiwic3ViIjoie1wiaWRcIjoyLFwidXNlcm5hbWVcIjpcImxpcnNcIn0iLCJpYXQiOjE2NjU3NDEwODcsImlzcyI6IkRXSiIsImF1dGhvcml0aWVzIjoiW10iLCJleHAiOjE2NzQzODEwODd9.ShM9R_NNFD7oo1OvxrEgg7PFeWinOuAKkuInUCMQupp66s64Hhv8tN0Wwr83nIN4rHPqtn95wmd4msWcvaFYJA")){ diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index 0ea8e713..92042f4e 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -464,7 +464,7 @@ public class GenerateServiceImpl extends ServiceImpl i } } - // 3、考虑加一张表,专门用于记录哪些用户在什么时间进行了取消操作 + // 3、考虑加一张表,专门用于记录哪些用户在什么时间进行了取消操作,包括已经异常的请求 GenerateCancel generateCancel = new GenerateCancel(userId, uniqueId, DateUtil.getByTimeZone(timeZone)); generateCancelMapper.insert(generateCancel); } From 7f33597c022dffb053ceb883734d377703c90469 Mon Sep 17 00:00:00 2001 From: xupei Date: Wed, 14 Feb 2024 12:10:15 +0800 Subject: [PATCH 12/93] =?UTF-8?q?=E5=85=85=E5=80=BC=E5=8A=9F=E8=83=BD--?= =?UTF-8?q?=E6=8E=A5=E5=85=A5=E6=94=AF=E4=BB=98=E5=AE=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 + .../da/common/config/AlipayClientConfig.java | 43 ++ .../da/common/enums/AliPayTradeStateEnum.java | 39 ++ .../ai/da/common/enums/OrderStatusEnum.java | 49 +++ .../com/ai/da/common/enums/PayTypeEnum.java | 24 ++ .../security/filter/AuthenticationFilter.java | 2 +- .../com/ai/da/common/task/AliPayTask.java | 42 ++ .../com/ai/da/common/utils/OrderNoUtils.java | 46 ++ .../ai/da/controller/AliPayController.java | 206 +++++++++ .../ai/da/controller/OrderInfoController.java | 50 +++ .../ai/da/controller/ProductController.java | 42 ++ .../com/ai/da/mapper/OrderInfoMapper.java | 8 + .../com/ai/da/mapper/PaymentInfoMapper.java | 7 + .../java/com/ai/da/mapper/ProductMapper.java | 8 + .../com/ai/da/mapper/RefundInfoMapper.java | 9 + .../com/ai/da/mapper/entity/BaseEntity.java | 19 + .../com/ai/da/mapper/entity/OrderInfo.java | 25 ++ .../com/ai/da/mapper/entity/PaymentInfo.java | 23 + .../java/com/ai/da/mapper/entity/Product.java | 13 + .../com/ai/da/mapper/entity/RefundInfo.java | 27 ++ .../java/com/ai/da/service/AliPayService.java | 22 + .../com/ai/da/service/OrderInfoService.java | 25 ++ .../com/ai/da/service/PaymentInfoService.java | 10 + .../com/ai/da/service/ProductService.java | 8 + .../com/ai/da/service/RefundInfoService.java | 20 + .../ai/da/service/impl/AliPayServiceImpl.java | 394 ++++++++++++++++++ .../da/service/impl/OrderInfoServiceImpl.java | 172 ++++++++ .../service/impl/PaymentInfoServiceImpl.java | 90 ++++ .../da/service/impl/ProductServiceImpl.java | 12 + .../service/impl/RefundInfoServiceImpl.java | 156 +++++++ src/main/resources/alipay-sandbox.properties | 38 ++ 31 files changed, 1635 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/ai/da/common/config/AlipayClientConfig.java create mode 100644 src/main/java/com/ai/da/common/enums/AliPayTradeStateEnum.java create mode 100644 src/main/java/com/ai/da/common/enums/OrderStatusEnum.java create mode 100644 src/main/java/com/ai/da/common/enums/PayTypeEnum.java create mode 100644 src/main/java/com/ai/da/common/task/AliPayTask.java create mode 100644 src/main/java/com/ai/da/common/utils/OrderNoUtils.java create mode 100644 src/main/java/com/ai/da/controller/AliPayController.java create mode 100644 src/main/java/com/ai/da/controller/OrderInfoController.java create mode 100644 src/main/java/com/ai/da/controller/ProductController.java create mode 100644 src/main/java/com/ai/da/mapper/OrderInfoMapper.java create mode 100644 src/main/java/com/ai/da/mapper/PaymentInfoMapper.java create mode 100644 src/main/java/com/ai/da/mapper/ProductMapper.java create mode 100644 src/main/java/com/ai/da/mapper/RefundInfoMapper.java create mode 100644 src/main/java/com/ai/da/mapper/entity/BaseEntity.java create mode 100644 src/main/java/com/ai/da/mapper/entity/OrderInfo.java create mode 100644 src/main/java/com/ai/da/mapper/entity/PaymentInfo.java create mode 100644 src/main/java/com/ai/da/mapper/entity/Product.java create mode 100644 src/main/java/com/ai/da/mapper/entity/RefundInfo.java create mode 100644 src/main/java/com/ai/da/service/AliPayService.java create mode 100644 src/main/java/com/ai/da/service/OrderInfoService.java create mode 100644 src/main/java/com/ai/da/service/PaymentInfoService.java create mode 100644 src/main/java/com/ai/da/service/ProductService.java create mode 100644 src/main/java/com/ai/da/service/RefundInfoService.java create mode 100644 src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java create mode 100644 src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java create mode 100644 src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java create mode 100644 src/main/java/com/ai/da/service/impl/ProductServiceImpl.java create mode 100644 src/main/java/com/ai/da/service/impl/RefundInfoServiceImpl.java create mode 100644 src/main/resources/alipay-sandbox.properties diff --git a/pom.xml b/pom.xml index 14913240..69e4b1ec 100644 --- a/pom.xml +++ b/pom.xml @@ -170,6 +170,13 @@ commons-pool2 + + + com.alipay.sdk + alipay-sdk-java + 4.22.57.ALL + + diff --git a/src/main/java/com/ai/da/common/config/AlipayClientConfig.java b/src/main/java/com/ai/da/common/config/AlipayClientConfig.java new file mode 100644 index 00000000..5b1ec344 --- /dev/null +++ b/src/main/java/com/ai/da/common/config/AlipayClientConfig.java @@ -0,0 +1,43 @@ +package com.ai.da.common.config; + +import com.alipay.api.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; + +import javax.annotation.Resource; + +@Configuration +//加载配置文件 +@PropertySource("classpath:alipay-sandbox.properties") +public class AlipayClientConfig { + + @Resource + private Environment config; + + @Bean + public AlipayClient alipayClient() throws AlipayApiException { + + AlipayConfig alipayConfig = new AlipayConfig(); + + //设置网关地址 + alipayConfig.setServerUrl(config.getProperty("alipay.gateway-url")); + //设置应用Id + alipayConfig.setAppId(config.getProperty("alipay.app-id")); + //设置应用私钥 + alipayConfig.setPrivateKey(config.getProperty("alipay.merchant-private-key")); + //设置请求格式,固定值json + alipayConfig.setFormat(AlipayConstants.FORMAT_JSON); + //设置字符集 + alipayConfig.setCharset(AlipayConstants.CHARSET_UTF8); + //设置支付宝公钥 + alipayConfig.setAlipayPublicKey(config.getProperty("alipay.alipay-public-key")); + //设置签名类型 + alipayConfig.setSignType(AlipayConstants.SIGN_TYPE_RSA2); + //构造client + AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig); + + return alipayClient; + } +} diff --git a/src/main/java/com/ai/da/common/enums/AliPayTradeStateEnum.java b/src/main/java/com/ai/da/common/enums/AliPayTradeStateEnum.java new file mode 100644 index 00000000..573ec7dd --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/AliPayTradeStateEnum.java @@ -0,0 +1,39 @@ +package com.ai.da.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum AliPayTradeStateEnum { + + /** + * 支付成功 + */ + SUCCESS("TRADE_SUCCESS"), + + /** + * 未支付 + */ + NOTPAY("WAIT_BUYER_PAY"), + + /** + * 已关闭 + */ + CLOSED("TRADE_CLOSED"), + + /** + * 退款成功 + */ + REFUND_SUCCESS("REFUND_SUCCESS"), + + /** + * 退款失败 + */ + REFUND_ERROR("REFUND_ERROR"); + + /** + * 类型 + */ + private final String type; +} diff --git a/src/main/java/com/ai/da/common/enums/OrderStatusEnum.java b/src/main/java/com/ai/da/common/enums/OrderStatusEnum.java new file mode 100644 index 00000000..ede1e162 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/OrderStatusEnum.java @@ -0,0 +1,49 @@ +package com.ai.da.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum OrderStatusEnum { + /** + * 未支付 + */ + NOT_PAY("未支付"), + + + /** + * 支付成功 + */ + SUCCESS("支付成功"), + + /** + * 已关闭 + */ + CLOSED("超时已关闭"), + + /** + * 已取消 + */ + CANCEL("用户已取消"), + + /** + * 退款中 + */ + REFUND_PROCESSING("退款中"), + + /** + * 已退款 + */ + REFUND_SUCCESS("已退款"), + + /** + * 退款异常 + */ + REFUND_ABNORMAL("退款异常"); + + /** + * 类型 + */ + private final String type; +} diff --git a/src/main/java/com/ai/da/common/enums/PayTypeEnum.java b/src/main/java/com/ai/da/common/enums/PayTypeEnum.java new file mode 100644 index 00000000..cb2e89f8 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/PayTypeEnum.java @@ -0,0 +1,24 @@ +package com.ai.da.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum PayTypeEnum { + /** + * 微信 + */ + WXPAY("微信"), + + + /** + * 支付宝 + */ + ALIPAY("支付宝"); + + /** + * 类型 + */ + private final String type; +} diff --git a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java index c2625612..c203cee8 100644 --- a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java +++ b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java @@ -94,7 +94,7 @@ public class AuthenticationFilter extends OncePerRequestFilter { if (StrUtil.isBlank(jwtToken)) { throw new RuntimeException("请传入token!"); } - if(jwtToken.equals("Bearer-eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiIyIiwic3ViIjoie1wiaWRcIjoyLFwidXNlcm5hbWVcIjpcImxpcnNcIn0iLCJpYXQiOjE2NjU3NDEwODcsImlzcyI6IkRXSiIsImF1dGhvcml0aWVzIjoiW10iLCJleHAiOjE2NzQzODEwODd9.ShM9R_NNFD7oo1OvxrEgg7PFeWinOuAKkuInUCMQupp66s64Hhv8tN0Wwr83nIN4rHPqtn95wmd4msWcvaFYJA")){ + if(jwtToken.equals("Bearer Bearer-eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiIyIiwic3ViIjoie1wiaWRcIjoyLFwidXNlcm5hbWVcIjpcImxpcnNcIn0iLCJpYXQiOjE2NjU3NDEwODcsImlzcyI6IkRXSiIsImF1dGhvcml0aWVzIjoiW10iLCJleHAiOjE2NzQzODEwODd9.ShM9R_NNFD7oo1OvxrEgg7PFeWinOuAKkuInUCMQupp66s64Hhv8tN0Wwr83nIN4rHPqtn95wmd4msWcvaFYJA")){ //写死 暂时放行 return; } diff --git a/src/main/java/com/ai/da/common/task/AliPayTask.java b/src/main/java/com/ai/da/common/task/AliPayTask.java new file mode 100644 index 00000000..0d9c8390 --- /dev/null +++ b/src/main/java/com/ai/da/common/task/AliPayTask.java @@ -0,0 +1,42 @@ +package com.ai.da.common.task; + +import com.ai.da.mapper.entity.OrderInfo; +import com.ai.da.common.enums.PayTypeEnum; +import com.ai.da.service.AliPayService; +import com.ai.da.service.OrderInfoService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +@Slf4j +@Component +public class AliPayTask { + + @Resource + private OrderInfoService orderInfoService; + + @Resource + private AliPayService aliPayService; + + /** + * 从第0秒开始每隔30秒执行1次,查询创建超过5分钟,并且未支付的订单 + */ + @Scheduled(cron = "0/30 * * * * ?") + public void orderConfirm(){ + + log.info("orderConfirm 被执行......"); + + List orderInfoList = orderInfoService.getNoPayOrderByDuration(1, PayTypeEnum.ALIPAY.getType()); + + for (OrderInfo orderInfo : orderInfoList) { + String orderNo = orderInfo.getOrderNo(); + log.warn("超时订单 ===> {}", orderNo); + + //核实订单状态:调用支付宝查单接口 + aliPayService.checkOrderStatus(orderNo); + } + } +} diff --git a/src/main/java/com/ai/da/common/utils/OrderNoUtils.java b/src/main/java/com/ai/da/common/utils/OrderNoUtils.java new file mode 100644 index 00000000..2b0108de --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/OrderNoUtils.java @@ -0,0 +1,46 @@ +package com.ai.da.common.utils; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Random; + +/** + * 订单号工具类 + * + * @author qy + * @since 1.0 + */ +public class OrderNoUtils { + + /** + * 获取订单编号 + * @return + */ + public static String getOrderNo() { + return "ORDER_" + getNo(); + } + + /** + * 获取退款单编号 + * @return + */ + public static String getRefundNo() { + return "REFUND_" + getNo(); + } + + /** + * 获取编号 + * @return + */ + public static String getNo() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); + String newDate = sdf.format(new Date()); + String result = ""; + Random random = new Random(); + for (int i = 0; i < 3; i++) { + result += random.nextInt(10); + } + return newDate + result; + } + +} diff --git a/src/main/java/com/ai/da/controller/AliPayController.java b/src/main/java/com/ai/da/controller/AliPayController.java new file mode 100644 index 00000000..e098b142 --- /dev/null +++ b/src/main/java/com/ai/da/controller/AliPayController.java @@ -0,0 +1,206 @@ +package com.ai.da.controller; + +import com.ai.da.common.response.Response; +import com.ai.da.mapper.entity.OrderInfo; +import com.ai.da.service.AliPayService; +import com.ai.da.service.OrderInfoService; +import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayConstants; +import com.alipay.api.internal.util.AlipaySignature; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.env.Environment; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.Map; + +@CrossOrigin +@RestController +@RequestMapping("/api/ali-pay") +@Api(tags = "网站支付宝支付") +@Slf4j +public class AliPayController { + + @Resource + private AliPayService aliPayService; + + @Resource + private Environment config; + + @Resource + private OrderInfoService orderInfoService; + + @ApiOperation("统一收单下单并支付页面接口的调用") + @PostMapping("/trade/page/pay/{productId}") + public Response tradePagePay(@PathVariable Long productId){ + + log.info("统一收单下单并支付页面接口的调用"); + //支付宝开放平台接受 request 请求对象后 + // 会为开发者生成一个html 形式的 form表单,包含自动提交的脚本 + String formStr = aliPayService.tradeCreate(productId); + //我们将form表单字符串返回给前端程序,之后前端将会调用自动提交脚本,进行表单的提交 + //此时,表单会自动提交到action属性所指向的支付宝开放平台中,从而为用户展示一个支付页面 + return Response.success(formStr); + } + + @ApiOperation("支付通知") + @PostMapping("/trade/notify") + public String tradeNotify(@RequestParam Map params){ + + log.info("支付通知正在执行"); + log.info("通知参数 ===> {}", params); + + String result = "failure"; + + try { + //异步通知验签 + boolean signVerified = AlipaySignature.rsaCheckV1( + params, + config.getProperty("alipay.alipay-public-key"), + AlipayConstants.CHARSET_UTF8, + AlipayConstants.SIGN_TYPE_RSA2); //调用SDK验证签名 + + if(!signVerified){ + //验签失败则记录异常日志,并在response中返回failure. + log.error("支付成功异步通知验签失败!"); + return result; + } + + // 验签成功后 + log.info("支付成功异步通知验签成功!"); + + //按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验, + //1 商户需要验证该通知数据中的 out_trade_no 是否为商户系统中创建的订单号 + String outTradeNo = params.get("out_trade_no"); + OrderInfo order = orderInfoService.getOrderByOrderNo(outTradeNo); + if(order == null){ + log.error("订单不存在"); + return result; + } + + //2 判断 total_amount 是否确实为该订单的实际金额(即商户订单创建时的金额) + String totalAmount = params.get("total_amount"); + int totalAmountInt = new BigDecimal(totalAmount).multiply(new BigDecimal("100")).intValue(); + int totalFeeInt = order.getTotalFee().intValue(); + if(totalAmountInt != totalFeeInt){ + log.error("金额校验失败"); + return result; + } + + //3 校验通知中的 seller_id(或者 seller_email) 是否为 out_trade_no 这笔单据的对应的操作方 + String sellerId = params.get("seller_id"); + String sellerIdProperty = config.getProperty("alipay.seller-id"); + if(!sellerId.equals(sellerIdProperty)){ + log.error("商家pid校验失败"); + return result; + } + + //4 验证 app_id 是否为该商户本身 + String appId = params.get("app_id"); + String appIdProperty = config.getProperty("alipay.app-id"); + if(!appId.equals(appIdProperty)){ + log.error("appid校验失败"); + return result; + } + + //在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS时, + // 支付宝才会认定为买家付款成功。 + String tradeStatus = params.get("trade_status"); + if(!"TRADE_SUCCESS".equals(tradeStatus)){ + log.error("支付未成功"); + return result; + } + + //处理业务 修改订单状态 记录支付日志 + aliPayService.processOrder(params); + + //校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure + result = "success"; + } catch (AlipayApiException e) { + e.printStackTrace(); + } + return result; + } + + /** + * 用户取消订单 + * @param orderNo + * @return + */ + @ApiOperation("用户取消订单") + @PostMapping("/trade/close/{orderNo}") + public Response cancel(@PathVariable String orderNo){ + + log.info("取消订单"); + aliPayService.cancelOrder(orderNo); + return Response.success("订单已取消"); + } + + /** + * 查询订单 + * @param orderNo + * @return + */ + @ApiOperation("查询订单:测试订单状态用") + @GetMapping("/trade/query/{orderNo}") + public Response queryOrder(@PathVariable String orderNo) { + + log.info("查询订单"); + + String result = aliPayService.queryOrder(orderNo); + return Response.success(result); + + } + + /** + * 申请退款 + * @param orderNo + * @param reason + * @return + */ + @ApiOperation("申请退款") + @PostMapping("/trade/refund/{orderNo}/{reason}") + public Response refunds(@PathVariable String orderNo, @PathVariable String reason){ + + log.info("申请退款"); + aliPayService.refund(orderNo, reason); + return Response.success(); + } + + /** + * 查询退款 + * @param orderNo + * @return + * @throws Exception + */ + @ApiOperation("查询退款:测试用") + @GetMapping("/trade/fastpay/refund/{orderNo}") + public Response queryRefund(@PathVariable String orderNo) throws Exception { + + log.info("查询退款"); + + String result = aliPayService.queryRefund(orderNo); + return Response.success(result); + } + + /** + * 根据账单类型和日期获取账单url地址 + * + * @param billDate + * @param type + * @return + */ + @ApiOperation("获取账单url") + @GetMapping("/bill/downloadurl/query/{billDate}/{type}") + public Response queryTradeBill( + @PathVariable String billDate, + @PathVariable String type) { + log.info("获取账单url"); + String downloadUrl = aliPayService.queryBill(billDate, type); + return Response.success(downloadUrl); + } + +} diff --git a/src/main/java/com/ai/da/controller/OrderInfoController.java b/src/main/java/com/ai/da/controller/OrderInfoController.java new file mode 100644 index 00000000..b71d0e04 --- /dev/null +++ b/src/main/java/com/ai/da/controller/OrderInfoController.java @@ -0,0 +1,50 @@ +package com.ai.da.controller; + +import com.ai.da.common.enums.OrderStatusEnum; +import com.ai.da.common.response.Response; +import com.ai.da.mapper.entity.OrderInfo; +import com.ai.da.service.OrderInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +@CrossOrigin //开放前端的跨域访问 +@Api(tags = "商品订单管理") +@RestController +@RequestMapping("/api/order-info") +public class OrderInfoController { + + @Resource + private OrderInfoService orderInfoService; + + @ApiOperation("订单列表") + @GetMapping("/list") + public Response> list(){ + + List list = orderInfoService.listOrderByCreateTimeDesc(); + return Response.success(list); + } + + /** + * 查询本地订单状态 + * @param orderNo + * @return + */ + @ApiOperation("查询本地订单状态") + @GetMapping("/query-order-status/{orderNo}") + public Response queryOrderStatus(@PathVariable String orderNo){ + + String orderStatus = orderInfoService.getOrderStatus(orderNo); + if(OrderStatusEnum.SUCCESS.getType().equals(orderStatus)){ + return Response.success("支付成功"); //支付成功 + } + + return Response.success(101,"支付中......"); + } + + + +} diff --git a/src/main/java/com/ai/da/controller/ProductController.java b/src/main/java/com/ai/da/controller/ProductController.java new file mode 100644 index 00000000..b22b1537 --- /dev/null +++ b/src/main/java/com/ai/da/controller/ProductController.java @@ -0,0 +1,42 @@ +package com.ai.da.controller; + + +import com.ai.da.common.response.Response; +import com.ai.da.mapper.entity.Product; +import com.ai.da.service.ProductService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +@CrossOrigin //开放前端的跨域访问 +@Api(tags = "商品管理") +@RestController +@RequestMapping("/api/product") +public class ProductController { + + @Resource + private ProductService productService; + + @ApiOperation("测试接口") + @GetMapping("/test") + public Response test(){ + + return Response.success("now" + new Date()); + } + + @ApiOperation("商品列表") + @GetMapping("/list") + public Response> list(){ + + List list = productService.list(); + return Response.success(list); + } + +} diff --git a/src/main/java/com/ai/da/mapper/OrderInfoMapper.java b/src/main/java/com/ai/da/mapper/OrderInfoMapper.java new file mode 100644 index 00000000..4b8b6d68 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/OrderInfoMapper.java @@ -0,0 +1,8 @@ +package com.ai.da.mapper; + +import com.ai.da.mapper.entity.OrderInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface OrderInfoMapper extends BaseMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/PaymentInfoMapper.java b/src/main/java/com/ai/da/mapper/PaymentInfoMapper.java new file mode 100644 index 00000000..1406b6bc --- /dev/null +++ b/src/main/java/com/ai/da/mapper/PaymentInfoMapper.java @@ -0,0 +1,7 @@ +package com.ai.da.mapper; + +import com.ai.da.mapper.entity.PaymentInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface PaymentInfoMapper extends BaseMapper { +} diff --git a/src/main/java/com/ai/da/mapper/ProductMapper.java b/src/main/java/com/ai/da/mapper/ProductMapper.java new file mode 100644 index 00000000..1ffdf2eb --- /dev/null +++ b/src/main/java/com/ai/da/mapper/ProductMapper.java @@ -0,0 +1,8 @@ +package com.ai.da.mapper; + +import com.ai.da.mapper.entity.Product; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface ProductMapper extends BaseMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/RefundInfoMapper.java b/src/main/java/com/ai/da/mapper/RefundInfoMapper.java new file mode 100644 index 00000000..8f9c746e --- /dev/null +++ b/src/main/java/com/ai/da/mapper/RefundInfoMapper.java @@ -0,0 +1,9 @@ +package com.ai.da.mapper; + + +import com.ai.da.mapper.entity.RefundInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface RefundInfoMapper extends BaseMapper { + +} diff --git a/src/main/java/com/ai/da/mapper/entity/BaseEntity.java b/src/main/java/com/ai/da/mapper/entity/BaseEntity.java new file mode 100644 index 00000000..05d83fa0 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/BaseEntity.java @@ -0,0 +1,19 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.util.Date; + +@Data +public class BaseEntity { + + //定义主键策略:跟随数据库的主键自增 + @TableId(value = "id", type = IdType.AUTO) + private String id; //主键 + + private Date createTime;//创建时间 + + private Date updateTime;//更新时间 +} diff --git a/src/main/java/com/ai/da/mapper/entity/OrderInfo.java b/src/main/java/com/ai/da/mapper/entity/OrderInfo.java new file mode 100644 index 00000000..12255f12 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/OrderInfo.java @@ -0,0 +1,25 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("t_order_info") +public class OrderInfo extends BaseEntity{ + + private String title;//订单标题 + + private String orderNo;//商户订单编号 + + private Long userId;//用户id + + private Long productId;//支付产品id + + private Integer totalFee;//订单金额(分) + + private String codeUrl;//订单二维码连接 + + private String orderStatus;//订单状态 + + private String paymentType;//支付方式 +} diff --git a/src/main/java/com/ai/da/mapper/entity/PaymentInfo.java b/src/main/java/com/ai/da/mapper/entity/PaymentInfo.java new file mode 100644 index 00000000..ceacf94a --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/PaymentInfo.java @@ -0,0 +1,23 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("t_payment_info") +public class PaymentInfo extends BaseEntity{ + + private String orderNo;//商品订单编号 + + private String transactionId;//支付系统交易编号 + + private String paymentType;//支付类型 + + private String tradeType;//交易类型 + + private String tradeState;//交易状态 + + private Integer payerTotal;//支付金额(分) + + private String content;//通知参数 +} diff --git a/src/main/java/com/ai/da/mapper/entity/Product.java b/src/main/java/com/ai/da/mapper/entity/Product.java new file mode 100644 index 00000000..9aa55531 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/Product.java @@ -0,0 +1,13 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("t_product") +public class Product extends BaseEntity{ + + private String title; //商品名称 + + private Integer price; //价格(分) +} diff --git a/src/main/java/com/ai/da/mapper/entity/RefundInfo.java b/src/main/java/com/ai/da/mapper/entity/RefundInfo.java new file mode 100644 index 00000000..594be318 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/entity/RefundInfo.java @@ -0,0 +1,27 @@ +package com.ai.da.mapper.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("t_refund_info") +public class RefundInfo extends BaseEntity{ + + private String orderNo;//商品订单编号 + + private String refundNo;//退款单编号 + + private String refundId;//支付系统退款单号 + + private Integer totalFee;//原订单金额(分) + + private Integer refund;//退款金额(分) + + private String reason;//退款原因 + + private String refundStatus;//退款单状态 + + private String contentReturn;//申请退款返回参数 + + private String contentNotify;//退款结果通知参数 +} diff --git a/src/main/java/com/ai/da/service/AliPayService.java b/src/main/java/com/ai/da/service/AliPayService.java new file mode 100644 index 00000000..f2d4e39b --- /dev/null +++ b/src/main/java/com/ai/da/service/AliPayService.java @@ -0,0 +1,22 @@ +package com.ai.da.service; + +import java.util.Map; + +public interface AliPayService { + String tradeCreate(Long productId); + + void processOrder(Map params); + + void cancelOrder(String orderNo); + + String queryOrder(String orderNo); + + void checkOrderStatus(String orderNo); + + void refund(String orderNo, String reason); + + String queryRefund(String orderNo); + + String queryBill(String billDate, String type); + +} diff --git a/src/main/java/com/ai/da/service/OrderInfoService.java b/src/main/java/com/ai/da/service/OrderInfoService.java new file mode 100644 index 00000000..1507d931 --- /dev/null +++ b/src/main/java/com/ai/da/service/OrderInfoService.java @@ -0,0 +1,25 @@ +package com.ai.da.service; + + +import com.ai.da.common.enums.OrderStatusEnum; +import com.ai.da.mapper.entity.OrderInfo; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface OrderInfoService extends IService { + + OrderInfo createOrderByProductId(Long productId, String paymentType); + + void saveCodeUrl(String orderNo, String codeUrl); + + List listOrderByCreateTimeDesc(); + + void updateStatusByOrderNo(String orderNo, OrderStatusEnum orderStatus); + + String getOrderStatus(String orderNo); + + List getNoPayOrderByDuration(int minutes, String paymentType); + + OrderInfo getOrderByOrderNo(String orderNo); +} diff --git a/src/main/java/com/ai/da/service/PaymentInfoService.java b/src/main/java/com/ai/da/service/PaymentInfoService.java new file mode 100644 index 00000000..aa1470e4 --- /dev/null +++ b/src/main/java/com/ai/da/service/PaymentInfoService.java @@ -0,0 +1,10 @@ +package com.ai.da.service; + +import java.util.Map; + +public interface PaymentInfoService { + + void createPaymentInfo(String plainText); + + void createPaymentInfoForAliPay(Map params); +} diff --git a/src/main/java/com/ai/da/service/ProductService.java b/src/main/java/com/ai/da/service/ProductService.java new file mode 100644 index 00000000..9ac2597d --- /dev/null +++ b/src/main/java/com/ai/da/service/ProductService.java @@ -0,0 +1,8 @@ +package com.ai.da.service; + +import com.ai.da.mapper.entity.Product; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface ProductService extends IService { + +} diff --git a/src/main/java/com/ai/da/service/RefundInfoService.java b/src/main/java/com/ai/da/service/RefundInfoService.java new file mode 100644 index 00000000..014004cd --- /dev/null +++ b/src/main/java/com/ai/da/service/RefundInfoService.java @@ -0,0 +1,20 @@ +package com.ai.da.service; + + +import com.ai.da.mapper.entity.RefundInfo; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface RefundInfoService extends IService { + + RefundInfo createRefundByOrderNo(String orderNo, String reason); + + void updateRefund(String content); + + List getNoRefundOrderByDuration(int minutes); + + RefundInfo createRefundByOrderNoForAliPay(String orderNo, String reason); + + void updateRefundForAliPay(String refundNo, String content, String refundStatus); +} diff --git a/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java new file mode 100644 index 00000000..a255dbb0 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java @@ -0,0 +1,394 @@ +package com.ai.da.service.impl; + +import com.ai.da.common.enums.AliPayTradeStateEnum; +import com.ai.da.common.enums.OrderStatusEnum; +import com.ai.da.common.enums.PayTypeEnum; +import com.ai.da.mapper.entity.OrderInfo; +import com.ai.da.mapper.entity.RefundInfo; +import com.ai.da.service.AliPayService; +import com.ai.da.service.OrderInfoService; +import com.ai.da.service.PaymentInfoService; +import com.ai.da.service.RefundInfoService; +import com.alibaba.fastjson.JSONObject; +import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayClient; +import com.alipay.api.request.*; +import com.alipay.api.response.*; +import com.google.gson.Gson; +import com.google.gson.internal.LinkedTreeMap; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.locks.ReentrantLock; + +@Service +@Slf4j +public class AliPayServiceImpl implements AliPayService { + + @Resource + private OrderInfoService orderInfoService; + + @Resource + private AlipayClient alipayClient; + + @Resource + private Environment config; + + @Resource + private PaymentInfoService paymentInfoService; + + @Resource + private RefundInfoService refundsInfoService; + + private final ReentrantLock lock = new ReentrantLock(); + + @Transactional(rollbackFor = Exception.class) + @Override + public String tradeCreate(Long productId) { + + try { + //生成订单 + log.info("生成订单"); + OrderInfo orderInfo = orderInfoService.createOrderByProductId(productId, PayTypeEnum.ALIPAY.getType()); + + //调用支付宝接口 + AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); + //配置需要的公共请求参数 + //支付完成后,支付宝向谷粒学院发起异步通知的地址 + request.setNotifyUrl(config.getProperty("alipay.notify-url")); + //支付完成后,我们想让页面跳转回谷粒学院的页面,配置returnUrl + request.setReturnUrl(config.getProperty("alipay.return-url")); + + //组装当前业务方法的请求参数 + JSONObject bizContent = new JSONObject(); + bizContent.put("out_trade_no", orderInfo.getOrderNo()); + BigDecimal total = new BigDecimal(orderInfo.getTotalFee().toString()).divide(new BigDecimal("100")); + bizContent.put("total_amount", total); + bizContent.put("subject", orderInfo.getTitle()); + bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY"); + + request.setBizContent(bizContent.toString()); + + //执行请求,调用支付宝接口 + AlipayTradePagePayResponse response = alipayClient.pageExecute(request); + + if(response.isSuccess()){ + log.info("调用成功,返回结果 ===> " + response.getBody()); + return response.getBody(); + } else { + log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg()); + throw new RuntimeException("创建支付交易失败"); + } + } catch (AlipayApiException e) { + e.printStackTrace(); + throw new RuntimeException("创建支付交易失败"); + } + } + + /** + * 处理订单 + * @param params + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void processOrder(Map params) { + + log.info("处理订单"); + + //获取订单号 + String orderNo = params.get("out_trade_no"); + + /*在对业务数据进行状态检查和处理之前, + 要采用数据锁进行并发控制, + 以避免函数重入造成的数据混乱*/ + //尝试获取锁: + // 成功获取则立即返回true,获取失败则立即返回false。不必一直等待锁的释放 + if(lock.tryLock()) { + try { + + //处理重复通知 + //接口调用的幂等性:无论接口被调用多少次,以下业务执行一次 + String orderStatus = orderInfoService.getOrderStatus(orderNo); + if (!OrderStatusEnum.NOT_PAY.getType().equals(orderStatus)) { + return; + } + + //更新订单状态 + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.SUCCESS); + + //记录支付日志 + paymentInfoService.createPaymentInfoForAliPay(params); + + } finally { + //要主动释放锁 + lock.unlock(); + } + } + + } + + /** + * 用户取消订单 + * @param orderNo + */ + @Override + public void cancelOrder(String orderNo) { + + //调用支付宝提供的统一收单交易关闭接口 + this.closeOrder(orderNo); + + //更新用户订单状态 + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.CANCEL); + } + + /** + * 查询订单 + * @param orderNo + * @return 返回订单查询结果,如果返回null则表示支付宝端尚未创建订单 + */ + @Override + public String queryOrder(String orderNo) { + + try { + log.info("查单接口调用 ===> {}", orderNo); + + AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); + JSONObject bizContent = new JSONObject(); + bizContent.put("out_trade_no", orderNo); + request.setBizContent(bizContent.toString()); + + AlipayTradeQueryResponse response = alipayClient.execute(request); + if(response.isSuccess()){ + log.info("调用成功,返回结果 ===> " + response.getBody()); + return response.getBody(); + } else { + log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg()); + //throw new RuntimeException("查单接口的调用失败"); + return null;//订单不存在 + } + + } catch (AlipayApiException e) { + e.printStackTrace(); + throw new RuntimeException("查单接口的调用失败"); + } + } + + /** + * 根据订单号调用支付宝查单接口,核实订单状态 + * 如果订单未创建,则更新商户端订单状态 + * 如果订单未支付,则调用关单接口关闭订单,并更新商户端订单状态 + * 如果订单已支付,则更新商户端订单状态,并记录支付日志 + * @param orderNo + */ + @Override + public void checkOrderStatus(String orderNo) { + + log.warn("根据订单号核实订单状态 ===> {}", orderNo); + + String result = this.queryOrder(orderNo); + + //订单未创建 + if(result == null){ + log.warn("核实订单未创建 ===> {}", orderNo); + //更新本地订单状态 + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.CLOSED); + } + + //解析查单响应结果 + Gson gson = new Gson(); + HashMap resultMap = gson.fromJson(result, HashMap.class); + LinkedTreeMap alipayTradeQueryResponse = resultMap.get("alipay_trade_query_response"); + + String tradeStatus = (String)alipayTradeQueryResponse.get("trade_status"); + if(AliPayTradeStateEnum.NOTPAY.getType().equals(tradeStatus)){ + log.warn("核实订单未支付 ===> {}", orderNo); + + //如果订单未支付,则调用关单接口关闭订单 + this.closeOrder(orderNo); + + // 并更新商户端订单状态 + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.CLOSED); + } + + if(AliPayTradeStateEnum.SUCCESS.getType().equals(tradeStatus)){ + log.warn("核实订单已支付 ===> {}", orderNo); + + //如果订单已支付,则更新商户端订单状态 + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.SUCCESS); + + //并记录支付日志 + paymentInfoService.createPaymentInfoForAliPay(alipayTradeQueryResponse); + } + + } + + /** + * 关单接口的调用 + * @param orderNo 订单号 + */ + private void closeOrder(String orderNo) { + + try { + log.info("关单接口的调用,订单号 ===> {}", orderNo); + + AlipayTradeCloseRequest request = new AlipayTradeCloseRequest(); + JSONObject bizContent = new JSONObject(); + bizContent.put("out_trade_no", orderNo); + request.setBizContent(bizContent.toString()); + AlipayTradeCloseResponse response = alipayClient.execute(request); + + if(response.isSuccess()){ + log.info("调用成功,返回结果 ===> " + response.getBody()); + } else { + log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg()); + //throw new RuntimeException("关单接口的调用失败"); + } + + } catch (AlipayApiException e) { + e.printStackTrace(); + throw new RuntimeException("关单接口的调用失败"); + } + } + + /** + * 退款 + * @param orderNo + * @param reason + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void refund(String orderNo, String reason) { + + try { + log.info("调用退款API"); + + //创建退款单 + RefundInfo refundInfo = refundsInfoService.createRefundByOrderNoForAliPay(orderNo, reason); + + //调用统一收单交易退款接口 + AlipayTradeRefundRequest request = new AlipayTradeRefundRequest (); + + //组装当前业务方法的请求参数 + JSONObject bizContent = new JSONObject(); + bizContent.put("out_trade_no", orderNo);//订单编号 + BigDecimal refund = new BigDecimal(refundInfo.getRefund().toString()).divide(new BigDecimal("100")); + //BigDecimal refund = new BigDecimal("2").divide(new BigDecimal("100")); + bizContent.put("refund_amount", refund);//退款金额:不能大于支付金额 + bizContent.put("refund_reason", reason);//退款原因(可选) + + request.setBizContent(bizContent.toString()); + + //执行请求,调用支付宝接口 + AlipayTradeRefundResponse response = alipayClient.execute(request); + + if(response.isSuccess()){ + log.info("调用成功,返回结果 ===> " + response.getBody()); + + //更新订单状态 + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.REFUND_SUCCESS); + + //更新退款单 + refundsInfoService.updateRefundForAliPay( + refundInfo.getRefundNo(), + response.getBody(), + AliPayTradeStateEnum.REFUND_SUCCESS.getType()); //退款成功 + + } else { + log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg()); + + //更新订单状态 + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.REFUND_ABNORMAL); + + //更新退款单 + refundsInfoService.updateRefundForAliPay( + refundInfo.getRefundNo(), + response.getBody(), + AliPayTradeStateEnum.REFUND_ERROR.getType()); //退款失败 + } + + + } catch (AlipayApiException e) { + e.printStackTrace(); + throw new RuntimeException("创建退款申请失败"); + } + } + + /** + * 查询退款 + * @param orderNo + * @return + */ + @Override + public String queryRefund(String orderNo) { + + try { + log.info("查询退款接口调用 ===> {}", orderNo); + + AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest(); + JSONObject bizContent = new JSONObject(); + bizContent.put("out_trade_no", orderNo); + bizContent.put("out_request_no", orderNo); + request.setBizContent(bizContent.toString()); + + AlipayTradeFastpayRefundQueryResponse response = alipayClient.execute(request); + if(response.isSuccess()){ + log.info("调用成功,返回结果 ===> " + response.getBody()); + return response.getBody(); + } else { + log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg()); + //throw new RuntimeException("查单接口的调用失败"); + return null;//订单不存在 + } + + } catch (AlipayApiException e) { + e.printStackTrace(); + throw new RuntimeException("查单接口的调用失败"); + } + } + + /** + * 申请账单 + * @param billDate + * @param type + * @return + */ + @Override + public String queryBill(String billDate, String type) { + + try { + + AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest(); + JSONObject bizContent = new JSONObject(); + bizContent.put("bill_type", type); + bizContent.put("bill_date", billDate); + request.setBizContent(bizContent.toString()); + AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient.execute(request); + + if(response.isSuccess()){ + log.info("调用成功,返回结果 ===> " + response.getBody()); + + //获取账单下载地址 + Gson gson = new Gson(); + HashMap resultMap = gson.fromJson(response.getBody(), HashMap.class); + LinkedTreeMap billDownloadurlResponse = resultMap.get("alipay_data_dataservice_bill_downloadurl_query_response"); + String billDownloadUrl = (String)billDownloadurlResponse.get("bill_download_url"); + + return billDownloadUrl; + } else { + log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg()); + throw new RuntimeException("申请账单失败"); + } + + } catch (AlipayApiException e) { + e.printStackTrace(); + throw new RuntimeException("申请账单失败"); + } + } + +} diff --git a/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java new file mode 100644 index 00000000..aa1f5255 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java @@ -0,0 +1,172 @@ +package com.ai.da.service.impl; + + +import com.ai.da.common.enums.OrderStatusEnum; +import com.ai.da.common.utils.OrderNoUtils; +import com.ai.da.mapper.OrderInfoMapper; +import com.ai.da.mapper.ProductMapper; +import com.ai.da.mapper.entity.OrderInfo; +import com.ai.da.mapper.entity.Product; +import com.ai.da.service.OrderInfoService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.Duration; +import java.time.Instant; +import java.util.List; + +@Service +@Slf4j +public class OrderInfoServiceImpl extends ServiceImpl implements OrderInfoService { + + @Resource + private ProductMapper productMapper; + + /*@Resource + private OrderInfoMapper orderInfoMapper;*/ + + @Override + public OrderInfo createOrderByProductId(Long productId, String paymentType) { + + //查找已存在但未支付的订单 + OrderInfo orderInfo = this.getNoPayOrderByProductId(productId, paymentType); + if( orderInfo != null){ + return orderInfo; + } + + //获取商品信息 + Product product = productMapper.selectById(productId); + + //生成订单 + orderInfo = new OrderInfo(); + orderInfo.setTitle(product.getTitle()); + orderInfo.setOrderNo(OrderNoUtils.getOrderNo()); //订单号 + orderInfo.setProductId(productId); + orderInfo.setTotalFee(product.getPrice()); //分 + orderInfo.setOrderStatus(OrderStatusEnum.NOT_PAY.getType()); //未支付 + orderInfo.setPaymentType(paymentType); + baseMapper.insert(orderInfo); + + return orderInfo; + } + + /** + * 存储订单二维码 + * @param orderNo + * @param codeUrl + */ + @Override + public void saveCodeUrl(String orderNo, String codeUrl) { + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("order_no", orderNo); + + OrderInfo orderInfo = new OrderInfo(); + orderInfo.setCodeUrl(codeUrl); + + baseMapper.update(orderInfo, queryWrapper); + } + + /** + * 查询订单列表,并倒序查询 + * @return + */ + @Override + public List listOrderByCreateTimeDesc() { + + QueryWrapper queryWrapper = new QueryWrapper().orderByDesc("create_time"); + return baseMapper.selectList(queryWrapper); + } + + /** + * 根据订单号更新订单状态 + * @param orderNo + * @param orderStatus + */ + @Override + public void updateStatusByOrderNo(String orderNo, OrderStatusEnum orderStatus) { + + log.info("更新订单状态 ===> {}", orderStatus.getType()); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("order_no", orderNo); + + OrderInfo orderInfo = new OrderInfo(); + orderInfo.setOrderStatus(orderStatus.getType()); + + baseMapper.update(orderInfo, queryWrapper); + } + + /** + * 根据订单号获取订单状态 + * @param orderNo + * @return + */ + @Override + public String getOrderStatus(String orderNo) { + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("order_no", orderNo); + OrderInfo orderInfo = baseMapper.selectOne(queryWrapper); + if(orderInfo == null){ + return null; + } + return orderInfo.getOrderStatus(); + } + + /** + * 查询创建超过minutes分钟并且未支付的订单 + * @param minutes + * @return + */ + @Override + public List getNoPayOrderByDuration(int minutes, String paymentType) { + + Instant instant = Instant.now().minus(Duration.ofMinutes(minutes)); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("order_status", OrderStatusEnum.NOT_PAY.getType()); + queryWrapper.le("create_time", instant); + queryWrapper.eq("payment_type", paymentType); + + List orderInfoList = baseMapper.selectList(queryWrapper); + + return orderInfoList; + } + + /** + * 根据订单号获取订单 + * @param orderNo + * @return + */ + @Override + public OrderInfo getOrderByOrderNo(String orderNo) { + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("order_no", orderNo); + OrderInfo orderInfo = baseMapper.selectOne(queryWrapper); + + return orderInfo; + } + + + /** + * 根据商品id查询未支付订单 + * 防止重复创建订单对象 + * @param productId + * @return + */ + private OrderInfo getNoPayOrderByProductId(Long productId, String paymentType) { + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("product_id", productId); + queryWrapper.eq("order_status", OrderStatusEnum.NOT_PAY.getType()); + queryWrapper.eq("payment_type", paymentType); +// queryWrapper.eq("user_id", userId); + OrderInfo orderInfo = baseMapper.selectOne(queryWrapper); + return orderInfo; + } +} diff --git a/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java new file mode 100644 index 00000000..4bafa595 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java @@ -0,0 +1,90 @@ +package com.ai.da.service.impl; + +import com.ai.da.common.enums.PayTypeEnum; +import com.ai.da.mapper.PaymentInfoMapper; +import com.ai.da.mapper.entity.PaymentInfo; +import com.ai.da.service.PaymentInfoService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.gson.Gson; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; + +@Service +@Slf4j +public class PaymentInfoServiceImpl extends ServiceImpl implements PaymentInfoService { + + /** + * 记录支付日志:微信支付 + * @param plainText + */ + @Override + public void createPaymentInfo(String plainText) { + + log.info("记录支付日志"); + + Gson gson = new Gson(); + HashMap plainTextMap = gson.fromJson(plainText, HashMap.class); + + //订单号 + String orderNo = (String)plainTextMap.get("out_trade_no"); + //业务编号 + String transactionId = (String)plainTextMap.get("transaction_id"); + //支付类型 + String tradeType = (String)plainTextMap.get("trade_type"); + //交易状态 + String tradeState = (String)plainTextMap.get("trade_state"); + //用户实际支付金额 + Map amount = (Map)plainTextMap.get("amount"); + Integer payerTotal = ((Double) amount.get("payer_total")).intValue(); + + PaymentInfo paymentInfo = new PaymentInfo(); + paymentInfo.setOrderNo(orderNo); + paymentInfo.setPaymentType(PayTypeEnum.WXPAY.getType()); + paymentInfo.setTransactionId(transactionId); + paymentInfo.setTradeType(tradeType); + paymentInfo.setTradeState(tradeState); + paymentInfo.setPayerTotal(payerTotal); + paymentInfo.setContent(plainText); + + baseMapper.insert(paymentInfo); + } + + /** + * 记录支付日志:支付宝 + * @param params + */ + @Override + public void createPaymentInfoForAliPay(Map params) { + + log.info("记录支付日志"); + + //获取订单号 + String orderNo = params.get("out_trade_no"); + //业务编号 + String transactionId = params.get("trade_no"); + //交易状态 + String tradeStatus = params.get("trade_status"); + //交易金额 + String totalAmount = params.get("total_amount"); + int totalAmountInt = new BigDecimal(totalAmount).multiply(new BigDecimal("100")).intValue(); + + + PaymentInfo paymentInfo = new PaymentInfo(); + paymentInfo.setOrderNo(orderNo); + paymentInfo.setPaymentType(PayTypeEnum.ALIPAY.getType()); + paymentInfo.setTransactionId(transactionId); + paymentInfo.setTradeType("电脑网站支付"); + paymentInfo.setTradeState(tradeStatus); + paymentInfo.setPayerTotal(totalAmountInt); + + Gson gson = new Gson(); + String json = gson.toJson(params, HashMap.class); + paymentInfo.setContent(json); + + baseMapper.insert(paymentInfo); + } +} diff --git a/src/main/java/com/ai/da/service/impl/ProductServiceImpl.java b/src/main/java/com/ai/da/service/impl/ProductServiceImpl.java new file mode 100644 index 00000000..0aa9d4b3 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/ProductServiceImpl.java @@ -0,0 +1,12 @@ +package com.ai.da.service.impl; + +import com.ai.da.mapper.ProductMapper; +import com.ai.da.mapper.entity.Product; +import com.ai.da.service.ProductService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service +public class ProductServiceImpl extends ServiceImpl implements ProductService { + +} diff --git a/src/main/java/com/ai/da/service/impl/RefundInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/RefundInfoServiceImpl.java new file mode 100644 index 00000000..f05dd74f --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/RefundInfoServiceImpl.java @@ -0,0 +1,156 @@ +package com.ai.da.service.impl; + +import com.ai.da.common.utils.OrderNoUtils; +import com.ai.da.mapper.RefundInfoMapper; +import com.ai.da.mapper.entity.OrderInfo; +import com.ai.da.mapper.entity.RefundInfo; +import com.ai.da.service.OrderInfoService; +import com.ai.da.service.RefundInfoService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.gson.Gson; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.Duration; +import java.time.Instant; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class RefundInfoServiceImpl extends ServiceImpl implements RefundInfoService { + + @Resource + private OrderInfoService orderInfoService; + + /** + * 根据订单号创建退款订单 + * @param orderNo + * @return + */ + @Override + public RefundInfo createRefundByOrderNo(String orderNo, String reason) { + + //根据订单号获取订单信息 + OrderInfo orderInfo = orderInfoService.getOrderByOrderNo(orderNo); + + //根据订单号生成退款订单 + RefundInfo refundInfo = new RefundInfo(); + refundInfo.setOrderNo(orderNo);//订单编号 + refundInfo.setRefundNo(OrderNoUtils.getRefundNo());//退款单编号 + refundInfo.setTotalFee(orderInfo.getTotalFee());//原订单金额(分) + refundInfo.setRefund(orderInfo.getTotalFee());//退款金额(分) + refundInfo.setReason(reason);//退款原因 + + //保存退款订单 + baseMapper.insert(refundInfo); + + return refundInfo; + } + + + /** + * 记录退款记录 + * @param content + */ + @Override + public void updateRefund(String content) { + + //将json字符串转换成Map + Gson gson = new Gson(); + Map resultMap = gson.fromJson(content, HashMap.class); + + //根据退款单编号修改退款单 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("refund_no", resultMap.get("out_refund_no")); + + //设置要修改的字段 + RefundInfo refundInfo = new RefundInfo(); + + refundInfo.setRefundId(resultMap.get("refund_id"));//微信支付退款单号 + + //查询退款和申请退款中的返回参数 + if(resultMap.get("status") != null){ + refundInfo.setRefundStatus(resultMap.get("status"));//退款状态 + refundInfo.setContentReturn(content);//将全部响应结果存入数据库的content字段 + } + //退款回调中的回调参数 + if(resultMap.get("refund_status") != null){ + refundInfo.setRefundStatus(resultMap.get("refund_status"));//退款状态 + refundInfo.setContentNotify(content);//将全部响应结果存入数据库的content字段 + } + + //更新退款单 + baseMapper.update(refundInfo, queryWrapper); + } + + /** + * 找出申请退款超过minutes分钟并且未成功的退款单 + * @param minutes + * @return + */ + @Override + public List getNoRefundOrderByDuration(int minutes) { + + //minutes分钟之前的时间 + Instant instant = Instant.now().minus(Duration.ofMinutes(minutes)); + + QueryWrapper queryWrapper = new QueryWrapper<>(); +// queryWrapper.eq("refund_status", WxRefundStatus.PROCESSING.getType()); + queryWrapper.le("create_time", instant); + List refundInfoList = baseMapper.selectList(queryWrapper); + return refundInfoList; + } + + /** + * 根据订单号创建退款订单 + * @param orderNo + * @return + */ + @Override + public RefundInfo createRefundByOrderNoForAliPay(String orderNo, String reason) { + + //根据订单号获取订单信息 + OrderInfo orderInfo = orderInfoService.getOrderByOrderNo(orderNo); + + //根据订单号生成退款订单 + RefundInfo refundInfo = new RefundInfo(); + refundInfo.setOrderNo(orderNo);//订单编号 + refundInfo.setRefundNo(OrderNoUtils.getRefundNo());//退款单编号 + + refundInfo.setTotalFee(orderInfo.getTotalFee());//原订单金额(分) + refundInfo.setRefund(orderInfo.getTotalFee());//退款金额(分) + refundInfo.setReason(reason);//退款原因 + + //保存退款订单 + baseMapper.insert(refundInfo); + + return refundInfo; + } + + /** + * 更新退款记录 + * @param refundNo + * @param content + * @param refundStatus + */ + @Override + public void updateRefundForAliPay(String refundNo, String content, String refundStatus) { + + //根据退款单编号修改退款单 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("refund_no", refundNo); + + //设置要修改的字段 + RefundInfo refundInfo = new RefundInfo(); + refundInfo.setRefundStatus(refundStatus);//退款状态 + refundInfo.setContentReturn(content);//将全部响应结果存入数据库的content字段 + + //更新退款单 + baseMapper.update(refundInfo, queryWrapper); + + } + +} diff --git a/src/main/resources/alipay-sandbox.properties b/src/main/resources/alipay-sandbox.properties new file mode 100644 index 00000000..972660de --- /dev/null +++ b/src/main/resources/alipay-sandbox.properties @@ -0,0 +1,38 @@ +# 支付宝支付相关参数 + +# 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号 +#alipay.app-id=2021000119635499 +alipay.app-id=9021000134653815 + +# 商户PID,卖家支付宝账号ID +#alipay.seller-id=2088621957993562 +alipay.seller-id=2088721029614572 + +# 支付宝网关 +#alipay.gateway-url=https://openapi.alipaydev.com/gateway.do +alipay.gateway-url=https://openapi-sandbox.dl.alipaydev.com/gateway.do + +# 商户私钥,您的PKCS8格式RSA2私钥 +#alipay.merchant-private-key=MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCJPnt6TMZ1A06SMeNxQT0WhGbRd74JBCcdqQt4POzBMJ1NE6U/OiG2xZEnUqYWC2ukkOgZZEvTuWDI9q2aEFN7E2Fcj39JCwRmE0an153JIOkb9L2nngTsAAN7cwLZZ6/dAPnrZjtN0f/HRVBXPSNLBdpoS/pbKRurM2NccZkbTZtluCdt4IvBBjjcV3DJOCYP9yrLTP3HYDxep3HrZCvXuR2Iseb+c6qc4IF/2UKQTz+iavxCy3zJTYbDzD0cL7yC4HmSD7vbNGZvkzZB1RNWt0NILj2LdFG10T7zZahN461FiYozRfD7LDPXqq+uuZMM5i0jpXVrs2MDk6HeS0lJAgMBAAECggEAF87wCrpQ3zGwqqne4+HGYCad046rN9MxmfKeW8Bt7eGqGBnlW7+Q460ITkMHLuHSTZ0ZtnXwtYz+Hj60xPo6ESq+hBkcoqY3oCGN60X7SE3eQoxFblN6VRp3gC3me6KCHpuxv0Vf2lMoxP/gPRINElG0ns03ZCMQerWSchH+1n5xUX/SrsgYDLaHfCxSpGsI/iyjTHXl+KqZeiFoRY+0tlJCTsc6P8JBYEeI5l8Iza/CjxDgFT41B4RksMw9ZEUCwxMiQhqIOThdTxtpA+MpUjoizhngq1xAXMcEz3QlnV7V2icyWjDAAz7bMCISUBa2MLkNWb392/yROKCBcXKYZQKBgQDY5T8QbC3GiUw0IQrVwm1A46zBzMDuQV+a4/2q63f8BBRZcbOluzxuCSfsTIVFKF1eJqpD75+76rB2z39P5xSS2/9SuO9FofV5iUDZuC93mOvR5nwh0rkgizhes81p+i7S9VcQcLTM/gK8ta3VXC3Pv/9bIGlTyFPLS0iMLUJlywKBgQCh/PIjoBFqKWpB6wSTn8hotvvE0WU1XMhm09WnlrMN2O+TuL71PoVS5vhCBgCJW5e3OOOS1K8uYLWaAQY9g/PvzYWLKF7CkCZNTvdds67QMreU9Cfm3jOwUkOibXarJEwY0l52k4xihQ6o8QGvG6XmNw3oq3RX/t/Y0DC84lMKuwKBgQCBQnYIAoBxToe0lXCQnfNgdY8SXEUqeJlShMc7YmM6NPAvsfxfK6vC4///6kaORZUHNEHKhPcMFbyeweBcrRlswGF0WjR2qiPSD4MvfX4EZ4U6rYKS4bNkerPYdI1ZuDjJjl8ZtCF7/XGCJz/25J2Eryauly1OOhf+Etqkd6CXawKBgDlmf4seMm2TBWMcW3/QM9zfUnHY3Ws+WIkPcXs0THiQsbx/z7Lpl6bbz4bdx5zkxusXDpU+JmFhxZgv2r07n9oO0s6P3JxHJjtoywD6Je0Cu8jdh7IodNp7HBpXfaCBeTGmgfC0sh9LFPnKhRU+z9e3FIepEc4Is9uJUmvsKw73AoGAM44/Oz7axzcVEIaD/7jyy1GiaYCmI55qqjocXfbK9QlWDiLnGfbx2UB6BC1y7WD6a9bMpatLXppTDEL+qHX0jUp0u06LQnJi9SAUBcff4LioSJxBrYx6ovYjAEmpoyiW/AAQBJ1oyp1UvpX0avfMa0Hdo1e+YnFEZluCr184uns= +alipay.merchant-private-key=MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCS8D3aAKvh+juT+5GEXkbKsHtoSK8odQ3htEH3XE+TP5PiXiOiv7pCnVDaIJ5gxfVBeQNC/D7E0zD7J+F1pRFtXA2MQ/ZMXd21hCjkXjIdBBo7iprPKD51AQIHJ8ocjKH0AnCcWAKPN03HvwCbPyYVXHcGO7XrIE2XFgTszsJYOw/dvruVxVF/OEXtVmgOJYIbHQnd+EfJ68BbMWbebzNBgy2YN/EBJldMMoaFcwtei7wCvUcNxWWqaus+n5u9+xFzPX/5495F3clu9yDydIdmvoRYEMdlzb0PbEzGg1KAaIHb8weNVd0bypOTkVK4Y/2tkPfAAv1hF4e6Uf2MAFw5AgMBAAECggEAc1/mAP4T+F0mWLzodrob9dz7GVgxCKBYpQeH4HWAGguKz+zBKHJJCzNBH/UKxsvJFn6xe/BaTOvTAvI+isRw2aC1FpTqmO3/Px6liSMZUEU/X88mXVCpMe/3qqyoeyBFrjYYO/qzD8cJ8LReAohkG9O9tYw+/H8hzWdBuLtkSCft1iHMUFT9M78lHgHIidUZHio+ga55yLEzx8iLibKXeRTFBAtrzknP0SWO25yHtPuPQhmAF8MGDzACm7fFOsccqBH11EmJGUlMAygT89bWXkWSGtPtbmprNe1lVsg0BlyZdgts5qHIrQYAEr/8o/MZI1d3dXv0UC4YTbA1ibaDsQKBgQDWui+5fJ/Xxc30XsSqGU9mgmM2Qf6PrriixTWfbe0Xdw090D+n4zjyfHOjZCEchFbv1FaDNpTt04IZ0bt2Fx6TwhHFxZnIWAMuLLt0ei4A/iCgTfkCrSwvhJ5uuAA5wFDTJIfyQ+JOpk79BVXm5uk2WuvXWTZXIcz2gA4E8PPnJQKBgQCvLnSQkmWCRv9TU8Mk9lXpWruQf8c3oVxvJ0CFDJK3+33PswiZTX+jcymAvK6kd1H0Mg8jJvH+uyeNPyF7aQW8NHasejqRNhyGyj1ZhRTuDIDGs2qIkZv1RAoDB12T0zATMeoJRbycQpOvi6FGI6KkOmjbgVzrrOPLdYh7wKxOhQKBgBg9MEH6BXkwBQ2+3Ohurv3dXiGz1W6WxJTrOiBjIk5xy/bcWTM0fSsyTUN2fB5h+gZcq99n++vU4mzTthughH0dfTAcHD33YXSG7Co72JGYHkq6Qo/AyKociF3rO2tJgFY1W3tHmnZSY7xAK/BCxLS0EsdedLnlQOPalLqOEJpZAoGAOFCq0D7/ut2v/s2SkjNOcvHkEhPBqzSIToNDzoG4OMT0MOzQ+tdbDORclzIQwnZJNkNRcm92o/juQg3laZLdcR88dz3jzgKjMQGar0iE7fG/BCFxQe3tQO9aeJbJklf1wHXvUoPEmkccyvYMJkwWYM0WIFp50JmHsURbV80clzECgYEAjJdoYgyJSKyuOSJQ8DSyAGGmUZdUILNDZl3KTYWAlPySmDqtqRb0nHpr/iOSlCuazEfOm3CnKaNqa7lx+Fyp3JYdYKa218crif4mjAnEoINcxTrCFVCe+bQqj2oYNi+rSptO6ingTUMv9HPjz0U2DhBRFI/pLPyQnOZx70hOCyQ= + +# 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥 +#alipay.alipay-public-key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvKoCpGtG31iY2Llj3t8MKRpaVCntnalWmXbKcHCiaYcUUjzcMPH3/tOr5ORK5W1NjuLu9uRrsXqROBmQYN+0y4nea+fU989i2IxtOGR/h2Kvhyyk/lPjNkmgz7K8VqbGGeVzTadPSK49FcrDVEshJ6C92vEKq6TmUfhKgCLiLZ288fHBDRvzUnoj8O/LBXiDroq1zX+DXYCHcQeFljkF5ivyxDZBkWl23hYTtnFClvN5lVLK4d294wyprF7IMv3XhQOfJS+Pr527CsfwT0JE44lyidCvslvn9DSdHdIfTIzHDsIEiDzB/OvRCbwpEA7UGnWQxQf7AusX2TTRQHWW7wIDAQAB +alipay.alipay-public-key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhDXg0niJ+GSB4VRvPJqzgDhNCP68TRZRLSKLCr/cw6qy911UxRNS96f/ALE7TOLYEsqsolV1inrJ1PU3+BZY9LiKthzEJhdVNzEwXtQrZVknRt3rDtWM2PkKanlQt9LN1Kr28eZ1jJipbkyTLBZOR5RxQ6M6BW0hewrMq/aJLzugP6I7pFHy2iF9zmIm0upy3bUiO5kJwCCXAXfKTG4bLPzhMZCWmDipuscnvR/TN2Nka3WGAJVpiUuRo/poxWKlQpKl6K9rz5RypiAJSaW8zacNyBZ45xIoep3d48v/izOSq2NxLDs6oMUb/BwpJRgfex6dOrnqyIXy0+i9DwEDEwIDAQAB + +# 接口内容加密秘钥,对称秘钥 +#alipay.content-key=D8entyfafkkFwtMbUqj3Mw== +alipay.content-key=hKZgxtPGmOivCphtHM5gNg== + +# 页面跳转同步通知页面路径 +alipay.return-url=http://localhost:8080/#/success + +# 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 +# 注意:每次重新启动ngrok,都需要根据实际情况修改这个配置 +#alipay.notify-url=https://77ea-221-239-177-21.ngrok.io/api/ali-pay/trade/notify +alipay.notify-url=https://03a3-117-143-125-44.ngrok-free.app/api/ali-pay/trade/notify + + + + + From a7c60a932a7a91396262b04c312697d1f11bf010 Mon Sep 17 00:00:00 2001 From: xupei Date: Wed, 14 Feb 2024 12:21:01 +0800 Subject: [PATCH 13/93] =?UTF-8?q?=E5=90=88=E5=B9=B6stable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e3064a47..974fee23 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,7 +2,7 @@ #spring.profiles.active=test #����application-prod�ļ�(��������) -spring.profiles.active=prod +#spring.profiles.active=prod #����application-dev�ļ�(��������) spring.profiles.active=dev From 318d0a1441da936afb00179eb4be8dd766815767 Mon Sep 17 00:00:00 2001 From: xupei Date: Wed, 14 Feb 2024 12:37:57 +0800 Subject: [PATCH 14/93] =?UTF-8?q?=E5=85=85=E5=80=BC=E5=8A=9F=E8=83=BD--?= =?UTF-8?q?=E6=8E=A5=E5=85=A5=E6=94=AF=E4=BB=98=E5=AE=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ai/da/common/security/filter/AuthenticationFilter.java | 2 +- src/main/resources/application-dev.properties | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java index dc555916..6efefd84 100644 --- a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java +++ b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java @@ -94,7 +94,7 @@ public class AuthenticationFilter extends OncePerRequestFilter { if (StrUtil.isBlank(jwtToken)) { throw new RuntimeException("请传入token!"); } - if(jwtToken.equals("Bearer Bearer-eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiIyIiwic3ViIjoie1wiaWRcIjoyLFwidXNlcm5hbWVcIjpcImxpcnNcIn0iLCJpYXQiOjE2NjU3NDEwODcsImlzcyI6IkRXSiIsImF1dGhvcml0aWVzIjoiW10iLCJleHAiOjE2NzQzODEwODd9.ShM9R_NNFD7oo1OvxrEgg7PFeWinOuAKkuInUCMQupp66s64Hhv8tN0Wwr83nIN4rHPqtn95wmd4msWcvaFYJA")){ + if(jwtToken.equals("Bearer-eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiIyIiwic3ViIjoie1wiaWRcIjoyLFwidXNlcm5hbWVcIjpcImxpcnNcIn0iLCJpYXQiOjE2NjU3NDEwODcsImlzcyI6IkRXSiIsImF1dGhvcml0aWVzIjoiW10iLCJleHAiOjE2NzQzODEwODd9.ShM9R_NNFD7oo1OvxrEgg7PFeWinOuAKkuInUCMQupp66s64Hhv8tN0Wwr83nIN4rHPqtn95wmd4msWcvaFYJA")){ //写死 暂时放行 return; } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 55672070..d940a1a3 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -15,7 +15,8 @@ spring.security.jwtTokenPrefix=Bearer- spring.security.jwtExpiration=8640000000 #spring security权限设置 认证了token还要认证权限 不然报错Full authentication is required to access this resource spring.security.ignorePaths=/,/favicon.ico,/doc.html,/webjars/**,/swagger-resources,/v2/api-docs,\ - /api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/**,/api/generate/**,/api/workspace/**,/api/classification/** + /api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/**,/api/generate/**,/api/workspace/**,/api/classification/**,\ + /api/product/**,/api/ali-pay/**,/api/order-info/** spring.security.authApi=/auth/login From 87580cfece7ec0cd7ec33c54e80dd093acb513ad Mon Sep 17 00:00:00 2001 From: xupei Date: Thu, 15 Feb 2024 14:03:44 +0800 Subject: [PATCH 15/93] =?UTF-8?q?=E6=8E=A5=E5=85=A5=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E5=AE=9D=20=E8=81=94=E8=B0=83=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ai/da/controller/AliPayController.java | 6 ++++-- src/main/java/com/ai/da/service/AliPayService.java | 2 +- .../java/com/ai/da/service/impl/AliPayServiceImpl.java | 9 +++++---- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ai/da/controller/AliPayController.java b/src/main/java/com/ai/da/controller/AliPayController.java index e098b142..a6f3c20f 100644 --- a/src/main/java/com/ai/da/controller/AliPayController.java +++ b/src/main/java/com/ai/da/controller/AliPayController.java @@ -35,12 +35,14 @@ public class AliPayController { @ApiOperation("统一收单下单并支付页面接口的调用") @PostMapping("/trade/page/pay/{productId}") - public Response tradePagePay(@PathVariable Long productId){ + public Response tradePagePay(@PathVariable Long productId,@RequestParam String returnUrl){ + + System.out.println(productId + " " + returnUrl); log.info("统一收单下单并支付页面接口的调用"); //支付宝开放平台接受 request 请求对象后 // 会为开发者生成一个html 形式的 form表单,包含自动提交的脚本 - String formStr = aliPayService.tradeCreate(productId); + String formStr = aliPayService.tradeCreate(productId, returnUrl); //我们将form表单字符串返回给前端程序,之后前端将会调用自动提交脚本,进行表单的提交 //此时,表单会自动提交到action属性所指向的支付宝开放平台中,从而为用户展示一个支付页面 return Response.success(formStr); diff --git a/src/main/java/com/ai/da/service/AliPayService.java b/src/main/java/com/ai/da/service/AliPayService.java index f2d4e39b..796126a2 100644 --- a/src/main/java/com/ai/da/service/AliPayService.java +++ b/src/main/java/com/ai/da/service/AliPayService.java @@ -3,7 +3,7 @@ package com.ai.da.service; import java.util.Map; public interface AliPayService { - String tradeCreate(Long productId); + String tradeCreate(Long productId,String returnUrl); void processOrder(Map params); diff --git a/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java index a255dbb0..a018ff9d 100644 --- a/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java @@ -50,7 +50,7 @@ public class AliPayServiceImpl implements AliPayService { @Transactional(rollbackFor = Exception.class) @Override - public String tradeCreate(Long productId) { + public String tradeCreate(Long productId, String returnUrl) { try { //生成订单 @@ -60,10 +60,11 @@ public class AliPayServiceImpl implements AliPayService { //调用支付宝接口 AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); //配置需要的公共请求参数 - //支付完成后,支付宝向谷粒学院发起异步通知的地址 + //支付完成后,支付宝发起异步通知的地址 request.setNotifyUrl(config.getProperty("alipay.notify-url")); - //支付完成后,我们想让页面跳转回谷粒学院的页面,配置returnUrl - request.setReturnUrl(config.getProperty("alipay.return-url")); + //支付完成后,我们想让页面跳转回aida的页面,配置returnUrl +// request.setReturnUrl(config.getProperty("alipay.return-url")); + request.setReturnUrl(returnUrl); //组装当前业务方法的请求参数 JSONObject bizContent = new JSONObject(); From fda2a3120b5a396f07e628b2128444e7d261962f Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Thu, 15 Feb 2024 15:19:09 +0800 Subject: [PATCH 16/93] =?UTF-8?q?TASK:=E8=AF=95=E7=94=A8=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ai/da/service/impl/AccountServiceImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java index a386cdc3..4c7507f5 100644 --- a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java @@ -503,7 +503,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setIsTrial(1); account.setIsBeginner(1); account.setValidStartTime(System.currentTimeMillis()); - account.setValidEndTime(Instant.now().plus(3, ChronoUnit.DAYS).toEpochMilli()); + account.setValidEndTime(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()); accountMapper.updateById(account); }else { account.setUserName(trialOrder.getUserName()); @@ -511,7 +511,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setUserEmail(trialOrder.getEmail()); account.setLanguage(Language.ENGLISH.name()); account.setValidStartTime(System.currentTimeMillis()); - account.setValidEndTime(Instant.now().plus(3, ChronoUnit.DAYS).toEpochMilli()); + account.setValidEndTime(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()); account.setCreateDate(new Date()); account.setIsTrial(1); account.setIsBeginner(1); @@ -551,7 +551,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setIsTrial(1); account.setIsBeginner(1); account.setValidStartTime(System.currentTimeMillis()); - account.setValidEndTime(Instant.now().plus(3, ChronoUnit.DAYS).toEpochMilli()); + account.setValidEndTime(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()); accountMapper.updateById(account); }else { account.setUserName(trialOrder.getUserName()); @@ -559,7 +559,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setUserEmail(trialOrder.getEmail()); account.setLanguage(Language.ENGLISH.name()); account.setValidStartTime(System.currentTimeMillis()); - account.setValidEndTime(Instant.now().plus(3, ChronoUnit.DAYS).toEpochMilli()); + account.setValidEndTime(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()); account.setCreateDate(new Date()); account.setIsTrial(1); account.setIsBeginner(1); From 2a73986e64085aa8d6cd398ed641686b9e7439c8 Mon Sep 17 00:00:00 2001 From: xupei Date: Mon, 19 Feb 2024 14:38:18 +0800 Subject: [PATCH 17/93] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=86=85=E7=BD=91?= =?UTF-8?q?=E7=A9=BF=E9=80=8F=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/alipay-sandbox.properties | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/alipay-sandbox.properties b/src/main/resources/alipay-sandbox.properties index 972660de..70b7350b 100644 --- a/src/main/resources/alipay-sandbox.properties +++ b/src/main/resources/alipay-sandbox.properties @@ -30,7 +30,8 @@ alipay.return-url=http://localhost:8080/#/success # 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 # 注意:每次重新启动ngrok,都需要根据实际情况修改这个配置 #alipay.notify-url=https://77ea-221-239-177-21.ngrok.io/api/ali-pay/trade/notify -alipay.notify-url=https://03a3-117-143-125-44.ngrok-free.app/api/ali-pay/trade/notify +#alipay.notify-url=https://03a3-117-143-125-44.ngrok-free.app/api/ali-pay/trade/notify +alipay.notify-url=https://8970-18-167-251-121.ngrok-free.app/api/ali-pay/trade/notify From 35fbd4d865742fab8bcf73e8987127782724f699 Mon Sep 17 00:00:00 2001 From: xupei Date: Mon, 19 Feb 2024 15:26:42 +0800 Subject: [PATCH 18/93] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=86=85=E7=BD=91?= =?UTF-8?q?=E7=A9=BF=E9=80=8F=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/alipay-sandbox.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/alipay-sandbox.properties b/src/main/resources/alipay-sandbox.properties index 70b7350b..45a528e0 100644 --- a/src/main/resources/alipay-sandbox.properties +++ b/src/main/resources/alipay-sandbox.properties @@ -31,7 +31,7 @@ alipay.return-url=http://localhost:8080/#/success # 注意:每次重新启动ngrok,都需要根据实际情况修改这个配置 #alipay.notify-url=https://77ea-221-239-177-21.ngrok.io/api/ali-pay/trade/notify #alipay.notify-url=https://03a3-117-143-125-44.ngrok-free.app/api/ali-pay/trade/notify -alipay.notify-url=https://8970-18-167-251-121.ngrok-free.app/api/ali-pay/trade/notify +alipay.notify-url=https://3b38-18-167-251-121.ngrok-free.app/api/ali-pay/trade/notify From 68f6ae2a8d34fdb67f9da461de9869e4aee43954 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Tue, 20 Feb 2024 10:12:44 +0800 Subject: [PATCH 19/93] TASK:design new; --- pom.xml | 7 + .../da/common/config/CRMReportInterface.java | 393 ++++++ .../enums/CurrentDesignPictureTypeEnum.java | 6 +- .../com/ai/da/common/utils/RandomsUtil.java | 4 + .../ai/da/controller/AccountController.java | 5 +- .../ai/da/controller/DesignController.java | 1 + .../da/mapper/primary/CollocationMapper.java | 13 + .../ai/da/mapper/primary/DressingMapper.java | 11 + .../{ => primary}/GenerateCancelMapper.java | 4 +- .../{ => primary}/LibraryCopyMapper.java | 5 +- .../LibraryModelPointCopyMapper.java | 5 +- .../da/mapper/primary/entity/BaseEntity.java | 44 + .../da/mapper/primary/entity/Collocation.java | 50 + .../mapper/primary/entity/CustomerData.java | 23 + .../entity/Dressing.java} | 23 +- .../mapper/primary/entity/GenerateCancel.java | 2 +- .../da/mapper/primary/entity/LibraryCopy.java | 83 ++ .../primary/entity/LibraryModelPointCopy.java | 81 ++ .../primary/entity/TransactionData.java | 149 +++ .../secondary/AttributeRetrievalMapper.java | 25 + .../mapper/secondary/FemaleDressMapper.java | 16 - .../entity/AttributeRecognitionJSON.java | 22 + .../secondary/entity/AttributeRetrieval.java | 24 + .../java/com/ai/da/python/PythonService.java | 1057 +++++++++++++---- .../com/ai/da/service/AccountService.java | 1 - .../da/service/impl/AccountServiceImpl.java | 3 - .../da/service/impl/GenerateServiceImpl.java | 10 +- .../da/service/impl/LibraryServiceImpl.java | 3 +- src/main/resources/application-dev.properties | 26 +- .../resources/application-test.properties | 2 +- .../mapper/primary/CollocationMapper.xml | 30 + .../mapper/primary/DressingMapper.xml | 26 + .../secondary/AttributeRetrievalMapper.xml | 68 ++ .../mapper/secondary/FemaleDressMapper.xml | 8 - 34 files changed, 1914 insertions(+), 316 deletions(-) create mode 100644 src/main/java/com/ai/da/common/config/CRMReportInterface.java create mode 100644 src/main/java/com/ai/da/mapper/primary/CollocationMapper.java create mode 100644 src/main/java/com/ai/da/mapper/primary/DressingMapper.java rename src/main/java/com/ai/da/mapper/{ => primary}/GenerateCancelMapper.java (60%) rename src/main/java/com/ai/da/mapper/{ => primary}/LibraryCopyMapper.java (65%) rename src/main/java/com/ai/da/mapper/{ => primary}/LibraryModelPointCopyMapper.java (63%) create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/Collocation.java create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/CustomerData.java rename src/main/java/com/ai/da/mapper/{secondary/entity/FemaleDress.java => primary/entity/Dressing.java} (55%) create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/LibraryCopy.java create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/LibraryModelPointCopy.java create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/TransactionData.java create mode 100644 src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java delete mode 100644 src/main/java/com/ai/da/mapper/secondary/FemaleDressMapper.java create mode 100644 src/main/java/com/ai/da/mapper/secondary/entity/AttributeRecognitionJSON.java create mode 100644 src/main/java/com/ai/da/mapper/secondary/entity/AttributeRetrieval.java create mode 100644 src/main/resources/mapper/primary/CollocationMapper.xml create mode 100644 src/main/resources/mapper/primary/DressingMapper.xml create mode 100644 src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml delete mode 100644 src/main/resources/mapper/secondary/FemaleDressMapper.xml diff --git a/pom.xml b/pom.xml index 14913240..af34168f 100644 --- a/pom.xml +++ b/pom.xml @@ -158,6 +158,13 @@ 1.4 + + com.microsoft.sqlserver + mssql-jdbc + 9.2.1.jre8 + + + org.springframework.boot diff --git a/src/main/java/com/ai/da/common/config/CRMReportInterface.java b/src/main/java/com/ai/da/common/config/CRMReportInterface.java new file mode 100644 index 00000000..3714d11d --- /dev/null +++ b/src/main/java/com/ai/da/common/config/CRMReportInterface.java @@ -0,0 +1,393 @@ +package com.ai.da.common.config; + +import com.ai.da.mapper.primary.entity.CustomerData; +import com.ai.da.mapper.primary.entity.TransactionData; + +import java.io.FileWriter; +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class CRMReportInterface { + + // JDBC 驱动器名称以及数据库 URL + static final String JDBC_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; + static final String DB_URL = "jdbc:sqlserver://118.142.0.178:1550;databaseName=Hayman_prod"; + + // 数据库凭据 + static final String USER = "user01"; + static final String PASS = "haySIS-2302"; + + public static void main(String[] args) { + Connection conn = null; + Statement stmt = null; + try { + // 注册 JDBC 驱动器 + Class.forName(JDBC_DRIVER); + + // 打开一个连接 + System.out.println("连接数据库..."); + conn = DriverManager.getConnection(DB_URL, USER, PASS); + + // 执行查询步骤1: 生成 RW0095 报告以获取客户完整数据 + System.out.println("执行步骤1:生成 RW0095 报告..."); + // 执行相应的查询并获取数据 +// List customerData = retrieveCustomerData(); + // 执行查询步骤2: 使用 MZG013 报告检查客户的销售历史 + System.out.println("执行步骤2:使用 MZG013 报告检查客户的销售历史..."); + // 执行相应的查询并获取数据 + List transactionData = retrieveTransactionData(); + List collect = transactionData.stream().map(TransactionData::getUserMember).collect(Collectors.toList()); + List customerData = retrieveCustomerData(collect); + for (TransactionData transactionDatum : transactionData) { + for (CustomerData customerDatum : customerData) { + if (customerDatum.getMbrCode().equals(transactionDatum.getUserMember())) { + customerDatum.setLastMonth(transactionDatum.getSumAmt()); + break; + } + } + } + // 执行步骤3: 合并(vlookup)RW0095中的客户购买金额 + System.out.println("执行步骤3:合并客户购买金额..."); + // 执行相应的操作,如vlookup + + // 执行步骤4: 按“发行店”筛选以分离不同文件并逐个发送给店铺 + System.out.println("执行步骤4:按发行店筛选并发送文件给店铺..."); + // 执行相应的操作,如过滤和导出 + String filePath = "C:\\Users\\10233\\Desktop\\CRM.csv"; + exportToCSV(customerData, filePath); + // 关闭连接 + conn.close(); + } catch (SQLException se) { + // 处理 JDBC 错误 + se.printStackTrace(); + } catch (Exception e) { + // 处理 Class.forName 错误 + e.printStackTrace(); + } finally { + // 关闭资源 + try { + if (stmt != null) stmt.close(); + } catch (SQLException se2) { + } // 什么都不做 + try { + if (conn != null) conn.close(); + } catch (SQLException se) { + se.printStackTrace(); + } + } + System.out.println("接口执行完成!"); + } + + private static void exportToCSV(List customerDataList, String filePath) throws IOException { + FileWriter writer = new FileWriter(filePath); + +// // 写入 CSV 文件的第一行,即字段名 +// writer.append("User Member,Mbr Name,Sh Code,Sum Amt\n"); +// +// // 遍历数据列表,并将每一行数据写入 CSV 文件 +// for (TransactionData transaction : transactionDataList) { +// writer.append(transaction.getUserMember()).append(","); +// writer.append(transaction.getMbrName()).append(","); +// writer.append(transaction.getShCode()).append(","); +// writer.append(String.valueOf(transaction.getSumAmt())).append("\n"); +// } + writer.append("mbrCode,mbrName,mbrMobile,mbrGroup,mbrStatus,joinDate,mbrIssue,birthMonth,mbrSex,offBonus,effBonus,sumBonus,lastMonth\n"); + + // 遍历 customerDataList,并将数据写入 CSV 文件 + for (CustomerData customer : customerDataList) { + writer.append(customer.getMbrCode()).append(","); + writer.append(customer.getMbrName()).append(","); + writer.append(customer.getMbrMobile()).append(","); + writer.append(customer.getMbrGroup()).append(","); + writer.append(customer.getMbrStatus()).append(","); + writer.append(customer.getJoinDate().toString()).append(","); // 日期需要根据实际情况格式化 + writer.append(customer.getMbrIssue()).append(","); + writer.append(Integer.toString(customer.getBirthMonth())).append(","); + writer.append(customer.getMbrSex()).append(","); + writer.append(Double.toString(customer.getOffBonus())).append(","); + writer.append(Double.toString(customer.getEffBonus())).append(","); + writer.append(Double.toString(customer.getSumBonus())).append(","); + writer.append(Double.toString(customer.getLastMonth())).append("\n"); + } + + writer.close(); + } + + public static List retrieveCustomerData(List collect) { + List customerDataList = new ArrayList<>(); + Connection conn = null; + Statement stmt = null; + try { + // 注册 JDBC 驱动器 + Class.forName(JDBC_DRIVER); + + // 打开一个连接 + System.out.println("连接数据库..."); + conn = DriverManager.getConnection(DB_URL, USER, PASS); + + // 执行查询 + System.out.println("创建声明..."); + stmt = conn.createStatement(); + String sql; + // 构建 IN 子句的字符串,用于添加到 SQL 查询中 + StringBuilder inClause = new StringBuilder("("); + for (String code : collect) { + inClause.append("'").append(code).append("',"); + } + inClause.deleteCharAt(inClause.length() - 1); // 删除最后一个逗号 + inClause.append(")"); + + // 构建完整的 SQL 查询语句 + sql = "SELECT * FROM V_RW0095B WHERE mbr_code IN " + inClause.toString(); + ResultSet rs = stmt.executeQuery(sql); + + + // 处理结果集 + while (rs.next()) { + // 将每行数据转换为 CustomerData 对象并添加到列表中 + CustomerData customer = new CustomerData(); + customer.setMbrCode(rs.getString("mbr_code")); + customer.setMbrName(rs.getString("mbr_name")); + customer.setMbrMobile(rs.getString("mbr_mobile")); + customer.setMbrGroup(rs.getString("mbr_group")); + customer.setMbrStatus(rs.getString("mbr_status")); + customer.setJoinDate(rs.getDate("join_date")); + customer.setMbrIssue(rs.getString("mbr_issue")); + customer.setBirthMonth(rs.getInt("birth_m")); + customer.setMbrSex(rs.getString("mbr_sex")); + customer.setOffBonus(rs.getDouble("off_bonus")); + customer.setEffBonus(rs.getDouble("eff_bonus")); + customer.setSumBonus(rs.getDouble("sum_bonus")); + customerDataList.add(customer); + + } + + // 清理环境 + rs.close(); + stmt.close(); + conn.close(); + } catch (SQLException se) { + // 处理 JDBC 错误 + se.printStackTrace(); + } catch (Exception e) { + // 处理 Class.forName 错误 + e.printStackTrace(); + } finally { + // 关闭资源 + try { + if (stmt != null) stmt.close(); + } catch (SQLException se2) { + } // 什么都不做 + try { + if (conn != null) conn.close(); + } catch (SQLException se) { + se.printStackTrace(); + } + } + System.out.println("查询执行完成!"); + return customerDataList; + } + + public static List retrieveTransactionData() { + List transactionDataList = new ArrayList<>(); + Connection conn = null; + Statement stmt = null; + try { + // 注册 JDBC 驱动器 + Class.forName(JDBC_DRIVER); + + // 打开一个连接 + System.out.println("连接数据库..."); + conn = DriverManager.getConnection(DB_URL, USER, PASS); + + // 执行查询 + System.out.println("创建声明..."); + stmt = conn.createStatement(); + String sql; + sql = "SELECT user_member,mbr_name,sum(trx_bas_amt) sumAmtByMebBySh FROM V_MZG013\n" + + "WHERE trx_date >= DATEADD(day, -7, GETDATE())\n" + + "and user_member is not NULL\n" + + "GROUP BY user_member,mbr_name"; + ResultSet rs = stmt.executeQuery(sql); + + // 处理结果集 + while (rs.next()) { + // 将每行数据转换为 TransactionData 对象并添加到列表中 + TransactionData transaction = new TransactionData(); + transaction.setUserMember(rs.getString("user_member")); + transaction.setMbrName(rs.getString("mbr_name")); +// transaction.setShCode(rs.getString("sh_code")); + transaction.setSumAmt(rs.getDouble("sumAmtByMebBySh")); +// transaction.setTrxNo(rs.getString("trx_no")); +// transaction.setTrxDate(rs.getTimestamp("trx_date")); +// transaction.setTrxType(rs.getString("trx_type")); +// transaction.setTrxStatus(rs.getString("trx_status")); +// transaction.setTrxTotQty(rs.getDouble("trx_tot_qty")); +// transaction.setCurrCode(rs.getString("curr_code")); +// transaction.setExchRate(rs.getDouble("exch_rate")); +// transaction.setDiscountPerc(rs.getDouble("discount_perc")); +// transaction.setTrxAccAmt(rs.getDouble("trx_acc_amt")); +// transaction.setTrxBasAmt(rs.getDouble("trx_bas_amt")); +// transaction.setOutstandAmt(rs.getDouble("outstand_amt")); +// transaction.setReceiveAmt(rs.getDouble("receive_amt")); +// transaction.setChangeAmt(rs.getDouble("change_amt")); +// transaction.setTrxTotBonus(rs.getDouble("trx_tot_bonus")); +// transaction.setDepositNo(rs.getString("deposit_no")); +// transaction.setDepositAmt(rs.getDouble("deposit_amt")); +// transaction.setDepositStatus(rs.getString("deposit_status")); +// transaction.setTrxAmtDesc(rs.getString("trx_amt_desc")); +// transaction.setRemark(rs.getString("remark")); +// transaction.setShCode(rs.getString("sh_code")); +// transaction.setWhCodeFrom(rs.getString("wh_code_from")); +// transaction.setWhCodeTo(rs.getString("wh_code_to")); +// transaction.setIssuedBy(rs.getString("issued_by")); +// transaction.setClientCode(rs.getString("client_code")); +// transaction.setClientName(rs.getString("client_name")); +// transaction.setSalesmanCode(rs.getString("salesman_code")); +// transaction.setCtypeCode(rs.getString("ctype_code")); +// transaction.setUpdatedOn(rs.getTimestamp("updated_on")); +// transaction.setDocType(rs.getString("doc_type")); +// transaction.setRefNo(rs.getString("ref_no")); +// transaction.setAdjType(rs.getString("adj_type")); +// transaction.setRefType(rs.getString("ref_type")); +// transaction.setOrderNo(rs.getString("order_no")); +// transaction.setRecoverF(rs.getString("recover_f")); +// transaction.setRecoverT(rs.getString("recover_t")); +// transaction.setRequestBy(rs.getString("request_by")); +// transaction.setError(rs.getString("error")); +// transaction.setAuthorizedDate(rs.getTimestamp("authorized_date")); +// transaction.setAuthorizedBy(rs.getString("authorized_by")); +// transaction.setChangeCurrCode(rs.getString("change_curr_code")); +// transaction.setChgRate(rs.getDouble("chg_rate")); +// transaction.setCashier(rs.getString("cashier")); +// transaction.setCashiNo(rs.getString("cashi_no")); +// transaction.setSalesmanCode2(rs.getString("salesman_code2")); +// transaction.setClassId(rs.getString("class_id")); +// transaction.setDisAmt(rs.getDouble("dis_amt")); +// transaction.setAcStatus(rs.getString("ac_status")); +// transaction.setReprint(rs.getString("reprint")); +// transaction.setAlt1(rs.getString("alt_1")); +// transaction.setAlt2(rs.getString("alt_2")); +// transaction.setAlt3(rs.getString("alt_3")); +// transaction.setAlt4(rs.getString("alt_4")); +// transaction.setAlt5(rs.getString("alt_5")); +// transaction.setAltD1(rs.getDate("alt_d1")); +// transaction.setAltD2(rs.getDate("alt_d2")); +// transaction.setAltD3(rs.getDate("alt_d3")); +// transaction.setAltD4(rs.getDate("alt_d4")); +// transaction.setAltD5(rs.getDate("alt_d5")); +// transaction.setSalesmanCode3(rs.getString("salesman_code3")); +// transaction.setContractNo(rs.getString("contract_no")); +// transaction.setExpireDate(rs.getTimestamp("expire_date")); +// transaction.setDepositNetAmt(rs.getDouble("deposit_netamt")); +// transaction.setClientRestriction(rs.getString("client_restriction")); +// transaction.setRefStatus(rs.getString("ref_status")); +// transaction.setMbrDis(rs.getDouble("mbr_dis")); +// transaction.setPmtDiscount(rs.getDouble("pmt_discount")); +// transaction.setPmtAmount(rs.getDouble("pmt_amount")); +// transaction.setPmtNo(rs.getString("pmt_no")); +// transaction.setRefCode(rs.getString("ref_code")); +// transaction.setDocApproved(rs.getString("doc_approved")); +// transaction.setRefractionNo(rs.getString("refraction_no")); +// transaction.setCcpTot(rs.getDouble("ccp_tot")); +// transaction.setCcpRed(rs.getDouble("ccp_red")); +// transaction.setCcpExpired(rs.getDouble("ccp_expired")); +// transaction.setPrintedTimes(rs.getInt("printed_times")); +// transaction.setPickupShop(rs.getString("pickup_shop")); +// transaction.setDeliveryDate(rs.getDate("delivery_date")); +// transaction.setDeliveryTime(rs.getString("delivery_time")); +// transaction.setWsCode(rs.getString("ws_code")); +// transaction.setClCode(rs.getString("cl_code")); +// transaction.setClDesc(rs.getString("cl_desc")); +// transaction.setRatio(rs.getString("ratio")); +// transaction.setUserMember(rs.getString("user_member")); +// transaction.setHflag(rs.getString("hflag")); +// transaction.setIssueShop(rs.getString("issue_shop")); +// transaction.setHoUpdBy(rs.getString("ho_upd_by")); +// transaction.setHoUpdOn(rs.getTimestamp("ho_upd_on")); +// transaction.setBonusExpired(rs.getDouble("bonus_expired")); +// transaction.setBonusRed(rs.getDouble("bonus_red")); +// transaction.setConfirmedOn(rs.getTimestamp("confirmed_on")); +// transaction.setConfirmedBy(rs.getString("confirmed_by")); +// transaction.setDocConfirmed(rs.getString("doc_confirmed")); +// transaction.setBrNo(rs.getString("br_no")); +// transaction.setChangeAmt2(rs.getDouble("change_amt2")); +// transaction.setSalesDate(rs.getDate("sales_date")); +// transaction.setMbrName(rs.getString("mbr_name")); +// transaction.setCanEntryDis(rs.getString("can_entry_dis")); +// transaction.setReactiveClient(rs.getString("reactive_client")); +// transaction.setReactiveMbr(rs.getString("reactive_mbr")); +// transaction.setShUpdBy(rs.getString("sh_upd_by")); +// transaction.setShUpdOn(rs.getTimestamp("sh_upd_on")); +// transaction.setTax1(rs.getDouble("tax1")); +// transaction.setTax2(rs.getDouble("tax2")); +// transaction.setTax3(rs.getDouble("tax3")); +// transaction.setTax4(rs.getDouble("tax4")); +// transaction.setTax5(rs.getDouble("tax5")); +// transaction.setAltChar1(rs.getString("alt_char1")); +// transaction.setAltChar2(rs.getString("alt_char2")); +// transaction.setAltChar3(rs.getString("alt_char3")); +// transaction.setAltChar4(rs.getString("alt_char4")); +// transaction.setAltChar5(rs.getString("alt_char5")); +// transaction.setAltNum1(rs.getDouble("alt_num1")); +// transaction.setAltNum2(rs.getDouble("alt_num2")); +// transaction.setAltNum3(rs.getDouble("alt_num3")); +// transaction.setAltNum4(rs.getDouble("alt_num4")); +// transaction.setAltNum5(rs.getDouble("alt_num5")); +// transaction.setNewClient(rs.getString("new_client")); +// transaction.setNewMbr(rs.getString("new_mbr")); +// transaction.setPmtExtraDiscount(rs.getDouble("pmt_extra_discount")); +// transaction.setPmtExtraAmount(rs.getDouble("pmt_extra_amount")); +// transaction.setManualDiscount(rs.getDouble("manual_discount")); +// transaction.setManualAmount(rs.getDouble("manual_amount")); +// transaction.setUsermbrDiscount(rs.getDouble("usermbr_discount")); +// transaction.setClientDiscount(rs.getDouble("client_discount")); +// transaction.setHoldVoid(rs.getString("hold_void")); +// transaction.setPayBasAmt(rs.getDouble("pay_bas_amt")); +// transaction.setPayDesc(rs.getString("pay_desc")); +// transaction.setPayCode(rs.getString("pay_code")); +// transaction.setCardNo(rs.getString("card_no")); +// transaction.setPayCurr(rs.getString("pay_curr")); +// transaction.setPayCurrAmt(rs.getDouble("pay_curr_amt")); +// transaction.setOnbehalfPaid(rs.getString("onbehalf_paid")); +// transaction.setOnbehalfLoc(rs.getString("onbehalf_loc")); +// transaction.setOldCardNo(rs.getString("old_card_no")); +// transaction.setTrxYear(rs.getInt("TRX_YEAR")); +// transaction.setTrxMonth(rs.getInt("TRX_MONTH")); + + transactionDataList.add(transaction); + } + + + // 清理环境 + rs.close(); + stmt.close(); + conn.close(); + } catch (SQLException | ClassNotFoundException e) { + // 处理异常 + e.printStackTrace(); + } + System.out.println("查询执行完成!"); + return transactionDataList; + } + + // 示例:导出数据到CSV文件 + private static void exportToCSV(ResultSet resultSet, String filePath) throws SQLException, IOException { + FileWriter writer = new FileWriter(filePath); + + while (resultSet.next()) { + // 将结果写入CSV文件 + // 这里需要根据实际情况将数据写入CSV文件 + } + + writer.close(); + } +} + diff --git a/src/main/java/com/ai/da/common/enums/CurrentDesignPictureTypeEnum.java b/src/main/java/com/ai/da/common/enums/CurrentDesignPictureTypeEnum.java index d254997d..259d93ce 100644 --- a/src/main/java/com/ai/da/common/enums/CurrentDesignPictureTypeEnum.java +++ b/src/main/java/com/ai/da/common/enums/CurrentDesignPictureTypeEnum.java @@ -20,15 +20,15 @@ public enum CurrentDesignPictureTypeEnum { /** * USER_LIBRARY */ - USER_LIBRARY(2, "userLibrary"), +// USER_LIBRARY(2, "userLibrary"), /** * SYS_FILE */ - SYS_FILE(3, "sysFile"), + SYS_FILE(2, "sysFile"), /** * noPIN */ - NO_PIN(4, "noPIN"); + NO_PIN(3, "noPIN"); private Integer code; private String desc; diff --git a/src/main/java/com/ai/da/common/utils/RandomsUtil.java b/src/main/java/com/ai/da/common/utils/RandomsUtil.java index fd4b352f..dc68ec90 100644 --- a/src/main/java/com/ai/da/common/utils/RandomsUtil.java +++ b/src/main/java/com/ai/da/common/utils/RandomsUtil.java @@ -48,5 +48,9 @@ public class RandomsUtil { return RandomUtil.randomLong(randomStart, randomEnd); } + public static Integer randomSysFile(Integer randomEnd) { + return RandomUtil.randomInt(randomEnd); + } + } diff --git a/src/main/java/com/ai/da/controller/AccountController.java b/src/main/java/com/ai/da/controller/AccountController.java index d9ed7803..ce1cd82f 100644 --- a/src/main/java/com/ai/da/controller/AccountController.java +++ b/src/main/java/com/ai/da/controller/AccountController.java @@ -2,13 +2,10 @@ package com.ai.da.controller; import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.Response; -import com.ai.da.common.security.jwt.JWTTokenHelper; -import com.ai.da.mapper.entity.TrialOrder; +import com.ai.da.mapper.primary.entity.TrialOrder; import com.ai.da.model.dto.*; -import com.ai.da.model.enums.Language; import com.ai.da.model.vo.AccountLoginVO; import com.ai.da.model.vo.AccountPreLoginVO; -import com.ai.da.model.vo.QueryLibraryPageVO; import com.ai.da.service.AccountService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; diff --git a/src/main/java/com/ai/da/controller/DesignController.java b/src/main/java/com/ai/da/controller/DesignController.java index b36cf6f9..87fe11a6 100644 --- a/src/main/java/com/ai/da/controller/DesignController.java +++ b/src/main/java/com/ai/da/controller/DesignController.java @@ -30,6 +30,7 @@ public class DesignController { @ApiOperation(value = "设计 Conllection") @PostMapping("/designCollection") + @CrossOrigin public Response designCollection(@Valid @RequestBody DesignCollectionDTO designDTO) { return Response.success(designService.designCollection(designDTO)); } diff --git a/src/main/java/com/ai/da/mapper/primary/CollocationMapper.java b/src/main/java/com/ai/da/mapper/primary/CollocationMapper.java new file mode 100644 index 00000000..7e9af210 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/CollocationMapper.java @@ -0,0 +1,13 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.Collection; +import com.ai.da.mapper.primary.entity.Collocation; +import com.ai.da.python.vo.DesignPythonItem; + +import java.util.List; + +public interface CollocationMapper extends CommonMapper { + + List getCollocationListBySketch(String apparel, String styleCategory); +} \ No newline at end of file diff --git a/src/main/java/com/ai/da/mapper/primary/DressingMapper.java b/src/main/java/com/ai/da/mapper/primary/DressingMapper.java new file mode 100644 index 00000000..ca0f5bf5 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/DressingMapper.java @@ -0,0 +1,11 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.Dressing; + +import java.util.List; + +public interface DressingMapper extends CommonMapper { + + List getOtherSketchCategoryNameList(Long id, String styleCategory); +} diff --git a/src/main/java/com/ai/da/mapper/GenerateCancelMapper.java b/src/main/java/com/ai/da/mapper/primary/GenerateCancelMapper.java similarity index 60% rename from src/main/java/com/ai/da/mapper/GenerateCancelMapper.java rename to src/main/java/com/ai/da/mapper/primary/GenerateCancelMapper.java index 3e24ea09..3a9cfee8 100644 --- a/src/main/java/com/ai/da/mapper/GenerateCancelMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/GenerateCancelMapper.java @@ -1,7 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.GenerateCancel; +import com.ai.da.mapper.primary.entity.GenerateCancel; public interface GenerateCancelMapper extends CommonMapper { } diff --git a/src/main/java/com/ai/da/mapper/LibraryCopyMapper.java b/src/main/java/com/ai/da/mapper/primary/LibraryCopyMapper.java similarity index 65% rename from src/main/java/com/ai/da/mapper/LibraryCopyMapper.java rename to src/main/java/com/ai/da/mapper/primary/LibraryCopyMapper.java index 3cec4a2e..6d7954a4 100644 --- a/src/main/java/com/ai/da/mapper/LibraryCopyMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/LibraryCopyMapper.java @@ -1,8 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.Library; -import com.ai.da.mapper.entity.LibraryCopy; +import com.ai.da.mapper.primary.entity.LibraryCopy; /** * Mapper 接口 diff --git a/src/main/java/com/ai/da/mapper/LibraryModelPointCopyMapper.java b/src/main/java/com/ai/da/mapper/primary/LibraryModelPointCopyMapper.java similarity index 63% rename from src/main/java/com/ai/da/mapper/LibraryModelPointCopyMapper.java rename to src/main/java/com/ai/da/mapper/primary/LibraryModelPointCopyMapper.java index 05447f66..93767df6 100644 --- a/src/main/java/com/ai/da/mapper/LibraryModelPointCopyMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/LibraryModelPointCopyMapper.java @@ -1,8 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.entity.LibraryModelPoint; -import com.ai.da.mapper.entity.LibraryModelPointCopy; +import com.ai.da.mapper.primary.entity.LibraryModelPointCopy; /** * Mapper 接口 diff --git a/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java b/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java new file mode 100644 index 00000000..862feb59 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java @@ -0,0 +1,44 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = false) +public class BaseEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private Long id; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; + + /** + * 是否已删除 + */ + private Integer isDeleted; + + /** + * 用户ID + */ +// private Long userId; + +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Collocation.java b/src/main/java/com/ai/da/mapper/primary/entity/Collocation.java new file mode 100644 index 00000000..cbc6edba --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/Collocation.java @@ -0,0 +1,50 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("collocation") +public class Collocation implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + */ + private String name; + + /** + * mood模板id + */ + private Integer isSystem; + + private Long userId; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; + + private Integer isDeleted; +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/CustomerData.java b/src/main/java/com/ai/da/mapper/primary/entity/CustomerData.java new file mode 100644 index 00000000..0056e030 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/CustomerData.java @@ -0,0 +1,23 @@ +package com.ai.da.mapper.primary.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class CustomerData { + private String mbrCode; + private String mbrName; + private String mbrMobile; + private String mbrGroup; + private String mbrStatus; + private Date joinDate; + private String mbrIssue; + private int birthMonth; + private String mbrSex; + private double offBonus; + private double effBonus; + private double sumBonus; + + private double lastMonth; +} diff --git a/src/main/java/com/ai/da/mapper/secondary/entity/FemaleDress.java b/src/main/java/com/ai/da/mapper/primary/entity/Dressing.java similarity index 55% rename from src/main/java/com/ai/da/mapper/secondary/entity/FemaleDress.java rename to src/main/java/com/ai/da/mapper/primary/entity/Dressing.java index 7c64bd9f..306d39bc 100644 --- a/src/main/java/com/ai/da/mapper/secondary/entity/FemaleDress.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Dressing.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.secondary.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -8,18 +8,23 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; +import java.util.Date; @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) -@TableName("female_dress") -public class FemaleDress implements Serializable { +@TableName("dressing") +public class Dressing implements Serializable { + private static final long serialVersionUID = 1L; - /** - * ID - */ - @TableId(value = "ID", type = IdType.AUTO) + @TableId(value = "id", type = IdType.AUTO) private Long id; - private String imgName; -} \ No newline at end of file + + private String apparel; + private String styleCategory; + private String ageGroup; + private String position; + private Integer priority; + +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/GenerateCancel.java b/src/main/java/com/ai/da/mapper/primary/entity/GenerateCancel.java index 8726b9ed..efa0d7c9 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/GenerateCancel.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/GenerateCancel.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/src/main/java/com/ai/da/mapper/primary/entity/LibraryCopy.java b/src/main/java/com/ai/da/mapper/primary/entity/LibraryCopy.java new file mode 100644 index 00000000..42171cec --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/LibraryCopy.java @@ -0,0 +1,83 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-06-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_library_copy") +public class LibraryCopy implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + */ + private Long accountId; + + /** + * 一级类型 + */ + private String level1Type; + + /** + * 二级类型 + */ + private String level2Type; + + private String level3Type; + + /** + * 元素名 + */ + private String name; + + /** + * 元素存放地址 + */ + private String url; + /** + * md5值 + */ + private String md5; + /** + * 图片高度,目前只争对 models类型 + */ + private Integer high; + /** + * 图片宽度,目前只争对 models类型 + */ + private Integer width; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; + +// private Integer isCopy; +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/LibraryModelPointCopy.java b/src/main/java/com/ai/da/mapper/primary/entity/LibraryModelPointCopy.java new file mode 100644 index 00000000..a14b5579 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/LibraryModelPointCopy.java @@ -0,0 +1,81 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * Attendance + * + * @author easy-generator + * @since 2022-11-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_library_model_point_copy") +public class LibraryModelPointCopy implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * modelType + */ + private String modelType; + + /** + * 关联的 library或sys Id + */ + private Long libraryId; + + /** + * 左肩 + */ + private String shoulderLeft; + + /** + * 右肩 + */ + private String shoulderRight; + + /** + * 左腰 + */ + private String waistbandLeft; + + /** + * 右腰 + */ + private String waistbandRight; + /** + * 左手 + */ + private String handLeft; + + /** + * 右手 + */ + private String handRight; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 更新时间 + */ + private Date updateDate; +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/TransactionData.java b/src/main/java/com/ai/da/mapper/primary/entity/TransactionData.java new file mode 100644 index 00000000..8209be65 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/TransactionData.java @@ -0,0 +1,149 @@ +package com.ai.da.mapper.primary.entity; + +import lombok.Data; + +import java.sql.Date; +import java.sql.Timestamp; + +@Data +public class TransactionData { + private String trxNo; + private Timestamp trxDate; + private String trxType; + private String trxStatus; + private double trxTotQty; + private String currCode; + private double exchRate; + private double discountPerc; + private double trxAccAmt; + private double trxBasAmt; + private double outstandAmt; + private double receiveAmt; + private double changeAmt; + private double trxTotBonus; + private String depositNo; + private double depositAmt; + private String depositStatus; + private String trxAmtDesc; + private String remark; + private String shCode; + private String whCodeFrom; + private String whCodeTo; + private String issuedBy; + private String clientCode; + private String clientName; + private String salesmanCode; + private String ctypeCode; + private Timestamp updatedOn; + private String docType; + private String refNo; + private String adjType; + private String refType; + private String orderNo; + private String recoverF; + private String recoverT; + private String requestBy; + private String error; + private Timestamp authorizedDate; + private String authorizedBy; + private String changeCurrCode; + private double chgRate; + private String cashier; + private String cashiNo; + private String salesmanCode2; + private String classId; + private double disAmt; + private String acStatus; + private String reprint; + private String alt1; + private String alt2; + private String alt3; + private String alt4; + private String alt5; + private Date altD1; + private Date altD2; + private Date altD3; + private Date altD4; + private Date altD5; + private String salesmanCode3; + private String contractNo; + private Timestamp expireDate; + private double depositNetAmt; + private String clientRestriction; + private String refStatus; + private double mbrDis; + private double pmtDiscount; + private double pmtAmount; + private String pmtNo; + private String refCode; + private String docApproved; + private String refractionNo; + private double ccpTot; + private double ccpRed; + private double ccpExpired; + private int printedTimes; + private String pickupShop; + private Date deliveryDate; + private String deliveryTime; + private String wsCode; + private String clCode; + private String clDesc; + private String ratio; + private String userMember; + private String hflag; + private String issueShop; + private String hoUpdBy; + private Timestamp hoUpdOn; + private double bonusExpired; + private double bonusRed; + private Timestamp confirmedOn; + private String confirmedBy; + private String docConfirmed; + private String brNo; + private double changeAmt2; + private Date salesDate; + private String mbrName; + private String canEntryDis; + private String reactiveClient; + private String reactiveMbr; + private String shUpdBy; + private Timestamp shUpdOn; + private double tax1; + private double tax2; + private double tax3; + private double tax4; + private double tax5; + private String altChar1; + private String altChar2; + private String altChar3; + private String altChar4; + private String altChar5; + private double altNum1; + private double altNum2; + private double altNum3; + private double altNum4; + private double altNum5; + private String newClient; + private String newMbr; + private double pmtExtraDiscount; + private double pmtExtraAmount; + private double manualDiscount; + private double manualAmount; + private double usermbrDiscount; + private double clientDiscount; + private String holdVoid; + private double payBasAmt; + private String payDesc; + private String payCode; + private String cardNo; + private String payCurr; + private double payCurrAmt; + private String onbehalfPaid; + private String onbehalfLoc; + private String oldCardNo; + private int trxYear; + private int trxMonth; + + private double sumAmt; +} + diff --git a/src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java b/src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java new file mode 100644 index 00000000..cd657a7e --- /dev/null +++ b/src/main/java/com/ai/da/mapper/secondary/AttributeRetrievalMapper.java @@ -0,0 +1,25 @@ +package com.ai.da.mapper.secondary; + +import com.ai.da.mapper.secondary.entity.AttributeRetrieval; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ + +@Mapper +public interface AttributeRetrievalMapper { + + + List getSystemSketchPool(@Param("attributeRetrievalAttrDict") AttributeRetrieval attributeRetrievalAttrDict, @Param("tableName") String tableName, @Param("poolNum") int poolNum); + + AttributeRetrieval getSystemRandom(String tableName); + + List getSystemSketchPoolBySameCategory(AttributeRetrieval attributeRetrievalAttrDict, String tableName); +} diff --git a/src/main/java/com/ai/da/mapper/secondary/FemaleDressMapper.java b/src/main/java/com/ai/da/mapper/secondary/FemaleDressMapper.java deleted file mode 100644 index 4f63c7a7..00000000 --- a/src/main/java/com/ai/da/mapper/secondary/FemaleDressMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.ai.da.mapper.secondary; - -import com.ai.da.common.config.mybatis.plus.CommonMapper; -import com.ai.da.mapper.secondary.entity.FemaleDress; - -/** - * Mapper 接口 - * - * @author easy-generator - * @since 2022-06-13 - */ -public interface FemaleDressMapper extends CommonMapper { - - - -} diff --git a/src/main/java/com/ai/da/mapper/secondary/entity/AttributeRecognitionJSON.java b/src/main/java/com/ai/da/mapper/secondary/entity/AttributeRecognitionJSON.java new file mode 100644 index 00000000..a04f4e4b --- /dev/null +++ b/src/main/java/com/ai/da/mapper/secondary/entity/AttributeRecognitionJSON.java @@ -0,0 +1,22 @@ +package com.ai.da.mapper.secondary.entity; + +import lombok.Data; + +import java.util.List; + +@Data +public class AttributeRecognitionJSON { + private Long id; + private List imgName; + private List length; + private List sleeveLength; + private List sleeveShape; + private List sleeveShoulder; + private List neckline; + private List collar; + private List design; + private List silhouette; + private List type; + private List openingType; + private List subtype; +} diff --git a/src/main/java/com/ai/da/mapper/secondary/entity/AttributeRetrieval.java b/src/main/java/com/ai/da/mapper/secondary/entity/AttributeRetrieval.java new file mode 100644 index 00000000..c8611586 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/secondary/entity/AttributeRetrieval.java @@ -0,0 +1,24 @@ +package com.ai.da.mapper.secondary.entity; + +import lombok.Data; + +@Data +public class AttributeRetrieval { + private Long id; + private String imgName; + private String length; + private String sleeveLength; + private String sleeveShape; + private String sleeveShoulder; + private String neckline; + private String collar; + private String design; + private String silhouette; + private String type; + private String openingType; + private String subtype; + + private String sleeve; + private String sleeve1; + private String sleeve2; +} diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index cc8f32ae..3179e1bd 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -6,8 +6,15 @@ import com.ai.da.common.config.FileProperties; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.enums.*; import com.ai.da.common.utils.*; +import com.ai.da.mapper.primary.CollocationMapper; +import com.ai.da.mapper.primary.DressingMapper; import com.ai.da.mapper.primary.entity.CollectionElement; +import com.ai.da.mapper.primary.entity.Collocation; import com.ai.da.mapper.primary.entity.DesignHistory; +import com.ai.da.mapper.primary.entity.Dressing; +import com.ai.da.mapper.secondary.AttributeRetrievalMapper; +import com.ai.da.mapper.secondary.entity.AttributeRetrieval; +import com.ai.da.mapper.secondary.entity.AttributeRecognitionJSON; import com.ai.da.model.dto.*; import com.ai.da.model.enums.MalePosition; import com.ai.da.model.enums.Sex; @@ -21,6 +28,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; @@ -37,6 +45,7 @@ import javax.annotation.Resource; import java.io.File; import java.io.IOException; import java.math.BigDecimal; +import java.math.RoundingMode; import java.net.HttpURLConnection; import java.util.*; import java.util.concurrent.TimeUnit; @@ -218,71 +227,88 @@ public class PythonService { elementVO.setNoPinPrintNum(noPinPrintNum); //系统比列 - BigDecimal sysRatio = systemScale; - int pinSketchNum = calculatePinSketchNum(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List()); - int sysSketchNum = calculateSysSketchNum(sysRatio, pinSketchNum); -// int noPinSketchNum = calculateNoPinSketchNum(pinSketchNum, sysSketchNum); -// int sysPictureNum = calculateSysPictureNum(sysRatio, pinPictureNum); -// int userPictureNum = calculateUserLibraryPictureNum(sysPictureNum, pinPictureNum); -// int noPinPictureNum = 8 - pinPictureNum - sysPictureNum - userPictureNum; +// BigDecimal sysRatio = systemScale; + int pinSketchNum = 0; + int sysSketchNum = 0; + int noPinSketchNum = 0; -// for (int i = 0; i < 8; i++) { -// //sketch计算 -// CurrentDesignPictureTypeEnum designPictureType = -// calculateCurrentDesignPictureType(pinPictureNum, sysPictureNum, userPictureNum, noPinPictureNum); -// if (Objects.isNull(designPictureType)) { -// break; -// } -// switch (designPictureType) { -// case PIN: -// pinPictureNum--; -// break; -// case USER_LIBRARY: -// userPictureNum--; -// break; -// case SYS_FILE: -// sysPictureNum--; -// break; -// case NO_PIN: -// noPinPictureNum--; -// break; -// default: -// } -// //print计算 -// CurrentDesignPrintPictureTypeEnum designPrintPictureType = -// calculateCurrentDesignPintPictureType(pinPrintNum, noPinPrintNum, noPrintNum); -// if (Objects.isNull(designPrintPictureType)) { -// break; -// } -// switch (designPrintPictureType) { -// case PIN: -// pinPrintNum--; -// break; -// case NO_PIN: -// noPinPrintNum--; -// break; -// case NO: -// noPrintNum--; -// break; -// default: -// } -// //确定本次designSingle是否print -// DesignPythonItemPrint designPythonItemPrint = getRandomPrint(elementVO, designPrintPictureType); -// elementVO.setDesignPythonItemPrint(designPythonItemPrint); -// //参数透传 确定本次designSingle如果需要print对应的种类 -// elementVO.setDesignPrintPictureTypeLayoutList(calculateCurrentDesignPintPictureTypeLayout(elementVO.getModelSex())); -// //designSingle具体参数组装 -// DesignPythonObject pythonObject = new DesignPythonObject(); -// pythonObject.setItems(coverToDesignPythonItem(elementVO, designPictureType)); -// pythonObject.setBasic(coverToBasic(pythonObject.getItems().get(0), -// singleOverall, switchCategory, elementVO.getDesignLibraryModelPoint())); -// objects.add(pythonObject); -// } + for (int i = 0; i < 8; i++) { + //sketch计算 + CurrentDesignPictureTypeEnum designPictureType = calculateCurrentDesignPictureTypeNew(elementVO, pinSketchNum, sysSketchNum, noPinSketchNum, systemScale); + if (Objects.isNull(designPictureType)) { + break; + } + //print计算 + CurrentDesignPrintPictureTypeEnum designPrintPictureType = calculateCurrentDesignPintPictureType(pinPrintNum, noPinPrintNum, noPrintNum); + if (Objects.isNull(designPrintPictureType)) { + break; + } + switch (designPictureType) { + case PIN: + pinSketchNum ++; + break; + case NO_PIN: + noPinSketchNum --; + break; + case SYS_FILE: + sysSketchNum --; + break; + default: + } + switch (designPrintPictureType) { + case PIN: + pinPrintNum--; + break; + case NO_PIN: + noPinPrintNum--; + break; + case NO: + noPrintNum--; + break; + default: + } + //确定本次designSingle是否print + DesignPythonItemPrint designPythonItemPrint = getRandomPrint(elementVO, designPrintPictureType); + elementVO.setDesignPythonItemPrint(designPythonItemPrint); + //参数透传 确定本次designSingle如果需要print对应的种类 + elementVO.setDesignPrintPictureTypeLayoutList(calculateCurrentDesignPintPictureTypeLayout(elementVO.getModelSex())); + //designSingle具体参数组装 + DesignPythonObject pythonObject = new DesignPythonObject(); + pythonObject.setItems(coverToDesignPythonItemNew(elementVO, designPictureType, systemScale)); + pythonObject.setBasic(coverToBasic(pythonObject.getItems().get(0), + singleOverall, switchCategory, elementVO.getDesignLibraryModelPoint())); + objects.add(pythonObject); + } return designPythonObjects; } + private CurrentDesignPictureTypeEnum calculateCurrentDesignPictureTypeNew(ValidateElementVO elementVO, int pinSketchNum, int sysSketchNum, int noPinSketchNum, BigDecimal systemScale) { + List pinData = getPinData(elementVO); + if (CollectionUtil.isNotEmpty(pinData)) { + return CurrentDesignPictureTypeEnum.PIN; + }else { + if (sysSketchNum == 0 && noPinSketchNum == 0) { + sysSketchNum = systemScale.multiply(BigDecimal.valueOf(8 - pinSketchNum)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); + noPinSketchNum = 8 - pinSketchNum - sysSketchNum; + } + if (noPinSketchNum > 0) { + return CurrentDesignPictureTypeEnum.NO_PIN; + } + return CurrentDesignPictureTypeEnum.SYS_FILE; + } + } + + private int calculateNoPinSketchNum(int pinSketchNum, int sysSketchNum) { + return 8 - pinSketchNum - sysSketchNum; + } + private int calculateSysSketchNum(BigDecimal sysRatio, int pinSketchNum) { - return 0; + // Calculate sysRatio * (8 - pinSketchNum) + BigDecimal result = sysRatio.multiply(BigDecimal.valueOf(8 - pinSketchNum)); + + // Round the result to the nearest integer using half-up rounding + + return result.setScale(0, RoundingMode.HALF_UP).intValue(); } private int calculatePinSketchNum(List sketchBoardElements, List hasUseMd5List) { @@ -302,20 +328,18 @@ public class PythonService { } //计算当前的图片类型 - private CurrentDesignPictureTypeEnum calculateCurrentDesignPictureType(int pinPictureNum, int sysPictureNum, int userPictureNum, int noPinPictureNum) { + private CurrentDesignPictureTypeEnum calculateCurrentDesignPictureType(int pinSketchNum, int sysSketchNum, int noPinSketchNum) { List codes = Lists.newArrayList(); - if (pinPictureNum > 0) { + if (pinSketchNum > 0) { //pin默认优先选择 不参与计算 后续有调整再说 // codes.add(pinPictureNum); return CurrentDesignPictureTypeEnum.PIN; } - if (sysPictureNum > 0) { + if (sysSketchNum > 0) { codes.add(CurrentDesignPictureTypeEnum.SYS_FILE.getCode()); } - if (userPictureNum > 0) { - codes.add(CurrentDesignPictureTypeEnum.USER_LIBRARY.getCode()); - } - if (noPinPictureNum > 0) { + + if (noPinSketchNum > 0) { codes.add(CurrentDesignPictureTypeEnum.NO_PIN.getCode()); } List pictureTypeEnums = CurrentDesignPictureTypeEnum.ofList(codes); @@ -491,6 +515,494 @@ public class PythonService { return items; } + private List coverToDesignPythonItemNew(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType, BigDecimal systemScale) { + List itemList = new ArrayList<>(); + // 根据当前designPictureType确定单一部位的sketch + DesignPythonItem designPythonItem = calculatePythonItem(elementVO, designPictureType); + if (Objects.nonNull(designPythonItem)) { + itemList.add(designPythonItem); + if (elementVO.getSingleOverall().equals(SingleOverallEnum.OVERALL.getRealName())) { + // 根据确定的单一部位sketch,确定一整套穿搭 + List otherSketchCategoryList = getOtherSketchCategoryList(elementVO.getModelSex(), designPythonItem); + if (!CollectionUtils.isEmpty(otherSketchCategoryList)) { + JSONObject attributeRecognition = getAttributeRecognition(designPythonItem, designPythonItem.getType(), elementVO.getModelSex()); + for (String styleCategory : otherSketchCategoryList) { + DesignPythonItem otherSketch = processAttributeRecognition(attributeRecognition, elementVO, designPictureType, styleCategory, systemScale); + itemList.add(otherSketch); + } + } + itemList.addAll(calculatePythonItemHairstyleShoes(elementVO, elementVO.getDesignLibraryModelPoint())); + } + } + return itemList; + } + + private DesignPythonItem processAttributeRecognition(JSONObject attributeRecognition, ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType, String styleCategory, BigDecimal systemScale) { + switch (designPictureType) { + case PIN: { + // 优先去pin里面找符合类别的 + List collectPin = elementVO.getSketchBoardElements().stream().filter(o -> o.getHasPin() == 1 && o.getLevel2Type().equals(styleCategory)).collect(Collectors.toList()); + if (CollectionUtil.isNotEmpty(collectPin)) { + int randomNum = RandomsUtil.randomSysFile(collectPin.size()); + elementVO.getHasUseMd5List().add(collectPin.get(randomNum).getMd5()); + return coverSketchToDesignPythonItem(collectPin.get(randomNum).getId(), collectPin.get(randomNum), elementVO); + }else { + // 找不到就根据特征找一个系统池子,与noPinSketch组成一个池子,如果没有noPinSketch就只由系统池子作为池子。 + List collectNoPin = elementVO.getSketchBoardElements().stream().filter(o -> o.getHasPin() == 0 && o.getLevel2Type().equals(styleCategory)).collect(Collectors.toList()); + int poolNum = 20; + if (CollectionUtil.isNotEmpty(collectNoPin)) { + int collectionNoPinSize = collectNoPin.size(); + if (systemScale.compareTo(BigDecimal.ZERO) == 0) { + int randomNum = RandomsUtil.randomSysFile(collectNoPin.size()); + return coverSketchToDesignPythonItem(null, collectNoPin.get(randomNum), elementVO); + }else if (systemScale.compareTo(BigDecimal.ONE) != 0) { + BigDecimal collectNoPinSize = BigDecimal.valueOf(collectNoPin.size()); + poolNum = collectNoPinSize.divide(systemScale, 0, RoundingMode.DOWN).intValue(); + List list = getSystemSketchPool(attributeRecognition, styleCategory, elementVO.getModelSex(), poolNum); + collectNoPin.addAll(list); + int randomNum = RandomsUtil.randomSysFile(collectNoPin.size()); + if (randomNum < collectionNoPinSize) { + return coverSketchToDesignPythonItem(collectNoPin.get(randomNum).getId(), collectNoPin.get(randomNum), elementVO); + }else { + return coverSketchToDesignPythonItem(null, collectNoPin.get(randomNum), elementVO); + } + } + } + List list = getSystemSketchPool(attributeRecognition, styleCategory, elementVO.getModelSex(), poolNum); + int randomNum = RandomsUtil.randomSysFile(list.size()); + return coverSketchToDesignPythonItem(null, list.get(randomNum), elementVO); + } + } + case NO_PIN: + case SYS_FILE: { + List collectNoPin = elementVO.getSketchBoardElements().stream().filter(o -> o.getHasPin() == 0 && o.getLevel2Type().equals(styleCategory)).collect(Collectors.toList()); + int poolNum = 20; + if (CollectionUtil.isNotEmpty(collectNoPin)) { + int collectionNoPinSize = collectNoPin.size(); + if (systemScale.compareTo(BigDecimal.ZERO) == 0) { + int randomNum = RandomsUtil.randomSysFile(collectNoPin.size()); + return coverSketchToDesignPythonItem(null, collectNoPin.get(randomNum), elementVO); + }else if (systemScale.compareTo(BigDecimal.ONE) != 0) { + BigDecimal collectNoPinSize = BigDecimal.valueOf(collectNoPin.size()); + poolNum = collectNoPinSize.divide(systemScale, 0, RoundingMode.DOWN).intValue(); + List list = getSystemSketchPool(attributeRecognition, styleCategory, elementVO.getModelSex(), poolNum); + collectNoPin.addAll(list); + int randomNum = RandomsUtil.randomSysFile(collectNoPin.size()); + if (randomNum < collectionNoPinSize) { + return coverSketchToDesignPythonItem(collectNoPin.get(randomNum).getId(), collectNoPin.get(randomNum), elementVO); + }else { + return coverSketchToDesignPythonItem(null, collectNoPin.get(randomNum), elementVO); + } + } + } + List list = getSystemSketchPool(attributeRecognition, styleCategory, elementVO.getModelSex(), poolNum); + int randomNum = RandomsUtil.randomSysFile(list.size()); + return coverSketchToDesignPythonItem(null, list.get(randomNum), elementVO); + } + default: + throw new BusinessException("unknown designPictureType"); + } + } + + private DesignPythonItem processAttributeRecognitionBySameCategory(JSONObject attributeRecognition, ValidateElementVO elementVO, String styleCategory) { + List list = getSystemSketchPoolBySameCategory(attributeRecognition, styleCategory, elementVO.getModelSex()); + int randomNum = RandomsUtil.randomSysFile(list.size()); + return coverSketchToDesignPythonItem(null, list.get(randomNum), elementVO); + } + + @Resource + private AttributeRetrievalMapper attributeRetrievalMapper; + private List getSystemSketchPool(JSONObject attributeRecognition, String styleCategory, String modelSex, int poolNum) { + /** + * female trousers->female_pants + * female blouse->female_top + * female skirt->female_skirt + * female outwear->female_outwear + * female dress->female_dress + */ + JSONObject data = attributeRecognition.getJSONObject("data"); + JSONObject attrDict = ((JSONObject) data.getJSONArray("list").get(0)).getJSONObject("attr_dict"); + AttributeRecognitionJSON attrDictJSON = attrDict.toJavaObject(AttributeRecognitionJSON.class); + AttributeRetrieval attributeRetrievalAttrDict = toAttrDict(attrDictJSON); + String tableName; + tableName = getTableName(modelSex, styleCategory); + List attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPool(attributeRetrievalAttrDict, tableName, poolNum); + if (CollectionUtil.isEmpty(attributeRetrievalList) || attributeRetrievalList.size() < poolNum) { + attributeRetrievalAttrDict.setDesign(null); + attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPool(attributeRetrievalAttrDict, tableName, poolNum); + } + if (CollectionUtil.isEmpty(attributeRetrievalList) || attributeRetrievalList.size() < poolNum) { + attributeRetrievalAttrDict.setSilhouette(null); + attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPool(attributeRetrievalAttrDict, tableName, poolNum); + } + return toColoectionElementList(attributeRetrievalList, styleCategory, modelSex); + } + + private List getSystemSketchPoolBySameCategory(JSONObject attributeRecognition, String styleCategory, String modelSex) { + /** + * female trousers->female_pants + * female blouse->female_top + * female skirt->female_skirt + * female outwear->female_outwear + * female dress->female_dress + */ + JSONObject data = attributeRecognition.getJSONObject("data"); + JSONObject attrDict = ((JSONObject) data.getJSONArray("list").get(0)).getJSONObject("attr_dict"); + AttributeRecognitionJSON attrDictJSON = attrDict.toJavaObject(AttributeRecognitionJSON.class); + AttributeRetrieval attributeRetrievalAttrDict = toAttrDict(attrDictJSON); + String tableName; + tableName = getTableName(modelSex, styleCategory); + + // 存储非空字段的列表 + List nonNullFields = new ArrayList<>(); + if (attributeRetrievalAttrDict.getType() != null) nonNullFields.add("type"); + if (attributeRetrievalAttrDict.getOpeningType() != null) nonNullFields.add("openingType"); + if (attributeRetrievalAttrDict.getSubtype() != null) nonNullFields.add("subtype"); + + // 只有当非空字段数量大于等于2时才进行处理 + if (nonNullFields.size() >= 2) { + // 随机数生成器 + Random random = new Random(); + // 随机选择一个字段保留 + String fieldToKeep = nonNullFields.get(random.nextInt(nonNullFields.size())); + + // 设置保留的字段为非null,其他字段为null + for (String field : nonNullFields) { + if (!field.equals(fieldToKeep)) { + switch (field) { + case "type": + attributeRetrievalAttrDict.setType(null); + break; + case "openingType": + attributeRetrievalAttrDict.setOpeningType(null); + break; + case "subtype": + attributeRetrievalAttrDict.setSubtype(null); + break; + } + } + } + } + + List attributeRetrievalList = attributeRetrievalMapper.getSystemSketchPoolBySameCategory(attributeRetrievalAttrDict, tableName); + if (CollectionUtil.isEmpty(attributeRetrievalList)) { + System.out.println(attributeRetrievalAttrDict); + System.out.println(tableName); + } + return toColoectionElementList(attributeRetrievalList, styleCategory, modelSex); + } + + private List toColoectionElementList(List attributeRetrievalList, String styleCategory, String modelSex) { + List systemPool = new ArrayList<>(); + for (AttributeRetrieval attributeRetrieval : attributeRetrievalList) { + CollectionElement system = toCollectionElement(attributeRetrieval, styleCategory, modelSex); + systemPool.add(system); + } + return systemPool; + } + + private CollectionElement toCollectionElement(AttributeRetrieval attributeRetrieval, String styleCategory, String modelSex) { + CollectionElement element = new CollectionElement(); + element.setLevel2Type(styleCategory); + element.setUrl("aida-sys-image/images/" + modelSex.toLowerCase() + "/" + attributeRetrieval.getImgName()); + if (element.getUrl().contains("top")) { + element.setUrl(element.getUrl().replace("top", "tops")); + } + if (element.getUrl().contains("bottom")) { + element.setUrl(element.getUrl().replace("bottom", "bottoms")); + } + if (element.getUrl().contains("outer")) { + element.setUrl(element.getUrl().replace("outer", "outwear")); + } + return element; + } + + private AttributeRetrieval toAttrDict(AttributeRecognitionJSON attrDictJSON) { + AttributeRetrieval attributeRetrieval = new AttributeRetrieval(); +// attributeRetrieval.setImgName(attrDictJSON.getImgName().get(0)); +// attributeRetrieval.setLength(attrDictJSON.getLength().get(0)); +// attributeRetrieval.setSleeveLength(attrDictJSON.getSleeveLength().get(0)); +// attributeRetrieval.setSleeveShape(attrDictJSON.getSleeveShape().get(0)); +// attributeRetrieval.setSleeveShoulder(attrDictJSON.getSleeveShoulder().get(0)); +// attributeRetrieval.setNeckline(attrDictJSON.getNeckline().get(0)); +// attributeRetrieval.setCollar(attrDictJSON.getCollar().get(0)); + if (CollectionUtil.isNotEmpty(attrDictJSON.getDesign()) && attrDictJSON.getDesign().get(0) != null) { + attributeRetrieval.setDesign(attrDictJSON.getDesign().get(0)); + } + if (CollectionUtil.isNotEmpty(attrDictJSON.getSilhouette()) && attrDictJSON.getSilhouette().get(0) != null) { + attributeRetrieval.setSilhouette(attrDictJSON.getSilhouette().get(0)); + } + if (CollectionUtil.isNotEmpty(attrDictJSON.getType()) && attrDictJSON.getType().get(0) != null) { + attributeRetrieval.setType(attrDictJSON.getType().get(0)); + } + if (CollectionUtil.isNotEmpty(attrDictJSON.getSubtype()) && attrDictJSON.getSubtype().get(0) != null) { + attributeRetrieval.setSubtype(attrDictJSON.getSubtype().get(0)); + } + if (CollectionUtil.isNotEmpty(attrDictJSON.getOpeningType()) && attrDictJSON.getOpeningType().get(0) != null) { + attributeRetrieval.setOpeningType(attrDictJSON.getOpeningType().get(0)); + } + return attributeRetrieval; + } + + public JSONObject getAttributeRecognition(DesignPythonItem designPythonItem, String styleCategory, String modelSex) { + // todo 限流校验 +// AccessLimitUtils.validate("design",5); + OkHttpClient client = new OkHttpClient().newBuilder() + .connectTimeout(30, TimeUnit.SECONDS) + .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) + .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒) + .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒) + .build(); + MediaType mediaType = MediaType.parse("application/json"); + //关闭FastJson的引用检测 防止出现$ref 现象 + JSONObject paramJSONObject = new JSONObject(); + paramJSONObject.put("category", styleCategory); + paramJSONObject.put("colony", modelSex); + paramJSONObject.put("sketch_img_url", designPythonItem.getPath()); + JSONArray paramArray = new JSONArray(); + paramArray.add(paramJSONObject); + String param = JSON.toJSONString(paramArray, SerializerFeature.DisableCircularReferenceDetect); + log.info("design请求python 参数:####{}", param); + RequestBody body = RequestBody.create(mediaType, param); + Request request = new Request.Builder() + .url(accessPythonIp + ":" + accessPythonPort + "/api/attribute_recognition") + .method("POST", body) +// .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") + .addHeader("Content-Type", "application/json") + .build(); + Response response; + String responseBody; + try { + response = client.newCall(request).execute(); + } catch (IOException ioException) { + AccessLimitUtils.validateOut("design"); + log.error("PythonService##design异常###{}", ExceptionUtil.getThrowableList(ioException)); + throw new BusinessException("design.interface.exception"); + } + //去除限流 +// AccessLimitUtils.validateOut("design"); + if (response.isSuccessful()) { + try { + if (Objects.nonNull(response.body())) { + responseBody = response.body().string(); + JSONObject responseObject = JSON.parseObject(responseBody); + log.info("PythonService##responseObject###{}", responseObject); + return responseObject; + } + throw new BusinessException("design.interface.exception"); + } catch (IOException | JSONException e) { + log.error("PythonService##design异常###{}", e.getMessage()); + throw new BusinessException("design.interface.exception"); + } + } + log.error("PythonService##design异常response###{}", response); + //生成失败 + throw new BusinessException("design.interface.exception"); + } + + public JSONObject getAttributeRecognitionBySameCategory(CollectionElement element, String modelSex) { + // todo 限流校验 +// AccessLimitUtils.validate("design",5); + OkHttpClient client = new OkHttpClient().newBuilder() + .connectTimeout(30, TimeUnit.SECONDS) + .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) + .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒) + .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒) + .build(); + MediaType mediaType = MediaType.parse("application/json"); + //关闭FastJson的引用检测 防止出现$ref 现象 + JSONObject paramJSONObject = new JSONObject(); + paramJSONObject.put("category", element.getLevel2Type()); + paramJSONObject.put("colony", modelSex); + paramJSONObject.put("sketch_img_url", element.getUrl()); + JSONArray paramArray = new JSONArray(); + paramArray.add(paramJSONObject); + String param = JSON.toJSONString(paramArray, SerializerFeature.DisableCircularReferenceDetect); + log.info("design请求python 参数:####{}", param); + RequestBody body = RequestBody.create(mediaType, param); + Request request = new Request.Builder() + .url(accessPythonIp + ":" + accessPythonPort + "/api/attribute_recognition") + .method("POST", body) +// .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") + .addHeader("Content-Type", "application/json") + .build(); + Response response; + String responseBody; + try { + response = client.newCall(request).execute(); + } catch (IOException ioException) { + AccessLimitUtils.validateOut("design"); + log.error("PythonService##design异常###{}", ExceptionUtil.getThrowableList(ioException)); + throw new BusinessException("design.interface.exception"); + } + //去除限流 +// AccessLimitUtils.validateOut("design"); + if (response.isSuccessful()) { + try { + if (Objects.nonNull(response.body())) { + responseBody = response.body().string(); + JSONObject responseObject = JSON.parseObject(responseBody); + log.info("PythonService##responseObject###{}", responseObject); + return responseObject; + } + throw new BusinessException("design.interface.exception"); + } catch (IOException | JSONException e) { + log.error("PythonService##design异常###{}", e.getMessage()); + throw new BusinessException("design.interface.exception"); + } + } + log.error("PythonService##design异常response###{}", response); + //生成失败 + throw new BusinessException("design.interface.exception"); + } + + @Resource + private CollocationMapper collocationMapper; + @Resource + private DressingMapper dressingMapper; + private List getOtherSketchCategoryList(String modelSex, DesignPythonItem designPythonItem) { + List collocationList = collocationMapper.getCollocationListBySketch(modelSex, designPythonItem.getType()); + if (CollectionUtil.isNotEmpty(collocationList)) { + Random random = new Random(); + int randomNumber = random.nextInt(collocationList.size()); + List otherSketchCategoryList = dressingMapper.getOtherSketchCategoryNameList(collocationList.get(randomNumber).getId(), designPythonItem.getType().toLowerCase()); + return otherSketchCategoryList; + } + return null; + } + + private DesignPythonItem calculatePythonItem(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType) { + switch (designPictureType) { + case PIN: { + List pinData = getPinData(elementVO); + if (CollectionUtil.isEmpty(pinData)) { + throw new BusinessException("pinData is null"); + } + Random random = new Random(); + int randomNumber = random.nextInt(pinData.size()); + elementVO.getHasUseMd5List().add(pinData.get(randomNumber).getMd5()); + return coverSketchToDesignPythonItem(pinData.get(randomNumber).getId(), pinData.get(randomNumber), elementVO); + } + case NO_PIN: { + List noPinData = getNoPinData(elementVO); + if (CollectionUtil.isEmpty(noPinData)) { + // 根据pin的获取 type + List sketchBoardPins = elementVO.getSketchBoardElements() + .stream().filter(v -> v.getHasPin() == 1).collect(Collectors.toList()); + if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> o.getLevel2Type().equals(elementVO.getSwitchCategory())).collect(Collectors.toList()); + } + if (CollectionUtil.isNotEmpty(sketchBoardPins)) { + Integer randomNum = RandomsUtil.randomSysFile(sketchBoardPins.size()); + CollectionElement element = sketchBoardPins.get(randomNum); + JSONObject attributeRecognition = getAttributeRecognitionBySameCategory(element, elementVO.getModelSex()); + return processAttributeRecognitionBySameCategory(attributeRecognition, elementVO, element.getLevel2Type()); + } + + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(Dressing::getApparel, elementVO.getModelSex()); + if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + qw.lambda().eq(Dressing::getApparel, elementVO.getSwitchCategory()); + } + List dressings = dressingMapper.selectList(qw); + if (CollectionUtil.isEmpty(dressings)) { + throw new BusinessException("dressings is null"); + } + Integer randomNum = RandomsUtil.randomSysFile(dressings.size()); + String category = dressings.get(randomNum).getStyleCategory(); + String tableName; + tableName = getTableName(elementVO.getModelSex(), category); + + AttributeRetrieval attributeRetrieval = attributeRetrievalMapper.getSystemRandom(tableName); + CollectionElement collectionElement = toCollectionElement(attributeRetrieval, category, elementVO.getModelSex()); + return coverSketchToDesignPythonItem(null, collectionElement, elementVO); + } + Random random = new Random(); + int randomNumber = random.nextInt(noPinData.size()); + return coverSketchToDesignPythonItem(noPinData.get(randomNumber).getId(), noPinData.get(randomNumber), elementVO); + } + case SYS_FILE: { + // 根据pin noPin的获取 type + List sketchBoardPins = elementVO.getSketchBoardElements(); + if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> o.getLevel2Type().equals(elementVO.getSwitchCategory())).collect(Collectors.toList()); + } + if (CollectionUtil.isNotEmpty(sketchBoardPins)) { + Integer randomNum = RandomsUtil.randomSysFile(sketchBoardPins.size()); + CollectionElement element = sketchBoardPins.get(randomNum); + JSONObject attributeRecognition = getAttributeRecognitionBySameCategory(element, elementVO.getModelSex()); + return processAttributeRecognitionBySameCategory(attributeRecognition, elementVO, element.getLevel2Type()); + } + + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(Dressing::getApparel, elementVO.getModelSex()); + if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + qw.lambda().eq(Dressing::getApparel, elementVO.getSwitchCategory()); + } + List dressings = dressingMapper.selectList(qw); + if (CollectionUtil.isEmpty(dressings)) { + throw new BusinessException("dressings is null"); + } + Integer randomNum = RandomsUtil.randomSysFile(dressings.size()); + String category = dressings.get(randomNum).getStyleCategory(); + String tableName; + tableName = getTableName(elementVO.getModelSex(), category); + + AttributeRetrieval attributeRetrieval = attributeRetrievalMapper.getSystemRandom(tableName); + CollectionElement collectionElement = toCollectionElement(attributeRetrieval, category, elementVO.getModelSex()); + return coverSketchToDesignPythonItem(null, collectionElement, elementVO); + } + default: + return null; + } + } + + private String getTableName(String modelSex, String category) { + switch (modelSex) { + case "Female": { + switch (category) { + case "Blouse": { + return "female_top"; + } + case "Trousers": { + return "female_pants"; + } + case "Skirt": { + return "female_skirt"; + } + case "Outwear": { + return "female_outwear"; + } + case "Dress": { + return "female_dress"; + } + default: { + throw new BusinessException("unknown attributeRetrieval dressing"); + } + } + } + case "Male": { + switch (category) { + case "Tops": { + return "male_top"; + } + case "Bottoms": { + return "male_bottom"; + } + case "Outwear": { + return "male_outwear"; + } + default: { + throw new BusinessException("unknown male dressing"); + } + } + } + default: { + throw new BusinessException("unknown modelSex"); + } + } + } + private DesignPythonItem calculatePythonItemOutwear(List pinData, ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType) { DesignPythonItem outwear = null; //剩余的的PinData @@ -568,39 +1080,39 @@ public class PythonService { } } break; - case USER_LIBRARY: - //single模式 - if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { - if (DesignPythonItem.OUTWEAR.contains(elementVO.getSwitchCategory())) { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); - outwear = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - outwear.setBusinessId(sysFileVO.getId()); - return outwear; - } - outwear = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - outwear.setBusinessId(libraryVo.getId()); - } - } else { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - DesignPythonItem.OUTWEAR, elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileMaleBottoms(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); - outwear = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - outwear.setBusinessId(sysFileVO.getId()); - //添加已使用的md5 - return outwear; - } - outwear = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - outwear.setBusinessId(libraryVo.getId()); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - } - break; +// case USER_LIBRARY: +// //single模式 +// if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { +// if (DesignPythonItem.OUTWEAR.contains(elementVO.getSwitchCategory())) { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// outwear = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// outwear.setBusinessId(sysFileVO.getId()); +// return outwear; +// } +// outwear = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// outwear.setBusinessId(libraryVo.getId()); +// } +// } else { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// DesignPythonItem.OUTWEAR, elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileMaleBottoms(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// outwear = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// outwear.setBusinessId(sysFileVO.getId()); +// //添加已使用的md5 +// return outwear; +// } +// outwear = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// outwear.setBusinessId(libraryVo.getId()); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// } +// break; case SYS_FILE: //single模式 if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { @@ -735,39 +1247,39 @@ public class PythonService { } } break; - case USER_LIBRARY: - //single模式 - if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { - if (DesignPythonItem.BOTTOMS.contains(elementVO.getSwitchCategory())) { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); - bottom = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - bottom.setBusinessId(sysFileVO.getId()); - return bottom; - } - bottom = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - bottom.setBusinessId(libraryVo.getId()); - } - } else { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - DesignPythonItem.BOTTOMS, elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileMaleBottoms(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); - bottom = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - bottom.setBusinessId(sysFileVO.getId()); - //添加已使用的md5 - return bottom; - } - bottom = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - bottom.setBusinessId(libraryVo.getId()); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - } - break; +// case USER_LIBRARY: +// //single模式 +// if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { +// if (DesignPythonItem.BOTTOMS.contains(elementVO.getSwitchCategory())) { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// bottom = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// bottom.setBusinessId(sysFileVO.getId()); +// return bottom; +// } +// bottom = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// bottom.setBusinessId(libraryVo.getId()); +// } +// } else { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// DesignPythonItem.BOTTOMS, elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileMaleBottoms(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// bottom = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// bottom.setBusinessId(sysFileVO.getId()); +// //添加已使用的md5 +// return bottom; +// } +// bottom = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// bottom.setBusinessId(libraryVo.getId()); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// } +// break; case SYS_FILE: //single模式 if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { @@ -902,39 +1414,39 @@ public class PythonService { } } break; - case USER_LIBRARY: - //single模式 - if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { - if (DesignPythonItem.TOPS.contains(elementVO.getSwitchCategory())) { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); - top = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - top.setBusinessId(sysFileVO.getId()); - return top; - } - top = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - top.setBusinessId(libraryVo.getId()); - } - } else { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - DesignPythonItem.TOPS, elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileMaleTops(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); - top = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - top.setBusinessId(sysFileVO.getId()); - //添加已使用的md5 - return top; - } - top = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - top.setBusinessId(libraryVo.getId()); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - } - break; +// case USER_LIBRARY: +// //single模式 +// if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { +// if (DesignPythonItem.TOPS.contains(elementVO.getSwitchCategory())) { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// top = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// top.setBusinessId(sysFileVO.getId()); +// return top; +// } +// top = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// top.setBusinessId(libraryVo.getId()); +// } +// } else { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// DesignPythonItem.TOPS, elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileMaleTops(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// top = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// top.setBusinessId(sysFileVO.getId()); +// //添加已使用的md5 +// return top; +// } +// top = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// top.setBusinessId(libraryVo.getId()); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// } +// break; case SYS_FILE: //single模式 if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { @@ -1105,39 +1617,39 @@ public class PythonService { } } break; - case USER_LIBRARY: - //single模式 - if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { - if (DesignPythonItem.SKIRT_TROUSERS.contains(elementVO.getSwitchCategory())) { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); - skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - skirt.setBusinessId(sysFileVO.getId()); - return skirt; - } - skirt = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - skirt.setBusinessId(libraryVo.getId()); - } - } else { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - DesignPythonItem.SKIRT_TROUSERS, elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileSkirt(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); - skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - skirt.setBusinessId(sysFileVO.getId()); - //添加已使用的md5 - return skirt; - } - skirt = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - skirt.setBusinessId(libraryVo.getId()); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - } - break; +// case USER_LIBRARY: +// //single模式 +// if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { +// if (DesignPythonItem.SKIRT_TROUSERS.contains(elementVO.getSwitchCategory())) { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// skirt.setBusinessId(sysFileVO.getId()); +// return skirt; +// } +// skirt = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// skirt.setBusinessId(libraryVo.getId()); +// } +// } else { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// DesignPythonItem.SKIRT_TROUSERS, elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileSkirt(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// skirt = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// skirt.setBusinessId(sysFileVO.getId()); +// //添加已使用的md5 +// return skirt; +// } +// skirt = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// skirt.setBusinessId(libraryVo.getId()); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// } +// break; case SYS_FILE: //single模式 if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { @@ -1276,42 +1788,42 @@ public class PythonService { } } break; - case USER_LIBRARY: - //single模式 - if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { - if (DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(elementVO.getSwitchCategory())) { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); - DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - item.setBusinessId(sysFileVO.getId()); - items.add(item); - return items; - } - DesignPythonItem item = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - item.setBusinessId(libraryVo.getId()); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - items.add(item); - } - } else { - LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), - DesignPythonItem.OUTWEAR_DRESS_BLOUSE, elementVO.getHasUseMd5List()); - if (StringUtils.isEmpty(libraryVo)) { - //系统获取 - SysFileVO sysFileVO = getRandomSysFileOutwear(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); - DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); - item.setBusinessId(sysFileVO.getId()); - items.add(item); - return items; - } - DesignPythonItem item = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); - item.setBusinessId(libraryVo.getId()); - elementVO.getHasUseMd5List().add(libraryVo.getMd5()); - items.add(item); - } - break; +// case USER_LIBRARY: +// //single模式 +// if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { +// if (DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(elementVO.getSwitchCategory())) { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// Arrays.asList(elementVO.getSwitchCategory()), elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileByLevel2Type(elementVO.getSwitchCategory(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// item.setBusinessId(sysFileVO.getId()); +// items.add(item); +// return items; +// } +// DesignPythonItem item = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// item.setBusinessId(libraryVo.getId()); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// items.add(item); +// } +// } else { +// LibraryVo libraryVo = getRandomLibrary(elementVO.getLibraryVos(), +// DesignPythonItem.OUTWEAR_DRESS_BLOUSE, elementVO.getHasUseMd5List()); +// if (StringUtils.isEmpty(libraryVo)) { +// //系统获取 +// SysFileVO sysFileVO = getRandomSysFileOutwear(elementVO.getSysFileVo(), elementVO.getSysFileIds(), elementVO.getModelSex()); +// DesignPythonItem item = coverToDesignPythonItem(null, sysFileVO.getLevel2Type(), sysFileVO.getUrl(), elementVO); +// item.setBusinessId(sysFileVO.getId()); +// items.add(item); +// return items; +// } +// DesignPythonItem item = coverToDesignPythonItem(null, libraryVo.getLevel2Type(), libraryVo.getUrl(), elementVO); +// item.setBusinessId(libraryVo.getId()); +// elementVO.getHasUseMd5List().add(libraryVo.getMd5()); +// items.add(item); +// } +// break; case SYS_FILE: //single模式 if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall())) { @@ -1399,6 +1911,32 @@ public class PythonService { return designPythonItemBlouse; } + private DesignPythonItem coverSketchToDesignPythonItem(Long elementId, CollectionElement collectionElement, ValidateElementVO elementVO) { + DesignPythonItem designPythonItemBlouse = new DesignPythonItem(); + if (Objects.nonNull(elementId)) { + designPythonItemBlouse.setElementId(elementId); + designPythonItemBlouse.setBusinessId(elementId); + } + designPythonItemBlouse.setType(collectionElement.getLevel2Type()); + designPythonItemBlouse.setPath(collectionElement.getUrl()); + //所有的icon都是none + designPythonItemBlouse.setIcon("none"); + designPythonItemBlouse.setColor(getRandomColor(elementVO.getColorBoards())); + if (!elementVO.getDesignPythonItemPrint().getPath().equals("none") + && elementVO.getDesignPrintPictureTypeLayoutList().contains(collectionElement.getLevel2Type())) { + DesignPythonItemPrint designPythonItemPrint = CopyUtil.copyObject(elementVO.getDesignPythonItemPrint(), DesignPythonItemPrint.class); + designPythonItemPrint.setIfSingle(false); + designPythonItemPrint.setPrint_path_list(Collections.singletonList(designPythonItemPrint.getPath())); + designPythonItemBlouse.setPrint(designPythonItemPrint); + } else { + DesignPythonItemPrint designPythonItemPrint = new DesignPythonItemPrint(); + designPythonItemPrint.setIfSingle(false); + designPythonItemPrint.setPrint_path_list(new ArrayList<>()); + designPythonItemBlouse.setPrint(designPythonItemPrint); + } + return designPythonItemBlouse; + } + private List residuePinData(List pinData, List existPinDataIds, List hasUseMd5List) { if (CollectionUtils.isEmpty(pinData)) { return null; @@ -1412,9 +1950,9 @@ public class PythonService { DesignPythonBasic basic = new DesignPythonBasic(); basic.setSingle_overall(singleOverall); basic.setSwitch_category(switchCategory); - basic.setSave_name(getPythonOutputPath( - StringUtils.isEmpty(designPythonItem.getPath()) ? designPythonItem.getBody_path() : designPythonItem.getPath(), - PythonToJavaApiOperationTypeEnum.DESIGN_COLLECTION)); +// basic.setSave_name(getPythonOutputPath( +// StringUtils.isEmpty(designPythonItem.getPath()) ? designPythonItem.getBody_path() : designPythonItem.getPath(), +// PythonToJavaApiOperationTypeEnum.DESIGN_COLLECTION)); basic.setScale_bag(0.7); basic.setSelf_template(Boolean.FALSE); if (Objects.nonNull(designLibraryModelPoint)) { @@ -1465,6 +2003,19 @@ public class PythonService { return integerList; } + private List getPinData(ValidateElementVO elementVO) { + List pinData = getPinData(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List()); + if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + if (!CollectionUtils.isEmpty(pinData)) { + return pinData.stream().filter(o -> o.getLevel2Type().equals(elementVO.getSwitchCategory())).collect(Collectors.toList()); + }else { + return pinData; + } + }else { + return pinData; + } + } + private List getPinData(List sketchBoardElements, List hasUseMd5List) { if (CollectionUtils.isEmpty(sketchBoardElements)) { return null; @@ -1474,11 +2025,31 @@ public class PythonService { if (CollectionUtils.isEmpty(sketchBoardPins)) { return null; } -// List response = resolveElementFilterHistoryMd5(sketchBoardPins); -// if (CollectionUtils.isEmpty(response)) { -// return null; -// } - return CopyUtil.copyList(sketchBoardPins, CollectionElement.class); + return sketchBoardPins; + } + + private List getNoPinData(ValidateElementVO elementVO) { + if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + List noPinData = getNoPinData(elementVO.getSketchBoardElements()); + if (CollectionUtils.isEmpty(noPinData)) { + return null; + } + return noPinData.stream().filter(o -> o.getLevel2Type().equals(elementVO.getSwitchCategory())).collect(Collectors.toList()); + }else { + return getNoPinData(elementVO.getSketchBoardElements()); + } + } + + private List getNoPinData(List sketchBoardElements) { + if (CollectionUtils.isEmpty(sketchBoardElements)) { + return null; + } + List sketchBoardPins = sketchBoardElements + .stream().filter(v -> v.getHasPin() == 0).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(sketchBoardPins)) { + return null; + } + return sketchBoardPins; } private List resolveElementFilterHistoryMd5(List elemet) { diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java index d2982dd1..c00d2a4c 100644 --- a/src/main/java/com/ai/da/service/AccountService.java +++ b/src/main/java/com/ai/da/service/AccountService.java @@ -2,7 +2,6 @@ package com.ai.da.service; import com.ai.da.mapper.primary.entity.Account; import com.ai.da.mapper.primary.entity.TrialOrder; -import com.ai.da.mapper.secondary.entity.FemaleDress; import com.ai.da.model.dto.*; import com.ai.da.model.vo.AccountLoginVO; import com.ai.da.model.vo.AccountPreLoginVO; diff --git a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java index de53e544..38495eab 100644 --- a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java @@ -13,8 +13,6 @@ import com.ai.da.mapper.primary.TrialOrderMapper; import com.ai.da.mapper.primary.entity.Account; import com.ai.da.mapper.primary.entity.AccountLoginLog; import com.ai.da.mapper.primary.entity.TrialOrder; -import com.ai.da.mapper.secondary.FemaleDressMapper; -import com.ai.da.mapper.secondary.entity.FemaleDress; import com.ai.da.model.dto.*; import com.ai.da.model.enums.AutoApproved; import com.ai.da.model.enums.Language; @@ -32,7 +30,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index 095db937..14a16046 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -5,11 +5,11 @@ import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.GenerateModeEnum; import com.ai.da.common.enums.ModelNameEnum; import com.ai.da.common.utils.*; -import com.ai.da.mapper.CollectionElementMapper; -import com.ai.da.mapper.GenerateCancelMapper; -import com.ai.da.mapper.GenerateDetailMapper; -import com.ai.da.mapper.GenerateMapper; -import com.ai.da.mapper.entity.*; +import com.ai.da.mapper.primary.CollectionElementMapper; +import com.ai.da.mapper.primary.GenerateCancelMapper; +import com.ai.da.mapper.primary.GenerateDetailMapper; +import com.ai.da.mapper.primary.GenerateMapper; +import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.GenerateLikeDTO; import com.ai.da.model.dto.GenerateThroughImageTextDTO; import com.ai.da.model.dto.GenerateToPythonDTO; diff --git a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java index 7b3874f1..d9c10610 100644 --- a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java @@ -12,8 +12,7 @@ import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.DateUtil; import com.ai.da.common.utils.FileUtil; import com.ai.da.common.utils.MinioUtil; -import com.ai.da.mapper.primary.LibraryMapper; -import com.ai.da.mapper.primary.SysFileMapper; +import com.ai.da.mapper.primary.*; import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.*; import com.ai.da.model.enums.*; diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 55672070..4e41f8a4 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -1,11 +1,16 @@ -server.port=5567 +server.port=17088 + +spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.primary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +spring.datasource.primary.username=aida_con +spring.datasource.primary.password=123456 + +spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.secondary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/attribute_retrieval?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +spring.datasource.secondary.username=aida_con +spring.datasource.secondary.password=123456 + -#datasource -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.url=jdbc:mysql://18.167.251.121:33008/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true -spring.datasource.username=aida_con -spring.datasource.password=123456 -#spring.datasource.password=QWa998345 #security spring.security.jwtSecret=JWTSECRET @@ -23,8 +28,7 @@ rsa.private_key=MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8 #mybatis mybatis-plus.global-config.banner=false -mybatis-plus.mapper-locations=classpath:mapper/*Mapper.xml -#mybatis-plus.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl +mybatis-plus.mapper-locations=classpath:mapper/*/*.xml mybatis-plus.global-config.db-config.logic-delete-field=isDeleted mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0 @@ -39,10 +43,8 @@ file.windows.path=D:\\upload\\ spring.servlet.multipart.max-file-size = 10MB spring.servlet.multipart.max-request-size= 10MB #访问python服务的ip(对应环境) -#access.python.ip=http://43.198.80.117 access.python.ip=http://18.167.251.121 -#access.python.ip=http://18.167.251.121:9991/ -access.python.port=9990 +access.python.port=9992 minio.endpoint=https://www.minio.aida.com.hk:9000 minio.accessKey=admin diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index 59ce6439..28eaf8ac 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -42,7 +42,7 @@ spring.servlet.multipart.max-request-size= 10MB #access.python.ip=http://43.198.80.117 access.python.ip=http://18.167.251.121 #access.python.ip=http://18.167.251.121:9991/ -access.python.port=9990 +access.python.port=9992 minio.endpoint=https://www.minio.aida.com.hk:9000 minio.accessKey=admin diff --git a/src/main/resources/mapper/primary/CollocationMapper.xml b/src/main/resources/mapper/primary/CollocationMapper.xml new file mode 100644 index 00000000..8eeeda2a --- /dev/null +++ b/src/main/resources/mapper/primary/CollocationMapper.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/primary/DressingMapper.xml b/src/main/resources/mapper/primary/DressingMapper.xml new file mode 100644 index 00000000..9e112248 --- /dev/null +++ b/src/main/resources/mapper/primary/DressingMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml b/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml new file mode 100644 index 00000000..434ab153 --- /dev/null +++ b/src/main/resources/mapper/secondary/AttributeRetrievalMapper.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/secondary/FemaleDressMapper.xml b/src/main/resources/mapper/secondary/FemaleDressMapper.xml deleted file mode 100644 index abaf4205..00000000 --- a/src/main/resources/mapper/secondary/FemaleDressMapper.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - From f8d468d55bbfee0ceb521f59932f49fad21ca03a Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Tue, 20 Feb 2024 10:35:50 +0800 Subject: [PATCH 20/93] =?UTF-8?q?TASK:=E4=BB=A3=E7=A0=81=E5=90=88=E5=B9=B6?= =?UTF-8?q?;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ai/da/common/task/AliPayTask.java | 2 +- src/main/java/com/ai/da/controller/AliPayController.java | 2 +- .../java/com/ai/da/controller/OrderInfoController.java | 2 +- src/main/java/com/ai/da/controller/ProductController.java | 2 +- .../com/ai/da/mapper/{ => primary}/OrderInfoMapper.java | 4 ++-- .../com/ai/da/mapper/{ => primary}/PaymentInfoMapper.java | 4 ++-- .../com/ai/da/mapper/{ => primary}/ProductMapper.java | 4 ++-- .../com/ai/da/mapper/{ => primary}/RefundInfoMapper.java | 4 ++-- .../java/com/ai/da/mapper/primary/entity/BaseEntity.java | 3 +-- .../java/com/ai/da/mapper/primary/entity/OrderInfo.java | 2 +- .../java/com/ai/da/mapper/primary/entity/PaymentInfo.java | 2 +- .../java/com/ai/da/mapper/primary/entity/Product.java | 2 +- .../java/com/ai/da/mapper/primary/entity/RefundInfo.java | 2 +- src/main/java/com/ai/da/service/OrderInfoService.java | 2 +- src/main/java/com/ai/da/service/ProductService.java | 2 +- src/main/java/com/ai/da/service/RefundInfoService.java | 2 +- .../java/com/ai/da/service/impl/AliPayServiceImpl.java | 4 ++-- .../java/com/ai/da/service/impl/ChatRobotServiceImpl.java | 2 ++ .../java/com/ai/da/service/impl/OrderInfoServiceImpl.java | 8 ++++---- .../com/ai/da/service/impl/PaymentInfoServiceImpl.java | 4 ++-- .../java/com/ai/da/service/impl/ProductServiceImpl.java | 4 ++-- .../com/ai/da/service/impl/RefundInfoServiceImpl.java | 6 +++--- 22 files changed, 35 insertions(+), 34 deletions(-) rename src/main/java/com/ai/da/mapper/{ => primary}/OrderInfoMapper.java (60%) rename src/main/java/com/ai/da/mapper/{ => primary}/PaymentInfoMapper.java (60%) rename src/main/java/com/ai/da/mapper/{ => primary}/ProductMapper.java (59%) rename src/main/java/com/ai/da/mapper/{ => primary}/RefundInfoMapper.java (60%) diff --git a/src/main/java/com/ai/da/common/task/AliPayTask.java b/src/main/java/com/ai/da/common/task/AliPayTask.java index 0d9c8390..f95a3a10 100644 --- a/src/main/java/com/ai/da/common/task/AliPayTask.java +++ b/src/main/java/com/ai/da/common/task/AliPayTask.java @@ -1,6 +1,6 @@ package com.ai.da.common.task; -import com.ai.da.mapper.entity.OrderInfo; +import com.ai.da.mapper.primary.entity.OrderInfo; import com.ai.da.common.enums.PayTypeEnum; import com.ai.da.service.AliPayService; import com.ai.da.service.OrderInfoService; diff --git a/src/main/java/com/ai/da/controller/AliPayController.java b/src/main/java/com/ai/da/controller/AliPayController.java index a6f3c20f..5559a186 100644 --- a/src/main/java/com/ai/da/controller/AliPayController.java +++ b/src/main/java/com/ai/da/controller/AliPayController.java @@ -1,7 +1,7 @@ package com.ai.da.controller; import com.ai.da.common.response.Response; -import com.ai.da.mapper.entity.OrderInfo; +import com.ai.da.mapper.primary.entity.OrderInfo; import com.ai.da.service.AliPayService; import com.ai.da.service.OrderInfoService; import com.alipay.api.AlipayApiException; diff --git a/src/main/java/com/ai/da/controller/OrderInfoController.java b/src/main/java/com/ai/da/controller/OrderInfoController.java index b71d0e04..63e3463c 100644 --- a/src/main/java/com/ai/da/controller/OrderInfoController.java +++ b/src/main/java/com/ai/da/controller/OrderInfoController.java @@ -2,7 +2,7 @@ package com.ai.da.controller; import com.ai.da.common.enums.OrderStatusEnum; import com.ai.da.common.response.Response; -import com.ai.da.mapper.entity.OrderInfo; +import com.ai.da.mapper.primary.entity.OrderInfo; import com.ai.da.service.OrderInfoService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; diff --git a/src/main/java/com/ai/da/controller/ProductController.java b/src/main/java/com/ai/da/controller/ProductController.java index b22b1537..ac2e4be0 100644 --- a/src/main/java/com/ai/da/controller/ProductController.java +++ b/src/main/java/com/ai/da/controller/ProductController.java @@ -2,7 +2,7 @@ package com.ai.da.controller; import com.ai.da.common.response.Response; -import com.ai.da.mapper.entity.Product; +import com.ai.da.mapper.primary.entity.Product; import com.ai.da.service.ProductService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; diff --git a/src/main/java/com/ai/da/mapper/OrderInfoMapper.java b/src/main/java/com/ai/da/mapper/primary/OrderInfoMapper.java similarity index 60% rename from src/main/java/com/ai/da/mapper/OrderInfoMapper.java rename to src/main/java/com/ai/da/mapper/primary/OrderInfoMapper.java index 4b8b6d68..b9d74a0f 100644 --- a/src/main/java/com/ai/da/mapper/OrderInfoMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/OrderInfoMapper.java @@ -1,6 +1,6 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; -import com.ai.da.mapper.entity.OrderInfo; +import com.ai.da.mapper.primary.entity.OrderInfo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface OrderInfoMapper extends BaseMapper { diff --git a/src/main/java/com/ai/da/mapper/PaymentInfoMapper.java b/src/main/java/com/ai/da/mapper/primary/PaymentInfoMapper.java similarity index 60% rename from src/main/java/com/ai/da/mapper/PaymentInfoMapper.java rename to src/main/java/com/ai/da/mapper/primary/PaymentInfoMapper.java index 1406b6bc..27b147a4 100644 --- a/src/main/java/com/ai/da/mapper/PaymentInfoMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/PaymentInfoMapper.java @@ -1,6 +1,6 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; -import com.ai.da.mapper.entity.PaymentInfo; +import com.ai.da.mapper.primary.entity.PaymentInfo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface PaymentInfoMapper extends BaseMapper { diff --git a/src/main/java/com/ai/da/mapper/ProductMapper.java b/src/main/java/com/ai/da/mapper/primary/ProductMapper.java similarity index 59% rename from src/main/java/com/ai/da/mapper/ProductMapper.java rename to src/main/java/com/ai/da/mapper/primary/ProductMapper.java index 1ffdf2eb..69850d55 100644 --- a/src/main/java/com/ai/da/mapper/ProductMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/ProductMapper.java @@ -1,6 +1,6 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; -import com.ai.da.mapper.entity.Product; +import com.ai.da.mapper.primary.entity.Product; import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface ProductMapper extends BaseMapper { diff --git a/src/main/java/com/ai/da/mapper/RefundInfoMapper.java b/src/main/java/com/ai/da/mapper/primary/RefundInfoMapper.java similarity index 60% rename from src/main/java/com/ai/da/mapper/RefundInfoMapper.java rename to src/main/java/com/ai/da/mapper/primary/RefundInfoMapper.java index 8f9c746e..d625e3ed 100644 --- a/src/main/java/com/ai/da/mapper/RefundInfoMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/RefundInfoMapper.java @@ -1,7 +1,7 @@ -package com.ai.da.mapper; +package com.ai.da.mapper.primary; -import com.ai.da.mapper.entity.RefundInfo; +import com.ai.da.mapper.primary.entity.RefundInfo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface RefundInfoMapper extends BaseMapper { diff --git a/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java b/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java index 862feb59..b9be4bc2 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java @@ -2,10 +2,8 @@ package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; import java.io.Serializable; import java.util.Date; @@ -19,6 +17,7 @@ public class BaseEntity implements Serializable { /** * ID */ + @TableId(value = "id", type = IdType.AUTO) private Long id; /** diff --git a/src/main/java/com/ai/da/mapper/primary/entity/OrderInfo.java b/src/main/java/com/ai/da/mapper/primary/entity/OrderInfo.java index 12255f12..a4668176 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/OrderInfo.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/OrderInfo.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; diff --git a/src/main/java/com/ai/da/mapper/primary/entity/PaymentInfo.java b/src/main/java/com/ai/da/mapper/primary/entity/PaymentInfo.java index ceacf94a..8557aa83 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/PaymentInfo.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/PaymentInfo.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Product.java b/src/main/java/com/ai/da/mapper/primary/entity/Product.java index 9aa55531..de2df0cf 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/Product.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Product.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; diff --git a/src/main/java/com/ai/da/mapper/primary/entity/RefundInfo.java b/src/main/java/com/ai/da/mapper/primary/entity/RefundInfo.java index 594be318..ee07efc8 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/RefundInfo.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/RefundInfo.java @@ -1,4 +1,4 @@ -package com.ai.da.mapper.entity; +package com.ai.da.mapper.primary.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; diff --git a/src/main/java/com/ai/da/service/OrderInfoService.java b/src/main/java/com/ai/da/service/OrderInfoService.java index 1507d931..eaac6df3 100644 --- a/src/main/java/com/ai/da/service/OrderInfoService.java +++ b/src/main/java/com/ai/da/service/OrderInfoService.java @@ -2,7 +2,7 @@ package com.ai.da.service; import com.ai.da.common.enums.OrderStatusEnum; -import com.ai.da.mapper.entity.OrderInfo; +import com.ai.da.mapper.primary.entity.OrderInfo; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; diff --git a/src/main/java/com/ai/da/service/ProductService.java b/src/main/java/com/ai/da/service/ProductService.java index 9ac2597d..bf086fba 100644 --- a/src/main/java/com/ai/da/service/ProductService.java +++ b/src/main/java/com/ai/da/service/ProductService.java @@ -1,6 +1,6 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.Product; +import com.ai.da.mapper.primary.entity.Product; import com.baomidou.mybatisplus.extension.service.IService; public interface ProductService extends IService { diff --git a/src/main/java/com/ai/da/service/RefundInfoService.java b/src/main/java/com/ai/da/service/RefundInfoService.java index 014004cd..3690c794 100644 --- a/src/main/java/com/ai/da/service/RefundInfoService.java +++ b/src/main/java/com/ai/da/service/RefundInfoService.java @@ -1,7 +1,7 @@ package com.ai.da.service; -import com.ai.da.mapper.entity.RefundInfo; +import com.ai.da.mapper.primary.entity.RefundInfo; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; diff --git a/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java index a018ff9d..38d67eac 100644 --- a/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java @@ -3,8 +3,8 @@ package com.ai.da.service.impl; import com.ai.da.common.enums.AliPayTradeStateEnum; import com.ai.da.common.enums.OrderStatusEnum; import com.ai.da.common.enums.PayTypeEnum; -import com.ai.da.mapper.entity.OrderInfo; -import com.ai.da.mapper.entity.RefundInfo; +import com.ai.da.mapper.primary.entity.OrderInfo; +import com.ai.da.mapper.primary.entity.RefundInfo; import com.ai.da.service.AliPayService; import com.ai.da.service.OrderInfoService; import com.ai.da.service.PaymentInfoService; diff --git a/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java index 7e3ba77d..3c7544b6 100644 --- a/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java @@ -9,7 +9,9 @@ import com.ai.da.common.enums.LibraryLevel1TypeEnum; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.MD5Utils; import com.ai.da.common.utils.MinioUtil; +import com.ai.da.mapper.primary.AccountMapper; import com.ai.da.mapper.primary.LibraryMapper; +import com.ai.da.mapper.primary.entity.Account; import com.ai.da.mapper.primary.entity.ChatRobot; import com.ai.da.mapper.primary.ChatRobotMapper; import com.ai.da.mapper.primary.entity.Library; diff --git a/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java index aa1f5255..8b7662f7 100644 --- a/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java @@ -3,10 +3,10 @@ package com.ai.da.service.impl; import com.ai.da.common.enums.OrderStatusEnum; import com.ai.da.common.utils.OrderNoUtils; -import com.ai.da.mapper.OrderInfoMapper; -import com.ai.da.mapper.ProductMapper; -import com.ai.da.mapper.entity.OrderInfo; -import com.ai.da.mapper.entity.Product; +import com.ai.da.mapper.primary.OrderInfoMapper; +import com.ai.da.mapper.primary.ProductMapper; +import com.ai.da.mapper.primary.entity.OrderInfo; +import com.ai.da.mapper.primary.entity.Product; import com.ai.da.service.OrderInfoService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; diff --git a/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java index 4bafa595..31cca80a 100644 --- a/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java @@ -1,8 +1,8 @@ package com.ai.da.service.impl; import com.ai.da.common.enums.PayTypeEnum; -import com.ai.da.mapper.PaymentInfoMapper; -import com.ai.da.mapper.entity.PaymentInfo; +import com.ai.da.mapper.primary.PaymentInfoMapper; +import com.ai.da.mapper.primary.entity.PaymentInfo; import com.ai.da.service.PaymentInfoService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.gson.Gson; diff --git a/src/main/java/com/ai/da/service/impl/ProductServiceImpl.java b/src/main/java/com/ai/da/service/impl/ProductServiceImpl.java index 0aa9d4b3..3797b913 100644 --- a/src/main/java/com/ai/da/service/impl/ProductServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/ProductServiceImpl.java @@ -1,7 +1,7 @@ package com.ai.da.service.impl; -import com.ai.da.mapper.ProductMapper; -import com.ai.da.mapper.entity.Product; +import com.ai.da.mapper.primary.ProductMapper; +import com.ai.da.mapper.primary.entity.Product; import com.ai.da.service.ProductService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/ai/da/service/impl/RefundInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/RefundInfoServiceImpl.java index f05dd74f..b340a802 100644 --- a/src/main/java/com/ai/da/service/impl/RefundInfoServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/RefundInfoServiceImpl.java @@ -1,9 +1,9 @@ package com.ai.da.service.impl; import com.ai.da.common.utils.OrderNoUtils; -import com.ai.da.mapper.RefundInfoMapper; -import com.ai.da.mapper.entity.OrderInfo; -import com.ai.da.mapper.entity.RefundInfo; +import com.ai.da.mapper.primary.RefundInfoMapper; +import com.ai.da.mapper.primary.entity.OrderInfo; +import com.ai.da.mapper.primary.entity.RefundInfo; import com.ai.da.service.OrderInfoService; import com.ai.da.service.RefundInfoService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; From 66e10a5a801f49201d3496647b17970de48ec235 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Tue, 20 Feb 2024 10:40:36 +0800 Subject: [PATCH 21/93] =?UTF-8?q?TASK:=E4=BB=A3=E7=A0=81=E5=90=88=E5=B9=B6?= =?UTF-8?q?;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ai/da/mapper/primary/entity/BaseEntity.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java b/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java index b9be4bc2..de693f6b 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java @@ -23,17 +23,17 @@ public class BaseEntity implements Serializable { /** * 创建时间 */ - private Date createDate; + private Date createTime; /** * 更新时间 */ - private Date updateDate; + private Date updateTime; /** * 是否已删除 */ - private Integer isDeleted; +// private Integer isDeleted; /** * 用户ID From 703201dae6cd33b4178ca086cd31f4ab2f733c24 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Tue, 20 Feb 2024 11:02:41 +0800 Subject: [PATCH 22/93] =?UTF-8?q?TASK:dev=E7=AB=AF=E5=8F=A3;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 7bd28386..2d98c907 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -1,4 +1,4 @@ -server.port=17088 +server.port=5567 spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.primary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true From 258ddbab31d2400f98cd90ae781569c33a471e6b Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Tue, 20 Feb 2024 11:04:27 +0800 Subject: [PATCH 23/93] =?UTF-8?q?TASK:=E4=B8=AA=E4=BA=BA=E5=88=86=E6=94=AF?= =?UTF-8?q?=E7=AB=AF=E5=8F=A3;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 2d98c907..7bd28386 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -1,4 +1,4 @@ -server.port=5567 +server.port=17088 spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.primary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true From 002a47c169e4c72c0d170a68eb4c41318cd37985 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Tue, 20 Feb 2024 11:05:01 +0800 Subject: [PATCH 24/93] =?UTF-8?q?TASK:dev=E5=88=86=E6=94=AF=E7=AB=AF?= =?UTF-8?q?=E5=8F=A3;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 7bd28386..2d98c907 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -1,4 +1,4 @@ -server.port=17088 +server.port=5567 spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.primary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true From 8fe468fda2d436f63566eff5cf210c571cd97b12 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Tue, 20 Feb 2024 11:20:30 +0800 Subject: [PATCH 25/93] BUGFIX:Single design; --- src/main/java/com/ai/da/python/PythonService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 3179e1bd..e256b372 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -902,7 +902,7 @@ public class PythonService { QueryWrapper qw = new QueryWrapper<>(); qw.lambda().eq(Dressing::getApparel, elementVO.getModelSex()); if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { - qw.lambda().eq(Dressing::getApparel, elementVO.getSwitchCategory()); + qw.lambda().eq(Dressing::getStyleCategory, elementVO.getSwitchCategory()); } List dressings = dressingMapper.selectList(qw); if (CollectionUtil.isEmpty(dressings)) { @@ -937,7 +937,7 @@ public class PythonService { QueryWrapper qw = new QueryWrapper<>(); qw.lambda().eq(Dressing::getApparel, elementVO.getModelSex()); if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { - qw.lambda().eq(Dressing::getApparel, elementVO.getSwitchCategory()); + qw.lambda().eq(Dressing::getStyleCategory, elementVO.getSwitchCategory()); } List dressings = dressingMapper.selectList(qw); if (CollectionUtil.isEmpty(dressings)) { From 43ec55dfb6373bbfea1c1bcc19c5bf2a1a70ef48 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Wed, 21 Feb 2024 13:53:46 +0800 Subject: [PATCH 26/93] BUGFIX:Single design; --- .../ai/da/model/vo/QueryLibraryPageVO.java | 3 + .../java/com/ai/da/python/PythonService.java | 227 +++++++++++------- .../ai/da/service/impl/DesignServiceImpl.java | 10 +- 3 files changed, 150 insertions(+), 90 deletions(-) diff --git a/src/main/java/com/ai/da/model/vo/QueryLibraryPageVO.java b/src/main/java/com/ai/da/model/vo/QueryLibraryPageVO.java index eca67503..eaff197f 100644 --- a/src/main/java/com/ai/da/model/vo/QueryLibraryPageVO.java +++ b/src/main/java/com/ai/da/model/vo/QueryLibraryPageVO.java @@ -23,6 +23,9 @@ public class QueryLibraryPageVO { @ApiModelProperty("二级类型") private String level2Type; + @ApiModelProperty("三级类型") + private String level3Type; + @ApiModelProperty("design类型 用户design生成时候区别library和collection") private String designType; diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 3179e1bd..44b25d68 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -311,21 +311,21 @@ public class PythonService { return result.setScale(0, RoundingMode.HALF_UP).intValue(); } - private int calculatePinSketchNum(List sketchBoardElements, List hasUseMd5List) { - List pinData = getPinData(sketchBoardElements, hasUseMd5List); - if (CollectionUtil.isEmpty(pinData)) { - return 0; - } -// long topNum = sketchBoardElements.stream() -// .filter(skecth -> skecth.getHasPin() == 1 -// && DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(skecth.getLevel2Type())).count(); -// long bottomNum = sketchBoardElements.stream() -// .filter(skecth -> skecth.getHasPin() == 1 -// && DesignPythonItem.SKIRT_TROUSERS.contains(skecth.getLevel2Type())).count(); -// int num = Arrays.asList(topNum, bottomNum).stream().max(Comparator.comparing(Long::valueOf)).get().intValue(); - int num = pinData.size(); - return Math.min(num, 8); - } +// private int calculatePinSketchNum(List sketchBoardElements, List hasUseMd5List) { +// List pinData = getPinData(sketchBoardElements, hasUseMd5List); +// if (CollectionUtil.isEmpty(pinData)) { +// return 0; +// } +//// long topNum = sketchBoardElements.stream() +//// .filter(skecth -> skecth.getHasPin() == 1 +//// && DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(skecth.getLevel2Type())).count(); +//// long bottomNum = sketchBoardElements.stream() +//// .filter(skecth -> skecth.getHasPin() == 1 +//// && DesignPythonItem.SKIRT_TROUSERS.contains(skecth.getLevel2Type())).count(); +//// int num = Arrays.asList(topNum, bottomNum).stream().max(Comparator.comparing(Long::valueOf)).get().intValue(); +// int num = pinData.size(); +// return Math.min(num, 8); +// } //计算当前的图片类型 private CurrentDesignPictureTypeEnum calculateCurrentDesignPictureType(int pinSketchNum, int sysSketchNum, int noPinSketchNum) { @@ -377,23 +377,23 @@ public class PythonService { } //计算Pin图片张数 - private int calculatePinPictureNum(List sketchBoardElements, List hasUseMd5List) { - List pinData = getPinData(sketchBoardElements, hasUseMd5List); - if (CollectionUtil.isEmpty(pinData)) { - return 0; - } - long topNum = sketchBoardElements.stream() - .filter(skecth -> skecth.getHasPin() == 1 - && DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(skecth.getLevel2Type())).count(); - long bottomNum = sketchBoardElements.stream() - .filter(skecth -> skecth.getHasPin() == 1 - && DesignPythonItem.SKIRT_TROUSERS.contains(skecth.getLevel2Type())).count(); - int num = Arrays.asList(topNum, bottomNum).stream().max(Comparator.comparing(Long::valueOf)).get().intValue(); - if (num > 8) { - return 8; - } - return num; - } +// private int calculatePinPictureNum(List sketchBoardElements, List hasUseMd5List) { +// List pinData = getPinData(sketchBoardElements, hasUseMd5List); +// if (CollectionUtil.isEmpty(pinData)) { +// return 0; +// } +// long topNum = sketchBoardElements.stream() +// .filter(skecth -> skecth.getHasPin() == 1 +// && DesignPythonItem.OUTWEAR_DRESS_BLOUSE.contains(skecth.getLevel2Type())).count(); +// long bottomNum = sketchBoardElements.stream() +// .filter(skecth -> skecth.getHasPin() == 1 +// && DesignPythonItem.SKIRT_TROUSERS.contains(skecth.getLevel2Type())).count(); +// int num = Arrays.asList(topNum, bottomNum).stream().max(Comparator.comparing(Long::valueOf)).get().intValue(); +// if (num > 8) { +// return 8; +// } +// return num; +// } //计算当前的Print图片类型 private CurrentDesignPrintPictureTypeEnum calculateCurrentDesignPintPictureType(long pinPrintNum, long noPinPrintNum, long noPrintNum) { @@ -478,42 +478,42 @@ public class PythonService { } } - private List coverToDesignPythonItem(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType) { - //Pin的数据 - List pinData = getPinData(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List()); - //计算填充PythonItemBlouse - List items = Lists.newArrayList(); - if (elementVO.getModelSex().equals("Female")) { - List blouseList = calculatePythonItemBlouse(pinData, elementVO, designPictureType); - if (!CollectionUtils.isEmpty(blouseList)) { - items.addAll(blouseList); - } - //计算填充PythonItemSkirt - DesignPythonItem skirt = calculatePythonItemSkirt(pinData, elementVO, designPictureType); - if (Objects.nonNull(skirt)) { - items.add(skirt); - } - } else { - // 男装逻辑 - DesignPythonItem top = calculatePythonItemTop(pinData, elementVO, designPictureType); - if (Objects.nonNull(top)) { - items.add(top); - } - DesignPythonItem bottom = calculatePythonItemBottom(pinData, elementVO, designPictureType); - if (Objects.nonNull(bottom)) { - items.add(bottom); - } - if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall()) && elementVO.getSwitchCategory().equals("Outwear")) { - DesignPythonItem outwear = calculatePythonItemOutwear(pinData, elementVO, designPictureType); - if (Objects.nonNull(outwear)) { - items.add(outwear); - } - } - } - //计算填充Hairstyle Earring Shoes Body - items.addAll(calculatePythonItemHairstyleShoes(elementVO, elementVO.getDesignLibraryModelPoint())); - return items; - } +// private List coverToDesignPythonItem(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType) { +// //Pin的数据 +// List pinData = getPinData(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List()); +// //计算填充PythonItemBlouse +// List items = Lists.newArrayList(); +// if (elementVO.getModelSex().equals("Female")) { +// List blouseList = calculatePythonItemBlouse(pinData, elementVO, designPictureType); +// if (!CollectionUtils.isEmpty(blouseList)) { +// items.addAll(blouseList); +// } +// //计算填充PythonItemSkirt +// DesignPythonItem skirt = calculatePythonItemSkirt(pinData, elementVO, designPictureType); +// if (Objects.nonNull(skirt)) { +// items.add(skirt); +// } +// } else { +// // 男装逻辑 +// DesignPythonItem top = calculatePythonItemTop(pinData, elementVO, designPictureType); +// if (Objects.nonNull(top)) { +// items.add(top); +// } +// DesignPythonItem bottom = calculatePythonItemBottom(pinData, elementVO, designPictureType); +// if (Objects.nonNull(bottom)) { +// items.add(bottom); +// } +// if (SingleOverallEnum.SINGLE.getRealName().equals(elementVO.getSingleOverall()) && elementVO.getSwitchCategory().equals("Outwear")) { +// DesignPythonItem outwear = calculatePythonItemOutwear(pinData, elementVO, designPictureType); +// if (Objects.nonNull(outwear)) { +// items.add(outwear); +// } +// } +// } +// //计算填充Hairstyle Earring Shoes Body +// items.addAll(calculatePythonItemHairstyleShoes(elementVO, elementVO.getDesignLibraryModelPoint())); +// return items; +// } private List coverToDesignPythonItemNew(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType, BigDecimal systemScale) { List itemList = new ArrayList<>(); @@ -575,7 +575,12 @@ public class PythonService { } case NO_PIN: case SYS_FILE: { - List collectNoPin = elementVO.getSketchBoardElements().stream().filter(o -> o.getHasPin() == 0 && o.getLevel2Type().equals(styleCategory)).collect(Collectors.toList()); + List collectNoPin; + if (CollectionUtils.isEmpty(elementVO.getSketchBoardElements())) { + collectNoPin = null; + }else { + collectNoPin = elementVO.getSketchBoardElements().stream().filter(o -> o.getHasPin() == 0 && o.getLevel2Type().equals(styleCategory)).collect(Collectors.toList()); + } int poolNum = 20; if (CollectionUtil.isNotEmpty(collectNoPin)) { int collectionNoPinSize = collectNoPin.size(); @@ -887,8 +892,7 @@ public class PythonService { List noPinData = getNoPinData(elementVO); if (CollectionUtil.isEmpty(noPinData)) { // 根据pin的获取 type - List sketchBoardPins = elementVO.getSketchBoardElements() - .stream().filter(v -> v.getHasPin() == 1).collect(Collectors.toList()); + List sketchBoardPins = getPinDataWhole(elementVO); if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { sketchBoardPins = sketchBoardPins.stream().filter(o -> o.getLevel2Type().equals(elementVO.getSwitchCategory())).collect(Collectors.toList()); } @@ -924,16 +928,23 @@ public class PythonService { case SYS_FILE: { // 根据pin noPin的获取 type List sketchBoardPins = elementVO.getSketchBoardElements(); - if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { - sketchBoardPins = sketchBoardPins.stream().filter(o -> o.getLevel2Type().equals(elementVO.getSwitchCategory())).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(sketchBoardPins)) { + if (elementVO.getModelSex().equals(Sex.MALE.getValue())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> MALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); + } + if (elementVO.getModelSex().equals(Sex.FEMALE.getValue())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> FEMALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); + } + if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> o.getLevel2Type().equals(elementVO.getSwitchCategory())).collect(Collectors.toList()); + } + if (CollectionUtil.isNotEmpty(sketchBoardPins)) { + Integer randomNum = RandomsUtil.randomSysFile(sketchBoardPins.size()); + CollectionElement element = sketchBoardPins.get(randomNum); + JSONObject attributeRecognition = getAttributeRecognitionBySameCategory(element, elementVO.getModelSex()); + return processAttributeRecognitionBySameCategory(attributeRecognition, elementVO, element.getLevel2Type()); + } } - if (CollectionUtil.isNotEmpty(sketchBoardPins)) { - Integer randomNum = RandomsUtil.randomSysFile(sketchBoardPins.size()); - CollectionElement element = sketchBoardPins.get(randomNum); - JSONObject attributeRecognition = getAttributeRecognitionBySameCategory(element, elementVO.getModelSex()); - return processAttributeRecognitionBySameCategory(attributeRecognition, elementVO, element.getLevel2Type()); - } - QueryWrapper qw = new QueryWrapper<>(); qw.lambda().eq(Dressing::getApparel, elementVO.getModelSex()); if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { @@ -2004,7 +2015,7 @@ public class PythonService { } private List getPinData(ValidateElementVO elementVO) { - List pinData = getPinData(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List()); + List pinData = getPinData(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List(), elementVO.getModelSex()); if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { if (!CollectionUtils.isEmpty(pinData)) { return pinData.stream().filter(o -> o.getLevel2Type().equals(elementVO.getSwitchCategory())).collect(Collectors.toList()); @@ -2016,12 +2027,52 @@ public class PythonService { } } - private List getPinData(List sketchBoardElements, List hasUseMd5List) { + private List getPinDataWhole(ValidateElementVO elementVO) { + List pinData = getPinDataWhole(elementVO.getSketchBoardElements(), elementVO.getHasUseMd5List(), elementVO.getModelSex()); + if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + if (!CollectionUtils.isEmpty(pinData)) { + return pinData.stream().filter(o -> o.getLevel2Type().equals(elementVO.getSwitchCategory())).collect(Collectors.toList()); + }else { + return pinData; + } + }else { + return pinData; + } + } + + private List getPinDataWhole(List sketchBoardElements, List hasUseMd5List, String modelSex) { + if (CollectionUtils.isEmpty(sketchBoardElements)) { + return null; + } + List sketchBoardPins = sketchBoardElements + .stream().filter(v -> v.getHasPin() == 1).collect(Collectors.toList()); + if (modelSex.equals(Sex.MALE.getValue())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> MALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); + } + if (modelSex.equals(Sex.FEMALE.getValue())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> FEMALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); + } + if (CollectionUtils.isEmpty(sketchBoardPins)) { + return null; + } + return sketchBoardPins; + } + + public final static List FEMALE_CATEGORY = Arrays.asList("Dress","Blouse","Skirt","Trousers","Outwear"); + public final static List MALE_CATEGORY = Arrays.asList("Tops","Bottoms","Outwear"); + + private List getPinData(List sketchBoardElements, List hasUseMd5List, String modelSex) { if (CollectionUtils.isEmpty(sketchBoardElements)) { return null; } List sketchBoardPins = sketchBoardElements .stream().filter(v -> v.getHasPin() == 1 && (!hasUseMd5List.contains(v.getMd5()))).collect(Collectors.toList()); + if (modelSex.equals(Sex.MALE.getValue())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> MALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); + } + if (modelSex.equals(Sex.FEMALE.getValue())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> FEMALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); + } if (CollectionUtils.isEmpty(sketchBoardPins)) { return null; } @@ -2030,22 +2081,28 @@ public class PythonService { private List getNoPinData(ValidateElementVO elementVO) { if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { - List noPinData = getNoPinData(elementVO.getSketchBoardElements()); + List noPinData = getNoPinData(elementVO.getSketchBoardElements(), elementVO.getModelSex()); if (CollectionUtils.isEmpty(noPinData)) { return null; } return noPinData.stream().filter(o -> o.getLevel2Type().equals(elementVO.getSwitchCategory())).collect(Collectors.toList()); }else { - return getNoPinData(elementVO.getSketchBoardElements()); + return getNoPinData(elementVO.getSketchBoardElements(), elementVO.getModelSex()); } } - private List getNoPinData(List sketchBoardElements) { + private List getNoPinData(List sketchBoardElements, String modelSex) { if (CollectionUtils.isEmpty(sketchBoardElements)) { return null; } List sketchBoardPins = sketchBoardElements .stream().filter(v -> v.getHasPin() == 0).collect(Collectors.toList()); + if (modelSex.equals(Sex.MALE.getValue())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> MALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); + } + if (modelSex.equals(Sex.FEMALE.getValue())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> FEMALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); + } if (CollectionUtils.isEmpty(sketchBoardPins)) { return null; } diff --git a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java index 783b2038..e0f27be9 100644 --- a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java @@ -304,7 +304,7 @@ public class DesignServiceImpl extends ServiceImpl impleme //保存design Long designId = saveOne(designDTO, collectionId, userInfo.getId()); //计算library - calculateLibraryAndSysFile(designDTO, elementVO, userInfo); +// calculateLibraryAndSysFile(designDTO, elementVO, userInfo); //组装design入参 DesignPythonObjects pythonObjects = pythonService.covertDesignParam(designDTO.getSystemScale(), designDTO.getSingleOverall(), designDTO.getSwitchCategory(), elementVO, designDTO.getProcessId()); @@ -702,10 +702,10 @@ public class DesignServiceImpl extends ServiceImpl impleme throw new BusinessException("collection.not.found"); } AuthPrincipalVo userInfo = UserContext.getUserHolder(); - //查询用户 sketch library - List libraryVos = libraryService.selectByAccountIdAnd1TypeList(userInfo.getId(), - Arrays.asList(CollectionLevel1TypeEnum.PRINT_BOARD.getRealName(), - CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName())); +// //查询用户 sketch library +// List libraryVos = libraryService.selectByAccountIdAnd1TypeList(userInfo.getId(), +// Arrays.asList(CollectionLevel1TypeEnum.PRINT_BOARD.getRealName(), +// CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName())); //校验collection element DesignCollectionDTO designCollectionDTO = CopyUtil.copyObject(reDesignDTO, DesignCollectionDTO.class); ValidateElementVO elementVO = collectionElementService.validateElement(designCollectionDTO); From 22330b674afbc34a87ad89bd71e645660e8b5159 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Wed, 21 Feb 2024 15:16:51 +0800 Subject: [PATCH 27/93] =?UTF-8?q?BUGFIX:=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ai/da/python/PythonService.java | 436 ++++++++---------- .../ai/da/service/impl/DesignServiceImpl.java | 59 +-- 2 files changed, 238 insertions(+), 257 deletions(-) diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 44b25d68..4d7da8d2 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -217,71 +217,75 @@ public class PythonService { public DesignPythonObjects covertDesignParam(BigDecimal systemScale, String singleOverall, String switchCategory, ValidateElementVO elementVO, String processId) { DesignPythonObjects designPythonObjects = new DesignPythonObjects(); - List objects = Lists.newArrayList(); + List objects = new ArrayList<>(); designPythonObjects.setObjects(objects); designPythonObjects.setProcess_id(processId); + long pinPrintNum = calculateDesignPinPrintNum(elementVO.getPrintBoardElements()); long noPinPrintNum = calculateDesignNoPinPrintNum(elementVO.getPrintBoardElements()); - //没有print的 long noPrintNum = 8 - pinPrintNum - noPinPrintNum; elementVO.setNoPinPrintNum(noPinPrintNum); - //系统比列 -// BigDecimal sysRatio = systemScale; int pinSketchNum = 0; int sysSketchNum = 0; int noPinSketchNum = 0; for (int i = 0; i < 8; i++) { - //sketch计算 CurrentDesignPictureTypeEnum designPictureType = calculateCurrentDesignPictureTypeNew(elementVO, pinSketchNum, sysSketchNum, noPinSketchNum, systemScale); - if (Objects.isNull(designPictureType)) { - break; - } - //print计算 + if (designPictureType == null) break; + CurrentDesignPrintPictureTypeEnum designPrintPictureType = calculateCurrentDesignPintPictureType(pinPrintNum, noPinPrintNum, noPrintNum); - if (Objects.isNull(designPrintPictureType)) { - break; - } - switch (designPictureType) { - case PIN: - pinSketchNum ++; - break; - case NO_PIN: - noPinSketchNum --; - break; - case SYS_FILE: - sysSketchNum --; - break; - default: - } - switch (designPrintPictureType) { - case PIN: - pinPrintNum--; - break; - case NO_PIN: - noPinPrintNum--; - break; - case NO: - noPrintNum--; - break; - default: - } - //确定本次designSingle是否print + if (designPrintPictureType == null) break; + + updateSketchNumbers(designPictureType, pinSketchNum, sysSketchNum, noPinSketchNum); + updatePrintNumbers(designPrintPictureType, pinPrintNum, noPinPrintNum, noPrintNum); + DesignPythonItemPrint designPythonItemPrint = getRandomPrint(elementVO, designPrintPictureType); elementVO.setDesignPythonItemPrint(designPythonItemPrint); - //参数透传 确定本次designSingle如果需要print对应的种类 elementVO.setDesignPrintPictureTypeLayoutList(calculateCurrentDesignPintPictureTypeLayout(elementVO.getModelSex())); - //designSingle具体参数组装 - DesignPythonObject pythonObject = new DesignPythonObject(); - pythonObject.setItems(coverToDesignPythonItemNew(elementVO, designPictureType, systemScale)); - pythonObject.setBasic(coverToBasic(pythonObject.getItems().get(0), - singleOverall, switchCategory, elementVO.getDesignLibraryModelPoint())); + + DesignPythonObject pythonObject = createDesignPythonObject(elementVO, designPictureType, systemScale, singleOverall, switchCategory); objects.add(pythonObject); } return designPythonObjects; } + private void updateSketchNumbers(CurrentDesignPictureTypeEnum designPictureType, int pinSketchNum, int sysSketchNum, int noPinSketchNum) { + switch (designPictureType) { + case PIN: + pinSketchNum++; + break; + case NO_PIN: + noPinSketchNum--; + break; + case SYS_FILE: + sysSketchNum--; + break; + } + } + + private void updatePrintNumbers(CurrentDesignPrintPictureTypeEnum designPrintPictureType, long pinPrintNum, long noPinPrintNum, long noPrintNum) { + switch (designPrintPictureType) { + case PIN: + pinPrintNum--; + break; + case NO_PIN: + noPinPrintNum--; + break; + case NO: + noPrintNum--; + break; + } + } + + private DesignPythonObject createDesignPythonObject(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType, BigDecimal systemScale, String singleOverall, String switchCategory) { + DesignPythonObject pythonObject = new DesignPythonObject(); + pythonObject.setItems(coverToDesignPythonItemNew(elementVO, designPictureType, systemScale)); + pythonObject.setBasic(coverToBasic(pythonObject.getItems().get(0), singleOverall, switchCategory, elementVO.getDesignLibraryModelPoint())); + return pythonObject; + } + + private CurrentDesignPictureTypeEnum calculateCurrentDesignPictureTypeNew(ValidateElementVO elementVO, int pinSketchNum, int sysSketchNum, int noPinSketchNum, BigDecimal systemScale) { List pinData = getPinData(elementVO); if (CollectionUtil.isNotEmpty(pinData)) { @@ -517,14 +521,12 @@ public class PythonService { private List coverToDesignPythonItemNew(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType, BigDecimal systemScale) { List itemList = new ArrayList<>(); - // 根据当前designPictureType确定单一部位的sketch DesignPythonItem designPythonItem = calculatePythonItem(elementVO, designPictureType); if (Objects.nonNull(designPythonItem)) { itemList.add(designPythonItem); if (elementVO.getSingleOverall().equals(SingleOverallEnum.OVERALL.getRealName())) { - // 根据确定的单一部位sketch,确定一整套穿搭 List otherSketchCategoryList = getOtherSketchCategoryList(elementVO.getModelSex(), designPythonItem); - if (!CollectionUtils.isEmpty(otherSketchCategoryList)) { + if (!otherSketchCategoryList.isEmpty()) { JSONObject attributeRecognition = getAttributeRecognition(designPythonItem, designPythonItem.getType(), elementVO.getModelSex()); for (String styleCategory : otherSketchCategoryList) { DesignPythonItem otherSketch = processAttributeRecognition(attributeRecognition, elementVO, designPictureType, styleCategory, systemScale); @@ -539,76 +541,62 @@ public class PythonService { private DesignPythonItem processAttributeRecognition(JSONObject attributeRecognition, ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType, String styleCategory, BigDecimal systemScale) { switch (designPictureType) { - case PIN: { - // 优先去pin里面找符合类别的 - List collectPin = elementVO.getSketchBoardElements().stream().filter(o -> o.getHasPin() == 1 && o.getLevel2Type().equals(styleCategory)).collect(Collectors.toList()); - if (CollectionUtil.isNotEmpty(collectPin)) { - int randomNum = RandomsUtil.randomSysFile(collectPin.size()); - elementVO.getHasUseMd5List().add(collectPin.get(randomNum).getMd5()); - return coverSketchToDesignPythonItem(collectPin.get(randomNum).getId(), collectPin.get(randomNum), elementVO); - }else { - // 找不到就根据特征找一个系统池子,与noPinSketch组成一个池子,如果没有noPinSketch就只由系统池子作为池子。 - List collectNoPin = elementVO.getSketchBoardElements().stream().filter(o -> o.getHasPin() == 0 && o.getLevel2Type().equals(styleCategory)).collect(Collectors.toList()); - int poolNum = 20; - if (CollectionUtil.isNotEmpty(collectNoPin)) { - int collectionNoPinSize = collectNoPin.size(); - if (systemScale.compareTo(BigDecimal.ZERO) == 0) { - int randomNum = RandomsUtil.randomSysFile(collectNoPin.size()); - return coverSketchToDesignPythonItem(null, collectNoPin.get(randomNum), elementVO); - }else if (systemScale.compareTo(BigDecimal.ONE) != 0) { - BigDecimal collectNoPinSize = BigDecimal.valueOf(collectNoPin.size()); - poolNum = collectNoPinSize.divide(systemScale, 0, RoundingMode.DOWN).intValue(); - List list = getSystemSketchPool(attributeRecognition, styleCategory, elementVO.getModelSex(), poolNum); - collectNoPin.addAll(list); - int randomNum = RandomsUtil.randomSysFile(collectNoPin.size()); - if (randomNum < collectionNoPinSize) { - return coverSketchToDesignPythonItem(collectNoPin.get(randomNum).getId(), collectNoPin.get(randomNum), elementVO); - }else { - return coverSketchToDesignPythonItem(null, collectNoPin.get(randomNum), elementVO); - } - } - } - List list = getSystemSketchPool(attributeRecognition, styleCategory, elementVO.getModelSex(), poolNum); - int randomNum = RandomsUtil.randomSysFile(list.size()); - return coverSketchToDesignPythonItem(null, list.get(randomNum), elementVO); - } - } + case PIN: + return processPinAttributeRecognition(attributeRecognition, elementVO, styleCategory, systemScale); case NO_PIN: - case SYS_FILE: { - List collectNoPin; - if (CollectionUtils.isEmpty(elementVO.getSketchBoardElements())) { - collectNoPin = null; - }else { - collectNoPin = elementVO.getSketchBoardElements().stream().filter(o -> o.getHasPin() == 0 && o.getLevel2Type().equals(styleCategory)).collect(Collectors.toList()); - } - int poolNum = 20; - if (CollectionUtil.isNotEmpty(collectNoPin)) { - int collectionNoPinSize = collectNoPin.size(); - if (systemScale.compareTo(BigDecimal.ZERO) == 0) { - int randomNum = RandomsUtil.randomSysFile(collectNoPin.size()); - return coverSketchToDesignPythonItem(null, collectNoPin.get(randomNum), elementVO); - }else if (systemScale.compareTo(BigDecimal.ONE) != 0) { - BigDecimal collectNoPinSize = BigDecimal.valueOf(collectNoPin.size()); - poolNum = collectNoPinSize.divide(systemScale, 0, RoundingMode.DOWN).intValue(); - List list = getSystemSketchPool(attributeRecognition, styleCategory, elementVO.getModelSex(), poolNum); - collectNoPin.addAll(list); - int randomNum = RandomsUtil.randomSysFile(collectNoPin.size()); - if (randomNum < collectionNoPinSize) { - return coverSketchToDesignPythonItem(collectNoPin.get(randomNum).getId(), collectNoPin.get(randomNum), elementVO); - }else { - return coverSketchToDesignPythonItem(null, collectNoPin.get(randomNum), elementVO); - } - } - } - List list = getSystemSketchPool(attributeRecognition, styleCategory, elementVO.getModelSex(), poolNum); - int randomNum = RandomsUtil.randomSysFile(list.size()); - return coverSketchToDesignPythonItem(null, list.get(randomNum), elementVO); - } + case SYS_FILE: + return processNoPinOrSysFileAttributeRecognition(attributeRecognition, elementVO, styleCategory, systemScale); default: throw new BusinessException("unknown designPictureType"); } } + private DesignPythonItem processPinAttributeRecognition(JSONObject attributeRecognition, ValidateElementVO elementVO, String styleCategory, BigDecimal systemScale) { + List collectPin = getFilteredCollectionElements(elementVO.getSketchBoardElements(), 1, styleCategory); + if (CollectionUtil.isNotEmpty(collectPin)) { + int randomNum = RandomsUtil.randomSysFile(collectPin.size()); + elementVO.getHasUseMd5List().add(collectPin.get(randomNum).getMd5()); + return coverSketchToDesignPythonItem(collectPin.get(randomNum).getId(), collectPin.get(randomNum), elementVO); + } else { + List collectNoPin = getFilteredCollectionElements(elementVO.getSketchBoardElements(), 0, styleCategory); + return processNoPinOrSysFileAttributeRecognitionWithPool(collectNoPin, attributeRecognition, elementVO, styleCategory, systemScale); + } + } + + private DesignPythonItem processNoPinOrSysFileAttributeRecognition(JSONObject attributeRecognition, ValidateElementVO elementVO, String styleCategory, BigDecimal systemScale) { + List collectNoPin = getFilteredCollectionElements(elementVO.getSketchBoardElements(), 0, styleCategory); + return processNoPinOrSysFileAttributeRecognitionWithPool(collectNoPin, attributeRecognition, elementVO, styleCategory, systemScale); + } + + private DesignPythonItem processNoPinOrSysFileAttributeRecognitionWithPool(List collectionElements, JSONObject attributeRecognition, ValidateElementVO elementVO, String styleCategory, BigDecimal systemScale) { + int poolNum = 20; + if (CollectionUtil.isNotEmpty(collectionElements)) { + int collectionNoPinSize = collectionElements.size(); + if (systemScale.compareTo(BigDecimal.ZERO) == 0) { + int randomNum = RandomsUtil.randomSysFile(collectionNoPinSize); + return coverSketchToDesignPythonItem(null, collectionElements.get(randomNum), elementVO); + } else if (systemScale.compareTo(BigDecimal.ONE) != 0) { + BigDecimal collectNoPinSize = BigDecimal.valueOf(collectionNoPinSize); + poolNum = collectNoPinSize.divide(systemScale, 0, RoundingMode.DOWN).intValue(); + List list = getSystemSketchPool(attributeRecognition, styleCategory, elementVO.getModelSex(), poolNum); + collectionElements.addAll(list); + int randomNum = RandomsUtil.randomSysFile(collectionElements.size()); + if (randomNum < collectionNoPinSize) { + return coverSketchToDesignPythonItem(collectionElements.get(randomNum).getId(), collectionElements.get(randomNum), elementVO); + } else { + return coverSketchToDesignPythonItem(null, collectionElements.get(randomNum), elementVO); + } + } + } + List list = getSystemSketchPool(attributeRecognition, styleCategory, elementVO.getModelSex(), poolNum); + int randomNum = RandomsUtil.randomSysFile(list.size()); + return coverSketchToDesignPythonItem(null, list.get(randomNum), elementVO); + } + + private List getFilteredCollectionElements(List elements, int hasPin, String styleCategory) { + return CollectionUtil.isNotEmpty(elements) ? elements.stream().filter(o -> o.getHasPin() == hasPin && o.getLevel2Type().equals(styleCategory)).collect(Collectors.toList()) : null; + } + private DesignPythonItem processAttributeRecognitionBySameCategory(JSONObject attributeRecognition, ValidateElementVO elementVO, String styleCategory) { List list = getSystemSketchPoolBySameCategory(attributeRecognition, styleCategory, elementVO.getModelSex()); int randomNum = RandomsUtil.randomSysFile(list.size()); @@ -750,16 +738,13 @@ public class PythonService { } public JSONObject getAttributeRecognition(DesignPythonItem designPythonItem, String styleCategory, String modelSex) { - // todo 限流校验 -// AccessLimitUtils.validate("design",5); OkHttpClient client = new OkHttpClient().newBuilder() .connectTimeout(30, TimeUnit.SECONDS) - .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) - .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒) - .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒) + .readTimeout(60, TimeUnit.SECONDS) + .writeTimeout(60, TimeUnit.SECONDS) .build(); MediaType mediaType = MediaType.parse("application/json"); - //关闭FastJson的引用检测 防止出现$ref 现象 + JSONObject paramJSONObject = new JSONObject(); paramJSONObject.put("category", styleCategory); paramJSONObject.put("colony", modelSex); @@ -767,42 +752,29 @@ public class PythonService { JSONArray paramArray = new JSONArray(); paramArray.add(paramJSONObject); String param = JSON.toJSONString(paramArray, SerializerFeature.DisableCircularReferenceDetect); - log.info("design请求python 参数:####{}", param); + + log.info("PythonService##design 请求参数:####{}", param); RequestBody body = RequestBody.create(mediaType, param); Request request = new Request.Builder() .url(accessPythonIp + ":" + accessPythonPort + "/api/attribute_recognition") .method("POST", body) -// .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") .addHeader("Content-Type", "application/json") .build(); - Response response; - String responseBody; - try { - response = client.newCall(request).execute(); - } catch (IOException ioException) { - AccessLimitUtils.validateOut("design"); - log.error("PythonService##design异常###{}", ExceptionUtil.getThrowableList(ioException)); - throw new BusinessException("design.interface.exception"); - } - //去除限流 -// AccessLimitUtils.validateOut("design"); - if (response.isSuccessful()) { - try { - if (Objects.nonNull(response.body())) { - responseBody = response.body().string(); - JSONObject responseObject = JSON.parseObject(responseBody); - log.info("PythonService##responseObject###{}", responseObject); - return responseObject; - } - throw new BusinessException("design.interface.exception"); - } catch (IOException | JSONException e) { - log.error("PythonService##design异常###{}", e.getMessage()); - throw new BusinessException("design.interface.exception"); + + try (Response response = client.newCall(request).execute()) { + if (response.isSuccessful()) { + String responseBody = Objects.requireNonNull(response.body()).string(); + JSONObject responseObject = JSON.parseObject(responseBody); + log.info("PythonService##responseObject###{}", responseObject); + return responseObject; + } else { + log.error("PythonService##design 请求异常:{}", response); + throw new BusinessException("attributeRecognition.interface.exception"); } + } catch (IOException e) { + log.error("PythonService##design 请求异常:{}", e.getMessage()); + throw new BusinessException("attributeRecognition.interface.exception"); } - log.error("PythonService##design异常response###{}", response); - //生成失败 - throw new BusinessException("design.interface.exception"); } public JSONObject getAttributeRecognitionBySameCategory(CollectionElement element, String modelSex) { @@ -876,98 +848,100 @@ public class PythonService { return null; } - private DesignPythonItem calculatePythonItem(ValidateElementVO elementVO, CurrentDesignPictureTypeEnum designPictureType) { - switch (designPictureType) { - case PIN: { - List pinData = getPinData(elementVO); - if (CollectionUtil.isEmpty(pinData)) { - throw new BusinessException("pinData is null"); - } - Random random = new Random(); - int randomNumber = random.nextInt(pinData.size()); - elementVO.getHasUseMd5List().add(pinData.get(randomNumber).getMd5()); - return coverSketchToDesignPythonItem(pinData.get(randomNumber).getId(), pinData.get(randomNumber), elementVO); - } - case NO_PIN: { - List noPinData = getNoPinData(elementVO); - if (CollectionUtil.isEmpty(noPinData)) { - // 根据pin的获取 type - List sketchBoardPins = getPinDataWhole(elementVO); - if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { - sketchBoardPins = sketchBoardPins.stream().filter(o -> o.getLevel2Type().equals(elementVO.getSwitchCategory())).collect(Collectors.toList()); - } - if (CollectionUtil.isNotEmpty(sketchBoardPins)) { - Integer randomNum = RandomsUtil.randomSysFile(sketchBoardPins.size()); - CollectionElement element = sketchBoardPins.get(randomNum); - JSONObject attributeRecognition = getAttributeRecognitionBySameCategory(element, elementVO.getModelSex()); - return processAttributeRecognitionBySameCategory(attributeRecognition, elementVO, element.getLevel2Type()); - } - - QueryWrapper qw = new QueryWrapper<>(); - qw.lambda().eq(Dressing::getApparel, elementVO.getModelSex()); - if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { - qw.lambda().eq(Dressing::getApparel, elementVO.getSwitchCategory()); - } - List dressings = dressingMapper.selectList(qw); - if (CollectionUtil.isEmpty(dressings)) { - throw new BusinessException("dressings is null"); - } - Integer randomNum = RandomsUtil.randomSysFile(dressings.size()); - String category = dressings.get(randomNum).getStyleCategory(); - String tableName; - tableName = getTableName(elementVO.getModelSex(), category); - - AttributeRetrieval attributeRetrieval = attributeRetrievalMapper.getSystemRandom(tableName); - CollectionElement collectionElement = toCollectionElement(attributeRetrieval, category, elementVO.getModelSex()); - return coverSketchToDesignPythonItem(null, collectionElement, elementVO); - } - Random random = new Random(); - int randomNumber = random.nextInt(noPinData.size()); - return coverSketchToDesignPythonItem(noPinData.get(randomNumber).getId(), noPinData.get(randomNumber), elementVO); - } - case SYS_FILE: { - // 根据pin noPin的获取 type - List sketchBoardPins = elementVO.getSketchBoardElements(); - if (!CollectionUtils.isEmpty(sketchBoardPins)) { - if (elementVO.getModelSex().equals(Sex.MALE.getValue())) { - sketchBoardPins = sketchBoardPins.stream().filter(o -> MALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); - } - if (elementVO.getModelSex().equals(Sex.FEMALE.getValue())) { - sketchBoardPins = sketchBoardPins.stream().filter(o -> FEMALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); - } - if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { - sketchBoardPins = sketchBoardPins.stream().filter(o -> o.getLevel2Type().equals(elementVO.getSwitchCategory())).collect(Collectors.toList()); - } - if (CollectionUtil.isNotEmpty(sketchBoardPins)) { - Integer randomNum = RandomsUtil.randomSysFile(sketchBoardPins.size()); - CollectionElement element = sketchBoardPins.get(randomNum); - JSONObject attributeRecognition = getAttributeRecognitionBySameCategory(element, elementVO.getModelSex()); - return processAttributeRecognitionBySameCategory(attributeRecognition, elementVO, element.getLevel2Type()); - } - } - QueryWrapper qw = new QueryWrapper<>(); - qw.lambda().eq(Dressing::getApparel, elementVO.getModelSex()); - if (elementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { - qw.lambda().eq(Dressing::getApparel, elementVO.getSwitchCategory()); - } - List dressings = dressingMapper.selectList(qw); - if (CollectionUtil.isEmpty(dressings)) { - throw new BusinessException("dressings is null"); - } - Integer randomNum = RandomsUtil.randomSysFile(dressings.size()); - String category = dressings.get(randomNum).getStyleCategory(); - String tableName; - tableName = getTableName(elementVO.getModelSex(), category); - - AttributeRetrieval attributeRetrieval = attributeRetrievalMapper.getSystemRandom(tableName); - CollectionElement collectionElement = toCollectionElement(attributeRetrieval, category, elementVO.getModelSex()); - return coverSketchToDesignPythonItem(null, collectionElement, elementVO); - } + private DesignPythonItem calculatePythonItem(ValidateElementVO validateElementVO, CurrentDesignPictureTypeEnum currentDesignPictureType) { + switch (currentDesignPictureType) { + case PIN: + return calculatePinPythonItem(validateElementVO); + case NO_PIN: + return calculateNoPinPythonItem(validateElementVO); + case SYS_FILE: + return calculateSysFilePythonItem(validateElementVO); default: return null; } } + private DesignPythonItem calculatePinPythonItem(ValidateElementVO validateElementVO) { + List pinCollectionData = getPinData(validateElementVO); + if (CollectionUtil.isEmpty(pinCollectionData)) { + throw new BusinessException("pinData is null"); + } + Random random = new Random(); + int randomNumber = random.nextInt(pinCollectionData.size()); + validateElementVO.getHasUseMd5List().add(pinCollectionData.get(randomNumber).getMd5()); + return coverSketchToDesignPythonItem(pinCollectionData.get(randomNumber).getId(), pinCollectionData.get(randomNumber), validateElementVO); + } + + private DesignPythonItem calculateNoPinPythonItem(ValidateElementVO validateElementVO) { + List noPinCollectionData = getNoPinData(validateElementVO); + if (CollectionUtil.isEmpty(noPinCollectionData)) { + List sketchBoardPins = getPinDataWhole(validateElementVO); + if (validateElementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + sketchBoardPins = sketchBoardPins.stream().filter(o -> o.getLevel2Type().equals(validateElementVO.getSwitchCategory())).collect(Collectors.toList()); + } + if (CollectionUtil.isNotEmpty(sketchBoardPins)) { + Integer randomNum = RandomsUtil.randomSysFile(sketchBoardPins.size()); + CollectionElement element = sketchBoardPins.get(randomNum); + JSONObject attributeRecognition = getAttributeRecognitionBySameCategory(element, validateElementVO.getModelSex()); + return processAttributeRecognitionBySameCategory(attributeRecognition, validateElementVO, element.getLevel2Type()); + } + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(Dressing::getApparel, validateElementVO.getModelSex()); + if (validateElementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + qw.lambda().eq(Dressing::getApparel, validateElementVO.getSwitchCategory()); + } + List dressings = dressingMapper.selectList(qw); + if (CollectionUtil.isEmpty(dressings)) { + throw new BusinessException("dressings is null"); + } + Integer randomNum = RandomsUtil.randomSysFile(dressings.size()); + String category = dressings.get(randomNum).getStyleCategory(); + String tableName = getTableName(validateElementVO.getModelSex(), category); + AttributeRetrieval attributeRetrieval = attributeRetrievalMapper.getSystemRandom(tableName); + CollectionElement collectionElement = toCollectionElement(attributeRetrieval, category, validateElementVO.getModelSex()); + return coverSketchToDesignPythonItem(null, collectionElement, validateElementVO); + } + Random random = new Random(); + int randomNumber = random.nextInt(noPinCollectionData.size()); + return coverSketchToDesignPythonItem(noPinCollectionData.get(randomNumber).getId(), noPinCollectionData.get(randomNumber), validateElementVO); + } + + private DesignPythonItem calculateSysFilePythonItem(ValidateElementVO validateElementVO) { + List sketchBoardCollectionElements = validateElementVO.getSketchBoardElements(); + if (!CollectionUtils.isEmpty(sketchBoardCollectionElements)) { + if (validateElementVO.getModelSex().equals(Sex.MALE.getValue())) { + sketchBoardCollectionElements = sketchBoardCollectionElements.stream().filter(o -> MALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); + } + if (validateElementVO.getModelSex().equals(Sex.FEMALE.getValue())) { + sketchBoardCollectionElements = sketchBoardCollectionElements.stream().filter(o -> FEMALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); + } + if (validateElementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + sketchBoardCollectionElements = sketchBoardCollectionElements.stream().filter(o -> o.getLevel2Type().equals(validateElementVO.getSwitchCategory())).collect(Collectors.toList()); + } + if (CollectionUtil.isNotEmpty(sketchBoardCollectionElements)) { + Integer randomNum = RandomsUtil.randomSysFile(sketchBoardCollectionElements.size()); + CollectionElement element = sketchBoardCollectionElements.get(randomNum); + JSONObject attributeRecognition = getAttributeRecognitionBySameCategory(element, validateElementVO.getModelSex()); + return processAttributeRecognitionBySameCategory(attributeRecognition, validateElementVO, element.getLevel2Type()); + } + } + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(Dressing::getApparel, validateElementVO.getModelSex()); + if (validateElementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + qw.lambda().eq(Dressing::getApparel, validateElementVO.getSwitchCategory()); + } + List dressings = dressingMapper.selectList(qw); + if (CollectionUtil.isEmpty(dressings)) { + throw new BusinessException("dressings is null"); + } + Integer randomNum = RandomsUtil.randomSysFile(dressings.size()); + String category = dressings.get(randomNum).getStyleCategory(); + String tableName = getTableName(validateElementVO.getModelSex(), category); + AttributeRetrieval attributeRetrieval = attributeRetrievalMapper.getSystemRandom(tableName); + CollectionElement collectionElement = toCollectionElement(attributeRetrieval, category, validateElementVO.getModelSex()); + return coverSketchToDesignPythonItem(null, collectionElement, validateElementVO); + } + private String getTableName(String modelSex, String category) { switch (modelSex) { case "Female": { diff --git a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java index e0f27be9..f5fe6222 100644 --- a/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignServiceImpl.java @@ -306,19 +306,34 @@ public class DesignServiceImpl extends ServiceImpl impleme //计算library // calculateLibraryAndSysFile(designDTO, elementVO, userInfo); //组装design入参 + long startTime = System.currentTimeMillis(); DesignPythonObjects pythonObjects = pythonService.covertDesignParam(designDTO.getSystemScale(), designDTO.getSingleOverall(), designDTO.getSwitchCategory(), elementVO, designDTO.getProcessId()); + long endTime = System.currentTimeMillis(); + long totalTimeInSeconds = (endTime - startTime) / 1000; + log.info("组装入参运行时间:" + totalTimeInSeconds + " 秒"); // pythonObjects增加image_id关联 + startTime = System.currentTimeMillis(); List imageIds = relationImageIds(pythonObjects); - System.out.println(imageIds); + endTime = System.currentTimeMillis(); + totalTimeInSeconds = (endTime - startTime) / 1000; + log.info("增加image_id关联运行时间:" + totalTimeInSeconds + " 秒"); //design + startTime = System.currentTimeMillis(); JSONObject responseJSONObject = pythonService.designNew(pythonObjects); + endTime = System.currentTimeMillis(); + totalTimeInSeconds = (endTime - startTime) / 1000; + log.info("design python端运行时间:" + totalTimeInSeconds + " 秒"); //生成library + startTime = System.currentTimeMillis(); generateLibrary(elementVO, designDTO.getTimeZone()); //处理关联关系,修复element覆盖得情况 List relationElements = collectionElementService.getByOnlyCollectionId(collectionId); List relationElementIds = relationElements.stream().map(CollectionElement::getId).collect(Collectors.toList()); handleCollectionElementRelation(collectionId, null != collectionIdParam, relationElementIds); + endTime = System.currentTimeMillis(); + totalTimeInSeconds = (endTime - startTime) / 1000; + log.info("处理关联关系运行时间:" + totalTimeInSeconds + " 秒"); //保存python返回信息;保存designItem和detail return savePythonDesignItemAndDetail(pythonObjects, designId, collectionId, userInfo, designDTO.getTimeZone(), responseJSONObject, designDTO.getSingleOverall()); } @@ -1015,49 +1030,41 @@ public class DesignServiceImpl extends ServiceImpl impleme public Integer designProcess(String processId) { ProcessIdObject object = new ProcessIdObject(); object.setProcess_id(processId); + OkHttpClient client = new OkHttpClient().newBuilder() .connectTimeout(30, TimeUnit.SECONDS) - .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) - .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒) - .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒) + .pingInterval(5, TimeUnit.SECONDS) + .readTimeout(60, TimeUnit.SECONDS) + .writeTimeout(60, TimeUnit.SECONDS) .build(); + MediaType mediaType = MediaType.parse("application/json"); - //关闭FastJson的引用检测 防止出现$ref 现象 String param = JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect); log.info("designProcess请求python 参数:####{}", param); RequestBody body = RequestBody.create(mediaType, param); + Request request = new Request.Builder() - // .url("http://18.167.251.121:9991/api/get_progress") -// .url(accessPythonIp + ":10200/aifda/api/v1.0/generate") .url(accessPythonIp + ":" + accessPythonPort + "/api/get_progress") .method("POST", body) .addHeader("Authorization", "Basic YWlkbGFiOjEyMw==") .addHeader("Content-Type", "application/json") .build(); - Response response; - try { - response = client.newCall(request).execute(); - } catch (IOException e) { - log.error("PythonService##design进度条异常###{}", ExceptionUtil.getThrowableList(e)); - return 0; - } - if (response.isSuccessful()) { - try { - if (Objects.nonNull(response.body())) { - String responseBody = response.body().string(); - JSONObject responseObject = JSON.parseObject(responseBody); - String num = responseObject.getString("data"); - return Integer.valueOf(num); - } - return 0; - } catch (IOException | JSONException e) { - log.error("PythonService##design进度条异常###{}", ExceptionUtil.getThrowableList(e)); - return 0; + + try (Response response = client.newCall(request).execute()) { + if (response.isSuccessful()) { + String responseBody = Objects.requireNonNull(response.body()).string(); + JSONObject responseObject = JSON.parseObject(responseBody); + String num = responseObject.getString("data"); + return Integer.valueOf(num); } + } catch (IOException | JSONException e) { + log.error("PythonService##design进度条异常###{}", ExceptionUtil.getThrowableList(e)); } + return 0; } + private String converTypeToLevel1(String type) { if (StringUtils.isEmpty(type)) { return null; From f8996999d44a7dcce4dcc620cad8671120c966ab Mon Sep 17 00:00:00 2001 From: xupei Date: Thu, 22 Feb 2024 10:23:46 +0800 Subject: [PATCH 28/93] =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=AE=9D=20=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E5=9C=B0=E5=9D=80=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/alipay-sandbox.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/alipay-sandbox.properties b/src/main/resources/alipay-sandbox.properties index 45a528e0..bdaac42d 100644 --- a/src/main/resources/alipay-sandbox.properties +++ b/src/main/resources/alipay-sandbox.properties @@ -30,8 +30,8 @@ alipay.return-url=http://localhost:8080/#/success # 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 # 注意:每次重新启动ngrok,都需要根据实际情况修改这个配置 #alipay.notify-url=https://77ea-221-239-177-21.ngrok.io/api/ali-pay/trade/notify -#alipay.notify-url=https://03a3-117-143-125-44.ngrok-free.app/api/ali-pay/trade/notify -alipay.notify-url=https://3b38-18-167-251-121.ngrok-free.app/api/ali-pay/trade/notify +alipay.notify-url=http://18.167.251.121:10090/api/ali-pay/trade/notify +#alipay.notify-url=https://3b38-18-167-251-121.ngrok-free.app/api/ali-pay/trade/notify From 7f8c84bd353ff5399d0f018f63dfb7c64601786c Mon Sep 17 00:00:00 2001 From: xupei Date: Thu, 22 Feb 2024 10:25:07 +0800 Subject: [PATCH 29/93] =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=AE=9D=20=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E5=9C=B0=E5=9D=80=E5=85=8D=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ai/da/common/security/filter/AuthenticationFilter.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java index 6efefd84..b669f4d0 100644 --- a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java +++ b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java @@ -48,8 +48,7 @@ public class AuthenticationFilter extends OncePerRequestFilter { "/api/third/party/addNoLoginRequiredNew","/api/third/party/deleteNoLoginRequiredNew", "/api/third/party/existNoLoginRequired","/api/third/party/getRedirectUrl", // "/api/python/chatStream", - "/api/python/flush", - "/api/account/healthy" + "/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify" ); @Override From 6e191413b9d49f98ea8db1dbb7b9e3b5adebcb1c Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Thu, 22 Feb 2024 13:38:07 +0800 Subject: [PATCH 30/93] =?UTF-8?q?TASK:=E6=95=B0=E6=8D=AE=E5=BA=93=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E4=BF=AE=E6=94=B9:;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 2d98c907..e3e838ed 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -6,7 +6,7 @@ spring.datasource.primary.username=aida_con spring.datasource.primary.password=123456 spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.secondary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/attribute_retrieval?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +spring.datasource.secondary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/attribute_retrieval_new?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true spring.datasource.secondary.username=aida_con spring.datasource.secondary.password=123456 From 471cdd866baa882a78f3b75566f0f8e9b074581a Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Fri, 23 Feb 2024 11:09:25 +0800 Subject: [PATCH 31/93] BUGFIX:design new single; --- src/main/java/com/ai/da/python/PythonService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 4d7da8d2..5fde4eed 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -876,7 +876,7 @@ public class PythonService { List noPinCollectionData = getNoPinData(validateElementVO); if (CollectionUtil.isEmpty(noPinCollectionData)) { List sketchBoardPins = getPinDataWhole(validateElementVO); - if (validateElementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + if (CollectionUtil.isNotEmpty(sketchBoardPins) && validateElementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { sketchBoardPins = sketchBoardPins.stream().filter(o -> o.getLevel2Type().equals(validateElementVO.getSwitchCategory())).collect(Collectors.toList()); } if (CollectionUtil.isNotEmpty(sketchBoardPins)) { @@ -915,7 +915,7 @@ public class PythonService { if (validateElementVO.getModelSex().equals(Sex.FEMALE.getValue())) { sketchBoardCollectionElements = sketchBoardCollectionElements.stream().filter(o -> FEMALE_CATEGORY.contains(o.getLevel2Type())).collect(Collectors.toList()); } - if (validateElementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { + if (CollectionUtil.isNotEmpty(sketchBoardCollectionElements) && validateElementVO.getSingleOverall().equals(SingleOverallEnum.SINGLE.getRealName())) { sketchBoardCollectionElements = sketchBoardCollectionElements.stream().filter(o -> o.getLevel2Type().equals(validateElementVO.getSwitchCategory())).collect(Collectors.toList()); } if (CollectionUtil.isNotEmpty(sketchBoardCollectionElements)) { From 87d8a92cdd1fa2c652c10f992d81243bc799182a Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Fri, 23 Feb 2024 11:38:09 +0800 Subject: [PATCH 32/93] BUGFIX:design new male_outwear; --- .../java/com/ai/da/python/PythonService.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 5fde4eed..d1bbb587 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -648,9 +648,19 @@ public class PythonService { // 存储非空字段的列表 List nonNullFields = new ArrayList<>(); - if (attributeRetrievalAttrDict.getType() != null) nonNullFields.add("type"); - if (attributeRetrievalAttrDict.getOpeningType() != null) nonNullFields.add("openingType"); - if (attributeRetrievalAttrDict.getSubtype() != null) nonNullFields.add("subtype"); + if (attributeRetrievalAttrDict.getType() != null) { + nonNullFields.add("type"); + } + if (attributeRetrievalAttrDict.getOpeningType() != null) { + nonNullFields.add("openingType"); + if (tableName.equals("male_outwear")) { + nonNullFields.remove("openingType"); + attributeRetrievalAttrDict.setOpeningType(null); + } + } + if (attributeRetrievalAttrDict.getSubtype() != null) { + nonNullFields.add("subtype"); + } // 只有当非空字段数量大于等于2时才进行处理 if (nonNullFields.size() >= 2) { From db68ce7d1b30db7d0fac784a11ebef71f1d12d82 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Fri, 23 Feb 2024 15:40:04 +0800 Subject: [PATCH 33/93] BUGFIX:design new male_outwear; --- src/main/resources/application-dev.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index e3e838ed..65a89b82 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -1,4 +1,4 @@ -server.port=5567 +server.port=17088 spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.primary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true From ee9675983245f941833c8e1cab8560348f2c3897 Mon Sep 17 00:00:00 2001 From: xupei Date: Fri, 1 Mar 2024 17:31:26 +0800 Subject: [PATCH 34/93] =?UTF-8?q?1=E3=80=81=E6=8E=A5=E5=85=A5paypal=202?= =?UTF-8?q?=E3=80=81=E4=BF=AE=E6=94=B9=E6=94=AF=E4=BB=98=E5=AE=9D=E6=94=AF?= =?UTF-8?q?=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 20 +- .../com/ai/da/common/config/PayPalClient.java | 51 ++ .../constant/PayPalCheckoutConstant.java | 177 +++++++ .../ai/da/common/enums/CurrencyCodesEnum.java | 40 ++ .../ai/da/common/enums/OrderStatusEnum.java | 2 +- .../common/enums/PayPalOrderStatusEnum.java | 24 + .../com/ai/da/common/enums/PayTypeEnum.java | 8 +- .../security/filter/AuthenticationFilter.java | 2 +- .../com/ai/da/common/task/AliPayTask.java | 2 +- .../com/ai/da/common/utils/RedisUtil.java | 15 + .../paypalRequest/AuthenticationRequest.java | 30 ++ .../paypalRequest/WebhookVerifyRequest.java | 26 + .../ai/da/controller/AliPayController.java | 99 +--- .../ai/da/controller/OrderInfoController.java | 11 +- .../controller/PayPalCheckoutController.java | 80 +++ .../da/mapper/primary/entity/OrderInfo.java | 4 +- .../da/mapper/primary/entity/RefundInfo.java | 2 +- .../com/ai/da/model/dto/WebhookVerifyDTO.java | 35 ++ .../java/com/ai/da/service/AliPayService.java | 2 + .../com/ai/da/service/CallBackService.java | 12 + .../com/ai/da/service/OrderInfoService.java | 4 + .../ai/da/service/PayPalCheckoutService.java | 29 ++ .../com/ai/da/service/PaymentInfoService.java | 4 + .../com/ai/da/service/RefundInfoService.java | 2 + .../ai/da/service/impl/AliPayServiceImpl.java | 134 +++-- .../da/service/impl/CallBackServiceImpl.java | 159 ++++++ .../da/service/impl/OrderInfoServiceImpl.java | 28 +- .../impl/PayPalCheckoutServiceImpl.java | 476 ++++++++++++++++++ .../service/impl/PaymentInfoServiceImpl.java | 28 +- .../service/impl/RefundInfoServiceImpl.java | 29 +- src/main/resources/application-dev.properties | 2 +- src/main/resources/paypal-sandbox.properties | 5 + 32 files changed, 1379 insertions(+), 163 deletions(-) create mode 100644 src/main/java/com/ai/da/common/config/PayPalClient.java create mode 100644 src/main/java/com/ai/da/common/constant/PayPalCheckoutConstant.java create mode 100644 src/main/java/com/ai/da/common/enums/CurrencyCodesEnum.java create mode 100644 src/main/java/com/ai/da/common/enums/PayPalOrderStatusEnum.java create mode 100644 src/main/java/com/ai/da/common/utils/paypalRequest/AuthenticationRequest.java create mode 100644 src/main/java/com/ai/da/common/utils/paypalRequest/WebhookVerifyRequest.java create mode 100644 src/main/java/com/ai/da/controller/PayPalCheckoutController.java create mode 100644 src/main/java/com/ai/da/model/dto/WebhookVerifyDTO.java create mode 100644 src/main/java/com/ai/da/service/CallBackService.java create mode 100644 src/main/java/com/ai/da/service/PayPalCheckoutService.java create mode 100644 src/main/java/com/ai/da/service/impl/CallBackServiceImpl.java create mode 100644 src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java create mode 100644 src/main/resources/paypal-sandbox.properties diff --git a/pom.xml b/pom.xml index 87a9fc66..2c6dacea 100644 --- a/pom.xml +++ b/pom.xml @@ -164,7 +164,6 @@ 9.2.1.jre8 - org.springframework.boot @@ -184,6 +183,25 @@ 4.22.57.ALL + + + com.paypal.sdk + checkout-sdk + 1.0.5 + + + + com.paypal.sdk + rest-api-sdk + LATEST + + + + org.json + json + 20230618 + + diff --git a/src/main/java/com/ai/da/common/config/PayPalClient.java b/src/main/java/com/ai/da/common/config/PayPalClient.java new file mode 100644 index 00000000..bcdef0a3 --- /dev/null +++ b/src/main/java/com/ai/da/common/config/PayPalClient.java @@ -0,0 +1,51 @@ +package com.ai.da.common.config; + +import com.paypal.core.PayPalEnvironment; +import com.paypal.core.PayPalHttpClient; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.json.JSONArray; +import org.json.JSONObject; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; + +import java.util.Iterator; + +@Configuration +@Slf4j +@PropertySource("classpath:paypal-sandbox.properties") +public class PayPalClient { + + public PayPalHttpClient client(String mode, String clientId, String clientSecret) { + log.info("mode={}, clientId={}, clientSecret={}", mode, clientId, clientSecret); + PayPalEnvironment environment = mode.equals("live") ? new PayPalEnvironment.Live(clientId, clientSecret) : new PayPalEnvironment.Sandbox(clientId, clientSecret); + return new PayPalHttpClient(environment); + } + + /** + * @param jo + * @param pre + * @return + */ + /*public String prettyPrint(JSONObject jo, String pre) { + Iterator keys = jo.keys(); + StringBuilder pretty = new StringBuilder(); + while (keys.hasNext()) { + String key = (String) keys.next(); + pretty.append(String.format("%s%s: ", pre, StringUtils.capitalize(key))); + if (jo.get(key) instanceof JSONObject) { + pretty.append(prettyPrint(jo.getJSONObject(key), pre + "\t")); + } else if (jo.get(key) instanceof JSONArray) { + int sno = 1; + for (Object jsonObject : jo.getJSONArray(key)) { + pretty.append(String.format("\n%s\t%d:\n", pre, sno++)); + pretty.append(prettyPrint((JSONObject) jsonObject, pre + "\t\t")); + } + } else { + pretty.append(String.format("%s\n", jo.getString(key))); + } + } + return pretty.toString(); + }*/ +} + diff --git a/src/main/java/com/ai/da/common/constant/PayPalCheckoutConstant.java b/src/main/java/com/ai/da/common/constant/PayPalCheckoutConstant.java new file mode 100644 index 00000000..2a7726f2 --- /dev/null +++ b/src/main/java/com/ai/da/common/constant/PayPalCheckoutConstant.java @@ -0,0 +1,177 @@ +package com.ai.da.common.constant; + +public class PayPalCheckoutConstant { + + public static String MODE = "sandbox"; + + public static final String CAPTURE = "CAPTURE"; + /** + * 该标签将覆盖PayPal网站上PayPal帐户中的公司名称 + */ + public static final String BRANDNAME = "AIDA"; + /** + * LOGIN。当客户单击PayPal Checkout时,客户将被重定向到页面以登录PayPal并批准付款。 + * BILLING。当客户单击PayPal Checkout时,客户将被重定向到一个页面,以输入信用卡或借记卡以及完成购买所需的其他相关账单信息 + * NO_PREFERENCE。当客户单击“ PayPal Checkout”时,将根据其先前的交互方式将其重定向到页面以登录PayPal并批准付款,或重定向至页面以输入信用卡或借记卡以及完成购买所需的其他相关账单信息使用PayPal。 + * 默认值:NO_PREFERENCE + */ + public static final String LANDINGPAGE = "NO_PREFERENCE"; + /** + * CONTINUE。将客户重定向到PayPal付款页面后,将出现“ 继续”按钮。当结帐流程启动时最终金额未知时,请使用此选项,并且您想将客户重定向到商家页面而不处理付款。 + * PAY_NOW。将客户重定向到PayPal付款页面后,出现“ 立即付款”按钮。当启动结帐时知道最终金额并且您要在客户单击“ 立即付款”时立即处理付款时,请使用此选项。 + */ + public static final String USERACTION = "PAY_NOW"; + /** + * GET_FROM_FILE。使用贝宝网站上客户提供的送货地址。 + * NO_SHIPPING。从PayPal网站编辑送货地址。推荐用于数字商品 + * SET_PROVIDED_ADDRESS。使用商家提供的地址。客户无法在PayPal网站上更改此地址 + */ +// public static final String SHIPPINGPREFERENCE = "SET_PROVIDED_ADDRESS"; + public static final String SHIPPINGPREFERENCE = "NO_SHIPPING"; + /** + * 交易异常 + */ + public static final String FAILURE = "failure"; + /** + * 交易成功 + */ + public static final String SUCCESS = "success"; + + /** + * ipn回调。支付成功 + */ + public static final String PAYMENT_STATUS_COMPLETED = "Completed"; + /** + * ipn回调。退款成功 + */ + public static final String PAYMENT_STATUS_REFUNDED = "Refunded"; + /** + * ipn回调。待定 + */ + public static final String PAYMENT_STATUS_PENDING = "Pending"; + + /** + * ipn回调,付款因退款或其他类型的冲销而被冲销。资金已从您的帐户余额中删除,并退还给买方 + */ + public static final String PAYMENT_STATUS_REVERSED = "Reversed"; + + /** + * ipn回调, 撤销已被取消。例如,您赢得了与客户的纠纷,并且撤回的交易资金已退还给您 + */ + public static final String PAYMENT_STATUS_CANCELED_REVERSAL = "Canceled_Reversal"; + + /** + * ipn回调,付款被拒绝 + */ + public static final String PAYMENT_STATUS_DENIED = "Denied"; + + /** + * ipn回调, 此授权已过期,无法捕获 + */ + public static final String PAYMENT_STATUS_EXPIRED = "Expired"; + + /** + * ipn回调, 德国的ELV付款是通过Express Checkout进行的 + */ + public static final String PAYMENT_STATUS_CREATED = "Created"; + + /** + * ipn回调, 付款失败。仅当付款是通过您客户的银行帐户进行的。 + */ + public static final String PAYMENT_STATUS_FAILED = "Failed"; + + /** + * ipn回调,付款已被接受 + */ + public static final String PAYMENT_STATUS_PROCESSED = "Processed"; + + /** + * ipn回调,此授权已失效 + */ + public static final String PAYMENT_STATUS_VOIDED = "Voided"; + + //订单状态 + /** + * 1、支付完成;捕获的付款的资金已记入收款人的PayPal帐户 + * 2、退款完成;该交易的资金已记入客户的帐户 + */ + public static final String STATE_COMPLETED = "COMPLETED"; + /** + * 部分退款;少于所捕获付款金额的金额已部分退还给付款人。 + */ + public static final String STATE_PARTIALLY_REFUNDED = "PARTIALLY_REFUNDED"; + + + /** + * 1、支付待定;捕获的付款资金尚未记入收款人的PayPal帐户。有关更多信息请参见status.details。 + * 2、退款待定;有关更多信息,请参见status_details.reason。 + */ + /** + * 支付待定: + * capture_status_details + * reason 枚举 + * 捕获的付款状态为PENDING或DENIED的原因。可能的值为: + * BUYER_COMPLAINT。付款人与贝宝(PayPal)对此捕获的付款提出了争议。 + * CHARGEBACK。响应于付款人与用于支付此已捕获付款的金融工具的发行人对此已捕获的付款提出异议,已收回的资金被撤回。 + * ECHECK。由尚未结清的电子支票支付的付款人。 + * INTERNATIONAL_WITHDRAWAL。访问您的在线帐户。在您的“帐户概览”中,接受并拒绝此笔付款。 + * OTHER。无法提供其他特定原因。有关此笔付款的更多信息,请在线访问您的帐户或联系PayPal。 + * PENDING_REVIEW。捕获的付款正在等待人工审核。 + *(手动收取)RECEIVING_PREFERENCE_MANDATES_MANUAL_ACTION。收款人尚未为其帐户设置适当的接收首选项。有关如何接受或拒绝此付款的更多信息,请在线访问您的帐户。通常在某些情况下提供此原因,例如,当所捕获付款的货币与收款人的主要持有货币不同时。 + * REFUNDED。收回的资金已退还。 + * TRANSACTION_APPROVED_AWAITING_FUNDING。付款人必须将这笔付款的资金汇出。通常,此代码适用于手动EFT。 + * UNILATERAL。收款人没有PayPal帐户。 + * VERIFICATION_REQUIRED。收款人的PayPal帐户未通过验证。 + */ + /** + * 退款待定 + * 退款具有“PENDING”或“FAILED”状态的原因。 可能的值为: + * ECHECK。客户的帐户通过尚未结清的eCheck进行注资。 + */ + public static final String STATE_PENDING = "PENDING"; + /** + * 退款;大于或等于此捕获的付款金额的金额已退还给付款人 + */ + public static final String STATE_REFUNDED = "REFUNDED"; + /** + * 支付拒绝 + */ + public static final String STATE_DENIED = "DENIED"; + /** + * 退款失败 + */ + public static final String STATE_FAILED = "FAILED"; + + /** + * 争议状态 + */ + public static final String BUYER_COMPLAINT = "BUYER_COMPLAINT"; + + /** + * 沙箱环境请求网关地址 + */ + public static final String SANDBOX = "https://api.sandbox.paypal.com"; + /** + * 生产环境请求网关地址 + */ + public static final String LIVE = "https://api.paypal.com"; + /** + * 添加物流信息请求路径 + */ + public static final String ADD_TRACK_URL = "/v1/shipping/trackers-batch"; + + /** + * 修改物流信息请求路径 + */ + public static final String UPDATE_TRACK_URL = "/v1/shipping/trackers/"; + + public final static String CMD_NOTIFY_VALIDATE = "_notify-validate"; + + public final static String WEBHOOK_ID = "31797347YC028794L"; + + public final static String PAYPAL_TOKEN_KEY = "PayPalAccessToken"; + + +} + + diff --git a/src/main/java/com/ai/da/common/enums/CurrencyCodesEnum.java b/src/main/java/com/ai/da/common/enums/CurrencyCodesEnum.java new file mode 100644 index 00000000..1f0225c8 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/CurrencyCodesEnum.java @@ -0,0 +1,40 @@ +package com.ai.da.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +public enum CurrencyCodesEnum { + + AUSTRALIAN_DOLLAR("AUD"), + BRAZILIAN_REAL("BRL"), + CANADIAN_DOLLAR("CAD"), + CHINESE_RENMENBI("CNY"), + CZECH_KORUNA("CZK"), + DANISH_KRONE("DKK"), + EURO("EUR"), + HONG_KONG_DOLLAR("HKD"), + HUNGARIAN_FORINT("HUF"), + ISRAELI_NEW_SHEKEL("ILS"), + JAPANESE_YEN("JPY"), + MALAYSIAN_RINGGIT("MYR"), + MEXICAN_PESO("MXN"), + NEW_TAIWAN_DOLLAR("TWD"), + NEW_ZEALAND_DOLLAR("NZD"), + NORWEGIAN_KRONE("NOK"), + PHILIPPINE_PESO("PHP"), + POLISH_ZLOTY("PLN"), + POUND_STERLING("GBP"), + RUSSIAN_RUBLE("RUB"), + SINGAPORE_DOLLAR("SGD"), + SWEDISH_KRONA("SEK"), + SWISS_FRANC("CHF"), + THAI_BAHT("THB"), + UNITED_STATES_DOLLAR("USD"); + + private String code; + + CurrencyCodesEnum(String code) { + this.code = code; + } +} diff --git a/src/main/java/com/ai/da/common/enums/OrderStatusEnum.java b/src/main/java/com/ai/da/common/enums/OrderStatusEnum.java index ede1e162..559ae38b 100644 --- a/src/main/java/com/ai/da/common/enums/OrderStatusEnum.java +++ b/src/main/java/com/ai/da/common/enums/OrderStatusEnum.java @@ -20,7 +20,7 @@ public enum OrderStatusEnum { /** * 已关闭 */ - CLOSED("超时已关闭"), + TIMEOUT_CLOSED("超时已关闭"), /** * 已取消 diff --git a/src/main/java/com/ai/da/common/enums/PayPalOrderStatusEnum.java b/src/main/java/com/ai/da/common/enums/PayPalOrderStatusEnum.java new file mode 100644 index 00000000..f35fd8f8 --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/PayPalOrderStatusEnum.java @@ -0,0 +1,24 @@ +package com.ai.da.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum PayPalOrderStatusEnum { + + CREATED("CREATED"), + + SAVED("SAVED"), + + APPROVED("APPROVED"), + + VOIDED("VOIDED"), + + COMPLETED("COMPLETED"), + + PAYER_ACTION_REQUIRED("PAYER_ACTION_REQUIRED"); + + + private final String status; +} diff --git a/src/main/java/com/ai/da/common/enums/PayTypeEnum.java b/src/main/java/com/ai/da/common/enums/PayTypeEnum.java index cb2e89f8..70067578 100644 --- a/src/main/java/com/ai/da/common/enums/PayTypeEnum.java +++ b/src/main/java/com/ai/da/common/enums/PayTypeEnum.java @@ -11,11 +11,15 @@ public enum PayTypeEnum { */ WXPAY("微信"), - /** * 支付宝 */ - ALIPAY("支付宝"); + ALIPAY("支付宝"), + + /** + * PayPal + */ + PAYPAL("PayPal"); /** * 类型 diff --git a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java index b669f4d0..8ae7a2a1 100644 --- a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java +++ b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java @@ -48,7 +48,7 @@ public class AuthenticationFilter extends OncePerRequestFilter { "/api/third/party/addNoLoginRequiredNew","/api/third/party/deleteNoLoginRequiredNew", "/api/third/party/existNoLoginRequired","/api/third/party/getRedirectUrl", // "/api/python/chatStream", - "/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify" + "/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify","/api/paypal/ipn/back" ); @Override diff --git a/src/main/java/com/ai/da/common/task/AliPayTask.java b/src/main/java/com/ai/da/common/task/AliPayTask.java index f95a3a10..64b0e81c 100644 --- a/src/main/java/com/ai/da/common/task/AliPayTask.java +++ b/src/main/java/com/ai/da/common/task/AliPayTask.java @@ -29,7 +29,7 @@ public class AliPayTask { log.info("orderConfirm 被执行......"); - List orderInfoList = orderInfoService.getNoPayOrderByDuration(1, PayTypeEnum.ALIPAY.getType()); + List orderInfoList = orderInfoService.getNoPayOrderByDuration(5, PayTypeEnum.ALIPAY.getType()); for (OrderInfo orderInfo : orderInfoList) { String orderNo = orderInfo.getOrderNo(); diff --git a/src/main/java/com/ai/da/common/utils/RedisUtil.java b/src/main/java/com/ai/da/common/utils/RedisUtil.java index 5121e883..92bc06aa 100644 --- a/src/main/java/com/ai/da/common/utils/RedisUtil.java +++ b/src/main/java/com/ai/da/common/utils/RedisUtil.java @@ -9,6 +9,7 @@ import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.Map; import java.util.Set; +import java.util.concurrent.TimeUnit; @Slf4j @Component @@ -17,6 +18,10 @@ public class RedisUtil { @Resource private RedisTemplate redisTemplate; + public Boolean hasKey(String key){ + return redisTemplate.hasKey(key); + } + //- - - - - - - - - - - - - - - - - - - - - ZSet类型 - - - - - - - - - - - - - - - - - - - - /** @@ -123,4 +128,14 @@ public class RedisUtil { public Long removeFromMap(String key, String hashKeys) { return redisTemplate.opsForHash().delete(key, hashKeys); } + + //- - - - - - - - - - - - - - - - - - - - - String类型 - - - - - - - - - - - - - - - - - - - - + public void addToString(String key, String value, Long expiresIn){ + redisTemplate.opsForValue().set(key,value,expiresIn, TimeUnit.SECONDS); + } + + public String getFromString(String key){ + return redisTemplate.opsForValue().get(key); + } + } diff --git a/src/main/java/com/ai/da/common/utils/paypalRequest/AuthenticationRequest.java b/src/main/java/com/ai/da/common/utils/paypalRequest/AuthenticationRequest.java new file mode 100644 index 00000000..eedda337 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/paypalRequest/AuthenticationRequest.java @@ -0,0 +1,30 @@ +package com.ai.da.common.utils.paypalRequest; + +import com.alibaba.fastjson.JSONObject; +import com.paypal.http.HttpRequest; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.HashMap; + +@Component +public class AuthenticationRequest extends HttpRequest { + + public AuthenticationRequest() { + super("/v1/oauth2/token", "POST", HashMap.class); + this.header("Content-Type", "application/x-www-form-urlencoded"); + body(); + } + + public AuthenticationRequest authorization(String clientId, String clientSecret) { + this.header(clientId, clientSecret); + return this; + } + + public AuthenticationRequest body() { + HashMap body = new HashMap<>(); + body.put("grant_type", "client_credentials"); + this.requestBody(body); + return this; + } +} diff --git a/src/main/java/com/ai/da/common/utils/paypalRequest/WebhookVerifyRequest.java b/src/main/java/com/ai/da/common/utils/paypalRequest/WebhookVerifyRequest.java new file mode 100644 index 00000000..957482d3 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/paypalRequest/WebhookVerifyRequest.java @@ -0,0 +1,26 @@ +package com.ai.da.common.utils.paypalRequest; + +import com.ai.da.model.dto.WebhookVerifyDTO; +import com.alibaba.fastjson.JSONObject; +import com.paypal.http.HttpRequest; +import com.paypal.orders.OrdersCreateRequest; + +import java.io.Serializable; +import java.util.HashMap; + +public class WebhookVerifyRequest extends HttpRequest { + public WebhookVerifyRequest() { + super("/v1/notifications/verify-webhook-signature", "POST", HashMap.class); + this.header("Content-Type", "application/json"); + } + + public WebhookVerifyRequest authorization(String authorization) { + this.header("Authorization", "Bearer " + String.valueOf(authorization)); + return this; + } + + public WebhookVerifyRequest requestBody(HashMap webhookVerify) { + super.requestBody(webhookVerify); + return this; + } +} diff --git a/src/main/java/com/ai/da/controller/AliPayController.java b/src/main/java/com/ai/da/controller/AliPayController.java index 5559a186..3878628a 100644 --- a/src/main/java/com/ai/da/controller/AliPayController.java +++ b/src/main/java/com/ai/da/controller/AliPayController.java @@ -1,20 +1,13 @@ package com.ai.da.controller; import com.ai.da.common.response.Response; -import com.ai.da.mapper.primary.entity.OrderInfo; import com.ai.da.service.AliPayService; -import com.ai.da.service.OrderInfoService; -import com.alipay.api.AlipayApiException; -import com.alipay.api.AlipayConstants; -import com.alipay.api.internal.util.AlipaySignature; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import java.math.BigDecimal; import java.util.Map; @CrossOrigin @@ -27,18 +20,9 @@ public class AliPayController { @Resource private AliPayService aliPayService; - @Resource - private Environment config; - - @Resource - private OrderInfoService orderInfoService; - @ApiOperation("统一收单下单并支付页面接口的调用") @PostMapping("/trade/page/pay/{productId}") public Response tradePagePay(@PathVariable Long productId,@RequestParam String returnUrl){ - - System.out.println(productId + " " + returnUrl); - log.info("统一收单下单并支付页面接口的调用"); //支付宝开放平台接受 request 请求对象后 // 会为开发者生成一个html 形式的 form表单,包含自动提交的脚本 @@ -51,80 +35,7 @@ public class AliPayController { @ApiOperation("支付通知") @PostMapping("/trade/notify") public String tradeNotify(@RequestParam Map params){ - - log.info("支付通知正在执行"); - log.info("通知参数 ===> {}", params); - - String result = "failure"; - - try { - //异步通知验签 - boolean signVerified = AlipaySignature.rsaCheckV1( - params, - config.getProperty("alipay.alipay-public-key"), - AlipayConstants.CHARSET_UTF8, - AlipayConstants.SIGN_TYPE_RSA2); //调用SDK验证签名 - - if(!signVerified){ - //验签失败则记录异常日志,并在response中返回failure. - log.error("支付成功异步通知验签失败!"); - return result; - } - - // 验签成功后 - log.info("支付成功异步通知验签成功!"); - - //按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验, - //1 商户需要验证该通知数据中的 out_trade_no 是否为商户系统中创建的订单号 - String outTradeNo = params.get("out_trade_no"); - OrderInfo order = orderInfoService.getOrderByOrderNo(outTradeNo); - if(order == null){ - log.error("订单不存在"); - return result; - } - - //2 判断 total_amount 是否确实为该订单的实际金额(即商户订单创建时的金额) - String totalAmount = params.get("total_amount"); - int totalAmountInt = new BigDecimal(totalAmount).multiply(new BigDecimal("100")).intValue(); - int totalFeeInt = order.getTotalFee().intValue(); - if(totalAmountInt != totalFeeInt){ - log.error("金额校验失败"); - return result; - } - - //3 校验通知中的 seller_id(或者 seller_email) 是否为 out_trade_no 这笔单据的对应的操作方 - String sellerId = params.get("seller_id"); - String sellerIdProperty = config.getProperty("alipay.seller-id"); - if(!sellerId.equals(sellerIdProperty)){ - log.error("商家pid校验失败"); - return result; - } - - //4 验证 app_id 是否为该商户本身 - String appId = params.get("app_id"); - String appIdProperty = config.getProperty("alipay.app-id"); - if(!appId.equals(appIdProperty)){ - log.error("appid校验失败"); - return result; - } - - //在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS时, - // 支付宝才会认定为买家付款成功。 - String tradeStatus = params.get("trade_status"); - if(!"TRADE_SUCCESS".equals(tradeStatus)){ - log.error("支付未成功"); - return result; - } - - //处理业务 修改订单状态 记录支付日志 - aliPayService.processOrder(params); - - //校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure - result = "success"; - } catch (AlipayApiException e) { - e.printStackTrace(); - } - return result; + return aliPayService.tradeNotify(params); } /** @@ -135,7 +46,6 @@ public class AliPayController { @ApiOperation("用户取消订单") @PostMapping("/trade/close/{orderNo}") public Response cancel(@PathVariable String orderNo){ - log.info("取消订单"); aliPayService.cancelOrder(orderNo); return Response.success("订单已取消"); @@ -149,9 +59,7 @@ public class AliPayController { @ApiOperation("查询订单:测试订单状态用") @GetMapping("/trade/query/{orderNo}") public Response queryOrder(@PathVariable String orderNo) { - log.info("查询订单"); - String result = aliPayService.queryOrder(orderNo); return Response.success(result); @@ -166,7 +74,6 @@ public class AliPayController { @ApiOperation("申请退款") @PostMapping("/trade/refund/{orderNo}/{reason}") public Response refunds(@PathVariable String orderNo, @PathVariable String reason){ - log.info("申请退款"); aliPayService.refund(orderNo, reason); return Response.success(); @@ -180,10 +87,8 @@ public class AliPayController { */ @ApiOperation("查询退款:测试用") @GetMapping("/trade/fastpay/refund/{orderNo}") - public Response queryRefund(@PathVariable String orderNo) throws Exception { - + public Response queryRefund(@PathVariable String orderNo) { log.info("查询退款"); - String result = aliPayService.queryRefund(orderNo); return Response.success(result); } diff --git a/src/main/java/com/ai/da/controller/OrderInfoController.java b/src/main/java/com/ai/da/controller/OrderInfoController.java index 63e3463c..d5f8dfa2 100644 --- a/src/main/java/com/ai/da/controller/OrderInfoController.java +++ b/src/main/java/com/ai/da/controller/OrderInfoController.java @@ -1,5 +1,6 @@ package com.ai.da.controller; +import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.OrderStatusEnum; import com.ai.da.common.response.Response; import com.ai.da.mapper.primary.entity.OrderInfo; @@ -23,9 +24,9 @@ public class OrderInfoController { @ApiOperation("订单列表") @GetMapping("/list") public Response> list(){ - - List list = orderInfoService.listOrderByCreateTimeDesc(); - return Response.success(list); + List orderByAccountId = orderInfoService.getOrderByAccountId(UserContext.getUserHolder().getId()); +// List list = orderInfoService.listOrderByCreateTimeDesc(); + return Response.success(orderByAccountId); } /** @@ -36,15 +37,11 @@ public class OrderInfoController { @ApiOperation("查询本地订单状态") @GetMapping("/query-order-status/{orderNo}") public Response queryOrderStatus(@PathVariable String orderNo){ - String orderStatus = orderInfoService.getOrderStatus(orderNo); if(OrderStatusEnum.SUCCESS.getType().equals(orderStatus)){ return Response.success("支付成功"); //支付成功 } - return Response.success(101,"支付中......"); } - - } diff --git a/src/main/java/com/ai/da/controller/PayPalCheckoutController.java b/src/main/java/com/ai/da/controller/PayPalCheckoutController.java new file mode 100644 index 00000000..0e141e67 --- /dev/null +++ b/src/main/java/com/ai/da/controller/PayPalCheckoutController.java @@ -0,0 +1,80 @@ +package com.ai.da.controller; + +import com.ai.da.common.response.Response; +import com.ai.da.service.CallBackService; +import com.ai.da.service.PayPalCheckoutService; +import com.paypal.http.HttpResponse; +import com.paypal.http.exceptions.SerializeException; +import com.paypal.orders.Order; +import com.paypal.payments.Refund; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.HashMap; + +@RestController +@Api(tags = "PayPalCheckout接口") +@RequestMapping("/api/paypal") +public class PayPalCheckoutController { + + @Resource + private PayPalCheckoutService payPalCheckoutService; + + @Resource + private CallBackService callBackService; + + @ApiOperation(value = "创建订单") + @PostMapping(value = "/trade/{productId}") + public Response> createOrder(@PathVariable Long productId,@RequestParam String returnUrl) throws SerializeException { + HashMap approvalUrl = payPalCheckoutService.createOrder(productId,returnUrl); + return Response.success(approvalUrl); + } + + @ApiOperation(value = "ipn异步回调") + @PostMapping(value = "/ipn/back") + public Response callback(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + Boolean result = callBackService.doGet(request, response); + if (result){ + return Response.success(); + }else { + return Response.fail(500,"failure"); + } +// return payPalCheckoutService.callback(RequestToMapUtil.getParameterMap(request)); + } + + @ApiOperation(value = "查询指定订单") + @PostMapping(value = "/trade/query/{orderNo}") + public Response queryOrder(@PathVariable String orderNo) throws SerializeException { + String s = payPalCheckoutService.queryOrder(orderNo); + return Response.success(s); + } + + @ApiOperation("申请退款") + @PostMapping("/trade/refund/{orderNo}/{reason}") + public Response> refund(@PathVariable String orderNo, @PathVariable String reason) throws IOException { + Boolean response = payPalCheckoutService.refundOrder(orderNo,reason); + if (response){ + return Response.success(); + }else { + return Response.fail("Request for refund failed."); + } + + } + + @ApiOperation("执行扣款") + @PostMapping("/trade/capture/{orderNo}") + public Response captureOrder(@PathVariable String orderNo) throws IOException { + Order response = payPalCheckoutService.captureOrder(orderNo); + return Response.success(response); + } + + + +} + diff --git a/src/main/java/com/ai/da/mapper/primary/entity/OrderInfo.java b/src/main/java/com/ai/da/mapper/primary/entity/OrderInfo.java index a4668176..c3b0be10 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/OrderInfo.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/OrderInfo.java @@ -11,11 +11,11 @@ public class OrderInfo extends BaseEntity{ private String orderNo;//商户订单编号 - private Long userId;//用户id + private Long accountId;//用户id private Long productId;//支付产品id - private Integer totalFee;//订单金额(分) + private Integer totalFee;//订单金额(元) private String codeUrl;//订单二维码连接 diff --git a/src/main/java/com/ai/da/mapper/primary/entity/RefundInfo.java b/src/main/java/com/ai/da/mapper/primary/entity/RefundInfo.java index ee07efc8..19719a98 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/RefundInfo.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/RefundInfo.java @@ -11,7 +11,7 @@ public class RefundInfo extends BaseEntity{ private String refundNo;//退款单编号 - private String refundId;//支付系统退款单号 + private String refundId;//支付系统退款单号(微信) private Integer totalFee;//原订单金额(分) diff --git a/src/main/java/com/ai/da/model/dto/WebhookVerifyDTO.java b/src/main/java/com/ai/da/model/dto/WebhookVerifyDTO.java new file mode 100644 index 00000000..4bcbc352 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/WebhookVerifyDTO.java @@ -0,0 +1,35 @@ +package com.ai.da.model.dto; + +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class WebhookVerifyDTO implements Serializable { + + private String transmission_id; + private String transmission_time; + private String cert_url; + private String auth_algo; + private String transmission_sig; + private String webhook_id; + private Object webhook_event; + +} + + + + + + + + + diff --git a/src/main/java/com/ai/da/service/AliPayService.java b/src/main/java/com/ai/da/service/AliPayService.java index 796126a2..fbfc86df 100644 --- a/src/main/java/com/ai/da/service/AliPayService.java +++ b/src/main/java/com/ai/da/service/AliPayService.java @@ -5,6 +5,8 @@ import java.util.Map; public interface AliPayService { String tradeCreate(Long productId,String returnUrl); + String tradeNotify(Map params); + void processOrder(Map params); void cancelOrder(String orderNo); diff --git a/src/main/java/com/ai/da/service/CallBackService.java b/src/main/java/com/ai/da/service/CallBackService.java new file mode 100644 index 00000000..39efb1eb --- /dev/null +++ b/src/main/java/com/ai/da/service/CallBackService.java @@ -0,0 +1,12 @@ +package com.ai.da.service; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public interface CallBackService { + + Boolean doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException; +} diff --git a/src/main/java/com/ai/da/service/OrderInfoService.java b/src/main/java/com/ai/da/service/OrderInfoService.java index eaac6df3..4f4dff38 100644 --- a/src/main/java/com/ai/da/service/OrderInfoService.java +++ b/src/main/java/com/ai/da/service/OrderInfoService.java @@ -22,4 +22,8 @@ public interface OrderInfoService extends IService { List getNoPayOrderByDuration(int minutes, String paymentType); OrderInfo getOrderByOrderNo(String orderNo); + + List getOrderByAccountId(Long accountId); + + void updateOrderNoById(Long id, String orderNo); } diff --git a/src/main/java/com/ai/da/service/PayPalCheckoutService.java b/src/main/java/com/ai/da/service/PayPalCheckoutService.java new file mode 100644 index 00000000..8a79b489 --- /dev/null +++ b/src/main/java/com/ai/da/service/PayPalCheckoutService.java @@ -0,0 +1,29 @@ +package com.ai.da.service; + +import com.paypal.http.exceptions.SerializeException; +import com.paypal.orders.Order; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public interface PayPalCheckoutService { + + HashMap createOrder(Long productId,String returnUrl) throws SerializeException; + /** + * 回调 + * @param map + */ + String callback(@SuppressWarnings("rawtypes") Map map); + + String queryOrder(String orderNo) throws SerializeException; + + Order captureOrder(String orderId) throws IOException; + + Boolean refundOrder(String orderId, String reason) throws IOException; + + String getOAuth(); + + void processOrder(String orderId); +} + diff --git a/src/main/java/com/ai/da/service/PaymentInfoService.java b/src/main/java/com/ai/da/service/PaymentInfoService.java index aa1470e4..4a350dff 100644 --- a/src/main/java/com/ai/da/service/PaymentInfoService.java +++ b/src/main/java/com/ai/da/service/PaymentInfoService.java @@ -1,5 +1,7 @@ package com.ai.da.service; +import com.paypal.orders.Order; + import java.util.Map; public interface PaymentInfoService { @@ -7,4 +9,6 @@ public interface PaymentInfoService { void createPaymentInfo(String plainText); void createPaymentInfoForAliPay(Map params); + + void createPaymentInfoForPayPal(Order order); } diff --git a/src/main/java/com/ai/da/service/RefundInfoService.java b/src/main/java/com/ai/da/service/RefundInfoService.java index 3690c794..5cfeca4c 100644 --- a/src/main/java/com/ai/da/service/RefundInfoService.java +++ b/src/main/java/com/ai/da/service/RefundInfoService.java @@ -17,4 +17,6 @@ public interface RefundInfoService extends IService { RefundInfo createRefundByOrderNoForAliPay(String orderNo, String reason); void updateRefundForAliPay(String refundNo, String content, String refundStatus); + + void updateRefundForPayPal(Long id, String refundId, String content, String refundStatus); } diff --git a/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java index 38d67eac..1b2dc62d 100644 --- a/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java @@ -1,5 +1,6 @@ package com.ai.da.service.impl; +import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.enums.AliPayTradeStateEnum; import com.ai.da.common.enums.OrderStatusEnum; import com.ai.da.common.enums.PayTypeEnum; @@ -12,6 +13,8 @@ import com.ai.da.service.RefundInfoService; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; +import com.alipay.api.AlipayConstants; +import com.alipay.api.internal.util.AlipaySignature; import com.alipay.api.request.*; import com.alipay.api.response.*; import com.google.gson.Gson; @@ -69,7 +72,7 @@ public class AliPayServiceImpl implements AliPayService { //组装当前业务方法的请求参数 JSONObject bizContent = new JSONObject(); bizContent.put("out_trade_no", orderInfo.getOrderNo()); - BigDecimal total = new BigDecimal(orderInfo.getTotalFee().toString()).divide(new BigDecimal("100")); + BigDecimal total = new BigDecimal(orderInfo.getTotalFee().toString()); bizContent.put("total_amount", total); bizContent.put("subject", orderInfo.getTitle()); bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY"); @@ -84,14 +87,93 @@ public class AliPayServiceImpl implements AliPayService { return response.getBody(); } else { log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg()); - throw new RuntimeException("创建支付交易失败"); + throw new BusinessException("Order creation failed"); } } catch (AlipayApiException e) { e.printStackTrace(); - throw new RuntimeException("创建支付交易失败"); + throw new BusinessException("Order creation failed"); } } + @Override + public String tradeNotify(Map params) { + log.info("支付通知正在执行"); + log.info("通知参数 ===> {}", params); + + String result = "failure"; + + try { + //异步通知验签 + boolean signVerified = AlipaySignature.rsaCheckV1( + params, + config.getProperty("alipay.alipay-public-key"), + AlipayConstants.CHARSET_UTF8, + AlipayConstants.SIGN_TYPE_RSA2); //调用SDK验证签名 + + if(!signVerified){ + //验签失败则记录异常日志,并在response中返回failure. + log.error("支付成功异步通知验签失败!"); + return result; + } + + // 验签成功后 + log.info("支付成功异步通知验签成功!"); + + //按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验, + //1 商户需要验证该通知数据中的 out_trade_no 是否为商户系统中创建的订单号 + String outTradeNo = params.get("out_trade_no"); + OrderInfo order = orderInfoService.getOrderByOrderNo(outTradeNo); + if(order == null){ + log.error("订单不存在"); + return result; + } + + //2 判断 total_amount 是否确实为该订单的实际金额(即商户订单创建时的金额) + String totalAmount = params.get("total_amount"); + int totalAmountInt = new BigDecimal(totalAmount).intValue(); + int totalFeeInt = order.getTotalFee().intValue(); + if(totalAmountInt != totalFeeInt){ + log.error("金额校验失败"); + return result; + } + + //3 校验通知中的 seller_id(或者 seller_email) 是否为 out_trade_no 这笔单据的对应的操作方 + String sellerId = params.get("seller_id"); + String sellerIdProperty = config.getProperty("alipay.seller-id"); + if(!sellerId.equals(sellerIdProperty)){ + log.error("商家pid校验失败"); + return result; + } + + //4 验证 app_id 是否为该商户本身 + String appId = params.get("app_id"); + String appIdProperty = config.getProperty("alipay.app-id"); + if(!appId.equals(appIdProperty)){ + log.error("appid校验失败"); + return result; + } + + //在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS时, + // 支付宝才会认定为买家付款成功。 + String tradeStatus = params.get("trade_status"); + if(!"TRADE_SUCCESS".equals(tradeStatus)){ + log.error("支付未成功"); + return result; + } + + //处理业务 修改订单状态 记录支付日志 + processOrder(params); + + //校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure + result = "success"; + } catch (AlipayApiException e) { + e.printStackTrace(); + } + + return result; + } + + /** * 处理订单 * @param params @@ -112,26 +194,22 @@ public class AliPayServiceImpl implements AliPayService { // 成功获取则立即返回true,获取失败则立即返回false。不必一直等待锁的释放 if(lock.tryLock()) { try { - //处理重复通知 //接口调用的幂等性:无论接口被调用多少次,以下业务执行一次 String orderStatus = orderInfoService.getOrderStatus(orderNo); - if (!OrderStatusEnum.NOT_PAY.getType().equals(orderStatus)) { + // 当订单状态处于未支付或超时已关闭时,更新订单状态 + if (!OrderStatusEnum.NOT_PAY.getType().equals(orderStatus) || !OrderStatusEnum.TIMEOUT_CLOSED.getType().equals(orderStatus)) { return; } - //更新订单状态 orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.SUCCESS); - //记录支付日志 paymentInfoService.createPaymentInfoForAliPay(params); - } finally { //要主动释放锁 lock.unlock(); } } - } /** @@ -176,7 +254,7 @@ public class AliPayServiceImpl implements AliPayService { } catch (AlipayApiException e) { e.printStackTrace(); - throw new RuntimeException("查单接口的调用失败"); + throw new BusinessException("查单接口的调用失败"); } } @@ -198,7 +276,7 @@ public class AliPayServiceImpl implements AliPayService { if(result == null){ log.warn("核实订单未创建 ===> {}", orderNo); //更新本地订单状态 - orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.CLOSED); + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.TIMEOUT_CLOSED); } //解析查单响应结果 @@ -209,20 +287,16 @@ public class AliPayServiceImpl implements AliPayService { String tradeStatus = (String)alipayTradeQueryResponse.get("trade_status"); if(AliPayTradeStateEnum.NOTPAY.getType().equals(tradeStatus)){ log.warn("核实订单未支付 ===> {}", orderNo); - //如果订单未支付,则调用关单接口关闭订单 this.closeOrder(orderNo); - // 并更新商户端订单状态 - orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.CLOSED); + orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.TIMEOUT_CLOSED); } if(AliPayTradeStateEnum.SUCCESS.getType().equals(tradeStatus)){ log.warn("核实订单已支付 ===> {}", orderNo); - //如果订单已支付,则更新商户端订单状态 orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.SUCCESS); - //并记录支付日志 paymentInfoService.createPaymentInfoForAliPay(alipayTradeQueryResponse); } @@ -252,8 +326,8 @@ public class AliPayServiceImpl implements AliPayService { } } catch (AlipayApiException e) { - e.printStackTrace(); - throw new RuntimeException("关单接口的调用失败"); + log.error("关单失败,原因 ===> {}",e.getMessage()); + throw new BusinessException("关单接口的调用失败"); } } @@ -268,17 +342,14 @@ public class AliPayServiceImpl implements AliPayService { try { log.info("调用退款API"); - //创建退款单 RefundInfo refundInfo = refundsInfoService.createRefundByOrderNoForAliPay(orderNo, reason); - //调用统一收单交易退款接口 AlipayTradeRefundRequest request = new AlipayTradeRefundRequest (); - //组装当前业务方法的请求参数 JSONObject bizContent = new JSONObject(); bizContent.put("out_trade_no", orderNo);//订单编号 - BigDecimal refund = new BigDecimal(refundInfo.getRefund().toString()).divide(new BigDecimal("100")); + BigDecimal refund = new BigDecimal(refundInfo.getRefund().toString()); //BigDecimal refund = new BigDecimal("2").divide(new BigDecimal("100")); bizContent.put("refund_amount", refund);//退款金额:不能大于支付金额 bizContent.put("refund_reason", reason);//退款原因(可选) @@ -290,10 +361,8 @@ public class AliPayServiceImpl implements AliPayService { if(response.isSuccess()){ log.info("调用成功,返回结果 ===> " + response.getBody()); - //更新订单状态 orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.REFUND_SUCCESS); - //更新退款单 refundsInfoService.updateRefundForAliPay( refundInfo.getRefundNo(), @@ -302,21 +371,17 @@ public class AliPayServiceImpl implements AliPayService { } else { log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg()); - //更新订单状态 orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.REFUND_ABNORMAL); - //更新退款单 refundsInfoService.updateRefundForAliPay( refundInfo.getRefundNo(), response.getBody(), AliPayTradeStateEnum.REFUND_ERROR.getType()); //退款失败 } - - } catch (AlipayApiException e) { e.printStackTrace(); - throw new RuntimeException("创建退款申请失败"); + throw new BusinessException("创建退款申请失败"); } } @@ -349,7 +414,7 @@ public class AliPayServiceImpl implements AliPayService { } catch (AlipayApiException e) { e.printStackTrace(); - throw new RuntimeException("查单接口的调用失败"); + throw new BusinessException("查单接口的调用失败"); } } @@ -363,7 +428,6 @@ public class AliPayServiceImpl implements AliPayService { public String queryBill(String billDate, String type) { try { - AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest(); JSONObject bizContent = new JSONObject(); bizContent.put("bill_type", type); @@ -383,13 +447,11 @@ public class AliPayServiceImpl implements AliPayService { return billDownloadUrl; } else { log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg()); - throw new RuntimeException("申请账单失败"); + throw new BusinessException("申请账单失败"); } - } catch (AlipayApiException e) { - e.printStackTrace(); - throw new RuntimeException("申请账单失败"); + log.error("申请账单失败,原因 ===> {}",e.getMessage()); + throw new BusinessException("申请账单失败"); } } - } diff --git a/src/main/java/com/ai/da/service/impl/CallBackServiceImpl.java b/src/main/java/com/ai/da/service/impl/CallBackServiceImpl.java new file mode 100644 index 00000000..7c5fd42f --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/CallBackServiceImpl.java @@ -0,0 +1,159 @@ +package com.ai.da.service.impl; + +import com.ai.da.common.config.PayPalClient; +import com.ai.da.common.constant.PayPalCheckoutConstant; +import com.ai.da.common.utils.paypalRequest.WebhookVerifyRequest; +import com.ai.da.service.CallBackService; +import com.ai.da.service.PayPalCheckoutService; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.paypal.api.payments.Event; +import com.paypal.base.Constants; +import com.paypal.base.SDKUtil; +import com.paypal.base.rest.APIContext; +import com.paypal.base.rest.PayPalRESTException; +import com.paypal.http.HttpResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.SignatureException; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +import static com.ai.da.common.constant.PayPalCheckoutConstant.MODE; + +// #Validate Webhook Sample +// +// This sample code demonstrates how to validate a webhook received on your +// web server. This sample assumes that you use the java servlet, which returns +// the HttpServletRequest object. However, you can modify this code to +// your specific case. +// + +@Slf4j +@Service +public class CallBackServiceImpl implements CallBackService { + + @Value("${paypal.client-id}") + private String clientId; + + @Value("${paypal.client-secret}") + private String clientSecret; + + @Resource + private PayPalClient payPalClient; + + @Resource + private PayPalCheckoutService payPalCheckoutService; + + @Override + public Boolean doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + return doPost(req, resp); + } + + // ##Validate Webhook + protected Boolean doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + try { + String body = getBody(req); + Map webhookEvent = new ObjectMapper().readValue(body, Map.class); + + HashMap webhookRequest = new HashMap<>(); + webhookRequest.put("auth_algo",SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-AUTH-ALGO")); + webhookRequest.put("cert_url",SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-CERT-URL")); + webhookRequest.put("transmission_id",SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-TRANSMISSION-ID")); + webhookRequest.put("transmission_sig",SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-TRANSMISSION-SIG")); + webhookRequest.put("transmission_time",SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-TRANSMISSION-TIME")); + webhookRequest.put("webhook_id",PayPalCheckoutConstant.WEBHOOK_ID); + webhookRequest.put("webhook_event",webhookEvent); + + WebhookVerifyRequest webhookVerifyRequest = new WebhookVerifyRequest(); + webhookVerifyRequest.authorization(payPalCheckoutService.getOAuth()); + webhookVerifyRequest.requestBody(webhookRequest); + // 验签 + HttpResponse verified = payPalClient.client(MODE, clientId, clientSecret).execute(webhookVerifyRequest); + boolean verifyResult = verified.result().get("verification_status").toString().equals("SUCCESS"); + if (verifyResult){ + // ### Api Context + APIContext apiContext = new APIContext(clientId, clientSecret, PayPalCheckoutConstant.MODE); + + // Set the webhookId that you received when you created this webhook. + apiContext.addConfiguration(Constants.PAYPAL_WEBHOOK_ID, PayPalCheckoutConstant.WEBHOOK_ID); + Boolean result = Event.validateReceivedEvent(apiContext, getHeadersInfo( + req), body); + log.info("Webhook Validated: " + result); + + if (result){ + // 处理订单数据 + LinkedHashMap> webhookEventMap = (LinkedHashMap>) webhookEvent; + String orderId = webhookEventMap.get("resource").get("id"); + payPalCheckoutService.processOrder(orderId); + return Boolean.TRUE; + } + + } + } catch (PayPalRESTException | InvalidKeyException | NoSuchAlgorithmException | SignatureException e) { + log.error(e.getMessage()); + } + return Boolean.FALSE; + } + + // Simple helper method to help you extract the headers from HttpServletRequest object. + private static Map getHeadersInfo(HttpServletRequest request) { + Map map = new HashMap(); + @SuppressWarnings("rawtypes") + Enumeration headerNames = request.getHeaderNames(); + while (headerNames.hasMoreElements()) { + String key = (String) headerNames.nextElement(); + String value = request.getHeader(key); + map.put(key, value); + } + return map; + } + + // Simple helper method to fetch request data as a string from HttpServletRequest object. + private static String getBody(HttpServletRequest request) throws IOException { + String body; + StringBuilder stringBuilder = new StringBuilder(); + BufferedReader bufferedReader = null; + try { + InputStream inputStream = request.getInputStream(); + if (inputStream != null) { + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + char[] charBuffer = new char[128]; + int bytesRead = -1; + while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { + stringBuilder.append(charBuffer, 0, bytesRead); + } + } else { + stringBuilder.append(""); + } + } catch (IOException ex) { + throw ex; + } finally { + if (bufferedReader != null) { + try { + bufferedReader.close(); + } catch (IOException ex) { + throw ex; + } + } + } + body = stringBuilder.toString(); + log.info("回调参数 ===> {}", body); + return body; + } +} diff --git a/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java index 8b7662f7..43447c30 100644 --- a/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java @@ -1,12 +1,14 @@ package com.ai.da.service.impl; +import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.OrderStatusEnum; import com.ai.da.common.utils.OrderNoUtils; import com.ai.da.mapper.primary.OrderInfoMapper; import com.ai.da.mapper.primary.ProductMapper; import com.ai.da.mapper.primary.entity.OrderInfo; import com.ai.da.mapper.primary.entity.Product; +import com.ai.da.model.vo.AuthPrincipalVo; import com.ai.da.service.OrderInfoService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -25,9 +27,6 @@ public class OrderInfoServiceImpl extends ServiceImpl getOrderByAccountId(Long accountId){ + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("account_id",accountId); + qw.orderByDesc("create_time"); + + return baseMapper.selectList(qw); + } + + public void updateOrderNoById(Long id, String orderNo){ + OrderInfo orderInfo = new OrderInfo(); + orderInfo.setId(id); + orderInfo.setOrderNo(orderNo); + + baseMapper.updateById(orderInfo); + } } diff --git a/src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java b/src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java new file mode 100644 index 00000000..f38a00a8 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java @@ -0,0 +1,476 @@ +package com.ai.da.service.impl; + +import cn.hutool.core.convert.Convert; +import com.ai.da.common.config.PayPalClient; +import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.constant.PayPalCheckoutConstant; +import com.ai.da.common.enums.*; +import com.ai.da.common.utils.RedisUtil; +import com.ai.da.common.utils.paypalRequest.AuthenticationRequest; +import com.ai.da.mapper.primary.entity.OrderInfo; +import com.ai.da.mapper.primary.entity.RefundInfo; +import com.ai.da.service.OrderInfoService; +import com.ai.da.service.PayPalCheckoutService; +import com.ai.da.service.PaymentInfoService; +import com.ai.da.service.RefundInfoService; +import com.google.gson.Gson; +import com.paypal.http.HttpResponse; +import com.paypal.http.exceptions.SerializeException; +import com.paypal.http.serializer.Json; +import com.paypal.orders.*; +import com.paypal.payments.CapturesGetRequest; +import com.paypal.payments.CapturesRefundRequest; +import com.paypal.payments.RefundRequest; +import com.paypal.payments.RefundsGetRequest; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.IOException; +import java.util.*; + +import static com.ai.da.common.constant.PayPalCheckoutConstant.*; + +@Slf4j +@Service +//@RefreshScope +public class PayPalCheckoutServiceImpl implements PayPalCheckoutService { + + @Value("${paypal.receiver.email}") + private String receiverEmail; + + @Value("${paypal.client-id}") + private String clientId; + + @Value("${paypal.client-secret}") + private String clientSecret; + + @Resource + private PayPalClient payPalClient; + + @Resource + private OrderInfoService orderInfoService; + + @Resource + private PaymentInfoService paymentInfoService; + + @Resource + private RefundInfoService refundsInfoService; + + @Resource + private RedisUtil redisUtil; + + /** + * 创建订单的方法 + */ + @Override + public HashMap createOrder(Long productId,String returnUrl) throws SerializeException { + // 生成订单 + log.info("生成订单"); + OrderInfo orderInfo = orderInfoService.createOrderByProductId(productId, PayTypeEnum.PAYPAL.getType()); + + OrdersCreateRequest request = new OrdersCreateRequest(); + request.header("prefer","return=representation"); + request.requestBody(buildRequestBody(String.valueOf(orderInfo.getTotalFee()),returnUrl)); + HttpResponse response = null; + try { + response = payPalClient.client(MODE, clientId, clientSecret).execute(request); + } catch (Exception e) { + log.error("调用paypal订单创建失败,失败原因 ===> {}", e.getMessage()); + throw new BusinessException("Order creation failed"); + } + + String approve = ""; + assert response != null; + if (response.statusCode() == 201) { + log.info("Status Code = {}, Status = {}, OrderID = {}, Intent = {}", response.statusCode(), response.result().status(), response.result().id(), response.result().checkoutPaymentIntent()); + for (LinkDescription link : response.result().links()) { + log.info("Links-{}: {} \tCall Type: {}", link.rel(), link.href(), link.method()); + if(link.rel().equals("approve")) { + approve = link.href(); + } + } + String totalAmount = response.result().purchaseUnits().get(0).amountWithBreakdown().currencyCode() + ":" + response.result().purchaseUnits().get(0).amountWithBreakdown().value(); + log.info("Total Amount: {}", totalAmount); + String json= new JSONObject(new Json().serialize(response.result())).toString(4); + log.info("createOrder response body: {}", json); + } + + String orderId = response.result().id(); + orderInfoService.updateOrderNoById(orderInfo.getId(), orderId); + + + HashMap returnData = new HashMap<>(); + returnData.put("approve",approve); + returnData.put("orderNo",orderId); + + // 需要返回地址和订单id + return returnData; + } + + /** + * 生成订单主体信息 + */ + private OrderRequest buildRequestBody(String price, String returnUrl) { + OrderRequest orderRequest = new OrderRequest(); + orderRequest.checkoutPaymentIntent(CAPTURE); + + ApplicationContext applicationContext = new ApplicationContext() + .brandName(BRANDNAME) + .landingPage(LANDINGPAGE) + .cancelUrl("https://www.example.com").returnUrl(returnUrl) + .userAction(USERACTION) + .shippingPreference(SHIPPINGPREFERENCE); + orderRequest.applicationContext(applicationContext); + + List purchaseUnitRequests = new ArrayList(); + + PurchaseUnitRequest purchaseUnitRequest = new PurchaseUnitRequest() + .amountWithBreakdown(new AmountWithBreakdown() + .amountBreakdown(new AmountBreakdown()) + .currencyCode(CurrencyCodesEnum.HONG_KONG_DOLLAR.getCode()) + .value(price)); + purchaseUnitRequests.add(purchaseUnitRequest); + orderRequest.purchaseUnits(purchaseUnitRequests); + return orderRequest; + } + + @Override + public String callback(@SuppressWarnings("rawtypes") Map map) { + + log.info("paypal支付通知正在执行"); + log.info("通知参数 ===> {}", map); + +// log.info(map.toString()); + String outTradeNo = (String)map.get("invoice"); + String paymentStatus = (String)map.get("payment_status"); + String amount = (String)map.get("mc_gross"); + String currency = (String)map.get("mc_currency"); + String paymentId = (String)map.get("txn_id"); + String parentPaymentId = (String)map.get("parent_txn_id"); + log.info("商家订单号 = {}", outTradeNo); + log.info("订单状态 = {}", paymentStatus); + log.info("金额 = {}", amount); + log.info("币种 = {}", currency); + log.info("流水号 = {}", paymentId); + log.info("父流水号 = {}", parentPaymentId); + + if (!receiverEmail.equals(map.get("receiver_email"))) { + log.info("FAIL = 商户id错误, outTradeNo = {}", outTradeNo); + return "failure"; + } + if("Completed".equals(paymentStatus)) { + //进行数据库操作 + // + // + log.info("支付成功,状态为=COMPLETED"); + return "success"; + } + if("Refunded".equals(paymentStatus)) { + //进行数据库操作 + // + // + log.info("退款成功"); + return "success"; + } + if("Pending".equals(paymentStatus) && StringUtils.isEmpty(parentPaymentId)) { + String pendingReason = String.valueOf(map.get("pending_reason")); + //进行数据库操作 + // + // + log.info("订单支付成功,状态为=PENDING,产生此状态的原因是 {}", pendingReason ); + return "success"; + } + if(StringUtils.isEmpty(parentPaymentId)) { + if(PayPalCheckoutConstant.PAYMENT_STATUS_REVERSED.equals(paymentStatus) + || PayPalCheckoutConstant.PAYMENT_STATUS_CANCELED_REVERSAL.equals(paymentStatus) + || PayPalCheckoutConstant.PAYMENT_STATUS_DENIED.equals(paymentStatus)) { + String reasonCode = String.valueOf(map.get("reason_code")); + //进行数据库操作(状态修改) + // + // + log.info("订单异常,请尽快查看处理,状态为={},产生此状态的原因是 {} ", paymentStatus, reasonCode); + return PayPalCheckoutConstant.SUCCESS; + } + if(PayPalCheckoutConstant.PAYMENT_STATUS_EXPIRED.equals(paymentStatus) + || PayPalCheckoutConstant.PAYMENT_STATUS_CREATED.equals(paymentStatus) + || PayPalCheckoutConstant.PAYMENT_STATUS_FAILED.equals(paymentStatus) + || PayPalCheckoutConstant.PAYMENT_STATUS_PROCESSED.equals(paymentStatus) + || PayPalCheckoutConstant.PAYMENT_STATUS_VOIDED.equals(paymentStatus)) { + //进行数据库操作(状态修改) + // + // + log.info("其他订单状态,订单异常,请尽快查看处理, 状态={}", paymentStatus); + return PayPalCheckoutConstant.SUCCESS; + } + } + return "failure"; + } + + /** + * 查询订单信息 + * @param orderNo + * @return + * @throws SerializeException + */ + public String queryOrder(String orderNo) throws SerializeException { + OrdersGetRequest request = new OrdersGetRequest(orderNo); + + HttpResponse response = null; + try { + response = payPalClient.client(MODE, clientId, clientSecret).execute(request); + } catch (Exception e) { + log.error("paypal订单查询失败,失败原因 ===> {}",e.getMessage()); + } + System.out.println("Status Code: " + response.statusCode()); + System.out.println("Status: " + response.result().status()); + System.out.println("Order id: " + response.result().id()); + if(response.result().purchaseUnits().get(0).payments() != null) { + List captures = response.result().purchaseUnits().get(0).payments().captures(); + if(captures != null) { + for (Capture capture : captures) { + System.out.println("\t订单编号= " + capture.invoiceId() + "\tCapture Id= " + capture.id() + "\tCapture status= " + capture.status() + "\tCapture amount= " + capture.amount().currencyCode() + ":" + capture.amount().value()); + } + } + List refunds = response.result().purchaseUnits().get(0).payments().refunds(); + if(refunds != null) { + for (Refund refund : refunds) { + System.out.println("\t售后编号= " + refund.invoiceId() + "\tRefund Id= " + refund.id() + "\tRefund status= " + refund.status() + "\tRefund amount= " + refund.amount().currencyCode() + ":" + refund.amount().value()); + } + } + } + System.out.println("Links: "); + for (com.paypal.orders.LinkDescription link : response.result().links()) { + System.out.println("\t" + link.rel() + ": " + link.href() + "\tCall Type: " + link.method()); + } + + System.out.println("Full response body:"); + String json = new JSONObject(new Json().serialize(response.result())).toString(4); + System.out.println(json); + return null; + } + + /** + * 用户授权支付成功,进行扣款操作 + */ + public Order captureOrder(String orderId) { + OrdersCaptureRequest request = new OrdersCaptureRequest(orderId); + request.requestBody(new OrderRequest()); + PayPalClient payPalClient = new PayPalClient(); + HttpResponse response ; + + try { + response = payPalClient.client(MODE, clientId, clientSecret).execute(request); + } catch (Exception e) { + log.error("调用paypal扣款失败,失败原因 ===> {}", e.getMessage() ); + throw new BusinessException("Order deduction failed."); + } + log.info("Status Code = {}, Status = {}, OrderID = {}", response.statusCode(), response.result().status(), response.result().id()); + for (LinkDescription link : response.result().links()) { + log.info("Links-{}: {} \tCall Type: {}", link.rel(), link.href(), link.method()); + } + for (PurchaseUnit purchaseUnit : response.result().purchaseUnits()) { + for (Capture capture : purchaseUnit.payments().captures()) { + log.info("Capture id: {}", capture.id()); + log.info("status: {}", capture.status()); + log.info("invoice_id: {}", capture.invoiceId()); + if("COMPLETED".equals(capture.status())) { + //进行数据库操作,修改订单状态为已支付成功,尽快发货(配合回调和CapturesGet查询确定成功) + log.info("支付成功,状态为=COMPLETED"); + } + if("PENDING".equals(capture.status())) { + log.info("status_details: {}", capture.captureStatusDetails().reason()); + String reason = "PENDING"; + if(capture.captureStatusDetails() != null && capture.captureStatusDetails().reason() != null) { + reason = capture.captureStatusDetails().reason(); + } + //进行数据库操作,修改订单状态为已支付成功,但触发了人工审核,请审核通过后再发货(配合回调和CapturesGet查询确定成功) + log.info("支付成功,状态为=PENDING : {}", reason); + } + } + } + Payer buyer = response.result().payer(); + log.info("Buyer Email Address: {}", buyer.email()); + log.info("Buyer Name: {} {}", buyer.name().givenName(), buyer.name().surname()); +// String jsonString = JSON.toJSONString(response.result()); + String json = null; + try { + json = new JSONObject(new Json().serialize(response.result())).toString(4); + } catch (SerializeException e) { + log.warn("response序列化出错,具体信息 ===> {}",e.getMessage()); + } + log.info("captureOrder response body: {}", json); +// return Convert.toStr(new Json().serialize(response.result())); + return response.result(); + } + + /** + * 查询扣款 + */ + public String queryCapture(String orderNo) throws IOException { + CapturesGetRequest request = new CapturesGetRequest("扣款id, CaptureOrder生成"); + + HttpResponse response = payPalClient.client(MODE, clientId, clientSecret).execute(request); + System.out.println("Status Code: " + response.statusCode()); + System.out.println("Status: " + response.result().status()); + System.out.println("Capture ids: " + response.result().id()); + System.out.println("Links: "); + for (com.paypal.payments.LinkDescription link : response.result().links()) { + System.out.println("\t" + link.rel() + ": " + link.href() + "\tCall Type: " + link.method()); + } + System.out.println("Full response body:"); + System.out.println(new JSONObject(new Json().serialize(response.result())).toString(4)); + return null; + } + + + /** + * 申请退款 + */ + public Boolean refundOrder(String orderId,String reason) throws IOException { + + RefundInfo refundByOrderNo = refundsInfoService.createRefundByOrderNo(orderId, reason); + + OrdersGetRequest ordersGetRequest = new OrdersGetRequest(orderId); + PayPalClient payPalClient = new PayPalClient(); + HttpResponse ordersGetResponse = null; + ordersGetRequest.authorization("Bearer " + getOAuth()); + boolean result ; + try { + ordersGetResponse = payPalClient.client(MODE, clientId, clientSecret).execute(ordersGetRequest); + } catch (Exception e) { + log.error("调用paypal订单查询失败,失败原因 ===> {}", e.getMessage()); + throw new BusinessException("Order query failed"); + } + String captureId = ordersGetResponse.result().purchaseUnits().get(0).payments().captures().get(0).id(); + CapturesRefundRequest request = new CapturesRefundRequest(captureId); + request.authorization("Bearer " + getOAuth()); + request.prefer("return=representation"); + + OrderInfo orderInfo = orderInfoService.getOrderByOrderNo(orderId); + request.requestBody(buildRefundRequestBody(String.valueOf(orderInfo.getTotalFee()),reason)); + HttpResponse response = null; + try { + response = payPalClient.client(MODE, clientId, clientSecret).execute(request); + } catch (IOException e) { + log.error("调用paypal退款申请失败,失败原因 {}", e.getMessage()); + throw new BusinessException("Request for refund failed"); + } + + log.info("Status Code = {}, Status = {}, RefundID = {}", response.statusCode(), response.result().status(), response.result().id()); + if("COMPLETED".equals(response.result().status())) { + //进行数据库操作,修改状态为已退款(配合回调和退款查询确定退款成功) + + //更新订单状态 + orderInfoService.updateStatusByOrderNo(orderId, OrderStatusEnum.REFUND_SUCCESS); + + refundsInfoService.updateRefundForPayPal( + refundByOrderNo.getId(), + response.result().id(), + new Gson().toJson(response.result(), com.paypal.payments.Refund.class), + AliPayTradeStateEnum.REFUND_SUCCESS.getType()); //退款成功 + log.info("退款成功"); + result = Boolean.TRUE; + }else { + //更新订单状态 + orderInfoService.updateStatusByOrderNo(orderId, OrderStatusEnum.REFUND_ABNORMAL); + + //更新退款单 + refundsInfoService.updateRefundForPayPal( + refundByOrderNo.getId(), + response.result().id(), + new Gson().toJson(response.result(), com.paypal.payments.Refund.class), + AliPayTradeStateEnum.REFUND_ERROR.getType()); //退款失败 + result = Boolean.FALSE; + } + for (com.paypal.payments.LinkDescription link : response.result().links()) { + log.info("Links-{}: {} \tCall Type: {}", link.rel(), link.href(), link.method()); + } + String json = new JSONObject(new Json().serialize(response.result())).toString(4); + log.info("refundOrder response body: {}", json); + return result; + } + + public RefundRequest buildRefundRequestBody(String price, String reason) { + RefundRequest refundRequest = new RefundRequest(); + com.paypal.payments.Money money = new com.paypal.payments.Money(); + money.currencyCode(CurrencyCodesEnum.HONG_KONG_DOLLAR.getCode()); + money.value(price); + refundRequest.amount(money); +// refundRequest.invoiceId("P2020052514440001"); + refundRequest.noteToPayer(reason); + try { + log.info("refund order body : {}", Convert.toStr(new Json().serialize(refundRequest))); + } catch (SerializeException e) { + throw new RuntimeException(e); + } + + return refundRequest; + } + + /** + * 查询退款 + */ + public String queryRefund(String orderNo) throws IOException { + RefundsGetRequest request = new RefundsGetRequest("退款id RefundOrder生成"); + HttpResponse response = payPalClient.client(MODE, clientId, clientSecret).execute(request); + System.out.println("Status Code: " + response.statusCode()); + System.out.println("Status: " + response.result().status()); + System.out.println("Refund Id: " + response.result().id()); + System.out.println("Links: "); + for (com.paypal.payments.LinkDescription link : response.result().links()) { + System.out.println("\t" + link.rel() + ": " + link.href() + "\tCall Type: " + link.method()); + } + System.out.println("Full response body:"); + System.out.println(new JSONObject(new Json().serialize(response.result())).toString(4)); + return null; + } + + public String getOAuth(){ + // 1、判断缓存区是否有该token + Boolean hasKey = redisUtil.hasKey(PAYPAL_TOKEN_KEY); + if (hasKey){ + return redisUtil.getFromString(PAYPAL_TOKEN_KEY); +// return "A21AAKnpozur9r9omqQ2ge5aXHBBdEERi5F8FIgNYOjhhO2N7rjmkz2irh2lScpBO3s3Cqukw3eZkpYZ4YWE7rIacjv7MHmow"; + } + + // 2、无或者过期,重新获取token,返回 + AuthenticationRequest authenticationRequest = new AuthenticationRequest(); + authenticationRequest.authorization(clientId,clientSecret); + try { + HttpResponse authResult = payPalClient.client(MODE, clientId, clientSecret).execute(authenticationRequest); + String accessToken = authResult.result().get("access_token").toString(); + long expiresIn = Long.parseLong(authResult.result().get("expires_in").toString()); + // 3、存redis + redisUtil.addToString(PAYPAL_TOKEN_KEY,accessToken,expiresIn); + return accessToken; + } catch (IOException e) { + log.error("获取paypal token失败,失败原因 ===> {}", e.getMessage()); + throw new BusinessException(e); + } + } + + // 处理当前订单 + public void processOrder(String orderId){ + // 1、确定当前订单是否已经被扣款 + OrderInfo orderInfo = orderInfoService.getOrderByOrderNo(orderId); + if (orderInfo.getOrderStatus().equals(OrderStatusEnum.SUCCESS.getType())){ + // 直接返回 + return ; + } + // 发起扣款请求 + Order capturedOrder = captureOrder(orderId); + // 业务处理 + if (PayPalOrderStatusEnum.COMPLETED.getStatus().equals(capturedOrder.status())){ + //更新订单状态 + orderInfoService.updateStatusByOrderNo(orderId, OrderStatusEnum.SUCCESS); + //记录支付日志 + paymentInfoService.createPaymentInfoForPayPal(capturedOrder); + } + } +} + + diff --git a/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java index 31cca80a..367dd376 100644 --- a/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java @@ -6,6 +6,7 @@ import com.ai.da.mapper.primary.entity.PaymentInfo; import com.ai.da.service.PaymentInfoService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.gson.Gson; +import com.paypal.orders.Order; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -70,8 +71,8 @@ public class PaymentInfoServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); +// queryWrapper.eq("order_no", orderNo); + + //设置要修改的字段 + RefundInfo refundInfo = new RefundInfo(); + refundInfo.setId(id); + refundInfo.setRefundNo(null); + refundInfo.setRefundId(refundId); + refundInfo.setRefundStatus(refundStatus);//退款状态 + refundInfo.setContentReturn(content);//将全部响应结果存入数据库的content字段 + + //更新退款单 +// baseMapper.update(refundInfo, queryWrapper); + baseMapper.updateById(refundInfo); + } } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 2d98c907..3bb0bef3 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -21,7 +21,7 @@ spring.security.jwtExpiration=8640000000 #spring security权限设置 认证了token还要认证权限 不然报错Full authentication is required to access this resource spring.security.ignorePaths=/,/favicon.ico,/doc.html,/webjars/**,/swagger-resources,/v2/api-docs,\ /api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/**,/api/generate/**,/api/workspace/**,/api/classification/**,\ - /api/product/**,/api/ali-pay/**,/api/order-info/** + /api/product/**,/api/ali-pay/**,/api/order-info/**,/api/paypal/** spring.security.authApi=/auth/login diff --git a/src/main/resources/paypal-sandbox.properties b/src/main/resources/paypal-sandbox.properties new file mode 100644 index 00000000..e839eebf --- /dev/null +++ b/src/main/resources/paypal-sandbox.properties @@ -0,0 +1,5 @@ +paypal.client-id=ATbaebYi7-GXWRWJqwRLYMzKEbwjh4BFRqD4Y13i4lZq0rplWIM_IpPrtPKpdkAt_KrPXd6IJTwsDqa5 + +paypal.client-secret=EHWWJqGmmbfjLXqCUpGrvxRYBPPtWvA3hR5ZaAyHlGSVJiHoQPS8skbNaJ9h39VObnchUbgiY2pPu__s + +paypal.receiver.email=sb-ukxfk29608925@business.example.com \ No newline at end of file From e84d800ba01665a7162f83a1000f024c06851b4e Mon Sep 17 00:00:00 2001 From: xupei Date: Wed, 6 Mar 2024 20:56:22 +0800 Subject: [PATCH 35/93] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E7=A7=AF=E5=88=86?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=EF=BC=8C=E5=B0=86=E5=85=85=E5=80=BC=E4=B8=8E?= =?UTF-8?q?=E7=A7=AF=E5=88=86=E5=85=B3=E8=81=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/da/common/enums/CreditsEventsEnum.java | 30 ++++++ .../ai/da/controller/AliPayController.java | 6 +- .../ai/da/controller/CreditsController.java | 28 ++++++ .../controller/PayPalCheckoutController.java | 8 +- .../ai/da/mapper/primary/entity/Account.java | 6 ++ .../com/ai/da/service/AccountService.java | 2 + .../java/com/ai/da/service/AliPayService.java | 2 +- .../com/ai/da/service/CreditsService.java | 16 ++++ .../com/ai/da/service/OrderInfoService.java | 2 +- .../ai/da/service/PayPalCheckoutService.java | 2 +- .../da/service/impl/AccountServiceImpl.java | 8 ++ .../ai/da/service/impl/AliPayServiceImpl.java | 29 ++++-- .../da/service/impl/CreditsServiceImpl.java | 91 +++++++++++++++++++ .../da/service/impl/OrderInfoServiceImpl.java | 18 ++-- .../impl/PayPalCheckoutServiceImpl.java | 18 ++-- src/main/resources/application-dev.properties | 2 +- 16 files changed, 234 insertions(+), 34 deletions(-) create mode 100644 src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java create mode 100644 src/main/java/com/ai/da/controller/CreditsController.java create mode 100644 src/main/java/com/ai/da/service/CreditsService.java create mode 100644 src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java diff --git a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java new file mode 100644 index 00000000..015698db --- /dev/null +++ b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java @@ -0,0 +1,30 @@ +package com.ai.da.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum CreditsEventsEnum { + + PRICE("price","2"), + + INIT("init", "1000"), + + DAILY_CHECKIN("Daily Check-In", "50"), + + SOCIAL_MEDIA_SHARING("Social Media Sharing","50"), + + BUY_CREDITS("Buy Credits","2000"), + + SUPER_RESOLUTION("Super Resolution","300"), + + OTHER("Other","10"); + + private String name; + + /** + * 对应事件需要消耗or获得的积分 + */ + private String value; +} diff --git a/src/main/java/com/ai/da/controller/AliPayController.java b/src/main/java/com/ai/da/controller/AliPayController.java index 3878628a..468b154b 100644 --- a/src/main/java/com/ai/da/controller/AliPayController.java +++ b/src/main/java/com/ai/da/controller/AliPayController.java @@ -21,12 +21,12 @@ public class AliPayController { private AliPayService aliPayService; @ApiOperation("统一收单下单并支付页面接口的调用") - @PostMapping("/trade/page/pay/{productId}") - public Response tradePagePay(@PathVariable Long productId,@RequestParam String returnUrl){ + @PostMapping("/trade/page/pay/{amount}") + public Response tradePagePay(@PathVariable Integer amount, @RequestParam String returnUrl){ log.info("统一收单下单并支付页面接口的调用"); //支付宝开放平台接受 request 请求对象后 // 会为开发者生成一个html 形式的 form表单,包含自动提交的脚本 - String formStr = aliPayService.tradeCreate(productId, returnUrl); + String formStr = aliPayService.tradeCreate(amount, returnUrl); //我们将form表单字符串返回给前端程序,之后前端将会调用自动提交脚本,进行表单的提交 //此时,表单会自动提交到action属性所指向的支付宝开放平台中,从而为用户展示一个支付页面 return Response.success(formStr); diff --git a/src/main/java/com/ai/da/controller/CreditsController.java b/src/main/java/com/ai/da/controller/CreditsController.java new file mode 100644 index 00000000..fe240ea4 --- /dev/null +++ b/src/main/java/com/ai/da/controller/CreditsController.java @@ -0,0 +1,28 @@ +package com.ai.da.controller; + +import com.ai.da.common.response.Response; +import com.ai.da.service.CreditsService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@CrossOrigin +@RestController +@RequestMapping("/api/credits") +@Api(tags = "积分") +@Slf4j +public class CreditsController { + + @Resource + private CreditsService creditsService; + + @ApiOperation("获取积分") + @GetMapping("/getCredits") + public Response getCredits(){ + String credits = creditsService.getCredits(); + return Response.success(credits); + } +} diff --git a/src/main/java/com/ai/da/controller/PayPalCheckoutController.java b/src/main/java/com/ai/da/controller/PayPalCheckoutController.java index 0e141e67..1877f098 100644 --- a/src/main/java/com/ai/da/controller/PayPalCheckoutController.java +++ b/src/main/java/com/ai/da/controller/PayPalCheckoutController.java @@ -30,9 +30,9 @@ public class PayPalCheckoutController { private CallBackService callBackService; @ApiOperation(value = "创建订单") - @PostMapping(value = "/trade/{productId}") - public Response> createOrder(@PathVariable Long productId,@RequestParam String returnUrl) throws SerializeException { - HashMap approvalUrl = payPalCheckoutService.createOrder(productId,returnUrl); + @PostMapping(value = "/trade/{amount}") + public Response> createOrder(@PathVariable Integer amount, @RequestParam String returnUrl) throws SerializeException { + HashMap approvalUrl = payPalCheckoutService.createOrder(amount,returnUrl); return Response.success(approvalUrl); } @@ -41,7 +41,7 @@ public class PayPalCheckoutController { public Response callback(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Boolean result = callBackService.doGet(request, response); if (result){ - return Response.success(); + return Response.success(200,"success"); }else { return Response.fail(500,"failure"); } diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Account.java b/src/main/java/com/ai/da/mapper/primary/entity/Account.java index bca34dec..ad574fe7 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/Account.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Account.java @@ -8,6 +8,7 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; /** @@ -80,4 +81,9 @@ public class Account implements Serializable { private Integer isBeginner; private String browserIdentifiers; + + /** + * 积分 + */ + private BigDecimal credits; } diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java index c00d2a4c..5b00ba5b 100644 --- a/src/main/java/com/ai/da/service/AccountService.java +++ b/src/main/java/com/ai/da/service/AccountService.java @@ -128,4 +128,6 @@ public interface AccountService extends IService { void upgradeNotification(); void moveLibraryDate(); + + void updateCredits(Long accountId, String value); } diff --git a/src/main/java/com/ai/da/service/AliPayService.java b/src/main/java/com/ai/da/service/AliPayService.java index fbfc86df..66dd334d 100644 --- a/src/main/java/com/ai/da/service/AliPayService.java +++ b/src/main/java/com/ai/da/service/AliPayService.java @@ -3,7 +3,7 @@ package com.ai.da.service; import java.util.Map; public interface AliPayService { - String tradeCreate(Long productId,String returnUrl); + String tradeCreate(Integer amount,String returnUrl); String tradeNotify(Map params); diff --git a/src/main/java/com/ai/da/service/CreditsService.java b/src/main/java/com/ai/da/service/CreditsService.java new file mode 100644 index 00000000..64e9f917 --- /dev/null +++ b/src/main/java/com/ai/da/service/CreditsService.java @@ -0,0 +1,16 @@ +package com.ai.da.service; + +public interface CreditsService { + + void initCredits(); + + Boolean buyCredits(Long accountId, Integer quantity); + + void creditsIncrease(Long accountId, String event); + + void creditsDecrease(Long accountId, String event); + + String getCredits(); + + void creditsRefund(Long accountId, Integer quantity); +} diff --git a/src/main/java/com/ai/da/service/OrderInfoService.java b/src/main/java/com/ai/da/service/OrderInfoService.java index 4f4dff38..31e1d99c 100644 --- a/src/main/java/com/ai/da/service/OrderInfoService.java +++ b/src/main/java/com/ai/da/service/OrderInfoService.java @@ -9,7 +9,7 @@ import java.util.List; public interface OrderInfoService extends IService { - OrderInfo createOrderByProductId(Long productId, String paymentType); + OrderInfo createOrderByProductId(Integer productId, String paymentType); void saveCodeUrl(String orderNo, String codeUrl); diff --git a/src/main/java/com/ai/da/service/PayPalCheckoutService.java b/src/main/java/com/ai/da/service/PayPalCheckoutService.java index 8a79b489..8b5d2347 100644 --- a/src/main/java/com/ai/da/service/PayPalCheckoutService.java +++ b/src/main/java/com/ai/da/service/PayPalCheckoutService.java @@ -9,7 +9,7 @@ import java.util.Map; public interface PayPalCheckoutService { - HashMap createOrder(Long productId,String returnUrl) throws SerializeException; + HashMap createOrder(Integer amount,String returnUrl) throws SerializeException; /** * 回调 * @param map diff --git a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java index 38495eab..6baba970 100644 --- a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java @@ -36,6 +36,7 @@ import org.springframework.util.Assert; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; import java.time.Instant; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; @@ -885,4 +886,11 @@ public class AccountServiceImpl extends ServiceImpl impl // 未迁移过的进行迁移,注意模特数据迁移打点信息以及转换模特格式 } + + public void updateCredits(Long accountId, String value){ + Account account = new Account(); + account.setId(accountId); + account.setCredits(new BigDecimal(value)); + accountMapper.updateById(account); + } } diff --git a/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java index 1b2dc62d..bcc1213f 100644 --- a/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java @@ -2,14 +2,12 @@ package com.ai.da.service.impl; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.enums.AliPayTradeStateEnum; +import com.ai.da.common.enums.CreditsEventsEnum; import com.ai.da.common.enums.OrderStatusEnum; import com.ai.da.common.enums.PayTypeEnum; import com.ai.da.mapper.primary.entity.OrderInfo; import com.ai.da.mapper.primary.entity.RefundInfo; -import com.ai.da.service.AliPayService; -import com.ai.da.service.OrderInfoService; -import com.ai.da.service.PaymentInfoService; -import com.ai.da.service.RefundInfoService; +import com.ai.da.service.*; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; @@ -49,16 +47,19 @@ public class AliPayServiceImpl implements AliPayService { @Resource private RefundInfoService refundsInfoService; + @Resource + private CreditsService creditsService; + private final ReentrantLock lock = new ReentrantLock(); @Transactional(rollbackFor = Exception.class) @Override - public String tradeCreate(Long productId, String returnUrl) { + public String tradeCreate(Integer amount, String returnUrl) { try { //生成订单 log.info("生成订单"); - OrderInfo orderInfo = orderInfoService.createOrderByProductId(productId, PayTypeEnum.ALIPAY.getType()); + OrderInfo orderInfo = orderInfoService.createOrderByProductId(amount, PayTypeEnum.ALIPAY.getType()); //调用支付宝接口 AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); @@ -74,7 +75,8 @@ public class AliPayServiceImpl implements AliPayService { bizContent.put("out_trade_no", orderInfo.getOrderNo()); BigDecimal total = new BigDecimal(orderInfo.getTotalFee().toString()); bizContent.put("total_amount", total); - bizContent.put("subject", orderInfo.getTitle()); +// bizContent.put("subject", orderInfo.getTitle()); + bizContent.put("subject", "积分购买"); bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY"); request.setBizContent(bizContent.toString()); @@ -186,6 +188,7 @@ public class AliPayServiceImpl implements AliPayService { //获取订单号 String orderNo = params.get("out_trade_no"); + String totalAmount = params.get("total_amount"); /*在对业务数据进行状态检查和处理之前, 要采用数据锁进行并发控制, @@ -196,7 +199,9 @@ public class AliPayServiceImpl implements AliPayService { try { //处理重复通知 //接口调用的幂等性:无论接口被调用多少次,以下业务执行一次 - String orderStatus = orderInfoService.getOrderStatus(orderNo); +// String orderStatus = orderInfoService.getOrderStatus(orderNo); + OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderNo); + String orderStatus = orderByOrderNo.getOrderStatus(); // 当订单状态处于未支付或超时已关闭时,更新订单状态 if (!OrderStatusEnum.NOT_PAY.getType().equals(orderStatus) || !OrderStatusEnum.TIMEOUT_CLOSED.getType().equals(orderStatus)) { return; @@ -205,6 +210,8 @@ public class AliPayServiceImpl implements AliPayService { orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.SUCCESS); //记录支付日志 paymentInfoService.createPaymentInfoForAliPay(params); + // 更新积分 + creditsService.buyCredits(orderByOrderNo.getAccountId(),Integer.parseInt(totalAmount) / Integer.parseInt(CreditsEventsEnum.PRICE.getValue())); } finally { //要主动释放锁 lock.unlock(); @@ -285,6 +292,7 @@ public class AliPayServiceImpl implements AliPayService { LinkedTreeMap alipayTradeQueryResponse = resultMap.get("alipay_trade_query_response"); String tradeStatus = (String)alipayTradeQueryResponse.get("trade_status"); + OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderNo); if(AliPayTradeStateEnum.NOTPAY.getType().equals(tradeStatus)){ log.warn("核实订单未支付 ===> {}", orderNo); //如果订单未支付,则调用关单接口关闭订单 @@ -299,6 +307,8 @@ public class AliPayServiceImpl implements AliPayService { orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.SUCCESS); //并记录支付日志 paymentInfoService.createPaymentInfoForAliPay(alipayTradeQueryResponse); + // 更新积分 + creditsService.buyCredits(orderByOrderNo.getAccountId(),orderByOrderNo.getTotalFee() / Integer.parseInt(CreditsEventsEnum.PRICE.getValue())); } } @@ -368,6 +378,9 @@ public class AliPayServiceImpl implements AliPayService { refundInfo.getRefundNo(), response.getBody(), AliPayTradeStateEnum.REFUND_SUCCESS.getType()); //退款成功 + // 更新积分状态 + OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderNo); + creditsService.creditsRefund(orderByOrderNo.getAccountId(), orderByOrderNo.getTotalFee() / Integer.parseInt(CreditsEventsEnum.PRICE.getValue())); } else { log.info("调用失败,返回码 ===> " + response.getCode() + ", 返回描述 ===> " + response.getMsg()); diff --git a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java new file mode 100644 index 00000000..9c5ac128 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java @@ -0,0 +1,91 @@ +package com.ai.da.service.impl; + +import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.context.UserContext; +import com.ai.da.common.enums.CreditsEventsEnum; +import com.ai.da.mapper.primary.AccountMapper; +import com.ai.da.mapper.primary.entity.Account; +import com.ai.da.service.AccountService; +import com.ai.da.service.CreditsService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; + +@Service +public class CreditsServiceImpl implements CreditsService { + + @Resource + private AccountService accountService; + + @Resource + private AccountMapper accountMapper; + + @Override + public void initCredits() { + accountService.updateCredits(UserContext.getUserHolder().getId(), CreditsEventsEnum.INIT.getValue()); + } + + @Override + public Boolean buyCredits(Long accountId, Integer quantity) { + BigDecimal existingCredits = accountMapper.selectById(accountId).getCredits(); + BigDecimal newCredits = new BigDecimal(CreditsEventsEnum.BUY_CREDITS.getValue()).multiply(new BigDecimal(quantity)); + BigDecimal added = existingCredits.add(newCredits); + accountService.updateCredits(accountId, added.toString()); + return Boolean.TRUE; + } + + @Override + public void creditsIncrease(Long accountId, String creditsEvent) { + CreditsEventsEnum event = null; + + switch (creditsEvent){ + case "Daily Check-In": + event = CreditsEventsEnum.DAILY_CHECKIN; + break; + case "Social Media Sharing": + event = CreditsEventsEnum.SOCIAL_MEDIA_SHARING; + break; + case "Other": + event = CreditsEventsEnum.OTHER; + break; + default: + throw new BusinessException("UNKNOWN TYPE"); + } + BigDecimal existingCredits = accountMapper.selectById(UserContext.getUserHolder().getId()).getCredits(); + BigDecimal add = new BigDecimal(event.getValue()).add(existingCredits); + accountService.updateCredits(UserContext.getUserHolder().getId(), add.toString()); + } + + @Override + public void creditsDecrease(Long accountId, String creditsEvent) { + CreditsEventsEnum event = null; + + switch (creditsEvent){ + case "Super Resolution": + event = CreditsEventsEnum.DAILY_CHECKIN; + break; + case "Other": + event = CreditsEventsEnum.OTHER; + break; + default: + throw new BusinessException("UNKNOWN TYPE"); + } + BigDecimal existingCredits = accountMapper.selectById(UserContext.getUserHolder().getId()).getCredits(); + BigDecimal subtract = existingCredits.subtract(new BigDecimal(event.getValue())); + accountService.updateCredits(UserContext.getUserHolder().getId(), subtract.toString()); + } + + @Override + public String getCredits() { + Account account = accountMapper.selectById(UserContext.getUserHolder().getId()); + return account.getCredits().toString(); + } + + public void creditsRefund(Long accountId, Integer quantity){ + BigDecimal existingCredits = accountMapper.selectById(accountId).getCredits(); + BigDecimal newCredits = new BigDecimal(CreditsEventsEnum.BUY_CREDITS.getValue()).multiply(new BigDecimal(quantity)); + BigDecimal subtracted = existingCredits.subtract(newCredits); + accountService.updateCredits(accountId, subtracted.toString()); + } +} diff --git a/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java index 43447c30..232b562a 100644 --- a/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java @@ -2,12 +2,12 @@ package com.ai.da.service.impl; import com.ai.da.common.context.UserContext; +import com.ai.da.common.enums.CreditsEventsEnum; import com.ai.da.common.enums.OrderStatusEnum; import com.ai.da.common.utils.OrderNoUtils; import com.ai.da.mapper.primary.OrderInfoMapper; import com.ai.da.mapper.primary.ProductMapper; import com.ai.da.mapper.primary.entity.OrderInfo; -import com.ai.da.mapper.primary.entity.Product; import com.ai.da.model.vo.AuthPrincipalVo; import com.ai.da.service.OrderInfoService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -28,26 +28,26 @@ public class OrderInfoServiceImpl extends ServiceImpl createOrder(Long productId,String returnUrl) throws SerializeException { + public HashMap createOrder(Integer amount, String returnUrl) throws SerializeException { // 生成订单 log.info("生成订单"); - OrderInfo orderInfo = orderInfoService.createOrderByProductId(productId, PayTypeEnum.PAYPAL.getType()); + OrderInfo orderInfo = orderInfoService.createOrderByProductId(amount, PayTypeEnum.PAYPAL.getType()); OrdersCreateRequest request = new OrdersCreateRequest(); request.header("prefer","return=representation"); @@ -372,6 +372,10 @@ public class PayPalCheckoutServiceImpl implements PayPalCheckoutService { response.result().id(), new Gson().toJson(response.result(), com.paypal.payments.Refund.class), AliPayTradeStateEnum.REFUND_SUCCESS.getType()); //退款成功 + + // 更新积分状态 + OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderId); + creditsService.creditsRefund(orderByOrderNo.getAccountId(), orderByOrderNo.getTotalFee() / Integer.parseInt(CreditsEventsEnum.PRICE.getValue())); log.info("退款成功"); result = Boolean.TRUE; }else { @@ -469,6 +473,8 @@ public class PayPalCheckoutServiceImpl implements PayPalCheckoutService { orderInfoService.updateStatusByOrderNo(orderId, OrderStatusEnum.SUCCESS); //记录支付日志 paymentInfoService.createPaymentInfoForPayPal(capturedOrder); + // 更新积分 + creditsService.buyCredits(orderInfo.getAccountId(), orderInfo.getTotalFee() / Integer.parseInt(CreditsEventsEnum.PRICE.getValue())); } } } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 3bb0bef3..ccb406c6 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -21,7 +21,7 @@ spring.security.jwtExpiration=8640000000 #spring security权限设置 认证了token还要认证权限 不然报错Full authentication is required to access this resource spring.security.ignorePaths=/,/favicon.ico,/doc.html,/webjars/**,/swagger-resources,/v2/api-docs,\ /api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/**,/api/generate/**,/api/workspace/**,/api/classification/**,\ - /api/product/**,/api/ali-pay/**,/api/order-info/**,/api/paypal/** + /api/product/**,/api/ali-pay/**,/api/order-info/**,/api/paypal/**,/api/credits/** spring.security.authApi=/auth/login From 305324fe1a622fbbf0ce0d24dd832aac5cbfdf84 Mon Sep 17 00:00:00 2001 From: xupei Date: Fri, 15 Mar 2024 15:38:56 +0800 Subject: [PATCH 36/93] =?UTF-8?q?1=E3=80=81=E6=8E=A5=E5=85=A5=E8=B6=85?= =?UTF-8?q?=E5=88=86=E5=8A=9F=E8=83=BD=202=E3=80=81=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=A7=AF=E5=88=86=E7=B3=BB=E7=BB=9F=203=E3=80=81=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E8=AE=A2=E5=8D=95=E6=9F=A5=E8=AF=A2=EF=BC=8C=E7=A7=AF?= =?UTF-8?q?=E5=88=86=E8=AF=A6=E7=BB=86=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...{MQConsumer.java => GenerateConsumer.java} | 8 +- .../com/ai/da/common/RabbitMQ/MQConfig.java | 20 +-- .../ai/da/common/RabbitMQ/MQPublisher.java | 4 + .../com/ai/da/common/RabbitMQ/SRConsumer.java | 111 ++++++++++++++++ .../ai/da/common/enums/CreditsEventsEnum.java | 4 +- .../ai/da/common/utils/AsyncCallerUtil.java | 50 +++++++ .../ai/da/controller/AliPayController.java | 2 +- .../ConvenientInquiryController.java | 6 +- .../ai/da/controller/CreditsController.java | 15 ++- .../ai/da/controller/OrderInfoController.java | 11 +- .../controller/PayPalCheckoutController.java | 7 +- .../ai/da/controller/PythonController.java | 12 +- .../mapper/primary/CreditsDetailMapper.java | 7 + .../mapper/primary/SuperResolutionMapper.java | 7 + .../da/mapper/primary/entity/BaseEntity.java | 5 +- .../mapper/primary/entity/CreditsDetail.java | 21 +++ .../primary/entity/SuperResolution.java | 20 +++ .../dto/QueryIncomeOrExpenditureDTO.java | 13 ++ .../ai/da/model/dto/QueryPageByTimeDTO.java | 19 +++ .../ai/da/model/dto/SuperResolutionDTO.java | 27 ++++ .../java/com/ai/da/python/PythonService.java | 60 +++++++++ .../com/ai/da/service/CreditsService.java | 12 +- .../com/ai/da/service/OrderInfoService.java | 4 +- .../ai/da/service/PayPalCheckoutService.java | 6 + .../com/ai/da/service/RabbitMQService.java | 4 +- .../ai/da/service/SuperResolutionService.java | 12 ++ .../ai/da/service/impl/AliPayServiceImpl.java | 10 ++ .../da/service/impl/CreditsServiceImpl.java | 76 ++++++++++- .../da/service/impl/GenerateServiceImpl.java | 8 +- .../da/service/impl/OrderInfoServiceImpl.java | 33 ++++- .../impl/PayPalCheckoutServiceImpl.java | 125 +++++++++++++++++- .../da/service/impl/RabbitMQServiceImpl.java | 6 +- .../impl/SuperResolutionServiceImpl.java | 122 +++++++++++++++++ .../resources/mapper/primary/DesignMapper.xml | 4 +- src/main/resources/messages_en.properties | 2 + 35 files changed, 798 insertions(+), 55 deletions(-) rename src/main/java/com/ai/da/common/RabbitMQ/{MQConsumer.java => GenerateConsumer.java} (97%) create mode 100644 src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java create mode 100644 src/main/java/com/ai/da/mapper/primary/CreditsDetailMapper.java create mode 100644 src/main/java/com/ai/da/mapper/primary/SuperResolutionMapper.java create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/CreditsDetail.java create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/SuperResolution.java create mode 100644 src/main/java/com/ai/da/model/dto/QueryIncomeOrExpenditureDTO.java create mode 100644 src/main/java/com/ai/da/model/dto/QueryPageByTimeDTO.java create mode 100644 src/main/java/com/ai/da/model/dto/SuperResolutionDTO.java create mode 100644 src/main/java/com/ai/da/service/SuperResolutionService.java create mode 100644 src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java similarity index 97% rename from src/main/java/com/ai/da/common/RabbitMQ/MQConsumer.java rename to src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java index 77f46dbd..58f9435a 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java @@ -22,7 +22,7 @@ import java.util.Objects; @Slf4j @Component -public class MQConsumer { +public class GenerateConsumer { @Resource private GenerateService generateService; @@ -30,13 +30,13 @@ public class MQConsumer { @Resource private RedisUtil redisUtil; - @Value("${redis.key.consumptionOrder}") + @Value("${redis.key.orderForGenerate}") private String consumptionOrderKey; - @Value("${redis.key.cancelSet}") + @Value("${redis.key.generateCancelSet}") private String cancelSetKey; - @Value("${redis.key.exceptionMap}") + @Value("${redis.key.generateExceptionMap}") private String exceptionMapKey; @Value("${redis.key.resultMap}") diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java index bb4aa412..7b5b2e8c 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java @@ -1,16 +1,8 @@ package com.ai.da.common.RabbitMQ; -import org.springframework.amqp.core.Binding; -import org.springframework.amqp.core.BindingBuilder; -import org.springframework.amqp.core.FanoutExchange; import org.springframework.amqp.core.Queue; -import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; -import org.springframework.amqp.rabbit.connection.ConnectionFactory; -import org.springframework.amqp.rabbit.core.RabbitAdmin; -import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.beans.factory.annotation.Value; @Configuration public class MQConfig { @@ -18,7 +10,10 @@ public class MQConfig { public static final String GENERATE_EXCHANGE_FANOUT = "generate-exchange"; // public static final String GENERATE_QUEUE = "generate-queue-prod"; // public static final String GENERATE_QUEUE = "generate-queue-test"; - public static final String GENERATE_QUEUE = "generate-queue-dev"; +// public static final String GENERATE_QUEUE = "generate-queue-dev"; + public static final String GENERATE_QUEUE = "generate-queue"; + + public static final String SR_QUEUE = "SR-queue-dev"; public MQConfig() { } @@ -32,10 +27,15 @@ public class MQConfig { * 创建队列,使用工作模式,不用定义交换机 */ @Bean - public Queue queueRasa() { + public Queue generateQueue() { return new Queue(GENERATE_QUEUE); } + @Bean + public Queue SRQueue() { + return new Queue(SR_QUEUE); + } + /** * 将队列绑定到交换机上【队列订阅交换机】 */ diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQPublisher.java b/src/main/java/com/ai/da/common/RabbitMQ/MQPublisher.java index b0429110..8afffa29 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQPublisher.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/MQPublisher.java @@ -18,7 +18,11 @@ public class MQPublisher { public void sendGenerateMessage(String mm) { log.info("send message:" + mm); amqpTemplate.convertAndSend(MQConfig.GENERATE_QUEUE, mm); + } + public void sendSRMessage(String mm) { + log.info("send message:" + mm); + amqpTemplate.convertAndSend(MQConfig.SR_QUEUE, mm); } } diff --git a/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java new file mode 100644 index 00000000..9e014274 --- /dev/null +++ b/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java @@ -0,0 +1,111 @@ +package com.ai.da.common.RabbitMQ; + +import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.utils.RedisUtil; +import com.ai.da.model.dto.GenerateThroughImageTextDTO; +import com.ai.da.model.dto.SuperResolutionDTO; +import com.ai.da.model.vo.GenerateCollectionVO; +import com.ai.da.service.SuperResolutionService; +import com.alibaba.fastjson.JSONObject; +import com.rabbitmq.client.Channel; +import io.netty.util.internal.StringUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.io.IOException; +import java.util.HashMap; + +@Slf4j +@Component +public class SRConsumer { + + @Resource + private RedisUtil redisUtil; + + @Value("${redis.key.orderForSR}") + private String consumptionOrderKey; + + @Value("${redis.key.SRCancelSet}") + private String cancelSetKey; + + @Value("${redis.key.SRExceptionMap}") + private String exceptionMapKey; + + @Value("${redis.key.resultMap}") + private String resultMapKey; + + @Resource + private SuperResolutionService superResolutionService; + + public void superResolution(Message msg, Channel channel, String consumerName){ + log.info("============start listening=========="); + long start = System.currentTimeMillis(); + + SuperResolutionDTO superResolutionDTO = JSONObject.parseObject(msg.getBody(), SuperResolutionDTO.class); + String uniqueId = superResolutionDTO.getUniqueId(); + log.info("From " + consumerName + " : " + uniqueId); + + try { + // 2、判断当前消息是否在取消列表中 + Boolean isMember = redisUtil.isElementExistsInSet(cancelSetKey, uniqueId); + if (isMember) { + try { + // 2.1 手动确认该消息 + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + } catch (IOException ex) { + log.error("手动确认,不返回队列重新消费"); + } + } else { + /*try { + Thread.sleep(15000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + }*/ + String srOutput = superResolutionService.SR(superResolutionDTO); + // 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除 + redisUtil.removeFromZSet(consumptionOrderKey, uniqueId); + if (!StringUtil.isNullOrEmpty(srOutput)) { + HashMap generateResult = new HashMap<>(); + generateResult.put(uniqueId, srOutput); + // 将结果存在redis中 ,为空时不要存 + redisUtil.addToMap(resultMapKey, generateResult); + } + + } + } catch (BusinessException e) { + log.error(e.getMsg()); + // channel.basicNack() 为不确认deliveryTag对应的消息,第二个参数是否应用于多消息,第三个参数是否requeue + try { + // 第二个参数,是否批量确认消息,当传false时,只确认当前 deliveryTag对应的消息;当传true时,会确认当前及之前所有未确认的消息。 + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + // 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除 + redisUtil.removeFromZSet(consumptionOrderKey, uniqueId); + } catch (IOException exception) { + log.error("手动确认,取消返回队列,不再重新消费"); + } + // 将入参和错误信息存入数据库 + String exceptionMessage = JSONObject.toJSONString(superResolutionDTO) + + " Exception message : " + e.getMsg(); + HashMap exceptionInfo = new HashMap<>(); + exceptionInfo.put(String.valueOf(uniqueId), exceptionMessage); + // 存redis + redisUtil.addToMap(exceptionMapKey, exceptionInfo); + } + long end = System.currentTimeMillis(); + + log.info(" task_id: " + uniqueId + "----------" + consumerName + " 执行时长:" + (end - start) + "毫秒"); + log.info("=============end listening==========="); + } + + @RabbitListener(queues = MQConfig.SR_QUEUE) + @RabbitHandler + public void SRConsumer1(Message msg, Channel channel) { + superResolution(msg, channel, "consumer 1"); + } + +} diff --git a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java index 015698db..7e3eeb40 100644 --- a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java +++ b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java @@ -14,8 +14,8 @@ public enum CreditsEventsEnum { DAILY_CHECKIN("Daily Check-In", "50"), SOCIAL_MEDIA_SHARING("Social Media Sharing","50"), - - BUY_CREDITS("Buy Credits","2000"), + // 6USD -> 1000 points ==> 10HKD -> 215 points ==> 2HKD -> 43points + BUY_CREDITS("Buy Credits","43"), SUPER_RESOLUTION("Super Resolution","300"), diff --git a/src/main/java/com/ai/da/common/utils/AsyncCallerUtil.java b/src/main/java/com/ai/da/common/utils/AsyncCallerUtil.java index c864960c..01bcd9bc 100644 --- a/src/main/java/com/ai/da/common/utils/AsyncCallerUtil.java +++ b/src/main/java/com/ai/da/common/utils/AsyncCallerUtil.java @@ -2,6 +2,7 @@ package com.ai.da.common.utils; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.model.dto.GenerateToPythonDTO; +import com.ai.da.model.dto.SuperResolutionDTO; import com.ai.da.python.PythonService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -14,6 +15,7 @@ import java.util.concurrent.*; @Component public class AsyncCallerUtil { + // 存放状态 表示当前任务是否需要继续等待,默认持续等待 public static Map waitingStatus = new HashMap<>(); private static PythonService pythonService; @@ -70,4 +72,52 @@ public class AsyncCallerUtil { } } + public CompletableFuture callSRAsync(SuperResolutionDTO superResolutionDTO) { + return CompletableFuture.supplyAsync(() -> pythonService.superResolution(superResolutionDTO)); + } + + public String SR(SuperResolutionDTO superResolutionDTO) { + ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5); + String taskId = superResolutionDTO.getUniqueId(); + ScheduledFuture timeoutTask = null; + if (!waitingStatus.containsKey(taskId)) waitingStatus.put(taskId, true); + + try { + CompletableFuture generateResult = callSRAsync(superResolutionDTO); + // 5秒后第一次确认,之后每隔10秒确认一次用户选择结果 + timeoutTask = scheduledExecutorService.scheduleAtFixedRate(() -> { + // 调用另一个接口获取用户的选择 + if (!waitingStatus.get(taskId)) { + // 如果用户选择取消,则取消对generate的调用 + generateResult.cancel(true); + waitingStatus.remove(taskId); + } else log.info("===============持续等待==============="); + }, 5, 10, TimeUnit.SECONDS); + + log.info("阻塞等待结果..."); + // 阻塞,等待结果 + String result = generateResult.get(); + // 取消定时任务 + timeoutTask.cancel(true); + waitingStatus.remove(taskId); + return result; + } catch (CancellationException e) { + // generateResult.cancel(true);通过抛出异常取消该任务 + log.info("==========成功取消generate任务=========="); + return null; + } catch (InterruptedException | ExecutionException | BusinessException e) { + // 处理异常 + log.error("发生错误 : " + e, e); + // 取消定时任务 + assert timeoutTask != null; + timeoutTask.cancel(true); + throw new BusinessException(e.getMessage()); + } finally { + // 关闭线程池 +// executorService.shutdown(); +// scheduledExecutorService.shutdown(); + } + } + + } diff --git a/src/main/java/com/ai/da/controller/AliPayController.java b/src/main/java/com/ai/da/controller/AliPayController.java index 468b154b..b3a9c65b 100644 --- a/src/main/java/com/ai/da/controller/AliPayController.java +++ b/src/main/java/com/ai/da/controller/AliPayController.java @@ -66,7 +66,7 @@ public class AliPayController { } /** - * 申请退款 + * 不在页面提供申请退款接口 * @param orderNo * @param reason * @return diff --git a/src/main/java/com/ai/da/controller/ConvenientInquiryController.java b/src/main/java/com/ai/da/controller/ConvenientInquiryController.java index bca619ce..1cc2552a 100644 --- a/src/main/java/com/ai/da/controller/ConvenientInquiryController.java +++ b/src/main/java/com/ai/da/controller/ConvenientInquiryController.java @@ -3,9 +3,9 @@ package com.ai.da.controller; import com.ai.da.common.context.UserContext; import com.ai.da.common.response.Response; -import com.ai.da.mapper.DesignMapper; -import com.ai.da.mapper.TrialOrderMapper; -import com.ai.da.mapper.entity.TrialOrder; +import com.ai.da.mapper.primary.DesignMapper; +import com.ai.da.mapper.primary.TrialOrderMapper; +import com.ai.da.mapper.primary.entity.TrialOrder; import com.ai.da.model.dto.UserDesignStatisticDTO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; diff --git a/src/main/java/com/ai/da/controller/CreditsController.java b/src/main/java/com/ai/da/controller/CreditsController.java index fe240ea4..f578a45c 100644 --- a/src/main/java/com/ai/da/controller/CreditsController.java +++ b/src/main/java/com/ai/da/controller/CreditsController.java @@ -1,6 +1,9 @@ package com.ai.da.controller; +import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.Response; +import com.ai.da.mapper.primary.entity.CreditsDetail; +import com.ai.da.model.dto.QueryIncomeOrExpenditureDTO; import com.ai.da.service.CreditsService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -8,6 +11,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.validation.Valid; @CrossOrigin @RestController @@ -19,10 +23,19 @@ public class CreditsController { @Resource private CreditsService creditsService; - @ApiOperation("获取积分") + @ApiOperation("获取当前积分") @GetMapping("/getCredits") public Response getCredits(){ String credits = creditsService.getCredits(); return Response.success(credits); } + + @ApiOperation("获取积分详细") + @PostMapping("/getCreditsDetail") + public Response> getCreditsDetail(@Valid @RequestBody QueryIncomeOrExpenditureDTO queryPageByTimeDTO){ + PageBaseResponse credits = creditsService.queryCreditsDetailsPage(queryPageByTimeDTO); + return Response.success(credits); + } + + } diff --git a/src/main/java/com/ai/da/controller/OrderInfoController.java b/src/main/java/com/ai/da/controller/OrderInfoController.java index d5f8dfa2..3a9ce1d5 100644 --- a/src/main/java/com/ai/da/controller/OrderInfoController.java +++ b/src/main/java/com/ai/da/controller/OrderInfoController.java @@ -1,16 +1,17 @@ package com.ai.da.controller; -import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.OrderStatusEnum; +import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.response.Response; import com.ai.da.mapper.primary.entity.OrderInfo; +import com.ai.da.model.dto.QueryPageByTimeDTO; import com.ai.da.service.OrderInfoService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import java.util.List; +import javax.validation.Valid; @CrossOrigin //开放前端的跨域访问 @Api(tags = "商品订单管理") @@ -22,9 +23,9 @@ public class OrderInfoController { private OrderInfoService orderInfoService; @ApiOperation("订单列表") - @GetMapping("/list") - public Response> list(){ - List orderByAccountId = orderInfoService.getOrderByAccountId(UserContext.getUserHolder().getId()); + @PostMapping("/list") + public Response> list(@Valid @RequestBody QueryPageByTimeDTO queryPageByTimeDTO){ + PageBaseResponse orderByAccountId = orderInfoService.getOrderByPage(queryPageByTimeDTO); // List list = orderInfoService.listOrderByCreateTimeDesc(); return Response.success(orderByAccountId); } diff --git a/src/main/java/com/ai/da/controller/PayPalCheckoutController.java b/src/main/java/com/ai/da/controller/PayPalCheckoutController.java index 1877f098..2ed119a7 100644 --- a/src/main/java/com/ai/da/controller/PayPalCheckoutController.java +++ b/src/main/java/com/ai/da/controller/PayPalCheckoutController.java @@ -26,9 +26,6 @@ public class PayPalCheckoutController { @Resource private PayPalCheckoutService payPalCheckoutService; - @Resource - private CallBackService callBackService; - @ApiOperation(value = "创建订单") @PostMapping(value = "/trade/{amount}") public Response> createOrder(@PathVariable Integer amount, @RequestParam String returnUrl) throws SerializeException { @@ -39,13 +36,12 @@ public class PayPalCheckoutController { @ApiOperation(value = "ipn异步回调") @PostMapping(value = "/ipn/back") public Response callback(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - Boolean result = callBackService.doGet(request, response); + Boolean result = payPalCheckoutService.doPost(request, response); if (result){ return Response.success(200,"success"); }else { return Response.fail(500,"failure"); } -// return payPalCheckoutService.callback(RequestToMapUtil.getParameterMap(request)); } @ApiOperation(value = "查询指定订单") @@ -55,6 +51,7 @@ public class PayPalCheckoutController { return Response.success(s); } + /** 不提供退款接口 */ @ApiOperation("申请退款") @PostMapping("/trade/refund/{orderNo}/{reason}") public Response> refund(@PathVariable String orderNo, @PathVariable String reason) throws IOException { diff --git a/src/main/java/com/ai/da/controller/PythonController.java b/src/main/java/com/ai/da/controller/PythonController.java index ea33fe7f..5bb0f931 100644 --- a/src/main/java/com/ai/da/controller/PythonController.java +++ b/src/main/java/com/ai/da/controller/PythonController.java @@ -7,12 +7,14 @@ import com.ai.da.mapper.primary.entity.Library; import com.ai.da.model.dto.ChatFlushDTO; import com.ai.da.model.dto.ChatRobotLibraryDTO; import com.ai.da.model.dto.ChatSendDTO; +import com.ai.da.model.dto.SuperResolutionDTO; import com.ai.da.model.vo.ChatRobotVO; import com.ai.da.model.vo.PythonLibraryVo; import com.ai.da.model.vo.SysFileVO; import com.ai.da.python.PythonService; import com.ai.da.service.ChatRobotService; import com.ai.da.service.LibraryService; +import com.ai.da.service.SuperResolutionService; import com.ai.da.service.SysFileService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -41,10 +43,12 @@ public class PythonController { private SysFileService sysFileService; @Resource private LibraryService libraryService; - @Resource private ChatRobotService chatRobotService; + @Resource + private SuperResolutionService superResolutionService; + @ApiOperation(value = "python服务保存图片到java服务") @PostMapping("/saveGeneratePicture") public Response upload(@RequestParam("file") MultipartFile file, @@ -109,4 +113,10 @@ public class PythonController { return Response.success(chatRobotService.chatBufferFlush(chatFlushDTO)); } + @ApiOperation(value = "超分辨率") + @PostMapping("/prepareForSR") + public Response superResolution(@RequestBody SuperResolutionDTO superResolutionDTO){ + return Response.success(superResolutionService.prepareForSR(superResolutionDTO)); + } + } diff --git a/src/main/java/com/ai/da/mapper/primary/CreditsDetailMapper.java b/src/main/java/com/ai/da/mapper/primary/CreditsDetailMapper.java new file mode 100644 index 00000000..1ee33d4e --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/CreditsDetailMapper.java @@ -0,0 +1,7 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.mapper.primary.entity.CreditsDetail; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface CreditsDetailMapper extends BaseMapper { +} diff --git a/src/main/java/com/ai/da/mapper/primary/SuperResolutionMapper.java b/src/main/java/com/ai/da/mapper/primary/SuperResolutionMapper.java new file mode 100644 index 00000000..3510e066 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/SuperResolutionMapper.java @@ -0,0 +1,7 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.mapper.primary.entity.SuperResolution; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface SuperResolutionMapper extends BaseMapper { +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java b/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java index de693f6b..f78fb748 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; +import java.time.LocalDateTime; import java.util.Date; @Data @@ -23,12 +24,12 @@ public class BaseEntity implements Serializable { /** * 创建时间 */ - private Date createTime; + private LocalDateTime createTime; /** * 更新时间 */ - private Date updateTime; + private LocalDateTime updateTime; /** * 是否已删除 diff --git a/src/main/java/com/ai/da/mapper/primary/entity/CreditsDetail.java b/src/main/java/com/ai/da/mapper/primary/entity/CreditsDetail.java new file mode 100644 index 00000000..1422ba4c --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/CreditsDetail.java @@ -0,0 +1,21 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("t_credits_detail") +public class CreditsDetail extends BaseEntity { + /** 用户id */ + private Long accountId; + /** 积分变更事件 */ + private String changeEvent; + /** 变更积分 ( + 表示加,- 表示减) */ + private String changedCredits; + /** 当前积分 */ + private BigDecimal credits; +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/SuperResolution.java b/src/main/java/com/ai/da/mapper/primary/entity/SuperResolution.java new file mode 100644 index 00000000..31e32e58 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/SuperResolution.java @@ -0,0 +1,20 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("t_super_resolution") +public class SuperResolution extends BaseEntity{ + + private String input_url; + + private Integer scale; + + private String output_url; + +} diff --git a/src/main/java/com/ai/da/model/dto/QueryIncomeOrExpenditureDTO.java b/src/main/java/com/ai/da/model/dto/QueryIncomeOrExpenditureDTO.java new file mode 100644 index 00000000..748d6108 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/QueryIncomeOrExpenditureDTO.java @@ -0,0 +1,13 @@ +package com.ai.da.model.dto; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +@ApiModel("查积分的收支详情") +public class QueryIncomeOrExpenditureDTO extends QueryPageByTimeDTO{ + + private Boolean isIncome; +} diff --git a/src/main/java/com/ai/da/model/dto/QueryPageByTimeDTO.java b/src/main/java/com/ai/da/model/dto/QueryPageByTimeDTO.java new file mode 100644 index 00000000..c0c37a98 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/QueryPageByTimeDTO.java @@ -0,0 +1,19 @@ +package com.ai.da.model.dto; + +import com.ai.da.model.vo.PageQueryBaseVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +@ApiModel("分页查询,限制时间区间") +public class QueryPageByTimeDTO extends PageQueryBaseVo { + + @ApiModelProperty("开始时间 yyyy-mm-dd hh:mm:ss 可以不要时分秒") + private String startTime; + + @ApiModelProperty("结束时间 yyyy-mm-dd hh:mm:ss 可以不要时分秒") + private String endTime; +} diff --git a/src/main/java/com/ai/da/model/dto/SuperResolutionDTO.java b/src/main/java/com/ai/da/model/dto/SuperResolutionDTO.java new file mode 100644 index 00000000..95eb0745 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/SuperResolutionDTO.java @@ -0,0 +1,27 @@ +package com.ai.da.model.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SuperResolutionDTO { + + @NotBlank(message = "You have to select at least one image") + @ApiModelProperty("图片") + private String images; + + @NotBlank(message = "You must choose the magnification") + @ApiModelProperty("放大倍数") + private Integer scale; + + @ApiModelProperty("唯一id,用于保持消息唯一性") + String uniqueId; + +} diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 58b3bffd..7019e724 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -3082,4 +3082,64 @@ public class PythonService { return Boolean.TRUE; } + public String superResolution(SuperResolutionDTO superResolutionDTO){ + OkHttpClient client = new OkHttpClient().newBuilder() + .connectTimeout(30, TimeUnit.SECONDS) + .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) + .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒) + .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒) + .build(); + MediaType mediaType = MediaType.parse("application/json"); + + HashMap content = new HashMap<>(); + content.put("image_url", superResolutionDTO.getImages()); + content.put("sr_xn", superResolutionDTO.getScale().toString()); + content.put("task_id", superResolutionDTO.getUniqueId()); + + String jsonString = JSON.toJSONString(content, SerializerFeature.WriteNullStringAsEmpty); + RequestBody body = RequestBody.create(mediaType, jsonString); + Request request = new Request.Builder() + .url(accessPythonIp + ":" + 9991 + "/super-resolution/") + .method("POST", body) + .addHeader("Content-Type", "application/json") + .build(); + Response response = null; + String bodyString; + try { + log.info("superResolution请求入参content###{}", JSON.toJSONString(superResolutionDTO, SerializerFeature.WriteMapNullValue)); + response = client.newCall(request).execute(); + } catch (IOException ioException) { + log.error("PythonService##superResolution异常###{}", ExceptionUtil.getThrowableList(ioException)); + throw new BusinessException(ioException.getMessage()); + } + + // 判断是否生成失败 + if (Objects.isNull(response.body())) { + log.error("PythonService##superResolution异常###{}", "response or body is empty!"); + throw new BusinessException("PythonService##superResolution异常###: response or body is empty!"); + } else if (response.code() != HttpURLConnection.HTTP_OK) { + log.error("PythonService##superResolution异常###{}", "Response error!Response code ## " + response.code() + " ##"); + throw new BusinessException("PythonService##superResolution异常### Response error!Response code ## " + response.code() + " ##"); + } else { + try { + bodyString = response.body().string(); + } catch (IOException e) { + log.error(e.getMessage()); + throw new BusinessException(e.getMessage()); + } + } + JSONObject jsonObject = JSON.parseObject(bodyString); + Boolean result = JSON.parseObject(JSON.toJSONString(response)).getBoolean("successful"); + + // todo 返回数据的结构没对接好 + if (result && jsonObject.get("code").equals(200)) { + log.info("superResolution##responseObject###{}", jsonObject); + return jsonObject.getJSONObject("data").get("image").toString(); + } + log.info("superResolution失败###{}", jsonObject); + log.info("superResolution Exception! Code : " + jsonObject.get("code")); + //生成失败 + throw new BusinessException("sr.interface.error"); + } + } diff --git a/src/main/java/com/ai/da/service/CreditsService.java b/src/main/java/com/ai/da/service/CreditsService.java index 64e9f917..c8e6f6ea 100644 --- a/src/main/java/com/ai/da/service/CreditsService.java +++ b/src/main/java/com/ai/da/service/CreditsService.java @@ -1,6 +1,12 @@ package com.ai.da.service; -public interface CreditsService { + +import com.ai.da.common.response.PageBaseResponse; +import com.ai.da.mapper.primary.entity.CreditsDetail; +import com.ai.da.model.dto.QueryIncomeOrExpenditureDTO; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface CreditsService extends IService { void initCredits(); @@ -13,4 +19,8 @@ public interface CreditsService { String getCredits(); void creditsRefund(Long accountId, Integer quantity); + + void insertToCreditsDetail(Long accountId, String changeEvent, String credits, String changeType); + + PageBaseResponse queryCreditsDetailsPage(QueryIncomeOrExpenditureDTO queryPageByTimeDTO); } diff --git a/src/main/java/com/ai/da/service/OrderInfoService.java b/src/main/java/com/ai/da/service/OrderInfoService.java index 31e1d99c..35da4881 100644 --- a/src/main/java/com/ai/da/service/OrderInfoService.java +++ b/src/main/java/com/ai/da/service/OrderInfoService.java @@ -2,7 +2,9 @@ package com.ai.da.service; import com.ai.da.common.enums.OrderStatusEnum; +import com.ai.da.common.response.PageBaseResponse; import com.ai.da.mapper.primary.entity.OrderInfo; +import com.ai.da.model.dto.QueryPageByTimeDTO; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -23,7 +25,7 @@ public interface OrderInfoService extends IService { OrderInfo getOrderByOrderNo(String orderNo); - List getOrderByAccountId(Long accountId); + PageBaseResponse getOrderByPage(QueryPageByTimeDTO queryPageByTimeDTO); void updateOrderNoById(Long id, String orderNo); } diff --git a/src/main/java/com/ai/da/service/PayPalCheckoutService.java b/src/main/java/com/ai/da/service/PayPalCheckoutService.java index 8b5d2347..36793092 100644 --- a/src/main/java/com/ai/da/service/PayPalCheckoutService.java +++ b/src/main/java/com/ai/da/service/PayPalCheckoutService.java @@ -3,6 +3,9 @@ package com.ai.da.service; import com.paypal.http.exceptions.SerializeException; import com.paypal.orders.Order; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; import java.util.Map; @@ -16,6 +19,9 @@ public interface PayPalCheckoutService { */ String callback(@SuppressWarnings("rawtypes") Map map); + Boolean doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException; + String queryOrder(String orderNo) throws SerializeException; Order captureOrder(String orderId) throws IOException; diff --git a/src/main/java/com/ai/da/service/RabbitMQService.java b/src/main/java/com/ai/da/service/RabbitMQService.java index b03a578d..7797c905 100644 --- a/src/main/java/com/ai/da/service/RabbitMQService.java +++ b/src/main/java/com/ai/da/service/RabbitMQService.java @@ -5,7 +5,9 @@ import org.springframework.stereotype.Service; @Service public interface RabbitMQService { - void publishMessage(String message); + void publishMessageToGenerate(String message); + + void publishMessageToSR(String message); Integer getMessageCount(String queueUrl); } diff --git a/src/main/java/com/ai/da/service/SuperResolutionService.java b/src/main/java/com/ai/da/service/SuperResolutionService.java new file mode 100644 index 00000000..6d01bb2e --- /dev/null +++ b/src/main/java/com/ai/da/service/SuperResolutionService.java @@ -0,0 +1,12 @@ +package com.ai.da.service; + +import com.ai.da.mapper.primary.entity.SuperResolution; +import com.ai.da.model.dto.SuperResolutionDTO; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface SuperResolutionService extends IService { + + String prepareForSR(SuperResolutionDTO superResolutionDTO); + + String SR(SuperResolutionDTO superResolutionDTO); +} diff --git a/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java index bcc1213f..e0f5c107 100644 --- a/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java @@ -210,6 +210,11 @@ public class AliPayServiceImpl implements AliPayService { orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.SUCCESS); //记录支付日志 paymentInfoService.createPaymentInfoForAliPay(params); + // 添加积分变更记录 + creditsService.insertToCreditsDetail(orderByOrderNo.getAccountId(), + CreditsEventsEnum.BUY_CREDITS.getName() + "--Alipay", + CreditsEventsEnum.BUY_CREDITS.getValue(), + "positive"); // 更新积分 creditsService.buyCredits(orderByOrderNo.getAccountId(),Integer.parseInt(totalAmount) / Integer.parseInt(CreditsEventsEnum.PRICE.getValue())); } finally { @@ -307,6 +312,11 @@ public class AliPayServiceImpl implements AliPayService { orderInfoService.updateStatusByOrderNo(orderNo, OrderStatusEnum.SUCCESS); //并记录支付日志 paymentInfoService.createPaymentInfoForAliPay(alipayTradeQueryResponse); + // 添加积分变更记录 + creditsService.insertToCreditsDetail(orderByOrderNo.getAccountId(), + CreditsEventsEnum.BUY_CREDITS.getName() + "--Alipay", + CreditsEventsEnum.BUY_CREDITS.getValue(), + "positive"); // 更新积分 creditsService.buyCredits(orderByOrderNo.getAccountId(),orderByOrderNo.getTotalFee() / Integer.parseInt(CreditsEventsEnum.PRICE.getValue())); } diff --git a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java index 9c5ac128..707ad786 100644 --- a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java @@ -3,17 +3,29 @@ package com.ai.da.service.impl; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.CreditsEventsEnum; +import com.ai.da.common.response.PageBaseResponse; import com.ai.da.mapper.primary.AccountMapper; +import com.ai.da.mapper.primary.CreditsDetailMapper; import com.ai.da.mapper.primary.entity.Account; +import com.ai.da.mapper.primary.entity.CreditsDetail; +import com.ai.da.model.dto.QueryIncomeOrExpenditureDTO; import com.ai.da.service.AccountService; import com.ai.da.service.CreditsService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import io.netty.util.internal.StringUtil; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Objects; @Service -public class CreditsServiceImpl implements CreditsService { +public class CreditsServiceImpl extends ServiceImpl implements CreditsService { @Resource private AccountService accountService; @@ -88,4 +100,66 @@ public class CreditsServiceImpl implements CreditsService { BigDecimal subtracted = existingCredits.subtract(newCredits); accountService.updateCredits(accountId, subtracted.toString()); } + + /** + * 向积分变更详细表添加记录 + * @param changeEvent 导致积分变更的事件 + * @param credits 变更的积分 + * @param changeType 变更类型 : positive->增 negative->减 + */ + @Override + public void insertToCreditsDetail(Long accountId, String changeEvent, String credits, String changeType){ + CreditsDetail creditsDetail = new CreditsDetail(); + Account account = accountMapper.selectById(accountId); + BigDecimal finalCredits; + String changeCredits; + if ("positive".equals(changeType)){ + finalCredits = account.getCredits().add(new BigDecimal(credits)); + changeCredits = "+" + credits; + }else { + finalCredits = account.getCredits().subtract(new BigDecimal(credits)); + changeCredits = "-" + credits; + } + creditsDetail.setAccountId(accountId); + creditsDetail.setChangeEvent(changeEvent); + creditsDetail.setChangedCredits(changeCredits); + creditsDetail.setCredits(finalCredits); + creditsDetail.setCreateTime(LocalDateTime.now()); + + baseMapper.insert(creditsDetail); + } + + @Override + public PageBaseResponse queryCreditsDetailsPage(QueryIncomeOrExpenditureDTO queryPageByTimeDTO){ + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("account_id",UserContext.getUserHolder().getId()); + + String startTime = queryPageByTimeDTO.getStartTime(); + String endTime = queryPageByTimeDTO.getEndTime(); + if (StringUtil.isNullOrEmpty(startTime)){ + startTime = "2024-03-01 00:00:00"; + } + if (StringUtil.isNullOrEmpty(endTime)){ + LocalDateTime now = LocalDateTime.now(); + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + endTime = now.format(dateTimeFormatter); + } + if (!Objects.isNull(queryPageByTimeDTO.getIsIncome())){ + if (queryPageByTimeDTO.getIsIncome()){ + qw.likeRight("changed_credits","+"); + }else { + qw.likeRight("changed_credits","-"); + } + } + + qw.between("create_time", startTime, endTime); + qw.orderByDesc("create_time"); + Page pageInfo = new Page<>(queryPageByTimeDTO.getPage(), queryPageByTimeDTO.getSize()); + Page orderInfo = baseMapper.selectPage(pageInfo, qw); + if (CollectionUtils.isEmpty(orderInfo.getRecords())) { + return PageBaseResponse.success(new Page<>()); + } + + return PageBaseResponse.success(orderInfo); + } } diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index cae9902e..1fabbcc5 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -68,13 +68,13 @@ public class GenerateServiceImpl extends ServiceImpl i @Resource private GenerateCancelMapper generateCancelMapper; - @Value("${redis.key.consumptionOrder}") + @Value("${redis.key.orderForGenerate}") private String consumptionOrderKey; - @Value("${redis.key.cancelSet}") + @Value("${redis.key.generateCancelSet}") private String cancelSetKey; - @Value("${redis.key.exceptionMap}") + @Value("${redis.key.generateExceptionMap}") private String exceptionMapKey; @Value("${redis.key.resultMap}") @@ -368,7 +368,7 @@ public class GenerateServiceImpl extends ServiceImpl i redisUtil.addToZSet(consumptionOrderKey, uuid, maxScore); // 4、将消息发布到MQ消息队列 - rabbitMQService.publishMessage(jsonString); + rabbitMQService.publishMessageToGenerate(jsonString); // 5、返回唯一id return new PrepareForGenerateVO(uuid, 2 - trialsCount); diff --git a/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java index 232b562a..36f02676 100644 --- a/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java @@ -4,20 +4,27 @@ package com.ai.da.service.impl; import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.CreditsEventsEnum; import com.ai.da.common.enums.OrderStatusEnum; +import com.ai.da.common.response.PageBaseResponse; import com.ai.da.common.utils.OrderNoUtils; import com.ai.da.mapper.primary.OrderInfoMapper; import com.ai.da.mapper.primary.ProductMapper; import com.ai.da.mapper.primary.entity.OrderInfo; +import com.ai.da.model.dto.QueryPageByTimeDTO; import com.ai.da.model.vo.AuthPrincipalVo; import com.ai.da.service.OrderInfoService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import io.netty.util.internal.StringUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.time.Duration; import java.time.Instant; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; @Service @@ -172,12 +179,30 @@ public class OrderInfoServiceImpl extends ServiceImpl getOrderByAccountId(Long accountId){ + @Override + public PageBaseResponse getOrderByPage(QueryPageByTimeDTO queryPageByTimeDTO){ QueryWrapper qw = new QueryWrapper<>(); - qw.eq("account_id",accountId); - qw.orderByDesc("create_time"); + qw.eq("account_id",UserContext.getUserHolder().getId()); - return baseMapper.selectList(qw); + String startTime = queryPageByTimeDTO.getStartTime(); + String endTime = queryPageByTimeDTO.getEndTime(); + if (StringUtil.isNullOrEmpty(startTime)){ + startTime = "2024-02-01 00:00:00"; + } + if (StringUtil.isNullOrEmpty(endTime)){ + LocalDateTime now = LocalDateTime.now(); + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + endTime = now.format(dateTimeFormatter); + } + qw.between("create_time", startTime, endTime); + qw.orderByDesc("create_time"); + Page pageInfo = new Page<>(queryPageByTimeDTO.getPage(), queryPageByTimeDTO.getSize()); + Page orderInfo = baseMapper.selectPage(pageInfo, qw); + if (CollectionUtils.isEmpty(orderInfo.getRecords())) { + return PageBaseResponse.success(new Page<>()); + } + + return PageBaseResponse.success(orderInfo); } public void updateOrderNoById(Long id, String orderNo){ diff --git a/src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java b/src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java index 1997a449..7d768520 100644 --- a/src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PayPalCheckoutServiceImpl.java @@ -7,10 +7,17 @@ import com.ai.da.common.constant.PayPalCheckoutConstant; import com.ai.da.common.enums.*; import com.ai.da.common.utils.RedisUtil; import com.ai.da.common.utils.paypalRequest.AuthenticationRequest; +import com.ai.da.common.utils.paypalRequest.WebhookVerifyRequest; import com.ai.da.mapper.primary.entity.OrderInfo; import com.ai.da.mapper.primary.entity.RefundInfo; import com.ai.da.service.*; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; +import com.paypal.api.payments.Event; +import com.paypal.base.Constants; +import com.paypal.base.SDKUtil; +import com.paypal.base.rest.APIContext; +import com.paypal.base.rest.PayPalRESTException; import com.paypal.http.HttpResponse; import com.paypal.http.exceptions.SerializeException; import com.paypal.http.serializer.Json; @@ -24,9 +31,19 @@ import org.apache.commons.lang3.StringUtils; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.SignatureException; import java.util.*; import static com.ai.da.common.constant.PayPalCheckoutConstant.*; @@ -47,19 +64,14 @@ public class PayPalCheckoutServiceImpl implements PayPalCheckoutService { @Resource private PayPalClient payPalClient; - @Resource private OrderInfoService orderInfoService; - @Resource private PaymentInfoService paymentInfoService; - @Resource private RefundInfoService refundsInfoService; - @Resource private CreditsService creditsService; - @Resource private RedisUtil redisUtil; @@ -67,6 +79,7 @@ public class PayPalCheckoutServiceImpl implements PayPalCheckoutService { * 创建订单的方法 */ @Override + @Transactional(rollbackFor = Exception.class) public HashMap createOrder(Integer amount, String returnUrl) throws SerializeException { // 生成订单 log.info("生成订单"); @@ -102,7 +115,6 @@ public class PayPalCheckoutServiceImpl implements PayPalCheckoutService { String orderId = response.result().id(); orderInfoService.updateOrderNoById(orderInfo.getId(), orderId); - HashMap returnData = new HashMap<>(); returnData.put("approve",approve); returnData.put("orderNo",orderId); @@ -111,6 +123,99 @@ public class PayPalCheckoutServiceImpl implements PayPalCheckoutService { return returnData; } + // ##Validate Webhook + public Boolean doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + try { + String body = getBody(req); + Map webhookEvent = new ObjectMapper().readValue(body, Map.class); + + HashMap webhookRequest = new HashMap<>(); + webhookRequest.put("auth_algo", SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-AUTH-ALGO")); + webhookRequest.put("cert_url",SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-CERT-URL")); + webhookRequest.put("transmission_id",SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-TRANSMISSION-ID")); + webhookRequest.put("transmission_sig",SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-TRANSMISSION-SIG")); + webhookRequest.put("transmission_time",SDKUtil.validateAndGet(getHeadersInfo(req), "PAYPAL-TRANSMISSION-TIME")); + webhookRequest.put("webhook_id",PayPalCheckoutConstant.WEBHOOK_ID); + webhookRequest.put("webhook_event",webhookEvent); + + WebhookVerifyRequest webhookVerifyRequest = new WebhookVerifyRequest(); + webhookVerifyRequest.authorization(getOAuth()); + webhookVerifyRequest.requestBody(webhookRequest); + // 验签 + HttpResponse verified = payPalClient.client(MODE, clientId, clientSecret).execute(webhookVerifyRequest); + boolean verifyResult = verified.result().get("verification_status").toString().equals("SUCCESS"); + if (verifyResult){ + // ### Api Context + APIContext apiContext = new APIContext(clientId, clientSecret, PayPalCheckoutConstant.MODE); + + // Set the webhookId that you received when you created this webhook. + apiContext.addConfiguration(Constants.PAYPAL_WEBHOOK_ID, PayPalCheckoutConstant.WEBHOOK_ID); + Boolean result = Event.validateReceivedEvent(apiContext, getHeadersInfo( + req), body); + log.info("Webhook Validated: " + result); + + if (result){ + // 处理订单数据 + LinkedHashMap> webhookEventMap = (LinkedHashMap>) webhookEvent; + String orderId = webhookEventMap.get("resource").get("id"); + processOrder(orderId); + return Boolean.TRUE; + } + + } + } catch (PayPalRESTException | InvalidKeyException | NoSuchAlgorithmException | SignatureException e) { + log.error(e.getMessage()); + } + return Boolean.FALSE; + } + + // Simple helper method to help you extract the headers from HttpServletRequest object. + private static Map getHeadersInfo(HttpServletRequest request) { + Map map = new HashMap(); + @SuppressWarnings("rawtypes") + Enumeration headerNames = request.getHeaderNames(); + while (headerNames.hasMoreElements()) { + String key = (String) headerNames.nextElement(); + String value = request.getHeader(key); + map.put(key, value); + } + return map; + } + + // Simple helper method to fetch request data as a string from HttpServletRequest object. + private static String getBody(HttpServletRequest request) throws IOException { + String body; + StringBuilder stringBuilder = new StringBuilder(); + BufferedReader bufferedReader = null; + try { + InputStream inputStream = request.getInputStream(); + if (inputStream != null) { + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + char[] charBuffer = new char[128]; + int bytesRead = -1; + while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { + stringBuilder.append(charBuffer, 0, bytesRead); + } + } else { + stringBuilder.append(""); + } + } catch (IOException ex) { + throw ex; + } finally { + if (bufferedReader != null) { + try { + bufferedReader.close(); + } catch (IOException ex) { + throw ex; + } + } + } + body = stringBuilder.toString(); + log.info("回调参数 ===> {}", body); + return body; + } + /** * 生成订单主体信息 */ @@ -256,6 +361,7 @@ public class PayPalCheckoutServiceImpl implements PayPalCheckoutService { /** * 用户授权支付成功,进行扣款操作 */ + @Transactional(rollbackFor = Exception.class) public Order captureOrder(String orderId) { OrdersCaptureRequest request = new OrdersCaptureRequest(orderId); request.requestBody(new OrderRequest()); @@ -330,6 +436,7 @@ public class PayPalCheckoutServiceImpl implements PayPalCheckoutService { /** * 申请退款 */ + @Transactional(rollbackFor = Exception.class) public Boolean refundOrder(String orderId,String reason) throws IOException { RefundInfo refundByOrderNo = refundsInfoService.createRefundByOrderNo(orderId, reason); @@ -458,6 +565,7 @@ public class PayPalCheckoutServiceImpl implements PayPalCheckoutService { } // 处理当前订单 + @Transactional(rollbackFor = Exception.class) public void processOrder(String orderId){ // 1、确定当前订单是否已经被扣款 OrderInfo orderInfo = orderInfoService.getOrderByOrderNo(orderId); @@ -473,6 +581,11 @@ public class PayPalCheckoutServiceImpl implements PayPalCheckoutService { orderInfoService.updateStatusByOrderNo(orderId, OrderStatusEnum.SUCCESS); //记录支付日志 paymentInfoService.createPaymentInfoForPayPal(capturedOrder); + // 添加积分变更记录 + creditsService.insertToCreditsDetail(orderInfo.getAccountId(), + CreditsEventsEnum.BUY_CREDITS.getName() + "--PayPal", + CreditsEventsEnum.BUY_CREDITS.getValue(), + "positive"); // 更新积分 creditsService.buyCredits(orderInfo.getAccountId(), orderInfo.getTotalFee() / Integer.parseInt(CreditsEventsEnum.PRICE.getValue())); } diff --git a/src/main/java/com/ai/da/service/impl/RabbitMQServiceImpl.java b/src/main/java/com/ai/da/service/impl/RabbitMQServiceImpl.java index 41743964..0923d634 100644 --- a/src/main/java/com/ai/da/service/impl/RabbitMQServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/RabbitMQServiceImpl.java @@ -27,10 +27,14 @@ public class RabbitMQServiceImpl implements RabbitMQService { private MQPublisher mqPublisher; @Override - public void publishMessage(String message) { + public void publishMessageToGenerate(String message) { mqPublisher.sendGenerateMessage(message); } + @Override + public void publishMessageToSR(String message) { + mqPublisher.sendSRMessage(message); + } @Override public Integer getMessageCount(String queueUrl) { diff --git a/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java b/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java new file mode 100644 index 00000000..0b634b82 --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java @@ -0,0 +1,122 @@ +package com.ai.da.service.impl; + +import com.ai.da.common.context.UserContext; +import com.ai.da.common.enums.CreditsEventsEnum; +import com.ai.da.common.utils.AsyncCallerUtil; +import com.ai.da.common.utils.RedisUtil; +import com.ai.da.mapper.primary.SuperResolutionMapper; +import com.ai.da.mapper.primary.entity.SuperResolution; +import com.ai.da.model.dto.SuperResolutionDTO; +import com.ai.da.python.PythonService; +import com.ai.da.service.CreditsService; +import com.ai.da.service.RabbitMQService; +import com.ai.da.service.SuperResolutionService; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.UUID; + +@Service +public class SuperResolutionServiceImpl extends ServiceImpl implements SuperResolutionService { + + public static final Integer creditsConsumption = 100; + + @Resource + private CreditsService creditsService; + @Resource + private RabbitMQService rabbitMQService; + @Resource + private AsyncCallerUtil asyncCallerUtil; + @Resource + private PythonService pythonService; + + @Resource + private RedisUtil redisUtil; + + @Value("${redis.key.orderForSR}") + private String orderForSR; + + @Value("${redis.key.resultMap}") + private String resultMapKey; + + @Override + public String prepareForSR(SuperResolutionDTO superResolutionDTO) { + + // 异步处理 + // 判断用户当前积分是否够本次超分消耗 + String credits = creditsService.getCredits(); + if (new BigDecimal(credits).subtract(new BigDecimal(creditsConsumption)).compareTo(BigDecimal.ZERO) < 0){ + return "Not enough Credits"; + } + + // 2、生成唯一id 使用uuid + String uuid = UUID.randomUUID().toString(); + int num = 1; + // 判断已经正常生成结果的uuid或正在排队的uuid中是否有相同的id + while ((redisUtil.isElementExistsInMap(resultMapKey, uuid) || + redisUtil.isElementExistsInZSet(orderForSR, uuid)) + && num < 10) { + uuid = UUID.randomUUID().toString(); + num++; + } + // 无依据确定的数字 + if (num > 10) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + uuid = UUID.randomUUID().toString(); + } + superResolutionDTO.setUniqueId(uuid); + String jsonString = JSON.toJSONString(superResolutionDTO); + + // 3、加入redis排队,便于获取实时排队信息 + Double maxScore = redisUtil.getMaxScore(orderForSR); + redisUtil.addToZSet(orderForSR, uuid, maxScore); + + // 4、将消息发布到MQ消息队列 + rabbitMQService.publishMessageToSR(jsonString); + + // 5、返回唯一id + return uuid; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public String SR(SuperResolutionDTO superResolutionDTO){ + + // 1、向模型发起请求 +// String srResult = asyncCallerUtil.SR(superResolutionDTO); + String srResult = pythonService.superResolution(superResolutionDTO); + + // 2、向数据库插入数据 + SuperResolution superResolution = new SuperResolution(); + superResolution.setInput_url(superResolutionDTO.getImages()); + superResolution.setScale(superResolutionDTO.getScale()); + superResolution.setOutput_url(srResult); + superResolution.setCreateTime(LocalDateTime.now()); + + baseMapper.insert(superResolution); + + // 3、记录积分变更 + creditsService.insertToCreditsDetail(UserContext.getUserHolder().getId(), + CreditsEventsEnum.SUPER_RESOLUTION.getName(), + CreditsEventsEnum.SUPER_RESOLUTION.getValue(), + "negative"); + + // 4、扣除积分 + creditsService.creditsDecrease(UserContext.getUserHolder().getId(), CreditsEventsEnum.SUPER_RESOLUTION.getValue()); + + // 4、将数据存在数据库 + + return srResult; + } + +} diff --git a/src/main/resources/mapper/primary/DesignMapper.xml b/src/main/resources/mapper/primary/DesignMapper.xml index ee27686f..edf3f675 100644 --- a/src/main/resources/mapper/primary/DesignMapper.xml +++ b/src/main/resources/mapper/primary/DesignMapper.xml @@ -28,8 +28,8 @@ - select a.account_id,count(a.account_id) use_design_times,b.user_email,b.user_name,b.is_trial + select d.*,c.id trialOrderId, c.title,c.surname,c.given_name,c.country,c.occupation,c.create_time + from ( + select b.account_id,count(b.account_id) design_times,a.user_name,a.user_email,a.is_trial + from t_account a + left join t_design b on a.id = b.account_id + + + b.create_date between #{startTime} and #{endTime} + + + and b.create_date not like '%:01' + and b.create_date not like '%:02' + GROUP BY b.account_id + ORDER BY b.account_id asc) d + left join trial_order c on d.user_email = c.email + From 19d170c1bfe908053ecaa1a55a144750fd361a03 Mon Sep 17 00:00:00 2001 From: xupei Date: Mon, 22 Apr 2024 15:32:59 +0800 Subject: [PATCH 69/93] =?UTF-8?q?=E8=BE=93=E5=85=A5prompt=E4=BF=AE?= =?UTF-8?q?=E9=A5=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../da/service/impl/GenerateServiceImpl.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index 6b26bea4..d0613304 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -232,20 +232,37 @@ public class GenerateServiceImpl extends ServiceImpl i if (StringUtil.isNullOrEmpty(text)) { throw new BusinessException("please.input.the.caption"); } - generate.setText(text); +// generate.setText(text); + modifyPrompt(text, generate); break; case "image": if (Objects.isNull(elementId)) { throw new BusinessException("please.choose.an.image"); } generate.setElementId(elementId); + modifyPrompt(text, generate); break; case "text-image": if (StringUtil.isNullOrEmpty(text) || Objects.isNull(elementId)) { throw new BusinessException("please.input.the.caption.and.choose.an.image"); } - generate.setText(text); +// generate.setText(text); generate.setElementId(elementId); + modifyPrompt(text, generate); + default: + } + } + + private void modifyPrompt(String userInput, Generate generate){ + switch (generate.getLevel1Type()) { + case "Moodboard": + generate.setText(userInput + ",high quality"); + break; + case "Printboard": + generate.setText(userInput + ", fabric print, high quality"); + break; + case "Sketchboard": + generate.setText("a single item of " + userInput + "with clean background, hand-drawing sketch style, high quality"); default: } } From 3114d3cb368b0d6472ab7c3b4c2fe13ce01927f4 Mon Sep 17 00:00:00 2001 From: xupei Date: Tue, 23 Apr 2024 11:02:53 +0800 Subject: [PATCH 70/93] =?UTF-8?q?=E4=BE=BF=E5=88=A9=E6=9F=A5=E8=AF=A2=20?= =?UTF-8?q?=E6=9D=83=E9=99=90=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ai/da/controller/ConvenientInquiryController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ai/da/controller/ConvenientInquiryController.java b/src/main/java/com/ai/da/controller/ConvenientInquiryController.java index 36424b7a..4b4526bd 100644 --- a/src/main/java/com/ai/da/controller/ConvenientInquiryController.java +++ b/src/main/java/com/ai/da/controller/ConvenientInquiryController.java @@ -34,7 +34,7 @@ public class ConvenientInquiryController { @GetMapping("/getTrial") public Response> getTrial(){ Long accountId = UserContext.getUserHolder().getId(); - if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L)){ + if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)){ List trialOrders = trialOrderMapper.selectList(null); return Response.success(trialOrders); }else { @@ -46,7 +46,7 @@ public class ConvenientInquiryController { @GetMapping("/getDesignStatistic") public Response> getDesignStatistic(@RequestParam String startTime,@RequestParam String endTime){ Long accountId = UserContext.getUserHolder().getId(); - if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L)){ + if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)){ if (StringUtil.isNullOrEmpty(startTime)) startTime = "2024-02-01 00:00:00"; if (StringUtil.isNullOrEmpty(endTime)){ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); From d000eaa6b8f31018cf0bb87f7ebc355de56e9795 Mon Sep 17 00:00:00 2001 From: xupei Date: Tue, 23 Apr 2024 11:40:02 +0800 Subject: [PATCH 71/93] BUGFIX:generate prompt modify --- .../da/service/impl/GenerateServiceImpl.java | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index d0613304..ba286732 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -123,6 +123,9 @@ public class GenerateServiceImpl extends ServiceImpl i String text = generateThroughImageTextDTO.getText(); Long elementId = generateThroughImageTextDTO.getCollectionElementId(); validateGeneraType(generate, text, elementId, generateType); + if (generateType.equals("text") || generateType.equals("text-image")){ + text = modifyPrompt(text, generate, generateThroughImageTextDTO.getLevel1Type()); + } // 2.1 sketch或print在t_collection_element表/t_library表中的信息是否需要更新 如 level2Type CollectionElement collectionElement = collectionElementService.editLevel2Type(elementId, generateThroughImageTextDTO.getLevel2Type(), generateThroughImageTextDTO.getDesignType()); @@ -232,39 +235,41 @@ public class GenerateServiceImpl extends ServiceImpl i if (StringUtil.isNullOrEmpty(text)) { throw new BusinessException("please.input.the.caption"); } -// generate.setText(text); - modifyPrompt(text, generate); + generate.setText(text); break; case "image": if (Objects.isNull(elementId)) { throw new BusinessException("please.choose.an.image"); } generate.setElementId(elementId); - modifyPrompt(text, generate); break; case "text-image": if (StringUtil.isNullOrEmpty(text) || Objects.isNull(elementId)) { throw new BusinessException("please.input.the.caption.and.choose.an.image"); } -// generate.setText(text); + generate.setText(text); generate.setElementId(elementId); - modifyPrompt(text, generate); default: } } - private void modifyPrompt(String userInput, Generate generate){ - switch (generate.getLevel1Type()) { + private String modifyPrompt(String userInput, Generate generate, String level1Type){ + String text = ""; + switch (level1Type) { case "Moodboard": - generate.setText(userInput + ",high quality"); + text = userInput + ",high quality"; + generate.setText(text); break; case "Printboard": - generate.setText(userInput + ", fabric print, high quality"); + text = userInput + ", fabric print, high quality"; + generate.setText(text); break; case "Sketchboard": - generate.setText("a single item of " + userInput + "with clean background, hand-drawing sketch style, high quality"); + text = "a single item of " + userInput + "with clean background, hand-drawing sketch style, high quality"; + generate.setText(text); default: } + return text; } @Override From ff842c5443c83e362ec00379004730eb6136dd1f Mon Sep 17 00:00:00 2001 From: xupei Date: Tue, 23 Apr 2024 12:18:15 +0800 Subject: [PATCH 72/93] =?UTF-8?q?BUGFIX:SR=E5=BC=82=E5=B8=B8=20=E6=89=8B?= =?UTF-8?q?=E5=8A=A8ACK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ai/da/common/RabbitMQ/SRConsumer.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java index 059b4f81..341b58a1 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java @@ -87,14 +87,31 @@ public class SRConsumer { superResolutionDTO = JSONObject.parseObject(msg.getBody(), SuperResolutionDTO.class); // channel.basicNack() 为不确认deliveryTag对应的消息,第二个参数是否应用于多消息,第三个参数是否requeue setErrorMessage(msg, channel, e.getMsg(), superResolutionDTO); + try { + // 2.1 手动确认该消息 + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + } catch (IOException ex) { + log.error("手动确认,不返回队列重新消费, error message : " + e.getMessage()); + } } catch (JSONException e) { log.error(e.getMessage()); setErrorMessage(msg, channel, e.getMessage(), null); + try { + // 2.1 手动确认该消息 + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + } catch (IOException ex) { + log.error("手动确认,不返回队列重新消费, error message : " + e.getMessage()); + } } catch (Exception e) { log.error(e.getMessage()); superResolutionDTO = JSONObject.parseObject(msg.getBody(), SuperResolutionDTO.class); setErrorMessage(msg, channel, e.getMessage(), superResolutionDTO); - + try { + // 2.1 手动确认该消息 + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + } catch (IOException ex) { + log.error("手动确认,不返回队列重新消费, error message : " + e.getMessage()); + } } long end = System.currentTimeMillis(); From c31a4bcd8f6c3a23f2de24814cd3074ed06ab625 Mon Sep 17 00:00:00 2001 From: xupei Date: Tue, 23 Apr 2024 14:21:18 +0800 Subject: [PATCH 73/93] =?UTF-8?q?generate=20mode=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ai/da/common/enums/GenerateModeEnum.java | 2 +- src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ai/da/common/enums/GenerateModeEnum.java b/src/main/java/com/ai/da/common/enums/GenerateModeEnum.java index fb4f8e94..f3cc14e9 100644 --- a/src/main/java/com/ai/da/common/enums/GenerateModeEnum.java +++ b/src/main/java/com/ai/da/common/enums/GenerateModeEnum.java @@ -22,7 +22,7 @@ public enum GenerateModeEnum { /** * 通过文本和图片生成 */ - TEXT_IMAGE(2, "text-image","txt2img"); + TEXT_IMAGE(2, "text-image","img2img"); private Integer code; private String value; diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index ba286732..ccbd397d 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -265,7 +265,7 @@ public class GenerateServiceImpl extends ServiceImpl i generate.setText(text); break; case "Sketchboard": - text = "a single item of " + userInput + "with clean background, hand-drawing sketch style, high quality"; + text = "a single item , " + userInput + ", clean background, hand-drawing sketch style, high quality"; generate.setText(text); default: } From c661f4a87168f87b403968396cc043bd44491494 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Tue, 23 Apr 2024 15:55:20 +0800 Subject: [PATCH 74/93] BUGFIX:sketchNum bugfix; --- .../java/com/ai/da/python/PythonService.java | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 7f7c4e5f..043499d4 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -228,19 +228,28 @@ public class PythonService { long noPrintNum = 8 - pinPrintNum - noPinPrintNum; elementVO.setNoPinPrintNum(noPinPrintNum); - int pinSketchNum = 0; - int sysSketchNum = 0; - int noPinSketchNum = 0; + int[] sketchNumbers = new int[3]; for (int i = 0; i < 8; i++) { - CurrentDesignPictureTypeEnum designPictureType = calculateCurrentDesignPictureTypeNew(elementVO, pinSketchNum, sysSketchNum, noPinSketchNum, systemScale); + CurrentDesignPictureTypeEnum designPictureType = calculateCurrentDesignPictureTypeNew(elementVO, sketchNumbers, systemScale); if (designPictureType == null) break; CurrentDesignPrintPictureTypeEnum designPrintPictureType = calculateCurrentDesignPintPictureType(pinPrintNum, noPinPrintNum, noPrintNum); if (designPrintPictureType == null) break; - updateSketchNumbers(designPictureType, pinSketchNum, sysSketchNum, noPinSketchNum); - updatePrintNumbers(designPrintPictureType, pinPrintNum, noPinPrintNum, noPrintNum); + updateSketchNumbers(designPictureType, sketchNumbers); + switch (designPrintPictureType) { + case PIN: + pinPrintNum--; + break; + case NO_PIN: + noPinPrintNum--; + break; + case NO: + noPrintNum--; + break; + } +// updatePrintNumbers(designPrintPictureType, pinPrintNum, noPinPrintNum, noPrintNum); DesignPythonItemPrint designPythonItemPrint = getRandomPrint(elementVO, designPrintPictureType); elementVO.setDesignPythonItemPrint(designPythonItemPrint); @@ -252,16 +261,16 @@ public class PythonService { return designPythonObjects; } - private void updateSketchNumbers(CurrentDesignPictureTypeEnum designPictureType, int pinSketchNum, int sysSketchNum, int noPinSketchNum) { + private void updateSketchNumbers(CurrentDesignPictureTypeEnum designPictureType, int[] sketchNumbers) { switch (designPictureType) { case PIN: - pinSketchNum++; + sketchNumbers[0] ++; break; case NO_PIN: - noPinSketchNum--; + sketchNumbers[2] --; break; case SYS_FILE: - sysSketchNum--; + sketchNumbers[1] --; break; } } @@ -288,16 +297,16 @@ public class PythonService { } - private CurrentDesignPictureTypeEnum calculateCurrentDesignPictureTypeNew(ValidateElementVO elementVO, int pinSketchNum, int sysSketchNum, int noPinSketchNum, BigDecimal systemScale) { + private CurrentDesignPictureTypeEnum calculateCurrentDesignPictureTypeNew(ValidateElementVO elementVO, int[] sketchNumbers, BigDecimal systemScale) { List pinData = getPinData(elementVO); if (CollectionUtil.isNotEmpty(pinData)) { return CurrentDesignPictureTypeEnum.PIN; } else { - if (sysSketchNum == 0 && noPinSketchNum == 0) { - sysSketchNum = systemScale.multiply(BigDecimal.valueOf(8 - pinSketchNum)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); - noPinSketchNum = 8 - pinSketchNum - sysSketchNum; + if (sketchNumbers[1] == 0 && sketchNumbers[2] == 0) { + sketchNumbers[1] = systemScale.multiply(BigDecimal.valueOf(8 - sketchNumbers[0])).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); + sketchNumbers[2] = 8 - sketchNumbers[0] - sketchNumbers[1]; } - if (noPinSketchNum > 0) { + if (sketchNumbers[2] > 0) { return CurrentDesignPictureTypeEnum.NO_PIN; } return CurrentDesignPictureTypeEnum.SYS_FILE; From c8f4d82bf594a082425c4793a24df55f67f4c49f Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Tue, 23 Apr 2024 16:14:03 +0800 Subject: [PATCH 75/93] BUGFIX:sketchNum bugfix; --- src/main/java/com/ai/da/python/PythonService.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 043499d4..60b912b2 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -306,6 +306,14 @@ public class PythonService { sketchNumbers[1] = systemScale.multiply(BigDecimal.valueOf(8 - sketchNumbers[0])).setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); sketchNumbers[2] = 8 - sketchNumbers[0] - sketchNumbers[1]; } + if (sketchNumbers[2] > 0 && sketchNumbers[1] > 0) { + Long l = RandomsUtil.randomSysFile(0l, 1l); + if (l == 0l) { + return CurrentDesignPictureTypeEnum.NO_PIN; + }else { + return CurrentDesignPictureTypeEnum.SYS_FILE; + } + } if (sketchNumbers[2] > 0) { return CurrentDesignPictureTypeEnum.NO_PIN; } From e7d4e98ad024e776eea8cace243fc9e54949c546 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Tue, 23 Apr 2024 16:18:25 +0800 Subject: [PATCH 76/93] BUGFIX:sketchNum bugfix; --- src/main/java/com/ai/da/python/PythonService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 60b912b2..94cf664b 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -307,7 +307,7 @@ public class PythonService { sketchNumbers[2] = 8 - sketchNumbers[0] - sketchNumbers[1]; } if (sketchNumbers[2] > 0 && sketchNumbers[1] > 0) { - Long l = RandomsUtil.randomSysFile(0l, 1l); + Long l = RandomsUtil.randomSysFile(0l, 2l); if (l == 0l) { return CurrentDesignPictureTypeEnum.NO_PIN; }else { From 2882b06128b6785a17d2706aa2f96e64e492a9af Mon Sep 17 00:00:00 2001 From: xupei Date: Tue, 23 Apr 2024 16:44:55 +0800 Subject: [PATCH 77/93] =?UTF-8?q?sr=20MQ=E5=BC=82=E5=B8=B8=E6=8D=95?= =?UTF-8?q?=E6=8D=89=20=E6=89=8B=E5=8A=A8ack=20generate=20=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E5=A4=B1=E8=B4=A5=20=E6=8A=9B=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../da/common/RabbitMQ/GenerateConsumer.java | 19 ++++++++++--------- .../com/ai/da/common/RabbitMQ/SRConsumer.java | 18 ++++++++++++++++-- .../da/service/impl/GenerateServiceImpl.java | 6 ++++++ 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java index ca1f512b..0420b6ff 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java @@ -105,19 +105,20 @@ public class GenerateConsumer { log.info("=============end listening==========="); } - public void processGenerateResult(Message msg, Channel channel){ + public void processGenerateResult(Message msg, Channel channel) { log.info("============ProcessGenerateResult listening=========="); long start = System.currentTimeMillis(); Map generateResult = JSONObject.parseObject(msg.getBody(), Map.class); + log.info("generate response : {}", generateResult); - try{ - log.info("tasks_id : {} start ",generateResult.get("tasks_id")); - if (generateResult.get("status").equals("SUCCESS")){ + try { + log.info("tasks_id : {} start ", generateResult.get("tasks_id")); + if (generateResult.get("status").equals("SUCCESS")) { String url = generateResult.get("data"); String taskId = generateResult.get("tasks_id"); - generateService.processGenerateResult(taskId, url); - }else { + generateService.processGenerateResult(taskId, url); + } else { // 修改redis中的数据状态为exception String key = generateResultKey + ":" + generateResult.get("tasks_id"); redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(generateResult.get("tasks_id"), null, null, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); @@ -127,7 +128,7 @@ public class GenerateConsumer { // 存redis redisUtil.addToMap(exceptionMapKey, exceptionInfo); } - }catch (Exception e){ + } catch (Exception e) { log.error(e.getMessage()); try { channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); @@ -146,7 +147,7 @@ public class GenerateConsumer { } long end = System.currentTimeMillis(); - log.info("tasks_id : {}, message : {}, 执行时长: {} 毫秒",generateResult.get("tasks_id"), generateResult.get("message"), (end - start)); + log.info("tasks_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("tasks_id"), generateResult.get("message"), (end - start)); log.info("============ProcessGenerateResult End listening=========="); } @@ -207,7 +208,7 @@ public class GenerateConsumer { @RabbitListener(queues = MQConfig.GENERATE_RESULT_QUEUE) @RabbitHandler - public void getGenerateResult(Message msg, Channel channel){ + public void getGenerateResult(Message msg, Channel channel) { processGenerateResult(msg, channel); } } diff --git a/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java index 341b58a1..6ad261bd 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/SRConsumer.java @@ -132,17 +132,31 @@ public class SRConsumer { try { result = JSONObject.parseObject(msg.getBody(), JSONObject.class); + log.info("SR response : {}", result); taskId = result.get("tasks_id").toString(); } catch (JSONException e) { log.error("SRResult 返回数据格式不合规范"); log.error(e.getMessage()); setErrorMessage(msg, channel, e.getMessage(), null); + try { + // 第二个参数,是否批量确认消息,当传false时,只确认当前 deliveryTag对应的消息;当传true时,会确认当前及之前所有未确认的消息。 + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + } catch (IOException exception) { + log.error("手动确认,取消返回队列,不再重新消费"); + } + } catch (Exception e){ + log.error(e.getMessage()); + setErrorMessage(msg, channel, e.getMessage(), null); + try { + // 第二个参数,是否批量确认消息,当传false时,只确认当前 deliveryTag对应的消息;当传true时,会确认当前及之前所有未确认的消息。 + channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); + } catch (IOException exception) { + log.error("手动确认,取消返回队列,不再重新消费"); + } } try { -// channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); - // 2、判断状态是否成功 if ("SUCCESS".equals(result.get("status").toString())) { String output = result.get("data").toString(); diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index ccbd397d..a64a02ae 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -38,6 +38,7 @@ import javax.annotation.Resource; import java.io.IOException; import java.time.LocalDateTime; import java.util.*; +import java.util.stream.Collectors; import static com.ai.da.common.enums.CollectionLevel1TypeEnum.*; @@ -527,6 +528,11 @@ public class GenerateServiceImpl extends ServiceImpl i } results.add(generateResultVO); }); + // todo + Set collect = results.stream().map(GenerateResultVO::getStatus).collect(Collectors.toSet()); + if (taskIdList.size() == 4 && collect.size() == 1 && collect.contains("Fail")){ + throw new BusinessException("generate.interface.error"); + } return results; } From ff628dc6806270cf396a82ead46b37eaf5178e51 Mon Sep 17 00:00:00 2001 From: xupei Date: Tue, 23 Apr 2024 17:22:40 +0800 Subject: [PATCH 78/93] =?UTF-8?q?BUGFIX:=20generate=20=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E5=8A=A0=E5=88=A4=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index a64a02ae..6f35de66 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -523,7 +523,7 @@ public class GenerateServiceImpl extends ServiceImpl i taskIdList.forEach(taskId -> { String key = generateResultKey + ":" + taskId; GenerateResultVO generateResultVO = new Gson().fromJson(redisUtil.getFromString(key), GenerateResultVO.class); - if (!StringUtil.isNullOrEmpty(generateResultVO.getUrl())) { + if (!Objects.isNull(generateResultVO) && !StringUtil.isNullOrEmpty(generateResultVO.getUrl())) { generateResultVO.setUrl(minioUtil.getPresignedUrl(generateResultVO.getUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); } results.add(generateResultVO); From c44fc14796628a22d346780a992973a4b33b2697 Mon Sep 17 00:00:00 2001 From: xupei Date: Tue, 23 Apr 2024 18:32:29 +0800 Subject: [PATCH 79/93] =?UTF-8?q?BUGFIX:=20generate=20=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E5=8A=A0=E5=88=A4=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ai/da/model/vo/GenerateResultVO.java | 2 ++ .../java/com/ai/da/service/impl/GenerateServiceImpl.java | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ai/da/model/vo/GenerateResultVO.java b/src/main/java/com/ai/da/model/vo/GenerateResultVO.java index 3f28fc59..3071c0fa 100644 --- a/src/main/java/com/ai/da/model/vo/GenerateResultVO.java +++ b/src/main/java/com/ai/da/model/vo/GenerateResultVO.java @@ -3,10 +3,12 @@ package com.ai.da.model.vo; import io.swagger.annotations.ApiModel; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; @Data @ApiModel("generate result 响应") @AllArgsConstructor +@NoArgsConstructor public class GenerateResultVO { private String taskId; diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index 6f35de66..97529300 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -520,16 +520,19 @@ public class GenerateServiceImpl extends ServiceImpl i @Override public List getGenerateResultList(List taskIdList) { List results = new ArrayList<>(); + Set collect = new HashSet<>(); taskIdList.forEach(taskId -> { String key = generateResultKey + ":" + taskId; GenerateResultVO generateResultVO = new Gson().fromJson(redisUtil.getFromString(key), GenerateResultVO.class); if (!Objects.isNull(generateResultVO) && !StringUtil.isNullOrEmpty(generateResultVO.getUrl())) { generateResultVO.setUrl(minioUtil.getPresignedUrl(generateResultVO.getUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + if (!StringUtil.isNullOrEmpty(generateResultVO.getStatus())) collect.add(generateResultVO.getStatus()); + }else if (Objects.isNull(generateResultVO)){ + generateResultVO = new GenerateResultVO(); } results.add(generateResultVO); }); // todo - Set collect = results.stream().map(GenerateResultVO::getStatus).collect(Collectors.toSet()); if (taskIdList.size() == 4 && collect.size() == 1 && collect.contains("Fail")){ throw new BusinessException("generate.interface.error"); } From 6d9efc15098669cb6eb91d7f6c4772633c42bc10 Mon Sep 17 00:00:00 2001 From: xupei Date: Thu, 25 Apr 2024 12:41:07 +0800 Subject: [PATCH 80/93] =?UTF-8?q?generate=20=E6=8E=A5=E5=8F=A3=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../da/common/RabbitMQ/GenerateConsumer.java | 8 ++++++-- .../ai/da/common/constant/CommonConstant.java | 5 +++-- .../dto/GenerateThroughImageTextDTO.java | 1 - .../ai/da/model/dto/GenerateToPythonDTO.java | 5 +++-- .../com/ai/da/model/vo/GenerateResultVO.java | 9 +++++++++ .../com/ai/da/service/GenerateService.java | 2 +- .../impl/CollectionElementServiceImpl.java | 1 + .../da/service/impl/GenerateServiceImpl.java | 20 +++++++++++++------ 8 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java index 0420b6ff..f9edde27 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java @@ -88,6 +88,9 @@ public class GenerateConsumer { channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false); // 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除 redisUtil.removeFromZSet(consumptionOrderKey, uniqueId); + String key = generateResultKey + ":" + uniqueId; + GenerateResultVO generateResultVO = new GenerateResultVO(generateThroughImageTextDTO.getUniqueId(), null, null, "Fail"); + redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); } catch (IOException exception) { log.error("手动确认,取消返回队列,不再重新消费"); } @@ -115,9 +118,10 @@ public class GenerateConsumer { try { log.info("tasks_id : {} start ", generateResult.get("tasks_id")); if (generateResult.get("status").equals("SUCCESS")) { - String url = generateResult.get("data"); + String url = generateResult.get("image_url"); String taskId = generateResult.get("tasks_id"); - generateService.processGenerateResult(taskId, url); + String category = generateResult.get("category"); + generateService.processGenerateResult(taskId, url, category); } else { // 修改redis中的数据状态为exception String key = generateResultKey + ":" + generateResult.get("tasks_id"); diff --git a/src/main/java/com/ai/da/common/constant/CommonConstant.java b/src/main/java/com/ai/da/common/constant/CommonConstant.java index 63076fd4..ac139e98 100644 --- a/src/main/java/com/ai/da/common/constant/CommonConstant.java +++ b/src/main/java/com/ai/da/common/constant/CommonConstant.java @@ -1,8 +1,9 @@ package com.ai.da.common.constant; public class CommonConstant { - // 单位 秒 一天过期 - public static final Long TASK_EXPIRE_TIME = 24 * 60 * 60L; + // 单位 秒 10分钟过期 +// public static final Long TASK_EXPIRE_TIME = 24 * 60 * 60L; + public static final Long TASK_EXPIRE_TIME = 10 * 60L; // 单位 秒 两天过期 public static final Long CREDITS_EXPIRE_TIME = 2 * 24 * 60 * 60L; // 单位 分钟 diff --git a/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java b/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java index fcd60ad1..602f1886 100644 --- a/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java +++ b/src/main/java/com/ai/da/model/dto/GenerateThroughImageTextDTO.java @@ -24,7 +24,6 @@ public class GenerateThroughImageTextDTO { @ApiModelProperty("text image text-image") String generateType; - /** 暂时没有用上 */ @ApiModelProperty("图片是update,还是从library中选择") String designType; diff --git a/src/main/java/com/ai/da/model/dto/GenerateToPythonDTO.java b/src/main/java/com/ai/da/model/dto/GenerateToPythonDTO.java index ea62e425..c08a5f90 100644 --- a/src/main/java/com/ai/da/model/dto/GenerateToPythonDTO.java +++ b/src/main/java/com/ai/da/model/dto/GenerateToPythonDTO.java @@ -22,15 +22,16 @@ public class GenerateToPythonDTO { // 去除 // private String version; // 去掉 -// private String gender; + private String gender; // taskId的最后拼接用户id private String tasks_id; - public GenerateToPythonDTO(String tasks_id, String prompt, String image_url, String mode, String category) { + public GenerateToPythonDTO(String tasks_id, String prompt, String image_url, String mode, String category, String gender) { this.image_url = image_url; this.category = category; this.prompt = prompt; this.mode = mode; this.tasks_id = tasks_id; + this.gender = gender; } } diff --git a/src/main/java/com/ai/da/model/vo/GenerateResultVO.java b/src/main/java/com/ai/da/model/vo/GenerateResultVO.java index 3071c0fa..4a5f1453 100644 --- a/src/main/java/com/ai/da/model/vo/GenerateResultVO.java +++ b/src/main/java/com/ai/da/model/vo/GenerateResultVO.java @@ -19,6 +19,15 @@ public class GenerateResultVO { private String status; + private String category; + + public GenerateResultVO(String taskId, Long id, String url, String status) { + this.taskId = taskId; + this.id = id; + this.url = url; + this.status = status; + } + public GenerateResultVO(Long id, String url, String status) { this.id = id; this.url = url; diff --git a/src/main/java/com/ai/da/service/GenerateService.java b/src/main/java/com/ai/da/service/GenerateService.java index 65297e79..c59513c8 100644 --- a/src/main/java/com/ai/da/service/GenerateService.java +++ b/src/main/java/com/ai/da/service/GenerateService.java @@ -15,7 +15,7 @@ public interface GenerateService extends IService { void generateThroughImageText(GenerateThroughImageTextDTO generateThroughImageTextDTO); - void processGenerateResult(String taskId, String url); + void processGenerateResult(String taskId, String url, String category); GenerateLikeVO generateLike(GenerateLikeDTO generateLikeDTO); diff --git a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java index bca4328b..fc1455ec 100644 --- a/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java @@ -836,6 +836,7 @@ public class CollectionElementServiceImpl extends ServiceImpl i // List generatedSketchUrl = asyncCallerUtil.generate(new GenerateToPythonDTO(accountId, Objects.isNull(collectionElement) ? "" : collectionElement.getUrl(), // category, text, mode, "1", generateThroughImageTextDTO.getGender(), generateThroughImageTextDTO.getUniqueId())); Boolean requestResult = pythonService.generateSketchOrPrint(new GenerateToPythonDTO(generateThroughImageTextDTO.getUniqueId(), text,Objects.isNull(collectionElement) ? "" : collectionElement.getUrl(), - mode, category)); + mode, category, generateThroughImageTextDTO.getGender())); // log.info("generate 响应 : " + generatedSketchUrl); // if (CollectionUtils.isEmpty(generatedSketchUrl)) { // return null; @@ -193,7 +193,7 @@ public class GenerateServiceImpl extends ServiceImpl i @Override @Transactional(rollbackFor = Exception.class) - public void processGenerateResult(String taskId, String url){ + public void processGenerateResult(String taskId, String url, String category){ // 5、处理模型返回的数据 // 5.1 将相应的url保存到数据库 GenerateDetail generateDetail = new GenerateDetail(); @@ -226,7 +226,9 @@ public class GenerateServiceImpl extends ServiceImpl i generateDetailMapper.insert(generateDetail); String key = generateResultKey + ":" + taskId; - GenerateResultVO generateResultVO = new GenerateResultVO(taskId, generateDetail.getId(), url, "Success"); + String imageName = url.substring(url.lastIndexOf("/") + 1); + String status = imageName.equals("white_image.jpg") ? "Invalid" : "Success"; + GenerateResultVO generateResultVO = new GenerateResultVO(taskId, generateDetail.getId(), url, status, category); redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); } @@ -266,7 +268,7 @@ public class GenerateServiceImpl extends ServiceImpl i generate.setText(text); break; case "Sketchboard": - text = "a single item , " + userInput + ", clean background, hand-drawing sketch style, high quality"; + text = "transparent line drawing, transparent sketch, front of single clothing vector image, clean background, best quality, ultra high res 8k," + userInput; generate.setText(text); default: } @@ -525,15 +527,21 @@ public class GenerateServiceImpl extends ServiceImpl i String key = generateResultKey + ":" + taskId; GenerateResultVO generateResultVO = new Gson().fromJson(redisUtil.getFromString(key), GenerateResultVO.class); if (!Objects.isNull(generateResultVO) && !StringUtil.isNullOrEmpty(generateResultVO.getUrl())) { - generateResultVO.setUrl(minioUtil.getPresignedUrl(generateResultVO.getUrl(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); - if (!StringUtil.isNullOrEmpty(generateResultVO.getStatus())) collect.add(generateResultVO.getStatus()); + String url = generateResultVO.getUrl(); + if (url.substring(url.lastIndexOf("/") + 1).equals("white_image.jpg")){ + generateResultVO.setStatus("Invalid"); + }else { + generateResultVO.setUrl(minioUtil.getPresignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); + } }else if (Objects.isNull(generateResultVO)){ generateResultVO = new GenerateResultVO(); } + if (!StringUtil.isNullOrEmpty(generateResultVO.getStatus())) collect.add(generateResultVO.getStatus()); results.add(generateResultVO); }); // todo if (taskIdList.size() == 4 && collect.size() == 1 && collect.contains("Fail")){ + log.info("当前4个生成结果均为失败"); throw new BusinessException("generate.interface.error"); } return results; From 9627239f9a163e1b1b3d7acf42889ce768284d4a Mon Sep 17 00:00:00 2001 From: xupei Date: Thu, 25 Apr 2024 14:23:37 +0800 Subject: [PATCH 81/93] =?UTF-8?q?generate--print=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=A3=8E=E6=A0=BC=E6=8F=90=E7=A4=BA=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../da/service/impl/GenerateServiceImpl.java | 55 +++++++++++-------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index 52f0a9c9..694bee4f 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -124,7 +124,7 @@ public class GenerateServiceImpl extends ServiceImpl i String text = generateThroughImageTextDTO.getText(); Long elementId = generateThroughImageTextDTO.getCollectionElementId(); validateGeneraType(generate, text, elementId, generateType); - if (generateType.equals("text") || generateType.equals("text-image")){ + if (generateType.equals("text") || generateType.equals("text-image")) { text = modifyPrompt(text, generate, generateThroughImageTextDTO.getLevel1Type()); } @@ -140,7 +140,7 @@ public class GenerateServiceImpl extends ServiceImpl i // AsyncCallerUtil asyncCallerUtil = new AsyncCallerUtil(); // List generatedSketchUrl = asyncCallerUtil.generate(new GenerateToPythonDTO(accountId, Objects.isNull(collectionElement) ? "" : collectionElement.getUrl(), // category, text, mode, "1", generateThroughImageTextDTO.getGender(), generateThroughImageTextDTO.getUniqueId())); - Boolean requestResult = pythonService.generateSketchOrPrint(new GenerateToPythonDTO(generateThroughImageTextDTO.getUniqueId(), text,Objects.isNull(collectionElement) ? "" : collectionElement.getUrl(), + Boolean requestResult = pythonService.generateSketchOrPrint(new GenerateToPythonDTO(generateThroughImageTextDTO.getUniqueId(), text, Objects.isNull(collectionElement) ? "" : collectionElement.getUrl(), mode, category, generateThroughImageTextDTO.getGender())); // log.info("generate 响应 : " + generatedSketchUrl); // if (CollectionUtils.isEmpty(generatedSketchUrl)) { @@ -153,9 +153,9 @@ public class GenerateServiceImpl extends ServiceImpl i // 5、将本次请求存入redis String key = generateResultKey + ":" + generateThroughImageTextDTO.getUniqueId(); String status; - if (requestResult){ + if (requestResult) { status = "Executing"; - }else { + } else { status = "Fail"; } GenerateResultVO generateResultVO = new GenerateResultVO(generateThroughImageTextDTO.getUniqueId(), null, null, status); @@ -193,19 +193,19 @@ public class GenerateServiceImpl extends ServiceImpl i @Override @Transactional(rollbackFor = Exception.class) - public void processGenerateResult(String taskId, String url, String category){ + public void processGenerateResult(String taskId, String url, String category) { // 5、处理模型返回的数据 // 5.1 将相应的url保存到数据库 GenerateDetail generateDetail = new GenerateDetail(); GenerateCollectionItemVO generateCollectionItemVO = new GenerateCollectionItemVO(); - Generate generate ; - try{ + Generate generate; + try { generate = selectByUniqueId(taskId); - }catch (MybatisPlusException e){ + } catch (MybatisPlusException e) { log.error(e.getMessage()); - if (e.getMessage().equals("One record is expected, but the query result is multiple records")){ + if (e.getMessage().equals("One record is expected, but the query result is multiple records")) { generate = selectListByUniqueId(taskId).get(0); - }else { + } else { throw new BusinessException("There are some problems with database query, please try again."); } @@ -256,7 +256,7 @@ public class GenerateServiceImpl extends ServiceImpl i } } - private String modifyPrompt(String userInput, Generate generate, String level1Type){ + private String modifyPrompt(String userInput, Generate generate, String level1Type) { String text = ""; switch (level1Type) { case "Moodboard": @@ -264,6 +264,13 @@ public class GenerateServiceImpl extends ServiceImpl i generate.setText(text); break; case "Printboard": + if (userInput.contains("Painting Style")) { + userInput = "Picasso,increased color saturation,increased glossiness," + userInput; + } else if (userInput.contains("Illustration Style")) { + userInput = "Flat coating,romantic,soft,pencil strokes,accentuating and widening the depth of pencil strokes,paper patterns,block colors,crayons,reducing image contrast,and hand drawn painting marks," + userInput; + } else if (userInput.contains("Real Style")) { + userInput = "Still life photography,hyper realism,3d,deepened projection,increased permutation value,increased concavity and convexity value," + userInput; + } text = userInput + ", fabric print, high quality"; generate.setText(text); break; @@ -410,9 +417,9 @@ public class GenerateServiceImpl extends ServiceImpl i // 判断试用用户是否还有剩余试用机会 int trialsCount = 0; - if (generateThroughImageTextDTO.getIsTestUser()){ + if (generateThroughImageTextDTO.getIsTestUser()) { trialsCount = getTrialsCount(generateThroughImageTextDTO.getUserId(), generateThroughImageTextDTO.getLevel1Type()); - if (trialsCount >= 2){ + if (trialsCount >= 2) { return new PrepareForGenerateVO(0); } } @@ -443,7 +450,7 @@ public class GenerateServiceImpl extends ServiceImpl i } ArrayList taskIdList = new ArrayList<>(); - for (int i = 1 ; i <= 4 ; i++){ + for (int i = 1; i <= 4; i++) { String temp = uuid; temp += "-" + i + "-" + generateThroughImageTextDTO.getUserId(); taskIdList.add(temp); @@ -528,19 +535,19 @@ public class GenerateServiceImpl extends ServiceImpl i GenerateResultVO generateResultVO = new Gson().fromJson(redisUtil.getFromString(key), GenerateResultVO.class); if (!Objects.isNull(generateResultVO) && !StringUtil.isNullOrEmpty(generateResultVO.getUrl())) { String url = generateResultVO.getUrl(); - if (url.substring(url.lastIndexOf("/") + 1).equals("white_image.jpg")){ + if (url.substring(url.lastIndexOf("/") + 1).equals("white_image.jpg")) { generateResultVO.setStatus("Invalid"); - }else { + } else { generateResultVO.setUrl(minioUtil.getPresignedUrl(url, CommonConstant.MINIO_IMAGE_EXPIRE_TIME)); } - }else if (Objects.isNull(generateResultVO)){ + } else if (Objects.isNull(generateResultVO)) { generateResultVO = new GenerateResultVO(); } if (!StringUtil.isNullOrEmpty(generateResultVO.getStatus())) collect.add(generateResultVO.getStatus()); results.add(generateResultVO); }); // todo - if (taskIdList.size() == 4 && collect.size() == 1 && collect.contains("Fail")){ + if (taskIdList.size() == 4 && collect.size() == 1 && collect.contains("Fail")) { log.info("当前4个生成结果均为失败"); throw new BusinessException("generate.interface.error"); } @@ -601,24 +608,24 @@ public class GenerateServiceImpl extends ServiceImpl i } // 判断试用用户试用generate机会是否使用完毕 每个board 3次机会 - private int getTrialsCount(Long userId, String level1Type){ + private int getTrialsCount(Long userId, String level1Type) { List getGenerateList = getGenerateByAccountId(userId, level1Type); - int trialsCount ; - if (getGenerateList.isEmpty()){ + int trialsCount; + if (getGenerateList.isEmpty()) { trialsCount = 0; } else if (getGenerateList.size() == 1 || (getGenerateList.size() >= 4 && getGenerateList.size() / 4 == 1)) { trialsCount = 1; } else if (getGenerateList.size() == 2 || (getGenerateList.size() >= 4 && getGenerateList.size() / 4 == 2)) { trialsCount = 2; - }else { + } else { trialsCount = 2; } return trialsCount; } - public List getGenerateByAccountId(Long accountId, String level1Type){ + public List getGenerateByAccountId(Long accountId, String level1Type) { QueryWrapper qw = new QueryWrapper<>(); - qw.eq("account_id",accountId); + qw.eq("account_id", accountId); qw.eq("level1_type", level1Type); return baseMapper.selectList(qw); From 856c6e1be9f32284c4e10ea2d31fcd6d6a5ad9be Mon Sep 17 00:00:00 2001 From: xupei Date: Thu, 25 Apr 2024 17:20:56 +0800 Subject: [PATCH 82/93] =?UTF-8?q?generate--sketch=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index 694bee4f..1678b3b9 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -275,7 +275,7 @@ public class GenerateServiceImpl extends ServiceImpl i generate.setText(text); break; case "Sketchboard": - text = "transparent line drawing, transparent sketch, front of single clothing vector image, clean background, best quality, ultra high res 8k," + userInput; + text = "clear lines, simple outlines monochrome white vector image of " + userInput + ", no background, sketch flat, front view display, best quality, ultra-high resolution 8k"; generate.setText(text); default: } From 5f0546c6cfcc7aa99c64bdda0bf729fadddcd653 Mon Sep 17 00:00:00 2001 From: xupei Date: Tue, 30 Apr 2024 10:59:41 +0800 Subject: [PATCH 83/93] =?UTF-8?q?design=20single=20=E5=9C=A8=E7=94=A8?= =?UTF-8?q?=E6=88=B7submit=E6=97=B6=E5=B0=86=E4=B8=8A=E4=BC=A0=E7=9A=84?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E4=BF=9D=E5=AD=98=E5=88=B0library?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/DesignSingleIncludeLayersDTO.java | 3 + .../ai/da/model/dto/DesignSingleItemDTO.java | 9 ++ .../model/vo/DesignItemClothesDetailVO.java | 6 ++ .../com/ai/da/model/vo/DesignSinglePrint.java | 3 + .../java/com/ai/da/python/PythonService.java | 10 ++- .../service/impl/DesignItemServiceImpl.java | 83 +++++++++++++++++-- .../da/service/impl/LibraryServiceImpl.java | 3 +- 7 files changed, 110 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ai/da/model/dto/DesignSingleIncludeLayersDTO.java b/src/main/java/com/ai/da/model/dto/DesignSingleIncludeLayersDTO.java index 76161990..b2b5828d 100644 --- a/src/main/java/com/ai/da/model/dto/DesignSingleIncludeLayersDTO.java +++ b/src/main/java/com/ai/da/model/dto/DesignSingleIncludeLayersDTO.java @@ -26,6 +26,9 @@ public class DesignSingleIncludeLayersDTO { @ApiModelProperty("进度") private String processId; + @ApiModelProperty("性别") + private String gender; + @NotBlank(message = "timeZone.cannot.be.empty") @ApiModelProperty("本地时区,比如 'Asia/Tokyo' 东京时间 , 'Asia/Shanghai' 北京时间 由js本地获取") private String timeZone; diff --git a/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java b/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java index 8206a68f..77b8b431 100644 --- a/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java +++ b/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java @@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.List; @@ -14,6 +15,14 @@ public class DesignSingleItemDTO { @ApiModelProperty("切换图片对应的id") private Long id; + @NotEmpty(message = "changed cannot be empty") + @ApiModelProperty("当前服装的id是否被添加随机数") + private Boolean changed; + + @NotBlank(message = "designType cannot be empty") + @ApiModelProperty("当前图片来源于用户上传还是从library选择 Collection/Library") + private String designType; + @NotBlank(message = "type.cannot.be.empty") @ApiModelProperty("生成item实际对应的类型 有:outwear,dress,blouse,skirt,trousers Shoes Hairstyle Earring") private String type; diff --git a/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java b/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java index 70ca7b46..2b5c3667 100644 --- a/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java +++ b/src/main/java/com/ai/da/model/vo/DesignItemClothesDetailVO.java @@ -17,6 +17,12 @@ public class DesignItemClothesDetailVO { @ApiModelProperty("对应的上游id") private Long id; + @ApiModelProperty("该id末尾是否被加了随机数") + private Boolean changed; + + @ApiModelProperty("该图片来源 Collection / Library") + private String designType; + @ApiModelProperty("对应的类型 有:Outwear,Dress,Blouse,Skirt,Trousers Shoes Hairstyle Earring Body") private String type; diff --git a/src/main/java/com/ai/da/model/vo/DesignSinglePrint.java b/src/main/java/com/ai/da/model/vo/DesignSinglePrint.java index 94575022..54818442 100644 --- a/src/main/java/com/ai/da/model/vo/DesignSinglePrint.java +++ b/src/main/java/com/ai/da/model/vo/DesignSinglePrint.java @@ -12,6 +12,9 @@ import java.util.List; @ApiModel("design single 印花详情") public class DesignSinglePrint { + @ApiModelProperty("印花是用户上传的还是从library中选的 collection/library") + private String designType; + @ApiModelProperty("印花url") private String path; diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 7f7c4e5f..3f0acc73 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -2578,13 +2578,21 @@ public class PythonService { List response = new ArrayList<>(); designSingleItemList.forEach(designSingleItem -> { + Long businessId; + if (!designSingleIncludeLayersDTO.getIsPreview() && designSingleItem.getChanged()){ + String s = String.valueOf(designSingleItem.getId()); + businessId = Long.parseLong(s.substring(0,s.length() - 3)); + }else { + businessId = designSingleItem.getId(); + } response.add(new DesignPythonItem( designSingleItem.getType(), designSingleItem.getPath(), designSingleItem.getColor(), resolveDesignSinglePrint(designSingleItem.getPrintObject(), designSingleItem.getPath()), // businessId designItemDetailId (python端确认没有作用,但是数据库需要存,作用:未知) - designSingleItem.getId(), +// designSingleItem.getId(), + businessId, pythonTAllInfoService.getImageIdByPath(designSingleItem.getPath()), designSingleItem.getOffset(), designSingleItem.getScale(), diff --git a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java index 64bc25d4..613d8e71 100644 --- a/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java @@ -3,11 +3,14 @@ package com.ai.da.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.common.constant.CommonConstant; import com.ai.da.common.context.UserContext; +import com.ai.da.common.enums.CollectionLevel1TypeEnum; import com.ai.da.common.enums.SingleOverallEnum; import com.ai.da.common.enums.SysFileLevel2TypeEnum; import com.ai.da.common.utils.CopyUtil; import com.ai.da.common.utils.DateUtil; +import com.ai.da.common.utils.MD5Utils; import com.ai.da.common.utils.MinioUtil; import com.ai.da.mapper.primary.DesignItemMapper; import com.ai.da.mapper.primary.entity.*; @@ -30,8 +33,10 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.io.IOException; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -488,6 +493,8 @@ public class DesignItemServiceImpl extends ServiceImpl idChanged = designSingleItemDTOList.stream().collect(Collectors.toMap(DesignSingleItemDTO::getId, DesignSingleItemDTO::getChanged)); + // 获取每个单品的designType,该状态需要再返回给前端 + Map idDesignType = designSingleItemDTOList.stream().collect(Collectors.toMap(DesignSingleItemDTO::getId, DesignSingleItemDTO::getDesignType)); + boolean flag = singleOrOverall.equals("single"); designSingleItemDTOList.forEach(singleItem -> { DesignItemClothesDetailVO designItemClothesDetailVO = new DesignItemClothesDetailVO(); designItemClothesDetailVO.setId(singleItem.getId()); + designItemClothesDetailVO.setChanged(idChanged.get(singleItem.getId())); + designItemClothesDetailVO.setDesignType(idDesignType.get(singleItem.getId())); designItemClothesDetailVO.setType(singleItem.getType()); designItemClothesDetailVO.setPath(minioUtil.getPresignedUrl(singleItem.getPath(), 24 * 60)); designItemClothesDetailVO.setMinIOPath(singleItem.getPath()); designItemClothesDetailVO.setColor(panToneService.getPantoneByRgb(singleItem.getColor())); -// designItemClothesDetailVO.setPrintObject(new DesignPythonItemPrint(singleItem.getPrintObject().getPath())); designItemClothesDetailVO.setPrintObject(singleItem.getPrintObject()); designItemClothesDetailVO.setLayersObject(layersObject.stream().filter( layers -> (singleItem.getType().toLowerCase().equals(layers.getImageCategory().split("_")[0]) @@ -703,4 +712,68 @@ public class DesignItemServiceImpl extends ServiceImpl libraries = new ArrayList<>(); + // 添加sketch到library + designSingleIncludeLayersDTO.getDesignSingleItemDTOList().forEach(designSingleItem -> { + + if (!StringUtil.isNullOrEmpty(designSingleItem.getDesignType()) && designSingleItem.getDesignType().equals("Collection")){ + String path = minioUtil.getPresignedUrl(designSingleItem.getPath(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME); + try { + String md5 = MD5Utils.encryptFile(path, false); + // 先判断是否需要被加入到library + Boolean needAdd = libraryService.checkMd5(CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName(), + designSingleItem.getType(), + designSingleIncludeLayersDTO.getGender(), + md5); + // 加入到library + if (needAdd){ + Library library = new Library(); + library.setAccountId(UserContext.getUserHolder().getId()); + library.setLevel1Type(CollectionLevel1TypeEnum.SKETCH_BOARD.getRealName()); + library.setLevel2Type(designSingleItem.getType()); + library.setLevel3Type(designSingleIncludeLayersDTO.getGender()); + library.setUrl(designSingleItem.getPath()); + library.setName(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))); + library.setMd5(md5); + library.setCreateDate(DateUtil.getByTimeZone(designSingleIncludeLayersDTO.getTimeZone())); + libraries.add(library); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + // 添加print到library + designSingleItem.getPrintObject().getPrints().forEach(print -> { + if (!StringUtil.isNullOrEmpty(print.getDesignType()) && print.getDesignType().equals("Collection")){ + String path = minioUtil.getPresignedUrl(print.getMinIOPath(), CommonConstant.MINIO_IMAGE_EXPIRE_TIME); + try { + String md5 = MD5Utils.encryptFile(path, false); + // 先判断是否已被加入到library + Boolean needAdd = libraryService.checkMd5(CollectionLevel1TypeEnum.PRINT_BOARD.getRealName(), + null, + null, + md5); + // 加入到library + if (needAdd){ + Library library = new Library(); + library.setAccountId(UserContext.getUserHolder().getId()); + library.setLevel1Type(CollectionLevel1TypeEnum.PRINT_BOARD.getRealName()); + library.setUrl(print.getMinIOPath()); + library.setName(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))); + library.setMd5(md5); + library.setCreateDate(DateUtil.getByTimeZone(designSingleIncludeLayersDTO.getTimeZone())); + libraries.add(library); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + }); + } ); + libraryService.saveBatch(libraries); + } } diff --git a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java index 9d402416..080523ed 100644 --- a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java @@ -409,7 +409,8 @@ public class LibraryServiceImpl extends ServiceImpl impl qw.lambda().eq(Library::getLevel2Type, level2Type); qw.lambda().eq(Library::getLevel3Type, sex); } else { - qw.lambda().eq(Library::getLevel2Type, sex); +// qw.lambda().eq(Library::getLevel2Type, sex); + qw.lambda().eq(Library::getLevel3Type, sex); } } qw.lambda().eq(Library::getMd5, md5); From 988fe8957642a01f512623e4d54dbcc12d6836da Mon Sep 17 00:00:00 2001 From: xupei Date: Tue, 30 Apr 2024 11:39:04 +0800 Subject: [PATCH 84/93] =?UTF-8?q?generate=20=E5=B0=86=E8=BF=98=E6=9C=AA?= =?UTF-8?q?=E5=A4=84=E7=90=86=E7=9A=84=E8=AF=B7=E6=B1=82=E7=BD=AE=E4=B8=BA?= =?UTF-8?q?Waiting=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ai/da/service/impl/GenerateServiceImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index 1678b3b9..1755eb60 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -461,6 +461,11 @@ public class GenerateServiceImpl extends ServiceImpl i Double maxScore = redisUtil.getMaxScore(consumptionOrderKey); redisUtil.addToZSet(consumptionOrderKey, temp, maxScore); + // 加入resultMap + String key = generateResultKey + ":" + temp; + GenerateResultVO generateResultVO = new GenerateResultVO(generateThroughImageTextDTO.getUniqueId(), null, null, "Waiting"); + redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + // 4、将消息发布到MQ消息队列 rabbitMQService.publishMessageToGenerate(jsonString); } From ffeaac8c460bd00e89e700c77cf212ca5a606d9a Mon Sep 17 00:00:00 2001 From: xupei Date: Thu, 2 May 2024 10:33:11 +0800 Subject: [PATCH 85/93] =?UTF-8?q?generate=20=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../da/common/RabbitMQ/GenerateConsumer.java | 4 +- .../com/ai/da/service/GenerateService.java | 2 +- .../da/service/impl/GenerateServiceImpl.java | 44 +++++++------------ .../impl/SuperResolutionServiceImpl.java | 13 +----- 4 files changed, 20 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java index f9edde27..3e8e6a6e 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java @@ -10,6 +10,7 @@ import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import com.rabbitmq.client.Channel; import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.jni.Time; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; @@ -41,9 +42,6 @@ public class GenerateConsumer { @Value("${redis.key.generateExceptionMap}") private String exceptionMapKey; - @Value("${redis.key.resultMap}") - private String resultMapKey; - @Value("${redis.key.generateResult}") private String generateResultKey; diff --git a/src/main/java/com/ai/da/service/GenerateService.java b/src/main/java/com/ai/da/service/GenerateService.java index c59513c8..a3f6ed7d 100644 --- a/src/main/java/com/ai/da/service/GenerateService.java +++ b/src/main/java/com/ai/da/service/GenerateService.java @@ -25,7 +25,7 @@ public interface GenerateService extends IService { List selectBatchByLibraryId(List libraryId); - GenerateCollectionVO getGenerateResult(String uniqueId); +// GenerateCollectionVO getGenerateResult(String uniqueId); List getGenerateResultList(List taskIdList); diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index 1755eb60..1f56a4a9 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -82,9 +82,6 @@ public class GenerateServiceImpl extends ServiceImpl i @Value("${redis.key.generateExceptionMap}") private String exceptionMapKey; - @Value("${redis.key.resultMap}") - private String resultMapKey; - @Value("${redis.key.generateResult}") private String generateResultKey; @@ -428,27 +425,9 @@ public class GenerateServiceImpl extends ServiceImpl i Long elementId = generateThroughImageTextDTO.getCollectionElementId(); validateGeneraType(new Generate(), text, elementId, generateType); - // 2、生成唯一id 使用uuid + // 2、生成唯一id 使用uuid,由于uuid重复的几率很小,故取消对uuid重复性的校验 String uuid = UUID.randomUUID().toString(); - int num = 1; - // 判断已经正常生成结果的uuid或正在排队的uuid中是否有相同的id - while ((redisUtil.isElementExistsInMap(resultMapKey, uuid) || - redisUtil.isElementExistsInZSet(consumptionOrderKey, uuid)) - && num < 10) { - uuid = UUID.randomUUID().toString(); - num++; - } - // 无依据确定的数字 - if (num > 10) { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - uuid = UUID.randomUUID().toString(); - } - ArrayList taskIdList = new ArrayList<>(); for (int i = 1; i <= 4; i++) { String temp = uuid; @@ -480,7 +459,7 @@ public class GenerateServiceImpl extends ServiceImpl i return redisUtil.getRank(consumptionOrderKey, uniqueId); } - @Override + /*@Override public GenerateCollectionVO getGenerateResult(String uniqueId) { // 1、判断该请求是否已经异常 Boolean isMember = redisUtil.isElementExistsInMap(exceptionMapKey, uniqueId); @@ -529,7 +508,7 @@ public class GenerateServiceImpl extends ServiceImpl i }); return new GenerateCollectionVO(generateId, null, generatedCollectionItems); - } + }*/ @Override public List getGenerateResultList(List taskIdList) { @@ -579,7 +558,10 @@ public class GenerateServiceImpl extends ServiceImpl i public void cancelGenerate(Long userId, List uniqueIdList, String timeZone) { // todo 取消待优化 uniqueIdList.forEach(uniqueId -> { - // 1、确认当前消息是否还在排队中 + // 1、将需要取消的唯一id加入redis,以便及时取消生成 + redisUtil.addToSet(cancelSetKey, uniqueId); + + /*// 1、确认当前消息是否还在排队中 Boolean exists = redisUtil.isElementExistsInZSet(consumptionOrderKey, uniqueId); Boolean flag = Boolean.FALSE; if (exists) flag = redisUtil.getRank(consumptionOrderKey, uniqueId) > 1L ? Boolean.TRUE : Boolean.FALSE; @@ -600,9 +582,17 @@ public class GenerateServiceImpl extends ServiceImpl i // 3、直接发送取消请求到python端 pythonService.cancelGenerateTask(uniqueId); } - } + }*/ + String key = generateResultKey + ":" + uniqueId; - redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(uniqueId, null, null, "Cancelled")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + GenerateResultVO generateResultVO = new Gson().fromJson(redisUtil.getFromString(key), GenerateResultVO.class); + // 判断当前task的状态是不是Fail + if (!generateResultVO.getStatus().equals("Fail")){ + // 2、不是,直接发送取消请求到python端 + pythonService.cancelGenerateTask(uniqueId); + // 3、更改result中当前taskId的状态 + redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(uniqueId, null, null, "Cancelled")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME); + } // 3、考虑加一张表,专门用于记录哪些用户在什么时间进行了取消操作,包括已经异常的请求 GenerateCancel generateCancel = new GenerateCancel(userId, uniqueId, DateUtil.getByTimeZone(timeZone)); diff --git a/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java b/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java index eeb565e8..ee1fb6ff 100644 --- a/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/SuperResolutionServiceImpl.java @@ -57,9 +57,6 @@ public class SuperResolutionServiceImpl extends ServiceImpl Date: Mon, 6 May 2024 16:02:02 +0800 Subject: [PATCH 86/93] BUGFIX:aida; --- pom.xml | 25 ++++++ .../ai/da/common/config/MyTaskScheduler.java | 79 ++++++++++++++++++- .../com/ai/da/common/utils/SendEmailUtil.java | 53 ++++++++++++- .../da/mapper/primary/entity/Workspace.java | 7 +- .../da/service/impl/AccountServiceImpl.java | 50 ++++++------ .../da/service/impl/LibraryServiceImpl.java | 2 +- .../da/service/impl/WorkspaceServiceImpl.java | 20 ++--- .../mapper/primary/WorkspaceMapper.xml | 11 ++- 8 files changed, 201 insertions(+), 46 deletions(-) diff --git a/pom.xml b/pom.xml index 2c6dacea..21b1264b 100644 --- a/pom.xml +++ b/pom.xml @@ -202,6 +202,31 @@ 20230618 + + org.apache.poi + poi + 5.2.1 + + + + org.apache.poi + poi-ooxml + 5.2.1 + + + + commons-io + commons-io + 2.11.0 + + + + org.apache.logging.log4j + log4j-api + 2.17.1 + + + diff --git a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java index f193a16a..f505796e 100644 --- a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java +++ b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java @@ -2,12 +2,25 @@ package com.ai.da.common.config; import com.ai.da.common.utils.SendEmailUtil; import com.ai.da.mapper.primary.AccountMapper; +import com.ai.da.mapper.primary.TrialOrderMapper; import com.ai.da.mapper.primary.entity.Account; +import com.ai.da.mapper.primary.entity.TrialOrder; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; import javax.annotation.Resource; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.List; @Component @@ -16,6 +29,9 @@ public class MyTaskScheduler { @Resource private AccountMapper accountMapper; + @Resource + private TrialOrderMapper trialOrderMapper; + // 定时任务,每十五天执行一次 // @Scheduled(cron = "0 0 0 ? * MON") @Scheduled(cron = "0 0 0 */15 * ?") @@ -36,7 +52,7 @@ public class MyTaskScheduler { Long currentTimestamp = System.currentTimeMillis(); // 计算时间差(毫秒) - long timeDifference = timestamp - currentTimestamp; + long timeDifference = currentTimestamp - timestamp; if (timeDifference < 0) { continue; @@ -52,4 +68,65 @@ public class MyTaskScheduler { } } } + @Scheduled(cron = "0 0 8 * * ?") + public void sendTrialOrderExcelToManagements() { + // 获取前一天日期 + LocalDate yesterday = LocalDate.now().minusDays(1); + + // 查询前一天的试用订单 + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().between(TrialOrder::getCreateTime, yesterday.atStartOfDay(), yesterday.atTime(23, 59, 59)); + List trialOrders = trialOrderMapper.selectList(qw); + + if (!trialOrders.isEmpty()) { + // 创建Excel工作簿 + try (Workbook workbook = new XSSFWorkbook()) { + // 创建工作表 + Sheet sheet = workbook.createSheet("Trial Orders"); + // 创建标题行 + Row headerRow = sheet.createRow(0); + headerRow.createCell(0).setCellValue("ID"); + headerRow.createCell(1).setCellValue("Title"); + headerRow.createCell(2).setCellValue("Surname"); + headerRow.createCell(3).setCellValue("Given Name"); + headerRow.createCell(4).setCellValue("Username"); + headerRow.createCell(5).setCellValue("Email"); + headerRow.createCell(6).setCellValue("Country"); + headerRow.createCell(7).setCellValue("Occupation"); + headerRow.createCell(8).setCellValue("Create Time"); + headerRow.createCell(9).setCellValue("Update Time"); + headerRow.createCell(10).setCellValue("Status"); + + // 填充数据 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + int rowNum = 1; + for (TrialOrder trialOrder : trialOrders) { + Row row = sheet.createRow(rowNum++); + row.createCell(0).setCellValue(trialOrder.getId()); + row.createCell(1).setCellValue(trialOrder.getTitle()); + row.createCell(2).setCellValue(trialOrder.getSurname()); + row.createCell(3).setCellValue(trialOrder.getGivenName()); + row.createCell(4).setCellValue(trialOrder.getUserName()); + row.createCell(5).setCellValue(trialOrder.getEmail()); + row.createCell(6).setCellValue(trialOrder.getCountry()); + row.createCell(7).setCellValue(trialOrder.getOccupation()); + row.createCell(8).setCellValue(trialOrder.getCreateTime().format(formatter)); + row.createCell(9).setCellValue(trialOrder.getUpdateTime().format(formatter)); + row.createCell(10).setCellValue(trialOrder.getStatus()); + } + + // 保存Excel文件 + String fileName = "trialOrder-" + yesterday.format(DateTimeFormatter.ofPattern("yyyyMMdd")) + ".xlsx"; + try (FileOutputStream fileOut = new FileOutputStream(fileName)) { + workbook.write(fileOut); + SendEmailUtil.sendExcelEmail("1023316923@qq.com", null, Files.readAllBytes(Paths.get(fileName)), fileName); + SendEmailUtil.sendExcelEmail("calvinwong@aidlab.hk", null, Files.readAllBytes(Paths.get(fileName)), fileName); + SendEmailUtil.sendExcelEmail("kaicpang.pang@connect.polyu.hk", null, Files.readAllBytes(Paths.get(fileName)), fileName); + SendEmailUtil.sendExcelEmail("kimwong@code-create.com.hk", null, Files.readAllBytes(Paths.get(fileName)), fileName); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } } diff --git a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java index 5ffbd110..930c2cd9 100644 --- a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java +++ b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java @@ -9,12 +9,14 @@ import com.tencentcloudapi.common.exception.TencentCloudSDKException; import com.tencentcloudapi.common.profile.ClientProfile; import com.tencentcloudapi.common.profile.HttpProfile; import com.tencentcloudapi.ses.v20201002.SesClient; +import com.tencentcloudapi.ses.v20201002.models.Attachment; import com.tencentcloudapi.ses.v20201002.models.SendEmailRequest; import com.tencentcloudapi.ses.v20201002.models.SendEmailResponse; import com.tencentcloudapi.ses.v20201002.models.Template; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; +import java.util.Base64; import java.util.Date; /** @@ -130,7 +132,9 @@ public class SendEmailUtil { private final static Long YOUR_TRIAL_TEMPLATE_ID = 117214L; private final static Long APPROVAL_TEMPLATE_ID = 117215L; private final static Long NOTIFICATION_TEMPLATE_ID = 117216L; - public static void sendCustomEmail(String receiverAddress, String senderAddress, TrialOrder trialOrder, int emailType) { + private final static Long NOTIFICATION_CHINESE_TEMPLATE_ID = 122229L; + private final static Long TRIAL_ORDER_LIST_ID = 122273L; + public static void sendCustomEmail(String receiverAddress, String senderAddress, TrialOrder trialOrder, int emailType, String country) { try { // 实例化一个认证对象 Credential cred = new Credential(SECRET_ID, SECRET_KEy); @@ -162,7 +166,11 @@ public class SendEmailUtil { break; case 3: subject = "Approval Confirmation for AiDA System Trial Access"; - template.setTemplateID(NOTIFICATION_TEMPLATE_ID); + if (country.equals("China")) { + template.setTemplateID(NOTIFICATION_CHINESE_TEMPLATE_ID); + }else { + template.setTemplateID(NOTIFICATION_TEMPLATE_ID); + } template.setTemplateData(buildNotificationData(trialOrder)); break; default: @@ -180,6 +188,45 @@ public class SendEmailUtil { throw new BusinessException("failed.to.send.mail"); } } + + public static void sendExcelEmail(String receiverAddress, String senderAddress, byte[] fileContent, String fileName) { + try { + // 实例化一个认证对象 + Credential cred = new Credential(SECRET_ID, SECRET_KEy); + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("ses.tencentcloudapi.com"); + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + SesClient client = new SesClient(cred, "ap-hongkong", clientProfile); + SendEmailRequest req = new SendEmailRequest(); + if (StringUtils.isEmpty(senderAddress)) { + senderAddress = SEND_ADDRESS; + } + req.setFromEmailAddress(senderAddress); + req.setDestination(new String[]{receiverAddress}); + + // 根据邮件类型设置不同的主题和模板 + String subject = ""; + Template template = new Template(); + subject = "昨日试用订单数据"; + template.setTemplateID(TRIAL_ORDER_LIST_ID); + + req.setSubject(subject); + req.setTemplate(template); + + Attachment attachment = new Attachment(); + attachment.setFileName(fileName); // 设置附件文件名 + // 设置附件内容 + attachment.setContent(Base64.getEncoder().encodeToString(fileContent)); + req.setAttachments(new Attachment[] {attachment}); + // 发送邮件 + SendEmailResponse resp = client.SendEmail(req); + log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp)); + } catch (TencentCloudSDKException e) { + log.info("邮件发送失败###{}", e.toString()); + throw new BusinessException("failed.to.send.mail"); + } + } private final static Long WILLBEEXPIRED_TEMPLATE_ID = 118178L; public static void sendWillBeExpiredEmail(Account account, String senderAddress) { try { @@ -293,7 +340,7 @@ public class SendEmailUtil { // 根据邮件类型设置不同的主题和模板 String subject = ""; Template template = new Template(); - subject = "Notice: AiDA 3.0 Website Maintenance Downtime"; + subject = "Upcoming AiDA 3.0 Launch and Scheduled Maintenance"; template.setTemplateID(UPGRADE_NOTIFICATION_ID); template.setTemplateData(buildAccountData(account)); diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Workspace.java b/src/main/java/com/ai/da/mapper/primary/entity/Workspace.java index 5fcc49cc..2fe6fe9e 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/Workspace.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/Workspace.java @@ -35,10 +35,15 @@ public class Workspace implements Serializable { @ApiModelProperty(value = "工作空间名称") private String workSpaceName; /** - * 用户ID + * 用户名 */ @ApiModelProperty(value = "用户名") private String userName; + /** + * 用户ID + */ + @ApiModelProperty(value = "用户ID") + private Long accountId; /** * 性别 */ diff --git a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java index a166eb91..77f44f4f 100644 --- a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java @@ -77,7 +77,7 @@ public class AccountServiceImpl extends ServiceImpl impl @Transactional public AccountPreLoginVO preLogin(AccountPreLoginDTO accountDTO) { log.info("aida预先登入accountDTO###{}", JSON.toJSONString(accountDTO)); - Account account = getOneByUserName(accountDTO.getUserName()); + Account account = getOneByEmail(accountDTO.getEmail()); //用户有效期校验 validateUserValidaExpire(account); if ("Third-000000".equals(account.getUserPassword())) { @@ -287,8 +287,7 @@ public class AccountServiceImpl extends ServiceImpl impl private Account getOneByEmail(String email) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.lambda().eq(Account::getUserEmail, email); - queryWrapper.lambda().last("limit 1"); + queryWrapper.eq("BINARY user_email", email); List accountList = accountMapper.selectList(queryWrapper); if (CollectionUtil.isEmpty(accountList)) { throw new BusinessException("email.does.not.exist", ResultEnum.PROMPT.getCode()); @@ -471,28 +470,27 @@ public class AccountServiceImpl extends ServiceImpl impl String ipAddress = RequestInfoUtil.getIpAddress(request); // 先检测试用订单 QueryWrapper trialOrderQueryWrapper = new QueryWrapper<>(); - trialOrderQueryWrapper.lambda().eq(TrialOrder::getIp, ipAddress); - trialOrderQueryWrapper.lambda().and(wrapper -> - wrapper.eq(TrialOrder::getEmail, accountTrialDTO.getEmail()) - .or() // OR - .like(TrialOrder::getUserName, accountTrialDTO.getUserName())); + trialOrderQueryWrapper.eq("BINARY email", accountTrialDTO.getEmail()); +// trialOrderQueryWrapper.lambda().eq(TrialOrder::getIp, ipAddress); +// trialOrderQueryWrapper.lambda().and(wrapper -> +// wrapper.eq(TrialOrder::getEmail, accountTrialDTO.getEmail()) +// .or() // OR +// .like(TrialOrder::getUserName, accountTrialDTO.getUserName())); List trialOrders = trialOrderMapper.selectList(trialOrderQueryWrapper); if (CollectionUtil.isNotEmpty(trialOrders)) { throw new BusinessException("You have submitted a trial application, please wait for approval."); } // 先检测用户名和邮箱 QueryWrapper qw = new QueryWrapper<>(); - qw.lambda().eq(Account::getUserEmail, accountTrialDTO.getEmail()) - .or() - .eq(Account::getUserName, accountTrialDTO.getUserName()); + qw.eq("BINARY email", accountTrialDTO.getEmail()); List accountList = accountMapper.selectList(qw); if (CollectionUtil.isNotEmpty(accountList)) { if (accountList.get(0).getIsTrial() == 1) { - throw new BusinessException("The username or email has already been registered", ResultEnum.PROMPT.getCode()); + throw new BusinessException("The email has already been registered", ResultEnum.PROMPT.getCode()); }else { Account account = accountList.get(0); if (null == account.getValidEndTime() || account.getValidEndTime() > System.currentTimeMillis()) { - throw new BusinessException("The username or email has already been registered", ResultEnum.PROMPT.getCode()); + throw new BusinessException("The email has already been registered", ResultEnum.PROMPT.getCode()); } } } @@ -502,9 +500,9 @@ public class AccountServiceImpl extends ServiceImpl impl trialOrder.setStatus(0); trialOrder.setIp(ipAddress); trialOrderMapper.insert(trialOrder); - SendEmailUtil.sendCustomEmail("1023316923@qq.com", null, trialOrder,1); - SendEmailUtil.sendCustomEmail("calvinwong@aidlab.hk", null, trialOrder,1); - SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,1); +// SendEmailUtil.sendCustomEmail("1023316923@qq.com", null, trialOrder,1); +// SendEmailUtil.sendCustomEmail("calvinwong@aidlab.hk", null, trialOrder,1); +// SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,1); // 判断当前的试用订单是否自动批准 if (AutoApproved.getStatus()) { // 改变试用订单状态,新增试用用户 @@ -532,10 +530,10 @@ public class AccountServiceImpl extends ServiceImpl impl accountMapper.insert(account); } // 发送邮件提醒用户试用用户已创建 - SendEmailUtil.sendCustomEmail("1023316923@qq.com", null, trialOrder,2); - SendEmailUtil.sendCustomEmail("calvinwong@aidlab.hk", null, trialOrder,2); - SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,2); - SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3); +// SendEmailUtil.sendCustomEmail("1023316923@qq.com", null, trialOrder,2); +// SendEmailUtil.sendCustomEmail("calvinwong@aidlab.hk", null, trialOrder,2); +// SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,2); + SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry()); } return Boolean.TRUE; } @@ -556,9 +554,7 @@ public class AccountServiceImpl extends ServiceImpl impl trialOrderMapper.updateById(trialOrder); QueryWrapper qw = new QueryWrapper<>(); - qw.lambda().eq(Account::getUserEmail, trialOrder.getEmail()) - .or() - .eq(Account::getUserName, trialOrder.getUserName()); + qw.eq("BINARY email", trialOrder.getEmail()); List accountList = accountMapper.selectList(qw); Account account = new Account(); @@ -582,10 +578,10 @@ public class AccountServiceImpl extends ServiceImpl impl accountMapper.insert(account); } // 发送邮件提醒用户试用用户已创建 - SendEmailUtil.sendCustomEmail("1023316923@qq.com", null, trialOrder,2); - SendEmailUtil.sendCustomEmail("calvinwong@aidlab.hk", null, trialOrder,2); - SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,2); - SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3); +// SendEmailUtil.sendCustomEmail("1023316923@qq.com", null, trialOrder,2); +// SendEmailUtil.sendCustomEmail("calvinwong@aidlab.hk", null, trialOrder,2); +// SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,2); + SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry()); } return Boolean.TRUE; } diff --git a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java index 080523ed..bc09dd9c 100644 --- a/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java @@ -595,7 +595,7 @@ public class LibraryServiceImpl extends ServiceImpl impl public void checkModel(String value, List modelIds, Integer deleteModelConfirm) { AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder(); QueryWrapper qw = new QueryWrapper<>(); - qw.lambda().eq(Workspace::getUserName, authPrincipalVo.getUsername()); + qw.lambda().eq(Workspace::getAccountId, authPrincipalVo.getId()); if (value.equals(Sex.FEMALE.getValue())) { qw.lambda().in(Workspace::getMannequinFemaleId, modelIds); } diff --git a/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java b/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java index 69574b35..6d1478ec 100644 --- a/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java @@ -86,8 +86,8 @@ public class WorkspaceServiceImpl extends ServiceImpl systemFemaleQw = new QueryWrapper<>(); @@ -123,11 +123,11 @@ public class WorkspaceServiceImpl extends ServiceImpl qw = new QueryWrapper<>(); qw.lambda().ne(null != id, Workspace::getId, id); qw.lambda().eq(Workspace::getWorkSpaceName, workSpaceName); - qw.lambda().eq(Workspace::getUserName, userName); + qw.lambda().eq(Workspace::getAccountId, accountId); List workspaces = baseMapper.selectList(qw); if (!CollectionUtils.isEmpty(workspaces)) { throw new BusinessException("the.workspaceName.already.exists", ResultEnum.PROMPT.getCode()); @@ -137,9 +137,9 @@ public class WorkspaceServiceImpl extends ServiceImpl qw = new QueryWrapper<>(); - qw.lambda().eq(Workspace::getUserName, userName); + qw.lambda().eq(Workspace::getAccountId, accountId); IPage page = workspaceMapper.selectPage(new Page<>(query.getPage(), query.getSize()), qw); if (page.getTotal() == 0L) { // 给用户新建默认workspace @@ -148,7 +148,7 @@ public class WorkspaceServiceImpl extends ServiceImpl systemFemaleQw = new QueryWrapper<>(); systemFemaleQw.lambda().eq(SysFile::getLevel1Type, "Models"); systemFemaleQw.lambda().eq(SysFile::getLevel2Type, "Female"); @@ -225,7 +225,7 @@ public class WorkspaceServiceImpl extends ServiceImpl qwIsLastIndex = new QueryWrapper<>(); - qwIsLastIndex.lambda().eq(Workspace::getUserName, userName); + qwIsLastIndex.lambda().eq(Workspace::getAccountId, accountId); qwIsLastIndex.lambda().eq(Workspace::getIsLastIndex, 1); qwIsLastIndex.last("limit 1"); List workspaces = workspaceMapper.selectList(qwIsLastIndex); @@ -250,9 +250,9 @@ public class WorkspaceServiceImpl extends ServiceImpl qwOld = new QueryWrapper<>(); - qwOld.lambda().eq(Workspace::getUserName, userName); + qwOld.lambda().eq(Workspace::getAccountId, accountId); qwOld.lambda().eq(Workspace::getIsLastIndex, 1); Workspace oldIsLastIndex = workspaceMapper.selectOne(qwOld); oldIsLastIndex.setIsLastIndex(0); diff --git a/src/main/resources/mapper/primary/WorkspaceMapper.xml b/src/main/resources/mapper/primary/WorkspaceMapper.xml index 9f36d5f6..592084e1 100644 --- a/src/main/resources/mapper/primary/WorkspaceMapper.xml +++ b/src/main/resources/mapper/primary/WorkspaceMapper.xml @@ -7,12 +7,17 @@ + - - - + + + + + + + From ae937dbf65386a98858a0c1d6aa05567024d8f8a Mon Sep 17 00:00:00 2001 From: xupei Date: Tue, 7 May 2024 18:27:32 +0800 Subject: [PATCH 87/93] =?UTF-8?q?=E5=B0=86generate=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E7=9A=84=E6=96=87=E6=9C=AC=E8=BF=9B=E8=A1=8C=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=E6=88=96=E5=BE=AE=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ai/da/common/RabbitMQ/MQConfig.java | 1 + .../java/com/ai/da/python/PythonService.java | 55 +++++++++++++++++++ .../da/service/impl/GenerateServiceImpl.java | 13 +++-- 3 files changed, 63 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java index e9df0264..7079f02a 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java @@ -10,6 +10,7 @@ public class MQConfig { public static final String GENERATE_EXCHANGE_FANOUT = "generate-exchange"; // public static final String GENERATE_QUEUE = "generate-queue-prod"; // public static final String GENERATE_QUEUE = "generate-queue-test"; +// ================================================================== // public static final String GENERATE_QUEUE = "generate-queue-local"; public static final String GENERATE_QUEUE = "generate-queue-dev"; diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index 3f0acc73..d8220f51 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -3151,4 +3151,59 @@ public class PythonService { return Boolean.TRUE; } + public String promptTranslate(String text) throws BusinessException { + OkHttpClient client = new OkHttpClient().newBuilder() + .connectTimeout(30, TimeUnit.SECONDS) + .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) + .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒) + .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒) + .build(); + MediaType mediaType = MediaType.parse("application/json"); + + HashMap content = new HashMap<>(); + content.put("text", text); + + String jsonString = JSON.toJSONString(content, SerializerFeature.WriteNullStringAsEmpty); + RequestBody body = RequestBody.create(mediaType, jsonString); + Request request = new Request.Builder() + .url(accessPythonIp + ":" + accessPythonPort + "/api/translateToEN") + .method("POST", body) + .addHeader("Content-Type", "application/json") + .build(); + Response response = null; + try { + log.info("promptTranslation请求入参content###{}", jsonString); + response = client.newCall(request).execute(); + } catch (IOException ioException) { + log.error("PythonService##promptTranslation异常###{}", ExceptionUtil.getThrowableList(ioException)); + return text; + } + int responseCode = response.code(); + String bodyString; + try { + bodyString = response.body().string(); + if (responseCode != HttpURLConnection.HTTP_OK) { + // 基本不会有除200以外的code + log.info("promptTranslation 用户输入翻译失败。 Response code " + responseCode); + throw new BusinessException("promptTranslation 用户输入翻译失败。 Response code " + responseCode); + } + JSONObject jsonObject = JSON.parseObject(bodyString); + Boolean result = JSON.parseObject(JSON.toJSONString(response)).getBoolean("successful"); + if (result && jsonObject.get("msg").equals("OK!")) { + String translated = jsonObject.get("data").toString(); + log.info("翻译或处理后的文本 : {}", translated); + return translated; + } + } catch (IOException e) { + log.error("promptTranslation 用户输入翻译失败; error message => " + e.getMessage()); + throw new RuntimeException(e); + + } finally { + response.close(); + } + + log.info("promptTranslation 用户输入翻译失败,返回用户输入"); + return text; + } + } diff --git a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java index 1f56a4a9..48f3655a 100644 --- a/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java @@ -121,7 +121,7 @@ public class GenerateServiceImpl extends ServiceImpl i String text = generateThroughImageTextDTO.getText(); Long elementId = generateThroughImageTextDTO.getCollectionElementId(); validateGeneraType(generate, text, elementId, generateType); - if (generateType.equals("text") || generateType.equals("text-image")) { + if (!StringUtil.isNullOrEmpty(text)) { text = modifyPrompt(text, generate, generateThroughImageTextDTO.getLevel1Type()); } @@ -255,24 +255,25 @@ public class GenerateServiceImpl extends ServiceImpl i private String modifyPrompt(String userInput, Generate generate, String level1Type) { String text = ""; + String translated = pythonService.promptTranslate(userInput); switch (level1Type) { case "Moodboard": - text = userInput + ",high quality"; + text = translated + ",high quality"; generate.setText(text); break; case "Printboard": if (userInput.contains("Painting Style")) { - userInput = "Picasso,increased color saturation,increased glossiness," + userInput; + userInput = "Picasso,increased color saturation,increased glossiness," + translated; } else if (userInput.contains("Illustration Style")) { - userInput = "Flat coating,romantic,soft,pencil strokes,accentuating and widening the depth of pencil strokes,paper patterns,block colors,crayons,reducing image contrast,and hand drawn painting marks," + userInput; + userInput = "Flat coating,romantic,soft,pencil strokes,accentuating and widening the depth of pencil strokes,paper patterns,block colors,crayons,reducing image contrast,and hand drawn painting marks," + translated; } else if (userInput.contains("Real Style")) { - userInput = "Still life photography,hyper realism,3d,deepened projection,increased permutation value,increased concavity and convexity value," + userInput; + userInput = "Still life photography,hyper realism,3d,deepened projection,increased permutation value,increased concavity and convexity value," + translated; } text = userInput + ", fabric print, high quality"; generate.setText(text); break; case "Sketchboard": - text = "clear lines, simple outlines monochrome white vector image of " + userInput + ", no background, sketch flat, front view display, best quality, ultra-high resolution 8k"; + text = "clear lines, simple outlines monochrome white vector image of " + translated + ", no background, sketch flat, front view display, best quality, ultra-high resolution 8k"; generate.setText(text); default: } From d41bc284d4f576e9fb0202a4fc9485586e38d37a Mon Sep 17 00:00:00 2001 From: xupei Date: Fri, 10 May 2024 17:11:49 +0800 Subject: [PATCH 88/93] =?UTF-8?q?Alipay-HK=20=E6=8E=A5=E5=85=A5=20?= =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...-3015240422190522-merchant.private.key.txt | 28 ++ ...CREATE LIMITED.merchant.aqs.public.key.pem | 9 + .../com/ai/da/common/task/GenerateTask.java | 21 ++ .../common/utils/AlipayHKEncryptionUtil.java | 329 ++++++++++++++++++ .../da/common/utils/AlipayHKRequestUtil.java | 53 +++ .../com/ai/da/common/utils/SendEmailUtil.java | 42 +++ .../ai/da/controller/AlipayHKController.java | 22 ++ .../da/model/dto/AlipayHKParametersDTO.java | 18 + .../ai/da/model/dto/AlipayHKRequestDTO.java | 24 ++ .../ai/da/model/dto/AlipayHKResponseDTO.java | 22 ++ .../ai/da/model/dto/DesignSingleItemDTO.java | 10 +- .../java/com/ai/da/python/PythonService.java | 4 +- .../com/ai/da/python/vo/DesignPythonItem.java | 37 +- .../com/ai/da/service/AlipayHKService.java | 4 + .../da/service/impl/AlipayHKServiceImpl.java | 98 ++++++ src/main/resources/alipay-hk.properties | 11 + 16 files changed, 707 insertions(+), 25 deletions(-) create mode 100644 files/CODE-CREATE LIMITED-3015240422190522-merchant.private.key.txt create mode 100644 files/CODE-CREATE LIMITED.merchant.aqs.public.key.pem create mode 100644 src/main/java/com/ai/da/common/task/GenerateTask.java create mode 100644 src/main/java/com/ai/da/common/utils/AlipayHKEncryptionUtil.java create mode 100644 src/main/java/com/ai/da/common/utils/AlipayHKRequestUtil.java create mode 100644 src/main/java/com/ai/da/controller/AlipayHKController.java create mode 100644 src/main/java/com/ai/da/model/dto/AlipayHKParametersDTO.java create mode 100644 src/main/java/com/ai/da/model/dto/AlipayHKRequestDTO.java create mode 100644 src/main/java/com/ai/da/model/dto/AlipayHKResponseDTO.java create mode 100644 src/main/java/com/ai/da/service/AlipayHKService.java create mode 100644 src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java create mode 100644 src/main/resources/alipay-hk.properties diff --git a/files/CODE-CREATE LIMITED-3015240422190522-merchant.private.key.txt b/files/CODE-CREATE LIMITED-3015240422190522-merchant.private.key.txt new file mode 100644 index 00000000..b8487446 --- /dev/null +++ b/files/CODE-CREATE LIMITED-3015240422190522-merchant.private.key.txt @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC1XpZ0+EIoJvQk +GHAdpcpr35S+UnxNdOE+1sZsIDWuyzXG0d6vOudITmYFTqVzJRaAArhwp+NQ/R9y +onsuUsEc0x2qTntySYMedHfI2TSl6qTsqpHykSLr6u0E4TuYUiGs/nf3t0A/rEvm +KK6OP4vNgUlANhOKDwiCAdmJkiOBEHJwLsN1xlcnBkUR0Wr+uauVo+A0opkM7HrB +aXXTcy+gpold+uCgCbRzFCiDr0uKsLJgb3Ce1aXTwa8k2dDg6mzhE0U65yhsNzjC +Cqg+g8tfEVha9Nrsmd6hG2iFHnk4rCqRXhjuI1V10GiZUppMWJtGD2tj7ZK0XXKh +5sAclu9RAgMBAAECggEBAKSQy8IclKKsHbA2wFwWV6Ijv2olnAYH/G0xId9wJmWQ +mx3oxb6Hmt3fzPAZ2UOuLkk+rq4Bl9+fnQ494bk5e2G1KWCjT512mFNk6F9EvmGh +k73uUvkeueoIQsG/wHxIYaf/SUlqbBCaPE/9L82AWVDBc36g0n/dfiHAnesWv8JV +agiTF/SIWDPtzRaVh8VObFOusHdqnRuLqV7n0FSVJePSNBFSSOz5XTttOtM4whg8 +kw3jlCHbVMVKtPYcebxGf0vkDapyGJiZ6wc1rD4MXJTciG+WQNfNE+Af2UB606VC +Nlq/CRkXr2Ix9ASSMeE4TcH+0EoxeITpP2NV+3hAzgECgYEA7mWSd6HgPXMdwO33 +efmx0qky+I/4bhicG9Go6021fRY+jUhRcj6VtDWBzuZwblgTSiDH4t2TbfB+hvQD +GVTJNc21+hXEVNu0ajqLuMiCgqaZCeNeJYYYowbLSbYd4t/nQh1vCZ/44aRWqG8G +eWEGruMaqSlGyFG7kyaoQaY1X6ECgYEAwsMGiupkNZ/JU3PZd2X2X+37b8BXcIt7 +itL413GDiLwCNII5pArD7GHYFQzN4GaUCt/VjrRXbTY1xYCk2RA0FyBMsxAGa+eH +9iTSLQvDJpxV/44UY3L9ZFcz4t0WjRcsdqPt30yUBNWiAIGcjtae2tMvtfxKICLQ +sYXAS+ciMbECgYEA4tnerV5pfq/7QSpw0y4Ky5ZcPXDqiwF6E3LH1dlleTlgnpqR +fjAVzp0X/+UCWc4P1PsqmjQU5YnzLMIn7MPkkAFHSEnMQJ+sp2U8rcKHhoG3oVQt +s3FOIlwFuAfHmqtLaXuOvM7wSu9R0weLVpdAf8z2AsCXbWlxH86qT4Y0xeECgYBM +NJkbw8i//qx8vciqYjf7oxeNy1mrTLhjQldhnSXVW5MVTpsVJ60vkb1Fx0PK+PgW +JSzfcIsAzYROqh5WXHO1VMsOCUgp8mcNlayzOXX7ZpJzsvkhTH3/Q+umadGIFTgt +l8jcZY9JMPn5br1+WlW/04BImdW7K0QzId1zFZYYkQKBgQDqswTLEpbBDOE/3uk4 +laZ9kTLJMP/hVmDJ0/jbETMdCkzIORnr3xFxmZIHG17E2In9PVumD0ESCh7qbCDE +isbfLSgfJR6ItdOM6W2R0GAsXQ3e0byBpR7qm0j9J3zYRhQwfVbZtkX0uywB9a/4 +q2bz4491ESrbryx16FZKUJeX8g== +-----END PRIVATE KEY----- diff --git a/files/CODE-CREATE LIMITED.merchant.aqs.public.key.pem b/files/CODE-CREATE LIMITED.merchant.aqs.public.key.pem new file mode 100644 index 00000000..39a68d27 --- /dev/null +++ b/files/CODE-CREATE LIMITED.merchant.aqs.public.key.pem @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtV6WdPhCKCb0JBhwHaXK +a9+UvlJ8TXThPtbGbCA1rss1xtHerzrnSE5mBU6lcyUWgAK4cKfjUP0fcqJ7LlLB +HNMdqk57ckmDHnR3yNk0peqk7KqR8pEi6+rtBOE7mFIhrP5397dAP6xL5iiujj+L +zYFJQDYTig8IggHZiZIjgRBycC7DdcZXJwZFEdFq/rmrlaPgNKKZDOx6wWl103Mv +oKaJXfrgoAm0cxQog69LirCyYG9wntWl08GvJNnQ4Ops4RNFOucobDc4wgqoPoPL +XxFYWvTa7JneoRtohR55OKwqkV4Y7iNVddBomVKaTFibRg9rY+2StF1yoebAHJbv +UQIDAQAB +-----END PUBLIC KEY----- diff --git a/src/main/java/com/ai/da/common/task/GenerateTask.java b/src/main/java/com/ai/da/common/task/GenerateTask.java new file mode 100644 index 00000000..6d13d68f --- /dev/null +++ b/src/main/java/com/ai/da/common/task/GenerateTask.java @@ -0,0 +1,21 @@ +package com.ai.da.common.task; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class GenerateTask { + + @Scheduled(cron = "0 0 */1 * * ?") + public void generateScheduled(){ + log.info("测试定时器:generate"); + + try{ + + }catch(Exception e){ + + } + } +} diff --git a/src/main/java/com/ai/da/common/utils/AlipayHKEncryptionUtil.java b/src/main/java/com/ai/da/common/utils/AlipayHKEncryptionUtil.java new file mode 100644 index 00000000..205c7f94 --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/AlipayHKEncryptionUtil.java @@ -0,0 +1,329 @@ +package com.ai.da.common.utils; + +import com.ai.da.model.dto.AlipayHKParametersDTO; +import com.ai.da.model.dto.AlipayHKRequestDTO; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.util.io.pem.PemObject; +import org.bouncycastle.util.io.pem.PemReader; +import org.springframework.beans.factory.annotation.Value; + +import javax.crypto.*; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.security.*; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Base64; +import java.util.HashMap; +import java.util.UUID; + +@Slf4j +public class AlipayHKEncryptionUtil { + + @Value("${alipay.hk.merchant-id}") + private static String merchantId; + + @Value("${alipay.hk.segment-id}") + private static String segmentId; + + @Value("${alipay.hk.AESKey}") + private static String aesKey; + + @Value("${alipay.hk.rsaPrivateKey}") + private static String privateKeyPath; + + @Value("${alipay.hk.rsaPublicKey}") + private static String publicKeyPath; + + /** + * 加密 + * @param param + * @param serviceName + * @return + * @throws NoSuchPaddingException + * @throws NoSuchAlgorithmException + * @throws InvalidAlgorithmParameterException + * @throws InvalidKeyException + * @throws IllegalBlockSizeException + * @throws BadPaddingException + * @throws IOException + */ + public static AlipayHKRequestDTO AESCBCWithRSA(HashMap param, String serviceName) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, IOException { + // Pre-shared secret key, DO NOT hardcode this key + String key = aesKey; + // The path to the rsa private key file, DO NOT save this key to a publicly accessible location + // 使用私钥创建数字签名 + // Mode, aes-128-cbc for 128bit key + String mode = "aes-128-cbc"; + // Padding mode + String padding = "pkcs7"; + // signature alogrithm + String signatureAlgorithm = "rsa-sha256"; +// String signatureAlgorithm = "SHA256withRSA"; + // Message body + AlipayHKParametersDTO requestMessage = new AlipayHKParametersDTO(); + requestMessage.setService(serviceName); + requestMessage.setMerchant_id(merchantId); + requestMessage.setRequest_time(Long.toString(System.currentTimeMillis() / 1000L)); + requestMessage.setRequest_uuid(UUID.randomUUID().toString()); +// HashMap param = new HashMap<>(); + requestMessage.setParameters(param); + /*String orderRef = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); + param.put("order_ref", orderRef); + param.put("amount", 208.12); + param.put("subject", "四月帳單 April Bill"); + param.put("wallet", "ALIPAYHK"); + param.put("segment_id", segmentId); + param.put("payment_solution", "WAP");*/ + + + // Serialize message body + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String content = gson.toJson(requestMessage); + + // Secure random iv 获取随机种子 + SecureRandom secureRandom = new SecureRandom(); + byte[] iv = new byte[16]; //NEVER REUSE THIS IV WITH THE SAME KEY + secureRandom.nextBytes(iv); + + // Algorithms + String alogrithm = "AES/CBC/PKCS5Padding"; + + // 创建 AES 密钥对象 + SecretKey secretKey = new SecretKeySpec(key.getBytes(), "AES"); + // 为加密算法提供一个随机的初始化向量,以增强加密安全性 + IvParameterSpec parameterSpec = new IvParameterSpec(iv); + // 创建 Cipher 对象 + Cipher cipher = Cipher.getInstance(alogrithm); + // 初始化为加密模式 Cipher.ENCRYPT_MODE + cipher.init(Cipher.ENCRYPT_MODE, secretKey, parameterSpec); + + // Cipher text 对请求内容加密 + byte[] cipherText = cipher.doFinal(content.getBytes()); + + // Concat iv and cipher text for signing + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + outputStream.write(iv); + outputStream.write(cipherText); + byte signMessage[] = outputStream.toByteArray(); + + // Sign key 读取rsa私钥文件,解析并得到私钥对象 privateKey + String rsaPrivateKeyPath = privateKeyPath; + PrivateKey privateKey = null; + byte[] signature; + try { + privateKey = readPrivateKeyFromFile(rsaPrivateKeyPath); + Signature signer = Signature.getInstance("SHA256withRSA"); + signer.initSign(privateKey); + // 将加密内容和随机向量均加签 + signer.update(signMessage); + signature = signer.sign(); + } catch (SignatureException e) { + throw new RuntimeException(e); + } catch (Exception e) { + log.error(e.getMessage()); + throw new RuntimeException(e); + } + + Base64.Encoder encoder = Base64.getEncoder(); + // Combine result + AlipayHKRequestDTO alipayHKRequestDTO = new AlipayHKRequestDTO(); + alipayHKRequestDTO.setMerchant_id(merchantId); + alipayHKRequestDTO.setNonce(encoder.encodeToString(iv)); + alipayHKRequestDTO.setMessage(encoder.encodeToString(cipherText)); + alipayHKRequestDTO.setTag(encoder.encodeToString(signature)); + String cipherSuite = mode + "-" + padding + "-with-" + signatureAlgorithm; + alipayHKRequestDTO.setCipher_suite(cipherSuite); + + // Encode to json + String jsonEncoded = JSONObject.toJSONString(alipayHKRequestDTO); + log.info(jsonEncoded); + +// String info = AlipayHKRequestUtil.createOrder(alipayHKRequestDTO); +// log.info(info); + return alipayHKRequestDTO; + + } + + /** + * 从文件中读取RSA私钥 + * @param filePath + * @return + * @throws Exception + */ + private static PrivateKey readPrivateKeyFromFile(String filePath) throws Exception { + BufferedReader reader = new BufferedReader(new FileReader(filePath)); + StringBuilder keyBuffer = new StringBuilder(); + String line; + + // 读取文本文件中的内容 + while ((line = reader.readLine()) != null) { + keyBuffer.append(line); + } + reader.close(); + + // 去除私钥内容中的头部和尾部信息 + String privateKeyContent = keyBuffer.toString() + .replace("-----BEGIN PRIVATE KEY-----", "") + .replace("-----END PRIVATE KEY-----", "") + .replaceAll("\\s+", ""); // 去除空格、换行等字符 + + // 进行 Base64 解码 + byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyContent); + + // 根据 PKCS8 格式的私钥字节数组构造私钥对象 + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes); + return keyFactory.generatePrivate(keySpec); + } + + /** + * 使用 AES 密钥和随机向量进行解密 + */ + public static String decryptAES(String encryptedText, String iv) throws Exception { + byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText); + byte[] ivBytes = Base64.getDecoder().decode(iv); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + SecretKeySpec secretKeySpec = new SecretKeySpec(aesKey.getBytes(), "AES"); + IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes); + + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); + byte[] decryptedBytes = cipher.doFinal(encryptedBytes); + + return new String(decryptedBytes, StandardCharsets.UTF_8); + } + + public static void test() throws Exception { + // 加密数据 + AlipayHKParametersDTO requestMessage = new AlipayHKParametersDTO(); + requestMessage.setService("create_order"); + requestMessage.setMerchant_id(merchantId); + requestMessage.setRequest_time(Long.toString(System.currentTimeMillis() / 1000L)); + requestMessage.setRequest_uuid(UUID.randomUUID().toString()); + HashMap param = new HashMap<>(); + requestMessage.setParameters(param); + String orderRef = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); + param.put("order_ref", orderRef); + param.put("amount", 208.12); + param.put("subject", "四月帳單 April Bill"); + param.put("wallet", "ALIPAYHK"); + param.put("segment_id", segmentId); + param.put("payment_solution", "WAP"); + Gson gson = new Gson(); + String plaintext = gson.toJson(requestMessage); + System.out.println(plaintext); + + // 生成 AES 密钥 + String key = aesKey; + SecretKey aesKey = new SecretKeySpec(key.getBytes(), "AES"); + + // 使用 RSA 公钥加密 AES 密钥 + String rsaPublicKeyPath = publicKeyPath; + PublicKey publicKey = readPublicKey(new File(rsaPublicKeyPath)); + + Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); +// Cipher rsaCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + rsaCipher.init(Cipher.ENCRYPT_MODE, publicKey); + byte[] encryptedAesKey = rsaCipher.doFinal(aesKey.getEncoded()); + + // 使用 AES-128-CBC 加密数据 + Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + byte[] ivBytes = generateRandomIV(aesCipher.getBlockSize()); + IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); + + aesCipher.init(Cipher.ENCRYPT_MODE, aesKey, ivSpec); + byte[] encryptedData = aesCipher.doFinal(plaintext.getBytes()); + + // 数字签名(使用 RSA 私钥) + String rsaPrivateKeyPath = privateKeyPath; + PrivateKey privateKey = readPrivateKeyFromFile(rsaPrivateKeyPath); + Signature signer = Signature.getInstance("SHA256withRSA"); + signer.initSign(privateKey); + signer.update(encryptedData); + byte[] signatureBytes = signer.sign(); + Base64.Encoder encoder = Base64.getEncoder(); + + // 将加密后的数据和签名进行Base64编码 + String base64EncryptedData = Base64.getEncoder().encodeToString(encryptedData); + String base64Signature = Base64.getEncoder().encodeToString(signatureBytes); + + // 输出加密后的数据和签名 + System.out.println("加密后的数据:" + base64EncryptedData); + System.out.println("数字签名:" + base64Signature); + + + HashMap result = new HashMap(); + result.put("merchant_id",merchantId); + result.put("nonce", encoder.encodeToString(ivBytes)); + result.put("message", encoder.encodeToString(encryptedData)); + result.put("tag", encoder.encodeToString(signatureBytes)); + + String mode = "aes-128-cbc"; + // Padding mode + String padding = "pkcs7"; + // signature alogrithm + String signatureAlgorithm = "rsa-sha256"; + String cipherSuite = mode + "-" + padding + "-with-" + signatureAlgorithm; + result.put("cipher_suite", cipherSuite); + + System.out.println("map 格式:" + result); + // Encode to json + String jsonEncoded = JSONObject.toJSONString(result); + System.out.println("json 格式:" + jsonEncoded); + + AlipayHKRequestDTO alipayHKRequestDTO = new AlipayHKRequestDTO(); + alipayHKRequestDTO.setMerchant_id(merchantId); + alipayHKRequestDTO.setNonce(encoder.encodeToString(ivBytes)); + alipayHKRequestDTO.setMessage(encoder.encodeToString(encryptedData)); + alipayHKRequestDTO.setTag(encoder.encodeToString(signatureBytes)); + alipayHKRequestDTO.setCipher_suite(cipherSuite); + +// String info = AlipayHKRequestUtil.createOrder(result); +// log.info(info); + + // 解密和验证 +// byte[] decryptedAesKey = rsaCipher.doFinal(encryptedAesKey); + byte[] decryptedAesKey = rsaCipher.doFinal(aesKey.getEncoded()); + SecretKey decryptedAesSecretKey = new SecretKeySpec(decryptedAesKey, "AES"); + + aesCipher.init(Cipher.DECRYPT_MODE, decryptedAesSecretKey, ivSpec); + byte[] decryptedData = aesCipher.doFinal(Base64.getDecoder().decode(base64EncryptedData)); + + // 验证数字签名 + Signature verifier = Signature.getInstance("SHA256withRSA"); + verifier.initVerify(publicKey); + verifier.update(decryptedData); + boolean signatureValid = verifier.verify(Base64.getDecoder().decode(base64Signature)); + + System.out.println("解密后的数据:" + new String(decryptedData)); + System.out.println("数字签名验证结果:" + signatureValid); + } + + public static PublicKey readPublicKey(File file) throws Exception { + KeyFactory factory = KeyFactory.getInstance("RSA"); + + try (FileReader keyReader = new FileReader(file); + PemReader pemReader = new PemReader(keyReader)) { + + PemObject pemObject = pemReader.readPemObject(); + byte[] content = pemObject.getContent(); + X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(content); + return factory.generatePublic(pubKeySpec); + } + } + + private static byte[] generateRandomIV(int blockSize) { + SecureRandom random = new SecureRandom(); + byte[] iv = new byte[blockSize]; + random.nextBytes(iv); + return iv; + } +} diff --git a/src/main/java/com/ai/da/common/utils/AlipayHKRequestUtil.java b/src/main/java/com/ai/da/common/utils/AlipayHKRequestUtil.java new file mode 100644 index 00000000..331c01ed --- /dev/null +++ b/src/main/java/com/ai/da/common/utils/AlipayHKRequestUtil.java @@ -0,0 +1,53 @@ +package com.ai.da.common.utils; + +import com.ai.da.common.config.exception.BusinessException; +import com.ai.da.model.dto.AlipayHKRequestDTO; +import com.alibaba.fastjson.serializer.SerializerFeature; +import lombok.extern.slf4j.Slf4j; +import okhttp3.*; + +import java.io.IOException; +import java.time.Instant; +import java.util.concurrent.TimeUnit; + +import com.alibaba.fastjson.JSONObject; + +@Slf4j +public class AlipayHKRequestUtil { + + public static String createOrder(AlipayHKRequestDTO alipayHKRequestDTO) throws IOException { + OkHttpClient client = new OkHttpClient().newBuilder() + .connectTimeout(30, TimeUnit.SECONDS) + .pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒) + .readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒) + .writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒) + .build(); + MediaType mediaType = MediaType.parse("application/json;charset=utf-8"); + long epochMilli = Instant.now().toEpochMilli(); + log.info("Alipay-HK send request unix timestamp: {}", epochMilli); + + String jsonString = JSONObject.toJSONString(alipayHKRequestDTO, SerializerFeature.WriteMapNullValue); + log.info(jsonString); + + RequestBody body = RequestBody.create(mediaType, jsonString); + + Request request = new Request.Builder() +// .url("https://aqs-api.sandbox-codpayment.com") + .url("https://aqs-api.sandbox-codpayment.com/v1/service") + .method("POST", body) + .addHeader("Content-Type", "application/json;charset=utf-8") + .build(); + Response response = null; + String bodyString; + try { +// log.info("generateSketchOrPrint请求入参content###{}", JSON.toJSONString(alipayHKRequestDTO, SerializerFeature.WriteMapNullValue)); + response = client.newCall(request).execute(); + } catch (Exception e) { +// log.error("PythonService##generateSketchOrPrint异常###{}", ExceptionUtil.getThrowableList(ioException)); +// throw new BusinessException("generate.interface.error"); + throw new BusinessException(e.getMessage()); + } + return response.body().string(); + } + +} diff --git a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java index 5ffbd110..7b3f3d3e 100644 --- a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java +++ b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java @@ -308,4 +308,46 @@ public class SendEmailUtil { throw new BusinessException("failed.to.send.mail"); } } + + private final static Long GENERATE_EXCEPTION_WARNING_ID = 122589L; + public static void sendGenerateExceptionWarning(String message){ + try { + // 实例化一个认证对象 + Credential cred = new Credential(SECRET_ID, SECRET_KEy); + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("ses.tencentcloudapi.com"); + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + SesClient client = new SesClient(cred, "ap-hongkong", clientProfile); + SendEmailRequest req = new SendEmailRequest(); + req.setFromEmailAddress(CODE_CREATE_SEND_ADDRESS); + req.setDestination(new String[]{"xupei3360@163.com"}); + + // 根据邮件类型设置不同的主题和模板 + String subject = ""; + Template template = new Template(); + subject = "Warning: AiDA 3.0 Generate Exception Warning"; + template.setTemplateID(GENERATE_EXCEPTION_WARNING_ID); + + JSONObject parameter = new JSONObject(); + parameter.put("errorMessage", message); + parameter.put("time", DateUtil.dateToStr(new Date(), DateUtil.YYYY_MM_DD_HH_MM_SS)); + + template.setTemplateData(parameter.toJSONString()); + + req.setSubject(subject); + req.setTemplate(template); + + // 发送邮件 + SendEmailResponse resp = client.SendEmail(req); + log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp)); + } catch (TencentCloudSDKException e) { + log.info("邮件发送失败###{}", e.toString()); + throw new BusinessException("failed.to.send.mail"); + } + } + + + + } diff --git a/src/main/java/com/ai/da/controller/AlipayHKController.java b/src/main/java/com/ai/da/controller/AlipayHKController.java new file mode 100644 index 00000000..9b2fca11 --- /dev/null +++ b/src/main/java/com/ai/da/controller/AlipayHKController.java @@ -0,0 +1,22 @@ +package com.ai.da.controller; + +import com.ai.da.common.response.Response; +import io.swagger.annotations.Api; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@CrossOrigin +@RestController +@RequestMapping("/api/ali-pay-hk") +@Api(tags = "网站支付 香港支付宝") +@Slf4j +public class AlipayHKController { + + public Response createOrder(){ + return Response.success(); + } + + +} diff --git a/src/main/java/com/ai/da/model/dto/AlipayHKParametersDTO.java b/src/main/java/com/ai/da/model/dto/AlipayHKParametersDTO.java new file mode 100644 index 00000000..69d38a2e --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/AlipayHKParametersDTO.java @@ -0,0 +1,18 @@ +package com.ai.da.model.dto; + +import lombok.*; + +import java.util.HashMap; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AlipayHKParametersDTO { + + private String request_uuid; + private String request_time; + private String service; + private String merchant_id; + private HashMap parameters; + +} diff --git a/src/main/java/com/ai/da/model/dto/AlipayHKRequestDTO.java b/src/main/java/com/ai/da/model/dto/AlipayHKRequestDTO.java new file mode 100644 index 00000000..005fa9dd --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/AlipayHKRequestDTO.java @@ -0,0 +1,24 @@ +package com.ai.da.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AlipayHKRequestDTO implements Serializable { + + private String merchant_id; + + private String nonce; + + private String message; + + private String tag; + + private String cipher_suite; + +} diff --git a/src/main/java/com/ai/da/model/dto/AlipayHKResponseDTO.java b/src/main/java/com/ai/da/model/dto/AlipayHKResponseDTO.java new file mode 100644 index 00000000..a6bd9953 --- /dev/null +++ b/src/main/java/com/ai/da/model/dto/AlipayHKResponseDTO.java @@ -0,0 +1,22 @@ +package com.ai.da.model.dto; + +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AlipayHKResponseDTO { + + private boolean success; + + private String reference_id; + + private JSONObject result; + + private String error; + + private String error_code; +} diff --git a/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java b/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java index 77b8b431..099708e5 100644 --- a/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java +++ b/src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java @@ -48,9 +48,9 @@ public class DesignSingleItemDTO { @ApiModelProperty("图层优先级") private Integer priority; - @ApiModelProperty("渐变 起始/目标 颜色") - private List> gradient; - - @ApiModelProperty("渐变角度") - private Float gradient_angle; +// @ApiModelProperty("渐变 起始/目标 颜色") +// private List> gradient; +// +// @ApiModelProperty("渐变角度") +// private Float gradient_angle; } diff --git a/src/main/java/com/ai/da/python/PythonService.java b/src/main/java/com/ai/da/python/PythonService.java index d8220f51..ddabb8c2 100644 --- a/src/main/java/com/ai/da/python/PythonService.java +++ b/src/main/java/com/ai/da/python/PythonService.java @@ -2596,9 +2596,7 @@ public class PythonService { pythonTAllInfoService.getImageIdByPath(designSingleItem.getPath()), designSingleItem.getOffset(), designSingleItem.getScale(), - designSingleItem.getPriority(), - designSingleItem.getGradient(), - designSingleItem.getGradient_angle())); + designSingleItem.getPriority())); }); diff --git a/src/main/java/com/ai/da/python/vo/DesignPythonItem.java b/src/main/java/com/ai/da/python/vo/DesignPythonItem.java index 5e327086..1bbbfa45 100644 --- a/src/main/java/com/ai/da/python/vo/DesignPythonItem.java +++ b/src/main/java/com/ai/da/python/vo/DesignPythonItem.java @@ -74,9 +74,12 @@ public class DesignPythonItem { */ private Integer priority; - private List> gradient; - - private Float gradient_angle; + /** + * 渐变图片的minio地址 + */ + private String gradient; +// +// private Float gradient_angle; public static List OUTWEAR_DRESS_BLOUSE = Arrays.asList(CollectionLevel2TypeEnum.OUTWEAR.getRealName(), CollectionLevel2TypeEnum.DRESS.getRealName(), CollectionLevel2TypeEnum.BLOUSE.getRealName()); @@ -126,20 +129,20 @@ public class DesignPythonItem { this.priority = priority; } - public DesignPythonItem(String type, String path, String color, DesignPythonItemPrint print, Long businessId, Long image_id, List offset, Float resize_scale,Integer priority, List> gradient, Float gradient_angle) { - this.type = type; - this.path = path; - this.color = color; - this.print = print; -// this.icon = icon; - this.businessId = businessId; - this.image_id = image_id; - this.offset = offset; - this.resize_scale = resize_scale; - this.priority = priority; - this.gradient = gradient; - this.gradient_angle = gradient_angle; - } +// public DesignPythonItem(String type, String path, String color, DesignPythonItemPrint print, Long businessId, Long image_id, List offset, Float resize_scale,Integer priority) { +// this.type = type; +// this.path = path; +// this.color = color; +// this.print = print; +//// this.icon = icon; +// this.businessId = businessId; +// this.image_id = image_id; +// this.offset = offset; +// this.resize_scale = resize_scale; +// this.priority = priority; +//// this.gradient = gradient; +//// this.gradient_angle = gradient_angle; +// } public DesignPythonItem(String type, String path, String color, DesignPythonItemPrint print, String icon, Long businessId, Long image_id) { this.type = type; diff --git a/src/main/java/com/ai/da/service/AlipayHKService.java b/src/main/java/com/ai/da/service/AlipayHKService.java new file mode 100644 index 00000000..baf56c8e --- /dev/null +++ b/src/main/java/com/ai/da/service/AlipayHKService.java @@ -0,0 +1,4 @@ +package com.ai.da.service; + +public interface AlipayHKService { +} diff --git a/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java b/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java new file mode 100644 index 00000000..4445c6cb --- /dev/null +++ b/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java @@ -0,0 +1,98 @@ +package com.ai.da.service.impl; + +import com.ai.da.common.enums.CreditsEventsEnum; +import com.ai.da.service.AlipayHKService; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; + +@Service +@Slf4j +public class AlipayHKServiceImpl implements AlipayHKService { + + @Value("${alipay.hk.merchant-id}") + private static String merchantId; + + @Value("${alipay.hk.segment-id}") + private static String segmentId; + + @Value("${alipay.hk.AESKey}") + private static String aesKey; + + @Value("${alipay.hk.rsaPrivateKey}") + private static String privateKeyPath; + + @Value("${alipay.hk.rsaPublicKey}") + private static String publicKeyPath; + + + /** + * 创建订单 + */ + public void createOrder(Integer amount){ + + HashMap param = new HashMap<>(); + String orderRef = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); + param.put("order_ref", orderRef); + param.put("amount", Integer.parseInt(CreditsEventsEnum.PRICE.getValue()) * amount); + param.put("subject", "AiDA Credits Purchase"); + param.put("wallet", "ALIPAYHK"); + param.put("segment_id", segmentId); + param.put("payment_solution", "WAP"); + + + } + + + /** + * 异步回调 + * @return + */ + public void callback(){ + + } + + + + + + + + + + + + + + + + public static String decrypt(String message){ + String text = "{\"success\":true,\"reference_id\":\"d4f55a35-8725-40f3-8279-37ea95837741\",\"result\":{\"nonce\":\"tUsbfFrNWcZZYrN3dWQHNQ==\",\"message\":\"6wCHtIMRXXgj0TOV7jtvCzbKc+gWEnqbgAD5pMx4sIvliL65EF+btKRheJI/0gssOj0PdwUPYLlgjTdSWQZraQLU4F05FGSYJ7lNxFZ1tXLvhUv4ukiCz0xyPJIQ5vvNH/SmQ5iIQvMO/fTg6ZiZj2I+Oahzy5h2/cXmrXBEedNFZSGIVFKMuipul3QcFEO+qQQcOHOiRDAXrhF1+qoq4GROBpcKhu5WMHxUGDHj0l/tY2Rp004FNwfArbOeR5TusgMMgm7aE8IqpFJ6w4zES1lS903fHJzFWcqKMwB9tYoxnegoHSNmOVeokgBCvLOI2uVJCWN4ZqVq1mmhoib4zVxjex+pgoMtHPvV+Gjy+IB2PA5YCid0vH9WymkBkYZIioW1KH587G3lTTEWrzTc+JWWd+yIxD1nofZxAi0t+EFOgyab2HRawdpWpkwKH5XqoZ05yj0Vl0u7nWcF4GLytC5wTWyPOU3Ua/ePlniU/z5BWZkUQGWXWSKhyEmt53mx3UUXbC6/zfk1jcbyEGHonCimmf88Xl9yE3ae02xoRsDO8bcnzCRD88UWUi3UySWNmxdYDTdWj0wCU27nmLMLjkXvesRl2CfuZbkbDxDQHHKkT1DX4XoSU+vmUmSpH7IBCHXoq+SYHfRmfDsAYv7WmiJOQeo7i3RogLnBej0bFimY5JHhWBT69FVPc0aRi19eTz9L7grjLKz92+hbb4Qj7yvb08RvMUabv1juy4YHGulE73EVoLS6+FRBdEY8ZmIFq5lQcwMKb63/v+V/63AHP+oCDMzZZ7wKmQ5+UkgKcXgxToTOzulesQXD8urGcjGUwLnJviilIQywH1XFdcnDNWv95DdOB3nQ3HorqTFC+0kZMdTCO1L7zRbZQxWoExB41wQW3CNLvEkJlpaUv5TWKkep1wcT2PKFbuSVPnFnVnxZ7qNdlVLmBzEs9nX15C61+a28gFij4wj6ed8LIJwT4KapfZAFWwl2V2KmonqiXKk60/StBK9/dWHGfZ4ysPvXBB+fxJj3hR36Vu4HceNVYg+9tf5zEJ79J664iiyEFdyKzORlXnsJF33oPKC0+cuH1qhBzyf/o6t86F4DbpMBb2xhFRt1mDgFrV40JhT+2+iLCIqUmATBYsAYZZ9XIyi3vyaRGhgdd1ND/bhddALm/GKD4AJUo8FKtdkerYSbk/TpPLhvbrEFSDpkCT+JoOLiF4EzqRwZOrQklaXBOS67aaATRBzDxKJuFSGuFAWAIdLHhXcj/wDmnh1fqj03D4NmNmVSw7wKmt1OjI9arh6Ua1Mp7+1g+NT4BEdRnPYQX3CeiyRa0RUNyWxFDYZPGGpjSVNLf0vrzRh3hLEGBUlHXCza0SWuARkGmS6YdsvJr3gt+RlxXtrnI0LC0lgi9/Vw5zM5dGYX24tUOqCEA/9/FVvVZddfimYhmP44+ST1xTDgDw0rtVZQrcQjEg4UCcFq\"}}\n"; + + String str = "6wCHtIMRXXgj0TOV7jtvCzbKc+gWEnqbgAD5pMx4sIvliL65EF+btKRheJI/0gssOj0PdwUPYLlgjTdSWQZraQLU4F05FGSYJ7lNxFZ1tXLvhUv4ukiCz0xyPJIQ5vvNH/SmQ5iIQvMO/fTg6ZiZj2I+Oahzy5h2/cXmrXBEedNFZSGIVFKMuipul3QcFEO+qQQcOHOiRDAXrhF1+qoq4GROBpcKhu5WMHxUGDHj0l/tY2Rp004FNwfArbOeR5TusgMMgm7aE8IqpFJ6w4zES1lS903fHJzFWcqKMwB9tYoxnegoHSNmOVeokgBCvLOI2uVJCWN4ZqVq1mmhoib4zVxjex+pgoMtHPvV+Gjy+IB2PA5YCid0vH9WymkBkYZIioW1KH587G3lTTEWrzTc+JWWd+yIxD1nofZxAi0t+EFOgyab2HRawdpWpkwKH5XqoZ05yj0Vl0u7nWcF4GLytC5wTWyPOU3Ua/ePlniU/z5BWZkUQGWXWSKhyEmt53mx3UUXbC6/zfk1jcbyEGHonCimmf88Xl9yE3ae02xoRsDO8bcnzCRD88UWUi3UySWNmxdYDTdWj0wCU27nmLMLjkXvesRl2CfuZbkbDxDQHHKkT1DX4XoSU+vmUmSpH7IBCHXoq+SYHfRmfDsAYv7WmiJOQeo7i3RogLnBej0bFimY5JHhWBT69FVPc0aRi19eTz9L7grjLKz92+hbb4Qj7yvb08RvMUabv1juy4YHGulE73EVoLS6+FRBdEY8ZmIFq5lQcwMKb63/v+V/63AHP+oCDMzZZ7wKmQ5+UkgKcXgxToTOzulesQXD8urGcjGUwLnJviilIQywH1XFdcnDNWv95DdOB3nQ3HorqTFC+0kZMdTCO1L7zRbZQxWoExB41wQW3CNLvEkJlpaUv5TWKkep1wcT2PKFbuSVPnFnVnxZ7qNdlVLmBzEs9nX15C61+a28gFij4wj6ed8LIJwT4KapfZAFWwl2V2KmonqiXKk60/StBK9/dWHGfZ4ysPvXBB+fxJj3hR36Vu4HceNVYg+9tf5zEJ79J664iiyEFdyKzORlXnsJF33oPKC0+cuH1qhBzyf/o6t86F4DbpMBb2xhFRt1mDgFrV40JhT+2+iLCIqUmATBYsAYZZ9XIyi3vyaRGhgdd1ND/bhddALm/GKD4AJUo8FKtdkerYSbk/TpPLhvbrEFSDpkCT+JoOLiF4EzqRwZOrQklaXBOS67aaATRBzDxKJuFSGuFAWAIdLHhXcj/wDmnh1fqj03D4NmNmVSw7wKmt1OjI9arh6Ua1Mp7+1g+NT4BEdRnPYQX3CeiyRa0RUNyWxFDYZPGGpjSVNLf0vrzRh3hLEGBUlHXCza0SWuARkGmS6YdsvJr3gt+RlxXtrnI0LC0lgi9/Vw5zM5dGYX24tUOqCEA/9/FVvVZddfimYhmP44+ST1xTDgDw0rtVZQrcQjEg4UCcFq"; + try { +// String s = decryptAES(str, "tUsbfFrNWcZZYrN3dWQHNQ=="); +// log.info(s); + } catch (Exception e) { + throw new RuntimeException(e); + } + return null; + + } + + + + + public static void main(String[] args) throws Exception { +// test(); +// AESCBCWithRSA(); +// decrypt(); + } + + +} diff --git a/src/main/resources/alipay-hk.properties b/src/main/resources/alipay-hk.properties new file mode 100644 index 00000000..bba6e790 --- /dev/null +++ b/src/main/resources/alipay-hk.properties @@ -0,0 +1,11 @@ +alipay.hk.merchant-id=3015240422190522 + +alipay.hk.segment-id=2971373831 + +alipay.hk.AESKey=UzRC2CncDUP6VlEd + +alipay.hk.rsaPrivateKey=files/CODE-CREATE LIMITED-3015240422190522-merchant.private.key.txt + +alipay.hk.rsaPublicKey=files/CODE-CREATE LIMITED.merchant.aqs.public.key.pem + +alipay.hk.api.url=https://aqs-api.sandbox-codpayment.com/ \ No newline at end of file From bc85e3307455e4a91add8c44ec26a53eca9698e8 Mon Sep 17 00:00:00 2001 From: xupei Date: Thu, 16 May 2024 18:19:01 +0800 Subject: [PATCH 89/93] =?UTF-8?q?paypal=20=E6=94=B6=E6=AC=BE=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E5=88=87=E6=8D=A2=E5=88=B0live?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/paypal-sandbox.properties | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/resources/paypal-sandbox.properties b/src/main/resources/paypal-sandbox.properties index 1b48960c..3b0eaef2 100644 --- a/src/main/resources/paypal-sandbox.properties +++ b/src/main/resources/paypal-sandbox.properties @@ -1,12 +1,12 @@ # developer-sandbox-xp -paypal.client-id=ATbaebYi7-GXWRWJqwRLYMzKEbwjh4BFRqD4Y13i4lZq0rplWIM_IpPrtPKpdkAt_KrPXd6IJTwsDqa5 -paypal.client-secret=EHWWJqGmmbfjLXqCUpGrvxRYBPPtWvA3hR5ZaAyHlGSVJiHoQPS8skbNaJ9h39VObnchUbgiY2pPu__s -paypal.receiver.email=sb-ukxfk29608925@business.example.com -paypal.mode=sandbox +#paypal.client-id=ATbaebYi7-GXWRWJqwRLYMzKEbwjh4BFRqD4Y13i4lZq0rplWIM_IpPrtPKpdkAt_KrPXd6IJTwsDqa5 +#paypal.client-secret=EHWWJqGmmbfjLXqCUpGrvxRYBPPtWvA3hR5ZaAyHlGSVJiHoQPS8skbNaJ9h39VObnchUbgiY2pPu__s +#paypal.receiver.email=sb-ukxfk29608925@business.example.com +#paypal.mode=sandbox # local #paypal.webhook_id=31797347YC028794L # dev -paypal.webhook_id=51V87014T6406322F +#paypal.webhook_id=51V87014T6406322F # aida-sandbox-kim #paypal.client-id=AbDDH8jnTrKqjnWLFgEu6LogYzVz2ZLuirE4W54t1M4lrofrP5OzXfhbxqktLLFB-rAO9KeYQVYFJ_tO @@ -16,8 +16,8 @@ paypal.webhook_id=51V87014T6406322F #paypal.webhook_id=1WH327112B602422N # aida-live-kim -#paypal.client-id=ASWSIZ3MXJU5w5VOeOHeigWcSw6iinl30ZCipruziKpHclxP0ryf8-7VKG1Ba2VwZwa2DMvGEzTfCTgz -#paypal.client-secret=EHQg_K5PSqmp4FJlzEcOEH_kFkmq4aBzaI7jridw53L6cOQRULBAnfv2KakRfrsqaU1PDSkO4Co9Vyxc -#paypal.receiver.email=kimwong@code-create.com.hk -#paypal.mode=live -#paypal.webhook_id=41L14847MC833625B \ No newline at end of file +paypal.client-id=ASWSIZ3MXJU5w5VOeOHeigWcSw6iinl30ZCipruziKpHclxP0ryf8-7VKG1Ba2VwZwa2DMvGEzTfCTgz +paypal.client-secret=EHQg_K5PSqmp4FJlzEcOEH_kFkmq4aBzaI7jridw53L6cOQRULBAnfv2KakRfrsqaU1PDSkO4Co9Vyxc +paypal.receiver.email=kimwong@code-create.com.hk +paypal.mode=live +paypal.webhook_id=41L14847MC833625B \ No newline at end of file From 9f4dbda1524279489b573e990613f5be0c061011 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Fri, 17 May 2024 10:39:00 +0800 Subject: [PATCH 90/93] =?UTF-8?q?TASK:=E6=97=A0=E6=96=B0=E5=A2=9E=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E9=82=AE=E4=BB=B6;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/da/common/config/MyTaskScheduler.java | 5 +++ .../com/ai/da/common/utils/SendEmailUtil.java | 36 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java index f505796e..6e443ba9 100644 --- a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java +++ b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java @@ -127,6 +127,11 @@ public class MyTaskScheduler { } catch (IOException e) { e.printStackTrace(); } + }else { + SendEmailUtil.sendNoExcelEmail("1023316923@qq.com", null); + SendEmailUtil.sendNoExcelEmail("calvinwong@aidlab.hk", null); + SendEmailUtil.sendNoExcelEmail("kaicpang.pang@connect.polyu.hk", null); + SendEmailUtil.sendNoExcelEmail("kimwong@code-create.com.hk", null); } } } diff --git a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java index 6653c7da..73c4eb17 100644 --- a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java +++ b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java @@ -134,6 +134,8 @@ public class SendEmailUtil { private final static Long NOTIFICATION_TEMPLATE_ID = 117216L; private final static Long NOTIFICATION_CHINESE_TEMPLATE_ID = 122229L; private final static Long TRIAL_ORDER_LIST_ID = 122273L; + private final static Long NO_TRIAL_ORDER_LIST_ID = 122591L; + public static void sendCustomEmail(String receiverAddress, String senderAddress, TrialOrder trialOrder, int emailType, String country) { try { // 实例化一个认证对象 @@ -227,6 +229,40 @@ public class SendEmailUtil { throw new BusinessException("failed.to.send.mail"); } } + + + public static void sendNoExcelEmail(String receiverAddress, String senderAddress) { + try { + // 实例化一个认证对象 + Credential cred = new Credential(SECRET_ID, SECRET_KEy); + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("ses.tencentcloudapi.com"); + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + SesClient client = new SesClient(cred, "ap-hongkong", clientProfile); + SendEmailRequest req = new SendEmailRequest(); + if (StringUtils.isEmpty(senderAddress)) { + senderAddress = SEND_ADDRESS; + } + req.setFromEmailAddress(senderAddress); + req.setDestination(new String[]{receiverAddress}); + + // 根据邮件类型设置不同的主题和模板 + String subject = ""; + Template template = new Template(); + subject = "昨日试用订单数据"; + template.setTemplateID(NO_TRIAL_ORDER_LIST_ID); + + req.setSubject(subject); + req.setTemplate(template); + // 发送邮件 + SendEmailResponse resp = client.SendEmail(req); + log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp)); + } catch (TencentCloudSDKException e) { + log.info("邮件发送失败###{}", e.toString()); + throw new BusinessException("failed.to.send.mail"); + } + } private final static Long WILLBEEXPIRED_TEMPLATE_ID = 118178L; public static void sendWillBeExpiredEmail(Account account, String senderAddress) { try { From a726ceca5953165bfe52d93341871bacc86b6076 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Fri, 17 May 2024 11:40:38 +0800 Subject: [PATCH 91/93] =?UTF-8?q?TASK:=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-prod.properties | 14 +++++++++----- src/main/resources/application-test.properties | 14 +++++++++----- src/main/resources/application.properties | 2 +- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index af7d6688..66c958ee 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -1,11 +1,15 @@ server.port=5567 #datasource -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.url=jdbc:mysql://18.167.251.121:3306/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true -spring.datasource.username=root -spring.datasource.password=QWa998345 -#spring.datasource.password=QWa998345 +spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.primary.jdbcUrl=jdbc:mysql://18.167.251.121:3306/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +spring.datasource.primary.username=root +spring.datasource.primary.password=QWa998345 + +spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.secondary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/attribute_retrieval_new?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +spring.datasource.secondary.username=aida_con +spring.datasource.secondary.password=123456 #security spring.security.jwtSecret=JWTSECRET diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index 28eaf8ac..f86bba1a 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -1,11 +1,15 @@ server.port=5567 #datasource -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.url=jdbc:mysql://18.167.251.121:33008/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true -spring.datasource.username=aida_con -spring.datasource.password=123456 -#spring.datasource.password=QWa998345 +spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.primary.jdbcUrl=jdbc:mysql://18.167.251.121:3306/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +spring.datasource.primary.username=root +spring.datasource.primary.password=QWa998345 + +spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.secondary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/attribute_retrieval_new?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +spring.datasource.secondary.username=aida_con +spring.datasource.secondary.password=123456 #security spring.security.jwtSecret=JWTSECRET diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 974fee23..4135ec12 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -5,4 +5,4 @@ #spring.profiles.active=prod #����application-dev�ļ�(��������) -spring.profiles.active=dev +spring.profiles.active=test From c73876e8b02f77f480f34dece3059b9cec4c95ce Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Fri, 17 May 2024 12:13:35 +0800 Subject: [PATCH 92/93] =?UTF-8?q?TASK:=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ai/da/common/RabbitMQ/MQConfig.java | 8 +++---- src/main/resources/application-dev.properties | 3 +-- .../resources/application-prod.properties | 21 ++++++++++++------- .../resources/application-test.properties | 21 ++++++++++++------- src/main/resources/application.properties | 2 +- 5 files changed, 34 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java index 7079f02a..637fc94e 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java @@ -12,16 +12,16 @@ public class MQConfig { // public static final String GENERATE_QUEUE = "generate-queue-test"; // ================================================================== // public static final String GENERATE_QUEUE = "generate-queue-local"; - public static final String GENERATE_QUEUE = "generate-queue-dev"; + public static final String GENERATE_QUEUE = "generate-queue-prod"; // public static final String SR_QUEUE = "SR-queue-local"; - public static final String SR_QUEUE = "SR-queue-dev"; + public static final String SR_QUEUE = "SR-queue-prod"; // public static final String SR_RESULT_QUEUE = "SuperResolution-local"; - public static final String SR_RESULT_QUEUE = "SuperResolution-dev"; + public static final String SR_RESULT_QUEUE = "SuperResolution-prod"; // public static final String GENERATE_RESULT_QUEUE = "GenerateImage-local"; - public static final String GENERATE_RESULT_QUEUE = "GenerateImage-dev"; + public static final String GENERATE_RESULT_QUEUE = "GenerateImage-prod"; public MQConfig() { } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 63a1a5be..b57dad01 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -1,5 +1,6 @@ server.port=5567 +#datasource spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.primary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/aida?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true spring.datasource.primary.username=aida_con @@ -10,8 +11,6 @@ spring.datasource.secondary.jdbcUrl=jdbc:mysql://18.167.251.121:33008/attribute_ spring.datasource.secondary.username=aida_con spring.datasource.secondary.password=123456 - - #security spring.security.jwtSecret=JWTSECRET spring.security.jwtTokenHeader=Authorization diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 66c958ee..14ff67a9 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -19,7 +19,8 @@ spring.security.jwtTokenPrefix=Bearer- spring.security.jwtExpiration=8640000000 #spring security权限设置 认证了token还要认证权限 不然报错Full authentication is required to access this resource spring.security.ignorePaths=/,/favicon.ico,/doc.html,/webjars/**,/swagger-resources,/v2/api-docs,\ - /api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/**,/api/generate/**,/api/workspace/**,/api/classification/**,/api/inquiry/** + /api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/**,/api/generate/**,/api/workspace/**,/api/classification/**,\ + /api/product/**,/api/ali-pay/**,/api/order-info/**,/api/paypal/**,/api/credits/**,/api/inquiry/**,/api/tasks/**,/api/python/prepareForSR spring.security.authApi=/auth/login @@ -27,8 +28,7 @@ rsa.private_key=MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8 #mybatis mybatis-plus.global-config.banner=false -mybatis-plus.mapper-locations=classpath:mapper/*Mapper.xml -#mybatis-plus.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl +mybatis-plus.mapper-locations=classpath:mapper/*/*.xml mybatis-plus.global-config.db-config.logic-delete-field=isDeleted mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0 @@ -47,6 +47,7 @@ spring.servlet.multipart.max-request-size= 10MB access.python.ip=http://18.167.251.121 #access.python.ip=http://18.167.251.121:9991/ access.python.port=9990 +access.python.sr=http://18.167.251.121:9994 minio.endpoint=https://www.minio.aida.com.hk:9000 minio.accessKey=admin @@ -75,7 +76,13 @@ spring.redis.lettuce.pool.max-idle=8 spring.redis.lettuce.pool.min-idle=0 spring.redis.lettuce.pool.max-wait=5 -redis.key.consumptionOrder=ConsumptionOrder -redis.key.cancelSet=CancelSet -redis.key.exceptionMap=ExceptionMap -redis.key.resultMap=ResultMap \ No newline at end of file +redis.key.orderForGenerate=OrderForGenerate +redis.key.generateCancelSet=GenerateCancelSet +redis.key.generateExceptionMap=Generate:Exception +redis.key.resultMap=ResultMap +redis.key.orderForSR=OrderForSR +redis.key.SRCancelSet=SRCancelSet +redis.key.SRExceptionMap=SRExceptionMap +redis.key.taskList=TaskList +redis.key.credits.pre-deduction=Credits:PreDeduction +redis.key.generateResult=Generate:Result \ No newline at end of file diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index f86bba1a..31595f52 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -19,7 +19,8 @@ spring.security.jwtTokenPrefix=Bearer- spring.security.jwtExpiration=8640000000 #spring security权限设置 认证了token还要认证权限 不然报错Full authentication is required to access this resource spring.security.ignorePaths=/,/favicon.ico,/doc.html,/webjars/**,/swagger-resources,/v2/api-docs,\ - /api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/**,/api/generate/**,/api/workspace/**,/api/classification/** + /api/account/**,/api/element/**,/api/python/**,/api/design/**,/api/history/**,/api/library/**,/api/third/party/**,/api/generate/**,/api/workspace/**,/api/classification/**,\ + /api/product/**,/api/ali-pay/**,/api/order-info/**,/api/paypal/**,/api/credits/**,/api/inquiry/**,/api/tasks/**,/api/python/prepareForSR spring.security.authApi=/auth/login @@ -27,8 +28,7 @@ rsa.private_key=MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8 #mybatis mybatis-plus.global-config.banner=false -mybatis-plus.mapper-locations=classpath:mapper/*Mapper.xml -#mybatis-plus.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl +mybatis-plus.mapper-locations=classpath:mapper/*/*.xml mybatis-plus.global-config.db-config.logic-delete-field=isDeleted mybatis-plus.global-config.db-config.logic-delete-value=1 mybatis-plus.global-config.db-config.logic-not-delete-value=0 @@ -47,6 +47,7 @@ spring.servlet.multipart.max-request-size= 10MB access.python.ip=http://18.167.251.121 #access.python.ip=http://18.167.251.121:9991/ access.python.port=9992 +access.python.sr=http://18.167.251.121:9994 minio.endpoint=https://www.minio.aida.com.hk:9000 minio.accessKey=admin @@ -75,7 +76,13 @@ spring.redis.lettuce.pool.max-idle=8 spring.redis.lettuce.pool.min-idle=0 spring.redis.lettuce.pool.max-wait=5 -redis.key.consumptionOrder=ConsumptionOrder -redis.key.cancelSet=CancelSet -redis.key.exceptionMap=ExceptionMap -redis.key.resultMap=ResultMap \ No newline at end of file +redis.key.orderForGenerate=OrderForGenerate +redis.key.generateCancelSet=GenerateCancelSet +redis.key.generateExceptionMap=Generate:Exception +redis.key.resultMap=ResultMap +redis.key.orderForSR=OrderForSR +redis.key.SRCancelSet=SRCancelSet +redis.key.SRExceptionMap=SRExceptionMap +redis.key.taskList=TaskList +redis.key.credits.pre-deduction=Credits:PreDeduction +redis.key.generateResult=Generate:Result \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 4135ec12..974fee23 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -5,4 +5,4 @@ #spring.profiles.active=prod #����application-dev�ļ�(��������) -spring.profiles.active=test +spring.profiles.active=dev From 12c447d6b0512aa7fba8c29c479d617ed89224de Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Fri, 17 May 2024 12:14:20 +0800 Subject: [PATCH 93/93] =?UTF-8?q?TASK:=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java index 637fc94e..7079f02a 100644 --- a/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java +++ b/src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java @@ -12,16 +12,16 @@ public class MQConfig { // public static final String GENERATE_QUEUE = "generate-queue-test"; // ================================================================== // public static final String GENERATE_QUEUE = "generate-queue-local"; - public static final String GENERATE_QUEUE = "generate-queue-prod"; + public static final String GENERATE_QUEUE = "generate-queue-dev"; // public static final String SR_QUEUE = "SR-queue-local"; - public static final String SR_QUEUE = "SR-queue-prod"; + public static final String SR_QUEUE = "SR-queue-dev"; // public static final String SR_RESULT_QUEUE = "SuperResolution-local"; - public static final String SR_RESULT_QUEUE = "SuperResolution-prod"; + public static final String SR_RESULT_QUEUE = "SuperResolution-dev"; // public static final String GENERATE_RESULT_QUEUE = "GenerateImage-local"; - public static final String GENERATE_RESULT_QUEUE = "GenerateImage-prod"; + public static final String GENERATE_RESULT_QUEUE = "GenerateImage-dev"; public MQConfig() { }