2240 Commits

Author SHA1 Message Date
litianxiang
e4940019bf 框选适配py 2026-03-27 15:19:38 +08:00
litianxiang
0da66ff210 print t2i模型替换 2026-03-27 15:16:33 +08:00
litianxiang
76eeb2be53 moodboard基础模型修改 2026-03-25 10:39:22 +08:00
litianxiang
cb6f94d2d4 py api fix 2026-03-25 10:19:06 +08:00
litianxiang
28656c44c8 FIX FLUX2 2026-03-24 16:24:43 +08:00
litianxiang
6757a89d04 Pattern模式参数fix 2026-03-24 15:54:53 +08:00
litianxiang
9be1a1e307 加锁解决不同线程读取前还未保存的问题 2026-03-24 15:49:16 +08:00
litianxiang
2168978f61 print pattern也改为flux2 2026-03-24 15:32:06 +08:00
litianxiang
54466b935d debug 2026-03-24 15:23:33 +08:00
litianxiang
c970ebe691 debug 2026-03-24 15:15:59 +08:00
litianxiang
1c5a3a12b9 debug 2026-03-24 15:04:40 +08:00
litianxiang
6e06000083 debug 2026-03-24 14:46:01 +08:00
litianxiang
dea2b3be42 debug 2026-03-24 14:29:08 +08:00
litianxiang
bcf51aea23 debug 2026-03-24 14:20:39 +08:00
litianxiang
0c9d5404c6 flux2失败状态判断 2026-03-24 14:05:27 +08:00
litianxiang
93429839c0 本地flux改为flux2 2026-03-24 13:39:38 +08:00
litianxiang
27859c3e28 Merge remote-tracking branch 'origin/release/3.1' into dev/3.1_release_merge 2026-03-23 14:11:33 +08:00
litianxiang
f02c0930a6 日志切面(controller层报错打印) 2026-03-23 13:56:47 +08:00
litianxiang
d57bb83b25 Merge remote-tracking branch 'origin/release/3.1' into release/3.1 2026-03-23 13:50:44 +08:00
731e34f133 TO DEV 2026-03-23 13:38:10 +08:00
75eca8d6ba Merge branch 'release/3.1' into dev/3.1_release_merge
# Conflicts:
#	src/main/java/com/ai/da/python/PythonService.java
2026-03-23 13:22:18 +08:00
3e53401f76 TASK:返回符合查询条件的金额总计 2026-03-23 11:55:07 +08:00
litianxiang
b6a068ebcd SKETCHBOARD传入的text改为获取第一个,为分割获取style的方式 2026-03-23 11:50:24 +08:00
litianxiang
dc291ea086 加入非空校验 2026-03-14 01:50:39 +08:00
litianxiang
2e846e671a romantic风格缺少下装fix 2026-03-13 10:06:26 +08:00
litianxiang
a5093311f9 当style为洛丽塔时无sketch和谷歌风控问题FIX 2026-03-12 19:06:54 +08:00
litianxiang
aed338a6d7 当style为洛丽塔时无sketch和谷歌风控问题FIX 2026-03-12 18:59:17 +08:00
litianxiang
8bdb49d25c 当style为洛丽塔时无sketch和谷歌风控问题FIX 2026-03-12 18:49:57 +08:00
litianxiang
5d53a8cd42 当style为洛丽塔时无sketch和谷歌风控问题FIX 2026-03-12 18:49:28 +08:00
litianxiang
61b7f3072f 当style为洛丽塔时无sketch和谷歌风控问题FIX 2026-03-12 18:36:21 +08:00
litianxiang
a1f489f3a1 比赛url修改 2026-03-12 17:39:05 +08:00
litianxiang
fc3fd877a8 transpose和rotate获取位置修改 2026-03-05 16:58:17 +08:00
litianxiang
fc72d2c430 transpose和rotate获取位置修改 2026-03-05 13:29:14 +08:00
litianxiang
1ac01dd090 测试token恢复 2026-02-25 16:36:06 +08:00
litianxiang
3bbdf7c672 fix:按编号导出参赛选手文件 2026-02-09 10:33:25 +08:00
litianxiang
0646484fba 按编号导出参赛选手文件 2026-02-09 10:21:40 +08:00
litianxiang
96b8613741 映射temp到服务器 2026-02-06 17:29:42 +08:00
litianxiang
cf30226a51 映射temp到服务器 2026-02-06 17:24:43 +08:00
litianxiang
3c15a3ff68 映射temp到服务器 2026-02-06 17:21:07 +08:00
litianxiang
0c904be227 测试临时token 2026-02-06 11:42:34 +08:00
litianxiang
7759b56123 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2026-02-05 17:39:15 +08:00
litianxiang
d5bfaa8822 fix:允许图生图不带提示词 2026-02-05 17:38:38 +08:00
967c0cbc01 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2026-02-05 16:55:24 +08:00
417e34b41a BUGFIX:1.首次design没有使用library和生成的印花2.design overall印花太小 2026-02-05 16:54:45 +08:00
litianxiang
d51aa84647 fix:参赛者根据链接返回文件参数 2026-02-05 09:41:10 +08:00
litianxiang
5895bc6ab6 Revert "fix:参赛者根据链接返回文件参数"
This reverts commit 3301869f20.
2026-02-05 09:40:35 +08:00
litianxiang
3301869f20 fix:参赛者根据链接返回文件参数 2026-02-05 09:40:15 +08:00
litianxiang
1ec42f4ad5 fix:参赛者id逻辑更改 2026-02-04 17:20:22 +08:00
cc506ff7e9 Merge branch 'dev/3.1_release_merge' into release/3.1 2026-02-04 17:05:59 +08:00
litianxiang
f2d43f06f4 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2026-02-04 15:28:08 +08:00
litianxiang
9251df49f8 比赛新增文件大小和视频时长 2026-02-04 15:27:51 +08:00
430156f4e8 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2026-02-04 14:48:38 +08:00
litianxiang
d1123aedcc fix:导出为页面下载 2026-02-04 14:45:11 +08:00
8c007077a3 BUGFIX: detail中的merge模式下没有存储partialDesign的图片 2026-02-04 14:43:29 +08:00
litianxiang
d63b4b4e63 fix:参赛选手加入编号 2026-02-04 14:03:30 +08:00
litianxiang
b826f0bf39 参赛选手加入编号,增加导出功能 2026-02-04 13:41:16 +08:00
litianxiang
1decd8e258 参赛选手加入编号,增加导出功能 2026-02-04 13:41:09 +08:00
litianxiang
1286e84488 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev-ltx 2026-02-04 13:21:19 +08:00
a252fdf7f9 BUGFIX: detail中的default模式报错 2026-02-03 16:56:15 +08:00
807d802178 TASK:motion 参数数据类型变更 2026-02-02 15:30:04 +08:00
53f1b548be CONFIG 2026-02-02 15:28:54 +08:00
45dd78032a BUGFIX: 1.token过期,重新登录无法解决 2.motion生成参数数据类型变更 2026-02-02 15:04:27 +08:00
c160da5132 BUGFIX: token过期,重新登录无法解决 2026-02-02 14:57:32 +08:00
b23faeeee2 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2026-02-02 13:32:55 +08:00
67789abca4 TASK:getAllPose id的数据类型改为整型 2026-02-02 13:32:27 +08:00
1c78d66aab Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2026-01-30 17:14:50 +08:00
528bc69923 BUGFIX: design single merge模式下取消传递print及elements等元素 2026-01-30 17:10:37 +08:00
litianxiang
22880d128d Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev-ltx 2026-01-30 15:40:25 +08:00
9c56a102cc Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2026-01-29 14:38:20 +08:00
2f59fe074f BUGFIX: 管理员修改用户身份为游客 2026-01-29 14:37:54 +08:00
9c61b1c8fe Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2026-01-29 10:12:47 +08:00
e30fdf7401 BUGFIX:模特上传,事务管理不统一导致library出现孤儿数据 2026-01-29 10:10:21 +08:00
ba2d10afbc paymentMethodConfiguration切换 2026-01-28 15:41:52 +08:00
6146112d04 TO PROD 2026-01-27 16:39:39 +08:00
412550df27 BUGFIX:管理员查design频次与chart中获取到的数量有区别 2026-01-27 14:59:39 +08:00
497421e7fe TO DEV 2026-01-27 10:15:36 +08:00
891527426c Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge
# Conflicts:
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
2026-01-26 14:49:38 +08:00
litianxiang
3e334d7956 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev-ltx 2026-01-26 11:16:46 +08:00
litianxiang
8f0d0953b2 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2026-01-26 11:15:38 +08:00
f5c3621a5d bugfix: design like 2026-01-23 22:45:40 +08:00
litianxiang
9a1a0045e0 fix:like报错 2026-01-23 22:40:30 +08:00
6223c8e994 brandDNA 2026-01-23 22:25:01 +08:00
67bbee49fd Merge branch 'dev/3.1_release_merge' into release/3.1 2026-01-23 21:20:26 +08:00
ad62ceb32a Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2026-01-23 21:02:04 +08:00
082afe9e94 gradiant 置空 2026-01-23 20:57:48 +08:00
49288c3a31 TO Prod 2026-01-23 16:10:55 +08:00
81624e36db Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2026-01-23 15:12:15 +08:00
a526b122d1 Merge branch 'release/3.1' into dev/3.1_release_merge 2026-01-23 15:11:45 +08:00
litianxiang
d882b2e817 Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2026-01-23 15:05:22 +08:00
litianxiang
ebf6427d42 fix:用户特征存入逻辑错误 2026-01-23 15:04:59 +08:00
77fe03d361 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2026-01-23 11:46:31 +08:00
7a44d67dbf BUGFIX: 系统消息发布 广播时消息数量错误 2026-01-23 11:46:08 +08:00
55ce2c6c7e Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2026-01-23 10:54:35 +08:00
a426caaca3 BUGFIX: 系统消息发布 2026-01-23 10:54:03 +08:00
7cb7ce2836 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2026-01-22 16:56:11 +08:00
8e075f1da4 BUGFIX: 通过hsv批量获取潘通信息,替换rgb 2026-01-22 16:55:00 +08:00
litianxiang
0f0fde2a3e Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2026-01-22 14:28:37 +08:00
litianxiang
8c6389a1f6 删除不用的字段 2026-01-22 14:28:10 +08:00
652f82b6a4 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2026-01-22 13:56:44 +08:00
7ca2528dcf BUGFIX: design后未存储undivided layers 2026-01-22 13:56:07 +08:00
litianxiang
a7800913d2 Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2026-01-22 13:51:42 +08:00
litianxiang
1eaec64ff4 fix:GlobalAward读取配置错误 2026-01-22 13:51:13 +08:00
e603952332 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2026-01-22 11:37:25 +08:00
2bc8b8ef96 BUGFIX: single design的渐变色未存储 2026-01-22 11:36:43 +08:00
0ce968b919 BUGFIX: 用户登录时的有效期验证异常抛出导致事务回滚,用户信息修改失败 2026-01-22 10:37:23 +08:00
litianxiang
dfc9ae4db2 GlobalAward站内信url修改 2026-01-21 16:50:01 +08:00
litianxiang
a3505c6d95 GlobalAward站内信url修改 2026-01-21 15:09:45 +08:00
litianxiang
6db0afd515 GlobalAward保存成功发送站内信,根据url可跳转且召回已填写资料 2026-01-21 14:59:41 +08:00
litianxiang
b1e6183dd1 GlobalAward接口token验证,id更换为uuid 2026-01-21 14:34:43 +08:00
30d08356c0 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2026-01-21 14:14:17 +08:00
64cc29f456 TASK:Global Award邮箱验证 2026-01-21 14:13:33 +08:00
litianxiang
2b3e12a11c GlobalAward MINIO配置 2026-01-21 11:38:38 +08:00
litianxiang
d4a4724f61 GlobalAward拦截器配置 2026-01-21 10:35:22 +08:00
litianxiang
ba6e2bd24c GlobalAward拦截器配置 2026-01-21 10:21:17 +08:00
litianxiang
a38895b028 GlobalAward拦截器配置 2026-01-21 10:13:11 +08:00
litianxiang
69a95e66ca GlobalAward上传文件 2026-01-20 16:37:46 +08:00
litianxiang
40518cab37 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev-ltx
# Conflicts:
#	src/main/java/com/ai/da/controller/GlobalAwardController.java
#	src/main/java/com/ai/da/model/dto/ContestantDTO.java
#	src/main/resources/application-dev.properties
#	src/main/resources/application-prod.properties
2026-01-20 16:20:41 +08:00
litianxiang
46d61cb73f GlobalAward上传文件 2026-01-20 15:58:27 +08:00
08f20fd1fe Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2026-01-20 13:24:49 +08:00
d7edc166b3 TASK:Global Award邮箱验证 2026-01-20 13:14:50 +08:00
litianxiang
79ad02f66b fix:style为all时,like报错 2026-01-19 16:50:14 +08:00
litianxiang
5e261b55c7 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2026-01-19 16:41:02 +08:00
litianxiang
bc92fcbaf4 Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2026-01-19 16:40:58 +08:00
litianxiang
c6aec917c2 fix:style为all时,like报错 2026-01-19 16:40:28 +08:00
6bc500e78f Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2026-01-16 17:17:25 +08:00
4c43b98c02 TASK:DB中PartialDesign为空时,取undivided_layer作为merge_image_path 2026-01-16 17:17:04 +08:00
litianxiang
5bae785a9f Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2026-01-16 16:37:49 +08:00
litianxiang
7b619aa4cb GlobalAward首次提交 2026-01-16 16:37:03 +08:00
c93ad6daa9 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2026-01-16 16:24:38 +08:00
0047be7a03 BUGFIX:PartialDesign传空时,先从数据库获取原数据 2026-01-16 16:23:56 +08:00
4ef209cfd4 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2026-01-16 14:28:27 +08:00
a19751b4b7 BUGFIX:designType参数校验;print数据验空 2026-01-16 14:28:04 +08:00
litianxiang
bb0e5a4263 Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2026-01-16 11:04:52 +08:00
litianxiang
9e9df5367d fix:接口SegAnything返回值处理 2026-01-16 11:04:18 +08:00
ba8a2c52de Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2026-01-15 17:36:37 +08:00
39d8c7efcf TASK:取消存储/返回UndividedLayer和UndividedLayerWithSinglePrint字段 2026-01-15 17:35:55 +08:00
litianxiang
401910901a Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge
# Conflicts:
#	src/main/java/com/ai/da/python/PythonService.java
2026-01-15 17:21:30 +08:00
litianxiang
3f5ce6e0e7 接口SegAnything返回值处理 2026-01-15 17:17:08 +08:00
0787025151 TASK:merge 模式返回mask 2026-01-15 14:07:18 +08:00
08b26872ff Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2026-01-14 14:28:05 +08:00
5bbf1326bb TASK:design single部分cv操作前置,新增merge | default两种designType 2026-01-14 14:26:47 +08:00
litianxiang
c5e27cd220 Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2026-01-14 13:55:01 +08:00
litianxiang
112e9c3bc9 对接前端和py接口SegAnything 2026-01-14 13:31:33 +08:00
litianxiang
ce95cb5080 Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2026-01-12 14:42:02 +08:00
litianxiang
71211bfbc3 修改存入userPreference表的时间方式 2026-01-12 14:41:24 +08:00
72ad977dcb BUGFIX: 获取近期新用户图表数据允许userType为null 2026-01-12 11:55:43 +08:00
litianxiang
6400e79929 Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2026-01-09 14:49:25 +08:00
litianxiang
dd8c72f7d7 切换用户sketch点赞记录存储方式;新增镜像和角度字段,存储前端需要的object 2026-01-09 10:14:46 +08:00
13151b65f5 TASK:限制同一个管理员不允许绑定不同组织的订阅计划 2026-01-07 15:24:38 +08:00
9f523d5953 TASK:分页获取所有用户id,添加按邮箱模糊查询 2026-01-07 11:26:39 +08:00
4879cfeb60 BUGFIX: 2026-01-07 09:53:58 +08:00
9e252b16ef BUGFIX: 2026-01-06 17:36:12 +08:00
e64add14af BUGFIX:更新订阅计划时根据业务需要对参数进行判断并在需要时更新管理员信息 2026-01-06 17:29:33 +08:00
3beb27e491 TASK:获取用户id信息做分页;订阅计划添加国家或地区字段 2026-01-06 09:56:21 +08:00
501032ef17 TASK:试用用户试用期延长至7天 2025-12-31 13:15:13 +08:00
litianxiang
cb25bdd2e0 Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2025-12-29 14:57:41 +08:00
litianxiang
7a9fb0213b 适配新推荐接口 2025-12-29 13:49:31 +08:00
cd767dce6f BUGFIX:新用户不能获取历史系统通知 2025-12-24 11:47:11 +08:00
bf95b85841 to dev 2025-12-23 16:28:07 +08:00
9e58bd9e7d Merge branch 'release/3.1' into dev/3.1_release_merge
# Conflicts:
#	src/main/java/com/ai/da/common/utils/SendRequestUtil.java
2025-12-23 16:16:30 +08:00
d0ec5c5c26 BUGFIX:邮件发送失败 2025-12-23 16:03:48 +08:00
ab8aa5ea5c Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-12-23 14:07:53 +08:00
aefcd2fdb0 BUGFIX:邮件发送失败 2025-12-23 14:07:26 +08:00
e74eab1070 BUGFIX:邮件发送失败 2025-12-23 14:05:20 +08:00
litianxiang
34da437a26 Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2025-12-22 11:36:23 +08:00
litianxiang
f84935d0bd 登录token存入redis 2025-12-22 11:35:38 +08:00
35edaa0f27 CONFIG: 拦截器配置 2025-12-19 21:43:02 +08:00
f43099e19e CONFIG: redis 配置修改 2025-12-19 21:21:21 +08:00
8079877734 CONFIG: TO DEV 2025-12-19 17:40:37 +08:00
ef686e38ac CONFIG: TO PROD 2025-12-19 17:33:51 +08:00
100019d2a4 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2025-12-19 16:00:55 +08:00
litianxiang
12af237d76 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2025-12-19 15:47:36 +08:00
litianxiang
44dbbb2a4b 更换Moodboard和Printboard提示词 2025-12-19 15:47:07 +08:00
9f42e153a4 Merge branch 'release/3.1' into dev/3.1_release_merge
# Conflicts:
#	.gitea/workflows/develop_build_manual.yaml
2025-12-19 15:01:32 +08:00
4fa70a1c90 BUGFIX:订阅计划创建不允许指定子账号为管理员 2025-12-18 18:03:03 +08:00
dfb34916e7 BUGFIX:订阅计划与子账号新增 2025-12-18 14:52:12 +08:00
9f7987306c BUGFIX:订阅计划 2025-12-18 13:38:38 +08:00
litianxiang
d3fc70fbf2 fix:edit产品图照成排序问题,恢复原逻辑 2025-12-17 16:08:49 +08:00
litianxiang
17645d17e5 关闭batch MQ监听 2025-12-17 16:02:49 +08:00
litianxiang
258eea5277 edit 产品图失败会导致sort不对试验5 2025-12-17 15:43:26 +08:00
litianxiang
bb1d3bd359 Revert "edit 产品图失败会导致sort不对试验5"
This reverts commit 6a8c87ed95.
2025-12-17 15:41:02 +08:00
litianxiang
6a8c87ed95 edit 产品图失败会导致sort不对试验5 2025-12-17 15:40:47 +08:00
litianxiang
eb3826927d edit 产品图失败会导致sort不对试验4 2025-12-17 15:33:14 +08:00
litianxiang
7720c8c771 edit 产品图失败会导致sort不对试验3 2025-12-17 14:12:20 +08:00
litianxiang
b459148d58 edit 产品图失败会导致sort不对试验2 2025-12-17 13:49:07 +08:00
litianxiang
eadda18d1e Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2025-12-17 13:28:12 +08:00
litianxiang
d403df51ec edit 产品图失败会导致sort不对试验 2025-12-17 13:28:04 +08:00
6903b98b60 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2025-12-17 13:20:34 +08:00
81bf65515c Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-12-17 13:19:54 +08:00
8e984eb283 BUGFIX:订阅计划 2025-12-17 13:18:24 +08:00
litianxiang
afc6041570 临时测试修改 2025-12-17 13:10:09 +08:00
bce368248c Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-12-16 16:26:27 +08:00
ca7121dcda BUGFIX:订阅计划 2025-12-16 16:24:52 +08:00
litianxiang
9a206f9979 生产环境配置callbackUrl 2025-12-16 14:10:22 +08:00
litianxiang
eb7a46c7e8 fix:callbackUrl 2025-12-16 13:45:21 +08:00
litianxiang
95ef68a784 Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2025-12-16 13:20:31 +08:00
litianxiang
6429288fd9 dev环境加入design回调配置 2025-12-16 13:16:36 +08:00
c5af194876 BUGFIX 2025-12-16 10:42:31 +08:00
da84e1e4b4 注解修改 2025-12-15 18:39:16 +08:00
95a9c81a1b Merge branch 'dev/dev_xp' into dev/3.1_release_merge
# Conflicts:
#	src/main/java/com/ai/da/model/dto/SubscriptionPlanDTO.java
#	src/main/java/com/ai/da/model/vo/SubscriptionPlanVO.java
2025-12-15 18:34:30 +08:00
81c0d7eeac TASK:订阅计划相关 2025-12-15 18:30:28 +08:00
litianxiang
fbc473735c fix:对没有like的已发布作品进行二创,会不显示原作者名字 2025-12-15 15:41:58 +08:00
litianxiang
9f48a2ce09 fix:升级swagger注解 2025-12-15 13:38:44 +08:00
459c743ce4 CONFIG: 2025-12-11 16:58:24 +08:00
ce3516916d CONFIG: 2025-12-11 16:18:37 +08:00
0692b29065 Merge branch 'dev/dev_xp' into dev/3.1_release_merge
# Conflicts:
#	src/main/java/com/ai/da/controller/AccountController.java
2025-12-11 16:12:41 +08:00
94cafbd10c TASK:flux积分不足,邮件通知 2025-12-11 16:07:14 +08:00
5c2008ec4a TASK:订阅计划,测试修改 2025-12-11 15:26:20 +08:00
litianxiang
4e4b8bd4d2 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev-ltx 2025-12-11 15:12:22 +08:00
litianxiang
9c19d061be fix:升级swagger注解 2025-12-11 10:35:08 +08:00
7f094265da TASK:新增订阅计划概念 2025-12-11 09:44:25 +08:00
22bc8750c8 Merge branch 'dev-ltx' into dev/dev_xp 2025-12-03 16:53:17 +08:00
a940105fa4 DEV 数据库切换 2025-12-03 14:18:58 +08:00
4c0edf09bd Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-12-03 14:14:11 +08:00
bd69793a72 TASK:订阅到期通知或续订通知(暂时关闭邮件发送) 2025-12-03 13:55:52 +08:00
litianxiang
a643338916 fix:接口文档打不开问题pom更新 2025-12-02 15:43:16 +08:00
litianxiang
9344a946ad fix:接口文档打不开问题 2025-12-02 15:42:51 +08:00
fab0c7b372 更新 .gitea/workflows/develop_build_manual.yaml 2025-12-02 14:48:23 +08:00
fc0867d9b1 Merge branch 'dev/3.1_release_merge' into dev/dev_xp 2025-12-02 14:46:23 +08:00
c36ba6211a DEV 数据库切换 2025-12-02 14:34:12 +08:00
litianxiang
aa0a787e3f dev跨域问题初步验证 2025-12-02 14:27:31 +08:00
litianxiang
964ee1c5cc dev数据库切换 2025-12-02 14:18:18 +08:00
ac98cd01db DEV JDK版本升级,redis配置修改 2025-12-02 13:53:43 +08:00
70d498b90d 更新 .gitea/workflows/develop_build_manual.yaml 2025-12-02 13:14:26 +08:00
ae1a2eff2a 更新 .gitea/workflows/develop_build_manual.yaml 2025-12-02 13:12:38 +08:00
b54eaea7e3 更新 .gitea/workflows/develop_build_manual.yaml 2025-12-02 12:16:01 +08:00
aa2363b9a5 更新 .gitea/workflows/develop_build_manual.yaml 2025-12-02 12:11:04 +08:00
41ef9132e9 更新 .gitea/workflows/develop_build_manual.yaml 2025-12-02 11:05:42 +08:00
3b5b57ab08 更新 .gitea/workflows/develop_build_manual.yaml 2025-12-02 10:55:21 +08:00
2ec9ef3290 上传文件至「.gitea/workflows」 2025-12-02 10:49:14 +08:00
fe3fbbe135 DEV 切换数据库 2025-12-02 10:21:07 +08:00
01e82b4c23 Merge branch 'dev/3.1_release_merge' into dev/dev_xp 2025-12-01 17:11:03 +08:00
litianxiang
e085275aee Merge branch 'dev-ltx' into dev/3.1_release_merge
# Conflicts:
#	src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java
2025-12-01 17:10:35 +08:00
litianxiang
fa7271567e 解决循环依赖问题 2025-12-01 17:05:57 +08:00
05049ae7a2 [run build] 2025-12-01 16:39:26 +08:00
b023a68f83 Merge remote-tracking branch 'origin/dev/dev_xp' into dev/dev_xp 2025-12-01 16:02:20 +08:00
6cd42b799a 删除 .gitea/workflows/prod_build_schedule.yaml 2025-12-01 10:22:29 +08:00
6e1ed7f9b8 删除 .gitea/workflows/prod_build_manual.yaml 2025-12-01 10:22:25 +08:00
b7be16738b 删除 .gitea/workflows/develop_build_manual.yaml 2025-12-01 10:22:21 +08:00
6da5e91ec1 删除 .gitea/workflows/develop_build_commit.yaml 2025-12-01 10:22:17 +08:00
00c0a65547 删除 .gitea/workflows/prod_build_schedule.yaml 2025-12-01 10:22:09 +08:00
77aab576de 删除 .gitea/workflows/develop_build_manual.yaml 2025-12-01 10:22:06 +08:00
5b2c77f81b 删除 .gitea/workflows/develop_build_commit.yaml 2025-12-01 10:22:02 +08:00
96040f2349 删除 docker-compose.yml
All checks were successful
git commit 控制 AiDA back-java Develop 分支构建部署 / build_and_deploy (push) Has been skipped
2025-11-30 11:01:40 +08:00
a710fdd432 删除 docker-compose.yml 2025-11-30 11:01:12 +08:00
d598f53d3c Merge branch 'dev/3.1_release_merge' into release/3.1
# Conflicts:
#	.gitea/workflows/prod_build_schedule.yaml
2025-11-28 17:16:55 +08:00
62bf538d96 Merge branch 'dev/dev_xp' into dev/3.1_release_merge
All checks were successful
git commit 控制 AiDA back-java Develop 分支构建部署 / build_and_deploy (push) Has been skipped
2025-11-28 16:38:09 +08:00
456cb1ff19 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2025-11-28 16:37:56 +08:00
cbca666e7b BUGFIX: 账号重置为游客后,提示混乱 2025-11-28 16:36:34 +08:00
d622195f9d 更新 .gitea/workflows/develop_build_commit.yaml
All checks were successful
git commit 控制 AiDA back-java Develop 分支构建部署 / build_and_deploy (push) Has been skipped
2025-11-28 16:06:56 +08:00
1917fd518d 更新 docker-compose.yml
All checks were successful
手动 AiDA back-java Develop 分支构建部署 / build_and_deploy (push) Successful in 2m3s
[run build]
2025-11-28 15:35:50 +08:00
96170a9956 更新 .gitea/workflows/prod_build_manual.yaml 2025-11-28 15:25:50 +08:00
8205fb5290 上传文件至「.gitea/workflows」 2025-11-28 15:25:41 +08:00
8f72686809 添加 .gitea/workflows/prod_build_schedule.yaml
All checks were successful
手动 AiDA back-java Develop 分支构建部署 / build_and_deploy (push) Has been skipped
2025-11-28 15:18:20 +08:00
37ddf6f441 更新 .gitea/workflows/develop_build.yaml
All checks were successful
手动 AiDA back-java Develop 分支构建部署 / build_and_deploy (push) Has been skipped
2025-11-28 15:14:57 +08:00
dbf9b2d722 添加 .gitea/workflows/develop_build.yaml
Some checks failed
手动 AiDA back-java Develop 分支构建部署 / build_and_deploy (push) Has been cancelled
2025-11-28 15:13:48 +08:00
a91f9ccdd4 更新 .gitea/workflows/develop_build_manual.yaml 2025-11-28 15:09:33 +08:00
dac51afe73 添加 docker-compose.yml 2025-11-28 15:04:01 +08:00
3aa744895f 添加 .gitea/workflows/develop_build_manual.yaml 2025-11-28 14:55:50 +08:00
9535d8ce59 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-11-28 14:40:38 +08:00
6c8b316dfd BUGFIX: 添加已存在的账号为子账号,该账号有效期没有同步修改 2025-11-28 14:40:09 +08:00
e366d5a2c5 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-11-28 13:41:35 +08:00
b6add404b3 BUGFIX: 添加已存在的账号为子账号,该账号有效期没有同步修改 2025-11-28 13:36:46 +08:00
fcbe4762b3 TO prod 2025-11-27 17:38:24 +08:00
e750adcc94 TO prod 2025-11-27 17:35:47 +08:00
litianxiang
1c782f8fd7 dev fix:designSingle代码本地提交 sysfile加入style字段 2025-11-27 11:33:20 +08:00
litianxiang
b58b8df88f Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2025-11-26 16:14:09 +08:00
litianxiang
c09f734a30 fix:兼容老数据detail会创建新数据的问题 2025-11-26 16:13:39 +08:00
1464689657 TASK:视频生成完成站内信语言给中英双语 2025-11-26 10:09:59 +08:00
litianxiang
a2ff345da5 升级JDK到21 2025-11-25 16:46:05 +08:00
9ae1626309 Merge branch 'refs/heads/dev/3.1_release_merge' into dev/dev_xp 2025-11-25 14:25:59 +08:00
70a41bdfbc TASK:用户账号到期邮件通知 2025-11-25 14:24:30 +08:00
litianxiang
8757db4f3d Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2025-11-25 11:46:29 +08:00
litianxiang
a8e3304db2 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev-ltx 2025-11-25 11:45:49 +08:00
litianxiang
26f2299381 designSingle改为直接在源数据进行修改而不是逻辑删除再创建新数据 2025-11-25 11:45:09 +08:00
c1a5799da7 to dev 2025-11-25 10:15:32 +08:00
94c0e81335 BUGFIX: 打开佣金计算定时器 2025-11-25 10:10:14 +08:00
b9641474ba Merge branch 'release/3.1' into dev/3.1_release_merge 2025-11-22 00:42:20 +08:00
059d6edc12 BUGFIX: 查询affiliate时,不显示已删除的记录,删除affiliate时,状态也修改 2025-11-22 00:41:35 +08:00
97c5be7b22 CONFIG:修改第二数据源的库 2025-11-22 00:15:13 +08:00
c4da4ea111 CONFIG:to Prod 2025-11-21 17:09:53 +08:00
litianxiang
db1048d875 第二数据源修改库名 2025-11-21 16:49:07 +08:00
bbc8b025a9 CONFIG:to Prod 2025-11-20 16:57:48 +08:00
630f6b2737 Merge branch 'release/3.1' into dev/3.1_release_merge 2025-11-20 15:48:03 +08:00
d14fdfee79 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-11-20 11:11:21 +08:00
c14db62c0a BUGFIX:1.添加系统sketch到个人library 2.video生成结束后总是发送失败站内信 2025-11-20 11:09:20 +08:00
litianxiang
9166bf1a1a Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2025-11-20 10:50:17 +08:00
litianxiang
84c024eab8 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev-ltx 2025-11-20 10:48:57 +08:00
litianxiang
b86f3c9f7e 1.fix:高级工具转产品图不需要也没有ageGroup,会导致报错
2.上传sketch模板代码
2025-11-20 10:48:36 +08:00
e2009617db Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-11-19 17:00:29 +08:00
65b17fe109 TASK:调用第三方api,视频生成结束发送站内信 2025-11-19 16:59:54 +08:00
0917154283 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-11-19 15:58:11 +08:00
0f525c6c00 BUGFIX: 1.系统消息已读需判断接收人员 2.本地模型视频生成失败时,发送站内信 2025-11-19 15:57:47 +08:00
4beae1094b Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-11-18 17:45:53 +08:00
cefdac133e BUGFIX: 获取系统通知未读数 2025-11-18 17:45:11 +08:00
a466f269c2 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-11-18 16:04:37 +08:00
97f0c8f65f BUGFIX: 获取系统通知未读数 2025-11-18 16:02:26 +08:00
ad00ac08ca Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-11-18 14:10:24 +08:00
d236057f2a BUGFIX: 获取系统通知未读数 2025-11-18 14:09:58 +08:00
62e3e9c16f Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-11-18 13:32:16 +08:00
604c529b42 BUGFIX: 视频生成完成后,站内信通知 2025-11-18 13:31:18 +08:00
bc612481dc Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-11-18 10:28:44 +08:00
2f3fa695b2 BUGFIX: 解决部分循环注入问题 2025-11-18 10:27:29 +08:00
313fc19dac Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-11-17 16:56:50 +08:00
f36e0488ea TASK: video生成成功后添加站内信通知 2025-11-17 16:55:45 +08:00
f239c8c02b TASK: 订阅或试用用户账号到期邮件通知 2025-11-14 18:08:40 +08:00
litianxiang
1d4017bafd minio上传base64 log补充信息 2025-11-14 15:57:49 +08:00
litianxiang
8c98f91445 minio上传base64 log补充信息 2025-11-14 15:42:24 +08:00
18f5528d59 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-11-14 14:52:29 +08:00
88ce191950 TASK:1.订阅成功和续签成功,通知商家的邮件中添加邮件和国家 2.在getModuleContent的回参中添加motion相关数据 3.修改Affiliate账号状态与修改佣金比例接口合并 2025-11-14 14:51:30 +08:00
litianxiang
f3d6d7b000 fix:进行design后library中可能会生成同样的图片
fix:ageGroup在designSingle时不会被存入数据库导致收藏页面不能显示完整
2025-11-14 13:32:57 +08:00
ef84f32ca0 TASK:添加系统sketch到个人library 性别细节修改 2025-11-13 14:24:07 +08:00
3886aeaa46 Merge branch 'dev/dev_xp' into dev/3.1_release_merge
# Conflicts:
#	src/main/java/com/ai/da/python/PythonService.java
#	src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java
2025-11-13 13:41:31 +08:00
8750ea355a TASK:1.修改affiliate状态 2.添加系统sketch到个人library 3.视频生成新增生成模型 4.获取所有pose,从过去gif改为获取video 2025-11-13 11:40:37 +08:00
litianxiang
b107fa82df 修改第二数据源位置 2025-11-13 11:24:14 +08:00
litianxiang
e56a6176a9 fix:为BoundingBox返回值排序解决每次获取可能会排序错误的bug 2025-11-13 10:51:00 +08:00
litianxiang
e35ed2c768 转产品图提示词更换 2025-11-12 17:25:46 +08:00
litianxiang
52094d58e7 Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2025-11-12 13:50:14 +08:00
litianxiang
e4e6cfbff7 sketch暂时修改为java端推荐,根据style进行推荐 2025-11-12 13:49:01 +08:00
litianxiang
15f2b78c94 配饰detail显示问题 2025-11-07 11:50:13 +08:00
litianxiang
1fd1f7dd47 配饰更换为其他 2025-11-06 17:20:05 +08:00
litianxiang
2a6d3c1b58 fix:初次从收藏和生成的线稿,再刷新前不会被用于design 2025-11-06 15:21:37 +08:00
59e33c22b7 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-11-05 17:25:21 +08:00
e5eecbfe8d BUGFIX: 路径修改 2025-11-05 17:24:46 +08:00
9759cf4740 BUGFIX: volcengine依赖包使用指定版本 2025-11-05 17:04:31 +08:00
e8766b9af3 Merge branch 'dev/dev_xp' into dev/3.1_release_merge
# Conflicts:
#	src/main/java/com/ai/da/common/config/MyTaskScheduler.java
#	src/main/java/com/ai/da/common/task/PaymentTask.java
2025-11-05 16:51:41 +08:00
4fed5f7439 BUGFIX: design single - sketch modify 2025-11-05 16:40:31 +08:00
litianxiang
c3e0a61ff7 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev-ltx 2025-11-04 16:41:08 +08:00
litianxiang
58212e92ec 增加配饰类别 2025-11-04 16:37:57 +08:00
5efaaf01b2 task:motion 本地模型接口调用地址修改 2025-11-03 13:10:37 +08:00
18c94ad1e0 BUGFIX:取消续订提前邮件通知 2025-10-30 16:44:45 +08:00
e825c9bd75 BUGFIX:用户订阅后,订阅者和商家无法收到通知邮件 2025-10-22 10:48:29 +08:00
1af705592a BUGFIX:1.design中dislike后排序混乱 2.续订成功通知会再次通知上一次的成功订阅 2025-10-17 17:59:43 +08:00
litianxiang
d426fb34a2 Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2025-10-16 11:52:20 +08:00
litianxiang
8c3e1fdda5 fix:作品快照序列化问题导致报错 2025-10-16 11:51:29 +08:00
litianxiang
a76b9ba365 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2025-10-16 11:00:36 +08:00
cd74022d04 BUGFIX:generateLike添加年龄段 2025-10-16 10:03:57 +08:00
litianxiang
d5b972ab16 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev-ltx 2025-10-16 09:32:38 +08:00
a3e63c9877 BUGFIX:排序优化 2025-10-15 18:32:19 +08:00
0c227a1efa BUGFIX:排序优化 2025-10-15 18:03:48 +08:00
litianxiang
59602540a3 Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2025-10-15 16:03:56 +08:00
4578cb5778 BUGFIX:排序优化 2025-10-15 16:03:08 +08:00
litianxiang
9959a03ccc fix:兼容二创设置旧数据没有性别问题 2025-10-15 15:58:08 +08:00
litianxiang
ff43ffaba6 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2025-10-15 15:17:22 +08:00
litianxiang
1c32aaa46c 防止因为二创导致的数据存在taskId相同导致报错问题 2025-10-15 14:47:04 +08:00
db5f435a4d BUGFIX:1.标签允许不同用户创建相同的标签2.删除指定人员试用名单通知邮箱 2025-10-15 10:46:27 +08:00
litianxiang
c9f9ef0ce2 谷歌模型错误提示词修改 2025-10-15 10:35:59 +08:00
litianxiang
3b6a9882d2 回滚 2025-10-14 18:10:59 +08:00
litianxiang
854847a6f4 去掉打印谷歌base64log 2025-10-14 17:46:06 +08:00
litianxiang
309d95ab3c fix:sort时有类型转换异常 2025-10-14 17:31:30 +08:00
litianxiang
422d547cfd Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge
# Conflicts:
#	src/main/java/com/ai/da/service/impl/CollectionSortServiceImpl.java
2025-10-14 17:30:30 +08:00
litianxiang
e6a0706d61 新增谷歌模型违规提示词或图片报错
模型扣除积分修改
压缩转产品图的输入
fix:sort时有类型转换异常
2025-10-14 17:20:23 +08:00
19c08f4237 BUGFIX:1. 排序优化,添加唯一约束和重试
2.like前先查询是否有被like
2025-10-13 17:35:27 +08:00
6ac9680c64 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2025-10-13 13:51:08 +08:00
4ce6fb4190 BUGFIX:为design的排序(collection_sort)添加唯一约束 2025-10-13 13:50:51 +08:00
litianxiang
6b7abafb68 Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2025-10-13 13:45:31 +08:00
litianxiang
02f7031a67 修改配置增加模特功能修改
fix:模特有时会没有设置成功性别
豆包qwen模型增加违规提示词提醒
2025-10-13 13:42:38 +08:00
3d67ac71f3 BUGFIX:moodboard无法完全删除 2025-10-10 13:26:13 +08:00
litianxiang
67f0ce7c6c Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2025-10-09 15:28:08 +08:00
litianxiang
5fbcaf9077 去掉本地vpn设置 2025-10-09 15:23:12 +08:00
ebb19ea15e BUGFIX:漏传 2025-10-09 15:18:05 +08:00
litianxiang
5efa5cad33 Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2025-10-09 15:06:34 +08:00
litianxiang
f9dfd61b89 fix:谷歌模型新加重试机制,修改nanobanana正式版ID 2025-10-09 15:05:09 +08:00
42aed5804b BUGFIX:1.生成的图案在design时未加入到library
2.获取组织名时出现空字符串
TASK:1. 允许超级管理员按组织名查询用户design频次
2025-10-08 21:04:19 +08:00
litianxiang
df5ee235f2 fix:fast模型匹配为normal 2025-10-08 16:09:39 +08:00
litianxiang
ad2bb7062e Merge remote-tracking branch 'origin/release/3.1' into dev-ltx 2025-10-08 13:09:39 +08:00
litianxiang
4fbacb37c1 google模型添加http重试 2025-10-08 13:08:14 +08:00
litianxiang
3150f5ae57 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2025-10-07 14:02:08 +08:00
litianxiang
20cf415635 Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge
# Conflicts:
#	src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java
2025-10-06 22:16:26 +08:00
litianxiang
7bd32914a1 删掉aida.iml 2025-10-06 22:01:57 +08:00
litianxiang
24d54ea9ea 转产品图模型换为nanobanana 2025-10-06 22:00:34 +08:00
c00c2e738b BUGFIX:1.查询组织接口完善 2.设置默认的二级印花分类 3.教育管理员登录时过期处理 2025-10-06 18:09:11 +08:00
litianxiang
6772610129 fix:根据不同类型判断性别进行男女服装筛选,否则会造成design异常 2025-10-03 12:04:48 +08:00
litianxiang
a681a298f4 恢复修改设置会多一个模特fix判断模特是否存在的方式 2025-10-02 12:09:07 +08:00
litianxiang
e6d5d4f614 去掉vpn设定 2025-10-02 09:49:52 +08:00
litianxiang
187c38ad61 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2025-10-02 09:37:29 +08:00
litianxiang
95f6f02290 豆包api key 2025-10-02 09:37:21 +08:00
ab7ef19657 pantone中的rgb替换 2025-10-02 06:26:39 +08:00
litianxiang
d837f0dc78 Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge
# Conflicts:
#	src/main/java/com/ai/da/service/WorkspaceService.java
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
#	src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java
2025-10-02 00:41:04 +08:00
litianxiang
ab6cc04483 为模特和线稿设置性别
修改设置模特会增多问题
模型更换
设置可以切换男女兼容
TODO:扣除积分价格
转产品图模型未完成
2025-09-30 17:22:23 +08:00
9110e0dd34 dev环境暂时不上生产的变更 2025-09-26 21:46:49 +08:00
0f084c27ea BUGFIX:1. singleDesign颜色返回不对 2. 单品design通过优先级获取图层有误 2025-09-26 18:25:40 +08:00
b1b465a05a BUGFIX:1. 单品设计返回的优先级不对 2. 修改项目参数会导致多一个模特 2025-09-26 16:47:03 +08:00
2e4b1516cc BUGFIX:新增的图层未转为预览地址 2025-09-26 11:40:17 +08:00
1e389bec86 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-09-25 16:52:50 +08:00
2d0936f0f3 BUGFIX:1. to product 不添加衣服类别提示词
2. 新增添加了单个印花的未分割图层返回
3. design中使用的元素,sketch没有被正确的添加年龄段,导致用户无法查询到
2025-09-25 16:51:58 +08:00
dab253c313 BUGFIX:检查所有异常提示的语言是否都做了多语言 2025-09-24 14:21:07 +08:00
ed86cd45ad BUGFIX:创建项目时,已输入的项目名被覆盖 2025-09-23 22:54:07 +08:00
814324430c dev切换到prod,部分功能不上传 2025-09-23 17:34:08 +08:00
1d006342fb BUGFIX:创建优惠券设置开始结束时间失败;开启stripe模块的接口文档 2025-09-23 16:24:00 +08:00
24fe265172 BUGFIX:1.微信注册后绑定邮箱失败;2.按类别查项目历史记录 2025-09-23 14:48:44 +08:00
79e19a029b BUGFIX:undividing layer未设置成功 2025-09-23 10:54:09 +08:00
227a20f6f2 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-09-22 17:50:06 +08:00
efa26d912d TASK:添加默认项目名,存储design结果的undivided_layer 2025-09-22 17:49:13 +08:00
litianxiang
ea19e915db fix:二创旧数据兼容 2025-09-22 15:03:20 +08:00
41759ca44b Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-09-22 14:17:05 +08:00
29e1d864ae BUGFIX: saveModuleContent时无法删除最后一个元素
TASK: 打开教育账号检查过期定时器
2025-09-22 14:16:34 +08:00
6cfd420e46 sketch advance 提示词增加修饰 2025-09-20 22:01:21 +08:00
51024508b9 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-09-19 17:31:55 +08:00
b7b07b8843 sketch 提示词未修饰 2025-09-19 17:31:31 +08:00
c1d26a87ce Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-09-19 14:09:29 +08:00
d59a69e6f4 切换dev环境的谷歌登录相关配置 2025-09-19 14:08:52 +08:00
litianxiang
042501f9b1 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2025-09-18 17:49:36 +08:00
litianxiang
9e6fcb4f73 fix:查询详细项目信息文件恢复 2025-09-18 17:48:40 +08:00
9386a2c6c4 隐藏检查管理员账号到期接口 2025-09-17 17:49:48 +08:00
c43a716104 BUGFIX: 所有通过邮件注册、登录等的查询,不再区分大小写 2025-09-17 17:46:42 +08:00
litianxiang
950707ab44 Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2025-09-17 16:45:56 +08:00
litianxiang
b0e5f39765 perf:减少/api/project/getModuleContent数据库交互次数以优化速度 2025-09-17 16:14:08 +08:00
5eebb878ca Merge remote-tracking branch 'origin/dev-ltx' into dev/3.1_release_merge 2025-09-17 15:34:36 +08:00
litianxiang
d568129843 fix:增加projectID匹配,避免因为二创导致查询到多条记录 2025-09-17 15:19:19 +08:00
d093aa9d1a Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-09-17 11:35:12 +08:00
3c1d180ed6 BUGFIX: 试用订单邮件发送,区分环境 2025-09-17 11:33:25 +08:00
b9c24386b9 BUGFIX: 未解析用户数据的接口使用了上一个使用这个线程的用户信息 2025-09-16 17:42:39 +08:00
litianxiang
8f53902d18 fix:点击我的喜欢会出现非喜欢的作品
fix:二创因为designID为-1导致报错的bug
2025-09-16 17:21:47 +08:00
c79535ac3f Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-09-16 17:02:20 +08:00
106528ce08 TASK: 教育管理员账号到期后降为游客并移除所有子账号 2025-09-16 17:01:18 +08:00
litianxiang
23eda80389 Merge remote-tracking branch 'origin/dev/3.1_release_merge' into dev/3.1_release_merge 2025-09-16 11:49:43 +08:00
litianxiang
eccd2a35e9 fix:9.11代码覆盖恢复 2025-09-16 11:36:43 +08:00
9c69aeae53 Merge branch 'dev/dev_xp' into dev/3.1_release_merge 2025-09-16 11:26:12 +08:00
5bac740efd TASK: Affiliate审批通过后,邮件中添加邀请链接 2025-09-16 11:20:09 +08:00
litianxiang
fa74236035 fix:二创报错 2025-09-16 11:07:54 +08:00
litianxiang
630dfe98a4 /api/project/getModuleContent速度优化 2025-09-16 11:01:22 +08:00
c922563919 TASK: Affiliate审批通过后,邮件中添加邀请链接 2025-09-12 16:25:34 +08:00
ce68696934 TASK: 1. 登录不区分邮箱大小写
2. 将所有删除用户的操作更改为修改身份为游客
2025-09-12 15:46:35 +08:00
5d8bdf9ecc TASK: 子账号积分刷新沿用上月分配的积分
BUGFIX: 获取作品详情
2025-09-11 16:01:25 +08:00
e3b0d3bc0a BUGFIX:1. 新建的教育管理员无法登录、无法分配积分
2. 填写个人信息时会覆盖其他人的信息
TASK:教育用户不能通过个人版登录入口登录
2025-09-10 22:05:45 +08:00
5f5f2c83d7 管理员允许查看各功能使用数据表 2025-09-09 18:49:08 +08:00
aff51a2793 管理员允许查看各功能使用数据表 2025-09-09 18:48:42 +08:00
4c5d8d3c61 修改管理员页面权限校验 2025-09-09 17:32:12 +08:00
f667099f4f 修改管理员页面权限校验 2025-09-09 17:31:51 +08:00
d5a74c1ff3 新建子账号 默认密码修改 2025-09-09 12:04:37 +08:00
c187d25d74 新建子账号时已使用积分为空 2025-09-08 16:20:24 +08:00
f20a85a0e2 Google 回调地址修改 2025-09-07 20:52:49 +08:00
4f93ec144b BUGFIX:添加已存在的子账号时,不指定密码则不会修改原账号密码 2025-09-04 21:18:21 +08:00
de16437d08 BUGFIX:1. 所有作品中无法查看个人刚发布的作品
2. 100月付用户的邮件中续订金额不对,发送给商家的邮件中夹杂中文
3. 推广码没有截止有效期时使用该推广码报错
2025-09-04 18:29:52 +08:00
c67d197da0 BUGFIX:无法通过谷歌登录/教育管理员无法查看design使用频次 2025-09-03 18:15:23 +08:00
d8f0188596 BUGFIX:无法通过谷歌登录 2025-09-03 15:50:13 +08:00
ddc089faa4 BUGFIX:印花pin的数量为9时无法design 2025-09-03 15:48:45 +08:00
f5ecd34a9c BUGFIX:无法查看我喜欢的作品 2025-09-03 00:23:32 +08:00
3c071378ad BUGFIX:无法查看我的作品 2025-09-02 23:46:40 +08:00
8b2aab2e5e Merge branch 'dev/3.1_release_merge' into release/3.1 2025-09-02 22:28:58 +08:00
c4a42b03f6 BUGFIX:发布作品中没有like的衣服导致查看作品详细报错 2025-09-02 22:28:33 +08:00
0dad9ff618 切换端口9994->9990 2025-09-02 21:12:34 +08:00
136bcdf82b 切换正式支付环境 2025-09-02 20:13:37 +08:00
a59acb0903 BUGFIX: 2025-09-02 20:09:37 +08:00
feca192f53 BUGFIX: 无法二创 2025-09-01 23:13:54 +08:00
179b79812a release 3.1 dev与prod代码合并冲突处理 2025-08-31 22:02:28 +08:00
94cf82340a Merge branch 'release/3.1' into dev/3.1_release_merge
# Conflicts:
#	src/main/java/com/ai/da/common/config/MyTaskScheduler.java
#	src/main/java/com/ai/da/common/enums/ProductEnum.java
#	src/main/java/com/ai/da/common/task/PaymentTask.java
#	src/main/java/com/ai/da/common/utils/LocalCacheUtils.java
#	src/main/java/com/ai/da/common/utils/RedisUtil.java
#	src/main/java/com/ai/da/controller/AffiliateController.java
#	src/main/java/com/ai/da/controller/ConvenientInquiryController.java
#	src/main/java/com/ai/da/controller/StripeController.java
#	src/main/java/com/ai/da/mapper/primary/entity/Library.java
#	src/main/java/com/ai/da/mapper/primary/entity/ProductCoupons.java
#	src/main/java/com/ai/da/model/dto/CreateCouponDTO.java
#	src/main/java/com/ai/da/model/vo/CheckCouponsVO.java
#	src/main/java/com/ai/da/service/AffiliateService.java
#	src/main/java/com/ai/da/service/PaymentInfoService.java
#	src/main/java/com/ai/da/service/StripeService.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
#	src/main/java/com/ai/da/service/impl/AffiliateServiceImpl.java
#	src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java
#	src/main/java/com/ai/da/service/impl/ConvenientInquiryServiceImpl.java
#	src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java
#	src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java
#	src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java
#	src/main/java/com/ai/da/service/impl/StripeServiceImpl.java
#	src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java
#	src/main/resources/messages_en.properties
#	src/main/resources/messages_zh.properties
2025-08-31 17:54:44 +08:00
c649907222 数据迁移代码 2025-08-31 14:16:08 +08:00
c93ae85b65 BUGFIX: 1、singleDesign使用generate的印花没有传minio导致出现错误
2、项目中没有保存生成和上传的印花的类型
2025-08-29 14:18:17 +08:00
6441bfbbba BUGFIX: 子账号信息无法正确导出为excel 2025-08-28 19:22:55 +08:00
933522482b TASK:审批affiliate 2025-08-28 14:01:48 +08:00
56b56981b1 TASK:便利查询,查询所有用户id时根据用户身份限定查询范围 2025-08-28 11:29:30 +08:00
9e2ea2de62 TASK:导出数据时添加校验 2025-08-27 17:40:05 +08:00
7005b75e11 TASK:导出数据时添加校验 2025-08-27 15:24:43 +08:00
5b09d2cbf5 BUGFIX:查询design使用情况数据不对 2025-08-27 14:57:15 +08:00
126ac209c6 BUGFIX:普通生成积分扣除有误 2025-08-27 14:15:58 +08:00
98eb29eeb5 BUGFIX:普通生成积分扣除有误 2025-08-27 13:44:32 +08:00
ee551a0be2 BUGFIX:编辑子账号邮箱时积分回流策略有漏洞 2025-08-27 11:41:07 +08:00
c3cbb61c16 BUGFIX:积分扣除失败 2025-08-27 11:22:08 +08:00
71f0293cd9 BUGFIX:修改用户邮箱异常时事务没回滚 2025-08-27 10:39:46 +08:00
35604e5130 BUGFIX:超管创建机构管理员 2025-08-27 10:15:59 +08:00
18c38b020e TASK:默认积分分配改为平均分配;超级管理员可新增教育、企业管理员账户;组织成员使用积分时需要记录creditsUsage;试用用户初始50积分 2025-08-26 23:53:40 +08:00
6e9213ec5a BUGFIX:获取brand dna计算时间为空 2025-08-26 16:24:52 +08:00
83ba69c950 BUGFIX:子账号批量导入、brand dna返回计算时间、按权限范围查询design频次 2025-08-26 15:49:02 +08:00
3cc329f983 param change 2025-08-26 14:49:43 +08:00
c42ee8a1bf Merge branch 'dev/dev_xp' into dev/dev 2025-08-26 14:27:50 +08:00
9a650afc7d TASK:优化查询子账号design试用频次,根据管理员身份限定查询范围 2025-08-26 14:10:28 +08:00
45a336ced3 TASK:brand dna获取进度 返回计算时间 2025-08-26 13:33:28 +08:00
e258166a16 Merge branch 'dev/dev_xp' into dev/dev 2025-08-26 11:54:24 +08:00
f9ec733f07 BUGFIX: 编辑referral状态 2025-08-26 11:53:53 +08:00
54b09b4940 TASK:万相补偿获取结果之后通知用户 2025-08-26 09:35:18 +08:00
6d0c29f5c3 TASK:motion生成完成后邮件通知 2025-08-25 18:16:57 +08:00
23523f73da TASK:教育版子账号积分刷新策略更新 2025-08-25 18:07:37 +08:00
e45d572078 TASK:Stripe订阅,添加月付(经济版)及相应费用、积分的更新 2025-08-25 15:02:34 +08:00
eebb790aeb BUGFIX:教育子账号新增-积分分配问题 2025-08-25 09:18:07 +08:00
9c6573f1a6 BUGFIX:删除library元素时没有将brand中关联的数据删除,导致出现空指针 2025-08-22 15:27:09 +08:00
6a5282e4d5 BUGFIX:将已存在的账号添加到子账号中,积分计算混乱 2025-08-21 16:03:24 +08:00
3c5a5ff225 Merge branch 'dev/dev' into dev/dev_xp 2025-08-21 13:22:48 +08:00
e4ce7e9e63 TASK:获取affiliate的用户名和id;BUGFIX:模特无法保存 2025-08-21 13:22:22 +08:00
1089a5a2a5 TASK:flux 生成pattern时输出图片比例设置为1:1 2025-08-20 18:15:46 +08:00
156fcfae6b Merge branch 'dev/dev_xp' into dev/dev 2025-08-20 18:02:18 +08:00
7436fa17c0 TASK:添加接口说明 2025-08-20 18:01:28 +08:00
d9f19f1728 Merge branch 'dev/dev_xp' into dev/dev 2025-08-20 16:41:14 +08:00
81c417ed76 BUGFIX:1、子账号查询,无法批量根据用户名或邮箱查
2、教育版子账号创建及修改涉及的积分问题
2025-08-20 16:40:44 +08:00
59a3015170 TASK:查affiliate列表接口添加参数校验;打开佣金计算定时器 2025-08-20 09:37:35 +08:00
b02009bf14 Merge branch 'dev/dev_xp' into dev/dev 2025-08-19 17:45:11 +08:00
caa9985d11 TASK: 1.affiliate 新增referral新增、查询、修改以及其他相关的自动结算佣金的功能;2.删除affiliate_income表及相关mapper 2025-08-19 17:44:34 +08:00
80957bfc00 Merge branch 'dev/dev_xp' into dev/dev 2025-08-19 09:33:16 +08:00
552ec828ab BUGFIX:1、删除模特后保存失败
2、获取个人库中的模特不准确
2025-08-18 16:18:51 +08:00
42273750f4 BUGFIX:从缓存获取模特 2025-08-15 18:00:41 +08:00
45d6af92e8 BUGFIX:1、教育通过上传文件批量创建子账号没有任何校验
2、下载子账号所有信息接口缺失(原下载模板接口保留)
3、保存个人模特到collection时类型设置为System
4、创建子账号时设置积分无效
2025-08-15 17:44:45 +08:00
c28db81893 BUGFIX:同一浏览器切换版本登录时,密码被置空 2025-08-13 16:45:30 +08:00
1e25ae36f1 TASK:1、教育版添加新用户、修改用户、移除用户需求更改;2、修改登入校验条件
BUGFIX:当用户积分为空时报错
2025-08-13 15:52:19 +08:00
9bf40d879f BUGFIX: 用户选择作品进行二创后,无法正确展示原作品中被like的design 2025-08-05 16:50:54 +08:00
878f556a0b BUGFIX:分页查询所有项目历史记录,根据更新时间排序,解决项目记录没有更新时间导致空指针问题 2025-08-04 13:29:12 +08:00
4ad2cd027c TASK:1. 通过定时任务,补偿获取第三方api的运行结果;
2. pose 生成,对使用万相模型的生成限流,最大支持5个并发
3. Slogan限流,一分钟内,最多接收3个请求
2025-08-01 17:21:41 +08:00
132f48eb60 CONFIG:dev添加死信队列信息 2025-08-01 11:29:47 +08:00
5b33e31504 BUGFIX:画布存在minioUrl为空的情况,此时不处理minio地址 2025-08-01 11:12:11 +08:00
e16268a013 TASK: 邮件模板 2025-07-31 18:20:43 +08:00
739e637267 TASK: 发送邮件功能及发送失败后的重试机制 2025-07-31 15:57:47 +08:00
7edc959432 TASK: 保存画布时返回画布id
BUGFIX: 用户输入的prompt没有传入flux
2025-07-31 14:57:20 +08:00
c444d5a69f TASK: to product、relight、pose未like的数据也需要返回parentId 2025-07-30 15:12:38 +08:00
830d06a900 BUGFIX: 更新flux生成结果失败 2025-07-29 15:59:57 +08:00
0fcd8e5444 BUGFIX: 1、修改画布时,不再上传新文件,改为覆盖原文件
2、删除toProduct relight结果时没删干净导致获取源文件失败
2025-07-29 15:00:13 +08:00
020cfe9016 TASK:design single中添加单件衣服画布保存 2025-07-29 13:12:20 +08:00
39903f3da6 BUGFIX:循环依赖导致项目无法启动 2025-07-28 17:27:00 +08:00
b1d682a909 TASK:1、to product修改任务状态字段为task 2、异步向api_generate表中添加记录 3、优化flux结果获取,避免重复获取结果时因图片过期覆盖原可用图片 2025-07-28 15:01:16 +08:00
07d60303db BUGFIX: to product 用户未输入prompt时,出现空指针 2025-07-28 12:10:39 +08:00
5287d83b82 BUGFIX:1、userLikeService中业务划分不清晰导致与generateService出现循环依赖问题。解决:将CollectionSort单独划分为一个Service
2、新建t_api_generate表用于补偿查询生成结果
2025-07-25 17:13:06 +08:00
e2085190d1 BUGFIX:单品设计存储时,不要涉及body相关数据 2025-07-25 13:17:23 +08:00
565b5c3de1 BUGFIX:单品设计偏移量为空问题 2025-07-24 17:18:40 +08:00
fd29452e0c BUGFIX:flux请求失败后的日志打印问题 2025-07-24 11:33:28 +08:00
0f93099d04 BUGFIX:修改获取flux结果的get方法名 2025-07-24 09:40:34 +08:00
e2d50a6dfa TASK: 优化generate请求方法,将长方法拆分为由多个小方法组成 2025-07-23 17:25:00 +08:00
c4d20cd522 TASK: 1、印花生成允许使用flux
2、修改sketch\print允许修改上传的元素
3、印花生成结果中添加level2Type
2025-07-23 16:59:41 +08:00
229e1353f4 BUGFIX: 获取万相的生成结果时没有返回status 2025-07-22 17:36:16 +08:00
07571aaad1 TASK: 画布数据 回参处理不为空时的minio地址 2025-07-22 13:42:07 +08:00
3c2b4ffc48 TASK: 画布数据 回参添加返回crossOrigin 2025-07-22 11:31:26 +08:00
bb0a3bd1cd BUGFIX: 1、允许存储没有潘通值的颜色
2、getModule时design子元素回参增加
2025-07-22 11:09:47 +08:00
3bd9ff82d7 BUGFIX: 获取我的作品时,无法查看设置为私有的作品 2025-07-21 17:54:12 +08:00
f0fccaaf51 TASK:pose transfer添加返回参数 2025-07-21 17:11:10 +08:00
2041809ea6 TASK:pose transfer添加返回参数 2025-07-20 19:19:07 +08:00
b90df7468e TASK:管理员权限变更 2025-07-18 17:32:03 +08:00
e2e0bd6b47 TASK:toProduct relight pose 返回的数据中需包含设置的参数信息 2025-07-18 16:37:37 +08:00
785ae33e86 BUGFIX: 旧作品中有的没有项目id 2025-07-17 17:34:03 +08:00
20f7dc0ef9 TASK:作品更新接口,将通过projectId替换userLikeGroupId 2025-07-17 17:21:14 +08:00
0155154664 BUGFIX: cloudTask数据插入的时间晚于python端向MQ中发消息的时间 2025-07-17 11:48:38 +08:00
d264c29557 TASK: 删除toProduct Relight Pose后重新排序 2025-07-17 10:51:43 +08:00
432149dce2 TASK: 拼贴 未进行生成时也显示上传的图片 2025-07-16 19:29:52 +08:00
5b3a52152a TASK: ToProduct Relight Pose新增删除接口 2025-07-16 19:14:41 +08:00
301f58bc62 TASK: 拼贴功能保存用户上传的图片并返回 2025-07-15 18:11:12 +08:00
64318de24a BUGFIX: 创建pose transfer任务error 2025-07-15 13:12:29 +08:00
fb01250142 BUGFIX: 通过projectId获取pose transfer结果路径出错 2025-07-15 13:02:59 +08:00
0beec5392e Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java
2025-07-15 12:10:55 +08:00
f551ba452f BUGFIX: 通过projectId获取pose transfer结果路径出错 2025-07-15 11:58:13 +08:00
f4b22fe874 BUGFIX: 1、还未生成出结果但是没有失败的pose transfer需返回taskID 2025-07-14 19:17:21 +08:00
e95444266b BUGFIX: 1、getModuleContent没有返回taskId
2、万相生成的pose没有更新状态
2025-07-14 18:05:10 +08:00
e361960e51 TASK: 1、对于生成失败情况,在数据库添加状态记录,并在getModuleContent时不返回该条记录 2025-07-11 17:56:15 +08:00
d0a9c05d4b BUGFIX: 1、相同的relation_id,relation_type重复排序,针对脏数据做处理 2、传入数据库中没有的userLikeSortId 2025-07-11 14:22:38 +08:00
f852927116 BUGFIX: 1、积分重复扣除 2、pose transfer没有开始时间,没有项目id 2025-07-11 11:07:27 +08:00
daa88889d0 TASK:1、印花允许修改并保存
BUGFIX: 1、批量生成有的类型没有任务开始执行时间,任务结束时间有误
2025-07-10 17:50:31 +08:00
766e75f2ed BUGFIX: 批量生成积分扣除有误 2025-07-10 13:38:00 +08:00
eb7f2a1419 BUGFIX: 批量生成积分扣除有误 2025-07-10 11:24:25 +08:00
c7c69417ef TASK: 1、更换pose,重新生成templateId
2、brandDNA 开启分析attributes功能
2025-07-09 17:01:53 +08:00
9f548d299b TASK: 默认不like时,不要将元素添加到父元素子集但是要返回parentId 2025-07-09 12:10:10 +08:00
1dc6c6f8c4 TASK:生成获取结果接口返回parentId 2025-07-08 18:53:21 +08:00
5472e59a84 TASK: sketchboard library数据添加年龄组 2025-07-08 16:09:01 +08:00
d379f778dc TASK: 默认不like的元素,如有parentId,需要添加到CollectionSort表中 2025-07-08 14:29:54 +08:00
ec44c2a6b5 TASK: 1、默认不like的元素,如有parentId,需要回传
2、project查询 需要按id查
2025-07-08 13:54:27 +08:00
1f77500d61 TASK:product/relight/pose transfer的入参添加是否需要默认like 2025-07-08 11:39:05 +08:00
060db899cf TASK:product/pose transfer的回参添加sort和id 2025-07-08 10:21:28 +08:00
9fc8f52aca BUGFIX: 1、对话历史记录 有的回答没有深度思考标识 2、批量生成,积分扣除不足 2025-07-07 18:32:14 +08:00
9af1bc867a TASK:to product\relight的结果分like 没like返回 2025-07-07 16:34:22 +08:00
e92bb0c7cd TASK:获取模板内容 不再限制是否like 2025-07-07 14:49:36 +08:00
1d07d7d88a TASK:generate 普通生成改回按生成次数收费 2025-07-07 14:26:21 +08:00
ec7d84b354 BUGFIX:未生成完成的项目获取moduleContent报错 2025-07-07 14:14:45 +08:00
0a2c5e028f BUGFIX:对项目进行各种生成修改时没有更新项目更新时间 2025-07-07 11:53:50 +08:00
4379b9cff1 BUGFIX:design中的排序问题 倒序问题 再次修改 2025-07-04 19:08:59 +08:00
1b7c2041be BUGFIX:design中的排序问题 2025-07-04 17:20:35 +08:00
f3632f53e3 BUGFIX:生成没出结果之前获取结果报空指针 2025-07-04 12:43:14 +08:00
d76a9e6afd 1、design流程中使用to product、relight、pose transfer默认加到like
2、万象的pose transfer结果存到redis
2025-07-04 12:02:05 +08:00
e67acc4319 1、添加日志打印
2、batch获取结果报错
2025-07-03 19:03:45 +08:00
373a360e76 BUGFIX:FLUX童装prompt修改;获取video结果允许传入list 2025-07-03 14:20:33 +08:00
f541bee0e7 Merge branch 'dev/dev_xp' into dev/dev 2025-07-03 11:24:59 +08:00
75d086f680 pose transfer 万象入参添加日志打印 2025-07-03 11:21:10 +08:00
81ca723486 BUGFIX:Batch_Relight默认创建的项目类型是ToProduct 2025-07-03 09:48:21 +08:00
d51bbffb3e TASK:BrandDNA 2025-07-03 09:40:56 +08:00
07aad4afa0 Merge branch 'dev/dev_xp' into dev/dev 2025-07-02 19:04:52 +08:00
6495bb2be3 TASK:语言适配 2025-07-02 19:02:39 +08:00
3d8363c99b BUGFIX:批量生成创建姿势变更项目失败 2025-07-02 17:44:32 +08:00
333c11f81e 增加日志打印 2025-07-02 17:03:40 +08:00
77fc3e967a TASK: 批量生成 prompt微调获取接口,端口变更 2025-07-02 16:29:00 +08:00
a447cde05b TASK: 批量生成获取任务序号 2025-07-02 16:16:15 +08:00
e8ad241653 TASK: 生成项目参数 参数变更 2025-07-02 15:06:52 +08:00
1f824f3ae6 BUGFIX: 获取模块内容-pose transfer返回的图片无法显示 2025-07-02 13:35:15 +08:00
370d9402f2 TASK: 试用邮件通知权限变更 2025-07-02 10:08:54 +08:00
4d518d05b9 TASK: 管理员页面访问权限变动 2025-07-02 09:18:22 +08:00
8c87333fa2 Merge branch 'dev/dev_xp' into dev/dev 2025-06-30 19:34:34 +08:00
4273d0efc0 BUGFIX: 系列设计 修改模特后,原模特丢失问题 2025-06-30 19:32:16 +08:00
a37b64be91 BUGFIX: 使用万象生成失败时直接报错 2025-06-30 15:54:58 +08:00
905d296bdf TASK: 批量生成 存储任务序号 2025-06-30 15:17:07 +08:00
9a25e8ce4a TASK: 批量生成 获取任务序号 2025-06-30 15:11:31 +08:00
68311e1d8b TASK: 通过对话创建项目 请求地址变更 2025-06-30 13:13:58 +08:00
de5da5b299 TASK: 对话 扣除积分 2025-06-30 12:03:23 +08:00
dcd63668bd TASK: 添加注释 2025-06-27 13:09:36 +08:00
shahaibo
1a52399ec9 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-06-27 09:59:39 +08:00
shahaibo
b01f5f59d1 TASK: 数据迁移拆分; 2025-06-27 09:59:08 +08:00
c70231d5de Merge branch 'dev/dev_xp' into dev/dev 2025-06-26 14:15:35 +08:00
d3deec72eb TASK: 切换chat agent请求api地址 2025-06-26 14:11:42 +08:00
shahaibo
a7347c9dc0 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-06-26 11:53:53 +08:00
shahaibo
6ad5d373d5 bugfix: single design没结果,posetransfer没回显正在进行的结果; 2025-06-26 11:21:35 +08:00
e048b75ed7 BUGFIX: 去除base64控制台输出 2025-06-25 19:13:57 +08:00
469681b96c BUGFIX: 向flux发起生成请求时,功能指定错误 2025-06-25 19:04:29 +08:00
89457b0593 TASK: 使用Flux生成前,to Product Image,为输入透明图添加白色背景 2025-06-25 18:43:52 +08:00
7a6b257714 BUGFIX:批量生成,获取design的结果中缺失ResultType 2025-06-25 17:20:35 +08:00
443b557623 BUGFIX:1、design 渐变色没存 2、展示文本更新 3、取消拼贴图入参日志打印 2025-06-25 17:10:56 +08:00
shahaibo
84691f45b5 bugfix: parentId结果返回; 2025-06-25 15:52:11 +08:00
de65f78e89 BUGFIX:Batch generation 创建时允许projectId为空 2025-06-25 14:10:24 +08:00
252cd0a69c BUGFIX:design 没有存储渐变色 2025-06-25 11:30:36 +08:00
d77aabca92 TASK:修改relight默认prompt 2025-06-24 19:35:07 +08:00
13514b277b BUGFIX:用户注册后重发验证码,验证不通过 2025-06-24 19:30:20 +08:00
eaf90ab9e8 BUGFIX:注册用户登录没有邮件发送记录和登录记录 2025-06-24 17:53:52 +08:00
f828983969 BUGFIX:对话 控制台输出改为日志输出 2025-06-24 16:41:41 +08:00
be6eb64b35 Merge branch 'dev/dev_xp' into dev/dev 2025-06-24 16:30:28 +08:00
abc6c088fe BUGFIX:批量生成 relight和design创建的任务查不到 2025-06-24 16:27:15 +08:00
6f44489c6e BUGFIX:消息监听,消息解析失败,重复消费异常消息导致日志文件内容骤增 2025-06-24 16:11:53 +08:00
a809905c52 BUGFIX:batch generation like报错 2025-06-24 15:03:17 +08:00
7abab7121a BUGFIX:batch generate积分扣除报错 2025-06-24 14:22:41 +08:00
8e31968fd3 BUGFIX:1、积分消耗值不准确 2、flux获取结果报错 2025-06-23 18:16:23 +08:00
3d08e86049 BUGFIX:图片分割参数值变更 2025-06-23 13:44:56 +08:00
e0fdf1cc88 Merge branch 'dev/dev_xp' into dev/dev 2025-06-23 13:09:13 +08:00
4acdd8adb9 BUGFIX:1、积分扣除,金额不对 2、图片分割允许指定上传图片id 2025-06-23 12:02:16 +08:00
d6c5d0e95d TASK:查询交易记录 添加显示总金额和付款者邮箱 2025-06-23 10:53:30 +08:00
shahaibo
e8e6f8bc17 bugfix: posetransfer结果; 2025-06-20 17:28:34 +08:00
shahaibo
27983fe8ee bugfix: collectionSortParentId非必穿; 2025-06-20 17:01:47 +08:00
shahaibo
c3d92aacd5 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-06-20 16:29:06 +08:00
shahaibo
b287ec8529 bugfix: 对话中断排查日志添加; 2025-06-20 16:27:27 +08:00
07d3f6e224 Merge branch 'dev/dev_xp' into dev/dev 2025-06-20 16:23:38 +08:00
fc42f361fa BUGFIX:含小数的积分扣除失败 2025-06-20 16:14:56 +08:00
shahaibo
424f9a126d TASK: 结果返回parentId; 2025-06-20 15:20:35 +08:00
a042f05401 Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/model/vo/MagicToolResultVO.java
2025-06-20 14:57:39 +08:00
f59adbe9bd TASK:更新各生成功能需要消耗的积分 2025-06-20 14:53:10 +08:00
a0ece486d8 TASK:更新各生成功能需要消耗的积分 2025-06-20 14:49:15 +08:00
shahaibo
4caa0a9b0d Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-06-20 13:51:21 +08:00
shahaibo
df5bbc3675 TASK: 结果返回parentId; 2025-06-20 13:50:29 +08:00
92278cf91b BUGFIX:获取all pose的预览地址报错 2025-06-20 12:01:17 +08:00
6b165fe5bc Merge branch 'dev/dev_xp' into dev/dev 2025-06-19 18:26:16 +08:00
64b32dc3a3 BUGFIX:sketch搜索出的图片去白边失败 2025-06-19 18:24:07 +08:00
301a62a563 TASK:添加管理员访问人员 2025-06-19 17:39:18 +08:00
1f84b4b3e6 BUGFIX: 2025-06-19 17:22:43 +08:00
a0979caba6 Merge branch 'dev/dev_xp' into dev/dev 2025-06-19 17:20:04 +08:00
18be52e806 BUGFIX: 1、llm使用sketch查询工具数据没有保存到历史记录中
2、flux运行失败状态下,获取结果报错
3、618福利邮件通知
2025-06-19 17:16:48 +08:00
shahaibo
627dad7aac Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-06-19 15:57:40 +08:00
shahaibo
7166db59bd Bugfix: 对话历史记录; 2025-06-19 15:44:26 +08:00
13759d806b Merge branch 'dev/dev_xp' into dev/dev 2025-06-19 14:58:56 +08:00
0fd1ddcde1 TASK: 1、LLM对话新增两个工具,查找sketch和修改项目参数 2、新增接口获取最新的minio图片预览地址 2025-06-19 14:56:18 +08:00
shahaibo
a5e743ce84 TASK: 数据迁移; 2025-06-19 14:29:44 +08:00
161bba896c BUGFIX: 获取当前任务结果报错(获取模型名出现空指针) 2025-06-19 14:08:25 +08:00
shahaibo
da8338be3f Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-06-19 11:52:03 +08:00
shahaibo
ea235b0d5c bugfix: delete collection; 2025-06-19 11:50:39 +08:00
98ea6004b4 TASK: 新增pose transfer模特姿势选项 2025-06-18 14:19:45 +08:00
62cbc612a7 Merge branch 'dev/dev_xp' into dev/dev 2025-06-17 16:56:45 +08:00
589fa8501e TASK: 优化童装prompt 2025-06-17 16:54:23 +08:00
shahaibo
d6285781f2 bugfix: delete collection; 2025-06-17 16:29:06 +08:00
shahaibo
137ef7045b TASK: cloud、posetransfer; 2025-06-17 16:25:57 +08:00
shahaibo
5e066995e8 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-06-17 14:53:52 +08:00
shahaibo
c1c50cb28b TASK: cloud、posetransfer; 2025-06-17 14:51:19 +08:00
3f13f64ab9 Merge branch 'dev/dev_xp' into dev/dev 2025-06-17 14:43:10 +08:00
5abe45ff34 TASK: 当选择童装时,sketch生成和to product的prompt需添加儿童限定词 2025-06-17 14:41:27 +08:00
shahaibo
0970127f68 TASK: collection sort; 2025-06-17 10:10:00 +08:00
shahaibo
93bb8d2f31 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-06-17 09:42:15 +08:00
shahaibo
88d8b75298 TASK: collection sort; 2025-06-17 09:41:19 +08:00
ea395e87ba Merge branch 'dev/dev_xp' into dev/dev 2025-06-16 18:52:41 +08:00
8d7b4adf48 BUGFIX: 1、sketch extract 没返回taskId
2、relight输入文本太长导致数据存储报错
2025-06-16 18:51:09 +08:00
e3ee724e6f BUGFIX:pose transfer 视频转GIF依赖操作系统环境切换 2025-06-16 18:25:32 +08:00
shahaibo
9d022ae13e Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-06-16 16:55:37 +08:00
shahaibo
8b0f9cfd11 TASK: cloud、posetransfer、sort; 2025-06-16 16:53:50 +08:00
f36b3818c5 Merge branch 'dev/dev_xp' into dev/dev 2025-06-16 16:17:56 +08:00
2ccbbf8893 BUGFIX:pose transfer 视频转GIF依赖缺失 2025-06-16 16:16:08 +08:00
76219aa4fe BUGFIX:pose transfer 记录重复存储问题 2025-06-16 15:32:32 +08:00
5ed3d8dfab Merge branch 'dev/dev_xp' into dev/dev 2025-06-16 15:08:50 +08:00
4dd3ddb1d0 BUGFIX:无法获取wx pose transfer的结果 2025-06-16 15:07:22 +08:00
fb16840a98 Merge branch 'dev/dev_xp' into dev/dev 2025-06-16 14:06:34 +08:00
9ad6acf28c BUGFIX:1、修改新增生成接口失败的状态 2、添加aliyun请求接口的密钥 2025-06-16 13:49:30 +08:00
shahaibo
774a20257d Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-06-16 13:45:25 +08:00
shahaibo
3db0a94981 TASK: cloud、posetransfer; 2025-06-16 13:44:22 +08:00
891b26d493 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-06-16 11:04:34 +08:00
86a991db81 BUGFIX:获取当前生成来自哪个模型 2025-06-16 11:03:40 +08:00
shahaibo
fd8e6fd2e8 BUGFIX: 切换性别 年龄段; 2025-06-13 17:03:07 +08:00
78239d3ead Merge branch 'dev/dev_xp' into dev/dev 2025-06-13 16:41:15 +08:00
174d1bf0d0 TASK:1、将imageToSketch接口调用转为异步 2、imageToSketch加入flux 2025-06-13 16:37:45 +08:00
da9f54982c Merge branch 'dev/dev_xp' into dev/dev 2025-06-13 15:58:37 +08:00
b6993b04c2 TASK:视频图像处理依赖包精简 2025-06-13 15:55:17 +08:00
shahaibo
4cca30ec75 BUGFIX: cloud; 2025-06-13 15:09:32 +08:00
shahaibo
b6c43e534b BUGFIX: 上传元素删除; 2025-06-13 14:07:38 +08:00
shahaibo
942b5eb19b BUGFIX: cloud; 2025-06-13 11:48:08 +08:00
22e5a97143 BUGFIX: 优惠券的佣金计算,统计时间边界问题优化 2025-06-13 11:18:55 +08:00
shahaibo
31b2bd97b4 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-06-13 10:56:44 +08:00
shahaibo
3eaa0d017c BUGFIX: cloud; 2025-06-13 10:55:55 +08:00
be42550d0a Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/model/dto/ToProductImageDTO.java
2025-06-12 16:54:15 +08:00
6e32289b98 TASK:Flux接入,应用于to product image和relight 2025-06-12 16:50:27 +08:00
shahaibo
a750a91f7b BUGFIX: 创建项目; 2025-06-12 15:59:15 +08:00
shahaibo
2cf3b75e46 BUGFIX: 创建项目; 2025-06-12 15:47:46 +08:00
shahaibo
9586be40ce TASK:3d print; 2025-06-12 13:50:04 +08:00
shahaibo
4494ec7dbc TASK:cloud; 2025-06-12 13:41:13 +08:00
shahaibo
33af9d0b9d TASK:cloud; 2025-06-12 13:31:34 +08:00
shahaibo
7f30b2d05b Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-06-12 13:13:31 +08:00
shahaibo
3cd86042ff TASK:上传回显; 2025-06-12 13:12:44 +08:00
af1fab644a pose transform 打开输入图片的检测 2025-06-11 17:45:17 +08:00
ace53e81f2 pose transform 开放自定义输入图片 2025-06-11 17:35:00 +08:00
shahaibo
f179368668 BUGFIX:library ageGroup切换; 2025-06-11 15:58:06 +08:00
765d404845 TASK: 将generate,用户输入中的中文字符转换为英文字符 2025-06-11 15:34:00 +08:00
shahaibo
9134933a07 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-06-11 11:39:01 +08:00
shahaibo
290f6a9a35 BUGFIX:library ageGroup切换; 2025-06-11 11:37:29 +08:00
ac2d1e611b BUGFIX: prompt提取接口传参格式修改 2025-06-10 18:13:53 +08:00
1b75e2ab55 TASK: prompt提取接口地址切换 2025-06-10 18:08:16 +08:00
de9750b24a Merge branch 'dev/dev_xp' into dev/dev 2025-06-10 17:53:03 +08:00
595effa04c TASK: 接入第三方api freepik 新增sketch extract variation 2025-06-10 17:50:04 +08:00
shahaibo
09e24ab062 TASK:cloud; 2025-06-10 15:05:41 +08:00
shahaibo
391208f8bd TASK:cloud; 2025-06-10 15:02:44 +08:00
shahaibo
3cf47eb723 TASK:cloud; 2025-06-10 11:13:17 +08:00
shahaibo
c3ce25315c TASK:cloud; 2025-06-10 11:03:15 +08:00
shahaibo
ae71564b94 TASK:cloud; 2025-06-10 10:55:56 +08:00
shahaibo
d6bd24865e TASK:cloud; 2025-06-09 13:41:02 +08:00
shahaibo
c420300c11 TASK:cloud; 2025-06-09 11:30:23 +08:00
shahaibo
4c67fce8d1 TASK:cloud; 2025-06-09 10:15:40 +08:00
d5cf4e9d3f TASK: 添加“新增试用用户”通知对象chelseayu@code-create.com.hk 2025-06-08 09:19:36 +08:00
4b7fd649a3 TASK: 推广码 添加开始生效时间;优化数据计算类型,使用BigDecimal替换float;更新paidCommission后自动计算unpaidCommission 2025-06-06 19:37:38 +08:00
shahaibo
b8d3b0192d TASK:cloud; 2025-06-06 17:18:59 +08:00
shahaibo
1afd86d3ce Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-06-06 15:25:26 +08:00
shahaibo
daa133b993 TASK:cloud; 2025-06-06 15:22:07 +08:00
shahaibo
bf258ee4f9 TASK:cloud; 2025-06-06 15:19:00 +08:00
2bc17ec4d0 Merge branch 'dev/dev_xp' into dev/dev 2025-06-06 13:54:00 +08:00
090b9ab6ab TASK: 取消animate假数据,直接调用第三方接口 2025-06-06 13:53:43 +08:00
shahaibo
fb5b52bec2 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-06-06 11:58:01 +08:00
shahaibo
df678a12b9 TASK:cloud; 2025-06-06 11:57:10 +08:00
21f85a7322 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-06-06 11:51:34 +08:00
4e2590fd0f Merge branch 'dev/dev_xp' into dev/dev 2025-06-06 11:51:06 +08:00
31c5fef5c0 BUGFIX: 获取万象生成结果时,需指定api_key 2025-06-06 11:50:41 +08:00
shahaibo
94e26ac912 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-06-06 11:10:58 +08:00
shahaibo
711859ce89 TASK:cloud; 2025-06-06 11:08:53 +08:00
8502fffb68 Merge branch 'dev/dev_xp' into dev/dev 2025-06-06 11:03:45 +08:00
6f0cc3aaf8 TASK: 更换第三方access key获取方式,从系统变量中获取改为从配置文件中获取 2025-06-06 10:59:13 +08:00
shahaibo
ce13874431 TASK:cloud; 2025-06-06 10:51:25 +08:00
shahaibo
054c9fd604 TASK:cloud; 2025-06-06 10:46:57 +08:00
f5501db19e TASK: 接入第三方api 添加access key 2025-06-06 09:56:02 +08:00
4609af875e Merge branch 'dev/dev_xp' into dev/dev 2025-06-05 18:36:22 +08:00
1dad0a008a TASK: 接入第三方api 通过万象实现text2image和animate,完成数据传输与原接口的兼容 2025-06-05 18:03:19 +08:00
shahaibo
b757cdc5dd TASK:batch toProductImage;chatStream; 2025-06-05 17:09:03 +08:00
shahaibo
249351bf52 TASK:batch toProductImage;chatStream; 2025-06-05 17:06:11 +08:00
shahaibo
38ca810068 TASK:batch toProductImage;chatStream; 2025-06-05 15:44:23 +08:00
shahaibo
bab5c9a8e6 TASK:batch toProductImage;chatStream; 2025-06-05 15:33:08 +08:00
shahaibo
4e80493a26 TASK:batch toProductImage;chatStream; 2025-06-05 14:00:38 +08:00
shahaibo
12dbe90150 TASK:batch toProductImage;chatStream; 2025-06-05 13:35:13 +08:00
6249d53b7b BUGFIX: modifySketch 除library以外的地方修改,originalIdSource允许不传 2025-06-04 22:04:09 +08:00
b445f1f11e BUGFIX: modifySketch 在library中修改后需要保存到library 2025-06-04 15:49:55 +08:00
shahaibo
f2c268683c TASK:collection sort; 2025-06-03 15:05:40 +08:00
shahaibo
f69eaa4fe3 TASK:collection sort; 2025-06-03 14:39:56 +08:00
shahaibo
a9172dcd36 TASK:collection sort; 2025-06-03 14:31:51 +08:00
shahaibo
442e87267a TASK:collection sort; 2025-06-03 13:41:45 +08:00
shahaibo
32c8aaec9b TASK:collection sort; 2025-06-03 11:26:21 +08:00
shahaibo
112294bd7b TASK:collection sort; 2025-06-03 11:23:13 +08:00
shahaibo
3bfbd8abc1 TASK:collection sort; 2025-06-03 10:42:11 +08:00
shahaibo
78341850e1 TASK:collection sort; 2025-06-02 16:31:17 +08:00
shahaibo
becdbf1891 TASK:collection sort; 2025-06-02 16:19:41 +08:00
shahaibo
f0b1d3f9ce TASK:collection sort; 2025-05-30 15:02:39 +08:00
shahaibo
73bab2338e TASK:collection sort; 2025-05-30 14:04:18 +08:00
shahaibo
448e6d2c40 TASK:mannequin; 2025-05-30 13:08:19 +08:00
shahaibo
131d782b54 TASK:test; 2025-05-30 11:49:10 +08:00
shahaibo
d6cc8ab9a2 TASK:test; 2025-05-30 11:42:27 +08:00
shahaibo
d9e25fd0e4 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-05-29 16:17:49 +08:00
shahaibo
276994759e TASK:mannequin; 2025-05-29 16:17:39 +08:00
a569ee7736 Merge remote-tracking branch 'origin/dev/dev' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/mapper/primary/entity/DesignItem.java
2025-05-28 16:57:49 +08:00
d7762cbfed Merge branch 'dev/dev_xp' into dev/dev 2025-05-28 16:57:15 +08:00
8356326c7d TASK: DesignDetail中允许修改模特 2025-05-28 16:56:32 +08:00
shahaibo
8003a799c2 TASK:mannequin; 2025-05-28 16:42:54 +08:00
shahaibo
6de1ad150c TASK:mannequin; 2025-05-28 15:28:55 +08:00
shahaibo
b6a7354322 TASK:mannequin; 2025-05-28 13:59:52 +08:00
shahaibo
6e96f38c90 TASK:mannequin; 2025-05-28 13:59:00 +08:00
shahaibo
fc24e1fab8 TASK:mannequin; 2025-05-28 13:47:45 +08:00
shahaibo
718e1c93f6 TASK:mannequin; 2025-05-28 11:12:26 +08:00
shahaibo
74540610c6 TASK:mannequin; 2025-05-28 10:34:54 +08:00
shahaibo
1be4701f6d TASK:mannequin; 2025-05-28 09:37:27 +08:00
5c66ece467 1.关闭续订前七天邮件提醒
2.优化订阅邮件提醒,向redis存储已发送的邮件类型
2025-05-23 17:16:19 +08:00
shahaibo
d3b4d15df8 TASK:mannequin; 2025-05-23 16:33:43 +08:00
shahaibo
8fc79f6699 TASK:mannequin; 2025-05-23 15:13:46 +08:00
3b6b0c7e2c TASK: prom code 开启佣金计费定时器和商家邮件通知 2025-05-22 16:37:41 +08:00
shahaibo
91ee58db1b TASK:LLM; 2025-05-22 13:43:50 +08:00
shahaibo
af1c839495 TASK:LLM; 2025-05-22 13:24:28 +08:00
shahaibo
083416951a TASK:LLM; 2025-05-22 12:34:01 +08:00
shahaibo
cd20bdd88f TASK:LLM; 2025-05-22 12:27:00 +08:00
shahaibo
5a0fb6fd3f TASK:LLM; 2025-05-22 10:11:21 +08:00
shahaibo
93fe0781b2 TASK:LLM; 2025-05-21 21:04:28 +08:00
shahaibo
94e00459b6 TASK:LLM; 2025-05-21 21:03:15 +08:00
shahaibo
9614985690 TASK:LLM; 2025-05-20 16:59:07 +08:00
shahaibo
8c597db8a9 TASK:LLM; 2025-05-20 16:54:20 +08:00
9a81fb7ee4 TASK:将PromotionCode合并到生产-test 2025-05-20 16:53:48 +08:00
shahaibo
a0bd4cfa38 TASK:LLM; 2025-05-20 16:47:43 +08:00
shahaibo
82388b0c19 TASK:LLM; 2025-05-20 16:12:08 +08:00
shahaibo
588202311c TASK:LLM; 2025-05-20 16:02:38 +08:00
shahaibo
46820505ae TASK:LLM; 2025-05-20 14:37:34 +08:00
shahaibo
b030e9c09b TASK:LLM; 2025-05-20 14:31:05 +08:00
shahaibo
f1adbb4da7 TASK:LLM; 2025-05-20 14:24:16 +08:00
shahaibo
4dfee09abb TASK:LLM; 2025-05-20 13:56:42 +08:00
shahaibo
16e4f7c5b5 TASK:LLM; 2025-05-20 13:37:46 +08:00
shahaibo
e9e40e53bc TASK:LLM; 2025-05-20 13:16:57 +08:00
31bb29f2fd Affiliate 允许为不同的用户设置不同的affiliate
Stripe 添加优惠券删除接口;限制优惠券只能在订阅时使用

(cherry picked from commit 200c0adfba)
2025-05-20 11:30:42 +08:00
shahaibo
a2625fa73f TASK:LLM; 2025-05-20 11:24:02 +08:00
shahaibo
ab804d57c1 TASK:LLM; 2025-05-20 10:42:18 +08:00
shahaibo
cef2fca099 TASK:LLM; 2025-05-20 10:39:00 +08:00
shahaibo
3d783974fc Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-05-20 10:29:30 +08:00
shahaibo
7f5a1615b3 TASK:LLM; 2025-05-20 10:29:22 +08:00
c7b46229b5 删除优惠券
(cherry picked from commit 58af5c5570)
2025-05-19 17:29:06 +08:00
1482bb6ab2 Stripe推广码 部分功能完善
(cherry picked from commit 218d828e0d)
2025-05-19 17:28:52 +08:00
eae4087b3e Stripe支付--添加推广码功能及相应佣金计算
(cherry picked from commit 0ba28588da)
2025-05-19 17:13:28 +08:00
faf98607c4 优惠券查询DTO
(cherry picked from commit 1ce6c74f2c)
2025-05-19 17:04:51 +08:00
6c625de936 Merge branch 'dev/dev_xp' into dev/dev 2025-05-19 14:04:40 +08:00
aeb372bc17 TASK:企业、教育版library元素共享、作品广场作品发布到公共gallery 2025-05-19 14:02:42 +08:00
shahaibo
738144ad22 TASK:LLM; 2025-05-19 10:47:02 +08:00
shahaibo
a67b487dc0 TASK:LLM; 2025-05-19 10:23:53 +08:00
shahaibo
8613d4fc7a TASK:LLM; 2025-05-19 10:15:16 +08:00
shahaibo
6aa1a3d167 TASK:LLM; 2025-05-19 10:00:19 +08:00
shahaibo
59ffa38ff7 TASK:LLM; 2025-05-18 12:46:12 +08:00
c19e9094d1 BUGFIX: generate mode字段传递不准确导致生成结果与图片没有关联 2025-05-09 17:03:42 +08:00
bf92edb267 BUGFIX: 消息被双重转义时无法被正常解析,导致消息一直被重复消费 2025-05-09 07:51:37 +08:00
db55c5597f undividedLayers数据保存失败原因查找 2025-05-09 00:18:00 +08:00
0c79739867 BUGFIX: design之后,未分割图片的保存问题 2025-05-08 15:26:06 +08:00
e484f22788 BUGFIX : design 未分割图层保存问题 2025-05-08 14:54:12 +08:00
c72f382804 designSingle 取消颜色限制 2025-05-08 14:23:40 +08:00
6a694cee18 Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2025-05-08 14:19:41 +08:00
1a077edf0c designSingle 取消颜色限制 2025-05-08 14:19:26 +08:00
shahaibo
68926757dc Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2025-05-07 22:04:21 +08:00
shahaibo
eea57435e5 TASK:minio地址修改; 2025-05-07 22:04:10 +08:00
1f0e8f9cf2 BUGFIX: designSingle时,添加相同类型的服装导致未分割图层获取混乱 2025-05-07 14:10:42 +08:00
shahaibo
6d6768e6cb TASK:模块化; 2025-05-06 17:30:01 +08:00
shahaibo
a84fe12a28 TASK:模块化; 2025-05-02 14:33:53 +08:00
shahaibo
be019dcdd0 TASK:模块化; 2025-05-02 14:26:21 +08:00
shahaibo
82d65c3015 TASK:模块化; 2025-04-29 17:21:16 +08:00
shahaibo
815392fffa TASK:模块化; 2025-04-29 16:16:36 +08:00
shahaibo
35e95c835e Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-04-29 15:09:09 +08:00
shahaibo
1263409d7c TASK:模块化; 2025-04-29 15:08:59 +08:00
e5b184ea6d Merge branch 'dev/dev_xp' into dev/dev 2025-04-28 15:26:35 +08:00
aa0778958e BUGFIX: 用户被删除的情况下,获取该云过户原来的评论,点赞等记录 2025-04-28 15:26:07 +08:00
50b78e9898 Merge branch 'dev/dev_xp' into dev/dev 2025-04-28 14:56:48 +08:00
58af5c5570 删除优惠券 2025-04-28 14:56:13 +08:00
63cde1f6a0 Merge branch 'dev/dev_xp' into dev/dev 2025-04-28 14:53:04 +08:00
89e6ee9eff 用户账号不存在的情况下获取评论报错 2025-04-28 14:51:19 +08:00
200c0adfba Affiliate 允许为不同的用户设置不同的affiliate
Stripe 添加优惠券删除接口;限制优惠券只能在订阅时使用
2025-04-28 14:40:42 +08:00
shahaibo
306f4f3987 TASK:模块化; 2025-04-25 15:34:35 +08:00
shahaibo
1240a57405 TASK:模块化; 2025-04-25 11:01:06 +08:00
shahaibo
a9acc83bdf TASK:模块化; 2025-04-25 10:19:12 +08:00
a2d259aea1 从Stripe退款后,修改订单状态,添加退款记录 2025-04-25 10:06:07 +08:00
shahaibo
7ff8a9db22 TASK:模块化; 2025-04-23 15:36:56 +08:00
shahaibo
7b6904059f TASK:模块化; 2025-04-23 15:35:21 +08:00
shahaibo
eec9c6ebf2 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-04-23 14:52:39 +08:00
shahaibo
1e8884a7c3 TASK:模块化; 2025-04-23 14:52:32 +08:00
9d591bb070 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-04-23 14:23:46 +08:00
db4bad22f4 Merge branch 'dev/dev_xp' into dev/dev 2025-04-23 14:23:30 +08:00
58bd986090 图片分割,区分类型 2025-04-23 14:22:21 +08:00
shahaibo
9e5bafc75e TASK:模块化; 2025-04-23 14:05:14 +08:00
shahaibo
938ad7366f TASK:模块化; 2025-04-23 11:22:52 +08:00
shahaibo
56ec903807 TASK:模块化; 2025-04-23 10:56:32 +08:00
shahaibo
5913445257 TASK:模块化; 2025-04-23 10:25:02 +08:00
shahaibo
2d1d458929 TASK:模块化; 2025-04-23 10:14:15 +08:00
shahaibo
5a0c461961 TASK:模块化; 2025-04-22 16:24:05 +08:00
shahaibo
74ad20646d TASK:模块化; 2025-04-22 16:11:00 +08:00
shahaibo
604c57c208 TASK:模块化; 2025-04-22 15:59:08 +08:00
shahaibo
aca21b9d98 TASK:模块化; 2025-04-22 15:26:55 +08:00
shahaibo
b83a416dda TASK:模块化; 2025-04-22 14:20:57 +08:00
shahaibo
d1858ddf83 TASK:模块化; 2025-04-22 14:18:54 +08:00
shahaibo
aa1c48fcfe TASK:模块化; 2025-04-22 13:48:36 +08:00
shahaibo
b19bbf91f2 TASK:模块化; 2025-04-22 11:24:28 +08:00
shahaibo
d9e4fb3022 TASK:模块化; 2025-04-22 09:58:14 +08:00
shahaibo
cc8f2e0778 TASK:模块化; 2025-04-21 23:44:55 +08:00
shahaibo
9b1881349f TASK:模块化; 2025-04-21 23:40:30 +08:00
shahaibo
eacceb4b76 TASK:模块化; 2025-04-21 22:36:03 +08:00
shahaibo
c50c193a46 TASK:模块化; 2025-04-21 22:35:32 +08:00
shahaibo
dfe99ef080 TASK:模块化; 2025-04-21 22:13:53 +08:00
shahaibo
98e1f37c1d TASK:模块化; 2025-04-21 21:50:03 +08:00
shahaibo
05295b1a0d TASK:模块化; 2025-04-21 21:21:23 +08:00
shahaibo
6fb04a66df TASK:模块化; 2025-04-21 21:18:29 +08:00
shahaibo
ba14b67c24 TASK:模块化; 2025-04-21 19:40:41 +08:00
shahaibo
0a4d6ff13b TASK:模块化; 2025-04-21 18:51:43 +08:00
shahaibo
fc2795b83e TASK:模块化; 2025-04-17 16:30:06 +08:00
shahaibo
4c726ff747 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-04-17 16:08:17 +08:00
shahaibo
4ed93c7e48 TASK:模块化; 2025-04-17 16:08:10 +08:00
shahaibo
acb37bc255 TASK:模块化; 2025-04-17 16:07:50 +08:00
shahaibo
9b5040d449 TASK:模块化; 2025-04-16 16:35:51 +08:00
shahaibo
fe0d1f39b0 TASK:模块化; 2025-04-16 16:28:27 +08:00
79d2720733 Merge branch 'dev/dev_xp' into dev/dev 2025-04-15 15:58:51 +08:00
218d828e0d Stripe推广码 部分功能完善 2025-04-15 15:58:22 +08:00
2269662290 Stripe支付测试--切换支付方式配置 2025-04-15 11:20:03 +08:00
eaec1e4177 Stripe支付测试--切换支付环境 2025-04-15 10:38:10 +08:00
eaff87882e Merge branch 'dev/dev_xp' into dev/dev 2025-04-15 10:23:30 +08:00
0ba28588da Stripe支付--添加推广码功能及相应佣金计算 2025-04-15 10:22:45 +08:00
25f64831f3 Merge branch 'dev/dev_xp' into dev/dev 2025-04-14 15:20:32 +08:00
d6c869727a 应要求修改参数名 2025-04-14 15:18:54 +08:00
77a06e0edd bugfix:account mapper count 去重问题 2025-04-14 14:58:23 +08:00
21efcf3ea6 查询所有的生成功能名字 2025-04-14 14:14:45 +08:00
d77e1d74b0 Merge branch 'dev/dev_xp' into dev/dev 2025-04-14 13:37:25 +08:00
1ce6c74f2c 优惠券查询DTO 2025-04-14 13:37:01 +08:00
3c4b645772 Merge branch 'dev/dev_xp' into dev/dev 2025-04-14 13:34:56 +08:00
909978467c 查询积分DTO 2025-04-14 13:34:35 +08:00
912c449161 Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/service/CollectionElementService.java
#	src/main/java/com/ai/da/service/impl/CollectionElementServiceImpl.java
2025-04-14 13:30:02 +08:00
7f05bb2f7d 新增接口:图片分割 2025-04-14 13:26:56 +08:00
cbc760ebaf 便利查询--各版本管理员查看用户的design频次和各生成功能使用频次以及积分使用情况 2025-04-13 17:20:14 +08:00
shahaibo
48bb0cbff5 TASK:模块化; 2025-04-11 17:42:36 +08:00
shahaibo
1403b7851a TASK:模块化; 2025-04-11 15:11:44 +08:00
shahaibo
c36081996d TASK:模块化; 2025-04-11 14:33:25 +08:00
shahaibo
14dbc35eda TASK:模块化; 2025-04-11 14:16:54 +08:00
shahaibo
64c03768ff TASK:模块化; 2025-04-11 14:07:37 +08:00
shahaibo
b806bef0bf TASK:模块化; 2025-04-11 11:03:48 +08:00
shahaibo
811d22e229 TASK:模块化; 2025-04-11 10:49:22 +08:00
shahaibo
1ee612674e TASK:模块化; 2025-04-11 10:10:38 +08:00
shahaibo
cf9b621159 TASK:模块化; 2025-04-10 14:17:28 +08:00
shahaibo
03ae184541 TASK:模块化; 2025-04-10 14:00:33 +08:00
shahaibo
6b62d26544 TASK:模块化; 2025-04-10 11:01:24 +08:00
shahaibo
3883864558 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-04-09 10:30:56 +08:00
shahaibo
1089f37022 TASK:模块化; 2025-04-09 10:30:25 +08:00
c661767de3 Merge branch 'dev/dev_xp' into dev/dev 2025-04-09 09:48:51 +08:00
7b75e6ac69 获取所有姿势变换的pose 2025-04-09 09:48:00 +08:00
bd1f1deb53 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-04-08 18:07:00 +08:00
e142d50d18 Merge branch 'dev/dev_xp' into dev/dev 2025-04-08 18:06:40 +08:00
6250e763c3 获取所有姿势变换的pose 2025-04-08 18:05:49 +08:00
shahaibo
4cda43f3b5 TASK:模块化; 2025-04-08 17:29:10 +08:00
shahaibo
fd8d71e2a2 TASK:模块化; 2025-04-08 15:15:39 +08:00
shahaibo
87b702c24b TASK:模块化; 2025-04-08 11:09:28 +08:00
shahaibo
27cd98f0db TASK:模块化; 2025-04-07 17:12:33 +08:00
shahaibo
d1603fbc16 TASK:模块化; 2025-04-07 16:07:26 +08:00
shahaibo
96ba29a9a2 TASK:模块化; 2025-04-03 15:31:39 +08:00
shahaibo
5d9ca09272 TASK:模块化; 2025-04-03 14:27:03 +08:00
shahaibo
64676736b5 TASK:模块化; 2025-04-03 14:22:21 +08:00
shahaibo
7106482831 TASK:模块化; 2025-04-03 14:14:28 +08:00
shahaibo
b1c8606432 TASK:模块化; 2025-04-03 13:49:36 +08:00
shahaibo
0eb02c598e Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-04-02 17:14:32 +08:00
shahaibo
b6367d72ba TASK:模块化; 2025-04-02 17:13:58 +08:00
2e76bded8c Merge branch 'dev/dev_xp' into dev/dev 2025-04-02 15:57:18 +08:00
0e7c07b3b5 上传模特时保存点位信息接口修改 2025-04-02 15:56:05 +08:00
shahaibo
3e3b1eb868 TASK:模块化; 2025-04-02 15:32:48 +08:00
shahaibo
ec0309d6f2 TASK:模块化; 2025-04-02 15:27:16 +08:00
shahaibo
8ee7a030bd Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-04-02 15:18:27 +08:00
shahaibo
ca9778a416 TASK:模块化; 2025-04-02 15:18:20 +08:00
07504d8412 Merge branch 'dev/dev_xp' into dev/dev 2025-04-02 13:34:11 +08:00
88796f7f28 修改添加系统模特到个人lib接口和保存模特接口 2025-04-02 13:32:12 +08:00
shahaibo
8764e750ff Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-04-02 13:14:16 +08:00
shahaibo
9d2cb29255 TASK:模块化; 2025-04-02 13:09:48 +08:00
a1b8f9e000 修改添加系统模特到个人lib接口 2025-04-02 12:03:48 +08:00
6f2c670fce Merge branch 'dev/dev_xp' into dev/dev 2025-04-02 11:09:41 +08:00
d21cb4adfc 修改模特保存接口和添加系统模特到个人lib接口 2025-04-02 11:08:35 +08:00
shahaibo
97b922c1be TASK:模块化; 2025-04-01 17:52:55 +08:00
shahaibo
0af5b2121c TASK:模块化; 2025-04-01 17:44:16 +08:00
36be8b5420 修改模特比例接口不再与模特点位信息关联 2025-04-01 17:22:45 +08:00
a34d775f63 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-04-01 17:16:49 +08:00
1bee672592 Merge branch 'dev/dev_xp' into dev/dev 2025-04-01 17:16:27 +08:00
shahaibo
cf08f9126e TASK:模块化; 2025-04-01 17:16:27 +08:00
8e938e9f06 更新模特点位接口修改 2025-04-01 17:15:38 +08:00
shahaibo
a08744f71a TASK:模块化; 2025-04-01 15:42:15 +08:00
shahaibo
913c4c1ece TASK:模块化; 2025-04-01 15:20:59 +08:00
shahaibo
63ee41e3b8 Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2025-03-31 17:47:33 +08:00
shahaibo
08072001a7 BUGFIX:dislike合并逻辑去除; 2025-03-31 17:47:25 +08:00
6b4d82a67d AiDA 8折优惠活动恢复 2025-03-31 17:45:16 +08:00
shahaibo
03f3162dc1 TASK:模块化; 2025-03-31 15:40:36 +08:00
shahaibo
0eb839e7c7 TASK:模块化; 2025-03-31 15:37:05 +08:00
shahaibo
807d3e1c46 TASK:模块化; 2025-03-31 15:27:17 +08:00
shahaibo
e6f990b766 TASK:模块化; 2025-03-31 15:02:44 +08:00
shahaibo
6dcc492127 TASK:模块化; 2025-03-31 11:53:43 +08:00
shahaibo
a2bd2fa6c6 TASK:模块化; 2025-03-31 11:21:45 +08:00
5612b5b1d4 AiDA 8折优惠活动 2025-03-31 09:48:09 +08:00
shahaibo
2edf7d211b TASK:模块化; 2025-03-30 23:31:00 +08:00
shahaibo
890265611a TASK:模块化; 2025-03-30 16:14:13 +08:00
shahaibo
48c7182f98 TASK:模块化; 2025-03-30 15:56:03 +08:00
shahaibo
2cfd342ef8 TASK:模块化; 2025-03-28 11:14:48 +08:00
shahaibo
63513df053 TASK:模块化; 2025-03-28 11:05:45 +08:00
shahaibo
bb00d9a714 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-03-28 09:37:51 +08:00
shahaibo
3398992bcd TASK:模块化; 2025-03-28 09:37:42 +08:00
2912463562 Merge branch 'dev/dev_xp' into dev/dev 2025-03-27 17:46:47 +08:00
3df4433381 BUGFIX: sketch拼贴 2025-03-27 17:46:09 +08:00
1d46a3b6d4 修改本地缓存的过期时间 2025-03-27 15:38:25 +08:00
shahaibo
a8f868e215 TASK:模块化; 2025-03-27 14:32:56 +08:00
shahaibo
78a5bebb4f TASK:模块化; 2025-03-27 13:55:16 +08:00
shahaibo
33582922be TASK:模块化; 2025-03-27 13:38:47 +08:00
shahaibo
e6234213f0 TASK:模块化; 2025-03-27 13:33:09 +08:00
shahaibo
1d9a89d7c7 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-03-26 15:13:06 +08:00
shahaibo
b0560b840f TASK:模块化; 2025-03-26 15:12:55 +08:00
20b15c0b78 sketch拼贴 添加返回服装分类 2025-03-26 13:39:39 +08:00
a4365abd4d 模特比例修改参数变换 2025-03-25 17:37:35 +08:00
1cb02a62e8 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-03-25 16:20:14 +08:00
67225c1a96 从统一接口获取pose transformation的生成记录 2025-03-25 16:20:00 +08:00
50ecc3a177 Merge branch 'dev/dev_xp' into dev/dev 2025-03-25 16:11:33 +08:00
63c9ff36a1 新增like\dislike pose transformation接口 2025-03-25 16:11:03 +08:00
shahaibo
dc62ca956c Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-03-25 16:10:19 +08:00
shahaibo
d45c555415 TASK:模块化; 2025-03-25 16:10:10 +08:00
a657464d22 sketch拼贴 获取模块信息走统一接口 2025-03-25 14:56:16 +08:00
b5b67e0c75 Merge branch 'dev/dev_xp' into dev/dev 2025-03-25 14:43:47 +08:00
619d0e817f sketch拼贴 获取画布走统一接口 2025-03-25 14:37:38 +08:00
shahaibo
5d7beca57d Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-03-25 13:16:40 +08:00
shahaibo
9a933e74ff TASK:模块化; 2025-03-25 13:16:31 +08:00
0b60dd799f Merge branch 'dev/dev_xp' into dev/dev 2025-03-25 11:45:37 +08:00
a38c15005e 开发环境 添加邮件相关配置信息 2025-03-25 11:45:10 +08:00
b5a8c635d6 Merge branch 'dev/dev_xp' into dev/dev 2025-03-25 11:38:31 +08:00
6b288a3b3c 邮件发送系统-初版 2025-03-25 11:37:53 +08:00
9a5718cc35 Merge remote-tracking branch 'origin/dev/dev' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/python/PythonService.java
2025-03-25 11:26:50 +08:00
cc804bac7d Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/python/PythonService.java
2025-03-25 11:25:22 +08:00
b18a5a0050 模特比例修改、sketch拼贴 2025-03-25 11:22:17 +08:00
078a0c0dfb 模特比例修改、sketch拼贴 2025-03-25 11:19:55 +08:00
shahaibo
d080fc04bb TASK:模块化; 2025-03-25 10:51:16 +08:00
shahaibo
ae484c9e6c TASK:模块化; 2025-03-24 15:59:46 +08:00
shahaibo
39cb20618b TASK:代码覆盖修复; 2025-03-24 15:08:23 +08:00
shahaibo
5b95401204 TASK:AiDA模块化 2025-03-21 09:59:42 +08:00
6b62cf7299 PoseTransformation-初版 2025-03-20 17:42:16 +08:00
shahaibo
af352bbfe8 TASK:AiDA模块化 2025-03-20 16:47:34 +08:00
shahaibo
4d7673e8df TASK:AiDA模块化 2025-03-20 16:46:13 +08:00
shahaibo
55ec6da74b TASK:AiDA模块化 2025-03-19 14:13:16 +08:00
shahaibo
83d9a5befb TASK:AiDA模块化 2025-03-19 14:08:16 +08:00
shahaibo
ec836a6470 TASK:AiDA模块化 2025-03-19 12:17:29 +08:00
shahaibo
d6f9aa155e TASK:AiDA模块化 2025-03-19 11:55:38 +08:00
shahaibo
d3b507ed45 TASK:AiDA模块化 2025-03-19 11:35:13 +08:00
shahaibo
b027396567 TASK:AiDA模块化 2025-03-19 11:09:15 +08:00
shahaibo
7d0a6ae2bf TASK:AiDA模块化 2025-03-19 11:02:13 +08:00
shahaibo
d12bf41021 TASK:AiDA模块化 2025-03-19 10:51:15 +08:00
shahaibo
ca3a584100 TASK:AiDA模块化 2025-03-19 10:47:39 +08:00
shahaibo
47d0856296 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-03-19 10:39:52 +08:00
shahaibo
a828d75248 TASK:AiDA模块化 2025-03-19 10:39:42 +08:00
edc769ca79 to dev 2025-03-19 09:56:21 +08:00
0a22f01587 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-03-19 09:52:49 +08:00
45f0d571d6 Merge branch 'release/3.0' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/common/config/MyTaskScheduler.java
2025-03-19 09:51:36 +08:00
shahaibo
880adf7c69 TASK:AiDA模块化 2025-03-19 09:48:14 +08:00
shahaibo
591b4bf119 TASK:AiDA模块化 2025-03-19 09:27:10 +08:00
0500557dca BUGFIX: 获取pantone值为空时返回rgb和hsv 2025-03-18 18:47:05 +08:00
654a3829c6 BUGFIX: 获取RGB对应的PanTone数据失败,导致返回颜色为空 2025-03-18 17:39:39 +08:00
shahaibo
2db65776b1 TASK:AiDA模块化 2025-03-18 17:38:28 +08:00
shahaibo
7742bd56f8 TASK:AiDA模块化 2025-03-18 17:11:36 +08:00
shahaibo
3159208a0a TASK:AiDA模块化 2025-03-18 16:54:21 +08:00
fccafba438 Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2025-03-18 15:33:38 +08:00
8cd4cfb36d getDetail 添加日志,打印入参回参 2025-03-18 15:33:24 +08:00
shahaibo
971b2034ee TASK:AiDA模块化 2025-03-18 13:43:59 +08:00
shahaibo
f17d171231 TASK:AiDA模块化 2025-03-17 11:42:02 +08:00
shahaibo
4be008382f TASK:AiDA模块化 2025-03-17 11:37:12 +08:00
shahaibo
1ae1703f53 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-03-17 11:30:48 +08:00
shahaibo
340227d9a6 TASK:AiDA模块化 2025-03-17 11:30:09 +08:00
shahaibo
fb99e83b2d TASK:AIDA模块化; 2025-03-16 13:48:54 +08:00
shahaibo
8fa76c6732 TASK:AiDA模块化 2025-03-16 13:09:50 +08:00
shahaibo
1637db2fe3 TASK:AiDA模块化 2025-03-13 17:57:27 +08:00
shahaibo
7e55b1f85e BUGFIX: 隐藏加载不出minio的相关数据; 2025-03-13 17:53:35 +08:00
shahaibo
575d1492ad BUGFIX: 隐藏加载不出minio的相关数据; 2025-03-12 23:22:41 +08:00
shahaibo
a043db2de5 BUGFIX: 隐藏加载不出minio的相关数据; 2025-03-12 22:48:18 +08:00
shahaibo
d3ee0e5f4f BUGFIX: 隐藏加载不出minio的相关数据; 2025-03-12 22:06:39 +08:00
shahaibo
484a8d1d93 BUGFIX: 隐藏加载不出minio的相关数据; 2025-03-12 22:00:07 +08:00
shahaibo
7839ac3322 BUGFIX: 隐藏加载不出minio的相关数据; 2025-03-12 21:54:23 +08:00
shahaibo
e16f494cf4 Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2025-03-12 21:26:33 +08:00
shahaibo
6fc22784b8 BUGFIX: 隐藏加载不出minio的相关数据; 2025-03-12 21:26:24 +08:00
52bafa95e3 关闭默认从Code-Create创建游客账号的定时器 2025-03-03 21:17:14 +08:00
377c86e390 Stripe 回调判空并直接返回 2025-02-28 14:30:35 +08:00
79abe93744 Stripe 回调判空并直接返回 2025-02-28 14:27:36 +08:00
f580955c97 Stripe 回调判空 2025-02-28 14:18:32 +08:00
6a625ed4ea 设置未修改局部design图时的图片地址 2025-02-27 09:58:35 +08:00
8a47d9f3da 修改历史数据中的mask分割状态 2025-02-25 18:27:23 +08:00
148b6492ea 现在design后的mask 默认已分割 2025-02-25 18:14:43 +08:00
be3fa7a704 编辑前后片,添加日志打印 2025-02-25 18:03:52 +08:00
63af2daf28 打开前后片编辑 2025-02-25 15:44:21 +08:00
37be3a1759 1、局部design 未保存前,不覆盖原图
2、打开前后片编辑
2025-02-25 15:22:14 +08:00
df2547ff81 参数名统一 2025-02-25 14:24:15 +08:00
7693de93dc 参数名统一 2025-02-25 14:19:32 +08:00
c061045466 Merge branch 'dev/dev_xp' into dev/dev 2025-02-25 14:02:58 +08:00
abd68f2dc8 参数结构修改 2025-02-25 14:02:29 +08:00
285f956caa 配置修改 添加桶 2025-02-25 13:03:52 +08:00
019cf4adf4 Merge branch 'dev/dev_xp' into dev/dev 2025-02-25 11:48:39 +08:00
cf38e7253f 局部design 2025-02-25 11:48:08 +08:00
d809362ea7 Merge branch 'dev/dev' into release/3.0 2025-02-25 11:42:51 +08:00
c08987a781 Merge branch 'dev/dev_xp' into dev/dev 2025-02-24 10:37:14 +08:00
e60c3d7aa3 Stripe webhook charge回调处理 2025-02-24 10:36:42 +08:00
614b8d0948 to prod 2025-02-21 17:56:50 +08:00
8834b906f4 Merge branch 'dev/dev_xp' into dev/dev 2025-02-21 17:39:35 +08:00
828a022768 漏传 2025-02-21 17:39:12 +08:00
26c8d08d04 Merge branch 'dev/dev_xp' into dev/dev 2025-02-21 17:35:35 +08:00
68a9b2281a 管理员系统部分优化、stripe异常通知优化 2025-02-21 17:16:44 +08:00
63df493d33 切换dev支付环境为测试环境,回调端点为dev端点 2025-02-21 13:02:30 +08:00
b7110c80b5 切换dev支付回调端点 2025-02-21 12:51:11 +08:00
c4dbd10a85 to dev 2025-02-20 11:10:00 +08:00
041a407978 Merge branch 'release/3.0' into dev/dev 2025-02-20 11:00:41 +08:00
f73c997c38 Merge branch 'dev/dev_xp' into dev/dev 2025-02-20 10:59:58 +08:00
db2a955dea 生成结果均低于输出标准时的提示语句更换 2025-02-20 10:57:43 +08:00
a91643d2ec to prod 2025-02-19 17:44:14 +08:00
269cf7ea03 关闭merchant邮箱,test支付环境不通知商家 2025-02-19 16:40:12 +08:00
e3aa964db8 切换支付环境为test 2025-02-19 16:32:28 +08:00
fa2fa66d4a 打开商家邮箱 用于接收邮件通知 2025-02-19 14:54:24 +08:00
6d2a189fef 更换支付方式 2025-02-19 14:43:42 +08:00
2033f61c7e 切换支付环境为live 2025-02-19 14:28:07 +08:00
4e2222966f 修改邮件模板ID 2025-02-19 14:23:43 +08:00
fbe9dc87e9 Stripe 回调添加异常处理和异常情况下邮件通知 2025-02-19 14:14:20 +08:00
d6f078ab60 添加判断,确认邮件是否发送成功 2025-02-18 17:07:16 +08:00
a940863799 stripe 一次订阅 bug修复 2025-02-18 15:00:57 +08:00
11ffa66851 stripe 一次订阅 添加日志打印 2025-02-18 14:09:27 +08:00
fc3fa22bee 更换stripe-webhook回调密钥 2025-02-18 11:31:49 +08:00
37ff60fcfb Stripe 添加一次订阅服务(默认关闭自动续订功能) 2025-02-17 17:14:30 +08:00
d2d5eebe12 to dev 2025-02-17 10:52:11 +08:00
9cfb5aa344 Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2025-02-17 10:19:17 +08:00
5e7f898840 BUGFIX: 用户支付后获取账号到期时间为空,无法更新账号信息 2025-02-17 10:18:57 +08:00
shahaibo
6d3253aed3 BUGFIX: bindEmail; 2025-02-14 11:49:37 +08:00
shahaibo
52e5f246ce Merge branch 'dev/dev' into release/3.0 2025-02-13 12:57:37 +08:00
shahaibo
6222377bc5 BUGFIX: dev恢复toProductImage、relight消费; 2025-02-13 11:57:00 +08:00
shahaibo
2d10f57643 BUGFIX: dev关闭toProductImage、relight消费; 2025-02-13 11:42:45 +08:00
shahaibo
5f27a95498 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-02-13 11:07:02 +08:00
shahaibo
7fdf832f44 BUGFIX: toProductImage、relight; 2025-02-13 11:06:19 +08:00
43d2f83677 BUGFIX:For input string: "[0.3400879, 0.3400879]" 2025-02-12 13:20:12 +08:00
e882a15aa0 Merge branch 'dev/dev' into release/3.0 2025-02-12 13:07:25 +08:00
1a3f16119b Merge branch 'dev/dev_xp' into dev/dev 2025-02-12 12:13:52 +08:00
8e2e515af3 BUGFIX:印花 不等比缩放适配历史数据 2025-02-12 12:13:25 +08:00
f1a2495431 Merge branch 'dev/dev' into release/3.0 2025-02-12 10:34:02 +08:00
c66b794daa Merge branch 'dev/dev_xp' into dev/dev 2025-02-12 10:33:39 +08:00
b9f7ea2722 BUGFIX: 多个印花 不等比缩放适配历史数据 2025-02-12 10:33:11 +08:00
455e17d4b1 Merge branch 'dev/dev' into release/3.0 2025-02-12 10:19:45 +08:00
a1a6a78dac Merge branch 'dev/dev_xp' into dev/dev 2025-02-12 10:14:17 +08:00
07f91aef74 BUGFIX: 印花不等比缩放适配历史数据 2025-02-12 10:13:54 +08:00
shahaibo
079ab4d98f BUGFIX: name 信息绑定邮箱录入; 2025-02-12 09:56:55 +08:00
shahaibo
6e53bc3ca5 TASK: 定时任务; 2025-02-12 09:28:04 +08:00
shahaibo
5e8eb716b1 TASK: name信息; 2025-02-11 20:50:22 +08:00
shahaibo
34ee8fa11d TASK: name信息; 2025-02-11 13:08:00 +08:00
shahaibo
b7dc95af26 TASK:name信息; 2025-02-11 11:35:57 +08:00
shahaibo
297391d57e BUGFIX:试用订单邮件 订单更新时间判断; 2025-02-11 11:27:08 +08:00
shahaibo
aff870fba7 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-02-11 10:25:08 +08:00
7b1ac47228 Merge branch 'dev/dev_xp' into dev/dev 2025-02-10 16:15:20 +08:00
7eb9abbdb5 优化接收Stripe回调时数据重复存储问题(添加唯一索引) 2025-02-10 16:11:59 +08:00
521bd5071a Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/mapper/primary/entity/DesignItemDetailPrint.java
#	src/main/java/com/ai/da/model/vo/DesignSinglePrint.java
#	src/main/java/com/ai/da/python/PythonService.java
#	src/main/java/com/ai/da/python/vo/DesignPythonItemElement.java
#	src/main/java/com/ai/da/python/vo/DesignPythonItemPrint.java
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
2025-02-10 11:21:52 +08:00
ab7e1705c4 修改print scale的数据结构 2025-02-10 11:18:04 +08:00
shahaibo
a2390a6ab2 BUGFIX:试用订单邮件 订单更新时间判断; 2025-02-10 10:34:01 +08:00
shahaibo
8dc5dcb1bd BUGFIX:试用订单邮件 订单更新时间判断; 2025-02-10 10:11:59 +08:00
shahaibo
5d010d2f77 BUGFIX:试用订单邮件 订单更新时间判断; 2025-02-10 10:08:48 +08:00
shahaibo
cec5544472 BUGFIX:试用订单邮件 订单更新时间判断; 2025-02-10 10:05:57 +08:00
shahaibo
5f79c3276a BUGFIX:试用订单邮件 订单更新时间判断; 2025-02-10 10:03:28 +08:00
aadb717c9f to dev 2025-02-07 15:03:24 +08:00
e2e9201fdd 修改印花scale数据类型为数组 2025-02-07 14:57:28 +08:00
shahaibo
9053bdf10c BUGFIX:试用注册; 2025-02-07 12:48:37 +08:00
shahaibo
b14297d1af Merge branch 'dev/dev' into release/3.0 2025-02-07 11:58:36 +08:00
shahaibo
e90979bbdc BUGFIX:试用注册; 2025-02-07 11:58:12 +08:00
shahaibo
e02c278e7a Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-02-07 10:25:20 +08:00
shahaibo
e60d9483a3 BUGFIX:试用订单邮件信息; 2025-02-07 10:25:11 +08:00
shahaibo
ba49312fd5 BUGFIX:试用订单邮件信息; 2025-02-07 10:23:41 +08:00
ba3c98771f BUGFIX: 新建订阅时更新订阅不更新账号信息 2025-02-06 18:39:06 +08:00
4c738cc61d BUGFIX: 返回最新的订阅号 2025-02-06 17:35:35 +08:00
d648a79ec4 BUGFIX: 订阅付款失败时仍有新建订阅 2025-02-06 16:36:07 +08:00
c325927418 to prod 2025-02-06 14:46:50 +08:00
dba5625446 正式支付环境下区分生产分支与测试分支 2025-02-06 14:42:45 +08:00
91189968e9 在dev测试生产环境的Stripe支付功能 2025-02-06 14:37:06 +08:00
433d8a460e to dev 2025-02-06 14:22:27 +08:00
ec9857fe73 Merge branch 'dev/dev_xp' into dev/dev 2025-02-06 14:09:53 +08:00
a9b01566e1 优化积分购买 2025-02-06 14:09:15 +08:00
shahaibo
a384aba4df TASK:定时任务开启; 2025-02-06 10:04:30 +08:00
e587ad3ca1 1、支付环境切换为prod
2、邮件通知对象添加Kim
3、打开定时任务
2025-02-06 09:53:03 +08:00
shahaibo
6a7c8b3d28 Merge branch 'dev/dev' into release/3.0 2025-02-05 14:26:33 +08:00
shahaibo
6f52c956ec TASK:新的试用订单生成; 2025-02-05 14:20:22 +08:00
shahaibo
9e5d2f47e2 BUGFIX:绑定谷歌; 2025-02-05 13:38:10 +08:00
shahaibo
627f264ef3 BUGFIX:绑定谷歌; 2025-02-05 13:02:26 +08:00
shahaibo
464de4ee5a Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-02-05 12:05:07 +08:00
shahaibo
cf76235123 TASK:谷歌微信快捷区分登录注册; 2025-02-05 12:04:53 +08:00
8d9f51f50f 不再清空游客的到期时间 2025-02-05 11:22:45 +08:00
d840185ec7 测试 code-create DB最大连接时长 2025-02-05 10:56:17 +08:00
9f4ab20b9d 测试 code-create DB最大连接时长 2025-02-05 10:49:10 +08:00
0877ff8f66 支付 测试 2025-02-05 10:05:23 +08:00
78046e8707 支付 测试 2025-02-04 15:29:22 +08:00
shahaibo
9fb8bc989d Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-02-04 14:29:32 +08:00
shahaibo
3c89670dae BUGFIX:design重复回退; 2025-02-04 14:29:22 +08:00
21b73d55f7 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-02-04 14:04:17 +08:00
9199cdf7e2 支付 to prod 2025-02-04 14:04:01 +08:00
shahaibo
8589216a77 TASK:绑定邮箱; 2025-02-04 13:53:50 +08:00
shahaibo
87768c6b53 TASK:绑定邮箱、绑定微信; 2025-02-04 11:39:42 +08:00
shahaibo
ca320f4334 TASK:测试dev分支; 2025-02-04 11:00:31 +08:00
shahaibo
7697ab59fa BUGFIX:重复停止组装; 2025-02-04 10:58:35 +08:00
e5e6f360dc Merge branch 'dev/dev_xp' into dev/dev 2025-01-27 16:39:54 +08:00
68a9462714 交易记录下载 返回文件流改为返回文件下载地址 2025-01-27 16:39:19 +08:00
b185a94fcc Merge branch 'dev/dev_xp' into dev/dev 2025-01-27 11:00:10 +08:00
708280ca14 交易记录下载post请求改get请求 2025-01-27 10:58:35 +08:00
0ab1e7eef7 Merge branch 'dev/dev_xp' into dev/dev 2025-01-24 15:50:15 +08:00
c7b1d46b18 maven 依赖冲突解决 2025-01-24 15:49:34 +08:00
9357a62f0c Merge branch 'dev/dev_xp' into dev/dev 2025-01-24 14:28:54 +08:00
c5b25e9a16 优化 删除多余代码 2025-01-24 14:28:21 +08:00
a35d057146 优化 导出交易记录文件 2025-01-24 14:25:32 +08:00
7fc495eec9 Merge branch 'dev/dev_xp' into dev/dev 2025-01-24 13:27:50 +08:00
46f37942d2 将交易记录导出为excel文件 2025-01-24 13:26:53 +08:00
e75196c904 Merge branch 'dev/dev_xp' into dev/dev 2025-01-23 14:15:38 +08:00
bdfa249c2e token过期 日志打印优化 2025-01-23 14:15:12 +08:00
d0e5f7da61 Merge branch 'dev/dev_xp' into dev/dev 2025-01-23 13:57:26 +08:00
d8320ba83d 新增自定义异常 2025-01-23 13:56:48 +08:00
23460800d6 优化请求未携带token时的日志打印 2025-01-23 13:55:48 +08:00
58c8b644bc 佣金计算 打印日志 2025-01-22 16:41:40 +08:00
c4c04aecb6 affiliateIncome 添加字段paymentInfoId 2025-01-22 16:37:40 +08:00
bb7c98c094 affiliate 佣金计算统计 2025-01-22 15:32:09 +08:00
dcdb0d06c4 Merge branch 'dev/dev_xp' into dev/dev 2025-01-15 10:49:08 +08:00
b6a66bed41 查询交易记录 添加付款人字段 2025-01-15 10:45:51 +08:00
shahaibo
5f277ed815 BUGFIX:toproductimage 打光积分不足提示修改; 2025-01-13 15:12:54 +08:00
shahaibo
845a553097 BUGFIX:微信名解析、toproductimage 打光积分不足code码修改; 2025-01-13 14:11:03 +08:00
74f89c8b2d 只填写国家和职业(不发送验证码) 2025-01-13 11:15:31 +08:00
cff8227228 Merge branch 'dev/dev_xp' into dev/dev 2025-01-13 11:13:31 +08:00
51e2c9af02 只填写国家和职业(不发送验证码) 2025-01-13 11:11:01 +08:00
cd89a77189 漏传 2025-01-13 10:56:06 +08:00
ab303cfeef 绑定邮箱时添加国家、职业信息 2025-01-13 10:55:08 +08:00
shahaibo
07004a7415 TASK:去日志; 2025-01-13 10:20:14 +08:00
shahaibo
d2069a3e7f TASK:去日志; 2025-01-13 10:12:04 +08:00
shahaibo
501cee0057 TASK:去日志; 2025-01-13 10:05:38 +08:00
ac2454fd0e 绑定邮箱时添加国家、职业信息 2025-01-10 17:16:08 +08:00
931a4cf807 to dev 2025-01-10 17:01:59 +08:00
cb7099264e 绑定邮箱时需要填写国家和职业 2025-01-10 16:54:44 +08:00
e7aa951e89 漏传 2025-01-10 16:19:53 +08:00
ef70598180 修改查询交易记录接口
1、添加按id排序
2、添加查询所有国家
3、添加接口,更新用户国家、职业信息
2025-01-10 16:13:45 +08:00
698fca8787 查询各平台交易记录 2025-01-10 13:27:27 +08:00
2f86090f21 Merge branch 'dev/dev' into dev/dev_xp 2025-01-10 13:05:26 +08:00
2988a3b34e 修改code-create数据库 sql语句修改 2025-01-09 13:50:08 +08:00
shahaibo
4fe5f65867 TASK:AiDA design like sort 2025-01-08 16:56:02 +08:00
shahaibo
4bb1953d4a Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-01-08 15:39:32 +08:00
shahaibo
57a8260f03 TASK:AiDA design like sort 2025-01-08 15:38:29 +08:00
e4936a23bc 编辑用户名,改为当前月允许修改5次 2025-01-08 14:20:12 +08:00
9f37cb3f8d Merge branch 'release/3.0' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/controller/ConvenientInquiryController.java
#	src/main/java/com/ai/da/model/dto/DesignCollectionDTO.java
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
2025-01-08 10:33:49 +08:00
b128b2436d 限制人员添加用户 2025-01-08 10:24:51 +08:00
66158e94dd 限制人员添加用户 2025-01-08 10:12:43 +08:00
f6b489d950 添加管理员页面访问者 2025-01-08 09:50:13 +08:00
30312caf82 添加管理员访问者 2025-01-07 17:27:29 +08:00
1d0dd65f5e Merge branch 'dev/dev_xp' into dev/dev 2025-01-07 17:21:54 +08:00
shahaibo
0b245f62af TASK:AiDA design like sort、moodboardPosition 2025-01-07 17:16:45 +08:00
50d90af3a5 添加管理员访问者 2025-01-07 17:15:22 +08:00
shahaibo
49b8585522 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-01-07 15:30:33 +08:00
shahaibo
b49f098a5e TASK:AiDA design like sort、moodboardPosition 2025-01-07 15:29:46 +08:00
e9a15b950e Merge branch 'dev/dev_xp' into dev/dev 2025-01-07 14:37:28 +08:00
ee676614f8 统一多种支付方式创建订单的入参 2025-01-07 14:31:43 +08:00
710abf2323 修改积分价格,for test 2025-01-07 11:47:33 +08:00
1a9f06d259 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-01-07 11:26:16 +08:00
shahaibo
eaaa99a946 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-01-07 11:16:14 +08:00
shahaibo
c8e4d624b7 TASK:AiDA design like sort 2025-01-07 11:15:25 +08:00
f08e36d100 Merge branch 'dev/dev_xp' into dev/dev 2025-01-07 11:12:30 +08:00
de73536d1c 解析所有发起购买的客户端ip地址 2025-01-07 11:09:22 +08:00
6a861305d6 解析所有发起购买的客户端ip地址 2025-01-07 11:07:49 +08:00
shahaibo
367fa130c0 BUGFIX:moodboard edit; 2025-01-07 10:58:57 +08:00
shahaibo
d04987a3e2 BUGFIX:moodboard edit; 2025-01-07 09:58:36 +08:00
b0fa185d36 更改积分刷新task 2025-01-06 14:58:46 +08:00
094718e67f Merge branch 'dev/dev_xp' into dev/dev 2025-01-06 14:47:40 +08:00
e4a8bf80e9 1、用户详细信息添加国家、职业、用户名修改剩余次数
2、积分不够 返回异常提示类型更改
3、添加根据ip解析地理位置测试接口
4、更新积分刷新机制(每月1号0点刷新年费用户积分)
2025-01-06 14:42:08 +08:00
shahaibo
c04b102a81 TASK:AiDA design like sort 2025-01-06 11:49:47 +08:00
shahaibo
da9b3a04b4 TASK:AiDA design like sort 2025-01-06 11:35:54 +08:00
shahaibo
234a030801 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2025-01-06 10:49:39 +08:00
shahaibo
5ea8e851d7 TASK:AiDA design like sort 2025-01-06 10:46:51 +08:00
shahaibo
afeeef4af7 TASK:试用订单接收名单添加; 2025-01-04 21:35:21 +08:00
ee1e2f8556 获取所有标签 2025-01-02 17:32:49 +08:00
1157b41730 积分购买 添加邮件通知 2024-12-31 11:38:12 +08:00
ca4d75c63f BUGFIX:用户订阅后更新用户身份和积分 2024-12-27 14:29:07 +08:00
f45bd7acc4 develop 环境webhook_secret变更 2024-12-27 10:46:52 +08:00
7bdd62d4a9 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-12-27 10:32:09 +08:00
b01ee9129b develop 环境webhook_secret变更 2024-12-27 10:31:27 +08:00
shahaibo
214c93923c Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-12-24 14:01:34 +08:00
shahaibo
bfa1d67b5c BUGFIX:Collection not found 2024-12-24 14:00:44 +08:00
a0a1a1a06a Merge branch 'dev/dev_xp' into dev/dev 2024-12-23 17:31:53 +08:00
468ad385d7 用户登录时,不校验游客账号有效期 2024-12-23 17:29:48 +08:00
fa94667c0f 游客到期时间不置空 2024-12-23 16:07:05 +08:00
c997fbf1cb Merge branch 'dev/dev_xp' into dev/dev 2024-12-23 14:35:29 +08:00
7283ace072 getAffiliateList 添加返回用户名 2024-12-23 14:31:48 +08:00
shahaibo
69743d4ef0 BUGFIX:谷歌快捷登录 2024-12-23 10:27:01 +08:00
shahaibo
e033671ffb TASK:AiDA 2024-12-20 16:11:52 +08:00
shahaibo
15cde37af7 TASK:AiDA 2024-12-20 11:44:21 +08:00
shahaibo
7fb74bc7d8 TASK:AiDA 2024-12-19 17:52:14 +08:00
43968995ea generate去除额外prompt 2024-12-19 17:37:28 +08:00
0574180e4b generate去除额外prompt 2024-12-19 17:26:16 +08:00
5b653272ee 覆盖代码恢复-获取个人信息 2024-12-19 17:15:55 +08:00
d28a6051f1 Merge branch 'release/3.0' into dev/dev 2024-12-19 16:02:59 +08:00
f9063ad26e generate print翻译输入修改 2024-12-19 16:01:35 +08:00
2f4d060ca3 generate print翻译输入修改 2024-12-19 15:59:18 +08:00
fcd0cf4836 Merge branch 'release/3.0' into dev/dev 2024-12-19 15:32:10 +08:00
26f50c2acb generate print翻译输入修改 2024-12-19 15:26:27 +08:00
c3eb1fc78c Merge branch 'dev/dev_xp' into dev/dev 2024-12-19 14:04:28 +08:00
b15cc542e1 按id查询订单 2024-12-19 13:56:17 +08:00
shahaibo
ec094d7471 TASK:AiDA 2024-12-19 13:31:01 +08:00
shahaibo
3dc432131c TASK:AiDA 2024-12-19 11:13:30 +08:00
shahaibo
1a19604163 TASK:AiDA 2024-12-19 10:51:38 +08:00
fdebb2b215 Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/model/vo/AccountLoginVO.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-12-18 14:02:06 +08:00
7d8f047087 Affiliate功能-数据库表设计更新 2024-12-18 11:53:41 +08:00
bf8af41f3f 添加Affiliate功能 2024-12-16 10:26:02 +08:00
shahaibo
cdf29d2b0d TASK:AiDA 2024-12-13 16:07:21 +08:00
shahaibo
7194049127 TASK:prompt修改; 2024-12-13 11:32:42 +08:00
shahaibo
e34cec812f Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2024-12-13 10:35:17 +08:00
shahaibo
11a5b53d2a BUGFIX:prompt重复拼接; 2024-12-13 10:34:14 +08:00
efe22de0a0 Merge branch 'refs/heads/dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/common/utils/SendEmailUtil.java
#	src/main/java/com/ai/da/mapper/primary/entity/Account.java
2024-12-11 16:52:16 +08:00
shahaibo
82f7571612 TASK:AiDA 2024-12-11 16:21:18 +08:00
shahaibo
2ac54a50ec TASK:AiDA 2024-12-11 14:21:29 +08:00
5dd1e10b61 to dev 2024-12-10 10:09:21 +08:00
e9e8e87719 Merge branch 'release/3.0' into dev/dev 2024-12-10 10:04:27 +08:00
3c0fa205d1 BUGFIX:code-create注册的新用户自动添加为aida的游客,去重bug修改 2024-12-09 18:17:09 +08:00
47ca7bde41 Affiliate-新增、查询、佣金计算等 2024-12-09 16:53:29 +08:00
shahaibo
9e28d579d1 Merge branch 'dev/dev' into dev/dev_shb
# Conflicts:
#	src/main/java/com/ai/da/controller/AccountController.java
#	src/main/java/com/ai/da/controller/SavedCollectionController.java
#	src/main/java/com/ai/da/service/AccountService.java
#	src/main/java/com/ai/da/service/UserLikeGroupService.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-12-09 13:44:07 +08:00
shahaibo
1c96522447 TASK:AiDA 2024-12-09 13:31:30 +08:00
shahaibo
1a568621ca BUGFIX:重复申请试用; 2024-12-03 11:51:01 +08:00
eecefee674 Merge branch 'dev/dev' into release/3.0 2024-12-02 14:54:00 +08:00
ea0332851d Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-12-02 14:35:20 +08:00
a25a7dc023 high || fast 生成次数修改 2024-12-02 14:34:10 +08:00
shahaibo
b4fe1ca199 TASK:toproductimage prompt; 2024-12-02 13:51:46 +08:00
shahaibo
b315ae5644 TASK:toproductimage prompt; 2024-12-02 12:02:19 +08:00
徐佩
f7113601f3 Merge branch 'dev/dev' into release/3.0 2024-12-01 20:27:58 +08:00
徐佩
8d6e3e9644 sketchboard-prompt 修改 2024-12-01 19:48:12 +08:00
徐佩
23b864d378 to prod 2024-12-01 17:37:52 +08:00
徐佩
be1119be6f bugfix : fast || high 2024-12-01 16:51:38 +08:00
徐佩
b836e7fd67 bugfix : fast || high 2024-12-01 16:32:51 +08:00
a237b4041d 模型选择 添加high || fast 2024-11-29 15:09:34 +08:00
ea4cd29723 to dev 2024-11-28 17:26:53 +08:00
13397fa1f7 to dev 2024-11-28 17:22:57 +08:00
2fab472150 to dev 2024-11-28 17:21:58 +08:00
8c71b4845a Merge branch 'release/3.0' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-11-28 17:19:40 +08:00
b70f909a32 优化-自动将Code-Create注册的新用户添加到AiDA 2024-11-28 17:14:11 +08:00
1b15aed6a2 支付优化-续订失败邮件通知 2024-11-28 10:43:06 +08:00
5019fbd3fc 支付优化 2024-11-25 10:53:09 +08:00
2ea19dcf03 Merge branch 'refs/heads/dev/dev' into dev/dev_xp 2024-11-19 17:09:36 +08:00
4d756d5624 支付优化 2024-11-19 17:08:16 +08:00
f6f759110f 支付优化--修改积分购买相应功能 2024-11-19 16:00:30 +08:00
8d27b5b51e 新增功能 -- 产品订阅 年度/月度 2024-11-18 16:20:25 +08:00
shahaibo
9f064609e7 TASK:谷歌登录 2024-11-13 15:45:40 +08:00
shahaibo
fd10d4dbc4 TASK:谷歌登录 2024-11-13 15:44:48 +08:00
shahaibo
fadb5faf0d TASK:谷歌登录 2024-11-12 15:34:43 +08:00
e5e514b522 ws优化 2024-11-11 17:31:55 +08:00
74e6d5a1da ws 联调修改 2024-11-11 17:24:49 +08:00
3cf0570912 ws 引入心跳 2024-11-11 16:34:55 +08:00
shahaibo
8da51a0a82 TASK:谷歌登录 2024-11-11 16:08:49 +08:00
shahaibo
37ff7fbb91 Merge remote-tracking branch 'origin/dev/dev' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/service/AccountService.java
2024-11-11 16:06:21 +08:00
shahaibo
8c20b51e13 TASK:谷歌登录 2024-11-11 16:04:26 +08:00
391a28d659 ws 2024-11-11 15:21:35 +08:00
4535fb7dfb ws 2024-11-11 15:07:02 +08:00
546d1b4c44 ws 设置session2分钟超时,以及心跳回复 2024-11-11 15:03:21 +08:00
5fe605c130 长连接 关闭日志打印 2024-11-11 10:45:57 +08:00
4408c0ecc6 to dev 2024-11-11 10:29:06 +08:00
49f08d1191 管理员系统优化-1 2024-11-06 17:51:51 +08:00
903bafb245 管理员系统优化 2024-11-06 17:27:16 +08:00
59b02b3f28 to prod 2024-11-04 10:49:29 +08:00
4a23e33080 BUGFIX:作品删除后,获取点赞详细报错 2024-11-04 10:42:35 +08:00
1e1b06fc48 chat-robot返回sketch图片地址变更 2024-10-29 16:53:17 +08:00
7c56d2bf4e to dev 2024-10-29 10:33:48 +08:00
4add0a806c 游客转试用用户,添加积分 2024-10-29 10:25:36 +08:00
c9bb7fe502 to prod 2024-10-29 10:03:21 +08:00
a8a7a129c9 Merge branch 'dev/dev' into release/3.0 2024-10-29 09:59:39 +08:00
c3c5532cb5 Merge branch 'dev/dev_xp' into dev/dev 2024-10-29 09:58:43 +08:00
78bfc16287 BUGFIX:imageToSketch 积分扣除校验 2024-10-29 09:57:34 +08:00
shahaibo
6c6162df74 BUGFIX:定时任务开启; 2024-10-23 08:54:00 +08:00
shahaibo
a837aff0fb BUGFIX:定时任务开启; 2024-10-22 10:06:12 +08:00
shahaibo
f673afc7fc TASK:配置 2024-10-21 10:59:50 +08:00
shahaibo
0ea96c728c BUGFIX:模特预览默认颜色添加; 2024-10-20 13:39:01 +08:00
shahaibo
77e71e3296 TASK:aida作品集查询; 2024-10-20 13:27:45 +08:00
shahaibo
ce870b9acf TASK:aida; 2024-10-20 11:50:52 +08:00
shahaibo
7f889b54e0 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-20 10:52:24 +08:00
shahaibo
ebd596d0d2 TASK:aida; 2024-10-20 10:52:14 +08:00
04ce95caa4 添加preview_submit字段to python 2024-10-15 10:44:26 +08:00
29bf172187 取消用户自定义mask的功能 2024-10-15 10:30:02 +08:00
shahaibo
41619febb9 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-14 11:18:30 +08:00
shahaibo
0f4b769d49 BUGFIX:moodboard合成图 裁剪; 2024-10-14 11:18:18 +08:00
66cd8217b9 更新undividedLayer临时访问地址缓存 2024-10-14 11:16:57 +08:00
e684c4e547 Merge branch 'release/3.0' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/common/constant/CommonConstant.java
#	src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java
#	src/main/java/com/ai/da/controller/PortfolioController.java
#	src/main/java/com/ai/da/model/dto/QueryPortfolioPageDTO.java
#	src/main/java/com/ai/da/service/PortfolioService.java
#	src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java
#	src/main/resources/messages_en.properties
#	src/main/resources/messages_zh.properties
2024-10-10 23:26:20 +08:00
c439f41d69 bugfix:参与活动作品为0时查询出错 2024-10-09 16:42:45 +08:00
823e96b014 发布准备 2024-10-09 15:47:29 +08:00
0cca24ee30 修改环境及打开监听 2024-10-09 15:44:47 +08:00
66cccd0867 添加校验,二创作品不能参与活动 2024-10-09 15:40:29 +08:00
463ddf3cb2 1、为发布的作品添加标签
2、修改标签
3、不允许用户重复参与活动
4、查询所有参与活动的作品
2024-10-09 13:51:16 +08:00
shahaibo
f0e0987f31 BUGFIX:发布作品返回作品ID; 2024-10-09 13:10:48 +08:00
shahaibo
16bea58ab5 BUGFIX:更新作品集作品名重复判断; 2024-10-09 11:43:05 +08:00
shahaibo
f2bbbaaeb6 BUGFIX:history retrieval返回新增portfolio信息; 2024-10-09 11:34:04 +08:00
shahaibo
5098f6f4a1 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-08 17:07:43 +08:00
shahaibo
bc1815ae1b TASK:pantone提示词; 2024-10-08 17:07:30 +08:00
6256c90958 bugfix:修改提取的sketch,图片后缀问题 2024-10-08 16:36:48 +08:00
f0bfe249e0 bugfix:修改提取的sketch,图片后缀问题 2024-10-08 16:17:45 +08:00
7bbfd7c506 Merge branch 'dev/dev_xp' into dev/dev 2024-10-08 15:49:39 +08:00
3c7cbe28a1 design single preview_submit 2024-10-08 15:48:53 +08:00
c834aacf3a Merge branch 'dev/dev_xp' into dev/dev 2024-10-08 15:44:36 +08:00
90b0ef41e3 bugfix:修改提取出的sketch 2024-10-08 15:44:01 +08:00
shahaibo
2aeeec4468 TASK:裁剪; 2024-10-08 14:05:13 +08:00
a7c5723e10 保存修改 2024-10-08 13:34:10 +08:00
shahaibo
ba595b9d2c Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-08 13:18:12 +08:00
shahaibo
d9118aaf93 TASK:AiDA workshop活动; 2024-10-08 13:17:55 +08:00
1bdc71998b 按标签查询作品 2024-10-08 13:13:13 +08:00
a597f7a67a 为作品添加标签 2024-10-07 21:27:37 +08:00
195964ef5a 重新获取修改后的sketch的临时访问地址 2024-10-07 11:28:48 +08:00
shahaibo
c27ca77717 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-06 14:33:44 +08:00
shahaibo
7d0d460e5c bugfix:redesign bug; 2024-10-06 14:33:31 +08:00
5ac9df3056 Merge branch 'dev/dev_xp' into dev/dev 2024-10-06 14:28:18 +08:00
b8d64f1f28 获取指定用户的个人主页作品 2024-10-06 14:27:55 +08:00
c8dd9664be Merge branch 'dev/dev_xp' into dev/dev 2024-10-04 16:10:05 +08:00
8899a3a6bb SketchStyle 去除自定义风格 2024-10-04 11:45:00 +08:00
shahaibo
67f56f9b84 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-04 10:41:23 +08:00
shahaibo
fd12b9e571 TASK:male sketch style逻辑添加; 2024-10-04 10:40:32 +08:00
fb329c94aa Merge branch 'dev/dev_xp' into dev/dev 2024-10-03 16:49:03 +08:00
16d06582ee 重置designSingle返回的sketch在minio的临时访问凭证 2024-10-03 16:41:48 +08:00
shahaibo
6f98f111dd TASK:十月优惠邮件发送接口; 2024-10-03 12:15:55 +08:00
shahaibo
51a1c1d8e1 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-10-03 12:14:43 +08:00
shahaibo
8445c23984 TASK:十月优惠邮件发送接口; 2024-10-03 12:14:30 +08:00
961f8f874e 获取消息 按时间逆序 2024-10-01 16:08:40 +08:00
283b6244b1 消息推送连接关闭时避免报错 2024-10-01 10:29:06 +08:00
f19a15dbe8 Merge branch 'dev/dev_xp' into dev/dev 2024-09-30 17:16:11 +08:00
791d44df02 消息推送 bug修改 2024-09-30 17:15:11 +08:00
shahaibo
28e67db78d TASK:aida redesign不修改位置信息√接口修改; 2024-09-30 15:41:29 +08:00
shahaibo
63a120c652 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-09-30 14:49:05 +08:00
shahaibo
f60cabbbc0 TASK:aida design统计; 2024-09-30 14:48:44 +08:00
06db759749 my work bug修复 2024-09-30 11:28:53 +08:00
shahaibo
373608d989 TASK:aida design统计; 2024-09-29 18:32:06 +08:00
shahaibo
45e3dde03f Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-09-29 17:59:00 +08:00
shahaibo
3625180a6e Merge branch 'release/3.0' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java
#	src/main/java/com/ai/da/controller/ThirdPartyController.java
#	src/main/java/com/ai/da/service/AccountService.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-09-29 17:56:49 +08:00
aae1442a6f websocket获取关注数与粉丝数 2024-09-29 15:55:12 +08:00
08dcd03468 修改默认头像 2024-09-28 20:14:19 +08:00
shahaibo
deda511e32 TASK:aida; 2024-09-27 16:43:02 +08:00
shahaibo
9bcf615b4b TASK:aida; 2024-09-27 16:30:58 +08:00
shahaibo
70912c4c43 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-09-27 16:24:56 +08:00
shahaibo
fa013c1974 TASK:aida; 2024-09-27 16:24:45 +08:00
11fbeb1ed0 Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/common/utils/RedisUtil.java
#	src/main/java/com/ai/da/service/AccountService.java
2024-09-27 15:43:48 +08:00
f432b8cce6 修改提取的sketch 2024-09-27 15:40:30 +08:00
shahaibo
05ddd33bcd TASK:aida; 2024-09-27 15:33:20 +08:00
shahaibo
9f5c901502 TASK:aida; 2024-09-27 14:42:30 +08:00
33d5d3a2ea 上传图片超时,邮件提醒开发相关人员 2024-09-26 11:46:23 +08:00
2668dd3c47 redis 添加key 2024-09-25 16:17:55 +08:00
2bc5fef175 1、修改用户名
2、更改账号绑定邮箱地址
2024-09-25 16:15:18 +08:00
ea92e1f20d to dev 2024-09-25 11:38:11 +08:00
9f1cf1d90e Merge branch 'dev/dev_xp' into dev/dev 2024-09-25 11:31:40 +08:00
b43f9baead 修改 imageToSketch 2024-09-25 11:30:51 +08:00
shahaibo
41ffe335fc TASK:mq配置 2024-09-24 15:43:37 +08:00
shahaibo
56d0dcd25f TASK:数据迁移 2024-09-24 15:20:24 +08:00
shahaibo
4304acbe6f BUGFIX:作品广场 2024-09-24 14:37:22 +08:00
2f1b22d423 Merge branch 'refs/heads/release/3.0' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/common/utils/RedisUtil.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
#	src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java
2024-09-24 10:27:18 +08:00
3eb8626831 修改 imageToSketch 2024-09-24 10:20:08 +08:00
5a86f2e649 修改 imageToSketch 2024-09-23 11:13:44 +08:00
93e9c61943 1、新增 imageToSketch
2、删除无用代码
2024-09-20 11:32:09 +08:00
shahaibo
c5e9941adb BUGFIX:design colorboard元素混入sketchboard; 2024-09-20 11:31:48 +08:00
56679808e9 mask更新 从sketch分割 2024-09-19 09:50:56 +08:00
shahaibo
40f5705e7a TASK:凭证更新; 2024-09-13 11:24:14 +08:00
shahaibo
32975d9900 TASK:链接注册试用; 2024-09-13 11:16:17 +08:00
shahaibo
72db49e7f5 Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2024-09-13 11:13:42 +08:00
shahaibo
472f5e65b4 TASK:凭证更新; 2024-09-13 11:13:23 +08:00
e2f8fb082c 广场用户注册修改 添加账户开始时间并设置积分为0 2024-09-13 10:43:28 +08:00
a47e53b19e mask 数据替换,代码暂存 2024-09-13 10:09:33 +08:00
c01acec9e6 Merge branch 'dev/dev_xp' into dev/dev 2024-09-09 10:50:14 +08:00
969d7586fc mask替换相关接口--未完善版,暂存 2024-09-06 12:34:36 +08:00
31a40ff7ca 关闭dev定时任务 2024-09-06 10:01:28 +08:00
afb9c99228 Merge branch 'dev/dev_xp' into dev/dev 2024-09-06 09:32:40 +08:00
8ee6a529a0 作品广场优化,将点赞前三和浏览量前三的作品放在第一页的最前面 2024-09-02 12:02:54 +08:00
cebc05d132 BUGFIX:管理员系统 添加新用户邮箱校验,相同的邮箱只能创建一个账号 2024-08-27 11:32:47 +08:00
d23ac82b1b TASK:code-create 注册用户添加为AiDA的游客
BUGFIX:0关注状态下获取动态
2024-08-27 11:27:05 +08:00
e86b576050 TASK:动态 2024-08-23 17:34:38 +08:00
8a774aa328 管理员系统 优化 按用户名或用户邮箱 查询用户design频率 2024-08-21 15:07:14 +08:00
c5da68dc47 1、获取关注、粉丝列表、消息详细 返回参数统一
2、管理员系统 按用户名或用户邮箱 查询用户design频率
2024-08-21 14:31:10 +08:00
28df672a7d 优化 获取关注、粉丝列表 2024-08-21 10:23:55 +08:00
203c88dd70 添加头像 2024-08-19 15:10:41 +08:00
fa86a2af45 添加关注、取消关注、获取关注列表、粉丝列表相关接口 2024-08-19 11:52:53 +08:00
ac28ba233c 消息通知系统-一键已读;反复点赞、关注及取消 数据存储处理, 2024-08-16 10:32:15 +08:00
shahaibo
47dc2bfc6e BUGFIX:二创变原创 2024-08-15 16:37:24 +08:00
085dac0630 消息通知系统 2024-08-15 16:25:44 +08:00
7b27b1362d Merge branch 'dev/dev_xp' into release/3.0
# Conflicts:
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-08-12 09:54:28 +08:00
704e3c25bf BUG修复:用户更改套餐,积分/用户角色不变更问题 2024-08-12 09:51:39 +08:00
7e5b10aab3 通过邮箱查询账户,忽略邮箱大小写 2024-08-08 10:54:22 +08:00
3ccbd8f905 账号置为游客日志添加 2024-08-08 10:13:47 +08:00
89a234e77d to prod 2024-08-06 11:43:20 +08:00
388dd54bfa to prod 2024-08-06 11:41:48 +08:00
035c4412f1 Merge branch 'dev/dev' into release/3.0 2024-08-06 11:35:55 +08:00
d4eb7c846b to dev 2024-08-06 11:35:11 +08:00
fef50d7a37 Merge branch 'dev/dev_xp' into dev/dev 2024-08-06 11:30:02 +08:00
e5a95972a5 modify : 管理员系统 2024-08-06 11:29:33 +08:00
shahaibo
36a796b38b BUGFIX:多个印花 2024-08-05 17:44:53 +08:00
94927ae0a4 modify 2024-08-05 15:48:50 +08:00
4d7153661c Merge branch 'release/3.0' into dev/dev 2024-08-05 15:39:01 +08:00
76062136d6 Merge branch 'dev/dev_xp' into dev/dev 2024-08-05 15:38:05 +08:00
ea4ba74989 管理员系统功能添加 2024-08-05 15:19:02 +08:00
shahaibo
5a09d7a195 BUGFIX:过滤已废弃 2024-08-02 12:28:58 +08:00
shahaibo
e0332b9ddf BUGFIX:过滤已废弃 2024-08-02 12:21:30 +08:00
shahaibo
685ba09f7d BUGFIX:过滤已废弃 2024-08-02 12:13:32 +08:00
shahaibo
7aa1fc0342 BUGFIX:过滤已废弃 2024-08-02 11:56:17 +08:00
shahaibo
653264151a BUGFIX:过滤已废弃 2024-08-02 11:53:50 +08:00
shahaibo
fada00c738 BUGFIX:过滤已废弃 2024-08-02 11:36:58 +08:00
a10d30337a 支付切换为live 2024-08-01 10:30:44 +08:00
85ffed114b 语言适配 2024-08-01 10:07:24 +08:00
1093ac68b6 查询指定用户各功能使用情况 2024-08-01 10:00:26 +08:00
71e6abd816 to prod 2024-07-29 17:52:06 +08:00
00c948116e to prod 2024-07-29 17:50:40 +08:00
b6efd598bd to prod 2024-07-29 17:50:09 +08:00
bfe7ad4aa6 to prod 2024-07-29 17:49:16 +08:00
018ccef46a to prod 2024-07-29 17:47:09 +08:00
feb836f849 调查问卷 2024-07-29 17:36:32 +08:00
0106f21b86 Merge branch 'dev/dev_xp' into dev/dev 2024-07-29 17:31:21 +08:00
1b5f64785d 调查问卷查看 2024-07-29 17:24:14 +08:00
77a4aee88e 取消英文字母的正则匹配 2024-07-24 09:44:32 +08:00
shahaibo
ce1e2f3eab TASK:取消定时任务 2024-07-22 11:18:43 +08:00
shahaibo
75fbd2844b TASK:mq配置 2024-07-22 11:15:25 +08:00
shahaibo
832f331603 TASK:配置文件dev分支改为dev 2024-07-22 11:14:19 +08:00
9a2d58d922 正则匹配输入的英文文本 2024-07-22 09:46:11 +08:00
徐佩
34c4cd47ef Merge remote-tracking branch 'origin/release/3.0' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/common/task/AccountTask.java
2024-07-21 09:54:42 +08:00
c46f65600f 添加 开展活动接口 2024-07-19 15:40:54 +08:00
56ebcfbce2 stripe 设置支付链接语言 2024-07-17 17:17:04 +08:00
aa1eb7411e stripe 设置支付链接语言 2024-07-17 17:12:25 +08:00
4626ea3c55 prod stripe->live 2024-07-17 16:21:05 +08:00
5858f7dcf1 添加stripe接口路由到过滤器 2024-07-17 16:05:33 +08:00
440dfdcceb push to prod 开启定时任务 2024-07-17 15:32:58 +08:00
36e41ecd89 push to prod 配置修改 2024-07-17 15:28:55 +08:00
e1b08a9979 modify:Stripe 2024-07-17 15:26:11 +08:00
b9041d9c09 添加新的支付方式:Stripe 2024-07-16 16:59:58 +08:00
037a0d12ff Merge branch 'release/3.0' into dev/dev_xp 2024-07-15 13:57:20 +08:00
956b72729f Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2024-07-15 13:48:00 +08:00
9b185e6919 游客到试用用户身份转换 2024-07-15 13:47:43 +08:00
shahaibo
f77de3a1f4 BUGFIX:token filter 2024-07-15 13:43:44 +08:00
f03d32030d 1、stripe
2、游客到试用用户身份转换
2024-07-15 13:42:18 +08:00
shahaibo
6a098ffa13 BUGFIX:发送每日申请试用用户邮件 2024-07-13 12:40:13 +08:00
shahaibo
12c10167f1 Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2024-07-11 15:54:49 +08:00
shahaibo
679b213b6f BUGFIX:aida 2024-07-11 15:54:08 +08:00
shahaibo
6fa6c38398 BUGFIX:试用用户 2024-07-11 10:50:24 +08:00
925da9fa03 prod->local 合代码配置修改 2024-07-10 14:28:50 +08:00
8f0d45adf9 design 将未分割的图层添加到design_item_detail表中 2024-07-10 13:53:52 +08:00
505288fdb7 代码合并修改 2024-07-10 11:01:25 +08:00
44e045ece3 开启account-task 2024-07-10 11:00:17 +08:00
429fdad2b7 Merge branch 'test/stable' into release/3.0 2024-07-10 10:56:07 +08:00
46fbbd747e alipay-hk 配置文件位置修改 2024-07-10 10:47:36 +08:00
803bdfd291 alipay-hk 配置文件路径修改 2024-07-10 10:08:20 +08:00
shahaibo
6cbc4882fa BUGFIX:问卷调查 2024-07-10 09:49:41 +08:00
shahaibo
54f8d4b5e0 TASK:消费开启 2024-07-10 09:30:40 +08:00
shahaibo
314ad7a4f8 TASK:定时任务开启 2024-07-09 23:46:54 +08:00
shahaibo
a56510c35a TASK:变回develop环境 2024-07-09 23:44:40 +08:00
shahaibo
c2e2140ce6 Merge branch 'test/stable' into release/3.0
# Conflicts:
#	src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-07-09 23:40:58 +08:00
83915d332f Merge branch 'dev/dev' into test/stable 2024-07-09 17:30:54 +08:00
751aeb785d Merge branch 'dev/dev_xp' into dev/dev 2024-07-09 17:29:42 +08:00
7cadab9345 付费用户邮件通知 2024-07-09 17:28:38 +08:00
shahaibo
8a7b64dd65 Merge remote-tracking branch 'origin/test/stable' into test/stable 2024-07-09 17:11:05 +08:00
shahaibo
4c598200e5 TASK:邮件通知 2024-07-09 17:10:50 +08:00
shahaibo
d052918725 BUGFIX:t_design_item_detail_print level2type; 2024-07-09 17:10:50 +08:00
shahaibo
8fd6a3462e BUGFIX:颜色没返回; 2024-07-09 17:10:50 +08:00
shahaibo
11eb6595dd BUGFIX:游客注册主题; 2024-07-09 17:10:50 +08:00
shahaibo
0adfcb745d BUGFIX:喜欢的作品; 2024-07-09 17:10:50 +08:00
shahaibo
779e1e8be3 BUGFIX:like; 2024-07-09 17:10:49 +08:00
shahaibo
5297880c3b BUGFIX:aida; 2024-07-09 17:10:49 +08:00
shahaibo
6028ef8cdd TASK:邮件通知 2024-07-09 17:07:22 +08:00
shahaibo
c7de1779bd BUGFIX:t_design_item_detail_print level2type; 2024-07-09 15:25:20 +08:00
shahaibo
95bfb00a9d BUGFIX:颜色没返回; 2024-07-09 14:55:21 +08:00
shahaibo
5fc50f2d96 BUGFIX:游客注册主题; 2024-07-09 14:04:12 +08:00
shahaibo
22d7395e11 BUGFIX:喜欢的作品; 2024-07-09 13:53:57 +08:00
shahaibo
3d4ea89516 BUGFIX:like; 2024-07-09 13:14:46 +08:00
shahaibo
2ed63cafd0 TASK:生产消费暂时关闭; 2024-07-09 11:44:18 +08:00
shahaibo
701652c6b2 BUGFIX:aida; 2024-07-09 11:07:01 +08:00
shahaibo
df66b51e5c Merge branch 'dev/dev' into test/stable
# Conflicts:
#	src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java
2024-07-09 11:04:37 +08:00
shahaibo
0c6187a759 BUGFIX:aida; 2024-07-09 10:13:32 +08:00
shahaibo
2d6867b729 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-07-09 09:46:54 +08:00
shahaibo
0b8d0a1843 BUGFIX:aida; 2024-07-09 09:46:41 +08:00
64c7b8c1fd 机器人 total_cast 上限调整 2024-07-08 19:05:38 +08:00
shahaibo
42f1d47f82 BUGFIX:aida; 2024-07-08 16:17:13 +08:00
shahaibo
9ca0cd7c43 BUGFIX:aida; 2024-07-08 15:24:50 +08:00
shahaibo
4c187d1fbd BUGFIX:aida; 2024-07-08 14:42:59 +08:00
shahaibo
733de89883 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-07-08 09:32:54 +08:00
shahaibo
0e1a5a70df BUGFIX:aida; 2024-07-08 09:31:42 +08:00
5ecebd5117 修改印花 允许同时single和overall 2024-07-05 18:47:12 +08:00
c6626b230a Merge branch 'dev/dev' into dev/dev_xp 2024-07-05 18:42:03 +08:00
shahaibo
1cab7332f9 BUGFIX:aida; 2024-07-05 16:52:56 +08:00
shahaibo
c1d88943a9 BUGFIX:aida; 2024-07-05 11:26:46 +08:00
bc85e561d2 Merge branch 'dev/dev' into dev/dev_xp 2024-07-05 10:34:05 +08:00
shahaibo
be8968605b BUGFIX:aida; 2024-07-04 16:52:06 +08:00
569c2e719f Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
#	src/main/java/com/ai/da/service/impl/UserLikeGroupServiceImpl.java
2024-07-04 14:42:51 +08:00
shahaibo
5fa7e36dc2 BUGFIX:aida; 2024-07-04 13:02:47 +08:00
shahaibo
4a533b3cf0 BUGFIX:aida; 2024-07-04 11:34:51 +08:00
d2129459fe S3Util 工具类修改 2024-07-03 16:43:22 +08:00
shahaibo
9784d07680 BUGFIX:aida; 2024-07-03 15:22:01 +08:00
shahaibo
a71fa4df51 BUGFIX:aida; 2024-07-02 15:23:27 +08:00
shahaibo
ce384dbba9 BUGFIX:aida; 2024-07-02 13:48:53 +08:00
shahaibo
dd8f5696a2 BUGFIX:aida; 2024-06-28 16:52:16 +08:00
shahaibo
4211bce256 BUGFIX:aida; 2024-06-28 15:45:39 +08:00
shahaibo
bc240cd2ee TASK:aida; 2024-06-27 17:36:47 +08:00
shahaibo
f869f8eb10 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-06-27 15:33:38 +08:00
shahaibo
9b438c78a3 TASK:aida; 2024-06-27 15:33:26 +08:00
a5b435b80f S3 Util 新增工具类 2024-06-26 18:00:47 +08:00
a64d4e30de Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-06-26 14:02:45 +08:00
0759452381 积分相关修改
1、BUGFIX: 用户表中的积分与积分详细中不统一;
2、To_Product_Image 添加扣除积分
3、每周刷新付费用户积分
2024-06-26 13:55:20 +08:00
shahaibo
58a78a5366 TASK:aida; 2024-06-26 13:24:27 +08:00
shahaibo
9bd695a24d TASK:aida; 2024-06-26 10:47:56 +08:00
e614e3a07a Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/service/GenerateService.java
2024-06-25 16:59:41 +08:00
shahaibo
8c65592394 TASK:aida; 2024-06-25 16:43:54 +08:00
shahaibo
e093d694fd Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-06-25 16:43:44 +08:00
shahaibo
a5bfc4e41d TASK:aida; 2024-06-25 16:43:29 +08:00
be001477ce Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java
2024-06-25 15:42:22 +08:00
3e150b2067 获取服装category bug修改 2024-06-25 15:29:19 +08:00
8ea06c05e9 1、generate 积分扣除并添加相关积分详细
2、获取服装category bug修改
2024-06-25 12:18:18 +08:00
shahaibo
9b589eece6 TASK:aida; 2024-06-25 10:59:58 +08:00
shahaibo
ba4388b87d Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-06-25 10:57:22 +08:00
shahaibo
5b3a668ce7 TASK:aida; 2024-06-25 10:56:54 +08:00
aacbe92cdc generate cancel 2024-06-24 17:02:25 +08:00
57ab6c64ef flask 迁移到fast-api 9992 -> 9994 2024-06-24 14:33:34 +08:00
ffaef2ff6c Merge branch 'dev/dev' into dev/dev_xp 2024-06-24 10:43:50 +08:00
5113cb0606 to product image 9996 -> 9994 2024-06-22 17:27:50 +08:00
30d5466805 添加查询Code-Create数据库,监控新增付费记录并对付费用户进行账号新增或延长账号有效期的操作 2024-06-21 15:11:31 +08:00
8457a61ded generate 添加积分扣除 2024-06-20 15:26:22 +08:00
e7f9b77fe5 Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java
2024-06-20 10:39:36 +08:00
shahaibo
6c0f65b801 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-06-20 10:31:13 +08:00
shahaibo
ad1fa0e4c2 TASK:aida; 2024-06-20 10:27:28 +08:00
227c742f0d 新增接口:调查问卷 2024-06-20 10:27:04 +08:00
c317942447 BUGFIX: getDetail印花不显示 2024-06-19 11:41:39 +08:00
shahaibo
a6f02bf22f BUGFIX:试用用户积分为0; 2024-06-18 14:57:52 +08:00
4f12aa92b6 slogan 参数校验 2024-06-18 13:13:20 +08:00
e6a2ce2b69 dev 配置文件修改 2024-06-18 10:19:56 +08:00
shahaibo
1f0439c7f9 BUGFIX:aida; 2024-06-17 19:33:54 +08:00
shahaibo
676ef74bdc TASK:aida; 2024-06-17 19:25:37 +08:00
shahaibo
b2bc47da99 Merge remote-tracking branch 'origin/dev/dev' into dev/dev
# Conflicts:
#	src/main/resources/application-dev.properties
2024-06-17 17:38:04 +08:00
shahaibo
02787db0a1 TASK:aida; 2024-06-17 17:37:15 +08:00
19524520f4 BUGFIX:sr 2024-06-17 17:34:27 +08:00
2a2c4b1d39 slogan访问地址变更 2024-06-17 13:31:44 +08:00
257c99698e fastapi -> flask 2024-06-17 13:21:58 +08:00
8ff8a7480f slogan 恢复 2024-06-17 11:21:54 +08:00
5e1ff16052 slogan 暂停监听 2024-06-17 10:51:35 +08:00
dbd89798d5 slogan 暂停监听 2024-06-17 10:42:45 +08:00
b5b6f737aa slogan 暂停监听 2024-06-17 10:41:36 +08:00
1d60a6a129 Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java
2024-06-17 10:25:20 +08:00
0017568cc7 slogan 2024-06-17 10:21:49 +08:00
shahaibo
375f717721 TASK:aida; 2024-06-17 09:43:59 +08:00
shahaibo
18914bea7e TASK:aida; 2024-06-17 09:34:48 +08:00
fc48d8931f 2024-06-12 11:27:21 +08:00
619d33b412 Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/common/RabbitMQ/GenerateConsumer.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
#	src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java
#	src/main/resources/application-dev.properties
#	src/main/resources/messages_en.properties
#	src/main/resources/messages_zh.properties
2024-06-12 10:50:05 +08:00
1a48527c70 1、design single 添加 design elements
2、design single -- print添加level2Type
3、替换部分flask接口 为 fastAPI接口
2024-06-12 10:41:59 +08:00
shahaibo
ee68a5d782 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-06-12 09:48:11 +08:00
shahaibo
3a29d25060 TASK:aida; 2024-06-12 09:47:55 +08:00
77f514a03b Merge branch 'release/3.0' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/python/PythonService.java
#	src/main/java/com/ai/da/service/impl/DesignItemServiceImpl.java
2024-06-11 15:23:24 +08:00
954f6207ec design Single 允许画笔修改sketch后进行design 2024-06-05 11:43:35 +08:00
891f6fb15f Printboard level2Type 语言适配 2024-06-04 15:19:30 +08:00
49b086ad10 generate 添加Logo与Slogan 2024-06-03 17:13:48 +08:00
86e7119cfb AlipayHK 回调及相关数据处理 2024-05-31 16:28:23 +08:00
shahaibo
775ae3266c BUGFIX:定时任务开启; 2024-05-31 09:59:08 +08:00
1aea8e93f2 AlipayHK 新增指定订单查询接口 2024-05-30 09:54:49 +08:00
804dc9b1b4 添加aws S3访问工具类 2024-05-29 16:30:27 +08:00
bd543e56d5 开启消息队列的监听 2024-05-28 14:25:03 +08:00
shahaibo
3dc7866fba BUGFIX:渐变色回退; 2024-05-28 11:52:33 +08:00
shahaibo
ffd371e5b4 BUGFIX:渐变色回退; 2024-05-28 11:48:35 +08:00
shahaibo
40aad9d1a3 BUGFIX:渐变色回退; 2024-05-28 11:32:49 +08:00
709393a9a6 paypal 切换为live环境 2024-05-28 11:20:58 +08:00
fb8de15eca 不等比缩放 2024-05-28 11:17:46 +08:00
f4e9a3474a Merge branch 'test/stable' into release/3.0
# Conflicts:
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-05-28 10:59:34 +08:00
shahaibo
890389843f BUGFIX:试用时间link14天; 2024-05-28 10:43:50 +08:00
db04267591 Merge branch 'dev/dev' into test/stable
# Conflicts:
#	src/main/resources/paypal-sandbox.properties
2024-05-27 18:26:36 +08:00
5ff2bf11d7 alipay 密钥文件 2024-05-27 18:10:20 +08:00
76618de386 不等比缩放 2024-05-27 18:07:33 +08:00
eda92b3f0b Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java
2024-05-27 15:13:20 +08:00
shahaibo
b1b4b4147c TASK:配置文件; 2024-05-27 15:06:24 +08:00
shahaibo
4ba5f63a62 TASK:workspace; 2024-05-27 15:05:46 +08:00
shahaibo
8b274b2822 Merge remote-tracking branch 'origin/release/3.0' into dev/dev
# Conflicts:
#	pom.xml
#	src/main/java/com/ai/da/common/utils/SendEmailUtil.java
#	src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java
2024-05-27 15:03:02 +08:00
54cbaf4b80 Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/service/impl/WorkspaceServiceImpl.java
#	src/main/resources/application-dev.properties
2024-05-27 13:24:51 +08:00
c688af01f2 Merge branch 'release/3.0' into dev/dev_xp
# Conflicts:
#	pom.xml
#	src/main/java/com/ai/da/common/utils/SendEmailUtil.java
2024-05-27 13:20:31 +08:00
shahaibo
37de7d9276 BUGFIX:design; 2024-05-24 15:18:01 +08:00
shahaibo
02b3a407a9 BUGFIX:色块重复 2024-05-23 16:38:40 +08:00
5ebf0669f5 alipay-hk 切换到live环境 2024-05-23 15:48:55 +08:00
shahaibo
031d71bf99 BUGFIX:design; 2024-05-22 15:12:37 +08:00
shahaibo
205f0d54c5 BUGFIX:workspace; 2024-05-22 14:09:16 +08:00
shahaibo
50e46fed02 Merge remote-tracking branch 'origin/dev/dev' into dev/dev
# Conflicts:
#	src/main/resources/application-dev.properties
2024-05-22 14:05:01 +08:00
shahaibo
1303b1805a TASK:style; 2024-05-22 11:40:01 +08:00
shahaibo
2845c2c8b9 BUGFIX:male_top; 2024-05-22 10:26:29 +08:00
shahaibo
cd817dbf57 TASK:style; 2024-05-22 09:50:34 +08:00
f9ce559915 paypal 切换回sandbox环境 2024-05-21 14:40:46 +08:00
e40401f61f paypal webhook切换到prod 2024-05-21 14:27:17 +08:00
shahaibo
6e64eb741a TASK:邮箱; 2024-05-20 22:32:45 +08:00
shahaibo
c4a37f5d73 TASK:邮件; 2024-05-20 09:34:20 +08:00
shahaibo
8f5a86db0b TASK:监听; 2024-05-18 08:19:55 +08:00
shahaibo
14c99f6c6b TASK:监听; 2024-05-18 01:31:26 +08:00
shahaibo
bf072e35f5 TASK:监听; 2024-05-18 01:16:15 +08:00
shahaibo
b8048704ba TASK:监听; 2024-05-18 01:00:42 +08:00
shahaibo
b6704c3caf TASK:取消监听; 2024-05-18 00:34:18 +08:00
shahaibo
6b07c84c80 TASK:检查令牌日志注释; 2024-05-17 21:14:39 +08:00
shahaibo
980e1547cd TASK:检查令牌日志注释; 2024-05-17 21:07:20 +08:00
shahaibo
ae2191f369 TASK:检查令牌日志注释; 2024-05-17 21:03:56 +08:00
shahaibo
4b1a58c036 TASK:检查令牌日志注释; 2024-05-17 20:58:54 +08:00
shahaibo
4dbd5a1fad TASK:检查令牌日志注释; 2024-05-17 20:27:58 +08:00
shahaibo
b063cad764 TASK:配置文件; 2024-05-17 19:40:52 +08:00
shahaibo
f1eb48ae74 TASK:配置文件; 2024-05-17 19:25:50 +08:00
shahaibo
7233540ab4 Merge branch 'test/stable' into release/3.0
# Conflicts:
#	src/main/resources/application-dev.properties
#	src/main/resources/application-prod.properties
#	src/main/resources/application-test.properties
2024-05-17 18:14:12 +08:00
shahaibo
e634481113 TASK:配置文件; 2024-05-17 17:59:04 +08:00
shahaibo
b3591f879d TASK:试用时间; 2024-05-17 15:23:26 +08:00
shahaibo
12c447d6b0 TASK:配置文件; 2024-05-17 12:14:20 +08:00
shahaibo
c73876e8b0 TASK:配置文件; 2024-05-17 12:13:35 +08:00
shahaibo
a726ceca59 TASK:配置文件; 2024-05-17 11:40:38 +08:00
shahaibo
51db8b4ec2 TASK:无新增用户邮件; 2024-05-17 11:36:53 +08:00
shahaibo
9f4dbda152 TASK:无新增用户邮件; 2024-05-17 10:39:00 +08:00
shahaibo
8e1766eed0 Merge remote-tracking branch 'origin/temp0516' into test/stable
# Conflicts:
#	pom.xml
#	src/main/java/com/ai/da/common/config/MyTaskScheduler.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
2024-05-17 10:31:29 +08:00
shahaibo
f1d67f2f7d Merge branch 'release/3.0' into test/stable 2024-05-17 10:22:42 +08:00
shahaibo
ebb6577e98 TASK:portfolio; 2024-05-17 10:19:34 +08:00
bc85e33074 paypal 收款账号切换到live 2024-05-16 18:19:01 +08:00
5318e5d32a generate text存db内容简化 2024-05-16 15:32:39 +08:00
2aabb2347b Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	pom.xml
2024-05-15 15:39:28 +08:00
3790b8ee72 Alipay-HK 创建订单和异步回调 2024-05-15 15:38:11 +08:00
f4766d4ab4 designSingle 入参记录 2024-05-13 17:22:21 +08:00
d1fab003d2 designSingle 加入渐变色 2024-05-13 16:23:37 +08:00
718198bcfe Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/python/vo/DesignPythonItem.java
2024-05-13 14:30:15 +08:00
shahaibo
7b83f42ed8 TASK:design 渐变色; 2024-05-13 14:23:08 +08:00
f23f4133d0 Merge branch 'dev/dev' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/model/dto/DesignSingleItemDTO.java
#	src/main/java/com/ai/da/python/vo/DesignPythonItem.java
2024-05-10 17:25:06 +08:00
shahaibo
fb29310ba1 TASK:design 渐变色; 2024-05-10 17:18:25 +08:00
shahaibo
b86f168fe8 TASK:design 渐变色; 2024-05-10 17:17:28 +08:00
6fa0ab30db Merge branch 'dev/dev' into dev/dev_xp 2024-05-10 17:12:52 +08:00
d41bc284d4 Alipay-HK 接入 暂存 2024-05-10 17:11:49 +08:00
e2697aa407 Merge branch 'dev/dev_xp' into dev/dev 2024-05-08 09:46:15 +08:00
ae937dbf65 将generate输入的文本进行翻译或微处理 2024-05-07 18:27:32 +08:00
shahaibo
8da24f4933 BUGFIX:aida; 2024-05-06 16:02:02 +08:00
shahaibo
b1486c3901 Merge branch 'dev/dev' into dev/dev_shb 2024-05-06 09:57:56 +08:00
ffeaac8c46 generate 代码优化 2024-05-02 10:33:11 +08:00
shahaibo
a54f7e7c30 BUGFIX:邮件; 2024-05-01 11:54:19 +08:00
d1e45de91e Merge branch 'dev/dev_xp' into dev/dev 2024-04-30 11:40:25 +08:00
988fe89576 generate 将还未处理的请求置为Waiting状态 2024-04-30 11:39:04 +08:00
18f9e9130c Merge branch 'dev/dev_xp' into dev/dev 2024-04-30 11:00:57 +08:00
5f0546c6cf design single 在用户submit时将上传的图片保存到library 2024-04-30 10:59:41 +08:00
shahaibo
de865b918f BUGFIX:邮件; 2024-04-30 10:32:55 +08:00
shahaibo
d2e917e3ce BUGFIX:邮件; 2024-04-30 10:27:39 +08:00
shahaibo
e70580c388 BUGFIX:邮件; 2024-04-30 10:19:40 +08:00
783754e0c7 Merge branch 'dev/dev_xp' into dev/dev 2024-04-25 17:23:02 +08:00
856c6e1be9 generate--sketch 修改提示词 2024-04-25 17:20:56 +08:00
1accfc087a Merge branch 'dev/dev_xp' into dev/dev 2024-04-25 14:25:33 +08:00
9627239f9a generate--print 增加风格提示词 2024-04-25 14:23:37 +08:00
518a6c0748 Merge branch 'dev/dev_xp' into dev/dev 2024-04-25 12:42:20 +08:00
6d9efc1509 generate 接口参数变更 2024-04-25 12:41:07 +08:00
3afd67e680 Merge branch 'dev/dev_xp' into dev/dev 2024-04-23 18:34:13 +08:00
c44fc14796 BUGFIX: generate 获取结果加判空 2024-04-23 18:32:29 +08:00
93b3cd9660 Merge branch 'dev/dev_xp' into dev/dev 2024-04-23 17:23:52 +08:00
ff628dc680 BUGFIX: generate 获取结果加判空 2024-04-23 17:22:40 +08:00
1e09508efb Merge branch 'dev/dev_xp' into dev/dev 2024-04-23 16:46:55 +08:00
2882b06128 sr MQ异常捕捉 手动ack
generate 全部失败 抛异常
2024-04-23 16:44:55 +08:00
shahaibo
e7d4e98ad0 BUGFIX:sketchNum bugfix; 2024-04-23 16:18:25 +08:00
shahaibo
c8f4d82bf5 BUGFIX:sketchNum bugfix; 2024-04-23 16:14:03 +08:00
shahaibo
0d84a9214e Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-04-23 15:55:36 +08:00
shahaibo
c661f4a871 BUGFIX:sketchNum bugfix; 2024-04-23 15:55:20 +08:00
c31a4bcd8f generate mode修改 2024-04-23 14:21:18 +08:00
ff842c5443 BUGFIX:SR异常 手动ACK 2024-04-23 12:18:15 +08:00
d000eaa6b8 BUGFIX:generate prompt modify 2024-04-23 11:40:02 +08:00
3114d3cb36 便利查询 权限添加 2024-04-23 11:02:53 +08:00
shahaibo
7454e16076 BUGFIX:登录邮箱精确匹配; 2024-04-23 10:52:10 +08:00
shahaibo
c3ae729466 BUGFIX:登录邮箱精确匹配; 2024-04-23 10:50:45 +08:00
shahaibo
faeb59bae5 BUGFIX:登录邮箱精确匹配回退; 2024-04-23 10:32:24 +08:00
shahaibo
5a69a770ac BUGFIX:登录邮箱精确匹配; 2024-04-23 10:22:26 +08:00
shahaibo
d1772be737 BUGFIX:登录邮箱精确匹配; 2024-04-23 10:10:51 +08:00
19d170c1bf 输入prompt修饰 2024-04-22 15:32:59 +08:00
825439255b Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-04-22 13:18:57 +08:00
a749c5dd2e BUGFIX:便利查询 2024-04-22 13:09:44 +08:00
shahaibo
e62f54a975 BUGFIX:create_date插入; 2024-04-19 15:39:50 +08:00
540d2a4e28 generate bug修复 2024-04-18 18:34:44 +08:00
e832d5e4d4 generate 2024-04-18 18:04:02 +08:00
3be1bf3c14 Merge branch 'dev/dev_xp' into dev/dev 2024-04-18 16:49:26 +08:00
d2076a81d5 generate 联调修改 2024-04-18 16:48:19 +08:00
874f73e933 Merge branch 'dev/dev_xp' into dev/dev 2024-04-18 14:11:42 +08:00
8856f7fc7a 漏传 2024-04-18 14:10:52 +08:00
9f23df04db Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java
2024-04-18 14:09:16 +08:00
896120fea4 generate模型更换后的接口更改及异步获取结果 2024-04-18 14:07:20 +08:00
074e4154ac 配置修改 2024-04-11 15:20:49 +08:00
8d330e8ad9 积分充值与扣除数量变更 2024-04-11 13:48:14 +08:00
c73414a1f4 Merge branch 'test/stable' into dev/dev_xp 2024-04-11 13:30:44 +08:00
050b93d47a 积分充值与扣除数量变更 2024-04-11 11:51:52 +08:00
75a63c7a6f Merge branch 'dev/dev_xp' into dev/dev
# Conflicts:
#	src/main/resources/paypal-sandbox.properties
2024-04-11 11:45:03 +08:00
1d443b140b 为PayPal添加定时任务 2024-04-10 16:07:52 +08:00
754de78b57 single design添加渐变颜色 2024-04-10 11:21:48 +08:00
shahaibo
109176b8bd BUGFIX:排序; 2024-04-09 14:09:19 +08:00
shahaibo
6f687b5ce0 BUGFIX:排序; 2024-04-09 14:09:05 +08:00
shahaibo
66047c541d Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-04-09 13:58:37 +08:00
shahaibo
160c403005 BUGFIX:排序; 2024-04-09 13:58:27 +08:00
shahaibo
92ab7edc10 BUGFIX:排序; 2024-04-09 13:55:47 +08:00
shahaibo
95aee1daae BUGFIX:试用订单; 2024-04-09 11:55:15 +08:00
e7fbaf8924 generate 允许用户从library中选择图片 2024-04-02 12:11:04 +08:00
shahaibo
a744a3cb3d Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-04-02 10:15:49 +08:00
shahaibo
782a4f9976 BUGFIX; 2024-04-02 10:15:35 +08:00
5cd3121546 local -> dev 队列名修改 2024-03-28 16:49:33 +08:00
8d77cd0be6 修改dev环境下paypal webhook_id 2024-03-28 15:53:04 +08:00
165f0301f0 删除callbackService 2024-03-28 15:07:33 +08:00
784f599e38 paypal live-> sandbox 2024-03-28 15:04:31 +08:00
7d967ed41e 1、完善积分充值
2、升级积分扣除机制
3、优化部分代码
2024-03-28 14:43:36 +08:00
shahaibo
737ec594fd BUGFIX; 2024-03-28 11:55:52 +08:00
shahaibo
b2d615f31a BUGFIX; 2024-03-28 10:33:13 +08:00
shahaibo
bdbf5b4648 BUGFIX; 2024-03-27 13:51:33 +08:00
shahaibo
3be72dbe49 BUGFIX; 2024-03-27 13:34:36 +08:00
shahaibo
1d71d276bb Merge remote-tracking branch 'origin/dev/dev' into dev/dev_shb 2024-03-27 13:31:08 +08:00
shahaibo
54fe254ab0 BUGFIX; 2024-03-27 13:28:48 +08:00
d79fe65bf1 Merge branch 'dev/dev_xp' into dev/dev 2024-03-26 17:24:36 +08:00
4bf4dc2588 向TaskList插入数据时开启事务 2024-03-26 17:23:40 +08:00
edaa4344be 删除SR mapper 2024-03-26 15:35:49 +08:00
54df4a0ae2 paypal 环境转换sandbox->live 2024-03-26 15:31:57 +08:00
3662ed3f96 Merge branch 'dev/dev_xp' into dev/dev 2024-03-26 15:02:12 +08:00
d411b428f8 1、完善超分功能
2、完善积分系统
3、新增任务列表
2024-03-26 14:58:43 +08:00
305324fe1a 1、接入超分功能
2、添加积分系统
3、新增订单查询,积分详细查询
2024-03-15 15:38:56 +08:00
bf05f88c00 Merge branch 'release/3.0' into dev/dev_xp
# Conflicts:
#	src/main/java/com/ai/da/mapper/primary/DesignMapper.java
#	src/main/resources/mapper/primary/DesignMapper.xml
2024-03-06 21:00:07 +08:00
e84d800ba0 加入积分系统,将充值与积分关联 2024-03-06 20:56:22 +08:00
a016f16052 便利查询--指定用户有权限直接获取当前数据库部分数据 2024-03-04 16:33:23 +08:00
ee96759832 1、接入paypal
2、修改支付宝支付
2024-03-01 17:31:26 +08:00
shahaibo
db68ce7d1b BUGFIX:design new male_outwear; 2024-02-23 15:40:04 +08:00
shahaibo
87d8a92cdd BUGFIX:design new male_outwear; 2024-02-23 11:38:09 +08:00
shahaibo
471cdd866b BUGFIX:design new single; 2024-02-23 11:09:25 +08:00
shahaibo
6e191413b9 TASK:数据库地址修改:; 2024-02-22 13:38:07 +08:00
e28502a00c Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2024-02-22 10:25:25 +08:00
7f8c84bd35 支付宝 回调地址免验证 2024-02-22 10:25:07 +08:00
f8996999d4 支付宝 回调地址修改 2024-02-22 10:23:46 +08:00
shahaibo
10b3637c80 Merge branch 'dev/dev_shb' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/python/PythonService.java
2024-02-21 15:27:57 +08:00
shahaibo
22330b674a BUGFIX:代码优化; 2024-02-21 15:16:51 +08:00
shahaibo
6bb99194bd Merge branch 'dev/dev_shb' into dev/dev 2024-02-21 13:54:54 +08:00
shahaibo
43ec55dfb6 BUGFIX:Single design; 2024-02-21 13:53:46 +08:00
shahaibo
8fe468fda2 BUGFIX:Single design; 2024-02-20 11:20:30 +08:00
shahaibo
4e4ed0f66c Merge branch 'dev/dev_shb' into dev/dev 2024-02-20 11:19:37 +08:00
shahaibo
002a47c169 TASK:dev分支端口; 2024-02-20 11:05:01 +08:00
shahaibo
258ddbab31 TASK:个人分支端口; 2024-02-20 11:04:27 +08:00
shahaibo
703201dae6 TASK:dev端口; 2024-02-20 11:02:41 +08:00
shahaibo
66e10a5a80 TASK:代码合并; 2024-02-20 10:40:36 +08:00
shahaibo
f8d468d55b TASK:代码合并; 2024-02-20 10:35:50 +08:00
shahaibo
ca70371585 Merge remote-tracking branch 'origin/dev/dev' into dev/dev
# Conflicts:
#	src/main/java/com/ai/da/mapper/primary/entity/BaseEntity.java
#	src/main/java/com/ai/da/mapper/primary/entity/OrderInfo.java
#	src/main/java/com/ai/da/mapper/primary/entity/PaymentInfo.java
#	src/main/java/com/ai/da/mapper/primary/entity/Product.java
#	src/main/java/com/ai/da/mapper/primary/entity/RefundInfo.java
#	src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java
2024-02-20 10:26:13 +08:00
shahaibo
68f6ae2a8d TASK:design new; 2024-02-20 10:12:44 +08:00
shahaibo
7803decb29 TASK:增加邮件通知人; 2024-02-20 09:31:31 +08:00
35fbd4d865 修改内网穿透地址 2024-02-19 15:26:42 +08:00
2a73986e64 修改内网穿透地址 2024-02-19 14:38:18 +08:00
shahaibo
4e2e1affa8 Merge branch 'dev/dev' into dev/dev_shb
# Conflicts:
#	src/main/java/com/ai/da/controller/AccountController.java
#	src/main/java/com/ai/da/mapper/primary/entity/GenerateCancel.java
#	src/main/java/com/ai/da/mapper/primary/entity/LibraryCopy.java
#	src/main/java/com/ai/da/mapper/primary/entity/LibraryModelPointCopy.java
#	src/main/java/com/ai/da/service/AccountService.java
#	src/main/java/com/ai/da/service/LibraryService.java
#	src/main/java/com/ai/da/service/impl/AccountServiceImpl.java
#	src/main/java/com/ai/da/service/impl/GenerateServiceImpl.java
#	src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java
#	src/main/resources/application-prod.properties
#	src/main/resources/application-test.properties
2024-02-19 13:02:58 +08:00
shahaibo
9bae02406c TASK:dev分支调用python端端口修改; 2024-02-19 11:03:28 +08:00
shahaibo
a4f36a2fd5 TASK:试用时间增加; 2024-02-15 15:23:32 +08:00
shahaibo
fda2a3120b TASK:试用时间增加; 2024-02-15 15:19:09 +08:00
87580cfece 接入支付宝 联调修改 2024-02-15 14:03:44 +08:00
318d0a1441 充值功能--接入支付宝 2024-02-14 12:37:57 +08:00
874a59ea04 Merge remote-tracking branch 'origin/dev/dev_xp' into dev/dev 2024-02-14 12:22:16 +08:00
a7c60a932a 合并stable 2024-02-14 12:21:01 +08:00
7f33597c02 充值功能--接入支付宝 2024-02-14 12:10:15 +08:00
92dafd74c9 在过滤器中添加未携带token的请求ip日志打印 2024-02-01 13:28:48 +08:00
9b55083768 generate 日志打印 2024-01-31 19:35:17 +08:00
c646a8adb0 Merge branch 'release/3.0' into dev/dev
# Conflicts:
#	docker-compose.yml
#	src/main/java/com/ai/da/common/RabbitMQ/MQConfig.java
2024-01-31 16:30:52 +08:00
69fe927576 新增generate-queue-dev消息队列 2024-01-31 16:01:06 +08:00
f4a80a4486 Merge remote-tracking branch 'origin/test/stable' into dev/dev
# Conflicts:
#	docker-compose.yml
2024-01-31 15:51:35 +08:00
83058acfea Merge remote-tracking branch 'origin/test/stable' into release/3.0
# Conflicts:
#	src/main/java/com/ai/da/service/impl/ChatRobotServiceImpl.java
#	src/main/resources/application.properties
2024-01-31 15:13:02 +08:00
8f832ec441 机器人试用到期提示 2024-01-31 14:59:19 +08:00
shahaibo
5e1573ae09 TASK:试用用户机器人余额; 2024-01-30 15:07:34 +08:00
shahaibo
f1176dfefb TASK:试用用户机器人余额; 2024-01-30 15:03:38 +08:00
zchengrong
12cd9e8f1f Delete docker-compose.yml 2024-01-30 14:52:40 +08:00
shahaibo
81c5d7ee65 TASK:试用用户机器人余额; 2024-01-30 14:20:57 +08:00
shahaibo
878b5a129c TASK:试用用户机器人余额; 2024-01-30 14:20:01 +08:00
821a3420ae 配置环境修改 2024-01-30 13:39:59 +08:00
bee78cc9a2 generate 添加试用用户判断 2024-01-30 13:34:30 +08:00
5975519c39 docker-compose.yml 2024-01-30 12:43:36 +08:00
ec9b60e1d6 docker-compose.yml 2024-01-30 12:38:56 +08:00
9e653595a9 generate 添加试用用户判断 2024-01-30 11:48:26 +08:00
02d65b4fb2 Merge remote-tracking branch 'origin/release/3.0' into test/stable
# Conflicts:
#	src/main/resources/application-prod.properties
2024-01-30 10:50:18 +08:00
533b54a768 MQ 消息队列名修改 2024-01-29 17:03:10 +08:00
shahaibo
5c2c9f22ce TASK:配置文件; 2024-01-29 11:33:28 +08:00
shahaibo
98d98b1131 TASK:配置文件; 2024-01-29 11:32:41 +08:00
shahaibo
7386f4427d TASK:配置文件; 2024-01-29 11:30:39 +08:00
shahaibo
9a5ee2b264 TASK:配置文件; 2024-01-29 11:20:26 +08:00
shahaibo
a5cbca8d74 TASK:配置文件; 2024-01-29 11:18:32 +08:00
shahaibo
2b2fb4319a TASK:配置文件; 2024-01-29 11:10:00 +08:00
shahaibo
0afcf92582 BUGFIX:试用用户; 2024-01-29 10:35:19 +08:00
shahaibo
33a096e382 Merge remote-tracking branch 'origin/release/3.0' into release/3.0 2024-01-29 10:06:58 +08:00
shahaibo
ee2a8ac3ce BUGFIX:试用用户; 2024-01-29 10:06:48 +08:00
zchengrong
17e7ebc8fe Update docker-compose.yml 2024-01-29 10:02:45 +08:00
shahaibo
41919c44c9 BUGFIX:试用用户; 2024-01-29 09:50:48 +08:00
zchengrong
12190f88c8 Update docker-compose.yml 2024-01-28 12:26:47 +08:00
zchengrong
c74c7376cc Update docker-compose.yml 2024-01-28 12:25:02 +08:00
zchengrong
4f68fbcff1 Update docker-compose.yml 2024-01-28 12:19:36 +08:00
zchengrong
e539a931f9 Update docker-compose.yml 2024-01-28 12:18:47 +08:00
zchengrong
abcad626f6 Update docker-compose.yml 2024-01-28 11:19:03 +08:00
zchengrong
ae6692523b Update docker-compose.yml 2024-01-28 11:16:59 +08:00
shahaibo
3a2253f1ce TASK:数据库连接 2024-01-28 11:08:53 +08:00
shahaibo
4380f0bc5b BUGFIX:异常级别设置 2024-01-28 10:40:29 +08:00
shahaibo
18d0d55d4f BUGFIX:设置上传文件大小,正式用户转试用用户 2024-01-27 16:32:18 +08:00
shahaibo
f047ca0324 Merge remote-tracking branch 'origin/develop' into develop 2024-01-26 15:33:43 +08:00
shahaibo
f02988a0a7 TASK:分页去除限制; 2024-01-26 15:33:33 +08:00
fc4dcd41ae generate 修改字段名str->content 2024-01-26 14:18:28 +08:00
shahaibo
d4a7fa441c Merge remote-tracking branch 'origin/develop' into develop 2024-01-26 13:18:37 +08:00
shahaibo
5af86c28f1 TASK:数据迁移; 2024-01-26 13:18:16 +08:00
shahaibo
62e6f8b77d TASK:数据迁移; 2024-01-26 13:17:59 +08:00
4c0dd27332 generate 记录取消操作 2024-01-26 13:12:04 +08:00
aa270b5f7d 修改排队位置 2024-01-25 14:11:12 +08:00
e90c4f7239 恢复配置 2024-01-25 13:44:28 +08:00
c35a188abb TASK:generate 修复逻辑Bug 2024-01-25 13:37:17 +08:00
65bed9dada TASK:generate 取消generate 2024-01-24 16:57:53 +08:00
1d2cb17d54 TASK:generate 添加队列消费者,增加并发量 2024-01-24 14:44:31 +08:00
d4568ad740 redis 配置修改 2024-01-24 11:47:19 +08:00
96858c2cc3 TASK:异步调用generate及取消generate 2024-01-24 11:43:56 +08:00
shahaibo
6b8e96ec74 TASK:design new; 2024-01-24 10:23:58 +08:00
a9ce35200c BUGFIX:测试环境配置修改 2024-01-22 16:27:46 +08:00
164454b5b2 BUGFIX:数据传输过程中long精度发生丢失 2024-01-22 16:21:32 +08:00
404172e5f2 修改获取结果的请求方式 2024-01-22 14:00:05 +08:00
ec39bf9a97 修改redis配置 2024-01-22 12:03:36 +08:00
16f590dea5 修改redis配置 2024-01-22 11:17:53 +08:00
577dc94850 1、generate 异步生成及获取排队情况
2、generate 取消生成
2024-01-21 14:14:55 +08:00
shahaibo
471426e931 TASK:多数据源; 2024-01-19 16:36:34 +08:00
shahaibo
ed3dcf9ee8 Merge branch 'develop' into dev_shb 2024-01-18 13:34:20 +08:00
shahaibo
c31ecfb1e9 TASK:docker回退; 2024-01-18 13:17:16 +08:00
shahaibo
449c568907 TASK:免登录; 2024-01-18 12:05:06 +08:00
shahaibo
b828c8fcde TASK:免登录; 2024-01-18 11:58:37 +08:00
shahaibo
557041335a TASK:免登录; 2024-01-18 11:23:25 +08:00
shahaibo
bccb6d7bd2 TASK:免登录; 2024-01-18 10:03:48 +08:00
shahaibo
365c04375a TASK:免登录; 2024-01-18 09:56:50 +08:00
shahaibo
d8c09f9597 TASK:docker配置文件; 2024-01-17 17:50:58 +08:00
shahaibo
90634f73c7 TASK:免密登录; 2024-01-17 17:49:40 +08:00
shahaibo
c5d540686e TASK:回退; 2024-01-17 10:59:43 +08:00
shahaibo
3452e4c335 TASK:回退; 2024-01-17 10:57:41 +08:00
shahaibo
5d3657bba2 TASK:证书接收测试; 2024-01-17 10:52:27 +08:00
shahaibo
393c9ec941 TASK:证书接收测试; 2024-01-17 10:33:37 +08:00
shahaibo
5678cccde1 Merge branch 'develop' into dev_shb 2024-01-16 10:51:19 +08:00
shahaibo
067cd9a1af TASK:docker回退; 2024-01-16 09:36:05 +08:00
shahaibo
1c3692d034 TASK:免登录; 2024-01-15 17:45:11 +08:00
shahaibo
2d73f0c414 TASK:免登录; 2024-01-15 17:27:34 +08:00
shahaibo
27974e5e7c TASK:docker配置文件回退; 2024-01-15 16:56:49 +08:00
shahaibo
9b4e9c3ee1 Merge branch 'dev/dev' into develop 2024-01-15 16:55:56 +08:00
shahaibo
11e231992a TASK:免密登录并发优化; 2024-01-15 16:54:20 +08:00
shahaibo
8737350002 TASK:免密登录; 2024-01-15 16:33:23 +08:00
shahaibo
ca2ed7a69c TASK:免密登录; 2024-01-15 15:59:12 +08:00
shahaibo
a75cdffe59 TASK:design NEW; 2024-01-15 15:57:40 +08:00
shahaibo
324966b1c6 TASK:免密登录; 2024-01-15 15:50:48 +08:00
shahaibo
660ee9d437 TASK:免密登录; 2024-01-15 15:41:48 +08:00
shahaibo
94d6c10522 TASK:免密登录; 2024-01-15 15:41:07 +08:00
shahaibo
ae49f3f3a7 TASK:docker配置文件; 2024-01-15 15:25:30 +08:00
shahaibo
20d8224853 Merge branch 'develop' into dev/dev 2024-01-15 15:25:08 +08:00
shahaibo
fc55a775f8 TASK:机房免登录测试; 2024-01-15 15:08:39 +08:00
shahaibo
62f9bb3795 TASK:机房免登录测试; 2024-01-15 15:06:48 +08:00
1b836175b1 修改测试稳定版 python服务端口配置 2024-01-12 11:14:43 +08:00
fe0a736feb designSingle 添加入参日志打印 2024-01-10 15:14:54 +08:00
shahaibo
547272dfcf BUGFIX:design pin逻辑; 2024-01-10 14:02:17 +08:00
shahaibo
10e80bfc27 TASK:python IP端口; 2024-01-10 11:47:40 +08:00
shahaibo
748550b670 Merge remote-tracking branch 'origin/develop' into develop 2024-01-10 10:49:50 +08:00
shahaibo
39367f5fb7 TASK:机器人接口; 2024-01-10 10:48:48 +08:00
74ef15b88e mybatis-plus DEBUG级别的日志不打印 2024-01-09 18:05:49 +08:00
shahaibo
ef6c8e85cb TASK:python服务端口; 2024-01-09 17:44:17 +08:00
shahaibo
4e334dca7d TASK:python服务端口; 2024-01-09 17:31:14 +08:00
474a532f01 Merge remote-tracking branch 'origin/develop' into develop 2024-01-09 13:54:55 +08:00
6fbcab9351 添加自定义日志管理,输出到日志文件 2024-01-09 13:54:32 +08:00
shahaibo
36e488e0aa TASK:docker配置文件回退; 2024-01-09 13:52:03 +08:00
shahaibo
a3ae8401fb TASK:定时任务执行周期; 2024-01-09 13:44:15 +08:00
shahaibo
7a0b6307b0 TASK:docker配置文件回退; 2024-01-08 13:33:26 +08:00
shahaibo
580ebc91ff Merge remote-tracking branch 'origin/develop' into dev/dev
# Conflicts:
#	.gitignore
2024-01-08 13:32:56 +08:00
shahaibo
dc325e6ab4 TASK:忽略docker配置文件; 2024-01-08 13:31:05 +08:00
shahaibo
80976f45a7 TASK:忽略docker配置文件; 2024-01-08 13:30:34 +08:00
shahaibo
5bed3c180b TASK:续订通知; 2024-01-08 13:02:50 +08:00
zchengrong
67c137392f Update application.properties 2024-01-06 20:11:06 +08:00
zchengrong
6e979d58a2 Update application-prod.properties 2024-01-06 20:08:19 +08:00
zchengrong
7a95bce2b1 Update docker-compose.yml 2024-01-06 19:25:51 +08:00
shahaibo
84dd2d7cd9 TASK:端口; 2024-01-05 11:31:23 +08:00
shahaibo
4a8867dbb5 TASK:批量修改类别; 2024-01-05 11:11:29 +08:00
shahaibo
8930e64bf7 Merge remote-tracking branch 'origin/develop' into dev/dev 2024-01-05 10:25:50 +08:00
9405b0d630 判断机器人返回图片地址是否实际存在 2024-01-04 17:34:49 +08:00
71f1a2671e Merge branch 'develop' into dev/dev 2024-01-04 17:15:03 +08:00
shahaibo
71a0a3c06b TASK:到期时间查询; 2024-01-04 15:22:38 +08:00
shahaibo
f2a8a82821 TASK:公共标签; 2024-01-04 14:45:20 +08:00
shahaibo
3b37e8644c TASK:公共标签; 2024-01-04 14:25:54 +08:00
shahaibo
2832105ac2 Merge remote-tracking branch 'origin/develop' into develop 2024-01-04 13:57:32 +08:00
shahaibo
eafa6daf5b TASK:公共标签; 2024-01-04 13:57:17 +08:00
7a309bcb17 机器人返回图片数量修改 2024-01-04 11:47:09 +08:00
shahaibo
fc4a59d41a Merge remote-tracking branch 'origin/develop' into develop 2024-01-04 11:04:45 +08:00
shahaibo
11f94ebcb4 BUGFIX:element上传; 2024-01-04 11:04:15 +08:00
7c94bc4826 机器人返回图片路径修改 2024-01-04 10:15:48 +08:00
zchengrong
00cf7b3140 Update DesignServiceImpl.java 2024-01-02 17:13:13 +08:00
zchengrong
914910903e Update application-test.properties 2024-01-02 17:05:37 +08:00
28d92c468c Merge remote-tracking branch 'origin/develop' into dev/dev
# Conflicts:
#	src/main/resources/application-prod.properties
2024-01-02 13:05:06 +08:00
dd5997fea6 统一管理python端服务ip和端口 2024-01-02 11:53:09 +08:00
d19aa7083b 添加状态检测 2023-12-29 13:48:42 +08:00
zhouchengrong
858a195e13 新增aws 状态检测接口 2023-12-29 13:35:39 +08:00
4b1974aceb 添加状态检测 2023-12-29 13:19:48 +08:00
eb45f6e7d0 history designSingle之后日期未更新-bug修复 2023-12-28 17:58:51 +08:00
1c8f230a64 Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2023-12-28 16:35:31 +08:00
shahaibo
85b4d674ea Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2023-12-28 13:56:18 +08:00
shahaibo
8c3b658df0 Merge remote-tracking branch 'origin/develop' into dev/dev 2023-12-28 13:52:28 +08:00
46511fed71 Merge remote-tracking branch 'origin/develop' into dev/dev 2023-12-28 11:05:07 +08:00
f346727469 Merge remote-tracking branch 'origin/develop' into develop 2023-12-28 09:46:03 +08:00
e9844e38a4 generate 为version 1添加str前缀及判空 2023-12-28 09:45:44 +08:00
shahaibo
91012a00b6 BUGFIX:element上传; 2023-12-27 11:08:09 +08:00
shahaibo
bd116ff011 BUGFIX:忘记密码; 2023-12-22 14:12:20 +08:00
shahaibo
ce7c6c657b BUGFIX:忘记密码; 2023-12-22 14:05:31 +08:00
131f46b59e 配置文件修改 2023-12-22 12:09:00 +08:00
shahaibo
0f8f6679ab Merge remote-tracking branch 'origin/develop' into develop 2023-12-22 11:17:51 +08:00
shahaibo
a5d08e700a BUGFIX:retrieve; 2023-12-22 11:17:35 +08:00
f98f54f3c1 Merge remote-tracking branch 'origin/develop' into dev/dev
# Conflicts:
#	docker-compose.yml
2023-12-22 10:55:34 +08:00
zchengrong
23e2c507df Update docker-compose.yml 2023-12-22 10:45:24 +08:00
zchengrong
6331b5d164 Update docker-compose.yml 2023-12-22 10:44:58 +08:00
zchengrong
2dd1ad8a08 Update docker-compose.yml 2023-12-22 10:35:58 +08:00
e45e63103f BUGFIX:修复获取图片命名 2023-12-21 14:23:33 +08:00
shahaibo
640c9527be Merge remote-tracking branch 'origin/develop' into develop 2023-12-21 10:55:34 +08:00
shahaibo
8fa682e9e8 TASK:minio地址更新; 2023-12-21 10:55:14 +08:00
480eb72be0 BUGFIX:修复single模式下衣服图层不返回 2023-12-20 11:18:38 +08:00
shahaibo
8dd658f1e9 BUGFIX: 使用订单通过后的邮件标题,多语言内容更新; 2023-12-18 17:18:19 +08:00
a9c5a5fd2b BUGFIX:修复衣服删除为0件时导致的数据库查询报错 2023-12-15 10:49:57 +08:00
shahaibo
5aa2e2a357 TASK:试用订单; 2023-12-14 17:16:23 +08:00
shahaibo
ba6588058a TASK:自动审批; 2023-12-14 16:33:57 +08:00
shahaibo
8b3058513f Merge remote-tracking branch 'origin/develop' into develop 2023-12-14 16:21:42 +08:00
shahaibo
f9b24492c9 BUGFIX:choose; 2023-12-14 16:21:21 +08:00
2de3a73fef BUGFIX:衣服图层添加优先级后对之前数据不兼容的修复-漏提交 2023-12-14 15:49:29 +08:00
86ab0806fd BUGFIX:衣服图层添加优先级后对之前数据不兼容的修复 2023-12-14 15:47:03 +08:00
fef71ead79 TASK:category识别python端端口变更 2023-12-14 14:05:02 +08:00
26a61a44a2 TASK:根据designItemId获取模特图 2023-12-14 11:26:12 +08:00
shahaibo
4d87164b8e BUGFIX:choose; 2023-12-14 10:57:47 +08:00
shahaibo
81d178b3a4 BUGFIX:library男模特打点预览; 2023-12-14 10:46:03 +08:00
zchengrong
51f3b5b30b Update docker-compose.yml 2023-12-14 10:35:16 +08:00
zchengrong
b4b935c378 Update docker-compose.yml 2023-12-14 10:33:30 +08:00
shahaibo
b0dc1f4763 BUGFIX:library男模特打点预览; 2023-12-14 10:21:30 +08:00
shahaibo
79cff13edb Merge remote-tracking branch 'origin/dev/dev' into develop
# Conflicts:
#	docker-compose.yml
2023-12-13 17:26:48 +08:00
shahaibo
b71a1c834d Merge remote-tracking branch 'origin/dev/dev' into dev/dev 2023-12-13 17:23:29 +08:00
shahaibo
24312a8f2b BUGFIX; 2023-12-13 17:23:06 +08:00
a14188ee35 TASK:design模块添加记录priority到数据库 2023-12-13 17:17:39 +08:00
zchengrong
59008e7a7e Update docker-compose.yml 2023-12-13 14:59:36 +08:00
zchengrong
3d44ab4a52 Update docker-compose.yml 2023-12-13 14:57:51 +08:00
zchengrong
8c82cef169 Update docker-compose.yml 2023-12-13 14:32:09 +08:00
4512fb3268 TASK:getDetail添加返回字段priority 2023-12-13 14:20:13 +08:00
483eea66b9 BUGFIX:layer_order默认false 2023-12-13 11:56:13 +08:00
43b9ba74ab 注释添加 2023-12-13 11:25:52 +08:00
c3dfdd6fb8 Merge remote-tracking branch 'origin/develop' into develop 2023-12-13 10:52:26 +08:00
51548b52ba TASK:designSingle 添加多件衣服并允许添加相同类型的服装 2023-12-13 10:45:52 +08:00
zchengrong
78ce0120c4 Update docker-compose.yml 2023-12-12 16:14:17 +08:00
shahaibo
4e3746cfba Merge remote-tracking branch 'origin/develop' into develop 2023-12-11 16:59:21 +08:00
shahaibo
1f77698bc4 TASK: 试用用户添加测试; 2023-12-11 16:59:05 +08:00
78d41aa2f5 Merge remote-tracking branch 'origin/develop' into develop 2023-12-11 15:35:33 +08:00
be5d60d6c1 BUGFIX:添加入参判断 2023-12-11 15:35:11 +08:00
ae91cac28a BUGFIX:添加入参判断 2023-12-11 15:32:53 +08:00
shahaibo
f80e5ce455 TASK: 试用用户添加测试; 2023-12-11 15:11:40 +08:00
shahaibo
db1aed53eb Merge remote-tracking branch 'origin/develop' into develop 2023-12-11 14:35:21 +08:00
shahaibo
7fdacaeb7c TASK: 试用用户添加测试; 2023-12-11 14:35:05 +08:00
cd41229f9e TASK:自动识别上传服装的类别 2023-12-11 14:24:28 +08:00
shahaibo
2b8f970acc TASK: 试用用户添加测试; 2023-12-11 10:52:42 +08:00
shahaibo
91993feee8 TASK: 试用用户添加测试; 2023-12-11 10:02:05 +08:00
shahaibo
5300cec43d TASK: 试用用户添加测试; 2023-12-06 17:02:43 +08:00
shahaibo
9d7cf848e1 TASK: 试用用户添加测试; 2023-12-06 17:02:25 +08:00
shahaibo
23b69c1e7b TASK: 试用用户添加测试; 2023-12-06 16:31:20 +08:00
shahaibo
7bbca01f86 TASK: 试用用户添加测试; 2023-12-06 16:15:20 +08:00
shahaibo
30ff40e84a TASK: 试用用户添加测试; 2023-12-06 15:58:57 +08:00
shahaibo
be6795b42a BUGFIX: 回显; 2023-12-04 14:04:36 +08:00
shahaibo
a7893d07bb BUGFIX: Library过滤; 2023-11-30 13:38:23 +08:00
shahaibo
7072c8ad2a TASK: 裁剪; 2023-11-29 15:01:27 +08:00
shahaibo
6d99a5fa16 TASK: 是否完成引导字段添加; 2023-11-29 14:37:32 +08:00
shahaibo
98ca270156 TASK: 裁剪白底字段添加; 2023-11-29 14:19:04 +08:00
shahaibo
4b1bf8585d TASK: 裁剪白底字段添加; 2023-11-28 15:57:32 +08:00
shahaibo
1747eb3a59 TASK: sketches裁剪; 2023-11-23 15:41:25 +08:00
shahaibo
3e3aaa54c4 TASK: sketches裁剪; 2023-11-23 15:27:01 +08:00
shahaibo
e18a4f78c4 Merge remote-tracking branch 'origin/develop' into develop 2023-11-23 14:05:20 +08:00
shahaibo
f0aa041c1e TASK: 枚举类多语言; 2023-11-23 14:05:04 +08:00
xupei
9e5a6cae11 Merge remote-tracking branch 'origin/develop' into develop 2023-11-23 12:04:04 +08:00
xupei
94eab51d6c BUGFIX:根据性别对图片路径进行不同处理 2023-11-23 12:02:41 +08:00
shahaibo
ecec69a45e TASK: 枚举类多语言; 2023-11-23 10:32:33 +08:00
shahaibo
5213b03598 TASK: sketchBoard裁剪; 2023-11-22 16:44:28 +08:00
shahaibo
edce5f3227 TASK: sketchBoard裁剪; 2023-11-22 16:38:18 +08:00
shahaibo
7b98aa90d9 TASK: sketchBoard上传; 2023-11-22 15:48:08 +08:00
shahaibo
00166b9246 Merge remote-tracking branch 'origin/develop' into develop 2023-11-22 15:19:12 +08:00
shahaibo
9e3c29bd47 TASK: sketchBoard上传;工作空间列表; 2023-11-22 15:18:58 +08:00
xupei
d9a5b0f326 从library删除generate的图片时需要取消该图片的like标签 2023-11-22 11:18:51 +08:00
xupei
b9d502db42 聊天机器人异常提醒语句修改 2023-11-21 16:57:20 +08:00
xupei
b77a85d134 Merge remote-tracking branch 'origin/develop' into develop 2023-11-21 16:48:10 +08:00
xupei
8a3e6833ee TASK:机器人添加查询男装 2023-11-21 16:47:43 +08:00
shahaibo
8ff91be0f0 TASK: 印花逻辑; 2023-11-21 15:35:58 +08:00
shahaibo
ff34193e02 TASK: 印花逻辑; 2023-11-21 14:09:47 +08:00
shahaibo
955ebd0904 TASK: 印花逻辑; 2023-11-20 16:41:35 +08:00
shahaibo
20b68d1f92 TASK: 用户试用; 2023-11-20 16:03:34 +08:00
shahaibo
091c11c951 Merge remote-tracking branch 'origin/develop' into develop 2023-11-20 15:06:29 +08:00
shahaibo
4971f2b96a TASK: 用户试用添加,印花逻辑调整; 2023-11-20 15:06:15 +08:00
xupei
13208fed14 Merge remote-tracking branch 'origin/develop' into develop 2023-11-16 10:33:28 +08:00
xupei
ee7820ff8b TASK:moodboard与printboard 图片合成 2023-11-16 10:33:08 +08:00
shahaibo
c15ff3f344 Merge remote-tracking branch 'origin/develop' into develop 2023-11-15 13:32:33 +08:00
shahaibo
1056b9b0b0 TASK: library关联分类; 2023-11-15 13:32:19 +08:00
xupei
9e58ed47ea Merge remote-tracking branch 'origin/develop' into develop 2023-11-15 13:22:36 +08:00
xupei
35e6bb8cd9 BUGFIX:取消like后不能再like同一张图片
其他:generate--sketchboard 添加gender
修改generate like的图片命名--当下的十位时间戳
2023-11-15 13:22:15 +08:00
shahaibo
c6561a4fe8 TASK: library关联分类; 2023-11-15 11:35:27 +08:00
shahaibo
93577cab8e TASK: library关联分类; 2023-11-15 10:22:55 +08:00
shahaibo
211f589d84 TASK: library关联分类; 2023-11-14 15:59:11 +08:00
shahaibo
6d673d6f32 TASK: library关联分类; 2023-11-14 15:26:54 +08:00
shahaibo
09ebb4ca06 TASK: library关联分类; 2023-11-14 14:50:03 +08:00
shahaibo
5dbf76c4e2 TASK: library关联分类; 2023-11-14 14:33:56 +08:00
shahaibo
bcfcb5da12 TASK: library关联分类; 2023-11-13 14:21:28 +08:00
shahaibo
6da1286e56 BUGFIX: library关联分类; 2023-11-13 11:50:45 +08:00
shahaibo
8afec1e962 TASK: 多语言; 2023-11-09 17:13:33 +08:00
shahaibo
f3fcaa3ed6 BUGFIX: 男装 outwear single design; 2023-11-09 13:19:18 +08:00
shahaibo
ebbe39468e Merge remote-tracking branch 'origin/develop' into develop 2023-11-08 15:25:54 +08:00
shahaibo
94809e149d TASK: library分类; 2023-11-08 15:22:46 +08:00
xupei
6a869cf4b5 BUGFIX:designSingle 系统默认模特宽高修改 2023-11-08 11:42:33 +08:00
shahaibo
269b6fa5fb TASK: library分类; 2023-11-07 15:12:55 +08:00
shahaibo
c8fe8c27f8 Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	src/main/resources/messages_en.properties
2023-11-07 11:42:37 +08:00
shahaibo
008d0d626e BUGFIX: 模特删除校验;
TASK: 多语言;
2023-11-07 11:32:03 +08:00
shahaibo
bb1c56182e BUGFIX: sketchBoard upload checkMd5校验;
TASK: 分类;
2023-11-03 14:59:19 +08:00
xupei
331490c447 BUGFIX:generateType 2023-11-03 13:59:16 +08:00
xupei
ffcbabf62e Generate
1、将生成图片的md5存储到数据库
2、记录sketchboard下,生成图片时的性别(添加到generateType之后)
2023-11-03 11:29:54 +08:00
xupei
0313149ea5 修改异常处理+代码清理 2023-11-02 15:35:07 +08:00
shahaibo
85a815dddc BUGFIX: design generate处理; 2023-11-02 14:00:02 +08:00
shahaibo
77be2c7472 Merge remote-tracking branch 'origin/develop' into develop 2023-11-02 11:28:20 +08:00
shahaibo
8840dfc59d BUGFIX: design generate处理; 2023-11-02 11:14:18 +08:00
xupei
2524077768 generate
1、sketchboard的生成条件添加gender
2、添加存储生成图片MD5值到数据库
2023-11-02 10:55:25 +08:00
shahaibo
dbc8c7dcf5 BUGFIX: 系统模特高宽; 2023-11-01 17:30:52 +08:00
shahaibo
78678efd5d BUGFIX: 上传校验; 2023-11-01 09:56:02 +08:00
shahaibo
998ad81835 TASK: 多语言补充; 2023-10-31 16:23:39 +08:00
shahaibo
d71674393f TASK: 语言; 2023-10-31 15:28:37 +08:00
shahaibo
8a04e7a507 TASK: 语言; 2023-10-31 15:05:27 +08:00
shahaibo
44a30bf9b5 TASK: 全局异常优化; 2023-10-31 14:07:43 +08:00
shahaibo
68d28995b8 TASK: 全局异常优化; 2023-10-27 17:02:04 +08:00
shahaibo
31eb3773f6 TASK: 系统模特高宽调整;全局异常优化; 2023-10-27 14:04:27 +08:00
shahaibo
70055f2f4a TASK: 全局异常处理,代码优化,测试数据库连接信息变更; 2023-10-27 10:14:23 +08:00
shahaibo
bedc640e13 TASK: 全局异常处理,代码优化,测试数据库连接信息变更; 2023-10-27 10:09:19 +08:00
shahaibo
9fa605f83e BUGFIX: format; 2023-10-20 14:47:18 +08:00
shahaibo
f18c27fe02 BUGFIX: 代码优化; 2023-10-19 16:12:42 +08:00
shahaibo
201b188579 BUGFIX: like detail; 2023-10-18 16:51:08 +08:00
shahaibo
4b28732d32 BUGFIX: library upload md5重复校验优化; 2023-10-18 15:57:28 +08:00
shahaibo
81d20625f5 BUGFIX: library upload md5重复校验优化; 2023-10-18 15:54:23 +08:00
shahaibo
4c11f2e280 Merge remote-tracking branch 'origin/develop' into develop 2023-10-18 14:58:27 +08:00
shahaibo
2b2fd1a72c BUGFIX: library upload md5重复校验优化; 2023-10-18 14:58:12 +08:00
xupei
fe2ffcd6a6 BUGFIX:修改pantone返回的rgb值 2023-10-18 11:46:50 +08:00
shahaibo
89d3349b49 BUGFIX: retrive回参参数名统一; 2023-10-17 13:42:41 +08:00
shahaibo
8720fc5992 BUGFIX: workspace校验添加; 2023-10-17 10:29:08 +08:00
shahaibo
c3e979e096 BUGFIX: 模特preview; 2023-10-16 11:42:20 +08:00
shahaibo
f76298c42f BUGFIX: 模特preview; 2023-10-16 11:14:48 +08:00
shahaibo
8ad330f690 BUGFIX: 模特preview; 2023-10-16 11:10:23 +08:00
shahaibo
5e70f7ca73 BUGFIX: 模特preview; 2023-10-16 10:53:37 +08:00
shahaibo
0dd765123f TASK: attribute_retrieval; 2023-10-13 10:52:12 +08:00
shahaibo
770e9d1d23 BUGFIX: 机器人余额优化; 2023-10-12 15:50:20 +08:00
shahaibo
381d40c346 BUGFIX: design存sketchboard到library; 2023-10-12 15:35:55 +08:00
shahaibo
e3b7304bbf BUGFIX: library分页; 2023-10-12 14:52:40 +08:00
shahaibo
6f01397d18 Merge remote-tracking branch 'origin/develop' into develop 2023-10-12 10:28:22 +08:00
shahaibo
95174707d8 BUGFIX: 机器人; 2023-10-12 10:27:52 +08:00
shahaibo
1ff64e01e5 BUGFIX: workspace删除校验; 2023-10-12 10:16:50 +08:00
xupei
6bbc8e3f1c Merge remote-tracking branch 'origin/develop' into develop 2023-10-12 10:11:43 +08:00
xupei
39abb48d6f BUGFIX:overall模式下 印花参数返回有null值问题 2023-10-12 10:11:27 +08:00
shahaibo
bad3f86d6d BUGFIX: 机器人喜欢图片喜欢; 2023-10-12 10:07:23 +08:00
shahaibo
47df80138b BUGFIX: workspace新增; 2023-10-12 09:57:48 +08:00
shahaibo
6549e2baeb BUGFIX:机器人聊天; 2023-10-11 17:10:45 +08:00
shahaibo
3ebb3842c2 BUGFIX:机器人返回minio url 性别; 2023-10-11 16:58:40 +08:00
shahaibo
990a270a7b BUGFIX:机器人返回minio url 性别; 2023-10-11 16:56:08 +08:00
shahaibo
ef4624e1bd Merge remote-tracking branch 'origin/develop' into develop 2023-10-11 16:25:40 +08:00
shahaibo
65c84ae5b5 BUGFIX:数据库连接池配置调试; 2023-10-11 16:24:26 +08:00
shahaibo
839c6baa8a BUGFIX:数据库连接池配置调试; 2023-10-11 16:19:35 +08:00
xupei
d8f55a4cc4 接口修改:获取minIO预览地址优先从本地缓存中获取 2023-10-11 15:49:55 +08:00
shahaibo
85a0595f2a BUGFIX:redesign processId传递; 2023-10-11 15:43:25 +08:00
shahaibo
e3309e9841 BUGFIX:synthesis_url返回为空异常处理; 2023-10-11 15:30:44 +08:00
shahaibo
278ef4e9c8 BUGFIX:like 修改detail返回图片; 2023-10-11 15:07:39 +08:00
shahaibo
879703e870 Merge remote-tracking branch 'origin/develop' into develop 2023-10-11 14:54:09 +08:00
shahaibo
e5beab268c TASK:预签名缓存; 2023-10-11 14:53:38 +08:00
xupei
0232df535e Merge remote-tracking branch 'origin/develop' into develop 2023-10-11 13:39:48 +08:00
xupei
bd5ca604f4 Merge remote-tracking branch 'origin/develop' into develop 2023-10-11 13:39:36 +08:00
shahaibo
9e2f4f75c1 TASK:导出喜欢 图片名称添加; 2023-10-11 13:39:24 +08:00
xupei
ffb6a2c9c7 接口修改:getDetail 添加男装服装类型 2023-10-11 13:39:17 +08:00
shahaibo
d1cdef3be5 Merge remote-tracking branch 'origin/develop' into develop 2023-10-11 11:19:10 +08:00
shahaibo
b38754cf74 BUGFIX:redesign 性别传递; 2023-10-11 11:18:56 +08:00
shahaibo
9c162f7ab8 TASK:retrive返回添加图片名称; 2023-10-11 11:03:31 +08:00
xupei
5302e791b9 Merge remote-tracking branch 'origin/develop' into develop 2023-10-11 10:50:58 +08:00
xupei
8229ec7dc0 BUGFIX:offset 2023-10-11 10:50:42 +08:00
shahaibo
b1cd767f9c Merge remote-tracking branch 'origin/develop' into develop 2023-10-11 10:47:56 +08:00
xupei
2d8672e0a8 接口修改:存储offset并返回给前端 2023-10-11 10:37:11 +08:00
shahaibo
ad30fdcc5d BUGFIX:library分页查询; 2023-10-11 10:06:52 +08:00
shahaibo
2cd94fd026 TASK:男装逻辑; 2023-10-10 17:33:39 +08:00
shahaibo
b1d7df2d48 Merge remote-tracking branch 'origin/develop' into develop 2023-10-10 15:02:20 +08:00
shahaibo
e6a72b6a32 TASK:男装; 2023-10-10 15:02:06 +08:00
xupei
7bc0ddd068 接口修改:designSingle 删除参数icon 2023-10-10 14:21:23 +08:00
shahaibo
84c45cb550 Merge remote-tracking branch 'origin/develop' into develop 2023-10-10 14:19:29 +08:00
shahaibo
4a803d90f2 TASK:代码提交; 2023-10-10 14:19:10 +08:00
xupei
555c3cf0dd 接口修改:design 保存印花的位置、角度、优先级 2023-10-09 17:09:57 +08:00
xupei
0f4a51af18 test配置文件修改:端口修改为5567 2023-10-09 16:53:29 +08:00
xupei
7d8c3ca8f3 接口修改: designSingle添加返回参数 offset,currentFullBodyView 2023-10-09 16:40:39 +08:00
shahaibo
1f463aeaaa Merge remote-tracking branch 'origin/develop' into develop 2023-10-09 10:26:24 +08:00
shahaibo
26f4566fac BUGFIX:系统模特高宽默认1050 500; 2023-10-09 10:26:10 +08:00
xupei
37be900b22 接口修改: designSingle添加入参 processId 2023-10-09 10:03:04 +08:00
shahaibo
e7ea5c2a2a BUGFIX:系统模特高宽默认1050 500; 2023-10-09 09:51:31 +08:00
shahaibo
b18e8eb09f BUGFIX:library upload; 2023-10-07 18:47:53 +08:00
shahaibo
935dedcf09 BUGFIX:library upload; 2023-10-07 18:28:47 +08:00
shahaibo
8893ef0039 BUGFIX:design接口 python入参添加两个字段; 2023-10-07 17:55:58 +08:00
xupei
75c1d4dee1 Merge remote-tracking branch 'origin/develop' into develop 2023-10-06 15:56:51 +08:00
xupei
6eb4f997c3 接口修改: 将designSingle与editLayer接口合并 2023-10-06 15:56:32 +08:00
shahaibo
3abb07cb3b Merge remote-tracking branch 'origin/develop' into develop 2023-10-06 10:28:17 +08:00
shahaibo
b6e33668ec BUGFIX:模特; 2023-10-06 10:28:01 +08:00
xupei
e8cbe6f244 BUGFIX: designSingle submit 2023-10-06 09:45:07 +08:00
shahaibo
e8760df88f BUGFIX:模特; 2023-10-05 16:17:01 +08:00
shahaibo
fa44552437 Merge remote-tracking branch 'origin/develop' into develop 2023-10-05 15:16:03 +08:00
shahaibo
61e9888ab9 BUGFIX:模特; 2023-10-05 15:14:50 +08:00
xupei
d8d167baa8 designSingle 新增返回图层minio地址 2023-10-05 15:09:49 +08:00
xupei
30ba1d1d71 BUGFIX:修改图层大小和位置 传参image_url mask_url 2023-10-05 14:54:42 +08:00
xupei
dac556a4ba Merge remote-tracking branch 'origin/develop' into develop 2023-10-05 14:25:41 +08:00
xupei
9877a5240f BUGFIX:印花 overall 2023-10-05 14:25:25 +08:00
shahaibo
907184d2eb BUGFIX:模特; 2023-10-05 13:37:42 +08:00
shahaibo
9d1d555032 Merge remote-tracking branch 'origin/develop' into develop 2023-10-05 12:11:25 +08:00
shahaibo
54bbf0b9b3 BUGFIX:模特; 2023-10-05 12:05:16 +08:00
xupei
7a1652ac60 BUGFIX:编辑图层位置大小 2023-10-05 11:30:06 +08:00
xupei
a9f24e8fe5 BUGFIX:添加progress_id 2023-10-05 09:43:03 +08:00
xupei
abecb54b1d BUGFIX:获取模特信息 2023-10-04 19:14:42 +08:00
shahaibo
a5a70884b8 BUGFIX:系统模特上传; 2023-10-04 17:34:52 +08:00
shahaibo
f661271f48 BUGFIX:系统模特上传; 2023-10-04 17:28:24 +08:00
shahaibo
c1c1687e8e BUGFIX:系统模特上传; 2023-10-04 17:22:42 +08:00
shahaibo
1ef079a1f9 BUGFIX:系统模特上传; 2023-10-04 17:02:54 +08:00
shahaibo
9bf7bba29c BUGFIX:系统模特上传; 2023-10-04 16:27:15 +08:00
shahaibo
7daa3dc004 BUGFIX:系统模特上传; 2023-10-04 16:22:46 +08:00
shahaibo
4068a64c54 BUGFIX:系统模特上传; 2023-10-04 16:20:36 +08:00
shahaibo
b560deb1f3 BUGFIX:系统模特上传; 2023-10-04 16:14:52 +08:00
shahaibo
edc4947280 BUGFIX:系统模特上传; 2023-10-04 16:11:27 +08:00
shahaibo
b46a1815e5 BUGFIX:系统模特上传; 2023-10-04 16:09:11 +08:00
shahaibo
9c3ab437fb BUGFIX:系统模特上传; 2023-10-04 15:56:31 +08:00
shahaibo
3620a0a895 BUGFIX:系统模特上传; 2023-10-04 15:37:20 +08:00
shahaibo
0893af46dd BUGFIX:系统模特上传; 2023-10-04 15:29:54 +08:00
shahaibo
2ad61ff618 Merge remote-tracking branch 'origin/develop' into develop 2023-10-04 15:06:34 +08:00
shahaibo
00fcdf9cbf BUGFIX:系统模特上传; 2023-10-04 14:58:06 +08:00
xupei
6dc61dd452 模特相关修改
及图层修改 添加优先级
2023-10-04 14:51:00 +08:00
shahaibo
9e7ed913ce TASK:印花; 2023-10-04 13:16:02 +08:00
shahaibo
db502aaef5 Merge remote-tracking branch 'origin/develop' into develop 2023-10-04 09:26:48 +08:00
shahaibo
114b78bdfa TASK:印花; 2023-10-04 09:26:26 +08:00
xupei
0103b0c814 修改图层大小和位置 2023-10-04 08:59:27 +08:00
shahaibo
fd5e47ecdc TASK:印花; 2023-10-04 08:20:59 +08:00
shahaibo
ee32111599 TASK:模特相关接口; 2023-10-04 06:47:48 +08:00
shahaibo
612fb61ac1 TASK:参数名修改; 2023-10-03 18:40:55 +08:00
shahaibo
b9abb2dd8f TASK:参数名修改; 2023-10-03 18:40:23 +08:00
shahaibo
0931923d0b Merge remote-tracking branch 'origin/develop' into dev_shb
# Conflicts:
#	src/main/java/com/ai/da/mapper/entity/SysFile.java
2023-09-30 13:23:08 +08:00
shahaibo
1959e3b7ff TASK:roll back; 2023-09-29 21:45:22 +08:00
shahaibo
0a3487a3db TASK:机器人、首页、history模块代码; 2023-09-29 21:44:43 +08:00
xupei
b0095e26a7 design detail 新增接口--编辑图层的位置、大小 2023-09-29 13:59:38 +08:00
xupei
f026a9b929 Merge remote-tracking branch 'origin/dev_shb' into develop
# Conflicts:
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
2023-09-28 10:29:54 +08:00
xupei
7356a0a3c4 designSingle 、getDetail 接口联调修改 2023-09-26 16:28:36 +08:00
xupei
8a3c42ac0e designSingle 、getDetail 添加返回印花详细 2023-09-26 15:47:01 +08:00
xupei
255529c8bc getDetail 修改bug-相同的colorIndex导致颜色返回为空 2023-09-22 17:04:08 +08:00
shahaibo
02d658dd0d TASK:workspace、design模块代码; 2023-09-22 16:28:33 +08:00
xupei
55e32d2fe7 getDetail 不返回颜色问题修改 2023-09-22 16:07:11 +08:00
xupei
b2e3347a92 design single submit bug修改 2023-09-22 13:41:55 +08:00
xupei
11fdeebe76 bug修改 2023-09-21 14:34:50 +08:00
xupei
dcd4ce584c 印花坐标修改 2023-09-21 13:44:39 +08:00
xupei
e1b3c20131 Merge remote-tracking branch 'origin/dev_shb' into develop 2023-09-21 11:36:43 +08:00
shahaibo
1870996244 TASK:workspace、design模块代码; 2023-09-21 11:35:58 +08:00
xupei
ba96d52611 模特路径修改 2023-09-21 09:59:36 +08:00
xupei
e0d8d14235 模特路径修改 2023-09-21 09:55:21 +08:00
xupei
d6e74883b9 配置文件修改 2023-09-20 16:52:46 +08:00
xupei
20f5a3eda2 design single接口疏通 2023-09-20 16:16:02 +08:00
xupei
7e6047ddf7 Merge remote-tracking branch 'origin/dev_shb' into develop
# Conflicts:
#	src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java
2023-09-20 16:04:12 +08:00
shahaibo
49b62d3733 TASK:workspace、design模块代码; 2023-09-20 16:02:57 +08:00
shahaibo
d3530f0af9 Merge remote-tracking branch 'origin/dev-xp' into dev_shb
# Conflicts:
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
#	src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java
2023-09-20 13:35:35 +08:00
xupei
3f90715e00 Merge remote-tracking branch 'origin/dev_shb' into develop 2023-09-20 13:12:00 +08:00
shahaibo
0115759563 TASK:workspace、design模块代码; 2023-09-20 13:03:07 +08:00
xupei
8478de460a Merge remote-tracking branch 'origin/dev_shb' into develop
# Conflicts:
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
#	src/main/java/com/ai/da/service/impl/LibraryServiceImpl.java
2023-09-20 13:02:02 +08:00
shahaibo
cbb5145123 TASK:workspace、design模块代码; 2023-09-20 12:05:08 +08:00
xupei
7269c19aab generate 接口疏通 2023-09-19 16:37:23 +08:00
xupei
3afe1c715d generate 接口疏通 2023-09-19 15:52:33 +08:00
xupei
aef2bb7457 generate 修改dislike接口 2023-09-19 15:39:21 +08:00
xupei
eb2ef0f39d generate 添加dislike功能
获取library地址修改(兼容minio地址)
2023-09-19 15:21:53 +08:00
xupei
00803692b2 minio 返回路径修改 2023-09-19 13:25:55 +08:00
xupei
a543dde9a7 generate bug修改 2023-09-19 10:56:17 +08:00
xupei
d418df3c60 generate 接口疏通 2023-09-19 10:25:03 +08:00
xupei
88b526f1c4 getDetail designSingle bug修改 2023-09-18 17:22:15 +08:00
xupei
206f365ff3 design Single接口第二版 2023-09-18 14:44:30 +08:00
xupei
778bb9534d design Single接口第一版 2023-09-18 11:33:13 +08:00
xupei
305b932cbd design Single接口第一版 2023-09-18 11:31:26 +08:00
xupei
146101eec4 Merge remote-tracking branch 'origin/dev_shb' into dev-xp 2023-09-18 10:09:53 +08:00
shahaibo
9ba7049438 TASK:workspace、design模块代码; 2023-09-18 09:51:53 +08:00
xupei
01cdbf99f9 Merge remote-tracking branch 'origin/dev_shb' into dev-xp
# Conflicts:
#	src/main/java/com/ai/da/model/vo/DesignPythonOutfitVO.java
#	src/main/java/com/ai/da/python/PythonService.java
#	src/main/java/com/ai/da/service/impl/TDesignPythonOutfitDetailServiceImpl.java
2023-09-14 14:19:34 +08:00
shahaibo
e007d2353e TASK:workspace、design模块代码; 2023-09-14 13:19:54 +08:00
xupei
cf771a5b77 修改 design single功能 2023-09-14 12:58:49 +08:00
shahaibo
dc9957accf TASK:workspace、design模块代码; 2023-09-13 10:35:56 +08:00
shahaibo
a08300f095 Merge remote-tracking branch 'origin/develop' into dev_shb
# Conflicts:
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
2023-09-13 10:34:09 +08:00
shahaibo
7a6d70c2cf TASK:workspace、design模块代码; 2023-09-13 10:19:23 +08:00
shahaibo
03f8f9a6cf TASK:workspace、design模块代码; 2023-09-12 09:51:12 +08:00
xupei
41111bc0e4 修改 获取design detail接口的返回数据格式 2023-09-08 15:54:30 +08:00
xupei
15bbe55182 upload文件 ip地址变更 2023-09-08 13:07:40 +08:00
xupei
2ed7435120 design detail -- bug修改 2023-09-07 17:14:41 +08:00
xupei
3c6ea5523c 测试代码删除 2023-09-07 15:46:01 +08:00
xupei
5d482365cd 测试代码删除 2023-09-07 15:43:50 +08:00
xupei
165449084b 获取design detail 2023-09-07 15:31:52 +08:00
xupei
1201f57291 Merge remote-tracking branch 'origin/dev_shb' into dev-xp
# Conflicts:
#	src/main/java/com/ai/da/python/PythonService.java
#	src/main/java/com/ai/da/service/impl/DesignServiceImpl.java
2023-09-06 15:45:23 +08:00
shahaibo
de0d8bc459 TASK:workspace、design模块代码; 2023-09-06 14:28:20 +08:00
徐佩
90edb573d9 design detail代码转移,临时存储 2023-09-06 13:53:15 +08:00
徐佩
2d924ca1e6 generate功能相关代码优化 2023-08-31 12:59:23 +08:00
徐佩
89b237215a 新增generate like功能,及新增一次上传多张图片功能 2023-08-29 10:33:32 +08:00
徐佩
9f8acf375c 配置文件 python服务ip地址修改 2023-08-21 17:27:45 +08:00
徐佩
349306a1be Merge remote-tracking branch 'origin/develop' into develop 2023-08-18 10:42:37 +08:00
徐佩
b13feb8f1f Sketchboard与Printboard的generate功能 修改 2023-08-18 10:42:08 +08:00
zhouchengrong
457f196c79 新增文件映射 2023-08-17 17:07:39 +08:00
徐佩
c5e5b51852 generateSketch 功能--空指针异常 修改 2023-08-17 16:11:26 +08:00
徐佩
5b41b51859 generateSketch 功能 2023-08-17 11:59:19 +08:00
徐佩
11e9ff4e2c 修改图片储存服务器ip 2023-08-17 10:49:23 +08:00
徐佩
15c787bea1 添加python端调用upload接口的operateType
--添加类型“generateSketch”
2023-08-15 16:24:14 +08:00
zhouchengrong
7dbd9453f8 全局跨域 2023-07-26 17:23:50 +08:00
zhouchengrong
f2cca64353 新增chat robot 模块跨域 2023-07-26 17:04:24 +08:00
zhouchengrong
b6ad019dec chat robot 2023-07-26 14:58:05 +08:00
zhouchengrong
efdaa75be0 chat robot 调试修改 消息响应修改为一秒一条 2023-07-26 10:44:20 +08:00
zhouchengrong
677bd53842 修改docker 配置 解决容器内时区问题 2023-07-26 09:48:59 +08:00
zhouchengrong
751715100f 新增chat Robot 接口服务 2023-07-26 09:44:54 +08:00
zhouchengrong
b0649b4c09 新增chat Robot 接口服务 2023-07-25 19:50:27 +08:00
zhouchengrong
68146d62f4 新增chat Robot 接口服务 2023-07-25 19:17:11 +08:00
zhouchengrong
31c2bb06fc 新增chat Robot 接口服务 2023-07-25 17:57:37 +08:00
zhouchengrong
c6ba7b13c1 更新docker-compose文件 2023-07-21 16:37:56 +08:00
zhouchengrong
01743f4218 更新docker-compose文件 2023-07-21 11:02:59 +08:00
zhouchengrong
4e4623cdda 更新docker-compose文件 2023-07-21 10:27:18 +08:00
zhouchengrong
dcf2f6623b 更新docker-compose文件 2023-07-20 21:21:45 +08:00
zhouchengrong
04f53231c1 更新docker-compose文件 2023-07-20 21:10:55 +08:00
zhouchengrong
68d4bde1b8 更新docker-compose文件 2023-07-20 17:54:45 +08:00
zhouchengrong
9a5eae70ce 新增docker-compose文件 2023-07-20 17:38:02 +08:00
zhouchengrong
3343066daf 修改gitignore文件 2023-07-20 15:56:19 +08:00
zhouchengrong
4f268a2acc 修改gitignore文件 2023-07-20 14:47:35 +08:00
zhouchengrong
c2242ff7fa 新增dockerfile文件 2023-07-20 14:41:21 +08:00
zhouchengrong
60ae1e3849 整合预先登录接口与邮件发送 2023-07-20 14:18:50 +08:00
zhouchengrong
7e9fdca250 commit 2023-07-20 12:01:56 +08:00
1100 changed files with 79313 additions and 9502 deletions

View File

@@ -1,111 +0,0 @@
name: 手动 AiDA back-java 开发分支构建部署
on:
workflow_dispatch:
jobs:
build_and_deploy:
runs-on: java21
outputs:
build_status: ${{ job.status }}
build_url: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
permissions:
contents: read
packages: write
env:
REMOTE_DEPLOY_PATH: /workspace/workspace_aida/DevelopVersion/develop-MS-version-aida-back
steps:
- name: 0.记录开始时间
id: build_start_time
run: echo "current_time=$(TZ='Asia/Hong_Kong' date '+%Y-%m-%d %H:%M:%S %Z')" >> $GITHUB_OUTPUT
- name: 1.检出代码
uses: actions/checkout@v4
with:
ref: dev/3.1_release_merge_MS
- name: 3.缓存 Maven 依赖
uses: actions/cache@v5
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
- name: 4.构建项目
run: |
java -version
mvn -v
mvn clean package -DskipTests
- name: 5.生成Dockerfile
run: |
echo "===== 生成Dockerfile ====="
cat > Dockerfile << 'EOF'
FROM openjdk:21-ea-21-jdk-slim
VOLUME /tmp
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone
ADD ./target/aida-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
EOF
echo "Dockerfile内容:"
cat Dockerfile
- name: 6.生成docker-compose.yml
run: |
echo "===== 生成docker-compose.yml ====="
cat > docker-compose.yml << 'EOF'
version: '3'
services:
aida_back:
container_name: develop-aida-ms
build: .
volumes:
# 数据挂载
- ./log:/log
- ./temp:/temp
- ./uploads:/temp/uploads
ports:
- '10092:5567'
restart: always
EOF
# 验证docker-compose.yml生成
echo "docker-compose.yml内容:"
cat docker-compose.yml
- name: 7.上传jar到远程服务器
uses: appleboy/scp-action@master
with:
host: ${{ secrets.SERVER_HOST }}
port: 22
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KEY }}
source: "target/*.jar,Dockerfile,docker-compose.yml"
target: ${{ env.REMOTE_DEPLOY_PATH }}
preserve_host_directory_structure: false
- name: 8. 重启 Docker 服务
uses: appleboy/ssh-action@master # 👈 专门执行命令的 action
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_KEY }}
key_base64: true
script: |
echo "========= 进入部署目录 ========="
cd ${{ env.REMOTE_DEPLOY_PATH }}
ls -l
echo "========= 停止旧服务 ========="
docker compose down
echo "========= 启动新服务 ========="
docker compose up -d --build
echo "========= 查看运行状态 ========="
docker compose ps

View File

@@ -14,7 +14,7 @@ jobs:
packages: write packages: write
env: env:
REMOTE_DEPLOY_PATH: /mnt/process/A6000_Server/AiDA_Workspace/Java_Server_workspace/Dev/ REMOTE_DEPLOY_PATH: /workspace/workspace_aida/DevelopVersion/develop-version-aida-back
steps: steps:
- name: 0.记录开始时间 - name: 0.记录开始时间
@@ -99,6 +99,8 @@ jobs:
volumes: volumes:
# 数据挂载 # 数据挂载
- ./log:/log - ./log:/log
- ./temp:/temp
- ./uploads:/temp/uploads
ports: ports:
- '10090:5567' - '10090:5567'
restart: always restart: always

View File

@@ -1,174 +0,0 @@
name: 手动 AiDA back-java 生产分支构建部署
on:
workflow_dispatch:
jobs:
build_and_deploy:
runs-on: ubuntu-latest
outputs:
build_status: ${{ job.status }}
build_url: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
permissions:
contents: read
packages: write
env:
REMOTE_DEPLOY_PATH: /workspace/workspace_aida/ProdVersion/prod-version-aida-back
steps:
- name: 0.记录开始时间
id: build_start_time
run: echo "current_time=$(TZ='Asia/Hong_Kong' date '+%Y-%m-%d %H:%M:%S %Z')" >> $GITHUB_OUTPUT
- name: 1.检出代码
uses: actions/checkout@v4
with:
ref: release/3.1
- name: 2.Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
- name: 3.设置JAVA Maven 环境
run: |
# 适配root/普通用户
SUDO=""
[ "$(id -u)" != "0" ] && SUDO="sudo"
# 安装依赖
$SUDO apt update && $SUDO apt install -y wget tar --no-install-recommends
# 下载Maven
MAVEN_VERSION="3.9.11"
MAVEN_TAR="apache-maven-${MAVEN_VERSION}-bin.tar.gz"
MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/${MAVEN_TAR}"
wget --no-verbose -O /tmp/${MAVEN_TAR} ${MAVEN_URL}
# 解压+软链接
$SUDO tar -xzf /tmp/${MAVEN_TAR} -C /usr/local/
$SUDO ln -sf /usr/local/apache-maven-${MAVEN_VERSION} /usr/local/maven
# 配置PATH
echo "/usr/local/maven/bin" >> $GITHUB_PATH
export PATH="/usr/local/maven/bin:$PATH"
# 验证
mvn -v
- name: 4.构建jar包
run: |
echo "===== 开始构建JAR包 ====="
# 新增:打印当前构建分支(两种方式双重确认)
echo "当前工作目录分支:$(git branch --show-current)"
echo "Gitea检出分支:${{ github.ref_name }}"
echo "预期构建分支:dev/3.1_release_merge"
echo "========================"
mvn -B clean install -DskipTests -Pdev 2>&1
# 检查构建是否成功
if [ $? -ne 0 ]; then
echo "JAR包构建失败!"
exit 1
fi
- name: 5.生成Dockerfile
run: |
echo "===== 生成Dockerfile ====="
cat > Dockerfile << 'EOF'
FROM openjdk:21-ea-21-jdk-slim
VOLUME /tmp
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone
ADD ./aida-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
EOF
echo "Dockerfile内容:"
cat Dockerfile
- name: 6.生成docker-compose.yml
run: |
echo "===== 生成docker-compose.yml ====="
cat > docker-compose.yml << 'EOF'
version: '3'
services:
aida_back:
container_name: prod-version-aida-back
build: .
volumes:
# 数据挂载
- ./log:/log
- ./temp:/temp
- ./uploads:/temp/uploads
ports:
- '10010:5567'
restart: always
EOF
# 验证docker-compose.yml生成
echo "docker-compose.yml内容:"
cat docker-compose.yml
- name: 7.安装SSH工具
run: |
$SUDO apt install -y sshpass openssh-client --no-install-recommends
# 配置SSH免密
mkdir -p ~/.ssh
echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
- name: 8.同步文件到远程服务器
run: |
echo "===== 同步文件到远程服务器 ====="
# 使用scp同步文件
scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
./target/*.jar ./Dockerfile ./docker-compose.yml \
${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:${{ env.REMOTE_DEPLOY_PATH }} 2>&1
- name: 9.部署和运行服务
run: |
echo "===== 开始部署服务 ====="
# SSH执行部署命令
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF_SSH'
cd ${{ env.REMOTE_DEPLOY_PATH }}
echo "停止旧容器..."
docker compose down || true
echo "构建镜像..."
docker compose build --no-cache
echo "启动服务..."
docker compose up -d
echo "验证容器状态..."
docker compose ps
echo "部署完成!"
EOF_SSH
- name: 10.发送构建结果邮件
if: always() # 无论上一步是否失败,都执行此步骤
uses: dawidd6/action-send-mail@v3
with:
from: ${{ secrets.MAIL_USERNAME }}
# --- 邮件配置 ---
server_address: smtp.gmail.com # 替换为你的SMTP服务器地址
server_port: 465 # 替换为你的SMTP端口 (通常是465或587)
username: ${{ secrets.MAIL_USERNAME }} # 存储在Secrets中的邮箱用户名
password: ${{ secrets.MAIL_PASSWORD }} # 存储在Secrets中的邮箱密码
subject: 'Gitea Actions 构建通知: ${{ job.status }} - AiDA back-java Develop'
# 收件人列表,可以根据需要更改
to: 'xupei3360@163.com,txli@aidlab.hk,cgzhou@aidlab.hk,zchengrong@yeah.net' # 替换为实际收件人邮箱
# --- 邮件正文内容 ---
body: |
项目: AiDA back-java Prod
分支: release/3.1
🎉 构建结果: ${{ job.status }}
📅 构建时间: ${{ steps.build_start_time.outputs.current_time }}
🔗 构建链接: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
# 确保邮件内容为纯文本,或者你可以设置为 html: true 并调整 body
content_type: text/plain

View File

@@ -1,177 +0,0 @@
name: 定时 AiDA back-java 生产分支构建部署
on:
schedule:
# cron为UTC时区构建时间=部署时间-8小时 {*分 (-8)时 *日 *月 *周} ---
# 示例: 1月1日22点22分触发构建 cron写作 - '22 14 1 1 *'
- cron: '00 14 13 3 *'
jobs:
build_and_deploy:
runs-on: ubuntu-latest
outputs:
build_status: ${{ job.status }}
build_url: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
permissions:
contents: read
packages: write
env:
REMOTE_DEPLOY_PATH: /workspace/workspace_aida/ProdVersion/prod-version-aida-back
steps:
- name: 0.记录开始时间
id: build_start_time
run: echo "current_time=$(TZ='Asia/Hong_Kong' date '+%Y-%m-%d %H:%M:%S %Z')" >> $GITHUB_OUTPUT
- name: 1.检出代码
uses: actions/checkout@v4
with:
ref: release/3.1
- name: 2.Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
- name: 3.设置JAVA Maven 环境
run: |
# 适配root/普通用户
SUDO=""
[ "$(id -u)" != "0" ] && SUDO="sudo"
# 安装依赖
$SUDO apt update && $SUDO apt install -y wget tar --no-install-recommends
# 下载Maven
MAVEN_VERSION="3.9.11"
MAVEN_TAR="apache-maven-${MAVEN_VERSION}-bin.tar.gz"
MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/${MAVEN_TAR}"
wget --no-verbose -O /tmp/${MAVEN_TAR} ${MAVEN_URL}
# 解压+软链接
$SUDO tar -xzf /tmp/${MAVEN_TAR} -C /usr/local/
$SUDO ln -sf /usr/local/apache-maven-${MAVEN_VERSION} /usr/local/maven
# 配置PATH
echo "/usr/local/maven/bin" >> $GITHUB_PATH
export PATH="/usr/local/maven/bin:$PATH"
# 验证
mvn -v
- name: 4.构建jar包
run: |
echo "===== 开始构建JAR包 ====="
# 新增:打印当前构建分支(两种方式双重确认)
echo "当前工作目录分支:$(git branch --show-current)"
echo "Gitea检出分支:${{ github.ref_name }}"
echo "预期构建分支:dev/3.1_release_merge"
echo "========================"
mvn -B clean install -DskipTests -Pdev 2>&1
# 检查构建是否成功
if [ $? -ne 0 ]; then
echo "JAR包构建失败!"
exit 1
fi
- name: 5.生成Dockerfile
run: |
echo "===== 生成Dockerfile ====="
cat > Dockerfile << 'EOF'
FROM openjdk:21-ea-21-jdk-slim
VOLUME /tmp
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone
ADD ./aida-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
EOF
echo "Dockerfile内容:"
cat Dockerfile
- name: 6.生成docker-compose.yml
run: |
echo "===== 生成docker-compose.yml ====="
cat > docker-compose.yml << 'EOF'
version: '3'
services:
aida_back:
container_name: prod-version-aida-back
build: .
volumes:
# 数据挂载
- ./log:/log
ports:
- '10010:5567'
restart: always
EOF
# 验证docker-compose.yml生成
echo "docker-compose.yml内容:"
cat docker-compose.yml
- name: 7.安装SSH工具
run: |
$SUDO apt install -y sshpass openssh-client --no-install-recommends
# 配置SSH免密
mkdir -p ~/.ssh
echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
- name: 8.同步文件到远程服务器
run: |
echo "===== 同步文件到远程服务器 ====="
# 使用scp同步文件
scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
./target/*.jar ./Dockerfile ./docker-compose.yml \
${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:${{ env.REMOTE_DEPLOY_PATH }} 2>&1
- name: 9.部署和运行服务
run: |
echo "===== 开始部署服务 ====="
# SSH执行部署命令
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF_SSH'
cd ${{ env.REMOTE_DEPLOY_PATH }}
echo "停止旧容器..."
docker compose down || true
echo "清理Docker资源..."
docker system prune -f
echo "构建镜像..."
docker compose build --no-cache
echo "启动服务..."
docker compose up -d
echo "验证容器状态..."
docker compose ps
echo "部署完成!"
EOF_SSH
- name: 10.发送构建结果邮件
if: always() # 无论上一步是否失败,都执行此步骤
uses: dawidd6/action-send-mail@v3
with:
from: ${{ secrets.MAIL_USERNAME }}
# --- 邮件配置 ---
server_address: smtp.gmail.com # 替换为你的SMTP服务器地址
server_port: 465 # 替换为你的SMTP端口 (通常是465或587)
username: ${{ secrets.MAIL_USERNAME }} # 存储在Secrets中的邮箱用户名
password: ${{ secrets.MAIL_PASSWORD }} # 存储在Secrets中的邮箱密码
subject: 'Gitea Actions 构建通知: ${{ job.status }} - AiDA back-java Develop'
# 收件人列表,可以根据需要更改
to: 'xupei3360@163.com,txli@aidlab.hk,cgzhou@aidlab.hk,zchengrong@yeah.net' # 替换为实际收件人邮箱
# --- 邮件正文内容 ---
body: |
项目: AiDA back-java Prod
分支: release/3.1
🎉 构建结果: ${{ job.status }}
📅 构建时间: ${{ steps.build_start_time.outputs.current_time }}
🔗 构建链接: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
# 确保邮件内容为纯文本,或者你可以设置为 html: true 并调整 body
content_type: text/plain

View File

@@ -1,176 +0,0 @@
name: 手动 AiDA back-java 开发分支构建部署
on:
workflow_dispatch:
jobs:
build_and_deploy:
runs-on: ubuntu-latest
outputs:
build_status: ${{ job.status }}
build_url: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
permissions:
contents: read
packages: write
env:
REMOTE_DEPLOY_PATH: /mnt/process/A6000_Server/AiDA_Workspace/Java_Server_workspace/Dev/
steps:
- name: 0.记录开始时间
id: build_start_time
run: echo "current_time=$(TZ='Asia/Hong_Kong' date '+%Y-%m-%d %H:%M:%S %Z')" >> $GITHUB_OUTPUT
- name: 1.检出代码
uses: actions/checkout@v4
with:
ref: dev/3.1_release_merge
- name: 2.Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
- name: 3.设置JAVA Maven 环境
run: |
# 适配root/普通用户
SUDO=""
[ "$(id -u)" != "0" ] && SUDO="sudo"
# 安装依赖
$SUDO apt update && $SUDO apt install -y wget tar --no-install-recommends
# 下载Maven
MAVEN_VERSION="3.9.11"
MAVEN_TAR="apache-maven-${MAVEN_VERSION}-bin.tar.gz"
MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/${MAVEN_TAR}"
wget --no-verbose -O /tmp/${MAVEN_TAR} ${MAVEN_URL}
# 解压+软链接
$SUDO tar -xzf /tmp/${MAVEN_TAR} -C /usr/local/
$SUDO ln -sf /usr/local/apache-maven-${MAVEN_VERSION} /usr/local/maven
# 配置PATH
echo "/usr/local/maven/bin" >> $GITHUB_PATH
export PATH="/usr/local/maven/bin:$PATH"
# 验证
mvn -v
- name: 4.构建jar包
run: |
echo "===== 开始构建JAR包 ====="
# 新增:打印当前构建分支(两种方式双重确认)
echo "当前工作目录分支:$(git branch --show-current)"
echo "Gitea检出分支:${{ github.ref_name }}"
echo "预期构建分支:dev/3.1_release_merge"
echo "========================"
mvn -B clean install -DskipTests -Pdev 2>&1
# 检查构建是否成功
if [ $? -ne 0 ]; then
echo "JAR包构建失败!"
exit 1
fi
- name: 5.生成Dockerfile
run: |
echo "===== 生成Dockerfile ====="
cat > Dockerfile << 'EOF'
FROM openjdk:21-ea-21-jdk-slim
VOLUME /tmp
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone
ADD ./aida-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
EOF
echo "Dockerfile内容:"
cat Dockerfile
- name: 6.生成docker-compose.yml
run: |
echo "===== 生成docker-compose.yml ====="
cat > docker-compose.yml << 'EOF'
version: '3'
services:
aida_back:
container_name: develop-version-aida-back
build: .
volumes:
# 数据挂载
- ./log:/log
ports:
- '1608:5567'
restart: always
EOF
# 验证docker-compose.yml生成
echo "docker-compose.yml内容:"
cat docker-compose.yml
- name: 7.安装SSH工具
run: |
$SUDO apt install -y sshpass openssh-client --no-install-recommends
# 配置SSH免密
mkdir -p ~/.ssh
echo "${{ secrets.SEARCH_SSH_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -H ${{ secrets.SEARCH_SERVER_HOST }} >> ~/.ssh/known_hosts
- name: 8.同步文件到远程服务器
run: |
echo "===== 同步文件到远程服务器 ====="
# 使用scp同步文件
scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
./target/*.jar ./Dockerfile ./docker-compose.yml \
${{ secrets.SEARCH_SERVER_USER }}@${{ secrets.SEARCH_SERVER_HOST }}:${{ env.REMOTE_DEPLOY_PATH }} 2>&1
- name: 9.部署和运行服务
run: |
echo "===== 开始部署服务 ====="
# SSH执行部署命令
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
${{ secrets.SEARCH_SERVER_USER }}@${{ secrets.SEARCH_SERVER_HOST }} << 'EOF_SSH'
cd ${{ env.REMOTE_DEPLOY_PATH }}
echo "停止旧容器..."
docker compose down || true
echo "清理Docker资源..."
docker system prune -f
echo "构建镜像..."
docker compose build --no-cache
echo "启动服务..."
docker compose up -d
echo "验证容器状态..."
docker compose ps
echo "部署完成!"
EOF_SSH
- name: 10.发送构建结果邮件
if: always() # 无论上一步是否失败,都执行此步骤
uses: dawidd6/action-send-mail@v3
with:
from: ${{ secrets.MAIL_USERNAME }}
# --- 邮件配置 ---
server_address: smtp.gmail.com # 替换为你的SMTP服务器地址
server_port: 465 # 替换为你的SMTP端口 (通常是465或587)
username: ${{ secrets.MAIL_USERNAME }} # 存储在Secrets中的邮箱用户名
password: ${{ secrets.MAIL_PASSWORD }} # 存储在Secrets中的邮箱密码
subject: 'Gitea Actions 构建通知: ${{ job.status }} - AiDA back-java Develop'
# 收件人列表,可以根据需要更改
to: 'cgzhou@aidlab.hk,zchengrong@yeah.net' # 替换为实际收件人邮箱
# --- 邮件正文内容 ---
body: |
项目: AiDA back-java Develop
分支: dev/3.1_release_merge
🎉 构建结果: ${{ job.status }}
📅 构建时间: ${{ steps.build_start_time.outputs.current_time }}
🔗 构建链接: ${{ gitea.server_url }}/${{ gitea.repository.owner.name }}/${{ gitea.repository.name }}/actions/runs/${{ gitea.run_id }}
# 确保邮件内容为纯文本,或者你可以设置为 html: true 并调整 body
content_type: text/plain

49
.gitignore vendored
View File

@@ -1,2 +1,51 @@
sql/*.sql sql/*.sql
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**
!**/src/test/**
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
.log
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
.mvn
mvnw*
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
### VS Code ###
.vscode/
### generated files ###
bin/
gen/
### MAC ###
.DS_Store
### Other ###
logs/
log
temp/
docker-compose.yml
/src/main/resources/application-local.properties

View File

@@ -1,2 +1,3 @@
# Aida 1.2 # Aida 1.2
Version of aida 1.2 Version of aida 1.3
修改预先登录接口、逻辑

192
aida.iml
View File

@@ -1,192 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="Spring" name="Spring">
<configuration />
</facet>
<facet type="web" name="Web">
<configuration>
<webroots />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.12.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.12.1" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.29" level="project" />
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
<orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.25" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.10.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.29" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.29" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.10" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.2.2.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.2.2.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.2.2.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.29" level="project" />
<orderEntry type="library" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.2" level="project" />
<orderEntry type="library" name="Maven: jakarta.activation:jakarta.activation-api:1.2.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.5.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.5.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.5.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.5.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.5.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.vintage:junit-vintage-engine:5.5.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.5.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:3.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.13.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest:2.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:3.1.0" level="project" />
<orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.10.4" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.10.4" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.2.2.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.2.2.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.6.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-redis:2.2.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-keyvalue:2.2.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:2.2.3.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-oxm:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.lettuce:lettuce-core:5.2.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.43.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-handler:4.1.43.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.43.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.43.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.43.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-resolver:4.1.43.Final" level="project" />
<orderEntry type="library" name="Maven: io.projectreactor:reactor-core:3.3.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-configuration-processor:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-security:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-config:5.2.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-core:5.2.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-web:5.2.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-jwt:1.1.1.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.64" level="project" />
<orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.64" level="project" />
<orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.18" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-boot-starter:3.5.2" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.5.2" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.5.2" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-core:3.5.2" level="project" />
<orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-annotation:3.5.2" level="project" />
<orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:4.4" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.10" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.7" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.61" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib:1.3.61" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-common:1.3.61" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains:annotations:13.0" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.61" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.4.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.2.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: jakarta.validation:jakarta.validation-api:2.0.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.29" level="project" />
<orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.18.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.1.Final" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml:classmate:1.5.1" level="project" />
<orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.8.2" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:fastjson:2.0.6.graal" level="project" />
<orderEntry type="library" name="Maven: com.alibaba.fastjson2:fastjson2-extension:2.0.6.graal" level="project" />
<orderEntry type="library" name="Maven: com.alibaba.fastjson2:fastjson2:2.0.6.graal" level="project" />
<orderEntry type="library" name="Maven: io.jsonwebtoken:jjwt:0.9.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.10.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.10.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.10.1" level="project" />
<orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:3.14.2" level="project" />
<orderEntry type="library" name="Maven: com.squareup.okio:okio:1.17.2" level="project" />
<orderEntry type="library" name="Maven: javax.xml.bind:jaxb-api:2.4.0-b180830.0359" level="project" />
<orderEntry type="library" name="Maven: javax.activation:javax.activation-api:1.2.0" level="project" />
<orderEntry type="library" name="Maven: com.sun.xml.bind:jaxb-impl:4.0.0" level="project" />
<orderEntry type="library" name="Maven: com.sun.xml.bind:jaxb-core:4.0.0" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.eclipse.angus:angus-activation:1.0.0" level="project" />
<orderEntry type="library" name="Maven: javax.activation:activation:1.1.1" level="project" />
<orderEntry type="library" name="Maven: com.github.whvcse:easy-captcha:1.6.2" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava:31.1-jre" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:failureaccess:1.0.1" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava" level="project" />
<orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:3.0.2" level="project" />
<orderEntry type="library" name="Maven: org.checkerframework:checker-qual:3.12.0" level="project" />
<orderEntry type="library" name="Maven: com.google.errorprone:error_prone_annotations:2.11.0" level="project" />
<orderEntry type="library" name="Maven: com.google.j2objc:j2objc-annotations:1.3" level="project" />
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-spring-boot-starter:3.0.3" level="project" />
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-spring-boot-autoconfigure:3.0.3" level="project" />
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-spring:3.0.3" level="project" />
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-annotations:3.0.3" level="project" />
<orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.22" level="project" />
<orderEntry type="library" name="Maven: io.swagger.core.v3:swagger-annotations:2.1.2" level="project" />
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-core:3.0.3" level="project" />
<orderEntry type="library" name="Maven: org.javassist:javassist:3.25.0-GA" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spi:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-schema:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.github.classgraph:classgraph:4.8.83" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spring-webflux:3.0.0" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.mapstruct:mapstruct:1.3.1.Final" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-spring-webmvc:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-core:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-oas:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.swagger.core.v3:swagger-models:2.1.2" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-bean-validators:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.22" level="project" />
<orderEntry type="library" name="Maven: io.swagger:swagger-core:1.5.22" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.9" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.10.1" level="project" />
<orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-boot-starter:3.0.0" level="project" />
<orderEntry type="library" name="Maven: io.springfox:springfox-data-rest:3.0.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:2.0.0.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:2.0.0.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-spring-ui:3.0.3" level="project" />
<orderEntry type="library" name="Maven: com.tencentcloudapi:tencentcloud-sdk-java-ses:3.1.572" level="project" />
<orderEntry type="library" name="Maven: com.tencentcloudapi:tencentcloud-sdk-java-common:3.1.572" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
<orderEntry type="library" name="Maven: com.squareup.okhttp:okhttp:2.7.5" level="project" />
<orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.6" level="project" />
<orderEntry type="library" name="Maven: com.squareup.okhttp:logging-interceptor:2.7.5" level="project" />
<orderEntry type="library" name="Maven: org.ini4j:ini4j:0.5.4" level="project" />
</component>
</module>

9
files/COD-public-key.txt Normal file
View File

@@ -0,0 +1,9 @@
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAymkBAWixxUi9IAeMWgsq
K92AzFbe0qzzYPdkoh15ymL2A5MkYH7asnhFwclgdiFmd9a0TbZP+t/SzWW8UUzN
1pXoEp48R+eguGTt5xkJwb10+H6quVXF/Ezzid5yzVW3dcYRp8qUlFr0XBpvkK9l
FpPzh2+mwVEAsgBMXq/K50ZiX2dlkPZ7ffkVPWaK2ESIo3YgfM6dmiiza0hPWJ35
UgTH5rwJ7vN3IdOJTlkQOvrIrj2ocPcrudeEwqybIbCGhgRBwQSBsXQOO4U//rE4
VU+0LF/3uQgXkvVY1+a1JLiTncZYKGEQ/NtxM+dGtYWV2gPhQRyJ7Z77OX0XCbcn
zwIDAQAB
-----END PUBLIC KEY-----

View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDD+NUduhLJcb2Z
ryLwtIHdmjfh6Wn73E9umHmdPf6yF7IbDoTDBmIAfaPU/oiLgrka3fKGCkn/yHvW
QcL+Ry96/Uu+iIN9SbG5vPVvLtLfx+5++IE8p3RxcSDQggqFuJ+osebXeVIrOcTZ
s7nXCqGenTcagv2eJESiq712fcBvY1wVgilT6ERVQy+zdvwAOiS6wXF/51AueP+E
rNDHuPLkGH6JhLtO4LffeYgM/Th7eCl/WWLkiVMSoeJt7vWFe4bYV/IYW1qI2aQX
H1DYmvwgDfDv8jRORD9D191YBqq1l3Tw7VSjFrpydFvSK46dbXKBj3oA5ZiJ+Ttj
ZCtBRiOdAgMBAAECggEAUKl4Fs9C8lV1o+85Y3f4yBy1CbCIZhltPGlYDUe6MNWe
ApL8REW5Sthr+bx2uW2qAQv/yfosMTL0/eB9gSoNugLODXOlI4mUtI25O/U66M8j
NHHWx/9o51SYHBqaeCXg2Y+4I1KVZqNVigH26TNACMhPKQNnnpLxCT/FMSNbdLzo
wfFMyjN7R3Hc8ZB1C2zx+fLJm1DNZeOJOHAkW1LprlotRv6eq3lOwZaDDUTB5xhT
0Erev3djC/R08Fne1y09ukar8z0tX3Fm9SzHJDFVoh1HOYPWayCiAxOhip+JnFct
rtK5jjuB8DAP4Q1k12yOWUFwb6NOG9Hf/G6XExRPBQKBgQD1P2SnKD1IlNSrvVJn
2HzKnBVllVo50fbv7SpnP8H1B5vt2Qo/mgOGtzbeXyK4mcLFaWg9++BrsjTXwZFi
wmKeJgNI822DPhF5qQhK7Cc+WMwesufGrTnmRUOEFYehz9ffZBvMa1s/ObIEyLcr
tYitT74+nFdRPtr+8PN06QMEcwKBgQDMkGFWhSO7p7VMuV0H0uC1fj3GGtVvM+Ps
a9ASs0HBhQaOpberkKY9vgry6HoJ8CGvbrxlmc3JoYPRwKN3oQRYLvGSF96HAg9i
643FmVAWiVzHpjYX9fMJyCzXiOw6Qet8Zp3Ewaw9BBG0200Fj6/zGc8XEqNjIv5Q
DQ9MosRDrwKBgQCU5i5IRugeXy5YLxQPNKNfqDBdgrZLEK2qsgXithUencYQPIw6
XVnyut43WO+NwN0+WmcN6xUwjfwDWuTYX0jc2Bt6eUFuQ4r8oKIGSybwdZ1IrjqG
p7nVkwwQ77lvhu98FB3EmRHHa1IoEW0Uvp0DDL1m6ikhjNYNn2FRA//u/QKBgGbY
a+eo1ldBMPha9Te6wLjeuEYCNa5L41p4tcrBDt0xeSN8k4QRHFNMWYrYcIrQjM77
mIJoOjsWFgT9mfHKJToEl/VAROORmJS+Iq/mrYo3E0tY+DdBsygG2Oyf7Uw42iDY
IpfKW0Lt6c0IuIeEPwy0vBY4i6aK8Frkxf1ck9oHAoGBAKFQg/c36J6tjnttpmes
R/zijp1ROE+z+dMmm3icDhCDvvR6MnHa2Y9ittNWdEUosZk9FsFn62YNtJJV2SIN
DDn0ASLtBkeCd8yad5uzUb7Umci9V7TP5c0NE3DK95FmciLGOuRbFyq1Z8edHnaS
zgLnf4yb25eCMLEG0Z2ugN3C
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,9 @@
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw/jVHboSyXG9ma8i8LSB
3Zo34elp+9xPbph5nT3+sheyGw6EwwZiAH2j1P6Ii4K5Gt3yhgpJ/8h71kHC/kcv
ev1LvoiDfUmxubz1by7S38fufviBPKd0cXEg0IIKhbifqLHm13lSKznE2bO51wqh
np03GoL9niREoqu9dn3Ab2NcFYIpU+hEVUMvs3b8ADokusFxf+dQLnj/hKzQx7jy
5Bh+iYS7TuC333mIDP04e3gpf1li5IlTEqHibe71hXuG2FfyGFtaiNmkFx9Q2Jr8
IA3w7/I0TkQ/Q9fdWAaqtZd08O1Uoxa6cnRb0iuOnW1ygY96AOWYifk7Y2QrQUYj
nQIDAQAB
-----END PUBLIC KEY-----

404
pom.xml
View File

@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version> <version>3.1.6</version>
<relativePath/> <!-- lookup parent from repository --> <relativePath/> <!-- lookup parent from repository -->
</parent> </parent>
<groupId>com.aida</groupId> <groupId>com.aida</groupId>
@@ -14,21 +14,32 @@
<name>aida</name> <name>aida</name>
<description>ai da</description> <description>ai da</description>
<properties> <properties>
<java.version>8</java.version> <java.version>21</java.version>
<mybatis.plus.version>3.5.2</mybatis.plus.version> <mybatis.plus.version>3.5.5</mybatis.plus.version>
<hutool.version>5.8.2</hutool.version> <hutool.version>5.8.23</hutool.version>
<wx.java.version>4.2.7.B</wx.java.version> <wx.java.version>4.2.7.B</wx.java.version>
<fastjson.version>2.0.6.graal</fastjson.version> <fastjson.version>2.0.43</fastjson.version>
<security.jwt.version>1.1.1.RELEASE</security.jwt.version> <jjwt.version>0.12.3</jjwt.version>
<jjwt.version>0.9.1</jjwt.version> <guava.version>32.1.3-jre</guava.version>
<guava.version>31.1-jre</guava.version>
<jaxb-api>2.4.0-b180830.0359</jaxb-api>
<jaxb-impl>4.0.0</jaxb-impl>
<jaxb-core>4.0.0</jaxb-core>
<activation>1.1.1</activation>
<easy-captcha>1.6.2</easy-captcha> <easy-captcha>1.6.2</easy-captcha>
<aws.java.sdk.version>2.20.43</aws.java.sdk.version>
<javacv.version>1.5.5</javacv.version>
<system.windowsx64>windows-x86_64</system.windowsx64>
<javacpp.platform.linux-x86_64>linux-x86_64</javacpp.platform.linux-x86_64>
</properties> </properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>${aws.java.sdk.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
@@ -58,13 +69,8 @@
<artifactId>spring-boot-starter-security</artifactId> <artifactId>spring-boot-starter-security</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.security</groupId> <groupId>com.mysql</groupId>
<artifactId>spring-security-jwt</artifactId> <artifactId>mysql-connector-j</artifactId>
<version>${security.jwt.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
@@ -76,6 +82,12 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId> <artifactId>spring-boot-starter-validation</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency> <dependency>
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId> <artifactId>hutool-all</artifactId>
@@ -88,34 +100,28 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>io.jsonwebtoken</groupId> <groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId> <artifactId>jjwt-api</artifactId>
<version>${jjwt.version}</version> <version>${jjwt.version}</version>
</dependency> </dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>${jjwt.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>${jjwt.version}</version>
<scope>runtime</scope>
</dependency>
<dependency> <dependency>
<groupId>com.squareup.okhttp3</groupId> <groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId> <artifactId>okhttp</artifactId>
<version>3.14.2</version> <version>3.14.2</version>
</dependency> </dependency>
<dependency> <!-- JAXB is included in Java 11+ but needs explicit dependency for Java 9-10 -->
<groupId>javax.xml.bind</groupId> <!-- For Java 21, these are not needed as JAXB is part of JDK -->
<artifactId>jaxb-api</artifactId>
<version>${jaxb-api}</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>${jaxb-impl}</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>${jaxb-core}</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>${activation}</version>
</dependency>
<dependency> <dependency>
<groupId>com.github.whvcse</groupId> <groupId>com.github.whvcse</groupId>
<artifactId>easy-captcha</artifactId> <artifactId>easy-captcha</artifactId>
@@ -129,15 +135,303 @@
<dependency> <dependency>
<groupId>com.github.xiaoymin</groupId> <groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId> <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>3.0.3</version> <version>4.4.0</version>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.3.0</version>
</dependency>
<!-- Swagger 2 annotations for backward compatibility -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.6.14</version>
</dependency> </dependency>
<!-- /**发送邮件**/--> <!-- /**发送邮件**/-->
<!-- <dependency>-->
<!-- <groupId>com.tencentcloudapi</groupId>-->
<!-- <artifactId>tencentcloud-sdk-java-ses</artifactId>-->
<!-- <version>3.1.572</version>-->
<!-- </dependency>-->
<dependency> <dependency>
<groupId>com.tencentcloudapi</groupId> <groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java-ses</artifactId> <artifactId>tencentcloud-sdk-java-ses</artifactId>
<version>3.1.572</version> <version>3.1.572</version>
</dependency> </dependency>
<!--minio-->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.0.3</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>12.4.2.jre11</version>
</dependency>
<!-- RabbitMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!-- redis 连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!--支付宝 SDK-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.22.57.ALL</version>
</dependency>
<!--PayPal SDK-->
<dependency>
<groupId>com.paypal.sdk</groupId>
<artifactId>checkout-sdk</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>com.paypal.sdk</groupId>
<artifactId>rest-api-sdk</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20230618</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.15.1</version>
</dependency>
<dependency>
<groupId>com.stripe</groupId>
<artifactId>stripe-java</artifactId>
<version>26.2.0</version>
</dependency>
<!-- aws s3 -->
<!-- S3 dependency -->
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3-transfer-manager</artifactId>
<version>2.17.103-PREVIEW</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>kms</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3control</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>com.google.auth</groupId>
<artifactId>google-auth-library-oauth2-http</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.32.1</version>
</dependency>
<dependency>
<groupId>com.google.oauth-client</groupId>
<artifactId>google-oauth-client</artifactId>
<version>1.32.1</version>
</dependency>
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client-jackson2</artifactId>
<version>1.41.5</version>
</dependency>
<!-- 邮件发送 -->
<!-- thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.3</version>
</dependency>
<!-- JSON 转义恢复 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.10.0</version> <!-- 使用最新版本 -->
</dependency>
<!-- 最新版本号https://mvnrepository.com/artifact/com.alibaba/dashscope-sdk-java -->
<!-- 万象SDK -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dashscope-sdk-java</artifactId>
<version>2.20.1</version>
</dependency>
<!-- FFmpeg封装JavaCV 视频转gif 全部依赖-->
<!--<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.9</version>
</dependency>-->
<!-- javacv+javacpp核心库-->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>${javacv.version}</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp-platform</artifactId>
<version>${javacv.version}</version>
</dependency>
<!-- 最小opencv依赖包 必须包含上面的javacv+javacpp -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>opencv</artifactId>
<version>4.5.1-${javacv.version}</version>
<!--<classifier>${system.windowsx64}</classifier>-->
<classifier>${javacpp.platform.linux-x86_64}</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>openblas</artifactId>
<version>0.3.13-${javacv.version}</version>
<!--<classifier>${system.windowsx64}</classifier>-->
<classifier>${javacpp.platform.linux-x86_64}</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>flycapture</artifactId>
<version>2.13.3.31-${javacv.version}</version>
<!--<classifier>${system.windowsx64}</classifier>-->
<classifier>${javacpp.platform.linux-x86_64}</classifier>
</dependency>
<!-- FFmpeg视频处理解决你的报错 -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg</artifactId>
<version>4.4-1.5.6</version>
<!--<classifier>${system.windowsx64}</classifier>-->
<classifier>${javacpp.platform.linux-x86_64}</classifier>
</dependency>
<dependency>
<groupId>com.volcengine</groupId>
<artifactId>volcengine-java-sdk-ark-runtime</artifactId>
<version>0.2.43</version>
</dependency>
<!-- Google 认证库 -->
<dependency>
<groupId>com.google.auth</groupId>
<artifactId>google-auth-library-oauth2-http</artifactId>
<version>1.38.0</version>
</dependency>
<!-- GIFEncoder 视频转gif-->
<dependency>
<groupId>com.madgag</groupId>
<artifactId>animated-gif-lib</artifactId>
<version>1.4</version>
</dependency>
<!-- Jakarta WebSocket API -->
<dependency>
<groupId>jakarta.websocket</groupId>
<artifactId>jakarta.websocket-api</artifactId>
<version>2.1.1</version>
</dependency>
<!-- Spring MockMultipartFile 等测试工具,生产代码中也有引用 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<!-- BouncyCastle 加密库 -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId>
<version>1.78.1</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk18on</artifactId>
<version>1.78.1</version>
</dependency>
<!-- AOP -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>
@@ -157,4 +451,30 @@
</plugins> </plugins>
</build> </build>
<profiles>
<profile>
<!-- 本地开发环境 -->
<id>dev</id>
<properties>
<profiles.active>dev</profiles.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<!-- 测试环境 -->
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
</properties>
</profile>
<profile>
<!-- 生产环境 -->
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
</profile>
</profiles>
</project> </project>

0
run.shell Normal file
View File

View File

@@ -3,9 +3,13 @@ package com.ai.da;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
@Slf4j @Slf4j
@SpringBootApplication @SpringBootApplication
@EnableScheduling
@EnableAsync
public class AiDaApplication { public class AiDaApplication {
public static void main(String[] args) { public static void main(String[] args) {

View File

@@ -0,0 +1,95 @@
package com.ai.da.common.RabbitMQ;
import com.ai.da.common.utils.MailUtil;
import com.ai.da.model.dto.BasicEmailParamDTO;
import com.ai.da.service.EmailService;
import com.alibaba.fastjson.JSONObject;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.core.io.InputStreamSource;
import org.springframework.stereotype.Component;
import software.amazon.awssdk.core.exception.RetryableException;
import org.springframework.amqp.core.Message;
import jakarta.annotation.Resource;
import java.io.IOException;
import java.util.Map;
import java.util.Objects;
@Slf4j
@Component
public class EmailRetryConsumer {
@Resource
private MailUtil mailUtil;
@Resource
private MQPublisher mqPublisher;
@Resource
private EmailService emailService;
// @RabbitListener(queues = "#{rabbitMQProperties.deadLetter.queue}")
public void handleRetry(Map<String, String> mailParams, Message message, Channel channel) throws IOException {
long tag = message.getMessageProperties().getDeliveryTag();
try {
log.info("死信队列收到消息:{}", message);
// 处理邮件发送参数
BasicEmailParamDTO basicEmailParamDTO = JSONObject.parseObject(mailParams.get("dto"), BasicEmailParamDTO.class);
String fileName = mailParams.get("filename");
InputStreamSource inputStreamSource = Objects.isNull(mailParams.get("source")) ?
null : JSONObject.parseObject(mailParams.get("source"), InputStreamSource.class);
JSONObject templateParams = JSONObject.parseObject(mailParams.get("templateParams"), JSONObject.class);
String templateName = mailParams.get("templatePath");
long logId = Long.parseLong(mailParams.get("logId"));
basicEmailParamDTO.setContent(mailUtil.setContent(templateParams, templateName));
// 发邮件
int lastReturnCode = mailUtil.sendMail(basicEmailParamDTO, fileName, inputStreamSource);
if (lastReturnCode == 250) {
log.info("邮件发送成功Subject : {}", basicEmailParamDTO.getSubject());
emailService.updateStatus(logId, EmailService.DELIVERED);
} else if (lastReturnCode == 450) {
log.info("目标邮箱 {} 暂时不可用,请稍后重试", (Object) basicEmailParamDTO.getMailTo());
// 重试
retry(mailParams, message, channel, tag, logId);
} else if (lastReturnCode == 550) {
log.info("目标邮箱 {} 不可用,邮件发送失败", (Object) basicEmailParamDTO.getMailTo());
emailService.updateStatus(logId, EmailService.FAILED);
} else {
log.info("邮件发送失败Subject : {}, 状态码: {}", basicEmailParamDTO.getSubject(), lastReturnCode);
retry(mailParams, message, channel, tag, logId);
emailService.updateStatus(logId, EmailService.FAILED);
}
channel.basicAck(tag, false);
} catch (RetryableException e) {
log.info("邮件重试发生异常:RetryableException -> {}", e.getMessage());
channel.basicAck(tag, false); // 确认原消息
} catch (Exception e) {
log.info("邮件重试发生异常:Exception -> {}", e.getMessage());
channel.basicAck(tag, false); // 确认原消息
}
}
private int getRetryAttempt(Message message) {
Integer attempt = message.getMessageProperties()
.getHeader("x-retry-attempt");
return attempt != null ? attempt : 1;
}
private void retry(Map<String, String> mailParams, Message message, Channel channel, long tag, long logId) throws IOException{
int attempt = getRetryAttempt(message);
if (attempt >= 3) { // 最大重试次数
channel.basicReject(tag, false);
emailService.updateStatus(logId, EmailService.FAILED);
log.error("重试结束,邮件最终发送失败: {}", mailParams);
} else {
log.info("重新将邮件信息发送到重试队列");
mqPublisher.sendEmailMsg(mailParams, attempt);
channel.basicAck(tag, false); // 确认原消息
// 更新数据库
emailService.updateRetryCount(logId, attempt + 1);
}
}
}

View File

@@ -0,0 +1,661 @@
package com.ai.da.common.RabbitMQ;
import com.ai.da.common.config.exception.BusinessException;
import com.ai.da.common.constant.CommonConstant;
import com.ai.da.common.utils.RedisUtil;
import com.ai.da.model.dto.GenerateThroughImageTextDTO;
import com.ai.da.model.vo.GenerateResultVO;
import com.ai.da.model.vo.PoseTransformationVO;
import com.ai.da.service.*;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.rabbitmq.client.Channel;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.text.StringEscapeUtils;
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 org.springframework.util.StringUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
@Slf4j
@Component
@RequiredArgsConstructor
public class GenerateConsumer {
private final GenerateService generateService;
private final UserLikeGroupService userLikeGroupService;
private final DesignService designService;
private final CloudTaskService cloudTaskService;
private final RabbitMQProperties rabbitMQProperties;
private final RedisUtil redisUtil;
private final MessageCenterService messageCenterService;
@Value("${redis.key.orderForGenerate}")
private String consumptionOrderKey;
@Value("${redis.key.generateCancelSet}")
private String cancelSetKey;
@Value("${redis.key.generateExceptionMap}")
private String exceptionMapKey;
@Value("${redis.key.generateResult}")
private String generateResultKey;
@Value("${redis.key.toProductImageResultKey}")
private String toProductImageResultKey;
@Value("${redis.key.relightResultKey}")
private String relightResultKey;
public void generate(Message msg, Channel channel, String consumerName) {
log.info("============start listening==========");
long start = System.currentTimeMillis();
Map<String, String> resp = jsonBytesToMap(msg, channel);
String uniqueId = resp.get("tasks_id");
// String uniqueId = generateThroughImageTextDTO.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 {
GenerateThroughImageTextDTO generateThroughImageTextDTO = JSONObject.parseObject(msg.getBody(), GenerateThroughImageTextDTO.class);
generateService.generateThroughImageText(generateThroughImageTextDTO);
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
redisUtil.removeFromZSet(consumptionOrderKey, uniqueId);
}
} catch (Exception e) {
log.error(e.getMessage());
// channel.basicNack() 为不确认deliveryTag对应的消息第二个参数是否应用于多消息第三个参数是否requeue
try {
// 第二个参数是否批量确认消息当传false时只确认当前 deliveryTag对应的消息;当传true时会确认当前及之前所有未确认的消息。
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
redisUtil.removeFromZSet(consumptionOrderKey, uniqueId);
String key = generateResultKey + ":" + uniqueId;
GenerateResultVO generateResultVO = new GenerateResultVO(uniqueId, null, null, "Fail");
redisUtil.addToString(key, new Gson().toJson(generateResultVO), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
} catch (IOException exception) {
log.error("手动确认,取消返回队列,不再重新消费");
}
// 将入参和错误信息存入数据库
String exceptionMessage = JSONObject.toJSONString(resp) +
" Exception message " + e.getMessage();
HashMap<String, String> 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===========");
}
public void processGenerateResult(Message msg, Channel channel) {
log.info("============ProcessGenerateResult listening==========");
long start = System.currentTimeMillis();
Map<String, String> generateResult = jsonBytesToMap(msg, channel);
log.info("generate response : {}", generateResult);
try {
log.info("tasks_id : {} start ", generateResult.get("tasks_id"));
if (generateResult.get("status").equals("SUCCESS")) {
String url = generateResult.get("image_url");
String taskId = generateResult.get("tasks_id");
String category = generateResult.get("category");
generateService.processGenerateResult(taskId, url, category);
} 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);
// 将异常信息存到exception中
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(generateResult.get("tasks_id"), generateResult.get("data"));
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
} catch (Exception e) {
log.error(e.getMessage());
try {
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
redisUtil.removeFromZSet(consumptionOrderKey, generateResult.get("tasks_id"));
} catch (IOException exception) {
log.error("手动确认,取消返回队列,不再重新消费");
}
// 将入参和错误信息存入数据库
String exceptionMessage = JSONObject.toJSONString(generateResult) +
" Exception message " + e.getMessage();
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(String.valueOf(generateResult.get("tasks_id")), exceptionMessage);
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
long end = System.currentTimeMillis();
log.info("tasks_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("tasks_id"), generateResult.get("message"), (end - start));
log.info("============ProcessGenerateResult End listening==========");
}
public void processToProductImageResult(Message msg, Channel channel) {
log.info("============processToProductImageResult listening==========");
long start = System.currentTimeMillis();
Map<String, String> generateResult = jsonBytesToMap(msg, channel);
log.info("toProductImage response : {}", generateResult);
try {
log.info("tasks_id : {} start ", generateResult.get("tasks_id"));
if (generateResult.get("status").equals("SUCCESS")) {
String url = generateResult.get("image_url");
String taskId = generateResult.get("tasks_id");
String category = generateResult.get("category");
generateService.processToProductImageResult(taskId, url, category);
} else if (generateResult.get("status").equals("NO_FACE")) {
String taskId = generateResult.get("tasks_id");
userLikeGroupService.toProduct(taskId);
} else {
// 修改redis中的数据状态为exception
String key = toProductImageResultKey + ":" + generateResult.get("tasks_id");
generateService.updateToProductTaskStatus(generateResult.get("tasks_id"), "Fail");
redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(generateResult.get("tasks_id"), null, null, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
// 将异常信息存到exception中
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(generateResult.get("tasks_id"), generateResult.get("data"));
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
} catch (Exception e) {
log.error(e.getMessage());
try {
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
redisUtil.removeFromZSet(consumptionOrderKey, generateResult.get("tasks_id"));
} catch (IOException exception) {
log.error("手动确认,取消返回队列,不再重新消费");
}
// 将入参和错误信息存入数据库
String exceptionMessage = JSONObject.toJSONString(generateResult) +
" Exception message " + e.getMessage();
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(String.valueOf(generateResult.get("tasks_id")), exceptionMessage);
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
long end = System.currentTimeMillis();
log.info("tasks_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("tasks_id"), generateResult.get("message"), (end - start));
log.info("============ProcessToProductImageResult End listening==========");
}
private void processRelightResult(Message msg, Channel channel) {
log.info("============processRelightResult listening==========");
long start = System.currentTimeMillis();
Map<String, String> generateResult = jsonBytesToMap(msg, channel);
log.info("toProductImage response : {}", generateResult);
try {
log.info("tasks_id : {} start ", generateResult.get("tasks_id"));
if (generateResult.get("status").equals("SUCCESS")) {
String url = generateResult.get("image_url");
String taskId = generateResult.get("tasks_id");
String category = generateResult.get("category");
generateService.processRelightResult(taskId, url, category);
} else if (generateResult.get("status").equals("NO_FACE")) {
String taskId = generateResult.get("tasks_id");
userLikeGroupService.relight(taskId);
} else {
// 修改redis中的数据状态为exception
String key = relightResultKey + ":" + generateResult.get("tasks_id");
generateService.updateToProductTaskStatus(generateResult.get("tasks_id"), "Fail");
redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(generateResult.get("tasks_id"), null, null, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
// 将异常信息存到exception中
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(generateResult.get("tasks_id"), generateResult.get("data"));
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
} catch (Exception e) {
log.error(e.getMessage());
try {
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
redisUtil.removeFromZSet(consumptionOrderKey, generateResult.get("tasks_id"));
} catch (IOException exception) {
log.error("手动确认,取消返回队列,不再重新消费");
}
// 将入参和错误信息存入数据库
String exceptionMessage = JSONObject.toJSONString(generateResult) +
" Exception message " + e.getMessage();
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(String.valueOf(generateResult.get("tasks_id")), exceptionMessage);
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
long end = System.currentTimeMillis();
log.info("tasks_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("tasks_id"), generateResult.get("message"), (end - start));
log.info("============ProcessRelightResult End listening==========");
}
public void processPoseTransformResult(Message msg, Channel channel) {
log.info("============ProcessPoseTransformResult listening==========");
long start = System.currentTimeMillis();
Map<String, String> generateResult = jsonBytesToMap(msg, channel);
log.info("PoseTransformation response : {}", generateResult);
try {
log.info("tasks_id : {} start ", generateResult.get("tasks_id"));
if (generateResult.get("status").equals("SUCCESS")) {
String gifUrl = generateResult.get("gif_url");
String taskId = generateResult.get("tasks_id");
String videoUrl = generateResult.get("video_url");
String imageUrl = generateResult.get("image_url");
generateService.processPoseTransformResult(taskId, gifUrl, videoUrl, imageUrl);
} else {
// 修改redis中的数据状态为exception
String key = generateResultKey + ":" + generateResult.get("tasks_id");
generateService.updatePoseTransferStatus(generateResult.get("tasks_id"), "Fail", null);
redisUtil.addToString(key, new Gson().toJson(new PoseTransformationVO(null, generateResult.get("tasks_id"),null, null, null, (byte)0, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
// 将异常信息存到exception中
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(generateResult.get("tasks_id"), generateResult.get("message"));
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
// 记录失败状态并向用户发送提示消息
generateService.processPTFailSituation(generateResult.get("tasks_id"));
}
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());
try {
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
redisUtil.removeFromZSet(consumptionOrderKey, generateResult.get("tasks_id"));
} catch (IOException exception) {
log.error("手动确认,取消返回队列,不再重新消费");
}
// 将入参和错误信息存入数据库
String exceptionMessage = JSONObject.toJSONString(generateResult) +
" Exception message " + e.getMessage();
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(String.valueOf(generateResult.get("tasks_id")), exceptionMessage);
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
// 记录失败状态并向用户发送提示消息
generateService.processPTFailSituation(generateResult.get("tasks_id"));
}
long end = System.currentTimeMillis();
log.info("tasks_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("tasks_id"), generateResult.get("message"), (end - start));
log.info("============ProcessPoseTransformResult End listening==========");
}
public static Map<String, String> jsonBytesToMap(Message msg, Channel channel) {
try {
// 1. byte[] -> String
String jsonString = new String(msg.getBody(), StandardCharsets.UTF_8).trim();
// 2. 处理可能的双重转义
if (jsonString.startsWith("\"") && jsonString.endsWith("\"")) {
jsonString = jsonString.substring(1, jsonString.length() - 1);
// 使用 Apache Commons Text 将 JSON 字符串中的转义字符还原为原始字符
jsonString = StringEscapeUtils.unescapeJson(jsonString);
}
// 3. 验证 JSON 格式
if (!isValidJson(jsonString)) {
throw new IllegalArgumentException("Invalid JSON format");
}
// 4. 解析为 Map
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(jsonString, new TypeReference<Map<String, String>>() {});
} catch (Exception e) {
log.error("消息解析失败: {}", e.getMessage(), e);
try {
// 仅对不可恢复错误(如非 JSON 数据)进行 ACK
if (e instanceof JsonParseException || e instanceof IllegalArgumentException) {
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
log.warn("因消息格式错误,已确认并丢弃消息。原始消息为:{}", msg);
}
} catch (IOException ex) {
log.error("消息确认失败: {}", ex.getMessage(), ex);
}
throw new RuntimeException("Failed to parse JSON to Map", e);
}
}
// 辅助方法:验证字符串是否为合法 JSON
private static boolean isValidJson(String json) {
try {
new ObjectMapper().readTree(json);
return true;
} catch (Exception e) {
return false;
}
}
private void processDesignBatchResult(Message msg, Channel channel) {
log.info("============processDesignBatchResult listening==========");
long start = System.currentTimeMillis();
Map<String, Object> generateResult = JSONObject.parseObject(msg.getBody(), Map.class);
log.info("designBatch response : {}", generateResult);
designService.processDesignBatch(generateResult);
}
private void processToProductImageBatchResult(Message msg, Channel channel) {
log.info("============processToProductImageResultBatch listening==========");
long start = System.currentTimeMillis();
JSONObject generateResult = JSONObject.parseObject(msg.getBody(), JSONObject.class);
log.info("toProductImageBatch response : {}", generateResult);
try {
log.info("task_id : {} start ", generateResult.get("task_id"));
if (!StringUtils.isEmpty(generateResult.getString("progress"))) {
String progress = generateResult.getString("progress");
String url = null;
if (!progress.startsWith("0") && !progress.equals("OK")) {
JSONObject result = generateResult.getJSONObject("result");
if (Objects.nonNull(result)) {
url = result.getString("product_img");
String taskId = generateResult.getString("task_id");
userLikeGroupService.toProductBatch(taskId, url, progress);
}
} else if (progress.startsWith("0/")) {
String batchTaskId = generateResult.getString("task_id");
if (!StringUtils.isEmpty(batchTaskId)) {
cloudTaskService.startTask(batchTaskId);
}
} else if (progress.equals("OK")) {
String batchTaskId = generateResult.getString("task_id");
if (!StringUtils.isEmpty(batchTaskId)) {
cloudTaskService.completeTask(batchTaskId);
}
}
} else {
// 修改redis中的数据状态为exception
String key = toProductImageResultKey + ":" + generateResult.get("task_id");
generateService.updateToProductTaskStatus(generateResult.getString("task_id"), "Fail");
redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(generateResult.getString("tasks_id"), null, null, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
// 将异常信息存到exception中
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(generateResult.getString("task_id"), generateResult.getString("data"));
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
} catch (Exception e) {
log.error(e.getMessage());
try {
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
redisUtil.removeFromZSet(consumptionOrderKey, generateResult.getString("task_id"));
} catch (IOException exception) {
log.error("手动确认,取消返回队列,不再重新消费");
}
// 将入参和错误信息存入数据库
String exceptionMessage = JSONObject.toJSONString(generateResult) +
" Exception message " + e.getMessage();
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(String.valueOf(generateResult.get("task_id")), exceptionMessage);
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
long end = System.currentTimeMillis();
log.info("task_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("task_id"), generateResult.get("message"), (end - start));
log.info("============ProcessToProductImageBatchResult End listening==========");
}
private void processRelightBatchResult(Message msg, Channel channel) {
log.info("============processRelightResult listening==========");
long start = System.currentTimeMillis();
JSONObject generateResult = JSONObject.parseObject(msg.getBody(), JSONObject.class);
log.info("relightBatch response : {}", generateResult);
try {
log.info("task_id : {} start ", generateResult.get("task_id"));
if (!StringUtils.isEmpty(generateResult.getString("progress"))) {
String progress = generateResult.getString("progress");
String url = null;
if (!progress.startsWith("0") && !progress.equals("OK")) {
JSONObject result = generateResult.getJSONObject("result");
if (Objects.nonNull(result)) {
url = result.getString("relight_img");
String taskId = generateResult.getString("task_id");
userLikeGroupService.relightBatch(taskId, url, progress);
}
} else if (progress.startsWith("0/")) {
String batchTaskId = generateResult.getString("task_id");
if (!StringUtils.isEmpty(batchTaskId)) {
cloudTaskService.startTask(batchTaskId);
}
} else if (progress.equals("OK")) {
String batchTaskId = generateResult.getString("task_id");
if (!StringUtils.isEmpty(batchTaskId)) {
cloudTaskService.completeTask(batchTaskId);
}
}
} else {
// 修改redis中的数据状态为exception
String key = relightResultKey + ":" + generateResult.get("task_id");
generateService.updateToProductTaskStatus(generateResult.getString("task_id"), "Fail");
redisUtil.addToString(key, new Gson().toJson(new GenerateResultVO(generateResult.getString("tasks_id"), null, null, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
// 将异常信息存到exception中
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(generateResult.getString("task_id"), generateResult.getString("data"));
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
} catch (Exception e) {
log.error(e.getMessage());
try {
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
redisUtil.removeFromZSet(consumptionOrderKey, generateResult.getString("task_id"));
} catch (IOException exception) {
log.error("手动确认,取消返回队列,不再重新消费");
}
// 将入参和错误信息存入数据库
String exceptionMessage = JSONObject.toJSONString(generateResult) +
" Exception message " + e.getMessage();
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(String.valueOf(generateResult.get("task_id")), exceptionMessage);
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
long end = System.currentTimeMillis();
log.info("task_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("task_id"), generateResult.get("message"), (end - start));
log.info("============ProcessRelightBatchResult End listening==========");
}
private void processPoseTransformBatchResult(Message msg, Channel channel) {
log.info("============ProcessPoseTransformBatchResult listening==========");
long start = System.currentTimeMillis();
JSONObject generateResult = JSONObject.parseObject(msg.getBody(), JSONObject.class);
log.info("PoseTransformationBatch response : {}", generateResult);
try {
log.info("task_id : {} start ", generateResult.get("task_id"));
if (!StringUtils.isEmpty(generateResult.getString("progress"))) {
String progress = generateResult.getString("progress");
String taskId = generateResult.getString("task_id");
generateService.processPoseTransformResultBatch(progress, taskId);
JSONArray result = generateResult.getJSONArray("result");
if (!StringUtils.isEmpty(result)) {
JSONObject jsonObject = result.getJSONObject(0);
String gifUrl = jsonObject.getString("gif_url");
String videoUrl = jsonObject.getString("video_url");
String imageUrl = jsonObject.getString("first_image_url");
generateService.processPoseTransformResultBatch(taskId, gifUrl, videoUrl, imageUrl, progress);
}
} else {
// 修改redis中的数据状态为exception
String key = generateResultKey + ":" + generateResult.getString("task_id");
generateService.updatePoseTransferStatus(generateResult.getString("task_id"), "Fail", null);
redisUtil.addToString(key, new Gson().toJson(new PoseTransformationVO(null, generateResult.getString("task_id"),null, null, null, (byte)0, "Fail")), CommonConstant.GENERATE_RESULT_EXPIRE_TIME);
// 将异常信息存到exception中
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(generateResult.getString("task_id"), generateResult.getString("message"));
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
} catch (Exception e) {
log.error(e.getMessage());
try {
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
redisUtil.removeFromZSet(consumptionOrderKey, generateResult.getString("task_id"));
} catch (IOException exception) {
log.error("手动确认,取消返回队列,不再重新消费");
}
// 将入参和错误信息存入数据库
String exceptionMessage = JSONObject.toJSONString(generateResult) +
" Exception message " + e.getMessage();
HashMap<String, String> exceptionInfo = new HashMap<>();
exceptionInfo.put(generateResult.getString("task_id"), exceptionMessage);
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
long end = System.currentTimeMillis();
log.info("tasks_id : {}, end , message : {}, 执行时长: {} 毫秒", generateResult.get("tasks_id"), generateResult.get("message"), (end - start));
log.info("============ProcessPoseTransformResult End listening==========");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler
public void generateConsumer1(Message msg, Channel channel) {
generate(msg, channel, "consumer 1");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler
public void generateConsumer2(Message msg, Channel channel) {
generate(msg, channel, "consumer 2");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler
public void generateConsumer3(Message msg, Channel channel) {
generate(msg, channel, "consumer 3");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler
public void generateConsumer4(Message msg, Channel channel) {
generate(msg, channel, "consumer 4");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler
public void generateConsumer5(Message msg, Channel channel) {
generate(msg, channel, "consumer 5");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler
public void generateConsumer6(Message msg, Channel channel) {
generate(msg, channel, "consumer 6");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler
public void generateConsumer7(Message msg, Channel channel) {
generate(msg, channel, "consumer 7");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler
public void generateConsumer8(Message msg, Channel channel) {
generate(msg, channel, "consumer 8");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generate}")
@RabbitHandler
public void generateConsumer9(Message msg, Channel channel) {
generate(msg, channel, "consumer 9");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.generateResult}")
@RabbitHandler
public void getGenerateResult(Message msg, Channel channel) {
processGenerateResult(msg, channel);
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.toProductImageResult}")
@RabbitHandler
public void getToProductImageResult(Message msg, Channel channel) {
processToProductImageResult(msg, channel);
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.relightResult}")
@RabbitHandler
public void getRelightResult(Message msg, Channel channel) {
processRelightResult(msg, channel);
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.poseTransform}")
@RabbitHandler
public void getPoseTransformationResult(Message msg, Channel channel) {
processPoseTransformResult(msg, channel);
}
// @RabbitListener(queues = "#{rabbitMQProperties.queues.designBatch}")
// @RabbitHandler
// public void getDesignBatchResult(Message msg, Channel channel) {
// processDesignBatchResult(msg, channel);
// }
// @RabbitListener(queues = "#{rabbitMQProperties.queues.toProductImageBatch}")
// @RabbitHandler
// public void getToProductImageBatchResult(Message msg, Channel channel) {
// processToProductImageBatchResult(msg, channel);
// }
//
// @RabbitListener(queues = "#{rabbitMQProperties.queues.relightBatch}")
// @RabbitHandler
// public void getRelightBatchResult(Message msg, Channel channel) {
// processRelightBatchResult(msg, channel);
// }
//
// @RabbitListener(queues = "#{rabbitMQProperties.queues.poseTransformBatch}")
// @RabbitHandler
// public void getPoseTransformBatchResult(Message msg, Channel channel) {
// processPoseTransformBatchResult(msg, channel);
// }
}

View File

@@ -0,0 +1,82 @@
package com.ai.da.common.RabbitMQ;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MQConfig {
@Autowired
private RabbitMQProperties rabbitMQProperties;
@Bean
public Queue generateQueue() {
return new Queue(rabbitMQProperties.getQueues().getGenerate());
}
@Bean
public Queue SRQueue() {
return new Queue(rabbitMQProperties.getQueues().getSr());
}
@Bean
public Queue SRResultQueue() {
return new Queue(rabbitMQProperties.getQueues().getSrResult());
}
@Bean
public Queue generateResultQueue() {
return new Queue(rabbitMQProperties.getQueues().getGenerateResult());
}
@Bean
public Queue toProductImageResultQueue() {
return new Queue(rabbitMQProperties.getQueues().getToProductImageResult());
}
@Bean
public Queue relightResultQueue() {
return new Queue(rabbitMQProperties.getQueues().getRelightResult());
}
@Bean
public Queue poseTransformQueue() {
return new Queue(rabbitMQProperties.getQueues().getPoseTransform());
}
@Bean
public Queue mailRetryQueue() {
// 普通队列不绑定DLX首次失败后才进入MQ
// durable 持久化队列
return QueueBuilder.durable(rabbitMQProperties.getQueues().getEmailRetry())
// 关键参数:绑定死信交换机
.withArgument("x-dead-letter-exchange", rabbitMQProperties.getDeadLetter().getExchange())
// 可选:指定死信路由键(默认使用原消息的路由键)
.withArgument("x-dead-letter-routing-key", rabbitMQProperties.getDeadLetter().getRoutingKey())
.build();
}
// 新增死信交换机
@Bean
public DirectExchange deadLetterExchange() {
return new DirectExchange(rabbitMQProperties.getDeadLetter().getExchange());
}
// 新增死信队列
@Bean
public Queue deadLetterQueue() {
return QueueBuilder.durable(rabbitMQProperties.getDeadLetter().getQueue()).build();
}
// 绑定死信队列
@Bean
public Binding deadLetterBinding() {
return BindingBuilder.bind(deadLetterQueue())
.to(deadLetterExchange())
.with(rabbitMQProperties.getDeadLetter().getRoutingKey());
}
}

View File

@@ -0,0 +1,61 @@
package com.ai.da.common.RabbitMQ;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import jakarta.annotation.Resource;
import java.util.Map;
@Slf4j
@Component
public class MQPublisher {
@Autowired
private RabbitMQProperties rabbitMQProperties;
@Autowired
private AmqpTemplate amqpTemplate;
public void sendGenerateMessage(String mm) {
log.info("send generate message: {}", mm);
amqpTemplate.convertAndSend(rabbitMQProperties.getQueues().getGenerate(), mm);
}
public void sendSRMessage(String mm) {
log.info("send message: {}", mm);
amqpTemplate.convertAndSend(rabbitMQProperties.getQueues().getSr(), mm);
}
public void sendGenerateResultMessage(String mm) {
log.info("send generate result message: {}", mm);
amqpTemplate.convertAndSend(rabbitMQProperties.getQueues().getGenerateResult(), mm);
}
/**
*
* @param mailParams 含有的字段
* {"dto": basicEmailParamDTO, "filename": fileName, "source": inputStreamSource,
* "templateParams": jsonObject, "templatePath": path}
* 邮件发送参数,附件文件名,附件数据
* @param retryTimes 重试次数初始为0
*/
public void sendEmailMsg(Map<String, String> mailParams, int retryTimes){
log.info("send email MQ message: {} ", mailParams);
// // 重新入队(指数退避) 时间单位:毫秒
long newDelay = (long) (5000 * Math.pow(2, retryTimes + 1));
log.info("send email MQ delay: {} ms, retry attempt: {}", newDelay, retryTimes + 1);
amqpTemplate.convertAndSend(
rabbitMQProperties.getQueues().getEmailRetry(),
mailParams,
m -> {
m.getMessageProperties().setExpiration(String.valueOf(newDelay));
m.getMessageProperties().setHeader("x-retry-attempt", retryTimes + 1);
return m;
}
);
}
}

View File

@@ -0,0 +1,45 @@
package com.ai.da.common.RabbitMQ;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "rabbitmq")
@Data
public class RabbitMQProperties {
private Queues queues;
private Exchange exchange;
private DeadLetter deadLetter; // 新增死信配置
@Data
public static class Queues {
private String generate;
private String sr;
private String srResult;
private String generateResult;
private String toProductImageResult;
private String relightResult;
private String poseTransform;
private String emailRetry;
private String designBatch;
private String relightBatch;
private String toProductImageBatch;
private String poseTransformBatch;
}
@Data
public static class Exchange {
private String generate;
}
// 新增死信配置内部类
@Data
public static class DeadLetter {
private String exchange;
private String queue;
private String routingKey;
}
}

View File

@@ -0,0 +1,237 @@
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.SuperResolutionDTO;
import com.ai.da.model.dto.TaskDTO;
import com.ai.da.service.SuperResolutionService;
import com.ai.da.service.TaskListService;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.rabbitmq.client.Channel;
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.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import jakarta.annotation.Resource;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.HashMap;
@Slf4j
@Component
public class SRConsumer {
@Autowired
private RabbitMQProperties rabbitMQProperties;
@Resource
private RedisUtil redisUtil;
@Resource
private TaskListService taskListService;
@Value("${redis.key.orderForSR}")
private String consumptionOrderKey;
@Value("${redis.key.SRCancelSet}")
private String cancelSetKey;
@Value("${redis.key.SRExceptionMap}")
private String exceptionMapKey;
@Value("${redis.key.taskList}")
private String taskListKey;
@Resource
private SuperResolutionService superResolutionService;
/**
* 请求超分处理
*/
public void superResolution(Message msg, Channel channel, String consumerName) {
log.info("============SR start listening==========");
long start = System.currentTimeMillis();
SuperResolutionDTO superResolutionDTO;
String uniqueId = null;
try {
superResolutionDTO = JSONObject.parseObject(msg.getBody(), SuperResolutionDTO.class);
uniqueId = superResolutionDTO.getUniqueId();
log.info("From " + consumerName + " : " + uniqueId);
superResolutionService.updateSROutput(uniqueId, "Executing", null);
taskListService.updateTaskStatusOrOutputRedis(uniqueId, "Executing", null);
/*try {
Thread.sleep(2 * 60 * 1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}*/
// 2、判断当前消息是否在取消列表中
Boolean isMember = redisUtil.isElementExistsInSet(cancelSetKey, uniqueId);
if (isMember) {
try {
// 2.1 手动确认该消息
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
} catch (IOException ex) {
log.error("手动确认,不返回队列重新消费");
}
} else {
// 请求python端进行超分
superResolutionService.SR(superResolutionDTO);
}
} catch (BusinessException e) {
log.error(e.getMsg());
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();
log.info(" task_id " + uniqueId + "----------" + consumerName + " 执行时长:" + (end - start) + "毫秒");
log.info("=============SR end listening===========");
}
/**
* 获取超分结果
*/
public void getSRResult(Message msg, Channel channel, String consumerName) {
log.info("============SRResult start listening==========");
long start = System.currentTimeMillis();
JSONObject result = null;
String taskId = null;
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 {
// 2、判断状态是否成功
if ("SUCCESS".equals(result.get("status").toString())) {
String output = result.get("data").toString();
superResolutionService.setSRResult(taskId, output, "success");
taskListService.updateTaskStatusOrOutputRedis(taskId, "success", output);
} else {
superResolutionService.setSRResult(taskId, null, "fail");
taskListService.updateTaskStatusOrOutputRedis(taskId, "fail", null);
HashMap<String, String> exceptionInfo = new HashMap<>();
// 获取输入信息
String task = redisUtil.getFromString(taskListKey + taskId + taskId.substring(taskId.lastIndexOf("-") + 1));
Gson gson = new Gson();
Type type = new TypeToken<TaskDTO<SuperResolutionDTO>>() {
}.getType();
TaskDTO<SuperResolutionDTO> taskDTO = gson.fromJson(task, type);
// 将输入信息和报错信息均存入redis todo 加判空
exceptionInfo.put(taskId, "Input ==> " + taskDTO.getInputParam() + "Fail Message ==> " + result.get("message").toString());
// 将报错信息存入redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
}
} catch (Exception e) {
log.error(e.getMessage());
// channel.basicNack() 为不确认deliveryTag对应的消息第二个参数是否应用于多消息第三个参数是否requeue
try {
// 第二个参数是否批量确认消息当传false时只确认当前 deliveryTag对应的消息;当传true时会确认当前及之前所有未确认的消息。
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
} catch (IOException exception) {
log.error("手动确认,取消返回队列,不再重新消费");
}
}
long end = System.currentTimeMillis();
log.info(" task_id " + taskId + "----------" + consumerName + " 执行时长:" + (end - start) + "毫秒");
log.info("=============SRResult end listening===========");
}
private void setErrorMessage(Message msg, Channel channel, String message, SuperResolutionDTO superResolutionDTO) {
String uniqueId;
try {
// 第二个参数是否批量确认消息当传false时只确认当前 deliveryTag对应的消息;当传true时会确认当前及之前所有未确认的消息。
channel.basicAck(msg.getMessageProperties().getDeliveryTag(), false);
uniqueId = superResolutionDTO.getUniqueId();
// 将消息从redis排队队列中删除,需保证被消费的消息存储到db之后再从redis删除
redisUtil.removeFromZSet(consumptionOrderKey, uniqueId);
} catch (Exception exception) {
log.error("手动确认,取消返回队列,不再重新消费");
throw new BusinessException("message.confirm.fail");
}
// 将入参和错误信息存入redis
String exceptionMessage = JSONObject.toJSONString(superResolutionDTO) +
" Exception message " + message;
// " Exception message " + e.getMessage();
HashMap<String, String> exceptionInfo = new HashMap<>();
uniqueId = superResolutionDTO.getUniqueId();
exceptionInfo.put(String.valueOf(uniqueId), exceptionMessage);
// 存redis
redisUtil.addToMap(exceptionMapKey, exceptionInfo);
taskListService.updateTaskStatusOrOutputRedis(uniqueId, "fail", null);
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.sr}")
@RabbitHandler
public void SRConsumer1(Message msg, Channel channel) {
superResolution(msg, channel, "consumer 1");
}
@RabbitListener(queues = "#{rabbitMQProperties.queues.srResult}")
@RabbitHandler
public void SRResultConsumer1(Message msg, Channel channel) {
getSRResult(msg, channel, "consumer 1");
}
}

View File

@@ -0,0 +1,170 @@
package com.ai.da.common.aspect;
import com.ai.da.common.context.UserContext;
import com.ai.da.model.vo.AuthPrincipalVo;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.Map;
/**
* Controller日志切面
* 记录所有Controller接口的请求参数和用户信息
*/
@Aspect
@Component
public class ControllerLoggingAspect {
private static final Logger logger = LoggerFactory.getLogger(ControllerLoggingAspect.class);
/**
* 定义切点所有Controller方法
*/
@Pointcut("execution(* com.ai.da.controller..*(..))")
public void controllerMethods() {
}
/**
* Controller方法执行前记录日志
*/
// @Before("controllerMethods()")
public void logControllerBefore(JoinPoint joinPoint) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
// 获取当前用户ID
Long userId = null;
AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
if (authPrincipalVo != null) {
userId = authPrincipalVo.getId();
}
// 获取请求参数
Map<String, Object> params = getRequestParams(joinPoint, request);
logger.info("=== 请求开始 ===");
logger.info("用户ID: {}", userId);
logger.info("请求URL: {}", request.getRequestURL().toString());
logger.info("请求方法: {}", request.getMethod());
logger.info("请求IP: {}", getClientIpAddress(request));
logger.info("调用方法: {}.{}", joinPoint.getSignature().getDeclaringType().getSimpleName(), joinPoint.getSignature().getName());
logger.info("请求参数: {}", params);
}
}
/**
* 获取请求参数
*/
private Map<String, Object> getRequestParams(JoinPoint joinPoint, HttpServletRequest request) {
Map<String, Object> params = new HashMap<>();
// 1. 获取Query String参数
String queryString = request.getQueryString();
if (queryString != null && !queryString.isEmpty()) {
params.put("queryString", queryString);
}
// 2. 获取方法参数(包含 @PathVariable, @RequestParam, @RequestBody 等)
Object[] args = joinPoint.getArgs();
if (args != null && args.length > 0) {
Map<String, Object> methodParams = new HashMap<>();
for (int i = 0; i < args.length; i++) {
Object arg = args[i];
// 过滤掉不可序列化的参数
if (arg != null) {
if (isIgnorable(arg)) {
// 对于可忽略的类型,记录类型名
methodParams.put("arg" + i, "[" + arg.getClass().getSimpleName() + "]");
} else {
try {
methodParams.put("arg" + i, arg);
} catch (Exception e) {
methodParams.put("arg" + i, arg.toString());
}
}
}
}
if (!methodParams.isEmpty()) {
params.put("methodParams", methodParams);
}
}
return params;
}
/**
* 判断是否需要过滤的参数类型
*/
private boolean isIgnorable(Object obj) {
return obj instanceof HttpServletRequest
|| obj instanceof HttpServletResponse
|| obj instanceof MultipartFile
|| obj instanceof MultipartFile[];
}
/**
* Controller方法抛出异常时记录日志
*/
@AfterThrowing(pointcut = "controllerMethods()", throwing = "exception")
public void logControllerAfterThrowing(JoinPoint joinPoint, Throwable exception) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
Long userId = null;
AuthPrincipalVo authPrincipalVo = UserContext.getUserHolder();
if (authPrincipalVo != null) {
userId = authPrincipalVo.getId();
}
// 获取请求参数
Map<String, Object> params = new HashMap<>();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
params = getRequestParams(joinPoint, request);
}
logger.error("=== 请求异常 ===");
logger.error("用户ID: {}", userId);
logger.error("调用方法: {}.{}", joinPoint.getSignature().getDeclaringType().getSimpleName(), joinPoint.getSignature().getName());
logger.error("请求参数: {}", params);
logger.error("异常信息: ", exception);
logger.error("=== 异常结束 ===");
}
/**
* 获取客户端真实IP地址
*/
private String getClientIpAddress(HttpServletRequest request) {
String xForwardedFor = request.getHeader("X-Forwarded-For");
if (xForwardedFor != null && !xForwardedFor.isEmpty() && !"unknown".equalsIgnoreCase(xForwardedFor)) {
return xForwardedFor.split(",")[0];
}
String xRealIp = request.getHeader("X-Real-IP");
if (xRealIp != null && !xRealIp.isEmpty() && !"unknown".equalsIgnoreCase(xRealIp)) {
return xRealIp;
}
String proxyClientIp = request.getHeader("Proxy-Client-IP");
if (proxyClientIp != null && !proxyClientIp.isEmpty() && !"unknown".equalsIgnoreCase(proxyClientIp)) {
return proxyClientIp;
}
String wlProxyClientIp = request.getHeader("WL-Proxy-Client-IP");
if (wlProxyClientIp != null && !wlProxyClientIp.isEmpty() && !"unknown".equalsIgnoreCase(wlProxyClientIp)) {
return wlProxyClientIp;
}
return request.getRemoteAddr();
}
}

View File

@@ -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 jakarta.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;
}
}

View File

@@ -0,0 +1,21 @@
package com.ai.da.common.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Configuration
public class AsyncConfig {
@Bean("asyncTaskExecutor")
public Executor asyncTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("Async-ImageToSketch-");
executor.initialize();
return executor;
}
}

View File

@@ -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> customerData = retrieveCustomerData();
// 执行查询步骤2: 使用 MZG013 报告检查客户的销售历史
System.out.println("执行步骤2使用 MZG013 报告检查客户的销售历史...");
// 执行相应的查询并获取数据
List<TransactionData> transactionData = retrieveTransactionData();
List<String> collect = transactionData.stream().map(TransactionData::getUserMember).collect(Collectors.toList());
List<CustomerData> customerData = retrieveCustomerData(collect);
for (TransactionData transactionDatum : transactionData) {
for (CustomerData customerDatum : customerData) {
if (customerDatum.getMbrCode().equals(transactionDatum.getUserMember())) {
customerDatum.setLastMonth(transactionDatum.getSumAmt());
break;
}
}
}
// 执行步骤3: 合并vlookupRW0095中的客户购买金额
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<CustomerData> 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<CustomerData> retrieveCustomerData(List<String> collect) {
List<CustomerData> 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<TransactionData> retrieveTransactionData() {
List<TransactionData> 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();
}
}

View File

@@ -20,25 +20,26 @@ public class FileProperties {
private String linuxDomain; private String linuxDomain;
public ElPath getSys(){ public ElPath getSys() {
String os = System.getProperty("os.name"); String os = System.getProperty("os.name");
if(os.toLowerCase().startsWith("win")) { if (os.toLowerCase().startsWith("win")) {
return windows; return windows;
} else if(os.toLowerCase().startsWith("mac")){ } else if (os.toLowerCase().startsWith("mac")) {
return mac; return mac;
} }
return linux; return linux;
} }
public String getLinuxDomain(){
public String getLinuxDomain() {
String os = System.getProperty("os.name"); String os = System.getProperty("os.name");
if((!os.toLowerCase().startsWith("win") )&& (!os.toLowerCase().startsWith("mac"))) { if ((!os.toLowerCase().startsWith("win")) && (!os.toLowerCase().startsWith("mac"))) {
return linuxDomain; return linuxDomain;
} }
return null; return null;
} }
@Data @Data
public static class ElPath{ public static class ElPath {
private String path; private String path;
} }
} }

View File

@@ -0,0 +1,34 @@
package com.ai.da.common.config;
import io.minio.MinioClient;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Data
@Component
public class MinIoClientConfig {
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
/**
* 注入minio 客户端
*
* @return
*/
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
package com.ai.da.common.config.mybatis.plus; package com.ai.da.common.config;
import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
@@ -8,11 +8,17 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@Configuration @Configuration
@MapperScan("com.ai.da.mapper")
public class MybatisPlusConfig { public class MybatisPlusConfig {
@Bean @Bean(name = "primaryMybatisPlusInterceptor")
public MybatisPlusInterceptor mybatisPlusInterceptor() { 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(); MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor; return interceptor;

View File

@@ -0,0 +1,46 @@
package com.ai.da.common.config;
import com.paypal.core.PayPalEnvironment;
import com.paypal.core.PayPalHttpClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@Slf4j
@PropertySource("classpath:payment.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();
}*/
}

View File

@@ -0,0 +1,63 @@
package com.ai.da.common.config;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
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.Autowired;
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 {
@Autowired
private MybatisPlusProperties mybatisPlusProperties;
@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"));
// 设置 MyBatis Plus 全局配置
GlobalConfig globalConfig = this.mybatisPlusProperties.getGlobalConfig();
if (globalConfig != null) {
bean.setGlobalConfig(globalConfig);
}
bean.setPlugins(mybatisPlusInterceptor);
return bean.getObject();
}
@Primary
@Bean(name = "primarySqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(
@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}

View File

@@ -0,0 +1,42 @@
package com.ai.da.common.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean(name = "redisTemplate")
public RedisTemplate<String, Object> getRedisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer); // key的序列化类型
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 方法过期,改为下面代码
// objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // value的序列化类型
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}

View File

@@ -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);
}
}

View File

@@ -0,0 +1,260 @@
package com.ai.da.common.config;
import com.ai.da.common.utils.MinioUtil;
import com.ai.da.mapper.primary.ThreeDDetailMapper;
import com.ai.da.mapper.primary.ThreeDLayoutMapper;
import com.ai.da.mapper.primary.ThreeDPatternLayoutMapper;
import com.ai.da.mapper.primary.ThreeDSimpleMapper;
import com.ai.da.mapper.primary.entity.ThreeDDetail;
import com.ai.da.mapper.primary.entity.ThreeDLayout;
import com.ai.da.mapper.primary.entity.ThreeDPatternLayout;
import com.ai.da.mapper.primary.entity.ThreeDSimple;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@Slf4j
@Component
public class ThreeDSave {
@Resource
private ThreeDDetailMapper threeDDetailMapper;
@Resource
private ThreeDSimpleMapper threeDSimpleMapper;
@Resource
private MinioUtil minioUtil;
@Resource
private ThreeDLayoutMapper threeDLayoutMapper;
@Resource
private ThreeDPatternLayoutMapper threeDPatternLayoutMapper;
@PostConstruct
public void test() {
// minioSave();
// frontBackDataCreate();
// patternDataCreate();
}
private void patternDataCreate() {
QueryWrapper<ThreeDSimple> qw = new QueryWrapper<>();
qw.lambda().eq(ThreeDSimple::getGender, "female");
qw.lambda().ne(ThreeDSimple::getId, 1);
List<ThreeDSimple> threeDSimpleList = threeDSimpleMapper.selectList(qw);
List<Integer> numbers = new ArrayList<>();
String patternPath = "C:\\workspace\\3D\\3D虚拟 1-7\\6.版文件、dxf文件\\女装系列(1)\\女装系列\\56款打版截图";
File directory = new File(patternPath);
if (directory.exists() && directory.isDirectory()) {
// 获取目录下的所有文件名,并建立编号 -> 文件名的映射
Map<Integer, String> fileMap = Arrays.stream(directory.listFiles())
.filter(File::isFile) // 只获取文件
.map(File::getName) // 获取文件名
.collect(Collectors.toMap(
name -> {
Matcher matcher = Pattern.compile("^\\d+").matcher(name);
return matcher.find() ? Integer.parseInt(matcher.group()) : -1;
},
name -> name,
(existing, replacement) -> existing // 处理重复情况,保留原有值
));
for (ThreeDSimple threeDSimple : threeDSimpleList) {
String name = threeDSimple.getName();
Pattern pattern = Pattern.compile("^\\d+"); // 匹配开头的数字
Matcher matcher = pattern.matcher(name);
if (matcher.find()) {
int number = Integer.parseInt(matcher.group());
numbers.add(number);
// 匹配对应文件夹,并获取文件
if (fileMap.containsKey(number)) {
String matchedFolder = fileMap.get(number);
File folder = new File(directory, matchedFolder);
ThreeDPatternLayout threeDPatternLayout = new ThreeDPatternLayout();
threeDPatternLayout.setThreeDSimpleId(threeDSimple.getId());
threeDPatternLayout.setName(matchedFolder);
String minioUrl = "aida-threed/female/pattern-layout/" + matchedFolder;
minioUtil.upload(minioUrl, folder);
threeDPatternLayout.setUrl(minioUrl);
// threeDPatternLayoutMapper.insert(threeDPatternLayout);
}
}
}
System.out.println("文件编号映射:" + fileMap);
}
}
private void frontBackDataCreate() {
QueryWrapper<ThreeDSimple> qw = new QueryWrapper<>();
qw.lambda().eq(ThreeDSimple::getGender, "female");
// qw.lambda().ne(ThreeDSimple::getId, 1);
List<ThreeDSimple> threeDSimpleList = threeDSimpleMapper.selectList(qw);
List<Integer> numbers = new ArrayList<>();
// 文件夹名列表
String path = "C:\\workspace\\3D\\3D虚拟 1-7\\3D服装真反面整理\\female"; // 目标路径
File directory = new File(path);
if (directory.exists() && directory.isDirectory()) {
// 获取文件夹名列表,并建立编号 -> 文件夹名的映射
Map<Integer, String> folderMap = Arrays.stream(directory.listFiles())
.filter(File::isDirectory)
.map(File::getName)
.collect(Collectors.toMap(
name -> {
Matcher matcher = Pattern.compile("^\\d+").matcher(name);
return matcher.find() ? Integer.parseInt(matcher.group()) : -1;
},
name -> name,
(existing, replacement) -> existing // 处理重复情况,保留原有值
));
System.out.println("文件夹编号映射:" + folderMap);
for (ThreeDSimple threeDSimple : threeDSimpleList) {
String name = threeDSimple.getName();
Pattern pattern = Pattern.compile("^\\d+"); // 匹配开头的数字
Matcher matcher = pattern.matcher(name);
if (matcher.find()) {
int number = Integer.parseInt(matcher.group());
numbers.add(number);
// 匹配对应文件夹,并获取文件
if (folderMap.containsKey(number)) {
String matchedFolder = folderMap.get(number);
File folder = new File(directory, matchedFolder);
if (folder.exists() && folder.isDirectory()) {
for (File file : folder.listFiles()) {
String fileName = file.getName(); // 去掉后缀
ThreeDLayout threeDLayout = new ThreeDLayout();
threeDLayout.setGender("female");
threeDLayout.setThreeDSimpleId(threeDSimple.getId());
threeDLayout.setName(file.getName());
if (fileName.startsWith("")) {
threeDLayout.setType("front");
}else if (fileName.startsWith("")) {
threeDLayout.setType("back");
}
String minioUrl = "aida-threed/female/layout/" + folderMap.get(number) + " " + file.getName();
minioUtil.upload(minioUrl, file);
threeDLayout.setUrl(minioUrl);
// threeDLayoutMapper.insert(threeDLayout);
}
}
}
}
}
System.out.println(numbers);
} else {
System.out.println("路径不存在或不是文件夹");
}
}
private void minioSave() {
// 指定目标文件夹路径
String folderPath = "C:\\workspace\\3D\\3D虚拟 1-7\\3D服装整理\\maleZip";
// 创建文件对象
File folder = new File(folderPath);
// 检查文件夹是否存在且是目录
if (folder.exists() && folder.isDirectory()) {
// 获取所有 .zip 文件
File[] zipFiles = folder.listFiles((dir, name) -> name.toLowerCase().endsWith(".zip"));
List<String> zipFileNameList = new ArrayList<>();
// 输出文件名
if (zipFiles != null) {
for (File file : zipFiles) {
String zipFileName = file.getName();
String[] split = zipFileName.split("_");
String zipName = split[0];
String sizeWithSuffix = split[1];
String[] sizeWithSuffixSplit = sizeWithSuffix.split("\\.");
String size = sizeWithSuffixSplit[0];
// 找到第一个字母的位置
int index = 0;
while (index < size.length() && Character.UnicodeBlock.of(size.charAt(index)) == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS) {
index++;
}
if (index > 0 && index < size.length()) {
String prefix = size.substring(0, index); // "亚码"
String suffix = size.substring(index); // "L"
ThreeDDetail threeDDetail = new ThreeDDetail();
threeDDetail.setName(zipFileName);
String url = "aida-threed/male/zip/" + zipFileName;
threeDDetail.setGender("male");
threeDDetail.setSizeType(prefix);
threeDDetail.setSize(suffix);
threeDDetail.setUrl(url);
// threeDDetailMapper.insert(threeDDetail);
minioUtil.upload(url, file);
QueryWrapper<ThreeDSimple> qw = new QueryWrapper<>();
qw.lambda().eq(ThreeDSimple::getName, zipName);
qw.lambda().eq(ThreeDSimple::getGender, "male");
List<ThreeDSimple> threeDSimples = threeDSimpleMapper.selectList(qw);
if (CollectionUtils.isEmpty(threeDSimples)) {
ThreeDSimple threeDSimple = new ThreeDSimple();
threeDSimple.setName(zipName);
threeDSimple.setGender("male");
String glbPath = "C:\\workspace\\3D\\3D虚拟 1-7\\3D服装整理\\male\\" + zipName + "\\" +"亚码L";
File glbFolder = new File(glbPath);
// 查找 .glb 文件
if (glbFolder.exists() && glbFolder.isDirectory()) {
File[] glbFiles = glbFolder.listFiles((dir, name) -> name.toLowerCase().endsWith(".glb"));
if (glbFiles != null && glbFiles.length > 0) {
for (File glbFile : glbFiles) {
String name = glbFile.getName();
String glbUrl = "aida-threed/male/glb/" + name;
threeDSimple.setUrl(glbUrl);
minioUtil.upload(glbUrl, glbFile);
}
} else {
System.out.println("未找到 GLB 文件。" + glbFolder);
}
} else {
System.out.println("GLB 文件夹不存在: " + glbPath);
}
// threeDSimpleMapper.insert(threeDSimple);
threeDDetail.setThreeDSimpleId(threeDSimple.getId());
threeDDetailMapper.updateById(threeDDetail);
}else {
Long id = threeDSimples.get(0).getId();
threeDDetail.setThreeDSimpleId(id);
threeDDetailMapper.updateById(threeDDetail);
}
} else {
}
}
} else {
System.out.println("未找到 ZIP 文件。");
}
log.info("aaa");
} else {
System.out.println("文件夹不存在或不是一个目录。");
}
}
}

View File

@@ -5,13 +5,22 @@ import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.validation.Validation; import jakarta.validation.Validation;
import javax.validation.Validator; import jakarta.validation.Validator;
import javax.validation.ValidatorFactory; import jakarta.validation.ValidatorFactory;
@Configuration @Configuration
public class WebConfig { public class WebConfig implements WebMvcConfigurer {
static final String ORIGINS[] = new String[]{"GET", "POST", "PUT", "DELETE"};
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOriginPatterns("*").allowCredentials(true).allowedMethods(ORIGINS).maxAge(3600);
}
@Bean @Bean
public Validator validator() { public Validator validator() {

View File

@@ -1,7 +1,19 @@
package com.ai.da.common.config.exception; package com.ai.da.common.config.exception;
import com.ai.da.common.context.UserContext;
import com.ai.da.common.response.ResultEnum; import com.ai.da.common.response.ResultEnum;
import com.ai.da.model.enums.Language;
import com.ai.da.model.vo.AuthPrincipalVo;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Locale;
import java.util.Objects;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
/** /**
* @author: dangweijian * @author: dangweijian
@@ -9,20 +21,55 @@ import lombok.Data;
* @create: 2020-01-01 17:24 * @create: 2020-01-01 17:24
**/ **/
@Data @Data
@Slf4j
public class BusinessException extends RuntimeException { public class BusinessException extends RuntimeException {
private Integer code; private Integer code;
private String msg; private String msg;
public BusinessException(ResultEnum resultEnum){ public BusinessException(ResultEnum resultEnum) {
super(resultEnum.getMsg());
this.code = resultEnum.getCode(); this.code = resultEnum.getCode();
this.msg = resultEnum.getMsg(); this.msg = getMessageFromResource(resultEnum.getMsg(), getUserLocale());
} }
public BusinessException(String msg) { public BusinessException(String msg) {
super(msg);
this.code = ResultEnum.FAIL.getCode(); this.code = ResultEnum.FAIL.getCode();
this.msg = msg; this.msg = getMessageFromResource(msg, getUserLocale());
}
public BusinessException(String msg, Integer code) {
this.code = code;
this.msg = getMessageFromResource(msg, getUserLocale());
}
public BusinessException(Throwable cause) {
this.code = ResultEnum.FAIL.getCode();
this.msg = getMessageFromResource(cause.getMessage(), getUserLocale());
}
private static Locale getUserLocale() {
AuthPrincipalVo userInfo = UserContext.getUserHolder();
if (Objects.isNull(userInfo)) {
return new Locale("en");
}
return new Locale(Language.valueOf(userInfo.getLanguage()).getValue());
}
public static String getMessageFromResource(String msg) {
return getMessageFromResource(msg, getUserLocale());
}
public static String getMessageFromResource(String msg, Locale userLocale) {
try (InputStream inputStream = BusinessException.class.getClassLoader().getResourceAsStream("messages_" + userLocale.getLanguage() + ".properties")) {
if (inputStream != null) {
ResourceBundle bundle = new PropertyResourceBundle(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
if (bundle.containsKey(msg)) {
return bundle.getString(msg);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return msg; // 如果找不到对应的资源文件,返回原始的消息
} }
} }

View File

@@ -51,11 +51,12 @@ public class ExceptionCatch {
return Response.error(resultEnum.getCode(), resultEnum.getMsg()); return Response.error(resultEnum.getCode(), resultEnum.getMsg());
} }
} }
return Response.error(ResultEnum.ERROR.getCode(), e.getMessage()==null?ResultEnum.ERROR.getMsg():e.getMessage()); return Response.error(ResultEnum.ERROR.getCode(), e.getMessage() == null ? ResultEnum.ERROR.getMsg() : e.getMessage());
} }
/** /**
* 处理参数校验异常 * 处理参数校验异常
*
* @param e * @param e
* @return ResponseData * @return ResponseData
*/ */
@@ -63,19 +64,22 @@ public class ExceptionCatch {
@ExceptionHandler(BindException.class) @ExceptionHandler(BindException.class)
public Response<String> bindExceptionHandler(BindException e) { public Response<String> bindExceptionHandler(BindException e) {
log.error("参数错误bind{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); log.error("参数错误bind{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
return Response.fail(ResultEnum.FAIL.getCode(), e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); BusinessException businessException = new BusinessException(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
return Response.error(businessException.getCode(), businessException.getMsg());
} }
/** /**
* 处理参数校验异常 * 处理参数校验异常
*
* @param e * @param e
* @return ResponseData * @return ResponseData
*/ */
@ResponseBody @ResponseBody
@ExceptionHandler(MethodArgumentNotValidException.class) @ExceptionHandler(MethodArgumentNotValidException.class)
public Response<String> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) { public Response<String> handleValidationException(MethodArgumentNotValidException e) {
log.error("参数错误bind{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); log.error("参数错误bind{}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
return Response.fail(ResultEnum.FAIL.getCode(), e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); BusinessException businessException = new BusinessException(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
return Response.error(businessException.getCode(), businessException.getMsg());
} }
//初始化,不可预知异常自定义错误编码 //初始化,不可预知异常自定义错误编码

View File

@@ -0,0 +1,12 @@
package com.ai.da.common.config.exception;
public class TokenMissingOrExpiredException extends RuntimeException {
public TokenMissingOrExpiredException(String message) {
super(message);
}
@Override
public Throwable fillInStackTrace() {
return this;
}
}

View File

@@ -22,7 +22,7 @@ import java.util.function.Function;
**/ **/
@Data @Data
@Slf4j @Slf4j
public abstract class QueryCriteria<T,E> { public abstract class QueryCriteria<T, E> {
private long page = 1; private long page = 1;
private long limit = 10; private long limit = 10;
@@ -36,12 +36,12 @@ public abstract class QueryCriteria<T,E> {
this.mapper = mapper; this.mapper = mapper;
} }
public QueryWrapper<T> buildWrapper(){ public QueryWrapper<T> buildWrapper() {
QueryWrapper<T> wrapper = new QueryWrapper<>(); QueryWrapper<T> wrapper = new QueryWrapper<>();
Field[] fields = this.getClass().getDeclaredFields(); Field[] fields = this.getClass().getDeclaredFields();
for (Field field : fields) { for (Field field : fields) {
Condition condition = field.getAnnotation(Condition.class); Condition condition = field.getAnnotation(Condition.class);
if(condition != null){ if (condition != null) {
field.setAccessible(true); field.setAccessible(true);
Object value = null; Object value = null;
try { try {
@@ -49,27 +49,27 @@ public abstract class QueryCriteria<T,E> {
} catch (IllegalAccessException e) { } catch (IllegalAccessException e) {
log.warn("reflection anomaly!"); log.warn("reflection anomaly!");
} }
if(!StrUtil.isEmptyIfStr(value)){ if (!StrUtil.isEmptyIfStr(value)) {
switch (condition.type()){ switch (condition.type()) {
case EQ: case EQ:
wrapper.eq(ConvertUtil.humpToLine2(field.getName()), value); wrapper.eq(ConvertUtil.humpToLine2(field.getName()), value);
break; break;
case LIKE: case LIKE:
wrapper.like(ConvertUtil.humpToLine2(field.getName()), value); wrapper.like(ConvertUtil.humpToLine2(field.getName()), value);
case BETWEEN: case BETWEEN:
if(value instanceof Collection && ((List) value).size() >= 2){ if (value instanceof Collection && ((List) value).size() >= 2) {
wrapper.between(ConvertUtil.humpToLine2(field.getName()), ((List)value).get(0), ((List)value).get(1)); wrapper.between(ConvertUtil.humpToLine2(field.getName()), ((List) value).get(0), ((List) value).get(1));
} }
default: default:
} }
}else if(condition.isNull()){ } else if (condition.isNull()) {
wrapper.isNull(ConvertUtil.humpToLine2(field.getName())); wrapper.isNull(ConvertUtil.humpToLine2(field.getName()));
} }
} }
Order order = field.getAnnotation(Order.class); Order order = field.getAnnotation(Order.class);
if(order != null){ if (order != null) {
if(!StrUtil.isEmptyIfStr(order.order())){ if (!StrUtil.isEmptyIfStr(order.order())) {
switch (order.order()){ switch (order.order()) {
case DESC: case DESC:
wrapper.orderByDesc(ConvertUtil.humpToLine2(field.getName())); wrapper.orderByDesc(ConvertUtil.humpToLine2(field.getName()));
break; break;

View File

@@ -1,37 +0,0 @@
package com.ai.da.common.config.swagger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
@Configuration
@EnableSwagger2WebMvc
public class AidaConfiguration {
@Bean(value = "IntelligentCurtainApis")
public Docket gxyd5aThemeApis() {
Contact contact = new Contact("Mr.Y","","136");
Docket docket=new Docket(DocumentationType.SWAGGER_2)
.apiInfo(new ApiInfoBuilder()
.description("aida接口文档")
.contact(contact)
.termsOfServiceUrl("暂无")
.version("1.0")
.build())
//分组名称
.groupName("1.0")
.select()
//这里指定Controller扫描包路径
.apis(RequestHandlerSelectors.basePackage("com.ai.da.controller"))
.paths(PathSelectors.any())
.build();
return docket;
}
}

View File

@@ -0,0 +1,9 @@
package com.ai.da.common.constant;
public class AffiliateConstants {
public static final String STATUS_ACTIVE = "Active";
public static final String STATUS_INACTIVE = "Inactive";
public static final String STATUS_DELETE = "Delete";
public static final Integer DELETED = 1;
public static final Integer NOT_DELETED = 0;
}

View File

@@ -0,0 +1,20 @@
package com.ai.da.common.constant;
public class AlipayHKConstant {
// 服务名
public static final String CREATE_ORDER = "create_order";
public static final String ORDER_DETAILS = "order_details";
public static final String TRANSACTION_DETAILS = "transaction_details";
public static final String GET_FILE = "get_file";
public static final String CREATE_AUTO_DEBIT = "create_auto_debit";
public static final String REFRESH_TRANSACTION_STATUS = "refresh_transaction_status";
public static final String REFUND_TRANSACTION = "refund_transaction";
// 订单状态
public static final String STATUS_NEW = "new";
public static final String STATUS_WAIT = "wait";
public static final String STATUS_PAID = "paid";
public static final String STATUS_EXPIRED = "expired";
public static final String STATUS_LIQUIDATED = "liquidated";
}

View File

@@ -0,0 +1,98 @@
package com.ai.da.common.constant;
import java.util.Arrays;
import java.util.List;
public class CommonConstant {
// 单位 秒 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;
// 单位 分钟
public static final Integer MINIO_IMAGE_EXPIRE_TIME = 24 * 60;
// 单位 秒 一天过期 in redis
public static final Long GENERATE_RESULT_EXPIRE_TIME = 24 * 60 * 60L;
// 单位 秒 7天过期
public static final Long REDIS_SET_EXPIRE_TIME = 24 * 60 * 60 * 7L;
public static class Numbers{
public static final Integer NUMBER_10 = 10;
public static final Integer NUMBER_1000 = 1000;
public static final Integer NUMBER_10080 = 10080;
}
public static final String GENERATE_PATH = "/api/generate_image";
public static final String GENERATE_PATH_FLUX2_KLEIN = "/api/generate_image_flux2_klein";
public static final String GENERATE_SINGLE_LOGO = "/api/generate_single_logo";
public static final String GENERATE_SLOGAN = "/api/slogan";
public static final String GENERATE_CANCEL = "/api/generate_cancel/";
public static final String GENERATE_LOGO_SINGLE_CANCEL = "/api/generate_single_logo_cancel/";
// public static final String POSE_TRANSFORMATION_CANCEL = "/api/pose_transform_cancel/";
public static final String POSE_TRANSFORMATION_CANCEL = "/api/comfyui_i_2_video_cancel/";
public static final String PYTHON_PORT_9996 = "9996";
public static final String PYTHON_PORT_9997 = "9997";
public static final List<String> AGES_EN = Arrays.asList("Below 20", "20-30", "30-40", "40+");
public static final List<String> AGES_CN = Arrays.asList("20岁以下", "20-30岁", "30-40岁", "40+岁");
public static final List<String> IF_HELPFUL_EN = Arrays.asList("Easy to learn and use", "Easy to get trend information",
"Lots of creative design proposals","The AIGC functions for moodboard is helpful","The AIGC functions for design sketches is helpful",
"Easy to select the right color","The Chatbot function is helpful","The print position function is helpful",
"The drawing function is helpful","The export function is useful","Easy to edit the design","Others");
public static final List<String> IF_HELPFUL_CN = Arrays.asList("易于学习和使用", "容易获取趋势信息",
"提供大量创意设计方案","AIGC功能对灵感板有帮助","AIGC功能对设计草图有帮助",
"容易选择合适的颜色","聊天机器人功能有帮助","打印位置功能有帮助",
"绘图功能有帮助","导出功能有用","设计编辑简单","其他");
public static final List<String> IF_IMPROVE_EN = Arrays.asList("Proposed designs are boring, need more interesting designs",
"Difficult to make changes on design","Only 2D output, no 3D results","Difficult to apply keywords for AIGC generation",
"Clothing is not in the right proportion","Not compatible with pattern making solutions","Improved user interface for better navigation",
"Lack of responsive customer support","Insufficient tutorial or guidance for new users","Limited personalization options for designs","Others");
public static final List<String> IF_IMPROVE_CN = Arrays.asList("提供的设计很无聊,需要更多有趣的设计",
"设计修改困难","只有2D输出没有3D结果","难以选择合适的关键词应用于AIGC生成",
"服装比例不正确","与打版解决方案不兼容","改进用户界面以便更好导航",
"客户支持响应不及时","对新用户的教程或指导不足","设计个性化选项有限","其他");
public static final List<String> IS_SUBSCRIBE = Arrays.asList("yes", "no");
// public static final String DEFAULT_AVATAR = "aida-users/87/avatar/default.jpg";
public static final String DEFAULT_AVATAR = "aida-users/87/avatar/default.png";
/* 截止至2024/08/26在Code-Create DB中pmr_users表中最大的用户id */
public static final Long MAXIMUM_USER_ID = 704L;
// public static final Long MAXIMUM_USER_ID = 225L;
// 激活更改邮箱 链接有效期 毫秒 3天
public static final Long CHANGE_MAILBOX_LINK_VALIDITY = 259200000L;
public static final String RCA_WORKSHOP_TAG = "#RCAworkshop_2024";
public static final String PORTFOLIO_DELETED_EN = "Portfolio has been deleted";
public static final String PORTFOLIO_DELETED_CN = "作品已删除";
public static final String TIME_FORMAT_MMM_dd_yyyy_EEEE = "MMM. dd, yyyy, EEEE";
public static final String TIME_FORMAT_MMM_dd_yyyy = "MMM. dd, yyyy";
public static final String TIME_FORMAT_yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss";
public static final String AFFILIATE_LINK = "https://www.aida.com.hk?ref=";
public static final String PARTIAL_DESIGN_FILENAME = "PartialDesign";
public static final String PARTIAL_DESIGN_PREVIEW_FILENAME = "Preview";
public static final String senderEmail = "info@aida.com.hk";
}

View File

@@ -0,0 +1,42 @@
package com.ai.da.common.constant;
/**
* 模型相关常量类
* 用于存放 chooseModelAndPrompt 方法中的字符串常量
*/
public class ModelConstants {
// 类型常量
public static final String PRINTBOARD = "Printboard";
public static final String MOODBOARD = "Moodboard";
public static final String SKETCHBOARD = "Sketchboard";
// 模型级别常量
public static final String ADVANCED = "advanced";
public static final String HIGH = "high";
public static final String NORMAL = "normal";
// 模型名称常量
public static final String PRINTBOARD_ADVANCED_T2I = "qwen-image";
public static final String MOODBOARD_ADVANCED = "doubao-seedream-3-0-t2i-250415";
public static final String PRINTBOARD_HIGH_T2I = "doubao-seedream-3-0-t2i-250415";
public static final String PRINTBOARD_HIGH_I2I = "doubao-seedream-4-0-250828";
public static final String PRINTBOARD_ADVANCED_I2I = "doubao-seedream-4-0-250828";
public static final String IMAGEN_MODEL = "imagen-4.0-generate-001";
public static final String NANO_BANANA = "gemini-2.5-flash-image";
public static final String LOCAL_MODEL = "local";
// 风格常量
public static final String PAINTING_STYLE = "Painting Style";
public static final String ILLUSTRATION_STYLE = "Illustration Style";
public static final String REAL_STYLE = "Real Style";
// 映射键
public static final String PROMPT = "prompt";
public static final String USE_MODEL = "UseModel";
// 防止实例化
private ModelConstants() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
}

View File

@@ -0,0 +1,173 @@
package com.ai.da.common.constant;
public class PayPalCheckoutConstant {
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 PAYPAL_TOKEN_KEY = "PayPalAccessToken";
}

View File

@@ -3,11 +3,12 @@ package com.ai.da.common.context;
import com.ai.da.model.vo.AuthPrincipalVo; import com.ai.da.model.vo.AuthPrincipalVo;
public class UserContext { public class UserContext {
private static ThreadLocal<AuthPrincipalVo> userHolder= new ThreadLocal<AuthPrincipalVo>(); private static ThreadLocal<AuthPrincipalVo> userHolder = new ThreadLocal<AuthPrincipalVo>();
public static AuthPrincipalVo getUserHolder() { public static AuthPrincipalVo getUserHolder() {
return userHolder.get(); return userHolder.get();
} }
public static void delete() { public static void delete() {
userHolder.remove(); userHolder.remove();
} }

View File

@@ -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;
}

View File

@@ -0,0 +1,45 @@
package com.ai.da.common.enums;
import java.util.stream.Stream;
/**
* @author: yanglei
* @description: 操作类型 登入 忘记密码
* @create: 2022-8-10 17:33
**/
public enum AuthenticationOperationTypeEnum {
/**
* 登入
*/
LOGIN,
/**
* 异常ip
*/
EXCEPTION_IP,
/**
* 绑定邮箱
*/
BIND_MAILBOX,
/**
* 忘记密码
*/
FORGET_PWD,
/**
* 更改邮箱
*/
CHANGE_MAILBOX,
/**
* 填写用户国家和职业
*/
UPDATE_USERINFO,
REGISTER,
/**
* Global_Award 活动验证
*/
GLOBAL_AWARD;
public static AuthenticationOperationTypeEnum of(String name) {
return Stream.of(AuthenticationOperationTypeEnum.values()).filter(v -> v.name().equals(name)).findFirst().orElse(null);
}
}

View File

@@ -27,7 +27,9 @@ public enum CollectionLevel1TypeEnum {
/** /**
* 市场 * 市场
*/ */
MARKETING_SKETCH("MarketingSketch"); MARKETING_SKETCH("MarketingSketch"),
MODEL("Models");
private String realName; private String realName;
@@ -39,8 +41,8 @@ public enum CollectionLevel1TypeEnum {
return realName; return realName;
} }
public static CollectionLevel1TypeEnum uploadOf(String realName){ public static CollectionLevel1TypeEnum uploadOf(String realName) {
return Stream.of(CollectionLevel1TypeEnum.values()) return Stream.of(CollectionLevel1TypeEnum.values())
.filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); .filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
} }
} }

View File

@@ -1,5 +1,7 @@
package com.ai.da.common.enums; package com.ai.da.common.enums;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream; import java.util.stream.Stream;
/** /**
@@ -27,7 +29,27 @@ public enum CollectionLevel2TypeEnum {
/** /**
* 裤子 * 裤子
*/ */
TROUSERS("Trousers"); TROUSERS("Trousers"),
/**
* 男装上装
*/
TOPS("Tops"),
/**
* 男装下装
*/
BOTTOMS("Bottoms"),
/**
* 印花-logo
*/
LOGO("Logo"),
/**
* 印花-slogan
*/
SLOGAN("Slogan"),
/**
* 印花-图案
*/
Pattern("Pattern");
private String realName; private String realName;
@@ -42,4 +64,11 @@ public enum CollectionLevel2TypeEnum {
public static CollectionLevel2TypeEnum of(String realName) { public static CollectionLevel2TypeEnum of(String realName) {
return Stream.of(CollectionLevel2TypeEnum.values()).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null); return Stream.of(CollectionLevel2TypeEnum.values()).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
} }
public static List<String> printType() {
return Arrays.asList(LOGO.getRealName(), SLOGAN.getRealName(), Pattern.getRealName());
}
public static CollectionLevel2TypeEnum ofWithLoweCase(String realName) {
return Stream.of(CollectionLevel2TypeEnum.values()).filter(v -> v.getRealName().toLowerCase().equals(realName)).findFirst().orElse(null);
}
} }

View File

@@ -6,5 +6,5 @@ package com.ai.da.common.enums;
* @create: 2020-01-14 17:33 * @create: 2020-01-14 17:33
**/ **/
public enum ConditionType { public enum ConditionType {
EQ,LIKE,BETWEEN; EQ, LIKE, BETWEEN;
} }

View File

@@ -0,0 +1,91 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@AllArgsConstructor
@Getter
public enum CreditsEventsEnum {
PRICE("price","10"),
// PRICE("price","1"),// for test
// PRICE("price","0.1"),
BUY_CREDITS("Buy Credits","50"),
// BUY_CREDITS("Buy Credits","10"),// for test
REFUND("Refund","50"),
// BUY_CREDITS("Buy Credits","10"),
// 每月更新
INIT_YEARLY("init_yearly", "50000"),
INIT_MONTHLY("init_monthly", "3500"),
INIT_MONTHLY_ECO("init_monthly_eco", "500"),
INIT_QUARTERLY("init_quarterly", "12000"),
INIT_MONTHLY_EDU("init_monthly_edu", "3500"),
INIT_TRIAL("init_trial", "100"),
INIT_WEEKLY("init_weekly","6000"),
RESET_YEAR_CREDITS("reset_year_credits","6000"),
// SUPER_RESOLUTION("Super Resolution","30"),
SUPER_RESOLUTION("Super Resolution","10"),
SLOGAN("Slogan","10"),
LOGO("Logo","5"),
PATTERN("Pattern","5"),
MOOD_BOARD("MoodBoard","5"),
SKETCH_BOARD("SketchBoard","5"),
TO_PRODUCT_IMAGE("ToProductImage","5"),
TO_PRODUCT_IMAGE_ADVANCED("ToProductImageAdvanced","15"),
RELIGHT("Relight","5"),
RELIGHT_FLUX("RelightFlux","10"),
QUESTIONNAIRE("Questionnaire","100"),
IMAGE_TO_SKETCH("ImageToSketch","5"),
IMAGE_TO_SKETCH_FLUX("ImageToSketchFlux","10"),
POSE_TRANSFORMATION("PoseTransformation","10"),
OTHER("Other","5"),
SCETCH_TEXT2IMG("SketchText2Image","10"),
SCETCH_IMG2IMG("SketchImg2Image","15"),
WX_TEXT2IMG("WX_Text2Image", "5"),
QWEN_TEXT2IMG("QWEN_Text2Image", "10"),
DOUBAO_TEXT2IMG("Doubao_Text2Image", "10"),
DOUBAO_IMG2IMG_ADVANCED("Doubao_img2image_advanced", "10"),
DOUBAO_IMG2IMG_HIGH("Doubao_img2image_high", "15"),
WX_ANIMATION("WX_Animation", "30"),
FREEPIK_IMG2IMG("Freepik_img2img", "20"),
FLUX_IMG2IMG("Flux_img2img","10"),
LOCAL_TEXT2IMG("Local_text2img","1.25"),
LOCAL_IMG2IMG("Local_img2img","1.25"),
LOCAL_TEXT2IMG_HIGH("Local_text2img_high","5"),
LOCAL_IMG2IMG_HIGH("Local_img2img_high","5"),
LOCAL_ANIMATION("Local_Animation","15"),
LLM_CONVERSATION("LLM_Conversation", "0")
;
private final String name;
/**
* 对应事件需要消耗or获得的积分
*/
private final String value;
public static List<String> generateFunctionNames() {
return Arrays.asList(SLOGAN.name, LOGO.name, PATTERN.name, MOOD_BOARD.name, SKETCH_BOARD.name,
TO_PRODUCT_IMAGE.name, RELIGHT.name, IMAGE_TO_SKETCH.name, POSE_TRANSFORMATION.name);
}
private static final Map<String, CreditsEventsEnum> BY_TASK_NAME = Arrays.stream(values())
.collect(Collectors.toMap(CreditsEventsEnum::getName, Function.identity()));
public static CreditsEventsEnum getByTaskName(String taskName){
return BY_TASK_NAME.get(taskName);
}
}

View File

@@ -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;
}
}

View File

@@ -16,19 +16,19 @@ public enum CurrentDesignPictureTypeEnum {
/** /**
* PIN * PIN
*/ */
PIN(1,"PIN"), PIN(1, "PIN"),
/** /**
* USER_LIBRARY * USER_LIBRARY
*/ */
USER_LIBRARY(2,"userLibrary"), // USER_LIBRARY(2, "userLibrary"),
/** /**
* SYS_FILE * SYS_FILE
*/ */
SYS_FILE(3,"sysFile"), SYS_FILE(2, "sysFile"),
/** /**
* noPIN * noPIN
*/ */
NO_PIN(4,"noPIN"); NO_PIN(3, "noPIN");
private Integer code; private Integer code;
private String desc; private String desc;
@@ -38,10 +38,11 @@ public enum CurrentDesignPictureTypeEnum {
this.desc = desc; this.desc = desc;
} }
public static CurrentDesignPictureTypeEnum of(String name){ public static CurrentDesignPictureTypeEnum of(String name) {
return Stream.of(CurrentDesignPictureTypeEnum.values()).filter(v ->v.name().equals(name)).findFirst().orElse(null); return Stream.of(CurrentDesignPictureTypeEnum.values()).filter(v -> v.name().equals(name)).findFirst().orElse(null);
} }
public static List<CurrentDesignPictureTypeEnum> ofList(List<Integer> codes){
return Stream.of(CurrentDesignPictureTypeEnum.values()).filter(v ->codes.contains(v.code)).collect(Collectors.toList()); public static List<CurrentDesignPictureTypeEnum> ofList(List<Integer> codes) {
return Stream.of(CurrentDesignPictureTypeEnum.values()).filter(v -> codes.contains(v.code)).collect(Collectors.toList());
} }
} }

View File

@@ -16,15 +16,15 @@ public enum CurrentDesignPrintPictureTypeEnum {
/** /**
* 空白 * 空白
*/ */
NO(1,"空白"), NO(1, "空白"),
/** /**
* PIN * PIN
*/ */
PIN(2,"PIN"), PIN(2, "PIN"),
/** /**
* noPIN * noPIN
*/ */
NO_PIN(3,"noPIN"); NO_PIN(3, "noPIN");
private Integer code; private Integer code;
private String desc; private String desc;
@@ -33,7 +33,8 @@ public enum CurrentDesignPrintPictureTypeEnum {
this.code = code; this.code = code;
this.desc = desc; this.desc = desc;
} }
public static List<CurrentDesignPrintPictureTypeEnum> ofList(List<Integer> codes){
return Stream.of(CurrentDesignPrintPictureTypeEnum.values()).filter(v ->codes.contains(v.code)).collect(Collectors.toList()); public static List<CurrentDesignPrintPictureTypeEnum> ofList(List<Integer> codes) {
return Stream.of(CurrentDesignPrintPictureTypeEnum.values()).filter(v -> codes.contains(v.code)).collect(Collectors.toList());
} }
} }

View File

@@ -15,7 +15,8 @@ public enum DesignTypeEnum {
/** /**
* Library * Library
*/ */
LIBRARY("Library"); LIBRARY("Library"),
GENERATE("Generate");
private String realName; private String realName;

View File

@@ -0,0 +1,34 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum FluxTaskStatusEnum {
SUCCESS("Ready"),
TASK_NOT_FOUND("Task not found"),
REQUEST_MODERATED("Request Moderated"),
CONTENT_MODERATED("Content Moderated"),
ERROR("Error"),
PENDING_F("Pending");
private final String name;
public static FluxTaskStatusEnum fromName(String name) {
for (FluxTaskStatusEnum status : values()) {
if (status.name.equalsIgnoreCase(name)) {
return status;
}
}
// 或者返回默认值
return TASK_NOT_FOUND;
}
}

View File

@@ -0,0 +1,45 @@
package com.ai.da.common.enums;
import lombok.Getter;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Getter
public enum GenerateModeEnum {
/**
* 通过文本生成
*/
TEXT(1, "text","txt2img"),
/**
* 通过图片生成
*/
IMAGE(2, "image", "img2img"),
/**
* 通过文本和图片生成
*/
TEXT_IMAGE(2, "text-image","img2img");
private Integer code;
private String value;
private String type;
GenerateModeEnum(int code, String value) {
this.code = code;
this.value = value;
}
GenerateModeEnum(Integer code, String value, String type) {
this.code = code;
this.value = value;
this.type = type;
}
public static List<String> getGenerateModeList(){
return Stream.of(TEXT,IMAGE,TEXT_IMAGE).map(GenerateModeEnum::getValue).collect(Collectors.toList());
}
}

View File

@@ -0,0 +1,56 @@
package com.ai.da.common.enums;
import lombok.Getter;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public enum LayersPriorityEnum {
EARRING_FRONT("earring_front","Earring",99),
BAG_FRONT("bag_front","Bag",98),
HAIRSTYLE_FRONT("hairstyle_front","Hairstyle",97),
OUTWEAR_FRONT("outwear_front","Outwear",20),
TOPS_FRONT("tops_front","Tops",19),
DRESS_FRONT("dress_front","Dress",18),
BLOUSE_FRONT("blouse_front","Blouse",17),
SKIRT_FRONT("skirt_front","Skirt",16),
TROUSERS_FRONT("trousers_front","Trousers",15),
BOTTOMS_FRONT("bottoms_front","Bottoms",14),
SHOES_RIGHT("shoes_right","Shoes",1),
SHOES_LEFT("shoes_left","Shoes",1),
BODY("body","Body",0),
BOTTOMS_BACK("bottoms_back","Bottoms",-14),
TROUSERS_BACK("trousers_back","Trousers",-15),
SKIRT_BACK("skirt_back","Skirt",-16),
BLOUSE_BACK("blouse_back","Blouse",-17),
DRESS_BACK("dress_back","Dress",-18),
TOPS_BACK("tops_back","Tops",-19),
OUTWEAR_BACK("outwear_back","Outwear",-20),
HAIRSTYLE_BACK("hairstyle_back","Hairstyle",-97),
BAG_BACK("bag_back","Bag",-98),
EARRING_BACK("earring_back","Earring",-99);
@Getter
private String realName;
@Getter
private String type;
@Getter
private Integer value;
LayersPriorityEnum(String realName, String type,Integer value) {
this.realName = realName;
this.type = type;
this.value = value;
}
public static LayersPriorityEnum getValueByType(String type){
return Stream.of(LayersPriorityEnum.values()).filter(l -> l.getType().equals(type)).findFirst().orElse(null);
}
public static LayersPriorityEnum getValueByLayerCategory(String layerCategory){
return Stream.of(LayersPriorityEnum.values()).filter(l -> l.getRealName().equals(layerCategory)).findFirst().orElse(null);
}
}

View File

@@ -27,7 +27,10 @@ public enum LibraryLevel1TypeEnum {
/** /**
* 模特 * 模特
*/ */
MODELS("Models"); MODELS("Models"),
DESIGN_ELEMENTS("DesignElements"),
BRAND_DNA("BrandDNA");
private String realName; private String realName;
@@ -39,8 +42,8 @@ public enum LibraryLevel1TypeEnum {
return realName; return realName;
} }
public static LibraryLevel1TypeEnum uploadOf(String realName){ public static LibraryLevel1TypeEnum uploadOf(String realName) {
return Stream.of(LibraryLevel1TypeEnum.values()) return Stream.of(LibraryLevel1TypeEnum.values())
.filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); .filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
} }
} }

View File

@@ -30,9 +30,10 @@ public enum LibraryTopTypeEnum {
public String getRealName() { public String getRealName() {
return realName; return realName;
} }
public static LibraryTopTypeEnum uploadOf(String realName){
public static LibraryTopTypeEnum uploadOf(String realName) {
return Stream.of(LibraryTopTypeEnum.values()) return Stream.of(LibraryTopTypeEnum.values())
.filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); .filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
} }
} }

View File

@@ -17,7 +17,7 @@ public enum LoginTypeEnum {
*/ */
PASSWORD; PASSWORD;
public static LoginTypeEnum of(String name){ public static LoginTypeEnum of(String name) {
return Stream.of(LoginTypeEnum.values()).filter(v ->v.name().equals(name)).findFirst().orElse(null); return Stream.of(LoginTypeEnum.values()).filter(v -> v.name().equals(name)).findFirst().orElse(null);
} }
} }

View File

@@ -0,0 +1,22 @@
package com.ai.da.common.enums;
import lombok.Getter;
@Getter
public enum ModelNameEnum {
/**
* 使用模型0
*/
MODEL_0("0", "model_0");
private String code;
private String modelName;
ModelNameEnum(String code, String modelName) {
this.code = code;
this.modelName = modelName;
}
}

View File

@@ -0,0 +1,29 @@
package com.ai.da.common.enums;
import lombok.Getter;
import java.util.stream.Stream;
@Getter
public enum MotionModeEnum {
POSE_TO_VIDEO(1, "/api/comfyui_image_pose_2_video"),
PROMPT_TO_VIDEO(2, "/api/comfyui_image_2_video"),
FIRST_LAST_FRAME_TO_VIDEO(3, "/api/comfyui_flf_2_video")
;
private int code;
private String url;
MotionModeEnum(int code, String url) {
this.code = code;
this.url = url;
}
public static MotionModeEnum of(int code) {
return Stream.of(MotionModeEnum.values()).filter(v -> v.getCode()== code).findFirst().orElse(null);
}
}

View File

@@ -1,31 +0,0 @@
package com.ai.da.common.enums;
import java.util.stream.Stream;
/**
* @author: yanglei
* @description: 操作类型 登入 忘记密码
* @create: 2022-8-10 17:33
**/
public enum OperationTypeEnum {
/**
*登入
*/
LOGIN,
/**
* 异常ip
*/
EXCEPTION_IP,
/**
* 绑定邮箱
*/
BIND_MAILBOX,
/**
* 忘记密码
*/
FORGET_PWD;
public static OperationTypeEnum of(String name){
return Stream.of(OperationTypeEnum.values()).filter(v ->v.name().equals(name)).findFirst().orElse(null);
}
}

View File

@@ -0,0 +1,50 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum OrderStatusEnum {
/**
* 未支付
*/
NOT_PAY("未支付"),
/**
* 支付成功
*/
SUCCESS("支付成功"),
/**
* 支付失败
*/
FAILURE("支付失败"),
/**
* 已关闭
*/
TIMEOUT_CLOSED("超时已关闭"),
/**
* 已取消
*/
CANCEL("用户已取消"),
/**
* 退款中
*/
REFUND_PROCESSING("退款中"),
/**
* 已退款
*/
REFUND_SUCCESS("已退款"),
/**
* 退款异常
*/
REFUND_ABNORMAL("退款异常"),
/**
* paypal订单状态为 APPROVED
*/
ORDER_PROCESSING("订单处理中");
/**
* 类型
*/
private final String type;
}

View File

@@ -6,5 +6,5 @@ package com.ai.da.common.enums;
* @create: 2020-01-14 17:33 * @create: 2020-01-14 17:33
**/ **/
public enum OrderType { public enum OrderType {
DESC,ASC; DESC, ASC;
} }

View File

@@ -0,0 +1,30 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum PayPalOrderStatusEnum {
// The order was created with the specified context.
// 订单已创建并具有指定的上下文。
CREATED("CREATED"),
// The order was saved and persisted. The order status continues to be in progress until a capture is made with final_capture = true for all purchase units within the order.
// 订单已保存并持久化。订单状态仍处于进行中,直到对订单中的所有购买单元进行了 final_capture = true 的捕获为止
SAVED("SAVED"),
// The customer approved the payment through the PayPal wallet or another form of guest or unbranded payment. For example, a card, bank account, or so on.
// 客户通过PayPal钱包或其他形式的游客或非品牌支付批准了付款。例如信用卡、银行账户等。
APPROVED("APPROVED"),
// All purchase units in the order are voided.
// 订单中的所有购买单元都已作废。
VOIDED("VOIDED"),
// The payment was authorized or the authorized payment was captured for the order.
// 订单的支付已被授权或已捕获授权的支付。
COMPLETED("COMPLETED"),
// The order requires an action from the payer (e.g. 3DS authentication). Redirect the payer to the "rel":"payer-action" HATEOAS link returned as part of the response prior to authorizing or capturing the order.
// 订单需要支付者执行某项操作例如3DS身份验证。在授权或捕获订单之前请将支付者重定向到响应中返回的"rel":"payer-action" HATEOAS链接。
PAYER_ACTION_REQUIRED("PAYER_ACTION_REQUIRED");
private final String status;
}

View File

@@ -0,0 +1,38 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum PayTypeEnum {
/**
* 微信
*/
WXPAY("微信"),
/**
* 支付宝
*/
ALIPAY("支付宝"),
/**
* PayPal
*/
PAYPAL("PayPal"),
/**
* 香港支付宝
*/
ALIPAY_HK("Alipay-HK"),
/**
* Stripe
*/
STRIPE("Stripe");
/**
* 类型
*/
private final String type;
}

View File

@@ -0,0 +1,81 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@AllArgsConstructor
@Getter
public enum PoseEnum {
// POSE_1(1, "aida-sys-image/pose/pose-1.mp4", "aida-sys-image/pose/pose-1.gif", "aida-sys-image/pose/pose-1-first_frame.jpeg", "AACT.8090e67b.-E3pujumEfCbDTI_rjSH-A.LwIlGT3j"),
POSE_1(1, "aida-sys-image/pose/pose-1-1.mp4", "aida-sys-image/pose/pose-1-1.gif", "aida-sys-image/pose/pose-1-first_frame.jpeg", "AACT.8090e67b.qNMWJlyKEfCuORaRJeW4dg.x3wUteVO"),
// POSE_2(2, "aida-sys-image/pose/pose-2.mp4", "aida-sys-image/pose/pose-2.gif", "aida-sys-image/pose/pose-2-first_frame.jpeg", "AACT.8090e67b.TwJLxEv3EfCbDTI_rjSH-A.IOQZCYhf"),
POSE_2(2, "aida-sys-image/pose/pose-2-1.mp4", "aida-sys-image/pose/pose-2-1.gif", "aida-sys-image/pose/pose-2-first_frame.jpeg", "AACT.8090e67b.QpaGOlyLEfCuuJo8eQGF2Q.62EiJj-6"),
// POSE_3(3, "aida-sys-image/pose/pose-3.mp4", "aida-sys-image/pose/pose-3.gif", "aida-sys-image/pose/pose-3-first_frame.jpeg", "AACT.8090e67b.gd3OCkv4EfCxyZo8eQGF2Q.qMm-a1XI"),
POSE_3(3, "aida-sys-image/pose/pose-3-1.mp4", "aida-sys-image/pose/pose-3-1.gif", "aida-sys-image/pose/pose-3-first_frame.jpeg", "AACT.8090e67b.2q5qjFyLEfCImjI_rjSH-A.5cFMwOvi"),
// POSE_4(4, "aida-sys-image/pose/pose-4.mp4", "aida-sys-image/pose/pose-4.gif", "aida-sys-image/pose/pose-4-first_frame.jpeg", "AACT.8090e67b.AUDnuEwDEfCEHBaRJeW4dg.rlx36xEY"),
POSE_4(4, "aida-sys-image/pose/pose-4-1.mp4", "aida-sys-image/pose/pose-4-1.gif", "aida-sys-image/pose/pose-4-first_frame.jpeg", "AACT.8090e67b.KoYMplyPEfCuORaRJeW4dg.MuuBTG78"),
// POSE_5(5, "aida-sys-image/pose/pose-5.mp4", "aida-sys-image/pose/pose-5.gif", "aida-sys-image/pose/pose-5-first_frame.jpeg", "AACT.8090e67b.G8BvkEwEEfCxyZo8eQGF2Q.fo4ryrgR"),
POSE_5(5, "aida-sys-image/pose/pose-5-1.mp4", "aida-sys-image/pose/pose-5-1.gif", "aida-sys-image/pose/pose-5-first_frame.jpeg", "AACT.8090e67b.x54FNFyPEfCuuJo8eQGF2Q.P1egmEZ_"),
// POSE_6(6, "aida-sys-image/pose/pose-6.mp4", "aida-sys-image/pose/pose-6.gif", "aida-sys-image/pose/pose-6-first_frame.jpeg", "AACT.8090e67b.yBIPnEwEEfCxyZo8eQGF2Q.boSFwTG9");
POSE_6(6, "aida-sys-image/pose/pose-6-1.mp4", "aida-sys-image/pose/pose-6-1.gif", "aida-sys-image/pose/pose-6-first_frame.jpeg", "AACT.8090e67b.QSCvBlyQEfCImjI_rjSH-A.G9-Z5ffW");
private final Integer id;
private final String videoPath;
private final String gifPath;
private final String firstFramePath;
private final String templateId;
private static final List<Map<String, String>> PROPERTY_LIST;
static {
PROPERTY_LIST = Arrays.stream(values())
.map(PoseEnum::toMap)
.collect(Collectors.toList());
}
private static final Map<Integer, PoseEnum> BY_ID = Arrays.stream(values())
.collect(Collectors.toMap(PoseEnum::getId, Function.identity()));
private static final Map<String, PoseEnum> BY_VIDEO_PATH = Arrays.stream(values())
.collect(Collectors.toMap(PoseEnum::getVideoPath, Function.identity()));
private static final List<String> VIDEO_PATH = Arrays.stream(values())
.map(PoseEnum::getVideoPath).collect(Collectors.toList());
public static PoseEnum getById(Integer id) {
return BY_ID.get(id);
}
public static PoseEnum getByVideoPath(String videoPath) {
return BY_VIDEO_PATH.get(videoPath);
}
private Map<String, String> toMap() {
Map<String, String> map = new HashMap<>();
map.put("id", String.valueOf(id));
map.put("gif", gifPath);
map.put("video", videoPath);
map.put("firstFrame", firstFramePath);
return map;
}
public static List<Map<String, String>> getPropertyList() {
return PROPERTY_LIST.stream()
.map(HashMap::new) // 深拷贝每个 Map
.collect(Collectors.toList());
}
public static List<String> getVideoList() {
return new ArrayList<>(VIDEO_PATH); // 返回副本以保证不可变性
}
}

View File

@@ -0,0 +1,33 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum ProductEnum {
// 积分购买
CreditsProduct("AiDA credits purchase", 10L, 50L),
// 年度订阅
AnnualSubscription("AiDA Annual Subscription", 5000L, 50000L),
// 月度订阅订阅费500每月3500 积分)
MonthlySubscription("AiDA Monthly Subscription", 500L, 3500L),
// 月度订阅 -- 经济实惠版 订阅费100每月500 积分)
Eco_MonthlySubscription("AiDA Eco Monthly Subscription", 100L, 500L),
// 季度订阅
QuarterlySubscription("AiDA Quarterly Subscription", 1500L, 12000L),
// 月度订阅 -- 教育版
EDUMonthlySubscription("AiDA Edu Monthly Subscription", 200L, 3500L),
// 测试
DailySubscription("AiDA Daily Subscription", 5L, 100L),
;
/**
* 类型
*/
private final String name;
private final Long price;
private final Long credits;
}

View File

@@ -4,7 +4,7 @@ import java.util.stream.Stream;
/** /**
* @author yanglei * @author yanglei
* @description python调用java 操作数类型 generatePrint ->生成印花 designCollection ->设计collection * @description python调用java 操作数类型 generatePrint ->生成印花 designCollection ->设计collection generateSketch->设计草图
* @create 2022-10-3 17:33 * @create 2022-10-3 17:33
**/ **/
public enum PythonToJavaApiOperationTypeEnum { public enum PythonToJavaApiOperationTypeEnum {
@@ -19,7 +19,12 @@ public enum PythonToJavaApiOperationTypeEnum {
/** /**
* 设计collection * 设计collection
*/ */
DESIGN_COLLECTION("designCollection"); DESIGN_COLLECTION("designCollection"),
/**
* 生成草图
*/
GENERATE_SKETCH("generateSketch");
private String realName; private String realName;
@@ -31,7 +36,7 @@ public enum PythonToJavaApiOperationTypeEnum {
return realName; return realName;
} }
public static PythonToJavaApiOperationTypeEnum uploadOf(String realName){ public static PythonToJavaApiOperationTypeEnum uploadOf(String realName) {
return Stream.of(PythonToJavaApiOperationTypeEnum.values()).filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); return Stream.of(PythonToJavaApiOperationTypeEnum.values()).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
} }
} }

View File

@@ -27,7 +27,7 @@ public enum SingleOverallEnum {
return realName; return realName;
} }
public static SingleOverallEnum of(String realName){ public static SingleOverallEnum of(String realName) {
return Stream.of(SingleOverallEnum.values()).filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); return Stream.of(SingleOverallEnum.values()).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
} }
} }

View File

@@ -28,6 +28,8 @@ public enum SwitchCategoryEnum {
* 裤子 * 裤子
*/ */
TROUSERS("Trousers"), TROUSERS("Trousers"),
TOPS("Tops"),
BOTTOMS("Bottoms"),
; ;
private String realName; private String realName;
@@ -40,7 +42,7 @@ public enum SwitchCategoryEnum {
return realName; return realName;
} }
public static SwitchCategoryEnum of(String realName){ public static SwitchCategoryEnum of(String realName) {
return Stream.of(SwitchCategoryEnum.values()).filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); return Stream.of(SwitchCategoryEnum.values()).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
} }
} }

View File

@@ -9,11 +9,11 @@ import java.util.stream.Stream;
**/ **/
public enum SysFileLevel1TypeEnum { public enum SysFileLevel1TypeEnum {
IMAGES("Images","images"), IMAGES("Images", "images"),
ICON_C("Iconc","iconc"), ICON_C("Iconc", "iconc"),
ACCESSORIES("Accessories","accessories"); ACCESSORIES("Accessories", "accessories");
private String realName; private String realName;
/** /**
@@ -34,7 +34,7 @@ public enum SysFileLevel1TypeEnum {
return uploadPathName; return uploadPathName;
} }
public static SysFileLevel1TypeEnum uploadOf(String uploadPathName){ public static SysFileLevel1TypeEnum uploadOf(String uploadPathName) {
return Stream.of(SysFileLevel1TypeEnum.values()).filter(v ->v.getUploadPathName().equals(uploadPathName)).findFirst().orElse(null); return Stream.of(SysFileLevel1TypeEnum.values()).filter(v -> v.getUploadPathName().equals(uploadPathName)).findFirst().orElse(null);
} }
} }

View File

@@ -1,5 +1,6 @@
package com.ai.da.common.enums; package com.ai.da.common.enums;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@@ -13,27 +14,27 @@ public enum SysFileLevel2TypeEnum {
/** /**
* ICON * ICON
*/ */
ICON("Icon","icon"), ICON("Icon", "icon"),
BAG("Bag","bag"), BAG("Bag", "bag"),
EARRINGS("Earring","earring"), EARRINGS("Earring", "earring"),
HAIRSTYLE("Hairstyle","hairstyle"), HAIRSTYLE("Hairstyle", "hairstyle"),
SHOES("Shoes","shoes"), SHOES("Shoes", "shoes"),
BODY("Body","body"), BODY("Body", "body"),
BLOUSE("Blouse","blouse"), BLOUSE("Blouse", "blouse"),
DRESS("Dress","dress"), DRESS("Dress", "dress"),
OUTWEAR("Outwear","outwear"), OUTWEAR("Outwear", "outwear"),
SKIRT("Skirt","skirt"), SKIRT("Skirt", "skirt"),
TROUSERS("Trousers","trousers"); TROUSERS("Trousers", "trousers");
private String realName; private String realName;
/** /**
@@ -54,20 +55,40 @@ public enum SysFileLevel2TypeEnum {
return uploadPathName; return uploadPathName;
} }
public static SysFileLevel2TypeEnum uploadOf(String uploadPathName){ public static SysFileLevel2TypeEnum uploadOf(String uploadPathName) {
return Stream.of(SysFileLevel2TypeEnum.values()).filter(v ->v.getUploadPathName().equals(uploadPathName)).findFirst().orElse(null); return Stream.of(SysFileLevel2TypeEnum.values()).filter(v -> v.getUploadPathName().equals(uploadPathName)).findFirst().orElse(null);
}
public static SysFileLevel2TypeEnum realNameOf(String realName){
return Stream.of(SysFileLevel2TypeEnum.values()).filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null);
} }
public static SysFileLevel2TypeEnum realNameOfPython(String realName){ public static SysFileLevel2TypeEnum realNameOf(String realName) {
return Stream.of(BLOUSE,DRESS,OUTWEAR,SKIRT,TROUSERS).filter(v ->v.getRealName().equals(realName)).findFirst().orElse(null); return Stream.of(SysFileLevel2TypeEnum.values()).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
} }
public static List<String> ofPython(){
return Stream.of(BLOUSE,DRESS,OUTWEAR,SKIRT,TROUSERS).map(SysFileLevel2TypeEnum::getRealName).collect(Collectors.toList()); public static SysFileLevel2TypeEnum realNameOfPython(String realName) {
return Stream.of(BLOUSE, DRESS, OUTWEAR, SKIRT, TROUSERS).filter(v -> v.getRealName().equals(realName)).findFirst().orElse(null);
} }
public static List<String> ofPythonPath(){
return Stream.of(BLOUSE,DRESS,OUTWEAR,SKIRT,TROUSERS).map(SysFileLevel2TypeEnum::getUploadPathName).collect(Collectors.toList()); public static List<String> ofPython() {
return Stream.of(BLOUSE, DRESS, OUTWEAR, SKIRT, TROUSERS).map(SysFileLevel2TypeEnum::getRealName).collect(Collectors.toList());
} }
public static List<String> ofPythonPath() {
return Stream.of(BLOUSE, DRESS, OUTWEAR, SKIRT, TROUSERS).map(SysFileLevel2TypeEnum::getUploadPathName).collect(Collectors.toList());
}
public static final List<String> ACCESSORIES_LIST = Arrays.asList(
SysFileLevel2TypeEnum.BAG.getRealName(),
SysFileLevel2TypeEnum.EARRINGS.getRealName(),
SysFileLevel2TypeEnum.HAIRSTYLE.getRealName(),
SysFileLevel2TypeEnum.SHOES.getRealName(),
SysFileLevel2TypeEnum.BODY.getRealName()
);
public static final List<String> IMAGES_LIST = Arrays.asList(
SysFileLevel2TypeEnum.BLOUSE.getRealName(),
SysFileLevel2TypeEnum.DRESS.getRealName(),
SysFileLevel2TypeEnum.OUTWEAR.getRealName(),
SysFileLevel2TypeEnum.SKIRT.getRealName(),
SysFileLevel2TypeEnum.TROUSERS.getRealName()
);
} }

View File

@@ -0,0 +1,32 @@
package com.ai.da.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum WangXiangTaskStatusEnum {
SUCCEEDED("SUCCEEDED"),
UNKNOWN_W("UNKNOWN"),
FAILED("FAILED"),
RUNNING("RUNNING"),
PENDING_W("PENDING");
private final String name;
// 通过name查找枚举的静态方法
public static WangXiangTaskStatusEnum fromName(String name) {
for (WangXiangTaskStatusEnum status : values()) {
if (status.name.equalsIgnoreCase(name)) {
return status;
}
}
// 或者返回默认值
return UNKNOWN_W;
}
}

View File

@@ -16,23 +16,24 @@ public class TokenQuery {
private static final String GENERATE_USER_DOMAIN = "https://www.szsige.com"; private static final String GENERATE_USER_DOMAIN = "https://www.szsige.com";
public static JSONObject getToken(String session) { public static JSONObject getToken(String session) {
String url = GET_TOKEN_DOMAIN + TokenApis.GET_TOKEN.getUrl()+ session; String url = GET_TOKEN_DOMAIN + TokenApis.GET_TOKEN.getUrl() + session;
log.info("获取用户token接口请求url:" + url); log.info("获取用户token接口请求url:" + url);
HttpResponse httpResponse = HttpUtil.createPost(url).execute(); HttpResponse httpResponse = HttpUtil.createPost(url).execute();
log.info("获取用户token接口响应" + httpResponse); log.info("获取用户token接口响应" + httpResponse);
if(httpResponse.isOk() && StrUtil.isNotEmpty(httpResponse.body())){ if (httpResponse.isOk() && StrUtil.isNotEmpty(httpResponse.body())) {
return JSONObject.parseObject(httpResponse.body()); return JSONObject.parseObject(httpResponse.body());
} }
return null; return null;
} }
public static JSONObject generateUser(Map<String, Object> param,String token) {
public static JSONObject generateUser(Map<String, Object> param, String token) {
HttpResponse httpResponse = HttpUtil.createPost(GENERATE_USER_DOMAIN + TokenApis.GENERATE_USER.getUrl()) HttpResponse httpResponse = HttpUtil.createPost(GENERATE_USER_DOMAIN + TokenApis.GENERATE_USER.getUrl())
.body(JSONObject.toJSONString(param!=null?param:new HashMap<>())) .body(JSONObject.toJSONString(param != null ? param : new HashMap<>()))
.header("Authorization", "Bearer "+token) .header("Authorization", "Bearer " + token)
.header("X-Promiss", "9672233956") .header("X-Promiss", "9672233956")
.execute(); .execute();
log.info("生成用户信息接口响应:" + httpResponse); log.info("生成用户信息接口响应:" + httpResponse);
if(httpResponse.isOk() && StrUtil.isNotEmpty(httpResponse.body())){ if (httpResponse.isOk() && StrUtil.isNotEmpty(httpResponse.body())) {
return JSONObject.parseObject(httpResponse.body()); return JSONObject.parseObject(httpResponse.body());
} }
return null; return null;

View File

@@ -1,8 +1,7 @@
package com.ai.da.common.response; package com.ai.da.common.response;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@@ -16,21 +15,20 @@ import java.util.List;
*/ */
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@ApiModel("分页响应结果") @Schema(description = "分页响应结果")
public class PageBaseResponse<T>{ public class PageBaseResponse<T> {
@ApiModelProperty("页码") @Schema(description = "页码")
private long page; private long page;
@ApiModelProperty("每页数量") @Schema(description = "每页数量")
private long size; private long size;
@ApiModelProperty("总页数") @Schema(description = "总页数")
private long pages; private long pages;
@ApiModelProperty("总条数") @Schema(description = "总条数")
private long total; private long total;
@ApiModelProperty("结果集") @Schema(description = "结果集")
private List<T> content; private List<T> content;
public PageBaseResponse(List<T> list, long page, long size, long total, long pages) { public PageBaseResponse(List<T> list, long page, long size, long total, long pages) {
this.page = page; this.page = page;
this.size = size; this.size = size;
@@ -39,7 +37,7 @@ public class PageBaseResponse<T>{
this.content = list; this.content = list;
} }
public static <T> PageBaseResponse<T> success(IPage<T> page){ public static <T> PageBaseResponse<T> success(IPage<T> page) {
return new PageBaseResponse<>(page.getRecords() , page.getCurrent(), page.getSize(), page.getTotal(), page.getPages()); return new PageBaseResponse<>(page.getRecords(), page.getCurrent(), page.getSize(), page.getTotal(), page.getPages());
} }
} }

View File

@@ -1,8 +1,7 @@
package com.ai.da.common.response; package com.ai.da.common.response;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@@ -16,24 +15,23 @@ import java.util.List;
*/ */
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@ApiModel("分页响应结果") @Schema(description = "分页响应结果")
public class PageResponse<T> extends Response<List<T>> { public class PageResponse<T> extends Response<List<T>> {
@ApiModelProperty("页码") @Schema(description = "页码")
private long page; private long page;
@ApiModelProperty("每页数量") @Schema(description = "每页数量")
private long size; private long size;
@ApiModelProperty("总页数") @Schema(description = "总页数")
private long pages; private long pages;
@ApiModelProperty("总条数") @Schema(description = "总条数")
private long total; private long total;
@ApiModelProperty("结果集") @Schema(description = "结果集")
private List<T> content; private List<T> content;
public PageResponse(Response<List<T>> response, long page, long size, long total, long pages) { public PageResponse(Response<List<T>> response, long page, long size, long total, long pages) {
if(response != null) { if (response != null) {
this.setData(response.getData()); this.setData(response.getData());
this.setErrCode(response.getErrCode()); this.setErrCode(response.getErrCode());
this.setErrMsg(response.getErrMsg()); this.setErrMsg(response.getErrMsg());
@@ -45,8 +43,8 @@ public class PageResponse<T> extends Response<List<T>> {
this.content = response.getData(); this.content = response.getData();
} }
public static <T> PageResponse<T> success(IPage<T> page){ public static <T> PageResponse<T> success(IPage<T> page) {
Response<List<T>> response = success(page.getRecords()); Response<List<T>> response = success(page.getRecords());
return new PageResponse<>(response , page.getCurrent(), page.getSize(), page.getTotal(), page.getPages()); return new PageResponse<>(response, page.getCurrent(), page.getSize(), page.getTotal(), page.getPages());
} }
} }

View File

@@ -1,7 +1,6 @@
package com.ai.da.common.response; package com.ai.da.common.response;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@@ -17,38 +16,37 @@ import java.io.Serializable;
@Data @Data
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@ApiModel("响应结果") @Schema(description = "响应结果")
public class Response<T> implements Serializable { public class Response<T> implements Serializable {
@ApiModelProperty("响应状态码 0成功 -1失败") @Schema(description = "响应状态码 0成功 -1失败")
private int errCode; private int errCode;
@ApiModelProperty("提示消息") @Schema(description = "提示消息")
private String errMsg; private String errMsg;
@ApiModelProperty("数据结果") @Schema(description = "数据结果")
private T data; private T data;
public static <T> Response<T> success(){ public static <T> Response<T> success() {
return success(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg(), null); return success(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg(), null);
} }
public static <T> Response<T> success(String msg){ // public static <T> Response<T> success(String msg) {
return success(ResultEnum.SUCCESS.getCode(), msg, null); // return success(ResultEnum.SUCCESS.getCode(), msg, null);
} // }
public static <T> Response<T> success(T data){ public static <T> Response<T> success(T data) {
return success(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg(), data); return success(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg(), data);
} }
public static <T> Response<T> success(int code, T data){ public static <T> Response<T> success(int code, T data) {
return success(code, ResultEnum.SUCCESS.getMsg(), data); return success(code, ResultEnum.SUCCESS.getMsg(), data);
} }
public static <T> Response<T> success(int code, String msg, T data){ public static <T> Response<T> success(int code, String msg, T data) {
return getResponse(code, msg, data); return getResponse(code, msg, data);
} }
public static <T> Response<T> fail(String msg) { public static <T> Response<T> fail(String msg) {
return fail(ResultEnum.FAIL.getCode(), msg); return fail(ResultEnum.FAIL.getCode(), msg);
} }
@@ -85,7 +83,7 @@ public class Response<T> implements Serializable {
return getResponse(code, msg, data); return getResponse(code, msg, data);
} }
private static <T> Response<T> getResponse(int code, String msg, T data){ private static <T> Response<T> getResponse(int code, String msg, T data) {
return new Response<>(code, msg, data); return new Response<>(code, msg, data);
} }

View File

@@ -13,17 +13,20 @@ public enum ResultEnum {
ERROR(false, -1, "system error!"), ERROR(false, -1, "system error!"),
PARAMETER_ERROR(false, -2, "parameter error!"), PARAMETER_ERROR(false, -2, "parameter error!"),
NO_LOGIN(false,-100,"User not logged in"), NO_LOGIN(false, -100, "User not logged in"),
NO_PERMISSION(false,-200,"No access"), NO_PERMISSION(false, -200, "No access"),
ACCOUNT_LOCK(false,-300,"Account frozen"); ACCOUNT_LOCK(false, -300, "Account frozen"),
PROMPT(false, 1, "Prompt"),
WARNING(false, 2, "Warning"),
;
private int code; private int code;
private String msg; private String msg;
private boolean isOK; private boolean isOK;
ResultEnum(boolean isOK, int code, String msg) {
ResultEnum(boolean isOK, int code, String msg){
this.isOK = isOK; this.isOK = isOK;
this.code = code; this.code = code;
this.msg = msg; this.msg = msg;

View File

@@ -0,0 +1,15 @@
package com.ai.da.common.response;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
@Data
@NoArgsConstructor
@Schema(description = "交易记录分页响应结果")
public class TransactionPageResponse<T> extends PageBaseResponse<T> {
private BigDecimal totalAmount;
}

View File

@@ -7,8 +7,8 @@ import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
/** /**

View File

@@ -7,9 +7,9 @@ import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.servlet.ServletException; import jakarta.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
/** /**

View File

@@ -5,7 +5,7 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.AuthenticationException;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import jakarta.annotation.Resource;
/** /**
* @author: dangweijian * @author: dangweijian

View File

@@ -10,9 +10,9 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.servlet.ServletException; import jakarta.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
/** /**
@@ -43,6 +43,6 @@ public class UserLoginFailureHandler implements AuthenticationFailureHandler {
log.error("登录失败:", e); log.error("登录失败:", e);
response = Response.fail("登录失败!"); response = Response.fail("登录失败!");
} }
JSONResponseUtils.build(httpServletResponse,response); JSONResponseUtils.build(httpServletResponse, response);
} }
} }

View File

@@ -8,10 +8,10 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import jakarta.annotation.Resource;
import javax.servlet.ServletException; import jakarta.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
/** /**

View File

@@ -5,23 +5,28 @@ import com.ai.da.common.security.filter.AuthenticationFilter;
import com.ai.da.common.security.filter.UserAuthenticationProcessingFilter; import com.ai.da.common.security.filter.UserAuthenticationProcessingFilter;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler; import org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import javax.annotation.Resource; import jakarta.annotation.Resource;
@Configuration
@EnableWebSecurity @EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true) @EnableMethodSecurity(prePostEnabled = true)
@EnableConfigurationProperties(SecurityProperties.class) @EnableConfigurationProperties(SecurityProperties.class)
public class SecurityConfig extends WebSecurityConfigurerAdapter { public class SecurityConfig {
@Resource @Resource
private SecurityProperties securityProperties; private SecurityProperties securityProperties;
@@ -46,33 +51,51 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Resource @Resource
private UserPermissionEvaluator userPermissionEvaluator; private UserPermissionEvaluator userPermissionEvaluator;
@Bean
@Override public AuthenticationManager authenticationManager() throws Exception {
public AuthenticationManager authenticationManagerBean() throws Exception {
return this.userAuthenticationManager; return this.userAuthenticationManager;
} }
@Override @Bean
protected void configure(HttpSecurity httpSecurity/*, WebSecurity web*/) throws Exception { public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
// web.ignoring().antMatchers("/test/**");//禁止所有过滤器 httpSecurity
httpSecurity.cors().disable()//禁用 CSRF .cors(Customizer.withDefaults())
.authorizeRequests()//认证请求 .authorizeHttpRequests(auth -> auth
.antMatchers(securityProperties.getIgnorePaths()).permitAll()//忽略的请求 .requestMatchers(
.anyRequest().authenticated()//其余所有的请求都需要认证 new AntPathRequestMatcher("/doc.html"),
.and().headers().frameOptions().disable()// 防止iframe 造成跨域 new AntPathRequestMatcher("/swagger-ui.html"),
.and().exceptionHandling().authenticationEntryPoint(userAuthenticationEntryPointHandler)//未登录请求处理 new AntPathRequestMatcher("/swagger-ui/**"),
.accessDeniedHandler(userAuthAccessDeniedHandler)//无权限访问处理类 (此配置可以忽略全局异常会先于Security框架处理异常全局异常已特殊处理) new AntPathRequestMatcher("/swagger-resources/**"),
.and().formLogin().loginProcessingUrl(securityProperties.getAuthApi())//指定认证接口 new AntPathRequestMatcher("/v2/api-docs"),
.successHandler(userLoginSuccessHandler)//登录成功处理器 new AntPathRequestMatcher("/v3/api-docs/**"),
.failureHandler(userLoginFailureHandler)//登录失败处理器 new AntPathRequestMatcher("/webjars/**")
.and().cors().and().csrf().disable();//允许跨域 ).permitAll()
.requestMatchers(securityProperties.getIgnorePaths()).permitAll()
.anyRequest().authenticated()
)
.headers(headers -> headers
.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)
.cacheControl(cache -> cache.disable())
)
.exceptionHandling(exception -> exception
.authenticationEntryPoint(userAuthenticationEntryPointHandler)
.accessDeniedHandler(userAuthAccessDeniedHandler)
)
.formLogin(form -> form
.loginProcessingUrl(securityProperties.getAuthApi())
.successHandler(userLoginSuccessHandler)
.failureHandler(userLoginFailureHandler)
)
.csrf(AbstractHttpConfigurer::disable)
.sessionManagement(session -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
);
//自定义过滤器在登录时认证用户名、密码 //自定义过滤器在登录时认证用户名、密码
httpSecurity.addFilterAt(userAuthenticationProcessingFilter, UsernamePasswordAuthenticationFilter.class) httpSecurity.addFilterAt(userAuthenticationProcessingFilter, UsernamePasswordAuthenticationFilter.class)
.addFilterBefore(authenticationFilter, BasicAuthenticationFilter.class); .addFilterBefore(authenticationFilter, BasicAuthenticationFilter.class);
//不创建session会话
httpSecurity.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); return httpSecurity.build();
//取消头缓存控制
httpSecurity.headers().cacheControl();
} }
@Bean @Bean

View File

@@ -1,34 +1,30 @@
package com.ai.da.common.security.filter; package com.ai.da.common.security.filter;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.ai.da.common.config.exception.TokenMissingOrExpiredException;
import com.ai.da.common.context.UserContext; import com.ai.da.common.context.UserContext;
import com.ai.da.common.security.config.SecurityProperties; import com.ai.da.common.security.config.SecurityProperties;
import com.ai.da.common.security.jwt.JWTTokenHelper; import com.ai.da.common.security.jwt.JWTTokenHelper;
import com.ai.da.common.utils.LocalCacheUtils; import com.ai.da.common.utils.LocalCacheUtils;
import com.ai.da.common.utils.RedisUtil;
import com.ai.da.common.utils.MultiReadHttpServletRequest; import com.ai.da.common.utils.MultiReadHttpServletRequest;
import com.ai.da.common.utils.MultiReadHttpServletResponse; import com.ai.da.common.utils.MultiReadHttpServletResponse;
import com.ai.da.common.utils.RequestInfoUtil;
import com.ai.da.model.vo.AuthPrincipalVo; import com.ai.da.model.vo.AuthPrincipalVo;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.lang.NonNull; import org.springframework.lang.NonNull;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.util.StopWatch; import org.springframework.util.StopWatch;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.filter.OncePerRequestFilter;
import javax.annotation.Resource; import jakarta.annotation.Resource;
import javax.security.sasl.AuthenticationException; import jakarta.servlet.FilterChain;
import javax.servlet.FilterChain; import jakarta.servlet.ServletException;
import javax.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.sql.Statement;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@@ -45,31 +41,55 @@ public class AuthenticationFilter extends OncePerRequestFilter {
private JWTTokenHelper jwtTokenHelper; private JWTTokenHelper jwtTokenHelper;
@Resource @Resource
private SecurityProperties properties; private SecurityProperties properties;
@Resource
private RedisUtil redisUtil;
private static final List<String> FILTER_URL = private static final List<String> FILTER_URL =
Arrays.asList("/favicon.ico","/doc.html","api/account/login","api/account/preLogin","api/account/sendEmail", Arrays.asList("/favicon.ico", "/doc.html", "/swagger-ui.html",
"/webjars/","/swagger-resources","/v2/api-docs","api/account/resetPwd", "/swagger-resources", "/swagger-resources/", "/swagger-resources/configuration/ui", "/swagger-resources/configuration/security",
"/webjars/", "/v2/api-docs", "/v3/api-docs", "/v3/api-docs/swagger-config",
"/api/account/login", "/api/account/preLogin", "api/account/sendEmail","api/account/noLoginRequired",
"/api/account/resetPwd",
"/api/python/saveGeneratePicture", "/api/python/getLibraryByUserId", "/api/python/saveGeneratePicture", "/api/python/getLibraryByUserId",
"/api/third/party/addUser","/api/third/party/editUser","/api/element/initDefaultSysFile"); "/api/third/party/addUser","/api/third/party/addTrialUser", "/api/third/party/editUser", "/api/element/initDefaultSysFile",
"/api/third/party/addNoLoginRequiredNew","/api/third/party/deleteNoLoginRequiredNew","/api/third/party/updateNoLoginRequiredNew",
"/api/third/party/existNoLoginRequired","/api/third/party/getRedirectUrl",
"/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify","/api/paypal/ipn/back","/api/alipay-hk/trade/notify",
"/api/portfolio/page", "/api/portfolio/detail", "/api/portfolio/commentPage", "/api/portfolio/viewsIncrease",
"/api/account/designWorksRegister","/api/account/questionnaire","/api/stripe/trade/notify",
"/notification","/api/account/activateNewEmail","/api/third/party/auth/google_callback","/api/third/party/parseGoogleCredential","/api/third/party/receiveDesignResults","/api/third/party/parseWeChatCode","/api/third/party/receiveDesignParams"
, "/api/account/schoolLogin", "/api/account/enterpriseLogin", "/api/account/organizationNameSearch",
"/api/llm/stream",
//GlobalAwardController
"/api/global-award/uploads/pdf/init", "/api/global-award/uploads/pdf/chunk", "/api/global-award/uploads/pdf/complete", "/api/global-award/uploads/pdf/status",
"/api/global-award/uploads/video/init", "/api/global-award/uploads/video/chunk", "/api/global-award/uploads/video/complete", "/api/global-award/uploads/video/status",
"/api/global-award/contestants/save", "/api/global-award/contestants/by-email", "/api/global-award/checkEmail", "/api/global-award/checkCode","/api/global-award/contestants/export",
"/api/global-award/contestants/export/files"
);
@Override @Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, @NonNull HttpServletResponse httpServletResponse, @NonNull FilterChain filterChain) throws ServletException, IOException { protected void doFilterInternal(HttpServletRequest httpServletRequest, @NonNull HttpServletResponse httpServletResponse, @NonNull FilterChain filterChain) throws ServletException, IOException {
String requestURI = httpServletRequest.getRequestURI(); String requestURI = httpServletRequest.getRequestURI();
if(calculateUrl(requestURI)){ if (calculateUrl(requestURI)/* || hasAuthorizationToken(httpServletRequest)*/) {
StopWatch stopWatch = new StopWatch(); StopWatch stopWatch = new StopWatch();
HttpServletRequest wrappedRequest = httpServletRequest; HttpServletRequest wrappedRequest = httpServletRequest;
HttpServletResponse wrappedResponse = httpServletResponse; HttpServletResponse wrappedResponse = httpServletResponse;
try{ try {
stopWatch.start(); stopWatch.start();
if ((httpServletRequest.getContentType() == null && httpServletRequest.getContentLength() > 0) || (httpServletRequest.getContentType() != null && !httpServletRequest.getContentType().contains("application/json"))) { if ((httpServletRequest.getContentType() == null && httpServletRequest.getContentLength() > 0) || (httpServletRequest.getContentType() != null && !httpServletRequest.getContentType().contains("application/json"))) {
extracted(wrappedRequest); extracted(wrappedRequest);
filterChain.doFilter(wrappedRequest, wrappedResponse); filterChain.doFilter(wrappedRequest, wrappedResponse);
}else { } else {
wrappedRequest = new MultiReadHttpServletRequest(httpServletRequest); wrappedRequest = new MultiReadHttpServletRequest(httpServletRequest);
wrappedResponse = new MultiReadHttpServletResponse(httpServletResponse); wrappedResponse = new MultiReadHttpServletResponse(httpServletResponse);
extracted(wrappedRequest); extracted(wrappedRequest);
filterChain.doFilter(wrappedRequest, wrappedResponse); // excel导出使用原始response,不对响应做包装
if (requestURI.equals("/api/account/exportAccountsToExcel")) {
filterChain.doFilter(httpServletRequest, httpServletResponse); // 不包装
} else {
filterChain.doFilter(wrappedRequest, wrappedResponse);
}
} }
} catch (Exception e) { } catch (Exception e) {
SecurityContextHolder.clearContext(); SecurityContextHolder.clearContext();
@@ -77,43 +97,66 @@ public class AuthenticationFilter extends OncePerRequestFilter {
} finally { } finally {
stopWatch.stop(); stopWatch.stop();
} }
}else { } else {
//先清空当前线程变量,防止上一个线程遗留
UserContext.delete();
filterChain.doFilter(httpServletRequest, httpServletResponse); filterChain.doFilter(httpServletRequest, httpServletResponse);
} }
} }
private Boolean calculateUrl(String requestURI ){
String filterUrl = FILTER_URL.stream().filter(url ->requestURI.contains(url)).findFirst().orElse(null); private Boolean calculateUrl(String requestURI) {
return null == filterUrl ? Boolean.TRUE :Boolean.FALSE; String filterUrl = FILTER_URL.stream().filter(url -> requestURI.contains(url)).findFirst().orElse(null);
return null == filterUrl ? Boolean.TRUE : Boolean.FALSE;
} }
private void extracted(HttpServletRequest request) throws AuthenticationException {
private boolean hasAuthorizationToken(HttpServletRequest request) {
String authorizationHeader = request.getHeader("Authorization");
return authorizationHeader != null && authorizationHeader.startsWith("Bearer");
}
private void extracted(HttpServletRequest request) {
String jwtToken = request.getHeader(properties.getJwtTokenHeader()); String jwtToken = request.getHeader(properties.getJwtTokenHeader());
log.debug("后台检查令牌:{}", jwtToken); // log.debug("后台检查令牌:{}", jwtToken);
if (StrUtil.isBlank(jwtToken)) { if (StrUtil.isBlank(jwtToken)) {
throw new RuntimeException("请传入token"); String ipAddress = RequestInfoUtil.getIpAddress(request);
log.info("本次请求的ip为 " + ipAddress);
// throw new RuntimeException("请传入token");
throw new TokenMissingOrExpiredException("请传入token");
}
if(jwtToken.equals("Bearer-eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiIyIiwic3ViIjoie1wiaWRcIjoyLFwidXNlcm5hbWVcIjpcImxpcnNcIn0iLCJpYXQiOjE2NjU3NDEwODcsImlzcyI6IkRXSiIsImF1dGhvcml0aWVzIjoiW10iLCJleHAiOjE2NzQzODEwODd9.ShM9R_NNFD7oo1OvxrEgg7PFeWinOuAKkuInUCMQupp66s64Hhv8tN0Wwr83nIN4rHPqtn95wmd4msWcvaFYJA")){
//写死 暂时放行
return;
} }
// 检查token // 检查token
boolean validate = jwtTokenHelper.validateToken(jwtToken); boolean validate = jwtTokenHelper.validateToken(jwtToken);
if(validate){ if (validate) {
AuthPrincipalVo principal = jwtTokenHelper.parserToUser(jwtToken); AuthPrincipalVo principal = jwtTokenHelper.parserToUser(jwtToken);
if (principal == null) { if (principal == null) {
throw new RuntimeException("TOKEN已过期请重新登录"); // throw new RuntimeException("TOKEN已过期请重新登录");
throw new TokenMissingOrExpiredException("TOKEN已过期请重新登录(token without userInfo)");
} }
//先清空当前线程变量,防止上一个线程遗留 //先清空当前线程变量,防止上一个线程遗留
UserContext.delete(); UserContext.delete();
//存取用户信息到缓存 //存取用户信息到缓存
UserContext.setUserHolder(principal); UserContext.setUserHolder(principal);
//校验token // 校验 token:先查本地缓存,再查 Redis保证服务重启后仍然有效
String cacheToken = LocalCacheUtils.getTokenCache(String.valueOf(principal.getId())); String userIdStr = String.valueOf(principal.getId());
if(jwtToken.equals("Bearer-eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiIyIiwic3ViIjoie1wiaWRcIjoyLFwidXNlcm5hbWVcIjpcImxpcnNcIn0iLCJpYXQiOjE2NjU3NDEwODcsImlzcyI6IkRXSiIsImF1dGhvcml0aWVzIjoiW10iLCJleHAiOjE2NzQzODEwODd9.ShM9R_NNFD7oo1OvxrEgg7PFeWinOuAKkuInUCMQupp66s64Hhv8tN0Wwr83nIN4rHPqtn95wmd4msWcvaFYJA")){ String cacheToken = LocalCacheUtils.getTokenCache(userIdStr);
//写死 暂时放行
return; if (StringUtils.isEmpty(cacheToken)) {
} // 本地缓存为空时,尝试从 Redis 读取
if(StringUtils.isEmpty(cacheToken)){ cacheToken = redisUtil.getLoginToken(principal.getId());
throw new RuntimeException("TOKEN已过期请重新登录"); if (StringUtils.isEmpty(cacheToken)) {
// throw new RuntimeException("TOKEN已过期请重新登录");
throw new TokenMissingOrExpiredException("TOKEN已过期请重新登录(cache & redis empty)");
}
// 将 Redis 中的 token 回填到本地缓存,减少后续 Redis 访问
LocalCacheUtils.setTokenCache(userIdStr, cacheToken);
} }
if(!cacheToken.equals(jwtToken) ){ if(!cacheToken.equals(jwtToken) ){
throw new RuntimeException("TOKEN已过期请重新登录"); // throw new RuntimeException("TOKEN已过期请重新登录");
throw new TokenMissingOrExpiredException("TOKEN已过期请重新登录(token not match local cache)");
} }
// UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(null, null); // UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(null, null);
// SecurityContextHolder.getContext().setAuthentication(authentication); // SecurityContextHolder.getContext().setAuthentication(authentication);

View File

@@ -18,8 +18,8 @@ import org.springframework.security.web.authentication.AbstractAuthenticationPro
import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
/** /**
* @author: dangweijian * @author: dangweijian

View File

@@ -2,17 +2,21 @@ package com.ai.da.common.security.jwt;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.DigestUtil;
import com.ai.da.common.constant.CommonConstant;
import com.ai.da.common.security.config.SecurityProperties; import com.ai.da.common.security.config.SecurityProperties;
import com.ai.da.model.vo.AuthPrincipalVo; import com.ai.da.model.vo.AuthPrincipalVo;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import io.jsonwebtoken.Claims; import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import jakarta.annotation.Resource;
import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
@@ -30,39 +34,75 @@ public class JWTTokenHelper {
private static final String ISSUER = "DWJ"; private static final String ISSUER = "DWJ";
private static final String AUTHORITIES = "authorities"; private static final String AUTHORITIES = "authorities";
private static final String CHANGE_MAILBOX = "changeMailbox";
public String createToken(AuthPrincipalVo principal){ public String createToken(AuthPrincipalVo principal) {
SecretKey key = buildSigningKey();
String token = Jwts.builder() String token = Jwts.builder()
.setId(String.valueOf(principal.getId())) .id(String.valueOf(principal.getId()))
.setSubject(JSONObject.toJSONString(principal)) .subject(JSONObject.toJSONString(principal))
.setIssuedAt(new Date()) .issuedAt(new Date())
.setIssuer(ISSUER) .issuer(ISSUER)
.claim(AUTHORITIES, JSON.toJSONString(new ArrayList<>()))//自定义属性 权限 .claim(AUTHORITIES, JSON.toJSONString(new ArrayList<>()))//自定义属性 权限
.setExpiration(new Date(System.currentTimeMillis() + securityProperties.getJwtExpiration())) .expiration(new Date(System.currentTimeMillis() + securityProperties.getJwtExpiration()))
.signWith(SignatureAlgorithm.HS512, securityProperties.getJwtSecret()) .signWith(key)
.compact(); .compact();
token = securityProperties.getJwtTokenPrefix() + token; token = securityProperties.getJwtTokenPrefix() + token;
return token; return token;
} }
public boolean validateToken(String token){ public boolean validateToken(String token) {
Claims claims = parser(token); Claims claims = parser(token);
if (MapUtil.isEmpty(claims)){ if (MapUtil.isEmpty(claims)) {
return false; return false;
} }
return true; return true;
} }
public AuthPrincipalVo parserToUser(String token){ public AuthPrincipalVo parserToUser(String token) {
String subject = parser(token).getSubject(); String subject = parser(token).getSubject();
if(StrUtil.isNotEmpty(subject)){ if (StrUtil.isNotEmpty(subject)) {
return JSONObject.parseObject(subject, AuthPrincipalVo.class); return JSONObject.parseObject(subject, AuthPrincipalVo.class);
} }
return null; return null;
} }
public Claims parser(String token) { public Claims parser(String token) {
token = token.replaceAll(securityProperties.getJwtTokenPrefix(),""); token = token.replaceAll(securityProperties.getJwtTokenPrefix(), "");
return Jwts.parser().setSigningKey(securityProperties.getJwtSecret()).parseClaimsJws(token).getBody(); SecretKey key = buildSigningKey();
return Jwts.parser()
.verifyWith(key)
.build()
.parseSignedClaims(token)
.getPayload();
}
public String createToken(Long userId, String userEmail){
SecretKey key = buildSigningKey();
String token = Jwts.builder()
.id(String.valueOf(userId))
.subject(userEmail + "_" + userId)
.issuedAt(new Date())
.issuer(ISSUER)
.claim(CHANGE_MAILBOX, JSON.toJSONString(new ArrayList<>()))//自定义属性 权限
.expiration(new Date(System.currentTimeMillis() + CommonConstant.CHANGE_MAILBOX_LINK_VALIDITY))
.signWith(key)
.compact();
return token;
}
public String parseToEmailAndId(String token) {
return parser(token).getSubject();
}
/**
* JWT 要求 HMAC-SHA 的密钥至少 256 bit这里统一扩展/哈希密钥长度避免 WeakKeyException。
*/
private SecretKey buildSigningKey() {
byte[] raw = securityProperties.getJwtSecret().getBytes(StandardCharsets.UTF_8);
if (raw.length < 32) {
raw = DigestUtil.sha256(raw);
}
return Keys.hmacShaKeyFor(raw);
} }
} }

View File

@@ -0,0 +1,102 @@
package com.ai.da.common.task;
import com.ai.da.common.utils.RedisUtil;
import com.ai.da.mapper.primary.entity.Account;
import com.ai.da.service.AccountService;
import com.ai.da.service.SubscriptionPlanService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import jakarta.annotation.Resource;
import java.util.List;
@Component
@Slf4j
public class AccountTask {
@Resource
private AccountService accountService;
@Resource
private RedisUtil redisUtil;
@Resource
private SubscriptionPlanService subscriptionPlanService;
/**
* 每周日晚上刷新 年付用户、月付用户的积分
* 替换为
* 每个月月初只刷新教育子账号的积分
*/
// @Scheduled(cron = "0 25 14 * * ?")
@Scheduled(cron = "0 0 0 1 * ?")
public void refreshCreditsMonthly() {
log.info("每月1号0点 重置教育版子账号为默认积分");
accountService.refreshCreditsMonthly();
}
// @Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes
public void getPaidUser() {
// 获取code-create 表中 指定日期之后 订单状态为wc-processing的订单
accountService.extendValidityForCC();
}
// 每天凌晨0点执行一次 目前已没有角色类型为4的用户
/*@Scheduled(cron = "0 0 0 * * ?")
public void cancelActivityBenefits() {
// 1、查询当前所有参与了活动且过期的用户
List<Account> accountList = accountService.getExpiredUserBySystemUser(4);
// 2、将到期用户置为游客
for (Account account : accountList) {
log.info("参与活动的用户{} : {} 于 {} 账号有效期到期,置为游客", account.getId(), account.getUserEmail(), account.getValidEndTime());
accountService.toVisitor(account);
}
}*/
// 每天检测正式用户到期情况每天凌晨0点执行
@Scheduled(cron = "0 0 0 * * ?")
public void paidUserToVisitor() {
// 1、查询当前已过期正式用户或试用用户
List<Account> accountList = accountService.getExpiredUserBySystemUser(1);
accountList.addAll(accountService.getExpiredUserBySystemUser(2));
accountList.addAll(accountService.getExpiredUserBySystemUser(3));
// 2、将到期用户置为游客
for (Account account : accountList) {
log.info("用户{} : {} 于 {}账号有效期到期,置为游客", account.getId(), account.getUserEmail(), account.getValidEndTime());
accountService.toVisitor(account);
}
}
/**
* 关闭此定时器不再从Code-Create上默认创建AiDA游客
* 将Code-Create上注册的用户添加为AiDA的游客
*/
// @Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes
public void registerUserToVisitor() {
accountService.registerUserToVisitor();
}
@Scheduled(cron = "0 0 0 1 * ?")
// 每月初刷新所有用户用户名剩余修改次数
public void resetUsernameModifyTimes(){
log.info("重置所有用户的用户名修改次数");
redisUtil.batchDeleteKeysWithSamePrefix(RedisUtil.NICKNAME_MODIFY_TIMES);
}
// @Scheduled(cron = "0 35 14 * * ?")
@Scheduled(cron = "0 5 0 * * ?")
public void checkEduAdminExpireStatus() {
accountService.checkEduAdminExpireStatus();
}
@Scheduled(cron = "0 5 0 * * ?")
public void activeSubscriptionPlan() {
subscriptionPlanService.activeSubscriptionPlan(null);
}
@Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes
public void expireSubscription() {
subscriptionPlanService.expireSubscription();
}
}

View File

@@ -0,0 +1,140 @@
package com.ai.da.common.task;
import com.ai.da.common.config.exception.BusinessException;
import com.ai.da.common.utils.DateUtil;
import com.ai.da.mapper.primary.PoseTransformationMapper;
import com.ai.da.mapper.primary.ToProductImageResultMapper;
import com.ai.da.mapper.primary.entity.*;
import com.ai.da.model.vo.PoseTransformationVO;
import com.ai.da.service.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.netty.util.internal.StringUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import static com.ai.da.common.enums.CreditsEventsEnum.TO_PRODUCT_IMAGE;
@Slf4j
@Component
@RequiredArgsConstructor
public class GenerateTask {
private final APIGenerateService apiGenerateService;
private final CreditsService creditsService;
private final GenerateService generateService;
private final PoseTransformationMapper poseTransformationMapper;
private final ToProductImageResultMapper toProductImageResultMapper;
/*
* 对于使用了第三方api的允许异步获得结果的生成功能可能在第三方接口的结果Ready时没有及时存储结果导致第三方链接失效
* 万相 24h失效
* flux 10mins失效 使用了flux接口的功能 ToProductImage || Relight, Pattern这里不做补偿
* 故这里通过定时任务做补偿
* flux五分钟查询一次万相1小时查询一次
*/
@Scheduled(cron = "0 */4 * * * ?")
public void fluxCompensationMechanism(){
// 1、查所有 任务还没成功、还没失败正在等待或者执行中的任务id有哪些
// 由于获取结果的polling_url在redis中只存一天大部分结果超过一天之后就无法再找到任务小部分可以通过公共路径查到结果
List<APIGenerate> apiGenerates = apiGenerateService.getPendingTaskByStatus("flux");
if (apiGenerates != null && !apiGenerates.isEmpty()){
for (APIGenerate apiGenerate : apiGenerates){
String taskId = apiGenerate.getTaskId();
// 1. 根据taskId查toProductImageResult 判断当前任务状态与超时状态
ToProductImageResult toProductImageResult = toProductImageResultMapper.selectOne(new QueryWrapper<ToProductImageResult>().eq("task_id", taskId));
if (Objects.nonNull(toProductImageResult) && "Pending".equals(toProductImageResult.getStatus())){
// 判断当前任务的超时状态
if (!DateUtil.isMoreThanOneDayApart(toProductImageResult.getCreateTime())){
// 1. 未超时,获取当前任务结果
String fileName = toProductImageResult.getResultType().equals(TO_PRODUCT_IMAGE.getName()) ? "product_image" : "relight_image";
String objectName = apiGenerate.getAccountId() + "/" + fileName +"/" + taskId + ".png";
String fluxResult = generateService.getFluxResult(taskId, objectName);
// 2. 成功获取结果下载图片上传至minio,更新toProductImageResult表
if (StringUtil.isNullOrEmpty(fluxResult) || fluxResult.equals("Fail")){
toProductImageResult.setStatus("Fail");
toProductImageResultMapper.updateById(toProductImageResult);
apiGenerate.setStatus("Fail");
apiGenerate.setUpdateTime(LocalDateTime.now());
apiGenerateService.updateById(apiGenerate);
} else if (!fluxResult.equals("Pending")){
if (StringUtil.isNullOrEmpty(toProductImageResult.getUrl())){
toProductImageResult.setStatus("Success");
toProductImageResult.setUrl(fluxResult);
toProductImageResultMapper.updateById(toProductImageResult);
apiGenerate.setStatus("Success");
apiGenerate.setUpdateTime(LocalDateTime.now());
apiGenerateService.updateById(apiGenerate);
}
// 扣积分
Boolean flag = creditsService.taskCreditsDeduction(apiGenerate.getAccountId(), taskId);
if (flag) creditsService.updateChangedCredits(String.valueOf(apiGenerate.getAccountId()), taskId);
}
} else {
// 超时,设置状态为失败
toProductImageResult.setStatus("Fail");
toProductImageResultMapper.updateById(toProductImageResult);
apiGenerate.setStatus("Fail");
apiGenerate.setUpdateTime(LocalDateTime.now());
apiGenerateService.updateById(apiGenerate);
}
// 将积分暂扣区的积分移除
if (toProductImageResult.getStatus().equals("Fail")){
creditsService.deleteCreditsDeduction(apiGenerate.getAccountId(), taskId);
}
}
}
}
}
// 万相 -> pose transformation 补偿 当前任务执行完后5分钟再执行一次不会出现任务重叠的情况
@Scheduled(fixedDelay = 5 * 60 * 1000)
public void wxCompensationMechanism(){
List<APIGenerate> apiGenerates = apiGenerateService.getPendingTaskByStatus("wx");
if (apiGenerates != null && !apiGenerates.isEmpty()){
log.info("=====万相补偿获取结果开始=====");
for (APIGenerate apiGenerate : apiGenerates){
String taskId = apiGenerate.getTaskId();
PoseTransformation poseTransformation = poseTransformationMapper.selectOne(new QueryWrapper<PoseTransformation>().eq("unique_id", taskId));
if (Objects.nonNull(poseTransformation) && ("Pending".equals(poseTransformation.getTaskStatus()) || "Executing".equals(poseTransformation.getTaskStatus()))){
// 判断当前任务的超时状态
if (!DateUtil.isMoreThanOneDayApart(poseTransformation.getCreateTime())){
try {
// 方法中已经完成了pose_transformation和api_generate表的更新不用额外做处理
PoseTransformationVO animateResult = generateService.getAnimateResult(taskId);
if (animateResult.getStatus().equals("Success")){
log.info("补偿获取结果成功,发送系统消息");
}
} catch (BusinessException e){
log.warn("万相 animation 生成失败,原因:{}", e.getMessage());
}
}
} else {
poseTransformation.setTaskStatus("Fail");
poseTransformation.setUpdateTime(LocalDateTime.now());
poseTransformationMapper.updateById(poseTransformation);
apiGenerate.setStatus("Fail");
apiGenerate.setUpdateTime(LocalDateTime.now());
apiGenerateService.updateById(apiGenerate);
generateService.sendSysMsgForPT(poseTransformation);
}
}
}
}
}

View File

@@ -0,0 +1,216 @@
//package com.ai.da.common.task;
//
//import com.ai.da.common.utils.CopyUtil;
//import com.ai.da.common.utils.ExcelReader;
//import com.ai.da.common.utils.MinioUtil;
//import com.ai.da.common.utils.SendEmailUtil;
//import com.ai.da.mapper.primary.*;
//import com.ai.da.mapper.primary.entity.*;
//import com.ai.da.mapper.secondary.AttributeRetrievalMapper;
//import com.ai.da.mapper.third.*;
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import org.apache.commons.lang3.StringUtils;
//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.stereotype.Component;
//import org.springframework.util.CollectionUtils;
//
//import jakarta.annotation.PostConstruct;
//import jakarta.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;
//import java.util.concurrent.ExecutorService;
//import java.util.concurrent.Executors;
//import java.util.concurrent.TimeUnit;
//import java.util.stream.Collectors;
//
//@Component
//public class MoveDataScheduler {
//
// @PostConstruct
// public void test() {
// moveData();
// }
//
// @Resource
// private UserLikeGroupMapper userLikeGroupMapper;
// @Resource
// private UserLikeGroupZSMapper userLikeGroupZSMapper;
// @Resource
// private UserLikeMapper userLikeMapper;
// @Resource
// private UserLikeZSMapper userLikeZSMapper;
// @Resource
// private CollectionElementMapper collectionElementMapper;
// @Resource
// private CollectionElementZSMapper collectionElementZSMapper;
//
// @Resource
// private CollectionMapper collectionMapper;
//
// @Resource
// private CollectionZSMapper collectionZSMapper;
//
// @Resource
// private DesignMapper designMapper;
//
// @Resource
// private DesignZSMapper designZSMapper;
//
// @Resource
// private DesignItemMapper designItemMapper;
//
// @Resource
// private DesignItemZSMapper designItemZSMapper;
//
// @Resource
// private TDesignPythonOutfitMapper designPythonOutfitMapper;
//
// @Resource
// private TDesignPythonOutfitZSMapper designPythonOutfitZSMapper;
//
// @Resource
// private TDesignPythonOutfitDetailMapper designPythonOutfitDetailMapper;
//
// @Resource
// private TDesignPythonOutfitDetailZSMapper designPythonOutfitDetailZSMapper;
//
// @Resource
// private DesignItemDetailMapper designItemDetailMapper;
// @Resource
// private DesignItemZSDetailMapper designItemDetailZSMapper;
//
// @Resource
// private DesignItemDetailPrintMapper designItemDetailPrintMapper;
//
// @Resource
// private DesignItemDetailPrintZSMapper designItemDetailPrintZSMapper;
//
//
// private void moveData() {
// // 查询用户所有history记录
// QueryWrapper<UserLikeGroup> userLikeGroupQueryWrapper = new QueryWrapper<>();
// userLikeGroupQueryWrapper.lambda().eq(UserLikeGroup::getAccountId, 11411);
// List<UserLikeGroup> userLikeGroupList = userLikeGroupMapper.selectList(userLikeGroupQueryWrapper);
//
// for (UserLikeGroup userLikeGroup : userLikeGroupList) {
//
// com.ai.da.mapper.third.entity.UserLikeGroup userLikeGroupZS = CopyUtil.copyObject(userLikeGroup, com.ai.da.mapper.third.entity.UserLikeGroup.class);
// userLikeGroupZS.setAccountId(11420L);
// userLikeGroupZS.setId(null);
// Collection collection = collectionMapper.selectById(userLikeGroup.getCollectionId());
// com.ai.da.mapper.third.entity.Collection collectionZS = CopyUtil.copyObject(collection, com.ai.da.mapper.third.entity.Collection.class);
// collectionZS.setAccountId(11420L);
// collectionZS.setId(null);
//
// if (collection.getMoodTemplateId() != null) {
// CollectionElement element = collectionElementMapper.selectById(collection.getMoodTemplateId());
// com.ai.da.mapper.third.entity.CollectionElement collectionElementZS = CopyUtil.copyObject(element, com.ai.da.mapper.third.entity.CollectionElement.class);
// collectionElementZS.setAccountId(11420L);
// collectionElementZS.setId(null);
// collectionElementZSMapper.insert(collectionElementZS);
// collectionZS.setMoodTemplateId(String.valueOf(collectionElementZS.getId()));
// }
// collectionZSMapper.insert(collectionZS);
// userLikeGroupZS.setCollectionId(collectionZS.getId());
// userLikeGroupZSMapper.insert(userLikeGroupZS);
//
// // 生成元素
// QueryWrapper<CollectionElement> collectionElementQueryWrapper = new QueryWrapper<>();
// collectionElementQueryWrapper.lambda().eq(CollectionElement::getCollectionId, userLikeGroup.getCollectionId());
// List<CollectionElement> collectionElements = collectionElementMapper.selectList(collectionElementQueryWrapper);
//
// for (CollectionElement collectionElement : collectionElements) {
// com.ai.da.mapper.third.entity.CollectionElement collectionElementZS = CopyUtil.copyObject(collectionElement, com.ai.da.mapper.third.entity.CollectionElement.class);
// collectionElementZS.setId(null);
// collectionElementZS.setAccountId(11420L);
// collectionElementZS.setCollectionId(collectionZS.getId());
// collectionElementZSMapper.insert(collectionElementZS);
// }
//
// // 查询记录关联
// QueryWrapper<UserLike> userLikeQueryWrapper = new QueryWrapper<>();
// userLikeQueryWrapper.lambda().eq(UserLike::getUserLikeGroupId, userLikeGroup.getId());
// List<UserLike> userLikes = userLikeMapper.selectList(userLikeQueryWrapper);
// for (UserLike userLike : userLikes) {
// Design design = designMapper.selectById(userLike.getDesignId());
// com.ai.da.mapper.third.entity.Design designZS = CopyUtil.copyObject(design, com.ai.da.mapper.third.entity.Design.class);
// designZS.setId(null);
// designZS.setAccountId(11420L);
// designZS.setCollectionId(collectionZS.getId());
// designZSMapper.insert(designZS);
//
// com.ai.da.mapper.third.entity.UserLike userLikeZS = CopyUtil.copyObject(userLike, com.ai.da.mapper.third.entity.UserLike.class);
//// Design design = designMapper.selectById(userLike.getDesignId());
// userLikeZS.setId(null);
// DesignItem designItem = designItemMapper.selectById(userLike.getDesignItemId());
// com.ai.da.mapper.third.entity.DesignItem designItemZS = CopyUtil.copyObject(designItem, com.ai.da.mapper.third.entity.DesignItem.class);
// designItemZS.setId(null);
// designItemZS.setAccountId(11420L);
// designItemZS.setDesignId(designZS.getId());
// designItemZSMapper.insert(designItemZS);
//
// QueryWrapper<DesignItemDetail> designItemDetailQueryWrapper = new QueryWrapper<>();
// designItemDetailQueryWrapper.lambda().eq(DesignItemDetail::getDesignItemId, designItem.getId());
// List<DesignItemDetail> designItemDetails = designItemDetailMapper.selectList(designItemDetailQueryWrapper);
// for (DesignItemDetail designItemDetail : designItemDetails) {
// com.ai.da.mapper.third.entity.DesignItemDetail designItemDetailZS = CopyUtil.copyObject(designItemDetail, com.ai.da.mapper.third.entity.DesignItemDetail.class);
// designItemDetailZS.setId(null);
// designItemDetailZS.setDesignItemId(designItemZS.getId());
// designItemDetailZS.setAccountId(11420L);
// designItemDetailZS.setDesignId(designZS.getId());
// designItemDetailZSMapper.insert(designItemDetailZS);
//
// QueryWrapper<DesignItemDetailPrint> designItemDetailPrintQueryWrapper = new QueryWrapper<>();
// designItemDetailPrintQueryWrapper.lambda().eq(DesignItemDetailPrint::getDesignItemDetailId, designItemDetail.getId());
// List<DesignItemDetailPrint> designItemDetailPrintList = designItemDetailPrintMapper.selectList(designItemDetailPrintQueryWrapper);
// if (!CollectionUtils.isEmpty(designItemDetailPrintList)) {
// for (DesignItemDetailPrint designItemDetailPrint : designItemDetailPrintList) {
// com.ai.da.mapper.third.entity.DesignItemDetailPrint designItemDetailPrintZS = CopyUtil.copyObject(designItemDetailPrint, com.ai.da.mapper.third.entity.DesignItemDetailPrint.class);
// designItemDetailPrintZS.setId(null);
// designItemDetailPrintZS.setDesignItemDetailId(designItemDetailZS.getId());
// designItemDetailPrintZSMapper.insert(designItemDetailPrintZS);
// }
// }
// }
//
// userLikeZS.setDesignItemId(designItemZS.getId());
// TDesignPythonOutfit tDesignPythonOutfit = designPythonOutfitMapper.selectById(userLike.getDesignOutfitId());
// com.ai.da.mapper.third.entity.TDesignPythonOutfit tDesignPythonOutfitZS = CopyUtil.copyObject(tDesignPythonOutfit, com.ai.da.mapper.third.entity.TDesignPythonOutfit.class);
// tDesignPythonOutfitZS.setId(null);
// tDesignPythonOutfitZS.setDesignItemId(designItemZS.getId());
// tDesignPythonOutfitZS.setCollectionId(collectionZS.getId());
// tDesignPythonOutfitZS.setUserId(11420L);
// tDesignPythonOutfitZS.setDesignId(designZS.getId());
// designPythonOutfitZSMapper.insert(tDesignPythonOutfitZS);
//
// userLikeZS.setUserLikeGroupId(userLikeGroupZS.getId());
// userLikeZS.setDesignId(designZS.getId());
// userLikeZS.setDesignOutfitId(tDesignPythonOutfitZS.getId());
// userLikeZSMapper.insert(userLikeZS);
//
// QueryWrapper<TDesignPythonOutfitDetail> designPythonOutfitDetailQueryWrapper = new QueryWrapper<>();
// designPythonOutfitDetailQueryWrapper.lambda().eq(TDesignPythonOutfitDetail::getDesignPythonOutfitId, tDesignPythonOutfit.getId());
// List<TDesignPythonOutfitDetail> tDesignPythonOutfitDetails = designPythonOutfitDetailMapper.selectList(designPythonOutfitDetailQueryWrapper);
// for (TDesignPythonOutfitDetail tDesignPythonOutfitDetail : tDesignPythonOutfitDetails) {
// com.ai.da.mapper.third.entity.TDesignPythonOutfitDetail tDesignPythonOutfitDetailZS = CopyUtil.copyObject(tDesignPythonOutfitDetail, com.ai.da.mapper.third.entity.TDesignPythonOutfitDetail.class);
// tDesignPythonOutfitDetailZS.setDesignPythonOutfitId(tDesignPythonOutfitZS.getId());
// tDesignPythonOutfitDetailZS.setId(null);
// tDesignPythonOutfitDetailZS.setDesignId(designZS.getId());
// designPythonOutfitDetailZSMapper.insert(tDesignPythonOutfitDetailZS);
// }
// }
// }
//
//
// }
//
//
//}

View File

@@ -0,0 +1,129 @@
package com.ai.da.common.task;
import com.ai.da.common.enums.PayTypeEnum;
import com.ai.da.mapper.primary.entity.OrderInfo;
import com.ai.da.service.*;
import com.paypal.http.exceptions.SerializeException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import jakarta.annotation.Resource;
import java.time.LocalDate;
import java.util.List;
@Slf4j
@Component
public class PaymentTask {
@Resource
private OrderInfoService orderInfoService;
@Resource
private StripeService stripeService;
@Resource
private AffiliateService affiliateService;
// 考虑删除该定时任务(原因:之后的订单列允许用户查看发票,发票未过期时仍可以支付,所以不需要手动使订单过期)
// @Scheduled(cron = "0/30 * * * * ?")
public void orderConfirmForStripe() throws SerializeException {
// 查看超过30分钟以上仍未支付的订单 置为超时订单
List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration(30, PayTypeEnum.STRIPE.getType());
for (OrderInfo orderInfo : orderInfoList) {
String orderNo = orderInfo.getOrderNo();
log.warn("超时订单 ===> {}", orderNo);
//核实订单状态:调用支付宝查单接口
stripeService.checkOrderStatus(orderNo);
}
}
@Resource
private PayPalCheckoutService payPalCheckoutService;
// @Scheduled(cron = "0/30 * * * * ?")
public void orderConfirmForPaypal() throws SerializeException {
// log.info("PayPal orderConfirm 被执行......");
List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration(30, PayTypeEnum.PAYPAL.getType());
for (OrderInfo orderInfo : orderInfoList) {
String orderNo = orderInfo.getOrderNo();
log.warn("超时订单 ===> {}", orderNo);
//核实订单状态:调用支付宝查单接口
payPalCheckoutService.checkOrderStatus(orderNo);
}
}
@Resource
private AliPayService aliPayService;
/**
* 从第0秒开始每隔30秒执行1次查询创建超过5分钟并且未支付的订单
*/
// @Scheduled(cron = "0/30 * * * * ?")
public void orderConfirmForAlipay(){
/*
log.info("Alipay orderConfirm 被执行......");
List<OrderInfo> orderInfoList = orderInfoService.getNoPayOrderByDuration(5, PayTypeEnum.ALIPAY.getType());
for (OrderInfo orderInfo : orderInfoList) {
String orderNo = orderInfo.getOrderNo();
log.warn("超时订单 ===> {}", orderNo);
//核实订单状态:调用支付宝查单接口
aliPayService.checkOrderStatus(orderNo);
}*/
}
// !!关闭此定时器,改为提前三天站内信提醒!!
// 提前7天向用户发送提醒邮件,每天早上8点执行
// @Scheduled(cron = "0 0 8 * * ?")
// public void subscriptionReminder(){
// stripeService.subscriptionReminder();
// }
// 如果有订阅已创建,但是没有发邮件通知的,需要主动获取回调信息并向用户发送邮件
public void checkSubscriptionPayment(){
//
}
// @Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes
public void updateAffiliateInfoWithPayment(){
// log.info("佣金计算定时器");
affiliateService.updateAffiliateInfoWithPayment();
}
// 定时同步(每分钟一次)
@Scheduled(fixedRate = 60000)
public void syncLinkViewCountToDB(){
affiliateService.syncLinkViewCountToDB();
}
// @Scheduled(cron = "0 0 8 28-31 * ?")
public void commissionSummaryReminder(){
// 每个月末的最后一天的早上八点执行
LocalDate today = LocalDate.now();
// 判断是否为月底
if (today.plusDays(1).getDayOfMonth() == 1) {
log.info("今天是月底,执行佣金结算提醒任务!");
affiliateService.commissionCalculation(null, null);
}
}
@Scheduled(cron = "0 */5 * * * *") // Run every 5 minutes
public void calcCouponsCommission(){
// log.info("优惠券佣金计算定时器");
affiliateService.calcCouponsCommission();
}
}

View File

@@ -0,0 +1,144 @@
package com.ai.da.common.task;
import com.ai.da.common.utils.SendEmailUtil;
import com.ai.da.mapper.primary.AccountMapper;
import com.ai.da.mapper.primary.SubscriptionInfoMapper;
import com.ai.da.mapper.primary.entity.Account;
import com.ai.da.mapper.primary.entity.SubscriptionInfo;
import com.ai.da.service.StripeService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.netty.util.internal.StringUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@Component
@RequiredArgsConstructor
public class SubscriptionReminderTask {
public final AccountMapper accountMapper;
public final SubscriptionInfoMapper subscriptionInfoMapper;
public final StripeService stripeService;
// 订阅类型与提前天数的映射配置
private static final Map<String, Integer> REMINDER_DAYS_CONFIG = new HashMap<>();
static {
REMINDER_DAYS_CONFIG.put("month", 7);
REMINDER_DAYS_CONFIG.put("year", 14);
}
// @Scheduled(cron = "0 0 9 * * ?")
public void subscriptionReminder() {
// 获取所有需要通知的订阅
List<SubscriptionInfo> subscriptionInfos = getDueSubscriptions();
for (SubscriptionInfo subscriptionInfo : subscriptionInfos) {
Integer daysBefore = REMINDER_DAYS_CONFIG.get(subscriptionInfo.getType());
if (daysBefore == null) {
log.warn("未知的订阅类型: {}", subscriptionInfo.getType());
continue;
}
String emailType = subscriptionInfo.getStatus().equals("active") ? "reminder_subscriber" : subscriptionInfo.getStatus().equals("canceled") ? "reminder_expire" : null;
if (StringUtil.isNullOrEmpty(emailType)) {
log.warn("未知订阅状态:{}", subscriptionInfo.getStatus());
continue;
}
boolean success = stripeService.sendEmail(subscriptionInfo.getSubscriptionId(), emailType, subscriptionInfo.getOrderNo());
if (success) {
log.info("提前{}天向用户 {} 发送续订通知邮件,订阅类型: {}",
daysBefore, subscriptionInfo.getAccountId(), subscriptionInfo.getType());
}
}
}
private List<SubscriptionInfo> getDueSubscriptions() {
List<SubscriptionInfo> results = new ArrayList<>();
for (Map.Entry<String, Integer> entry : REMINDER_DAYS_CONFIG.entrySet()) {
String subscriptionType = entry.getKey();
int daysBefore = entry.getValue();
results.addAll(getSubscriptionsDueInDays(subscriptionType, daysBefore));
}
return results;
}
private List<SubscriptionInfo> getSubscriptionsDueInDays(String subscriptionType, int daysBefore) {
LocalDateTime targetDate = LocalDateTime.now().plusDays(daysBefore);
LocalDateTime startOfDay = targetDate.toLocalDate().atStartOfDay();
LocalDateTime endOfDay = targetDate.toLocalDate().atTime(23, 59, 59);
// 使用系统默认时区
ZoneId zoneId = ZoneId.systemDefault();
long startTimestamp = startOfDay.atZone(zoneId).toEpochSecond();
long endTimestamp = endOfDay.atZone(zoneId).toEpochSecond();
QueryWrapper<SubscriptionInfo> qw = new QueryWrapper<>();
qw.lambda().ge(SubscriptionInfo::getCurrentPeriodEnd, startTimestamp);
qw.lambda().lt(SubscriptionInfo::getCurrentPeriodEnd, endTimestamp);
// qw.eq("status", "active");
qw.lambda().eq(SubscriptionInfo::getType, subscriptionType);
return subscriptionInfoMapper.selectList(qw);
}
// @Scheduled(cron = "0 0 9 * * ?")
public void trialReminder() {
// 今天的 00:00:00 和 23:59:59
LocalDateTime startOfDay = LocalDateTime.now().toLocalDate().atStartOfDay();
LocalDateTime endOfDay = LocalDateTime.now().toLocalDate().atTime(23, 59, 59);
// 使用系统默认时区
ZoneId zoneId = ZoneId.systemDefault();
long startTimestamp = startOfDay.atZone(zoneId).toEpochSecond() * 1000;
long endTimestamp = endOfDay.atZone(zoneId).toEpochSecond() * 1000;
QueryWrapper<Account> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().gt(Account::getValidEndTime, startTimestamp)
.lt(Account::getValidEndTime, endTimestamp)
.eq(Account::getSystemUser, 3);
List<Account> accounts = accountMapper.selectList(queryWrapper);
for (Account account : accounts) {
String language = stripeService.getLanguage(account.getLanguage(), account.getCountry(), "reminder_trial");
SendEmailUtil.subscriptionEmailReminder("reminder_trial", null, language, account.getUserEmail());
}
}
/* public void subscriptionReminder(){
// 提前7天的 00:00:00 和 23:59:59
LocalDateTime startOfDay = LocalDateTime.now().plusDays(7).toLocalDate().atStartOfDay();
LocalDateTime endOfDay = LocalDateTime.now().plusDays(7).toLocalDate().atTime(23, 59, 59);
// 转为时间戳
long startTimestamp = startOfDay.toEpochSecond(ZoneOffset.UTC);
long endTimestamp = endOfDay.toEpochSecond(ZoneOffset.UTC);
QueryWrapper<SubscriptionInfo> qw = new QueryWrapper<>();
qw.ge("current_period_end", startTimestamp);
qw.lt("current_period_end", endTimestamp);
qw.eq("status", "active");
List<SubscriptionInfo> subscriptionInfos = subscriptionInfoMapper.selectList(qw);
for (SubscriptionInfo subscriptionInfo : subscriptionInfos) {
boolean b = sendEmail(subscriptionInfo.getSubscriptionId(), "reminder", null);
if (b) log.info("提前7天向用户 {} 发送续订通知邮件", subscriptionInfo.getAccountId());
}
}*/
}

View File

@@ -23,16 +23,17 @@ public class AccessLimitUtils {
* @param interfaceName * @param interfaceName
* @return * @return
*/ */
public static void validate(String interfaceName,Integer count) { public static void validate(String interfaceName, Integer count) {
Integer useCount= LocalCacheUtils.getAidaInterfaceCurrentLimitingCache(interfaceName); Integer useCount = LocalCacheUtils.getAidaInterfaceCurrentLimitingCache(interfaceName);
if(useCount >count){ if (useCount > count) {
//系统繁忙 //系统繁忙
throw new BusinessException("system busy !"); throw new BusinessException("system.busy");
}else{ } else {
useCount ++; useCount++;
LocalCacheUtils.setAidaInterfaceCurrentLimitingCache(interfaceName,useCount); LocalCacheUtils.setAidaInterfaceCurrentLimitingCache(interfaceName, useCount);
} }
} }
/** /**
* 校验过后 接口完毕 去掉限流 * 校验过后 接口完毕 去掉限流
* *
@@ -40,9 +41,9 @@ public class AccessLimitUtils {
* @return * @return
*/ */
public static void validateOut(String interfaceName) { public static void validateOut(String interfaceName) {
Integer useCount= LocalCacheUtils.getAidaInterfaceCurrentLimitingCache(interfaceName); Integer useCount = LocalCacheUtils.getAidaInterfaceCurrentLimitingCache(interfaceName);
useCount --; useCount--;
LocalCacheUtils.setAidaInterfaceCurrentLimitingCache(interfaceName,useCount); LocalCacheUtils.setAidaInterfaceCurrentLimitingCache(interfaceName, useCount);
} }
} }

View File

@@ -0,0 +1,383 @@
package com.ai.da.common.utils;
import cn.hutool.core.io.resource.ClassPathResource;
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.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.crypto.digests.SHA256Digest;
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
import org.bouncycastle.crypto.signers.RSADigestSigner;
import org.bouncycastle.crypto.util.PublicKeyFactory;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.util.io.pem.PemObject;
import org.bouncycastle.util.io.pem.PemReader;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
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
@Component
public class AlipayHKEncryptionUtil {
@Value("${alipayHK.merchantId}")
private String merchantId;
@Value("${alipayHK.segmentId}")
private String segmentId;
@Value("${alipayHK.AESKey}")
private String aesKey;
@Value("${alipayHK.rsaPrivateKey}")
private String privateKeyPath;
@Value("${alipayHK.rsaPublicKey}")
private String publicKeyPath;
@Value("${alipayHK.CODPublicKey}")
private String CODPublicKeyPath;
/**
* 加密
* @param param
* @param serviceName
* @return
* @throws NoSuchPaddingException
* @throws NoSuchAlgorithmException
* @throws InvalidAlgorithmParameterException
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
* @throws IOException
*/
public AlipayHKRequestDTO AESCBCWithRSA(HashMap<String, Object> 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";
String mode = "aes-256-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<String, Object> param = new HashMap<>();
requestMessage.setParameters(param);
// Serialize message body
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
String content = gson.toJson(requestMessage);
log.info("alipay-hk request 加密前:{}", content);
// 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("alipay-hk request 加密加签后:{}",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 {
ClassPathResource classPathResource = new ClassPathResource(filePath);
InputStream inputstream = classPathResource.getStream();
String privateKeyContent = getString(inputstream);
// 进行 Base64 解码
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyContent);
// 根据 PKCS8 格式的私钥字节数组构造私钥对象
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
return keyFactory.generatePrivate(keySpec);
}
@NotNull
private static String getString(InputStream inputstream) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputstream));
// 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+", ""); // 去除空格、换行等字符
return privateKeyContent;
}
/**
* 使用 AES 密钥和随机向量进行解密
*/
public 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 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<String, Object> 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(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<String, String> result = new HashMap<String, String>();
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 {
public static PublicKey readPublicKey(String fileName) throws Exception {
KeyFactory factory = KeyFactory.getInstance("RSA");
ClassPathResource classPathResource = new ClassPathResource(fileName);
InputStream inputStream = classPathResource.getStream();
BufferedReader fileReader = new BufferedReader(new InputStreamReader(inputStream));
try (PemReader pemReader = new PemReader(fileReader)) {
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;
}
public Boolean signatureVerification(String data, String signatureBase64){
Base64.Decoder decoder = Base64.getDecoder();
// Verify key
try {
ClassPathResource classPathResource = new ClassPathResource(CODPublicKeyPath);
InputStream inputstream = classPathResource.getStream();
// 从指定的路径读取公钥文件
InputStreamReader isrPub = new InputStreamReader(inputstream);
PEMParser pemParserPub = new PEMParser(isrPub);
// 使用 PEMParser 解析公钥文件
SubjectPublicKeyInfo pubInfo = (SubjectPublicKeyInfo) pemParserPub.readObject();
// 从 SubjectPublicKeyInfo 创建 AsymmetricKeyParameter 对象
AsymmetricKeyParameter pubKey = PublicKeyFactory.createKey(pubInfo);
// Verifying; 创建 RSADigestSigner 对象并使用 SHA-256 作为摘要算法
RSADigestSigner verifier = new RSADigestSigner(new SHA256Digest());
// 初始化 RSADigestSigner设置为验证模式并提供公钥参数
verifier.init(false, pubKey);
// 将要验证的数据转换为字节数组
byte[] signMessageForVerifying = data.getBytes();
// 将 Base64 编码的签名转换为字节数组
byte[] signatureBase64ForVerifying = decoder.decode(signatureBase64);
// 使用签名器更新要验证的数据
verifier.update(signMessageForVerifying, 0, signMessageForVerifying.length);
// 验证签名并返回结果
Boolean verifyResult = verifier.verifySignature(signatureBase64ForVerifying);
return verifyResult;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

View File

@@ -0,0 +1,62 @@
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;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class AlipayHKRequestUtil {
public String requestAlipayHK(AlipayHKRequestDTO alipayHKRequestDTO) {
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/v1/service")
.url("https://aqs-api.codpayment.com/v1/service")
.method("POST", body)
.addHeader("Content-Type", "application/json;charset=utf-8")
.build();
Response response;
String bodyString;
try {
response = client.newCall(request).execute();
assert response.body() != null;
bodyString = response.body().string();
} catch (Exception e) {
throw new BusinessException(e.getMessage());
}
JSONObject jsonObject = JSONObject.parseObject(bodyString);
boolean success = (boolean) jsonObject.get("success");
if (success){
return bodyString;
} else {
String message = jsonObject.get("error_code").toString() + ":" + jsonObject.get("error");
log.error("Alipay return message : {}", message);
throw new BusinessException("Alipay return message : " + message);
}
}
}

View File

@@ -0,0 +1,75 @@
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.python.PythonService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.concurrent.*;
@Slf4j
@Component
public class AsyncCallerUtil {
// 存放状态 表示当前任务是否需要继续等待,默认持续等待
public static Map<String, Boolean> waitingStatus = new HashMap<>();
private static PythonService pythonService;
@Autowired
public void setPythonService(PythonService pythonService) {
AsyncCallerUtil.pythonService = pythonService;
}
public CompletableFuture<List<String>> callGenerateAsync(GenerateToPythonDTO generateToPython) {
// return CompletableFuture.supplyAsync(() -> pythonService.generateSketchOrPrint(generateToPython));
return null;
}
public List<String> generate(GenerateToPythonDTO generateToPython) {
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
String taskId = generateToPython.getTasks_id();
ScheduledFuture<?> timeoutTask = null;
if (!waitingStatus.containsKey(taskId)) waitingStatus.put(taskId, true);
try {
CompletableFuture<List<String>> generateResult = callGenerateAsync(generateToPython);
// 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("阻塞等待结果...");
// 阻塞,等待结果
List<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();
}
}
}

Some files were not shown because too many files have changed in this diff Show More