Merge pull request !158 from xingyu/dev
pull/159/MERGE
xingyu 2025-06-26 09:46:57 +00:00 committed by Gitee
commit 127e5ad9b6
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
107 changed files with 923 additions and 507 deletions

View File

@ -3,7 +3,7 @@ import type { PageResult } from '@vben/request';
import { requestClient } from '#/api/request'; import { requestClient } from '#/api/request';
export namespace AiChatConversationApi { export namespace AiChatConversationApi {
export interface ChatConversationVO { export interface ChatConversation {
id: number; // ID 编号 id: number; // ID 编号
userId: number; // 用户编号 userId: number; // 用户编号
title: string; // 对话标题 title: string; // 对话标题
@ -26,21 +26,21 @@ export namespace AiChatConversationApi {
// 获得【我的】聊天对话 // 获得【我的】聊天对话
export function getChatConversationMy(id: number) { export function getChatConversationMy(id: number) {
return requestClient.get<AiChatConversationApi.ChatConversationVO>( return requestClient.get<AiChatConversationApi.ChatConversation>(
`/ai/chat/conversation/get-my?id=${id}`, `/ai/chat/conversation/get-my?id=${id}`,
); );
} }
// 新增【我的】聊天对话 // 新增【我的】聊天对话
export function createChatConversationMy( export function createChatConversationMy(
data: AiChatConversationApi.ChatConversationVO, data: AiChatConversationApi.ChatConversation,
) { ) {
return requestClient.post('/ai/chat/conversation/create-my', data); return requestClient.post('/ai/chat/conversation/create-my', data);
} }
// 更新【我的】聊天对话 // 更新【我的】聊天对话
export function updateChatConversationMy( export function updateChatConversationMy(
data: AiChatConversationApi.ChatConversationVO, data: AiChatConversationApi.ChatConversation,
) { ) {
return requestClient.put(`/ai/chat/conversation/update-my`, data); return requestClient.put(`/ai/chat/conversation/update-my`, data);
} }
@ -57,7 +57,7 @@ export function deleteChatConversationMyByUnpinned() {
// 获得【我的】聊天对话列表 // 获得【我的】聊天对话列表
export function getChatConversationMyList() { export function getChatConversationMyList() {
return requestClient.get<AiChatConversationApi.ChatConversationVO[]>( return requestClient.get<AiChatConversationApi.ChatConversation[]>(
`/ai/chat/conversation/my-list`, `/ai/chat/conversation/my-list`,
); );
} }
@ -65,7 +65,7 @@ export function getChatConversationMyList() {
// 获得【我的】聊天对话列表 // 获得【我的】聊天对话列表
export function getChatConversationPage(params: any) { export function getChatConversationPage(params: any) {
return requestClient.get< return requestClient.get<
PageResult<AiChatConversationApi.ChatConversationVO[]> PageResult<AiChatConversationApi.ChatConversation[]>
>(`/ai/chat/conversation/page`, { params }); >(`/ai/chat/conversation/page`, { params });
} }

View File

@ -9,7 +9,7 @@ import { requestClient } from '#/api/request';
const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD); const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD);
const accessStore = useAccessStore(); const accessStore = useAccessStore();
export namespace AiChatMessageApi { export namespace AiChatMessageApi {
export interface ChatMessageVO { export interface ChatMessage {
id: number; // 编号 id: number; // 编号
conversationId: number; // 对话编号 conversationId: number; // 对话编号
type: string; // 消息类型 type: string; // 消息类型
@ -36,7 +36,7 @@ export namespace AiChatMessageApi {
export function getChatMessageListByConversationId( export function getChatMessageListByConversationId(
conversationId: null | number, conversationId: null | number,
) { ) {
return requestClient.get<AiChatMessageApi.ChatMessageVO[]>( return requestClient.get<AiChatMessageApi.ChatMessage[]>(
`/ai/chat/message/list-by-conversation-id?conversationId=${conversationId}`, `/ai/chat/message/list-by-conversation-id?conversationId=${conversationId}`,
); );
} }
@ -84,7 +84,7 @@ export function deleteByConversationId(conversationId: number) {
} }
// 获得消息分页 // 获得消息分页
export function getChatMessagePage(params: any) { export function getChatMessagePage(params: any) {
return requestClient.get<PageResult<AiChatMessageApi.ChatMessageVO>>( return requestClient.get<PageResult<AiChatMessageApi.ChatMessage>>(
'/ai/chat/message/page', '/ai/chat/message/page',
{ params }, { params },
); );

View File

@ -3,14 +3,14 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request'; import { requestClient } from '#/api/request';
export namespace AiImageApi { export namespace AiImageApi {
export interface ImageMidjourneyButtonsVO { export interface ImageMidjourneyButtons {
customId: string; // MJ::JOB::upsample::1::85a4b4c1-8835-46c5-a15c-aea34fad1862 动作标识 customId: string; // MJ::JOB::upsample::1::85a4b4c1-8835-46c5-a15c-aea34fad1862 动作标识
emoji: string; // 图标 emoji emoji: string; // 图标 emoji
label: string; // Make Variations 文本 label: string; // Make Variations 文本
style: number; // 样式: 2Primary、3Green style: number; // 样式: 2Primary、3Green
} }
// AI 绘图 VO // AI 绘图
export interface ImageVO { export interface Image {
id: number; // 编号 id: number; // 编号
platform: string; // 平台 platform: string; // 平台
model: string; // 模型 model: string; // 模型
@ -23,12 +23,12 @@ export namespace AiImageApi {
errorMessage: string; // 错误信息 errorMessage: string; // 错误信息
options: any; // 配置 Map<string, string> options: any; // 配置 Map<string, string>
taskId: number; // 任务编号 taskId: number; // 任务编号
buttons: ImageMidjourneyButtonsVO[]; // mj 操作按钮 buttons: ImageMidjourneyButtons[]; // mj 操作按钮
createTime: Date; // 创建时间 createTime: Date; // 创建时间
finishTime: Date; // 完成时间 finishTime: Date; // 完成时间
} }
export interface ImageDrawReqVO { export interface ImageDrawReq {
prompt: string; // 提示词 prompt: string; // 提示词
modelId: number; // 模型 modelId: number; // 模型
style: string; // 图像生成的风格 style: string; // 图像生成的风格
@ -37,7 +37,7 @@ export namespace AiImageApi {
options: object; // 绘制参数Map<String, String> options: object; // 绘制参数Map<String, String>
} }
export interface ImageMidjourneyImagineReqVO { export interface ImageMidjourneyImagineReq {
prompt: string; // 提示词 prompt: string; // 提示词
modelId: number; // 模型 modelId: number; // 模型
base64Array?: string[]; // size不能为空 base64Array?: string[]; // size不能为空
@ -46,7 +46,7 @@ export namespace AiImageApi {
version: string; // 版本 version: string; // 版本
} }
export interface ImageMidjourneyActionVO { export interface ImageMidjourneyAction {
id: number; // 图片编号 id: number; // 图片编号
customId: string; // MJ::JOB::upsample::1::85a4b4c1-8835-46c5-a15c-aea34fad1862 动作标识 customId: string; // MJ::JOB::upsample::1::85a4b4c1-8835-46c5-a15c-aea34fad1862 动作标识
} }
@ -54,26 +54,25 @@ export namespace AiImageApi {
// 获取【我的】绘图分页 // 获取【我的】绘图分页
export function getImagePageMy(params: PageParam) { export function getImagePageMy(params: PageParam) {
return requestClient.get<PageResult<AiImageApi.ImageVO>>( return requestClient.get<PageResult<AiImageApi.Image>>('/ai/image/my-page', {
'/ai/image/my-page', params,
{ params }, });
);
} }
// 获取【我的】绘图记录 // 获取【我的】绘图记录
export function getImageMy(id: number) { export function getImageMy(id: number) {
return requestClient.get<AiImageApi.ImageVO>(`/ai/image/get-my?id=${id}`); return requestClient.get<AiImageApi.Image>(`/ai/image/get-my?id=${id}`);
} }
// 获取【我的】绘图记录列表 // 获取【我的】绘图记录列表
export function getImageListMyByIds(ids: number[]) { export function getImageListMyByIds(ids: number[]) {
return requestClient.get<AiImageApi.ImageVO[]>(`/ai/image/my-list-by-ids`, { return requestClient.get<AiImageApi.Image[]>(`/ai/image/my-list-by-ids`, {
params: { ids: ids.join(',') }, params: { ids: ids.join(',') },
}); });
} }
// 生成图片 // 生成图片
export function drawImage(data: AiImageApi.ImageDrawReqVO) { export function drawImage(data: AiImageApi.ImageDrawReq) {
return requestClient.post(`/ai/image/draw`, data); return requestClient.post(`/ai/image/draw`, data);
} }
@ -84,21 +83,19 @@ export function deleteImageMy(id: number) {
// ================ midjourney 专属 ================ // ================ midjourney 专属 ================
// 【Midjourney】生成图片 // 【Midjourney】生成图片
export function midjourneyImagine( export function midjourneyImagine(data: AiImageApi.ImageMidjourneyImagineReq) {
data: AiImageApi.ImageMidjourneyImagineReqVO,
) {
return requestClient.post(`/ai/image/midjourney/imagine`, data); return requestClient.post(`/ai/image/midjourney/imagine`, data);
} }
// 【Midjourney】Action 操作(二次生成图片) // 【Midjourney】Action 操作(二次生成图片)
export function midjourneyAction(data: AiImageApi.ImageMidjourneyActionVO) { export function midjourneyAction(data: AiImageApi.ImageMidjourneyAction) {
return requestClient.post(`/ai/image/midjourney/action`, data); return requestClient.post(`/ai/image/midjourney/action`, data);
} }
// ================ 绘图管理 ================ // ================ 绘图管理 ================
// 查询绘画分页 // 查询绘画分页
export function getImagePage(params: any) { export function getImagePage(params: any) {
return requestClient.get<AiImageApi.ImageVO[]>(`/ai/image/page`, { params }); return requestClient.get<AiImageApi.Image[]>(`/ai/image/page`, { params });
} }
// 更新绘画发布状态 // 更新绘画发布状态

View File

@ -3,7 +3,7 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request'; import { requestClient } from '#/api/request';
export namespace AiKnowledgeDocumentApi { export namespace AiKnowledgeDocumentApi {
export interface KnowledgeDocumentVO { export interface KnowledgeDocument {
id: number; // 编号 id: number; // 编号
knowledgeId: number; // 知识库编号 knowledgeId: number; // 知识库编号
name: string; // 文档名称 name: string; // 文档名称
@ -18,7 +18,7 @@ export namespace AiKnowledgeDocumentApi {
// 查询知识库文档分页 // 查询知识库文档分页
export function getKnowledgeDocumentPage(params: PageParam) { export function getKnowledgeDocumentPage(params: PageParam) {
return requestClient.get< return requestClient.get<
PageResult<AiKnowledgeDocumentApi.KnowledgeDocumentVO> PageResult<AiKnowledgeDocumentApi.KnowledgeDocument>
>('/ai/knowledge/document/page', { params }); >('/ai/knowledge/document/page', { params });
} }

View File

@ -3,7 +3,7 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request'; import { requestClient } from '#/api/request';
export namespace AiKnowledgeKnowledgeApi { export namespace AiKnowledgeKnowledgeApi {
export interface KnowledgeVO { export interface Knowledge {
id: number; // 编号 id: number; // 编号
name: string; // 知识库名称 name: string; // 知识库名称
description: string; // 知识库描述 description: string; // 知识库描述
@ -15,7 +15,7 @@ export namespace AiKnowledgeKnowledgeApi {
// 查询知识库分页 // 查询知识库分页
export function getKnowledgePage(params: PageParam) { export function getKnowledgePage(params: PageParam) {
return requestClient.get<PageResult<AiKnowledgeKnowledgeApi.KnowledgeVO>>( return requestClient.get<PageResult<AiKnowledgeKnowledgeApi.Knowledge>>(
'/ai/knowledge/page', '/ai/knowledge/page',
{ params }, { params },
); );
@ -23,17 +23,17 @@ export function getKnowledgePage(params: PageParam) {
// 查询知识库详情 // 查询知识库详情
export function getKnowledge(id: number) { export function getKnowledge(id: number) {
return requestClient.get<AiKnowledgeKnowledgeApi.KnowledgeVO>( return requestClient.get<AiKnowledgeKnowledgeApi.Knowledge>(
`/ai/knowledge/get?id=${id}`, `/ai/knowledge/get?id=${id}`,
); );
} }
// 新增知识库 // 新增知识库
export function createKnowledge(data: AiKnowledgeKnowledgeApi.KnowledgeVO) { export function createKnowledge(data: AiKnowledgeKnowledgeApi.Knowledge) {
return requestClient.post('/ai/knowledge/create', data); return requestClient.post('/ai/knowledge/create', data);
} }
// 修改知识库 // 修改知识库
export function updateKnowledge(data: AiKnowledgeKnowledgeApi.KnowledgeVO) { export function updateKnowledge(data: AiKnowledgeKnowledgeApi.Knowledge) {
return requestClient.put('/ai/knowledge/update', data); return requestClient.put('/ai/knowledge/update', data);
} }
@ -44,7 +44,7 @@ export function deleteKnowledge(id: number) {
// 获取知识库简单列表 // 获取知识库简单列表
export function getSimpleKnowledgeList() { export function getSimpleKnowledgeList() {
return requestClient.get<AiKnowledgeKnowledgeApi.KnowledgeVO[]>( return requestClient.get<AiKnowledgeKnowledgeApi.Knowledge[]>(
'/ai/knowledge/simple-list', '/ai/knowledge/simple-list',
); );
} }

View File

@ -3,8 +3,8 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request'; import { requestClient } from '#/api/request';
export namespace AiKnowledgeSegmentApi { export namespace AiKnowledgeSegmentApi {
// AI 知识库分段 VO // AI 知识库分段
export interface KnowledgeSegmentVO { export interface KnowledgeSegment {
id: number; // 编号 id: number; // 编号
documentId: number; // 文档编号 documentId: number; // 文档编号
knowledgeId: number; // 知识库编号 knowledgeId: number; // 知识库编号
@ -20,27 +20,28 @@ export namespace AiKnowledgeSegmentApi {
// 查询知识库分段分页 // 查询知识库分段分页
export function getKnowledgeSegmentPage(params: PageParam) { export function getKnowledgeSegmentPage(params: PageParam) {
return requestClient.get< return requestClient.get<PageResult<AiKnowledgeSegmentApi.KnowledgeSegment>>(
PageResult<AiKnowledgeSegmentApi.KnowledgeSegmentVO> '/ai/knowledge/segment/page',
>('/ai/knowledge/segment/page', { params }); { params },
);
} }
// 查询知识库分段详情 // 查询知识库分段详情
export function getKnowledgeSegment(id: number) { export function getKnowledgeSegment(id: number) {
return requestClient.get<AiKnowledgeSegmentApi.KnowledgeSegmentVO>( return requestClient.get<AiKnowledgeSegmentApi.KnowledgeSegment>(
`/ai/knowledge/segment/get?id=${id}`, `/ai/knowledge/segment/get?id=${id}`,
); );
} }
// 新增知识库分段 // 新增知识库分段
export function createKnowledgeSegment( export function createKnowledgeSegment(
data: AiKnowledgeSegmentApi.KnowledgeSegmentVO, data: AiKnowledgeSegmentApi.KnowledgeSegment,
) { ) {
return requestClient.post('/ai/knowledge/segment/create', data); return requestClient.post('/ai/knowledge/segment/create', data);
} }
// 修改知识库分段 // 修改知识库分段
export function updateKnowledgeSegment( export function updateKnowledgeSegment(
data: AiKnowledgeSegmentApi.KnowledgeSegmentVO, data: AiKnowledgeSegmentApi.KnowledgeSegment,
) { ) {
return requestClient.put('/ai/knowledge/segment/update', data); return requestClient.put('/ai/knowledge/segment/update', data);
} }

View File

@ -7,8 +7,8 @@ import { requestClient } from '#/api/request';
const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD); const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD);
const accessStore = useAccessStore(); const accessStore = useAccessStore();
export namespace AiMindmapApi { export namespace AiMindmapApi {
// AI 思维导图 VO // AI 思维导图
export interface MindMapVO { export interface MindMap {
id: number; // 编号 id: number; // 编号
userId: number; // 用户编号 userId: number; // 用户编号
prompt: string; // 生成内容提示 prompt: string; // 生成内容提示
@ -18,8 +18,8 @@ export namespace AiMindmapApi {
errorMessage: string; // 错误信息 errorMessage: string; // 错误信息
} }
// AI 思维导图生成 VO // AI 思维导图生成
export interface AiMindMapGenerateReqVO { export interface AiMindMapGenerateReq {
prompt: string; prompt: string;
} }
} }
@ -32,7 +32,7 @@ export function generateMindMap({
ctrl, ctrl,
}: { }: {
ctrl: AbortController; ctrl: AbortController;
data: AiMindmapApi.AiMindMapGenerateReqVO; data: AiMindmapApi.AiMindMapGenerateReq;
onClose?: (...args: any[]) => void; onClose?: (...args: any[]) => void;
onError?: (...args: any[]) => void; onError?: (...args: any[]) => void;
onMessage?: (res: any) => void; onMessage?: (res: any) => void;

View File

@ -3,7 +3,7 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request'; import { requestClient } from '#/api/request';
export namespace AiModelApiKeyApi { export namespace AiModelApiKeyApi {
export interface ApiKeyVO { export interface ApiKey {
id: number; // 编号 id: number; // 编号
name: string; // 名称 name: string; // 名称
apiKey: string; // 密钥 apiKey: string; // 密钥
@ -15,7 +15,7 @@ export namespace AiModelApiKeyApi {
// 查询 API 密钥分页 // 查询 API 密钥分页
export function getApiKeyPage(params: PageParam) { export function getApiKeyPage(params: PageParam) {
return requestClient.get<PageResult<AiModelApiKeyApi.ApiKeyVO>>( return requestClient.get<PageResult<AiModelApiKeyApi.ApiKey>>(
'/ai/api-key/page', '/ai/api-key/page',
{ params }, { params },
); );
@ -23,24 +23,22 @@ export function getApiKeyPage(params: PageParam) {
// 获得 API 密钥列表 // 获得 API 密钥列表
export function getApiKeySimpleList() { export function getApiKeySimpleList() {
return requestClient.get<AiModelApiKeyApi.ApiKeyVO[]>( return requestClient.get<AiModelApiKeyApi.ApiKey[]>(
'/ai/api-key/simple-list', '/ai/api-key/simple-list',
); );
} }
// 查询 API 密钥详情 // 查询 API 密钥详情
export function getApiKey(id: number) { export function getApiKey(id: number) {
return requestClient.get<AiModelApiKeyApi.ApiKeyVO>( return requestClient.get<AiModelApiKeyApi.ApiKey>(`/ai/api-key/get?id=${id}`);
`/ai/api-key/get?id=${id}`,
);
} }
// 新增 API 密钥 // 新增 API 密钥
export function createApiKey(data: AiModelApiKeyApi.ApiKeyVO) { export function createApiKey(data: AiModelApiKeyApi.ApiKey) {
return requestClient.post('/ai/api-key/create', data); return requestClient.post('/ai/api-key/create', data);
} }
// 修改 API 密钥 // 修改 API 密钥
export function updateApiKey(data: AiModelApiKeyApi.ApiKeyVO) { export function updateApiKey(data: AiModelApiKeyApi.ApiKey) {
return requestClient.put('/ai/api-key/update', data); return requestClient.put('/ai/api-key/update', data);
} }

View File

@ -3,7 +3,7 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request'; import { requestClient } from '#/api/request';
export namespace AiModelChatRoleApi { export namespace AiModelChatRoleApi {
export interface ChatRoleVO { export interface ChatRole {
id: number; // 角色编号 id: number; // 角色编号
modelId: number; // 模型编号 modelId: number; // 模型编号
name: string; // 角色名称 name: string; // 角色名称
@ -19,8 +19,8 @@ export namespace AiModelChatRoleApi {
toolIds?: number[]; // 引用的工具 ID 列表 toolIds?: number[]; // 引用的工具 ID 列表
} }
// AI 聊天角色 分页请求 vo // AI 聊天角色 分页请求
export interface ChatRolePageReqVO { export interface ChatRolePageReq {
name?: string; // 角色名称 name?: string; // 角色名称
category?: string; // 角色类别 category?: string; // 角色类别
publicStatus: boolean; // 是否公开 publicStatus: boolean; // 是否公开
@ -31,7 +31,7 @@ export namespace AiModelChatRoleApi {
// 查询聊天角色分页 // 查询聊天角色分页
export function getChatRolePage(params: PageParam) { export function getChatRolePage(params: PageParam) {
return requestClient.get<PageResult<AiModelChatRoleApi.ChatRoleVO>>( return requestClient.get<PageResult<AiModelChatRoleApi.ChatRole>>(
'/ai/chat-role/page', '/ai/chat-role/page',
{ params }, { params },
); );
@ -39,17 +39,17 @@ export function getChatRolePage(params: PageParam) {
// 查询聊天角色详情 // 查询聊天角色详情
export function getChatRole(id: number) { export function getChatRole(id: number) {
return requestClient.get<AiModelChatRoleApi.ChatRoleVO>( return requestClient.get<AiModelChatRoleApi.ChatRole>(
`/ai/chat-role/get?id=${id}`, `/ai/chat-role/get?id=${id}`,
); );
} }
// 新增聊天角色 // 新增聊天角色
export function createChatRole(data: AiModelChatRoleApi.ChatRoleVO) { export function createChatRole(data: AiModelChatRoleApi.ChatRole) {
return requestClient.post('/ai/chat-role/create', data); return requestClient.post('/ai/chat-role/create', data);
} }
// 修改聊天角色 // 修改聊天角色
export function updateChatRole(data: AiModelChatRoleApi.ChatRoleVO) { export function updateChatRole(data: AiModelChatRoleApi.ChatRole) {
return requestClient.put('/ai/chat-role/update', data); return requestClient.put('/ai/chat-role/update', data);
} }
@ -60,7 +60,7 @@ export function deleteChatRole(id: number) {
// ======= chat 聊天 // ======= chat 聊天
// 获取 my role // 获取 my role
export function getMyPage(params: AiModelChatRoleApi.ChatRolePageReqVO) { export function getMyPage(params: AiModelChatRoleApi.ChatRolePageReq) {
return requestClient.get('/ai/chat-role/my-page', { params }); return requestClient.get('/ai/chat-role/my-page', { params });
} }
@ -70,12 +70,12 @@ export function getCategoryList() {
} }
// 创建角色 // 创建角色
export function createMy(data: AiModelChatRoleApi.ChatRoleVO) { export function createMy(data: AiModelChatRoleApi.ChatRole) {
return requestClient.post('/ai/chat-role/create-my', data); return requestClient.post('/ai/chat-role/create-my', data);
} }
// 更新角色 // 更新角色
export function updateMy(data: AiModelChatRoleApi.ChatRoleVO) { export function updateMy(data: AiModelChatRoleApi.ChatRole) {
return requestClient.put('/ai/chat-role/update', data); return requestClient.put('/ai/chat-role/update', data);
} }

View File

@ -3,7 +3,7 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request'; import { requestClient } from '#/api/request';
export namespace AiModelModelApi { export namespace AiModelModelApi {
export interface ModelVO { export interface Model {
id: number; // 编号 id: number; // 编号
keyId: number; // API 秘钥编号 keyId: number; // API 秘钥编号
name: string; // 模型名字 name: string; // 模型名字
@ -20,7 +20,7 @@ export namespace AiModelModelApi {
// 查询模型分页 // 查询模型分页
export function getModelPage(params: PageParam) { export function getModelPage(params: PageParam) {
return requestClient.get<PageResult<AiModelModelApi.ModelVO>>( return requestClient.get<PageResult<AiModelModelApi.Model>>(
'/ai/model/page', '/ai/model/page',
{ params }, { params },
); );
@ -28,7 +28,7 @@ export function getModelPage(params: PageParam) {
// 获得模型列表 // 获得模型列表
export function getModelSimpleList(type?: number) { export function getModelSimpleList(type?: number) {
return requestClient.get<AiModelModelApi.ModelVO[]>('/ai/model/simple-list', { return requestClient.get<AiModelModelApi.Model[]>('/ai/model/simple-list', {
params: { params: {
type, type,
}, },
@ -37,15 +37,15 @@ export function getModelSimpleList(type?: number) {
// 查询模型详情 // 查询模型详情
export function getModel(id: number) { export function getModel(id: number) {
return requestClient.get<AiModelModelApi.ModelVO>(`/ai/model/get?id=${id}`); return requestClient.get<AiModelModelApi.Model>(`/ai/model/get?id=${id}`);
} }
// 新增模型 // 新增模型
export function createModel(data: AiModelModelApi.ModelVO) { export function createModel(data: AiModelModelApi.Model) {
return requestClient.post('/ai/model/create', data); return requestClient.post('/ai/model/create', data);
} }
// 修改模型 // 修改模型
export function updateModel(data: AiModelModelApi.ModelVO) { export function updateModel(data: AiModelModelApi.Model) {
return requestClient.put('/ai/model/update', data); return requestClient.put('/ai/model/update', data);
} }

View File

@ -3,7 +3,7 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request'; import { requestClient } from '#/api/request';
export namespace AiModelToolApi { export namespace AiModelToolApi {
export interface ToolVO { export interface Tool {
id: number; // 工具编号 id: number; // 工具编号
name: string; // 工具名称 name: string; // 工具名称
description: string; // 工具描述 description: string; // 工具描述
@ -13,22 +13,22 @@ export namespace AiModelToolApi {
// 查询工具分页 // 查询工具分页
export function getToolPage(params: PageParam) { export function getToolPage(params: PageParam) {
return requestClient.get<PageResult<AiModelToolApi.ToolVO>>('/ai/tool/page', { return requestClient.get<PageResult<AiModelToolApi.Tool>>('/ai/tool/page', {
params, params,
}); });
} }
// 查询工具详情 // 查询工具详情
export function getTool(id: number) { export function getTool(id: number) {
return requestClient.get<AiModelToolApi.ToolVO>(`/ai/tool/get?id=${id}`); return requestClient.get<AiModelToolApi.Tool>(`/ai/tool/get?id=${id}`);
} }
// 新增工具 // 新增工具
export function createTool(data: AiModelToolApi.ToolVO) { export function createTool(data: AiModelToolApi.Tool) {
return requestClient.post('/ai/tool/create', data); return requestClient.post('/ai/tool/create', data);
} }
// 修改工具 // 修改工具
export function updateTool(data: AiModelToolApi.ToolVO) { export function updateTool(data: AiModelToolApi.Tool) {
return requestClient.put('/ai/tool/update', data); return requestClient.put('/ai/tool/update', data);
} }
@ -39,5 +39,5 @@ export function deleteTool(id: number) {
// 获取工具简单列表 // 获取工具简单列表
export function getToolSimpleList() { export function getToolSimpleList() {
return requestClient.get<AiModelToolApi.ToolVO[]>('/ai/tool/simple-list'); return requestClient.get<AiModelToolApi.Tool[]>('/ai/tool/simple-list');
} }

View File

@ -3,8 +3,8 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request'; import { requestClient } from '#/api/request';
export namespace AiMusicApi { export namespace AiMusicApi {
// AI 音乐 VO // AI 音乐
export interface MusicVO { export interface Music {
id: number; // 编号 id: number; // 编号
userId: number; // 用户编号 userId: number; // 用户编号
title: string; // 音乐名称 title: string; // 音乐名称
@ -28,7 +28,7 @@ export namespace AiMusicApi {
// 查询音乐分页 // 查询音乐分页
export function getMusicPage(params: PageParam) { export function getMusicPage(params: PageParam) {
return requestClient.get<PageResult<AiMusicApi.MusicVO>>(`/ai/music/page`, { return requestClient.get<PageResult<AiMusicApi.Music>>(`/ai/music/page`, {
params, params,
}); });
} }

View File

@ -11,7 +11,7 @@ import { requestClient } from '#/api/request';
const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD); const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD);
const accessStore = useAccessStore(); const accessStore = useAccessStore();
export namespace AiWriteApi { export namespace AiWriteApi {
export interface WriteVO { export interface Write {
type: AiWriteTypeEnum.REPLY | AiWriteTypeEnum.WRITING; // 1:撰写 2:回复 type: AiWriteTypeEnum.REPLY | AiWriteTypeEnum.WRITING; // 1:撰写 2:回复
prompt: string; // 写作内容提示 1。撰写 2回复 prompt: string; // 写作内容提示 1。撰写 2回复
originalContent: string; // 原文 originalContent: string; // 原文
@ -27,14 +27,14 @@ export namespace AiWriteApi {
createTime?: Date; // 创建时间 createTime?: Date; // 创建时间
} }
export interface AiWritePageReqVO extends PageParam { export interface AiWritePageReq extends PageParam {
userId?: number; // 用户编号 userId?: number; // 用户编号
type?: AiWriteTypeEnum; // 写作类型 type?: AiWriteTypeEnum; // 写作类型
platform?: string; // 平台 platform?: string; // 平台
createTime?: [string, string]; // 创建时间 createTime?: [string, string]; // 创建时间
} }
export interface AiWriteRespVo { export interface AiWriteResp {
id: number; id: number;
userId: number; userId: number;
type: number; type: number;
@ -60,7 +60,7 @@ export function writeStream({
ctrl, ctrl,
}: { }: {
ctrl: AbortController; ctrl: AbortController;
data: Partial<AiWriteApi.WriteVO>; data: Partial<AiWriteApi.Write>;
onClose?: (...args: any[]) => void; onClose?: (...args: any[]) => void;
onError?: (...args: any[]) => void; onError?: (...args: any[]) => void;
onMessage?: (res: any) => void; onMessage?: (res: any) => void;
@ -83,7 +83,7 @@ export function writeStream({
// 获取写作列表 // 获取写作列表
export function getWritePage(params: any) { export function getWritePage(params: any) {
return requestClient.get<PageResult<AiWriteApi.AiWritePageReqVO>>( return requestClient.get<PageResult<AiWriteApi.AiWritePageReq>>(
`/ai/write/page`, `/ai/write/page`,
{ params }, { params },
); );

View File

@ -5,20 +5,20 @@ import { requestClient } from '#/api/request';
export namespace CrmBusinessStatusApi { export namespace CrmBusinessStatusApi {
/** 商机状态信息 */ /** 商机状态信息 */
export interface BusinessStatusType { export interface BusinessStatusType {
id: number; [x: string]: any;
id?: number;
name: string; name: string;
percent: number; percent: number;
sort: number;
} }
/** 商机状态组信息 */ /** 商机状态组信息 */
export interface BusinessStatus { export interface BusinessStatus {
id: number; id?: number;
name: string; name: string;
deptIds: number[]; deptIds?: number[];
deptNames: string[]; deptNames?: string[];
creator: string; creator?: string;
createTime: Date; createTime?: Date;
statuses?: BusinessStatusType[]; statuses?: BusinessStatusType[];
} }
} }

View File

@ -121,10 +121,9 @@ export function putCustomerPool(id: number) {
/** 更新客户的成交状态 */ /** 更新客户的成交状态 */
export function updateCustomerDealStatus(id: number, dealStatus: boolean) { export function updateCustomerDealStatus(id: number, dealStatus: boolean) {
return requestClient.put('/crm/customer/update-deal-status', { return requestClient.put(
id, `/crm/customer/update-deal-status?id=${id}&dealStatus=${dealStatus}`,
dealStatus, );
});
} }
/** 进入公海客户提醒的客户列表 */ /** 进入公海客户提醒的客户列表 */

View File

@ -197,6 +197,7 @@ const buttonPropsMap = new Map<string, any>();
function getButtonProps(action: ActionItem) { function getButtonProps(action: ActionItem) {
const key = JSON.stringify({ const key = JSON.stringify({
type: action.type, type: action.type,
danger: action.danger || false,
disabled: action.disabled, disabled: action.disabled,
loading: action.loading, loading: action.loading,
size: action.size, size: action.size,
@ -207,7 +208,8 @@ function getButtonProps(action: ActionItem) {
} }
const res = { const res = {
type: action.type || 'primary', type: action.type || 'link',
danger: action.danger || false,
disabled: action.disabled, disabled: action.disabled,
loading: action.loading, loading: action.loading,
size: action.size, size: action.size,

View File

@ -30,12 +30,12 @@ export const AiModelTypeEnum = {
EMBEDDING: 5, // 向量 EMBEDDING: 5, // 向量
RERANK: 6, // 重排 RERANK: 6, // 重排
}; };
export interface ImageModelVO { export interface ImageModel {
key: string; key: string;
name: string; name: string;
image?: string; image?: string;
} }
export const OtherPlatformEnum: ImageModelVO[] = [ export const OtherPlatformEnum: ImageModel[] = [
{ {
key: AiPlatformEnum.TONG_YI, key: AiPlatformEnum.TONG_YI,
name: '通义万相', name: '通义万相',
@ -98,7 +98,7 @@ export const ImageHotEnglishWords = [
'The Great Wall of China', 'The Great Wall of China',
]; // 图片热词(英文) ]; // 图片热词(英文)
export const StableDiffusionSamplers: ImageModelVO[] = [ export const StableDiffusionSamplers: ImageModel[] = [
{ {
key: 'DDIM', key: 'DDIM',
name: 'DDIM', name: 'DDIM',
@ -141,7 +141,7 @@ export const StableDiffusionSamplers: ImageModelVO[] = [
}, },
]; ];
export const StableDiffusionStylePresets: ImageModelVO[] = [ export const StableDiffusionStylePresets: ImageModel[] = [
{ {
key: '3d-model', key: '3d-model',
name: '3d-model', name: '3d-model',
@ -213,7 +213,7 @@ export const StableDiffusionStylePresets: ImageModelVO[] = [
}, },
]; ];
export const StableDiffusionClipGuidancePresets: ImageModelVO[] = [ export const StableDiffusionClipGuidancePresets: ImageModel[] = [
{ {
key: 'NONE', key: 'NONE',
name: 'NONE', name: 'NONE',
@ -330,14 +330,14 @@ export const InfraApiErrorLogProcessStatusEnum = {
DONE: 1, // 已处理 DONE: 1, // 已处理
IGNORE: 2, // 已忽略 IGNORE: 2, // 已忽略
}; };
export interface ImageSizeVO { export interface ImageSize {
key: string; key: string;
name?: string; name?: string;
style: string; style: string;
width: string; width: string;
height: string; height: string;
} }
export const Dall3SizeList: ImageSizeVO[] = [ export const Dall3SizeList: ImageSize[] = [
{ {
key: '1024x1024', key: '1024x1024',
name: '1:1', name: '1:1',
@ -361,7 +361,7 @@ export const Dall3SizeList: ImageSizeVO[] = [
}, },
]; ];
export const Dall3Models: ImageModelVO[] = [ export const Dall3Models: ImageModel[] = [
{ {
key: 'dall-e-3', key: 'dall-e-3',
name: 'DALL·E 3', name: 'DALL·E 3',
@ -374,7 +374,7 @@ export const Dall3Models: ImageModelVO[] = [
}, },
]; ];
export const Dall3StyleList: ImageModelVO[] = [ export const Dall3StyleList: ImageModel[] = [
{ {
key: 'vivid', key: 'vivid',
name: '清晰', name: '清晰',
@ -386,7 +386,7 @@ export const Dall3StyleList: ImageModelVO[] = [
image: `/static/imgs/ai/ziran.jpg`, image: `/static/imgs/ai/ziran.jpg`,
}, },
]; ];
export const MidjourneyModels: ImageModelVO[] = [ export const MidjourneyModels: ImageModel[] = [
{ {
key: 'midjourney', key: 'midjourney',
name: 'MJ', name: 'MJ',
@ -428,7 +428,7 @@ export const NijiVersionList = [
}, },
]; ];
export const MidjourneySizeList: ImageSizeVO[] = [ export const MidjourneySizeList: ImageSize[] = [
{ {
key: '1:1', key: '1:1',
width: '1', width: '1',

View File

@ -44,7 +44,7 @@ const [Drawer, drawerApi] = useVbenDrawer({
const searchName = ref<string>(''); // const searchName = ref<string>(''); //
const activeConversationId = ref<null | number>(null); // null const activeConversationId = ref<null | number>(null); // null
const hoverConversationId = ref<null | number>(null); // const hoverConversationId = ref<null | number>(null); //
const conversationList = ref([] as AiChatConversationApi.ChatConversationVO[]); // const conversationList = ref([] as AiChatConversationApi.ChatConversation[]); //
const conversationMap = ref<any>({}); // () const conversationMap = ref<any>({}); // ()
const loading = ref<boolean>(false); // const loading = ref<boolean>(false); //
const loadingTime = ref<any>(); const loadingTime = ref<any>();
@ -118,7 +118,7 @@ async function getChatConversationList() {
/** 按照 creteTime 创建时间,进行分组 */ /** 按照 creteTime 创建时间,进行分组 */
async function getConversationGroupByCreateTime( async function getConversationGroupByCreateTime(
list: AiChatConversationApi.ChatConversationVO[], list: AiChatConversationApi.ChatConversation[],
) { ) {
// (30) // (30)
// noinspection NonAsciiCharacters // noinspection NonAsciiCharacters
@ -164,7 +164,7 @@ async function getConversationGroupByCreateTime(
async function createConversation() { async function createConversation() {
// 1. // 1.
const conversationId = await createChatConversationMy( const conversationId = await createChatConversationMy(
{} as unknown as AiChatConversationApi.ChatConversationVO, {} as unknown as AiChatConversationApi.ChatConversation,
); );
// 2. // 2.
await getChatConversationList(); await getChatConversationList();
@ -176,7 +176,7 @@ async function createConversation() {
/** 修改对话的标题 */ /** 修改对话的标题 */
async function updateConversationTitle( async function updateConversationTitle(
conversation: AiChatConversationApi.ChatConversationVO, conversation: AiChatConversationApi.ChatConversation,
) { ) {
// 1. // 1.
prompt({ prompt({
@ -188,7 +188,7 @@ async function updateConversationTitle(
await updateChatConversationMy({ await updateChatConversationMy({
id: conversation.id, id: conversation.id,
title: scope.value, title: scope.value,
} as AiChatConversationApi.ChatConversationVO); } as AiChatConversationApi.ChatConversation);
message.success('重命名成功'); message.success('重命名成功');
// 3. // 3.
await getChatConversationList(); await getChatConversationList();
@ -230,7 +230,7 @@ async function updateConversationTitle(
/** 删除聊天对话 */ /** 删除聊天对话 */
async function deleteChatConversation( async function deleteChatConversation(
conversation: AiChatConversationApi.ChatConversationVO, conversation: AiChatConversationApi.ChatConversation,
) { ) {
try { try {
// //
@ -260,9 +260,7 @@ async function handleClearConversation() {
} }
/** 对话置顶 */ /** 对话置顶 */
async function handleTop( async function handleTop(conversation: AiChatConversationApi.ChatConversation) {
conversation: AiChatConversationApi.ChatConversationVO,
) {
// //
conversation.pinned = !conversation.pinned; conversation.pinned = !conversation.pinned;
await updateChatConversationMy(conversation); await updateChatConversationMy(conversation);

View File

@ -17,7 +17,7 @@ import { $t } from '#/locales';
import { useFormSchema } from '../../data'; import { useFormSchema } from '../../data';
const emit = defineEmits(['success']); const emit = defineEmits(['success']);
const formData = ref<AiChatConversationApi.ChatConversationVO>(); const formData = ref<AiChatConversationApi.ChatConversation>();
const [Form, formApi] = useVbenForm({ const [Form, formApi] = useVbenForm({
commonConfig: { commonConfig: {
@ -41,7 +41,7 @@ const [Modal, modalApi] = useVbenModal({
modalApi.lock(); modalApi.lock();
// //
const data = const data =
(await formApi.getValues()) as AiChatConversationApi.ChatConversationVO; (await formApi.getValues()) as AiChatConversationApi.ChatConversation;
try { try {
await updateChatConversationMy(data); await updateChatConversationMy(data);
@ -59,7 +59,7 @@ const [Modal, modalApi] = useVbenModal({
return; return;
} }
// //
const data = modalApi.getData<AiChatConversationApi.ChatConversationVO>(); const data = modalApi.getData<AiChatConversationApi.ChatConversation>();
if (!data || !data.id) { if (!data || !data.id) {
return; return;
} }

View File

@ -21,11 +21,11 @@ import MessageKnowledge from './MessageKnowledge.vue';
// props // props
const props = defineProps({ const props = defineProps({
conversation: { conversation: {
type: Object as PropType<AiChatConversationApi.ChatConversationVO>, type: Object as PropType<AiChatConversationApi.ChatConversation>,
required: true, required: true,
}, },
list: { list: {
type: Array as PropType<AiChatMessageApi.ChatMessageVO[]>, type: Array as PropType<AiChatMessageApi.ChatMessage[]>,
required: true, required: true,
}, },
}); });
@ -95,12 +95,12 @@ async function onDelete(id: number) {
} }
/** 刷新 */ /** 刷新 */
async function onRefresh(message: AiChatMessageApi.ChatMessageVO) { async function onRefresh(message: AiChatMessageApi.ChatMessage) {
emits('onRefresh', message); emits('onRefresh', message);
} }
/** 编辑 */ /** 编辑 */
async function onEdit(message: AiChatMessageApi.ChatMessageVO) { async function onEdit(message: AiChatMessageApi.ChatMessage) {
emits('onEdit', message); emits('onEdit', message);
} }

View File

@ -18,7 +18,7 @@ const props = defineProps({
required: true, required: true,
}, },
roleList: { roleList: {
type: Array as PropType<AiModelChatRoleApi.ChatRoleVO[]>, type: Array as PropType<AiModelChatRoleApi.ChatRole[]>,
required: true, required: true,
}, },
showMore: { showMore: {

View File

@ -36,12 +36,12 @@ const myRoleParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 50, pageSize: 50,
}); });
const myRoleList = ref<AiModelChatRoleApi.ChatRoleVO[]>([]); // my const myRoleList = ref<AiModelChatRoleApi.ChatRole[]>([]); // my
const publicRoleParams = reactive({ const publicRoleParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 50, pageSize: 50,
}); });
const publicRoleList = ref<AiModelChatRoleApi.ChatRoleVO[]>([]); // public const publicRoleList = ref<AiModelChatRoleApi.ChatRole[]>([]); // public
const activeCategory = ref<string>('全部'); // const activeCategory = ref<string>('全部'); //
const categoryList = ref<string[]>([]); // const categoryList = ref<string[]>([]); //
@ -55,7 +55,7 @@ async function handleTabsClick(tab: any) {
/** 获取 my role 我的角色 */ /** 获取 my role 我的角色 */
async function getMyRole(append?: boolean) { async function getMyRole(append?: boolean) {
const params: AiModelChatRoleApi.ChatRolePageReqVO = { const params: AiModelChatRoleApi.ChatRolePageReq = {
...myRoleParams, ...myRoleParams,
name: search.value, name: search.value,
publicStatus: false, publicStatus: false,
@ -70,7 +70,7 @@ async function getMyRole(append?: boolean) {
/** 获取 public role 公共角色 */ /** 获取 public role 公共角色 */
async function getPublicRole(append?: boolean) { async function getPublicRole(append?: boolean) {
const params: AiModelChatRoleApi.ChatRolePageReqVO = { const params: AiModelChatRoleApi.ChatRolePageReq = {
...publicRoleParams, ...publicRoleParams,
category: activeCategory.value === '全部' ? '' : activeCategory.value, category: activeCategory.value === '全部' ? '' : activeCategory.value,
name: search.value, name: search.value,
@ -148,9 +148,9 @@ async function handlerCardPage(type: string) {
/** 选择 card 角色:新建聊天对话 */ /** 选择 card 角色:新建聊天对话 */
async function handlerCardUse(role: any) { async function handlerCardUse(role: any) {
// 1. // 1.
const data: AiChatConversationApi.ChatConversationVO = { const data: AiChatConversationApi.ChatConversation = {
roleId: role.id, roleId: role.id,
} as unknown as AiChatConversationApi.ChatConversationVO; } as unknown as AiChatConversationApi.ChatConversation;
const conversationId = await createChatConversationMy(data); const conversationId = await createChatConversationMy(data);
// 2. // 2.

View File

@ -34,14 +34,14 @@ const [FormModal, formModalApi] = useVbenModal({
// //
const conversationListRef = ref(); const conversationListRef = ref();
const activeConversationId = ref<null | number>(null); // const activeConversationId = ref<null | number>(null); //
const activeConversation = ref<AiChatConversationApi.ChatConversationVO | null>( const activeConversation = ref<AiChatConversationApi.ChatConversation | null>(
null, null,
); // Conversation ); // Conversation
const conversationInProgress = ref(false); // true const conversationInProgress = ref(false); // true
// //
const messageRef = ref(); const messageRef = ref();
const activeMessageList = ref<AiChatMessageApi.ChatMessageVO[]>([]); // const activeMessageList = ref<AiChatMessageApi.ChatMessage[]>([]); //
const activeMessageListLoading = ref<boolean>(false); // activeMessageList const activeMessageListLoading = ref<boolean>(false); // activeMessageList
const activeMessageListLoadingTimer = ref<any>(); // activeMessageListLoading Timer const activeMessageListLoadingTimer = ref<any>(); // activeMessageListLoading Timer
// //
@ -65,7 +65,7 @@ async function getConversation(id: null | number) {
if (!id) { if (!id) {
return; return;
} }
const conversation: AiChatConversationApi.ChatConversationVO = const conversation: AiChatConversationApi.ChatConversation =
await getChatConversationMy(id); await getChatConversationMy(id);
if (!conversation) { if (!conversation) {
return; return;
@ -81,7 +81,7 @@ async function getConversation(id: null | number) {
* @return 是否切换成功 * @return 是否切换成功
*/ */
async function handleConversationClick( async function handleConversationClick(
conversation: AiChatConversationApi.ChatConversationVO, conversation: AiChatConversationApi.ChatConversation,
) { ) {
// //
if (conversationInProgress.value) { if (conversationInProgress.value) {
@ -103,7 +103,7 @@ async function handleConversationClick(
/** 删除某个对话*/ /** 删除某个对话*/
async function handlerConversationDelete( async function handlerConversationDelete(
delConversation: AiChatConversationApi.ChatConversationVO, delConversation: AiChatConversationApi.ChatConversation,
) { ) {
// //
if (activeConversationId.value === delConversation.id) { if (activeConversationId.value === delConversation.id) {
@ -303,13 +303,11 @@ async function doSendMessage(content: string) {
await doSendMessageStream({ await doSendMessageStream({
conversationId: activeConversationId.value, conversationId: activeConversationId.value,
content, content,
} as AiChatMessageApi.ChatMessageVO); } as AiChatMessageApi.ChatMessage);
} }
/** 真正执行【发送】消息操作 */ /** 真正执行【发送】消息操作 */
async function doSendMessageStream( async function doSendMessageStream(userMessage: AiChatMessageApi.ChatMessage) {
userMessage: AiChatMessageApi.ChatMessageVO,
) {
// AbortController 便 // AbortController 便
conversationInAbortController.value = new AbortController(); conversationInAbortController.value = new AbortController();
// //
@ -326,14 +324,14 @@ async function doSendMessageStream(
type: 'user', type: 'user',
content: userMessage.content, content: userMessage.content,
createTime: new Date(), createTime: new Date(),
} as AiChatMessageApi.ChatMessageVO, } as AiChatMessageApi.ChatMessage,
{ {
id: -2, id: -2,
conversationId: activeConversationId.value, conversationId: activeConversationId.value,
type: 'assistant', type: 'assistant',
content: '思考中...', content: '思考中...',
createTime: new Date(), createTime: new Date(),
} as AiChatMessageApi.ChatMessageVO, } as AiChatMessageApi.ChatMessage,
); );
// 1.2 // 1.2
await nextTick(); await nextTick();
@ -398,12 +396,12 @@ async function stopStream() {
} }
/** 编辑 message设置为 prompt可以再次编辑 */ /** 编辑 message设置为 prompt可以再次编辑 */
function handleMessageEdit(message: AiChatMessageApi.ChatMessageVO) { function handleMessageEdit(message: AiChatMessageApi.ChatMessage) {
prompt.value = message.content; prompt.value = message.content;
} }
/** 刷新 message基于指定消息再次发起对话 */ /** 刷新 message基于指定消息再次发起对话 */
function handleMessageRefresh(message: AiChatMessageApi.ChatMessageVO) { function handleMessageRefresh(message: AiChatMessageApi.ChatMessage) {
doSendMessage(message.content); doSendMessage(message.content);
} }

View File

@ -46,7 +46,7 @@ export function useGridColumnsConversation(): VxeTableGridOptions['columns'] {
}, },
{ {
title: '用户', title: '用户',
width: 180, minWidth: 180,
slots: { default: 'userId' }, slots: { default: 'userId' },
}, },
{ {
@ -141,7 +141,7 @@ export function useGridColumnsMessage(): VxeTableGridOptions['columns'] {
}, },
{ {
title: '用户', title: '用户',
width: 180, minWidth: 180,
slots: { default: 'userId' }, slots: { default: 'userId' },
}, },
{ {

View File

@ -29,7 +29,7 @@ function onRefresh() {
} }
/** 删除 */ /** 删除 */
async function handleDelete(row: AiChatConversationApi.ChatConversationVO) { async function handleDelete(row: AiChatConversationApi.ChatConversation) {
const hideLoading = message.loading({ const hideLoading = message.loading({
content: $t('ui.actionMessage.deleting', [row.id]), content: $t('ui.actionMessage.deleting', [row.id]),
key: 'action_key_msg', key: 'action_key_msg',
@ -72,7 +72,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
refresh: { code: 'query' }, refresh: { code: 'query' },
search: true, search: true,
}, },
} as VxeTableGridOptions<AiChatConversationApi.ChatConversationVO>, } as VxeTableGridOptions<AiChatConversationApi.ChatConversation>,
separator: false, separator: false,
}); });
onMounted(async () => { onMounted(async () => {

View File

@ -26,7 +26,7 @@ function onRefresh() {
} }
/** 删除 */ /** 删除 */
async function handleDelete(row: AiChatConversationApi.ChatConversationVO) { async function handleDelete(row: AiChatConversationApi.ChatConversation) {
const hideLoading = message.loading({ const hideLoading = message.loading({
content: $t('ui.actionMessage.deleting', [row.id]), content: $t('ui.actionMessage.deleting', [row.id]),
key: 'action_key_msg', key: 'action_key_msg',
@ -69,7 +69,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
refresh: { code: 'query' }, refresh: { code: 'query' },
search: true, search: true,
}, },
} as VxeTableGridOptions<AiChatConversationApi.ChatConversationVO>, } as VxeTableGridOptions<AiChatConversationApi.ChatConversation>,
separator: false, separator: false,
}); });
onMounted(async () => { onMounted(async () => {

View File

@ -16,7 +16,7 @@ import { AiImageStatusEnum } from '#/utils';
const props = defineProps({ const props = defineProps({
detail: { detail: {
type: Object as PropType<AiImageApi.ImageVO>, type: Object as PropType<AiImageApi.Image>,
default: () => ({}), default: () => ({}),
}, },
}); });
@ -25,13 +25,13 @@ const emits = defineEmits(['onBtnClick', 'onMjBtnClick']);
const cardImageRef = ref<any>(); // image ref const cardImageRef = ref<any>(); // image ref
/** 处理点击事件 */ /** 处理点击事件 */
async function handleButtonClick(type: string, detail: AiImageApi.ImageVO) { async function handleButtonClick(type: string, detail: AiImageApi.Image) {
emits('onBtnClick', type, detail); emits('onBtnClick', type, detail);
} }
/** 处理 Midjourney 按钮点击事件 */ /** 处理 Midjourney 按钮点击事件 */
async function handleMidjourneyBtnClick( async function handleMidjourneyBtnClick(
button: AiImageApi.ImageMidjourneyButtonsVO, button: AiImageApi.ImageMidjourneyButtons,
) { ) {
// //
await confirm(`确认操作 "${button.label} ${button.emoji}" ?`); await confirm(`确认操作 "${button.label} ${button.emoji}" ?`);

View File

@ -23,7 +23,7 @@ const props = defineProps({
required: true, required: true,
}, },
}); });
const detail = ref<AiImageApi.ImageVO>({} as AiImageApi.ImageVO); const detail = ref<AiImageApi.Image>({} as AiImageApi.Image);
/** 获取图片详情 */ /** 获取图片详情 */
async function getImageDetail(id: number) { async function getImageDetail(id: number) {

View File

@ -35,7 +35,7 @@ const queryParams = reactive({
pageSize: 10, pageSize: 10,
}); });
const pageTotal = ref<number>(0); // page size const pageTotal = ref<number>(0); // page size
const imageList = ref<AiImageApi.ImageVO[]>([]); // image const imageList = ref<AiImageApi.Image[]>([]); // image
const imageListRef = ref<any>(); // ref const imageListRef = ref<any>(); // ref
// //
const inProgressImageMap = ref<{}>({}); // image key image value image const inProgressImageMap = ref<{}>({}); // image key image value image
@ -85,7 +85,7 @@ async function refreshWatchImages() {
if (imageIds.length === 0) { if (imageIds.length === 0) {
return; return;
} }
const list = (await getImageListMyByIds(imageIds)) as AiImageApi.ImageVO[]; const list = (await getImageListMyByIds(imageIds)) as AiImageApi.Image[];
const newWatchImages: any = {}; const newWatchImages: any = {};
list.forEach((image) => { list.forEach((image) => {
if (image.status === AiImageStatusEnum.IN_PROGRESS) { if (image.status === AiImageStatusEnum.IN_PROGRESS) {
@ -106,7 +106,7 @@ async function refreshWatchImages() {
/** 图片的点击事件 */ /** 图片的点击事件 */
async function handleImageButtonClick( async function handleImageButtonClick(
type: string, type: string,
imageDetail: AiImageApi.ImageVO, imageDetail: AiImageApi.Image,
) { ) {
// //
if (type === 'more') { if (type === 'more') {
@ -138,14 +138,14 @@ async function handleImageButtonClick(
/** 处理 Midjourney 按钮点击事件 */ /** 处理 Midjourney 按钮点击事件 */
async function handleImageMidjourneyButtonClick( async function handleImageMidjourneyButtonClick(
button: AiImageApi.ImageMidjourneyButtonsVO, button: AiImageApi.ImageMidjourneyButtons,
imageDetail: AiImageApi.ImageVO, imageDetail: AiImageApi.Image,
) { ) {
// 1. params // 1. params
const data = { const data = {
id: imageDetail.id, id: imageDetail.id,
customId: button.customId, customId: button.customId,
} as AiImageApi.ImageMidjourneyActionVO; } as AiImageApi.ImageMidjourneyAction;
// 2. action // 2. action
await midjourneyAction(data); await midjourneyAction(data);
// 3. // 3.

View File

@ -17,8 +17,8 @@ import { AiPlatformEnum, ImageHotWords, OtherPlatformEnum } from '#/utils';
// //
const props = defineProps({ const props = defineProps({
models: { models: {
type: Array<AiModelModelApi.ModelVO>, type: Array<AiModelModelApi.Model>,
default: () => [] as AiModelModelApi.ModelVO[], default: () => [] as AiModelModelApi.Model[],
}, },
}); });
const emits = defineEmits(['onDrawStart', 'onDrawComplete']); const emits = defineEmits(['onDrawStart', 'onDrawComplete']);
@ -31,7 +31,7 @@ const prompt = ref<string>(''); // 提示词
const width = ref<number>(512); // const width = ref<number>(512); //
const height = ref<number>(512); // const height = ref<number>(512); //
const otherPlatform = ref<string>(AiPlatformEnum.TONG_YI); // const otherPlatform = ref<string>(AiPlatformEnum.TONG_YI); //
const platformModels = ref<AiModelModelApi.ModelVO[]>([]); // const platformModels = ref<AiModelModelApi.Model[]>([]); //
const modelId = ref<number>(); // const modelId = ref<number>(); //
/** 选择热词 */ /** 选择热词 */
@ -64,7 +64,7 @@ async function handleGenerateImage() {
width: width.value, // width: width.value, //
height: height.value, // height: height.value, //
options: {}, options: {},
} as unknown as AiImageApi.ImageDrawReqVO; } as unknown as AiImageApi.ImageDrawReq;
await drawImage(form); await drawImage(form);
} finally { } finally {
// //
@ -75,7 +75,7 @@ async function handleGenerateImage() {
} }
/** 填充值 */ /** 填充值 */
async function settingValues(detail: AiImageApi.ImageVO) { async function settingValues(detail: AiImageApi.Image) {
prompt.value = detail.prompt; prompt.value = detail.prompt;
width.value = detail.width; width.value = detail.width;
height.value = detail.height; height.value = detail.height;
@ -85,7 +85,7 @@ async function settingValues(detail: AiImageApi.ImageVO) {
async function handlerPlatformChange(platform: any) { async function handlerPlatformChange(platform: any) {
// //
platformModels.value = props.models.filter( platformModels.value = props.models.filter(
(item: AiModelModelApi.ModelVO) => item.platform === platform, (item: AiModelModelApi.Model) => item.platform === platform,
); );
modelId.value = modelId.value =
platformModels.value.length > 0 && platformModels.value[0] platformModels.value.length > 0 && platformModels.value[0]

View File

@ -2,7 +2,7 @@
<script setup lang="ts"> <script setup lang="ts">
import type { AiImageApi } from '#/api/ai/image'; import type { AiImageApi } from '#/api/ai/image';
import type { AiModelModelApi } from '#/api/ai/model/model'; import type { AiModelModelApi } from '#/api/ai/model/model';
import type { ImageModelVO, ImageSizeVO } from '#/utils'; import type { ImageModel, ImageSize } from '#/utils';
import { ref } from 'vue'; import { ref } from 'vue';
@ -22,8 +22,8 @@ import {
// //
const props = defineProps({ const props = defineProps({
models: { models: {
type: Array<AiModelModelApi.ModelVO>, type: Array<AiModelModelApi.Model>,
default: () => [] as AiModelModelApi.ModelVO[], default: () => [] as AiModelModelApi.Model[],
}, },
}); });
const emits = defineEmits(['onDrawStart', 'onDrawComplete']); const emits = defineEmits(['onDrawStart', 'onDrawComplete']);
@ -50,7 +50,7 @@ async function handleHotWordClick(hotWord: string) {
} }
/** 选择 model 模型 */ /** 选择 model 模型 */
async function handleModelClick(model: ImageModelVO) { async function handleModelClick(model: ImageModel) {
selectModel.value = model.key; selectModel.value = model.key;
// //
// //
@ -76,12 +76,12 @@ async function handleModelClick(model: ImageModelVO) {
} }
/** 选择 style 样式 */ /** 选择 style 样式 */
async function handleStyleClick(imageStyle: ImageModelVO) { async function handleStyleClick(imageStyle: ImageModel) {
style.value = imageStyle.key; style.value = imageStyle.key;
} }
/** 选择 size 大小 */ /** 选择 size 大小 */
async function handleSizeClick(imageSize: ImageSizeVO) { async function handleSizeClick(imageSize: ImageSize) {
selectSize.value = imageSize.key; selectSize.value = imageSize.key;
} }
@ -107,7 +107,7 @@ async function handleGenerateImage() {
emits('onDrawStart', AiPlatformEnum.OPENAI); emits('onDrawStart', AiPlatformEnum.OPENAI);
const imageSize = Dall3SizeList.find( const imageSize = Dall3SizeList.find(
(item) => item.key === selectSize.value, (item) => item.key === selectSize.value,
) as ImageSizeVO; ) as ImageSize;
const form = { const form = {
platform: AiPlatformEnum.OPENAI, platform: AiPlatformEnum.OPENAI,
prompt: prompt.value, // prompt: prompt.value, //
@ -118,7 +118,7 @@ async function handleGenerateImage() {
options: { options: {
style: style.value, // style: style.value, //
}, },
} as AiImageApi.ImageDrawReqVO; } as AiImageApi.ImageDrawReq;
// //
await drawImage(form); await drawImage(form);
} finally { } finally {
@ -130,13 +130,13 @@ async function handleGenerateImage() {
} }
/** 填充值 */ /** 填充值 */
async function settingValues(detail: AiImageApi.ImageVO) { async function settingValues(detail: AiImageApi.Image) {
prompt.value = detail.prompt; prompt.value = detail.prompt;
selectModel.value = detail.model; selectModel.value = detail.model;
style.value = detail.options?.style; style.value = detail.options?.style;
const imageSize = Dall3SizeList.find( const imageSize = Dall3SizeList.find(
(item) => item.key === `${detail.width}x${detail.height}`, (item) => item.key === `${detail.width}x${detail.height}`,
) as ImageSizeVO; ) as ImageSize;
await handleSizeClick(imageSize); await handleSizeClick(imageSize);
} }

View File

@ -2,7 +2,7 @@
<script setup lang="ts"> <script setup lang="ts">
import type { AiImageApi } from '#/api/ai/image'; import type { AiImageApi } from '#/api/ai/image';
import type { AiModelModelApi } from '#/api/ai/model/model'; import type { AiModelModelApi } from '#/api/ai/model/model';
import type { ImageModelVO, ImageSizeVO } from '#/utils'; import type { ImageModel, ImageSize } from '#/utils';
import { ref } from 'vue'; import { ref } from 'vue';
@ -33,8 +33,8 @@ import {
// //
const props = defineProps({ const props = defineProps({
models: { models: {
type: Array<AiModelModelApi.ModelVO>, type: Array<AiModelModelApi.Model>,
default: () => [] as AiModelModelApi.ModelVO[], default: () => [] as AiModelModelApi.Model[],
}, },
}); });
const emits = defineEmits(['onDrawStart', 'onDrawComplete']); const emits = defineEmits(['onDrawStart', 'onDrawComplete']);
@ -64,12 +64,12 @@ async function handleHotWordClick(hotWord: string) {
} }
/** 点击 size 尺寸 */ /** 点击 size 尺寸 */
async function handleSizeClick(imageSize: ImageSizeVO) { async function handleSizeClick(imageSize: ImageSize) {
selectSize.value = imageSize.key; selectSize.value = imageSize.key;
} }
/** 点击 model 模型 */ /** 点击 model 模型 */
async function handleModelClick(model: ImageModelVO) { async function handleModelClick(model: ImageModel) {
selectModel.value = model.key; selectModel.value = model.key;
versionList.value = versionList.value =
model.key === 'niji' ? NijiVersionList : MidjourneyVersions; model.key === 'niji' ? NijiVersionList : MidjourneyVersions;
@ -99,7 +99,7 @@ async function handleGenerateImage() {
// //
const imageSize = MidjourneySizeList.find( const imageSize = MidjourneySizeList.find(
(item) => selectSize.value === item.key, (item) => selectSize.value === item.key,
) as ImageSizeVO; ) as ImageSize;
const req = { const req = {
prompt: prompt.value, prompt: prompt.value,
modelId: matchedModel.id, modelId: matchedModel.id,
@ -107,7 +107,7 @@ async function handleGenerateImage() {
height: imageSize.height, height: imageSize.height,
version: selectVersion.value, version: selectVersion.value,
referImageUrl: referImageUrl.value, referImageUrl: referImageUrl.value,
} as AiImageApi.ImageMidjourneyImagineReqVO; } as AiImageApi.ImageMidjourneyImagineReq;
await midjourneyImagine(req); await midjourneyImagine(req);
} finally { } finally {
// //
@ -118,18 +118,18 @@ async function handleGenerateImage() {
} }
/** 填充值 */ /** 填充值 */
async function settingValues(detail: AiImageApi.ImageVO) { async function settingValues(detail: AiImageApi.Image) {
// //
prompt.value = detail.prompt; prompt.value = detail.prompt;
// image size // image size
const imageSize = MidjourneySizeList.find( const imageSize = MidjourneySizeList.find(
(item) => item.key === `${detail.width}:${detail.height}`, (item) => item.key === `${detail.width}:${detail.height}`,
) as ImageSizeVO; ) as ImageSize;
selectSize.value = imageSize.key; selectSize.value = imageSize.key;
// //
const model = MidjourneyModels.find( const model = MidjourneyModels.find(
(item) => item.key === detail.options?.model, (item) => item.key === detail.options?.model,
) as ImageModelVO; ) as ImageModel;
await handleModelClick(model); await handleModelClick(model);
// //
selectVersion.value = versionList.value.find( selectVersion.value = versionList.value.find(

View File

@ -28,8 +28,8 @@ import {
// //
const props = defineProps({ const props = defineProps({
models: { models: {
type: Array<AiModelModelApi.ModelVO>, type: Array<AiModelModelApi.Model>,
default: () => [] as AiModelModelApi.ModelVO[], default: () => [] as AiModelModelApi.Model[],
}, },
}); });
@ -106,7 +106,7 @@ async function handleGenerateImage() {
clipGuidancePreset: clipGuidancePreset.value, // CLIP clipGuidancePreset: clipGuidancePreset.value, // CLIP
stylePreset: stylePreset.value, // stylePreset: stylePreset.value, //
}, },
} as unknown as AiImageApi.ImageDrawReqVO; } as unknown as AiImageApi.ImageDrawReq;
await drawImage(form); await drawImage(form);
} finally { } finally {
// //
@ -117,7 +117,7 @@ async function handleGenerateImage() {
} }
/** 填充值 */ /** 填充值 */
async function settingValues(detail: AiImageApi.ImageVO) { async function settingValues(detail: AiImageApi.Image) {
prompt.value = detail.prompt; prompt.value = detail.prompt;
width.value = detail.width; width.value = detail.width;
height.value = detail.height; height.value = detail.height;

View File

@ -44,7 +44,7 @@ const platformOptions = [
}, },
]; ];
const models = ref<AiModelModelApi.ModelVO[]>([]); // const models = ref<AiModelModelApi.Model[]>([]); //
/** 绘画 start */ /** 绘画 start */
const handleDrawStart = async () => {}; const handleDrawStart = async () => {};
@ -55,7 +55,7 @@ const handleDrawComplete = async () => {
}; };
/** 重新生成:将画图详情填充到对应平台 */ /** 重新生成:将画图详情填充到对应平台 */
const handleRegeneration = async (image: AiImageApi.ImageVO) => { const handleRegeneration = async (image: AiImageApi.Image) => {
// //
selectPlatform.value = image.platform; selectPlatform.value = image.platform;
// image // image

View File

@ -24,7 +24,7 @@ function onRefresh() {
} }
/** 删除 */ /** 删除 */
async function handleDelete(row: AiImageApi.ImageVO) { async function handleDelete(row: AiImageApi.Image) {
const hideLoading = message.loading({ const hideLoading = message.loading({
content: $t('ui.actionMessage.deleting', [row.id]), content: $t('ui.actionMessage.deleting', [row.id]),
key: 'action_key_msg', key: 'action_key_msg',
@ -41,7 +41,7 @@ async function handleDelete(row: AiImageApi.ImageVO) {
} }
} }
/** 修改是否发布 */ /** 修改是否发布 */
const handleUpdatePublicStatusChange = async (row: AiImageApi.ImageVO) => { const handleUpdatePublicStatusChange = async (row: AiImageApi.Image) => {
try { try {
// //
const text = row.publicStatus ? '公开' : '私有'; const text = row.publicStatus ? '公开' : '私有';
@ -82,7 +82,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
refresh: { code: 'query' }, refresh: { code: 'query' },
search: true, search: true,
}, },
} as VxeTableGridOptions<AiImageApi.ImageVO>, } as VxeTableGridOptions<AiImageApi.Image>,
}); });
onMounted(async () => { onMounted(async () => {
// //

View File

@ -11,7 +11,7 @@ import { Image, Input, Pagination } from 'ant-design-vue';
import { getImagePageMy } from '#/api/ai/image'; import { getImagePageMy } from '#/api/ai/image';
const loading = ref(true); // const loading = ref(true); //
const list = ref<AiImageApi.ImageVO[]>([]); // const list = ref<AiImageApi.Image[]>([]); //
const total = ref(0); // const total = ref(0); //
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,

View File

@ -49,7 +49,7 @@ function handleEdit(id: number) {
} }
/** 删除 */ /** 删除 */
async function handleDelete(row: AiKnowledgeDocumentApi.KnowledgeDocumentVO) { async function handleDelete(row: AiKnowledgeDocumentApi.KnowledgeDocument) {
const hideLoading = message.loading({ const hideLoading = message.loading({
content: $t('ui.actionMessage.deleting', [row.name]), content: $t('ui.actionMessage.deleting', [row.name]),
key: 'action_key_msg', key: 'action_key_msg',
@ -74,7 +74,7 @@ const handleSegment = (id: number) => {
}; };
/** 修改是否发布 */ /** 修改是否发布 */
const handleStatusChange = async ( const handleStatusChange = async (
row: AiKnowledgeDocumentApi.KnowledgeDocumentVO, row: AiKnowledgeDocumentApi.KnowledgeDocument,
) => { ) => {
try { try {
// //
@ -120,7 +120,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
refresh: { code: 'query' }, refresh: { code: 'query' },
search: true, search: true,
}, },
} as VxeTableGridOptions<AiKnowledgeDocumentApi.KnowledgeDocumentVO>, } as VxeTableGridOptions<AiKnowledgeDocumentApi.KnowledgeDocument>,
}); });
/** 初始化 */ /** 初始化 */
onMounted(() => { onMounted(() => {

View File

@ -34,12 +34,12 @@ function handleCreate() {
} }
/** 编辑 */ /** 编辑 */
function handleEdit(row: AiKnowledgeKnowledgeApi.KnowledgeVO) { function handleEdit(row: AiKnowledgeKnowledgeApi.Knowledge) {
formModalApi.setData(row).open(); formModalApi.setData(row).open();
} }
/** 删除 */ /** 删除 */
async function handleDelete(row: AiKnowledgeKnowledgeApi.KnowledgeVO) { async function handleDelete(row: AiKnowledgeKnowledgeApi.Knowledge) {
const hideLoading = message.loading({ const hideLoading = message.loading({
content: $t('ui.actionMessage.deleting', [row.name]), content: $t('ui.actionMessage.deleting', [row.name]),
key: 'action_key_msg', key: 'action_key_msg',
@ -98,7 +98,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
refresh: { code: 'query' }, refresh: { code: 'query' },
search: true, search: true,
}, },
} as VxeTableGridOptions<AiKnowledgeKnowledgeApi.KnowledgeVO>, } as VxeTableGridOptions<AiKnowledgeKnowledgeApi.Knowledge>,
}); });
</script> </script>

View File

@ -18,7 +18,7 @@ import { $t } from '#/locales';
import { useFormSchema } from '../data'; import { useFormSchema } from '../data';
const emit = defineEmits(['success']); const emit = defineEmits(['success']);
const formData = ref<AiKnowledgeKnowledgeApi.KnowledgeVO>(); const formData = ref<AiKnowledgeKnowledgeApi.Knowledge>();
const getTitle = computed(() => { const getTitle = computed(() => {
return formData.value?.id return formData.value?.id
? $t('ui.actionTitle.edit', ['AI 知识库']) ? $t('ui.actionTitle.edit', ['AI 知识库'])
@ -47,7 +47,7 @@ const [Modal, modalApi] = useVbenModal({
modalApi.lock(); modalApi.lock();
// //
const data = const data =
(await formApi.getValues()) as AiKnowledgeKnowledgeApi.KnowledgeVO; (await formApi.getValues()) as AiKnowledgeKnowledgeApi.Knowledge;
try { try {
await (formData.value?.id await (formData.value?.id
? updateKnowledge(data) ? updateKnowledge(data)
@ -66,7 +66,7 @@ const [Modal, modalApi] = useVbenModal({
return; return;
} }
// //
const data = modalApi.getData<AiKnowledgeKnowledgeApi.KnowledgeVO>(); const data = modalApi.getData<AiKnowledgeKnowledgeApi.Knowledge>();
if (!data || !data.id) { if (!data || !data.id) {
return; return;
} }

View File

@ -41,12 +41,12 @@ function handleCreate() {
} }
/** 编辑 */ /** 编辑 */
function handleEdit(row: AiKnowledgeKnowledgeApi.KnowledgeVO) { function handleEdit(row: AiKnowledgeKnowledgeApi.Knowledge) {
formModalApi.setData(row).open(); formModalApi.setData(row).open();
} }
/** 删除 */ /** 删除 */
async function handleDelete(row: AiKnowledgeKnowledgeApi.KnowledgeVO) { async function handleDelete(row: AiKnowledgeKnowledgeApi.Knowledge) {
const hideLoading = message.loading({ const hideLoading = message.loading({
content: $t('ui.actionMessage.deleting', [row.id]), content: $t('ui.actionMessage.deleting', [row.id]),
key: 'action_key_msg', key: 'action_key_msg',
@ -89,13 +89,11 @@ const [Grid, gridApi] = useVbenVxeGrid({
refresh: { code: 'query' }, refresh: { code: 'query' },
search: true, search: true,
}, },
} as VxeTableGridOptions<AiKnowledgeKnowledgeApi.KnowledgeVO>, } as VxeTableGridOptions<AiKnowledgeKnowledgeApi.Knowledge>,
}); });
/** 修改是否发布 */ /** 修改是否发布 */
async function handleStatusChange( async function handleStatusChange(row: AiKnowledgeSegmentApi.KnowledgeSegment) {
row: AiKnowledgeSegmentApi.KnowledgeSegmentVO,
) {
try { try {
// //
const text = row.status ? '启用' : '禁用'; const text = row.status ? '启用' : '禁用';

View File

@ -18,7 +18,7 @@ import { $t } from '#/locales';
import { useFormSchema } from '../data'; import { useFormSchema } from '../data';
const emit = defineEmits(['success']); const emit = defineEmits(['success']);
const formData = ref<AiKnowledgeSegmentApi.KnowledgeSegmentVO>(); const formData = ref<AiKnowledgeSegmentApi.KnowledgeSegment>();
const getTitle = computed(() => { const getTitle = computed(() => {
return formData.value?.id return formData.value?.id
? $t('ui.actionTitle.edit', ['分段']) ? $t('ui.actionTitle.edit', ['分段'])
@ -47,7 +47,7 @@ const [Modal, modalApi] = useVbenModal({
modalApi.lock(); modalApi.lock();
// //
const data = const data =
(await formApi.getValues()) as AiKnowledgeSegmentApi.KnowledgeSegmentVO; (await formApi.getValues()) as AiKnowledgeSegmentApi.KnowledgeSegment;
try { try {
await (formData.value?.id await (formData.value?.id
? updateKnowledgeSegment(data) ? updateKnowledgeSegment(data)
@ -66,7 +66,7 @@ const [Modal, modalApi] = useVbenModal({
return; return;
} }
// //
const data = modalApi.getData<AiKnowledgeSegmentApi.KnowledgeSegmentVO>(); const data = modalApi.getData<AiKnowledgeSegmentApi.KnowledgeSegment>();
if (!data || !data.id) { if (!data || !data.id) {
await formApi.setValues(data); await formApi.setValues(data);
return; return;

View File

@ -27,7 +27,7 @@ function directGenerate(existPrompt: string) {
isEnd.value = true; isEnd.value = true;
} }
/** 提交生成 */ /** 提交生成 */
function submit(data: AiMindmapApi.AiMindMapGenerateReqVO) { function submit(data: AiMindmapApi.AiMindMapGenerateReq) {
isGenerating.value = true; isGenerating.value = true;
isStart.value = true; isStart.value = true;
isEnd.value = false; isEnd.value = false;

View File

@ -31,7 +31,7 @@ function onRefresh() {
} }
/** 删除 */ /** 删除 */
async function handleDelete(row: AiMindmapApi.MindMapVO) { async function handleDelete(row: AiMindmapApi.MindMap) {
const hideLoading = message.loading({ const hideLoading = message.loading({
content: $t('ui.actionMessage.deleting', [row.id]), content: $t('ui.actionMessage.deleting', [row.id]),
key: 'action_key_msg', key: 'action_key_msg',
@ -73,9 +73,9 @@ const [Grid, gridApi] = useVbenVxeGrid({
refresh: { code: 'query' }, refresh: { code: 'query' },
search: true, search: true,
}, },
} as VxeTableGridOptions<AiMindmapApi.MindMapVO>, } as VxeTableGridOptions<AiMindmapApi.MindMap>,
}); });
async function openPreview(row: AiMindmapApi.MindMapVO) { async function openPreview(row: AiMindmapApi.MindMap) {
previewVisible.value = false; previewVisible.value = false;
drawerApi.open(); drawerApi.open();
await nextTick(); await nextTick();

View File

@ -29,12 +29,12 @@ function handleCreate() {
} }
/** 编辑 */ /** 编辑 */
function handleEdit(row: AiModelApiKeyApi.ApiKeyVO) { function handleEdit(row: AiModelApiKeyApi.ApiKey) {
formModalApi.setData(row).open(); formModalApi.setData(row).open();
} }
/** 删除 */ /** 删除 */
async function handleDelete(row: AiModelApiKeyApi.ApiKeyVO) { async function handleDelete(row: AiModelApiKeyApi.ApiKey) {
const hideLoading = message.loading({ const hideLoading = message.loading({
content: $t('ui.actionMessage.deleting', [row.name]), content: $t('ui.actionMessage.deleting', [row.name]),
key: 'action_key_msg', key: 'action_key_msg',
@ -77,7 +77,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
refresh: { code: 'query' }, refresh: { code: 'query' },
search: true, search: true,
}, },
} as VxeTableGridOptions<AiModelApiKeyApi.ApiKeyVO>, } as VxeTableGridOptions<AiModelApiKeyApi.ApiKey>,
}); });
</script> </script>

View File

@ -14,7 +14,7 @@ import { $t } from '#/locales';
import { useFormSchema } from '../data'; import { useFormSchema } from '../data';
const emit = defineEmits(['success']); const emit = defineEmits(['success']);
const formData = ref<AiModelApiKeyApi.ApiKeyVO>(); const formData = ref<AiModelApiKeyApi.ApiKey>();
const getTitle = computed(() => { const getTitle = computed(() => {
return formData.value?.id return formData.value?.id
? $t('ui.actionTitle.edit', ['API 密钥']) ? $t('ui.actionTitle.edit', ['API 密钥'])
@ -42,7 +42,7 @@ const [Modal, modalApi] = useVbenModal({
} }
modalApi.lock(); modalApi.lock();
// //
const data = (await formApi.getValues()) as AiModelApiKeyApi.ApiKeyVO; const data = (await formApi.getValues()) as AiModelApiKeyApi.ApiKey;
try { try {
await (formData.value?.id ? updateApiKey(data) : createApiKey(data)); await (formData.value?.id ? updateApiKey(data) : createApiKey(data));
// //
@ -59,7 +59,7 @@ const [Modal, modalApi] = useVbenModal({
return; return;
} }
// //
const data = modalApi.getData<AiModelApiKeyApi.ApiKeyVO>(); const data = modalApi.getData<AiModelApiKeyApi.ApiKey>();
if (!data || !data.id) { if (!data || !data.id) {
return; return;
} }

View File

@ -29,12 +29,12 @@ function handleCreate() {
} }
/** 编辑 */ /** 编辑 */
function handleEdit(row: AiModelChatRoleApi.ChatRoleVO) { function handleEdit(row: AiModelChatRoleApi.ChatRole) {
formModalApi.setData({ formType: 'update', ...row }).open(); formModalApi.setData({ formType: 'update', ...row }).open();
} }
/** 删除 */ /** 删除 */
async function handleDelete(row: AiModelChatRoleApi.ChatRoleVO) { async function handleDelete(row: AiModelChatRoleApi.ChatRole) {
const hideLoading = message.loading({ const hideLoading = message.loading({
content: $t('ui.actionMessage.deleting', [row.name]), content: $t('ui.actionMessage.deleting', [row.name]),
key: 'action_key_msg', key: 'action_key_msg',
@ -77,7 +77,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
refresh: { code: 'query' }, refresh: { code: 'query' },
search: true, search: true,
}, },
} as VxeTableGridOptions<AiModelChatRoleApi.ChatRoleVO>, } as VxeTableGridOptions<AiModelChatRoleApi.ChatRole>,
}); });
</script> </script>

View File

@ -19,7 +19,7 @@ import { $t } from '#/locales';
import { useFormSchema } from '../data'; import { useFormSchema } from '../data';
const emit = defineEmits(['success']); const emit = defineEmits(['success']);
const formData = ref<AiModelChatRoleApi.ChatRoleVO>(); const formData = ref<AiModelChatRoleApi.ChatRole>();
const getTitle = computed(() => { const getTitle = computed(() => {
return formData.value?.id return formData.value?.id
? $t('ui.actionTitle.edit', ['聊天角色']) ? $t('ui.actionTitle.edit', ['聊天角色'])
@ -47,7 +47,7 @@ const [Modal, modalApi] = useVbenModal({
} }
modalApi.lock(); modalApi.lock();
// //
const data = (await formApi.getValues()) as AiModelChatRoleApi.ChatRoleVO; const data = (await formApi.getValues()) as AiModelChatRoleApi.ChatRole;
try { try {
await (formData.value?.id ? updateChatRole(data) : createChatRole(data)); await (formData.value?.id ? updateChatRole(data) : createChatRole(data));
// //
@ -64,7 +64,7 @@ const [Modal, modalApi] = useVbenModal({
return; return;
} }
// //
const data = modalApi.getData<AiModelChatRoleApi.ChatRoleVO>(); const data = modalApi.getData<AiModelChatRoleApi.ChatRole>();
if (!data || !data.id) { if (!data || !data.id) {
await formApi.setValues(data); await formApi.setValues(data);
return; return;

View File

@ -17,7 +17,7 @@ import { $t } from '#/locales';
import { useGridColumns, useGridFormSchema } from './data'; import { useGridColumns, useGridFormSchema } from './data';
import Form from './modules/form.vue'; import Form from './modules/form.vue';
const apiKeyList = ref([] as AiModelApiKeyApi.ApiKeyVO[]); const apiKeyList = ref([] as AiModelApiKeyApi.ApiKey[]);
const [FormModal, formModalApi] = useVbenModal({ const [FormModal, formModalApi] = useVbenModal({
connectedComponent: Form, connectedComponent: Form,
destroyOnClose: true, destroyOnClose: true,
@ -34,12 +34,12 @@ function handleCreate() {
} }
/** 编辑 */ /** 编辑 */
function handleEdit(row: AiModelModelApi.ModelVO) { function handleEdit(row: AiModelModelApi.Model) {
formModalApi.setData(row).open(); formModalApi.setData(row).open();
} }
/** 删除 */ /** 删除 */
async function handleDelete(row: AiModelModelApi.ModelVO) { async function handleDelete(row: AiModelModelApi.Model) {
const hideLoading = message.loading({ const hideLoading = message.loading({
content: $t('ui.actionMessage.deleting', [row.name]), content: $t('ui.actionMessage.deleting', [row.name]),
key: 'action_key_msg', key: 'action_key_msg',
@ -82,7 +82,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
refresh: { code: 'query' }, refresh: { code: 'query' },
search: true, search: true,
}, },
} as VxeTableGridOptions<AiModelModelApi.ModelVO>, } as VxeTableGridOptions<AiModelModelApi.Model>,
}); });
onMounted(async () => { onMounted(async () => {
// //

View File

@ -15,7 +15,7 @@ import { $t } from '#/locales';
import { useFormSchema } from '../data'; import { useFormSchema } from '../data';
const emit = defineEmits(['success']); const emit = defineEmits(['success']);
const formData = ref<AiModelModelApi.ModelVO>(); const formData = ref<AiModelModelApi.Model>();
const getTitle = computed(() => { const getTitle = computed(() => {
return formData.value?.id return formData.value?.id
? $t('ui.actionTitle.edit', ['模型配置']) ? $t('ui.actionTitle.edit', ['模型配置'])
@ -43,7 +43,7 @@ const [Modal, modalApi] = useVbenModal({
} }
modalApi.lock(); modalApi.lock();
// //
const data = (await formApi.getValues()) as AiModelModelApi.ModelVO; const data = (await formApi.getValues()) as AiModelModelApi.Model;
try { try {
await (formData.value?.id ? updateModel(data) : createModel(data)); await (formData.value?.id ? updateModel(data) : createModel(data));
// //
@ -60,7 +60,7 @@ const [Modal, modalApi] = useVbenModal({
return; return;
} }
// //
const data = modalApi.getData<AiModelModelApi.ModelVO>(); const data = modalApi.getData<AiModelModelApi.Model>();
if (!data || !data.id) { if (!data || !data.id) {
return; return;
} }

View File

@ -29,12 +29,12 @@ function handleCreate() {
} }
/** 编辑 */ /** 编辑 */
function handleEdit(row: AiModelToolApi.ToolVO) { function handleEdit(row: AiModelToolApi.Tool) {
formModalApi.setData(row).open(); formModalApi.setData(row).open();
} }
/** 删除 */ /** 删除 */
async function handleDelete(row: AiModelToolApi.ToolVO) { async function handleDelete(row: AiModelToolApi.Tool) {
const hideLoading = message.loading({ const hideLoading = message.loading({
content: $t('ui.actionMessage.deleting', [row.name]), content: $t('ui.actionMessage.deleting', [row.name]),
key: 'action_key_msg', key: 'action_key_msg',
@ -77,7 +77,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
refresh: { code: 'query' }, refresh: { code: 'query' },
search: true, search: true,
}, },
} as VxeTableGridOptions<AiModelToolApi.ToolVO>, } as VxeTableGridOptions<AiModelToolApi.Tool>,
}); });
</script> </script>

View File

@ -14,7 +14,7 @@ import { $t } from '#/locales';
import { useFormSchema } from '../data'; import { useFormSchema } from '../data';
const emit = defineEmits(['success']); const emit = defineEmits(['success']);
const formData = ref<AiModelToolApi.ToolVO>(); const formData = ref<AiModelToolApi.Tool>();
const getTitle = computed(() => { const getTitle = computed(() => {
return formData.value?.id return formData.value?.id
? $t('ui.actionTitle.edit', ['工具']) ? $t('ui.actionTitle.edit', ['工具'])
@ -42,7 +42,7 @@ const [Modal, modalApi] = useVbenModal({
} }
modalApi.lock(); modalApi.lock();
// //
const data = (await formApi.getValues()) as AiModelToolApi.ToolVO; const data = (await formApi.getValues()) as AiModelToolApi.Tool;
try { try {
await (formData.value?.id ? updateTool(data) : createTool(data)); await (formData.value?.id ? updateTool(data) : createTool(data));
// //
@ -59,7 +59,7 @@ const [Modal, modalApi] = useVbenModal({
return; return;
} }
// //
const data = modalApi.getData<AiModelToolApi.ToolVO>(); const data = modalApi.getData<AiModelToolApi.Tool>();
if (!data || !data.id) { if (!data || !data.id) {
return; return;
} }

View File

@ -24,7 +24,7 @@ function onRefresh() {
} }
/** 删除 */ /** 删除 */
async function handleDelete(row: AiMusicApi.MusicVO) { async function handleDelete(row: AiMusicApi.Music) {
const hideLoading = message.loading({ const hideLoading = message.loading({
content: $t('ui.actionMessage.deleting', [row.id]), content: $t('ui.actionMessage.deleting', [row.id]),
key: 'action_key_msg', key: 'action_key_msg',
@ -41,7 +41,7 @@ async function handleDelete(row: AiMusicApi.MusicVO) {
} }
} }
/** 修改是否发布 */ /** 修改是否发布 */
const handleUpdatePublicStatusChange = async (row: AiMusicApi.MusicVO) => { const handleUpdatePublicStatusChange = async (row: AiMusicApi.Music) => {
try { try {
// //
const text = row.publicStatus ? '公开' : '私有'; const text = row.publicStatus ? '公开' : '私有';
@ -82,7 +82,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
refresh: { code: 'query' }, refresh: { code: 'query' },
search: true, search: true,
}, },
} as VxeTableGridOptions<AiMusicApi.MusicVO>, } as VxeTableGridOptions<AiMusicApi.Music>,
}); });
onMounted(async () => { onMounted(async () => {
// //

View File

@ -17,7 +17,7 @@ import {
import Tag from './Tag.vue'; import Tag from './Tag.vue';
type TabType = AiWriteApi.WriteVO['type']; type TabType = AiWriteApi.Write['type'];
defineProps<{ defineProps<{
isWriting: boolean; isWriting: boolean;
@ -26,7 +26,7 @@ defineProps<{
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'example', param: 'reply' | 'write'): void; (e: 'example', param: 'reply' | 'write'): void;
(e: 'reset'): void; (e: 'reset'): void;
(e: 'submit', params: Partial<AiWriteApi.WriteVO>): void; (e: 'submit', params: Partial<AiWriteApi.Write>): void;
}>(); }>();
function omit(obj: Record<string, any>, keysToOmit: string[]) { function omit(obj: Record<string, any>, keysToOmit: string[]) {
@ -74,7 +74,7 @@ const [DefineLabel, ReuseLabel] = createReusableTemplate<{
label: string; label: string;
}>(); }>();
const initData: AiWriteApi.WriteVO = { const initData: AiWriteApi.Write = {
type: 1, type: 1,
prompt: '', prompt: '',
originalContent: '', originalContent: '',
@ -84,10 +84,10 @@ const initData: AiWriteApi.WriteVO = {
format: 1, format: 1,
}; };
const formData = ref<AiWriteApi.WriteVO>({ ...initData }); const formData = ref<AiWriteApi.Write>({ ...initData });
/** 用来记录切换之前所填写的数据,切换的时候给赋值回来 */ /** 用来记录切换之前所填写的数据,切换的时候给赋值回来 */
const recordFormData = {} as Record<AiWriteTypeEnum, AiWriteApi.WriteVO>; const recordFormData = {} as Record<AiWriteTypeEnum, AiWriteApi.Write>;
/** 切换tab */ /** 切换tab */
function switchTab(value: TabType) { function switchTab(value: TabType) {
if (value !== selectedTab.value) { if (value !== selectedTab.value) {

View File

@ -24,7 +24,7 @@ function stopStream() {
/** 执行写作 */ /** 执行写作 */
const rightRef = ref<InstanceType<typeof Right>>(); const rightRef = ref<InstanceType<typeof Right>>();
function submit(data: Partial<AiWriteApi.WriteVO>) { function submit(data: Partial<AiWriteApi.Write>) {
abortController.value = new AbortController(); abortController.value = new AbortController();
writeResult.value = ''; writeResult.value = '';
isWriting.value = true; isWriting.value = true;

View File

@ -23,7 +23,7 @@ function onRefresh() {
} }
/** 删除 */ /** 删除 */
async function handleDelete(row: AiWriteApi.AiWritePageReqVO) { async function handleDelete(row: AiWriteApi.AiWritePageReq) {
const hideLoading = message.loading({ const hideLoading = message.loading({
content: $t('ui.actionMessage.deleting', [row.id]), content: $t('ui.actionMessage.deleting', [row.id]),
key: 'action_key_msg', key: 'action_key_msg',
@ -65,7 +65,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
refresh: { code: 'query' }, refresh: { code: 'query' },
search: true, search: true,
}, },
} as VxeTableGridOptions<AiWriteApi.AiWritePageReqVO>, } as VxeTableGridOptions<AiWriteApi.AiWritePageReq>,
}); });
onMounted(async () => { onMounted(async () => {
// //

View File

@ -88,6 +88,12 @@ export function useGridColumns(
onTaskClick: (task: BpmProcessInstanceApi.Task) => void, onTaskClick: (task: BpmProcessInstanceApi.Task) => void,
): VxeTableGridOptions['columns'] { ): VxeTableGridOptions['columns'] {
return [ return [
{
field: 'id',
title: '流程编号',
minWidth: 320,
fixed: 'left',
},
{ {
field: 'name', field: 'name',
title: '流程名称', title: '流程名称',
@ -167,12 +173,6 @@ export function useGridColumns(
}, },
}, },
}, },
{
field: 'id',
title: '流程编号',
minWidth: 320,
},
{ {
title: '操作', title: '操作',
width: 180, width: 180,

View File

@ -41,12 +41,6 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
title: '发起人', title: '发起人',
minWidth: 120, minWidth: 120,
}, },
{
field: 'createTime',
title: '发起时间',
minWidth: 180,
formatter: 'formatDateTime',
},
{ {
field: 'name', field: 'name',
title: '当前任务', title: '当前任务',

View File

@ -93,12 +93,13 @@ onMounted(async () => {
<Card class="w-1/5"> <Card class="w-1/5">
<List item-layout="horizontal" :data-source="leftSides"> <List item-layout="horizontal" :data-source="leftSides">
<template #renderItem="{ item }"> <template #renderItem="{ item }">
<List.Item> <List.Item
@click="sideClick(item)"
class="cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-700"
>
<List.Item.Meta> <List.Item.Meta>
<template #title> <template #title>
<a @click="sideClick(item)"> {{ item.name }}
{{ item.name }}
</a>
</template> </template>
</List.Item.Meta> </List.Item.Meta>
<template #extra> <template #extra>

View File

@ -1,14 +1,17 @@
import type { VbenFormSchema } from '#/adapter/form'; import type { VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import { useUserStore } from '@vben/stores';
import { erpPriceMultiply } from '@vben/utils'; import { erpPriceMultiply } from '@vben/utils';
import { z } from '#/adapter/form';
import { getBusinessStatusTypeSimpleList } from '#/api/crm/business/status'; import { getBusinessStatusTypeSimpleList } from '#/api/crm/business/status';
import { getCustomerSimpleList } from '#/api/crm/customer'; import { getCustomerSimpleList } from '#/api/crm/customer';
import { getSimpleUserList } from '#/api/system/user'; import { getSimpleUserList } from '#/api/system/user';
/** 新增/修改的表单 */ /** 新增/修改的表单 */
export function useFormSchema(): VbenFormSchema[] { export function useFormSchema(): VbenFormSchema[] {
const userStore = useUserStore();
return [ return [
{ {
fieldName: 'id', fieldName: 'id',
@ -35,6 +38,7 @@ export function useFormSchema(): VbenFormSchema[] {
value: 'id', value: 'id',
}, },
}, },
defaultValue: userStore.userInfo?.id,
rules: 'required', rules: 'required',
}, },
{ {
@ -50,7 +54,7 @@ export function useFormSchema(): VbenFormSchema[] {
}, },
dependencies: { dependencies: {
triggerFields: ['id'], triggerFields: ['id'],
disabled: (values) => !values.customerId, disabled: (values) => values.customerDefault,
}, },
rules: 'required', rules: 'required',
}, },
@ -103,8 +107,9 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'InputNumber', component: 'InputNumber',
componentProps: { componentProps: {
min: 0, min: 0,
precision: 2,
}, },
rules: 'required', rules: z.number().min(0).optional().default(0),
}, },
{ {
fieldName: 'discountPercent', fieldName: 'discountPercent',
@ -114,15 +119,19 @@ export function useFormSchema(): VbenFormSchema[] {
min: 0, min: 0,
precision: 2, precision: 2,
}, },
rules: 'required', rules: z.number().min(0).max(100).optional().default(0),
}, },
{ {
fieldName: 'totalPrice', fieldName: 'totalPrice',
label: '折扣后金额', label: '折扣后金额',
component: 'InputNumber', component: 'InputNumber',
componentProps: {
min: 0,
precision: 2,
disabled: true,
},
dependencies: { dependencies: {
triggerFields: ['totalProductPrice', 'discountPercent'], triggerFields: ['totalProductPrice', 'discountPercent'],
disabled: () => true,
trigger(values, form) { trigger(values, form) {
const discountPrice = const discountPrice =
erpPriceMultiply( erpPriceMultiply(
@ -157,69 +166,83 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
field: 'name', field: 'name',
title: '商机名称', title: '商机名称',
fixed: 'left', fixed: 'left',
minWidth: 240,
slots: { default: 'name' }, slots: { default: 'name' },
}, },
{ {
field: 'customerName', field: 'customerName',
title: '客户名称', title: '客户名称',
fixed: 'left', fixed: 'left',
minWidth: 240,
slots: { default: 'customerName' }, slots: { default: 'customerName' },
}, },
{ {
field: 'totalPrice', field: 'totalPrice',
title: '商机金额(元)', title: '商机金额(元)',
minWidth: 140,
formatter: 'formatAmount2', formatter: 'formatAmount2',
}, },
{ {
field: 'dealTime', field: 'dealTime',
title: '预计成交日期', title: '预计成交日期',
formatter: 'formatDate', formatter: 'formatDate',
minWidth: 180,
}, },
{ {
field: 'remark', field: 'remark',
title: '备注', title: '备注',
minWidth: 200,
}, },
{ {
field: 'contactNextTime', field: 'contactNextTime',
title: '下次联系时间', title: '下次联系时间',
formatter: 'formatDate', formatter: 'formatDate',
minWidth: 180,
}, },
{ {
field: 'ownerUserName', field: 'ownerUserName',
title: '负责人', title: '负责人',
minWidth: 120,
}, },
{ {
field: 'ownerUserDeptName', field: 'ownerUserDeptName',
title: '所属部门', title: '所属部门',
minWidth: 120,
}, },
{ {
field: 'contactLastTime', field: 'contactLastTime',
title: '最后跟进时间', title: '最后跟进时间',
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, minWidth: 180,
{
field: 'updateTime',
title: '更新时间',
formatter: 'formatDateTime',
}, },
{ {
field: 'createTime', field: 'createTime',
title: '创建时间', title: '创建时间',
formatter: 'formatDateTime', formatter: 'formatDateTime',
minWidth: 180,
}, },
{ {
field: 'creatorName', field: 'creatorName',
title: '创建人', title: '创建人',
minWidth: 120,
},
{
field: 'updateTime',
title: '更新时间',
formatter: 'formatDateTime',
minWidth: 180,
}, },
{ {
field: 'statusTypeName', field: 'statusTypeName',
title: '商机状态组', title: '商机状态组',
fixed: 'right', fixed: 'right',
minWidth: 120,
}, },
{ {
field: 'statusName', field: 'statusName',
title: '商机阶段', title: '商机阶段',
fixed: 'right', fixed: 'right',
minWidth: 120,
}, },
{ {
title: '操作', title: '操作',

View File

@ -15,7 +15,10 @@ import {
getBusinessPageByContact, getBusinessPageByContact,
getBusinessPageByCustomer, getBusinessPageByCustomer,
} from '#/api/crm/business'; } from '#/api/crm/business';
import { createContactBusinessList } from '#/api/crm/contact'; import {
createContactBusinessList,
deleteContactBusinessList,
} from '#/api/crm/contact';
import { BizTypeEnum } from '#/api/crm/permission'; import { BizTypeEnum } from '#/api/crm/permission';
import { $t } from '#/locales'; import { $t } from '#/locales';
@ -73,7 +76,7 @@ async function handleDeleteContactBusinessList() {
content: `确定要将${checkedRows.value.map((item) => item.name).join(',')}解除关联吗?`, content: `确定要将${checkedRows.value.map((item) => item.name).join(',')}解除关联吗?`,
}) })
.then(async () => { .then(async () => {
const res = await createContactBusinessList({ const res = await deleteContactBusinessList({
contactId: props.bizId, contactId: props.bizId,
businessIds: checkedRows.value.map((item) => item.id), businessIds: checkedRows.value.map((item) => item.id),
}); });

View File

@ -3,9 +3,7 @@ import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import { handleTree } from '@vben/utils'; import { handleTree } from '@vben/utils';
import { z } from '#/adapter/form';
import { getDeptList } from '#/api/system/dept'; import { getDeptList } from '#/api/system/dept';
import { CommonStatusEnum, DICT_TYPE, getDictOptions } from '#/utils';
/** 新增/修改的表单 */ /** 新增/修改的表单 */
export function useFormSchema(): VbenFormSchema[] { export function useFormSchema(): VbenFormSchema[] {
@ -38,17 +36,13 @@ export function useFormSchema(): VbenFormSchema[] {
placeholder: '请选择应用部门', placeholder: '请选择应用部门',
treeDefaultExpandAll: true, treeDefaultExpandAll: true,
}, },
help: '不选择部门时,默认全公司生效',
}, },
{ {
fieldName: 'status', fieldName: 'statuses',
label: '状态', label: '阶段设置',
component: 'RadioGroup', component: 'Input',
componentProps: { rules: 'required',
options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'),
buttonStyle: 'solid',
optionType: 'button',
},
rules: z.number().default(CommonStatusEnum.ENABLE),
}, },
]; ];
} }

View File

@ -1,15 +1,17 @@
<script lang="ts" setup> <script lang="ts" setup>
import type { CrmBusinessStatusApi } from '#/api/crm/business/status'; import type { CrmBusinessStatusApi } from '#/api/crm/business/status';
import { computed, ref } from 'vue'; import { computed, nextTick, ref } from 'vue';
import { useVbenModal } from '@vben/common-ui'; import { useVbenModal } from '@vben/common-ui';
import { message } from 'ant-design-vue'; import { Input, InputNumber, message } from 'ant-design-vue';
import { useVbenForm } from '#/adapter/form'; import { useVbenForm } from '#/adapter/form';
import { TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { import {
createBusinessStatus, createBusinessStatus,
DEFAULT_STATUSES,
getBusinessStatus, getBusinessStatus,
updateBusinessStatus, updateBusinessStatus,
} from '#/api/crm/business/status'; } from '#/api/crm/business/status';
@ -49,6 +51,10 @@ const [Modal, modalApi] = useVbenModal({
const data = const data =
(await formApi.getValues()) as CrmBusinessStatusApi.BusinessStatus; (await formApi.getValues()) as CrmBusinessStatusApi.BusinessStatus;
try { try {
if (formData.value?.statuses && formData.value.statuses.length > 0) {
data.statuses = formData.value.statuses;
data.statuses.splice(-3, 3);
}
await (formData.value?.id await (formData.value?.id
? updateBusinessStatus(data) ? updateBusinessStatus(data)
: createBusinessStatus(data)); : createBusinessStatus(data));
@ -62,30 +68,159 @@ const [Modal, modalApi] = useVbenModal({
}, },
async onOpenChange(isOpen: boolean) { async onOpenChange(isOpen: boolean) {
if (!isOpen) { if (!isOpen) {
formData.value = undefined;
return; return;
} }
// //
const data = modalApi.getData<CrmBusinessStatusApi.BusinessStatus>(); const data = modalApi.getData<CrmBusinessStatusApi.BusinessStatus>();
if (!data || !data.id) {
return;
}
modalApi.lock(); modalApi.lock();
try { try {
formData.value = await getBusinessStatus(data.id as number); if (!data || !data.id) {
// values formData.value = {
if (formData.value) { id: undefined,
await formApi.setValues(formData.value); name: '',
deptIds: [],
statuses: [],
};
addStatus();
} else {
formData.value = await getBusinessStatus(data.id as number);
if (
!formData.value?.statuses?.length ||
formData.value?.statuses?.length === 0
) {
addStatus();
}
} }
// values
await formApi.setValues(formData.value as any);
gridApi.grid.reloadData(
(formData.value!.statuses =
formData.value?.statuses?.concat(DEFAULT_STATUSES)) as any,
);
} finally { } finally {
modalApi.unlock(); modalApi.unlock();
} }
}, },
}); });
/** 添加状态 */
async function addStatus() {
formData.value!.statuses!.unshift({
name: '',
percent: undefined,
} as any);
await nextTick();
gridApi.grid.reloadData(formData.value!.statuses as any);
}
/** 删除状态 */
async function deleteStatusArea(row: any, rowIndex: number) {
gridApi.grid.remove(row);
formData.value!.statuses!.splice(rowIndex, 1);
gridApi.grid.reloadData(formData.value!.statuses as any);
}
/** 表格配置 */
const [Grid, gridApi] = useVbenVxeGrid({
gridOptions: {
editConfig: {
trigger: 'click',
mode: 'cell',
},
columns: [
{
field: 'defaultStatus',
title: '阶段',
minWidth: 100,
slots: { default: 'defaultStatus' },
},
{
field: 'name',
title: '阶段名称',
minWidth: 100,
slots: { default: 'name' },
},
{
field: 'percent',
title: '赢单率(%',
minWidth: 100,
slots: { default: 'percent' },
},
{
title: '操作',
width: 130,
fixed: 'right',
slots: { default: 'actions' },
},
],
data: formData.value?.statuses?.concat(DEFAULT_STATUSES),
border: true,
showOverflow: true,
autoResize: true,
keepSource: true,
rowConfig: {
keyField: 'row_id',
},
pagerConfig: {
enabled: false,
},
toolbarConfig: {
enabled: false,
},
},
});
</script> </script>
<template> <template>
<Modal :title="getTitle" class="w-1/2"> <Modal :title="getTitle" class="w-1/2">
<Form class="mx-4" /> <Form class="mx-4">
<template #statuses>
<Grid class="w-full">
<template #defaultStatus="{ row, rowIndex }">
<span>
{{ row.defaultStatus ? '结束' : `阶段${rowIndex + 1}` }}
</span>
</template>
<template #name="{ row }">
<Input v-if="!row.endStatus" v-model:value="row.name" />
<span v-else>{{ row.name }}</span>
</template>
<template #percent="{ row }">
<InputNumber
v-if="!row.endStatus"
v-model:value="row.percent"
:min="0"
:max="100"
:precision="2"
/>
<span v-else>{{ row.percent }}</span>
</template>
<template #actions="{ row, rowIndex }">
<TableAction
:actions="[
{
label: $t('ui.actionTitle.create'),
type: 'link',
ifShow: () => !row.endStatus,
onClick: addStatus,
},
{
label: $t('common.delete'),
type: 'link',
danger: true,
ifShow: () => !row.endStatus,
popConfirm: {
title: $t('ui.actionMessage.deleteConfirm', [row.name]),
confirm: deleteStatusArea.bind(null, row, rowIndex),
},
},
]"
/>
</template>
</Grid>
</template>
</Form>
</Modal> </Modal>
</template> </template>

View File

@ -1,12 +1,15 @@
import type { VbenFormSchema } from '#/adapter/form'; import type { VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import { useUserStore } from '@vben/stores';
import { getAreaTree } from '#/api/system/area'; import { getAreaTree } from '#/api/system/area';
import { getSimpleUserList } from '#/api/system/user'; import { getSimpleUserList } from '#/api/system/user';
import { DICT_TYPE, getDictOptions, getRangePickerDefaultProps } from '#/utils'; import { DICT_TYPE, getDictOptions, getRangePickerDefaultProps } from '#/utils';
/** 新增/修改的表单 */ /** 新增/修改的表单 */
export function useFormSchema(): VbenFormSchema[] { export function useFormSchema(): VbenFormSchema[] {
const userStore = useUserStore();
return [ return [
{ {
fieldName: 'id', fieldName: 'id',
@ -46,6 +49,7 @@ export function useFormSchema(): VbenFormSchema[] {
valueField: 'id', valueField: 'id',
allowClear: true, allowClear: true,
}, },
defaultValue: userStore.userInfo?.id,
rules: 'required', rules: 'required',
}, },
{ {
@ -164,6 +168,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
field: 'name', field: 'name',
title: '线索名称', title: '线索名称',
fixed: 'left', fixed: 'left',
minWidth: 240,
slots: { slots: {
default: 'name', default: 'name',
}, },
@ -171,6 +176,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'source', field: 'source',
title: '线索来源', title: '线索来源',
minWidth: 120,
cellRender: { cellRender: {
name: 'CellDict', name: 'CellDict',
props: { type: DICT_TYPE.CRM_CUSTOMER_SOURCE }, props: { type: DICT_TYPE.CRM_CUSTOMER_SOURCE },
@ -179,22 +185,27 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'mobile', field: 'mobile',
title: '手机', title: '手机',
minWidth: 120,
}, },
{ {
field: 'telephone', field: 'telephone',
title: '电话', title: '电话',
minWidth: 120,
}, },
{ {
field: 'email', field: 'email',
title: '邮箱', title: '邮箱',
minWidth: 120,
}, },
{ {
field: 'detailAddress', field: 'detailAddress',
title: '地址', title: '地址',
minWidth: 120,
}, },
{ {
field: 'industryId', field: 'industryId',
title: '客户行业', title: '客户行业',
minWidth: 120,
cellRender: { cellRender: {
name: 'CellDict', name: 'CellDict',
props: { type: DICT_TYPE.CRM_CUSTOMER_INDUSTRY }, props: { type: DICT_TYPE.CRM_CUSTOMER_INDUSTRY },
@ -203,6 +214,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'level', field: 'level',
title: '客户级别', title: '客户级别',
minWidth: 120,
cellRender: { cellRender: {
name: 'CellDict', name: 'CellDict',
props: { type: DICT_TYPE.CRM_CUSTOMER_LEVEL }, props: { type: DICT_TYPE.CRM_CUSTOMER_LEVEL },
@ -211,34 +223,41 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'ownerUserName', field: 'ownerUserName',
title: '负责人', title: '负责人',
minWidth: 120,
}, },
{ {
field: 'ownerUserDeptName', field: 'ownerUserDeptName',
title: '所属部门', title: '所属部门',
minWidth: 120,
}, },
{ {
field: 'contactNextTime', field: 'contactNextTime',
title: '下次联系时间', title: '下次联系时间',
formatter: 'formatDateTime', formatter: 'formatDateTime',
minWidth: 180,
}, },
{ {
field: 'contactLastTime', field: 'contactLastTime',
title: '最后跟进时间', title: '最后跟进时间',
formatter: 'formatDateTime', formatter: 'formatDateTime',
minWidth: 180,
}, },
{ {
field: 'updateTime', field: 'updateTime',
title: '更新时间', title: '更新时间',
formatter: 'formatDateTime', formatter: 'formatDateTime',
minWidth: 180,
}, },
{ {
field: 'createTime', field: 'createTime',
title: '创建时间', title: '创建时间',
formatter: 'formatDateTime', formatter: 'formatDateTime',
minWidth: 120,
}, },
{ {
field: 'creatorName', field: 'creatorName',
title: '创建人', title: '创建人',
minWidth: 120,
}, },
{ {
title: '操作', title: '操作',

View File

@ -26,9 +26,10 @@ const [Form, formApi] = useVbenForm({
componentProps: { componentProps: {
class: 'w-full', class: 'w-full',
}, },
formItemClass: 'col-span-2', labelWidth: 100,
labelWidth: 120,
}, },
// 3
wrapperClass: 'grid-cols-2',
layout: 'horizontal', layout: 'horizontal',
schema: useFormSchema(), schema: useFormSchema(),
showDefaultActions: false, showDefaultActions: false,

View File

@ -1,6 +1,8 @@
import type { VbenFormSchema } from '#/adapter/form'; import type { VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import { useUserStore } from '@vben/stores';
import { getSimpleContactList } from '#/api/crm/contact'; import { getSimpleContactList } from '#/api/crm/contact';
import { getCustomerSimpleList } from '#/api/crm/customer'; import { getCustomerSimpleList } from '#/api/crm/customer';
import { getAreaTree } from '#/api/system/area'; import { getAreaTree } from '#/api/system/area';
@ -9,6 +11,7 @@ import { DICT_TYPE, getDictOptions } from '#/utils';
/** 新增/修改的表单 */ /** 新增/修改的表单 */
export function useFormSchema(): VbenFormSchema[] { export function useFormSchema(): VbenFormSchema[] {
const userStore = useUserStore();
return [ return [
{ {
fieldName: 'id', fieldName: 'id',
@ -35,6 +38,7 @@ export function useFormSchema(): VbenFormSchema[] {
value: 'id', value: 'id',
}, },
}, },
defaultValue: userStore.userInfo?.id,
}, },
{ {
fieldName: 'customerId', fieldName: 'customerId',
@ -43,7 +47,7 @@ export function useFormSchema(): VbenFormSchema[] {
componentProps: { componentProps: {
api: () => getCustomerSimpleList(), api: () => getCustomerSimpleList(),
fieldNames: { fieldNames: {
label: 'nickname', label: 'name',
value: 'id', value: 'id',
}, },
}, },
@ -188,17 +192,20 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
field: 'name', field: 'name',
title: '联系人姓名', title: '联系人姓名',
fixed: 'left', fixed: 'left',
minWidth: 240,
slots: { default: 'name' }, slots: { default: 'name' },
}, },
{ {
field: 'customerName', field: 'customerName',
title: '客户名称', title: '客户名称',
fixed: 'left', fixed: 'left',
minWidth: 240,
slots: { default: 'customerName' }, slots: { default: 'customerName' },
}, },
{ {
field: 'sex', field: 'sex',
title: '性别', title: '性别',
minWidth: 120,
cellRender: { cellRender: {
name: 'CellDict', name: 'CellDict',
props: { type: DICT_TYPE.SYSTEM_USER_SEX }, props: { type: DICT_TYPE.SYSTEM_USER_SEX },
@ -207,26 +214,32 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'mobile', field: 'mobile',
title: '手机', title: '手机',
minWidth: 120,
}, },
{ {
field: 'telephone', field: 'telephone',
title: '电话', title: '电话',
minWidth: 120,
}, },
{ {
field: 'email', field: 'email',
title: '邮箱', title: '邮箱',
minWidth: 120,
}, },
{ {
field: 'post', field: 'post',
title: '职位', title: '职位',
minWidth: 120,
}, },
{ {
field: 'detailAddress', field: 'detailAddress',
title: '地址', title: '地址',
minWidth: 120,
}, },
{ {
field: 'master', field: 'master',
title: '关键决策人', title: '关键决策人',
minWidth: 120,
cellRender: { cellRender: {
name: 'CellDict', name: 'CellDict',
props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING }, props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING },
@ -235,34 +248,41 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'parentId', field: 'parentId',
title: '直属上级', title: '直属上级',
minWidth: 120,
slots: { default: 'parentId' }, slots: { default: 'parentId' },
}, },
{ {
field: 'ownerUserName', field: 'ownerUserName',
title: '负责人', title: '负责人',
minWidth: 120,
}, },
{ {
field: 'ownerUserDeptName', field: 'ownerUserDeptName',
title: '所属部门', title: '所属部门',
minWidth: 120,
}, },
{ {
field: 'contactNextTime', field: 'contactNextTime',
title: '下次联系时间', title: '下次联系时间',
formatter: 'formatDateTime', formatter: 'formatDateTime',
minWidth: 180,
}, },
{ {
field: 'remark', field: 'remark',
title: '备注', title: '备注',
minWidth: 200,
}, },
{ {
field: 'createTime', field: 'createTime',
title: '创建时间', title: '创建时间',
formatter: 'formatDateTime', formatter: 'formatDateTime',
minWidth: 180,
}, },
{ {
field: 'updateTime', field: 'updateTime',
title: '更新时间', title: '更新时间',
formatter: 'formatDateTime', formatter: 'formatDateTime',
minWidth: 180,
}, },
{ {
title: '操作', title: '操作',

View File

@ -60,6 +60,8 @@ const [Modal, modalApi] = useVbenModal({
// //
const data = modalApi.getData<CrmContactApi.Contact>(); const data = modalApi.getData<CrmContactApi.Contact>();
if (!data || !data.id) { if (!data || !data.id) {
// values
await formApi.setValues(data);
return; return;
} }
modalApi.lock(); modalApi.lock();

View File

@ -1,6 +1,7 @@
import type { VbenFormSchema } from '#/adapter/form'; import type { VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import { useUserStore } from '@vben/stores';
import { erpPriceMultiply, floatToFixed2 } from '@vben/utils'; import { erpPriceMultiply, floatToFixed2 } from '@vben/utils';
import { z } from '#/adapter/form'; import { z } from '#/adapter/form';
@ -12,6 +13,7 @@ import { DICT_TYPE } from '#/utils';
/** 新增/修改的表单 */ /** 新增/修改的表单 */
export function useFormSchema(): VbenFormSchema[] { export function useFormSchema(): VbenFormSchema[] {
const userStore = useUserStore();
return [ return [
{ {
fieldName: 'id', fieldName: 'id',
@ -27,7 +29,7 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'Input', component: 'Input',
componentProps: { componentProps: {
placeholder: '保存时自动生成', placeholder: '保存时自动生成',
disabled: () => true, disabled: true,
}, },
}, },
{ {
@ -50,6 +52,7 @@ export function useFormSchema(): VbenFormSchema[] {
value: 'id', value: 'id',
}, },
}, },
defaultValue: userStore.userInfo?.id,
rules: 'required', rules: 'required',
}, },
{ {
@ -58,22 +61,45 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'ApiSelect', component: 'ApiSelect',
rules: 'required', rules: 'required',
componentProps: { componentProps: {
api: getCustomerSimpleList, api: () => getCustomerSimpleList(),
labelField: 'name', fieldNames: {
valueField: 'id', label: 'name',
value: 'id',
},
placeholder: '请选择客户', placeholder: '请选择客户',
}, },
}, },
{ {
fieldName: 'businessId', fieldName: 'businessId',
label: '商机名称', label: '商机名称',
component: 'ApiSelect', component: 'Select',
componentProps: { componentProps: {
api: getSimpleBusinessList, options: [],
labelField: 'name',
valueField: 'id',
placeholder: '请选择商机', placeholder: '请选择商机',
}, },
dependencies: {
triggerFields: ['customerId'],
disabled: (values) => !values.customerId,
async componentProps(values) {
if (!values.customerId) {
return {
options: [],
placeholder: '请选择客户',
};
}
const res = await getSimpleBusinessList();
const list = res.filter(
(item) => item.customerId === values.customerId,
);
return {
options: list.map((item) => ({
label: item.name,
value: item.id,
})),
placeholder: '请选择商机',
};
},
},
}, },
{ {
fieldName: 'orderDate', fieldName: 'orderDate',
@ -117,17 +143,39 @@ export function useFormSchema(): VbenFormSchema[] {
value: 'id', value: 'id',
}, },
}, },
defaultValue: userStore.userInfo?.id,
}, },
{ {
fieldName: 'signContactId', fieldName: 'signContactId',
label: '客户签约人', label: '客户签约人',
component: 'ApiSelect', component: 'Select',
componentProps: { componentProps: {
api: getSimpleContactList, options: [],
labelField: 'name',
valueField: 'id',
placeholder: '请选择客户签约人', placeholder: '请选择客户签约人',
}, },
dependencies: {
triggerFields: ['customerId'],
disabled: (values) => !values.customerId,
async componentProps(values) {
if (!values.customerId) {
return {
options: [],
placeholder: '请选择客户',
};
}
const res = await getSimpleContactList();
const list = res.filter(
(item) => item.customerId === values.customerId,
);
return {
options: list.map((item) => ({
label: item.name,
value: item.id,
})),
placeholder: '请选择客户签约人',
};
},
},
}, },
{ {
fieldName: 'remark', fieldName: 'remark',
@ -150,25 +198,31 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'InputNumber', component: 'InputNumber',
componentProps: { componentProps: {
min: 0, min: 0,
precision: 2,
}, },
rules: z.number().min(0).optional().default(0),
}, },
{ {
fieldName: 'discountPercent', fieldName: 'discountPercent',
label: '整单折扣(%', label: '整单折扣(%',
component: 'InputNumber', component: 'InputNumber',
rules: z.number().min(0).max(100).default(0),
componentProps: { componentProps: {
min: 0, min: 0,
precision: 2, precision: 2,
}, },
rules: z.number().min(0).max(100).optional().default(0),
}, },
{ {
fieldName: 'totalPrice', fieldName: 'totalPrice',
label: '折扣后金额', label: '折扣后金额',
component: 'InputNumber', component: 'InputNumber',
componentProps: {
min: 0,
precision: 2,
disabled: true,
},
dependencies: { dependencies: {
triggerFields: ['totalProductPrice', 'discountPercent'], triggerFields: ['totalProductPrice', 'discountPercent'],
disabled: () => true,
trigger(values, form) { trigger(values, form) {
const discountPrice = const discountPrice =
erpPriceMultiply( erpPriceMultiply(
@ -203,9 +257,11 @@ export function useGridFormSchema(): VbenFormSchema[] {
label: '客户', label: '客户',
component: 'ApiSelect', component: 'ApiSelect',
componentProps: { componentProps: {
api: getCustomerSimpleList, api: () => getCustomerSimpleList(),
labelField: 'name', fieldNames: {
valueField: 'id', label: 'name',
value: 'id',
},
placeholder: '请选择客户', placeholder: '请选择客户',
}, },
}, },
@ -223,20 +279,20 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
title: '合同名称', title: '合同名称',
field: 'name', field: 'name',
minWidth: 150, minWidth: 220,
fixed: 'left', fixed: 'left',
slots: { default: 'name' }, slots: { default: 'name' },
}, },
{ {
title: '客户名称', title: '客户名称',
field: 'customerName', field: 'customerName',
minWidth: 150, minWidth: 240,
slots: { default: 'customerName' }, slots: { default: 'customerName' },
}, },
{ {
title: '商机名称', title: '商机名称',
field: 'businessName', field: 'businessName',
minWidth: 150, minWidth: 220,
slots: { default: 'businessName' }, slots: { default: 'businessName' },
}, },
{ {

View File

@ -72,13 +72,13 @@ async function handleDelete(row: CrmContractApi.Contract) {
/** 提交审核 */ /** 提交审核 */
async function handleSubmit(row: CrmContractApi.Contract) { async function handleSubmit(row: CrmContractApi.Contract) {
const hideLoading = message.loading({ const hideLoading = message.loading({
content: $t('ui.actionMessage.submitting', [row.name]), content: '提交审核中...',
key: 'action_key_msg', key: 'action_key_msg',
}); });
try { try {
await submitContract(row.id as number); await submitContract(row.id as number);
message.success({ message.success({
content: $t('ui.actionMessage.submitSuccess', [row.name]), content: '提交审核成功',
key: 'action_key_msg', key: 'action_key_msg',
}); });
onRefresh(); onRefresh();

View File

@ -45,7 +45,15 @@ function onRefresh() {
/** 创建合同 */ /** 创建合同 */
function handleCreate() { function handleCreate() {
formModalApi.setData(null).open(); formModalApi
.setData(
props.bizType === BizTypeEnum.CRM_CUSTOMER
? {
customerId: props.bizId,
}
: { businessId: props.bizId },
)
.open();
} }
/** 查看合同详情 */ /** 查看合同详情 */

View File

@ -90,6 +90,8 @@ const [Modal, modalApi] = useVbenModal({
// //
const data = modalApi.getData<CrmContractApi.Contract>(); const data = modalApi.getData<CrmContractApi.Contract>();
if (!data || !data.id) { if (!data || !data.id) {
// values
await formApi.setValues(data);
return; return;
} }
modalApi.lock(); modalApi.lock();

View File

@ -1,12 +1,15 @@
import type { VbenFormSchema } from '#/adapter/form'; import type { VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import { useUserStore } from '@vben/stores';
import { getAreaTree } from '#/api/system/area'; import { getAreaTree } from '#/api/system/area';
import { getSimpleUserList } from '#/api/system/user'; import { getSimpleUserList } from '#/api/system/user';
import { DICT_TYPE, getDictOptions, getRangePickerDefaultProps } from '#/utils'; import { DICT_TYPE, getDictOptions, getRangePickerDefaultProps } from '#/utils';
/** 新增/修改的表单 */ /** 新增/修改的表单 */
export function useFormSchema(): VbenFormSchema[] { export function useFormSchema(): VbenFormSchema[] {
const userStore = useUserStore();
return [ return [
{ {
fieldName: 'id', fieldName: 'id',
@ -47,6 +50,7 @@ export function useFormSchema(): VbenFormSchema[] {
value: 'id', value: 'id',
}, },
}, },
defaultValue: userStore.userInfo?.id,
rules: 'required', rules: 'required',
}, },
{ {
@ -154,6 +158,8 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
field: 'name', field: 'name',
title: '客户名称', title: '客户名称',
fixed: 'left', fixed: 'left',
align: 'left',
minWidth: 280,
slots: { slots: {
default: 'name', default: 'name',
}, },
@ -161,6 +167,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'source', field: 'source',
title: '客户来源', title: '客户来源',
minWidth: 100,
cellRender: { cellRender: {
name: 'CellDict', name: 'CellDict',
props: { type: DICT_TYPE.CRM_CUSTOMER_SOURCE }, props: { type: DICT_TYPE.CRM_CUSTOMER_SOURCE },
@ -169,22 +176,32 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'mobile', field: 'mobile',
title: '手机', title: '手机',
minWidth: 100,
}, },
{ {
field: 'telephone', field: 'telephone',
title: '电话', title: '电话',
minWidth: 100,
}, },
{ {
field: 'email', field: 'email',
title: '邮箱', title: '邮箱',
minWidth: 100,
},
{
field: 'areaName',
title: '地址',
minWidth: 140,
}, },
{ {
field: 'detailAddress', field: 'detailAddress',
title: '地址', title: '地址',
minWidth: 140,
}, },
{ {
field: 'industryId', field: 'industryId',
title: '客户行业', title: '客户行业',
minWidth: 80,
cellRender: { cellRender: {
name: 'CellDict', name: 'CellDict',
props: { type: DICT_TYPE.CRM_CUSTOMER_INDUSTRY }, props: { type: DICT_TYPE.CRM_CUSTOMER_INDUSTRY },
@ -193,6 +210,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'level', field: 'level',
title: '客户级别', title: '客户级别',
minWidth: 120,
cellRender: { cellRender: {
name: 'CellDict', name: 'CellDict',
props: { type: DICT_TYPE.CRM_CUSTOMER_LEVEL }, props: { type: DICT_TYPE.CRM_CUSTOMER_LEVEL },
@ -201,30 +219,36 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'ownerUserName', field: 'ownerUserName',
title: '负责人', title: '负责人',
minWidth: 80,
}, },
{ {
field: 'ownerUserDeptName', field: 'ownerUserDeptName',
title: '所属部门', title: '所属部门',
minWidth: 100,
}, },
{ {
field: 'contactNextTime', field: 'contactNextTime',
title: '下次联系时间', title: '下次联系时间',
formatter: 'formatDateTime', formatter: 'formatDateTime',
minWidth: 160,
}, },
{ {
field: 'contactLastTime', field: 'contactLastTime',
title: '最后跟进时间', title: '最后跟进时间',
formatter: 'formatDateTime', formatter: 'formatDateTime',
minWidth: 160,
}, },
{ {
field: 'updateTime', field: 'updateTime',
title: '更新时间', title: '更新时间',
formatter: 'formatDateTime', formatter: 'formatDateTime',
minWidth: 160,
}, },
{ {
field: 'createTime', field: 'createTime',
title: '创建时间', title: '创建时间',
formatter: 'formatDateTime', formatter: 'formatDateTime',
minWidth: 160,
}, },
{ {
title: '操作', title: '操作',

View File

@ -1,5 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useVbenModal } from '@vben/common-ui'; import { useVbenModal } from '@vben/common-ui';
import { useUserStore } from '@vben/stores';
import { message } from 'ant-design-vue'; import { message } from 'ant-design-vue';
@ -10,6 +11,8 @@ import { $t } from '#/locales';
const emit = defineEmits(['success']); const emit = defineEmits(['success']);
const userStore = useUserStore();
const [Form, formApi] = useVbenForm({ const [Form, formApi] = useVbenForm({
commonConfig: { commonConfig: {
componentProps: { componentProps: {
@ -39,6 +42,7 @@ const [Form, formApi] = useVbenForm({
value: 'id', value: 'id',
}, },
}, },
defaultValue: userStore.userInfo?.id,
rules: 'required', rules: 'required',
}, },
], ],

View File

@ -1,6 +1,7 @@
import type { VbenFormSchema } from '#/adapter/form'; import type { VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import { useUserStore } from '@vben/stores';
import { handleTree } from '@vben/utils'; import { handleTree } from '@vben/utils';
import { z } from '#/adapter/form'; import { z } from '#/adapter/form';
@ -10,6 +11,7 @@ import { CommonStatusEnum, DICT_TYPE, getDictOptions } from '#/utils';
/** 新增/修改的表单 */ /** 新增/修改的表单 */
export function useFormSchema(): VbenFormSchema[] { export function useFormSchema(): VbenFormSchema[] {
const userStore = useUserStore();
return [ return [
{ {
component: 'Input', component: 'Input',
@ -31,9 +33,13 @@ export function useFormSchema(): VbenFormSchema[] {
label: '负责人', label: '负责人',
rules: 'required', rules: 'required',
componentProps: { componentProps: {
api: getSimpleUserList, api: () => getSimpleUserList(),
fieldNames: { label: 'nickname', value: 'id' }, fieldNames: {
label: 'nickname',
value: 'id',
},
}, },
defaultValue: userStore.userInfo?.id,
}, },
{ {
component: 'Input', component: 'Input',
@ -124,15 +130,18 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'name', field: 'name',
title: '产品名称', title: '产品名称',
minWidth: 240,
slots: { default: 'name' }, slots: { default: 'name' },
}, },
{ {
field: 'categoryName', field: 'categoryName',
title: '产品类型', title: '产品类型',
minWidth: 120,
}, },
{ {
field: 'unit', field: 'unit',
title: '产品单位', title: '产品单位',
minWidth: 120,
cellRender: { cellRender: {
name: 'CellDict', name: 'CellDict',
props: { type: DICT_TYPE.CRM_PRODUCT_UNIT }, props: { type: DICT_TYPE.CRM_PRODUCT_UNIT },
@ -141,15 +150,18 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'no', field: 'no',
title: '产品编码', title: '产品编码',
minWidth: 120,
}, },
{ {
field: 'price', field: 'price',
title: '价格(元)', title: '价格(元)',
formatter: 'formatAmount2', formatter: 'formatAmount2',
minWidth: 120,
}, },
{ {
field: 'description', field: 'description',
title: '产品描述', title: '产品描述',
minWidth: 200,
}, },
{ {
field: 'status', field: 'status',
@ -158,24 +170,29 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
name: 'CellDict', name: 'CellDict',
props: { type: DICT_TYPE.CRM_PRODUCT_STATUS }, props: { type: DICT_TYPE.CRM_PRODUCT_STATUS },
}, },
minWidth: 120,
}, },
{ {
field: 'ownerUserName', field: 'ownerUserName',
title: '负责人', title: '负责人',
minWidth: 120,
}, },
{ {
field: 'updateTime', field: 'updateTime',
title: '更新时间', title: '更新时间',
formatter: 'formatDateTime', formatter: 'formatDateTime',
minWidth: 180,
}, },
{ {
field: 'creatorName', field: 'creatorName',
title: '创建人', title: '创建人',
minWidth: 120,
}, },
{ {
field: 'createTime', field: 'createTime',
title: '创建时间', title: '创建时间',
formatter: 'formatDateTime', formatter: 'formatDateTime',
minWidth: 180,
}, },
{ {
title: '操作', title: '操作',

View File

@ -112,7 +112,7 @@ watch(
item.sellingPrice = item.contractPrice; item.sellingPrice = item.contractPrice;
}); });
} }
gridApi.grid?.loadData(tableData.value); gridApi.grid.reloadData(tableData.value);
}, },
{ {
immediate: true, immediate: true,

View File

@ -1,14 +1,20 @@
import type { VbenFormSchema } from '#/adapter/form'; import type { VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import { useUserStore } from '@vben/stores';
import { getContractSimpleList } from '#/api/crm/contract'; import { getContractSimpleList } from '#/api/crm/contract';
import { getCustomerSimpleList } from '#/api/crm/customer'; import { getCustomerSimpleList } from '#/api/crm/customer';
import { getReceivablePlanSimpleList } from '#/api/crm/receivable/plan'; import {
getReceivablePlan,
getReceivablePlanSimpleList,
} from '#/api/crm/receivable/plan';
import { getSimpleUserList } from '#/api/system/user'; import { getSimpleUserList } from '#/api/system/user';
import { DICT_TYPE, getDictOptions } from '#/utils'; import { DICT_TYPE, getDictOptions } from '#/utils';
/** 新增/修改的表单 */ /** 新增/修改的表单 */
export function useFormSchema(): VbenFormSchema[] { export function useFormSchema(): VbenFormSchema[] {
const userStore = useUserStore();
return [ return [
{ {
fieldName: 'id', fieldName: 'id',
@ -22,7 +28,6 @@ export function useFormSchema(): VbenFormSchema[] {
fieldName: 'no', fieldName: 'no',
label: '回款编号', label: '回款编号',
component: 'Input', component: 'Input',
rules: 'required',
componentProps: { componentProps: {
placeholder: '保存时自动生成', placeholder: '保存时自动生成',
disabled: true, disabled: true,
@ -34,11 +39,14 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'ApiSelect', component: 'ApiSelect',
rules: 'required', rules: 'required',
componentProps: { componentProps: {
api: getSimpleUserList, api: () => getSimpleUserList(),
labelField: 'nickname', fieldNames: {
valueField: 'id', label: 'nickname',
placeholder: '请选择客户', value: 'id',
},
placeholder: '请选择负责人',
}, },
defaultValue: userStore.userInfo?.id,
}, },
{ {
fieldName: 'customerId', fieldName: 'customerId',
@ -46,9 +54,11 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'ApiSelect', component: 'ApiSelect',
rules: 'required', rules: 'required',
componentProps: { componentProps: {
api: getCustomerSimpleList, api: () => getCustomerSimpleList(),
labelField: 'name', fieldNames: {
valueField: 'id', label: 'name',
value: 'id',
},
placeholder: '请选择客户', placeholder: '请选择客户',
}, },
}, },
@ -97,6 +107,12 @@ export function useFormSchema(): VbenFormSchema[] {
value: item.id, value: item.id,
})), })),
placeholder: '请选择回款期数', placeholder: '请选择回款期数',
onChange: async (value: any) => {
const plan = await getReceivablePlan(value);
values.returnTime = plan?.returnTime;
values.price = plan?.price;
values.returnType = plan?.returnType;
},
} as any; } as any;
} }
}, },
@ -159,9 +175,11 @@ export function useGridFormSchema(): VbenFormSchema[] {
label: '客户', label: '客户',
component: 'ApiSelect', component: 'ApiSelect',
componentProps: { componentProps: {
api: getCustomerSimpleList, api: () => getCustomerSimpleList(),
labelField: 'name', fieldNames: {
valueField: 'id', label: 'name',
value: 'id',
},
placeholder: '请选择客户', placeholder: '请选择客户',
}, },
}, },

View File

@ -72,13 +72,13 @@ async function handleDelete(row: CrmReceivableApi.Receivable) {
/** 提交审核 */ /** 提交审核 */
async function handleSubmit(row: CrmReceivableApi.Receivable) { async function handleSubmit(row: CrmReceivableApi.Receivable) {
const hideLoading = message.loading({ const hideLoading = message.loading({
content: $t('ui.actionMessage.submitting', [row.no]), content: '提交审核中...',
key: 'action_key_msg', key: 'action_key_msg',
}); });
try { try {
await submitReceivable(row.id as number); await submitReceivable(row.id as number);
message.success({ message.success({
content: $t('ui.actionMessage.submitSuccess', [row.no]), content: '提交审核成功',
key: 'action_key_msg', key: 'action_key_msg',
}); });
onRefresh(); onRefresh();

View File

@ -33,7 +33,12 @@ function onRefresh() {
/** 创建回款 */ /** 创建回款 */
function handleCreate() { function handleCreate() {
formModalApi.setData(null).open(); formModalApi
.setData({
contractId: props.contractId,
customerId: props.customerId,
})
.open();
} }
/** 编辑回款 */ /** 编辑回款 */

View File

@ -66,6 +66,8 @@ const [Modal, modalApi] = useVbenModal({
// //
const data = modalApi.getData(); const data = modalApi.getData();
if (!data) { if (!data) {
// values
await formApi.setValues(data);
return; return;
} }
const { receivable, plan } = data; const { receivable, plan } = data;

View File

@ -1,13 +1,17 @@
import type { VbenFormSchema } from '#/adapter/form'; import type { VbenFormSchema } from '#/adapter/form';
import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import { useUserStore } from '@vben/stores';
import { floatToFixed2 } from '@vben/utils'; import { floatToFixed2 } from '@vben/utils';
import { getContractSimpleList } from '#/api/crm/contract';
import { getCustomerSimpleList } from '#/api/crm/customer'; import { getCustomerSimpleList } from '#/api/crm/customer';
import { getSimpleUserList } from '#/api/system/user';
import { DICT_TYPE, getDictOptions } from '#/utils'; import { DICT_TYPE, getDictOptions } from '#/utils';
/** 新增/修改的表单 */ /** 新增/修改的表单 */
export function useFormSchema(): VbenFormSchema[] { export function useFormSchema(): VbenFormSchema[] {
const userStore = useUserStore();
return [ return [
{ {
fieldName: 'customerId', fieldName: 'customerId',
@ -15,23 +19,43 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'ApiSelect', component: 'ApiSelect',
rules: 'required', rules: 'required',
componentProps: { componentProps: {
api: getCustomerSimpleList, api: () => getCustomerSimpleList(),
labelField: 'name', fieldNames: {
valueField: 'id', label: 'name',
value: 'id',
},
placeholder: '请选择客户', placeholder: '请选择客户',
}, },
}, },
{ {
fieldName: 'contractId', fieldName: 'contractId',
label: '合同', label: '合同',
component: 'ApiSelect', component: 'Select',
rules: 'required', rules: 'required',
componentProps: { componentProps: {
api: getCustomerSimpleList, options: [],
labelField: 'name',
valueField: 'id',
placeholder: '请选择合同', placeholder: '请选择合同',
}, },
dependencies: {
triggerFields: ['customerId'],
disabled: (values) => !values.customerId,
async componentProps(values) {
if (!values.customerId) {
return {
options: [],
placeholder: '请选择客户',
};
}
const res = await getContractSimpleList(values.customerId);
return {
options: res.map((item) => ({
label: item.name,
value: item.id,
})),
placeholder: '请选择合同',
};
},
},
}, },
{ {
fieldName: 'period', fieldName: 'period',
@ -42,6 +66,24 @@ export function useFormSchema(): VbenFormSchema[] {
disabled: true, disabled: true,
}, },
}, },
{
fieldName: 'ownerUserId',
label: '负责人',
component: 'ApiSelect',
componentProps: {
api: () => getSimpleUserList(),
fieldNames: {
label: 'nickname',
value: 'id',
},
},
dependencies: {
triggerFields: ['id'],
disabled: (values) => !values.id,
},
defaultValue: userStore.userInfo?.id,
rules: 'required',
},
{ {
fieldName: 'price', fieldName: 'price',
label: '计划回款金额', label: '计划回款金额',
@ -60,6 +102,9 @@ export function useFormSchema(): VbenFormSchema[] {
rules: 'required', rules: 'required',
componentProps: { componentProps: {
placeholder: '请选择计划回款日期', placeholder: '请选择计划回款日期',
showTime: false,
valueFormat: 'x',
format: 'YYYY-MM-DD',
}, },
}, },
{ {
@ -102,9 +147,11 @@ export function useGridFormSchema(): VbenFormSchema[] {
label: '客户', label: '客户',
component: 'ApiSelect', component: 'ApiSelect',
componentProps: { componentProps: {
api: getCustomerSimpleList, api: () => getCustomerSimpleList(),
labelField: 'name', fieldNames: {
valueField: 'id', label: 'name',
value: 'id',
},
placeholder: '请选择客户', placeholder: '请选择客户',
}, },
}, },
@ -224,7 +271,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
title: '操作', title: '操作',
field: 'actions', field: 'actions',
width: 180, width: 220,
fixed: 'right', fixed: 'right',
slots: { default: 'actions' }, slots: { default: 'actions' },
}, },

View File

@ -195,8 +195,6 @@ function onChangeSceneType(key: number | string) {
auth: ['crm:receivable-plan:update'], auth: ['crm:receivable-plan:update'],
onClick: handleEdit.bind(null, row), onClick: handleEdit.bind(null, row),
}, },
]"
:drop-down-actions="[
{ {
label: $t('common.delete'), label: $t('common.delete'),
type: 'link', type: 'link',

View File

@ -40,7 +40,12 @@ function onRefresh() {
/** 创建回款计划 */ /** 创建回款计划 */
function handleCreate() { function handleCreate() {
formModalApi.setData(null).open(); formModalApi
.setData({
contractId: props.contractId,
customerId: props.customerId,
})
.open();
} }
/** 创建回款 */ /** 创建回款 */

View File

@ -66,6 +66,8 @@ const [Modal, modalApi] = useVbenModal({
// //
const data = modalApi.getData<CrmReceivablePlanApi.Plan>(); const data = modalApi.getData<CrmReceivablePlanApi.Plan>();
if (!data || !data.id) { if (!data || !data.id) {
// values
await formApi.setValues(data);
return; return;
} }
modalApi.lock(); modalApi.lock();

View File

@ -51,7 +51,7 @@ async function handleMaster(row: InfraFileConfigApi.FileConfig) {
}); });
try { try {
await updateFileConfigMaster(row.id as number); await updateFileConfigMaster(row.id as number);
message.success($t('ui.actionMessage.operationSuccess')); message.success($t('ui.actionMessage.updateSuccess', [row.name]));
onRefresh(); onRefresh();
} finally { } finally {
hideLoading(); hideLoading();

View File

@ -102,7 +102,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'endTime', field: 'endTime',
title: '结束时间', title: '结束时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {

View File

@ -225,7 +225,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'createTime', field: 'createTime',
title: '创建时间', title: '创建时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {

View File

@ -52,7 +52,7 @@ async function handleClose(
} }
const hideLoading = message.loading({ const hideLoading = message.loading({
content: $t('ui.actionMessage.processing'), content: '关闭中...',
key: 'action_key_msg', key: 'action_key_msg',
}); });
try { try {

View File

@ -91,13 +91,13 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'createTime', field: 'createTime',
title: '参团时间', title: '参团时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {
field: 'endTime', field: 'endTime',
title: '结束时间', title: '结束时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {
@ -155,13 +155,13 @@ export function useUserGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'createTime', field: 'createTime',
title: '参团时间', title: '参团时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {
field: 'endTime', field: 'endTime',
title: '结束时间', title: '结束时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {

View File

@ -89,13 +89,13 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'createTime', field: 'createTime',
title: '领取时间', title: '领取时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {
field: 'useTime', field: 'useTime',
title: '使用时间', title: '使用时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {

View File

@ -239,7 +239,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'createTime', field: 'createTime',
title: '创建时间', title: '创建时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {

View File

@ -146,7 +146,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'createTime', field: 'createTime',
title: '创建时间', title: '创建时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {

View File

@ -96,7 +96,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'createTime', field: 'createTime',
title: '创建时间', title: '创建时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {

View File

@ -93,7 +93,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'used', field: 'used',
title: '是否使用', title: '是否使用',
width: 100, minWidth: 100,
cellRender: { cellRender: {
name: 'CellDict', name: 'CellDict',
props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING }, props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING },
@ -107,7 +107,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'createTime', field: 'createTime',
title: '创建时间', title: '创建时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {

View File

@ -102,7 +102,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'status', field: 'status',
title: '活动状态', title: '活动状态',
width: 100, minWidth: 100,
cellRender: { cellRender: {
name: 'CellDict', name: 'CellDict',
props: { type: DICT_TYPE.COMMON_STATUS }, props: { type: DICT_TYPE.COMMON_STATUS },
@ -111,23 +111,23 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'stock', field: 'stock',
title: '库存', title: '库存',
width: 80, minWidth: 80,
}, },
{ {
field: 'totalStock', field: 'totalStock',
title: '总库存', title: '总库存',
width: 80, minWidth: 80,
}, },
{ {
field: 'redeemedQuantity', field: 'redeemedQuantity',
title: '已兑换数量', title: '已兑换数量',
width: 100, minWidth: 100,
slots: { default: 'redeemedQuantity' }, slots: { default: 'redeemedQuantity' },
}, },
{ {
field: 'createTime', field: 'createTime',
title: '创建时间', title: '创建时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {

View File

@ -132,13 +132,13 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'startTime', field: 'startTime',
title: '活动开始时间', title: '活动开始时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {
field: 'endTime', field: 'endTime',
title: '活动结束时间', title: '活动结束时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {
@ -153,7 +153,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'createTime', field: 'createTime',
title: '创建时间', title: '创建时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {

View File

@ -44,7 +44,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'configIds', field: 'configIds',
title: '秒杀时段', title: '秒杀时段',
width: 220, minWidth: 220,
slots: { default: 'configIds' }, slots: { default: 'configIds' },
}, },
{ {
@ -112,7 +112,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
field: 'createTime', field: 'createTime',
title: '创建时间', title: '创建时间',
align: 'center', align: 'center',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {

View File

@ -100,21 +100,22 @@ export function useGridColumns<T = MallSeckillConfigApi.SeckillConfig>(
{ {
title: '秒杀时段名称', title: '秒杀时段名称',
field: 'name', field: 'name',
width: 200, minWidth: 200,
}, },
{ {
title: '开始时间点', title: '开始时间点',
field: 'startTime', field: 'startTime',
width: 120, minWidth: 120,
}, },
{ {
title: '结束时间点', title: '结束时间点',
field: 'endTime', field: 'endTime',
width: 120, minWidth: 120,
}, },
{ {
title: '秒杀轮播图', title: '秒杀轮播图',
field: 'sliderPicUrls', field: 'sliderPicUrls',
minWidth: 100,
cellRender: { cellRender: {
name: 'CellImages', name: 'CellImages',
}, },
@ -122,7 +123,7 @@ export function useGridColumns<T = MallSeckillConfigApi.SeckillConfig>(
{ {
title: '活动状态', title: '活动状态',
field: 'status', field: 'status',
width: 100, minWidth: 100,
cellRender: { cellRender: {
attrs: { beforeChange: onStatusChange }, attrs: { beforeChange: onStatusChange },
name: 'CellSwitch', name: 'CellSwitch',
@ -137,7 +138,7 @@ export function useGridColumns<T = MallSeckillConfigApi.SeckillConfig>(
{ {
title: '创建时间', title: '创建时间',
field: 'createTime', field: 'createTime',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {

View File

@ -65,8 +65,15 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'userAvatar', field: 'userAvatar',
title: '头像', title: '头像',
width: 70, minWidth: 70,
slots: { default: 'userAvatar' }, cellRender: {
name: 'CellImage',
props: {
height: 40,
width: 40,
shape: 'circle',
},
},
}, },
{ {
field: 'userNickname', field: 'userNickname',
@ -115,7 +122,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'unfreezeTime', field: 'unfreezeTime',
title: '解冻时间', title: '解冻时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {

View File

@ -4,8 +4,6 @@ import type { MallBrokerageRecordApi } from '#/api/mall/trade/brokerage/record';
import { DocAlert, Page } from '@vben/common-ui'; import { DocAlert, Page } from '@vben/common-ui';
import { Avatar } from 'ant-design-vue';
import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { getBrokerageRecordPage } from '#/api/mall/trade/brokerage/record'; import { getBrokerageRecordPage } from '#/api/mall/trade/brokerage/record';
@ -54,10 +52,6 @@ const [Grid] = useVbenVxeGrid({
/> />
</template> </template>
<Grid table-title=""> <Grid table-title="" />
<template #userAvatar="{ row }">
<Avatar :src="row.userAvatar" />
</template>
</Grid>
</Page> </Page>
</template> </template>

View File

@ -53,7 +53,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'avatar', field: 'avatar',
title: '头像', title: '头像',
width: 70, minWidth: 70,
cellRender: { cellRender: {
name: 'CellImage', name: 'CellImage',
props: { props: {
@ -71,7 +71,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'brokerageUserCount', field: 'brokerageUserCount',
title: '推广人数', title: '推广人数',
width: 80, minWidth: 80,
}, },
{ {
field: 'brokerageOrderCount', field: 'brokerageOrderCount',
@ -116,18 +116,18 @@ export function useGridColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'brokerageTime', field: 'brokerageTime',
title: '成为推广员时间', title: '成为推广员时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {
field: 'bindUserId', field: 'bindUserId',
title: '上级推广员编号', title: '上级推广员编号',
width: 150, minWidth: 150,
}, },
{ {
field: 'bindUserTime', field: 'bindUserTime',
title: '推广员绑定时间', title: '推广员绑定时间',
width: 180, minWidth: 180,
formatter: 'formatDateTime', formatter: 'formatDateTime',
}, },
{ {

View File

@ -99,7 +99,7 @@ function useColumns(): VxeTableGridOptions['columns'] {
{ {
field: 'sourceUserAvatar', field: 'sourceUserAvatar',
title: '头像', title: '头像',
width: 70, minWidth: 70,
cellRender: { cellRender: {
name: 'CellImage', name: 'CellImage',
props: { props: {

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