From 31a583419afa54a97c998928cad82bc26c00466d Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 12 Oct 2025 19:29:55 +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=E5=BF=AB=E9=80=92=E6=A8=A1=E7=89=88=E7=9A=84=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=EF=BC=88antd=20100%=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trade/delivery/expressTemplate/data.ts | 51 ++++--- .../modules/charge-item-form.vue | 55 ++----- .../delivery/expressTemplate/modules/form.vue | 139 +++++++++--------- .../modules/free-item-form.vue | 101 ++++--------- 4 files changed, 141 insertions(+), 205 deletions(-) diff --git a/apps/web-antd/src/views/mall/trade/delivery/expressTemplate/data.ts b/apps/web-antd/src/views/mall/trade/delivery/expressTemplate/data.ts index 40329fa48..0a63d725c 100644 --- a/apps/web-antd/src/views/mall/trade/delivery/expressTemplate/data.ts +++ b/apps/web-antd/src/views/mall/trade/delivery/expressTemplate/data.ts @@ -6,10 +6,32 @@ import { getDictOptions } from '@vben/hooks'; import { z } from '#/adapter/form'; +/** 计费方式列标题映射 */ +export const CHARGE_MODE_TITLE_MAP: Record< + number, + { + extraCountTitle: string; + startCountTitle: string; + } +> = { + 1: { startCountTitle: '首件', extraCountTitle: '续件' }, + 2: { startCountTitle: '首件重量(kg)', extraCountTitle: '续件重量(kg)' }, + 3: { startCountTitle: '首件体积(m³)', extraCountTitle: '续件体积(m³)' }, +}; + +/** 包邮方式列标题映射 */ +export const FREE_MODE_TITLE_MAP: Record = { + 1: { freeCountTitle: '包邮件数' }, + 2: { freeCountTitle: '包邮重量(kg)' }, + 3: { freeCountTitle: '包邮体积(m³)' }, +}; + /** 运费设置表格列 */ -export function useChargesColumns(): VxeTableGridOptions['columns'] { +export function useChargesColumns( + chargeMode = 1, +): VxeTableGridOptions['columns'] { + const chargeTitleMap = CHARGE_MODE_TITLE_MAP[chargeMode]; return [ - { type: 'seq', title: '序号', width: 50 }, { field: 'areaIds', title: '区域', @@ -18,7 +40,7 @@ export function useChargesColumns(): VxeTableGridOptions['columns'] { }, { field: 'startCount', - title: '首件数', + title: chargeTitleMap?.startCountTitle, width: 120, slots: { default: 'startCount' }, }, @@ -30,7 +52,7 @@ export function useChargesColumns(): VxeTableGridOptions['columns'] { }, { field: 'extraCount', - title: '续件数', + title: chargeTitleMap?.extraCountTitle, width: 120, slots: { default: 'extraCount' }, }, @@ -50,9 +72,11 @@ export function useChargesColumns(): VxeTableGridOptions['columns'] { } /** 包邮设置表格列 */ -export function useFreesColumns(): VxeTableGridOptions['columns'] { +export function useFreesColumns( + chargeMode = 1, +): VxeTableGridOptions['columns'] { + const freeTitleMap = FREE_MODE_TITLE_MAP[chargeMode]; return [ - { type: 'seq', title: '序号', width: 50 }, { field: 'areaIds', title: '区域', @@ -61,7 +85,7 @@ export function useFreesColumns(): VxeTableGridOptions['columns'] { }, { field: 'freeCount', - title: '包邮件数', + title: freeTitleMap?.freeCountTitle, width: 120, slots: { default: 'freeCount' }, }, @@ -99,7 +123,6 @@ export function useFormSchema(): VbenFormSchema[] { placeholder: '请输入模板名称', }, rules: 'required', - formItemClass: 'col-span-1', }, { fieldName: 'chargeMode', @@ -111,7 +134,6 @@ export function useFormSchema(): VbenFormSchema[] { optionType: 'button', }, rules: z.number().default(1), - formItemClass: 'col-span-1', }, { fieldName: 'sort', @@ -122,25 +144,18 @@ export function useFormSchema(): VbenFormSchema[] { min: 0, }, rules: 'required', - formItemClass: 'col-span-1', }, { fieldName: 'charges', label: '运费设置', + component: 'Input', formItemClass: 'col-span-3', - dependencies: { - triggerFields: ['chargeMode'], - show: () => true, - }, }, { fieldName: 'frees', label: '包邮设置', + component: 'Input', formItemClass: 'col-span-3', - dependencies: { - triggerFields: [''], - show: () => true, - }, }, ]; } diff --git a/apps/web-antd/src/views/mall/trade/delivery/expressTemplate/modules/charge-item-form.vue b/apps/web-antd/src/views/mall/trade/delivery/expressTemplate/modules/charge-item-form.vue index 9c7faa0e1..2f8f65e50 100644 --- a/apps/web-antd/src/views/mall/trade/delivery/expressTemplate/modules/charge-item-form.vue +++ b/apps/web-antd/src/views/mall/trade/delivery/expressTemplate/modules/charge-item-form.vue @@ -2,45 +2,35 @@ import type { MallDeliveryExpressTemplateApi } from '#/api/mall/trade/delivery/expressTemplate'; import type { SystemAreaApi } from '#/api/system/area'; -import { computed, nextTick, onMounted, ref, watch } from 'vue'; +import { computed, nextTick, ref, watch } from 'vue'; import { InputNumber, TreeSelect } from 'ant-design-vue'; import { TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; -import { getAreaTree } from '#/api/system/area'; -import { useChargesColumns } from '../data'; +import { CHARGE_MODE_TITLE_MAP, useChargesColumns } from '../data'; interface Props { items?: MallDeliveryExpressTemplateApi.TemplateCharge[]; chargeMode?: number; + areaTree?: SystemAreaApi.Area[]; } const props = withDefaults(defineProps(), { items: () => [], chargeMode: 1, + areaTree: () => [], }); const emit = defineEmits(['update:items']); const tableData = ref([]); -const areaTree = ref([]); - -// TODO @AI:待优化; -// 根据计费方式设置列标题 -const columnTitle = computed(() => { - const titleMap = { - 1: { startCountTitle: '首件', extraCountTitle: '续件' }, - 2: { startCountTitle: '首件重量(kg)', extraCountTitle: '续件重量(kg)' }, - 3: { startCountTitle: '首件体积(m³)', extraCountTitle: '续件体积(m³)' }, - }; - return titleMap[props.chargeMode] || titleMap[1]; -}); +const columnTitle = computed(() => CHARGE_MODE_TITLE_MAP[props.chargeMode]); /** 表格配置 */ const [Grid, gridApi] = useVbenVxeGrid({ gridOptions: { - columns: useChargesColumns(), + columns: useChargesColumns(props.chargeMode), data: tableData.value, minHeight: 200, autoResize: true, @@ -68,7 +58,6 @@ watch( tableData.value = [...items]; await nextTick(); await gridApi.grid.reloadData(tableData.value); - updateColumnsTitle(); }, { immediate: true, @@ -79,24 +68,13 @@ watch( watch( () => props.chargeMode, () => { - updateColumnsTitle(); + const columns = useChargesColumns(props.chargeMode); + if (gridApi.grid && columns) { + gridApi.grid.reloadColumn(columns); + } }, ); -/** 更新列标题 */ -function updateColumnsTitle() { - const columns = useChargesColumns(); - const startCountCol = columns.find((col) => col.field === 'startCount'); - const extraCountCol = columns.find((col) => col.field === 'extraCount'); - - if (startCountCol) startCountCol.title = columnTitle.value.startCountTitle; - if (extraCountCol) extraCountCol.title = columnTitle.value.extraCountTitle; - - if (gridApi.grid) { - gridApi.grid.reloadColumn(columns); - } -} - /** 处理新增 */ function handleAdd() { const newRow = { @@ -139,7 +117,7 @@ function validate() { } if (!item.startCount || item.startCount <= 0) { throw new Error( - `运费设置第 ${i + 1} 行:${columnTitle.value.startCountTitle}必须大于 0`, + `运费设置第 ${i + 1} 行:${columnTitle.value?.startCountTitle}必须大于 0`, ); } if (!item.startPrice || item.startPrice <= 0) { @@ -147,7 +125,7 @@ function validate() { } if (!item.extraCount || item.extraCount <= 0) { throw new Error( - `运费设置第 ${i + 1} 行:${columnTitle.value.extraCountTitle}必须大于 0`, + `运费设置第 ${i + 1} 行:${columnTitle.value?.extraCountTitle}必须大于 0`, ); } if (!item.extraPrice || item.extraPrice <= 0) { @@ -159,16 +137,12 @@ function validate() { defineExpose({ validate, }); - -/** 初始化 */ -onMounted(async () => { - areaTree.value = await getAreaTree(); -});