2024-03-22 18:00:50 +08:00

228 lines
10 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div>
<el-card class="!border-none mb-4" shadow="never">
<el-form class="mb-[-16px]" :model="queryParams" label-width="auto" inline>
<el-form-item label="客户名称">
<el-input class="w-[280px]" v-model="queryParams.custom_name" clearable placeholder="请输入客户名称" />
</el-form-item>
<el-form-item label="所属项目" prop="project_id">
<selectRemote :formData="queryParams" model="project_id" :api="apiProjectSearch" />
</el-form-item>
<el-form-item label="关联合同" prop="contract_id">
<selectRemote :formData="queryParams" model="contract_id" :api="apiContractSearch" />
</el-form-item>
<el-form-item label="投诉主题" prop="name">
<el-input class="w-[280px]" v-model="queryParams.name" clearable placeholder="请输入投诉主题" />
</el-form-item>
<el-form-item label="接待人" prop="receiver">
<el-input class="w-[280px]" v-model="queryParams.receiver" clearable placeholder="请输入接待人" />
</el-form-item>
<el-form-item label="紧急程度" prop="urgency">
<el-select class="w-[280px]" v-model="queryParams.urgency" clearable placeholder="请选择紧急程度">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in dictData.urgency" :key="index" :label="item.name"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="分类" prop="classification">
<el-select class="w-[280px]" v-model="queryParams.classification" clearable placeholder="请选择紧急程度">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in dictData.classification" :key="index" :label="item.name"
:value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="处理结果" prop="processing_result">
<el-select class="w-[280px]" v-model="queryParams.processing_result" clearable placeholder="处理结果">
<el-option label="全部" value=""></el-option>
<el-option v-for="(item, index) in dictData.custom_service_solve_result" :key="index"
:label="item.name" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="resetPage">查询</el-button>
<el-button @click="resetParams">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
<el-button v-perms="['custom_service.custom_service/add']" type="primary" @click="handleAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增
</el-button>
<!-- <el-button v-perms="['custom_service.custom_service/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
删除
</el-button> -->
<div class="mt-4">
<el-table :data="pager.lists" @selection-change="handleSelectionChange" fit>
<el-table-column type="selection" width="55" />
<el-table-column label="序号" type="index" width="55" />
<el-table-column label="客户名称" prop="custom_name" />
<el-table-column label="项目名称" prop="project_name" align="center" />
<el-table-column label="项目编码" prop="project_code" style="width:100%" />
<el-table-column label="合同编号" prop="contract_code" />
<el-table-column label="投诉主题" prop="name" />
<el-table-column label="日期" prop="date" />
<el-table-column label="接待人" prop="receiver" />
<el-table-column label="分类" prop="classification" />
<el-table-column label="投诉人" prop="custom_master_name" />
<el-table-column label="联系电话" prop="custom_master_phone" />
<el-table-column label="处理结果" prop="processing_result" />
<el-table-column label="紧急程度" prop="urgency" />
<el-table-column label="指定处理人" prop="processed_user" width="105" />
<el-table-column label="问题是否解决" prop="is_solve_text" width="110" />
<el-table-column label="完成日期" prop="done_date" />
<el-table-column label="评分" prop="score" />
<el-table-column label="操作" width="110" fixed="right">
<template #default="{ row }">
<el-button v-perms="['custom_service.custom_service/solve']" type="primary" link
@click="handleResolve(row)" v-if="row.is_solve != 1">
处理
</el-button>
<el-button v-perms="['custom_service.custom_service/edit']" type="primary" link
@click="handleEdit(row)">
编辑
</el-button>
<el-button v-perms="['custom_service.custom_service/delete']" type="danger" link
@click="handleDelete(row.id)">
删除
</el-button>
<el-button v-perms="['custom_service.custom_service/detail']" link @click="handledetail(row)">
详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex justify-end mt-4">
<pagination v-model="pager" @change="getLists" />
</div>
</el-card>
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
<handle-popup v-if="showHandle" ref="handleRef" :dict-data="dictData" @success="getLists"
@close="showEdit = false" />
<detail-popup v-if="showDtail" ref="detailRef" :dict-data="dictData" @close="showDtail = false" />
</div>
</template>
<script lang="ts" setup name="customServiceLists">
import { usePaging } from '@/hooks/usePaging'
import { useDictData } from '@/hooks/useDictOptions'
import { apiCustomServiceLists, apiCustomServiceDetail, apiCustomServiceDelete } from '@/api/custom_service'
import { apiProjectSearch } from '@/api/project'
import { apiContractSearch } from '@/api/contract'
import feedback from '@/utils/feedback'
import EditPopup from './edit.vue'
import HandlePopup from './handle.vue'
import DetailPopup from './detail.vue'
import { h } from "vue";
const detailRef = shallowRef<InstanceType<typeof DetailPopup>>()
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
const handleRef = shallowRef<InstanceType<typeof HandlePopup>>()
// 是否显示编辑框
const showEdit = ref(false)
const showHandle = ref(false)
const showDtail = ref(false)
// 查询条件
const queryParams = reactive({
project_id: "",
urgency: '',
receiver: '',
custom_name: "",
name: '',
processed_user: '',
processing_result: '',
classification: '',
contract_id: "",
})
// 选中数据
const selectData = ref<any[]>([])
// 表格选择后回调事件
const handleSelectionChange = (val: any[]) => {
selectData.value = val.map(({ id }) => id)
}
// 获取字典数据
const { dictData } = useDictData('classification,urgency,custom_service_solve_result,is_solve')
// 分页相关
const { pager, getLists, resetParams, resetPage } = usePaging({
fetchFun: apiCustomServiceLists,
params: queryParams
})
// 添加
const handleAdd = async () => {
showEdit.value = true
await nextTick()
editRef.value?.open('add')
}
// 编辑
const handleEdit = async (data: any) => {
let res = await apiCustomServiceDetail({ id: data.id })
showEdit.value = true
await nextTick()
editRef.value?.open('edit')
editRef.value?.setFormData(res)
}
//处理
const handleResolve = async (data: any) => {
let res = await apiCustomServiceDetail({ id: data.id })
showHandle.value = true
await nextTick()
handleRef.value?.open()
handleRef.value?.setFormData(res)
}
const handleDelete = async (id: number | any[]) => {
await feedback.confirm('确定要删除?')
await apiCustomServiceDelete({ id })
getLists()
}
//详情
const handledetail = async (data: any) => {
let res = await apiCustomServiceDetail({ id: data.id })
showDtail.value = true
await nextTick()
detailRef.value?.open()
detailRef.value?.setFormData(res)
}
const labelHead = (h, column, index) => {
console.log(column, index)
// let l = column.label.length
// let f = 16 //每个字大小,其实是每个字的比例值,大概会比字体大小差不多大一点,
// column.minWidth = f * l //字大小乘个数即长度 ,注意不要加px像素这里minWidth只是一个比例值不是真正的长度
// //然后将列标题放在一个div块中注意块的宽度一定要100%,否则表格显示不完全
// return h('div', { class: 'table-head', style: { width: '100%' } }, [column.label])
}
const renderHeader = ({ column }) => {
console.log(column)
column.label = 'dgffjghdfgjhdfjgkh'
return h("div", [
h("div", column.label,),
]);
};
getLists()
</script>