From 8c5680de81222de3bf89a37eb2b307f99ea234c0 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 14 Oct 2025 23:17:28 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E3=80=90mall=20=E5=95=86=E5=9F=8E?= =?UTF-8?q?=E3=80=91=E4=BA=A4=E6=98=93=E8=AE=A2=E5=8D=95=EF=BC=8820%=20ant?= =?UTF-8?q?d=20detail=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=E9=A3=8E?= =?UTF-8?q?=E6=A0=BC=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/api/mall/trade/order/index.ts | 96 +++---- .../src/views/mall/trade/order/detail/data.ts | 91 +++++-- .../views/mall/trade/order/detail/index.vue | 242 +++++++----------- 3 files changed, 204 insertions(+), 225 deletions(-) diff --git a/apps/web-antd/src/api/mall/trade/order/index.ts b/apps/web-antd/src/api/mall/trade/order/index.ts index 7bcf758b7..c2410f9cf 100644 --- a/apps/web-antd/src/api/mall/trade/order/index.ts +++ b/apps/web-antd/src/api/mall/trade/order/index.ts @@ -6,11 +6,11 @@ export namespace MallOrderApi { /** 商品属性 */ export interface ProductProperty { /** 属性的编号 */ - propertyId?: null | number; + propertyId?: number; /** 属性的名称 */ propertyName?: string; /** 属性值的编号 */ - valueId?: null | number; + valueId?: number; /** 属性值的名称 */ valueName?: string; } @@ -18,35 +18,35 @@ export namespace MallOrderApi { /** 订单项 */ export interface OrderItem { /** 编号 */ - id?: null | number; + id?: number; /** 用户编号 */ - userId?: null | number; + userId?: number; /** 订单编号 */ - orderId?: null | number; + orderId?: number; /** 商品 SPU 编号 */ - spuId?: null | number; + spuId?: number; /** 商品 SPU 名称 */ spuName?: string; /** 商品 SKU 编号 */ - skuId?: null | number; + skuId?: number; /** 商品图片 */ picUrl?: string; /** 购买数量 */ - count?: null | number; + count?: number; /** 商品原价(总) */ - originalPrice?: null | number; + originalPrice?: number; /** 商品原价(单) */ - originalUnitPrice?: null | number; + originalUnitPrice?: number; /** 商品优惠(总) */ - discountPrice?: null | number; + discountPrice?: number; /** 商品实付金额(总) */ - payPrice?: null | number; + payPrice?: number; /** 子订单分摊金额(总) */ - orderPartPrice?: null | number; + orderPartPrice?: number; /** 分摊后子订单实付金额(总) */ - orderDividePrice?: null | number; + orderDividePrice?: number; /** 售后状态 */ - afterSaleStatus?: null | number; + afterSaleStatus?: number; /** 属性数组 */ properties?: ProductProperty[]; price?: number; @@ -67,91 +67,91 @@ export namespace MallOrderApi { /** 订单 */ export interface Order { /** 订单编号 */ - id?: null | number; + id?: number; /** 订单流水号 */ no?: string; /** 下单时间 */ - createTime?: Date | null; + createTime?: Date; /** 订单类型 */ - type?: null | number; + type?: number; /** 订单来源 */ - terminal?: null | number; + terminal?: number; /** 用户编号 */ - userId?: null | number; + userId?: number; /** 用户 IP */ userIp?: string; /** 用户备注 */ userRemark?: string; /** 订单状态 */ - status?: null | number; + status?: number; /** 购买的商品数量 */ - productCount?: null | number; + productCount?: number; /** 订单完成时间 */ - finishTime?: Date | null; + finishTime?: Date; /** 订单取消时间 */ - cancelTime?: Date | null; + cancelTime?: Date; /** 取消类型 */ - cancelType?: null | number; + cancelType?: number; /** 商家备注 */ remark?: string; /** 支付订单编号 */ - payOrderId?: null | number; + payOrderId?: number; /** 是否已支付 */ payStatus?: boolean; /** 付款时间 */ - payTime?: Date | null; + payTime?: Date; /** 支付渠道 */ payChannelCode?: string; /** 商品原价(总) */ - totalPrice?: null | number; + totalPrice?: number; /** 订单优惠(总) */ - discountPrice?: null | number; + discountPrice?: number; /** 运费金额 */ - deliveryPrice?: null | number; + deliveryPrice?: number; /** 订单调价(总) */ - adjustPrice?: null | number; + adjustPrice?: number; /** 应付金额(总) */ - payPrice?: null | number; + payPrice?: number; /** 发货方式 */ - deliveryType?: null | number; + deliveryType?: number; /** 自提门店编号 */ pickUpStoreId?: number; /** 自提核销码 */ pickUpVerifyCode?: string; /** 配送模板编号 */ - deliveryTemplateId?: null | number; + deliveryTemplateId?: number; /** 发货物流公司编号 */ - logisticsId?: null | number; + logisticsId?: number; /** 发货物流单号 */ logisticsNo?: string; /** 发货时间 */ - deliveryTime?: Date | null; + deliveryTime?: Date; /** 收货时间 */ - receiveTime?: Date | null; + receiveTime?: Date; /** 收件人名称 */ receiverName?: string; /** 收件人手机 */ receiverMobile?: string; /** 收件人邮编 */ - receiverPostCode?: null | number; + receiverPostCode?: number; /** 收件人地区编号 */ - receiverAreaId?: null | number; + receiverAreaId?: number; /** 收件人地区名字 */ receiverAreaName?: string; /** 收件人详细地址 */ receiverDetailAddress?: string; /** 售后状态 */ - afterSaleStatus?: null | number; + afterSaleStatus?: number; /** 退款金额 */ - refundPrice?: null | number; + refundPrice?: number; /** 优惠劵编号 */ - couponId?: null | number; + couponId?: number; /** 优惠劵减免金额 */ - couponPrice?: null | number; + couponPrice?: number; /** 积分抵扣的金额 */ - pointPrice?: null | number; + pointPrice?: number; /** VIP 减免金额 */ - vipPrice?: null | number; + vipPrice?: number; /** 订单项列表 */ items?: OrderItem[]; /** 下单用户信息 */ @@ -159,7 +159,7 @@ export namespace MallOrderApi { /** 用户头像 */ avatar?: string; /** 用户编号 */ - id?: null | number; + id?: number; /** 用户昵称 */ nickname?: string; }; @@ -168,7 +168,7 @@ export namespace MallOrderApi { /** 用户头像 */ avatar?: string; /** 用户编号 */ - id?: null | number; + id?: number; /** 用户昵称 */ nickname?: string; }; @@ -195,7 +195,7 @@ export namespace MallOrderApi { /** 发货方式 */ expressType: string; /** 物流公司编号 */ - logisticsId: null | number; + logisticsId: number; /** 物流编号 */ logisticsNo: string; } diff --git a/apps/web-antd/src/views/mall/trade/order/detail/data.ts b/apps/web-antd/src/views/mall/trade/order/detail/data.ts index c7df5e98b..74dfbcfda 100644 --- a/apps/web-antd/src/views/mall/trade/order/detail/data.ts +++ b/apps/web-antd/src/views/mall/trade/order/detail/data.ts @@ -1,11 +1,11 @@ +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { MallOrderApi } from '#/api/mall/trade/order'; import type { DescriptionItemSchema } from '#/components/description'; -import type { VxeGridPropTypes } from 'vxe-table'; import { h } from 'vue'; import { DICT_TYPE } from '@vben/constants'; -import { fenToYuan, formatDate } from '@vben/utils'; +import { fenToYuan, formatDateTime } from '@vben/utils'; import { DictTag } from '#/components/dict-tag'; @@ -82,10 +82,13 @@ export function useOrderStatusSchema(): DescriptionItemSchema[] { field: 'reminder', label: '提醒', content: () => - h('div', { class: 'text-red-500 space-y-1' }, [ + h('div', { class: 'space-y-1' }, [ h('div', '买家付款成功后,货款将直接进入您的商户号(微信、支付宝)'), h('div', '请及时关注你发出的包裹状态,确保可以配送至买家手中'), - h('div', '如果买家表示没收到货或货物有问题,请及时联系买家处理,友好协商'), + h( + 'div', + '如果买家表示没收到货或货物有问题,请及时联系买家处理,友好协商', + ), ]), }, ]; @@ -97,46 +100,66 @@ export function useOrderPriceSchema(): DescriptionItemSchema[] { { field: 'totalPrice', label: '商品总额', - content: (data: MallOrderApi.Order) => `${fenToYuan(data?.totalPrice ?? 0)} 元`, + content: (data: MallOrderApi.Order) => + `${fenToYuan(data?.totalPrice ?? 0)} 元`, }, { field: 'deliveryPrice', label: '运费金额', - content: (data: MallOrderApi.Order) => `${fenToYuan(data?.deliveryPrice ?? 0)} 元`, + content: (data: MallOrderApi.Order) => + `${fenToYuan(data?.deliveryPrice ?? 0)} 元`, }, { field: 'adjustPrice', label: '订单调价', - content: (data: MallOrderApi.Order) => `${fenToYuan(data?.adjustPrice ?? 0)} 元`, + content: (data: MallOrderApi.Order) => + `${fenToYuan(data?.adjustPrice ?? 0)} 元`, }, { field: 'couponPrice', label: '优惠劵优惠', content: (data: MallOrderApi.Order) => - h('span', { class: 'text-red-500' }, `${fenToYuan(data?.couponPrice ?? 0)} 元`), + h( + 'span', + { class: 'text-red-500' }, + `${fenToYuan(data?.couponPrice ?? 0)} 元`, + ), }, { field: 'vipPrice', label: 'VIP 优惠', content: (data: MallOrderApi.Order) => - h('span', { class: 'text-red-500' }, `${fenToYuan(data?.vipPrice ?? 0)} 元`), + h( + 'span', + { class: 'text-red-500' }, + `${fenToYuan(data?.vipPrice ?? 0)} 元`, + ), }, { field: 'discountPrice', label: '活动优惠', content: (data: MallOrderApi.Order) => - h('span', { class: 'text-red-500' }, `${fenToYuan(data?.discountPrice ?? 0)} 元`), + h( + 'span', + { class: 'text-red-500' }, + `${fenToYuan(data?.discountPrice ?? 0)} 元`, + ), }, { field: 'pointPrice', label: '积分抵扣', content: (data: MallOrderApi.Order) => - h('span', { class: 'text-red-500' }, `${fenToYuan(data?.pointPrice ?? 0)} 元`), + h( + 'span', + { class: 'text-red-500' }, + `${fenToYuan(data?.pointPrice ?? 0)} 元`, + ), }, { field: 'payPrice', label: '应付金额', - content: (data: MallOrderApi.Order) => `${fenToYuan(data?.payPrice ?? 0)} 元`, + content: (data: MallOrderApi.Order) => + `${fenToYuan(data?.payPrice ?? 0)} 元`, }, ]; } @@ -168,21 +191,17 @@ export function useDeliveryInfoSchema(): DescriptionItemSchema[] { `${data?.receiverAreaName} ${data?.receiverDetailAddress}`.trim(), }, { - field: 'logisticsTime', + field: 'deliveryTime', label: '发货时间', - content: (data: MallOrderApi.Order) => formatDate(data?.deliveryTime) as string, + content: (data: MallOrderApi.Order) => + formatDateTime(data?.deliveryTime) as string, }, ]; } /** 商品信息 columns */ -export function useProductColumns(): VxeGridPropTypes.Columns { +export function useProductColumns(): VxeTableGridOptions['columns'] { return [ - { - type: 'seq', - width: 60, - title: '序号', - }, { field: 'spuName', title: '商品', @@ -193,7 +212,7 @@ export function useProductColumns(): VxeGridPropTypes.Columns { field: 'price', title: '商品原价', width: 150, - formatter: ({ cellValue }: any) => `${fenToYuan(cellValue)} 元`, + formatter: 'formatFenToYuanAmount', }, { field: 'count', @@ -204,25 +223,45 @@ export function useProductColumns(): VxeGridPropTypes.Columns { field: 'payPrice', title: '合计', width: 150, - formatter: ({ cellValue }: any) => `${fenToYuan(cellValue)} 元`, + formatter: 'formatFenToYuanAmount', }, { field: 'afterSaleStatus', title: '售后状态', width: 120, - slots: { default: 'afterSaleStatus' }, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.TRADE_ORDER_ITEM_AFTER_SALE_STATUS }, + }, + }, + ]; +} + +/** 物流详情 columns */ +export function useExpressTrackColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'time', + title: '时间', + width: 180, + formatter: 'formatDateTime', + }, + { + field: 'content', + title: '物流状态', + minWidth: 300, }, ]; } /** 操作日志 columns */ -export function useOperateLogColumns(): VxeGridPropTypes.Columns { +export function useOperateLogColumns(): VxeTableGridOptions['columns'] { return [ { field: 'createTime', title: '操作时间', width: 180, - formatter: ({ cellValue }: any) => formatDate(cellValue) as string, + formatter: 'formatDateTime', }, { field: 'userType', @@ -236,4 +275,4 @@ export function useOperateLogColumns(): VxeGridPropTypes.Columns { minWidth: 200, }, ]; -} \ No newline at end of file +} diff --git a/apps/web-antd/src/views/mall/trade/order/detail/index.vue b/apps/web-antd/src/views/mall/trade/order/detail/index.vue index 01d0734c6..e3c6c0b0d 100644 --- a/apps/web-antd/src/views/mall/trade/order/detail/index.vue +++ b/apps/web-antd/src/views/mall/trade/order/detail/index.vue @@ -1,4 +1,5 @@ \ No newline at end of file +