diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/image/AiImageDO.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/image/AiImageDO.java index ea83d2181..c04fea12f 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/image/AiImageDO.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/image/AiImageDO.java @@ -49,8 +49,8 @@ public class AiImageDO extends BaseDO { // ============ mj 需要字段 - @Schema(description = "用户操作的消息编号(MJ返回)") - private String mjMessageId; + @Schema(description = "用户操作的Nonce编号(MJ返回)") + private String mjNonceId; @Schema(description = "用户操作的操作编号(MJ返回)") private String mjOperationId; diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/AiImageMapper.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/AiImageMapper.java index ef2b6a596..1ee5b436d 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/AiImageMapper.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/AiImageMapper.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.ai.dal.mysql; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; @@ -17,4 +18,13 @@ import org.springframework.stereotype.Repository; public interface AiImageMapper extends BaseMapperX { + /** + * 更新 - 根据 messageId + * + * @param mjNonceId + * @param aiImageDO + */ + default void updateByMjNonce(Long mjNonceId, AiImageDO aiImageDO) { + this.update(aiImageDO, new LambdaQueryWrapperX().eq(AiImageDO::getMjNonceId, mjNonceId)); + } } diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiImageServiceImpl.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiImageServiceImpl.java index 19281d4df..d306b4b2f 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiImageServiceImpl.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/AiImageServiceImpl.java @@ -145,7 +145,7 @@ public class AiImageServiceImpl implements AiImageService { // 校验 OperateId 是否存在 AiImageMidjourneyOperationsVO midjourneyOperationsVO = validateMidjourneyOperationsExists(midjourneyOperations, req.getOperateId()); // 校验 messageId - validateMessageId(aiImageDO.getMjMessageId(), req.getMessageId()); + validateMessageId(aiImageDO.getMjNonceId(), req.getMessageId()); // 获取 mjOperationName String mjOperationName = midjourneyOperationsVO.getLabel(); // 保存一个 image 任务记录 @@ -222,7 +222,7 @@ public class AiImageServiceImpl implements AiImageService { aiImageDO.setDrawingImageUrl(drawingImageUrl); aiImageDO.setDrawingErrorMessage(drawingErrorMessage); // - aiImageDO.setMjMessageId(mjMessageId); + aiImageDO.setMjNonceId(mjMessageId); aiImageDO.setMjOperationId(mjOperationId); aiImageDO.setMjOperationName(mjOperationName); aiImageMapper.insert(aiImageDO); diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/midjourneyHandler/YuDaoMidjourneyMessageHandler.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/midjourneyHandler/YuDaoMidjourneyMessageHandler.java index 43ca13b6a..0260a1511 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/midjourneyHandler/YuDaoMidjourneyMessageHandler.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/midjourneyHandler/YuDaoMidjourneyMessageHandler.java @@ -62,12 +62,11 @@ public class YuDaoMidjourneyMessageHandler implements MidjourneyMessageHandler { private void errorHandler(MidjourneyMessage midjourneyMessage) { // image 编号 - Long aiImageId = Long.valueOf(midjourneyMessage.getNonce()); + Long nonceId = Long.valueOf(midjourneyMessage.getNonce()); // 获取 error message String errorMessage = getErrorMessage(midjourneyMessage); - aiImageMapper.updateById( + aiImageMapper.updateByMjNonce(nonceId, new AiImageDO() - .setId(aiImageId) .setDrawingErrorMessage(errorMessage) .setDrawingStatus(AiImageDrawingStatusEnum.FAIL.getStatus()) ); @@ -83,7 +82,8 @@ public class YuDaoMidjourneyMessageHandler implements MidjourneyMessageHandler { private void successHandler(MidjourneyMessage midjourneyMessage) { // 获取id - Long aiImageId = Long.valueOf(midjourneyMessage.getNonce()); + Long nonceId = Long.valueOf(midjourneyMessage.getNonce()); + // TODO @芋艿 这个地方有问题,不能根据 nonce来更新,不返回这个信息(别人获取了 image-xxx-xx 后面一段hash,由于没有mj账号测试,暂不清楚。) // 获取生成 url String imageUrl = null; if (CollUtil.isNotEmpty(midjourneyMessage.getAttachments())) { @@ -102,12 +102,11 @@ public class YuDaoMidjourneyMessageHandler implements MidjourneyMessageHandler { // 获取 midjourneyOperations List midjourneyOperations = getMidjourneyOperationsList(midjourneyMessage); // 更新数据库 - aiImageMapper.updateById( + aiImageMapper.updateByMjNonce(nonceId, new AiImageDO() - .setId(aiImageId) .setDrawingImageUrl(imageUrl) .setDrawingStatus(drawingStatusEnum == null ? null : drawingStatusEnum.getStatus()) - .setMjMessageId(midjourneyMessage.getId()) + .setMjNonceId(midjourneyMessage.getId()) .setMjOperations(JsonUtils.toJsonString(midjourneyOperations)) ); } diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/resources/http/image.http b/yudao-module-ai/yudao-module-ai-biz/src/main/resources/http/image.http index 3f360aee1..bf1165773 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/resources/http/image.http +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/resources/http/image.http @@ -20,5 +20,5 @@ Content-Type: application/json Authorization: {{token}} { - "prompt": "Cute cartoon style mobile game scene, a colorful camping car with an outdoor table and chairs next to it on the road in a spring forest, the simple structure of the camper van, soft lighting, C4D rendering, 3d model in the style of a cartoon, cute shape, a pastel color scheme, closeup view from the side angle, high resolution, bright colors, a happy atmosphere. --ar 1:2 --v 6.0" + "prompt": "Cute cartoon style mobile game scene, a colorful camping car with an outdoor table and chairs next to it on the road in a spring forest, the simple structure of the camper van, soft lighting, C4D rendering, 3d model in the style of a cartoon, cute shape, a pastel color scheme, closeup view from the side angle, high resolution, bright colors, a happy atmosphere." } \ No newline at end of file diff --git a/yudao-module-ai/yudao-spring-boot-starter-ai/src/main/resources/requestTestJson/imageGenerationProcess/test2.json b/yudao-module-ai/yudao-spring-boot-starter-ai/src/main/resources/requestTestJson/imageGenerationProcess/test2.json new file mode 100644 index 000000000..172152804 --- /dev/null +++ b/yudao-module-ai/yudao-spring-boot-starter-ai/src/main/resources/requestTestJson/imageGenerationProcess/test2.json @@ -0,0 +1,54 @@ +{ + "type": 2, + "application_id": "936929561302675456", + "guild_id": "1237948819677904956", + "channel_id": "1237948819677904960", + "session_id": "4bdb0c32158f625bbd7f0a54bfbb54aa", + "data": { + "version": "1237876415471554623", + "id": "938956540159881230", + "name": "imagine", + "type": 1, + "options": [ + { + "type": 3, + "name": "prompt", + "value": "哈哈哈" + } + ], + "application_command": { + "id": "938956540159881230", + "type": 1, + "application_id": "936929561302675456", + "version": "1237876415471554623", + "name": "imagine", + "description": "Create images with Midjourney", + "options": [ + { + "type": 3, + "name": "prompt", + "description": "The prompt to imagine", + "required": true, + "description_localized": "The prompt to imagine", + "name_localized": "prompt" + } + ], + "dm_permission": true, + "contexts": [ + 0, + 1, + 2 + ], + "integration_types": [ + 0, + 1 + ], + "global_popularity_rank": 1, + "description_localized": "Create images with Midjourney", + "name_localized": "imagine" + }, + "attachments": [] + }, + "nonce": "1238062212925358080", + "analytics_location": "slash_ui" +} \ No newline at end of file diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index 1c16251d7..959988d7d 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -52,7 +52,7 @@ spring: # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true;useUnicode=true;characterEncoding=utf-8 # SQLServer 连接的示例 # url: jdbc:dm://127.0.0.1:5236?schema=RUOYI_VUE_PRO # DM 连接的示例 username: root - password: 123456 + password: root # username: sa # SQL Server 连接的示例 # password: Yudao@2024 # SQL Server 连接的示例 # username: SYSDBA # DM 连接的示例 @@ -61,7 +61,7 @@ spring: lazy: true # 开启懒加载,保证启动速度 url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true username: root - password: 123456 + password: root # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 data: @@ -248,9 +248,9 @@ yudao: style: vivid midjourney: enable: true - token: OTc1MzcyNDg1OTcxMzEyNzAw.G2iiSo.OqW9vToC5dokiyb1QOWnCwRPsYpOjLyNcf9--M - guild-id: 1234355413420347402 - channel-id: 1234380679576424448 + token: MTE4MjE3MjY2MjkxNTY3ODIzOA.GEV1SG.c49F8lZoGCUHwsj8O0UdodmM6nyQHvuD2fXflw + guild-id: 1237948819677904956 + channel-id: 1237948819677904960 captcha: enable: false # 本地环境,暂时关闭图片验证码,方便登录等接口的测试; security: @@ -267,6 +267,8 @@ yudao: enable: false demo: false # 关闭演示模式 tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc + tenant: + enable: false justauth: enabled: true