Merge remote-tracking branch 'yudao/dev' into dev

This commit is contained in:
jason
2025-11-20 13:32:53 +08:00
727 changed files with 20322 additions and 21931 deletions

View File

@@ -16,6 +16,7 @@ import {
erpCountInputFormatter,
erpNumberFormatter,
fenToYuan,
formatFileSize,
formatPast2,
isFunction,
isString,
@@ -344,12 +345,7 @@ setupVbenVxeTable({
// add by 星语:文件大小格式化
vxeUI.formats.add('formatFileSize', {
tableCellFormatMethod({ cellValue }, digits = 2) {
if (!cellValue) return '0 B';
const unitArr = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
const index = Math.floor(Math.log(cellValue) / Math.log(1024));
const size = cellValue / 1024 ** index;
const formattedSize = size.toFixed(digits);
return `${formattedSize} ${unitArr[index]}`;
return formatFileSize(cellValue, digits);
},
});
},

View File

@@ -15,7 +15,6 @@ export namespace AiChatConversationApi {
maxTokens: number; // 单条回复的最大 Token 数量
maxContexts: number; // 上下文的最大 Message 数量
createTime?: Date; // 创建时间
// 额外字段
systemMessage?: string; // 角色设定
modelName?: string; // 模型名字
roleAvatar?: string; // 角色头像
@@ -24,52 +23,52 @@ export namespace AiChatConversationApi {
}
}
// 获得【我的】聊天对话
/** 获得【我的】聊天对话 */
export function getChatConversationMy(id: number) {
return requestClient.get<AiChatConversationApi.ChatConversation>(
`/ai/chat/conversation/get-my?id=${id}`,
);
}
// 新增【我的】聊天对话
/** 新增【我的】聊天对话 */
export function createChatConversationMy(
data: AiChatConversationApi.ChatConversation,
) {
return requestClient.post('/ai/chat/conversation/create-my', data);
}
// 更新【我的】聊天对话
/** 更新【我的】聊天对话 */
export function updateChatConversationMy(
data: AiChatConversationApi.ChatConversation,
) {
return requestClient.put(`/ai/chat/conversation/update-my`, data);
}
// 删除【我的】聊天对话
/** 删除【我的】聊天对话 */
export function deleteChatConversationMy(id: number) {
return requestClient.delete(`/ai/chat/conversation/delete-my?id=${id}`);
}
// 删除【我的】所有对话,置顶除外
/** 删除【我的】所有对话,置顶除外 */
export function deleteChatConversationMyByUnpinned() {
return requestClient.delete(`/ai/chat/conversation/delete-by-unpinned`);
}
// 获得【我的】聊天对话列表
/** 获得【我的】聊天对话列表 */
export function getChatConversationMyList() {
return requestClient.get<AiChatConversationApi.ChatConversation[]>(
`/ai/chat/conversation/my-list`,
);
}
// 获得【我的】聊天对话列表
/** 获得【我的】聊天对话列表 */
export function getChatConversationPage(params: any) {
return requestClient.get<
PageResult<AiChatConversationApi.ChatConversation[]>
>(`/ai/chat/conversation/page`, { params });
}
// 管理员删除消息
/** 管理员删除消息 */
export function deleteChatConversationByAdmin(id: number) {
return requestClient.delete(`/ai/chat/conversation/delete-by-admin?id=${id}`);
}

View File

@@ -19,6 +19,7 @@ export namespace AiChatMessageApi {
model: number; // 模型标志
modelId: number; // 模型编号
content: string; // 聊天内容
reasoningContent?: string; // 推理内容(深度思考)
tokens: number; // 消耗 Token 数量
segmentIds?: number[]; // 段落编号
segments?: {
@@ -27,13 +28,25 @@ export namespace AiChatMessageApi {
documentName: string; // 文档名称
id: number; // 段落编号
}[];
webSearchPages?: WebSearchPage[]; // 联网搜索结果
attachmentUrls?: string[]; // 附件 URL 数组
createTime: Date; // 创建时间
roleAvatar: string; // 角色头像
userAvatar: string; // 用户头像
}
/** 联网搜索页面接口 */
export interface WebSearchPage {
name: string; // 网站名称
icon: string; // 网站图标 URL
title: string; // 页面标题
url: string; // 页面 URL
snippet: string; // 简短描述
summary: string; // 内容摘要
}
}
// 消息列表
/** 消息列表 */
export function getChatMessageListByConversationId(
conversationId: null | number,
) {
@@ -42,15 +55,17 @@ export function getChatMessageListByConversationId(
);
}
// 发送 Stream 消息
/** 发送 Stream 消息 */
export function sendChatMessageStream(
conversationId: number,
content: string,
ctrl: any,
enableContext: boolean,
enableWebSearch: boolean,
onMessage: any,
onError: any,
onClose: any,
attachmentUrls?: string[],
) {
const token = accessStore.accessToken;
return fetchEventSource(`${apiURL}/ai/chat/message/send-stream`, {
@@ -64,6 +79,8 @@ export function sendChatMessageStream(
conversationId,
content,
useContext: enableContext,
useSearch: enableWebSearch,
attachmentUrls: attachmentUrls || [],
}),
onmessage: onMessage,
onerror: onError,
@@ -72,19 +89,19 @@ export function sendChatMessageStream(
});
}
// 删除消息
/** 删除消息 */
export function deleteChatMessage(id: number) {
return requestClient.delete(`/ai/chat/message/delete?id=${id}`);
}
// 删除指定对话的消息
/** 删除指定对话的消息 */
export function deleteByConversationId(conversationId: number) {
return requestClient.delete(
`/ai/chat/message/delete-by-conversation-id?conversationId=${conversationId}`,
);
}
// 获得消息分页
/** 获得消息分页 */
export function getChatMessagePage(params: any) {
return requestClient.get<PageResult<AiChatMessageApi.ChatMessage>>(
'/ai/chat/message/page',
@@ -92,7 +109,7 @@ export function getChatMessagePage(params: any) {
);
}
// 管理员删除消息
/** 管理员删除消息 */
export function deleteChatMessageByAdmin(id: number) {
return requestClient.delete(`/ai/chat/message/delete-by-admin?id=${id}`);
}

View File

@@ -3,14 +3,7 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace AiImageApi {
export interface ImageMidjourneyButtons {
customId: string; // MJ::JOB::upsample::1::85a4b4c1-8835-46c5-a15c-aea34fad1862 动作标识
emoji: string; // 图标 emoji
label: string; // Make Variations 文本
style: number; // 样式: 2Primary、3Green
}
/** AI 绘图 */
/** 绘图 */
export interface Image {
id: number; // 编号
userId: number;
@@ -30,7 +23,14 @@ export namespace AiImageApi {
finishTime: Date; // 完成时间
}
export interface ImageDrawReq {
export interface ImageMidjourneyButtons {
customId: string; // MJ::JOB::upsample::1::85a4b4c1-8835-46c5-a15c-aea34fad1862 动作标识
emoji: string; // 图标 emoji
label: string; // Make Variations 文本
style: number; // 样式: 2Primary、3Green
}
export interface ImageDrawReqVO {
prompt: string; // 提示词
modelId: number; // 模型
style: string; // 图像生成的风格
@@ -39,7 +39,7 @@ export namespace AiImageApi {
options: object; // 绘制参数Map<String, String>
}
export interface ImageMidjourneyImagineReq {
export interface ImageMidjourneyImagineReqVO {
prompt: string; // 提示词
modelId: number; // 模型
base64Array?: string[]; // size不能为空
@@ -54,60 +54,62 @@ export namespace AiImageApi {
}
}
// 获取【我的】绘图分页
/** 获取【我的】绘图分页 */
export function getImagePageMy(params: PageParam) {
return requestClient.get<PageResult<AiImageApi.Image>>('/ai/image/my-page', {
params,
});
}
// 获取【我的】绘图记录
/** 获取【我的】绘图记录 */
export function getImageMy(id: number) {
return requestClient.get<AiImageApi.Image>(`/ai/image/get-my?id=${id}`);
}
// 获取【我的】绘图记录列表
/** 获取【我的】绘图记录列表 */
export function getImageListMyByIds(ids: number[]) {
return requestClient.get<AiImageApi.Image[]>(`/ai/image/my-list-by-ids`, {
params: { ids: ids.join(',') },
});
}
// 生成图片
export function drawImage(data: AiImageApi.ImageDrawReq) {
/** 生成图片 */
export function drawImage(data: AiImageApi.ImageDrawReqVO) {
return requestClient.post(`/ai/image/draw`, data);
}
// 删除【我的】绘画记录
/** 删除【我的】绘画记录 */
export function deleteImageMy(id: number) {
return requestClient.delete(`/ai/image/delete-my?id=${id}`);
}
// ================ midjourney 专属 ================
/** ================ midjourney 专属 ================ */
// 【Midjourney】生成图片
export function midjourneyImagine(data: AiImageApi.ImageMidjourneyImagineReq) {
/** 【Midjourney】生成图片 */
export function midjourneyImagine(
data: AiImageApi.ImageMidjourneyImagineReqVO,
) {
return requestClient.post(`/ai/image/midjourney/imagine`, data);
}
// 【Midjourney】Action 操作(二次生成图片)
/** 【Midjourney】Action 操作(二次生成图片) */
export function midjourneyAction(data: AiImageApi.ImageMidjourneyAction) {
return requestClient.post(`/ai/image/midjourney/action`, data);
}
// ================ 绘图管理 ================
/** ================ 绘图管理 ================ */
// 查询绘画分页
/** 查询绘画分页 */
export function getImagePage(params: any) {
return requestClient.get<AiImageApi.Image[]>(`/ai/image/page`, { params });
}
// 更新绘画发布状态
/** 更新绘画发布状态 */
export function updateImage(data: any) {
return requestClient.put(`/ai/image/update`, data);
}
// 删除绘画
/** 删除绘画 */
export function deleteImage(id: number) {
return requestClient.delete(`/ai/image/delete?id=${id}`);
}

View File

@@ -15,39 +15,39 @@ export namespace AiKnowledgeDocumentApi {
}
}
// 查询知识库文档分页
/** 查询知识库文档分页 */
export function getKnowledgeDocumentPage(params: PageParam) {
return requestClient.get<
PageResult<AiKnowledgeDocumentApi.KnowledgeDocument>
>('/ai/knowledge/document/page', { params });
}
// 查询知识库文档详情
/** 查询知识库文档详情 */
export function getKnowledgeDocument(id: number) {
return requestClient.get(`/ai/knowledge/document/get?id=${id}`);
}
// 新增知识库文档(单个)
/** 新增知识库文档(单个) */
export function createKnowledge(data: any) {
return requestClient.post('/ai/knowledge/document/create', data);
}
// 新增知识库文档(多个)
/** 新增知识库文档(多个) */
export function createKnowledgeDocumentList(data: any) {
return requestClient.post('/ai/knowledge/document/create-list', data);
}
// 修改知识库文档
/** 修改知识库文档 */
export function updateKnowledgeDocument(data: any) {
return requestClient.put('/ai/knowledge/document/update', data);
}
// 修改知识库文档状态
/** 修改知识库文档状态 */
export function updateKnowledgeDocumentStatus(data: any) {
return requestClient.put('/ai/knowledge/document/update-status', data);
}
// 删除知识库文档
/** 删除知识库文档 */
export function deleteKnowledgeDocument(id: number) {
return requestClient.delete(`/ai/knowledge/document/delete?id=${id}`);
}

View File

@@ -13,7 +13,7 @@ export namespace AiKnowledgeKnowledgeApi {
}
}
// 查询知识库分页
/** 查询知识库分页 */
export function getKnowledgePage(params: PageParam) {
return requestClient.get<PageResult<AiKnowledgeKnowledgeApi.Knowledge>>(
'/ai/knowledge/page',
@@ -21,29 +21,29 @@ export function getKnowledgePage(params: PageParam) {
);
}
// 查询知识库详情
/** 查询知识库详情 */
export function getKnowledge(id: number) {
return requestClient.get<AiKnowledgeKnowledgeApi.Knowledge>(
`/ai/knowledge/get?id=${id}`,
);
}
// 新增知识库
/** 新增知识库 */
export function createKnowledge(data: AiKnowledgeKnowledgeApi.Knowledge) {
return requestClient.post('/ai/knowledge/create', data);
}
// 修改知识库
/** 修改知识库 */
export function updateKnowledge(data: AiKnowledgeKnowledgeApi.Knowledge) {
return requestClient.put('/ai/knowledge/update', data);
}
// 删除知识库
/** 删除知识库 */
export function deleteKnowledge(id: number) {
return requestClient.delete(`/ai/knowledge/delete?id=${id}`);
}
// 获取知识库简单列表
/** 获取知识库简单列表 */
export function getSimpleKnowledgeList() {
return requestClient.get<AiKnowledgeKnowledgeApi.Knowledge[]>(
'/ai/knowledge/simple-list',

View File

@@ -3,7 +3,6 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace AiKnowledgeSegmentApi {
// AI 知识库分段
export interface KnowledgeSegment {
id: number; // 编号
documentId: number; // 文档编号
@@ -18,7 +17,7 @@ export namespace AiKnowledgeSegmentApi {
}
}
// 查询知识库分段分页
/** 查询知识库分段分页 */
export function getKnowledgeSegmentPage(params: PageParam) {
return requestClient.get<PageResult<AiKnowledgeSegmentApi.KnowledgeSegment>>(
'/ai/knowledge/segment/page',
@@ -26,28 +25,28 @@ export function getKnowledgeSegmentPage(params: PageParam) {
);
}
// 查询知识库分段详情
/** 查询知识库分段详情 */
export function getKnowledgeSegment(id: number) {
return requestClient.get<AiKnowledgeSegmentApi.KnowledgeSegment>(
`/ai/knowledge/segment/get?id=${id}`,
);
}
// 新增知识库分段
/** 新增知识库分段 */
export function createKnowledgeSegment(
data: AiKnowledgeSegmentApi.KnowledgeSegment,
) {
return requestClient.post('/ai/knowledge/segment/create', data);
}
// 修改知识库分段
/** 修改知识库分段 */
export function updateKnowledgeSegment(
data: AiKnowledgeSegmentApi.KnowledgeSegment,
) {
return requestClient.put('/ai/knowledge/segment/update', data);
}
// 修改知识库分段状态
/** 修改知识库分段状态 */
export function updateKnowledgeSegmentStatus(id: number, status: number) {
return requestClient.put('/ai/knowledge/segment/update-status', {
id,
@@ -55,26 +54,26 @@ export function updateKnowledgeSegmentStatus(id: number, status: number) {
});
}
// 删除知识库分段
/** 删除知识库分段 */
export function deleteKnowledgeSegment(id: number) {
return requestClient.delete(`/ai/knowledge/segment/delete?id=${id}`);
}
// 切片内容
/** 切片内容 */
export function splitContent(url: string, segmentMaxTokens: number) {
return requestClient.get('/ai/knowledge/segment/split', {
params: { url, segmentMaxTokens },
});
}
// 获取文档处理列表
/** 获取文档处理列表 */
export function getKnowledgeSegmentProcessList(documentIds: number[]) {
return requestClient.get('/ai/knowledge/segment/get-process-list', {
params: { documentIds: documentIds.join(',') },
});
}
// 搜索知识库分段
/** 搜索知识库分段 */
export function searchKnowledgeSegment(params: any) {
return requestClient.get('/ai/knowledge/segment/search', {
params,

View File

@@ -8,7 +8,6 @@ const { apiURL } = useAppConfig(import.meta.env, import.meta.env.PROD);
const accessStore = useAccessStore();
export namespace AiMindmapApi {
// AI 思维导图
export interface MindMap {
id: number; // 编号
userId: number; // 用户编号
@@ -19,12 +18,12 @@ export namespace AiMindmapApi {
errorMessage: string; // 错误信息
}
// AI 思维导图生成
export interface AiMindMapGenerateReqVO {
prompt: string;
}
}
/** 生成思维导图 Stream */
export function generateMindMap({
data,
onClose,

View File

@@ -26,19 +26,19 @@ export namespace AiMusicApi {
}
}
// 查询音乐分页
/** 查询音乐分页 */
export function getMusicPage(params: PageParam) {
return requestClient.get<PageResult<AiMusicApi.Music>>(`/ai/music/page`, {
params,
});
}
// 更新音乐
/** 更新音乐 */
export function updateMusic(data: any) {
return requestClient.put('/ai/music/update', data);
}
// 删除音乐
/** 删除音乐 */
export function deleteMusic(id: number) {
return requestClient.delete(`/ai/music/delete?id=${id}`);
}

View File

@@ -36,6 +36,7 @@ export namespace AiWriteApi {
}
}
/** 写作 Stream */
export function writeStream({
data,
onClose,

View File

@@ -1,5 +1,7 @@
import type { PageParam, PageResult } from '@vben/request';
import type { BpmModelApi } from '#/api/bpm/model';
import { requestClient } from '#/api/request';
export namespace BpmProcessDefinitionApi {
@@ -9,16 +11,21 @@ export namespace BpmProcessDefinitionApi {
key?: string;
version: number;
name: string;
category: string;
description: string;
deploymentTime: number;
suspensionState: number;
modelType: number;
modelId: string;
formType?: number;
formId?: number;
formName?: string;
formCustomCreatePath?: string;
bpmnXml?: string;
simpleModel?: string;
formFields?: string[];
icon?: string;
startUsers?: BpmModelApi.UserInfo[];
}
}

View File

@@ -1,27 +1,6 @@
import { requestClient } from '#/api/request';
export namespace BpmModelApi {
/** 用户信息 TODO 这个是不是可以抽取出来定义在公共模块 */
// TODO @芋艿:一起看看。
export interface UserInfo {
id: number;
nickname: string;
avatar?: string;
deptId?: number;
deptName?: string;
}
/** 流程定义 */
export interface ProcessDefinition {
id: string;
key?: string;
version: number;
deploymentTime: number;
suspensionState: number;
formType?: number;
formCustomViewPath?: string;
}
/** 流程模型 */
export interface Model {
id: number;
@@ -42,6 +21,27 @@ export namespace BpmModelApi {
bpmnXml: string;
startUsers?: UserInfo[];
}
/** 流程定义 */
export interface ProcessDefinition {
id: string;
key?: string;
version: number;
deploymentTime: number;
suspensionState: number;
formType?: number;
formCustomViewPath?: string;
formFields?: string[];
}
/** 用户信息 */
export interface UserInfo {
id: number;
nickname: string;
avatar?: string;
deptId?: number;
deptName?: string;
}
}
/** 模型分类信息 */

View File

@@ -11,43 +11,6 @@ import type { BpmModelApi } from '#/api/bpm/model';
import { requestClient } from '#/api/request';
export namespace BpmProcessInstanceApi {
// TODO @芋艿:一些注释缺少或者不对;
export interface Task {
id: number;
name: string;
assigneeUser?: User;
}
export interface User {
avatar: string;
id: number;
nickname: string;
}
// 审批任务信息
export interface ApprovalTaskInfo {
assigneeUser: User;
id: number;
ownerUser: User;
reason: string;
signPicUrl: string;
status: number;
}
// 审批节点信息
export interface ApprovalNodeInfo {
candidateStrategy?: BpmCandidateStrategyEnum;
candidateUsers?: User[];
endTime?: Date;
id: string;
name: string;
nodeType: BpmNodeTypeEnum;
startTime?: Date;
status: number;
processInstanceId?: string;
tasks: ApprovalTaskInfo[];
}
/** 流程实例 */
export interface ProcessInstance {
businessKey: string;
@@ -73,8 +36,23 @@ export namespace BpmProcessInstanceApi {
tasks?: BpmProcessInstanceApi.Task[];
}
// 审批详情
export interface ApprovalDetail {
/** 流程实例的任务 */
export interface Task {
id: number;
name: string;
assigneeUser?: User;
}
/** 流程实例的用户信息 */
export interface User {
id: number;
nickname: string;
avatar: string;
deptName?: string;
}
/** 审批详情 */
export interface ApprovalDetailRespVO {
activityNodes: BpmProcessInstanceApi.ApprovalNodeInfo[];
formFieldsPermission: any;
processDefinition: BpmModelApi.ProcessDefinition;
@@ -83,8 +61,32 @@ export namespace BpmProcessInstanceApi {
todoTask: BpmTaskApi.Task;
}
// 抄送流程实例
export interface Copy {
/** 审批详情的节点信息 */
export interface ApprovalNodeInfo {
candidateStrategy?: BpmCandidateStrategyEnum;
candidateUsers?: User[];
endTime?: Date;
id: string;
name: string;
nodeType: BpmNodeTypeEnum;
startTime?: Date;
status: number;
processInstanceId?: string;
tasks: ApprovalTaskInfo[];
}
/** 审批详情的节点的任务 */
export interface ApprovalTaskInfo {
id: number;
assigneeUser: User;
ownerUser: User;
reason: string;
signPicUrl: string;
status: number;
}
/** 抄送流程实例 */
export interface ProcessInstanceCopyRespVO {
activityId: string;
activityName: string;
createTime: number;
@@ -101,6 +103,19 @@ export namespace BpmProcessInstanceApi {
}[];
taskId: string;
}
/** 流程实例的打印数据响应 */
export interface ProcessPrintDataRespVO {
printTemplateEnable: boolean;
printTemplateHtml?: string;
processInstance: ProcessInstance;
tasks: {
description: string;
id: number;
name: string;
signPicUrl?: string;
}[];
}
}
/** 查询我的流程实例分页 */
@@ -177,7 +192,7 @@ export async function updateProcessInstance(
/** 获取审批详情 */
export async function getApprovalDetail(params: any) {
return requestClient.get<BpmProcessInstanceApi.ApprovalDetail>(
return requestClient.get<BpmProcessInstanceApi.ApprovalDetailRespVO>(
`/bpm/process-instance/get-approval-detail`,
{ params },
);
@@ -191,17 +206,16 @@ export async function getNextApprovalNodes(params: any) {
);
}
/** 获取表单字段权限 */
export async function getFormFieldsPermission(params: any) {
return requestClient.get<BpmProcessInstanceApi.ProcessInstance>(
`/bpm/process-instance/get-form-fields-permission`,
{ params },
);
}
/** 获取流程实例 BPMN 模型视图 */
export async function getProcessInstanceBpmnModelView(id: string) {
return requestClient.get<BpmProcessInstanceApi.ProcessInstance>(
`/bpm/process-instance/get-bpmn-model-view?id=${id}`,
);
}
/** 获取流程实例打印数据 */
export async function getProcessInstancePrintData(id: string) {
return requestClient.get<BpmProcessInstanceApi.ProcessPrintDataRespVO>(
`/bpm/process-instance/get-print-data?processInstanceId=${id}`,
);
}

View File

@@ -3,7 +3,7 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace BpmProcessListenerApi {
/** BPM 流程监听器 */
/** 流程监听器 */
export interface ProcessListener {
id: number; // 编号
name: string; // 监听器名字

View File

@@ -5,7 +5,7 @@ import type { BpmProcessInstanceApi } from '../processInstance';
import { requestClient } from '#/api/request';
export namespace BpmTaskApi {
/** BPM 流程监听器 */
/** 流程任务 */
export interface Task {
id: number; // 编号
name: string; // 监听器名字
@@ -15,33 +15,6 @@ export namespace BpmTaskApi {
valueType: string; // 监听器值类型
processInstance?: BpmProcessInstanceApi.ProcessInstance; // 流程实例
}
// 流程任务
export interface TaskManager {
id: string; // 编号
name: string; // 任务名称
createTime: number; // 创建时间
endTime: number; // 结束时间
durationInMillis: number; // 持续时间
status: number; // 状态
reason: string; // 原因
ownerUser: any; // 负责人
assigneeUser: any; // 处理人
taskDefinitionKey: string; // 任务定义key
processInstanceId: string; // 流程实例id
processInstance: BpmProcessInstanceApi.ProcessInstance; // 流程实例
parentTaskId: any; // 父任务id
children: any; // 子任务
formId: any; // 表单id
formName: any; // 表单名称
formConf: any; // 表单配置
formFields: any; // 表单字段
formVariables: any; // 表单变量
buttonsSetting: any; // 按钮设置
signEnable: any; // 签名设置
reasonRequire: any; // 原因设置
nodeType: any; // 节点类型
}
}
/** 查询待办任务分页 */
@@ -88,51 +61,44 @@ export const getTaskListByReturn = async (id: string) => {
return await requestClient.get(`/bpm/task/list-by-return?id=${id}`);
};
/** 退回 */
/** 退回任务 */
export const returnTask = async (data: any) => {
return await requestClient.put('/bpm/task/return', data);
};
// 委派
/** 委派任务 */
export const delegateTask = async (data: any) => {
return await requestClient.put('/bpm/task/delegate', data);
};
// 转派
/** 转派任务 */
export const transferTask = async (data: any) => {
return await requestClient.put('/bpm/task/transfer', data);
};
// 加签
/** 加签任务 */
export const signCreateTask = async (data: any) => {
return await requestClient.put('/bpm/task/create-sign', data);
};
// 减签
/** 减签任务 */
export const signDeleteTask = async (data: any) => {
return await requestClient.delete('/bpm/task/delete-sign', data);
};
// 抄送
/** 抄送任务 */
export const copyTask = async (data: any) => {
return await requestClient.put('/bpm/task/copy', data);
};
// 获取我的待办任务
export const myTodoTask = async (processInstanceId: string) => {
return await requestClient.get(
`/bpm/task/my-todo?processInstanceId=${processInstanceId}`,
);
};
// 获取加签任务列表
/** 获取加签任务列表 */
export const getChildrenTaskList = async (id: string) => {
return await requestClient.get(
`/bpm/task/list-by-parent-task-id?parentTaskId=${id}`,
);
};
// 撤回任务
/** 撤回任务 */
export const withdrawTask = async (taskId: string) => {
return await requestClient.put('/bpm/task/withdraw', null, {
params: { taskId },

View File

@@ -3,7 +3,7 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace BpmUserGroupApi {
/** BPM 用户组 */
/** 用户组 */
export interface UserGroup {
id: number;
name: string;

View File

@@ -5,19 +5,6 @@ import type { CrmPermissionApi } from '#/api/crm/permission';
import { requestClient } from '#/api/request';
export namespace CrmBusinessApi {
/** 商机产品信息 */
export interface BusinessProduct {
id: number;
productId: number;
productName: string;
productNo: string;
productUnit: number;
productPrice: number;
businessPrice: number;
count: number;
totalPrice: number;
}
/** 商机信息 */
export interface Business {
id: number;
@@ -49,7 +36,21 @@ export namespace CrmBusinessApi {
products?: BusinessProduct[];
}
export interface BusinessStatus {
/** 商机产品信息 */
export interface BusinessProduct {
id: number;
productId: number;
productName: string;
productNo: string;
productUnit: number;
productPrice: number;
businessPrice: number;
count: number;
totalPrice: number;
}
/** 商机更新状态请求 */
export interface BusinessUpdateStatusReqVO {
id: number;
statusId: number | undefined;
endStatus: number | undefined;
@@ -97,7 +98,9 @@ export function updateBusiness(data: CrmBusinessApi.Business) {
}
/** 修改商机状态 */
export function updateBusinessStatus(data: CrmBusinessApi.BusinessStatus) {
export function updateBusinessStatus(
data: CrmBusinessApi.BusinessUpdateStatusReqVO,
) {
return requestClient.put('/crm/business/update-status', data);
}
@@ -120,6 +123,6 @@ export function getBusinessPageByContact(params: PageParam) {
}
/** 商机转移 */
export function transferBusiness(data: CrmPermissionApi.TransferReq) {
export function transferBusiness(data: CrmPermissionApi.BusinessTransferReqVO) {
return requestClient.put('/crm/business/transfer', data);
}

View File

@@ -3,14 +3,6 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace CrmBusinessStatusApi {
/** 商机状态信息 */
export interface BusinessStatusType {
[x: string]: any;
id?: number;
name: string;
percent: number;
}
/** 商机状态组信息 */
export interface BusinessStatus {
id?: number;
@@ -21,6 +13,14 @@ export namespace CrmBusinessStatusApi {
createTime?: Date;
statuses?: BusinessStatusType[];
}
/** 商机状态信息 */
export interface BusinessStatusType {
id?: number;
name: string;
percent: number;
[x: string]: any;
}
}
/** 默认商机状态 */

View File

@@ -71,7 +71,7 @@ export function exportClue(params: any) {
}
/** 线索转移 */
export function transferClue(data: CrmPermissionApi.TransferReq) {
export function transferClue(data: CrmPermissionApi.BusinessTransferReqVO) {
return requestClient.put('/crm/clue/transfer', data);
}

View File

@@ -38,13 +38,13 @@ export namespace CrmContactApi {
}
/** 联系人商机关联请求 */
export interface ContactBusinessReq {
export interface ContactBusinessReqVO {
contactId: number;
businessIds: number[];
}
/** 商机联系人关联请求 */
export interface BusinessContactReq {
export interface BusinessContactReqVO {
businessId: number;
contactIds: number[];
}
@@ -108,33 +108,33 @@ export function getSimpleContactList() {
/** 批量新增联系人商机关联 */
export function createContactBusinessList(
data: CrmContactApi.ContactBusinessReq,
data: CrmContactApi.ContactBusinessReqVO,
) {
return requestClient.post('/crm/contact/create-business-list', data);
}
/** 批量新增商机联系人关联 */
export function createBusinessContactList(
data: CrmContactApi.BusinessContactReq,
data: CrmContactApi.BusinessContactReqVO,
) {
return requestClient.post('/crm/contact/create-business-list2', data);
}
/** 解除联系人商机关联 */
export function deleteContactBusinessList(
data: CrmContactApi.ContactBusinessReq,
data: CrmContactApi.ContactBusinessReqVO,
) {
return requestClient.delete('/crm/contact/delete-business-list', { data });
}
/** 解除商机联系人关联 */
export function deleteBusinessContactList(
data: CrmContactApi.BusinessContactReq,
data: CrmContactApi.BusinessContactReqVO,
) {
return requestClient.delete('/crm/contact/delete-business-list2', { data });
}
/** 联系人转移 */
export function transferContact(data: CrmPermissionApi.TransferReq) {
export function transferContact(data: CrmPermissionApi.BusinessTransferReqVO) {
return requestClient.put('/crm/contact/transfer', data);
}

View File

@@ -5,19 +5,6 @@ import type { CrmPermissionApi } from '#/api/crm/permission';
import { requestClient } from '#/api/request';
export namespace CrmContractApi {
/** 合同产品信息 */
export interface ContractProduct {
id: number;
productId: number;
productName: string;
productNo: string;
productUnit: number;
productPrice: number;
contractPrice: number;
count: number;
totalPrice: number;
}
/** 合同信息 */
export interface Contract {
id: number;
@@ -50,6 +37,20 @@ export namespace CrmContractApi {
creatorName: string;
updateTime?: Date;
products?: ContractProduct[];
contactName?: string;
}
/** 合同产品信息 */
export interface ContractProduct {
id: number;
productId: number;
productName: string;
productNo: string;
productUnit: number;
productPrice: number;
contractPrice: number;
count: number;
totalPrice: number;
}
}
@@ -117,7 +118,7 @@ export function submitContract(id: number) {
}
/** 合同转移 */
export function transferContract(data: CrmPermissionApi.TransferReq) {
export function transferContract(data: CrmPermissionApi.BusinessTransferReqVO) {
return requestClient.put('/crm/contract/transfer', data);
}

View File

@@ -16,6 +16,7 @@ export namespace CrmCustomerApi {
ownerUserId: number; // 负责人的用户编号
ownerUserName?: string; // 负责人的用户名称
ownerUserDept?: string; // 负责人的部门名称
ownerUserDeptName?: string; // 负责人的部门名称
lockStatus?: boolean;
dealStatus?: boolean;
mobile: string; // 手机号
@@ -34,8 +35,11 @@ export namespace CrmCustomerApi {
creatorName?: string; // 创建人名称
createTime: Date; // 创建时间
updateTime: Date; // 更新时间
poolDay?: number; // 距离进入公海天数
}
export interface CustomerImport {
/** 客户导入请求 */
export interface CustomerImportReqVO {
ownerUserId: number;
file: File;
updateSupport: boolean;
@@ -83,7 +87,7 @@ export function importCustomerTemplate() {
}
/** 导入客户 */
export function importCustomer(data: CrmCustomerApi.CustomerImport) {
export function importCustomer(data: CrmCustomerApi.CustomerImportReqVO) {
return requestClient.upload('/crm/customer/import', data);
}
@@ -95,7 +99,7 @@ export function getCustomerSimpleList() {
}
/** 客户转移 */
export function transferCustomer(data: CrmPermissionApi.TransferReq) {
export function transferCustomer(data: CrmPermissionApi.BusinessTransferReqVO) {
return requestClient.put('/crm/customer/transfer', data);
}

View File

@@ -3,18 +3,6 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace CrmFollowUpApi {
/** 关联商机信息 */
export interface Business {
id: number;
name: string;
}
/** 关联联系人信息 */
export interface Contact {
id: number;
name: string;
}
/** 跟进记录信息 */
export interface FollowUpRecord {
id: number; // 编号
@@ -32,6 +20,18 @@ export namespace CrmFollowUpApi {
creator: string;
creatorName?: string;
}
/** 关联商机信息 */
export interface Business {
id: number;
name: string;
}
/** 关联联系人信息 */
export interface Contact {
id: number;
name: string;
}
}
/** 查询跟进记录分页 */

View File

@@ -5,12 +5,6 @@ import type { SystemOperateLogApi } from '#/api/system/operate-log';
import { requestClient } from '#/api/request';
export namespace CrmOperateLogApi {
/** 操作日志查询参数 */
export interface OperateLogQuery {
bizType: number;
bizId: number;
}
/** 操作日志信息 */
export interface OperateLog {
id: number;
@@ -22,10 +16,18 @@ export namespace CrmOperateLogApi {
creatorName?: string;
createTime: Date;
}
/** 操作日志查询请求 */
export interface OperateLogQueryReqVO {
bizType: number;
bizId: number;
}
}
/** 获得操作日志 */
export function getOperateLogPage(params: CrmOperateLogApi.OperateLogQuery) {
export function getOperateLogPage(
params: CrmOperateLogApi.OperateLogQueryReqVO,
) {
return requestClient.get<PageResult<SystemOperateLogApi.OperateLog>>(
'/crm/operate-log/page',
{ params },

View File

@@ -17,14 +17,15 @@ export namespace CrmPermissionApi {
}
/** 数据权限转移请求 */
export interface TransferReq {
export interface BusinessTransferReqVO {
id: number; // 模块编号
newOwnerUserId: number; // 新负责人的用户编号
oldOwnerPermissionLevel?: number; // 老负责人加入团队后的权限级别
toBizTypes?: number[]; // 转移客户时,需要额外有【联系人】【商机】【合同】的 checkbox 选择
}
export interface PermissionListReq {
/** 权限列表请求 */
export interface PermissionListReqVO {
bizId: number; // 模块数据编号
bizType: number; // 模块类型
}
@@ -54,7 +55,9 @@ export enum PermissionLevelEnum {
}
/** 获得数据权限列表(查询团队成员列表) */
export function getPermissionList(params: CrmPermissionApi.PermissionListReq) {
export function getPermissionList(
params: CrmPermissionApi.PermissionListReqVO,
) {
return requestClient.get<CrmPermissionApi.Permission[]>(
'/crm/permission/list',
{ params },

View File

@@ -3,14 +3,6 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace CrmReceivableApi {
/** 合同信息 */
export interface Contract {
id?: number;
name?: string;
no: string;
totalPrice: number;
}
/** 回款信息 */
export interface Receivable {
id: number;
@@ -35,20 +27,17 @@ export namespace CrmReceivableApi {
updateTime: Date; // 更新时间
}
export interface ReceivablePageParam extends PageParam {
no?: string;
planId?: number;
customerId?: number;
contractId?: number;
sceneType?: number;
auditStatus?: number;
/** 合同信息 */
export interface Contract {
id?: number;
name?: string;
no: string;
totalPrice: number;
}
}
/** 查询回款列表 */
export function getReceivablePage(
params: CrmReceivableApi.ReceivablePageParam,
) {
export function getReceivablePage(params: PageParam) {
return requestClient.get<PageResult<CrmReceivableApi.Receivable>>(
'/crm/receivable/page',
{ params },
@@ -56,9 +45,7 @@ export function getReceivablePage(
}
/** 查询回款列表,基于指定客户 */
export function getReceivablePageByCustomer(
params: CrmReceivableApi.ReceivablePageParam,
) {
export function getReceivablePageByCustomer(params: PageParam) {
return requestClient.get<PageResult<CrmReceivableApi.Receivable>>(
'/crm/receivable/page-by-customer',
{ params },

View File

@@ -29,20 +29,10 @@ export namespace CrmReceivablePlanApi {
returnTime: Date;
};
}
export interface PlanPageParam extends PageParam {
customerId?: number;
contractId?: number;
contractNo?: string;
sceneType?: number;
remindType?: number;
}
}
/** 查询回款计划列表 */
export function getReceivablePlanPage(
params: CrmReceivablePlanApi.PlanPageParam,
) {
export function getReceivablePlanPage(params: PageParam) {
return requestClient.get<PageResult<CrmReceivablePlanApi.Plan>>(
'/crm/receivable-plan/page',
{ params },
@@ -50,9 +40,7 @@ export function getReceivablePlanPage(
}
/** 查询回款计划列表(按客户) */
export function getReceivablePlanPageByCustomer(
params: CrmReceivablePlanApi.PlanPageParam,
) {
export function getReceivablePlanPageByCustomer(params: PageParam) {
return requestClient.get<PageResult<CrmReceivablePlanApi.Plan>>(
'/crm/receivable-plan/page-by-customer',
{ params },
@@ -98,7 +86,7 @@ export function deleteReceivablePlan(id: number) {
}
/** 导出回款计划 Excel */
export function exportReceivablePlan(params: PageParam) {
export function exportReceivablePlan(params: any) {
return requestClient.download('/crm/receivable-plan/export-excel', {
params,
});

View File

@@ -1,15 +1,24 @@
import { requestClient } from '#/api/request';
export namespace CrmStatisticsCustomerApi {
/** 客户总量分析(按日期) */
export interface CustomerSummaryByDate {
/** 客户统计请求 */
export interface CustomerSummaryReqVO {
times: string[];
interval: number;
deptId: number;
userId: number;
userIds: number[];
}
/** 客户总量分析(按日期)响应 */
export interface CustomerSummaryByDateRespVO {
time: string;
customerCreateCount: number;
customerDealCount: number;
}
/** 客户总量分析(按用户) */
export interface CustomerSummaryByUser {
/** 客户总量分析(按用户)响应 */
export interface CustomerSummaryByUserRespVO {
ownerUserName: string;
customerCreateCount: number;
customerDealCount: number;
@@ -17,28 +26,28 @@ export namespace CrmStatisticsCustomerApi {
receivablePrice: number;
}
/** 客户跟进次数分析(按日期) */
export interface FollowUpSummaryByDate {
/** 客户跟进次数分析(按日期)响应 */
export interface FollowUpSummaryByDateRespVO {
time: string;
followUpRecordCount: number;
followUpCustomerCount: number;
}
/** 客户跟进次数分析(按用户) */
export interface FollowUpSummaryByUser {
/** 客户跟进次数分析(按用户)响应 */
export interface FollowUpSummaryByUserRespVO {
ownerUserName: string;
followupRecordCount: number;
followupCustomerCount: number;
}
/** 客户跟进方式统计 */
export interface FollowUpSummaryByType {
/** 客户跟进方式统计响应 */
export interface FollowUpSummaryByTypeRespVO {
followUpType: string;
followUpRecordCount: number;
}
/** 合同摘要信息 */
export interface CustomerContractSummary {
/** 合同摘要信息响应 */
export interface CustomerContractSummaryRespVO {
customerName: string;
contractName: string;
totalPrice: number;
@@ -51,54 +60,46 @@ export namespace CrmStatisticsCustomerApi {
orderDate: Date;
}
/** 客户公海分析(按日期) */
export interface PoolSummaryByDate {
/** 客户公海分析(按日期)响应 */
export interface PoolSummaryByDateRespVO {
time: string;
customerPutCount: number;
customerTakeCount: number;
}
/** 客户公海分析(按用户) */
export interface PoolSummaryByUser {
/** 客户公海分析(按用户)响应 */
export interface PoolSummaryByUserRespVO {
ownerUserName: string;
customerPutCount: number;
customerTakeCount: number;
}
/** 客户成交周期(按日期) */
export interface CustomerDealCycleByDate {
/** 客户成交周期(按日期)响应 */
export interface CustomerDealCycleByDateRespVO {
time: string;
customerDealCycle: number;
}
/** 客户成交周期(按用户) */
export interface CustomerDealCycleByUser {
/** 客户成交周期(按用户)响应 */
export interface CustomerDealCycleByUserRespVO {
ownerUserName: string;
customerDealCycle: number;
customerDealCount: number;
}
/** 客户成交周期(按地区) */
export interface CustomerDealCycleByArea {
/** 客户成交周期(按地区)响应 */
export interface CustomerDealCycleByAreaRespVO {
areaName: string;
customerDealCycle: number;
customerDealCount: number;
}
/** 客户成交周期(按产品) */
export interface CustomerDealCycleByProduct {
/** 客户成交周期(按产品)响应 */
export interface CustomerDealCycleByProductRespVO {
productName: string;
customerDealCycle: number;
customerDealCount: number;
}
export interface CustomerSummaryParams {
times: string[];
interval: number;
deptId: number;
userId: number;
userIds: number[];
}
}
export function getDatas(activeTabName: any, params: any) {
@@ -167,69 +168,63 @@ export function getChartDatas(activeTabName: any, params: any) {
/** 客户总量分析(按日期) */
export function getCustomerSummaryByDate(
params: CrmStatisticsCustomerApi.CustomerSummaryParams,
params: CrmStatisticsCustomerApi.CustomerSummaryReqVO,
) {
return requestClient.get<CrmStatisticsCustomerApi.CustomerSummaryByDate[]>(
'/crm/statistics-customer/get-customer-summary-by-date',
{ params },
);
return requestClient.get<
CrmStatisticsCustomerApi.CustomerSummaryByDateRespVO[]
>('/crm/statistics-customer/get-customer-summary-by-date', { params });
}
/** 客户总量分析(按用户) */
export function getCustomerSummaryByUser(
params: CrmStatisticsCustomerApi.CustomerSummaryParams,
params: CrmStatisticsCustomerApi.CustomerSummaryReqVO,
) {
return requestClient.get<CrmStatisticsCustomerApi.CustomerSummaryByUser[]>(
'/crm/statistics-customer/get-customer-summary-by-user',
{ params },
);
return requestClient.get<
CrmStatisticsCustomerApi.CustomerSummaryByUserRespVO[]
>('/crm/statistics-customer/get-customer-summary-by-user', { params });
}
/** 客户跟进次数分析(按日期) */
export function getFollowUpSummaryByDate(
params: CrmStatisticsCustomerApi.CustomerSummaryParams,
params: CrmStatisticsCustomerApi.CustomerSummaryReqVO,
) {
return requestClient.get<CrmStatisticsCustomerApi.FollowUpSummaryByDate[]>(
'/crm/statistics-customer/get-follow-up-summary-by-date',
{ params },
);
return requestClient.get<
CrmStatisticsCustomerApi.FollowUpSummaryByDateRespVO[]
>('/crm/statistics-customer/get-follow-up-summary-by-date', { params });
}
/** 客户跟进次数分析(按用户) */
export function getFollowUpSummaryByUser(
params: CrmStatisticsCustomerApi.CustomerSummaryParams,
params: CrmStatisticsCustomerApi.CustomerSummaryReqVO,
) {
return requestClient.get<CrmStatisticsCustomerApi.FollowUpSummaryByUser[]>(
'/crm/statistics-customer/get-follow-up-summary-by-user',
{ params },
);
return requestClient.get<
CrmStatisticsCustomerApi.FollowUpSummaryByUserRespVO[]
>('/crm/statistics-customer/get-follow-up-summary-by-user', { params });
}
/** 获取客户跟进方式统计数 */
export function getFollowUpSummaryByType(
params: CrmStatisticsCustomerApi.CustomerSummaryParams,
params: CrmStatisticsCustomerApi.CustomerSummaryReqVO,
) {
return requestClient.get<CrmStatisticsCustomerApi.FollowUpSummaryByType[]>(
'/crm/statistics-customer/get-follow-up-summary-by-type',
{ params },
);
return requestClient.get<
CrmStatisticsCustomerApi.FollowUpSummaryByTypeRespVO[]
>('/crm/statistics-customer/get-follow-up-summary-by-type', { params });
}
/** 合同摘要信息(客户转化率页面) */
export function getContractSummary(
params: CrmStatisticsCustomerApi.CustomerSummaryParams,
params: CrmStatisticsCustomerApi.CustomerSummaryReqVO,
) {
return requestClient.get<CrmStatisticsCustomerApi.CustomerContractSummary[]>(
'/crm/statistics-customer/get-contract-summary',
{ params },
);
return requestClient.get<
CrmStatisticsCustomerApi.CustomerContractSummaryRespVO[]
>('/crm/statistics-customer/get-contract-summary', { params });
}
/** 获取客户公海分析(按日期) */
export function getPoolSummaryByDate(
params: CrmStatisticsCustomerApi.CustomerSummaryParams,
params: CrmStatisticsCustomerApi.CustomerSummaryReqVO,
) {
return requestClient.get<CrmStatisticsCustomerApi.PoolSummaryByDate[]>(
return requestClient.get<CrmStatisticsCustomerApi.PoolSummaryByDateRespVO[]>(
'/crm/statistics-customer/get-pool-summary-by-date',
{ params },
);
@@ -237,9 +232,9 @@ export function getPoolSummaryByDate(
/** 获取客户公海分析(按用户) */
export function getPoolSummaryByUser(
params: CrmStatisticsCustomerApi.CustomerSummaryParams,
params: CrmStatisticsCustomerApi.CustomerSummaryReqVO,
) {
return requestClient.get<CrmStatisticsCustomerApi.PoolSummaryByUser[]>(
return requestClient.get<CrmStatisticsCustomerApi.PoolSummaryByUserRespVO[]>(
'/crm/statistics-customer/get-pool-summary-by-user',
{ params },
);
@@ -247,39 +242,36 @@ export function getPoolSummaryByUser(
/** 获取客户成交周期(按日期) */
export function getCustomerDealCycleByDate(
params: CrmStatisticsCustomerApi.CustomerSummaryParams,
params: CrmStatisticsCustomerApi.CustomerSummaryReqVO,
) {
return requestClient.get<CrmStatisticsCustomerApi.CustomerDealCycleByDate[]>(
'/crm/statistics-customer/get-customer-deal-cycle-by-date',
{ params },
);
return requestClient.get<
CrmStatisticsCustomerApi.CustomerDealCycleByDateRespVO[]
>('/crm/statistics-customer/get-customer-deal-cycle-by-date', { params });
}
/** 获取客户成交周期(按用户) */
export function getCustomerDealCycleByUser(
params: CrmStatisticsCustomerApi.CustomerSummaryParams,
params: CrmStatisticsCustomerApi.CustomerSummaryReqVO,
) {
return requestClient.get<CrmStatisticsCustomerApi.CustomerDealCycleByUser[]>(
'/crm/statistics-customer/get-customer-deal-cycle-by-user',
{ params },
);
return requestClient.get<
CrmStatisticsCustomerApi.CustomerDealCycleByUserRespVO[]
>('/crm/statistics-customer/get-customer-deal-cycle-by-user', { params });
}
/** 获取客户成交周期(按地区) */
export function getCustomerDealCycleByArea(
params: CrmStatisticsCustomerApi.CustomerSummaryParams,
params: CrmStatisticsCustomerApi.CustomerSummaryReqVO,
) {
return requestClient.get<CrmStatisticsCustomerApi.CustomerDealCycleByArea[]>(
'/crm/statistics-customer/get-customer-deal-cycle-by-area',
{ params },
);
return requestClient.get<
CrmStatisticsCustomerApi.CustomerDealCycleByAreaRespVO[]
>('/crm/statistics-customer/get-customer-deal-cycle-by-area', { params });
}
/** 获取客户成交周期(按产品) */
export function getCustomerDealCycleByProduct(
params: CrmStatisticsCustomerApi.CustomerSummaryParams,
params: CrmStatisticsCustomerApi.CustomerSummaryReqVO,
) {
return requestClient.get<
CrmStatisticsCustomerApi.CustomerDealCycleByProduct[]
CrmStatisticsCustomerApi.CustomerDealCycleByProductRespVO[]
>('/crm/statistics-customer/get-customer-deal-cycle-by-product', { params });
}

View File

@@ -3,22 +3,22 @@ import type { PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace CrmStatisticsFunnelApi {
/** 销售漏斗统计数据 */
export interface FunnelSummary {
/** 销售漏斗统计数据响应 */
export interface FunnelSummaryRespVO {
customerCount: number; // 客户数
businessCount: number; // 商机数
businessWinCount: number; // 赢单数
}
/** 商机分析(按日期) */
export interface BusinessSummaryByDate {
/** 商机分析(按日期)响应 */
export interface BusinessSummaryByDateRespVO {
time: string; // 时间
businessCreateCount: number; // 商机数
totalPrice: number | string; // 商机金额
}
/** 商机转化率分析(按日期) */
export interface BusinessInversionRateSummaryByDate {
/** 商机转化率分析(按日期)响应 */
export interface BusinessInversionRateSummaryByDateRespVO {
time: string; // 时间
businessCount: number; // 商机数量
businessWinCount: number; // 赢单商机数
@@ -61,7 +61,7 @@ export function getChartDatas(activeTabName: any, params: any) {
/** 获取销售漏斗统计数据 */
export function getFunnelSummary(params: any) {
return requestClient.get<CrmStatisticsFunnelApi.FunnelSummary>(
return requestClient.get<CrmStatisticsFunnelApi.FunnelSummaryRespVO>(
'/crm/statistics-funnel/get-funnel-summary',
{ params },
);
@@ -77,16 +77,15 @@ export function getBusinessSummaryByEndStatus(params: any) {
/** 获取新增商机分析(按日期) */
export function getBusinessSummaryByDate(params: any) {
return requestClient.get<CrmStatisticsFunnelApi.BusinessSummaryByDate[]>(
'/crm/statistics-funnel/get-business-summary-by-date',
{ params },
);
return requestClient.get<
CrmStatisticsFunnelApi.BusinessSummaryByDateRespVO[]
>('/crm/statistics-funnel/get-business-summary-by-date', { params });
}
/** 获取商机转化率分析(按日期) */
export function getBusinessInversionRateSummaryByDate(params: any) {
return requestClient.get<
CrmStatisticsFunnelApi.BusinessInversionRateSummaryByDate[]
CrmStatisticsFunnelApi.BusinessInversionRateSummaryByDateRespVO[]
>('/crm/statistics-funnel/get-business-inversion-rate-summary-by-date', {
params,
});

View File

@@ -1,25 +1,27 @@
import { requestClient } from '#/api/request';
export namespace CrmStatisticsPerformanceApi {
/** 员工业绩统计 */
export interface Performance {
/** 员工业绩统计请求 */
export interface PerformanceReqVO {
times: string[];
deptId: number;
userId: number;
}
/** 员工业绩统计响应 */
export interface PerformanceRespVO {
time: string;
currentMonthCount: number;
lastMonthCount: number;
lastYearCount: number;
}
export interface PerformanceParams {
times: string[];
deptId: number;
userId: number;
}
}
/** 员工获得合同金额统计 */
export function getContractPricePerformance(
params: CrmStatisticsPerformanceApi.PerformanceParams,
params: CrmStatisticsPerformanceApi.PerformanceReqVO,
) {
return requestClient.get<CrmStatisticsPerformanceApi.Performance[]>(
return requestClient.get<CrmStatisticsPerformanceApi.PerformanceRespVO[]>(
'/crm/statistics-performance/get-contract-price-performance',
{ params },
);
@@ -27,9 +29,9 @@ export function getContractPricePerformance(
/** 员工获得回款统计 */
export function getReceivablePricePerformance(
params: CrmStatisticsPerformanceApi.PerformanceParams,
params: CrmStatisticsPerformanceApi.PerformanceReqVO,
) {
return requestClient.get<CrmStatisticsPerformanceApi.Performance[]>(
return requestClient.get<CrmStatisticsPerformanceApi.PerformanceRespVO[]>(
'/crm/statistics-performance/get-receivable-price-performance',
{ params },
);
@@ -37,9 +39,9 @@ export function getReceivablePricePerformance(
/** 员工获得签约合同数量统计 */
export function getContractCountPerformance(
params: CrmStatisticsPerformanceApi.PerformanceParams,
params: CrmStatisticsPerformanceApi.PerformanceReqVO,
) {
return requestClient.get<CrmStatisticsPerformanceApi.Performance[]>(
return requestClient.get<CrmStatisticsPerformanceApi.PerformanceRespVO[]>(
'/crm/statistics-performance/get-contract-count-performance',
{ params },
);

View File

@@ -3,33 +3,33 @@ import type { PageParam } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace CrmStatisticsPortraitApi {
/** 客户基础统计信息 */
export interface CustomerBase {
/** 客户基础统计响应 */
export interface CustomerBaseRespVO {
customerCount: number;
dealCount: number;
dealPortion: number | string;
}
/** 客户行业统计信息 */
export interface CustomerIndustry extends CustomerBase {
/** 客户行业统计响应 */
export interface CustomerIndustryRespVO extends CustomerBaseRespVO {
industryId: number;
industryPortion: number | string;
}
/** 客户来源统计信息 */
export interface CustomerSource extends CustomerBase {
/** 客户来源统计响应 */
export interface CustomerSourceRespVO extends CustomerBaseRespVO {
source: number;
sourcePortion: number | string;
}
/** 客户级别统计信息 */
export interface CustomerLevel extends CustomerBase {
/** 客户级别统计响应 */
export interface CustomerLevelRespVO extends CustomerBaseRespVO {
level: number;
levelPortion: number | string;
}
/** 客户地区统计信息 */
export interface CustomerArea extends CustomerBase {
/** 客户地区统计响应 */
export interface CustomerAreaRespVO extends CustomerBaseRespVO {
areaId: number;
areaName: string;
areaPortion: number | string;
@@ -58,7 +58,7 @@ export function getDatas(activeTabName: any, params: any) {
/** 获取客户行业统计数据 */
export function getCustomerIndustry(params: PageParam) {
return requestClient.get<CrmStatisticsPortraitApi.CustomerIndustry[]>(
return requestClient.get<CrmStatisticsPortraitApi.CustomerIndustryRespVO[]>(
'/crm/statistics-portrait/get-customer-industry-summary',
{ params },
);
@@ -66,7 +66,7 @@ export function getCustomerIndustry(params: PageParam) {
/** 获取客户来源统计数据 */
export function getCustomerSource(params: PageParam) {
return requestClient.get<CrmStatisticsPortraitApi.CustomerSource[]>(
return requestClient.get<CrmStatisticsPortraitApi.CustomerSourceRespVO[]>(
'/crm/statistics-portrait/get-customer-source-summary',
{ params },
);
@@ -74,7 +74,7 @@ export function getCustomerSource(params: PageParam) {
/** 获取客户级别统计数据 */
export function getCustomerLevel(params: PageParam) {
return requestClient.get<CrmStatisticsPortraitApi.CustomerLevel[]>(
return requestClient.get<CrmStatisticsPortraitApi.CustomerLevelRespVO[]>(
'/crm/statistics-portrait/get-customer-level-summary',
{ params },
);
@@ -82,7 +82,7 @@ export function getCustomerLevel(params: PageParam) {
/** 获取客户地区统计数据 */
export function getCustomerArea(params: PageParam) {
return requestClient.get<CrmStatisticsPortraitApi.CustomerArea[]>(
return requestClient.get<CrmStatisticsPortraitApi.CustomerAreaRespVO[]>(
'/crm/statistics-portrait/get-customer-area-summary',
{ params },
);

View File

@@ -3,8 +3,8 @@ import type { PageParam } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace CrmStatisticsRankApi {
/** 排行统计数据 */
export interface Rank {
/** 排行统计响应 */
export interface RankRespVO {
count: number;
nickname: string;
deptName: string;
@@ -45,7 +45,7 @@ export function getDatas(activeTabName: any, params: any) {
/** 获得合同排行榜 */
export function getContractPriceRank(params: PageParam) {
return requestClient.get<CrmStatisticsRankApi.Rank[]>(
return requestClient.get<CrmStatisticsRankApi.RankRespVO[]>(
'/crm/statistics-rank/get-contract-price-rank',
{ params },
);
@@ -53,7 +53,7 @@ export function getContractPriceRank(params: PageParam) {
/** 获得回款排行榜 */
export function getReceivablePriceRank(params: PageParam) {
return requestClient.get<CrmStatisticsRankApi.Rank[]>(
return requestClient.get<CrmStatisticsRankApi.RankRespVO[]>(
'/crm/statistics-rank/get-receivable-price-rank',
{ params },
);
@@ -61,7 +61,7 @@ export function getReceivablePriceRank(params: PageParam) {
/** 签约合同排行 */
export function getContractCountRank(params: PageParam) {
return requestClient.get<CrmStatisticsRankApi.Rank[]>(
return requestClient.get<CrmStatisticsRankApi.RankRespVO[]>(
'/crm/statistics-rank/get-contract-count-rank',
{ params },
);
@@ -69,7 +69,7 @@ export function getContractCountRank(params: PageParam) {
/** 产品销量排行 */
export function getProductSalesRank(params: PageParam) {
return requestClient.get<CrmStatisticsRankApi.Rank[]>(
return requestClient.get<CrmStatisticsRankApi.RankRespVO[]>(
'/crm/statistics-rank/get-product-sales-rank',
{ params },
);
@@ -77,7 +77,7 @@ export function getProductSalesRank(params: PageParam) {
/** 新增客户数排行 */
export function getCustomerCountRank(params: PageParam) {
return requestClient.get<CrmStatisticsRankApi.Rank[]>(
return requestClient.get<CrmStatisticsRankApi.RankRespVO[]>(
'/crm/statistics-rank/get-customer-count-rank',
{ params },
);
@@ -85,7 +85,7 @@ export function getCustomerCountRank(params: PageParam) {
/** 新增联系人数排行 */
export function getContactsCountRank(params: PageParam) {
return requestClient.get<CrmStatisticsRankApi.Rank[]>(
return requestClient.get<CrmStatisticsRankApi.RankRespVO[]>(
'/crm/statistics-rank/get-contacts-count-rank',
{ params },
);
@@ -93,7 +93,7 @@ export function getContactsCountRank(params: PageParam) {
/** 跟进次数排行 */
export function getFollowCountRank(params: PageParam) {
return requestClient.get<CrmStatisticsRankApi.Rank[]>(
return requestClient.get<CrmStatisticsRankApi.RankRespVO[]>(
'/crm/statistics-rank/get-follow-count-rank',
{ params },
);
@@ -101,7 +101,7 @@ export function getFollowCountRank(params: PageParam) {
/** 跟进客户数排行 */
export function getFollowCustomerCountRank(params: PageParam) {
return requestClient.get<CrmStatisticsRankApi.Rank[]>(
return requestClient.get<CrmStatisticsRankApi.RankRespVO[]>(
'/crm/statistics-rank/get-follow-customer-count-rank',
{ params },
);

View File

@@ -5,18 +5,12 @@ import { requestClient } from '#/api/request';
export namespace MallBrandApi {
/** 商品品牌 */
export interface Brand {
/** 品牌编号 */
id?: number;
/** 品牌名称 */
name: string;
/** 品牌图片 */
picUrl: string;
/** 品牌排序 */
sort?: number;
/** 品牌描述 */
description?: string;
/** 开启状态 */
status: number;
id?: number; // 品牌编号
name: string; // 品牌名称
picUrl: string; // 品牌图片
sort?: number; // 品牌排序
description?: string; // 品牌描述
status: number; // 开启状态
}
}

View File

@@ -3,18 +3,12 @@ import { requestClient } from '#/api/request';
export namespace MallCategoryApi {
/** 产品分类 */
export interface Category {
/** 分类编号 */
id?: number;
/** 父分类编号 */
parentId?: number;
/** 分类名称 */
name: string;
/** 移动端分类图 */
picUrl: string;
/** 分类排序 */
sort: number;
/** 开启状态 */
status: number;
id?: number; // 分类编号
parentId?: number; // 父分类编号
name: string; // 分类名称
picUrl: string; // 移动端分类图
sort: number; // 分类排序
status: number; // 开启状态
}
}
@@ -49,10 +43,3 @@ export function getCategoryList(params: any) {
},
);
}
/** 获得商品分类列表 */
export function getCategorySimpleList() {
return requestClient.get<MallCategoryApi.Category[]>(
'/product/category/list',
);
}

View File

@@ -1,81 +0,0 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace MallCommentApi {
export interface Property {
propertyId: number;
propertyName: string;
valueId: number;
valueName: string;
}
/** 商品评论 */
export interface Comment {
id: number;
userId: number;
userNickname: string;
userAvatar: string;
anonymous: boolean;
orderId: number;
orderItemId: number;
spuId: number;
spuName: string;
skuId: number;
visible: boolean;
scores: number;
descriptionScores: number;
benefitScores: number;
content: string;
picUrls: string[];
replyStatus: boolean;
replyUserId: number;
replyContent: string;
replyTime: Date;
createTime: Date;
skuProperties: Property[];
}
/** 评论可见性更新 */
export interface CommentVisibleUpdate {
id: number;
visible: boolean;
}
/** 评论回复 */
export interface CommentReply {
id: number;
replyContent: string;
}
}
/** 查询商品评论列表 */
export function getCommentPage(params: PageParam) {
return requestClient.get<PageResult<MallCommentApi.Comment>>(
'/product/comment/page',
{ params },
);
}
/** 查询商品评论详情 */
export function getComment(id: number) {
return requestClient.get<MallCommentApi.Comment>(
`/product/comment/get?id=${id}`,
);
}
/** 添加自评 */
export function createComment(data: MallCommentApi.Comment) {
return requestClient.post('/product/comment/create', data);
}
/** 显示 / 隐藏评论 */
export function updateCommentVisible(
data: MallCommentApi.CommentVisibleUpdate,
) {
return requestClient.put('/product/comment/update-visible', data);
}
/** 商家回复 */
export function replyComment(data: MallCommentApi.CommentReply) {
return requestClient.put('/product/comment/reply', data);
}

View File

@@ -0,0 +1,80 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace MallCommentApi {
/** 商品评论 */
export interface Comment {
id: number; // 评论编号
userId: number; // 用户编号
userNickname: string; // 用户昵称
userAvatar: string; // 用户头像
anonymous: boolean; // 是否匿名
orderId: number; // 订单编号
orderItemId: number; // 订单项编号
spuId: number; // 商品SPU编号
spuName: string; // 商品名称
skuId: number; // 商品SKU编号
visible: boolean; // 是否可见
scores: number; // 总评分
descriptionScores: number; // 描述评分
benefitScores: number; // 服务评分
content: string; // 评论内容
picUrls: string[]; // 评论图片
replyStatus: boolean; // 是否回复
replyUserId: number; // 回复人编号
replyContent: string; // 回复内容
replyTime: Date; // 回复时间
createTime: Date; // 创建时间
skuProperties: {
propertyId: number; // 属性 ID
propertyName: string; // 属性名称
valueId: number; // 属性值 ID
valueName: string; // 属性值名称
}[]; // SKU 属性数组
}
/** 评论可见性更新请求 */
export interface CommentVisibleUpdateReqVO {
id: number; // 评论编号
visible: boolean; // 是否可见
}
/** 评论回复请求 */
export interface CommentReplyReqVO {
id: number; // 评论编号
replyContent: string; // 回复内容
}
}
/** 查询商品评论列表 */
export function getCommentPage(params: PageParam) {
return requestClient.get<PageResult<MallCommentApi.Comment>>(
'/product/comment/page',
{ params },
);
}
/** 查询商品评论详情 */
export function getComment(id: number) {
return requestClient.get<MallCommentApi.Comment>(
`/product/comment/get?id=${id}`,
);
}
/** 添加自评 */
export function createComment(data: MallCommentApi.Comment) {
return requestClient.post('/product/comment/create', data);
}
/** 显示 / 隐藏评论 */
export function updateCommentVisible(
data: MallCommentApi.CommentVisibleUpdateReqVO,
) {
return requestClient.put('/product/comment/update-visible', data);
}
/** 商家回复 */
export function replyComment(data: MallCommentApi.CommentReplyReqVO) {
return requestClient.put('/product/comment/reply', data);
}

View File

@@ -5,12 +5,9 @@ import { requestClient } from '#/api/request';
export namespace MallFavoriteApi {
/** 商品收藏 */
export interface Favorite {
/** 收藏编号 */
id?: number;
/** 用户编号 */
userId?: string;
/** 商品 SPU 编号 */
spuId?: null | number;
id?: number; // 收藏编号
userId?: string; // 用户编号
spuId?: number; // 商品 SPU 编号
}
}

View File

@@ -5,22 +5,14 @@ import { requestClient } from '#/api/request';
export namespace MallHistoryApi {
/** 商品浏览记录 */
export interface BrowseHistory {
/** 记录编号 */
id?: number;
/** 用户编号 */
userId?: number;
/** 商品 SPU 编号 */
spuId?: number;
/** 浏览时间 */
createTime?: Date;
id?: number; // 记录编号
userId?: number; // 用户编号
spuId?: number; // 商品 SPU 编号
createTime?: Date; // 浏览时间
}
}
/**
*
*
* @param params
*/
/** 获得商品浏览记录分页 */
export function getBrowseHistoryPage(params: PageParam) {
return requestClient.get<PageResult<MallHistoryApi.BrowseHistory>>(
'/product/browse-history/page',

View File

@@ -5,29 +5,17 @@ import { requestClient } from '#/api/request';
export namespace MallPropertyApi {
/** 商品属性 */
export interface Property {
/** 属性编号 */
id?: number;
/** 名称 */
name: string;
/** 备注 */
remark?: string;
id?: number; // 属性编号
name: string; // 名称
remark?: string; // 备注
}
/** 属性值 */
export interface PropertyValue {
/** 属性值编号 */
id?: number;
/** 属性项的编号 */
propertyId?: number;
/** 名称 */
name: string;
/** 备注 */
remark?: string;
}
/** 属性值查询参数 */
export interface PropertyValueQuery extends PageParam {
propertyId?: number;
id?: number; // 属性值编号
propertyId?: number; // 属性项的编号
name: string; // 名称
remark?: string; // 备注
}
}
@@ -69,9 +57,7 @@ export function getPropertySimpleList() {
}
/** 获得属性值分页 */
export function getPropertyValuePage(
params: MallPropertyApi.PropertyValueQuery,
) {
export function getPropertyValuePage(params: PageParam) {
return requestClient.get<PageResult<MallPropertyApi.PropertyValue>>(
'/product/property/value/page',
{ params },

View File

@@ -1,179 +0,0 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace MallSpuApi {
/** 商品属性 */
export interface Property {
/** 属性编号 */
propertyId?: number;
/** 属性名称 */
propertyName?: string;
/** 属性值编号 */
valueId?: number;
/** 属性值名称 */
valueName?: string;
}
/** 商品 SKU */
export interface Sku {
/** 商品 SKU 编号 */
id?: number;
/** 商品 SKU 名称 */
name?: string;
/** SPU 编号 */
spuId?: number;
/** 属性数组 */
properties?: Property[];
/** 商品价格 */
price?: number | string;
/** 市场价 */
marketPrice?: number | string;
/** 成本价 */
costPrice?: number | string;
/** 商品条码 */
barCode?: string;
/** 图片地址 */
picUrl?: string;
/** 库存 */
stock?: number;
/** 商品重量单位kg 千克 */
weight?: number;
/** 商品体积单位m^3 平米 */
volume?: number;
/** 一级分销的佣金 */
firstBrokeragePrice?: number | string;
/** 二级分销的佣金 */
secondBrokeragePrice?: number | string;
/** 商品销量 */
salesCount?: number;
}
/** 优惠券模板 */
export interface GiveCouponTemplate {
/** 优惠券编号 */
id?: number;
/** 优惠券名称 */
name?: string;
}
/** 商品 SPU */
export interface Spu {
/** 商品编号 */
id?: number;
/** 商品名称 */
name?: string;
/** 商品分类 */
categoryId?: number;
/** 关键字 */
keyword?: string;
/** 单位 */
unit?: number | undefined;
/** 商品封面图 */
picUrl?: string;
/** 商品轮播图 */
sliderPicUrls?: string[];
/** 商品简介 */
introduction?: string;
/** 配送方式 */
deliveryTypes?: number[];
/** 运费模版 */
deliveryTemplateId?: number | undefined;
/** 商品品牌编号 */
brandId?: number;
/** 商品规格 */
specType?: boolean;
/** 分销类型 */
subCommissionType?: boolean;
/** sku数组 */
skus?: Sku[];
/** 商品详情 */
description?: string;
/** 商品排序 */
sort?: number;
/** 赠送积分 */
giveIntegral?: number;
/** 虚拟销量 */
virtualSalesCount?: number;
/** 商品价格 */
price?: number;
/** 商品拼团价格 */
combinationPrice?: number;
/** 商品秒杀价格 */
seckillPrice?: number;
/** 商品销量 */
salesCount?: number;
/** 市场价 */
marketPrice?: number;
/** 成本价 */
costPrice?: number;
/** 商品库存 */
stock?: number;
/** 商品创建时间 */
createTime?: Date;
/** 商品状态 */
status?: number;
/** 浏览量 */
browseCount?: number;
}
/** 商品状态更新 */
export interface StatusUpdate {
/** 商品编号 */
id: number;
/** 商品状态 */
status: number;
}
}
/** 获得商品 SPU 列表 */
export function getSpuPage(params: PageParam) {
return requestClient.get<PageResult<MallSpuApi.Spu>>('/product/spu/page', {
params,
});
}
/** 获得商品 SPU 列表 tabsCount */
export function getTabsCount() {
return requestClient.get<Record<string, number>>('/product/spu/get-count');
}
/** 创建商品 SPU */
export function createSpu(data: MallSpuApi.Spu) {
return requestClient.post('/product/spu/create', data);
}
/** 更新商品 SPU */
export function updateSpu(data: MallSpuApi.Spu) {
return requestClient.put('/product/spu/update', data);
}
/** 更新商品 SPU 状态 */
export function updateStatus(data: MallSpuApi.StatusUpdate) {
return requestClient.put('/product/spu/update-status', data);
}
/** 获得商品 SPU */
export function getSpu(id: number) {
return requestClient.get<MallSpuApi.Spu>(`/product/spu/get-detail?id=${id}`);
}
/** 获得商品 SPU 详情列表 */
export function getSpuDetailList(ids: number[]) {
return requestClient.get<MallSpuApi.Spu[]>(`/product/spu/list?spuIds=${ids}`);
}
/** 删除商品 SPU */
export function deleteSpu(id: number) {
return requestClient.delete(`/product/spu/delete?id=${id}`);
}
/** 导出商品 SPU Excel */
export function exportSpu(params: PageParam) {
return requestClient.download('/product/spu/export-excel', { params });
}
/** 获得商品 SPU 精简列表 */
export function getSpuSimpleList() {
return requestClient.get<MallSpuApi.Spu[]>('/product/spu/list-all-simple');
}

View File

@@ -0,0 +1,129 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace MallSpuApi {
/** 商品 SPU */
export interface Spu {
id?: number; // 商品编号
name?: string; // 商品名称
categoryId?: number; // 商品分类
keyword?: string; // 关键字
unit?: number; // 单位
picUrl?: string; // 商品封面图
sliderPicUrls?: string[]; // 商品轮播图
introduction?: string; // 商品简介
deliveryTypes?: number[]; // 配送方式
deliveryTemplateId?: number; // 运费模版
brandId?: number; // 商品品牌编号
specType?: boolean; // 商品规格
subCommissionType?: boolean; // 分销类型
skus?: Sku[]; // sku数组
description?: string; // 商品详情
sort?: number; // 商品排序
giveIntegral?: number; // 赠送积分
virtualSalesCount?: number; // 虚拟销量
price?: number; // 商品价格
combinationPrice?: number; // 商品拼团价格
seckillPrice?: number; // 商品秒杀价格
salesCount?: number; // 商品销量
marketPrice?: number; // 市场价
costPrice?: number; // 成本价
stock?: number; // 商品库存
createTime?: Date; // 商品创建时间
status?: number; // 商品状态
browseCount?: number; // 浏览量
}
/** 商品 SKU */
export interface Sku {
id?: number; // 商品 SKU 编号
name?: string; // 商品 SKU 名称
spuId?: number; // SPU 编号
properties?: Property[]; // 属性数组
price?: number | string; // 商品价格
marketPrice?: number | string; // 市场价
costPrice?: number | string; // 成本价
barCode?: string; // 商品条码
picUrl?: string; // 图片地址
stock?: number; // 库存
weight?: number; // 商品重量单位kg 千克
volume?: number; // 商品体积单位m^3 平米
firstBrokeragePrice?: number | string; // 一级分销的佣金
secondBrokeragePrice?: number | string; // 二级分销的佣金
salesCount?: number; // 商品销量
}
/** 商品属性 */
export interface Property {
propertyId?: number; // 属性编号
propertyName?: string; // 属性名称
valueId?: number; // 属性值编号
valueName?: string; // 属性值名称
}
// TODO @puhui999这个还要么
/** 优惠券模板 */
export interface GiveCouponTemplate {
id?: number; // 优惠券编号
name?: string; // 优惠券名称
}
/** 商品状态更新请求 */
export interface SpuStatusUpdateReqVO {
id: number; // 商品编号
status: number; // 商品状态
}
}
/** 获得商品 SPU 列表 */
export function getSpuPage(params: PageParam) {
return requestClient.get<PageResult<MallSpuApi.Spu>>('/product/spu/page', {
params,
});
}
/** 获得商品 SPU 列表 tabsCount */
export function getTabsCount() {
return requestClient.get<Record<string, number>>('/product/spu/get-count');
}
/** 创建商品 SPU */
export function createSpu(data: MallSpuApi.Spu) {
return requestClient.post('/product/spu/create', data);
}
/** 更新商品 SPU */
export function updateSpu(data: MallSpuApi.Spu) {
return requestClient.put('/product/spu/update', data);
}
/** 更新商品 SPU 状态 */
export function updateStatus(data: MallSpuApi.SpuStatusUpdateReqVO) {
return requestClient.put('/product/spu/update-status', data);
}
/** 获得商品 SPU */
export function getSpu(id: number) {
return requestClient.get<MallSpuApi.Spu>(`/product/spu/get-detail?id=${id}`);
}
/** 获得商品 SPU 详情列表 */
export function getSpuDetailList(ids: number[]) {
return requestClient.get<MallSpuApi.Spu[]>(`/product/spu/list?spuIds=${ids}`);
}
/** 删除商品 SPU */
export function deleteSpu(id: number) {
return requestClient.delete(`/product/spu/delete?id=${id}`);
}
/** 导出商品 SPU Excel */
export function exportSpu(params: PageParam) {
return requestClient.download('/product/spu/export-excel', { params });
}
/** 获得商品 SPU 精简列表 */
export function getSpuSimpleList() {
return requestClient.get<MallSpuApi.Spu[]>('/product/spu/list-all-simple');
}

View File

@@ -5,16 +5,11 @@ import { requestClient } from '#/api/request';
export namespace MallArticleCategoryApi {
/** 文章分类 */
export interface ArticleCategory {
/** 分类编号 */
id: number;
/** 分类名称 */
name: string;
/** 分类图片 */
picUrl: string;
/** 状态 */
status: number;
/** 排序 */
sort: number;
id: number; // 分类编号
name: string; // 分类名称
picUrl: string; // 分类图片
status: number; // 状态
sort: number; // 排序
}
}

View File

@@ -5,18 +5,18 @@ import { requestClient } from '#/api/request';
export namespace MallBannerApi {
/** Banner 信息 */
export interface Banner {
id: number;
title: string;
picUrl: string;
status: number;
url: string;
position: number;
sort: number;
memo: string;
id: number; // Banner 编号
title: string; // Banner 标题
picUrl: string; // Banner 图片
status: number; // 状态
url: string; // 链接地址
position: number; // Banner 位置
sort: number; // 排序
memo: string; // 备注
}
}
/** 查询Banner管理列表 */
/** 查询 Banner 管理列表 */
export function getBannerPage(params: PageParam) {
return requestClient.get<PageResult<MallBannerApi.Banner>>(
'/promotion/banner/page',
@@ -24,24 +24,24 @@ export function getBannerPage(params: PageParam) {
);
}
/** 查询Banner管理详情 */
/** 查询 Banner 管理详情 */
export function getBanner(id: number) {
return requestClient.get<MallBannerApi.Banner>(
`/promotion/banner/get?id=${id}`,
);
}
/** 新增Banner管理 */
/** 新增 Banner 管理 */
export function createBanner(data: MallBannerApi.Banner) {
return requestClient.post('/promotion/banner/create', data);
}
/** 修改Banner管理 */
/** 修改 Banner 管理 */
export function updateBanner(data: MallBannerApi.Banner) {
return requestClient.put('/promotion/banner/update', data);
}
/** 删除Banner管理 */
/** 删除 Banner 管理 */
export function deleteBanner(id: number) {
return requestClient.delete(`/promotion/banner/delete?id=${id}`);
}

View File

@@ -7,62 +7,41 @@ import { requestClient } from '#/api/request';
export namespace MallBargainActivityApi {
/** 砍价活动 */
export interface BargainActivity {
/** 活动编号 */
id?: number;
/** 活动名称 */
name?: string;
/** 开始时间 */
startTime?: Date;
/** 结束时间 */
endTime?: Date;
/** 状态 */
status?: number;
/** 达到该人数,才能砍到低价 */
helpMaxCount?: number;
/** 最大帮砍次数 */
bargainCount?: number;
/** 最大购买次数 */
totalLimitCount?: number;
/** 商品 SPU 编号 */
spuId: number;
/** 商品 SKU 编号 */
skuId: number;
/** 砍价起始价格,单位分 */
bargainFirstPrice: number;
/** 砍价底价 */
bargainMinPrice: number;
/** 活动库存 */
stock: number;
/** 用户每次砍价的最小金额,单位:分 */
randomMinPrice?: number;
/** 用户每次砍价的最大金额,单位:分 */
randomMaxPrice?: number;
id?: number; // 活动编号
name?: string; // 活动名称
startTime?: Date; // 开始时间
endTime?: Date; // 结束时间
status?: number; // 状态
helpMaxCount?: number; // 达到该人数,才能砍到低价
bargainCount?: number; // 最大帮砍次数
totalLimitCount?: number; // 最大购买次数
spuId: number; // 商品 SPU 编号
skuId: number; // 商品 SKU 编号
bargainFirstPrice: number; // 砍价起始价格,单位分
bargainMinPrice: number; // 砍价底价
stock: number; // 活动库存
randomMinPrice?: number; // 用户每次砍价的最小金额,单位:分
randomMaxPrice?: number; // 用户每次砍价的最大金额,单位:分
}
/** 砍价活动所需属性。选择的商品和属性的时候使用方便使用活动的通用封装 */
export interface BargainProduct {
/** 商品 SPU 编号 */
spuId: number;
/** 商品 SKU 编号 */
skuId: number;
/** 砍价起始价格,单位分 */
bargainFirstPrice: number;
/** 砍价底价 */
bargainMinPrice: number;
/** 活动库存 */
stock: number;
spuId: number; // 商品 SPU 编号
skuId: number; // 商品 SKU 编号
bargainFirstPrice: number; // 砍价起始价格,单位分
bargainMinPrice: number; // 砍价底价
stock: number; // 活动库存
}
// TODO @puhui999要不要删除
/** 扩展 SKU 配置 */
export type SkuExtension = {
/** 砍价活动配置 */
productConfig: BargainProduct;
productConfig: BargainProduct; // 砍价活动配置
} & MallSpuApi.Sku;
/** 扩展 SPU 配置 */
export interface SpuExtension extends MallSpuApi.Spu {
/** SKU 列表 */
skus: SkuExtension[];
skus: SkuExtension[]; // SKU 列表
}
}

View File

@@ -5,16 +5,11 @@ import { requestClient } from '#/api/request';
export namespace MallBargainHelpApi {
/** 砍价记录 */
export interface BargainHelp {
/** 记录编号 */
id: number;
/** 砍价记录编号 */
record: number;
/** 用户编号 */
userId: number;
/** 砍掉金额 */
reducePrice: number;
/** 结束时间 */
endTime: Date;
id: number; // 记录编号
record: number; // 砍价记录编号
userId: number; // 用户编号
reducePrice: number; // 砍掉金额
endTime: Date; // 结束时间
}
}

View File

@@ -5,26 +5,16 @@ import { requestClient } from '#/api/request';
export namespace MallBargainRecordApi {
/** 砍价记录 */
export interface BargainRecord {
/** 记录编号 */
id: number;
/** 活动编号 */
activityId: number;
/** 用户编号 */
userId: number;
/** 商品 SPU 编号 */
spuId: number;
/** 商品 SKU 编号 */
skuId: number;
/** 砍价起始价格 */
bargainFirstPrice: number;
/** 砍价价格 */
bargainPrice: number;
/** 状态 */
status: number;
/** 订单编号 */
orderId: number;
/** 结束时间 */
endTime: Date;
id: number; // 记录编号
activityId: number; // 活动编号
userId: number; // 用户编号
spuId: number; // 商品 SPU 编号
skuId: number; // 商品 SKU 编号
bargainFirstPrice: number; // 砍价起始价格
bargainPrice: number; // 砍价价格
status: number; // 状态
orderId: number; // 订单编号
endTime: Date; // 结束时间
}
}

View File

@@ -5,67 +5,42 @@ import type { MallSpuApi } from '#/api/mall/product/spu';
import { requestClient } from '#/api/request';
export namespace MallCombinationActivityApi {
/** 拼团活动所需属性 */
export interface CombinationProduct {
/** 商品 SPU 编号 */
spuId: number;
/** 商品 SKU 编号 */
skuId: number;
/** 拼团价格 */
combinationPrice: number;
}
/** 拼团活动 */
export interface CombinationActivity {
/** 活动编号 */
id?: number;
/** 活动名称 */
name?: string;
/** 商品 SPU 编号 */
spuId?: number;
/** 总限购数量 */
totalLimitCount?: number;
/** 单次限购数量 */
singleLimitCount?: number;
/** 开始时间 */
startTime?: Date;
/** 结束时间 */
endTime?: Date;
/** 用户数量 */
userSize?: number;
/** 总数量 */
totalCount?: number;
/** 成功数量 */
successCount?: number;
/** 订单用户数量 */
orderUserCount?: number;
/** 虚拟成团 */
virtualGroup?: number;
/** 状态 */
status?: number;
/** 限制时长 */
limitDuration?: number;
/** 拼团价格 */
combinationPrice?: number;
/** 商品列表 */
products: CombinationProduct[];
/** 图片 */
picUrl?: string;
/** 商品名称 */
spuName?: string;
/** 市场价 */
marketPrice?: number;
id?: number; // 活动编号
name?: string; // 活动名称
spuId?: number; // 商品 SPU 编号
totalLimitCount?: number; // 总限购数量
singleLimitCount?: number; // 单次限购数量
startTime?: Date; // 开始时间
endTime?: Date; // 结束时间
userSize?: number; // 用户数量
totalCount?: number; // 总数量
successCount?: number; // 成功数量
orderUserCount?: number; // 订单用户数量
virtualGroup?: number; // 虚拟成团
status?: number; // 状态
limitDuration?: number; // 限制时长
combinationPrice?: number; // 拼团价格
products: CombinationProduct[]; // 商品列表
}
// TODO @puhui999要不要删除
/** 拼团活动所需属性 */
export interface CombinationProduct {
spuId: number; // 商品 SPU 编号
skuId: number; // 商品 SKU 编号
combinationPrice: number; // 拼团价格
}
/** 扩展 SKU 配置 */
export type SkuExtension = {
/** 拼团活动配置 */
productConfig: CombinationProduct;
productConfig: CombinationProduct; // 拼团活动配置
} & MallSpuApi.Sku;
/** 扩展 SPU 配置 */
export interface SpuExtension extends MallSpuApi.Spu {
/** SKU 列表 */
skus: SkuExtension[];
skus: SkuExtension[]; // SKU 列表
}
}

View File

@@ -5,44 +5,27 @@ import { requestClient } from '#/api/request';
export namespace MallCombinationRecordApi {
/** 拼团记录 */
export interface CombinationRecord {
/** 拼团记录编号 */
id: number;
/** 拼团活动编号 */
activityId: number;
/** 用户昵称 */
nickname: string;
/** 用户头像 */
avatar: string;
/** 团长编号 */
headId: number;
/** 过期时间 */
expireTime: string;
/** 可参团人数 */
userSize: number;
/** 已参团人数 */
userCount: number;
/** 拼团状态 */
status: number;
/** 商品名字 */
spuName: string;
/** 商品图片 */
picUrl: string;
/** 是否虚拟成团 */
virtualGroup: boolean;
/** 开始时间 (订单付款后开始的时间) */
startTime: string;
/** 结束时间(成团时间/失败时间) */
endTime: string;
id: number; // 拼团记录编号
activityId: number; // 拼团活动编号
nickname: string; // 用户昵称
avatar: string; // 用户头像
headId: number; // 团长编号
expireTime: string; // 过期时间
userSize: number; // 可参团人数
userCount: number; // 已参团人数
status: number; // 拼团状态
spuName: string; // 商品名字
picUrl: string; // 商品图片
virtualGroup: boolean; // 是否虚拟成团
startTime: string; // 开始时间 (订单付款后开始的时间)
endTime: string; // 结束时间(成团时间/失败时间)
}
/** 拼团记录概要信息 */
export interface RecordSummary {
/** 待成团数量 */
pendingCount: number;
/** 已成团数量 */
successCount: number;
/** 已失败数量 */
failCount: number;
pendingCount: number; // 待成团数量
successCount: number; // 已成团数量
failCount: number; // 已失败数量
}
}

View File

@@ -7,48 +7,34 @@ import { requestClient } from '#/api/request';
export namespace MallDiscountActivityApi {
/** 限时折扣相关属性 */
export interface DiscountProduct {
/** 商品 SPU 编号 */
spuId: number;
/** 商品 SKU 编号 */
skuId: number;
/** 折扣类型 */
discountType: number;
/** 折扣百分比 */
discountPercent: number;
/** 折扣价格 */
discountPrice: number;
spuId: number; // 商品 SPU 编号
skuId: number; // 商品 SKU 编号
discountType: number; // 折扣类型
discountPercent: number; // 折扣百分比
discountPrice: number; // 折扣价格
}
/** 限时折扣活动 */
export interface DiscountActivity {
/** 活动编号 */
id?: number;
/** 商品 SPU 编号 */
spuId?: number;
/** 活动名称 */
name?: string;
/** 状态 */
status?: number;
/** 备注 */
remark?: string;
/** 开始时间 */
startTime?: Date;
/** 结束时间 */
endTime?: Date;
/** 商品列表 */
products?: DiscountProduct[];
id?: number; // 活动编号
spuId?: number; // 商品 SPU 编号
name?: string; // 活动名称
status?: number; // 状态
remark?: string; // 备注
startTime?: Date; // 开始时间
endTime?: Date; // 结束时间
products?: DiscountProduct[]; // 商品列表
}
// TODO @puhui999要不要删除
/** 扩展 SKU 配置 */
export type SkuExtension = {
/** 限时折扣配置 */
productConfig: DiscountProduct;
productConfig: DiscountProduct; // 限时折扣配置
} & MallSpuApi.Sku;
/** 扩展 SPU 配置 */
export interface SpuExtension extends MallSpuApi.Spu {
/** SKU 列表 */
skus: SkuExtension[];
skus: SkuExtension[]; // SKU 列表
}
}

View File

@@ -5,18 +5,12 @@ import { requestClient } from '#/api/request';
export namespace MallDiyPageApi {
/** 装修页面 */
export interface DiyPage {
/** 页面编号 */
id?: number;
/** 模板编号 */
templateId?: number;
/** 页面名称 */
name: string;
/** 备注 */
remark: string;
/** 预览图片地址数组 */
previewPicUrls: string[];
/** 页面属性 */
property: string;
id?: number; // 页面编号
templateId?: number; // 模板编号
name: string; // 页面名称
remark: string; // 备注
previewPicUrls: string[]; // 预览图片地址数组
property: string; // 页面属性
}
}

View File

@@ -7,26 +7,18 @@ import { requestClient } from '#/api/request';
export namespace MallDiyTemplateApi {
/** 装修模板 */
export interface DiyTemplate {
/** 模板编号 */
id?: number;
/** 模板名称 */
name: string;
/** 是否使用 */
used: boolean;
/** 使用时间 */
usedTime?: Date;
/** 备注 */
remark: string;
/** 预览图片地址数组 */
previewPicUrls: string[];
/** 模板属性 */
property: string;
id?: number; // 模板编号
name: string; // 模板名称
used: boolean; // 是否使用
usedTime?: Date; // 使用时间
remark: string; // 备注
previewPicUrls: string[]; // 预览图片地址数组
property: string; // 模板属性
}
/** 装修模板属性(包含页面列表) */
export interface DiyTemplateProperty extends DiyTemplate {
/** 页面列表 */
pages: MallDiyPageApi.DiyPage[];
pages: MallDiyPageApi.DiyPage[]; // 页面列表
}
}

View File

@@ -18,7 +18,7 @@ export namespace MallKefuConversationApi {
}
/** 会话置顶请求 */
export interface ConversationPinnedUpdate {
export interface ConversationPinnedUpdateReqVO {
id: number; // 会话编号
pinned: boolean; // 是否置顶
}
@@ -40,7 +40,7 @@ export function getConversation(id: number) {
/** 客服会话置顶 */
export function updateConversationPinned(
data: MallKefuConversationApi.ConversationPinnedUpdate,
data: MallKefuConversationApi.ConversationPinnedUpdateReqVO,
) {
return requestClient.put(
'/promotion/kefu-conversation/update-conversation-pinned',

View File

@@ -24,11 +24,6 @@ export namespace MallKefuMessageApi {
contentType: number; // 消息类型
content: string; // 消息内容
}
/** 消息列表查询参数 */
export interface MessageQuery extends PageParam {
conversationId: number; // 会话编号
}
}
/** 发送客服消息 */
@@ -44,7 +39,7 @@ export function updateKeFuMessageReadStatus(conversationId: number) {
}
/** 获得消息列表(流式加载) */
export function getKeFuMessageList(params: MallKefuMessageApi.MessageQuery) {
export function getKeFuMessageList(params: PageParam) {
return requestClient.get<PageResult<MallKefuMessageApi.Message>>(
'/promotion/kefu-message/list',
{ params },

View File

@@ -7,80 +7,52 @@ import { requestClient } from '#/api/request';
export namespace MallPointActivityApi {
/** 积分商城商品 */
export interface PointProduct {
/** 积分商城商品编号 */
id?: number;
/** 积分商城活动 id */
activityId?: number;
/** 商品 SPU 编号 */
spuId?: number;
/** 商品 SKU 编号 */
skuId: number;
/** 可兑换数量 */
count: number;
/** 兑换积分 */
point: number;
/** 兑换金额,单位:分 */
price: number;
/** 积分商城商品库存 */
stock: number;
/** 积分商城商品状态 */
activityStatus?: number;
id?: number; // 积分商城商品编号
activityId?: number; // 积分商城活动 id
spuId?: number; // 商品 SPU 编号
skuId: number; // 商品 SKU 编号
count: number; // 可兑换数量
point: number; // 兑换积分
price: number; // 兑换金额,单位:分
stock: number; // 积分商城商品库存
activityStatus?: number; // 积分商城商品状态
}
/** 积分商城活动 */
export interface PointActivity {
/** 积分商城活动编号 */
id: number;
/** 积分商城活动商品 */
spuId: number;
/** 活动状态 */
status: number;
/** 积分商城活动库存 */
stock: number;
/** 积分商城活动总库存 */
totalStock: number;
/** 备注 */
remark?: string;
/** 排序 */
sort: number;
/** 创建时间 */
createTime: string;
/** 积分商城商品 */
products: PointProduct[];
/** 商品名称 */
spuName: string;
/** 商品主图 */
picUrl: string;
/** 商品市场价,单位:分 */
marketPrice: number;
/** 兑换积分 */
point: number;
/** 兑换金额,单位:分 */
price: number;
id: number; // 积分商城活动编号
spuId: number; // 积分商城活动商品
status: number; // 活动状态
stock: number; // 积分商城活动库存
totalStock: number; // 积分商城活动总库存
remark?: string; // 备注
sort: number; // 排序
createTime: string; // 创建时间
products: PointProduct[]; // 积分商城商品
spuName: string; // 商品名称
picUrl: string; // 商品主图
marketPrice: number; // 商品市场价,单位:分
point: number; // 兑换积分
price: number; // 兑换金额,单位:分
}
// TODO @puhui999这些还需要么
/** 扩展 SKU 配置 */
export type SkuExtension = {
/** 积分商城商品配置 */
productConfig: PointProduct;
productConfig: PointProduct; // 积分商城商品配置
} & MallSpuApi.Sku;
/** 扩展 SPU 配置 */
export interface SpuExtension extends MallSpuApi.Spu {
/** SKU 列表 */
skus: SkuExtension[];
skus: SkuExtension[]; // SKU 列表
}
/** 扩展 SPU 配置(带积分信息) */
export interface SpuExtensionWithPoint extends MallSpuApi.Spu {
/** 积分商城活动库存 */
pointStock: number;
/** 积分商城活动总库存 */
pointTotalStock: number;
/** 兑换积分 */
point: number;
/** 兑换金额,单位:分 */
pointPrice: number;
pointStock: number; // 积分商城活动库存
pointTotalStock: number; // 积分商城活动总库存
point: number; // 兑换积分
pointPrice: number; // 兑换金额,单位:分
}
}

View File

@@ -5,48 +5,30 @@ import { requestClient } from '#/api/request';
export namespace MallRewardActivityApi {
/** 优惠规则 */
export interface RewardRule {
/** 满足金额 */
limit?: number;
/** 优惠金额 */
discountPrice?: number;
/** 是否包邮 */
freeDelivery?: boolean;
/** 赠送积分 */
point: number;
/** 赠送优惠券数量 */
limit?: number; // 满足金额
discountPrice?: number; // 优惠金额
freeDelivery?: boolean; // 是否包邮
point: number; // 赠送积分
giveCouponTemplateCounts?: {
[key: number]: number;
};
}; // 赠送优惠券数量
}
/** 满减送活动 */
export interface RewardActivity {
/** 活动编号 */
id?: number;
/** 活动名称 */
name?: string;
/** 开始时间 */
startTime?: Date;
/** 结束时间 */
endTime?: Date;
/** 开始和结束时间(仅前端使用) */
startAndEndTime?: Date[];
/** 备注 */
remark?: string;
/** 条件类型 */
conditionType?: number;
/** 商品范围 */
productScope?: number;
/** 优惠规则列表 */
rules: RewardRule[];
/** 商品范围值(仅表单使用):值为品类编号列表、商品编号列表 */
productScopeValues?: number[];
/** 商品分类编号列表(仅表单使用) */
productCategoryIds?: number[];
/** 商品 SPU 编号列表(仅表单使用) */
productSpuIds?: number[];
/** 状态 */
status?: number;
id?: number; // 活动编号
name?: string; // 活动名称
status?: number; // 活动状态
startTime?: Date; // 开始时间
endTime?: Date; // 结束时间
startAndEndTime?: Date[]; // 开始和结束时间(仅前端使用)
remark?: string; // 备注
conditionType?: number; // 条件类型
productScope?: number; // 商品范围
rules: RewardRule[]; // 优惠规则列表
productScopeValues?: number[]; // 商品范围值(仅表单使用):值为品类编号列表、商品编号列表
productCategoryIds?: number[]; // 商品分类编号列表(仅表单使用)
productSpuIds?: number[]; // 商品 SPU 编号列表(仅表单使用)
}
}

View File

@@ -7,72 +7,43 @@ import { requestClient } from '#/api/request';
export namespace MallSeckillActivityApi {
/** 秒杀商品 */
export interface SeckillProduct {
/** 商品 SKU 编号 */
skuId: number;
/** 商品 SPU 编号 */
spuId: number;
/** 秒杀价格 */
seckillPrice: number;
/** 秒杀库存 */
stock: number;
skuId: number; // 商品 SKU 编号
spuId: number; // 商品 SPU 编号
seckillPrice: number; // 秒杀价格
stock: number; // 秒杀库存
}
/** 秒杀活动 */
export interface SeckillActivity {
/** 活动编号 */
id?: number;
/** 商品 SPU 编号 */
spuId?: number;
/** 活动名称 */
name?: string;
/** 活动状态 */
status?: number;
/** 备注 */
remark?: string;
/** 开始时间 */
startTime: Date;
/** 结束时间 */
endTime: Date;
/** 排序 */
sort?: number;
/** 配置编号 */
configIds?: number[];
/** 订单数量 */
orderCount?: number;
/** 用户数量 */
userCount?: number;
/** 总金额 */
totalPrice?: number;
/** 总限购数量 */
totalLimitCount?: number;
/** 单次限购数量 */
singleLimitCount?: number;
/** 秒杀库存 */
stock?: number;
/** 秒杀总库存 */
totalStock?: number;
/** 秒杀价格 */
seckillPrice?: number;
/** 秒杀商品列表 */
products?: SeckillProduct[];
/** 图片 */
picUrl?: string;
/** 商品名称 */
spuName?: string;
/** 市场价 */
marketPrice?: number;
id?: number; // 活动编号
spuId?: number; // 商品 SPU 编号
name?: string; // 活动名称
status?: number; // 活动状态
remark?: string; // 备注
startTime?: Date; // 开始时间
endTime?: Date; // 结束时间
sort?: number; // 排序
configIds?: string; // 配置编号
orderCount?: number; // 订单数量
userCount?: number; // 用户数量
totalPrice?: number; // 总金额
totalLimitCount?: number; // 总限购数量
singleLimitCount?: number; // 单次限购数量
stock?: number; // 秒杀库存
totalStock?: number; // 秒杀总库存
seckillPrice?: number; // 秒杀价格
products?: SeckillProduct[]; // 秒杀商品列表
}
// TODO @puhui999这些还需要么
/** 扩展 SKU 配置 */
export type SkuExtension = {
/** 秒杀商品配置 */
productConfig: SeckillProduct;
productConfig: SeckillProduct; // 秒杀商品配置
} & MallSpuApi.Sku;
/** 扩展 SPU 配置 */
export interface SpuExtension extends MallSpuApi.Spu {
/** SKU 列表 */
skus: SkuExtension[];
skus: SkuExtension[]; // SKU 列表
}
}

View File

@@ -5,26 +5,12 @@ import { requestClient } from '#/api/request';
export namespace MallSeckillConfigApi {
/** 秒杀时段 */
export interface SeckillConfig {
/** 编号 */
id: number;
/** 秒杀时段名称 */
name: string;
/** 开始时间点 */
startTime: string;
/** 结束时间点 */
endTime: string;
/** 秒杀轮播图 */
sliderPicUrls: string[];
/** 活动状态 */
status: number;
}
/** 时段配置状态更新 */
export interface StatusUpdate {
/** 编号 */
id: number;
/** 状态 */
status: number;
id: number; // 编号
name: string; // 秒杀时段名称
startTime: string; // 开始时间点
endTime: string; // 结束时间点
sliderPicUrls: string[]; // 秒杀轮播图
status: number; // 活动状态
}
}

View File

@@ -12,24 +12,24 @@ export namespace MallMemberStatisticsApi {
times: Date[] | Dayjs[]; // 时间范围
}
/** 会员分析 Response */
export interface AnalyseRespVO {
visitUserCount: number; // 访问用户数
orderUserCount: number; // 下单用户数
payUserCount: number; // 支付用户数
atv: number; // 平均客单价
comparison: DataComparisonRespVO<AnalyseDataRespVO>; // 对照数据
}
/** 会员分析对照数据 Response */
export interface AnalyseComparison {
export interface AnalyseDataRespVO {
registerUserCount: number; // 注册用户数
visitUserCount: number; // 访问用户数
rechargeUserCount: number; // 充值用户数
}
/** 会员分析 Response */
export interface Analyse {
visitUserCount: number; // 访问用户数
orderUserCount: number; // 下单用户数
payUserCount: number; // 支付用户数
atv: number; // 平均客单价
comparison: DataComparisonRespVO<AnalyseComparison>; // 对照数据
}
/** 会员地区统计 Response */
export interface AreaStatistics {
export interface AreaStatisticsRespVO {
areaId: number; // 地区ID
areaName: string; // 地区名称
userCount: number; // 用户数
@@ -39,13 +39,13 @@ export namespace MallMemberStatisticsApi {
}
/** 会员性别统计 Response */
export interface SexStatistics {
export interface SexStatisticsRespVO {
sex: number; // 性别
userCount: number; // 用户数
}
/** 会员统计 Response */
export interface Summary {
export interface SummaryRespVO {
userCount: number; // 用户数
rechargeUserCount: number; // 充值用户数
rechargePrice: number; // 充值金额
@@ -53,7 +53,7 @@ export namespace MallMemberStatisticsApi {
}
/** 会员终端统计 Response */
export interface TerminalStatistics {
export interface TerminalStatisticsRespVO {
terminal: number; // 终端
userCount: number; // 用户数
}
@@ -65,7 +65,7 @@ export namespace MallMemberStatisticsApi {
}
/** 会员注册数量 Response */
export interface RegisterCount {
export interface RegisterCountRespVO {
date: string; // 日期
count: number; // 数量
}
@@ -73,7 +73,7 @@ export namespace MallMemberStatisticsApi {
/** 查询会员统计 */
export function getMemberSummary() {
return requestClient.get<MallMemberStatisticsApi.Summary>(
return requestClient.get<MallMemberStatisticsApi.SummaryRespVO>(
'/statistics/member/summary',
);
}
@@ -82,7 +82,7 @@ export function getMemberSummary() {
export function getMemberAnalyse(
params: MallMemberStatisticsApi.MemberAnalyseReqVO,
) {
return requestClient.get<MallMemberStatisticsApi.Analyse>(
return requestClient.get<MallMemberStatisticsApi.AnalyseRespVO>(
'/statistics/member/analyse',
{
params: {
@@ -97,21 +97,21 @@ export function getMemberAnalyse(
/** 按照省份,查询会员统计列表 */
export function getMemberAreaStatisticsList() {
return requestClient.get<MallMemberStatisticsApi.AreaStatistics[]>(
return requestClient.get<MallMemberStatisticsApi.AreaStatisticsRespVO[]>(
'/statistics/member/area-statistics-list',
);
}
/** 按照性别,查询会员统计列表 */
export function getMemberSexStatisticsList() {
return requestClient.get<MallMemberStatisticsApi.SexStatistics[]>(
return requestClient.get<MallMemberStatisticsApi.SexStatisticsRespVO[]>(
'/statistics/member/sex-statistics-list',
);
}
/** 按照终端,查询会员统计列表 */
export function getMemberTerminalStatisticsList() {
return requestClient.get<MallMemberStatisticsApi.TerminalStatistics[]>(
return requestClient.get<MallMemberStatisticsApi.TerminalStatisticsRespVO[]>(
'/statistics/member/terminal-statistics-list',
);
}
@@ -125,7 +125,7 @@ export function getUserCountComparison() {
/** 获得会员注册数量列表 */
export function getMemberRegisterCountList(beginTime: Date, endTime: Date) {
return requestClient.get<MallMemberStatisticsApi.RegisterCount[]>(
return requestClient.get<MallMemberStatisticsApi.RegisterCountRespVO[]>(
'/statistics/member/register-count-list',
{
params: {

View File

@@ -6,50 +6,35 @@ import { requestClient } from '#/api/request';
export namespace MallProductStatisticsApi {
/** 商品统计数据 */
export interface ProductStatistics {
/** 编号 */
id: number;
/** 统计日期 */
day: string;
/** 商品 SPU 编号 */
spuId: number;
/** 商品 SPU 名称 */
spuName: string;
/** 商品 SPU 图片 */
spuPicUrl: string;
/** 浏览次数 */
browseCount: number;
/** 浏览人数 */
browseUserCount: number;
/** 收藏次数 */
favoriteCount: number;
/** 加购次数 */
cartCount: number;
/** 下单次数 */
orderCount: number;
/** 支付次数 */
orderPayCount: number;
/** 支付金额 */
orderPayPrice: number;
/** 售后次数 */
afterSaleCount: number;
/** 退款金额 */
afterSaleRefundPrice: number;
/** 浏览转化率 */
browseConvertPercent: number;
export interface ProductStatisticsRespVO {
id: number; // 编号
day: string; // 统计日期
spuId: number; // 商品 SPU 编号
spuName: string; // 商品 SPU 名称
spuPicUrl: string; // 商品 SPU 图片
browseCount: number; // 浏览次数
browseUserCount: number; // 浏览人数
favoriteCount: number; // 收藏次数
cartCount: number; // 加购次数
orderCount: number; // 下单次数
orderPayCount: number; // 支付次数
orderPayPrice: number; // 支付金额
afterSaleCount: number; // 售后次数
afterSaleRefundPrice: number; // 退款金额
browseConvertPercent: number; // 浏览转化率
}
}
/** 获得商品统计分析 */
export function getProductStatisticsAnalyse(params: any) {
return requestClient.get<
DataComparisonRespVO<MallProductStatisticsApi.ProductStatistics>
DataComparisonRespVO<MallProductStatisticsApi.ProductStatisticsRespVO>
>('/statistics/product/analyse', { params });
}
/** 获得商品状况明细 */
export function getProductStatisticsList(params: any) {
return requestClient.get<MallProductStatisticsApi.ProductStatistics[]>(
return requestClient.get<MallProductStatisticsApi.ProductStatisticsRespVO[]>(
'/statistics/product/list',
{ params },
);
@@ -63,6 +48,6 @@ export function exportProductStatisticsExcel(params: any) {
/** 获得商品排行榜分页 */
export function getProductStatisticsRankPage(params: PageParam) {
return requestClient.get<
PageResult<MallProductStatisticsApi.ProductStatistics>
PageResult<MallProductStatisticsApi.ProductStatisticsRespVO>
>('/statistics/product/rank-page', { params });
}

View File

@@ -1,25 +1,25 @@
import type { DataComparisonRespVO } from './common';
import { formatDate, formatDateTime } from '@vben/utils';
import { formatDateTime } from '@vben/utils';
import { requestClient } from '#/api/request';
export namespace MallTradeStatisticsApi {
/** 交易状况 Request */
export interface TradeTrendReqVO {
times: [Date, Date];
}
/** 交易统计 Response */
export interface TradeSummary {
export interface TradeSummaryRespVO {
yesterdayOrderCount: number;
monthOrderCount: number;
yesterdayPayPrice: number;
monthPayPrice: number;
}
/** 交易状况 Request */
export interface TradeTrendReq {
times: [Date, Date];
}
/** 交易状况统计 Response */
export interface TradeTrendSummary {
export interface TradeTrendSummaryRespVO {
time: string;
turnoverPrice: number;
orderPayPrice: number;
@@ -31,81 +31,59 @@ export namespace MallTradeStatisticsApi {
}
/** 交易订单数量 Response */
export interface TradeOrderCount {
/** 待发货 */
undelivered?: number;
/** 待核销 */
pickUp?: number;
/** 退款中 */
afterSaleApply?: number;
/** 提现待审核 */
auditingWithdraw?: number;
export interface TradeOrderCountRespVO {
undelivered?: number; // 待发货
pickUp?: number; // 待核销
afterSaleApply?: number; // 退款中
auditingWithdraw?: number; // 提现待审核
}
/** 交易订单统计 Response */
export interface TradeOrderSummaryRespVO {
/** 支付订单商品数 */
orderPayCount?: number;
/** 总支付金额,单位:分 */
orderPayPrice?: number;
orderPayCount?: number; // 支付订单商品数
orderPayPrice?: number; // 总支付金额,单位:分
}
/** 订单量趋势统计 Response */
export interface TradeOrderTrend {
/** 日期 */
date: string;
/** 订单数量 */
orderPayCount: number;
/** 订单支付金额 */
orderPayPrice: number;
export interface TradeOrderTrendRespVO {
date: string; // 日期
orderPayCount: number; // 订单数量
orderPayPrice: number; // 订单支付金额
}
}
/** 时间参数需要格式化, 确保接口能识别 */
const formatDateParam = (params: MallTradeStatisticsApi.TradeTrendReq) => {
return {
times: [formatDate(params.times[0]), formatDate(params.times[1])],
} as MallTradeStatisticsApi.TradeTrendReq;
};
/** 查询交易统计 */
export function getTradeStatisticsSummary() {
return requestClient.get<
DataComparisonRespVO<MallTradeStatisticsApi.TradeSummary>
DataComparisonRespVO<MallTradeStatisticsApi.TradeSummaryRespVO>
>('/statistics/trade/summary');
}
/** 获得交易状况统计 */
export function getTradeStatisticsAnalyse(
params: MallTradeStatisticsApi.TradeTrendReq,
params: MallTradeStatisticsApi.TradeTrendReqVO,
) {
return requestClient.get<
DataComparisonRespVO<MallTradeStatisticsApi.TradeTrendSummary>
>('/statistics/trade/analyse', { params: formatDateParam(params) });
DataComparisonRespVO<MallTradeStatisticsApi.TradeTrendSummaryRespVO>
>('/statistics/trade/analyse', { params });
}
/** 获得交易状况明细 */
export function getTradeStatisticsList(
params: MallTradeStatisticsApi.TradeTrendReq,
) {
return requestClient.get<MallTradeStatisticsApi.TradeTrendSummary[]>(
export function getTradeStatisticsList(params: any) {
return requestClient.get<MallTradeStatisticsApi.TradeTrendSummaryRespVO[]>(
'/statistics/trade/list',
{ params: formatDateParam(params) },
{ params },
);
}
/** 导出交易状况明细 */
export function exportTradeStatisticsExcel(
params: MallTradeStatisticsApi.TradeTrendReq,
) {
return requestClient.download('/statistics/trade/export-excel', {
params: formatDateParam(params),
});
export function exportTradeStatisticsExcel(params: any) {
return requestClient.download('/statistics/trade/export-excel', { params });
}
/** 获得交易订单数量 */
export function getOrderCount() {
return requestClient.get<MallTradeStatisticsApi.TradeOrderCount>(
return requestClient.get<MallTradeStatisticsApi.TradeOrderCountRespVO>(
'/statistics/trade/order-count',
);
}
@@ -124,7 +102,7 @@ export function getOrderCountTrendComparison(
endTime: Date,
) {
return requestClient.get<
DataComparisonRespVO<MallTradeStatisticsApi.TradeOrderTrend>[]
DataComparisonRespVO<MallTradeStatisticsApi.TradeOrderTrendRespVO>[]
>('/statistics/trade/order-count-trend', {
params: {
type,

View File

@@ -5,85 +5,49 @@ import type { MallOrderApi } from '#/api/mall/trade/order';
import { requestClient } from '#/api/request';
export namespace MallAfterSaleApi {
/** 商品属性 */
export interface ProductProperty {
/** 属性的编号 */
propertyId?: null | number;
/** 属性的名称 */
propertyName?: string;
/** 属性值的编号 */
valueId?: null | number;
/** 属性值的名称 */
valueName?: string;
}
/** 交易售后 */
export interface AfterSale {
/** 售后编号,主键自增 */
id?: null | number;
/** 售后单号 */
no?: string;
/** 退款状态 */
status?: null | number;
/** 售后方式 */
way?: null | number;
/** 售后类型 */
type?: null | number;
/** 用户编号 */
userId?: null | number;
/** 申请原因 */
applyReason?: string;
/** 补充描述 */
applyDescription?: string;
/** 补充凭证图片 */
applyPicUrls?: string[];
/** 交易订单编号 */
orderId?: null | number;
/** 订单流水号 */
orderNo?: string;
/** 交易订单项编号 */
orderItemId?: null | number;
/** 商品 SPU 编号 */
spuId?: null | number;
/** 商品 SPU 名称 */
spuName?: string;
/** 商品 SKU 编号 */
skuId?: null | number;
/** 属性数组 */
properties?: ProductProperty[];
/** 商品图片 */
picUrl?: string;
/** 退货商品数量 */
count?: null | number;
/** 审批时间 */
auditTime?: Date;
/** 审批人 */
auditUserId?: null | number;
/** 审批备注 */
auditReason?: string;
/** 退款金额,单位:分 */
refundPrice?: null | number;
/** 支付退款编号 */
payRefundId?: null | number;
/** 退款时间 */
refundTime?: Date;
/** 退货物流公司编号 */
logisticsId?: null | number;
/** 退货物流单号 */
logisticsNo?: string;
/** 退货时间 */
deliveryTime?: Date;
/** 收货时间 */
receiveTime?: Date;
/** 收货备注 */
receiveReason?: string;
id?: number; // 售后编号
no?: string; // 售后单号
status?: number; // 退款状态
way?: number; // 售后方式
type?: number; // 售后类型
userId?: number; // 用户编号
applyReason?: string; // 申请原因
applyDescription?: string; // 补充描述
applyPicUrls?: string[]; // 补充凭证图片
orderId?: number; // 交易订单编号
orderNo?: string; // 订单流水号
orderItemId?: number; // 交易订单项编号
spuId?: number; // 商品 SPU 编号
spuName?: string; // 商品 SPU 名称
skuId?: number; // 商品 SKU 编号
properties?: {
propertyId?: number; // 属性的编号
propertyName?: string; // 属性的名称
valueId?: number; // 属性值的编号
valueName?: string; // 属性值的名称
}[]; // 属性数组
picUrl?: string; // 商品图片
count?: number; // 退货商品数量
auditTime?: Date; // 审批时间
auditUserId?: number; // 审批人
auditReason?: string; // 审批备注
refundPrice?: number; // 退款金额,单位:分
payRefundId?: number; // 支付退款编号
refundTime?: Date; // 退款时间
logisticsId?: number; // 退货物流公司编号
logisticsNo?: string; // 退货物流单号
deliveryTime?: Date; // 退货时间
receiveTime?: Date; // 收货时间
receiveReason?: string; // 收货备注
order?: MallOrderApi.Order; // 关联订单
orderItem?: MallOrderApi.OrderItem; // 关联订单项
logs?: any[]; // 关联售后日志
}
/** 拒绝售后请求 */
export interface DisagreeRequest {
export interface AfterSaleDisagreeReqVO {
/** 售后编号 */
id: number;
/** 拒绝原因 */
@@ -112,7 +76,9 @@ export function agreeAfterSale(id: number) {
}
/** 拒绝售后 */
export function disagreeAfterSale(data: MallAfterSaleApi.DisagreeRequest) {
export function disagreeAfterSale(
data: MallAfterSaleApi.AfterSaleDisagreeReqVO,
) {
return requestClient.put('/trade/after-sale/disagree', data);
}

View File

@@ -27,7 +27,7 @@ export namespace MallBrokerageWithdrawApi {
}
/** 驳回申请请求 */
export interface RejectRequest {
export interface BrokerageWithdrawRejectReqVO {
id: number; // 编号
auditReason: string; // 驳回原因
}
@@ -40,13 +40,6 @@ export function getBrokerageWithdrawPage(params: PageParam) {
>('/trade/brokerage-withdraw/page', { params });
}
/** 查询佣金提现详情 */
export function getBrokerageWithdraw(id: number) {
return requestClient.get<MallBrokerageWithdrawApi.BrokerageWithdraw>(
`/trade/brokerage-withdraw/get?id=${id}`,
);
}
/** 佣金提现 - 通过申请 */
export function approveBrokerageWithdraw(id: number) {
return requestClient.put(`/trade/brokerage-withdraw/approve?id=${id}`);
@@ -54,7 +47,7 @@ export function approveBrokerageWithdraw(id: number) {
/** 审核佣金提现 - 驳回申请 */
export function rejectBrokerageWithdraw(
data: MallBrokerageWithdrawApi.RejectRequest,
data: MallBrokerageWithdrawApi.BrokerageWithdrawRejectReqVO,
) {
return requestClient.put('/trade/brokerage-withdraw/reject', data);
}

View File

@@ -5,28 +5,12 @@ import { requestClient } from '#/api/request';
export namespace MallDeliveryExpressApi {
/** 快递公司 */
export interface DeliveryExpress {
/** 编号 */
id: number;
/** 快递公司编码 */
code: string;
/** 快递公司名称 */
name: string;
/** 快递公司 logo */
logo: string;
/** 排序 */
sort: number;
/** 状态 */
status: number;
}
/** 快递公司精简信息 */
export interface SimpleDeliveryExpress {
/** 编号 */
id: number;
/** 快递公司编码 */
code: string;
/** 快递公司名称 */
name: string;
id: number; // 编号
code: string; // 快递公司编码
name: string; // 快递公司名称
logo: string; // 快递公司 logo
sort: number; // 排序
status: number; // 状态
}
}
@@ -47,7 +31,7 @@ export function getDeliveryExpress(id: number) {
/** 获得快递公司精简信息列表 */
export function getSimpleDeliveryExpressList() {
return requestClient.get<MallDeliveryExpressApi.SimpleDeliveryExpress[]>(
return requestClient.get<MallDeliveryExpressApi.DeliveryExpress[]>(
'/trade/delivery/express/list-all-simple',
);
}

View File

@@ -3,86 +3,64 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace MallDeliveryExpressTemplateApi {
/** 快递运费模板 */
export interface DeliveryExpressTemplate {
id: number; // 编号
name: string; // 模板名称
chargeMode: number; // 计费方式
sort: number; // 排序
charges: DeliveryExpressTemplateCharge[]; // 计费区域列表
frees: DeliveryExpressTemplateFree[]; // 包邮区域列表
}
/** 运费模板计费 */
export interface TemplateCharge {
/** 区域编号列表 */
areaIds: number[];
/** 首件数量 */
startCount: number;
/** 首件价格,单位:分 */
startPrice: number;
/** 续件数量 */
extraCount: number;
/** 续件价格,单位:分 */
extraPrice: number;
export interface DeliveryExpressTemplateCharge {
areaIds: number[]; // 区域编号列表
startCount: number; // 首件数量
startPrice: number; // 首件价格,单位:分
extraCount: number; // 续件数量
extraPrice: number; // 续件价格,单位:分
}
/** 运费模板包邮 */
export interface TemplateFree {
/** 区域编号列表 */
areaIds: number[];
/** 包邮件数 */
freeCount: number;
/** 包邮金额,单位:分 */
freePrice: number;
}
/** 快递运费模板 */
export interface ExpressTemplate {
/** 编号 */
id: number;
/** 模板名称 */
name: string;
/** 计费方式 */
chargeMode: number;
/** 排序 */
sort: number;
/** 计费区域列表 */
charges: TemplateCharge[];
/** 包邮区域列表 */
frees: TemplateFree[];
}
/** 运费模板精简信息 */
export interface SimpleTemplate {
/** 编号 */
id: number;
/** 模板名称 */
name: string;
export interface DeliveryExpressTemplateFree {
areaIds: number[]; // 区域编号列表
freeCount: number; // 包邮件数
freePrice: number; // 包邮金额,单位:分
}
}
/** 查询快递运费模板列表 */
export function getDeliveryExpressTemplatePage(params: PageParam) {
return requestClient.get<
PageResult<MallDeliveryExpressTemplateApi.ExpressTemplate>
PageResult<MallDeliveryExpressTemplateApi.DeliveryExpressTemplate>
>('/trade/delivery/express-template/page', { params });
}
/** 查询快递运费模板详情 */
export function getDeliveryExpressTemplate(id: number) {
return requestClient.get<MallDeliveryExpressTemplateApi.ExpressTemplate>(
return requestClient.get<MallDeliveryExpressTemplateApi.DeliveryExpressTemplate>(
`/trade/delivery/express-template/get?id=${id}`,
);
}
/** 查询快递运费模板详情 */
export function getSimpleTemplateList() {
return requestClient.get<MallDeliveryExpressTemplateApi.SimpleTemplate[]>(
'/trade/delivery/express-template/list-all-simple',
);
return requestClient.get<
MallDeliveryExpressTemplateApi.DeliveryExpressTemplate[]
>('/trade/delivery/express-template/list-all-simple');
}
/** 新增快递运费模板 */
export function createDeliveryExpressTemplate(
data: MallDeliveryExpressTemplateApi.ExpressTemplate,
data: MallDeliveryExpressTemplateApi.DeliveryExpressTemplate,
) {
return requestClient.post('/trade/delivery/express-template/create', data);
}
/** 修改快递运费模板 */
export function updateDeliveryExpressTemplate(
data: MallDeliveryExpressTemplateApi.ExpressTemplate,
data: MallDeliveryExpressTemplateApi.DeliveryExpressTemplate,
) {
return requestClient.put('/trade/delivery/express-template/update', data);
}

View File

@@ -4,35 +4,21 @@ import { requestClient } from '#/api/request';
export namespace MallDeliveryPickUpStoreApi {
/** 自提门店 */
export interface PickUpStore {
/** 编号 */
id: number;
/** 门店名称 */
name: string;
/** 门店简介 */
introduction: string;
/** 联系电话 */
phone: string;
/** 区域编号 */
areaId: number;
/** 详细地址 */
detailAddress: string;
/** 门店 logo */
logo: string;
/** 营业开始时间 */
openingTime: string;
/** 营业结束时间 */
closingTime: string;
/** 纬度 */
latitude: number;
/** 经度 */
longitude: number;
/** 状态 */
status: number;
/** 营业时间 用于fieldMappingTime */
rangeTime: any[];
/** 绑定用户编号组数 */
verifyUserIds?: number[];
export interface DeliveryPickUpStore {
id: number; // 编号
name: string; // 门店名称
introduction: string; // 门店简介
phone: string; // 联系电话
areaId: number; // 区域编号
detailAddress: string; // 详细地址
logo: string; // 门店 logo
openingTime: string; // 营业开始时间
closingTime: string; // 营业结束时间
latitude: number; // 纬度
longitude: number; // 经度
status: number; // 状态
rangeTime: any[]; // 营业时间,用于 fieldMappingTime
verifyUserIds?: number[]; // 绑定用户编号组数
verifyUsers?: any[];
}
@@ -46,36 +32,35 @@ export namespace MallDeliveryPickUpStoreApi {
/** 查询自提门店列表 */
export function getDeliveryPickUpStorePage(params: PageParam) {
return requestClient.get<PageResult<MallDeliveryPickUpStoreApi.PickUpStore>>(
'/trade/delivery/pick-up-store/page',
{ params },
);
return requestClient.get<
PageResult<MallDeliveryPickUpStoreApi.DeliveryPickUpStore>
>('/trade/delivery/pick-up-store/page', { params });
}
/** 查询自提门店详情 */
export function getDeliveryPickUpStore(id: number) {
return requestClient.get<MallDeliveryPickUpStoreApi.PickUpStore>(
return requestClient.get<MallDeliveryPickUpStoreApi.DeliveryPickUpStore>(
`/trade/delivery/pick-up-store/get?id=${id}`,
);
}
/** 查询自提门店精简列表 */
export function getSimpleDeliveryPickUpStoreList() {
return requestClient.get<MallDeliveryPickUpStoreApi.PickUpStore[]>(
return requestClient.get<MallDeliveryPickUpStoreApi.DeliveryPickUpStore[]>(
'/trade/delivery/pick-up-store/simple-list',
);
}
/** 新增自提门店 */
export function createDeliveryPickUpStore(
data: MallDeliveryPickUpStoreApi.PickUpStore,
data: MallDeliveryPickUpStoreApi.DeliveryPickUpStore,
) {
return requestClient.post('/trade/delivery/pick-up-store/create', data);
}
/** 修改自提门店 */
export function updateDeliveryPickUpStore(
data: MallDeliveryPickUpStoreApi.PickUpStore,
data: MallDeliveryPickUpStoreApi.DeliveryPickUpStore,
) {
return requestClient.put('/trade/delivery/pick-up-store/update', data);
}

View File

@@ -3,231 +3,136 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace MallOrderApi {
/** 商品属性 */
export interface ProductProperty {
/** 属性的编号 */
propertyId?: number;
/** 属性的名称 */
propertyName?: string;
/** 属性值的编号 */
valueId?: number;
/** 属性值的名称 */
valueName?: string;
/** 订单信息 */
export interface Order {
id?: number; // 订单编号
no?: string; // 订单流水号
createTime?: Date; // 下单时间
type?: number; // 订单类型
terminal?: number; // 订单来源
userId?: number; // 用户编号
userIp?: string; // 用户 IP
userRemark?: string; // 用户备注
status?: number; // 订单状态
productCount?: number; // 购买的商品数量
finishTime?: Date; // 订单完成时间
cancelTime?: Date; // 订单取消时间
cancelType?: number; // 取消类型
remark?: string; // 商家备注
payOrderId?: number; // 支付订单编号
payStatus?: boolean; // 是否已支付
payTime?: Date; // 付款时间
payChannelCode?: string; // 支付渠道
totalPrice?: number; // 商品原价(总)
discountPrice?: number; // 订单优惠(总)
deliveryPrice?: number; // 运费金额
adjustPrice?: number; // 订单调价(总)
payPrice?: number; // 应付金额(总)
deliveryType?: number; // 发货方式
pickUpStoreId?: number; // 自提门店编号
pickUpVerifyCode?: string; // 自提核销码
deliveryTemplateId?: number; // 配送模板编号
logisticsId?: number; // 发货物流公司编号
logisticsNo?: string; // 发货物流单号
deliveryTime?: Date; // 发货时间
receiveTime?: Date; // 收货时间
receiverName?: string; // 收件人名称
receiverMobile?: string; // 收件人手机
receiverPostCode?: number; // 收件人邮编
receiverAreaId?: number; // 收件人地区编号
receiverAreaName?: string; // 收件人地区名字
receiverDetailAddress?: string; // 收件人详细地址
afterSaleStatus?: number; // 售后状态
refundPrice?: number; // 退款金额
couponId?: number; // 优惠劵编号
couponPrice?: number; // 优惠劵减免金额
pointPrice?: number; // 积分抵扣的金额
vipPrice?: number; // VIP 减免金额
items?: OrderItem[]; // 订单项列表
user?: {
// 下单用户信息
avatar?: string; // 用户头像
id?: number; // 用户编号
nickname?: string; // 用户昵称
};
brokerageUser?: {
// 推广用户信息
avatar?: string; // 用户头像
id?: number; // 用户编号
nickname?: string; // 用户昵称
}; // 推广用户信息
logs?: OrderLog[]; // 订单操作日志
}
/** 订单项 */
export interface OrderItem {
/** 编号 */
id?: number;
/** 用户编号 */
userId?: number;
/** 订单编号 */
orderId?: number;
/** 商品 SPU 编号 */
spuId?: number;
/** 商品 SPU 名称 */
spuName?: string;
/** 商品 SKU 编号 */
skuId?: number;
/** 商品图片 */
picUrl?: string;
/** 购买数量 */
count?: number;
/** 商品原价(总) */
originalPrice?: number;
/** 商品原价(单) */
originalUnitPrice?: number;
/** 商品优惠(总) */
discountPrice?: number;
/** 商品实付金额(总) */
payPrice?: number;
/** 子订单分摊金额(总) */
orderPartPrice?: number;
/** 分摊后子订单实付金额(总) */
orderDividePrice?: number;
/** 售后状态 */
afterSaleStatus?: number;
/** 属性数组 */
properties?: ProductProperty[];
id?: number; // 编号
userId?: number; // 用户编号
orderId?: number; // 订单编号
spuId?: number; // 商品 SPU 编号
spuName?: string; // 商品 SPU 名称
skuId?: number; // 商品 SKU 编号
picUrl?: string; // 商品图片
count?: number; // 购买数量
originalPrice?: number; // 商品原价(总)
originalUnitPrice?: number; // 商品原价(单)
discountPrice?: number; // 商品优惠(总)
payPrice?: number; // 商品实付金额(总)
orderPartPrice?: number; // 子订单分摊金额(总)
orderDividePrice?: number; // 分摊后子订单实付金额(总)
afterSaleStatus?: number; // 售后状态
properties?: {
propertyId?: number; // 属性的编号
propertyName?: string; // 属性的名称
valueId?: number; // 属性值的编号
valueName?: string; // 属性值的名称
}[]; // 属性数组
price?: number;
}
/** 订单日志 */
export interface OrderLog {
/** 日志内容 */
content?: string;
/** 创建时间 */
createTime?: Date;
/** 用户类型 */
userType?: number;
/** 用户编号 */
userId?: number;
content?: string; // 日志内容
createTime?: Date; // 创建时间
userType?: number; // 用户类型
userId?: number; // 用户编号
}
/** 订单 */
export interface Order {
/** 订单编号 */
id?: number;
/** 订单流水号 */
no?: string;
/** 下单时间 */
createTime?: Date;
/** 订单类型 */
type?: number;
/** 订单来源 */
terminal?: number;
/** 用户编号 */
userId?: number;
/** 用户 IP */
userIp?: string;
/** 用户备注 */
userRemark?: string;
/** 订单状态 */
status?: number;
/** 购买的商品数量 */
productCount?: number;
/** 订单完成时间 */
finishTime?: Date;
/** 订单取消时间 */
cancelTime?: Date;
/** 取消类型 */
cancelType?: number;
/** 商家备注 */
remark?: string;
/** 支付订单编号 */
payOrderId?: number;
/** 是否已支付 */
payStatus?: boolean;
/** 付款时间 */
payTime?: Date;
/** 支付渠道 */
payChannelCode?: string;
/** 商品原价(总) */
totalPrice?: number;
/** 订单优惠(总) */
discountPrice?: number;
/** 运费金额 */
deliveryPrice?: number;
/** 订单调价(总) */
adjustPrice?: number;
/** 应付金额(总) */
payPrice?: number;
/** 发货方式 */
deliveryType?: number;
/** 自提门店编号 */
pickUpStoreId?: number;
/** 自提核销码 */
pickUpVerifyCode?: string;
/** 配送模板编号 */
deliveryTemplateId?: number;
/** 发货物流公司编号 */
logisticsId?: number;
/** 发货物流单号 */
logisticsNo?: string;
/** 发货时间 */
deliveryTime?: Date;
/** 收货时间 */
receiveTime?: Date;
/** 收件人名称 */
receiverName?: string;
/** 收件人手机 */
receiverMobile?: string;
/** 收件人邮编 */
receiverPostCode?: number;
/** 收件人地区编号 */
receiverAreaId?: number;
/** 收件人地区名字 */
receiverAreaName?: string;
/** 收件人详细地址 */
receiverDetailAddress?: string;
/** 售后状态 */
afterSaleStatus?: number;
/** 退款金额 */
refundPrice?: number;
/** 优惠劵编号 */
couponId?: number;
/** 优惠劵减免金额 */
couponPrice?: number;
/** 积分抵扣的金额 */
pointPrice?: number;
/** VIP 减免金额 */
vipPrice?: number;
/** 订单项列表 */
items?: OrderItem[];
/** 下单用户信息 */
user?: {
/** 用户头像 */
avatar?: string;
/** 用户编号 */
id?: number;
/** 用户昵称 */
nickname?: string;
};
/** 推广用户信息 */
brokerageUser?: {
/** 用户头像 */
avatar?: string;
/** 用户编号 */
id?: number;
/** 用户昵称 */
nickname?: string;
};
/** 订单操作日志 */
logs?: OrderLog[];
}
/** 交易订单统计 */
export interface OrderSummary {
/** 订单数量 */
orderCount: number;
/** 订单金额 */
orderPayPrice: number;
/** 退款单数 */
afterSaleCount: number;
/** 退款金额 */
afterSalePrice: number;
/** 交易订单统计响应 */
export interface OrderSummaryRespVO {
orderCount: number; // 订单数量
orderPayPrice: number; // 订单金额
afterSaleCount: number; // 退款单数
afterSalePrice: number; // 退款金额
}
/** 订单发货请求 */
export interface DeliveryRequest {
/** 订单编号 */
id?: number;
/** 发货方式 */
expressType: string;
/** 物流公司编号 */
logisticsId: number;
/** 物流编号 */
logisticsNo: string;
export interface OrderUpdateDeliveryReqVO {
id?: number; // 订单编号
expressType: string; // 发货方式
logisticsId: number; // 物流公司编号
logisticsNo: string; // 物流编号
}
/** 订单备注请求 */
export interface RemarkRequest {
/** 订单编号 */
id: number;
/** 备注 */
remark: string;
export interface OrderUpdateRemarkReqVO {
id: number; // 订单编号
remark: string; // 备注
}
/** 订单调价请求 */
export interface PriceRequest {
/** 订单编号 */
id: number;
/** 调整金额,单位:分 */
adjustPrice: number;
export interface OrderUpdatePriceReqVO {
id: number; // 订单编号
adjustPrice: number; // 调整金额,单位:分
}
/** 订单地址请求 */
export interface AddressRequest {
/** 订单编号 */
id: number;
/** 收件人名称 */
receiverName: string;
/** 收件人手机 */
receiverMobile: string;
/** 收件人地区编号 */
receiverAreaId: number;
/** 收件人详细地址 */
receiverDetailAddress: string;
export interface OrderUpdateAddressReqVO {
id: number; // 订单编号
receiverName: string; // 收件人名称
receiverMobile: string; // 收件人手机
receiverAreaId: number; // 收件人地区编号
receiverDetailAddress: string; // 收件人详细地址
}
}
@@ -243,9 +148,12 @@ export function getOrderPage(params: PageParam) {
/** 查询交易订单统计 */
export function getOrderSummary(params: any) {
return requestClient.get<MallOrderApi.OrderSummary>('/trade/order/summary', {
params,
});
return requestClient.get<MallOrderApi.OrderSummaryRespVO>(
'/trade/order/summary',
{
params,
},
);
}
/** 查询交易订单详情 */
@@ -261,22 +169,22 @@ export function getExpressTrackList(id: number) {
}
/** 订单发货 */
export function deliveryOrder(data: MallOrderApi.DeliveryRequest) {
export function deliveryOrder(data: MallOrderApi.OrderUpdateDeliveryReqVO) {
return requestClient.put('/trade/order/delivery', data);
}
/** 订单备注 */
export function updateOrderRemark(data: MallOrderApi.RemarkRequest) {
export function updateOrderRemark(data: MallOrderApi.OrderUpdateRemarkReqVO) {
return requestClient.put('/trade/order/update-remark', data);
}
/** 订单调价 */
export function updateOrderPrice(data: MallOrderApi.PriceRequest) {
export function updateOrderPrice(data: MallOrderApi.OrderUpdatePriceReqVO) {
return requestClient.put('/trade/order/update-price', data);
}
/** 修改订单地址 */
export function updateOrderAddress(data: MallOrderApi.AddressRequest) {
export function updateOrderAddress(data: MallOrderApi.OrderUpdateAddressReqVO) {
return requestClient.put('/trade/order/update-address', data);
}

View File

@@ -2,13 +2,13 @@ import { requestClient } from '#/api/request';
export namespace MpStatisticsApi {
/** 统计查询参数 */
export interface StatisticsQuery {
export interface StatisticsGetReqVO {
accountId: number;
date: Date[];
}
/** 消息发送概况数据 */
export interface UpstreamMessage {
export interface StatisticsUpstreamMessageRespVO {
refDate: string;
msgType: string;
msgUser: number;
@@ -16,7 +16,7 @@ export namespace MpStatisticsApi {
}
/** 用户增减数据 */
export interface UserSummary {
export interface StatisticsUserSummaryRespVO {
refDate: string;
userSource: number;
newUser: number;
@@ -25,13 +25,13 @@ export namespace MpStatisticsApi {
}
/** 用户累计数据 */
export interface UserCumulate {
export interface StatisticsUserCumulateRespVO {
refDate: string;
cumulateUser: number;
}
/** 接口分析数据 */
export interface InterfaceSummary {
export interface StatisticsInterfaceSummaryRespVO {
refDate: string;
callbackCount: number;
failCount: number;
@@ -41,8 +41,8 @@ export namespace MpStatisticsApi {
}
/** 获取消息发送概况数据 */
export function getUpstreamMessage(params: MpStatisticsApi.StatisticsQuery) {
return requestClient.get<MpStatisticsApi.UpstreamMessage[]>(
export function getUpstreamMessage(params: MpStatisticsApi.StatisticsGetReqVO) {
return requestClient.get<MpStatisticsApi.StatisticsUpstreamMessageRespVO[]>(
'/mp/statistics/upstream-message',
{
params,
@@ -51,8 +51,8 @@ export function getUpstreamMessage(params: MpStatisticsApi.StatisticsQuery) {
}
/** 获取用户增减数据 */
export function getUserSummary(params: MpStatisticsApi.StatisticsQuery) {
return requestClient.get<MpStatisticsApi.UserSummary[]>(
export function getUserSummary(params: MpStatisticsApi.StatisticsGetReqVO) {
return requestClient.get<MpStatisticsApi.StatisticsUserSummaryRespVO[]>(
'/mp/statistics/user-summary',
{
params,
@@ -61,8 +61,8 @@ export function getUserSummary(params: MpStatisticsApi.StatisticsQuery) {
}
/** 获取用户累计数据 */
export function getUserCumulate(params: MpStatisticsApi.StatisticsQuery) {
return requestClient.get<MpStatisticsApi.UserCumulate[]>(
export function getUserCumulate(params: MpStatisticsApi.StatisticsGetReqVO) {
return requestClient.get<MpStatisticsApi.StatisticsUserCumulateRespVO[]>(
'/mp/statistics/user-cumulate',
{
params,
@@ -71,8 +71,10 @@ export function getUserCumulate(params: MpStatisticsApi.StatisticsQuery) {
}
/** 获取接口分析数据 */
export function getInterfaceSummary(params: MpStatisticsApi.StatisticsQuery) {
return requestClient.get<MpStatisticsApi.InterfaceSummary[]>(
export function getInterfaceSummary(
params: MpStatisticsApi.StatisticsGetReqVO,
) {
return requestClient.get<MpStatisticsApi.StatisticsInterfaceSummaryRespVO[]>(
'/mp/statistics/interface-summary',
{
params,

View File

@@ -11,12 +11,6 @@ export namespace MpTagApi {
count?: number;
createTime?: Date;
}
/** 标签分页查询参数 */
export interface TagPageQuery extends PageParam {
accountId?: number;
name?: string;
}
}
/** 创建公众号标签 */
@@ -44,7 +38,7 @@ export function getTag(id: number) {
}
/** 获取公众号标签分页 */
export function getTagPage(params: MpTagApi.TagPageQuery) {
export function getTagPage(params: PageParam) {
return requestClient.get<PageResult<MpTagApi.Tag>>('/mp/tag/page', {
params,
});

View File

@@ -20,21 +20,14 @@ export namespace PayAppApi {
}
/** 更新状态请求 */
export interface UpdateStatusReq {
export interface AppUpdateStatusReqVO {
id: number;
status: number;
}
export interface AppPageReqVO extends PageParam {
name?: string;
appKey?: string;
status?: number;
createTime?: Date[];
}
}
/** 查询支付应用列表 */
export function getAppPage(params: PayAppApi.AppPageReqVO) {
export function getAppPage(params: PageParam) {
return requestClient.get<PageResult<PayAppApi.App>>('/pay/app/page', {
params,
});
@@ -56,7 +49,7 @@ export function updateApp(data: PayAppApi.App) {
}
/** 修改支付应用状态 */
export function updateAppStatus(data: PayAppApi.UpdateStatusReq) {
export function updateAppStatus(data: PayAppApi.AppUpdateStatusReqVO) {
return requestClient.put('/pay/app/update-status', data);
}

View File

@@ -1,5 +1,3 @@
import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace PayChannelApi {
@@ -16,16 +14,6 @@ export namespace PayChannelApi {
}
}
/** 查询支付渠道列表 */
export function getChannelPage(params: PageParam) {
return requestClient.get<PageResult<PayChannelApi.Channel>>(
'/pay/channel/page',
{
params,
},
);
}
/** 查询支付渠道详情 */
export function getChannel(appId: number, code: string) {
return requestClient.get<PayChannelApi.Channel>('/pay/channel/get', {
@@ -42,13 +30,3 @@ export function createChannel(data: PayChannelApi.Channel) {
export function updateChannel(data: PayChannelApi.Channel) {
return requestClient.put('/pay/channel/update', data);
}
/** 删除支付渠道 */
export function deleteChannel(id: number) {
return requestClient.delete(`/pay/channel/delete?id=${id}`);
}
/** 导出支付渠道 */
export function exportChannel(params: PageParam) {
return requestClient.download('/pay/channel/export-excel', { params });
}

View File

@@ -19,11 +19,6 @@ export namespace DemoOrderApi {
spuId?: number;
createTime?: Date;
}
export interface OrderPageReqVO extends PageParam {
spuId?: number;
createTime?: Date[];
}
}
/** 创建示例订单 */
@@ -32,7 +27,7 @@ export function createDemoOrder(data: DemoOrderApi.Order) {
}
/** 获得示例订单分页 */
export function getDemoOrderPage(params: DemoOrderApi.OrderPageReqVO) {
export function getDemoOrderPage(params: PageParam) {
return requestClient.get<PageResult<DemoOrderApi.Order>>(
'/pay/demo-order/page',
{

View File

@@ -22,18 +22,6 @@ export namespace PayNotifyApi {
updateTime: Date;
logs?: any[];
}
/** 支付通知任务分页请求 */
export interface NotifyTaskPageReqVO extends PageParam {
appId?: number;
type?: number;
dataId?: number;
status?: number;
merchantOrderId?: string;
merchantRefundId?: string;
merchantTransferId?: string;
createTime?: Date[];
}
}
/** 获得支付通知明细 */
@@ -42,7 +30,7 @@ export function getNotifyTaskDetail(id: number) {
}
/** 获得支付通知分页 */
export function getNotifyTaskPage(params: PayNotifyApi.NotifyTaskPageReqVO) {
export function getNotifyTaskPage(params: PageParam) {
return requestClient.get<PageResult<PayNotifyApi.NotifyTask>>(
'/pay/notify/page',
{

View File

@@ -38,21 +38,10 @@ export namespace PayOrderApi {
createTime: Date;
updateTime: Date;
}
/** 支付订单分页请求 */
export interface OrderPageReqVO extends PageParam {
appId?: number;
channelCode?: string;
merchantOrderId?: string;
channelOrderNo?: string;
no?: string;
status?: number;
createTime?: Date[];
}
}
/** 查询支付订单列表 */
export function getOrderPage(params: PayOrderApi.OrderPageReqVO) {
export function getOrderPage(params: PageParam) {
return requestClient.get<PageResult<PayOrderApi.Order>>('/pay/order/page', {
params,
});

View File

@@ -36,39 +36,10 @@ export namespace PayRefundApi {
createTime: Date;
updateTime: Date;
}
/** 退款订单分页请求 */
export interface RefundPageReqVO extends PageParam {
merchantId?: number;
appId?: number;
channelId?: number;
channelCode?: string;
orderId?: string;
tradeNo?: string;
merchantOrderId?: string;
merchantRefundNo?: string;
notifyUrl?: string;
notifyStatus?: number;
status?: number;
type?: number;
payAmount?: number;
refundAmount?: number;
reason?: string;
userIp?: string;
channelOrderNo?: string;
channelRefundNo?: string;
channelErrorCode?: string;
channelErrorMsg?: string;
channelExtras?: string;
expireTime?: Date[];
successTime?: Date[];
notifyTime?: Date[];
createTime?: Date[];
}
}
/** 查询退款订单列表 */
export function getRefundPage(params: PayRefundApi.RefundPageReqVO) {
export function getRefundPage(params: PageParam) {
return requestClient.get<PageResult<PayRefundApi.Refund>>(
'/pay/refund/page',
{

View File

@@ -25,23 +25,10 @@ export namespace PayTransferApi {
notifyUrl: string;
channelNotifyData: string;
}
/** 转账单分页请求 */
export interface TransferPageReqVO extends PageParam {
no?: string;
appId?: number;
channelCode?: string;
merchantOrderId?: string;
status?: number;
userName?: string;
userAccount?: string;
channelTransferNo?: string;
createTime?: Date[];
}
}
/** 查询转账单列表 */
export function getTransferPage(params: PayTransferApi.TransferPageReqVO) {
export function getTransferPage(params: PageParam) {
return requestClient.get<PageResult<PayTransferApi.Transfer>>(
'/pay/transfer/page',
{

View File

@@ -3,11 +3,6 @@ import type { PageParam, PageResult } from '@vben/request';
import { requestClient } from '#/api/request';
export namespace PayWalletApi {
/** 用户钱包查询参数 */
export interface PayWalletUserReq {
userId: number;
}
/** 钱包信息 */
export interface Wallet {
id: number;
@@ -19,32 +14,27 @@ export namespace PayWalletApi {
freezePrice: number;
}
/** 钱包分页请求 */
export interface WalletPageReqVO extends PageParam {
userId?: number;
userType?: number;
balance?: number;
totalExpense?: number;
totalRecharge?: number;
freezePrice?: number;
/** 钱包查询参数 */
export interface WalletUserQueryReqVO {
userId: number;
}
/** 钱包修改余额 */
export interface PayWalletUpdateBalanceReqVO {
export interface WalletUpdateBalanceReqVO {
userId: number;
balance: number;
}
}
/** 查询用户钱包详情 */
export function getWallet(params: PayWalletApi.PayWalletUserReq) {
export function getWallet(params: PayWalletApi.WalletUserQueryReqVO) {
return requestClient.get<PayWalletApi.Wallet>('/pay/wallet/get', {
params,
});
}
/** 查询会员钱包列表 */
export function getWalletPage(params: PayWalletApi.WalletPageReqVO) {
export function getWalletPage(params: PageParam) {
return requestClient.get<PageResult<PayWalletApi.Wallet>>(
'/pay/wallet/page',
{
@@ -55,7 +45,7 @@ export function getWalletPage(params: PayWalletApi.WalletPageReqVO) {
/** 修改会员钱包余额 */
export function updateWalletBalance(
data: PayWalletApi.PayWalletUpdateBalanceReqVO,
data: PayWalletApi.WalletUpdateBalanceReqVO,
) {
return requestClient.put('/pay/wallet/update-balance', data);
}

View File

@@ -1,20 +0,0 @@
export function checkFileType(file: File, accepts: string[]) {
if (!accepts || accepts.length === 0) {
return true;
}
const newTypes = accepts.join('|');
const reg = new RegExp(`${String.raw`\.(` + newTypes})$`, 'i');
return reg.test(file.name);
}
/**
* 默认图片类型
*/
export const defaultImageAccepts = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
export function checkImgType(
file: File,
accepts: string[] = defaultImageAccepts,
) {
return checkFileType(file, accepts);
}

View File

@@ -15,11 +15,16 @@ import { ref, toRefs, watch } from 'vue';
import { IconifyIcon } from '@vben/icons';
import { $t } from '@vben/locales';
import { isFunction, isObject, isString } from '@vben/utils';
import {
defaultImageAccepts,
isFunction,
isImage,
isObject,
isString,
} from '@vben/utils';
import { ElMessage, ElUpload } from 'element-plus';
import { checkImgType, defaultImageAccepts } from './helper';
import { UploadResultStatus } from './typing';
import { useUpload, useUploadType } from './use-upload';
@@ -173,7 +178,7 @@ const handleRemove = async (file: UploadFile) => {
const beforeUpload = async (file: File) => {
const { maxSize, accept } = props;
const isAct = checkImgType(file, accept);
const isAct = isImage(file.name, accept);
if (!isAct) {
ElMessage.error($t('ui.upload.acceptUpload', [accept]));
isActMsg.value = false;

View File

@@ -11,69 +11,69 @@ const routes: RouteRecordRaw[] = [
hideInMenu: true,
},
children: [
// {
// path: 'clue/detail/:id',
// name: 'CrmClueDetail',
// meta: {
// title: '线索详情',
// activePath: '/crm/clue',
// },
// component: () => import('#/views/crm/clue/detail/index.vue'),
// },
// {
// path: 'customer/detail/:id',
// name: 'CrmCustomerDetail',
// meta: {
// title: '客户详情',
// activePath: '/crm/customer',
// },
// component: () => import('#/views/crm/customer/detail/index.vue'),
// },
// {
// path: 'business/detail/:id',
// name: 'CrmBusinessDetail',
// meta: {
// title: '商机详情',
// activePath: '/crm/business',
// },
// component: () => import('#/views/crm/business/detail/index.vue'),
// },
// {
// path: 'contract/detail/:id',
// name: 'CrmContractDetail',
// meta: {
// title: '合同详情',
// activePath: '/crm/contract',
// },
// component: () => import('#/views/crm/contract/detail/index.vue'),
// },
// {
// path: 'receivable-plan/detail/:id',
// name: 'CrmReceivablePlanDetail',
// meta: {
// title: '回款计划详情',
// activePath: '/crm/receivable-plan',
// },
// component: () => import('#/views/crm/receivable/plan/detail/index.vue'),
// },
// {
// path: 'receivable/detail/:id',
// name: 'CrmReceivableDetail',
// meta: {
// title: '回款详情',
// activePath: '/crm/receivable',
// },
// component: () => import('#/views/crm/receivable/detail/index.vue'),
// },
// {
// path: 'contact/detail/:id',
// name: 'CrmContactDetail',
// meta: {
// title: '联系人详情',
// activePath: '/crm/contact',
// },
// component: () => import('#/views/crm/contact/detail/index.vue'),
// },
{
path: 'clue/detail/:id',
name: 'CrmClueDetail',
meta: {
title: '线索详情',
activePath: '/crm/clue',
},
component: () => import('#/views/crm/clue/detail/index.vue'),
},
{
path: 'customer/detail/:id',
name: 'CrmCustomerDetail',
meta: {
title: '客户详情',
activePath: '/crm/customer',
},
component: () => import('#/views/crm/customer/detail/index.vue'),
},
{
path: 'business/detail/:id',
name: 'CrmBusinessDetail',
meta: {
title: '商机详情',
activePath: '/crm/business',
},
component: () => import('#/views/crm/business/detail/index.vue'),
},
{
path: 'contract/detail/:id',
name: 'CrmContractDetail',
meta: {
title: '合同详情',
activePath: '/crm/contract',
},
component: () => import('#/views/crm/contract/detail/index.vue'),
},
{
path: 'receivable-plan/detail/:id',
name: 'CrmReceivablePlanDetail',
meta: {
title: '回款计划详情',
activePath: '/crm/receivable-plan',
},
component: () => import('#/views/crm/receivable/plan/detail/index.vue'),
},
{
path: 'receivable/detail/:id',
name: 'CrmReceivableDetail',
meta: {
title: '回款详情',
activePath: '/crm/receivable',
},
component: () => import('#/views/crm/receivable/detail/index.vue'),
},
{
path: 'contact/detail/:id',
name: 'CrmContactDetail',
meta: {
title: '联系人详情',
activePath: '/crm/contact',
},
component: () => import('#/views/crm/contact/detail/index.vue'),
},
{
path: 'product/detail/:id',
name: 'CrmProductDetail',
@@ -83,6 +83,54 @@ const routes: RouteRecordRaw[] = [
},
component: () => import('#/views/crm/product/detail/index.vue'),
},
{
path: 'statistics/customer',
name: 'CrmStatisticsCustomer',
meta: {
title: '客户统计',
activePath: '/crm/statistics/customer',
},
component: () =>
import('#/views/crm/statistics/customer/index.vue'),
},
{
path: 'statistics/funnel',
name: 'CrmStatisticsFunnel',
meta: {
title: '销售漏斗',
activePath: '/crm/statistics/funnel',
},
component: () => import('#/views/crm/statistics/funnel/index.vue'),
},
{
path: 'statistics/performance',
name: 'CrmStatisticsPerformance',
meta: {
title: '员工业绩',
activePath: '/crm/statistics/performance',
},
component: () =>
import('#/views/crm/statistics/performance/index.vue'),
},
{
path: 'statistics/portrait',
name: 'CrmStatisticsPortrait',
meta: {
title: '客户画像',
activePath: '/crm/statistics/portrait',
},
component: () =>
import('#/views/crm/statistics/portrait/index.vue'),
},
{
path: 'statistics/rank',
name: 'CrmStatisticsRank',
meta: {
title: '排行榜',
activePath: '/crm/statistics/rank',
},
component: () => import('#/views/crm/statistics/rank/index.vue'),
},
],
},
];

View File

@@ -42,10 +42,11 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'InputNumber',
componentProps: {
placeholder: '请输入温度参数',
class: 'w-full',
precision: 2,
min: 0,
max: 2,
controlsPosition: 'right',
class: '!w-full',
},
rules: 'required',
},
@@ -55,9 +56,10 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'InputNumber',
componentProps: {
placeholder: '请输入回复数 Token 数',
class: 'w-full',
min: 0,
max: 8192,
controlsPosition: 'right',
class: '!w-full',
},
rules: 'required',
},
@@ -67,9 +69,10 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'InputNumber',
componentProps: {
placeholder: '请输入上下文数量',
class: 'w-full',
min: 0,
max: 20,
controlsPosition: 'right',
class: '!w-full',
},
rules: 'required',
},

View File

@@ -547,7 +547,10 @@ onMounted(async () => {
<template>
<Page auto-content-height>
<ElContainer class="absolute left-0 top-0 m-4 h-full w-full flex-1">
<ElContainer
direction="horizontal"
class="absolute left-0 top-0 m-4 h-full w-full flex-1"
>
<!-- 左侧对话列表 -->
<ConversationList
class="!bg-card"
@@ -560,7 +563,7 @@ onMounted(async () => {
/>
<!-- 右侧详情部分 -->
<ElContainer class="bg-card mx-4">
<ElContainer direction="vertical" class="bg-card mx-4 flex-1">
<ElHeader
class="!bg-card border-border flex !h-12 items-center justify-between border-b !px-4"
>
@@ -571,30 +574,30 @@ onMounted(async () => {
</span>
</div>
<div class="flex w-72 justify-end" v-if="activeConversation">
<div class="flex w-72 justify-end gap-2" v-if="activeConversation">
<ElButton
type="primary"
plain
class="mr-2 px-2"
class="!px-2"
size="small"
@click="openChatConversationUpdateForm"
>
<span v-html="activeConversation?.modelName"></span>
<IconifyIcon icon="lucide:settings" class="ml-2 size-4" />
<IconifyIcon icon="lucide:settings" class="!ml-2 size-4" />
</ElButton>
<ElButton
size="small"
class="mr-2 px-2"
class="!ml-0 !px-2"
@click="handlerMessageClear"
>
<IconifyIcon icon="lucide:trash-2" color="#787878" />
</ElButton>
<ElButton size="small" class="mr-2 px-2">
<ElButton size="small" class="!ml-0 !px-2">
<IconifyIcon icon="lucide:download" color="#787878" />
</ElButton>
<ElButton
size="small"
class="mr-2 px-2"
class="!ml-0 !px-2"
@click="handleGoTopMessage"
>
<IconifyIcon icon="lucide:arrow-up" color="#787878" />
@@ -629,7 +632,7 @@ onMounted(async () => {
</div>
</ElMain>
<ElFooter class="!bg-card flex flex-col !p-0">
<ElFooter height="auto" class="!bg-card flex flex-col !p-0">
<form
class="border-border mx-4 mb-8 mt-2 flex flex-col rounded-xl border p-2"
>
@@ -673,7 +676,8 @@ onMounted(async () => {
{{ conversationInProgress ? '进行中' : '发送' }}
</ElButton>
<ElButton
type="danger"
type="primary"
:danger="true"
@click="stopStream()"
v-if="conversationInProgress === true"
>

View File

@@ -166,232 +166,277 @@ async function getConversationGroupByCreateTime(
return groupMap;
}
/** 新建对话 */
async function handleConversationCreate() {
// 1. 创建对话
const conversationId = await createChatConversationMy({
roleId: undefined,
} as unknown as AiChatConversationApi.ChatConversation);
// 2. 刷新列表
async function createConversation() {
// 1. 新建对话
const conversationId = await createChatConversationMy(
{} as unknown as AiChatConversationApi.ChatConversation,
);
// 2. 获取对话内容
await getChatConversationList();
// 3. 选中对话
await handleConversationClick(conversationId);
// 4. 回调
emits('onConversationCreate');
}
// 3. 回调
emits('onConversationCreate', conversationId);
/** 修改对话的标题 */
async function updateConversationTitle(
conversation: AiChatConversationApi.ChatConversation,
) {
// 1. 二次确认
await prompt({
async beforeClose(scope) {
if (scope.isConfirm) {
if (scope.value) {
try {
// 2. 发起修改
await updateChatConversationMy({
id: conversation.id,
title: scope.value,
} as AiChatConversationApi.ChatConversation);
ElMessage.success('重命名成功');
// 3. 刷新列表
await getChatConversationList();
// 4. 过滤当前切换的
const filterConversationList = conversationList.value.filter(
(item) => {
return item.id === conversation.id;
},
);
if (
filterConversationList.length > 0 &&
filterConversationList[0] && // tip避免切换对话
activeConversationId.value === filterConversationList[0].id!
) {
emits('onConversationClick', filterConversationList[0]);
}
} catch {
return false;
}
} else {
ElMessage.error('请输入标题');
return false;
}
}
},
component: () => {
return h(ElInput, {
placeholder: '请输入标题',
clearable: true,
modelValue: conversation.title,
});
},
content: '请输入标题',
title: '修改标题',
modelPropName: 'modelValue',
});
}
/** 删除聊天对话 */
async function deleteChatConversation(
conversation: AiChatConversationApi.ChatConversation,
) {
// 删除的二次确认
await confirm(`是否确认删除对话 - ${conversation.title}?`);
// 发起删除
await deleteChatConversationMy(conversation.id);
ElMessage.success('对话已删除');
// 刷新列表
await getChatConversationList();
// 回调
emits('onConversationDelete', conversation);
}
/** 清空未置顶的对话 */
async function handleConversationClear() {
await confirm({
title: '清空未置顶的对话',
content: h('div', {}, [
h('p', '确认清空未置顶的对话吗?'),
h('p', '清空后,未置顶的对话将被删除,无法恢复!'),
]),
});
// 清空
async function handleClearConversation() {
await confirm('确认后对话会全部清空,置顶的对话除外。');
await deleteChatConversationMyByUnpinned();
// 刷新列表
ElMessage.success($t('ui.actionMessage.operationSuccess'));
// 清空对话、对话内容
activeConversationId.value = null;
// 获取对话列表
await getChatConversationList();
// 回调
// 回调 方法
emits('onConversationClear');
}
/** 删除对话 */
async function handleConversationDelete(id: number) {
await confirm({
title: '删除对话',
content: h('div', {}, [
h('p', '确认删除该对话吗?'),
h('p', '删除后,该对话将被删除,无法恢复!'),
]),
});
// 删除
await deleteChatConversationMy(id);
// 刷新列表
await getChatConversationList();
// 回调
emits('onConversationDelete', id);
}
/** 置顶对话 */
async function handleConversationPin(conversation: any) {
// 更新
await updateChatConversationMy({
id: conversation.id,
pinned: !conversation.pinned,
} as AiChatConversationApi.ChatConversation);
// 刷新列表
/** 对话置顶 */
async function handleTop(conversation: AiChatConversationApi.ChatConversation) {
// 更新对话置顶
conversation.pinned = !conversation.pinned;
await updateChatConversationMy(conversation);
// 刷新对话
await getChatConversationList();
}
/** 编辑对话 */
async function handleConversationEdit(conversation: any) {
const title = await prompt({
title: '编辑对话',
content: '请输入对话标题',
defaultValue: conversation.title,
});
// 更新
await updateChatConversationMy({
id: conversation.id,
title,
} as AiChatConversationApi.ChatConversation);
// 刷新列表
await getChatConversationList();
// 提示
ElMessage.success($t('ui.actionMessage.operationSuccess'));
}
// ============ 角色仓库 ============
/** 打开角色仓库 */
async function handleRoleRepositoryOpen() {
/** 角色仓库抽屉 */
const handleRoleRepository = async () => {
drawerApi.open();
}
/** 监听 activeId 变化 */
watch(
() => props.activeId,
(newValue) => {
activeConversationId.value = newValue;
},
);
};
/** 监听选中的对话 */
const { activeId } = toRefs(props);
watch(activeId, async (newValue) => {
activeConversationId.value = newValue;
});
defineExpose({ createConversation });
/** 初始化 */
onMounted(async () => {
// 获取对话列表
// 获取 对话列表
await getChatConversationList();
// 设置选中的对话
if (activeId.value) {
activeConversationId.value = activeId.value;
// 默认选中
if (props.activeId) {
activeConversationId.value = props.activeId;
} else {
// 首次默认选中第一个
if (conversationList.value.length > 0 && conversationList.value[0]) {
activeConversationId.value = conversationList.value[0].id;
// 回调 onConversationClick
emits('onConversationClick', conversationList.value[0]);
}
}
});
defineExpose({ getChatConversationList });
</script>
<template>
<ElAside
class="bg-card relative flex h-full flex-col overflow-hidden border-r border-gray-200"
width="280px"
class="relative flex h-full flex-col justify-between overflow-hidden p-4"
>
<Drawer />
<!-- 头部 -->
<div class="flex flex-col p-4">
<div class="mb-4 flex flex-row items-center justify-between">
<div class="text-lg font-bold">对话</div>
<div class="flex flex-row">
<ElButton
class="flex items-center bg-transparent px-1.5 hover:bg-gray-100"
text
@click="handleConversationCreate"
>
<IconifyIcon icon="lucide:plus" />
</ElButton>
<ElButton
class="flex items-center bg-transparent px-1.5 hover:bg-gray-100"
text
@click="handleConversationClear"
>
<IconifyIcon icon="lucide:trash" />
</ElButton>
<ElButton
class="flex items-center bg-transparent px-1.5 hover:bg-gray-100"
text
@click="handleRoleRepositoryOpen"
>
<IconifyIcon icon="lucide:user" />
</ElButton>
</div>
</div>
<!-- 左顶部对话 -->
<div class="flex h-full flex-col">
<ElButton class="h-9 w-full" type="primary" @click="createConversation">
<IconifyIcon icon="lucide:plus" class="mr-1" />
新建对话
</ElButton>
<ElInput
v-model="searchName"
placeholder="搜索对话"
@keyup.enter="searchConversation"
size="large"
class="search-input mt-4"
placeholder="搜索历史记录"
@keyup="searchConversation"
>
<template #suffix>
<template #prefix>
<IconifyIcon icon="lucide:search" />
</template>
</ElInput>
</div>
<!-- 对话列表 -->
<div class="flex-1 overflow-y-auto px-4">
<div v-if="loading" class="flex h-full items-center justify-center">
<div class="text-sm text-gray-400">加载中...</div>
</div>
<div v-else-if="Object.keys(conversationMap).length === 0">
<ElEmpty description="暂无对话" />
</div>
<div v-else>
<!-- 左中间对话列表 -->
<div class="mt-2 flex-1 overflow-auto">
<!-- 情况一加载中 -->
<ElEmpty v-if="loading" description="." v-loading="loading" />
<!-- 情况二按照 group 分组 -->
<div
v-for="(conversations, groupName) in conversationMap"
:key="groupName"
v-for="conversationKey in Object.keys(conversationMap)"
:key="conversationKey"
>
<div
v-if="conversations.length > 0"
class="mb-2 mt-4 text-xs text-gray-400"
v-if="conversationMap[conversationKey].length > 0"
class="classify-title pt-2"
>
{{ groupName }}
<p class="mx-1">
{{ conversationKey }}
</p>
</div>
<div
v-for="conversation in conversations"
v-for="conversation in conversationMap[conversationKey]"
:key="conversation.id"
class="group relative mb-2 cursor-pointer rounded-lg p-2 transition-all hover:bg-gray-100"
:class="{
'bg-gray-100': activeConversationId === conversation.id,
}"
@click="handleConversationClick(conversation.id)"
@mouseenter="hoverConversationId = conversation.id"
@mouseleave="hoverConversationId = null"
@mouseover="hoverConversationId = conversation.id"
@mouseout="hoverConversationId = null"
class="mt-1"
>
<div class="flex items-center">
<ElAvatar
v-if="conversation.roleAvatar"
:src="conversation.roleAvatar"
:size="28"
/>
<SvgGptIcon v-else class="size-7" />
<div class="ml-2 flex-1 overflow-hidden">
<div class="truncate text-sm font-medium">
<div
class="mb-2 flex cursor-pointer flex-row items-center justify-between rounded-lg px-2 leading-10 transition-colors hover:bg-gray-100 dark:hover:bg-gray-800"
:class="[
conversation.id === activeConversationId
? 'bg-primary/10 dark:bg-primary/20'
: '',
]"
>
<div class="flex items-center">
<ElAvatar
v-if="conversation.roleAvatar"
:src="conversation.roleAvatar"
:size="28"
/>
<SvgGptIcon v-else class="size-6" />
<span
class="max-w-32 overflow-hidden text-ellipsis whitespace-nowrap p-2 text-sm font-normal"
>
{{ conversation.title }}
</div>
</span>
</div>
<div
v-if="hoverConversationId === conversation.id"
class="flex flex-row"
v-show="hoverConversationId === conversation.id"
class="relative right-0.5 flex items-center text-gray-400"
>
<!-- TODO @AI三个按钮之间间隙太大了 -->
<ElButton
class="flex items-center bg-transparent px-1.5 hover:bg-gray-100"
text
@click.stop="handleConversationPin(conversation)"
class="mr-0 px-1"
link
@click.stop="handleTop(conversation)"
>
<IconifyIcon
:icon="
conversation.pinned ? 'lucide:pin-off' : 'lucide:pin'
"
v-if="!conversation.pinned"
icon="lucide:arrow-up-to-line"
/>
<IconifyIcon
v-if="conversation.pinned"
icon="lucide:arrow-down-from-line"
/>
</ElButton>
<ElButton
class="flex items-center bg-transparent px-1.5 hover:bg-gray-100"
text
@click.stop="handleConversationEdit(conversation)"
class="mr-0 px-1"
link
@click.stop="updateConversationTitle(conversation)"
>
<IconifyIcon icon="lucide:edit" />
</ElButton>
<ElButton
class="flex items-center bg-transparent px-1.5 hover:bg-gray-100"
text
@click.stop="handleConversationDelete(conversation.id)"
class="mr-0 px-1"
link
@click.stop="deleteChatConversation(conversation)"
>
<IconifyIcon icon="lucide:trash" />
<IconifyIcon icon="lucide:trash-2" />
</ElButton>
</div>
</div>
</div>
</div>
</div>
<!-- 底部占位 -->
<div class="h-12 w-full"></div>
</div>
<!-- 左底部工具栏 -->
<div
class="bg-card absolute bottom-1 left-0 right-0 mb-4 flex items-center justify-between px-5 leading-9 text-gray-400 shadow-sm"
>
<div
class="flex cursor-pointer items-center text-gray-400"
@click="handleRoleRepository"
>
<IconifyIcon icon="lucide:user" />
<span class="ml-1">角色仓库</span>
</div>
<div
class="flex cursor-pointer items-center text-gray-400"
@click="handleClearConversation"
>
<IconifyIcon icon="lucide:trash" />
<span class="ml-1">清空未置顶对话</span>
</div>
</div>
</ElAside>
</template>

View File

@@ -18,11 +18,9 @@ async function handlerPromptClick(prompt: any) {
</script>
<template>
<div class="relative flex h-full w-full flex-row justify-center">
<!-- center-container -->
<div class="flex flex-col justify-center">
<!-- title -->
<div class="text-center text-3xl font-bold">芋道 AI</div>
<!-- role-list -->
<div class="mt-5 flex w-96 flex-wrap items-center justify-center">
<div

View File

@@ -37,7 +37,7 @@ const emits = defineEmits(['onDeleteSuccess', 'onRefresh', 'onEdit']);
const { copy } = useClipboard(); // 初始化 copy 到粘贴板
const userStore = useUserStore();
// 判断"消息列表"滚动的位置(用于判断是否需要滚动到消息最下方)
// 判断消息列表滚动的位置(用于判断是否需要滚动到消息最下方)
const messageContainer: any = ref(null);
const isScrolling = ref(false); // 用于判断用户是否在滚动
@@ -88,6 +88,7 @@ async function copyContent(content: string) {
await copy(content);
ElMessage.success('复制成功!');
}
/** 删除 */
async function handleDelete(id: number) {
// 删除 message
@@ -153,7 +154,7 @@ onMounted(async () => {
</div>
<div class="mt-2 flex flex-row">
<ElButton
class="flex items-center bg-transparent px-1.5 hover:bg-gray-100"
class="!ml-1 flex items-center bg-transparent !px-1.5 hover:bg-gray-100"
text
@click="copyContent(item.content)"
>
@@ -161,7 +162,7 @@ onMounted(async () => {
</ElButton>
<ElButton
v-if="item.id > 0"
class="flex items-center bg-transparent px-1.5 hover:bg-gray-100"
class="!ml-1 flex items-center bg-transparent !px-1.5 hover:bg-gray-100"
text
@click="handleDelete(item.id)"
>
@@ -196,28 +197,28 @@ onMounted(async () => {
</div>
<div class="mt-2 flex flex-row-reverse">
<ElButton
class="flex items-center bg-transparent px-1.5 hover:bg-gray-100"
class="!ml-1 flex items-center bg-transparent !px-1.5 hover:bg-gray-100"
text
@click="copyContent(item.content)"
>
<IconifyIcon icon="lucide:copy" />
</ElButton>
<ElButton
class="flex items-center bg-transparent px-1.5 hover:bg-gray-100"
class="!ml-1 flex items-center bg-transparent !px-1.5 hover:bg-gray-100"
text
@click="handleDelete(item.id)"
>
<IconifyIcon icon="lucide:trash" />
</ElButton>
<ElButton
class="flex items-center bg-transparent px-1.5 hover:bg-gray-100"
class="!ml-1 flex items-center bg-transparent !px-1.5 hover:bg-gray-100"
text
@click="handleRefresh(item)"
>
<IconifyIcon icon="lucide:refresh-cw" />
</ElButton>
<ElButton
class="flex items-center bg-transparent px-1.5 hover:bg-gray-100"
class="!ml-1 flex items-center bg-transparent !px-1.5 hover:bg-gray-100"
text
@click="handleEdit(item)"
>

View File

@@ -71,12 +71,15 @@ function toggleExpanded() {
.scrollbar-thin::-webkit-scrollbar {
width: 4px;
}
.scrollbar-thin::-webkit-scrollbar-track {
background: transparent;
}
.scrollbar-thin::-webkit-scrollbar-thumb {
@apply rounded-sm bg-gray-400/40;
}
.scrollbar-thin::-webkit-scrollbar-thumb:hover {
@apply bg-gray-400/60;
}

View File

@@ -24,7 +24,7 @@ async function handleCategoryClick(category: string) {
</script>
<template>
<div class="flex flex-wrap items-center">
<div class="mx-0 flex flex-wrap items-center">
<div
class="mr-2 flex flex-row"
v-for="category in categoryList"

View File

@@ -63,59 +63,59 @@ async function handleTabsScroll() {
<template>
<div
class="relative flex h-full flex-wrap content-start items-start overflow-auto px-6 pb-36"
class="relative flex h-full flex-wrap content-start items-start overflow-auto pb-36"
ref="tabsRef"
@scroll="handleTabsScroll"
>
<div class="mb-5 mr-5 inline-block" v-for="role in roleList" :key="role.id">
<div class="mb-3 mr-3 inline-block" v-for="role in roleList" :key="role.id">
<ElCard
class="relative rounded-lg"
body-style="position: relative; display: flex; flex-direction: row; justify-content: flex-start; width: 240px; max-width: 240px; padding: 15px 15px 10px;"
body-style="position: relative; display: flex; flex-direction: column; justify-content: flex-start; width: 240px; max-width: 240px; padding: 15px;"
>
<!-- 更多操作 -->
<div v-if="showMore" class="absolute right-2 top-0">
<ElDropdown>
<ElButton link>
<IconifyIcon icon="lucide:ellipsis-vertical" />
<!-- 头部头像名称 -->
<div class="flex items-center justify-between">
<div class="flex min-w-0 flex-1 items-center">
<ElAvatar
:src="role.avatar"
class="h-8 w-8 flex-shrink-0 overflow-hidden"
/>
<div class="ml-2 truncate text-base font-medium">
{{ role.name }}
</div>
</div>
</div>
<!-- 描述信息 -->
<div
class="mt-2 line-clamp-2 h-10 overflow-hidden text-sm text-gray-600"
>
{{ role.description }}
</div>
<!-- 底部操作按钮 -->
<div class="flex items-center justify-end gap-2">
<ElDropdown v-if="showMore">
<ElButton size="small">
<IconifyIcon icon="lucide:ellipsis" />
</ElButton>
<template #dropdown>
<ElDropdownMenu>
<ElDropdownItem @click="handleMoreClick('edit', role)">
<div class="flex items-center">
<IconifyIcon icon="lucide:edit" color="#787878" />
<span class="text-primary">编辑</span>
</div>
</ElDropdownItem>
<ElDropdownItem @click="handleMoreClick('delete', role)">
<div class="flex items-center">
<IconifyIcon icon="lucide:trash" color="red" />
<span class="text-red-500">删除</span>
<span class="ml-2 text-red-500">删除</span>
</div>
</ElDropdownItem>
<ElDropdownItem @click="handleMoreClick('edit', role)">
<div class="flex items-center">
<IconifyIcon icon="lucide:edit" color="#787878" />
<span class="text-primary ml-2">编辑</span>
</div>
</ElDropdownItem>
</ElDropdownMenu>
</template>
</ElDropdown>
</div>
<!-- 角色信息 -->
<div>
<ElAvatar :src="role.avatar" class="h-10 w-10 overflow-hidden" />
</div>
<div class="ml-2 w-4/5">
<div class="h-20">
<div class="max-w-32 text-lg font-bold">
{{ role.name }}
</div>
<div class="mt-2 text-sm">
{{ role.description }}
</div>
</div>
<div class="mt-1 flex flex-row-reverse">
<ElButton type="primary" size="small" @click="handleUseClick(role)">
使用
</ElButton>
</div>
<ElButton type="primary" size="small" @click="handleUseClick(role)">
使用
</ElButton>
</div>
</ElCard>
</div>

View File

@@ -119,6 +119,7 @@ async function handlerCategoryClick(category: string) {
async function handlerAddRole() {
formModalApi.setData({ formType: 'my-create' }).open();
}
/** 编辑角色 */
async function handlerCardEdit(role: any) {
formModalApi.setData({ formType: 'my-update', id: role.id }).open();
@@ -187,7 +188,7 @@ onMounted(async () => {
<FormModal @success="handlerAddRoleSuccess" />
<ElMain class="relative m-0 flex-1 overflow-hidden p-0">
<div class="z-100 absolute right-0 top--1 mr-5 mt-5">
<div class="z-100 absolute right-5 top-5 flex items-center">
<!-- 搜索输入框 -->
<ElInput
v-model="search"
@@ -196,7 +197,11 @@ onMounted(async () => {
@keyup.enter="getActiveTabsRole"
>
<template #suffix>
<IconifyIcon icon="lucide:search" />
<IconifyIcon
icon="lucide:search"
class="cursor-pointer"
@click="getActiveTabsRole"
/>
</template>
</ElInput>
<ElButton
@@ -209,11 +214,10 @@ onMounted(async () => {
添加角色
</ElButton>
</div>
<!-- 标签页内容 -->
<ElTabs
v-model="activeTab"
class="relative h-full p-4"
class="relative h-full pb-4 pr-4"
@tab-click="handleTabsClick"
>
<ElTabPane
@@ -229,10 +233,8 @@ onMounted(async () => {
@on-edit="handlerCardEdit"
@on-use="handlerCardUse"
@on-page="handlerCardPage('my')"
class="mt-5"
/>
</ElTabPane>
<ElTabPane
name="public-role"
class="flex h-full flex-col overflow-y-auto"

View File

@@ -69,7 +69,7 @@ async function handleGenerateImage() {
width: width.value, // 图片宽度
height: height.value, // 图片高度
options: {},
} as unknown as AiImageApi.ImageDrawReq;
} as unknown as AiImageApi.ImageDrawReqVO;
await drawImage(form);
} finally {
// 回调

View File

@@ -116,7 +116,7 @@ async function handleGenerateImage() {
options: {
style: style.value, // 图像生成的风格
},
} as AiImageApi.ImageDrawReq;
} as AiImageApi.ImageDrawReqVO;
// 发送请求
await drawImage(form);
} finally {

View File

@@ -144,7 +144,7 @@ async function handleImageMidjourneyButtonClick(
const data = {
id: imageDetail.id,
customId: button.customId,
} as AiImageApi.ImageMidjourneyAction;
} as AiImageApi.ImageMidjourneyActionVO;
// 2. 发送 action
await midjourneyAction(data);
// 3. 刷新列表

View File

@@ -103,7 +103,7 @@ async function handleGenerateImage() {
height: imageSize.height,
version: selectVersion.value,
referImageUrl: referImageUrl.value,
} as AiImageApi.ImageMidjourneyImagineReq;
} as AiImageApi.ImageMidjourneyImagineReqVO;
await midjourneyImagine(req);
} finally {
// 回调

View File

@@ -103,7 +103,7 @@ async function handleGenerateImage() {
clipGuidancePreset: clipGuidancePreset.value, // 文本提示相匹配的图像 CLIP
stylePreset: stylePreset.value, // 风格
},
} as unknown as AiImageApi.ImageDrawReq;
} as unknown as AiImageApi.ImageDrawReqVO;
await drawImage(form);
} finally {
// 回调

View File

@@ -189,11 +189,17 @@ export function useGridFormSchema(): VbenFormSchema[] {
fieldName: 'name',
label: '角色名称',
component: 'Input',
componentProps: {
placeholder: '请输入角色名称',
},
},
{
fieldName: 'category',
label: '角色类别',
component: 'Input',
componentProps: {
placeholder: '请输入角色类别',
},
},
{
fieldName: 'publicStatus',

View File

@@ -105,10 +105,10 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'InputNumber',
componentProps: {
placeholder: '请输入温度参数',
controlsPosition: 'right',
class: '!w-full',
min: 0,
max: 2,
controlsPosition: 'right',
class: '!w-full',
},
dependencies: {
triggerFields: ['type'],

View File

@@ -14,7 +14,7 @@ import { useGridColumns, useGridFormSchema } from './data';
defineOptions({ name: 'BpmCopyTask' });
/** 任务详情 */
function handleDetail(row: BpmProcessInstanceApi.Copy) {
function handleDetail(row: BpmProcessInstanceApi.ProcessInstanceCopyRespVO) {
const query = {
id: row.processInstanceId,
...(row.activityId && { activityId: row.activityId }),
@@ -52,7 +52,7 @@ const [Grid] = useVbenVxeGrid({
refresh: true,
search: true,
},
} as VxeTableGridOptions<BpmProcessInstanceApi.Copy>,
} as VxeTableGridOptions<BpmProcessInstanceApi.ProcessInstanceCopyRespVO>,
});
</script>

View File

@@ -49,7 +49,7 @@ const [Grid] = useVbenVxeGrid({
refresh: true,
search: true,
},
} as VxeTableGridOptions<BpmTaskApi.TaskManager>,
} as VxeTableGridOptions<BpmTaskApi.Task>,
});
</script>

View File

@@ -0,0 +1,102 @@
import type { Ref } from 'vue';
export interface LeftSideItem {
name: string;
menu: string;
count: Ref<number>;
}
/** 跟进状态 */
export const FOLLOWUP_STATUS = [
{ label: '待跟进', value: false },
{ label: '已跟进', value: true },
];
/** 归属范围 */
export const SCENE_TYPES = [
{ label: '我负责的', value: 1 },
{ label: '我参与的', value: 2 },
{ label: '下属负责的', value: 3 },
];
/** 联系状态 */
export const CONTACT_STATUS = [
{ label: '今日需联系', value: 1 },
{ label: '已逾期', value: 2 },
{ label: '已联系', value: 3 },
];
/** 审批状态 */
export const AUDIT_STATUS = [
{ label: '待审批', value: 10 },
{ label: '审核通过', value: 20 },
{ label: '审核不通过', value: 30 },
];
/** 回款提醒类型 */
export const RECEIVABLE_REMIND_TYPE = [
{ label: '待回款', value: 1 },
{ label: '已逾期', value: 2 },
{ label: '已回款', value: 3 },
];
/** 合同过期状态 */
export const CONTRACT_EXPIRY_TYPE = [
{ label: '即将过期', value: 1 },
{ label: '已过期', value: 2 },
];
/** 左侧菜单 */
export const useLeftSides = (
customerTodayContactCount: Ref<number>,
clueFollowCount: Ref<number>,
customerFollowCount: Ref<number>,
customerPutPoolRemindCount: Ref<number>,
contractAuditCount: Ref<number>,
contractRemindCount: Ref<number>,
receivableAuditCount: Ref<number>,
receivablePlanRemindCount: Ref<number>,
): LeftSideItem[] => {
return [
{
name: '今日需联系客户',
menu: 'customerTodayContact',
count: customerTodayContactCount,
},
{
name: '分配给我的线索',
menu: 'clueFollow',
count: clueFollowCount,
},
{
name: '分配给我的客户',
menu: 'customerFollow',
count: customerFollowCount,
},
{
name: '待进入公海的客户',
menu: 'customerPutPoolRemind',
count: customerPutPoolRemindCount,
},
{
name: '待审核合同',
menu: 'contractAudit',
count: contractAuditCount,
},
{
name: '待审核回款',
menu: 'receivableAudit',
count: receivableAuditCount,
},
{
name: '待回款提醒',
menu: 'receivablePlanRemind',
count: receivablePlanRemindCount,
},
{
name: '即将到期的合同',
menu: 'contractRemind',
count: contractRemindCount,
},
];
};

View File

@@ -0,0 +1,115 @@
<script lang="ts" setup>
import { computed, onActivated, onMounted, ref } from 'vue';
import { Page } from '@vben/common-ui';
import { ElBadge, ElCard } from 'element-plus';
import { getFollowClueCount } from '#/api/crm/clue';
import {
getAuditContractCount,
getRemindContractCount,
} from '#/api/crm/contract';
import {
getFollowCustomerCount,
getPutPoolRemindCustomerCount,
getTodayContactCustomerCount,
} from '#/api/crm/customer';
import { getAuditReceivableCount } from '#/api/crm/receivable';
import { getReceivablePlanRemindCount } from '#/api/crm/receivable/plan';
import { useLeftSides } from './data';
import ClueFollowList from './modules/clue-follow-list.vue';
import ContractAuditList from './modules/contract-audit-list.vue';
import ContractRemindList from './modules/contract-remind-list.vue';
import CustomerFollowList from './modules/customer-follow-list.vue';
import CustomerPutPoolRemindList from './modules/customer-put-pool-remind-list.vue';
import CustomerTodayContactList from './modules/customer-today-contact-list.vue';
import ReceivableAuditList from './modules/receivable-audit-list.vue';
import ReceivablePlanRemindList from './modules/receivable-plan-remind-list.vue';
const leftMenu = ref('customerTodayContact');
const clueFollowCount = ref(0);
const customerFollowCount = ref(0);
const customerPutPoolRemindCount = ref(0);
const customerTodayContactCount = ref(0);
const contractAuditCount = ref(0);
const contractRemindCount = ref(0);
const receivableAuditCount = ref(0);
const receivablePlanRemindCount = ref(0);
const leftSides = useLeftSides(
customerTodayContactCount,
clueFollowCount,
customerFollowCount,
customerPutPoolRemindCount,
contractAuditCount,
contractRemindCount,
receivableAuditCount,
receivablePlanRemindCount,
);
const currentComponent = computed(() => {
const components = {
customerTodayContact: CustomerTodayContactList,
clueFollow: ClueFollowList,
contractAudit: ContractAuditList,
receivableAudit: ReceivableAuditList,
contractRemind: ContractRemindList,
customerFollow: CustomerFollowList,
customerPutPoolRemind: CustomerPutPoolRemindList,
receivablePlanRemind: ReceivablePlanRemindList,
} as const;
return components[leftMenu.value as keyof typeof components];
});
/** 侧边点击 */
function sideClick(item: { menu: string }) {
leftMenu.value = item.menu;
}
/** 获取数量 */
async function getCount() {
customerTodayContactCount.value = await getTodayContactCustomerCount();
customerPutPoolRemindCount.value = await getPutPoolRemindCustomerCount();
customerFollowCount.value = await getFollowCustomerCount();
clueFollowCount.value = await getFollowClueCount();
contractAuditCount.value = await getAuditContractCount();
contractRemindCount.value = await getRemindContractCount();
receivableAuditCount.value = await getAuditReceivableCount();
receivablePlanRemindCount.value = await getReceivablePlanRemindCount();
}
/** 激活时 */
onActivated(() => {
getCount();
});
/** 初始化 */
onMounted(() => {
getCount();
});
</script>
<template>
<Page auto-content-height>
<div class="flex h-full w-full">
<ElCard class="w-1/5">
<div v-for="item in leftSides" :key="item.menu">
<div
class="flex cursor-pointer items-center justify-between border-b px-4 py-3 hover:bg-gray-100 dark:hover:bg-gray-700"
@click="sideClick(item)"
>
<div>{{ item.name }}</div>
<ElBadge
v-if="item.count.value > 0"
:value="item.count.value"
:type="item.menu === leftMenu ? 'primary' : 'danger'"
/>
</div>
</div>
</ElCard>
<component class="ml-4 w-4/5" :is="currentComponent" />
</div>
</Page>
</template>

View File

@@ -0,0 +1,79 @@
<!-- 分配给我的线索 -->
<script lang="ts" setup>
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { CrmClueApi } from '#/api/crm/clue';
import { useRouter } from 'vue-router';
import { ElButton } from 'element-plus';
import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { getCluePage } from '#/api/crm/clue';
import { useGridColumns } from '#/views/crm/clue/data';
import { FOLLOWUP_STATUS } from '../data';
const { push } = useRouter();
/** 打开线索详情 */
function handleDetail(row: CrmClueApi.Clue) {
push({ name: 'CrmClueDetail', params: { id: row.id } });
}
const [Grid] = useVbenVxeGrid({
formOptions: {
schema: [
{
fieldName: 'followUpStatus',
label: '状态',
component: 'RadioGroup',
componentProps: {
allowClear: true,
options: FOLLOWUP_STATUS,
},
defaultValue: false,
},
],
},
gridOptions: {
columns: useGridColumns(),
height: 'auto',
keepSource: true,
proxyConfig: {
ajax: {
query: async ({ page }, formValues) => {
return await getCluePage({
pageNo: page.currentPage,
pageSize: page.pageSize,
transformStatus: false,
...formValues,
});
},
},
},
rowConfig: {
keyField: 'id',
isHover: true,
},
toolbarConfig: {
refresh: true,
search: true,
},
} as VxeTableGridOptions<CrmClueApi.Clue>,
});
</script>
<template>
<Grid>
<template #name="{ row }">
<ElButton type="primary" link @click="handleDetail(row)">
{{ row.name }}
</ElButton>
</template>
<template #actions="{ row }">
<ElButton type="primary" link @click="handleDetail(row)">
查看详情
</ElButton>
</template>
</Grid>
</template>

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