- 样板库接口 page_size 上限 le=200 → le=1000 (订单新建对话框与 AI 炫图请求 254 条触发校验失败) - el-select 清空后 status 空串归一化 (订单/合同/量尺/售后筛选不再发送 status=) - 复测 page_size=254 返回 254 条完整数据
97 lines
3.8 KiB
Vue
97 lines
3.8 KiB
Vue
<template>
|
|
<el-card>
|
|
<div class="toolbar">
|
|
<el-select v-model="status" placeholder="全部状态" clearable style="width:140px" @change="load">
|
|
<el-option :value="0" label="待处理" /><el-option :value="1" label="处理中" /><el-option :value="2" label="已完成" />
|
|
</el-select>
|
|
<el-button type="primary" @click="load">查询</el-button>
|
|
<div style="flex:1" />
|
|
<el-button type="primary" plain @click="openCreate">提交售后</el-button>
|
|
</div>
|
|
<el-table :data="rows" v-loading="loading" stripe>
|
|
<el-table-column prop="id" label="ID" width="70" />
|
|
<el-table-column prop="title" label="标题" min-width="120" />
|
|
<el-table-column prop="description" label="问题描述" min-width="200" show-overflow-tooltip />
|
|
<el-table-column prop="order_no" label="关联订单" width="150" />
|
|
<el-table-column label="状态" width="90">
|
|
<template #default="{ row }">
|
|
<el-tag size="small" :type="(['warning', 'primary', 'success'] as const)[row.status]">
|
|
{{ ['待处理', '处理中', '已完成'][row.status] }}</el-tag>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="created_at" label="提交时间" width="170" />
|
|
<el-table-column label="操作" width="120" fixed="right">
|
|
<template #default="{ row }">
|
|
<el-button v-if="row.status !== 2" size="small" @click="advance(row)">
|
|
{{ row.status === 0 ? '开始处理' : '完成' }}</el-button>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
<el-pagination style="margin-top:12px; justify-content:flex-end" background layout="total, prev, pager, next"
|
|
:total="total" :page-size="page_size" v-model:current-page="page" @current-change="load" />
|
|
|
|
<el-dialog v-model="createVisible" title="提交售后" width="520px">
|
|
<el-form :model="form" label-width="80px">
|
|
<el-form-item label="标题"><el-input v-model="form.title" /></el-form-item>
|
|
<el-form-item label="问题描述"><el-input v-model="form.description" type="textarea" :rows="3" /></el-form-item>
|
|
<el-form-item label="关联订单"><el-input v-model="form.order_no" placeholder="订单号(可选)" /></el-form-item>
|
|
</el-form>
|
|
<template #footer>
|
|
<el-button @click="createVisible = false">取消</el-button>
|
|
<el-button type="primary" @click="save">提交</el-button>
|
|
</template>
|
|
</el-dialog>
|
|
</el-card>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { onMounted, reactive, ref } from 'vue'
|
|
import { ElMessage } from 'element-plus'
|
|
import { api } from '../api'
|
|
|
|
const rows = ref<any[]>([])
|
|
const total = ref(0)
|
|
const page = ref(1)
|
|
const page_size = 15
|
|
const status = ref<number | undefined>()
|
|
const loading = ref(false)
|
|
const createVisible = ref(false)
|
|
const form = reactive({ title: '', description: '', order_no: '' })
|
|
|
|
async function load() {
|
|
loading.value = true
|
|
try {
|
|
const qs = `page=${page.value}&page_size=${page_size}${status.value !== undefined && status.value !== '' ? `&status=${status.value}` : ''}`
|
|
const d = await api<any>('get', `/api/after_sales?${qs}`)
|
|
rows.value = d.data
|
|
total.value = d.total
|
|
} finally { loading.value = false }
|
|
}
|
|
|
|
function openCreate() {
|
|
Object.assign(form, { title: '', description: '', order_no: '' })
|
|
createVisible.value = true
|
|
}
|
|
|
|
async function save() {
|
|
if (!form.description.trim()) return ElMessage.warning('问题描述必填')
|
|
await api('post', '/api/after_sales', form)
|
|
ElMessage.success('已提交')
|
|
createVisible.value = false
|
|
load()
|
|
}
|
|
|
|
async function advance(row: any) {
|
|
const next = row.status === 0 ? 1 : 2
|
|
await api('put', `/api/after_sales/${row.id}`, { status: next })
|
|
ElMessage.success('状态已更新')
|
|
load()
|
|
}
|
|
|
|
onMounted(load)
|
|
</script>
|
|
|
|
<style scoped>
|
|
.toolbar { display: flex; gap: 10px; margin-bottom: 12px; }
|
|
</style>
|