feat: 增加菜单管理
This commit is contained in:
@@ -22,6 +22,12 @@
|
||||
<el-option label="已失效" value="2" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="错误信息">
|
||||
<el-select v-model="queryParams.error" placeholder="全部" clearable style="width: 140px">
|
||||
<el-option label="有错误的订单" :value="true" />
|
||||
<el-option label="无错误的订单" :value="false" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="handleQuery">
|
||||
<el-icon><Search /></el-icon>搜索
|
||||
@@ -89,11 +95,22 @@
|
||||
<span>{{ row.payNum }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="订单状态" width="100">
|
||||
<el-table-column label="订单状态" width="120">
|
||||
<template #default="{ row }">
|
||||
<el-tag :type="getStatusType(row.state)">
|
||||
{{ getStatusText(row.state) }}
|
||||
</el-tag>
|
||||
<div style="display: flex; align-items: center; gap: 4px; flex-wrap: wrap;">
|
||||
<el-tag :type="getStatusType(row.state)">
|
||||
{{ getStatusText(row.state) }}
|
||||
</el-tag>
|
||||
<el-tag v-if="row.error" type="danger" size="small">异常</el-tag>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="错误信息" min-width="250">
|
||||
<template #default="{ row }">
|
||||
<el-tooltip v-if="row.error" :content="row.error" placement="top" :show-after="300">
|
||||
<span class="error-text">{{ row.error }}</span>
|
||||
</el-tooltip>
|
||||
<span v-else class="text-muted">-</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="支付方式" width="100">
|
||||
@@ -111,11 +128,12 @@
|
||||
<span>{{ formatDate(row.CreatedAt) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="200" fixed="right">
|
||||
<el-table-column label="操作" width="250" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<div class="action-buttons">
|
||||
<el-button type="primary" link @click="handleView(row)">查看</el-button>
|
||||
<el-button type="warning" link @click="handleEdit(row)">编辑</el-button>
|
||||
<el-button v-if="row.error" type="danger" link @click="handleRetryOrder(row)">重试流程</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -162,6 +180,10 @@
|
||||
<el-descriptions-item label="创建时间">{{ formatDate(orderDetail.CreatedAt) }}</el-descriptions-item>
|
||||
<el-descriptions-item label="更新时间">{{ formatDate(orderDetail.UpdatedAt) }}</el-descriptions-item>
|
||||
<el-descriptions-item label="参数信息">{{ orderDetail.args || '-' }}</el-descriptions-item>
|
||||
<el-descriptions-item v-if="orderDetail.error" label="错误信息" :span="2">
|
||||
<el-tag type="danger" size="small" style="margin-right: 6px;">异常</el-tag>
|
||||
<span style="color: #f56c6c;">{{ orderDetail.error }}</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="备注" :span="2">{{ orderDetail.note || '无' }}</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</el-dialog>
|
||||
@@ -389,7 +411,7 @@
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { Plus, Delete, Search, Download, Refresh, User, ShoppingCart, Ticket, Money, Close } from '@element-plus/icons-vue'
|
||||
import { getOrderList, getOrderDetail, createOrder, updateOrder, deleteOrder } from '@/api/admin/order'
|
||||
import { getOrderList, getOrderDetail, createOrder, updateOrder, deleteOrder, retryOrderHook } from '@/api/admin/order'
|
||||
import UserListSelector from '@/components/admin/UserListSelector.vue'
|
||||
import ProductSelector from '@/components/admin/ProductSelector.vue'
|
||||
import DiscountCodeSelector from '@/components/admin/DiscountCodeSelector.vue'
|
||||
@@ -403,7 +425,8 @@ const queryParams = reactive({
|
||||
key: '',
|
||||
state: '',
|
||||
user_id: '',
|
||||
user_key: ''
|
||||
user_key: '',
|
||||
error: null
|
||||
})
|
||||
|
||||
// 订单表单
|
||||
@@ -544,6 +567,7 @@ const resetQuery = () => {
|
||||
queryParams.state = ''
|
||||
queryParams.user_id = ''
|
||||
queryParams.user_key = ''
|
||||
queryParams.error = null
|
||||
queryParams.page = 1
|
||||
fetchOrderList()
|
||||
}
|
||||
@@ -644,6 +668,32 @@ const handleEdit = (row) => {
|
||||
}
|
||||
}
|
||||
|
||||
// 重试订单流程
|
||||
const handleRetryOrder = (row) => {
|
||||
ElMessageBox.confirm(
|
||||
`确认对订单「${row.name}」(ID: ${row.id}) 重试流程吗?`,
|
||||
'重试订单流程',
|
||||
{
|
||||
confirmButtonText: '确认重试',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}
|
||||
).then(async () => {
|
||||
try {
|
||||
const res = await retryOrderHook({ order_id: row.id })
|
||||
if (res.data.code === 200) {
|
||||
ElMessage.success('重试流程已触发')
|
||||
fetchOrderList()
|
||||
} else {
|
||||
ElMessage.error(res.data.message || '重试失败')
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('重试订单流程失败:', error)
|
||||
ElMessage.error(error.response?.data?.message || '重试订单流程失败')
|
||||
}
|
||||
}).catch(() => {})
|
||||
}
|
||||
|
||||
// 删除订单
|
||||
const handleDelete = (row) => {
|
||||
ElMessageBox.confirm(`确认删除订单 ${row.name} 吗?`, '警告', {
|
||||
@@ -966,4 +1016,21 @@ onMounted(() => {
|
||||
|
||||
.unit-input-row { display: flex; align-items: center; gap: 6px; width: 100%; }
|
||||
.unit-text { font-size: 13px; color: #606266; flex-shrink: 0; white-space: nowrap; }
|
||||
|
||||
.error-text {
|
||||
color: #f56c6c;
|
||||
font-size: 12px;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2;
|
||||
line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
word-break: break-all;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.text-muted {
|
||||
color: #c0c4cc;
|
||||
}
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user