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 999a33f85..7bcf758b7 100644 --- a/apps/web-antd/src/api/mall/trade/order/index.ts +++ b/apps/web-antd/src/api/mall/trade/order/index.ts @@ -60,6 +60,8 @@ export namespace MallOrderApi { createTime?: Date; /** 用户类型 */ userType?: number; + /** 用户编号 */ + userId?: number; } /** 订单 */ diff --git a/apps/web-antd/src/router/routes/modules/mall.ts b/apps/web-antd/src/router/routes/modules/mall.ts index 6b03c5abf..e68bea65f 100644 --- a/apps/web-antd/src/router/routes/modules/mall.ts +++ b/apps/web-antd/src/router/routes/modules/mall.ts @@ -57,7 +57,7 @@ const routes: RouteRecordRaw[] = [ title: '订单详情', activePath: '/mall/trade/order', }, - component: () => import('#/views/mall/trade/order/modules/detail.vue'), + component: () => import('#/views/mall/trade/order/detail/index.vue'), }, { path: String.raw`after-sale/detail/:id(\d+)`, 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 new file mode 100644 index 000000000..c7df5e98b --- /dev/null +++ b/apps/web-antd/src/views/mall/trade/order/detail/data.ts @@ -0,0 +1,239 @@ +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 { DictTag } from '#/components/dict-tag'; + +/** 订单基础信息 schema */ +export function useOrderInfoSchema(): DescriptionItemSchema[] { + return [ + { + field: 'no', + label: '订单号', + }, + { + field: 'user.nickname', + label: '买家', + }, + { + field: 'type', + label: '订单类型', + content: (data: MallOrderApi.Order) => + h(DictTag, { + type: DICT_TYPE.TRADE_ORDER_TYPE, + value: data?.type, + }), + }, + { + field: 'terminal', + label: '订单来源', + content: (data: MallOrderApi.Order) => + h(DictTag, { + type: DICT_TYPE.TERMINAL, + value: data?.terminal, + }), + }, + { + field: 'userRemark', + label: '买家留言', + }, + { + field: 'remark', + label: '商家备注', + }, + { + field: 'payOrderId', + label: '支付单号', + }, + { + field: 'payChannelCode', + label: '付款方式', + content: (data: MallOrderApi.Order) => + h(DictTag, { + type: DICT_TYPE.PAY_CHANNEL_CODE, + value: data?.payChannelCode, + }), + }, + { + field: 'brokerageUser.nickname', + label: '推广用户', + }, + ]; +} + +/** 订单状态信息 schema */ +export function useOrderStatusSchema(): DescriptionItemSchema[] { + return [ + { + field: 'status', + label: '订单状态', + content: (data: MallOrderApi.Order) => + h(DictTag, { + type: DICT_TYPE.TRADE_ORDER_STATUS, + value: data?.status, + }), + }, + { + field: 'reminder', + label: '提醒', + content: () => + h('div', { class: 'text-red-500 space-y-1' }, [ + h('div', '买家付款成功后,货款将直接进入您的商户号(微信、支付宝)'), + h('div', '请及时关注你发出的包裹状态,确保可以配送至买家手中'), + h('div', '如果买家表示没收到货或货物有问题,请及时联系买家处理,友好协商'), + ]), + }, + ]; +} + +/** 订单金额信息 schema */ +export function useOrderPriceSchema(): DescriptionItemSchema[] { + return [ + { + field: 'totalPrice', + label: '商品总额', + content: (data: MallOrderApi.Order) => `${fenToYuan(data?.totalPrice ?? 0)} 元`, + }, + { + field: 'deliveryPrice', + label: '运费金额', + content: (data: MallOrderApi.Order) => `${fenToYuan(data?.deliveryPrice ?? 0)} 元`, + }, + { + field: 'adjustPrice', + label: '订单调价', + 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)} 元`), + }, + { + field: 'vipPrice', + label: 'VIP 优惠', + content: (data: MallOrderApi.Order) => + 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)} 元`), + }, + { + field: 'pointPrice', + label: '积分抵扣', + content: (data: MallOrderApi.Order) => + h('span', { class: 'text-red-500' }, `${fenToYuan(data?.pointPrice ?? 0)} 元`), + }, + { + field: 'payPrice', + label: '应付金额', + content: (data: MallOrderApi.Order) => `${fenToYuan(data?.payPrice ?? 0)} 元`, + }, + ]; +} + +/** 收货信息 schema */ +export function useDeliveryInfoSchema(): DescriptionItemSchema[] { + return [ + { + field: 'deliveryType', + label: '配送方式', + content: (data: MallOrderApi.Order) => + h(DictTag, { + type: DICT_TYPE.TRADE_DELIVERY_TYPE, + value: data?.deliveryType, + }), + }, + { + field: 'receiverName', + label: '收货人', + }, + { + field: 'receiverMobile', + label: '联系电话', + }, + { + field: 'receiverAddress', + label: '收货地址', + content: (data: MallOrderApi.Order) => + `${data?.receiverAreaName} ${data?.receiverDetailAddress}`.trim(), + }, + { + field: 'logisticsTime', + label: '发货时间', + content: (data: MallOrderApi.Order) => formatDate(data?.deliveryTime) as string, + }, + ]; +} + +/** 商品信息 columns */ +export function useProductColumns(): VxeGridPropTypes.Columns { + return [ + { + type: 'seq', + width: 60, + title: '序号', + }, + { + field: 'spuName', + title: '商品', + minWidth: 300, + slots: { default: 'spuName' }, + }, + { + field: 'price', + title: '商品原价', + width: 150, + formatter: ({ cellValue }: any) => `${fenToYuan(cellValue)} 元`, + }, + { + field: 'count', + title: '数量', + width: 100, + }, + { + field: 'payPrice', + title: '合计', + width: 150, + formatter: ({ cellValue }: any) => `${fenToYuan(cellValue)} 元`, + }, + { + field: 'afterSaleStatus', + title: '售后状态', + width: 120, + slots: { default: 'afterSaleStatus' }, + }, + ]; +} + +/** 操作日志 columns */ +export function useOperateLogColumns(): VxeGridPropTypes.Columns { + return [ + { + field: 'createTime', + title: '操作时间', + width: 180, + formatter: ({ cellValue }: any) => formatDate(cellValue) as string, + }, + { + field: 'userType', + title: '操作人', + width: 100, + slots: { default: 'userType' }, + }, + { + field: 'content', + title: '操作内容', + 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 new file mode 100644 index 000000000..01d0734c6 --- /dev/null +++ b/apps/web-antd/src/views/mall/trade/order/detail/index.vue @@ -0,0 +1,414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ row.spuName }} + + + {{ property.propertyName }}: {{ property.valueName }} + + + + + + + + + + + + + + + + + + + + + 物流详情 + + + + + + + + {{ formatDate(track.time) }} + + {{ track.content }} + + + + + + + + + + + + 系统 + + + + {{ getDictLabel(DICT_TYPE.USER_TYPE, row.userType)[0] }} + + + + + + + + \ No newline at end of file diff --git a/apps/web-antd/src/views/mall/trade/order/index.vue b/apps/web-antd/src/views/mall/trade/order/index.vue index eefa6c0ec..da1856198 100644 --- a/apps/web-antd/src/views/mall/trade/order/index.vue +++ b/apps/web-antd/src/views/mall/trade/order/index.vue @@ -23,16 +23,18 @@ import { $t } from '#/locales'; import { useGridColumns, useGridFormSchema } from './data'; import DeleveryForm from './modules/delevery-form.vue'; +const { push } = useRouter(); + const [DeleveryFormModal, deleveryFormModalApi] = useVbenModal({ connectedComponent: DeleveryForm, destroyOnClose: true, }); /** 刷新表格 */ -function onRefresh() { +function handleRefresh() { gridApi.query(); } -const { push } = useRouter(); + /** 详情 */ function handleDetail(row: MallOrderApi.Order) { push({ name: 'TradeOrderDetail', params: { id: row.id } }); @@ -61,7 +63,7 @@ function handleRemake(row: MallOrderApi.Order) { id: row.id as number, remark: val, }); - onRefresh(); + handleRefresh(); } }); } @@ -113,7 +115,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ url="https://doc.iocoder.cn/mall/trade-cart/" /> - + diff --git a/apps/web-antd/src/views/mall/trade/order/modules/detail.vue b/apps/web-antd/src/views/mall/trade/order/modules/detail.vue deleted file mode 100644 index c64076447..000000000 --- a/apps/web-antd/src/views/mall/trade/order/modules/detail.vue +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - detail - - diff --git a/apps/web-antd/src/views/mall/trade/order/modules/update-address-form.vue b/apps/web-antd/src/views/mall/trade/order/modules/update-address-form.vue new file mode 100644 index 000000000..f513ada5e --- /dev/null +++ b/apps/web-antd/src/views/mall/trade/order/modules/update-address-form.vue @@ -0,0 +1,131 @@ + + + + + + + \ No newline at end of file diff --git a/apps/web-antd/src/views/mall/trade/order/modules/update-price-form.vue b/apps/web-antd/src/views/mall/trade/order/modules/update-price-form.vue new file mode 100644 index 000000000..5d6b41804 --- /dev/null +++ b/apps/web-antd/src/views/mall/trade/order/modules/update-price-form.vue @@ -0,0 +1,134 @@ + + + + + + + \ No newline at end of file diff --git a/apps/web-antd/src/views/mall/trade/order/modules/update-remark-form.vue b/apps/web-antd/src/views/mall/trade/order/modules/update-remark-form.vue new file mode 100644 index 000000000..b8a1a1718 --- /dev/null +++ b/apps/web-antd/src/views/mall/trade/order/modules/update-remark-form.vue @@ -0,0 +1,94 @@ + + + + + + + \ No newline at end of file