Files
kami_frontend/src/views/camel-oil-info/order/components/order-detail-modal.vue
danial 6dc807dfc3 feat(camel-oil): 更新账号相关API模型和界面组件
- 从账号历史记录模型中移除historyUuid字段
- 在创建令牌请求模型中新增phone字段用于绑定手机号
- 在令牌信息模型中新增phone字段
- 移除账号详情页面中的账号ID显示和统计信息卡片
- 更新账号历史记录组件的筛选条件和展示字段
- 修改账号列表中的状态选项和显示逻辑
- 移除账号关联订单统计弹窗及相关功能
- 更新订单历史记录模型枚举值,新增FillCard类型
- 调整.clau

```
2025-11-23 01:34:04 +08:00

197 lines
5.3 KiB
Vue

<template>
<a-modal
v-model:visible="modalVisible"
title="订单详情"
width="800px"
:footer="false"
>
<div v-if="order" class="order-detail">
<!-- 基本信息 -->
<a-card title="基本信息" class="detail-card">
<a-descriptions :column="2" bordered>
<a-descriptions-item label="订单号">
{{ order.orderNo }}
</a-descriptions-item>
<a-descriptions-item label="商户订单号">
{{ order.merchantOrderNo || '-' }}
</a-descriptions-item>
<a-descriptions-item label="订单金额">
<span class="amount-text">¥{{ order.amount }}</span>
</a-descriptions-item>
<a-descriptions-item label="实际金额">
<span class="actual-amount-text">
¥{{ order.actualAmount || order.amount }}
</span>
</a-descriptions-item>
<a-descriptions-item label="充值账号">
{{ order.accountName }}
</a-descriptions-item>
<a-descriptions-item label="充值手机">
{{ order.accountPhone }}
</a-descriptions-item>
<a-descriptions-item label="账号ID">
{{ order.accountId || '-' }}
</a-descriptions-item>
<a-descriptions-item label="商户ID">
{{ order.merchantId || '-' }}
</a-descriptions-item>
</a-descriptions>
</a-card>
<!-- 状态信息 -->
<a-card title="状态信息" class="detail-card">
<a-descriptions :column="2" bordered>
<a-descriptions-item label="订单状态">
<a-tag :color="statusMapper(order.status).color">
{{ statusMapper(order.status).text }}
</a-tag>
</a-descriptions-item>
<a-descriptions-item label="支付状态">
<a-tag :color="payStatusMapper(order.payStatus).color">
{{ payStatusMapper(order.payStatus).text }}
</a-tag>
</a-descriptions-item>
</a-descriptions>
</a-card>
<!-- 时间信息 -->
<a-card title="时间信息" class="detail-card">
<a-descriptions :column="2" bordered>
<a-descriptions-item label="创建时间">
{{ order.createdAt }}
</a-descriptions-item>
<a-descriptions-item label="支付完成时间">
{{ order.paidAt || '-' }}
</a-descriptions-item>
<a-descriptions-item label="更新时间" :span="2">
{{ order.updatedAt }}
</a-descriptions-item>
</a-descriptions>
</a-card>
</div>
</a-modal>
</template>
<script lang="ts" setup>
import { computed } from 'vue';
// Props 定义
interface Props {
visible: boolean;
order: any;
}
const props = withDefaults(defineProps<Props>(), {
visible: false,
order: null
});
// Emits 定义
interface Emits {
(e: 'update:visible', value: boolean): void;
}
const emit = defineEmits<Emits>();
// 计算属性
const modalVisible = computed({
get: () => props.visible,
set: value => emit('update:visible', value)
});
/**
* 订单状态映射器
* 基于后端Go定义的CamelOilOrderStatus
* @param status 状态值
* @returns 状态文本和颜色
*/
const statusMapper = (status: number): { text: string; color: string } => {
switch (status) {
case 0:
return { text: '待处理', color: 'orange' }; // CamelOilOrderStatusPending
case 1:
return { text: '处理中', color: 'blue' }; // CamelOilOrderStatusProcessing
case 2:
return { text: '已完成', color: 'green' }; // CamelOilOrderStatusCompleted
case 3:
return { text: '已失败', color: 'red' }; // CamelOilOrderStatusFailed
default:
return { text: '未知状态', color: 'gray' };
}
};
/**
* 支付状态映射器
* 基于后端Go定义的CamelOilPayStatus
* @param status 支付状态
* @returns 支付状态文本和颜色
*/
const payStatusMapper = (status: number): { text: string; color: string } => {
switch (status) {
case 0:
return { text: '未支付', color: 'orange' }; // CamelOilPaymentStatusUnpaid
case 1:
return { text: '已支付', color: 'green' }; // CamelOilPaymentStatusPaid
case 2:
return { text: '已退款', color: 'blue' }; // CamelOilPaymentStatusRefunded
case 3:
return { text: '已超时', color: 'red' }; // CamelOilPaymentStatusTimeout
default:
return { text: '未知状态', color: 'gray' };
}
};
</script>
<style scoped>
.order-detail {
padding: 16px 0;
}
.detail-card {
margin-bottom: 16px;
}
.detail-card:last-child {
margin-bottom: 0;
}
.amount-text {
color: rgb(var(--primary-6));
font-weight: 600;
font-size: 16px;
}
.actual-amount-text {
color: rgb(var(--success-6));
font-weight: 600;
font-size: 16px;
}
:deep(.arco-descriptions-item-label) {
font-weight: 600;
background-color: var(--color-fill-2);
}
:deep(.arco-modal-body) {
max-height: 80vh;
overflow-y: auto;
/* 确保滚动条样式跟随主题 */
scrollbar-width: thin;
scrollbar-color: var(--color-border-3) transparent;
}
:deep(.arco-modal-body::-webkit-scrollbar) {
width: 6px;
}
:deep(.arco-modal-body::-webkit-scrollbar-thumb) {
background-color: var(--color-border-3);
border-radius: 3px;
}
:deep(.arco-modal-body::-webkit-scrollbar-track) {
background-color: transparent;
}
</style>