| | |
| | | <template> |
| | | <el-dialog v-model="dialogVisible" title="售后单详情" width="80%" @close="closeDia"> |
| | | <el-dialog v-model="dialogVisible" |
| | | title="售后单详情" |
| | | width="80%" |
| | | @close="closeDia"> |
| | | <div v-loading="loading"> |
| | | <span class="descriptions">基础资料</span> |
| | | <el-descriptions :column="4" border style="margin-top: 10px;"> |
| | | <el-descriptions :column="4" |
| | | border |
| | | style="margin-top: 10px;"> |
| | | <el-descriptions-item label="客户名称">{{ detail.customerName || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="售后类型">{{ getDictLabel(classificationOptions, detail.serviceType) }}</el-descriptions-item> |
| | | <el-descriptions-item label="关联销售单号">{{ detail.salesContractNo || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="紧急程度">{{ getDictLabel(degreeOfUrgencyOptions, detail.urgency) }}</el-descriptions-item> |
| | | <el-descriptions-item label="工单编号">{{ detail.afterSalesServiceNo || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="处理状态"> |
| | | <el-tag :type="detail.status === 1 ? 'danger' : 'success'" size="small"> |
| | | <el-tag :type="detail.status === 1 ? 'danger' : 'success'" |
| | | size="small"> |
| | | {{ detail.status === 1 ? '待处理' : '已处理' }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="登记人">{{ detail.checkNickName || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="反馈日期">{{ detail.feedbackDate || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="客户诉求" :span="4">{{ detail.proDesc || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="客户诉求" |
| | | :span="4">{{ detail.proDesc || '-' }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | |
| | | <div style="margin-top: 20px;"> |
| | | <span class="descriptions">处理信息</span> |
| | | <el-descriptions :column="3" border style="margin-top: 10px;"> |
| | | <el-descriptions :column="3" |
| | | border |
| | | style="margin-top: 10px;"> |
| | | <el-descriptions-item label="处理人">{{ detail.disposeNickName || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="处理日期">{{ detail.disDate || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="处理结果" :span="3">{{ detail.disRes || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="处理结果" |
| | | :span="3">{{ detail.disRes || '-' }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | </div> |
| | | |
| | | <div style="margin-top: 20px;"> |
| | | <span class="descriptions">关联产品</span> |
| | | <el-table :data="tableData" border style="width: 100%; margin-top: 10px;"> |
| | | <el-table-column type="index" label="序号" width="60" align="center" /> |
| | | <el-table-column prop="productCategory" label="产品大类" align="center" /> |
| | | <el-table-column prop="specificationModel" label="规格型号" align="center" /> |
| | | <el-table-column prop="unit" label="单位" align="center" /> |
| | | <el-table-column prop="expressCompany" label="快递公司" align="center" /> |
| | | <el-table-column prop="expressNumber" label="快递单号" align="center" /> |
| | | <el-table-column prop="shippingCarNumber" label="发货车牌" align="center" /> |
| | | <el-table-column prop="shippingDate" label="发货日期" align="center" /> |
| | | <el-table-column prop="quantity" label="售后数量" align="center" /> |
| | | <el-table :data="tableData" |
| | | border |
| | | style="width: 100%; margin-top: 10px;"> |
| | | <el-table-column type="index" |
| | | label="序号" |
| | | width="60" |
| | | align="center" /> |
| | | <el-table-column prop="productCategory" |
| | | label="产品大类" |
| | | align="center" /> |
| | | <el-table-column prop="specificationModel" |
| | | label="规格型号" |
| | | align="center" /> |
| | | <el-table-column prop="unit" |
| | | label="单位" |
| | | align="center" /> |
| | | <el-table-column prop="expressCompany" |
| | | label="快递公司" |
| | | align="center" /> |
| | | <el-table-column prop="expressNumber" |
| | | label="快递单号" |
| | | align="center" /> |
| | | <el-table-column prop="shippingCarNumber" |
| | | label="发货车牌" |
| | | align="center" /> |
| | | <el-table-column prop="shippingDate" |
| | | label="发货日期" |
| | | align="center" /> |
| | | <el-table-column prop="quantity" |
| | | label="售后数量" |
| | | align="center" /> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, computed, getCurrentInstance } from 'vue'; |
| | | import { getAfterSalesServiceById } from '@/api/customerService/index.js'; |
| | | import { ref, computed, getCurrentInstance } from "vue"; |
| | | import { getAfterSalesServiceById } from "@/api/customerService/index.js"; |
| | | |
| | | const { proxy } = getCurrentInstance(); |
| | | const dialogVisible = ref(false); |
| | | const loading = ref(false); |
| | | const detail = ref({}); |
| | | const tableData = ref([]); |
| | | const { proxy } = getCurrentInstance(); |
| | | const dialogVisible = ref(false); |
| | | const loading = ref(false); |
| | | const detail = ref({}); |
| | | const tableData = ref([]); |
| | | |
| | | const { post_sale_waiting_list, degree_of_urgency } = proxy.useDict( |
| | | "post_sale_waiting_list", |
| | | "degree_of_urgency" |
| | | ); |
| | | const classificationOptions = computed(() => post_sale_waiting_list?.value || []); |
| | | const degreeOfUrgencyOptions = computed(() => degree_of_urgency?.value || []); |
| | | const { post_sale_waiting_list, degree_of_urgency } = proxy.useDict( |
| | | "post_sale_waiting_list", |
| | | "degree_of_urgency" |
| | | ); |
| | | const classificationOptions = computed( |
| | | () => post_sale_waiting_list?.value || [] |
| | | ); |
| | | const degreeOfUrgencyOptions = computed(() => degree_of_urgency?.value || []); |
| | | |
| | | const getDictLabel = (options, value) => { |
| | | if (!value) return '-'; |
| | | const item = options.find(i => String(i.value) === String(value)); |
| | | return item ? item.label : value; |
| | | }; |
| | | const getDictLabel = (options, value) => { |
| | | if (!value) return "-"; |
| | | const item = options.find(i => String(i.value) === String(value)); |
| | | return item ? item.label : value; |
| | | }; |
| | | |
| | | const openDialog = (row) => { |
| | | dialogVisible.value = true; |
| | | loading.value = true; |
| | | detail.value = {}; |
| | | tableData.value = []; |
| | | |
| | | getAfterSalesServiceById(row.id).then(res => { |
| | | loading.value = false; |
| | | if (res.code === 200) { |
| | | detail.value = res.data || {}; |
| | | let productData = res.data?.salesLedgerDto?.productData || []; |
| | | const selectedIds = res.data.productModelIds ? String(res.data.productModelIds).split(",") : []; |
| | | tableData.value = productData.filter(item => selectedIds.includes(String(item.id))); |
| | | } |
| | | }).catch(() => { |
| | | loading.value = false; |
| | | const openDialog = row => { |
| | | dialogVisible.value = true; |
| | | loading.value = true; |
| | | detail.value = {}; |
| | | tableData.value = []; |
| | | |
| | | getAfterSalesServiceById(row.id) |
| | | .then(res => { |
| | | loading.value = false; |
| | | if (res.code === 200) { |
| | | detail.value = res.data || {}; |
| | | let productData = res.data?.salesLedgerDto?.productData || []; |
| | | const selectedIds = res.data.productModelIds |
| | | ? String(res.data.productModelIds).split(",") |
| | | : []; |
| | | tableData.value = productData.filter(item => |
| | | selectedIds.includes(String(item.id)) |
| | | ); |
| | | } |
| | | }) |
| | | .catch(() => { |
| | | loading.value = false; |
| | | }); |
| | | }; |
| | | |
| | | const closeDia = () => { |
| | | dialogVisible.value = false; |
| | | }; |
| | | |
| | | defineExpose({ |
| | | openDialog, |
| | | }); |
| | | }; |
| | | |
| | | const closeDia = () => { |
| | | dialogVisible.value = false; |
| | | }; |
| | | |
| | | defineExpose({ |
| | | openDialog |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .descriptions { |
| | | display: inline-block; |
| | | font-size: 1rem; |
| | | font-weight: 600; |
| | | padding-left: 12px; |
| | | position: relative; |
| | | } |
| | | .descriptions::before { |
| | | content: ""; |
| | | position: absolute; |
| | | left: 0; |
| | | top: 50%; |
| | | transform: translateY(-50%); |
| | | width: 4px; |
| | | height: 1rem; |
| | | background-color: #002fa7; |
| | | border-radius: 2px; |
| | | } |
| | | .descriptions { |
| | | display: inline-block; |
| | | font-size: 1rem; |
| | | font-weight: 600; |
| | | padding-left: 12px; |
| | | position: relative; |
| | | } |
| | | .descriptions::before { |
| | | content: ""; |
| | | position: absolute; |
| | | left: 0; |
| | | top: 50%; |
| | | transform: translateY(-50%); |
| | | width: 4px; |
| | | height: 1rem; |
| | | background-color: #374d77; |
| | | border-radius: 2px; |
| | | } |
| | | </style> |