Procházet zdrojové kódy

我的客户默认列表页接口调用

lm před 1 měsícem
rodič
revize
199f6dffb4

+ 92 - 0
src/api/myCustomer.ts

@@ -0,0 +1,92 @@
+import request from '../utils/request.js'
+let adminPrefix = import.meta.env.VITE_API_ADMIN_PRE
+
+
+// 查询顶部筛选条件信息接口
+export const getPrivateHeaderSearchParamsApi = () => {
+    return request({
+        url: `${adminPrefix}/api/v1/private/customer/data/head/select`,
+        method: 'get',
+    })
+}
+
+
+// 分页查询私域客户信息接口
+export const getPrivateCustomerListApi = (data:any) => {
+    return request({
+        url: `${adminPrefix}/api/v1/private/customer/data/list`,
+        method: 'post',
+        data
+    })
+}
+
+// 修改私域客户信息接口
+export const updatePrivateCustomerApi = (data:any) => {
+    return request({
+        url: `${adminPrefix}/api/v1/private/customer/data/update`,
+        method: 'post',
+        data
+    })
+}
+
+// 退回公海客户信息接口
+export const sendBackHighSeasCustomerApi = (customerId:any) => {
+    return request({
+        url: `${adminPrefix}/api/v1/private/customer/data/return/${customerId}`,
+        method: 'get',
+    })
+}
+
+// 转让接口
+export const transferCustomerApi = (data:any) => {
+    return request({
+        url: `${adminPrefix}/api/v1/private/customer/data/transfer`,
+        method: 'post',
+        data,
+    })
+}
+
+// 查询转让人列表信息接口
+export const getTransferPeopleListApi = (customerId:any) => {
+    return request({
+        url: `${adminPrefix}/api/v1/private/customer/data/transfer/data/${customerId}`,
+        method: 'get',
+    })
+}
+
+// 添加跟进信息接口
+export const addFollowUpInfoApi = (data:any) => {
+    return request({
+        url: `${adminPrefix}/api/v1/private/customer/data/follow/add`,
+        method: 'post',
+        data,
+    })
+}
+
+
+// 查询日志记录信息接口
+export const getPrivateOperationLogApi = (data:any) => {
+    return request({
+        url: `${adminPrefix}/api/v1/private/customer/oper/log/`,
+        method: 'post',
+        data,
+    })
+}
+
+// 查询详情信息接口 --信息概览
+export const getOverviewDetailApi = (data:any) => {
+    return request({
+        url: `${adminPrefix}/api/v1/private/customer/data/detail`,
+        method: 'post',
+        data,
+    })
+}
+
+// 取消预约跟进接口
+export const cancelAppointmentApi = (data:any) => {
+    return request({
+        url: `${adminPrefix}/api/v1/private/customer/data/cancelOrder`,
+        method: 'post',
+        data,
+    })
+}

+ 250 - 79
src/views/myCustomer/index.vue

@@ -17,11 +17,10 @@
                     defaultValue:'',
                     disabled:false
                 }
-            ]" @searchChange="HandleBlurSearchChange"/>
-
-
-            <Table :currentPage="currentPage" :pageSize="pageSize" :totalNum="totalNum" 
-                :tableColumns="tableColumns" :tableData="tableData">
+            ]" @searchChange="HandleBlockSearchChange"/>
+            <Table :currentPage="currentPage" :pageSize="pageSize" 
+                :totalNum="totalNum" :showPageSize="true"
+                :tableColumns="tableColumns" :tableData="tableData" @paginationChange="HandlePaginationChange">
                 <template #num="{currentIndex}">
                     {{ (currentPage - 1) * pageSize + currentIndex }}
                 </template>
@@ -36,21 +35,25 @@
                         <span class="option_button_editor" @click="GoToDetail(row)">详情</span>
                     </div>
                 </template>
-            </Table>
 
+                <template #paginationDesc>
+                    <span>共 {{ totalNum }} 条数据</span>
+                </template>
+            </Table>
         </div>
 
         <SchoolFormDialog 
-            v-if="schoolVisible"
             v-model:visible="schoolVisible"
+            v-model:submitLoading="schoolSubmitLoading"
             :defaultFormData="schoolDefaultFormData"
+            @confirm="HandleSchoolConfirm"
         ></SchoolFormDialog>
     </div>
 </template>
 
 
 <script setup lang="ts">
-import { computed, ref } from 'vue';
+import { computed, onMounted, ref } from 'vue';
 import { useRouter } from 'vue-router';
 import SearchBlock from '@/baseComponents/SearchBlock.vue';
 import {headerSearchList} from './searchBlock'
@@ -60,107 +63,275 @@ import {tableColumns} from './table'
 
 import SchoolFormDialog from '@/components/SchoolFormDialog/index.vue'
 
+import {
+    getPrivateHeaderSearchParamsApi,
+    getPrivateCustomerListApi,
+    updatePrivateCustomerApi,
+} from '@/api/myCustomer'
+
 const router = useRouter()
+
+
+
 /**
- * 1. 默认列表 表格数据有关内容
+ * 1.默认列表 筛选项有关数据
  */
-const tableData = ref([
-    {
-        id: 1,
-        customerType: '首单客户',
-        schoolName: '流星花园学校',
-        schoolStageName:'初中',
-        schoolStage: 'middle',
-        province:'beijing',
-        provinceName: '北京市',
-        city:'dongcheng',
-        cityName: '东城区',
-        detailAddress:'通州北苑',
-        groupName: '小组',
-        owner: '张三',
-        claimTime: '2026-03-11',
-        lastFollowUpTime: '2026-03-11',
-    },
-    {
-        id: 2,
-        customerType: '首单客户',
-        schoolName: '北京师达',
-        schoolStageName:'小学',
-        schoolStage: 'primary',
-        province:'beijing',
-        provinceName: '北京市',
-        city:'dongcheng',
-        cityName: '东城区',
-        detailAddress:'通州北苑',
-
-        groupName: '小组',
-        owner: '张三',
-        claimTime: '2026-03-11',
-        lastFollowUpTime: '2026-03-11'
-    },
-    {
-        id: 3,
-        customerType: '首单客户',
-        schoolName: '北京五十七中学',
-        schoolStageName:'高中',
-        schoolStage: 'senior',
-        province:'beijing',
-        provinceName: '北京市',
-        city:'dongcheng',
-        cityName: '东城区',
-        detailAddress:'通州北苑',
-        groupName: '小组',
-        owner: '张三',
-        claimTime: '2025-11-01',
-        lastFollowUpTime: '2025-11-01'
+const searchParams = ref({
+    type:'all',
+    stage:'all',
+    province:'all',
+    city:'all',
+    group:'all',
+    personnel:'all',
+    queryStr:'',
+})
+const provinceConfig = ref([])  //省份的配置列表
+
+// 获取头部筛选配置
+const GetHeaderSearchOptions = async ()=>{
+    let res = await getPrivateHeaderSearchParamsApi()
+    if(res?.code == 200){
+        const { groupData, memberData, regionData, stageData, typeData} = res.data
+        let typeDataOption = typeData?.slice(1)?.map(item=>{
+            return {
+                label:item.name,
+                value:item.id
+            }
+        }) || []
+        let stageOption = stageData?.slice(1)?.map(item=>{
+            return {
+                label:item.name,
+                value:item.id
+            }
+        }) || []
+        provinceConfig.value = regionData?.slice(1)?.map(item=>{
+            return {
+                label:item.name,
+                value:item.id,
+                subData:item.subData?.slice(1)?.map(city=>{
+                    return {
+                        label:city.name,
+                        value:city.id
+                    }
+                }) || []
+            }
+        }) || []
+
+        let cityOption = provinceConfig.value.map(item=>{
+            return item.subData
+        }).flat() || []
+
+
+        let groupDataOption = groupData?.slice(1)?.map(item=>{
+            return {
+                label:item.name,
+                value:item.id,
+            }
+        }) || []
+
+        let personOption = memberData?.slice(1)?.map(item=>{
+            return{
+                label:item.username,
+                value:item.id,
+            }
+        })
+
+        headerSearchList.value = headerSearchList.value.map(item=>{
+            switch(item.key){
+                case 'type':
+                    item.options = [
+                        { label: '全部', value: 'all' },
+                        ...typeDataOption,
+                    ]
+                    item.defaultValue = searchParams.value[item.key]
+                    break
+                case 'stage':
+                    item.options = [
+                        { label: '全部', value: 'all' },
+                        ...stageOption,
+                    ]
+                    item.defaultValue = searchParams.value[item.key]
+                    break
+                case 'province':
+                    item.options = [
+                        { label: '全部', value: 'all' },
+                        ...provinceConfig.value,
+                    ]
+                    item.defaultValue = searchParams.value[item.key]
+                    break
+                case 'city':
+                    item.options = [
+                        { label: '全部', value: 'all' },
+                        ...cityOption,
+                    ]
+                    item.defaultValue = searchParams.value[item.key]
+                    break
+                case 'group':
+                    item.options = [
+                        { label: '全部', value: 'all' },
+                        ...groupDataOption,
+                    ]
+                    item.defaultValue = searchParams.value[item.key]
+                    break
+                case 'personnel':
+                    item.options = [
+                        { label: '全部', value: 'all' },
+                        ...personOption,
+                    ]
+                    item.defaultValue = searchParams.value[item.key]
+                    break
+            }
+            return item
+        })
     }
-]);
-const currentPage = ref(1)
-const pageSize = ref(20)
-const totalNum = ref(0)
+}
+
+// 头部筛选变更操作
+const HandleBlockSearchChange = (params,key)=>{
+    searchParams.value = {
+        ...searchParams.value,
+        ...params
+    }
+    if(key == 'province'){
+        let cityOption = []
+        if(searchParams.value.province !== 'all'){
+            // 重新修改当前市区的 配置
+            cityOption = provinceConfig.value.find(item=>{
+                return item.value == params.province
+            })?.subData || []
+        }else{
+            cityOption = provinceConfig.value.map(item=>{
+                return item.subData
+            }).flat() || []
+        }
+        headerSearchList.value = headerSearchList.value.map(item=>{
+            switch(item.key){
+                case 'city':
+                    item.options = [
+                        { label: '全部', value: 'all' },
+                        ...cityOption,
+                    ]
+                    break
+                default:
+                    item.defaultValue = searchParams.value[item.key]
+            }
+            return item
+        })
+        searchParams.value.city = 'all'
+    }
+    GetCustomerList()
+}
 
 
 /**
- * 2.默认列表 筛选项有关数据
+ * 2. 默认列表 表格数据有关内容
  */
-const listSearchParams = ref({})
-const HandleBlockSearchChange = (params,key)=>{
-    listSearchParams.value = {
-        ...listSearchParams.value,
-        ...params
+const tableData = ref([]);
+const currentPage = ref(1)
+const pageSize = ref(20)
+const totalNum = ref(0)
+
+const HandlePaginationChange = async (params)=>{
+    const {type,val} = params
+    if(type == 'currentPage'){
+        currentPage.value = val
+    }else if(type == 'pageSize'){
+        pageSize.value = val
     }
+    await GetCustomerList()
 }
-const HandleBlurSearchChange = (params,key)=>{
-    // console.log('blurl--',params)
-    listSearchParams.value = {
-        ...listSearchParams.value,
-        ...params
+
+// 获取客户列表 
+const GetCustomerList = async ()=>{
+    let params = {
+        typeId: searchParams.value.type == 'all' ? '' : searchParams.value.type,
+        stageId: searchParams.value.stage == 'all' ? '' : searchParams.value.stage ,
+        provinceId: searchParams.value.province == 'all' ? '' : searchParams.value.province ,
+        cityId: searchParams.value.city == 'all' ? '' :   searchParams.value.city,
+        groupId: searchParams.value.group == 'all' ? '' : searchParams.value.group,
+        userId: searchParams.value.personnel == 'all' ? '' : searchParams.value.personnel,
+        queryStr: searchParams.value.queryStr,
+        pageNum: currentPage.value,
+        pageSize: pageSize.value
+
+    }
+    let res = await getPrivateCustomerListApi(params)
+    if(res?.code == 200){
+        tableData.value = res.data.records
+        totalNum.value = res.data.total
     }
 }
 
+
+
 /**
  * 3. 编辑学校弹窗有关操作
  */
 const schoolVisible = ref(false)
 const schoolDefaultFormData = ref({})
+const schoolSubmitLoading = ref(false)
 const OpenFormDialog = (row)=>{
     schoolVisible.value = true
     schoolDefaultFormData.value = {
         ...row,
+        schoolStage:JSON.stringify({
+            label:row.stageName,
+            value:row.stageId
+        }),
         provinceArea:{
-            province:row.province,
-            district:row.city,
-        }
+            province:JSON.stringify({
+                label:row.provinceName,
+                value:row.provinceId
+            }),
+            district:JSON.stringify({
+                label:row.cityName,
+                value:row.cityId
+            }),
+        },
     }
 }
+const CloseSchoolDialog = ()=>{
+    schoolSubmitLoading.value = false
+    schoolVisible.value = false
+    schoolDefaultFormData.value = {}
+}
 
+const HandleSchoolConfirm = async (params:any)=>{
+    schoolSubmitLoading.value = true
+    const {formData,formRef} = params
 
-/** 跳转详情 */
+    let transferParams = {
+        id: formData.id,
+        name: formData.name,
+        stageId: JSON.parse(formData.schoolStage || '{}')?.value,
+        stageName: JSON.parse(formData.schoolStage || '{}')?.label,
+        provinceId: JSON.parse(formData.provinceArea.province || '{}')?.value,
+        provinceName: JSON.parse(formData.provinceArea.province || '{}')?.label,
+        cityId: JSON.parse(formData.provinceArea.district || '{}')?.value,
+        cityName: JSON.parse(formData.provinceArea.district || '{}')?.label,
+        address: formData.address,
+    }
+    let res = undefined
+    try{
+        res = await updatePrivateCustomerApi(transferParams)
+    }catch{}
+    if(res?.code == 200){
+        CloseSchoolDialog()
+        await GetCustomerList()
+    }else{
+        schoolSubmitLoading.value = false
+    }
+}
+
+/** 4.跳转详情 */
 const GoToDetail = (row)=>{
+    sessionStorage.setItem('customerMsg',JSON.stringify(row))
     router.push(`myCustomerDetail?id=${row.id}`)
 }
-
-
+onMounted(async ()=>{
+    await GetHeaderSearchOptions()
+    await GetCustomerList()
+})
 </script>
 
 

+ 8 - 54
src/views/myCustomer/searchBlock.ts

@@ -6,88 +6,42 @@ export const headerSearchList = ref([
         label: '类型',
         key: 'type',
         type: 'single',
-        options: [
-            { label: '全部', value: 'all' },
-            { label: '首单客户', value: 'first_order' },
-            { label: '存量客户', value: 'existing_customer' },
-        ],
+        options: [],
         defaultValue: 'all'
     },
     {
         label: '学段',
-        key: 'education_stage',
+        key: 'stage',
         type: 'single',
-        options: [
-            { label: '全部', value: 'all' },
-            { label: '幼儿园', value: 'kindergarten' },
-            { label: '小学', value: 'primary_school' },
-            { label: '初中', value: 'junior_high' },
-            { label: '高中', value: 'senior_high' },
-            { label: '完全中学', value: 'complete_middle' },
-            { label: '九年一贯', value: 'nine_year' },
-            { label: '十二年一贯', value: 'twelve_year' },
-            { label: '职高', value: 'vocational_high' },
-            { label: '大学', value: 'university' },
-        ],
+        options: [],
         defaultValue: 'all'
     },
     {
         label: '省份',
         key: 'province',
         type: 'single',
-        options: [
-            { label: '全部', value: 'all' },
-            { label: '北京', value: 'beijing' },
-            { label: '上海', value: 'shanghai' },
-            { label: '天津', value: 'tianjin' },
-            { label: '广东', value: 'guangdong' },
-            { label: '广西', value: 'guangxi' },
-        ],
+        options: [],
         defaultValue: 'all'
     },
     {
         label: '地区',
-        key: 'region',
+        key: 'city',
         type: 'single',
-        options: [
-            { label: '全部', value: 'all' },
-            { label: '东城区', value: 'dongcheng' },
-            { label: '西城区', value: 'xicheng' },
-            { label: '海淀区', value: 'haidian' },
-            { label: '朝阳区', value: 'chaoyang' },
-            { label: '丰台区', value: 'fengtai' },
-            { label: '石景山区', value: 'shijingshan' },
-        ],
+        options: [],
         defaultValue: 'all'
     },
     {
         label: '分组',
         key: 'group',
         type: 'single',
-        options: [
-            { label: '全部', value: 'all' },
-            { label: '分组1', value: 'group1' },
-            { label: '分组2', value: 'group2' },
-            { label: '分组3', value: 'group3' },
-            { label: '分组4', value: 'group4' },
-            { label: '分组5', value: 'group5' },
-            { label: '分组6', value: 'group6' },
-        ],
+        options: [],
         defaultValue: 'all'
     },
     {
         label: '人员',
         key: 'personnel',
         type: 'single',
-        options: [
-            { label: '全部', value: 'all' },
-            { label: '马丁', value: 'martin' },
-            { label: '王诗雅', value: 'wangshiya' },
-            { label: '王梓木', value: 'wangzimu' },
-            { label: '殷思源', value: 'yinsiyuan' },
-            { label: '付文杰', value: 'fuwenjie' },
-            { label: '李润曦', value: 'lirunxi' },
-        ],
+        options: [],
         defaultValue: 'all'
     },
 ]);

+ 6 - 6
src/views/myCustomer/table.ts

@@ -12,7 +12,7 @@ export const tableColumns = ref([
         custom: true,
     },
     {
-        name: 'customerType',
+        name: 'typeName',
         label: '客户类型',
         width: '100',
         fixed: '',
@@ -21,7 +21,7 @@ export const tableColumns = ref([
         custom: false,
     },
     {
-        name: 'schoolName',
+        name: 'name',
         label: '学校名称',
         width: '150',
         fixed: '',
@@ -30,7 +30,7 @@ export const tableColumns = ref([
         custom: false,
     },
     {
-        name: 'schoolStageName',
+        name: 'stageName',
         label: '学段',
         width: '80',
         fixed: '',
@@ -66,7 +66,7 @@ export const tableColumns = ref([
         custom: false,
     },
     {
-        name: 'owner',
+        name: 'claimUserName',
         label: '归属人',
         width: '100',
         fixed: '',
@@ -76,7 +76,7 @@ export const tableColumns = ref([
     },
 
     {
-        name: 'claimTime',
+        name: 'claimDatetime',
         label: '认领时间',
         width: '160',
         fixed: '',
@@ -86,7 +86,7 @@ export const tableColumns = ref([
     },
 
     {
-        name: 'lastFollowUpTime',
+        name: 'lastFollowDatetime',
         label: '上次跟进时间',
         width: '160',
         fixed: '',