|
@@ -17,11 +17,10 @@
|
|
|
defaultValue:'',
|
|
defaultValue:'',
|
|
|
disabled:false
|
|
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}">
|
|
<template #num="{currentIndex}">
|
|
|
{{ (currentPage - 1) * pageSize + currentIndex }}
|
|
{{ (currentPage - 1) * pageSize + currentIndex }}
|
|
|
</template>
|
|
</template>
|
|
@@ -36,21 +35,25 @@
|
|
|
<span class="option_button_editor" @click="GoToDetail(row)">详情</span>
|
|
<span class="option_button_editor" @click="GoToDetail(row)">详情</span>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
- </Table>
|
|
|
|
|
|
|
|
|
|
|
|
+ <template #paginationDesc>
|
|
|
|
|
+ <span>共 {{ totalNum }} 条数据</span>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </Table>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<SchoolFormDialog
|
|
<SchoolFormDialog
|
|
|
- v-if="schoolVisible"
|
|
|
|
|
v-model:visible="schoolVisible"
|
|
v-model:visible="schoolVisible"
|
|
|
|
|
+ v-model:submitLoading="schoolSubmitLoading"
|
|
|
:defaultFormData="schoolDefaultFormData"
|
|
:defaultFormData="schoolDefaultFormData"
|
|
|
|
|
+ @confirm="HandleSchoolConfirm"
|
|
|
></SchoolFormDialog>
|
|
></SchoolFormDialog>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
|
-import { computed, ref } from 'vue';
|
|
|
|
|
|
|
+import { computed, onMounted, ref } from 'vue';
|
|
|
import { useRouter } from 'vue-router';
|
|
import { useRouter } from 'vue-router';
|
|
|
import SearchBlock from '@/baseComponents/SearchBlock.vue';
|
|
import SearchBlock from '@/baseComponents/SearchBlock.vue';
|
|
|
import {headerSearchList} from './searchBlock'
|
|
import {headerSearchList} from './searchBlock'
|
|
@@ -60,107 +63,275 @@ import {tableColumns} from './table'
|
|
|
|
|
|
|
|
import SchoolFormDialog from '@/components/SchoolFormDialog/index.vue'
|
|
import SchoolFormDialog from '@/components/SchoolFormDialog/index.vue'
|
|
|
|
|
|
|
|
|
|
+import {
|
|
|
|
|
+ getPrivateHeaderSearchParamsApi,
|
|
|
|
|
+ getPrivateCustomerListApi,
|
|
|
|
|
+ updatePrivateCustomerApi,
|
|
|
|
|
+} from '@/api/myCustomer'
|
|
|
|
|
+
|
|
|
const router = useRouter()
|
|
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. 编辑学校弹窗有关操作
|
|
* 3. 编辑学校弹窗有关操作
|
|
|
*/
|
|
*/
|
|
|
const schoolVisible = ref(false)
|
|
const schoolVisible = ref(false)
|
|
|
const schoolDefaultFormData = ref({})
|
|
const schoolDefaultFormData = ref({})
|
|
|
|
|
+const schoolSubmitLoading = ref(false)
|
|
|
const OpenFormDialog = (row)=>{
|
|
const OpenFormDialog = (row)=>{
|
|
|
schoolVisible.value = true
|
|
schoolVisible.value = true
|
|
|
schoolDefaultFormData.value = {
|
|
schoolDefaultFormData.value = {
|
|
|
...row,
|
|
...row,
|
|
|
|
|
+ schoolStage:JSON.stringify({
|
|
|
|
|
+ label:row.stageName,
|
|
|
|
|
+ value:row.stageId
|
|
|
|
|
+ }),
|
|
|
provinceArea:{
|
|
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)=>{
|
|
const GoToDetail = (row)=>{
|
|
|
|
|
+ sessionStorage.setItem('customerMsg',JSON.stringify(row))
|
|
|
router.push(`myCustomerDetail?id=${row.id}`)
|
|
router.push(`myCustomerDetail?id=${row.id}`)
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
|
|
+onMounted(async ()=>{
|
|
|
|
|
+ await GetHeaderSearchOptions()
|
|
|
|
|
+ await GetCustomerList()
|
|
|
|
|
+})
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|