diff --git a/src/api/cms/customerLead/index.ts b/src/api/cms/customerLead/index.ts new file mode 100644 index 0000000..3d32369 --- /dev/null +++ b/src/api/cms/customerLead/index.ts @@ -0,0 +1,208 @@ +import request from '@/utils/request'; +import type { ApiResult, PageResult } from '@/api'; +import { + CustomerLead, + CustomerLeadParam, + LeadDispatchParam, + LeadFollowParam, + LeadDispatch, + LeadFollowLog, + LeadStatistics, + SalesmanStats +} from './model'; +import { MODULES_API_URL } from '@/config/setting'; + +/** + * 分页查询客资列表 + */ +export async function pageCustomerLead(params: CustomerLeadParam) { + const res = await request.get>>( + MODULES_API_URL + '/customer/lead/page', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 获取客资详情 + */ +export async function getCustomerLeadDetail(leadId: number) { + const res = await request.get>( + MODULES_API_URL + '/customer/lead/detail/' + leadId + ); + if (res.data.code === 0 && res.data.data) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 创建客资(管理员录入) + */ +export async function createCustomerLead(data: CustomerLead) { + const res = await request.post>( + MODULES_API_URL + '/customer/lead/create', + data + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 更新客资信息 + */ +export async function updateCustomerLead(data: CustomerLead) { + const res = await request.put>( + MODULES_API_URL + '/customer/lead/update', + data + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 更新客资状态 + */ +export async function updateCustomerLeadStatus( + leadId: number, + status: number, + remarks?: string +) { + const res = await request.put>( + MODULES_API_URL + '/customer/lead/status/' + leadId, + { status, remarks } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 派单给业务员 + */ +export async function dispatchLead(data: LeadDispatchParam) { + const res = await request.post>( + MODULES_API_URL + '/customer/lead/dispatch', + data + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 批量派单 + */ +export async function batchDispatchLeads(data: LeadDispatchParam) { + const res = await request.post>( + MODULES_API_URL + '/customer/lead/dispatch/batch', + data + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 添加跟进记录 + */ +export async function addLeadFollowLog(data: LeadFollowParam) { + const res = await request.post>( + MODULES_API_URL + '/customer/lead/follow', + data + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 获取跟进历史 + */ +export async function getLeadFollowHistory(leadId: number) { + const res = await request.get>( + MODULES_API_URL + '/customer/lead/follow/history/' + leadId + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 获取统计数据 + */ +export async function getLeadStatistics(params: CustomerLeadParam) { + const res = await request.get>( + MODULES_API_URL + '/customer/lead/statistics', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 导出客资数据 + */ +export async function exportCustomerLeads(params: CustomerLeadParam) { + const res = await request.get[]>>( + MODULES_API_URL + '/customer/lead/export', + { params } + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 获取未分配客资列表 + */ +export async function getUnassignedLeads() { + const res = await request.get>( + MODULES_API_URL + '/customer/lead/unassigned' + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 获取业务员客资统计 + */ +export async function getSalesmanLeadStats(salesmanId: number) { + const res = await request.get>( + MODULES_API_URL + '/customer/lead/salesman/stats/' + salesmanId + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} + +/** + * 获取派单历史 + */ +export async function getLeadDispatchHistory(leadId: number) { + const res = await request.get>( + MODULES_API_URL + '/customer/lead/dispatch/history/' + leadId + ); + if (res.data.code === 0) { + return res.data.data; + } + return Promise.reject(new Error(res.data.message)); +} diff --git a/src/api/cms/customerLead/model.ts b/src/api/cms/customerLead/model.ts new file mode 100644 index 0000000..03b929f --- /dev/null +++ b/src/api/cms/customerLead/model.ts @@ -0,0 +1,174 @@ +/** + * 客资管理模块 - 类型定义 + */ + +/** 客资状态枚举 */ +export const LeadStatusOptions = [ + { label: '待跟进', value: 0, color: 'warning' }, + { label: '跟进中', value: 1, color: 'primary' }, + { label: '已成交', value: 2, color: 'success' }, + { label: '无效', value: 3, color: 'info' } +]; + +/** 客资来源类型 */ +export const LeadSourceOptions = [ + { label: '表单', value: 'form' }, + { label: '网站', value: 'website' }, + { label: '小程序', value: 'miniapp' }, + { label: '推荐人', value: 'referral' }, + { label: '管理员录入', value: 'admin' } +]; + +/** 跟进方式 */ +export const FollowTypeOptions = [ + { label: '电话', value: 1 }, + { label: '微信', value: 2 }, + { label: '上门', value: 3 }, + { label: '短信', value: 4 }, + { label: '其他', value: 5 } +]; + +/** 派单类型 */ +export const DispatchTypeOptions = [ + { label: '新分配', value: 1 }, + { label: '重新分配', value: 2 }, + { label: '抢单', value: 3 } +]; + +/** 客资实体 */ +export interface CustomerLead { + leadId?: number; + name?: string; + phone?: string; + company?: string; + delivery?: string; + need?: string; + source?: string; + sourceType?: string; + ip?: string; + status?: number; + statusText?: string; + remarks?: string; + assignedUserId?: number; + assignedUserName?: string; + assignedRealName?: string; + assignedUserPhone?: string; + referrerUserId?: number; + referrerName?: string; + referrerPhone?: string; + referralFee?: number; + referralFeePaid?: number; + referralFeePaidText?: string; + referrerShare?: number; + dispatchTime?: string; + dispatchAdminId?: number; + dispatchAdminName?: string; + followCount?: number; + lastFollowTime?: string; + appointmentTime?: string; + dealAmount?: number; + dealTime?: string; + createTime?: string; + updateTime?: string; +} + +/** 客资查询参数 */ +export interface CustomerLeadParam { + leadId?: number; + name?: string; + phone?: string; + company?: string; + need?: string; + assignedUserId?: number; + dispatchRemarks?: string; + status?: number; + remarks?: string; + appointmentTime?: string; + dealAmount?: number; + sourceType?: string; + startDate?: string; + endDate?: string; + statusList?: string; + salesmanId?: number; + referrerId?: number; + keyword?: string; + pageNum?: number; + pageSize?: number; +} + +/** 派单请求参数 */ +export interface LeadDispatchParam { + leadId?: number; + toUserId?: number; + remarks?: string; + dispatchType?: number; + leadIds?: number[]; + batchMode?: boolean; +} + +/** 跟进记录参数 */ +export interface LeadFollowParam { + leadId?: number; + followType?: number; + followContent?: string; + nextFollowTime?: string; + nextFollowPlan?: string; + attachmentUrls?: string; + updateStatus?: boolean; + newStatus?: number; +} + +/** 派单记录 */ +export interface LeadDispatch { + dispatchId?: number; + leadId?: number; + fromUserId?: number; + toUserId?: number; + toUserName?: string; + adminId?: number; + adminName?: string; + dispatchRemarks?: string; + dispatchType?: number; + dispatchTypeText?: string; + leadCustomerName?: string; + leadCustomerPhone?: string; + createTime?: string; +} + +/** 跟进记录 */ +export interface LeadFollowLog { + followId?: number; + leadId?: number; + userId?: number; + userName?: string; + followType?: number; + followTypeText?: string; + followContent?: string; + nextFollowTime?: string; + nextFollowPlan?: string; + attachmentUrls?: string; + customerName?: string; + customerPhone?: string; + createTime?: string; +} + +/** 统计数据 */ +export interface LeadStatistics { + totalLeads?: number; + newLeads?: number; + assignedLeads?: number; + followedLeads?: number; + dealedLeads?: number; + dealAmount?: number; + referralCount?: number; + referralFee?: number; +} + +/** 业务员统计 */ +export interface SalesmanStats { + total?: number; + pending?: number; + following?: number; + dealed?: number; + invalid?: number; +} diff --git a/src/views/cms/customerLead/index.vue b/src/views/cms/customerLead/index.vue new file mode 100644 index 0000000..f8e0383 --- /dev/null +++ b/src/views/cms/customerLead/index.vue @@ -0,0 +1,797 @@ + + + + +