From 903dc7ce93827d67887141a1a4cada9eeb3f8661 Mon Sep 17 00:00:00 2001
From: shenaowei <450702724@qq.com>
Date: Tue, 24 Feb 2026 22:11:30 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/app/web-gold/src/router/index.js | 1 -
.../web-gold/src/views/kling/IdentifyFace.vue | 4 +-
.../src/views/material/MixTaskList.vue | 713 ------------------
.../digital-human-task/index.vue | 1 +
.../proposals/points-service-integration.md | 305 --------
5 files changed, 4 insertions(+), 1020 deletions(-)
delete mode 100644 frontend/app/web-gold/src/views/material/MixTaskList.vue
delete mode 100644 openspec/proposals/points-service-integration.md
diff --git a/frontend/app/web-gold/src/router/index.js b/frontend/app/web-gold/src/router/index.js
index 983d9bafb0..f430d91f29 100644
--- a/frontend/app/web-gold/src/router/index.js
+++ b/frontend/app/web-gold/src/router/index.js
@@ -104,7 +104,6 @@ function buildRoutesFromNav(config) {
const hiddenRoutes = [
{ path: 'trends/heat', name: '热度分析', component: () => import('../views/trends/Heat.vue'), meta: { hidden: true } },
- { path: 'material/mix-task', name: '混剪任务', component: () => import('../views/material/MixTaskList.vue'), meta: { hidden: true } },
{ path: 'material/group', name: '素材分组', component: () => import('../views/material/MaterialGroup.vue'), meta: { hidden: true } },
{ path: 'user/profile', name: '个人中心', component: () => import('../views/user/Profile.vue'), meta: { hidden: true } }
]
diff --git a/frontend/app/web-gold/src/views/kling/IdentifyFace.vue b/frontend/app/web-gold/src/views/kling/IdentifyFace.vue
index c015b7ec08..5e050c2063 100644
--- a/frontend/app/web-gold/src/views/kling/IdentifyFace.vue
+++ b/frontend/app/web-gold/src/views/kling/IdentifyFace.vue
@@ -192,7 +192,7 @@
当前余额
- 2,450 积分
+ {{ userStore.remainingPoints.toLocaleString() }} 积分
@@ -209,6 +209,7 @@
import { ref } from 'vue'
import { CloudUploadOutlined, CrownFilled } from '@ant-design/icons-vue'
import { useVoiceCopyStore } from '@/stores/voiceCopy'
+import { useUserStore } from '@/stores/user'
import VideoSelector from '@/components/VideoSelector.vue'
import VoiceSelector from '@/components/VoiceSelector.vue'
import ResultPanel from '@/components/ResultPanel.vue'
@@ -219,6 +220,7 @@ import PipelineProgress from '@/components/PipelineProgress.vue'
import { useIdentifyFaceController } from './hooks/useIdentifyFaceController'
const voiceStore = useVoiceCopyStore()
+const userStore = useUserStore()
const dragOver = ref(false)
// ==================== 初始化 Controller ====================
diff --git a/frontend/app/web-gold/src/views/material/MixTaskList.vue b/frontend/app/web-gold/src/views/material/MixTaskList.vue
deleted file mode 100644
index d4f96a2222..0000000000
--- a/frontend/app/web-gold/src/views/material/MixTaskList.vue
+++ /dev/null
@@ -1,713 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
- 全部状态
- 待处理
- 处理中
- 已完成
- 失败
-
-
-
-
-
-
-
-
-
-
- 查询
- 重置
-
-
-
-
-
-
-
-
-
-
-
-
{{ record.title }}
-
有文案
-
-
-
-
-
-
- {{ getStatusText(record.status) }}
-
-
-
-
-
-
-
{{ record.progress }}%
-
-
-
-
-
-
- {{ formatDate(record.createTime) }}
-
-
-
-
- {{ record.finishTime ? formatDate(record.finishTime) : '-' }}
-
-
-
-
-
-
{{ record.outputUrls.length }} 个视频
-
- -
-
-
-
-
-
-
-
-
-
- 下载
-
-
- 取消
-
- handleDelete(record.id)"
- >
- 删除
-
-
-
-
-
-
-
-
-
-
-
文案内容:
-
{{ record.text }}
-
-
-
-
-
生成结果:
-
-
-
-
- 视频 {{ index + 1 }}
-
-
-
-
-
- 视频 {{ index + 1 }} (处理中...)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/app/web-gold/src/views/system/task-management/digital-human-task/index.vue b/frontend/app/web-gold/src/views/system/task-management/digital-human-task/index.vue
index e30b3bc3f4..83593a52f5 100644
--- a/frontend/app/web-gold/src/views/system/task-management/digital-human-task/index.vue
+++ b/frontend/app/web-gold/src/views/system/task-management/digital-human-task/index.vue
@@ -141,6 +141,7 @@
diff --git a/openspec/proposals/points-service-integration.md b/openspec/proposals/points-service-integration.md
deleted file mode 100644
index 6a759f6005..0000000000
--- a/openspec/proposals/points-service-integration.md
+++ /dev/null
@@ -1,305 +0,0 @@
-# AI 服务积分扣减公共服务设计文档
-
-> 版本: v1.2
-> 日期: 2025-02-20
-> 状态: 待确认
-> 用途: 业务规范文档,供后续开发参考
-
----
-
-# 模块一:公共积分扣减服务
-
-## 1.1 服务定位
-
-**积分扣减公共服务** - 位于 `tik` 模块下,供所有 AI 服务复用的基础设施。
-
-**职责:**
-- 积分配置查询
-- 积分预检与扣减
-- 预扣记录管理
-- 积分流水记录
-
-## 1.2 核心能力
-
-| 能力 | 说明 | 使用场景 |
-|------|------|---------|
-| 获取积分配置 | 根据平台+类型获取消耗积分 | 所有业务调用前 |
-| 预检积分 | 检查余额是否充足,不足抛异常 | 调用前验证 |
-| 即时扣减 | 直接扣减并记录流水 | 同步调用成功后 |
-| 创建预扣 | 创建待确认的扣减记录 | 流式/异步任务开始时 |
-| 确认扣减 | 确认预扣,实际扣减积分 | 流式结束/任务成功时 |
-| 取消预扣 | 删除预扣记录,不扣费 | 流式出错/任务失败时 |
-
-## 1.3 数据模型
-
-### 用户积分(muye_member_user_profile)
-- `remaining_points` - 剩余积分(扣减来源)
-- `used_points` - 已用积分
-
-### 积分记录(muye_point_record)
-- `point_amount` - 变动数量(负数为扣减)
-- `biz_type` - 业务类型(dify_chat/voice_tts 等)
-- `biz_id` - 业务关联ID
-- `status` - 状态:`pending`(预扣) / `confirmed`(已确认) / `canceled`(已取消)
-
-### 积分配置(muye_ai_model_config)
-- `platform` - 平台:dify / tikhub / voice / digital_human
-- `model_type` - 类型:high/low / tts/clone / latentsync/kling
-- `consume_points` - 消耗积分
-- `api_key` - API 密钥(Dify 工作流密钥等)★
-- `api_url` - API 地址(可选,覆盖默认配置)
-
-## 1.4 业务规则
-
-### 积分扣减规则
-- **原子性**:使用 SQL 条件更新,确保不会超扣
-- **乐观锁**:`WHERE remaining_points >= points`
-- **幂等性**:同一预扣记录只能确认/取消一次
-
-### 预扣过期规则
-- 预扣记录超过 30 分钟自动清理
-- 定时任务每 5 分钟执行一次清理
-
-### 异常处理
-- 积分不足:抛出 `POINTS_INSUFFICIENT` 异常
-- 配置不存在:抛出 `POINTS_CONFIG_NOT_FOUND` 异常
-- 扣减失败:抛出 `POINTS_DEDUCT_FAILED` 异常
-
-## 1.5 依赖关系
-
-```
-业务服务(Dify/TikHub/Voice/DigitalHuman)
- ↓
- PointsService(公共服务)
- ↓
- ├── AiModelConfigService → 获取积分配置
- ├── MemberUserProfileMapper → 扣减积分
- └── PointRecordMapper → 记录流水
-```
-
----
-
-# 模块二:Dify 工作流集成
-
-## 2.1 业务概述
-
-**Dify 工作流** - AI 对话服务,支持智能体配置和流式响应。
-
-**设计原则:**
-- 所有智能体共用一个"文案生成"工作流(同一个 api_key)
-- 智能体之间只通过 `systemPrompt` 区分
-- 前端只需传 `agentId`
-
-**核心流程:**
-1. 前端传入 `agentId` + `content`
-2. 后端通过 `agentId` 获取智能体的 `systemPrompt`
-3. 调用 Dify API(固定工作流),传入 `sysPrompt` 参数
-4. 流式返回内容
-5. 流结束或用户停止时扣费
-
-## 2.2 扣费流程
-
-```
-┌─────────────────────────────────────────────────────────────┐
-│ Dify 流式扣费流程 │
-├─────────────────────────────────────────────────────────────┤
-│ 1. 获取智能体配置(systemPrompt) │
-│ 2. 获取积分配置(platform=dify) │
-│ 3. 预检积分 → 积分不足则拒绝 │
-│ 4. 创建预扣记录 │
-│ 5. 调用 Dify 流式 API(传入 sysPrompt) │
-│ ├─ 流正常结束 → 确认扣费(全额) │
-│ ├─ 用户取消 → 确认扣费(按实际消耗或最低消费) │
-│ └─ 出错 → 取消预扣(不扣费) │
-│ 6. 记录使用记录 │
-└─────────────────────────────────────────────────────────────┘
-```
-
-## 2.3 接口定义
-
-### 阻塞模式
-- **URL**: `POST /api/tik/dify/chat`
-- **入参**: agentId, content, conversationId
-- **出参**: content, conversationId, consumePoints
-
-### 流式模式
-- **URL**: `POST /api/tik/dify/chat/stream`
-- **入参**: agentId, content, conversationId
-- **出参**: SSE 流(event: message / done)
-
-**说明:**
-- `agentId` 用于获取智能体的 `systemPrompt`
-- 所有智能体共用同一个 Dify 工作流
-
-## 2.4 配置方案
-
-**Dify 配置存储在 `muye_ai_model_config` 表:**
-
-| 字段 | 值 | 说明 |
-|------|-----|------|
-| model_name | Dify 文案生成 | 配置名称 |
-| platform | dify | 平台标识 |
-| model_type | writing | 类型 |
-| consume_points | 10 | 消耗积分 |
-| api_key | app-xxx | Dify 工作流密钥 ★ |
-| status | 1 | 启用 |
-
-**配置文件只存公共配置:**
-
-```yaml
-yudao:
- dify:
- api-url: http://8.155.172.147:8088
- timeout: 60
-```
-
-## 2.5 智能体表(无需修改)
-
-现有 `muye_ai_agent` 表已有字段:
-
-| 字段 | 说明 |
-|------|------|
-| agent_id | 智能体ID |
-| agent_name | 智能体名称 |
-| system_prompt | 系统提示词(传递给 Dify 的 sysPrompt 参数) |
-| status | 状态 |
-
-**调用流程:**
-1. 通过 `agentId` 获取智能体的 `systemPrompt`
-2. 从 `muye_ai_model_config` 获取 `api_key` + `consume_points`(platform=dify)
-3. 调用 Dify API,传入 `sysPrompt` 参数
-
----
-
-# 模块三:各业务积分扣减集成
-
-## 3.1 扣费模式总览
-
-| 业务 | 扣费模式 | 扣费时机 | 失败处理 |
-|------|---------|---------|---------|
-| Dify 工作流 | 流式结束扣费 | 流结束/用户停止时 | 不扣费 |
-| TikHub | 成功后扣费 | API 调用成功后 | 不扣费 |
-| 语音合成 | 成功后扣费 | TTS 生成成功后 | 不扣费 |
-| 数字人合成 | 任务完成扣费 | 任务成功完成时 | 不扣费 |
-
-**统一原则:失败不扣费**
-
-## 3.2 TikHub 集成
-
-### 业务场景
-- 抖音/小红书数据抓取
-- 用户信息、视频、帖子等
-
-### 扣费流程
-```
-1. 获取积分配置(platform=tikhub, modelType=fetch)
-2. 预检积分
-3. 调用 TikHub API
-4. 成功 → 扣减积分
-5. 失败 → 不扣费
-```
-
-### 积分配置
-| platform | model_type | consume_points |
-|----------|------------|----------------|
-| tikhub | fetch | 5 |
-
-## 3.3 语音合成集成
-
-### 业务场景
-- TTS 语音生成
-- 音色克隆
-
-### 扣费流程
-```
-1. 获取积分配置(platform=voice, modelType=tts/clone)
-2. 预检积分
-3. 执行语音合成
-4. 成功 → 扣减积分
-5. 失败 → 不扣费
-```
-
-### 积分配置
-| platform | model_type | consume_points |
-|----------|------------|----------------|
-| voice | tts | 2 |
-| voice | clone | 10 |
-
-## 3.4 数字人合成集成
-
-### 业务场景
-- 口型同步视频生成
-- 支持 Latentsync / 可灵 两种供应商
-
-### 扣费流程
-```
-1. 获取积分配置(platform=digital_human, modelType=latentsync/kling)
-2. 预检积分
-3. 创建预扣记录
-4. 创建任务并异步处理
-5. 任务成功 → 确认扣费
-6. 任务失败/取消 → 取消预扣
-```
-
-### 积分配置
-| platform | model_type | consume_points |
-|----------|------------|----------------|
-| digital_human | latentsync | 15 |
-| digital_human | kling | 20 |
-
----
-
-# 附录
-
-## A. 业务类型枚举
-
-| 类型码 | 说明 |
-|--------|------|
-| dify_chat | Dify对话 |
-| ai_chat | AI聊天 |
-| image_gen | 图像生成 |
-| tikhub_fetch | TikHub数据抓取 |
-| voice_tts | 语音合成 |
-| voice_clone | 音色克隆 |
-| digital_human | 数字人合成 |
-| kling_video | 可灵视频 |
-
-## B. 异常码
-
-| 错误码 | 说明 |
-|--------|------|
-| 1001001 | 积分不足 |
-| 1001002 | 积分配置不存在 |
-| 1001003 | 积分扣减失败 |
-
-## C. 开发计划
-
-| 步骤 | 内容 |
-|------|------|
-| 1 | 数据库:muye_point_record 新增 status 字段 |
-| 2 | 公共服务:PointsService 接口 + 实现 |
-| 3 | Dify 集成:配置类 + 客户端 + 服务 + Controller |
-| 4 | TikHub 集成:添加积分扣减逻辑 |
-| 5 | 语音合成集成:添加积分扣减逻辑 |
-| 6 | 数字人集成:添加积分扣减逻辑 |
-| 7 | 测试验证 |
-
-**无需修改的表:**
-- `muye_ai_agent` - 无需改动
-- `muye_ai_model_config` - 已有 api_key 字段,无需改动
-
-## D. 成熟度检查
-
-| 检查项 | 说明 |
-|--------|------|
-| 原子扣减 | SQL 条件更新,防止超扣 |
-| 乐观锁 | WHERE remaining_points >= points |
-| 预扣机制 | 支持流式/异步场景 |
-| 过期清理 | 30分钟自动清理预扣 |
-| 事务隔离 | 核心操作加事务 |
-| 异常处理 | 统一错误码 |
-| 配置化 | 积分消耗可配置 |
-| 业务解耦 | 公共服务复用 |
-
----
-