From 76b00821cbb68d12936f8c15c517c0721102891a Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 2 Oct 2025 20:14:20 +0800 Subject: [PATCH 01/87] =?UTF-8?q?feat=EF=BC=9A=E3=80=90antd=E3=80=91?= =?UTF-8?q?=E3=80=90erp=20=E7=B3=BB=E7=BB=9F=E3=80=91home=20=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E7=9A=84=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/views/erp/home/index.vue | 4 ++-- .../erp/home/{components => modules}/SummaryCard.vue | 1 - .../home/{components => modules}/TimeSummaryChart.vue | 11 ----------- 3 files changed, 2 insertions(+), 14 deletions(-) rename apps/web-antd/src/views/erp/home/{components => modules}/SummaryCard.vue (96%) rename apps/web-antd/src/views/erp/home/{components => modules}/TimeSummaryChart.vue (96%) diff --git a/apps/web-antd/src/views/erp/home/index.vue b/apps/web-antd/src/views/erp/home/index.vue index 8befaf713..7b9d86e26 100644 --- a/apps/web-antd/src/views/erp/home/index.vue +++ b/apps/web-antd/src/views/erp/home/index.vue @@ -5,8 +5,8 @@ import { DocAlert, Page } from '@vben/common-ui'; import { Col, Row, Spin } from 'ant-design-vue'; -import SummaryCard from './components/SummaryCard.vue'; -import TimeSummaryChart from './components/TimeSummaryChart.vue'; +import SummaryCard from './modules/SummaryCard.vue'; +import TimeSummaryChart from './modules/TimeSummaryChart.vue'; /** ERP首页 */ defineOptions({ name: 'ErpHome' }); diff --git a/apps/web-antd/src/views/erp/home/components/SummaryCard.vue b/apps/web-antd/src/views/erp/home/modules/SummaryCard.vue similarity index 96% rename from apps/web-antd/src/views/erp/home/components/SummaryCard.vue rename to apps/web-antd/src/views/erp/home/modules/SummaryCard.vue index fc36c15d1..ff98e556a 100644 --- a/apps/web-antd/src/views/erp/home/components/SummaryCard.vue +++ b/apps/web-antd/src/views/erp/home/modules/SummaryCard.vue @@ -32,7 +32,6 @@ const props = withDefaults(defineProps(), { }); /** 概览数据 */ -// TODO @nehc:应该是有 8 个小卡片,少了 4 个? const overviewItems = computed(() => [ { icon: SvgCardIcon, diff --git a/apps/web-antd/src/views/erp/home/components/TimeSummaryChart.vue b/apps/web-antd/src/views/erp/home/modules/TimeSummaryChart.vue similarity index 96% rename from apps/web-antd/src/views/erp/home/components/TimeSummaryChart.vue rename to apps/web-antd/src/views/erp/home/modules/TimeSummaryChart.vue index e24f2e4b1..9bdc96eed 100644 --- a/apps/web-antd/src/views/erp/home/components/TimeSummaryChart.vue +++ b/apps/web-antd/src/views/erp/home/modules/TimeSummaryChart.vue @@ -123,11 +123,9 @@ watch( if (!val || val.length === 0) { return; } - // 更新图表数据 const xAxisData = val.map((item) => item.time); const seriesData = val.map((item) => item.price); - const options = { ...lineChartOptions, xAxis: { @@ -141,7 +139,6 @@ watch( }, ], }; - renderEcharts(options); }, { immediate: true }, @@ -151,14 +148,6 @@ watch( onMounted(() => { initData(); }); - -/** 暴露数据给父组件使用 */ -defineExpose({ - saleSummary, - purchaseSummary, - saleTimeSummaryList, - purchaseTimeSummaryList, -}); - + + - + - + + - + - + - + - + -- Gitee From e9fafab07c94413d21df02c9dc1756bf1eb2b8bd Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 3 Oct 2025 20:06:05 +0800 Subject: [PATCH 16/87] =?UTF-8?q?feat=EF=BC=9A=E3=80=90antd=E3=80=91?= =?UTF-8?q?=E3=80=90erp=20=E7=B3=BB=E7=BB=9F=E3=80=91sale/order=20?= =?UTF-8?q?=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96(form=20?= =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web-antd/src/views/erp/sale/order/data.ts | 53 +++++++-------- .../src/views/erp/sale/order/modules/form.vue | 10 +-- .../erp/sale/order/modules/item-form.vue | 67 +++++++------------ 3 files changed, 56 insertions(+), 74 deletions(-) diff --git a/apps/web-antd/src/views/erp/sale/order/data.ts b/apps/web-antd/src/views/erp/sale/order/data.ts index 5770b2813..2586ac5ea 100644 --- a/apps/web-antd/src/views/erp/sale/order/data.ts +++ b/apps/web-antd/src/views/erp/sale/order/data.ts @@ -15,38 +15,37 @@ import { getSimpleUserList } from '#/api/system/user'; export function useFormSchema(): VbenFormSchema[] { return [ { + fieldName: 'id', component: 'Input', - componentProps: { - style: { display: 'none' }, + dependencies: { + triggerFields: [''], + show: () => false, }, - fieldName: 'id', - label: 'ID', - hideLabel: true, - formItemClass: 'hidden', }, { + fieldName: 'no', + label: '订单单号', component: 'Input', componentProps: { placeholder: '系统自动生成', disabled: true, }, - fieldName: 'no', - label: '订单单号', }, { + fieldName: 'orderTime', + label: '订单时间', component: 'DatePicker', componentProps: { placeholder: '选择订单时间', showTime: true, format: 'YYYY-MM-DD HH:mm:ss', valueFormat: 'x', - style: { width: '100%' }, }, - fieldName: 'orderTime', - label: '订单时间', rules: 'required', }, { + label: '客户', + fieldName: 'customerId', component: 'ApiSelect', componentProps: { placeholder: '请选择客户', @@ -58,8 +57,6 @@ export function useFormSchema(): VbenFormSchema[] { value: 'id', }, }, - fieldName: 'customerId', - label: '客户', rules: 'required', }, { @@ -78,15 +75,18 @@ export function useFormSchema(): VbenFormSchema[] { }, }, { + fieldName: 'remark', + label: '备注', component: 'Textarea', componentProps: { placeholder: '请输入备注', autoSize: { minRows: 1, maxRows: 1 }, }, - fieldName: 'remark', - label: '备注', + formItemClass: 'col-span-2', }, { + fieldName: 'fileUrl', + label: '附件', component: 'FileUpload', componentProps: { maxNumber: 1, @@ -104,54 +104,51 @@ export function useFormSchema(): VbenFormSchema[] { ], showDescription: true, }, - fieldName: 'fileUrl', - label: '附件', formItemClass: 'col-span-3', }, { - fieldName: 'product', + fieldName: 'items', label: '产品清单', component: 'Input', formItemClass: 'col-span-3', }, { + fieldName: 'discountPercent', + label: '优惠率(%)', component: 'InputNumber', componentProps: { placeholder: '请输入优惠率', min: 0, max: 100, precision: 2, - style: { width: '100%' }, }, - fieldName: 'discountPercent', - label: '优惠率(%)', rules: z.number().min(0).optional(), }, { + fieldName: 'discountPrice', + label: '付款优惠', component: 'InputNumber', componentProps: { placeholder: '收款优惠', precision: 2, formatter: erpPriceInputFormatter, disabled: true, - style: { width: '100%' }, }, - fieldName: 'discountPrice', - label: '付款优惠', }, { + fieldName: 'totalPrice', + label: '优惠后金额', component: 'InputNumber', componentProps: { placeholder: '优惠后金额', precision: 2, formatter: erpPriceInputFormatter, disabled: true, - style: { width: '100%' }, }, - fieldName: 'totalPrice', - label: '优惠后金额', }, { + fieldName: 'accountId', + label: '结算账户', component: 'ApiSelect', componentProps: { placeholder: '请选择结算账户', @@ -163,8 +160,6 @@ export function useFormSchema(): VbenFormSchema[] { value: 'id', }, }, - fieldName: 'accountId', - label: '结算账户', }, { component: 'InputNumber', diff --git a/apps/web-antd/src/views/erp/sale/order/modules/form.vue b/apps/web-antd/src/views/erp/sale/order/modules/form.vue index 2a1096aca..3145fd2f8 100644 --- a/apps/web-antd/src/views/erp/sale/order/modules/form.vue +++ b/apps/web-antd/src/views/erp/sale/order/modules/form.vue @@ -45,6 +45,7 @@ const [Form, formApi] = useVbenForm({ schema: useFormSchema(), showDefaultActions: false, handleValuesChange: (values, changedFields) => { + // 目的:同步到 item-form 组件,触发整体的价格计算 if (formData.value && changedFields.includes('discountPercent')) { formData.value.discountPercent = values.discountPercent; } @@ -54,9 +55,10 @@ const [Form, formApi] = useVbenForm({ /** 更新商品项 */ const handleUpdateItems = (items: ErpSaleOrderApi.SaleOrderItem[]) => { formData.value = modalApi.getData(); - if (formData.value) { - formData.value.items = items; - } + formData.value.items = items; + formApi.setValues({ + items, + }); }; /** 更新优惠金额 */ @@ -140,7 +142,7 @@ const [Modal, modalApi] = useVbenModal({ :show-confirm-button="formType !== 'detail'" >
- + + + @@ -244,13 +277,17 @@ defineExpose({
合计:
- 数量:{{ getSummaries().count }} - 金额:{{ getSummaries().totalProductPrice }} - 税额:{{ getSummaries().taxPrice }} - 税额合计:{{ getSummaries().totalPrice }} + 数量:{{ erpCountInputFormatter(summaries.count) }} + + 金额:{{ erpPriceInputFormatter(summaries.totalProductPrice) }} + + 税额:{{ erpPriceInputFormatter(summaries.taxPrice) }} + + 税额合计:{{ erpPriceInputFormatter(summaries.totalPrice) }} +
- + \ No newline at end of file diff --git a/apps/web-antd/src/views/erp/purchase/in/modules/select-purchase-order-grid.vue b/apps/web-antd/src/views/erp/purchase/in/modules/purchase-order-select-grid.vue similarity index 100% rename from apps/web-antd/src/views/erp/purchase/in/modules/select-purchase-order-grid.vue rename to apps/web-antd/src/views/erp/purchase/in/modules/purchase-order-select-grid.vue diff --git a/apps/web-antd/src/views/erp/purchase/in/modules/select-purchase-order-form.vue b/apps/web-antd/src/views/erp/purchase/in/modules/purchase-order-select.vue similarity index 96% rename from apps/web-antd/src/views/erp/purchase/in/modules/select-purchase-order-form.vue rename to apps/web-antd/src/views/erp/purchase/in/modules/purchase-order-select.vue index 971c1ab17..88ddf8c5c 100644 --- a/apps/web-antd/src/views/erp/purchase/in/modules/select-purchase-order-form.vue +++ b/apps/web-antd/src/views/erp/purchase/in/modules/purchase-order-select.vue @@ -7,7 +7,7 @@ import { IconifyIcon } from '@vben/icons'; import { Input, message, Modal } from 'ant-design-vue'; -import SelectPurchaseOrderGrid from './select-purchase-order-grid.vue'; +import SelectPurchaseOrderGrid from './purchase-order-select-grid.vue'; const props = defineProps({ orderNo: { -- Gitee From ff2f176917fdb477c8570d225379969d97c58dff Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 4 Oct 2025 20:37:30 +0800 Subject: [PATCH 40/87] =?UTF-8?q?feat=EF=BC=9A=E3=80=90antd=E3=80=91?= =?UTF-8?q?=E3=80=90erp=20=E7=B3=BB=E7=BB=9F=E3=80=91purchase/in=20?= =?UTF-8?q?=E9=87=8D=E6=9E=84=204/4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/erp/purchase/in/data.ts | 16 ++++- .../src/views/erp/purchase/in/index.vue | 5 +- .../views/erp/purchase/in/modules/form.vue | 9 ++- .../in/modules/purchase-order-select-grid.vue | 55 -------------- .../in/modules/purchase-order-select.vue | 71 +++++++++++++++---- 5 files changed, 86 insertions(+), 70 deletions(-) delete mode 100644 apps/web-antd/src/views/erp/purchase/in/modules/purchase-order-select-grid.vue diff --git a/apps/web-antd/src/views/erp/purchase/in/data.ts b/apps/web-antd/src/views/erp/purchase/in/data.ts index e7d5ecc59..6d1d33d5a 100644 --- a/apps/web-antd/src/views/erp/purchase/in/data.ts +++ b/apps/web-antd/src/views/erp/purchase/in/data.ts @@ -189,7 +189,6 @@ export function useFormSchema(formType: string): VbenFormSchema[] { component: 'ApiSelect', componentProps: { placeholder: '请选择结算账户', - disabled: true, allowClear: true, showSearch: true, api: getAccountSimpleList, @@ -414,6 +413,21 @@ export function useGridFormSchema(): VbenFormSchema[] { allowClear: true, }, }, + { + fieldName: 'accountId', + label: '结算账户', + component: 'ApiSelect', + componentProps: { + placeholder: '请选择结算账户', + allowClear: true, + showSearch: true, + api: getAccountSimpleList, + fieldNames: { + label: 'name', + value: 'id', + }, + }, + }, { fieldName: 'paymentStatus', label: '付款状态', diff --git a/apps/web-antd/src/views/erp/purchase/in/index.vue b/apps/web-antd/src/views/erp/purchase/in/index.vue index 77d1eebbe..2b4e3487a 100644 --- a/apps/web-antd/src/views/erp/purchase/in/index.vue +++ b/apps/web-antd/src/views/erp/purchase/in/index.vue @@ -66,7 +66,10 @@ async function handleDelete(ids: number[]) { } /** 审批/反审批操作 */ -async function handleUpdateStatus(row: ErpPurchaseInApi.PurchaseIn, status: number) { +async function handleUpdateStatus( + row: ErpPurchaseInApi.PurchaseIn, + status: number, +) { const hideLoading = message.loading({ content: `确定${status === 20 ? '审批' : '反审批'}该订单吗?`, duration: 0, diff --git a/apps/web-antd/src/views/erp/purchase/in/modules/form.vue b/apps/web-antd/src/views/erp/purchase/in/modules/form.vue index 382f520e2..029092f83 100644 --- a/apps/web-antd/src/views/erp/purchase/in/modules/form.vue +++ b/apps/web-antd/src/views/erp/purchase/in/modules/form.vue @@ -10,6 +10,7 @@ import { $t } from '@vben/locales'; import { message } from 'ant-design-vue'; import { useVbenForm } from '#/adapter/form'; +import { getAccountSimpleList } from '#/api/erp/finance/account'; import { createPurchaseIn, getPurchaseIn, @@ -178,6 +179,12 @@ const [Modal, modalApi] = useVbenModal({ formApi.setDisabled(formType.value === 'detail'); formApi.updateSchema(useFormSchema(formType.value)); if (!data || !data.id) { + // 新增时,默认选中账户 + const accountList = await getAccountSimpleList(); + const defaultAccount = accountList.find((item) => item.defaultStatus); + if (defaultAccount) { + await formApi.setValues({ accountId: defaultAccount.id }); + } return; } modalApi.lock(); @@ -220,4 +227,4 @@ const [Modal, modalApi] = useVbenModal({ - \ No newline at end of file + diff --git a/apps/web-antd/src/views/erp/purchase/in/modules/purchase-order-select-grid.vue b/apps/web-antd/src/views/erp/purchase/in/modules/purchase-order-select-grid.vue deleted file mode 100644 index 25fdd9fb4..000000000 --- a/apps/web-antd/src/views/erp/purchase/in/modules/purchase-order-select-grid.vue +++ /dev/null @@ -1,55 +0,0 @@ - - - diff --git a/apps/web-antd/src/views/erp/purchase/in/modules/purchase-order-select.vue b/apps/web-antd/src/views/erp/purchase/in/modules/purchase-order-select.vue index 88ddf8c5c..45b0ec65b 100644 --- a/apps/web-antd/src/views/erp/purchase/in/modules/purchase-order-select.vue +++ b/apps/web-antd/src/views/erp/purchase/in/modules/purchase-order-select.vue @@ -1,4 +1,5 @@ @@ -138,7 +140,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ url="https://doc.iocoder.cn/erp/purchase/" /> - + -- Gitee From 7d3f5dc149738ed07bbdc284280cffc8bc781003 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 4 Oct 2025 21:26:43 +0800 Subject: [PATCH 44/87] =?UTF-8?q?feat=EF=BC=9A=E3=80=90antd=E3=80=91?= =?UTF-8?q?=E3=80=90erp=20=E7=B3=BB=E7=BB=9F=E3=80=91purchase/return=20?= =?UTF-8?q?=E9=87=8D=E6=9E=84=204/4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/erp/purchase/return/data.ts | 16 ----- .../return/modules/purchase-order-grid.vue | 55 -------------- .../return/modules/purchase-order-select.vue | 71 +++++++++++++++---- 3 files changed, 59 insertions(+), 83 deletions(-) delete mode 100644 apps/web-antd/src/views/erp/purchase/return/modules/purchase-order-grid.vue diff --git a/apps/web-antd/src/views/erp/purchase/return/data.ts b/apps/web-antd/src/views/erp/purchase/return/data.ts index 48d030114..71d6ba596 100644 --- a/apps/web-antd/src/views/erp/purchase/return/data.ts +++ b/apps/web-antd/src/views/erp/purchase/return/data.ts @@ -74,21 +74,6 @@ export function useFormSchema(formType: string): VbenFormSchema[] { }, rules: 'required', }, - { - fieldName: 'purchaseUserId', - label: '采购人员', - component: 'ApiSelect', - componentProps: { - placeholder: '请选择采购人员', - allowClear: true, - showSearch: true, - api: getSimpleUserList, - fieldNames: { - label: 'nickname', - value: 'id', - }, - }, - }, { fieldName: 'remark', label: '备注', @@ -188,7 +173,6 @@ export function useFormSchema(formType: string): VbenFormSchema[] { component: 'ApiSelect', componentProps: { placeholder: '请选择结算账户', - disabled: true, allowClear: true, showSearch: true, api: getAccountSimpleList, diff --git a/apps/web-antd/src/views/erp/purchase/return/modules/purchase-order-grid.vue b/apps/web-antd/src/views/erp/purchase/return/modules/purchase-order-grid.vue deleted file mode 100644 index b22d652d9..000000000 --- a/apps/web-antd/src/views/erp/purchase/return/modules/purchase-order-grid.vue +++ /dev/null @@ -1,55 +0,0 @@ - - - diff --git a/apps/web-antd/src/views/erp/purchase/return/modules/purchase-order-select.vue b/apps/web-antd/src/views/erp/purchase/return/modules/purchase-order-select.vue index 1add67317..45b0ec65b 100644 --- a/apps/web-antd/src/views/erp/purchase/return/modules/purchase-order-select.vue +++ b/apps/web-antd/src/views/erp/purchase/return/modules/purchase-order-select.vue @@ -1,4 +1,5 @@ @@ -124,97 +138,85 @@ const [Grid, gridApi] = useVbenVxeGrid({ /> + - - - - diff --git a/apps/web-antd/src/views/erp/stock/in/modules/form.vue b/apps/web-antd/src/views/erp/stock/in/modules/form.vue index a18f6c1ce..ee9984ce8 100644 --- a/apps/web-antd/src/views/erp/stock/in/modules/form.vue +++ b/apps/web-antd/src/views/erp/stock/in/modules/form.vue @@ -1,33 +1,32 @@ diff --git a/apps/web-antd/src/views/erp/stock/out/modules/form.vue b/apps/web-antd/src/views/erp/stock/out/modules/form.vue index 7e8a84031..d8ae8a448 100644 --- a/apps/web-antd/src/views/erp/stock/out/modules/form.vue +++ b/apps/web-antd/src/views/erp/stock/out/modules/form.vue @@ -1,7 +1,7 @@ diff --git a/apps/web-antd/src/views/erp/stock/move/modules/form.vue b/apps/web-antd/src/views/erp/stock/move/modules/form.vue index 35b51a969..ba04b7533 100644 --- a/apps/web-antd/src/views/erp/stock/move/modules/form.vue +++ b/apps/web-antd/src/views/erp/stock/move/modules/form.vue @@ -1,7 +1,7 @@ diff --git a/apps/web-antd/src/views/erp/stock/check/modules/form.vue b/apps/web-antd/src/views/erp/stock/check/modules/form.vue index 7999e0038..96eb0c969 100644 --- a/apps/web-antd/src/views/erp/stock/check/modules/form.vue +++ b/apps/web-antd/src/views/erp/stock/check/modules/form.vue @@ -1,7 +1,7 @@ diff --git a/apps/web-antd/src/views/erp/finance/payment/modules/item-form.vue b/apps/web-antd/src/views/erp/finance/payment/modules/item-form.vue index 476b8e27a..937586aac 100644 --- a/apps/web-antd/src/views/erp/finance/payment/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/finance/payment/modules/item-form.vue @@ -20,15 +20,21 @@ interface Props { items?: ErpFinancePaymentApi.FinancePaymentItem[]; supplierId?: number; disabled?: boolean; + discountPrice?: number; } const props = withDefaults(defineProps(), { items: () => [], supplierId: undefined, disabled: false, + discountPrice: 0, }); -const emit = defineEmits(['update:items']); +const emit = defineEmits([ + 'update:items', + 'update:total-price', + 'update:payment-price', +]); const tableData = ref([]); // 表格数据 @@ -78,7 +84,6 @@ watch( if (!items) { return; } - items.forEach((item) => initRow(item)); tableData.value = [...items]; await nextTick(); // 特殊:保证 gridApi 已经初始化 await gridApi.grid.reloadData(tableData.value); @@ -91,6 +96,29 @@ watch( }, ); +/** 计算 totalPrice、paymentPrice 价格 */ +watch( + () => [tableData.value, props.discountPrice], + () => { + if (!tableData.value || tableData.value.length === 0) { + return; + } + const totalPrice = tableData.value.reduce( + (prev, curr) => prev + (curr.totalPrice || 0), + 0, + ); + const paymentPrice = tableData.value.reduce( + (prev, curr) => prev + (curr.paymentPrice || 0), + 0, + ); + const finalPaymentPrice = paymentPrice - (props.discountPrice || 0); + // 通知父组件更新 + emit('update:total-price', totalPrice); + emit('update:payment-price', finalPaymentPrice); + }, + { deep: true }, +); + /** 添加采购入库单 */ const purchaseInSelectRef = ref(); const handleOpenPurchaseIn = () => { @@ -168,11 +196,6 @@ const handleRowChange = (row: any) => { emit('update:items', [...tableData.value]); }; -/** 初始化行数据 */ -const initRow = (item: any) => { - // 不需要特殊初始化 -}; - /** 表单校验 */ const validate = () => { // 检查是否有明细 diff --git a/apps/web-antd/src/views/erp/finance/payment/modules/purchase-in-select.vue b/apps/web-antd/src/views/erp/finance/payment/modules/purchase-in-select.vue index f66f02634..efcea61fc 100644 --- a/apps/web-antd/src/views/erp/finance/payment/modules/purchase-in-select.vue +++ b/apps/web-antd/src/views/erp/finance/payment/modules/purchase-in-select.vue @@ -9,6 +9,8 @@ import { message, Modal } from 'ant-design-vue'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { getPurchaseInPage } from '#/api/erp/purchase/in'; +import { usePurchaseInGridColumns, usePurchaseInGridFormSchema } from '../data'; + const emit = defineEmits<{ success: [rows: ErpPurchaseInApi.PurchaseIn[]]; }>(); @@ -20,97 +22,10 @@ const selectedRows = ref([]); // 选中的行 /** 表格配置 */ const [Grid, gridApi] = useVbenVxeGrid({ formOptions: { - schema: [ - { - fieldName: 'no', - label: '入库单号', - component: 'Input', - componentProps: { - placeholder: '请输入入库单号', - allowClear: true, - }, - }, - { - fieldName: 'supplierId', - label: '供应商', - component: 'Input', - componentProps: { - disabled: true, - placeholder: '已自动选择供应商', - }, - }, - { - fieldName: 'paymentStatus', - label: '付款状态', - component: 'Select', - componentProps: { - options: [ - { label: '未付款', value: 0 }, - { label: '部分付款', value: 1 }, - { label: '全部付款', value: 2 }, - ], - placeholder: '请选择付款状态', - allowClear: true, - }, - }, - ], + schema: usePurchaseInGridFormSchema(), }, gridOptions: { - columns: [ - { - type: 'checkbox', - width: 50, - fixed: 'left', - }, - { - field: 'no', - title: '入库单号', - width: 200, - fixed: 'left', - }, - { - field: 'supplierName', - title: '供应商', - minWidth: 120, - }, - { - field: 'inTime', - title: '入库时间', - width: 160, - formatter: 'formatDate', - }, - { - field: 'totalPrice', - title: '应付金额', - formatter: 'formatAmount2', - minWidth: 120, - }, - { - field: 'paymentPrice', - title: '已付金额', - formatter: 'formatAmount2', - minWidth: 120, - }, - { - field: 'unPaymentPrice', - title: '未付金额', - // TODO @AI:芋艿,后续统一改; - formatter: ({ row }) => { - const unPaymentPrice = row.totalPrice - row.paymentPrice; - return `${unPaymentPrice?.toFixed(2) || '0.00'}元`; - }, - minWidth: 120, - }, - { - field: 'status', - title: '状态', - minWidth: 100, - cellRender: { - name: 'CellDict', - props: { type: 'ERP_AUDIT_STATUS' }, - }, - }, - ], + columns: usePurchaseInGridColumns(), height: 'auto', keepSource: true, proxyConfig: { diff --git a/apps/web-antd/src/views/erp/finance/payment/modules/sale-return-select.vue b/apps/web-antd/src/views/erp/finance/payment/modules/sale-return-select.vue index d03fb806c..e7100ad35 100644 --- a/apps/web-antd/src/views/erp/finance/payment/modules/sale-return-select.vue +++ b/apps/web-antd/src/views/erp/finance/payment/modules/sale-return-select.vue @@ -9,6 +9,8 @@ import { message, Modal } from 'ant-design-vue'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { getPurchaseReturnPage } from '#/api/erp/purchase/return'; +import { useSaleReturnGridColumns, useSaleReturnGridFormSchema } from '../data'; + const emit = defineEmits<{ success: [rows: ErpPurchaseReturnApi.PurchaseReturn[]]; }>(); @@ -20,96 +22,10 @@ const selectedRows = ref([]); // 选中 /** 表格配置 */ const [Grid, gridApi] = useVbenVxeGrid({ formOptions: { - schema: [ - { - fieldName: 'no', - label: '退货单号', - component: 'Input', - componentProps: { - placeholder: '请输入退货单号', - allowClear: true, - }, - }, - { - fieldName: 'supplierId', - label: '供应商', - component: 'Input', - componentProps: { - disabled: true, - placeholder: '已自动选择供应商', - }, - }, - { - fieldName: 'refundStatus', - label: '退款状态', - component: 'Select', - componentProps: { - options: [ - { label: '未退款', value: 0 }, - { label: '部分退款', value: 1 }, - { label: '全部退款', value: 2 }, - ], - placeholder: '请选择退款状态', - allowClear: true, - }, - }, - ], + schema: useSaleReturnGridFormSchema(), }, gridOptions: { - columns: [ - { - type: 'checkbox', - width: 50, - fixed: 'left', - }, - { - field: 'no', - title: '退货单号', - width: 200, - fixed: 'left', - }, - { - field: 'supplierName', - title: '供应商', - minWidth: 120, - }, - { - field: 'returnTime', - title: '退货时间', - width: 160, - formatter: 'formatDate', - }, - { - field: 'totalPrice', - title: '应退金额', - formatter: 'formatAmount2', - minWidth: 120, - }, - { - field: 'refundPrice', - title: '已退金额', - formatter: 'formatAmount2', - minWidth: 120, - }, - { - field: 'unRefundPrice', - title: '未退金额', - formatter: ({ row }) => { - const unRefundPrice = row.totalPrice - row.refundPrice; - return `${unRefundPrice?.toFixed(2) || '0.00'}元`; - }, - minWidth: 120, - }, - { - field: 'status', - title: '状态', - minWidth: 100, - cellRender: { - name: 'CellDict', - props: { type: 'ERP_AUDIT_STATUS' }, - }, - }, - ], + columns: useSaleReturnGridColumns(), height: 'auto', keepSource: true, proxyConfig: { @@ -158,16 +74,14 @@ const [Grid, gridApi] = useVbenVxeGrid({ /** 打开弹窗 */ const openModal = (id: number) => { + // 重置数据 supplierId.value = id; open.value = true; selectedRows.value = []; - // 重置表单并设置供应商ID + // 查询列表 gridApi.formApi?.resetForm(); gridApi.formApi?.setValues({ supplierId: id }); - // 延迟查询,确保表单值已设置 - setTimeout(() => { - gridApi.query(); - }, 100); + gridApi.query(); }; /** 确认选择 */ @@ -176,25 +90,7 @@ const handleOk = () => { message.warning('请选择要添加的采购退货单'); return; } - - // 过滤已全部退款的单据 - const validRows = selectedRows.value.filter((row) => { - const unRefundPrice = row.totalPrice - row.refundPrice; - return unRefundPrice > 0; - }); - - if (validRows.length === 0) { - message.warning('所选的退货单已全部退款,无需再付款'); - return; - } - - if (validRows.length < selectedRows.value.length) { - message.warning( - `已过滤${selectedRows.value.length - validRows.length}个已全部退款的退货单`, - ); - } - - emit('success', validRows); + emit('success', selectedRows.value); open.value = false; }; @@ -203,14 +99,13 @@ defineExpose({ open: openModal }); \ No newline at end of file + diff --git a/apps/web-antd/src/views/erp/finance/receipt/modules/sale-out-select.vue b/apps/web-antd/src/views/erp/finance/receipt/modules/sale-out-select.vue index 2556303bb..19d023125 100644 --- a/apps/web-antd/src/views/erp/finance/receipt/modules/sale-out-select.vue +++ b/apps/web-antd/src/views/erp/finance/receipt/modules/sale-out-select.vue @@ -55,11 +55,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ }, } as VxeTableGridOptions, gridEvents: { - checkboxChange: ({ - records, - }: { - records: ErpSaleOutApi.SaleOut[]; - }) => { + checkboxChange: ({ records }: { records: ErpSaleOutApi.SaleOut[] }) => { selectedRows.value = records; }, checkboxAll: ({ records }: { records: ErpSaleOutApi.SaleOut[] }) => { @@ -105,4 +101,4 @@ defineExpose({ open: openModal }); table-title="销售出库单列表(仅展示可收款的单据)" /> - \ No newline at end of file + diff --git a/apps/web-antd/src/views/erp/finance/receipt/modules/sale-return-select.vue b/apps/web-antd/src/views/erp/finance/receipt/modules/sale-return-select.vue index ebea47cd4..8dfa97c3c 100644 --- a/apps/web-antd/src/views/erp/finance/receipt/modules/sale-return-select.vue +++ b/apps/web-antd/src/views/erp/finance/receipt/modules/sale-return-select.vue @@ -105,4 +105,4 @@ defineExpose({ open: openModal }); table-title="销售退货单列表(仅展示可退款的单据)" /> - \ No newline at end of file + -- Gitee From 8266490674b721f4e2f4c8c98715ef238342f40e Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 5 Oct 2025 13:59:14 +0800 Subject: [PATCH 59/87] =?UTF-8?q?feat=EF=BC=9A=E3=80=90antd=E3=80=91?= =?UTF-8?q?=E3=80=90erp=20=E7=B3=BB=E7=BB=9F=E3=80=91finance/receipt=20?= =?UTF-8?q?=E7=9A=84=E8=BF=81=E7=A7=BB=204/4=EF=BC=88=E5=B7=B2=E5=AE=8C?= =?UTF-8?q?=E6=88=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/views/erp/finance/payment/data.ts | 6 ++---- .../src/views/erp/finance/payment/modules/item-form.vue | 5 +---- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/apps/web-antd/src/views/erp/finance/payment/data.ts b/apps/web-antd/src/views/erp/finance/payment/data.ts index f174beca9..a33430faf 100644 --- a/apps/web-antd/src/views/erp/finance/payment/data.ts +++ b/apps/web-antd/src/views/erp/finance/payment/data.ts @@ -176,9 +176,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { } /** 表单的明细表格列 */ -export function useFormItemColumns( - formData?: any[], -): VxeTableGridOptions['columns'] { +export function useFormItemColumns(): VxeTableGridOptions['columns'] { return [ { type: 'seq', title: '序号', minWidth: 50, fixed: 'left' }, { @@ -408,7 +406,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { ]; } -4; /** 采购入库单选择表单的配置项 */ +/** 采购入库单选择表单的配置项 */ export function usePurchaseInGridFormSchema(): VbenFormSchema[] { return [ { diff --git a/apps/web-antd/src/views/erp/finance/payment/modules/item-form.vue b/apps/web-antd/src/views/erp/finance/payment/modules/item-form.vue index 937586aac..60195d7a6 100644 --- a/apps/web-antd/src/views/erp/finance/payment/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/finance/payment/modules/item-form.vue @@ -59,7 +59,7 @@ const summaries = computed(() => { /** 表格配置 */ const [Grid, gridApi] = useVbenVxeGrid({ gridOptions: { - columns: useFormItemColumns(tableData.value), + columns: useFormItemColumns(), data: tableData.value, minHeight: 250, autoResize: true, @@ -87,9 +87,6 @@ watch( tableData.value = [...items]; await nextTick(); // 特殊:保证 gridApi 已经初始化 await gridApi.grid.reloadData(tableData.value); - // 更新表格列配置 - const columns = useFormItemColumns(tableData.value); - await gridApi.grid.reloadColumn(columns); }, { immediate: true, -- Gitee From c6bd38f98d2a1d61ea7ad92f91bcaca7d137b140 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 5 Oct 2025 14:19:28 +0800 Subject: [PATCH 60/87] =?UTF-8?q?fix=EF=BC=9A=E3=80=90antd=E3=80=91?= =?UTF-8?q?=E3=80=90erp=20=E7=B3=BB=E7=BB=9F=E3=80=91finance/account=20?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E9=BB=98=E8=AE=A4=E7=9A=84=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E6=9C=AA=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/api/erp/finance/account/index.ts | 1 - .../web-antd/src/api/erp/purchase/in/index.ts | 7 ----- apps/web-antd/src/api/erp/stock/out/index.ts | 1 + .../src/views/erp/finance/account/data.ts | 27 +++++++++---------- .../src/views/erp/finance/account/index.vue | 27 +++++++++++++++++-- .../src/views/erp/stock/warehouse/index.vue | 2 +- 6 files changed, 39 insertions(+), 26 deletions(-) diff --git a/apps/web-antd/src/api/erp/finance/account/index.ts b/apps/web-antd/src/api/erp/finance/account/index.ts index 9d5afaf49..e180af65f 100644 --- a/apps/web-antd/src/api/erp/finance/account/index.ts +++ b/apps/web-antd/src/api/erp/finance/account/index.ts @@ -51,7 +51,6 @@ export function updateAccount(data: ErpAccountApi.Account) { } /** 修改结算账户默认状态 */ -// TODO @芋艿:这里有少迁移的 export function updateAccountDefaultStatus(id: number, defaultStatus: boolean) { return requestClient.put('/erp/account/update-default-status', null, { params: { id, defaultStatus }, diff --git a/apps/web-antd/src/api/erp/purchase/in/index.ts b/apps/web-antd/src/api/erp/purchase/in/index.ts index 03b492a99..f807e2800 100644 --- a/apps/web-antd/src/api/erp/purchase/in/index.ts +++ b/apps/web-antd/src/api/erp/purchase/in/index.ts @@ -49,13 +49,6 @@ export namespace ErpPurchaseInApi { supplierId?: number; status?: number; } - - // TODO @nehc:updatePurchaseInStatus 是不是需要? - /** 采购入库状态更新参数 */ - export interface PurchaseInStatusParams { - id: number; - status: number; - } } /** diff --git a/apps/web-antd/src/api/erp/stock/out/index.ts b/apps/web-antd/src/api/erp/stock/out/index.ts index 5ee1a19fa..2f64ff867 100644 --- a/apps/web-antd/src/api/erp/stock/out/index.ts +++ b/apps/web-antd/src/api/erp/stock/out/index.ts @@ -39,6 +39,7 @@ export namespace ErpStockOutApi { customerId?: number; status?: number; } +} /** * 查询其它出库单分页 diff --git a/apps/web-antd/src/views/erp/finance/account/data.ts b/apps/web-antd/src/views/erp/finance/account/data.ts index 595c3cac3..a93b42b8f 100644 --- a/apps/web-antd/src/views/erp/finance/account/data.ts +++ b/apps/web-antd/src/views/erp/finance/account/data.ts @@ -1,13 +1,9 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import { h } from 'vue'; - import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; import { getDictOptions } from '@vben/hooks'; -import { Tag } from 'ant-design-vue'; - import { z } from '#/adapter/form'; /** 新增/修改的表单 */ @@ -127,7 +123,12 @@ export function useGridFormSchema(): VbenFormSchema[] { } /** 列表的字段 */ -export function useGridColumns(): VxeTableGridOptions['columns'] { +export function useGridColumns( + onDefaultStatusChange?: ( + newStatus: boolean, + row: T, + ) => PromiseLike, +): VxeTableGridOptions['columns'] { return [ { field: 'name', @@ -163,16 +164,12 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { field: 'defaultStatus', title: '是否默认', minWidth: 100, - slots: { - default: ({ row }) => { - return h( - Tag, - { - class: 'mr-1', - color: row.defaultStatus ? 'blue' : 'red', - }, - () => (row.defaultStatus ? '是' : '否'), - ); + cellRender: { + attrs: { beforeChange: onDefaultStatusChange }, + name: 'CellSwitch', + props: { + checkedValue: true, + unCheckedValue: false, }, }, }, diff --git a/apps/web-antd/src/views/erp/finance/account/index.vue b/apps/web-antd/src/views/erp/finance/account/index.vue index 52cd2bc72..55dd6e697 100644 --- a/apps/web-antd/src/views/erp/finance/account/index.vue +++ b/apps/web-antd/src/views/erp/finance/account/index.vue @@ -2,7 +2,7 @@ import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { ErpAccountApi } from '#/api/erp/finance/account'; -import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; +import { confirm, DocAlert, Page, useVbenModal } from '@vben/common-ui'; import { downloadFileFromBlobPart } from '@vben/utils'; import { message } from 'ant-design-vue'; @@ -12,6 +12,7 @@ import { deleteAccount, exportAccount, getAccountPage, + updateAccountDefaultStatus, } from '#/api/erp/finance/account'; import { $t } from '#/locales'; @@ -59,12 +60,34 @@ async function handleDelete(row: ErpAccountApi.Account) { } } +/** 修改默认状态 */ +async function handleDefaultStatusChange( + newStatus: boolean, + row: ErpAccountApi.Account, +): Promise { + return new Promise((resolve, reject) => { + const text = newStatus ? '设置' : '取消'; + confirm({ + content: `确认要${text}"${row.name}"默认吗?`, + }) + .then(async () => { + // 更新默认状态 + await updateAccountDefaultStatus(row.id!, newStatus); + message.success(`${text}默认成功`); + resolve(true); + }) + .catch(() => { + reject(new Error('取消操作')); + }); + }); +} + const [Grid, gridApi] = useVbenVxeGrid({ formOptions: { schema: useGridFormSchema(), }, gridOptions: { - columns: useGridColumns(), + columns: useGridColumns(handleDefaultStatusChange), height: 'auto', keepSource: true, proxyConfig: { diff --git a/apps/web-antd/src/views/erp/stock/warehouse/index.vue b/apps/web-antd/src/views/erp/stock/warehouse/index.vue index 3da5da47e..58d931ed2 100644 --- a/apps/web-antd/src/views/erp/stock/warehouse/index.vue +++ b/apps/web-antd/src/views/erp/stock/warehouse/index.vue @@ -3,7 +3,7 @@ import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { ErpWarehouseApi } from '#/api/erp/stock/warehouse'; import { confirm, DocAlert, Page, useVbenModal } from '@vben/common-ui'; -import { downloadFileFromBlobPart, isEmpty } from '@vben/utils'; +import { downloadFileFromBlobPart } from '@vben/utils'; import { message } from 'ant-design-vue'; -- Gitee From 98d7ed663f9a5f7293649aa4f0a2c4687891698a Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 5 Oct 2025 14:38:00 +0800 Subject: [PATCH 61/87] =?UTF-8?q?fix=EF=BC=9A=E3=80=90antd=E3=80=91?= =?UTF-8?q?=E3=80=90erp=20=E7=B3=BB=E7=BB=9F=E3=80=91tableData.value.findI?= =?UTF-8?q?ndex((item)=20=3D>=20item.id=20=3D=3D=3D=20row.id)=20=E4=B8=8D?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=20seq=20=E6=AF=94=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/erp/finance/payment/modules/item-form.vue | 2 +- .../src/views/erp/finance/receipt/modules/item-form.vue | 2 +- .../src/views/erp/purchase/in/modules/item-form.vue | 6 +++--- .../src/views/erp/purchase/order/modules/item-form.vue | 6 +++--- .../src/views/erp/purchase/return/modules/item-form.vue | 6 +++--- .../web-antd/src/views/erp/sale/order/modules/item-form.vue | 6 +++--- apps/web-antd/src/views/erp/sale/out/modules/item-form.vue | 6 +++--- .../src/views/erp/sale/return/modules/item-form.vue | 6 +++--- .../src/views/erp/stock/check/modules/item-form.vue | 6 +++--- apps/web-antd/src/views/erp/stock/in/modules/item-form.vue | 6 +++--- .../web-antd/src/views/erp/stock/move/modules/item-form.vue | 6 +++--- apps/web-antd/src/views/erp/stock/out/modules/item-form.vue | 6 +++--- 12 files changed, 32 insertions(+), 32 deletions(-) diff --git a/apps/web-antd/src/views/erp/finance/payment/modules/item-form.vue b/apps/web-antd/src/views/erp/finance/payment/modules/item-form.vue index 60195d7a6..3dfa62a8e 100644 --- a/apps/web-antd/src/views/erp/finance/payment/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/finance/payment/modules/item-form.vue @@ -65,7 +65,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ autoResize: true, border: true, rowConfig: { - keyField: 'row_id', + keyField: 'seq', isHover: true, }, pagerConfig: { diff --git a/apps/web-antd/src/views/erp/finance/receipt/modules/item-form.vue b/apps/web-antd/src/views/erp/finance/receipt/modules/item-form.vue index 76746cd40..2d9230b69 100644 --- a/apps/web-antd/src/views/erp/finance/receipt/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/finance/receipt/modules/item-form.vue @@ -65,7 +65,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ autoResize: true, border: true, rowConfig: { - keyField: 'row_id', + keyField: 'seq', isHover: true, }, pagerConfig: { diff --git a/apps/web-antd/src/views/erp/purchase/in/modules/item-form.vue b/apps/web-antd/src/views/erp/purchase/in/modules/item-form.vue index cb2d61ba7..45dce4380 100644 --- a/apps/web-antd/src/views/erp/purchase/in/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/purchase/in/modules/item-form.vue @@ -71,7 +71,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ autoResize: true, border: true, rowConfig: { - keyField: 'row_id', + keyField: 'seq', isHover: true, }, pagerConfig: { @@ -131,7 +131,7 @@ watch( /** 处理删除 */ function handleDelete(row: ErpPurchaseInApi.PurchaseInItem) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); } @@ -151,7 +151,7 @@ const handleWarehouseChange = async (row: ErpPurchaseInApi.PurchaseInItem) => { /** 处理行数据变更 */ function handleRowChange(row: any) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index === -1) { tableData.value.push(row); } else { diff --git a/apps/web-antd/src/views/erp/purchase/order/modules/item-form.vue b/apps/web-antd/src/views/erp/purchase/order/modules/item-form.vue index 8f787a9d4..9f4e840a0 100644 --- a/apps/web-antd/src/views/erp/purchase/order/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/purchase/order/modules/item-form.vue @@ -67,7 +67,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ autoResize: true, border: true, rowConfig: { - keyField: 'row_id', + keyField: 'seq', isHover: true, }, pagerConfig: { @@ -142,7 +142,7 @@ function handleAdd() { /** 处理删除 */ function handleDelete(row: ErpPurchaseOrderApi.PurchaseOrderItem) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); } @@ -169,7 +169,7 @@ async function handleProductChange(productId: any, row: any) { /** 处理行数据变更 */ function handleRowChange(row: any) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index === -1) { tableData.value.push(row); } else { diff --git a/apps/web-antd/src/views/erp/purchase/return/modules/item-form.vue b/apps/web-antd/src/views/erp/purchase/return/modules/item-form.vue index 5bf4392f6..818b2f1c7 100644 --- a/apps/web-antd/src/views/erp/purchase/return/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/purchase/return/modules/item-form.vue @@ -71,7 +71,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ autoResize: true, border: true, rowConfig: { - keyField: 'row_id', + keyField: 'seq', isHover: true, }, pagerConfig: { @@ -131,7 +131,7 @@ watch( /** 处理删除 */ function handleDelete(row: ErpPurchaseReturnApi.PurchaseReturnItem) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); } @@ -153,7 +153,7 @@ const handleWarehouseChange = async ( /** 处理行数据变更 */ function handleRowChange(row: any) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index === -1) { tableData.value.push(row); } else { diff --git a/apps/web-antd/src/views/erp/sale/order/modules/item-form.vue b/apps/web-antd/src/views/erp/sale/order/modules/item-form.vue index 36094dc89..1f28a74e2 100644 --- a/apps/web-antd/src/views/erp/sale/order/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/sale/order/modules/item-form.vue @@ -67,7 +67,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ autoResize: true, border: true, rowConfig: { - keyField: 'row_id', + keyField: 'seq', isHover: true, }, pagerConfig: { @@ -142,7 +142,7 @@ function handleAdd() { /** 处理删除 */ function handleDelete(row: ErpSaleOrderApi.SaleOrderItem) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); } @@ -169,7 +169,7 @@ async function handleProductChange(productId: any, row: any) { /** 处理行数据变更 */ function handleRowChange(row: any) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index === -1) { tableData.value.push(row); } else { diff --git a/apps/web-antd/src/views/erp/sale/out/modules/item-form.vue b/apps/web-antd/src/views/erp/sale/out/modules/item-form.vue index 6f97538b1..f7f3011b0 100644 --- a/apps/web-antd/src/views/erp/sale/out/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/sale/out/modules/item-form.vue @@ -71,7 +71,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ autoResize: true, border: true, rowConfig: { - keyField: 'row_id', + keyField: 'seq', isHover: true, }, pagerConfig: { @@ -131,7 +131,7 @@ watch( /** 处理删除 */ function handleDelete(row: ErpSaleOutApi.SaleOutItem) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); } @@ -151,7 +151,7 @@ const handleWarehouseChange = async (row: ErpSaleOutApi.SaleOutItem) => { /** 处理行数据变更 */ function handleRowChange(row: any) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index === -1) { tableData.value.push(row); } else { diff --git a/apps/web-antd/src/views/erp/sale/return/modules/item-form.vue b/apps/web-antd/src/views/erp/sale/return/modules/item-form.vue index c388e1422..9259eb432 100644 --- a/apps/web-antd/src/views/erp/sale/return/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/sale/return/modules/item-form.vue @@ -71,7 +71,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ autoResize: true, border: true, rowConfig: { - keyField: 'row_id', + keyField: 'seq', isHover: true, }, pagerConfig: { @@ -131,7 +131,7 @@ watch( /** 处理删除 */ function handleDelete(row: ErpSaleReturnApi.SaleReturnItem) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); } @@ -151,7 +151,7 @@ const handleWarehouseChange = async (row: ErpSaleReturnApi.SaleReturnItem) => { /** 处理行数据变更 */ function handleRowChange(row: any) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index === -1) { tableData.value.push(row); } else { diff --git a/apps/web-antd/src/views/erp/stock/check/modules/item-form.vue b/apps/web-antd/src/views/erp/stock/check/modules/item-form.vue index ddf093769..54d6e55f9 100644 --- a/apps/web-antd/src/views/erp/stock/check/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/stock/check/modules/item-form.vue @@ -55,7 +55,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ autoResize: true, border: true, rowConfig: { - keyField: 'row_id', + keyField: 'seq', isHover: true, }, pagerConfig: { @@ -106,7 +106,7 @@ function handleAdd() { /** 处理删除 */ function handleDelete(row: ErpStockCheckApi.StockCheckItem) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); } @@ -164,7 +164,7 @@ function handleActualCountChange(actualCount: any, row: any) { /** 处理行数据变更 */ function handleRowChange(row: any) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index === -1) { tableData.value.push(row); } else { diff --git a/apps/web-antd/src/views/erp/stock/in/modules/item-form.vue b/apps/web-antd/src/views/erp/stock/in/modules/item-form.vue index 1c0e6eff0..469c02686 100644 --- a/apps/web-antd/src/views/erp/stock/in/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/stock/in/modules/item-form.vue @@ -55,7 +55,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ autoResize: true, border: true, rowConfig: { - keyField: 'row_id', + keyField: 'seq', isHover: true, }, pagerConfig: { @@ -105,7 +105,7 @@ function handleAdd() { /** 处理删除 */ function handleDelete(row: ErpStockInApi.StockInItem) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); } @@ -150,7 +150,7 @@ async function handleProductChange(productId: any, row: any) { /** 处理行数据变更 */ function handleRowChange(row: any) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index === -1) { tableData.value.push(row); } else { diff --git a/apps/web-antd/src/views/erp/stock/move/modules/item-form.vue b/apps/web-antd/src/views/erp/stock/move/modules/item-form.vue index 3831ec097..5a3b45626 100644 --- a/apps/web-antd/src/views/erp/stock/move/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/stock/move/modules/item-form.vue @@ -55,7 +55,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ autoResize: true, border: true, rowConfig: { - keyField: 'row_id', + keyField: 'seq', isHover: true, }, pagerConfig: { @@ -106,7 +106,7 @@ function handleAdd() { /** 处理删除 */ function handleDelete(row: ErpStockMoveApi.StockMoveItem) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); } @@ -159,7 +159,7 @@ async function handleProductChange(productId: any, row: any) { /** 处理行数据变更 */ function handleRowChange(row: any) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index === -1) { tableData.value.push(row); } else { diff --git a/apps/web-antd/src/views/erp/stock/out/modules/item-form.vue b/apps/web-antd/src/views/erp/stock/out/modules/item-form.vue index 92c42cd78..e8ade25ba 100644 --- a/apps/web-antd/src/views/erp/stock/out/modules/item-form.vue +++ b/apps/web-antd/src/views/erp/stock/out/modules/item-form.vue @@ -55,7 +55,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ autoResize: true, border: true, rowConfig: { - keyField: 'row_id', + keyField: 'seq', isHover: true, }, pagerConfig: { @@ -105,7 +105,7 @@ function handleAdd() { /** 处理删除 */ function handleDelete(row: ErpStockOutApi.StockOutItem) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index !== -1) { tableData.value.splice(index, 1); } @@ -148,7 +148,7 @@ async function handleProductChange(productId: any, row: any) { /** 处理行数据变更 */ function handleRowChange(row: any) { - const index = tableData.value.findIndex((item) => item.id === row.id); + const index = tableData.value.findIndex((item) => item.seq === row.seq); if (index === -1) { tableData.value.push(row); } else { -- Gitee From 7bdfa99042988f2258238e4b41a0342f372d376d Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 5 Oct 2025 16:51:59 +0800 Subject: [PATCH 62/87] =?UTF-8?q?feat=EF=BC=9A=E3=80=90antd=E3=80=91?= =?UTF-8?q?=E3=80=90pay=20=E6=94=AF=E4=BB=98=E3=80=91pay/app=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BC=98=E5=8C=96=201/4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/api/pay/app/index.ts | 2 +- .../src/components/upload/input-upload.vue | 5 +- apps/web-antd/src/views/pay/app/data.ts | 592 +++++++++++++++++- apps/web-antd/src/views/pay/app/index.vue | 85 ++- .../src/views/pay/app/modules/app-form.vue | 6 +- .../views/pay/app/modules/channel-form.vue | 138 ++-- .../src/views/pay/app/modules/data.ts | 492 --------------- .../src/components/upload/input-upload.vue | 1 - 8 files changed, 661 insertions(+), 660 deletions(-) delete mode 100644 apps/web-antd/src/views/pay/app/modules/data.ts diff --git a/apps/web-antd/src/api/pay/app/index.ts b/apps/web-antd/src/api/pay/app/index.ts index 53f676742..d08ff7598 100644 --- a/apps/web-antd/src/api/pay/app/index.ts +++ b/apps/web-antd/src/api/pay/app/index.ts @@ -60,7 +60,7 @@ export function updateApp(data: PayAppApi.App) { } /** 修改支付应用状态 */ -export function changeAppStatus(data: PayAppApi.UpdateStatusReq) { +export function updateAppStatus(data: PayAppApi.UpdateStatusReq) { return requestClient.put('/pay/app/update-status', data); } diff --git a/apps/web-antd/src/components/upload/input-upload.vue b/apps/web-antd/src/components/upload/input-upload.vue index ef76658bb..66495467a 100644 --- a/apps/web-antd/src/components/upload/input-upload.vue +++ b/apps/web-antd/src/components/upload/input-upload.vue @@ -1,5 +1,4 @@ diff --git a/apps/web-antd/src/views/pay/app/modules/data.ts b/apps/web-antd/src/views/pay/app/modules/data.ts deleted file mode 100644 index 59c9b4a0a..000000000 --- a/apps/web-antd/src/views/pay/app/modules/data.ts +++ /dev/null @@ -1,492 +0,0 @@ -import type { VbenFormSchema } from '#/adapter/form'; - -import { h } from 'vue'; - -import { DICT_TYPE } from '@vben/constants'; -import { getDictOptions } from '@vben/hooks'; - -import { InputUpload } from '#/components/upload'; - -export function channelSchema(formType: string): VbenFormSchema[] { - if (formType.includes('alipay_')) { - return [ - { - label: '应用编号', - fieldName: 'appId', - component: 'Input', - dependencies: { - show: () => false, - triggerFields: [''], - }, - }, - { - label: '渠道费率', - fieldName: 'feeRate', - component: 'InputNumber', - rules: 'required', - componentProps: { - placeholder: '请输入渠道费率', - addonAfter: '%', - }, - defaultValue: 0, - }, - { - label: '开放平台 APPID', - fieldName: 'config.appId', - component: 'Input', - rules: 'required', - componentProps: { - placeholder: '请输入开放平台 APPID', - }, - }, - { - label: '渠道状态', - fieldName: 'status', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), - }, - defaultValue: 0, - }, - { - label: '网关地址', - fieldName: 'config.serverUrl', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: [ - { - value: 'https://openapi.alipay.com/gateway.do', - label: '线上环境', - }, - { - value: 'https://openapi-sandbox.dl.alipaydev.com/gateway.do', - label: '沙箱环境', - }, - ], - }, - }, - { - label: '算法类型', - fieldName: 'config.signType', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: [ - { - value: 'RSA2', - label: 'RSA2', - }, - ], - }, - defaultValue: 'RSA2', - }, - { - label: '公钥类型', - fieldName: 'config.mode', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: [ - { - value: 1, - label: '公钥模式', - }, - { - value: 2, - label: '证书模式', - }, - ], - }, - }, - { - label: '应用私钥', - fieldName: 'config.privateKey', - component: 'Textarea', - rules: 'required', - componentProps: { - placeholder: '请输入应用私钥', - rows: 8, - }, - }, - { - label: '支付宝公钥', - fieldName: 'config.alipayPublicKey', - component: 'Textarea', - rules: 'required', - componentProps: { - placeholder: '请输入支付宝公钥', - rows: 8, - }, - dependencies: { - show(values) { - return values?.config?.mode === 1; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: '商户公钥应用证书', - fieldName: 'config.appCertContent', - component: h(InputUpload, { - inputType: 'textarea', - textareaProps: { rows: 8, placeholder: '请上传商户公钥应用证书' }, - fileUploadProps: { - accept: ['crt'], - }, - }), - rules: 'required', - dependencies: { - show(values) { - return values?.config?.mode === 2; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: '支付宝公钥证书', - fieldName: 'config.alipayPublicCertContent', - component: h(InputUpload, { - inputType: 'textarea', - textareaProps: { rows: 8, placeholder: '请上传支付宝公钥证书' }, - fileUploadProps: { - accept: ['crt'], - }, - }), - rules: 'required', - dependencies: { - show(values) { - return values?.config?.mode === 2; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: '根证书', - fieldName: 'config.rootCertContent', - component: h(InputUpload, { - inputType: 'textarea', - textareaProps: { rows: 8, placeholder: '请上传根证书' }, - fileUploadProps: { - accept: ['crt'], - }, - }), - rules: 'required', - dependencies: { - show(values) { - return values?.config?.mode === 2; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: '接口内容加密方式', - fieldName: 'config.encryptType', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: [ - { - value: 'NONE', - label: '无加密', - }, - { - value: 'AES', - label: 'AES', - }, - ], - }, - defaultValue: 'NONE', - }, - { - label: '接口内容加密密钥', - fieldName: 'config.encryptKey', - component: 'Input', - rules: 'required', - dependencies: { - show(values) { - return values?.config?.encryptType === 'AES'; - }, - triggerFields: ['config.encryptType', 'encryptType', 'config'], - }, - }, - { - label: '备注', - fieldName: 'remark', - component: 'Input', - componentProps: { - placeholder: '请输入备注', - }, - }, - ]; - } else if (formType.includes('mock') || formType.includes('wallet')) { - return [ - { - label: '应用编号', - fieldName: 'appId', - component: 'Input', - dependencies: { - show: () => false, - triggerFields: [''], - }, - }, - { - label: '渠道状态', - fieldName: 'status', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), - }, - defaultValue: 0, - }, - { - label: '渠道编码', - fieldName: 'code', - component: 'Input', - dependencies: { - show: () => false, - triggerFields: [''], - }, - }, - { - label: '渠道费率', - fieldName: 'feeRate', - component: 'InputNumber', - rules: 'required', - componentProps: { - placeholder: '请输入渠道费率', - addonAfter: '%', - }, - defaultValue: 0, - dependencies: { - show: () => false, - triggerFields: [''], - }, - }, - { - label: '备注', - fieldName: 'remark', - component: 'Input', - componentProps: { - placeholder: '请输入备注', - }, - }, - ]; - } else if (formType.includes('wx')) { - return [ - { - label: '应用编号', - fieldName: 'appId', - component: 'Input', - dependencies: { - show: () => false, - triggerFields: [''], - }, - }, - { - label: '渠道编码', - fieldName: 'code', - component: 'Input', - dependencies: { - show: () => false, - triggerFields: [''], - }, - }, - { - label: '渠道费率', - fieldName: 'feeRate', - component: 'InputNumber', - rules: 'required', - componentProps: { - placeholder: '请输入渠道费率', - addonAfter: '%', - }, - defaultValue: 0, - }, - { - label: '微信 APPID', - fieldName: 'config.appId', - help: '前往微信商户平台[https://pay.weixin.qq.com/index.php/extend/merchant_appid/mapay_platform/account_manage]查看 APPID', - component: 'Input', - rules: 'required', - componentProps: { - placeholder: '请输入微信 APPID', - }, - }, - { - label: '商户号', - fieldName: 'config.mchId', - help: '前往微信商户平台[https://pay.weixin.qq.com/index.php/extend/pay_setting]查看商户号', - component: 'Input', - rules: 'required', - componentProps: { - placeholder: '请输入商户号', - }, - }, - { - label: '渠道状态', - fieldName: 'status', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), - }, - defaultValue: 0, - }, - { - label: 'API 版本', - fieldName: 'config.apiVersion', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: [ - { - label: 'v2', - value: 'v2', - }, - { - label: 'v3', - value: 'v3', - }, - ], - }, - }, - { - label: '商户密钥', - fieldName: 'config.mchKey', - component: 'Input', - rules: 'required', - componentProps: { - placeholder: '请输入商户密钥', - }, - dependencies: { - show(values) { - return values?.config?.apiVersion === 'v2'; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: 'apiclient_cert.p12 证书', - fieldName: 'config.keyContent', - component: h(InputUpload, { - inputType: 'textarea', - textareaProps: { - rows: 8, - placeholder: '请上传 apiclient_cert.p12 证书', - }, - fileUploadProps: { - accept: ['p12'], - }, - }), - rules: 'required', - dependencies: { - show(values) { - return values?.config?.apiVersion === 'v2'; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: 'API V3 密钥', - fieldName: 'config.apiV3Key', - component: 'Input', - rules: 'required', - componentProps: { - placeholder: '请输入 API V3 密钥', - }, - dependencies: { - show(values) { - return values?.config?.apiVersion === 'v3'; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: 'apiclient_key.pem 证书', - fieldName: 'config.privateKeyContent', - component: h(InputUpload, { - inputType: 'textarea', - textareaProps: { - rows: 8, - placeholder: '请上传 apiclient_key.pem 证书', - }, - fileUploadProps: { - accept: ['pem'], - }, - }), - rules: 'required', - dependencies: { - show(values) { - return values?.config?.apiVersion === 'v3'; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: '证书序列号', - fieldName: 'config.certSerialNo', - component: 'Input', - help: '前往微信商户平台[https://pay.weixin.qq.com/index.php/core/cert/api_cert#/api-cert-manage]查看证书序列号', - rules: 'required', - componentProps: { - placeholder: '请输入证书序列号', - }, - dependencies: { - show(values) { - return values?.config?.apiVersion === 'v3'; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: 'public_key.pem 证书', - fieldName: 'config.publicKeyContent', - component: h(InputUpload, { - inputType: 'textarea', - textareaProps: { - rows: 8, - placeholder: '请上传 public_key.pem 证书', - }, - fileUploadProps: { - accept: ['pem'], - }, - }), - dependencies: { - show(values) { - return values?.config?.apiVersion === 'v3'; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: '公钥 ID', - fieldName: 'config.publicKeyId', - component: 'Input', - help: '微信支付公钥产品简介及使用说明[https://pay.weixin.qq.com/doc/v3/merchant/4012153196]', - rules: 'required', - componentProps: { - placeholder: '请输入公钥 ID', - }, - dependencies: { - show(values) { - return values?.config?.apiVersion === 'v3'; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: '备注', - fieldName: 'remark', - component: 'Input', - componentProps: { - placeholder: '请输入备注', - }, - }, - ]; - } else { - return []; - } -} diff --git a/apps/web-ele/src/components/upload/input-upload.vue b/apps/web-ele/src/components/upload/input-upload.vue index c3a1ba96f..0964acdb1 100644 --- a/apps/web-ele/src/components/upload/input-upload.vue +++ b/apps/web-ele/src/components/upload/input-upload.vue @@ -1,5 +1,4 @@ diff --git a/apps/web-antd/src/views/pay/app/modules/channel-form.vue b/apps/web-antd/src/views/pay/app/modules/channel-form.vue index 892493cb8..83ad9281c 100644 --- a/apps/web-antd/src/views/pay/app/modules/channel-form.vue +++ b/apps/web-antd/src/views/pay/app/modules/channel-form.vue @@ -18,8 +18,8 @@ const emit = defineEmits(['success']); const formData = ref(); const title = computed(() => { return formData.value?.id === 0 - ? $t('ui.actionTitle.create', '应用') - : $t('ui.actionTitle.edit', '应用'); + ? $t('ui.actionTitle.create', ['渠道']) + : $t('ui.actionTitle.edit', ['渠道']); }); const [Form, formApi] = useVbenForm({ @@ -54,7 +54,7 @@ const [Modal, modalApi] = useVbenModal({ modalApi.unlock(); } }, - onOpenChange: async (isOpen) => { + async onOpenChange(isOpen: boolean) { if (!isOpen) { formData.value = undefined; return; diff --git a/apps/web-ele/src/api/pay/app/index.ts b/apps/web-ele/src/api/pay/app/index.ts index d44e5ae2b..ca78d6d34 100644 --- a/apps/web-ele/src/api/pay/app/index.ts +++ b/apps/web-ele/src/api/pay/app/index.ts @@ -16,6 +16,7 @@ export namespace PayAppApi { merchantId: number; merchantName: string; createTime?: Date; + channelCodes?: string[]; } /** 更新状态请求 */ @@ -59,7 +60,7 @@ export function updateApp(data: PayAppApi.App) { } /** 修改支付应用状态 */ -export function changeAppStatus(data: PayAppApi.UpdateStatusReq) { +export function updateAppStatus(data: PayAppApi.UpdateStatusReq) { return requestClient.put('/pay/app/update-status', data); } diff --git a/apps/web-ele/src/views/pay/app/data.ts b/apps/web-ele/src/views/pay/app/data.ts index e249539aa..a53a72ac7 100644 --- a/apps/web-ele/src/views/pay/app/data.ts +++ b/apps/web-ele/src/views/pay/app/data.ts @@ -2,39 +2,50 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { PayAppApi } from '#/api/pay/app'; +import { h } from 'vue'; + import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; import { getDictOptions } from '@vben/hooks'; +import { z } from '#/adapter/form'; +import { InputUpload } from '#/components/upload'; +import { getRangePickerDefaultProps } from '#/utils'; + +/** 列表的搜索表单 */ export function useGridFormSchema(): VbenFormSchema[] { return [ { - component: 'Input', fieldName: 'name', label: '应用名', + component: 'Input', componentProps: { placeholder: '请输入应用名', + clearable: true, }, }, { - component: 'Select', fieldName: 'status', label: '开启状态', + component: 'Select', componentProps: { placeholder: '请选择开启状态', options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + clearable: true, }, }, { - component: 'RangePicker', fieldName: 'createTime', label: '创建时间', + component: 'RangePicker', componentProps: { - placeholder: ['开始日期', '结束日期'], + ...getRangePickerDefaultProps(), + clearable: true, }, }, ]; } +/** 列表的字段 */ export function useGridColumns( onStatusChange?: ( newStatus: number, @@ -42,26 +53,27 @@ export function useGridColumns( ) => PromiseLike, ): VxeTableGridOptions['columns'] { return [ - { type: 'checkbox', width: 60 }, { - title: '应用标识', field: 'appKey', + title: '应用标识', + minWidth: 40, }, { - title: '应用名', field: 'name', + title: '应用名', + minWidth: 40, }, { field: 'status', title: '状态', align: 'center', + minWidth: 40, cellRender: { attrs: { beforeChange: onStatusChange }, name: 'CellSwitch', props: { - checkedValue: CommonStatusEnum.ENABLE, - unCheckedValue: CommonStatusEnum.DISABLE, - inlinePrompt: true, + activeValue: CommonStatusEnum.ENABLE, + inactiveValue: CommonStatusEnum.DISABLE, }, }, }, @@ -69,31 +81,32 @@ export function useGridColumns( title: '支付宝配置', children: [ { - title: 'APP 支付', + title: 'APP', slots: { default: 'alipayAppConfig', }, }, { - title: 'PC 网站支付', + title: 'PC 网站', slots: { default: 'alipayPCConfig', }, }, { - title: 'WAP 网站支付', + title: 'WAP 网站', slots: { default: 'alipayWAPConfig', }, + minWidth: 10, }, { - title: '扫码支付', + title: '扫码', slots: { default: 'alipayQrConfig', }, }, { - title: '条码支付', + title: '条码', slots: { default: 'alipayBarConfig', }, @@ -104,37 +117,38 @@ export function useGridColumns( title: '微信配置', children: [ { - title: '小程序支付', + title: '小程序', slots: { default: 'wxLiteConfig', }, }, { - title: 'JSAPI 支付', + title: 'JSAPI', slots: { default: 'wxPubConfig', }, }, { - title: 'APP 支付', + title: 'APP', slots: { default: 'wxAppConfig', }, }, { - title: 'Native 支付', + title: 'Native', slots: { default: 'wxNativeConfig', }, }, { - title: 'WAP 网站支付', + title: 'WAP 网站', slots: { default: 'wxWapConfig', }, + minWidth: 10, }, { - title: '条码支付', + title: '条码', slots: { default: 'wxBarConfig', }, @@ -157,28 +171,27 @@ export function useGridColumns( }, { title: '操作', - width: 130, + width: 140, fixed: 'right', slots: { default: 'actions' }, }, ]; } -/** 新增/修改的表单 */ -export function useFormSchema(): VbenFormSchema[] { +/** 应用新增/修改的表单 */ +export function useAppFormSchema(): VbenFormSchema[] { return [ { - label: '应用编号', fieldName: 'id', component: 'Input', dependencies: { - show: () => false, triggerFields: [''], + show: () => false, }, }, { - label: '应用名', fieldName: 'name', + label: '应用名', component: 'Input', rules: 'required', componentProps: { @@ -186,8 +199,8 @@ export function useFormSchema(): VbenFormSchema[] { }, }, { - label: '应用标识', fieldName: 'appKey', + label: '应用标识', component: 'Input', rules: 'required', componentProps: { @@ -195,17 +208,17 @@ export function useFormSchema(): VbenFormSchema[] { }, }, { - label: '开启状态', fieldName: 'status', + label: '开启状态', component: 'RadioGroup', - rules: 'required', + rules: z.number().default(CommonStatusEnum.ENABLE), componentProps: { options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), }, }, { - label: '支付结果的回调地址', fieldName: 'orderNotifyUrl', + label: '支付结果的回调地址', component: 'Input', rules: 'required', componentProps: { @@ -213,26 +226,25 @@ export function useFormSchema(): VbenFormSchema[] { }, }, { - label: '退款结果的回调地址', fieldName: 'refundNotifyUrl', + label: '退款结果的回调地址', component: 'Input', rules: 'required', componentProps: { - placeholder: '请输入支付结果的回调地址', + placeholder: '请输入退款结果的回调地址', }, }, { - label: '转账结果的回调地址', fieldName: 'transferNotifyUrl', + label: '转账结果的回调地址', component: 'Input', - rules: 'required', componentProps: { placeholder: '请输入转账结果的回调地址', }, }, { - label: '备注', fieldName: 'remark', + label: '备注', component: 'Textarea', componentProps: { rows: 3, @@ -241,3 +253,487 @@ export function useFormSchema(): VbenFormSchema[] { }, ]; } + +export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { + if (formType.includes('alipay_')) { + return [ + { + label: '应用编号', + fieldName: 'appId', + component: 'Input', + dependencies: { + show: () => false, + triggerFields: [''], + }, + }, + { + label: '渠道费率', + fieldName: 'feeRate', + component: 'InputNumber', + rules: 'required', + componentProps: { + placeholder: '请输入渠道费率', + addonAfter: '%', + }, + defaultValue: 0, + }, + { + label: '开放平台 APPID', + fieldName: 'config.appId', + component: 'Input', + rules: 'required', + componentProps: { + placeholder: '请输入开放平台 APPID', + }, + }, + { + label: '渠道状态', + fieldName: 'status', + component: 'RadioGroup', + rules: 'required', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + defaultValue: 0, + }, + { + label: '网关地址', + fieldName: 'config.serverUrl', + component: 'RadioGroup', + rules: 'required', + componentProps: { + options: [ + { + value: 'https://openapi.alipay.com/gateway.do', + label: '线上环境', + }, + { + value: 'https://openapi-sandbox.dl.alipaydev.com/gateway.do', + label: '沙箱环境', + }, + ], + }, + }, + { + label: '算法类型', + fieldName: 'config.signType', + component: 'RadioGroup', + rules: 'required', + componentProps: { + options: [ + { + value: 'RSA2', + label: 'RSA2', + }, + ], + }, + defaultValue: 'RSA2', + }, + { + label: '公钥类型', + fieldName: 'config.mode', + component: 'RadioGroup', + rules: 'required', + componentProps: { + options: [ + { + value: 1, + label: '公钥模式', + }, + { + value: 2, + label: '证书模式', + }, + ], + }, + }, + { + label: '应用私钥', + fieldName: 'config.privateKey', + component: 'Textarea', + rules: 'required', + componentProps: { + placeholder: '请输入应用私钥', + rows: 3, + }, + }, + { + label: '支付宝公钥', + fieldName: 'config.alipayPublicKey', + component: 'Textarea', + rules: 'required', + componentProps: { + placeholder: '请输入支付宝公钥', + rows: 3, + }, + dependencies: { + show(values) { + return values?.config?.mode === 1; + }, + triggerFields: ['config.mode', 'mode', 'config'], + }, + }, + { + label: '商户公钥应用证书', + fieldName: 'config.appCertContent', + component: h(InputUpload, { + inputType: 'textarea', + textareaProps: { rows: 3, placeholder: '请上传商户公钥应用证书' }, + fileUploadProps: { + accept: ['crt'], + }, + }), + rules: 'required', + dependencies: { + show(values) { + return values?.config?.mode === 2; + }, + triggerFields: ['config.mode', 'mode', 'config'], + }, + }, + { + label: '支付宝公钥证书', + fieldName: 'config.alipayPublicCertContent', + component: h(InputUpload, { + inputType: 'textarea', + textareaProps: { rows: 3, placeholder: '请上传支付宝公钥证书' }, + fileUploadProps: { + accept: ['crt'], + }, + }), + rules: 'required', + dependencies: { + show(values) { + return values?.config?.mode === 2; + }, + triggerFields: ['config.mode', 'mode', 'config'], + }, + }, + { + label: '根证书', + fieldName: 'config.rootCertContent', + component: h(InputUpload, { + inputType: 'textarea', + textareaProps: { rows: 3, placeholder: '请上传根证书' }, + fileUploadProps: { + accept: ['crt'], + }, + }), + rules: 'required', + dependencies: { + show(values) { + return values?.config?.mode === 2; + }, + triggerFields: ['config.mode', 'mode', 'config'], + }, + }, + { + label: '接口内容加密方式', + fieldName: 'config.encryptType', + component: 'RadioGroup', + rules: 'required', + componentProps: { + options: [ + { + value: 'NONE', + label: '无加密', + }, + { + value: 'AES', + label: 'AES', + }, + ], + }, + defaultValue: 'NONE', + }, + { + label: '接口内容加密密钥', + fieldName: 'config.encryptKey', + component: 'Input', + rules: 'required', + dependencies: { + show(values) { + return values?.config?.encryptType === 'AES'; + }, + triggerFields: ['config.encryptType', 'encryptType', 'config'], + }, + }, + { + label: '备注', + fieldName: 'remark', + component: 'Input', + componentProps: { + placeholder: '请输入备注', + }, + }, + ]; + } else if (formType.includes('mock') || formType.includes('wallet')) { + return [ + { + label: '应用编号', + fieldName: 'appId', + component: 'Input', + dependencies: { + show: () => false, + triggerFields: [''], + }, + }, + { + label: '渠道状态', + fieldName: 'status', + component: 'RadioGroup', + rules: 'required', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + defaultValue: 0, + }, + { + label: '渠道编码', + fieldName: 'code', + component: 'Input', + dependencies: { + show: () => false, + triggerFields: [''], + }, + }, + { + label: '渠道费率', + fieldName: 'feeRate', + component: 'InputNumber', + rules: 'required', + componentProps: { + placeholder: '请输入渠道费率', + addonAfter: '%', + }, + defaultValue: 0, + dependencies: { + show: () => false, + triggerFields: [''], + }, + }, + { + label: '备注', + fieldName: 'remark', + component: 'Input', + componentProps: { + placeholder: '请输入备注', + }, + }, + ]; + } else if (formType.includes('wx')) { + return [ + { + label: '应用编号', + fieldName: 'appId', + component: 'Input', + dependencies: { + show: () => false, + triggerFields: [''], + }, + }, + { + label: '渠道编码', + fieldName: 'code', + component: 'Input', + dependencies: { + show: () => false, + triggerFields: [''], + }, + }, + { + label: '渠道费率', + fieldName: 'feeRate', + component: 'InputNumber', + rules: 'required', + componentProps: { + placeholder: '请输入渠道费率', + addonAfter: '%', + }, + defaultValue: 0, + }, + { + label: '微信 APPID', + fieldName: 'config.appId', + help: '前往微信商户平台[https://pay.weixin.qq.com/index.php/extend/merchant_appid/mapay_platform/account_manage]查看 APPID', + component: 'Input', + rules: 'required', + componentProps: { + placeholder: '请输入微信 APPID', + }, + }, + { + label: '商户号', + fieldName: 'config.mchId', + help: '前往微信商户平台[https://pay.weixin.qq.com/index.php/extend/pay_setting]查看商户号', + component: 'Input', + rules: 'required', + componentProps: { + placeholder: '请输入商户号', + }, + }, + { + label: '渠道状态', + fieldName: 'status', + component: 'RadioGroup', + rules: 'required', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + defaultValue: 0, + }, + { + label: 'API 版本', + fieldName: 'config.apiVersion', + component: 'RadioGroup', + rules: 'required', + componentProps: { + options: [ + { + label: 'v2', + value: 'v2', + }, + { + label: 'v3', + value: 'v3', + }, + ], + }, + }, + { + label: '商户密钥', + fieldName: 'config.mchKey', + component: 'Input', + rules: 'required', + componentProps: { + placeholder: '请输入商户密钥', + }, + dependencies: { + show(values) { + return values?.config?.apiVersion === 'v2'; + }, + triggerFields: ['config.mode', 'mode', 'config'], + }, + }, + { + label: 'apiclient_cert.p12 证书', + fieldName: 'config.keyContent', + component: h(InputUpload, { + inputType: 'textarea', + textareaProps: { + rows: 3, + placeholder: '请上传 apiclient_cert.p12 证书', + }, + fileUploadProps: { + accept: ['p12'], + }, + }), + rules: 'required', + dependencies: { + show(values) { + return values?.config?.apiVersion === 'v2'; + }, + triggerFields: ['config.mode', 'mode', 'config'], + }, + }, + { + label: 'API V3 密钥', + fieldName: 'config.apiV3Key', + component: 'Input', + rules: 'required', + componentProps: { + placeholder: '请输入 API V3 密钥', + }, + dependencies: { + show(values) { + return values?.config?.apiVersion === 'v3'; + }, + triggerFields: ['config.mode', 'mode', 'config'], + }, + }, + { + label: 'apiclient_key.pem 证书', + fieldName: 'config.privateKeyContent', + component: h(InputUpload, { + inputType: 'textarea', + textareaProps: { + rows: 3, + placeholder: '请上传 apiclient_key.pem 证书', + }, + fileUploadProps: { + accept: ['pem'], + }, + }), + rules: 'required', + dependencies: { + show(values) { + return values?.config?.apiVersion === 'v3'; + }, + triggerFields: ['config.mode', 'mode', 'config'], + }, + }, + { + label: '证书序列号', + fieldName: 'config.certSerialNo', + component: 'Input', + help: '前往微信商户平台[https://pay.weixin.qq.com/index.php/core/cert/api_cert#/api-cert-manage]查看证书序列号', + rules: 'required', + componentProps: { + placeholder: '请输入证书序列号', + }, + dependencies: { + show(values) { + return values?.config?.apiVersion === 'v3'; + }, + triggerFields: ['config.mode', 'mode', 'config'], + }, + }, + { + label: 'public_key.pem 证书', + fieldName: 'config.publicKeyContent', + component: h(InputUpload, { + inputType: 'textarea', + textareaProps: { + rows: 3, + placeholder: '请上传 public_key.pem 证书', + }, + fileUploadProps: { + accept: ['pem'], + }, + }), + dependencies: { + show(values) { + return values?.config?.apiVersion === 'v3'; + }, + triggerFields: ['config.mode', 'mode', 'config'], + }, + }, + { + label: '公钥 ID', + fieldName: 'config.publicKeyId', + component: 'Input', + help: '微信支付公钥产品简介及使用说明[https://pay.weixin.qq.com/doc/v3/merchant/4012153196]', + rules: 'required', + componentProps: { + placeholder: '请输入公钥 ID', + }, + dependencies: { + show(values) { + return values?.config?.apiVersion === 'v3'; + }, + triggerFields: ['config.mode', 'mode', 'config'], + }, + }, + { + label: '备注', + fieldName: 'remark', + component: 'Input', + componentProps: { + placeholder: '请输入备注', + }, + }, + ]; + } else { + return []; + } +} diff --git a/apps/web-ele/src/views/pay/app/index.vue b/apps/web-ele/src/views/pay/app/index.vue index db4bd9980..6dfe7f8e5 100644 --- a/apps/web-ele/src/views/pay/app/index.vue +++ b/apps/web-ele/src/views/pay/app/index.vue @@ -1,6 +1,6 @@ diff --git a/apps/web-ele/src/views/pay/app/modules/channel-form.vue b/apps/web-ele/src/views/pay/app/modules/channel-form.vue index 2b82bc8b7..707069293 100644 --- a/apps/web-ele/src/views/pay/app/modules/channel-form.vue +++ b/apps/web-ele/src/views/pay/app/modules/channel-form.vue @@ -12,15 +12,14 @@ import { ElMessage } from 'element-plus'; import { useVbenForm } from '#/adapter/form'; import { createChannel, getChannel, updateChannel } from '#/api/pay/channel'; -import { channelSchema } from './data'; +import { useChannelFormSchema } from '../data'; const emit = defineEmits(['success']); const formData = ref(); -const formType = ref(''); const title = computed(() => { return formData.value?.id === 0 - ? $t('ui.actionTitle.create', '应用') - : $t('ui.actionTitle.edit', '应用'); + ? $t('ui.actionTitle.create', ['渠道']) + : $t('ui.actionTitle.edit', ['渠道']); }); const [Form, formApi] = useVbenForm({ @@ -44,17 +43,9 @@ const [Modal, modalApi] = useVbenModal({ modalApi.lock(); // 提交表单 const data = (await formApi.getValues()) as PayChannelApi.Channel; - // 只保留表单中实际存在的字段,且值不为 undefined - const data2 = Object.fromEntries( - Object.entries(data).filter(([key, value]) => { - // 检查字段是否在表单中存在,且值不为 undefined - return key in data && value !== undefined; - }), - ); - const data3 = { ...formData.value, ...data2 }; - data3.config = JSON.stringify(data3.config); + data.config = JSON.stringify(data.config); try { - await (data3.id ? updateChannel(data3) : createChannel(data3)); + await (data.id ? updateChannel(data) : createChannel(data)); // 关闭并提示 await modalApi.close(); emit('success'); @@ -63,94 +54,75 @@ const [Modal, modalApi] = useVbenModal({ modalApi.unlock(); } }, - onOpenChange: async (isOpen) => { + async onOpenChange(isOpen: boolean) { if (!isOpen) { formData.value = undefined; return; } // 加载数据 - const { id, payCode } = modalApi.getData() as { - id?: number; - payCode?: string; + const { appId, code } = modalApi.getData() as { + appId?: number; + code?: string; }; - if (!id || !payCode) { + if (!appId || !code) { return; } modalApi.lock(); - formType.value = payCode; - if (payCode.includes('alipay_')) { - formData.value = { - appId: id, - code: payCode, - status: CommonStatusEnum.ENABLE, - remark: '', - feeRate: null, - config: { - appId: '', - serverUrl: null, - signType: 'RSA2', - mode: null, - privateKey: '', - alipayPublicKey: '', - appCertContent: '', - alipayPublicCertContent: '', - rootCertContent: '', - encryptType: '', - encryptKey: '', - }, + formData.value = { + appId, + code, + status: CommonStatusEnum.ENABLE, + remark: '', + feeRate: 0, + config: {}, + }; + if (code.includes('alipay_')) { + formData.value.config = { + appId: undefined, + serverUrl: undefined, + signType: 'RSA2', + mode: undefined, + privateKey: undefined, + alipayPublicKey: undefined, + appCertContent: undefined, + alipayPublicCertContent: undefined, + rootCertContent: undefined, + encryptType: undefined, + encryptKey: undefined, }; - } else if (payCode.includes('mock')) { - formData.value = { - appId: id, - code: payCode, - status: CommonStatusEnum.ENABLE, - remark: '', - feeRate: 0, - config: { - name: 'mock-conf', - }, + } else if (code.includes('mock')) { + formData.value.config = { + name: 'mock-conf', }; - } else if (payCode.includes('wallet')) { - formData.value = { - appId: id, - code: payCode, - status: CommonStatusEnum.ENABLE, - remark: '', - feeRate: 0, + } else if (code.includes('wallet')) { + formData.value.config = { config: { - name: 'mock-conf', + name: 'wallet-conf', }, }; - } else if (payCode.includes('wx')) { - formData.value = { - appId: id, - code: payCode, - status: CommonStatusEnum.ENABLE, - feeRate: undefined, - remark: '', - config: { - appId: '', - mchId: '', - apiVersion: '', - mchKey: '', - keyContent: '', - privateKeyContent: '', - certSerialNo: '', - apiV3Key: '', - publicKeyContent: '', - publicKeyId: '', - }, + } else if (code.includes('wx')) { + formData.value.config = { + appId: undefined, + mchId: undefined, + apiVersion: undefined, + mchKey: undefined, + keyContent: undefined, + privateKeyContent: undefined, + certSerialNo: undefined, + apiV3Key: undefined, + publicKeyContent: undefined, + publicKeyId: undefined, }; } try { - const res = await getChannel(id, payCode); - formData.value = { - ...res, - config: { - ...JSON.parse(res.config), - }, - }; + const res = await getChannel(appId, code); + if (res) { + formData.value = { + ...res, + config: JSON.parse(res.config), + }; + } // 设置到 values await formApi.setValues(formData.value); } finally { @@ -161,7 +133,7 @@ const [Modal, modalApi] = useVbenModal({ diff --git a/apps/web-ele/src/views/pay/app/modules/data.ts b/apps/web-ele/src/views/pay/app/modules/data.ts deleted file mode 100644 index 59c9b4a0a..000000000 --- a/apps/web-ele/src/views/pay/app/modules/data.ts +++ /dev/null @@ -1,492 +0,0 @@ -import type { VbenFormSchema } from '#/adapter/form'; - -import { h } from 'vue'; - -import { DICT_TYPE } from '@vben/constants'; -import { getDictOptions } from '@vben/hooks'; - -import { InputUpload } from '#/components/upload'; - -export function channelSchema(formType: string): VbenFormSchema[] { - if (formType.includes('alipay_')) { - return [ - { - label: '应用编号', - fieldName: 'appId', - component: 'Input', - dependencies: { - show: () => false, - triggerFields: [''], - }, - }, - { - label: '渠道费率', - fieldName: 'feeRate', - component: 'InputNumber', - rules: 'required', - componentProps: { - placeholder: '请输入渠道费率', - addonAfter: '%', - }, - defaultValue: 0, - }, - { - label: '开放平台 APPID', - fieldName: 'config.appId', - component: 'Input', - rules: 'required', - componentProps: { - placeholder: '请输入开放平台 APPID', - }, - }, - { - label: '渠道状态', - fieldName: 'status', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), - }, - defaultValue: 0, - }, - { - label: '网关地址', - fieldName: 'config.serverUrl', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: [ - { - value: 'https://openapi.alipay.com/gateway.do', - label: '线上环境', - }, - { - value: 'https://openapi-sandbox.dl.alipaydev.com/gateway.do', - label: '沙箱环境', - }, - ], - }, - }, - { - label: '算法类型', - fieldName: 'config.signType', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: [ - { - value: 'RSA2', - label: 'RSA2', - }, - ], - }, - defaultValue: 'RSA2', - }, - { - label: '公钥类型', - fieldName: 'config.mode', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: [ - { - value: 1, - label: '公钥模式', - }, - { - value: 2, - label: '证书模式', - }, - ], - }, - }, - { - label: '应用私钥', - fieldName: 'config.privateKey', - component: 'Textarea', - rules: 'required', - componentProps: { - placeholder: '请输入应用私钥', - rows: 8, - }, - }, - { - label: '支付宝公钥', - fieldName: 'config.alipayPublicKey', - component: 'Textarea', - rules: 'required', - componentProps: { - placeholder: '请输入支付宝公钥', - rows: 8, - }, - dependencies: { - show(values) { - return values?.config?.mode === 1; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: '商户公钥应用证书', - fieldName: 'config.appCertContent', - component: h(InputUpload, { - inputType: 'textarea', - textareaProps: { rows: 8, placeholder: '请上传商户公钥应用证书' }, - fileUploadProps: { - accept: ['crt'], - }, - }), - rules: 'required', - dependencies: { - show(values) { - return values?.config?.mode === 2; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: '支付宝公钥证书', - fieldName: 'config.alipayPublicCertContent', - component: h(InputUpload, { - inputType: 'textarea', - textareaProps: { rows: 8, placeholder: '请上传支付宝公钥证书' }, - fileUploadProps: { - accept: ['crt'], - }, - }), - rules: 'required', - dependencies: { - show(values) { - return values?.config?.mode === 2; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: '根证书', - fieldName: 'config.rootCertContent', - component: h(InputUpload, { - inputType: 'textarea', - textareaProps: { rows: 8, placeholder: '请上传根证书' }, - fileUploadProps: { - accept: ['crt'], - }, - }), - rules: 'required', - dependencies: { - show(values) { - return values?.config?.mode === 2; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: '接口内容加密方式', - fieldName: 'config.encryptType', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: [ - { - value: 'NONE', - label: '无加密', - }, - { - value: 'AES', - label: 'AES', - }, - ], - }, - defaultValue: 'NONE', - }, - { - label: '接口内容加密密钥', - fieldName: 'config.encryptKey', - component: 'Input', - rules: 'required', - dependencies: { - show(values) { - return values?.config?.encryptType === 'AES'; - }, - triggerFields: ['config.encryptType', 'encryptType', 'config'], - }, - }, - { - label: '备注', - fieldName: 'remark', - component: 'Input', - componentProps: { - placeholder: '请输入备注', - }, - }, - ]; - } else if (formType.includes('mock') || formType.includes('wallet')) { - return [ - { - label: '应用编号', - fieldName: 'appId', - component: 'Input', - dependencies: { - show: () => false, - triggerFields: [''], - }, - }, - { - label: '渠道状态', - fieldName: 'status', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), - }, - defaultValue: 0, - }, - { - label: '渠道编码', - fieldName: 'code', - component: 'Input', - dependencies: { - show: () => false, - triggerFields: [''], - }, - }, - { - label: '渠道费率', - fieldName: 'feeRate', - component: 'InputNumber', - rules: 'required', - componentProps: { - placeholder: '请输入渠道费率', - addonAfter: '%', - }, - defaultValue: 0, - dependencies: { - show: () => false, - triggerFields: [''], - }, - }, - { - label: '备注', - fieldName: 'remark', - component: 'Input', - componentProps: { - placeholder: '请输入备注', - }, - }, - ]; - } else if (formType.includes('wx')) { - return [ - { - label: '应用编号', - fieldName: 'appId', - component: 'Input', - dependencies: { - show: () => false, - triggerFields: [''], - }, - }, - { - label: '渠道编码', - fieldName: 'code', - component: 'Input', - dependencies: { - show: () => false, - triggerFields: [''], - }, - }, - { - label: '渠道费率', - fieldName: 'feeRate', - component: 'InputNumber', - rules: 'required', - componentProps: { - placeholder: '请输入渠道费率', - addonAfter: '%', - }, - defaultValue: 0, - }, - { - label: '微信 APPID', - fieldName: 'config.appId', - help: '前往微信商户平台[https://pay.weixin.qq.com/index.php/extend/merchant_appid/mapay_platform/account_manage]查看 APPID', - component: 'Input', - rules: 'required', - componentProps: { - placeholder: '请输入微信 APPID', - }, - }, - { - label: '商户号', - fieldName: 'config.mchId', - help: '前往微信商户平台[https://pay.weixin.qq.com/index.php/extend/pay_setting]查看商户号', - component: 'Input', - rules: 'required', - componentProps: { - placeholder: '请输入商户号', - }, - }, - { - label: '渠道状态', - fieldName: 'status', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), - }, - defaultValue: 0, - }, - { - label: 'API 版本', - fieldName: 'config.apiVersion', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: [ - { - label: 'v2', - value: 'v2', - }, - { - label: 'v3', - value: 'v3', - }, - ], - }, - }, - { - label: '商户密钥', - fieldName: 'config.mchKey', - component: 'Input', - rules: 'required', - componentProps: { - placeholder: '请输入商户密钥', - }, - dependencies: { - show(values) { - return values?.config?.apiVersion === 'v2'; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: 'apiclient_cert.p12 证书', - fieldName: 'config.keyContent', - component: h(InputUpload, { - inputType: 'textarea', - textareaProps: { - rows: 8, - placeholder: '请上传 apiclient_cert.p12 证书', - }, - fileUploadProps: { - accept: ['p12'], - }, - }), - rules: 'required', - dependencies: { - show(values) { - return values?.config?.apiVersion === 'v2'; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: 'API V3 密钥', - fieldName: 'config.apiV3Key', - component: 'Input', - rules: 'required', - componentProps: { - placeholder: '请输入 API V3 密钥', - }, - dependencies: { - show(values) { - return values?.config?.apiVersion === 'v3'; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: 'apiclient_key.pem 证书', - fieldName: 'config.privateKeyContent', - component: h(InputUpload, { - inputType: 'textarea', - textareaProps: { - rows: 8, - placeholder: '请上传 apiclient_key.pem 证书', - }, - fileUploadProps: { - accept: ['pem'], - }, - }), - rules: 'required', - dependencies: { - show(values) { - return values?.config?.apiVersion === 'v3'; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: '证书序列号', - fieldName: 'config.certSerialNo', - component: 'Input', - help: '前往微信商户平台[https://pay.weixin.qq.com/index.php/core/cert/api_cert#/api-cert-manage]查看证书序列号', - rules: 'required', - componentProps: { - placeholder: '请输入证书序列号', - }, - dependencies: { - show(values) { - return values?.config?.apiVersion === 'v3'; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: 'public_key.pem 证书', - fieldName: 'config.publicKeyContent', - component: h(InputUpload, { - inputType: 'textarea', - textareaProps: { - rows: 8, - placeholder: '请上传 public_key.pem 证书', - }, - fileUploadProps: { - accept: ['pem'], - }, - }), - dependencies: { - show(values) { - return values?.config?.apiVersion === 'v3'; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: '公钥 ID', - fieldName: 'config.publicKeyId', - component: 'Input', - help: '微信支付公钥产品简介及使用说明[https://pay.weixin.qq.com/doc/v3/merchant/4012153196]', - rules: 'required', - componentProps: { - placeholder: '请输入公钥 ID', - }, - dependencies: { - show(values) { - return values?.config?.apiVersion === 'v3'; - }, - triggerFields: ['config.mode', 'mode', 'config'], - }, - }, - { - label: '备注', - fieldName: 'remark', - component: 'Input', - componentProps: { - placeholder: '请输入备注', - }, - }, - ]; - } else { - return []; - } -} -- Gitee From 8f2018205059c924eda2e02bac88d5c2e1cd484c Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 5 Oct 2025 20:32:46 +0800 Subject: [PATCH 67/87] =?UTF-8?q?feat=EF=BC=9A=E3=80=90ele=E3=80=91?= =?UTF-8?q?=E3=80=90pay=20=E6=94=AF=E4=BB=98=E3=80=91pay/app=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BC=98=E5=8C=96=204/4=EF=BC=88=E5=AF=B9=E9=BD=90=20?= =?UTF-8?q?ele=20=E5=92=8C=20antd=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-ele/src/views/pay/app/data.ts | 235 ++++++++----------------- 1 file changed, 78 insertions(+), 157 deletions(-) diff --git a/apps/web-ele/src/views/pay/app/data.ts b/apps/web-ele/src/views/pay/app/data.ts index a53a72ac7..b56df2b8b 100644 --- a/apps/web-ele/src/views/pay/app/data.ts +++ b/apps/web-ele/src/views/pay/app/data.ts @@ -254,29 +254,61 @@ export function useAppFormSchema(): VbenFormSchema[] { ]; } +/** 渠道新增/修改的表单 */ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { - if (formType.includes('alipay_')) { - return [ - { - label: '应用编号', - fieldName: 'appId', - component: 'Input', - dependencies: { - show: () => false, - triggerFields: [''], - }, + const schema: VbenFormSchema[] = []; + // 添加通用字段 + schema.push( + { + component: 'Input', + fieldName: 'id', + dependencies: { + triggerFields: [''], + show: () => false, }, - { - label: '渠道费率', - fieldName: 'feeRate', - component: 'InputNumber', - rules: 'required', - componentProps: { - placeholder: '请输入渠道费率', - addonAfter: '%', - }, - defaultValue: 0, + }, + { + label: '应用编号', + fieldName: 'appId', + component: 'Input', + dependencies: { + show: () => false, + triggerFields: [''], + }, + }, + { + label: '渠道编码', + fieldName: 'code', + component: 'Input', + dependencies: { + show: () => false, + triggerFields: [''], }, + }, + { + label: '渠道费率', + fieldName: 'feeRate', + component: 'InputNumber', + rules: 'required', + componentProps: { + placeholder: '请输入渠道费率', + addonAfter: '%', + }, + defaultValue: 0, + }, + { + label: '渠道状态', + fieldName: 'status', + component: 'RadioGroup', + rules: z.number().default(CommonStatusEnum.ENABLE), + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + }, + ); + // 根据类型添加特定字段 + if (formType.includes('alipay_')) { + schema.push( { label: '开放平台 APPID', fieldName: 'config.appId', @@ -286,16 +318,6 @@ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { placeholder: '请输入开放平台 APPID', }, }, - { - label: '渠道状态', - fieldName: 'status', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), - }, - defaultValue: 0, - }, { label: '网关地址', fieldName: 'config.serverUrl', @@ -367,7 +389,7 @@ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { rows: 3, }, dependencies: { - show(values) { + show(values: any) { return values?.config?.mode === 1; }, triggerFields: ['config.mode', 'mode', 'config'], @@ -385,7 +407,7 @@ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { }), rules: 'required', dependencies: { - show(values) { + show(values: any) { return values?.config?.mode === 2; }, triggerFields: ['config.mode', 'mode', 'config'], @@ -403,7 +425,7 @@ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { }), rules: 'required', dependencies: { - show(values) { + show(values: any) { return values?.config?.mode === 2; }, triggerFields: ['config.mode', 'mode', 'config'], @@ -421,7 +443,7 @@ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { }), rules: 'required', dependencies: { - show(values) { + show(values: any) { return values?.config?.mode === 2; }, triggerFields: ['config.mode', 'mode', 'config'], @@ -452,106 +474,15 @@ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { component: 'Input', rules: 'required', dependencies: { - show(values) { + show(values: any) { return values?.config?.encryptType === 'AES'; }, triggerFields: ['config.encryptType', 'encryptType', 'config'], }, }, - { - label: '备注', - fieldName: 'remark', - component: 'Input', - componentProps: { - placeholder: '请输入备注', - }, - }, - ]; - } else if (formType.includes('mock') || formType.includes('wallet')) { - return [ - { - label: '应用编号', - fieldName: 'appId', - component: 'Input', - dependencies: { - show: () => false, - triggerFields: [''], - }, - }, - { - label: '渠道状态', - fieldName: 'status', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), - }, - defaultValue: 0, - }, - { - label: '渠道编码', - fieldName: 'code', - component: 'Input', - dependencies: { - show: () => false, - triggerFields: [''], - }, - }, - { - label: '渠道费率', - fieldName: 'feeRate', - component: 'InputNumber', - rules: 'required', - componentProps: { - placeholder: '请输入渠道费率', - addonAfter: '%', - }, - defaultValue: 0, - dependencies: { - show: () => false, - triggerFields: [''], - }, - }, - { - label: '备注', - fieldName: 'remark', - component: 'Input', - componentProps: { - placeholder: '请输入备注', - }, - }, - ]; - } else if (formType.includes('wx')) { - return [ - { - label: '应用编号', - fieldName: 'appId', - component: 'Input', - dependencies: { - show: () => false, - triggerFields: [''], - }, - }, - { - label: '渠道编码', - fieldName: 'code', - component: 'Input', - dependencies: { - show: () => false, - triggerFields: [''], - }, - }, - { - label: '渠道费率', - fieldName: 'feeRate', - component: 'InputNumber', - rules: 'required', - componentProps: { - placeholder: '请输入渠道费率', - addonAfter: '%', - }, - defaultValue: 0, - }, + ); + } else if (formType.includes('wx_')) { + schema.push( { label: '微信 APPID', fieldName: 'config.appId', @@ -572,16 +503,6 @@ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { placeholder: '请输入商户号', }, }, - { - label: '渠道状态', - fieldName: 'status', - component: 'RadioGroup', - rules: 'required', - componentProps: { - options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), - }, - defaultValue: 0, - }, { label: 'API 版本', fieldName: 'config.apiVersion', @@ -609,7 +530,7 @@ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { placeholder: '请输入商户密钥', }, dependencies: { - show(values) { + show(values: any) { return values?.config?.apiVersion === 'v2'; }, triggerFields: ['config.mode', 'mode', 'config'], @@ -630,7 +551,7 @@ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { }), rules: 'required', dependencies: { - show(values) { + show(values: any) { return values?.config?.apiVersion === 'v2'; }, triggerFields: ['config.mode', 'mode', 'config'], @@ -645,7 +566,7 @@ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { placeholder: '请输入 API V3 密钥', }, dependencies: { - show(values) { + show(values: any) { return values?.config?.apiVersion === 'v3'; }, triggerFields: ['config.mode', 'mode', 'config'], @@ -666,7 +587,7 @@ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { }), rules: 'required', dependencies: { - show(values) { + show(values: any) { return values?.config?.apiVersion === 'v3'; }, triggerFields: ['config.mode', 'mode', 'config'], @@ -682,7 +603,7 @@ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { placeholder: '请输入证书序列号', }, dependencies: { - show(values) { + show(values: any) { return values?.config?.apiVersion === 'v3'; }, triggerFields: ['config.mode', 'mode', 'config'], @@ -702,7 +623,7 @@ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { }, }), dependencies: { - show(values) { + show(values: any) { return values?.config?.apiVersion === 'v3'; }, triggerFields: ['config.mode', 'mode', 'config'], @@ -718,22 +639,22 @@ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { placeholder: '请输入公钥 ID', }, dependencies: { - show(values) { + show(values: any) { return values?.config?.apiVersion === 'v3'; }, triggerFields: ['config.mode', 'mode', 'config'], }, }, - { - label: '备注', - fieldName: 'remark', - component: 'Input', - componentProps: { - placeholder: '请输入备注', - }, - }, - ]; - } else { - return []; + ); } + // 添加备注字段(所有类型都有) + schema.push({ + label: '备注', + fieldName: 'remark', + component: 'Input', + componentProps: { + placeholder: '请输入备注', + }, + }); + return schema; } -- Gitee From 73e64b468aee700d90aabea55dfa3be1112028b5 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 5 Oct 2025 20:45:55 +0800 Subject: [PATCH 68/87] =?UTF-8?q?feat=EF=BC=9A=E3=80=90antd=E3=80=91?= =?UTF-8?q?=E3=80=90ele=E3=80=91=E3=80=90pay=20=E6=94=AF=E4=BB=98=E3=80=91?= =?UTF-8?q?pay/order=20=E5=9C=A8=20antd=20=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/views/pay/order/data.ts | 83 ++++++++++++------- apps/web-antd/src/views/pay/order/index.vue | 9 +- .../src/views/pay/order/modules/detail.vue | 14 ++-- 3 files changed, 62 insertions(+), 44 deletions(-) diff --git a/apps/web-antd/src/views/pay/order/data.ts b/apps/web-antd/src/views/pay/order/data.ts index 1fcd6ee21..86312814f 100644 --- a/apps/web-antd/src/views/pay/order/data.ts +++ b/apps/web-antd/src/views/pay/order/data.ts @@ -11,66 +11,74 @@ import { erpPriceInputFormatter, formatDateTime } from '@vben/utils'; import { Tag } from 'ant-design-vue'; import { DictTag } from '#/components/dict-tag'; +import { getRangePickerDefaultProps } from '#/utils'; /** 列表的搜索表单 */ export function useGridFormSchema(): VbenFormSchema[] { return [ { - component: 'Input', fieldName: 'appId', label: '应用编号', + component: 'Input', componentProps: { + allowClear: true, placeholder: '请输入应用编号', }, }, { - component: 'Select', fieldName: 'channelCode', label: '支付渠道', + component: 'Select', componentProps: { - placeholder: '请选择开启状态', + allowClear: true, + placeholder: '请选择支付渠道', options: getDictOptions(DICT_TYPE.PAY_CHANNEL_CODE, 'string'), }, }, { - component: 'Input', fieldName: 'merchantOrderId', label: '商户单号', + component: 'Input', componentProps: { + allowClear: true, placeholder: '请输入商户单号', }, }, { - component: 'Input', fieldName: 'no', label: '支付单号', + component: 'Input', componentProps: { + allowClear: true, placeholder: '请输入支付单号', }, }, { - component: 'Input', fieldName: 'channelOrderNo', label: '渠道单号', + component: 'Input', componentProps: { + allowClear: true, placeholder: '请输入渠道单号', }, }, { - component: 'Select', fieldName: 'status', label: '支付状态', + component: 'Select', componentProps: { + allowClear: true, placeholder: '请选择支付状态', options: getDictOptions(DICT_TYPE.PAY_ORDER_STATUS, 'number'), }, }, { - component: 'RangePicker', fieldName: 'createTime', label: '创建时间', + component: 'RangePicker', componentProps: { - placeholder: ['开始日期', '结束日期'], + ...getRangePickerDefaultProps(), + allowClear: true, }, }, ]; @@ -79,65 +87,74 @@ export function useGridFormSchema(): VbenFormSchema[] { /** 列表的字段 */ export function useGridColumns(): VxeTableGridOptions['columns'] { return [ - { type: 'checkbox', width: 60 }, { - title: '编号', field: 'id', + title: '编号', + minWidth: 100, }, { - title: '支付金额', field: 'price', + title: '支付金额', + minWidth: 120, formatter: 'formatAmount2', }, { - title: '退款金额', field: 'refundPrice', + title: '退款金额', + minWidth: 120, formatter: 'formatAmount2', }, { - title: '手续金额', field: 'channelFeePrice', + title: '手续金额', + minWidth: 120, formatter: 'formatAmount2', }, { - title: '订单号', field: 'no', + title: '订单号', + minWidth: 240, slots: { default: 'no', }, }, { - title: '支付状态', field: 'status', + title: '支付状态', + minWidth: 120, cellRender: { name: 'CellDict', props: { type: DICT_TYPE.PAY_ORDER_STATUS }, }, }, { - title: '支付渠道', field: 'channelCode', + title: '支付渠道', + minWidth: 120, cellRender: { name: 'CellDict', props: { type: DICT_TYPE.PAY_CHANNEL_CODE }, }, }, { - title: '支付时间', field: 'successTime', + title: '支付时间', + minWidth: 180, formatter: 'formatDateTime', }, { - title: '支付应用', field: 'appName', + title: '支付应用', + minWidth: 150, }, { - title: '商品标题', field: 'subject', + title: '商品标题', + minWidth: 200, }, { title: '操作', - width: 100, + width: 80, fixed: 'right', slots: { default: 'actions' }, }, @@ -166,7 +183,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'status', label: '支付状态', - content: (data) => + content: (data: any) => h(DictTag, { type: DICT_TYPE.PAY_ORDER_STATUS, value: data?.status, @@ -175,37 +192,39 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'price', label: '支付金额', - content: (data) => `¥${erpPriceInputFormatter(data?.price)}`, + content: (data: any) => `¥${erpPriceInputFormatter(data?.price)}`, }, { field: 'channelFeePrice', label: '手续费', - content: (data) => `¥${erpPriceInputFormatter(data?.channelFeePrice)}`, + content: (data: any) => + `¥${erpPriceInputFormatter(data?.channelFeePrice)}`, }, { field: 'channelFeeRate', label: '手续费比例', - content: (data) => `${erpPriceInputFormatter(data?.channelFeeRate)}%`, + content: (data: any) => + `${erpPriceInputFormatter(data?.channelFeeRate)}%`, }, { field: 'successTime', label: '支付时间', - content: (data) => formatDateTime(data?.successTime) as string, + content: (data: any) => formatDateTime(data?.successTime || '') as string, }, { field: 'expireTime', label: '失效时间', - content: (data) => formatDateTime(data?.expireTime) as string, + content: (data: any) => formatDateTime(data?.expireTime || '') as string, }, { field: 'createTime', label: '创建时间', - content: (data) => formatDateTime(data?.createTime) as string, + content: (data: any) => formatDateTime(data?.createTime || '') as string, }, { field: 'updateTime', label: '更新时间', - content: (data) => formatDateTime(data?.updateTime) as string, + content: (data: any) => formatDateTime(data?.updateTime || '') as string, }, { field: 'subject', @@ -218,7 +237,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'channelCode', label: '支付渠道', - content: (data) => + content: (data: any) => h(DictTag, { type: DICT_TYPE.PAY_CHANNEL_CODE, value: data?.channelCode, @@ -231,7 +250,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'channelOrderNo', label: '渠道单号', - content: (data) => + content: (data: any) => h(Tag, { color: 'green' }, () => data?.channelOrderNo || ''), }, { @@ -241,7 +260,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'refundPrice', label: '退款金额', - content: (data) => `¥${erpPriceInputFormatter(data?.refundPrice)}`, + content: (data: any) => `¥${erpPriceInputFormatter(data?.refundPrice)}`, }, { field: 'notifyUrl', diff --git a/apps/web-antd/src/views/pay/order/index.vue b/apps/web-antd/src/views/pay/order/index.vue index 098b88e34..4560d5b79 100644 --- a/apps/web-antd/src/views/pay/order/index.vue +++ b/apps/web-antd/src/views/pay/order/index.vue @@ -8,6 +8,7 @@ import { Tag } from 'ant-design-vue'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { getOrderPage } from '#/api/pay/order'; +import { $t } from '#/locales'; import { useGridColumns, useGridFormSchema } from './data'; import Detail from './modules/detail.vue'; @@ -18,7 +19,7 @@ const [DetailModal, detailModalApi] = useVbenModal({ }); /** 刷新表格 */ -function onRefresh() { +function handleRefresh() { gridApi.query(); } @@ -30,11 +31,11 @@ function handleDetail(row: PayOrderApi.Order) { const [Grid, gridApi] = useVbenVxeGrid({ formOptions: { schema: useGridFormSchema(), - collapsed: false, }, gridOptions: { cellConfig: { height: 80, + }, columns: useGridColumns(), height: 'auto', @@ -52,9 +53,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ }, rowConfig: { keyField: 'id', - isCurrent: true, isHover: true, - resizable: true, }, toolbarConfig: { refresh: true, @@ -80,7 +79,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ url="https://doc.iocoder.cn/pay/wx-lite-pay-demo/" /> - + diff --git a/apps/web-antd/src/views/pay/refund/modules/detail.vue b/apps/web-antd/src/views/pay/refund/modules/detail.vue index 1df2ec035..1f739575e 100644 --- a/apps/web-antd/src/views/pay/refund/modules/detail.vue +++ b/apps/web-antd/src/views/pay/refund/modules/detail.vue @@ -5,31 +5,20 @@ import { ref } from 'vue'; import { useVbenModal } from '@vben/common-ui'; -import { Divider } from 'ant-design-vue'; - import { getRefund } from '#/api/pay/refund'; import { useDescription } from '#/components/description'; -import { useBaseDetailSchema, useChannelDetailSchema } from '../data'; +import { useDetailSchema } from '../data'; const formData = ref(); -const [BaseDescriptions] = useDescription({ - componentProps: { - bordered: false, - column: 2, - class: 'mx-4', - }, - schema: useBaseDetailSchema(), -}); - -const [ChannelDescriptions] = useDescription({ +const [Descriptions] = useDescription({ componentProps: { - bordered: false, + bordered: true, column: 2, class: 'mx-4', }, - schema: useChannelDetailSchema(), + schema: useDetailSchema(), }); const [Modal, modalApi] = useVbenModal({ @@ -52,7 +41,6 @@ const [Modal, modalApi] = useVbenModal({ }, }); - -- Gitee From 25e434276a973b85641f5fca229bc86e869659f2 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 5 Oct 2025 21:48:00 +0800 Subject: [PATCH 72/87] =?UTF-8?q?fix=EF=BC=9A=E3=80=90antd=E3=80=91?= =?UTF-8?q?=E3=80=90ele=E3=80=91=E3=80=90pay=20=E6=94=AF=E4=BB=98=E3=80=91?= =?UTF-8?q?pay/refund=20=E8=BF=81=E7=A7=BB=20ele=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/views/pay/refund/data.ts | 12 +- .../src/views/pay/refund/modules/detail.vue | 1 + apps/web-ele/src/api/pay/refund/index.ts | 3 + apps/web-ele/src/views/pay/refund/data.ts | 167 +++++++++++------- apps/web-ele/src/views/pay/refund/index.vue | 58 +++--- .../src/views/pay/refund/modules/detail.vue | 28 +-- 6 files changed, 147 insertions(+), 122 deletions(-) diff --git a/apps/web-antd/src/views/pay/refund/data.ts b/apps/web-antd/src/views/pay/refund/data.ts index d16a5755a..69eee7224 100644 --- a/apps/web-antd/src/views/pay/refund/data.ts +++ b/apps/web-antd/src/views/pay/refund/data.ts @@ -206,16 +206,20 @@ export function useDetailSchema(): DescriptionItemSchema[] { field: 'payPrice', label: '支付金额', content: (data: PayRefundApi.Refund) => - h(Tag, { color: 'success' }, () => - `¥${erpPriceInputFormatter(data?.payPrice || 0)}` + h( + Tag, + { color: 'success' }, + () => `¥${erpPriceInputFormatter(data?.payPrice || 0)}`, ), }, { field: 'refundPrice', label: '退款金额', content: (data: PayRefundApi.Refund) => - h(Tag, { color: 'danger' }, () => - `¥${erpPriceInputFormatter(data?.refundPrice || 0)}` + h( + Tag, + { color: 'danger' }, + () => `¥${erpPriceInputFormatter(data?.refundPrice || 0)}`, ), }, { diff --git a/apps/web-antd/src/views/pay/refund/modules/detail.vue b/apps/web-antd/src/views/pay/refund/modules/detail.vue index 1f739575e..1617b1d60 100644 --- a/apps/web-antd/src/views/pay/refund/modules/detail.vue +++ b/apps/web-antd/src/views/pay/refund/modules/detail.vue @@ -41,6 +41,7 @@ const [Modal, modalApi] = useVbenModal({ }, }); + diff --git a/apps/web-ele/src/views/pay/refund/modules/detail.vue b/apps/web-ele/src/views/pay/refund/modules/detail.vue index 226d7bf3b..1f3e380cb 100644 --- a/apps/web-ele/src/views/pay/refund/modules/detail.vue +++ b/apps/web-ele/src/views/pay/refund/modules/detail.vue @@ -5,37 +5,23 @@ import { ref } from 'vue'; import { useVbenModal } from '@vben/common-ui'; -import { ElDivider } from 'element-plus'; - import { getRefund } from '#/api/pay/refund'; import { useDescription } from '#/components/description'; -import { useBaseDetailSchema, useChannelDetailSchema } from '../data'; +import { useDetailSchema } from '../data'; const formData = ref(); -const [BaseDescription] = useDescription({ - componentProps: { - border: false, - column: 2, - direction: 'horizontal', - title: '', - labelWidth: 200, - extra: '', - }, - schema: useBaseDetailSchema(), -}); - -const [ChannelDescription] = useDescription({ +const [Descriptions] = useDescription({ componentProps: { - border: false, + border: true, column: 2, direction: 'horizontal', + labelWidth: 140, title: '', - labelWidth: 200, extra: '', }, - schema: useChannelDetailSchema(), + schema: useDetailSchema(), }); const [Modal, modalApi] = useVbenModal({ @@ -66,8 +52,6 @@ const [Modal, modalApi] = useVbenModal({ :show-cancel-button="false" :show-confirm-button="false" > - - - + -- Gitee From b587032597b849a0007fe4c44344f40df3ba2d0f Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 5 Oct 2025 22:06:58 +0800 Subject: [PATCH 73/87] =?UTF-8?q?feat=EF=BC=9A=E3=80=90antd=E3=80=91?= =?UTF-8?q?=E3=80=90ele=E3=80=91=E3=80=90pay=20=E6=94=AF=E4=BB=98=E3=80=91?= =?UTF-8?q?pay/transfer=20=E8=BF=81=E7=A7=BB=20antd=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/api/pay/transfer/index.ts | 16 ++- apps/web-antd/src/views/pay/transfer/data.ts | 125 +++++++++--------- .../web-antd/src/views/pay/transfer/index.vue | 47 +++---- .../src/views/pay/transfer/modules/detail.vue | 3 +- 4 files changed, 100 insertions(+), 91 deletions(-) diff --git a/apps/web-antd/src/api/pay/transfer/index.ts b/apps/web-antd/src/api/pay/transfer/index.ts index 4c588cb65..f079c6a36 100644 --- a/apps/web-antd/src/api/pay/transfer/index.ts +++ b/apps/web-antd/src/api/pay/transfer/index.ts @@ -6,31 +6,41 @@ export namespace PayTransferApi { /** 转账单信息 */ export interface Transfer { id: number; + no: string; appId: number; + appName: string; channelId: number; channelCode: string; merchantTransferId: string; - type: number; + channelTransferNo: string; price: number; subject: string; userName: string; - alipayLogonId: string; - openid: string; + userAccount: string; + userIp: string; status: number; + successTime: Date; createTime: Date; + updateTime: Date; + notifyUrl: string; + channelNotifyData: string; } /** 转账单分页请求 */ export interface TransferPageReq extends PageParam { + no?: string; appId?: number; channelId?: number; channelCode?: string; merchantTransferId?: string; + channelTransferNo?: string; type?: number; price?: number; subject?: string; userName?: string; + userAccount?: string; status?: number; + successTime?: Date[]; createTime?: Date[]; } } diff --git a/apps/web-antd/src/views/pay/transfer/data.ts b/apps/web-antd/src/views/pay/transfer/data.ts index 815aaf2e6..c3d669d5d 100644 --- a/apps/web-antd/src/views/pay/transfer/data.ts +++ b/apps/web-antd/src/views/pay/transfer/data.ts @@ -1,17 +1,17 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { PayTransferApi } from '#/api/pay/transfer'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; import { erpPriceInputFormatter, formatDateTime } from '@vben/utils'; import { Tag } from 'ant-design-vue'; import { DictTag } from '#/components/dict-tag'; -import { DICT_TYPE } from '@vben/constants'; -import { getDictOptions } from '@vben/hooks'; - import { getRangePickerDefaultProps } from '#/utils'; /** 列表的搜索表单 */ @@ -75,7 +75,7 @@ export function useGridFormSchema(): VbenFormSchema[] { }, }, { - fieldName: 'accountNo', + fieldName: 'userAccount', label: '收款人账号', component: 'Input', componentProps: { @@ -110,96 +110,95 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { { field: 'id', title: '编号', - }, - { - field: 'createTime', - title: '创建时间', - formatter: 'formatDateTime', - }, - { - field: 'appName', - title: '支付应用', + minWidth: 100, }, { field: 'price', title: '转账金额', + minWidth: 120, formatter: 'formatAmount2', }, { - field: 'status', - title: '转账状态', - cellRender: { - name: 'CellDict', - props: { type: DICT_TYPE.PAY_TRANSFER_STATUS }, + field: 'merchantTransferId', + title: '转账单号', + minWidth: 350, + slots: { + default: 'no', }, }, { - field: 'type', - title: '类型', + field: 'status', + title: '转账状态', + minWidth: 120, cellRender: { name: 'CellDict', - props: { type: DICT_TYPE.PAY_TRANSFER_TYPE }, + props: { type: DICT_TYPE.PAY_TRANSFER_STATUS }, }, }, { field: 'channelCode', - title: '支付渠道', + title: '转账渠道', + minWidth: 140, cellRender: { name: 'CellDict', props: { type: DICT_TYPE.PAY_CHANNEL_CODE }, }, }, { - field: 'merchantTransferId', - title: '商户单号', + field: 'createTime', + title: '创建时间', + minWidth: 180, + formatter: 'formatDateTime', }, { - field: 'channelTransferNo', - title: '渠道单号', + field: 'successTime', + title: '转账时间', + minWidth: 180, + formatter: 'formatDateTime', + }, + { + field: 'subject', + title: '转账标题', + minWidth: 150, + }, + { + field: 'appName', + title: '支付应用', + minWidth: 150, }, { field: 'userName', title: '收款人姓名', + minWidth: 150, }, { - field: 'accountNo', - title: '收款人账号', + field: 'userAccount', + title: '收款账号', + minWidth: 200, }, { title: '操作', - width: 120, + width: 80, fixed: 'right', slots: { default: 'actions' }, }, ]; } -/** 详情的配置 */ +/** 详情的字段 */ export function useDetailSchema(): DescriptionItemSchema[] { return [ - { - field: 'id', - label: '编号', - }, { field: 'merchantTransferId', label: '商户单号', - content: (data) => { - return h(Tag, { - color: 'blue', - content: data?.merchantTransferId, - }); - }, + content: (data: PayTransferApi.Transfer) => + h(Tag, {}, () => data?.merchantTransferId || '-'), }, { field: 'no', label: '转账单号', - content: (data) => { - return h(Tag, { - color: 'blue', - content: data?.no, - }); - }, + content: (data: PayTransferApi.Transfer) => + h(Tag, { color: 'orange' }, () => data?.no || '-'), }, { field: 'appId', @@ -208,7 +207,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'status', label: '转账状态', - content: (data) => + content: (data: any) => h(DictTag, { type: DICT_TYPE.PAY_TRANSFER_STATUS, value: data?.status, @@ -217,22 +216,24 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'price', label: '转账金额', - content: (data) => { - return h(Tag, { - color: 'blue', - content: `¥${erpPriceInputFormatter(data?.price)}`, - }); - }, + content: (data: PayTransferApi.Transfer) => + h( + Tag, + { color: 'success' }, + () => `¥${erpPriceInputFormatter(data?.price || 0)}`, + ), }, { field: 'successTime', label: '转账时间', - content: (data) => formatDateTime(data?.successTime) as string, + content: (data: PayTransferApi.Transfer) => + formatDateTime(data?.successTime) as string, }, { field: 'createTime', label: '创建时间', - content: (data) => formatDateTime(data?.createTime) as string, + content: (data: PayTransferApi.Transfer) => + formatDateTime(data?.createTime) as string, }, { field: 'userName', @@ -245,25 +246,23 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'channelCode', label: '支付渠道', - content: (data) => + content: (data: PayTransferApi.Transfer) => h(DictTag, { type: DICT_TYPE.PAY_CHANNEL_CODE, value: data?.channelCode, }), }, { - field: 'channelCode', + field: 'userIp', label: '支付 IP', }, { field: 'channelTransferNo', label: '渠道单号', - content: (data) => { - return h(Tag, { - color: 'blue', - content: data?.channelTransferNo, - }); - }, + content: (data: PayTransferApi.Transfer) => + data?.channelTransferNo + ? h(Tag, { color: 'success' }, () => data.channelTransferNo) + : '', }, { field: 'notifyUrl', diff --git a/apps/web-antd/src/views/pay/transfer/index.vue b/apps/web-antd/src/views/pay/transfer/index.vue index 4461706f3..038ff0f75 100644 --- a/apps/web-antd/src/views/pay/transfer/index.vue +++ b/apps/web-antd/src/views/pay/transfer/index.vue @@ -3,10 +3,11 @@ import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { PayTransferApi } from '#/api/pay/transfer'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; -import { downloadFileFromBlobPart } from '@vben/utils'; + +import { Tag } from 'ant-design-vue'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; -import { exportTransfer, getTransferPage } from '#/api/pay/transfer'; +import { getTransferPage } from '#/api/pay/transfer'; import { $t } from '#/locales'; import { useGridColumns, useGridFormSchema } from './data'; @@ -18,16 +19,10 @@ const [DetailModal, detailModalApi] = useVbenModal({ }); /** 刷新表格 */ -function onRefresh() { +function handleRefresh() { gridApi.query(); } -/** 导出表格 */ -async function handleExport() { - const data = await exportTransfer(await gridApi.formApi.getValues()); - downloadFileFromBlobPart({ fileName: '转账单.xls', source: data }); -} - /** 查看转账详情 */ function handleDetail(row: PayTransferApi.Transfer) { detailModalApi.setData(row).open(); @@ -38,6 +33,9 @@ const [Grid, gridApi] = useVbenVxeGrid({ schema: useGridFormSchema(), }, gridOptions: { + cellConfig: { + height: 80, + }, columns: useGridColumns(), height: 'auto', keepSource: true, @@ -54,6 +52,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ }, rowConfig: { keyField: 'id', + isHover: true, }, toolbarConfig: { refresh: true, @@ -69,21 +68,8 @@ const [Grid, gridApi] = useVbenVxeGrid({ - + - + diff --git a/apps/web-antd/src/views/pay/transfer/modules/detail.vue b/apps/web-antd/src/views/pay/transfer/modules/detail.vue index e08fe1674..4854b8833 100644 --- a/apps/web-antd/src/views/pay/transfer/modules/detail.vue +++ b/apps/web-antd/src/views/pay/transfer/modules/detail.vue @@ -34,8 +34,7 @@ const [Modal, modalApi] = useVbenModal({ const [Descriptions] = useDescription({ componentProps: { - title: '基本信息', - bordered: false, + bordered: true, column: 2, class: 'mx-4', }, -- Gitee From fcc6162692adb7b91d5731a8717947e100591987 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 6 Oct 2025 09:18:37 +0800 Subject: [PATCH 74/87] =?UTF-8?q?feat=EF=BC=9A=E3=80=90antd=E3=80=91?= =?UTF-8?q?=E3=80=90ele=E3=80=91=E3=80=90pay=20=E6=94=AF=E4=BB=98=E3=80=91?= =?UTF-8?q?pay/transfer=20=E8=BF=81=E7=A7=BB=20ele=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-ele/src/views/pay/transfer/data.ts | 145 +++++++++--------- apps/web-ele/src/views/pay/transfer/index.vue | 47 +++--- .../src/views/pay/transfer/modules/detail.vue | 26 ++-- 3 files changed, 109 insertions(+), 109 deletions(-) diff --git a/apps/web-ele/src/views/pay/transfer/data.ts b/apps/web-ele/src/views/pay/transfer/data.ts index 730ca4a08..828fcf6db 100644 --- a/apps/web-ele/src/views/pay/transfer/data.ts +++ b/apps/web-ele/src/views/pay/transfer/data.ts @@ -1,17 +1,17 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { PayTransferApi } from '#/api/pay/transfer'; import type { DescriptionItemSchema } from '#/components/description'; import { h } from 'vue'; +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; import { erpPriceInputFormatter, formatDateTime } from '@vben/utils'; import { ElTag } from 'element-plus'; import { DictTag } from '#/components/dict-tag'; -import { DICT_TYPE } from '@vben/constants'; -import { getDictOptions } from '@vben/hooks'; - import { getRangePickerDefaultProps } from '#/utils'; /** 列表的搜索表单 */ @@ -22,7 +22,7 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '转账单号', component: 'Input', componentProps: { - clearable: true, + allowClear: true, placeholder: '请输入转账单号', }, }, @@ -32,7 +32,7 @@ export function useGridFormSchema(): VbenFormSchema[] { component: 'Select', componentProps: { options: getDictOptions(DICT_TYPE.PAY_CHANNEL_CODE), - clearable: true, + allowClear: true, placeholder: '请选择支付渠道', }, }, @@ -41,7 +41,7 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '商户单号', component: 'Input', componentProps: { - clearable: true, + allowClear: true, placeholder: '请输入商户单号', }, }, @@ -51,7 +51,7 @@ export function useGridFormSchema(): VbenFormSchema[] { component: 'Select', componentProps: { options: getDictOptions(DICT_TYPE.PAY_TRANSFER_TYPE), - clearable: true, + allowClear: true, placeholder: '请选择类型', }, }, @@ -61,7 +61,7 @@ export function useGridFormSchema(): VbenFormSchema[] { component: 'Select', componentProps: { options: getDictOptions(DICT_TYPE.PAY_TRANSFER_STATUS), - clearable: true, + allowClear: true, placeholder: '请选择转账状态', }, }, @@ -70,16 +70,16 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '收款人姓名', component: 'Input', componentProps: { - clearable: true, + allowClear: true, placeholder: '请输入收款人姓名', }, }, { - fieldName: 'accountNo', + fieldName: 'userAccount', label: '收款人账号', component: 'Input', componentProps: { - clearable: true, + allowClear: true, placeholder: '请输入收款人账号', }, }, @@ -88,7 +88,7 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '渠道单号', component: 'Input', componentProps: { - clearable: true, + allowClear: true, placeholder: '请输入渠道单号', }, }, @@ -98,7 +98,7 @@ export function useGridFormSchema(): VbenFormSchema[] { component: 'RangePicker', componentProps: { ...getRangePickerDefaultProps(), - clearable: true, + allowClear: true, }, }, ]; @@ -110,96 +110,95 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { { field: 'id', title: '编号', - }, - { - field: 'createTime', - title: '创建时间', - formatter: 'formatDateTime', - }, - { - field: 'appName', - title: '支付应用', + minWidth: 100, }, { field: 'price', title: '转账金额', - formatter: 'formatFenToYuanAmount', + minWidth: 120, + formatter: 'formatAmount2', }, { - field: 'status', - title: '转账状态', - cellRender: { - name: 'CellDict', - props: { type: DICT_TYPE.PAY_TRANSFER_STATUS }, + field: 'merchantTransferId', + title: '转账单号', + minWidth: 350, + slots: { + default: 'no', }, }, { - field: 'type', - title: '类型', + field: 'status', + title: '转账状态', + minWidth: 120, cellRender: { name: 'CellDict', - props: { type: DICT_TYPE.PAY_TRANSFER_TYPE }, + props: { type: DICT_TYPE.PAY_TRANSFER_STATUS }, }, }, { field: 'channelCode', - title: '支付渠道', + title: '转账渠道', + minWidth: 140, cellRender: { name: 'CellDict', props: { type: DICT_TYPE.PAY_CHANNEL_CODE }, }, }, { - field: 'merchantTransferId', - title: '商户单号', + field: 'createTime', + title: '创建时间', + minWidth: 180, + formatter: 'formatDateTime', }, { - field: 'channelTransferNo', - title: '渠道单号', + field: 'successTime', + title: '转账时间', + minWidth: 180, + formatter: 'formatDateTime', + }, + { + field: 'subject', + title: '转账标题', + minWidth: 150, + }, + { + field: 'appName', + title: '支付应用', + minWidth: 150, }, { field: 'userName', title: '收款人姓名', + minWidth: 150, }, { - field: 'accountNo', - title: '收款人账号', + field: 'userAccount', + title: '收款账号', + minWidth: 200, }, { title: '操作', - width: 120, + width: 80, fixed: 'right', slots: { default: 'actions' }, }, ]; } -/** 详情的配置 */ +/** 详情的字段 */ export function useDetailSchema(): DescriptionItemSchema[] { return [ - { - field: 'id', - label: '编号', - }, { field: 'merchantTransferId', label: '商户单号', - content: (data) => { - return h(ElTag, { - color: 'blue', - content: data?.merchantTransferId, - }); - }, + content: (data: PayTransferApi.Transfer) => + h(ElTag, {}, () => data?.merchantTransferId), }, { field: 'no', label: '转账单号', - content: (data) => { - return h(ElTag, { - color: 'blue', - content: data?.no, - }); - }, + content: (data: PayTransferApi.Transfer) => + h(ElTag, { color: 'orange' }, () => data?.no), }, { field: 'appId', @@ -208,7 +207,7 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'status', label: '转账状态', - content: (data) => + content: (data: any) => h(DictTag, { type: DICT_TYPE.PAY_TRANSFER_STATUS, value: data?.status, @@ -217,22 +216,24 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'price', label: '转账金额', - content: (data) => { - return h(ElTag, { - color: 'blue', - content: `¥${erpPriceInputFormatter(data?.price)}`, - }); - }, + content: (data: PayTransferApi.Transfer) => + h( + ElTag, + { color: 'success' }, + () => `¥${erpPriceInputFormatter(data?.price || 0)}`, + ), }, { field: 'successTime', label: '转账时间', - content: (data) => formatDateTime(data?.successTime) as string, + content: (data: PayTransferApi.Transfer) => + formatDateTime(data?.successTime) as string, }, { field: 'createTime', label: '创建时间', - content: (data) => formatDateTime(data?.createTime) as string, + content: (data: PayTransferApi.Transfer) => + formatDateTime(data?.createTime) as string, }, { field: 'userName', @@ -245,25 +246,23 @@ export function useDetailSchema(): DescriptionItemSchema[] { { field: 'channelCode', label: '支付渠道', - content: (data) => + content: (data: PayTransferApi.Transfer) => h(DictTag, { type: DICT_TYPE.PAY_CHANNEL_CODE, value: data?.channelCode, }), }, { - field: 'channelCode', + field: 'userIp', label: '支付 IP', }, { field: 'channelTransferNo', label: '渠道单号', - content: (data) => { - return h(ElTag, { - color: 'blue', - content: data?.channelTransferNo, - }); - }, + content: (data: PayTransferApi.Transfer) => + data?.channelTransferNo + ? h(ElTag, { color: 'success' }, () => data.channelTransferNo) + : '', }, { field: 'notifyUrl', diff --git a/apps/web-ele/src/views/pay/transfer/index.vue b/apps/web-ele/src/views/pay/transfer/index.vue index 9f50fd857..c0d830dc4 100644 --- a/apps/web-ele/src/views/pay/transfer/index.vue +++ b/apps/web-ele/src/views/pay/transfer/index.vue @@ -3,10 +3,11 @@ import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { PayTransferApi } from '#/api/pay/transfer'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; -import { downloadFileFromBlobPart } from '@vben/utils'; + +import { ElTag } from 'element-plus'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; -import { exportTransfer, getTransferPage } from '#/api/pay/transfer'; +import { getTransferPage } from '#/api/pay/transfer'; import { $t } from '#/locales'; import { useGridColumns, useGridFormSchema } from './data'; @@ -18,16 +19,10 @@ const [DetailModal, detailModalApi] = useVbenModal({ }); /** 刷新表格 */ -function onRefresh() { +function handleRefresh() { gridApi.query(); } -/** 导出表格 */ -async function handleExport() { - const data = await exportTransfer(await gridApi.formApi.getValues()); - downloadFileFromBlobPart({ fileName: '转账单.xls', source: data }); -} - /** 查看转账详情 */ function handleDetail(row: PayTransferApi.Transfer) { detailModalApi.setData(row).open(); @@ -38,6 +33,9 @@ const [Grid, gridApi] = useVbenVxeGrid({ schema: useGridFormSchema(), }, gridOptions: { + cellConfig: { + height: 80, + }, columns: useGridColumns(), height: 'auto', keepSource: true, @@ -54,6 +52,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ }, rowConfig: { keyField: 'id', + isHover: true, }, toolbarConfig: { refresh: true, @@ -69,21 +68,8 @@ const [Grid, gridApi] = useVbenVxeGrid({ - + - + diff --git a/apps/web-ele/src/views/pay/transfer/modules/detail.vue b/apps/web-ele/src/views/pay/transfer/modules/detail.vue index 79868c194..301f7aea1 100644 --- a/apps/web-ele/src/views/pay/transfer/modules/detail.vue +++ b/apps/web-ele/src/views/pay/transfer/modules/detail.vue @@ -12,6 +12,18 @@ import { useDetailSchema } from '../data'; const formData = ref(); +const [Descriptions] = useDescription({ + componentProps: { + border: true, + column: 2, + direction: 'horizontal', + labelWidth: 140, + title: '', + extra: '', + }, + schema: useDetailSchema(), +}); + const [Modal, modalApi] = useVbenModal({ async onOpenChange(isOpen: boolean) { if (!isOpen) { @@ -31,18 +43,6 @@ const [Modal, modalApi] = useVbenModal({ } }, }); - -const [Description] = useDescription({ - componentProps: { - title: '基本信息', - border: false, - column: 2, - direction: 'horizontal', - labelWidth: 200, - extra: '', - }, - schema: useDetailSchema(), -}); -- Gitee From 96026b85b50f785e18e0dc4c26dcb1793dba3602 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 6 Oct 2025 09:33:43 +0800 Subject: [PATCH 75/87] =?UTF-8?q?feat=EF=BC=9A=E3=80=90antd=E3=80=91?= =?UTF-8?q?=E3=80=90ele=E3=80=91=E3=80=90pay=20=E6=94=AF=E4=BB=98=E3=80=91?= =?UTF-8?q?order/refund/transfer=20=E5=AF=BC=E5=87=BA=E7=9A=84=E7=BC=BA?= =?UTF-8?q?=E5=A4=B1=E8=A1=A5=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/api/pay/app/index.ts | 10 ++-- apps/web-antd/src/api/pay/order/index.ts | 49 ++---------------- apps/web-antd/src/api/pay/refund/index.ts | 50 ++----------------- apps/web-antd/src/api/pay/transfer/index.ts | 15 ++---- apps/web-antd/src/views/pay/order/index.vue | 22 +++++++- apps/web-antd/src/views/pay/refund/index.vue | 22 +++++++- apps/web-antd/src/views/pay/transfer/data.ts | 4 +- .../web-antd/src/views/pay/transfer/index.vue | 22 +++++++- .../src/views/pay/transfer/modules/detail.vue | 18 +++---- apps/web-ele/src/api/pay/app/index.ts | 10 ++-- apps/web-ele/src/api/pay/order/index.ts | 49 ++---------------- apps/web-ele/src/api/pay/refund/index.ts | 50 ++----------------- apps/web-ele/src/api/pay/transfer/index.ts | 27 ++++++---- apps/web-ele/src/views/pay/order/index.vue | 22 +++++++- apps/web-ele/src/views/pay/refund/index.vue | 25 +++++++++- apps/web-ele/src/views/pay/transfer/index.vue | 22 +++++++- 16 files changed, 180 insertions(+), 237 deletions(-) diff --git a/apps/web-antd/src/api/pay/app/index.ts b/apps/web-antd/src/api/pay/app/index.ts index ca78d6d34..081c7aa77 100644 --- a/apps/web-antd/src/api/pay/app/index.ts +++ b/apps/web-antd/src/api/pay/app/index.ts @@ -25,20 +25,16 @@ export namespace PayAppApi { status: number; } - export interface AppPageReq extends PageParam { + export interface AppPageReqVO extends PageParam { name?: string; + appKey?: string; status?: number; - remark?: string; - payNotifyUrl?: string; - refundNotifyUrl?: string; - transferNotifyUrl?: string; - merchantName?: string; createTime?: Date[]; } } /** 查询支付应用列表 */ -export function getAppPage(params: PayAppApi.AppPageReq) { +export function getAppPage(params: PayAppApi.AppPageReqVO) { return requestClient.get>('/pay/app/page', { params, }); diff --git a/apps/web-antd/src/api/pay/order/index.ts b/apps/web-antd/src/api/pay/order/index.ts index aff890dfa..445549192 100644 --- a/apps/web-antd/src/api/pay/order/index.ts +++ b/apps/web-antd/src/api/pay/order/index.ts @@ -40,60 +40,19 @@ export namespace PayOrderApi { } /** 支付订单分页请求 */ - export interface OrderPageReq extends PageParam { - merchantId?: number; + export interface OrderPageReqVO extends PageParam { appId?: number; - channelId?: number; channelCode?: string; merchantOrderId?: string; - subject?: string; - body?: string; - notifyUrl?: string; - notifyStatus?: number; - amount?: number; - channelFeeRate?: number; - channelFeeAmount?: number; - status?: number; - expireTime?: Date[]; - successTime?: Date[]; - notifyTime?: Date[]; - successExtensionId?: number; - refundStatus?: number; - refundTimes?: number; - channelUserId?: string; channelOrderNo?: string; - createTime?: Date[]; - } - - /** 支付订单导出请求 */ - export interface OrderExportReq { - merchantId?: number; - appId?: number; - channelId?: number; - channelCode?: string; - merchantOrderId?: string; - subject?: string; - body?: string; - notifyUrl?: string; - notifyStatus?: number; - amount?: number; - channelFeeRate?: number; - channelFeeAmount?: number; + no?: string; status?: number; - expireTime?: Date[]; - successTime?: Date[]; - notifyTime?: Date[]; - successExtensionId?: number; - refundStatus?: number; - refundTimes?: number; - channelUserId?: string; - channelOrderNo?: string; createTime?: Date[]; } } /** 查询支付订单列表 */ -export function getOrderPage(params: PayOrderApi.OrderPageReq) { +export function getOrderPage(params: PayOrderApi.OrderPageReqVO) { return requestClient.get>('/pay/order/page', { params, }); @@ -120,6 +79,6 @@ export function submitOrder(data: any) { } /** 导出支付订单 */ -export function exportOrder(params: PayOrderApi.OrderExportReq) { +export function exportOrder(params: any) { return requestClient.download('/pay/order/export-excel', { params }); } diff --git a/apps/web-antd/src/api/pay/refund/index.ts b/apps/web-antd/src/api/pay/refund/index.ts index 96e6b3c3f..bce2448bc 100644 --- a/apps/web-antd/src/api/pay/refund/index.ts +++ b/apps/web-antd/src/api/pay/refund/index.ts @@ -38,36 +38,7 @@ export namespace PayRefundApi { } /** 退款订单分页请求 */ - export interface RefundPageReq extends PageParam { - merchantId?: number; - appId?: number; - channelId?: number; - channelCode?: string; - orderId?: string; - tradeNo?: string; - merchantOrderId?: string; - merchantRefundNo?: string; - notifyUrl?: string; - notifyStatus?: number; - status?: number; - type?: number; - payAmount?: number; - refundAmount?: number; - reason?: string; - userIp?: string; - channelOrderNo?: string; - channelRefundNo?: string; - channelErrorCode?: string; - channelErrorMsg?: string; - channelExtras?: string; - expireTime?: Date[]; - successTime?: Date[]; - notifyTime?: Date[]; - createTime?: Date[]; - } - - /** 退款订单导出请求 */ - export interface RefundExportReq { + export interface RefundPageReqVO extends PageParam { merchantId?: number; appId?: number; channelId?: number; @@ -97,7 +68,7 @@ export namespace PayRefundApi { } /** 查询退款订单列表 */ -export function getRefundPage(params: PayRefundApi.RefundPageReq) { +export function getRefundPage(params: PayRefundApi.RefundPageReqVO) { return requestClient.get>( '/pay/refund/page', { @@ -111,22 +82,7 @@ export function getRefund(id: number) { return requestClient.get(`/pay/refund/get?id=${id}`); } -/** 创建退款订单 */ -export function createRefund(data: PayRefundApi.Refund) { - return requestClient.post('/pay/refund/create', data); -} - -/** 更新退款订单 */ -export function updateRefund(data: PayRefundApi.Refund) { - return requestClient.put('/pay/refund/update', data); -} - -/** 删除退款订单 */ -export function deleteRefund(id: number) { - return requestClient.delete(`/pay/refund/delete?id=${id}`); -} - /** 导出退款订单 */ -export function exportRefund(params: PayRefundApi.RefundExportReq) { +export function exportRefund(params: any) { return requestClient.download('/pay/refund/export-excel', { params }); } diff --git a/apps/web-antd/src/api/pay/transfer/index.ts b/apps/web-antd/src/api/pay/transfer/index.ts index f079c6a36..75cd21153 100644 --- a/apps/web-antd/src/api/pay/transfer/index.ts +++ b/apps/web-antd/src/api/pay/transfer/index.ts @@ -27,26 +27,21 @@ export namespace PayTransferApi { } /** 转账单分页请求 */ - export interface TransferPageReq extends PageParam { + export interface TransferPageReqVO extends PageParam { no?: string; appId?: number; - channelId?: number; channelCode?: string; - merchantTransferId?: string; - channelTransferNo?: string; - type?: number; - price?: number; - subject?: string; + merchantOrderId?: string; + status?: number; userName?: string; userAccount?: string; - status?: number; - successTime?: Date[]; + channelTransferNo?: string; createTime?: Date[]; } } /** 查询转账单列表 */ -export function getTransferPage(params: PayTransferApi.TransferPageReq) { +export function getTransferPage(params: PayTransferApi.TransferPageReqVO) { return requestClient.get>( '/pay/transfer/page', { diff --git a/apps/web-antd/src/views/pay/order/index.vue b/apps/web-antd/src/views/pay/order/index.vue index 42aeefba0..c8c88bdc3 100644 --- a/apps/web-antd/src/views/pay/order/index.vue +++ b/apps/web-antd/src/views/pay/order/index.vue @@ -3,11 +3,12 @@ import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { PayOrderApi } from '#/api/pay/order'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; +import { downloadFileFromBlobPart } from '@vben/utils'; import { Tag } from 'ant-design-vue'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; -import { getOrderPage } from '#/api/pay/order'; +import { exportOrder, getOrderPage } from '#/api/pay/order'; import { $t } from '#/locales'; import { useGridColumns, useGridFormSchema } from './data'; @@ -23,6 +24,12 @@ function handleRefresh() { gridApi.query(); } +/** 导出支付订单 */ +async function handleExport() { + const data = await exportOrder(await gridApi.formApi.getValues()); + downloadFileFromBlobPart({ fileName: '支付订单.xls', source: data }); +} + /** 查看详情 */ function handleDetail(row: PayOrderApi.Order) { detailModalApi.setData(row).open(); @@ -80,6 +87,19 @@ const [Grid, gridApi] = useVbenVxeGrid({ +