diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/PortalVideoController.java b/ruoyi-admin/src/main/java/com/ruoyi/api/PortalVideoController.java index af49924..282bd1f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/PortalVideoController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/PortalVideoController.java @@ -94,6 +94,54 @@ public class PortalVideoController extends BaseController { } } + /** + * 写入订单:提示词、生成模式、图床 URL,以及模型/时长/分辨率/比例与完整 JSON 参数(便于对账与审计)。 + */ + private void fillVideoOrderRecord(AiOrder aiOrder, PortalVideoGenRequest req, String mode, ByteBodyReq body) { + aiOrder.setText(req.getText()); + aiOrder.setMode(mode); + applyOrderImages(aiOrder, req); + if (req.getDuration() != null) { + aiOrder.setDuration(req.getDuration()); + } else if (body.getDuration() != null) { + aiOrder.setDuration(body.getDuration()); + } + if (StringUtils.isNotEmpty(body.getResolution())) { + aiOrder.setResolution(body.getResolution()); + } + if (StringUtils.isNotEmpty(body.getRatio())) { + aiOrder.setRatio(body.getRatio()); + } + if (StringUtils.isNotEmpty(body.getModel())) { + aiOrder.setModel(body.getModel()); + } + try { + Map snap = new LinkedHashMap<>(); + snap.put("generationMode", mode); + snap.put("prompt", req.getText()); + snap.put("functionType", StringUtils.isNotEmpty(req.getFunctionType()) ? req.getFunctionType() : "21"); + snap.put("model", body.getModel()); + snap.put("duration", body.getDuration()); + snap.put("resolution", body.getResolution()); + snap.put("ratio", body.getRatio()); + if (StringUtils.isNotEmpty(req.getFirstUrl())) { + snap.put("firstUrl", req.getFirstUrl()); + } + if (StringUtils.isNotEmpty(req.getLastUrl())) { + snap.put("lastUrl", req.getLastUrl()); + } + if (StringUtils.isNotEmpty(req.getReferenceUrl())) { + snap.put("referenceUrl", req.getReferenceUrl()); + } + if (req.getContent() != null && !req.getContent().isEmpty()) { + snap.put("content", req.getContent()); + } + aiOrder.setVideoParams(OM.writeValueAsString(snap)); + } catch (Exception e) { + aiOrder.setVideoParams("{\"error\":\"video_params_serialize_failed\"}"); + } + } + private AjaxResult submitOrderAndCreate(PortalVideoGenRequest req, String mode, ByteBodyReq byteBodyReq) { AiOrder aiOrder = aiOrderService.getAiOrder( StringUtils.isNotEmpty(req.getFunctionType()) ? req.getFunctionType() : "21"); @@ -101,20 +149,7 @@ public class PortalVideoController extends BaseController { return AjaxResult.error(-1, "You have a low balance, please recharge"); } try { - aiOrder.setText(req.getText()); - aiOrder.setMode(mode); - applyOrderImages(aiOrder, req); - if (req.getDuration() != null) { - aiOrder.setDuration(req.getDuration()); - } else if (byteBodyReq.getDuration() != null) { - aiOrder.setDuration(byteBodyReq.getDuration()); - } - if (StringUtils.isNotEmpty(byteBodyReq.getResolution())) { - aiOrder.setResolution(byteBodyReq.getResolution()); - } - if (StringUtils.isNotEmpty(byteBodyReq.getRatio())) { - aiOrder.setRatio(byteBodyReq.getRatio()); - } + fillVideoOrderRecord(aiOrder, req, mode, byteBodyReq); aiOrderService.updateAiOrder(aiOrder); String key = apiKey(); diff --git a/ruoyi-system/src/main/java/com/ruoyi/ai/domain/AiOrder.java b/ruoyi-system/src/main/java/com/ruoyi/ai/domain/AiOrder.java index 72f3864..3938055 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/ai/domain/AiOrder.java +++ b/ruoyi-system/src/main/java/com/ruoyi/ai/domain/AiOrder.java @@ -84,6 +84,12 @@ public class AiOrder extends BaseEntity { @Excel(name = "宽高比") private String ratio; + /** 火山/方舟模型 endpoint */ + private String model; + + /** 视频类订单:本次提交的完整参数 JSON(提示词、模型、时长等) */ + private String videoParams; + /** 首帧图片 */ private String img1; diff --git a/ruoyi-system/src/main/resources/mapper/system/AiOrderMapper.xml b/ruoyi-system/src/main/resources/mapper/system/AiOrderMapper.xml index c8a9b79..15280e7 100644 --- a/ruoyi-system/src/main/resources/mapper/system/AiOrderMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/AiOrderMapper.xml @@ -21,10 +21,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + + + + - select ao.id, ao.del_flag, ao.create_by, ao.create_time, ao.update_by, ao.update_time, ao.remark, ao.order_num, ao.user_id, ao.type, ao.amount, ao.result, ao.status, ao.source, ao.text, ao.is_top, au.user_id uuid from ai_order ao + select ao.id, ao.del_flag, ao.create_by, ao.create_time, ao.update_by, ao.update_time, ao.remark, ao.order_num, ao.user_id, ao.type, ao.amount, ao.result, ao.status, ao.source, ao.text, ao.is_top, ao.img1, ao.img2, ao.mode, ao.duration, ao.resolution, ao.ratio, ao.model, ao.video_params, au.user_id uuid from ai_order ao left join ai_user au on au.id = ao.user_id @@ -118,7 +126,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" amount = #{amount}, result = #{result}, status = #{status}, - status = #{source}, + source = #{source}, text = #{text}, is_top = #{isTop}, diff --git a/sql/aisql.sql b/sql/aisql.sql index 93a5097..42fa9de 100644 --- a/sql/aisql.sql +++ b/sql/aisql.sql @@ -1500,6 +1500,8 @@ CREATE TABLE `ai_order` ( `duration` int NULL DEFAULT 5 COMMENT '视频时长(秒)', `resolution` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '720p' COMMENT '分辨率', `ratio` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '9:16' COMMENT '宽高比', + `model` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '火山模型 endpoint', + `video_params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '视频生成提交参数JSON', PRIMARY KEY (`id`) USING BTREE, KEY `idx_order_num` (`order_num`) USING BTREE, KEY `idx_user_id` (`user_id`) USING BTREE