From 80fa8b74e83c0abbb54adbc66c9459044de5ad2c Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 16 May 2026 22:46:16 +0800 Subject: [PATCH 001/100] =?UTF-8?q?feat=EF=BC=9A=E8=A1=A5=E9=BD=90=20antd?= =?UTF-8?q?=20=E7=9A=84=20component:=20'InputNumber',=20=E7=9A=84=20class?= =?UTF-8?q?=20full=20=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/views/ai/chat/index/data.ts | 3 +++ .../web-antd/src/views/ai/knowledge/document/data.ts | 2 ++ .../src/views/ai/knowledge/knowledge/data.ts | 2 ++ apps/web-antd/src/views/ai/model/chatRole/data.ts | 1 + apps/web-antd/src/views/ai/model/model/data.ts | 4 ++++ apps/web-antd/src/views/bpm/category/data.ts | 1 + apps/web-antd/src/views/crm/business/data.ts | 3 +++ apps/web-antd/src/views/crm/contract/config/data.ts | 1 + apps/web-antd/src/views/crm/contract/data.ts | 3 +++ .../src/views/crm/customer/limitConfig/data.ts | 1 + .../src/views/crm/customer/poolConfig/data.ts | 3 +++ apps/web-antd/src/views/crm/product/data.ts | 1 + apps/web-antd/src/views/crm/receivable/data.ts | 1 + apps/web-antd/src/views/crm/receivable/plan/data.ts | 2 ++ apps/web-antd/src/views/erp/finance/account/data.ts | 1 + apps/web-antd/src/views/erp/finance/payment/data.ts | 3 +++ apps/web-antd/src/views/erp/finance/receipt/data.ts | 3 +++ apps/web-antd/src/views/erp/product/category/data.ts | 1 + apps/web-antd/src/views/erp/product/product/data.ts | 5 +++++ apps/web-antd/src/views/erp/purchase/in/data.ts | 5 +++++ apps/web-antd/src/views/erp/purchase/order/data.ts | 4 ++++ apps/web-antd/src/views/erp/purchase/return/data.ts | 5 +++++ .../web-antd/src/views/erp/purchase/supplier/data.ts | 2 ++ apps/web-antd/src/views/erp/sale/customer/data.ts | 2 ++ apps/web-antd/src/views/erp/sale/order/data.ts | 4 ++++ apps/web-antd/src/views/erp/sale/out/data.ts | 5 +++++ apps/web-antd/src/views/erp/sale/return/data.ts | 5 +++++ apps/web-antd/src/views/erp/stock/warehouse/data.ts | 3 +++ apps/web-antd/src/views/infra/fileConfig/data.ts | 1 + apps/web-antd/src/views/infra/job/data.ts | 3 +++ apps/web-antd/src/views/iot/device/device/data.ts | 4 ++-- .../device/detail/modules/modbus-config-form.vue | 4 ++++ .../device/detail/modules/modbus-point-form.vue | 4 ++++ apps/web-antd/src/views/iot/product/category/data.ts | 2 +- apps/web-antd/src/views/mall/product/brand/data.ts | 1 + .../web-antd/src/views/mall/product/category/data.ts | 1 + .../web-antd/src/views/mall/product/spu/form/data.ts | 3 +++ .../views/mall/promotion/article/category/data.ts | 1 + .../src/views/mall/promotion/article/data.ts | 1 + .../web-antd/src/views/mall/promotion/banner/data.ts | 1 + .../views/mall/promotion/bargain/activity/data.ts | 5 +++++ .../mall/promotion/combination/activity/data.ts | 4 ++++ .../src/views/mall/promotion/coupon/template/data.ts | 8 ++++++++ .../src/views/mall/promotion/point/activity/data.ts | 2 +- .../views/mall/promotion/seckill/activity/data.ts | 6 +++--- apps/web-antd/src/views/mall/trade/config/data.ts | 12 ++++++------ .../src/views/mall/trade/delivery/express/data.ts | 1 + .../mall/trade/delivery/expressTemplate/data.ts | 1 + apps/web-antd/src/views/mall/trade/order/data.ts | 1 + apps/web-antd/src/views/member/config/data.ts | 6 +++--- apps/web-antd/src/views/member/level/data.ts | 3 +++ apps/web-antd/src/views/member/signin/config/data.ts | 3 +++ apps/web-antd/src/views/member/user/data.ts | 2 ++ apps/web-antd/src/views/pay/app/data.ts | 1 + apps/web-antd/src/views/pay/demo/withdraw/data.ts | 1 + .../src/views/pay/wallet/rechargePackage/data.ts | 2 ++ apps/web-antd/src/views/system/dept/data.ts | 1 + apps/web-antd/src/views/system/dict/data.ts | 1 + apps/web-antd/src/views/system/mail/account/data.ts | 1 + apps/web-antd/src/views/system/menu/data.ts | 1 + apps/web-antd/src/views/system/oauth2/client/data.ts | 2 ++ apps/web-antd/src/views/system/post/data.ts | 1 + apps/web-antd/src/views/system/role/data.ts | 1 + apps/web-antd/src/views/system/tenant/data.ts | 1 + 64 files changed, 153 insertions(+), 16 deletions(-) diff --git a/apps/web-antd/src/views/ai/chat/index/data.ts b/apps/web-antd/src/views/ai/chat/index/data.ts index 3fa7928a6..e29d891f3 100644 --- a/apps/web-antd/src/views/ai/chat/index/data.ts +++ b/apps/web-antd/src/views/ai/chat/index/data.ts @@ -41,6 +41,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '温度参数', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入温度参数', precision: 2, min: 0, @@ -53,6 +54,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '回复数 Token 数', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入回复数 Token 数', min: 0, max: 8192, @@ -64,6 +66,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '上下文数量', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入上下文数量', min: 0, max: 20, diff --git a/apps/web-antd/src/views/ai/knowledge/document/data.ts b/apps/web-antd/src/views/ai/knowledge/document/data.ts index 46f251a18..69ccd434e 100644 --- a/apps/web-antd/src/views/ai/knowledge/document/data.ts +++ b/apps/web-antd/src/views/ai/knowledge/document/data.ts @@ -52,6 +52,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '检索 topK', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入检索 topK', min: 0, max: 10, @@ -63,6 +64,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '检索相似度阈值', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入检索相似度阈值', min: 0, max: 1, diff --git a/apps/web-antd/src/views/ai/knowledge/knowledge/data.ts b/apps/web-antd/src/views/ai/knowledge/knowledge/data.ts index fcfa96da2..6c4cd03dc 100644 --- a/apps/web-antd/src/views/ai/knowledge/knowledge/data.ts +++ b/apps/web-antd/src/views/ai/knowledge/knowledge/data.ts @@ -55,6 +55,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '检索 topK', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入检索 topK', min: 0, max: 10, @@ -66,6 +67,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '检索相似度阈值', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入检索相似度阈值', min: 0, max: 1, diff --git a/apps/web-antd/src/views/ai/model/chatRole/data.ts b/apps/web-antd/src/views/ai/model/chatRole/data.ts index 81ea7e7c1..b57bf56f9 100644 --- a/apps/web-antd/src/views/ai/model/chatRole/data.ts +++ b/apps/web-antd/src/views/ai/model/chatRole/data.ts @@ -154,6 +154,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '角色排序', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入角色排序', }, dependencies: { diff --git a/apps/web-antd/src/views/ai/model/model/data.ts b/apps/web-antd/src/views/ai/model/model/data.ts index 1ef554c59..8680a0c5b 100644 --- a/apps/web-antd/src/views/ai/model/model/data.ts +++ b/apps/web-antd/src/views/ai/model/model/data.ts @@ -84,6 +84,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '模型排序', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入模型排序', }, rules: 'required', @@ -104,6 +105,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '温度参数', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入温度参数', min: 0, max: 2, @@ -121,6 +123,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '回复数 Token 数', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, max: 8192, placeholder: '请输入回复数 Token 数', @@ -138,6 +141,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '上下文数量', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, max: 20, placeholder: '请输入上下文数量', diff --git a/apps/web-antd/src/views/bpm/category/data.ts b/apps/web-antd/src/views/bpm/category/data.ts index 14b2b98ed..6407ada71 100644 --- a/apps/web-antd/src/views/bpm/category/data.ts +++ b/apps/web-antd/src/views/bpm/category/data.ts @@ -60,6 +60,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '分类排序', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, placeholder: '请输入分类排序', }, diff --git a/apps/web-antd/src/views/crm/business/data.ts b/apps/web-antd/src/views/crm/business/data.ts index ab71445ec..818f1a0af 100644 --- a/apps/web-antd/src/views/crm/business/data.ts +++ b/apps/web-antd/src/views/crm/business/data.ts @@ -118,6 +118,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '产品总金额', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, precision: 2, disabled: true, @@ -130,6 +131,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '整单折扣(%)', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, precision: 2, placeholder: '请输入整单折扣', @@ -141,6 +143,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '折扣后金额', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, precision: 2, disabled: true, diff --git a/apps/web-antd/src/views/crm/contract/config/data.ts b/apps/web-antd/src/views/crm/contract/config/data.ts index 2792b3601..ad6b5642c 100644 --- a/apps/web-antd/src/views/crm/contract/config/data.ts +++ b/apps/web-antd/src/views/crm/contract/config/data.ts @@ -17,6 +17,7 @@ export const schema: VbenFormSchema[] = [ component: 'InputNumber', fieldName: 'notifyDays', componentProps: { + class: '!w-full', min: 0, precision: 0, }, diff --git a/apps/web-antd/src/views/crm/contract/data.ts b/apps/web-antd/src/views/crm/contract/data.ts index 4289c6d1d..ffed30269 100644 --- a/apps/web-antd/src/views/crm/contract/data.ts +++ b/apps/web-antd/src/views/crm/contract/data.ts @@ -198,6 +198,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '产品总金额', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, precision: 2, placeholder: '请输入产品总金额', @@ -209,6 +210,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '整单折扣(%)', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, precision: 2, placeholder: '请输入整单折扣', @@ -220,6 +222,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '折扣后金额', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, precision: 2, disabled: true, diff --git a/apps/web-antd/src/views/crm/customer/limitConfig/data.ts b/apps/web-antd/src/views/crm/customer/limitConfig/data.ts index 914116b16..afcf66ce6 100644 --- a/apps/web-antd/src/views/crm/customer/limitConfig/data.ts +++ b/apps/web-antd/src/views/crm/customer/limitConfig/data.ts @@ -65,6 +65,7 @@ export function useFormSchema(confType: LimitConfType): VbenFormSchema[] { : '锁定客户数上限', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: `请输入${ LimitConfType.CUSTOMER_QUANTITY_LIMIT === confType ? '拥有客户数上限' diff --git a/apps/web-antd/src/views/crm/customer/poolConfig/data.ts b/apps/web-antd/src/views/crm/customer/poolConfig/data.ts index 86fd9f82f..8c5bbadf6 100644 --- a/apps/web-antd/src/views/crm/customer/poolConfig/data.ts +++ b/apps/web-antd/src/views/crm/customer/poolConfig/data.ts @@ -16,6 +16,7 @@ export const schema: VbenFormSchema[] = [ component: 'InputNumber', fieldName: 'contactExpireDays', componentProps: { + class: '!w-full', min: 0, precision: 0, }, @@ -35,6 +36,7 @@ export const schema: VbenFormSchema[] = [ addonAfter: () => '天未成交', }), componentProps: { + class: '!w-full', min: 0, precision: 0, }, @@ -63,6 +65,7 @@ export const schema: VbenFormSchema[] = [ component: 'InputNumber', fieldName: 'notifyDays', componentProps: { + class: '!w-full', min: 0, precision: 0, }, diff --git a/apps/web-antd/src/views/crm/product/data.ts b/apps/web-antd/src/views/crm/product/data.ts index 858b16908..5dd7d4565 100644 --- a/apps/web-antd/src/views/crm/product/data.ts +++ b/apps/web-antd/src/views/crm/product/data.ts @@ -92,6 +92,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '价格(元)', rules: 'required', componentProps: { + class: '!w-full', min: 0, precision: 2, step: 0.1, diff --git a/apps/web-antd/src/views/crm/receivable/data.ts b/apps/web-antd/src/views/crm/receivable/data.ts index f7f9c95d2..eacd97c34 100644 --- a/apps/web-antd/src/views/crm/receivable/data.ts +++ b/apps/web-antd/src/views/crm/receivable/data.ts @@ -141,6 +141,7 @@ export function useFormSchema(): VbenFormSchema[] { component: 'InputNumber', rules: 'required', componentProps: { + class: '!w-full', placeholder: '请输入回款金额', min: 0, precision: 2, diff --git a/apps/web-antd/src/views/crm/receivable/plan/data.ts b/apps/web-antd/src/views/crm/receivable/plan/data.ts index b8e848493..bd5ef2212 100644 --- a/apps/web-antd/src/views/crm/receivable/plan/data.ts +++ b/apps/web-antd/src/views/crm/receivable/plan/data.ts @@ -96,6 +96,7 @@ export function useFormSchema(): VbenFormSchema[] { component: 'InputNumber', rules: 'required', componentProps: { + class: '!w-full', placeholder: '请输入计划回款金额', min: 0, precision: 2, @@ -119,6 +120,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '提前几天提醒', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入提前几天提醒', min: 0, }, 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 0b4495b1a..5edc769fa 100644 --- a/apps/web-antd/src/views/erp/finance/account/data.ts +++ b/apps/web-antd/src/views/erp/finance/account/data.ts @@ -44,6 +44,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '排序', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入排序', precision: 0, }, 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 f4a9a61a9..cd8e32712 100644 --- a/apps/web-antd/src/views/erp/finance/payment/data.ts +++ b/apps/web-antd/src/views/erp/finance/payment/data.ts @@ -129,6 +129,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '合计付款', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '合计付款', precision: 2, formatter: erpPriceInputFormatter, @@ -140,6 +141,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '优惠金额', component: 'InputNumber', componentProps: { + class: '!w-full', disabled: formType === 'detail', placeholder: '请输入优惠金额', precision: 2, @@ -151,6 +153,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '实际付款', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '实际付款', precision: 2, formatter: erpPriceInputFormatter, diff --git a/apps/web-antd/src/views/erp/finance/receipt/data.ts b/apps/web-antd/src/views/erp/finance/receipt/data.ts index 774ddb0b1..4e325aa8b 100644 --- a/apps/web-antd/src/views/erp/finance/receipt/data.ts +++ b/apps/web-antd/src/views/erp/finance/receipt/data.ts @@ -129,6 +129,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '合计收款', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '合计收款', precision: 2, formatter: erpPriceInputFormatter, @@ -140,6 +141,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '优惠金额', component: 'InputNumber', componentProps: { + class: '!w-full', disabled: formType === 'detail', placeholder: '请输入优惠金额', precision: 2, @@ -151,6 +153,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '实际收款', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '实际收款', precision: 2, formatter: erpPriceInputFormatter, diff --git a/apps/web-antd/src/views/erp/product/category/data.ts b/apps/web-antd/src/views/erp/product/category/data.ts index 283566a25..d3e937247 100644 --- a/apps/web-antd/src/views/erp/product/category/data.ts +++ b/apps/web-antd/src/views/erp/product/category/data.ts @@ -65,6 +65,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '显示顺序', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, placeholder: '请输入显示顺序', }, diff --git a/apps/web-antd/src/views/erp/product/product/data.ts b/apps/web-antd/src/views/erp/product/product/data.ts index 23664dd5e..7fbf70f52 100644 --- a/apps/web-antd/src/views/erp/product/product/data.ts +++ b/apps/web-antd/src/views/erp/product/product/data.ts @@ -92,6 +92,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '保质期天数', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入保质期天数', }, }, @@ -100,6 +101,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '重量(kg)', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入重量(kg)', }, }, @@ -108,6 +110,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '采购价格', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入采购价格,单位:元', precision: 2, min: 0, @@ -119,6 +122,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '销售价格', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入销售价格,单位:元', precision: 2, min: 0, @@ -130,6 +134,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '最低价格', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入最低价格,单位:元', precision: 2, min: 0, 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 2334ad260..e86c71a25 100644 --- a/apps/web-antd/src/views/erp/purchase/in/data.ts +++ b/apps/web-antd/src/views/erp/purchase/in/data.ts @@ -117,6 +117,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '优惠率(%)', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入优惠率', min: 0, max: 100, @@ -129,6 +130,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '付款优惠', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '付款优惠', precision: 2, formatter: erpPriceInputFormatter, @@ -140,6 +142,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '优惠后金额', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '优惠后金额', precision: 2, formatter: erpPriceInputFormatter, @@ -160,6 +163,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '其他费用', component: 'InputNumber', componentProps: { + class: '!w-full', disabled: formType === 'detail', placeholder: '请输入其他费用', precision: 2, @@ -184,6 +188,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '应付金额', component: 'InputNumber', componentProps: { + class: '!w-full', precision: 2, min: 0, disabled: true, diff --git a/apps/web-antd/src/views/erp/purchase/order/data.ts b/apps/web-antd/src/views/erp/purchase/order/data.ts index a8cb484e7..d57964b69 100644 --- a/apps/web-antd/src/views/erp/purchase/order/data.ts +++ b/apps/web-antd/src/views/erp/purchase/order/data.ts @@ -103,6 +103,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '优惠率(%)', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入优惠率', min: 0, max: 100, @@ -115,6 +116,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '付款优惠', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '付款优惠', precision: 2, formatter: erpPriceInputFormatter, @@ -126,6 +128,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '优惠后金额', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '优惠后金额', precision: 2, formatter: erpPriceInputFormatter, @@ -148,6 +151,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { { component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入支付订金', precision: 2, min: 0, 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 ca3697d87..db3dc016b 100644 --- a/apps/web-antd/src/views/erp/purchase/return/data.ts +++ b/apps/web-antd/src/views/erp/purchase/return/data.ts @@ -117,6 +117,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '优惠率(%)', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入优惠率', min: 0, max: 100, @@ -129,6 +130,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '退款优惠', component: 'InputNumber', componentProps: { + class: '!w-full', precision: 2, formatter: erpPriceInputFormatter, disabled: true, @@ -139,6 +141,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '优惠后金额', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '优惠后金额', precision: 2, formatter: erpPriceInputFormatter, @@ -159,6 +162,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '其他费用', component: 'InputNumber', componentProps: { + class: '!w-full', disabled: formType === 'detail', placeholder: '请输入其他费用', precision: 2, @@ -183,6 +187,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '应退金额', component: 'InputNumber', componentProps: { + class: '!w-full', precision: 2, min: 0, disabled: true, diff --git a/apps/web-antd/src/views/erp/purchase/supplier/data.ts b/apps/web-antd/src/views/erp/purchase/supplier/data.ts index a5edc25ef..7d4d1d29e 100644 --- a/apps/web-antd/src/views/erp/purchase/supplier/data.ts +++ b/apps/web-antd/src/views/erp/purchase/supplier/data.ts @@ -82,6 +82,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '排序', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入排序', }, rules: 'required', @@ -99,6 +100,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '税率(%)', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入税率', min: 0, precision: 2, diff --git a/apps/web-antd/src/views/erp/sale/customer/data.ts b/apps/web-antd/src/views/erp/sale/customer/data.ts index b8327e0fb..eb3230ace 100644 --- a/apps/web-antd/src/views/erp/sale/customer/data.ts +++ b/apps/web-antd/src/views/erp/sale/customer/data.ts @@ -82,6 +82,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '排序', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入排序', precision: 0, }, @@ -100,6 +101,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '税率(%)', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入税率', precision: 2, }, 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 8764ce452..f6114e56d 100644 --- a/apps/web-antd/src/views/erp/sale/order/data.ts +++ b/apps/web-antd/src/views/erp/sale/order/data.ts @@ -116,6 +116,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '优惠率(%)', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入优惠率', min: 0, max: 100, @@ -128,6 +129,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '付款优惠', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '收款优惠', precision: 2, formatter: erpPriceInputFormatter, @@ -139,6 +141,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '优惠后金额', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '优惠后金额', precision: 2, formatter: erpPriceInputFormatter, @@ -161,6 +164,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { { component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入收取订金', precision: 2, min: 0, diff --git a/apps/web-antd/src/views/erp/sale/out/data.ts b/apps/web-antd/src/views/erp/sale/out/data.ts index 9ad4cb2bb..ba1527b75 100644 --- a/apps/web-antd/src/views/erp/sale/out/data.ts +++ b/apps/web-antd/src/views/erp/sale/out/data.ts @@ -134,6 +134,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '优惠率(%)', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入优惠率', min: 0, max: 100, @@ -146,6 +147,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '收款优惠', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '付款优惠', precision: 2, formatter: erpPriceInputFormatter, @@ -157,6 +159,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '优惠后金额', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '优惠后金额', precision: 2, formatter: erpPriceInputFormatter, @@ -177,6 +180,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '其他费用', component: 'InputNumber', componentProps: { + class: '!w-full', disabled: formType === 'detail', placeholder: '请输入其他费用', precision: 2, @@ -204,6 +208,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '应收金额', component: 'InputNumber', componentProps: { + class: '!w-full', precision: 2, min: 0, disabled: true, diff --git a/apps/web-antd/src/views/erp/sale/return/data.ts b/apps/web-antd/src/views/erp/sale/return/data.ts index d0ceeab47..d325cab83 100644 --- a/apps/web-antd/src/views/erp/sale/return/data.ts +++ b/apps/web-antd/src/views/erp/sale/return/data.ts @@ -130,6 +130,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '优惠率(%)', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入优惠率', min: 0, max: 100, @@ -142,6 +143,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '退款优惠', component: 'InputNumber', componentProps: { + class: '!w-full', precision: 2, formatter: erpPriceInputFormatter, disabled: true, @@ -152,6 +154,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '优惠后金额', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '优惠后金额', precision: 2, formatter: erpPriceInputFormatter, @@ -172,6 +175,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '其他费用', component: 'InputNumber', componentProps: { + class: '!w-full', disabled: formType === 'detail', placeholder: '请输入其他费用', precision: 2, @@ -197,6 +201,7 @@ export function useFormSchema(formType: string): VbenFormSchema[] { label: '应收金额', component: 'InputNumber', componentProps: { + class: '!w-full', precision: 2, min: 0, disabled: true, diff --git a/apps/web-antd/src/views/erp/stock/warehouse/data.ts b/apps/web-antd/src/views/erp/stock/warehouse/data.ts index ff8045b83..5fa2462e9 100644 --- a/apps/web-antd/src/views/erp/stock/warehouse/data.ts +++ b/apps/web-antd/src/views/erp/stock/warehouse/data.ts @@ -51,6 +51,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '仓储费(元)', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入仓储费,单位:元/天/KG', min: 0, precision: 2, @@ -61,6 +62,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '搬运费(元)', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入搬运费,单位:元', min: 0, precision: 2, @@ -79,6 +81,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '排序', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入排序', precision: 0, }, diff --git a/apps/web-antd/src/views/infra/fileConfig/data.ts b/apps/web-antd/src/views/infra/fileConfig/data.ts index b34729dd4..fade8bfd3 100644 --- a/apps/web-antd/src/views/infra/fileConfig/data.ts +++ b/apps/web-antd/src/views/infra/fileConfig/data.ts @@ -82,6 +82,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '主机端口', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, placeholder: '请输入主机端口', }, diff --git a/apps/web-antd/src/views/infra/job/data.ts b/apps/web-antd/src/views/infra/job/data.ts index 31811a055..44d4ec2b2 100644 --- a/apps/web-antd/src/views/infra/job/data.ts +++ b/apps/web-antd/src/views/infra/job/data.ts @@ -68,6 +68,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '重试次数', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入重试次数。设置为 0 时,不进行重试', min: 0, }, @@ -78,6 +79,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '重试间隔', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入重试间隔,单位:毫秒。设置为 0 时,无需间隔', min: 0, }, @@ -88,6 +90,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '监控超时时间', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入监控超时时间,单位:毫秒', min: 0, }, diff --git a/apps/web-antd/src/views/iot/device/device/data.ts b/apps/web-antd/src/views/iot/device/device/data.ts index c53c0e207..45c270e36 100644 --- a/apps/web-antd/src/views/iot/device/device/data.ts +++ b/apps/web-antd/src/views/iot/device/device/data.ts @@ -122,8 +122,8 @@ export function useAdvancedFormSchema(): VbenFormSchema[] { label: '设备经度', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入设备经度', - class: 'w-full', min: -180, max: 180, precision: 6, @@ -140,8 +140,8 @@ export function useAdvancedFormSchema(): VbenFormSchema[] { label: '设备纬度', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入设备纬度', - class: 'w-full', min: -90, max: 90, precision: 6, diff --git a/apps/web-antd/src/views/iot/device/device/detail/modules/modbus-config-form.vue b/apps/web-antd/src/views/iot/device/device/detail/modules/modbus-config-form.vue index fb792d4e7..5c306c9ca 100644 --- a/apps/web-antd/src/views/iot/device/device/detail/modules/modbus-config-form.vue +++ b/apps/web-antd/src/views/iot/device/device/detail/modules/modbus-config-form.vue @@ -70,6 +70,7 @@ const [Form, formApi] = useVbenForm({ label: '端口', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入端口', min: 1, max: 65_535, @@ -86,6 +87,7 @@ const [Form, formApi] = useVbenForm({ label: '从站地址', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入从站地址,范围 1-247', min: 1, max: 247, @@ -98,6 +100,7 @@ const [Form, formApi] = useVbenForm({ label: '连接超时(ms)', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入连接超时时间', min: 1000, step: 1000, @@ -114,6 +117,7 @@ const [Form, formApi] = useVbenForm({ label: '重试间隔(ms)', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入重试间隔', min: 1000, step: 1000, diff --git a/apps/web-antd/src/views/iot/device/device/detail/modules/modbus-point-form.vue b/apps/web-antd/src/views/iot/device/device/detail/modules/modbus-point-form.vue index db5fc0674..aa8d1ca3b 100644 --- a/apps/web-antd/src/views/iot/device/device/detail/modules/modbus-point-form.vue +++ b/apps/web-antd/src/views/iot/device/device/detail/modules/modbus-point-form.vue @@ -111,6 +111,7 @@ function useFormSchema(): VbenFormSchema[] { label: '寄存器地址', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入寄存器地址', min: 0, max: 65_535, @@ -133,6 +134,7 @@ function useFormSchema(): VbenFormSchema[] { label: '寄存器数量', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入寄存器数量', min: 1, max: 125, @@ -177,6 +179,7 @@ function useFormSchema(): VbenFormSchema[] { label: '缩放因子', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入缩放因子', precision: 6, step: 0.1, @@ -188,6 +191,7 @@ function useFormSchema(): VbenFormSchema[] { label: '轮询间隔(ms)', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入轮询间隔', min: 100, step: 1000, diff --git a/apps/web-antd/src/views/iot/product/category/data.ts b/apps/web-antd/src/views/iot/product/category/data.ts index 57dcae56f..8853fb90c 100644 --- a/apps/web-antd/src/views/iot/product/category/data.ts +++ b/apps/web-antd/src/views/iot/product/category/data.ts @@ -35,8 +35,8 @@ export function useFormSchema(): VbenFormSchema[] { label: '分类排序', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入分类排序', - class: 'w-full', min: 0, precision: 0, }, diff --git a/apps/web-antd/src/views/mall/product/brand/data.ts b/apps/web-antd/src/views/mall/product/brand/data.ts index f9cfa10c0..4d1b02c87 100644 --- a/apps/web-antd/src/views/mall/product/brand/data.ts +++ b/apps/web-antd/src/views/mall/product/brand/data.ts @@ -41,6 +41,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '品牌排序', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, placeholder: '请输入品牌排序', }, diff --git a/apps/web-antd/src/views/mall/product/category/data.ts b/apps/web-antd/src/views/mall/product/category/data.ts index 6e1e1de3b..86456b05e 100644 --- a/apps/web-antd/src/views/mall/product/category/data.ts +++ b/apps/web-antd/src/views/mall/product/category/data.ts @@ -65,6 +65,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '分类排序', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, placeholder: '请输入分类排序', }, diff --git a/apps/web-antd/src/views/mall/product/spu/form/data.ts b/apps/web-antd/src/views/mall/product/spu/form/data.ts index d2ff7eeb5..7d53a2736 100644 --- a/apps/web-antd/src/views/mall/product/spu/form/data.ts +++ b/apps/web-antd/src/views/mall/product/spu/form/data.ts @@ -281,6 +281,7 @@ export function useOtherFormSchema(): VbenFormSchema[] { label: '商品排序', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, }, rules: 'required', @@ -290,6 +291,7 @@ export function useOtherFormSchema(): VbenFormSchema[] { label: '赠送积分', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, }, rules: 'required', @@ -299,6 +301,7 @@ export function useOtherFormSchema(): VbenFormSchema[] { label: '虚拟销量', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, }, rules: 'required', diff --git a/apps/web-antd/src/views/mall/promotion/article/category/data.ts b/apps/web-antd/src/views/mall/promotion/article/category/data.ts index 3929ecb8e..4db06dffe 100644 --- a/apps/web-antd/src/views/mall/promotion/article/category/data.ts +++ b/apps/web-antd/src/views/mall/promotion/article/category/data.ts @@ -40,6 +40,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '显示顺序', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, placeholder: '请输入显示顺序', }, diff --git a/apps/web-antd/src/views/mall/promotion/article/data.ts b/apps/web-antd/src/views/mall/promotion/article/data.ts index 5af659775..f007898e5 100644 --- a/apps/web-antd/src/views/mall/promotion/article/data.ts +++ b/apps/web-antd/src/views/mall/promotion/article/data.ts @@ -106,6 +106,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '排序', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, placeholder: '请输入排序', }, diff --git a/apps/web-antd/src/views/mall/promotion/banner/data.ts b/apps/web-antd/src/views/mall/promotion/banner/data.ts index 0490be5dd..71adda1ae 100644 --- a/apps/web-antd/src/views/mall/promotion/banner/data.ts +++ b/apps/web-antd/src/views/mall/promotion/banner/data.ts @@ -62,6 +62,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '排序', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, placeholder: '请输入排序', }, diff --git a/apps/web-antd/src/views/mall/promotion/bargain/activity/data.ts b/apps/web-antd/src/views/mall/promotion/bargain/activity/data.ts index d7474eeb5..72a4bf171 100644 --- a/apps/web-antd/src/views/mall/promotion/bargain/activity/data.ts +++ b/apps/web-antd/src/views/mall/promotion/bargain/activity/data.ts @@ -55,6 +55,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '助力人数', component: 'InputNumber', componentProps: { + class: '!w-full', min: 1, placeholder: '达到该人数才能砍到低价', }, @@ -65,6 +66,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '砍价次数', component: 'InputNumber', componentProps: { + class: '!w-full', min: 1, placeholder: '最大帮砍次数', }, @@ -75,6 +77,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '购买限制', component: 'InputNumber', componentProps: { + class: '!w-full', min: 1, placeholder: '最大购买次数', }, @@ -85,6 +88,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '最小砍价金额(元)', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, precision: 2, step: 0.01, @@ -96,6 +100,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '最大砍价金额(元)', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, precision: 2, step: 0.01, diff --git a/apps/web-antd/src/views/mall/promotion/combination/activity/data.ts b/apps/web-antd/src/views/mall/promotion/combination/activity/data.ts index 8891f892c..8c46b0fff 100644 --- a/apps/web-antd/src/views/mall/promotion/combination/activity/data.ts +++ b/apps/web-antd/src/views/mall/promotion/combination/activity/data.ts @@ -55,6 +55,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '拼团人数', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '达到该人数即成团', min: 2, }, @@ -65,6 +66,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '限制时长', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '限制时长(小时)', min: 0, }, @@ -75,6 +77,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '总限购数量', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入总限购数量', min: 0, }, @@ -84,6 +87,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '单次限购数量', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入单次限购数量', min: 0, }, diff --git a/apps/web-antd/src/views/mall/promotion/coupon/template/data.ts b/apps/web-antd/src/views/mall/promotion/coupon/template/data.ts index 11f86c422..26a3f987f 100644 --- a/apps/web-antd/src/views/mall/promotion/coupon/template/data.ts +++ b/apps/web-antd/src/views/mall/promotion/coupon/template/data.ts @@ -122,6 +122,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '优惠券面额', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, precision: 2, placeholder: '请输入优惠金额,单位:元', @@ -139,6 +140,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '优惠券折扣', component: 'InputNumber', componentProps: { + class: '!w-full', min: 1, max: 9.9, precision: 1, @@ -157,6 +159,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '最多优惠', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, precision: 2, placeholder: '请输入最多优惠', @@ -174,6 +177,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '满多少元可以使用', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, precision: 2, placeholder: '无门槛请设为 0', @@ -196,6 +200,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '发放数量', component: 'InputNumber', componentProps: { + class: '!w-full', min: -1, placeholder: '发放数量,没有之后不能领取或发放,-1 为不限制', addonAfter: '张', @@ -212,6 +217,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '每人限领个数', component: 'InputNumber', componentProps: { + class: '!w-full', min: -1, placeholder: '设置为 -1 时,可无限领取', addonAfter: '张', @@ -255,6 +261,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '领取日期', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, placeholder: '第 0 为今天生效', addonBefore: '第', @@ -271,6 +278,7 @@ export function useFormSchema(): VbenFormSchema[] { fieldName: 'fixedEndTerm', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, placeholder: '请输入结束天数', addonBefore: '至', diff --git a/apps/web-antd/src/views/mall/promotion/point/activity/data.ts b/apps/web-antd/src/views/mall/promotion/point/activity/data.ts index 9b2abb065..7366c1300 100644 --- a/apps/web-antd/src/views/mall/promotion/point/activity/data.ts +++ b/apps/web-antd/src/views/mall/promotion/point/activity/data.ts @@ -109,9 +109,9 @@ export function useFormSchema(): VbenFormSchema[] { label: '排序', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, placeholder: '请输入排序', - class: '!w-full', }, defaultValue: 0, rules: 'required', diff --git a/apps/web-antd/src/views/mall/promotion/seckill/activity/data.ts b/apps/web-antd/src/views/mall/promotion/seckill/activity/data.ts index 2ebb63de5..090a5ec64 100644 --- a/apps/web-antd/src/views/mall/promotion/seckill/activity/data.ts +++ b/apps/web-antd/src/views/mall/promotion/seckill/activity/data.ts @@ -99,9 +99,9 @@ export function useFormSchema(): VbenFormSchema[] { label: '总限购数量', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入总限购数量', min: 0, - class: 'w-full', }, rules: z.number().min(0).default(0), }, @@ -110,9 +110,9 @@ export function useFormSchema(): VbenFormSchema[] { label: '单次限购数量', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入单次限购数量', min: 0, - class: 'w-full', }, rules: z.number().min(0).default(0), }, @@ -121,9 +121,9 @@ export function useFormSchema(): VbenFormSchema[] { label: '排序', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入排序', min: 0, - class: 'w-full', }, rules: z.number().min(0).default(0), }, diff --git a/apps/web-antd/src/views/mall/trade/config/data.ts b/apps/web-antd/src/views/mall/trade/config/data.ts index 564f9722c..557a9c657 100644 --- a/apps/web-antd/src/views/mall/trade/config/data.ts +++ b/apps/web-antd/src/views/mall/trade/config/data.ts @@ -63,10 +63,10 @@ export const schema: VbenFormSchema[] = [ label: '满额包邮', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, precision: 2, placeholder: '请输入满额包邮金额', - class: 'w-full', }, rules: 'required', dependencies: { @@ -145,10 +145,10 @@ export const schema: VbenFormSchema[] = [ label: '一级返佣比例(%)', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, max: 100, placeholder: '请输入一级返佣比例', - class: 'w-full', }, rules: 'required', dependencies: { @@ -162,10 +162,10 @@ export const schema: VbenFormSchema[] = [ label: '二级返佣比例(%)', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, max: 100, placeholder: '请输入二级返佣比例', - class: 'w-full', }, rules: 'required', dependencies: { @@ -179,9 +179,9 @@ export const schema: VbenFormSchema[] = [ label: '佣金冻结天数', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, placeholder: '请输入佣金冻结天数', - class: 'w-full', }, rules: 'required', dependencies: { @@ -195,10 +195,10 @@ export const schema: VbenFormSchema[] = [ label: '提现最低金额(元)', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, precision: 2, placeholder: '请输入提现最低金额', - class: 'w-full', }, rules: 'required', dependencies: { @@ -212,11 +212,11 @@ export const schema: VbenFormSchema[] = [ label: '提现手续费(%)', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, max: 100, precision: 2, placeholder: '请输入提现手续费百分比', - class: 'w-full', }, rules: 'required', dependencies: { diff --git a/apps/web-antd/src/views/mall/trade/delivery/express/data.ts b/apps/web-antd/src/views/mall/trade/delivery/express/data.ts index 7b3fe0512..279f8a898 100644 --- a/apps/web-antd/src/views/mall/trade/delivery/express/data.ts +++ b/apps/web-antd/src/views/mall/trade/delivery/express/data.ts @@ -47,6 +47,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '显示顺序', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, placeholder: '请输入显示顺序', }, diff --git a/apps/web-antd/src/views/mall/trade/delivery/expressTemplate/data.ts b/apps/web-antd/src/views/mall/trade/delivery/expressTemplate/data.ts index 0a63d725c..641054a95 100644 --- a/apps/web-antd/src/views/mall/trade/delivery/expressTemplate/data.ts +++ b/apps/web-antd/src/views/mall/trade/delivery/expressTemplate/data.ts @@ -140,6 +140,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '显示顺序', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入显示顺序', min: 0, }, diff --git a/apps/web-antd/src/views/mall/trade/order/data.ts b/apps/web-antd/src/views/mall/trade/order/data.ts index 4eb98df87..9b38da130 100644 --- a/apps/web-antd/src/views/mall/trade/order/data.ts +++ b/apps/web-antd/src/views/mall/trade/order/data.ts @@ -306,6 +306,7 @@ export function usePriceFormSchema(): VbenFormSchema[] { label: '订单调价', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入订单调价', step: 0.1, precision: 2, diff --git a/apps/web-antd/src/views/member/config/data.ts b/apps/web-antd/src/views/member/config/data.ts index 7f168418c..179467bba 100644 --- a/apps/web-antd/src/views/member/config/data.ts +++ b/apps/web-antd/src/views/member/config/data.ts @@ -21,9 +21,9 @@ export const schema: VbenFormSchema[] = [ label: '积分抵扣', help: '积分抵用比例(1 积分抵多少金额),单位:元', componentProps: { + class: '!w-full', min: 0, precision: 2, - class: 'w-full', placeholder: '请输入积分抵扣单价', }, }, @@ -33,8 +33,8 @@ export const schema: VbenFormSchema[] = [ label: '积分抵扣最大值', help: '单次下单积分使用上限,0 不限制', componentProps: { + class: '!w-full', min: 0, - class: 'w-full', placeholder: '请输入积分抵扣最大值', }, }, @@ -44,8 +44,8 @@ export const schema: VbenFormSchema[] = [ label: '1 元赠送多少分', help: '下单支付金额按比例赠送积分(实际支付 1 元赠送多少积分)', componentProps: { + class: '!w-full', min: 0, - class: 'w-full', placeholder: '请输入赠送积分比例', }, }, diff --git a/apps/web-antd/src/views/member/level/data.ts b/apps/web-antd/src/views/member/level/data.ts index 979ed9a1b..c6a4b4167 100644 --- a/apps/web-antd/src/views/member/level/data.ts +++ b/apps/web-antd/src/views/member/level/data.ts @@ -32,6 +32,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '等级', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, precision: 0, placeholder: '请输入等级', @@ -43,6 +44,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '升级经验', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, precision: 0, placeholder: '请输入升级经验', @@ -54,6 +56,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '享受折扣(%)', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, max: 100, precision: 0, diff --git a/apps/web-antd/src/views/member/signin/config/data.ts b/apps/web-antd/src/views/member/signin/config/data.ts index 2b28d2fc9..44017bf7d 100644 --- a/apps/web-antd/src/views/member/signin/config/data.ts +++ b/apps/web-antd/src/views/member/signin/config/data.ts @@ -23,6 +23,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '签到天数', help: '只允许设置 1-7,默认签到 7 天为一个周期', componentProps: { + class: '!w-full', min: 1, max: 7, precision: 0, @@ -35,6 +36,7 @@ export function useFormSchema(): VbenFormSchema[] { fieldName: 'point', label: '获得积分', componentProps: { + class: '!w-full', min: 0, precision: 0, placeholder: '请输入获得积分', @@ -46,6 +48,7 @@ export function useFormSchema(): VbenFormSchema[] { fieldName: 'experience', label: '奖励经验', componentProps: { + class: '!w-full', min: 0, precision: 0, placeholder: '请输入奖励经验', diff --git a/apps/web-antd/src/views/member/user/data.ts b/apps/web-antd/src/views/member/user/data.ts index 295b23e89..d9a37cd45 100644 --- a/apps/web-antd/src/views/member/user/data.ts +++ b/apps/web-antd/src/views/member/user/data.ts @@ -396,6 +396,7 @@ export function useBalanceFormSchema(): VbenFormSchema[] { component: 'InputNumber', rules: 'required', componentProps: { + class: '!w-full', min: 0, precision: 2, step: 0.1, @@ -471,6 +472,7 @@ export function usePointFormSchema(): VbenFormSchema[] { component: 'InputNumber', rules: 'required', componentProps: { + class: '!w-full', min: 0, precision: 0, placeholder: '请输入变动积分', diff --git a/apps/web-antd/src/views/pay/app/data.ts b/apps/web-antd/src/views/pay/app/data.ts index d46607ca3..da9ae43b9 100644 --- a/apps/web-antd/src/views/pay/app/data.ts +++ b/apps/web-antd/src/views/pay/app/data.ts @@ -291,6 +291,7 @@ export function useChannelFormSchema(formType: string = ''): VbenFormSchema[] { component: 'InputNumber', rules: 'required', componentProps: { + class: '!w-full', placeholder: '请输入渠道费率', addonAfter: '%', }, diff --git a/apps/web-antd/src/views/pay/demo/withdraw/data.ts b/apps/web-antd/src/views/pay/demo/withdraw/data.ts index 8b2c1b547..82df4da31 100644 --- a/apps/web-antd/src/views/pay/demo/withdraw/data.ts +++ b/apps/web-antd/src/views/pay/demo/withdraw/data.ts @@ -29,6 +29,7 @@ export function useFormSchema(): VbenFormSchema[] { component: 'InputNumber', rules: 'required', componentProps: { + class: '!w-full', min: 1, precision: 2, step: 0.01, diff --git a/apps/web-antd/src/views/pay/wallet/rechargePackage/data.ts b/apps/web-antd/src/views/pay/wallet/rechargePackage/data.ts index 22010869e..c72590c07 100644 --- a/apps/web-antd/src/views/pay/wallet/rechargePackage/data.ts +++ b/apps/web-antd/src/views/pay/wallet/rechargePackage/data.ts @@ -33,6 +33,7 @@ export function useFormSchema(): VbenFormSchema[] { component: 'InputNumber', rules: z.number().min(0, '支付金额不能小于0'), componentProps: { + class: '!w-full', min: 0, precision: 2, step: 0.01, @@ -45,6 +46,7 @@ export function useFormSchema(): VbenFormSchema[] { component: 'InputNumber', rules: z.number().min(0, '赠送金额不能小于0'), componentProps: { + class: '!w-full', min: 0, precision: 2, step: 0.01, diff --git a/apps/web-antd/src/views/system/dept/data.ts b/apps/web-antd/src/views/system/dept/data.ts index f5421c429..d111330d0 100644 --- a/apps/web-antd/src/views/system/dept/data.ts +++ b/apps/web-antd/src/views/system/dept/data.ts @@ -62,6 +62,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '显示顺序', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, placeholder: '请输入显示顺序', }, diff --git a/apps/web-antd/src/views/system/dict/data.ts b/apps/web-antd/src/views/system/dict/data.ts index a2c6ede66..cfa455a7d 100644 --- a/apps/web-antd/src/views/system/dict/data.ts +++ b/apps/web-antd/src/views/system/dict/data.ts @@ -222,6 +222,7 @@ export function useDataFormSchema(): VbenFormSchema[] { label: '显示排序', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入显示排序', }, rules: 'required', diff --git a/apps/web-antd/src/views/system/mail/account/data.ts b/apps/web-antd/src/views/system/mail/account/data.ts index 2a00f39e4..d3f5470de 100644 --- a/apps/web-antd/src/views/system/mail/account/data.ts +++ b/apps/web-antd/src/views/system/mail/account/data.ts @@ -58,6 +58,7 @@ export function useFormSchema(): VbenFormSchema[] { label: 'SMTP 服务器端口', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入 SMTP 服务器端口', min: 0, max: 65_535, diff --git a/apps/web-antd/src/views/system/menu/data.ts b/apps/web-antd/src/views/system/menu/data.ts index d7cfa104e..c0c32c87f 100644 --- a/apps/web-antd/src/views/system/menu/data.ts +++ b/apps/web-antd/src/views/system/menu/data.ts @@ -201,6 +201,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '显示顺序', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, placeholder: '请输入显示顺序', }, diff --git a/apps/web-antd/src/views/system/oauth2/client/data.ts b/apps/web-antd/src/views/system/oauth2/client/data.ts index b5bc683c0..d5ad7078d 100644 --- a/apps/web-antd/src/views/system/oauth2/client/data.ts +++ b/apps/web-antd/src/views/system/oauth2/client/data.ts @@ -74,6 +74,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '访问令牌的有效期', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入访问令牌的有效期,单位:秒', min: 0, }, @@ -84,6 +85,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '刷新令牌的有效期', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入刷新令牌的有效期,单位:秒', min: 0, }, diff --git a/apps/web-antd/src/views/system/post/data.ts b/apps/web-antd/src/views/system/post/data.ts index 2d1715389..3c66ebccf 100644 --- a/apps/web-antd/src/views/system/post/data.ts +++ b/apps/web-antd/src/views/system/post/data.ts @@ -40,6 +40,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '显示顺序', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, placeholder: '请输入显示顺序', }, diff --git a/apps/web-antd/src/views/system/role/data.ts b/apps/web-antd/src/views/system/role/data.ts index 48630c86e..b8efae8b3 100644 --- a/apps/web-antd/src/views/system/role/data.ts +++ b/apps/web-antd/src/views/system/role/data.ts @@ -45,6 +45,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '显示顺序', component: 'InputNumber', componentProps: { + class: '!w-full', min: 0, placeholder: '请输入显示顺序', }, diff --git a/apps/web-antd/src/views/system/tenant/data.ts b/apps/web-antd/src/views/system/tenant/data.ts index 4fca673bc..b05e63803 100644 --- a/apps/web-antd/src/views/system/tenant/data.ts +++ b/apps/web-antd/src/views/system/tenant/data.ts @@ -91,6 +91,7 @@ export function useFormSchema(): VbenFormSchema[] { fieldName: 'accountCount', component: 'InputNumber', componentProps: { + class: '!w-full', placeholder: '请输入账号额度', }, rules: 'required', From 19b5f38e23a885f3cef937062c748854d1f401d5 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 16 May 2026 23:12:33 +0800 Subject: [PATCH 002/100] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20warehouse=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/api/wms/md/warehouse/index.ts | 57 +++++++ .../wms/md/warehouse/components/index.ts | 1 + .../warehouse/components/warehouse-select.vue | 85 ++++++++++ .../src/views/wms/md/warehouse/data.ts | 138 ++++++++++++++++ .../src/views/wms/md/warehouse/index.vue | 152 ++++++++++++++++++ .../views/wms/md/warehouse/modules/form.vue | 94 +++++++++++ .../web-antd/src/views/wms/utils/constants.ts | 48 ++++++ .../web-ele/src/api/wms/md/warehouse/index.ts | 57 +++++++ .../wms/md/warehouse/components/index.ts | 1 + .../warehouse/components/warehouse-select.vue | 88 ++++++++++ .../src/views/wms/md/warehouse/data.ts | 139 ++++++++++++++++ .../src/views/wms/md/warehouse/index.vue | 152 ++++++++++++++++++ .../views/wms/md/warehouse/modules/form.vue | 94 +++++++++++ apps/web-ele/src/views/wms/utils/constants.ts | 13 ++ 14 files changed, 1119 insertions(+) create mode 100644 apps/web-antd/src/api/wms/md/warehouse/index.ts create mode 100644 apps/web-antd/src/views/wms/md/warehouse/components/index.ts create mode 100644 apps/web-antd/src/views/wms/md/warehouse/components/warehouse-select.vue create mode 100644 apps/web-antd/src/views/wms/md/warehouse/data.ts create mode 100644 apps/web-antd/src/views/wms/md/warehouse/index.vue create mode 100644 apps/web-antd/src/views/wms/md/warehouse/modules/form.vue create mode 100644 apps/web-antd/src/views/wms/utils/constants.ts create mode 100644 apps/web-ele/src/api/wms/md/warehouse/index.ts create mode 100644 apps/web-ele/src/views/wms/md/warehouse/components/index.ts create mode 100644 apps/web-ele/src/views/wms/md/warehouse/components/warehouse-select.vue create mode 100644 apps/web-ele/src/views/wms/md/warehouse/data.ts create mode 100644 apps/web-ele/src/views/wms/md/warehouse/index.vue create mode 100644 apps/web-ele/src/views/wms/md/warehouse/modules/form.vue create mode 100644 apps/web-ele/src/views/wms/utils/constants.ts diff --git a/apps/web-antd/src/api/wms/md/warehouse/index.ts b/apps/web-antd/src/api/wms/md/warehouse/index.ts new file mode 100644 index 000000000..2b99f3776 --- /dev/null +++ b/apps/web-antd/src/api/wms/md/warehouse/index.ts @@ -0,0 +1,57 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace WmsWarehouseApi { + /** WMS 仓库 */ + export interface Warehouse { + id?: number; + code?: string; + name?: string; + remark?: string; + sort?: number; + createTime?: Date; + } +} + +/** 查询仓库分页 */ +export function getWarehousePage(params: PageParam) { + return requestClient.get>( + '/wms/warehouse/page', + { params }, + ); +} + +/** 查询仓库精简列表 */ +export function getWarehouseSimpleList() { + return requestClient.get( + '/wms/warehouse/simple-list', + ); +} + +/** 查询仓库详情 */ +export function getWarehouse(id: number) { + return requestClient.get( + `/wms/warehouse/get?id=${id}`, + ); +} + +/** 新增仓库 */ +export function createWarehouse(data: WmsWarehouseApi.Warehouse) { + return requestClient.post('/wms/warehouse/create', data); +} + +/** 修改仓库 */ +export function updateWarehouse(data: WmsWarehouseApi.Warehouse) { + return requestClient.put('/wms/warehouse/update', data); +} + +/** 删除仓库 */ +export function deleteWarehouse(id: number) { + return requestClient.delete(`/wms/warehouse/delete?id=${id}`); +} + +/** 导出仓库 */ +export function exportWarehouse(params: any) { + return requestClient.download('/wms/warehouse/export-excel', { params }); +} diff --git a/apps/web-antd/src/views/wms/md/warehouse/components/index.ts b/apps/web-antd/src/views/wms/md/warehouse/components/index.ts new file mode 100644 index 000000000..38d2851c3 --- /dev/null +++ b/apps/web-antd/src/views/wms/md/warehouse/components/index.ts @@ -0,0 +1 @@ +export { default as WmsWarehouseSelect } from './warehouse-select.vue'; diff --git a/apps/web-antd/src/views/wms/md/warehouse/components/warehouse-select.vue b/apps/web-antd/src/views/wms/md/warehouse/components/warehouse-select.vue new file mode 100644 index 000000000..19ef2e417 --- /dev/null +++ b/apps/web-antd/src/views/wms/md/warehouse/components/warehouse-select.vue @@ -0,0 +1,85 @@ + + + diff --git a/apps/web-antd/src/views/wms/md/warehouse/data.ts b/apps/web-antd/src/views/wms/md/warehouse/data.ts new file mode 100644 index 000000000..e64ccecd3 --- /dev/null +++ b/apps/web-antd/src/views/wms/md/warehouse/data.ts @@ -0,0 +1,138 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; + +import { h } from 'vue'; + +import { Button } from 'ant-design-vue'; + +import { z } from '#/adapter/form'; +import { generateWmsCode } from '#/views/wms/utils/constants'; + +/** 新增/修改仓库的表单 */ +export function useFormSchema(formApi?: any): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'name', + label: '仓库名称', + component: 'Input', + componentProps: { + maxLength: 50, + placeholder: '请输入仓库名称', + }, + rules: z.string().min(1, '仓库名称不能为空').max(50), + }, + { + fieldName: 'code', + label: '仓库编号', + component: 'Input', + componentProps: { + maxLength: 20, + placeholder: '请输入仓库编号', + }, + rules: z.string().min(1, '仓库编号不能为空').max(20), + suffix: () => { + return h( + Button, + { + type: 'default', + onClick: () => { + formApi?.setFieldValue('code', generateWmsCode('W')); + }, + }, + { default: () => '生成' }, + ); + }, + }, + { + fieldName: 'sort', + label: '排序', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + }, + rules: z.number().default(0), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + maxLength: 255, + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'name', + label: '仓库名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入仓库名称', + }, + }, + { + fieldName: 'code', + label: '仓库编号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入仓库编号', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'name', + title: '仓库名称', + minWidth: 160, + }, + { + field: 'code', + title: '仓库编号', + minWidth: 140, + }, + { + field: 'remark', + title: '备注', + minWidth: 220, + }, + { + field: 'sort', + title: '排序', + width: 100, + align: 'center', + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antd/src/views/wms/md/warehouse/index.vue b/apps/web-antd/src/views/wms/md/warehouse/index.vue new file mode 100644 index 000000000..f4810f920 --- /dev/null +++ b/apps/web-antd/src/views/wms/md/warehouse/index.vue @@ -0,0 +1,152 @@ + + + diff --git a/apps/web-antd/src/views/wms/md/warehouse/modules/form.vue b/apps/web-antd/src/views/wms/md/warehouse/modules/form.vue new file mode 100644 index 000000000..95d3e7eaa --- /dev/null +++ b/apps/web-antd/src/views/wms/md/warehouse/modules/form.vue @@ -0,0 +1,94 @@ + + + diff --git a/apps/web-antd/src/views/wms/utils/constants.ts b/apps/web-antd/src/views/wms/utils/constants.ts new file mode 100644 index 000000000..a72929881 --- /dev/null +++ b/apps/web-antd/src/views/wms/utils/constants.ts @@ -0,0 +1,48 @@ +/** 单据状态枚举 */ +export const OrderStatusEnum = { + PREPARE: 0, // 草稿 + FINISHED: 4, // 已完成 + CANCELED: 5, // 已作废 +} as const; + +/** 可修改的单据状态 */ +export const OrderUpdateStatusList: number[] = [OrderStatusEnum.PREPARE]; + +/** 可删除的单据状态 */ +export const OrderDeleteStatusList: number[] = [ + OrderStatusEnum.PREPARE, + OrderStatusEnum.CANCELED, +]; + +/** 往来企业类型枚举 */ +export const MerchantTypeEnum = { + CUSTOMER: 1, // 客户 + SUPPLIER: 2, // 供应商 + CUSTOMER_SUPPLIER: 3, // 客户/供应商 +} as const; + +/** 供应商类型的往来企业 */ +export const SupplierMerchantTypeList = [ + MerchantTypeEnum.SUPPLIER, + MerchantTypeEnum.CUSTOMER_SUPPLIER, +]; + +/** 客户类型的往来企业 */ +export const CustomerMerchantTypeList = [ + MerchantTypeEnum.CUSTOMER, + MerchantTypeEnum.CUSTOMER_SUPPLIER, +]; + +/** + * 生成 WMS 编号 / 条码。 + * + * @param prefix 可选前缀,按业务域区分编号种类。 + * @returns 前缀 + 8 位随机数字串。 + */ +export function generateWmsCode(prefix = ''): string { + let result = ''; + for (let i = 0; i < 8; i++) { + result += Math.floor(Math.random() * 10).toString(); + } + return prefix + result; +} diff --git a/apps/web-ele/src/api/wms/md/warehouse/index.ts b/apps/web-ele/src/api/wms/md/warehouse/index.ts new file mode 100644 index 000000000..2b99f3776 --- /dev/null +++ b/apps/web-ele/src/api/wms/md/warehouse/index.ts @@ -0,0 +1,57 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace WmsWarehouseApi { + /** WMS 仓库 */ + export interface Warehouse { + id?: number; + code?: string; + name?: string; + remark?: string; + sort?: number; + createTime?: Date; + } +} + +/** 查询仓库分页 */ +export function getWarehousePage(params: PageParam) { + return requestClient.get>( + '/wms/warehouse/page', + { params }, + ); +} + +/** 查询仓库精简列表 */ +export function getWarehouseSimpleList() { + return requestClient.get( + '/wms/warehouse/simple-list', + ); +} + +/** 查询仓库详情 */ +export function getWarehouse(id: number) { + return requestClient.get( + `/wms/warehouse/get?id=${id}`, + ); +} + +/** 新增仓库 */ +export function createWarehouse(data: WmsWarehouseApi.Warehouse) { + return requestClient.post('/wms/warehouse/create', data); +} + +/** 修改仓库 */ +export function updateWarehouse(data: WmsWarehouseApi.Warehouse) { + return requestClient.put('/wms/warehouse/update', data); +} + +/** 删除仓库 */ +export function deleteWarehouse(id: number) { + return requestClient.delete(`/wms/warehouse/delete?id=${id}`); +} + +/** 导出仓库 */ +export function exportWarehouse(params: any) { + return requestClient.download('/wms/warehouse/export-excel', { params }); +} diff --git a/apps/web-ele/src/views/wms/md/warehouse/components/index.ts b/apps/web-ele/src/views/wms/md/warehouse/components/index.ts new file mode 100644 index 000000000..38d2851c3 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/warehouse/components/index.ts @@ -0,0 +1 @@ +export { default as WmsWarehouseSelect } from './warehouse-select.vue'; diff --git a/apps/web-ele/src/views/wms/md/warehouse/components/warehouse-select.vue b/apps/web-ele/src/views/wms/md/warehouse/components/warehouse-select.vue new file mode 100644 index 000000000..d40833ed3 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/warehouse/components/warehouse-select.vue @@ -0,0 +1,88 @@ + + + diff --git a/apps/web-ele/src/views/wms/md/warehouse/data.ts b/apps/web-ele/src/views/wms/md/warehouse/data.ts new file mode 100644 index 000000000..42cca9655 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/warehouse/data.ts @@ -0,0 +1,139 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; + +import { h } from 'vue'; + +import { ElButton } from 'element-plus'; + +import { z } from '#/adapter/form'; +import { generateWmsCode } from '#/views/wms/utils/constants'; + +/** 新增/修改仓库的表单 */ +export function useFormSchema(formApi?: any): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'name', + label: '仓库名称', + component: 'Input', + componentProps: { + maxLength: 50, + placeholder: '请输入仓库名称', + }, + rules: z.string().min(1, '仓库名称不能为空').max(50), + }, + { + fieldName: 'code', + label: '仓库编号', + component: 'Input', + componentProps: { + maxLength: 20, + placeholder: '请输入仓库编号', + }, + rules: z.string().min(1, '仓库编号不能为空').max(20), + suffix: () => { + return h( + ElButton, + { + type: 'default', + onClick: () => { + formApi?.setFieldValue('code', generateWmsCode('W')); + }, + }, + { default: () => '生成' }, + ); + }, + }, + { + fieldName: 'sort', + label: '排序', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + }, + rules: z.number().default(0), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + maxLength: 255, + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'name', + label: '仓库名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入仓库名称', + }, + }, + { + fieldName: 'code', + label: '仓库编号', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入仓库编号', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'name', + title: '仓库名称', + minWidth: 160, + }, + { + field: 'code', + title: '仓库编号', + minWidth: 140, + }, + { + field: 'remark', + title: '备注', + minWidth: 220, + }, + { + field: 'sort', + title: '排序', + width: 100, + align: 'center', + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-ele/src/views/wms/md/warehouse/index.vue b/apps/web-ele/src/views/wms/md/warehouse/index.vue new file mode 100644 index 000000000..753bae133 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/warehouse/index.vue @@ -0,0 +1,152 @@ + + + diff --git a/apps/web-ele/src/views/wms/md/warehouse/modules/form.vue b/apps/web-ele/src/views/wms/md/warehouse/modules/form.vue new file mode 100644 index 000000000..93709fe89 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/warehouse/modules/form.vue @@ -0,0 +1,94 @@ + + + diff --git a/apps/web-ele/src/views/wms/utils/constants.ts b/apps/web-ele/src/views/wms/utils/constants.ts new file mode 100644 index 000000000..b7d8166cc --- /dev/null +++ b/apps/web-ele/src/views/wms/utils/constants.ts @@ -0,0 +1,13 @@ +/** + * 生成 WMS 编号 / 条码。 + * + * @param prefix 可选前缀,按业务域区分编号种类。 + * @returns 前缀 + 8 位随机数字串。 + */ +export function generateWmsCode(prefix = ''): string { + let result = ''; + for (let i = 0; i < 8; i++) { + result += Math.floor(Math.random() * 10).toString(); + } + return prefix + result; +} From 4adce844d3e2172e77b0e88fb3eda6ac9e91f645 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 17 May 2026 10:50:34 +0800 Subject: [PATCH 003/100] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20merchant=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web-antd/src/api/wms/md/merchant/index.ts | 73 ++++++ .../views/wms/md/merchant/components/index.ts | 1 + .../merchant/components/merchant-select.vue | 108 ++++++++ .../src/views/wms/md/merchant/data.ts | 232 ++++++++++++++++++ .../src/views/wms/md/merchant/index.vue | 152 ++++++++++++ .../views/wms/md/merchant/modules/form.vue | 94 +++++++ apps/web-ele/src/api/wms/md/merchant/index.ts | 73 ++++++ .../views/wms/md/merchant/components/index.ts | 1 + .../merchant/components/merchant-select.vue | 111 +++++++++ .../web-ele/src/views/wms/md/merchant/data.ts | 232 ++++++++++++++++++ .../src/views/wms/md/merchant/index.vue | 152 ++++++++++++ .../views/wms/md/merchant/modules/form.vue | 94 +++++++ 12 files changed, 1323 insertions(+) create mode 100644 apps/web-antd/src/api/wms/md/merchant/index.ts create mode 100644 apps/web-antd/src/views/wms/md/merchant/components/index.ts create mode 100644 apps/web-antd/src/views/wms/md/merchant/components/merchant-select.vue create mode 100644 apps/web-antd/src/views/wms/md/merchant/data.ts create mode 100644 apps/web-antd/src/views/wms/md/merchant/index.vue create mode 100644 apps/web-antd/src/views/wms/md/merchant/modules/form.vue create mode 100644 apps/web-ele/src/api/wms/md/merchant/index.ts create mode 100644 apps/web-ele/src/views/wms/md/merchant/components/index.ts create mode 100644 apps/web-ele/src/views/wms/md/merchant/components/merchant-select.vue create mode 100644 apps/web-ele/src/views/wms/md/merchant/data.ts create mode 100644 apps/web-ele/src/views/wms/md/merchant/index.vue create mode 100644 apps/web-ele/src/views/wms/md/merchant/modules/form.vue diff --git a/apps/web-antd/src/api/wms/md/merchant/index.ts b/apps/web-antd/src/api/wms/md/merchant/index.ts new file mode 100644 index 000000000..93539f098 --- /dev/null +++ b/apps/web-antd/src/api/wms/md/merchant/index.ts @@ -0,0 +1,73 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace WmsMerchantApi { + /** WMS 往来企业 */ + export interface Merchant { + id?: number; + code?: string; + name?: string; + type?: number; + level?: string; + bankName?: string; + bankAccount?: string; + address?: string; + mobile?: string; + telephone?: string; + contact?: string; + email?: string; + remark?: string; + createTime?: Date; + } + + /** WMS 往来企业精简列表请求 */ + export interface MerchantSimpleListReq { + types?: number[]; + } +} + +/** 查询往来企业分页 */ +export function getMerchantPage(params: PageParam) { + return requestClient.get>( + '/wms/merchant/page', + { params }, + ); +} + +/** 查询往来企业精简列表 */ +export function getMerchantSimpleList( + params?: WmsMerchantApi.MerchantSimpleListReq, +) { + return requestClient.get( + '/wms/merchant/simple-list', + { params }, + ); +} + +/** 查询往来企业详情 */ +export function getMerchant(id: number) { + return requestClient.get( + `/wms/merchant/get?id=${id}`, + ); +} + +/** 新增往来企业 */ +export function createMerchant(data: WmsMerchantApi.Merchant) { + return requestClient.post('/wms/merchant/create', data); +} + +/** 修改往来企业 */ +export function updateMerchant(data: WmsMerchantApi.Merchant) { + return requestClient.put('/wms/merchant/update', data); +} + +/** 删除往来企业 */ +export function deleteMerchant(id: number) { + return requestClient.delete(`/wms/merchant/delete?id=${id}`); +} + +/** 导出往来企业 */ +export function exportMerchant(params: any) { + return requestClient.download('/wms/merchant/export-excel', { params }); +} diff --git a/apps/web-antd/src/views/wms/md/merchant/components/index.ts b/apps/web-antd/src/views/wms/md/merchant/components/index.ts new file mode 100644 index 000000000..c6a83bd0e --- /dev/null +++ b/apps/web-antd/src/views/wms/md/merchant/components/index.ts @@ -0,0 +1 @@ +export { default as WmsMerchantSelect } from './merchant-select.vue'; diff --git a/apps/web-antd/src/views/wms/md/merchant/components/merchant-select.vue b/apps/web-antd/src/views/wms/md/merchant/components/merchant-select.vue new file mode 100644 index 000000000..be64fddcc --- /dev/null +++ b/apps/web-antd/src/views/wms/md/merchant/components/merchant-select.vue @@ -0,0 +1,108 @@ + + + diff --git a/apps/web-antd/src/views/wms/md/merchant/data.ts b/apps/web-antd/src/views/wms/md/merchant/data.ts new file mode 100644 index 000000000..5f76f7387 --- /dev/null +++ b/apps/web-antd/src/views/wms/md/merchant/data.ts @@ -0,0 +1,232 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; + +import { h } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'ant-design-vue'; + +import { z } from '#/adapter/form'; +import { generateWmsCode } from '#/views/wms/utils/constants'; + +/** 新增/修改往来企业的表单 */ +export function useFormSchema(formApi?: any): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '往来企业编号', + component: 'Input', + componentProps: { + maxLength: 20, + placeholder: '请输入往来企业编号', + }, + rules: z.string().min(1, '往来企业编号不能为空').max(20), + suffix: () => { + return h( + Button, + { + type: 'default', + onClick: () => { + formApi?.setFieldValue('code', generateWmsCode('M')); + }, + }, + { default: () => '生成' }, + ); + }, + }, + { + fieldName: 'name', + label: '往来企业名称', + component: 'Input', + componentProps: { + maxLength: 60, + placeholder: '请输入往来企业名称', + }, + rules: z.string().min(1, '往来企业名称不能为空').max(60), + }, + { + fieldName: 'type', + label: '往来企业类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.WMS_MERCHANT_TYPE, 'number'), + placeholder: '请选择往来企业类型', + }, + rules: 'required', + }, + { + fieldName: 'level', + label: '级别', + component: 'Input', + componentProps: { + maxLength: 10, + placeholder: '请输入级别', + }, + }, + { + fieldName: 'bankName', + label: '开户行', + component: 'Input', + componentProps: { + maxLength: 255, + placeholder: '请输入开户行', + }, + }, + { + fieldName: 'bankAccount', + label: '银行账户', + component: 'Input', + componentProps: { + maxLength: 40, + placeholder: '请输入银行账户', + }, + }, + { + fieldName: 'address', + label: '地址', + component: 'Input', + componentProps: { + maxLength: 200, + placeholder: '请输入地址', + }, + }, + { + fieldName: 'contact', + label: '联系人', + component: 'Input', + componentProps: { + maxLength: 30, + placeholder: '请输入联系人', + }, + }, + { + fieldName: 'mobile', + label: '手机号', + component: 'Input', + componentProps: { + maxLength: 13, + placeholder: '请输入手机号', + }, + }, + { + fieldName: 'telephone', + label: '座机号', + component: 'Input', + componentProps: { + maxLength: 13, + placeholder: '请输入座机号', + }, + }, + { + fieldName: 'email', + label: 'Email', + component: 'Input', + componentProps: { + maxLength: 50, + placeholder: '请输入 Email', + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Input', + componentProps: { + maxLength: 255, + placeholder: '请输入备注', + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '往来企业编号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入往来企业编号', + }, + }, + { + fieldName: 'name', + label: '往来企业名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入往来企业名称', + }, + }, + { + fieldName: 'type', + label: '往来企业类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.WMS_MERCHANT_TYPE, 'number'), + placeholder: '请选择往来企业类型', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '往来企业编号', + width: 160, + }, + { + field: 'name', + title: '往来企业名称', + minWidth: 160, + }, + { + field: 'type', + title: '往来企业类型', + width: 120, + align: 'center', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.WMS_MERCHANT_TYPE }, + }, + }, + { + field: 'level', + title: '级别', + width: 100, + align: 'center', + }, + { + field: 'contact', + title: '联系人', + width: 120, + }, + { + field: 'remark', + title: '备注', + minWidth: 160, + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antd/src/views/wms/md/merchant/index.vue b/apps/web-antd/src/views/wms/md/merchant/index.vue new file mode 100644 index 000000000..1e98f3e93 --- /dev/null +++ b/apps/web-antd/src/views/wms/md/merchant/index.vue @@ -0,0 +1,152 @@ + + + diff --git a/apps/web-antd/src/views/wms/md/merchant/modules/form.vue b/apps/web-antd/src/views/wms/md/merchant/modules/form.vue new file mode 100644 index 000000000..99038a69e --- /dev/null +++ b/apps/web-antd/src/views/wms/md/merchant/modules/form.vue @@ -0,0 +1,94 @@ + + + diff --git a/apps/web-ele/src/api/wms/md/merchant/index.ts b/apps/web-ele/src/api/wms/md/merchant/index.ts new file mode 100644 index 000000000..93539f098 --- /dev/null +++ b/apps/web-ele/src/api/wms/md/merchant/index.ts @@ -0,0 +1,73 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace WmsMerchantApi { + /** WMS 往来企业 */ + export interface Merchant { + id?: number; + code?: string; + name?: string; + type?: number; + level?: string; + bankName?: string; + bankAccount?: string; + address?: string; + mobile?: string; + telephone?: string; + contact?: string; + email?: string; + remark?: string; + createTime?: Date; + } + + /** WMS 往来企业精简列表请求 */ + export interface MerchantSimpleListReq { + types?: number[]; + } +} + +/** 查询往来企业分页 */ +export function getMerchantPage(params: PageParam) { + return requestClient.get>( + '/wms/merchant/page', + { params }, + ); +} + +/** 查询往来企业精简列表 */ +export function getMerchantSimpleList( + params?: WmsMerchantApi.MerchantSimpleListReq, +) { + return requestClient.get( + '/wms/merchant/simple-list', + { params }, + ); +} + +/** 查询往来企业详情 */ +export function getMerchant(id: number) { + return requestClient.get( + `/wms/merchant/get?id=${id}`, + ); +} + +/** 新增往来企业 */ +export function createMerchant(data: WmsMerchantApi.Merchant) { + return requestClient.post('/wms/merchant/create', data); +} + +/** 修改往来企业 */ +export function updateMerchant(data: WmsMerchantApi.Merchant) { + return requestClient.put('/wms/merchant/update', data); +} + +/** 删除往来企业 */ +export function deleteMerchant(id: number) { + return requestClient.delete(`/wms/merchant/delete?id=${id}`); +} + +/** 导出往来企业 */ +export function exportMerchant(params: any) { + return requestClient.download('/wms/merchant/export-excel', { params }); +} diff --git a/apps/web-ele/src/views/wms/md/merchant/components/index.ts b/apps/web-ele/src/views/wms/md/merchant/components/index.ts new file mode 100644 index 000000000..c6a83bd0e --- /dev/null +++ b/apps/web-ele/src/views/wms/md/merchant/components/index.ts @@ -0,0 +1 @@ +export { default as WmsMerchantSelect } from './merchant-select.vue'; diff --git a/apps/web-ele/src/views/wms/md/merchant/components/merchant-select.vue b/apps/web-ele/src/views/wms/md/merchant/components/merchant-select.vue new file mode 100644 index 000000000..587aee847 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/merchant/components/merchant-select.vue @@ -0,0 +1,111 @@ + + + diff --git a/apps/web-ele/src/views/wms/md/merchant/data.ts b/apps/web-ele/src/views/wms/md/merchant/data.ts new file mode 100644 index 000000000..95903f7b1 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/merchant/data.ts @@ -0,0 +1,232 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; + +import { h } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { ElButton } from 'element-plus'; + +import { z } from '#/adapter/form'; +import { generateWmsCode } from '#/views/wms/utils/constants'; + +/** 新增/修改往来企业的表单 */ +export function useFormSchema(formApi?: any): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '往来企业编号', + component: 'Input', + componentProps: { + maxLength: 20, + placeholder: '请输入往来企业编号', + }, + rules: z.string().min(1, '往来企业编号不能为空').max(20), + suffix: () => { + return h( + ElButton, + { + type: 'default', + onClick: () => { + formApi?.setFieldValue('code', generateWmsCode('M')); + }, + }, + { default: () => '生成' }, + ); + }, + }, + { + fieldName: 'name', + label: '往来企业名称', + component: 'Input', + componentProps: { + maxLength: 60, + placeholder: '请输入往来企业名称', + }, + rules: z.string().min(1, '往来企业名称不能为空').max(60), + }, + { + fieldName: 'type', + label: '往来企业类型', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.WMS_MERCHANT_TYPE, 'number'), + placeholder: '请选择往来企业类型', + }, + rules: 'required', + }, + { + fieldName: 'level', + label: '级别', + component: 'Input', + componentProps: { + maxLength: 10, + placeholder: '请输入级别', + }, + }, + { + fieldName: 'bankName', + label: '开户行', + component: 'Input', + componentProps: { + maxLength: 255, + placeholder: '请输入开户行', + }, + }, + { + fieldName: 'bankAccount', + label: '银行账户', + component: 'Input', + componentProps: { + maxLength: 40, + placeholder: '请输入银行账户', + }, + }, + { + fieldName: 'address', + label: '地址', + component: 'Input', + componentProps: { + maxLength: 200, + placeholder: '请输入地址', + }, + }, + { + fieldName: 'contact', + label: '联系人', + component: 'Input', + componentProps: { + maxLength: 30, + placeholder: '请输入联系人', + }, + }, + { + fieldName: 'mobile', + label: '手机号', + component: 'Input', + componentProps: { + maxLength: 13, + placeholder: '请输入手机号', + }, + }, + { + fieldName: 'telephone', + label: '座机号', + component: 'Input', + componentProps: { + maxLength: 13, + placeholder: '请输入座机号', + }, + }, + { + fieldName: 'email', + label: 'Email', + component: 'Input', + componentProps: { + maxLength: 50, + placeholder: '请输入 Email', + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Input', + componentProps: { + maxLength: 255, + placeholder: '请输入备注', + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '往来企业编号', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入往来企业编号', + }, + }, + { + fieldName: 'name', + label: '往来企业名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入往来企业名称', + }, + }, + { + fieldName: 'type', + label: '往来企业类型', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.WMS_MERCHANT_TYPE, 'number'), + placeholder: '请选择往来企业类型', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '往来企业编号', + width: 160, + }, + { + field: 'name', + title: '往来企业名称', + minWidth: 160, + }, + { + field: 'type', + title: '往来企业类型', + width: 120, + align: 'center', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.WMS_MERCHANT_TYPE }, + }, + }, + { + field: 'level', + title: '级别', + width: 100, + align: 'center', + }, + { + field: 'contact', + title: '联系人', + width: 120, + }, + { + field: 'remark', + title: '备注', + minWidth: 160, + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-ele/src/views/wms/md/merchant/index.vue b/apps/web-ele/src/views/wms/md/merchant/index.vue new file mode 100644 index 000000000..cf00b435a --- /dev/null +++ b/apps/web-ele/src/views/wms/md/merchant/index.vue @@ -0,0 +1,152 @@ + + + diff --git a/apps/web-ele/src/views/wms/md/merchant/modules/form.vue b/apps/web-ele/src/views/wms/md/merchant/modules/form.vue new file mode 100644 index 000000000..83ddba950 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/merchant/modules/form.vue @@ -0,0 +1,94 @@ + + + From 6b28518165acd855305868984a3f6604cc1672fa Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 17 May 2026 16:30:50 +0800 Subject: [PATCH 004/100] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=20api=20=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/api/wms/home/index.ts | 66 +++++++++++++++++ .../src/api/wms/inventory/history/index.ts | 37 ++++++++++ apps/web-antd/src/api/wms/inventory/index.ts | 42 +++++++++++ .../src/api/wms/md/item/brand/index.ts | 55 ++++++++++++++ .../src/api/wms/md/item/category/index.ts | 52 +++++++++++++ apps/web-antd/src/api/wms/md/item/index.ts | 61 +++++++++++++++ .../web-antd/src/api/wms/md/item/sku/index.ts | 37 ++++++++++ .../src/api/wms/order/check/detail/index.ts | 23 ++++++ .../web-antd/src/api/wms/order/check/index.ts | 71 ++++++++++++++++++ .../api/wms/order/movement/detail/index.ts | 23 ++++++ .../src/api/wms/order/movement/index.ts | 72 ++++++++++++++++++ .../src/api/wms/order/receipt/detail/index.ts | 20 +++++ .../src/api/wms/order/receipt/index.ts | 74 +++++++++++++++++++ .../api/wms/order/shipment/detail/index.ts | 21 ++++++ .../src/api/wms/order/shipment/index.ts | 74 +++++++++++++++++++ apps/web-ele/src/api/wms/home/index.ts | 66 +++++++++++++++++ .../src/api/wms/inventory/history/index.ts | 37 ++++++++++ apps/web-ele/src/api/wms/inventory/index.ts | 42 +++++++++++ .../src/api/wms/md/item/brand/index.ts | 55 ++++++++++++++ .../src/api/wms/md/item/category/index.ts | 52 +++++++++++++ apps/web-ele/src/api/wms/md/item/index.ts | 61 +++++++++++++++ apps/web-ele/src/api/wms/md/item/sku/index.ts | 37 ++++++++++ .../src/api/wms/order/check/detail/index.ts | 23 ++++++ apps/web-ele/src/api/wms/order/check/index.ts | 71 ++++++++++++++++++ .../api/wms/order/movement/detail/index.ts | 23 ++++++ .../src/api/wms/order/movement/index.ts | 72 ++++++++++++++++++ .../src/api/wms/order/receipt/detail/index.ts | 20 +++++ .../src/api/wms/order/receipt/index.ts | 74 +++++++++++++++++++ .../api/wms/order/shipment/detail/index.ts | 21 ++++++ .../src/api/wms/order/shipment/index.ts | 74 +++++++++++++++++++ 30 files changed, 1456 insertions(+) create mode 100644 apps/web-antd/src/api/wms/home/index.ts create mode 100644 apps/web-antd/src/api/wms/inventory/history/index.ts create mode 100644 apps/web-antd/src/api/wms/inventory/index.ts create mode 100644 apps/web-antd/src/api/wms/md/item/brand/index.ts create mode 100644 apps/web-antd/src/api/wms/md/item/category/index.ts create mode 100644 apps/web-antd/src/api/wms/md/item/index.ts create mode 100644 apps/web-antd/src/api/wms/md/item/sku/index.ts create mode 100644 apps/web-antd/src/api/wms/order/check/detail/index.ts create mode 100644 apps/web-antd/src/api/wms/order/check/index.ts create mode 100644 apps/web-antd/src/api/wms/order/movement/detail/index.ts create mode 100644 apps/web-antd/src/api/wms/order/movement/index.ts create mode 100644 apps/web-antd/src/api/wms/order/receipt/detail/index.ts create mode 100644 apps/web-antd/src/api/wms/order/receipt/index.ts create mode 100644 apps/web-antd/src/api/wms/order/shipment/detail/index.ts create mode 100644 apps/web-antd/src/api/wms/order/shipment/index.ts create mode 100644 apps/web-ele/src/api/wms/home/index.ts create mode 100644 apps/web-ele/src/api/wms/inventory/history/index.ts create mode 100644 apps/web-ele/src/api/wms/inventory/index.ts create mode 100644 apps/web-ele/src/api/wms/md/item/brand/index.ts create mode 100644 apps/web-ele/src/api/wms/md/item/category/index.ts create mode 100644 apps/web-ele/src/api/wms/md/item/index.ts create mode 100644 apps/web-ele/src/api/wms/md/item/sku/index.ts create mode 100644 apps/web-ele/src/api/wms/order/check/detail/index.ts create mode 100644 apps/web-ele/src/api/wms/order/check/index.ts create mode 100644 apps/web-ele/src/api/wms/order/movement/detail/index.ts create mode 100644 apps/web-ele/src/api/wms/order/movement/index.ts create mode 100644 apps/web-ele/src/api/wms/order/receipt/detail/index.ts create mode 100644 apps/web-ele/src/api/wms/order/receipt/index.ts create mode 100644 apps/web-ele/src/api/wms/order/shipment/detail/index.ts create mode 100644 apps/web-ele/src/api/wms/order/shipment/index.ts diff --git a/apps/web-antd/src/api/wms/home/index.ts b/apps/web-antd/src/api/wms/home/index.ts new file mode 100644 index 000000000..ae9577201 --- /dev/null +++ b/apps/web-antd/src/api/wms/home/index.ts @@ -0,0 +1,66 @@ +import { requestClient } from '#/api/request'; + +export namespace WmsHomeStatisticsApi { + export interface StatisticsReq { + goodsLimit?: number; + warehouseId?: number; + warehouseLimit?: number; + } + + export interface OrderStatus { + count: number; + status: number; + } + + export interface OrderSummary { + statuses: OrderStatus[]; + total: number; + type: number; + } + + export interface OrderTrend { + checkCount: number; + movementCount: number; + receiptCount: number; + shipmentCount: number; + time: number | string; + } + + export interface InventoryRankItem { + id: number; + name: string; + quantity: number; + } + + export interface InventorySummary { + goodsShareList: InventoryRankItem[]; + totalQuantity: number; + warehouseDistributionList: InventoryRankItem[]; + } +} + +export function getOrderSummary(params?: WmsHomeStatisticsApi.StatisticsReq) { + return requestClient.get( + '/wms/home-statistics/order-summary', + { params }, + ); +} + +export function getOrderTrend( + days?: number, + params?: WmsHomeStatisticsApi.StatisticsReq, +) { + return requestClient.get( + '/wms/home-statistics/order-trend', + { params: { ...params, days } }, + ); +} + +export function getInventorySummary( + params?: WmsHomeStatisticsApi.StatisticsReq, +) { + return requestClient.get( + '/wms/home-statistics/inventory-summary', + { params }, + ); +} diff --git a/apps/web-antd/src/api/wms/inventory/history/index.ts b/apps/web-antd/src/api/wms/inventory/history/index.ts new file mode 100644 index 000000000..02f6bccd1 --- /dev/null +++ b/apps/web-antd/src/api/wms/inventory/history/index.ts @@ -0,0 +1,37 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace WmsInventoryHistoryApi { + /** WMS 库存记录 */ + export interface InventoryHistory { + id?: number; + itemId?: number; + itemCode?: string; + itemName?: string; + unit?: string; + skuId?: number; + skuCode?: string; + skuName?: string; + warehouseId?: number; + warehouseName?: string; + quantity?: number; + beforeQuantity?: number; + afterQuantity?: number; + price?: number; + totalPrice?: number; + remark?: string; + orderId?: number; + orderNo?: string; + orderType?: number; + createTime?: Date; + } +} + +/** 查询库存记录分页 */ +export function getInventoryHistoryPage(params: PageParam) { + return requestClient.get>( + '/wms/inventory-history/page', + { params }, + ); +} diff --git a/apps/web-antd/src/api/wms/inventory/index.ts b/apps/web-antd/src/api/wms/inventory/index.ts new file mode 100644 index 000000000..90ca4a11d --- /dev/null +++ b/apps/web-antd/src/api/wms/inventory/index.ts @@ -0,0 +1,42 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace WmsInventoryApi { + /** WMS 库存统计 */ + export interface Inventory { + id?: number; + itemId?: number; + itemCode?: string; + itemName?: string; + unit?: string; + skuId?: number; + skuCode?: string; + skuName?: string; + warehouseId?: number; + warehouseName?: string; + quantity?: number; + remark?: string; + createTime?: Date; + } + + /** WMS 库存统计列表请求 */ + export interface InventoryListReq { + warehouseId: number; + } +} + +/** 查询库存统计分页 */ +export function getInventoryPage(params: PageParam) { + return requestClient.get>( + '/wms/inventory/page', + { params }, + ); +} + +/** 查询库存统计列表 */ +export function getInventoryList(params: WmsInventoryApi.InventoryListReq) { + return requestClient.get('/wms/inventory/list', { + params, + }); +} diff --git a/apps/web-antd/src/api/wms/md/item/brand/index.ts b/apps/web-antd/src/api/wms/md/item/brand/index.ts new file mode 100644 index 000000000..a251b05ca --- /dev/null +++ b/apps/web-antd/src/api/wms/md/item/brand/index.ts @@ -0,0 +1,55 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace WmsItemBrandApi { + /** WMS 商品品牌 */ + export interface ItemBrand { + id?: number; + code?: string; + name?: string; + createTime?: Date; + } +} + +/** 查询商品品牌分页 */ +export function getItemBrandPage(params: PageParam) { + return requestClient.get>( + '/wms/item-brand/page', + { params }, + ); +} + +/** 查询商品品牌精简列表 */ +export function getItemBrandSimpleList() { + return requestClient.get( + '/wms/item-brand/simple-list', + ); +} + +/** 查询商品品牌详情 */ +export function getItemBrand(id: number) { + return requestClient.get( + `/wms/item-brand/get?id=${id}`, + ); +} + +/** 新增商品品牌 */ +export function createItemBrand(data: WmsItemBrandApi.ItemBrand) { + return requestClient.post('/wms/item-brand/create', data); +} + +/** 修改商品品牌 */ +export function updateItemBrand(data: WmsItemBrandApi.ItemBrand) { + return requestClient.put('/wms/item-brand/update', data); +} + +/** 删除商品品牌 */ +export function deleteItemBrand(id: number) { + return requestClient.delete(`/wms/item-brand/delete?id=${id}`); +} + +/** 导出商品品牌 */ +export function exportItemBrand(params: any) { + return requestClient.download('/wms/item-brand/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/wms/md/item/category/index.ts b/apps/web-antd/src/api/wms/md/item/category/index.ts new file mode 100644 index 000000000..be356f01e --- /dev/null +++ b/apps/web-antd/src/api/wms/md/item/category/index.ts @@ -0,0 +1,52 @@ +import { requestClient } from '#/api/request'; + +export namespace WmsItemCategoryApi { + /** WMS 商品分类 */ + export interface ItemCategory { + id?: number; + parentId?: number; + code?: string; + name?: string; + sort?: number; + status?: number; + createTime?: Date; + children?: ItemCategory[]; + } +} + +/** 查询商品分类列表 */ +export function getItemCategoryList(params?: any) { + return requestClient.get( + '/wms/item-category/list', + { params }, + ); +} + +/** 查询商品分类精简列表 */ +export function getItemCategorySimpleList() { + return requestClient.get( + '/wms/item-category/simple-list', + ); +} + +/** 查询商品分类详情 */ +export function getItemCategory(id: number) { + return requestClient.get( + `/wms/item-category/get?id=${id}`, + ); +} + +/** 新增商品分类 */ +export function createItemCategory(data: WmsItemCategoryApi.ItemCategory) { + return requestClient.post('/wms/item-category/create', data); +} + +/** 修改商品分类 */ +export function updateItemCategory(data: WmsItemCategoryApi.ItemCategory) { + return requestClient.put('/wms/item-category/update', data); +} + +/** 删除商品分类 */ +export function deleteItemCategory(id: number) { + return requestClient.delete(`/wms/item-category/delete?id=${id}`); +} diff --git a/apps/web-antd/src/api/wms/md/item/index.ts b/apps/web-antd/src/api/wms/md/item/index.ts new file mode 100644 index 000000000..fda44706c --- /dev/null +++ b/apps/web-antd/src/api/wms/md/item/index.ts @@ -0,0 +1,61 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import type { WmsItemSkuApi } from './sku'; + +import { requestClient } from '#/api/request'; + +export namespace WmsItemApi { + /** WMS 商品 */ + export interface Item { + id?: number; + code?: string; + name?: string; + categoryId?: number; + categoryName?: string; + unit?: string; + brandId?: number; + brandName?: string; + remark?: string; + skus?: WmsItemSkuApi.ItemSku[]; + createTime?: Date; + } +} + +/** 查询商品分页 */ +export function getItemPage(params: PageParam) { + return requestClient.get>('/wms/item/page', { + params, + }); +} + +/** 查询商品精简列表 */ +export function getItemSimpleList(params?: any) { + return requestClient.get('/wms/item/simple-list', { + params, + }); +} + +/** 查询商品详情 */ +export function getItem(id: number) { + return requestClient.get(`/wms/item/get?id=${id}`); +} + +/** 新增商品 */ +export function createItem(data: WmsItemApi.Item) { + return requestClient.post('/wms/item/create', data); +} + +/** 修改商品 */ +export function updateItem(data: WmsItemApi.Item) { + return requestClient.put('/wms/item/update', data); +} + +/** 删除商品 */ +export function deleteItem(id: number) { + return requestClient.delete(`/wms/item/delete?id=${id}`); +} + +/** 导出商品 */ +export function exportItem(params: any) { + return requestClient.download('/wms/item/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/wms/md/item/sku/index.ts b/apps/web-antd/src/api/wms/md/item/sku/index.ts new file mode 100644 index 000000000..2296becf1 --- /dev/null +++ b/apps/web-antd/src/api/wms/md/item/sku/index.ts @@ -0,0 +1,37 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace WmsItemSkuApi { + /** WMS 商品 SKU */ + export interface ItemSku { + id?: number; + name?: string; + itemId?: number; + itemCode?: string; + itemName?: string; + categoryId?: number; + categoryName?: string; + unit?: string; + brandId?: number; + brandName?: string; + barCode?: string; + code?: string; + length?: number; + width?: number; + height?: number; + grossWeight?: number; + netWeight?: number; + costPrice?: number; + sellingPrice?: number; + createTime?: Date; + } +} + +/** 按 SKU 维度分页(支持商品 / 品牌 / 分类多表联查筛选) */ +export function getItemSkuPage(params: PageParam) { + return requestClient.get>( + '/wms/item-sku/page', + { params }, + ); +} diff --git a/apps/web-antd/src/api/wms/order/check/detail/index.ts b/apps/web-antd/src/api/wms/order/check/detail/index.ts new file mode 100644 index 000000000..ae34b2154 --- /dev/null +++ b/apps/web-antd/src/api/wms/order/check/detail/index.ts @@ -0,0 +1,23 @@ +export namespace WmsCheckOrderDetailApi { + /** WMS 盘库单明细 */ + export interface CheckOrderDetail { + id?: number; + orderId?: number; + itemId?: number; + itemCode?: string; + itemName?: string; + unit?: string; + skuId?: number; + skuCode?: string; + skuName?: string; + inventoryId?: number; + warehouseId?: number; + warehouseName?: string; + receiptTime?: Date; + quantity?: number; + checkQuantity?: number; + availableQuantity?: number; + price?: number; + createTime?: Date; + } +} diff --git a/apps/web-antd/src/api/wms/order/check/index.ts b/apps/web-antd/src/api/wms/order/check/index.ts new file mode 100644 index 000000000..910c997d3 --- /dev/null +++ b/apps/web-antd/src/api/wms/order/check/index.ts @@ -0,0 +1,71 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import type { WmsCheckOrderDetailApi } from './detail'; + +import { requestClient } from '#/api/request'; + +export namespace WmsCheckOrderApi { + /** WMS 盘库单 */ + export interface CheckOrder { + id?: number; + no?: string; + orderTime?: string; + status?: number; + remark?: string; + warehouseId?: number; + warehouseName?: string; + totalQuantity?: number; + totalPrice?: number; + actualPrice?: number; + details?: WmsCheckOrderDetailApi.CheckOrderDetail[]; + createTime?: Date; + creator?: string; + creatorName?: string; + updateTime?: Date; + updater?: string; + updaterName?: string; + } +} + +export function getCheckOrderPage(params: PageParam) { + return requestClient.get>( + '/wms/check-order/page', + { params }, + ); +} + +export function getCheckOrder(id: number) { + return requestClient.get( + `/wms/check-order/get?id=${id}`, + ); +} + +export function getCheckOrderDetailListByOrderId(orderId: number) { + return requestClient.get( + `/wms/check-order-detail/list-by-order-id?orderId=${orderId}`, + ); +} + +export function createCheckOrder(data: WmsCheckOrderApi.CheckOrder) { + return requestClient.post('/wms/check-order/create', data); +} + +export function updateCheckOrder(data: WmsCheckOrderApi.CheckOrder) { + return requestClient.put('/wms/check-order/update', data); +} + +export function completeCheckOrder(id: number) { + return requestClient.put(`/wms/check-order/complete?id=${id}`); +} + +export function cancelCheckOrder(id: number) { + return requestClient.put(`/wms/check-order/cancel?id=${id}`); +} + +export function deleteCheckOrder(id: number) { + return requestClient.delete(`/wms/check-order/delete?id=${id}`); +} + +export function exportCheckOrder(params: any) { + return requestClient.download('/wms/check-order/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/wms/order/movement/detail/index.ts b/apps/web-antd/src/api/wms/order/movement/detail/index.ts new file mode 100644 index 000000000..25a3aec6a --- /dev/null +++ b/apps/web-antd/src/api/wms/order/movement/detail/index.ts @@ -0,0 +1,23 @@ +export namespace WmsMovementOrderDetailApi { + /** WMS 移库单明细 */ + export interface MovementOrderDetail { + id?: number; + orderId?: number; + itemId?: number; + itemCode?: string; + itemName?: string; + unit?: string; + skuId?: number; + skuCode?: string; + skuName?: string; + sourceWarehouseId?: number; + sourceWarehouseName?: string; + targetWarehouseId?: number; + targetWarehouseName?: string; + quantity?: number; + availableQuantity?: number; + price?: number; + totalPrice?: number; + createTime?: Date; + } +} diff --git a/apps/web-antd/src/api/wms/order/movement/index.ts b/apps/web-antd/src/api/wms/order/movement/index.ts new file mode 100644 index 000000000..f6b9e3197 --- /dev/null +++ b/apps/web-antd/src/api/wms/order/movement/index.ts @@ -0,0 +1,72 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import type { WmsMovementOrderDetailApi } from './detail'; + +import { requestClient } from '#/api/request'; + +export namespace WmsMovementOrderApi { + /** WMS 移库单 */ + export interface MovementOrder { + id?: number; + no?: string; + orderTime?: string; + status?: number; + remark?: string; + sourceWarehouseId?: number; + sourceWarehouseName?: string; + targetWarehouseId?: number; + targetWarehouseName?: string; + totalQuantity?: number; + totalPrice?: number; + details?: WmsMovementOrderDetailApi.MovementOrderDetail[]; + createTime?: Date; + creator?: string; + creatorName?: string; + updateTime?: Date; + updater?: string; + updaterName?: string; + } +} + +export function getMovementOrderPage(params: PageParam) { + return requestClient.get>( + '/wms/movement-order/page', + { params }, + ); +} + +export function getMovementOrder(id: number) { + return requestClient.get( + `/wms/movement-order/get?id=${id}`, + ); +} + +export function getMovementOrderDetailListByOrderId(orderId: number) { + return requestClient.get( + `/wms/movement-order-detail/list-by-order-id?orderId=${orderId}`, + ); +} + +export function createMovementOrder(data: WmsMovementOrderApi.MovementOrder) { + return requestClient.post('/wms/movement-order/create', data); +} + +export function updateMovementOrder(data: WmsMovementOrderApi.MovementOrder) { + return requestClient.put('/wms/movement-order/update', data); +} + +export function completeMovementOrder(id: number) { + return requestClient.put(`/wms/movement-order/complete?id=${id}`); +} + +export function cancelMovementOrder(id: number) { + return requestClient.put(`/wms/movement-order/cancel?id=${id}`); +} + +export function deleteMovementOrder(id: number) { + return requestClient.delete(`/wms/movement-order/delete?id=${id}`); +} + +export function exportMovementOrder(params: any) { + return requestClient.download('/wms/movement-order/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/wms/order/receipt/detail/index.ts b/apps/web-antd/src/api/wms/order/receipt/detail/index.ts new file mode 100644 index 000000000..0695c224d --- /dev/null +++ b/apps/web-antd/src/api/wms/order/receipt/detail/index.ts @@ -0,0 +1,20 @@ +export namespace WmsReceiptOrderDetailApi { + /** WMS 入库单明细 */ + export interface ReceiptOrderDetail { + id?: number; + orderId?: number; + itemId?: number; + itemCode?: string; + itemName?: string; + unit?: string; + skuId?: number; + skuCode?: string; + skuName?: string; + warehouseId?: number; + warehouseName?: string; + quantity?: number; + price?: number; + totalPrice?: number; + createTime?: Date; + } +} diff --git a/apps/web-antd/src/api/wms/order/receipt/index.ts b/apps/web-antd/src/api/wms/order/receipt/index.ts new file mode 100644 index 000000000..9c5a08a5e --- /dev/null +++ b/apps/web-antd/src/api/wms/order/receipt/index.ts @@ -0,0 +1,74 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import type { WmsReceiptOrderDetailApi } from './detail'; + +import { requestClient } from '#/api/request'; + +export namespace WmsReceiptOrderApi { + /** WMS 入库单 */ + export interface ReceiptOrder { + id?: number; + no?: string; + type?: number; + orderTime?: string; + status?: number; + bizOrderNo?: string; + merchantId?: number; + merchantName?: string; + remark?: string; + warehouseId?: number; + warehouseName?: string; + totalQuantity?: number; + totalPrice?: number; + details?: WmsReceiptOrderDetailApi.ReceiptOrderDetail[]; + createTime?: Date; + creator?: string; + creatorName?: string; + updateTime?: Date; + updater?: string; + updaterName?: string; + } +} + +export function getReceiptOrderPage(params: PageParam) { + return requestClient.get>( + '/wms/receipt-order/page', + { params }, + ); +} + +export function getReceiptOrder(id: number) { + return requestClient.get( + `/wms/receipt-order/get?id=${id}`, + ); +} + +export function getReceiptOrderDetailListByOrderId(orderId: number) { + return requestClient.get( + `/wms/receipt-order-detail/list-by-order-id?orderId=${orderId}`, + ); +} + +export function createReceiptOrder(data: WmsReceiptOrderApi.ReceiptOrder) { + return requestClient.post('/wms/receipt-order/create', data); +} + +export function updateReceiptOrder(data: WmsReceiptOrderApi.ReceiptOrder) { + return requestClient.put('/wms/receipt-order/update', data); +} + +export function completeReceiptOrder(id: number) { + return requestClient.put(`/wms/receipt-order/complete?id=${id}`); +} + +export function cancelReceiptOrder(id: number) { + return requestClient.put(`/wms/receipt-order/cancel?id=${id}`); +} + +export function deleteReceiptOrder(id: number) { + return requestClient.delete(`/wms/receipt-order/delete?id=${id}`); +} + +export function exportReceiptOrder(params: any) { + return requestClient.download('/wms/receipt-order/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/wms/order/shipment/detail/index.ts b/apps/web-antd/src/api/wms/order/shipment/detail/index.ts new file mode 100644 index 000000000..17e796e18 --- /dev/null +++ b/apps/web-antd/src/api/wms/order/shipment/detail/index.ts @@ -0,0 +1,21 @@ +export namespace WmsShipmentOrderDetailApi { + /** WMS 出库单明细 */ + export interface ShipmentOrderDetail { + id?: number; + orderId?: number; + itemId?: number; + itemCode?: string; + itemName?: string; + unit?: string; + skuId?: number; + skuCode?: string; + skuName?: string; + warehouseId?: number; + warehouseName?: string; + quantity?: number; + availableQuantity?: number; + price?: number; + totalPrice?: number; + createTime?: Date; + } +} diff --git a/apps/web-antd/src/api/wms/order/shipment/index.ts b/apps/web-antd/src/api/wms/order/shipment/index.ts new file mode 100644 index 000000000..b52dcdaca --- /dev/null +++ b/apps/web-antd/src/api/wms/order/shipment/index.ts @@ -0,0 +1,74 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import type { WmsShipmentOrderDetailApi } from './detail'; + +import { requestClient } from '#/api/request'; + +export namespace WmsShipmentOrderApi { + /** WMS 出库单 */ + export interface ShipmentOrder { + id?: number; + no?: string; + type?: number; + orderTime?: string; + status?: number; + bizOrderNo?: string; + merchantId?: number; + merchantName?: string; + remark?: string; + warehouseId?: number; + warehouseName?: string; + totalQuantity?: number; + totalPrice?: number; + details?: WmsShipmentOrderDetailApi.ShipmentOrderDetail[]; + createTime?: Date; + creator?: string; + creatorName?: string; + updateTime?: Date; + updater?: string; + updaterName?: string; + } +} + +export function getShipmentOrderPage(params: PageParam) { + return requestClient.get>( + '/wms/shipment-order/page', + { params }, + ); +} + +export function getShipmentOrder(id: number) { + return requestClient.get( + `/wms/shipment-order/get?id=${id}`, + ); +} + +export function getShipmentOrderDetailListByOrderId(orderId: number) { + return requestClient.get( + `/wms/shipment-order-detail/list-by-order-id?orderId=${orderId}`, + ); +} + +export function createShipmentOrder(data: WmsShipmentOrderApi.ShipmentOrder) { + return requestClient.post('/wms/shipment-order/create', data); +} + +export function updateShipmentOrder(data: WmsShipmentOrderApi.ShipmentOrder) { + return requestClient.put('/wms/shipment-order/update', data); +} + +export function completeShipmentOrder(id: number) { + return requestClient.put(`/wms/shipment-order/complete?id=${id}`); +} + +export function cancelShipmentOrder(id: number) { + return requestClient.put(`/wms/shipment-order/cancel?id=${id}`); +} + +export function deleteShipmentOrder(id: number) { + return requestClient.delete(`/wms/shipment-order/delete?id=${id}`); +} + +export function exportShipmentOrder(params: any) { + return requestClient.download('/wms/shipment-order/export-excel', { params }); +} diff --git a/apps/web-ele/src/api/wms/home/index.ts b/apps/web-ele/src/api/wms/home/index.ts new file mode 100644 index 000000000..ae9577201 --- /dev/null +++ b/apps/web-ele/src/api/wms/home/index.ts @@ -0,0 +1,66 @@ +import { requestClient } from '#/api/request'; + +export namespace WmsHomeStatisticsApi { + export interface StatisticsReq { + goodsLimit?: number; + warehouseId?: number; + warehouseLimit?: number; + } + + export interface OrderStatus { + count: number; + status: number; + } + + export interface OrderSummary { + statuses: OrderStatus[]; + total: number; + type: number; + } + + export interface OrderTrend { + checkCount: number; + movementCount: number; + receiptCount: number; + shipmentCount: number; + time: number | string; + } + + export interface InventoryRankItem { + id: number; + name: string; + quantity: number; + } + + export interface InventorySummary { + goodsShareList: InventoryRankItem[]; + totalQuantity: number; + warehouseDistributionList: InventoryRankItem[]; + } +} + +export function getOrderSummary(params?: WmsHomeStatisticsApi.StatisticsReq) { + return requestClient.get( + '/wms/home-statistics/order-summary', + { params }, + ); +} + +export function getOrderTrend( + days?: number, + params?: WmsHomeStatisticsApi.StatisticsReq, +) { + return requestClient.get( + '/wms/home-statistics/order-trend', + { params: { ...params, days } }, + ); +} + +export function getInventorySummary( + params?: WmsHomeStatisticsApi.StatisticsReq, +) { + return requestClient.get( + '/wms/home-statistics/inventory-summary', + { params }, + ); +} diff --git a/apps/web-ele/src/api/wms/inventory/history/index.ts b/apps/web-ele/src/api/wms/inventory/history/index.ts new file mode 100644 index 000000000..02f6bccd1 --- /dev/null +++ b/apps/web-ele/src/api/wms/inventory/history/index.ts @@ -0,0 +1,37 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace WmsInventoryHistoryApi { + /** WMS 库存记录 */ + export interface InventoryHistory { + id?: number; + itemId?: number; + itemCode?: string; + itemName?: string; + unit?: string; + skuId?: number; + skuCode?: string; + skuName?: string; + warehouseId?: number; + warehouseName?: string; + quantity?: number; + beforeQuantity?: number; + afterQuantity?: number; + price?: number; + totalPrice?: number; + remark?: string; + orderId?: number; + orderNo?: string; + orderType?: number; + createTime?: Date; + } +} + +/** 查询库存记录分页 */ +export function getInventoryHistoryPage(params: PageParam) { + return requestClient.get>( + '/wms/inventory-history/page', + { params }, + ); +} diff --git a/apps/web-ele/src/api/wms/inventory/index.ts b/apps/web-ele/src/api/wms/inventory/index.ts new file mode 100644 index 000000000..90ca4a11d --- /dev/null +++ b/apps/web-ele/src/api/wms/inventory/index.ts @@ -0,0 +1,42 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace WmsInventoryApi { + /** WMS 库存统计 */ + export interface Inventory { + id?: number; + itemId?: number; + itemCode?: string; + itemName?: string; + unit?: string; + skuId?: number; + skuCode?: string; + skuName?: string; + warehouseId?: number; + warehouseName?: string; + quantity?: number; + remark?: string; + createTime?: Date; + } + + /** WMS 库存统计列表请求 */ + export interface InventoryListReq { + warehouseId: number; + } +} + +/** 查询库存统计分页 */ +export function getInventoryPage(params: PageParam) { + return requestClient.get>( + '/wms/inventory/page', + { params }, + ); +} + +/** 查询库存统计列表 */ +export function getInventoryList(params: WmsInventoryApi.InventoryListReq) { + return requestClient.get('/wms/inventory/list', { + params, + }); +} diff --git a/apps/web-ele/src/api/wms/md/item/brand/index.ts b/apps/web-ele/src/api/wms/md/item/brand/index.ts new file mode 100644 index 000000000..a251b05ca --- /dev/null +++ b/apps/web-ele/src/api/wms/md/item/brand/index.ts @@ -0,0 +1,55 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace WmsItemBrandApi { + /** WMS 商品品牌 */ + export interface ItemBrand { + id?: number; + code?: string; + name?: string; + createTime?: Date; + } +} + +/** 查询商品品牌分页 */ +export function getItemBrandPage(params: PageParam) { + return requestClient.get>( + '/wms/item-brand/page', + { params }, + ); +} + +/** 查询商品品牌精简列表 */ +export function getItemBrandSimpleList() { + return requestClient.get( + '/wms/item-brand/simple-list', + ); +} + +/** 查询商品品牌详情 */ +export function getItemBrand(id: number) { + return requestClient.get( + `/wms/item-brand/get?id=${id}`, + ); +} + +/** 新增商品品牌 */ +export function createItemBrand(data: WmsItemBrandApi.ItemBrand) { + return requestClient.post('/wms/item-brand/create', data); +} + +/** 修改商品品牌 */ +export function updateItemBrand(data: WmsItemBrandApi.ItemBrand) { + return requestClient.put('/wms/item-brand/update', data); +} + +/** 删除商品品牌 */ +export function deleteItemBrand(id: number) { + return requestClient.delete(`/wms/item-brand/delete?id=${id}`); +} + +/** 导出商品品牌 */ +export function exportItemBrand(params: any) { + return requestClient.download('/wms/item-brand/export-excel', { params }); +} diff --git a/apps/web-ele/src/api/wms/md/item/category/index.ts b/apps/web-ele/src/api/wms/md/item/category/index.ts new file mode 100644 index 000000000..be356f01e --- /dev/null +++ b/apps/web-ele/src/api/wms/md/item/category/index.ts @@ -0,0 +1,52 @@ +import { requestClient } from '#/api/request'; + +export namespace WmsItemCategoryApi { + /** WMS 商品分类 */ + export interface ItemCategory { + id?: number; + parentId?: number; + code?: string; + name?: string; + sort?: number; + status?: number; + createTime?: Date; + children?: ItemCategory[]; + } +} + +/** 查询商品分类列表 */ +export function getItemCategoryList(params?: any) { + return requestClient.get( + '/wms/item-category/list', + { params }, + ); +} + +/** 查询商品分类精简列表 */ +export function getItemCategorySimpleList() { + return requestClient.get( + '/wms/item-category/simple-list', + ); +} + +/** 查询商品分类详情 */ +export function getItemCategory(id: number) { + return requestClient.get( + `/wms/item-category/get?id=${id}`, + ); +} + +/** 新增商品分类 */ +export function createItemCategory(data: WmsItemCategoryApi.ItemCategory) { + return requestClient.post('/wms/item-category/create', data); +} + +/** 修改商品分类 */ +export function updateItemCategory(data: WmsItemCategoryApi.ItemCategory) { + return requestClient.put('/wms/item-category/update', data); +} + +/** 删除商品分类 */ +export function deleteItemCategory(id: number) { + return requestClient.delete(`/wms/item-category/delete?id=${id}`); +} diff --git a/apps/web-ele/src/api/wms/md/item/index.ts b/apps/web-ele/src/api/wms/md/item/index.ts new file mode 100644 index 000000000..fda44706c --- /dev/null +++ b/apps/web-ele/src/api/wms/md/item/index.ts @@ -0,0 +1,61 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import type { WmsItemSkuApi } from './sku'; + +import { requestClient } from '#/api/request'; + +export namespace WmsItemApi { + /** WMS 商品 */ + export interface Item { + id?: number; + code?: string; + name?: string; + categoryId?: number; + categoryName?: string; + unit?: string; + brandId?: number; + brandName?: string; + remark?: string; + skus?: WmsItemSkuApi.ItemSku[]; + createTime?: Date; + } +} + +/** 查询商品分页 */ +export function getItemPage(params: PageParam) { + return requestClient.get>('/wms/item/page', { + params, + }); +} + +/** 查询商品精简列表 */ +export function getItemSimpleList(params?: any) { + return requestClient.get('/wms/item/simple-list', { + params, + }); +} + +/** 查询商品详情 */ +export function getItem(id: number) { + return requestClient.get(`/wms/item/get?id=${id}`); +} + +/** 新增商品 */ +export function createItem(data: WmsItemApi.Item) { + return requestClient.post('/wms/item/create', data); +} + +/** 修改商品 */ +export function updateItem(data: WmsItemApi.Item) { + return requestClient.put('/wms/item/update', data); +} + +/** 删除商品 */ +export function deleteItem(id: number) { + return requestClient.delete(`/wms/item/delete?id=${id}`); +} + +/** 导出商品 */ +export function exportItem(params: any) { + return requestClient.download('/wms/item/export-excel', { params }); +} diff --git a/apps/web-ele/src/api/wms/md/item/sku/index.ts b/apps/web-ele/src/api/wms/md/item/sku/index.ts new file mode 100644 index 000000000..2296becf1 --- /dev/null +++ b/apps/web-ele/src/api/wms/md/item/sku/index.ts @@ -0,0 +1,37 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace WmsItemSkuApi { + /** WMS 商品 SKU */ + export interface ItemSku { + id?: number; + name?: string; + itemId?: number; + itemCode?: string; + itemName?: string; + categoryId?: number; + categoryName?: string; + unit?: string; + brandId?: number; + brandName?: string; + barCode?: string; + code?: string; + length?: number; + width?: number; + height?: number; + grossWeight?: number; + netWeight?: number; + costPrice?: number; + sellingPrice?: number; + createTime?: Date; + } +} + +/** 按 SKU 维度分页(支持商品 / 品牌 / 分类多表联查筛选) */ +export function getItemSkuPage(params: PageParam) { + return requestClient.get>( + '/wms/item-sku/page', + { params }, + ); +} diff --git a/apps/web-ele/src/api/wms/order/check/detail/index.ts b/apps/web-ele/src/api/wms/order/check/detail/index.ts new file mode 100644 index 000000000..ae34b2154 --- /dev/null +++ b/apps/web-ele/src/api/wms/order/check/detail/index.ts @@ -0,0 +1,23 @@ +export namespace WmsCheckOrderDetailApi { + /** WMS 盘库单明细 */ + export interface CheckOrderDetail { + id?: number; + orderId?: number; + itemId?: number; + itemCode?: string; + itemName?: string; + unit?: string; + skuId?: number; + skuCode?: string; + skuName?: string; + inventoryId?: number; + warehouseId?: number; + warehouseName?: string; + receiptTime?: Date; + quantity?: number; + checkQuantity?: number; + availableQuantity?: number; + price?: number; + createTime?: Date; + } +} diff --git a/apps/web-ele/src/api/wms/order/check/index.ts b/apps/web-ele/src/api/wms/order/check/index.ts new file mode 100644 index 000000000..910c997d3 --- /dev/null +++ b/apps/web-ele/src/api/wms/order/check/index.ts @@ -0,0 +1,71 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import type { WmsCheckOrderDetailApi } from './detail'; + +import { requestClient } from '#/api/request'; + +export namespace WmsCheckOrderApi { + /** WMS 盘库单 */ + export interface CheckOrder { + id?: number; + no?: string; + orderTime?: string; + status?: number; + remark?: string; + warehouseId?: number; + warehouseName?: string; + totalQuantity?: number; + totalPrice?: number; + actualPrice?: number; + details?: WmsCheckOrderDetailApi.CheckOrderDetail[]; + createTime?: Date; + creator?: string; + creatorName?: string; + updateTime?: Date; + updater?: string; + updaterName?: string; + } +} + +export function getCheckOrderPage(params: PageParam) { + return requestClient.get>( + '/wms/check-order/page', + { params }, + ); +} + +export function getCheckOrder(id: number) { + return requestClient.get( + `/wms/check-order/get?id=${id}`, + ); +} + +export function getCheckOrderDetailListByOrderId(orderId: number) { + return requestClient.get( + `/wms/check-order-detail/list-by-order-id?orderId=${orderId}`, + ); +} + +export function createCheckOrder(data: WmsCheckOrderApi.CheckOrder) { + return requestClient.post('/wms/check-order/create', data); +} + +export function updateCheckOrder(data: WmsCheckOrderApi.CheckOrder) { + return requestClient.put('/wms/check-order/update', data); +} + +export function completeCheckOrder(id: number) { + return requestClient.put(`/wms/check-order/complete?id=${id}`); +} + +export function cancelCheckOrder(id: number) { + return requestClient.put(`/wms/check-order/cancel?id=${id}`); +} + +export function deleteCheckOrder(id: number) { + return requestClient.delete(`/wms/check-order/delete?id=${id}`); +} + +export function exportCheckOrder(params: any) { + return requestClient.download('/wms/check-order/export-excel', { params }); +} diff --git a/apps/web-ele/src/api/wms/order/movement/detail/index.ts b/apps/web-ele/src/api/wms/order/movement/detail/index.ts new file mode 100644 index 000000000..25a3aec6a --- /dev/null +++ b/apps/web-ele/src/api/wms/order/movement/detail/index.ts @@ -0,0 +1,23 @@ +export namespace WmsMovementOrderDetailApi { + /** WMS 移库单明细 */ + export interface MovementOrderDetail { + id?: number; + orderId?: number; + itemId?: number; + itemCode?: string; + itemName?: string; + unit?: string; + skuId?: number; + skuCode?: string; + skuName?: string; + sourceWarehouseId?: number; + sourceWarehouseName?: string; + targetWarehouseId?: number; + targetWarehouseName?: string; + quantity?: number; + availableQuantity?: number; + price?: number; + totalPrice?: number; + createTime?: Date; + } +} diff --git a/apps/web-ele/src/api/wms/order/movement/index.ts b/apps/web-ele/src/api/wms/order/movement/index.ts new file mode 100644 index 000000000..f6b9e3197 --- /dev/null +++ b/apps/web-ele/src/api/wms/order/movement/index.ts @@ -0,0 +1,72 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import type { WmsMovementOrderDetailApi } from './detail'; + +import { requestClient } from '#/api/request'; + +export namespace WmsMovementOrderApi { + /** WMS 移库单 */ + export interface MovementOrder { + id?: number; + no?: string; + orderTime?: string; + status?: number; + remark?: string; + sourceWarehouseId?: number; + sourceWarehouseName?: string; + targetWarehouseId?: number; + targetWarehouseName?: string; + totalQuantity?: number; + totalPrice?: number; + details?: WmsMovementOrderDetailApi.MovementOrderDetail[]; + createTime?: Date; + creator?: string; + creatorName?: string; + updateTime?: Date; + updater?: string; + updaterName?: string; + } +} + +export function getMovementOrderPage(params: PageParam) { + return requestClient.get>( + '/wms/movement-order/page', + { params }, + ); +} + +export function getMovementOrder(id: number) { + return requestClient.get( + `/wms/movement-order/get?id=${id}`, + ); +} + +export function getMovementOrderDetailListByOrderId(orderId: number) { + return requestClient.get( + `/wms/movement-order-detail/list-by-order-id?orderId=${orderId}`, + ); +} + +export function createMovementOrder(data: WmsMovementOrderApi.MovementOrder) { + return requestClient.post('/wms/movement-order/create', data); +} + +export function updateMovementOrder(data: WmsMovementOrderApi.MovementOrder) { + return requestClient.put('/wms/movement-order/update', data); +} + +export function completeMovementOrder(id: number) { + return requestClient.put(`/wms/movement-order/complete?id=${id}`); +} + +export function cancelMovementOrder(id: number) { + return requestClient.put(`/wms/movement-order/cancel?id=${id}`); +} + +export function deleteMovementOrder(id: number) { + return requestClient.delete(`/wms/movement-order/delete?id=${id}`); +} + +export function exportMovementOrder(params: any) { + return requestClient.download('/wms/movement-order/export-excel', { params }); +} diff --git a/apps/web-ele/src/api/wms/order/receipt/detail/index.ts b/apps/web-ele/src/api/wms/order/receipt/detail/index.ts new file mode 100644 index 000000000..0695c224d --- /dev/null +++ b/apps/web-ele/src/api/wms/order/receipt/detail/index.ts @@ -0,0 +1,20 @@ +export namespace WmsReceiptOrderDetailApi { + /** WMS 入库单明细 */ + export interface ReceiptOrderDetail { + id?: number; + orderId?: number; + itemId?: number; + itemCode?: string; + itemName?: string; + unit?: string; + skuId?: number; + skuCode?: string; + skuName?: string; + warehouseId?: number; + warehouseName?: string; + quantity?: number; + price?: number; + totalPrice?: number; + createTime?: Date; + } +} diff --git a/apps/web-ele/src/api/wms/order/receipt/index.ts b/apps/web-ele/src/api/wms/order/receipt/index.ts new file mode 100644 index 000000000..9c5a08a5e --- /dev/null +++ b/apps/web-ele/src/api/wms/order/receipt/index.ts @@ -0,0 +1,74 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import type { WmsReceiptOrderDetailApi } from './detail'; + +import { requestClient } from '#/api/request'; + +export namespace WmsReceiptOrderApi { + /** WMS 入库单 */ + export interface ReceiptOrder { + id?: number; + no?: string; + type?: number; + orderTime?: string; + status?: number; + bizOrderNo?: string; + merchantId?: number; + merchantName?: string; + remark?: string; + warehouseId?: number; + warehouseName?: string; + totalQuantity?: number; + totalPrice?: number; + details?: WmsReceiptOrderDetailApi.ReceiptOrderDetail[]; + createTime?: Date; + creator?: string; + creatorName?: string; + updateTime?: Date; + updater?: string; + updaterName?: string; + } +} + +export function getReceiptOrderPage(params: PageParam) { + return requestClient.get>( + '/wms/receipt-order/page', + { params }, + ); +} + +export function getReceiptOrder(id: number) { + return requestClient.get( + `/wms/receipt-order/get?id=${id}`, + ); +} + +export function getReceiptOrderDetailListByOrderId(orderId: number) { + return requestClient.get( + `/wms/receipt-order-detail/list-by-order-id?orderId=${orderId}`, + ); +} + +export function createReceiptOrder(data: WmsReceiptOrderApi.ReceiptOrder) { + return requestClient.post('/wms/receipt-order/create', data); +} + +export function updateReceiptOrder(data: WmsReceiptOrderApi.ReceiptOrder) { + return requestClient.put('/wms/receipt-order/update', data); +} + +export function completeReceiptOrder(id: number) { + return requestClient.put(`/wms/receipt-order/complete?id=${id}`); +} + +export function cancelReceiptOrder(id: number) { + return requestClient.put(`/wms/receipt-order/cancel?id=${id}`); +} + +export function deleteReceiptOrder(id: number) { + return requestClient.delete(`/wms/receipt-order/delete?id=${id}`); +} + +export function exportReceiptOrder(params: any) { + return requestClient.download('/wms/receipt-order/export-excel', { params }); +} diff --git a/apps/web-ele/src/api/wms/order/shipment/detail/index.ts b/apps/web-ele/src/api/wms/order/shipment/detail/index.ts new file mode 100644 index 000000000..17e796e18 --- /dev/null +++ b/apps/web-ele/src/api/wms/order/shipment/detail/index.ts @@ -0,0 +1,21 @@ +export namespace WmsShipmentOrderDetailApi { + /** WMS 出库单明细 */ + export interface ShipmentOrderDetail { + id?: number; + orderId?: number; + itemId?: number; + itemCode?: string; + itemName?: string; + unit?: string; + skuId?: number; + skuCode?: string; + skuName?: string; + warehouseId?: number; + warehouseName?: string; + quantity?: number; + availableQuantity?: number; + price?: number; + totalPrice?: number; + createTime?: Date; + } +} diff --git a/apps/web-ele/src/api/wms/order/shipment/index.ts b/apps/web-ele/src/api/wms/order/shipment/index.ts new file mode 100644 index 000000000..b52dcdaca --- /dev/null +++ b/apps/web-ele/src/api/wms/order/shipment/index.ts @@ -0,0 +1,74 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import type { WmsShipmentOrderDetailApi } from './detail'; + +import { requestClient } from '#/api/request'; + +export namespace WmsShipmentOrderApi { + /** WMS 出库单 */ + export interface ShipmentOrder { + id?: number; + no?: string; + type?: number; + orderTime?: string; + status?: number; + bizOrderNo?: string; + merchantId?: number; + merchantName?: string; + remark?: string; + warehouseId?: number; + warehouseName?: string; + totalQuantity?: number; + totalPrice?: number; + details?: WmsShipmentOrderDetailApi.ShipmentOrderDetail[]; + createTime?: Date; + creator?: string; + creatorName?: string; + updateTime?: Date; + updater?: string; + updaterName?: string; + } +} + +export function getShipmentOrderPage(params: PageParam) { + return requestClient.get>( + '/wms/shipment-order/page', + { params }, + ); +} + +export function getShipmentOrder(id: number) { + return requestClient.get( + `/wms/shipment-order/get?id=${id}`, + ); +} + +export function getShipmentOrderDetailListByOrderId(orderId: number) { + return requestClient.get( + `/wms/shipment-order-detail/list-by-order-id?orderId=${orderId}`, + ); +} + +export function createShipmentOrder(data: WmsShipmentOrderApi.ShipmentOrder) { + return requestClient.post('/wms/shipment-order/create', data); +} + +export function updateShipmentOrder(data: WmsShipmentOrderApi.ShipmentOrder) { + return requestClient.put('/wms/shipment-order/update', data); +} + +export function completeShipmentOrder(id: number) { + return requestClient.put(`/wms/shipment-order/complete?id=${id}`); +} + +export function cancelShipmentOrder(id: number) { + return requestClient.put(`/wms/shipment-order/cancel?id=${id}`); +} + +export function deleteShipmentOrder(id: number) { + return requestClient.delete(`/wms/shipment-order/delete?id=${id}`); +} + +export function exportShipmentOrder(params: any) { + return requestClient.download('/wms/shipment-order/export-excel', { params }); +} From bb63ca9541db0f0e7b13c126bc3abe22f816dcc4 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 17 May 2026 16:35:51 +0800 Subject: [PATCH 005/100] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20brand=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wms/md/item/brand/components/index.ts | 1 + .../brand/components/item-brand-select.vue | 85 ++++++++++ .../src/views/wms/md/item/brand/data.ts | 107 +++++++++++++ .../src/views/wms/md/item/brand/index.vue | 145 ++++++++++++++++++ .../views/wms/md/item/brand/modules/form.vue | 89 +++++++++++ .../wms/md/item/brand/components/index.ts | 1 + .../brand/components/item-brand-select.vue | 88 +++++++++++ .../src/views/wms/md/item/brand/data.ts | 107 +++++++++++++ .../src/views/wms/md/item/brand/index.vue | 145 ++++++++++++++++++ .../views/wms/md/item/brand/modules/form.vue | 89 +++++++++++ 10 files changed, 857 insertions(+) create mode 100644 apps/web-antd/src/views/wms/md/item/brand/components/index.ts create mode 100644 apps/web-antd/src/views/wms/md/item/brand/components/item-brand-select.vue create mode 100644 apps/web-antd/src/views/wms/md/item/brand/data.ts create mode 100644 apps/web-antd/src/views/wms/md/item/brand/index.vue create mode 100644 apps/web-antd/src/views/wms/md/item/brand/modules/form.vue create mode 100644 apps/web-ele/src/views/wms/md/item/brand/components/index.ts create mode 100644 apps/web-ele/src/views/wms/md/item/brand/components/item-brand-select.vue create mode 100644 apps/web-ele/src/views/wms/md/item/brand/data.ts create mode 100644 apps/web-ele/src/views/wms/md/item/brand/index.vue create mode 100644 apps/web-ele/src/views/wms/md/item/brand/modules/form.vue diff --git a/apps/web-antd/src/views/wms/md/item/brand/components/index.ts b/apps/web-antd/src/views/wms/md/item/brand/components/index.ts new file mode 100644 index 000000000..98419d2fc --- /dev/null +++ b/apps/web-antd/src/views/wms/md/item/brand/components/index.ts @@ -0,0 +1 @@ +export { default as WmsItemBrandSelect } from './item-brand-select.vue'; diff --git a/apps/web-antd/src/views/wms/md/item/brand/components/item-brand-select.vue b/apps/web-antd/src/views/wms/md/item/brand/components/item-brand-select.vue new file mode 100644 index 000000000..65b240468 --- /dev/null +++ b/apps/web-antd/src/views/wms/md/item/brand/components/item-brand-select.vue @@ -0,0 +1,85 @@ + + + diff --git a/apps/web-antd/src/views/wms/md/item/brand/data.ts b/apps/web-antd/src/views/wms/md/item/brand/data.ts new file mode 100644 index 000000000..5865a1215 --- /dev/null +++ b/apps/web-antd/src/views/wms/md/item/brand/data.ts @@ -0,0 +1,107 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; + +import { h } from 'vue'; + +import { Button } from 'ant-design-vue'; + +import { z } from '#/adapter/form'; +import { generateWmsCode } from '#/views/wms/utils/constants'; + +/** 新增/修改商品品牌的表单 */ +export function useFormSchema(formApi?: any): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '品牌编号', + component: 'Input', + componentProps: { + maxLength: 20, + placeholder: '请输入品牌编号', + }, + rules: z.string().min(1, '品牌编号不能为空').max(20), + suffix: () => { + return h( + Button, + { + type: 'default', + onClick: () => { + formApi?.setFieldValue('code', generateWmsCode('B')); + }, + }, + { default: () => '生成' }, + ); + }, + }, + { + fieldName: 'name', + label: '品牌名称', + component: 'Input', + componentProps: { + maxLength: 30, + placeholder: '请输入品牌名称', + }, + rules: z.string().min(1, '品牌名称不能为空').max(30), + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '品牌编号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入品牌编号', + }, + }, + { + fieldName: 'name', + label: '品牌名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入品牌名称', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '品牌编号', + width: 160, + }, + { + field: 'name', + title: '品牌名称', + minWidth: 160, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antd/src/views/wms/md/item/brand/index.vue b/apps/web-antd/src/views/wms/md/item/brand/index.vue new file mode 100644 index 000000000..867620990 --- /dev/null +++ b/apps/web-antd/src/views/wms/md/item/brand/index.vue @@ -0,0 +1,145 @@ + + + diff --git a/apps/web-antd/src/views/wms/md/item/brand/modules/form.vue b/apps/web-antd/src/views/wms/md/item/brand/modules/form.vue new file mode 100644 index 000000000..8b69b50be --- /dev/null +++ b/apps/web-antd/src/views/wms/md/item/brand/modules/form.vue @@ -0,0 +1,89 @@ + + + diff --git a/apps/web-ele/src/views/wms/md/item/brand/components/index.ts b/apps/web-ele/src/views/wms/md/item/brand/components/index.ts new file mode 100644 index 000000000..98419d2fc --- /dev/null +++ b/apps/web-ele/src/views/wms/md/item/brand/components/index.ts @@ -0,0 +1 @@ +export { default as WmsItemBrandSelect } from './item-brand-select.vue'; diff --git a/apps/web-ele/src/views/wms/md/item/brand/components/item-brand-select.vue b/apps/web-ele/src/views/wms/md/item/brand/components/item-brand-select.vue new file mode 100644 index 000000000..0c90835ae --- /dev/null +++ b/apps/web-ele/src/views/wms/md/item/brand/components/item-brand-select.vue @@ -0,0 +1,88 @@ + + + diff --git a/apps/web-ele/src/views/wms/md/item/brand/data.ts b/apps/web-ele/src/views/wms/md/item/brand/data.ts new file mode 100644 index 000000000..cebea33e7 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/item/brand/data.ts @@ -0,0 +1,107 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; + +import { h } from 'vue'; + +import { ElButton } from 'element-plus'; + +import { z } from '#/adapter/form'; +import { generateWmsCode } from '#/views/wms/utils/constants'; + +/** 新增/修改商品品牌的表单 */ +export function useFormSchema(formApi?: any): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '品牌编号', + component: 'Input', + componentProps: { + maxLength: 20, + placeholder: '请输入品牌编号', + }, + rules: z.string().min(1, '品牌编号不能为空').max(20), + suffix: () => { + return h( + ElButton, + { + type: 'default', + onClick: () => { + formApi?.setFieldValue('code', generateWmsCode('B')); + }, + }, + { default: () => '生成' }, + ); + }, + }, + { + fieldName: 'name', + label: '品牌名称', + component: 'Input', + componentProps: { + maxLength: 30, + placeholder: '请输入品牌名称', + }, + rules: z.string().min(1, '品牌名称不能为空').max(30), + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '品牌编号', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入品牌编号', + }, + }, + { + fieldName: 'name', + label: '品牌名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入品牌名称', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '品牌编号', + width: 160, + }, + { + field: 'name', + title: '品牌名称', + minWidth: 160, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-ele/src/views/wms/md/item/brand/index.vue b/apps/web-ele/src/views/wms/md/item/brand/index.vue new file mode 100644 index 000000000..65966fb05 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/item/brand/index.vue @@ -0,0 +1,145 @@ + + + diff --git a/apps/web-ele/src/views/wms/md/item/brand/modules/form.vue b/apps/web-ele/src/views/wms/md/item/brand/modules/form.vue new file mode 100644 index 000000000..2630f0493 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/item/brand/modules/form.vue @@ -0,0 +1,89 @@ + + + From 0163794e3f47d5423ef2ed01a49978726f06c020 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 17 May 2026 16:47:27 +0800 Subject: [PATCH 006/100] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20category=20=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wms/md/item/category/components/index.ts | 2 + .../components/item-category-select.vue | 68 +++++++ .../components/item-category-tree.vue | 123 ++++++++++++ .../src/views/wms/md/item/category/data.ts | 187 ++++++++++++++++++ .../wms/md/item/category/modules/form.vue | 102 ++++++++++ .../wms/md/item/category/components/index.ts | 2 + .../components/item-category-select.vue | 69 +++++++ .../components/item-category-tree.vue | 124 ++++++++++++ .../src/views/wms/md/item/category/data.ts | 186 +++++++++++++++++ .../src/views/wms/md/item/category/index.vue | 163 +++++++++++++++ .../wms/md/item/category/modules/form.vue | 102 ++++++++++ 11 files changed, 1128 insertions(+) create mode 100644 apps/web-antd/src/views/wms/md/item/category/components/index.ts create mode 100644 apps/web-antd/src/views/wms/md/item/category/components/item-category-select.vue create mode 100644 apps/web-antd/src/views/wms/md/item/category/components/item-category-tree.vue create mode 100644 apps/web-antd/src/views/wms/md/item/category/data.ts create mode 100644 apps/web-antd/src/views/wms/md/item/category/modules/form.vue create mode 100644 apps/web-ele/src/views/wms/md/item/category/components/index.ts create mode 100644 apps/web-ele/src/views/wms/md/item/category/components/item-category-select.vue create mode 100644 apps/web-ele/src/views/wms/md/item/category/components/item-category-tree.vue create mode 100644 apps/web-ele/src/views/wms/md/item/category/data.ts create mode 100644 apps/web-ele/src/views/wms/md/item/category/index.vue create mode 100644 apps/web-ele/src/views/wms/md/item/category/modules/form.vue diff --git a/apps/web-antd/src/views/wms/md/item/category/components/index.ts b/apps/web-antd/src/views/wms/md/item/category/components/index.ts new file mode 100644 index 000000000..13cd052aa --- /dev/null +++ b/apps/web-antd/src/views/wms/md/item/category/components/index.ts @@ -0,0 +1,2 @@ +export { default as WmsItemCategorySelect } from './item-category-select.vue'; +export { default as WmsItemCategoryTree } from './item-category-tree.vue'; diff --git a/apps/web-antd/src/views/wms/md/item/category/components/item-category-select.vue b/apps/web-antd/src/views/wms/md/item/category/components/item-category-select.vue new file mode 100644 index 000000000..3a14eb00f --- /dev/null +++ b/apps/web-antd/src/views/wms/md/item/category/components/item-category-select.vue @@ -0,0 +1,68 @@ + + + diff --git a/apps/web-antd/src/views/wms/md/item/category/components/item-category-tree.vue b/apps/web-antd/src/views/wms/md/item/category/components/item-category-tree.vue new file mode 100644 index 000000000..50635802a --- /dev/null +++ b/apps/web-antd/src/views/wms/md/item/category/components/item-category-tree.vue @@ -0,0 +1,123 @@ + + + diff --git a/apps/web-antd/src/views/wms/md/item/category/data.ts b/apps/web-antd/src/views/wms/md/item/category/data.ts new file mode 100644 index 000000000..12169a006 --- /dev/null +++ b/apps/web-antd/src/views/wms/md/item/category/data.ts @@ -0,0 +1,187 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { WmsItemCategoryApi } from '#/api/wms/md/item/category'; + +import { h } from 'vue'; + +import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; +import { handleTree } from '@vben/utils'; + +import { Button } from 'ant-design-vue'; + +import { z } from '#/adapter/form'; +import { getItemCategorySimpleList } from '#/api/wms/md/item/category'; +import { generateWmsCode } from '#/views/wms/utils/constants'; + +/** 新增/修改商品分类的表单 */ +export function useFormSchema(formApi?: any): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'parentId', + label: '上级分类', + component: 'ApiTreeSelect', + componentProps: { + allowClear: true, + api: async () => { + const data = await getItemCategorySimpleList(); + return [ + { + id: 0, + name: '顶级分类', + children: handleTree(data), + }, + ]; + }, + childrenField: 'children', + labelField: 'name', + placeholder: '请选择上级分类', + treeDefaultExpandAll: true, + treeNodeFilterProp: 'name', + valueField: 'id', + }, + rules: 'selectRequired', + }, + { + fieldName: 'code', + label: '分类编号', + component: 'Input', + componentProps: { + maxLength: 20, + placeholder: '请输入分类编号', + }, + rules: z.string().min(1, '分类编号不能为空').max(20), + suffix: () => { + return h( + Button, + { + type: 'default', + onClick: () => { + formApi?.setFieldValue('code', generateWmsCode('C')); + }, + }, + { default: () => '生成' }, + ); + }, + }, + { + fieldName: 'name', + label: '分类名称', + component: 'Input', + componentProps: { + placeholder: '请输入分类名称', + }, + rules: 'required', + }, + { + fieldName: 'sort', + label: '显示排序', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + }, + rules: z.number().default(0), + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '分类编号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入分类编号', + }, + }, + { + fieldName: 'name', + label: '分类名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入分类名称', + }, + }, + { + fieldName: 'status', + label: '分类状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择分类状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'name', + title: '分类名称', + minWidth: 200, + align: 'left', + treeNode: true, + }, + { + field: 'code', + title: '分类编号', + width: 160, + align: 'center', + }, + { + field: 'sort', + title: '排序', + width: 120, + align: 'center', + }, + { + field: 'status', + title: '状态', + width: 120, + align: 'center', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 240, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antd/src/views/wms/md/item/category/modules/form.vue b/apps/web-antd/src/views/wms/md/item/category/modules/form.vue new file mode 100644 index 000000000..ba32854e5 --- /dev/null +++ b/apps/web-antd/src/views/wms/md/item/category/modules/form.vue @@ -0,0 +1,102 @@ + + + diff --git a/apps/web-ele/src/views/wms/md/item/category/components/index.ts b/apps/web-ele/src/views/wms/md/item/category/components/index.ts new file mode 100644 index 000000000..13cd052aa --- /dev/null +++ b/apps/web-ele/src/views/wms/md/item/category/components/index.ts @@ -0,0 +1,2 @@ +export { default as WmsItemCategorySelect } from './item-category-select.vue'; +export { default as WmsItemCategoryTree } from './item-category-tree.vue'; diff --git a/apps/web-ele/src/views/wms/md/item/category/components/item-category-select.vue b/apps/web-ele/src/views/wms/md/item/category/components/item-category-select.vue new file mode 100644 index 000000000..e396ce127 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/item/category/components/item-category-select.vue @@ -0,0 +1,69 @@ + + + diff --git a/apps/web-ele/src/views/wms/md/item/category/components/item-category-tree.vue b/apps/web-ele/src/views/wms/md/item/category/components/item-category-tree.vue new file mode 100644 index 000000000..365609772 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/item/category/components/item-category-tree.vue @@ -0,0 +1,124 @@ + + + diff --git a/apps/web-ele/src/views/wms/md/item/category/data.ts b/apps/web-ele/src/views/wms/md/item/category/data.ts new file mode 100644 index 000000000..e6e536434 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/item/category/data.ts @@ -0,0 +1,186 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { WmsItemCategoryApi } from '#/api/wms/md/item/category'; + +import { h } from 'vue'; + +import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; +import { handleTree } from '@vben/utils'; + +import { ElButton } from 'element-plus'; + +import { z } from '#/adapter/form'; +import { getItemCategorySimpleList } from '#/api/wms/md/item/category'; +import { generateWmsCode } from '#/views/wms/utils/constants'; + +/** 新增/修改商品分类的表单 */ +export function useFormSchema(formApi?: any): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'parentId', + label: '上级分类', + component: 'ApiTreeSelect', + componentProps: { + clearable: true, + api: async () => { + const data = await getItemCategorySimpleList(); + return [ + { + id: 0, + name: '顶级分类', + children: handleTree(data), + }, + ]; + }, + checkStrictly: true, + childrenField: 'children', + defaultExpandAll: true, + labelField: 'name', + placeholder: '请选择上级分类', + valueField: 'id', + }, + rules: 'selectRequired', + }, + { + fieldName: 'code', + label: '分类编号', + component: 'Input', + componentProps: { + maxLength: 20, + placeholder: '请输入分类编号', + }, + rules: z.string().min(1, '分类编号不能为空').max(20), + suffix: () => { + return h( + ElButton, + { + type: 'default', + onClick: () => { + formApi?.setFieldValue('code', generateWmsCode('C')); + }, + }, + { default: () => '生成' }, + ); + }, + }, + { + fieldName: 'name', + label: '分类名称', + component: 'Input', + componentProps: { + placeholder: '请输入分类名称', + }, + rules: 'required', + }, + { + fieldName: 'sort', + label: '显示排序', + component: 'InputNumber', + componentProps: { + class: '!w-full', + controlsPosition: 'right', + min: 0, + }, + rules: z.number().default(0), + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '分类编号', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入分类编号', + }, + }, + { + fieldName: 'name', + label: '分类名称', + component: 'Input', + componentProps: { + clearable: true, + placeholder: '请输入分类名称', + }, + }, + { + fieldName: 'status', + label: '分类状态', + component: 'Select', + componentProps: { + clearable: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择分类状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'name', + title: '分类名称', + minWidth: 200, + align: 'left', + treeNode: true, + }, + { + field: 'code', + title: '分类编号', + width: 160, + align: 'center', + }, + { + field: 'sort', + title: '排序', + width: 120, + align: 'center', + }, + { + field: 'status', + title: '状态', + width: 120, + align: 'center', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 240, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-ele/src/views/wms/md/item/category/index.vue b/apps/web-ele/src/views/wms/md/item/category/index.vue new file mode 100644 index 000000000..e80f57815 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/item/category/index.vue @@ -0,0 +1,163 @@ + + + diff --git a/apps/web-ele/src/views/wms/md/item/category/modules/form.vue b/apps/web-ele/src/views/wms/md/item/category/modules/form.vue new file mode 100644 index 000000000..62bb829b6 --- /dev/null +++ b/apps/web-ele/src/views/wms/md/item/category/modules/form.vue @@ -0,0 +1,102 @@ + + + From 735ff018be971e379ba1206f92103ca00f7156e8 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 17 May 2026 17:48:53 +0800 Subject: [PATCH 007/100] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20home=20=E7=BB=9F=E8=AE=A1=E7=9A=84?= =?UTF-8?q?=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/views/wms/home/index.vue | 72 +++++++++++ .../wms-home-inventory-chart-options.ts | 112 ++++++++++++++++++ .../modules/wms-home-inventory-charts.vue | 105 ++++++++++++++++ .../modules/wms-home-order-summary-cards.vue | 78 ++++++++++++ .../wms-home-order-trend-chart-options.ts | 91 ++++++++++++++ .../modules/wms-home-order-trend-chart.vue | 73 ++++++++++++ apps/web-ele/src/views/wms/home/index.vue | 72 +++++++++++ .../wms-home-inventory-chart-options.ts | 112 ++++++++++++++++++ .../modules/wms-home-inventory-charts.vue | 105 ++++++++++++++++ .../modules/wms-home-order-summary-cards.vue | 78 ++++++++++++ .../wms-home-order-trend-chart-options.ts | 91 ++++++++++++++ .../modules/wms-home-order-trend-chart.vue | 73 ++++++++++++ apps/web-ele/src/views/wms/utils/constants.ts | 35 ++++++ packages/constants/src/dict-enum.ts | 10 ++ 14 files changed, 1107 insertions(+) create mode 100644 apps/web-antd/src/views/wms/home/index.vue create mode 100644 apps/web-antd/src/views/wms/home/modules/wms-home-inventory-chart-options.ts create mode 100644 apps/web-antd/src/views/wms/home/modules/wms-home-inventory-charts.vue create mode 100644 apps/web-antd/src/views/wms/home/modules/wms-home-order-summary-cards.vue create mode 100644 apps/web-antd/src/views/wms/home/modules/wms-home-order-trend-chart-options.ts create mode 100644 apps/web-antd/src/views/wms/home/modules/wms-home-order-trend-chart.vue create mode 100644 apps/web-ele/src/views/wms/home/index.vue create mode 100644 apps/web-ele/src/views/wms/home/modules/wms-home-inventory-chart-options.ts create mode 100644 apps/web-ele/src/views/wms/home/modules/wms-home-inventory-charts.vue create mode 100644 apps/web-ele/src/views/wms/home/modules/wms-home-order-summary-cards.vue create mode 100644 apps/web-ele/src/views/wms/home/modules/wms-home-order-trend-chart-options.ts create mode 100644 apps/web-ele/src/views/wms/home/modules/wms-home-order-trend-chart.vue diff --git a/apps/web-antd/src/views/wms/home/index.vue b/apps/web-antd/src/views/wms/home/index.vue new file mode 100644 index 000000000..85c81d497 --- /dev/null +++ b/apps/web-antd/src/views/wms/home/index.vue @@ -0,0 +1,72 @@ + + + diff --git a/apps/web-antd/src/views/wms/home/modules/wms-home-inventory-chart-options.ts b/apps/web-antd/src/views/wms/home/modules/wms-home-inventory-chart-options.ts new file mode 100644 index 000000000..3998f40b5 --- /dev/null +++ b/apps/web-antd/src/views/wms/home/modules/wms-home-inventory-chart-options.ts @@ -0,0 +1,112 @@ +import type { WmsHomeStatisticsApi } from '#/api/wms/home'; + +import { formatQuantity } from '#/views/wms/utils/format'; + +export interface InventoryChartItem { + name: string; + value: number; +} + +/** 格式化库存数量展示文本 */ +export function formatQuantityText(value?: number) { + return formatQuantity(value || 0) || '0.00'; +} + +/** 转换库存排行接口数据为 ECharts 可消费的 name/value 数据 */ +export function buildInventoryChartItemList( + list: undefined | WmsHomeStatisticsApi.InventoryRankItem[], + emptyName: string, +) { + return (list || []) + .map((item) => ({ + name: item.name || emptyName, + value: Number(item.quantity || 0), + })) + .filter((item) => item.value > 0); +} + +/** 格式化货物占比图例,补充当前商品库存占比 */ +function formatGoodsLegend(name: string, goodsShareList: InventoryChartItem[]) { + const total = goodsShareList.reduce((sum, item) => sum + item.value, 0); + const item = goodsShareList.find((goods) => goods.name === name); + if (!total || !item) { + return name; + } + return `${name} ${((item.value / total) * 100).toFixed(1)}%`; +} + +/** 货物占比图表配置 */ +export function getGoodsShareChartOptions(goodsShareList: InventoryChartItem[]): any { + return { + color: ['#2f7df6', '#18a058', '#f59e0b', '#7c3aed', '#14b8a6'], + legend: { + formatter: (name: string) => formatGoodsLegend(name, goodsShareList), + itemHeight: 10, + itemWidth: 10, + orient: 'vertical', + right: 10, + top: 'middle', + type: 'scroll', + }, + series: [ + { + avoidLabelOverlap: true, + center: ['34%', '52%'], + data: goodsShareList, + label: { show: false }, + labelLine: { show: false }, + name: '货物占比', + radius: ['48%', '70%'], + type: 'pie', + }, + ], + tooltip: { + formatter: '{b}
库存:{c} ({d}%)', + trigger: 'item', + }, + }; +} + +/** 库存分布图表配置 */ +export function getWarehouseDistributionChartOptions( + warehouseDistributionList: InventoryChartItem[], +): any { + const sortedList = warehouseDistributionList.toReversed(); + return { + color: ['#2f7df6'], + grid: { bottom: 16, containLabel: true, left: 24, right: 40, top: 12 }, + series: [ + { + barMaxWidth: 16, + data: sortedList.map((item) => item.value), + label: { + formatter: ({ value }: { value?: number }) => formatQuantityText(Number(value || 0)), + position: 'right', + show: true, + }, + name: '库存', + type: 'bar', + }, + ], + tooltip: { + formatter: (params: unknown) => { + const item = (Array.isArray(params) ? params[0] : params) as { + name?: string; + value?: number; + }; + return `${item.name || '-'}
库存:${formatQuantityText(item.value)}`; + }, + trigger: 'axis', + }, + xAxis: { + splitLine: { lineStyle: { color: '#eef2f7' } }, + type: 'value', + }, + yAxis: { + axisLine: { show: false }, + axisTick: { show: false }, + data: sortedList.map((item) => item.name), + type: 'category', + }, + }; +} diff --git a/apps/web-antd/src/views/wms/home/modules/wms-home-inventory-charts.vue b/apps/web-antd/src/views/wms/home/modules/wms-home-inventory-charts.vue new file mode 100644 index 000000000..6f2d333c3 --- /dev/null +++ b/apps/web-antd/src/views/wms/home/modules/wms-home-inventory-charts.vue @@ -0,0 +1,105 @@ + + + diff --git a/apps/web-antd/src/views/wms/home/modules/wms-home-order-summary-cards.vue b/apps/web-antd/src/views/wms/home/modules/wms-home-order-summary-cards.vue new file mode 100644 index 000000000..2f2ae0bec --- /dev/null +++ b/apps/web-antd/src/views/wms/home/modules/wms-home-order-summary-cards.vue @@ -0,0 +1,78 @@ + + + diff --git a/apps/web-antd/src/views/wms/home/modules/wms-home-order-trend-chart-options.ts b/apps/web-antd/src/views/wms/home/modules/wms-home-order-trend-chart-options.ts new file mode 100644 index 000000000..474e6d648 --- /dev/null +++ b/apps/web-antd/src/views/wms/home/modules/wms-home-order-trend-chart-options.ts @@ -0,0 +1,91 @@ +import type { WmsHomeStatisticsApi } from '#/api/wms/home'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictLabel } from '@vben/hooks'; +import { formatDate } from '@vben/utils'; + +interface OrderDefinition { + color: string; + title: string; + trendField: keyof Pick< + WmsHomeStatisticsApi.OrderTrend, + 'checkCount' | 'movementCount' | 'receiptCount' | 'shipmentCount' + >; + type: number; +} + +const OrderTypeEnum = { + CHECK: 4, + MOVEMENT: 3, + RECEIPT: 1, + SHIPMENT: 2, +} as const; + +/** 获取 WMS 单据类型标题,用于消除字典里的“单”后缀 */ +function getOrderTypeTitle(type: number, defaultTitle: string) { + const label = getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, type) || defaultTitle; + return label.endsWith('单') ? label.slice(0, -1) : label; +} + +const orderDefinitions: OrderDefinition[] = [ + { + color: '#2f7df6', + title: getOrderTypeTitle(OrderTypeEnum.RECEIPT, '入库'), + trendField: 'receiptCount', + type: OrderTypeEnum.RECEIPT, + }, + { + color: '#18a058', + title: getOrderTypeTitle(OrderTypeEnum.SHIPMENT, '出库'), + trendField: 'shipmentCount', + type: OrderTypeEnum.SHIPMENT, + }, + { + color: '#f59e0b', + title: getOrderTypeTitle(OrderTypeEnum.MOVEMENT, '移库'), + trendField: 'movementCount', + type: OrderTypeEnum.MOVEMENT, + }, + { + color: '#7c3aed', + title: getOrderTypeTitle(OrderTypeEnum.CHECK, '盘库'), + trendField: 'checkCount', + type: OrderTypeEnum.CHECK, + }, +]; + +/** 格式化趋势接口返回的时间戳为图表横轴日期 */ +function formatTrendTime(time: number | string) { + const date = new Date(time); + return Number.isNaN(date.getTime()) ? `${time}` : (formatDate(date, 'MM-DD') as string); +} + +/** 单据趋势图表配置 */ +export function getOrderTrendChartOptions(list: WmsHomeStatisticsApi.OrderTrend[]): any { + const labels = list.map((item) => formatTrendTime(item.time)); + return { + color: orderDefinitions.map((item) => item.color), + grid: { bottom: 24, containLabel: true, left: 28, right: 24, top: 48 }, + legend: { itemHeight: 10, itemWidth: 10, top: 6 }, + series: orderDefinitions.map((item) => ({ + barMaxWidth: 18, + data: list.map((row) => Number(row[item.trendField] || 0)), + emphasis: { focus: 'series' }, + name: item.title, + type: 'bar', + })), + tooltip: { axisPointer: { type: 'shadow' }, trigger: 'axis' }, + xAxis: { + axisLine: { lineStyle: { color: '#dcdfe6' } }, + axisTick: { show: false }, + data: labels, + type: 'category', + }, + yAxis: { + minInterval: 1, + name: '单据数', + splitLine: { lineStyle: { color: '#eef2f7' } }, + type: 'value', + }, + }; +} diff --git a/apps/web-antd/src/views/wms/home/modules/wms-home-order-trend-chart.vue b/apps/web-antd/src/views/wms/home/modules/wms-home-order-trend-chart.vue new file mode 100644 index 000000000..b24608233 --- /dev/null +++ b/apps/web-antd/src/views/wms/home/modules/wms-home-order-trend-chart.vue @@ -0,0 +1,73 @@ + + + diff --git a/apps/web-ele/src/views/wms/home/index.vue b/apps/web-ele/src/views/wms/home/index.vue new file mode 100644 index 000000000..eab446b6a --- /dev/null +++ b/apps/web-ele/src/views/wms/home/index.vue @@ -0,0 +1,72 @@ + + + diff --git a/apps/web-ele/src/views/wms/home/modules/wms-home-inventory-chart-options.ts b/apps/web-ele/src/views/wms/home/modules/wms-home-inventory-chart-options.ts new file mode 100644 index 000000000..3998f40b5 --- /dev/null +++ b/apps/web-ele/src/views/wms/home/modules/wms-home-inventory-chart-options.ts @@ -0,0 +1,112 @@ +import type { WmsHomeStatisticsApi } from '#/api/wms/home'; + +import { formatQuantity } from '#/views/wms/utils/format'; + +export interface InventoryChartItem { + name: string; + value: number; +} + +/** 格式化库存数量展示文本 */ +export function formatQuantityText(value?: number) { + return formatQuantity(value || 0) || '0.00'; +} + +/** 转换库存排行接口数据为 ECharts 可消费的 name/value 数据 */ +export function buildInventoryChartItemList( + list: undefined | WmsHomeStatisticsApi.InventoryRankItem[], + emptyName: string, +) { + return (list || []) + .map((item) => ({ + name: item.name || emptyName, + value: Number(item.quantity || 0), + })) + .filter((item) => item.value > 0); +} + +/** 格式化货物占比图例,补充当前商品库存占比 */ +function formatGoodsLegend(name: string, goodsShareList: InventoryChartItem[]) { + const total = goodsShareList.reduce((sum, item) => sum + item.value, 0); + const item = goodsShareList.find((goods) => goods.name === name); + if (!total || !item) { + return name; + } + return `${name} ${((item.value / total) * 100).toFixed(1)}%`; +} + +/** 货物占比图表配置 */ +export function getGoodsShareChartOptions(goodsShareList: InventoryChartItem[]): any { + return { + color: ['#2f7df6', '#18a058', '#f59e0b', '#7c3aed', '#14b8a6'], + legend: { + formatter: (name: string) => formatGoodsLegend(name, goodsShareList), + itemHeight: 10, + itemWidth: 10, + orient: 'vertical', + right: 10, + top: 'middle', + type: 'scroll', + }, + series: [ + { + avoidLabelOverlap: true, + center: ['34%', '52%'], + data: goodsShareList, + label: { show: false }, + labelLine: { show: false }, + name: '货物占比', + radius: ['48%', '70%'], + type: 'pie', + }, + ], + tooltip: { + formatter: '{b}
库存:{c} ({d}%)', + trigger: 'item', + }, + }; +} + +/** 库存分布图表配置 */ +export function getWarehouseDistributionChartOptions( + warehouseDistributionList: InventoryChartItem[], +): any { + const sortedList = warehouseDistributionList.toReversed(); + return { + color: ['#2f7df6'], + grid: { bottom: 16, containLabel: true, left: 24, right: 40, top: 12 }, + series: [ + { + barMaxWidth: 16, + data: sortedList.map((item) => item.value), + label: { + formatter: ({ value }: { value?: number }) => formatQuantityText(Number(value || 0)), + position: 'right', + show: true, + }, + name: '库存', + type: 'bar', + }, + ], + tooltip: { + formatter: (params: unknown) => { + const item = (Array.isArray(params) ? params[0] : params) as { + name?: string; + value?: number; + }; + return `${item.name || '-'}
库存:${formatQuantityText(item.value)}`; + }, + trigger: 'axis', + }, + xAxis: { + splitLine: { lineStyle: { color: '#eef2f7' } }, + type: 'value', + }, + yAxis: { + axisLine: { show: false }, + axisTick: { show: false }, + data: sortedList.map((item) => item.name), + type: 'category', + }, + }; +} diff --git a/apps/web-ele/src/views/wms/home/modules/wms-home-inventory-charts.vue b/apps/web-ele/src/views/wms/home/modules/wms-home-inventory-charts.vue new file mode 100644 index 000000000..6f2d333c3 --- /dev/null +++ b/apps/web-ele/src/views/wms/home/modules/wms-home-inventory-charts.vue @@ -0,0 +1,105 @@ + + + diff --git a/apps/web-ele/src/views/wms/home/modules/wms-home-order-summary-cards.vue b/apps/web-ele/src/views/wms/home/modules/wms-home-order-summary-cards.vue new file mode 100644 index 000000000..2f2ae0bec --- /dev/null +++ b/apps/web-ele/src/views/wms/home/modules/wms-home-order-summary-cards.vue @@ -0,0 +1,78 @@ + + + diff --git a/apps/web-ele/src/views/wms/home/modules/wms-home-order-trend-chart-options.ts b/apps/web-ele/src/views/wms/home/modules/wms-home-order-trend-chart-options.ts new file mode 100644 index 000000000..474e6d648 --- /dev/null +++ b/apps/web-ele/src/views/wms/home/modules/wms-home-order-trend-chart-options.ts @@ -0,0 +1,91 @@ +import type { WmsHomeStatisticsApi } from '#/api/wms/home'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictLabel } from '@vben/hooks'; +import { formatDate } from '@vben/utils'; + +interface OrderDefinition { + color: string; + title: string; + trendField: keyof Pick< + WmsHomeStatisticsApi.OrderTrend, + 'checkCount' | 'movementCount' | 'receiptCount' | 'shipmentCount' + >; + type: number; +} + +const OrderTypeEnum = { + CHECK: 4, + MOVEMENT: 3, + RECEIPT: 1, + SHIPMENT: 2, +} as const; + +/** 获取 WMS 单据类型标题,用于消除字典里的“单”后缀 */ +function getOrderTypeTitle(type: number, defaultTitle: string) { + const label = getDictLabel(DICT_TYPE.WMS_ORDER_TYPE, type) || defaultTitle; + return label.endsWith('单') ? label.slice(0, -1) : label; +} + +const orderDefinitions: OrderDefinition[] = [ + { + color: '#2f7df6', + title: getOrderTypeTitle(OrderTypeEnum.RECEIPT, '入库'), + trendField: 'receiptCount', + type: OrderTypeEnum.RECEIPT, + }, + { + color: '#18a058', + title: getOrderTypeTitle(OrderTypeEnum.SHIPMENT, '出库'), + trendField: 'shipmentCount', + type: OrderTypeEnum.SHIPMENT, + }, + { + color: '#f59e0b', + title: getOrderTypeTitle(OrderTypeEnum.MOVEMENT, '移库'), + trendField: 'movementCount', + type: OrderTypeEnum.MOVEMENT, + }, + { + color: '#7c3aed', + title: getOrderTypeTitle(OrderTypeEnum.CHECK, '盘库'), + trendField: 'checkCount', + type: OrderTypeEnum.CHECK, + }, +]; + +/** 格式化趋势接口返回的时间戳为图表横轴日期 */ +function formatTrendTime(time: number | string) { + const date = new Date(time); + return Number.isNaN(date.getTime()) ? `${time}` : (formatDate(date, 'MM-DD') as string); +} + +/** 单据趋势图表配置 */ +export function getOrderTrendChartOptions(list: WmsHomeStatisticsApi.OrderTrend[]): any { + const labels = list.map((item) => formatTrendTime(item.time)); + return { + color: orderDefinitions.map((item) => item.color), + grid: { bottom: 24, containLabel: true, left: 28, right: 24, top: 48 }, + legend: { itemHeight: 10, itemWidth: 10, top: 6 }, + series: orderDefinitions.map((item) => ({ + barMaxWidth: 18, + data: list.map((row) => Number(row[item.trendField] || 0)), + emphasis: { focus: 'series' }, + name: item.title, + type: 'bar', + })), + tooltip: { axisPointer: { type: 'shadow' }, trigger: 'axis' }, + xAxis: { + axisLine: { lineStyle: { color: '#dcdfe6' } }, + axisTick: { show: false }, + data: labels, + type: 'category', + }, + yAxis: { + minInterval: 1, + name: '单据数', + splitLine: { lineStyle: { color: '#eef2f7' } }, + type: 'value', + }, + }; +} diff --git a/apps/web-ele/src/views/wms/home/modules/wms-home-order-trend-chart.vue b/apps/web-ele/src/views/wms/home/modules/wms-home-order-trend-chart.vue new file mode 100644 index 000000000..b24608233 --- /dev/null +++ b/apps/web-ele/src/views/wms/home/modules/wms-home-order-trend-chart.vue @@ -0,0 +1,73 @@ + + + diff --git a/apps/web-ele/src/views/wms/utils/constants.ts b/apps/web-ele/src/views/wms/utils/constants.ts index b7d8166cc..a72929881 100644 --- a/apps/web-ele/src/views/wms/utils/constants.ts +++ b/apps/web-ele/src/views/wms/utils/constants.ts @@ -1,3 +1,38 @@ +/** 单据状态枚举 */ +export const OrderStatusEnum = { + PREPARE: 0, // 草稿 + FINISHED: 4, // 已完成 + CANCELED: 5, // 已作废 +} as const; + +/** 可修改的单据状态 */ +export const OrderUpdateStatusList: number[] = [OrderStatusEnum.PREPARE]; + +/** 可删除的单据状态 */ +export const OrderDeleteStatusList: number[] = [ + OrderStatusEnum.PREPARE, + OrderStatusEnum.CANCELED, +]; + +/** 往来企业类型枚举 */ +export const MerchantTypeEnum = { + CUSTOMER: 1, // 客户 + SUPPLIER: 2, // 供应商 + CUSTOMER_SUPPLIER: 3, // 客户/供应商 +} as const; + +/** 供应商类型的往来企业 */ +export const SupplierMerchantTypeList = [ + MerchantTypeEnum.SUPPLIER, + MerchantTypeEnum.CUSTOMER_SUPPLIER, +]; + +/** 客户类型的往来企业 */ +export const CustomerMerchantTypeList = [ + MerchantTypeEnum.CUSTOMER, + MerchantTypeEnum.CUSTOMER_SUPPLIER, +]; + /** * 生成 WMS 编号 / 条码。 * diff --git a/packages/constants/src/dict-enum.ts b/packages/constants/src/dict-enum.ts index e9477615b..ed93cf9fb 100644 --- a/packages/constants/src/dict-enum.ts +++ b/packages/constants/src/dict-enum.ts @@ -175,6 +175,15 @@ const IOT_DICT = { IOT_MODBUS_FRAME_FORMAT: 'iot_modbus_frame_format', // IoT Modbus 帧格式 } as const; +/** ========== WMS - 仓储管理模块 ========== */ +const WMS_DICT = { + WMS_MERCHANT_TYPE: 'merchant_type', // WMS 往来企业类型 + WMS_ORDER_TYPE: 'wms_order_type', // WMS 单据类型 + WMS_ORDER_STATUS: 'wms_order_status', // WMS 单据状态 + WMS_RECEIPT_ORDER_TYPE: 'wms_receipt_order_type', // WMS 入库单类型 + WMS_SHIPMENT_ORDER_TYPE: 'wms_shipment_order_type', // WMS 出库单类型 +} as const; + /** 字典类型枚举 - 统一导出 */ const DICT_TYPE = { ...AI_DICT, @@ -183,6 +192,7 @@ const DICT_TYPE = { ...ERP_DICT, ...INFRA_DICT, ...IOT_DICT, + ...WMS_DICT, ...MEMBER_DICT, ...MP_DICT, ...PAY_DICT, From 84b91c67950928203545f5231d4bdfe634d9ed64 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 17 May 2026 18:11:31 +0800 Subject: [PATCH 008/100] =?UTF-8?q?feat=EF=BC=88iot=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20iot=20=E4=BA=A7=E5=93=81=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=9A=84=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/iot/product/product/data.ts | 22 ------------------- .../src/views/iot/product/product/index.vue | 2 +- .../iot/product/product/modules/card-view.vue | 10 --------- 3 files changed, 1 insertion(+), 33 deletions(-) diff --git a/apps/web-antd/src/views/iot/product/product/data.ts b/apps/web-antd/src/views/iot/product/product/data.ts index f2c8fcb6c..118a55e64 100644 --- a/apps/web-antd/src/views/iot/product/product/data.ts +++ b/apps/web-antd/src/views/iot/product/product/data.ts @@ -147,19 +147,6 @@ export function useBasicFormSchema( help: 'iot-gateway-server 默认根据接入的协议类型确定数据格式,仅 MQTT、EMQX 协议支持自定义序列化类型', rules: 'required', }, - // TODO @haohao:这个貌似不需要?! - { - fieldName: 'status', - label: '产品状态', - component: 'RadioGroup', - componentProps: { - options: getDictOptions(DICT_TYPE.IOT_PRODUCT_STATUS, 'number'), - buttonStyle: 'solid', - optionType: 'button', - }, - defaultValue: 0, - rules: 'required', - }, ]; } @@ -248,15 +235,6 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { name: 'CellImage', }, }, - { - field: 'status', - title: '产品状态', - minWidth: 100, - cellRender: { - name: 'CellDict', - props: { type: DICT_TYPE.IOT_PRODUCT_STATUS }, - }, - }, { field: 'createTime', title: '创建时间', diff --git a/apps/web-antd/src/views/iot/product/product/index.vue b/apps/web-antd/src/views/iot/product/product/index.vue index 0e94d1adf..49101fbc2 100644 --- a/apps/web-antd/src/views/iot/product/product/index.vue +++ b/apps/web-antd/src/views/iot/product/product/index.vue @@ -175,7 +175,7 @@ onMounted(() => { - +
{
{{ item.name }}
-
@@ -269,11 +264,6 @@ onMounted(() => { white-space: nowrap; } - // 状态标签 - .status-tag { - font-size: 12px; - } - // 信息列表 .info-list { .info-item { From 3da4a3f41792d49134d0b8782ccde7f776795851 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 17 May 2026 18:17:30 +0800 Subject: [PATCH 009/100] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=B0=86=E9=A6=96=E9=A1=B5=E7=9A=84=E6=9E=9A=E4=B8=BE=E5=80=BC?= =?UTF-8?q?=E5=8E=BB=E6=8E=89=EF=BC=8C=E7=BB=9F=E4=B8=80=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=88=B0=20constants=20=E9=87=8C=EF=BC=8C=E6=9B=B4=E8=81=9A?= =?UTF-8?q?=E7=84=A6=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/wms-home-order-summary-cards.vue | 53 +++++++++++++------ .../wms-home-order-trend-chart-options.ts | 23 +++----- .../web-antd/src/views/wms/utils/constants.ts | 10 ++++ .../modules/wms-home-order-summary-cards.vue | 53 +++++++++++++------ .../wms-home-order-trend-chart-options.ts | 23 +++----- apps/web-ele/src/views/wms/utils/constants.ts | 10 ++++ 6 files changed, 106 insertions(+), 66 deletions(-) diff --git a/apps/web-antd/src/views/wms/home/modules/wms-home-order-summary-cards.vue b/apps/web-antd/src/views/wms/home/modules/wms-home-order-summary-cards.vue index 2f2ae0bec..702d1bf6b 100644 --- a/apps/web-antd/src/views/wms/home/modules/wms-home-order-summary-cards.vue +++ b/apps/web-antd/src/views/wms/home/modules/wms-home-order-summary-cards.vue @@ -1,19 +1,45 @@ + + From 0e4012c623b3104763001734d4f38653084bacd7 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 17 May 2026 23:07:56 +0800 Subject: [PATCH 013/100] =?UTF-8?q?feat=EF=BC=88=E5=85=A8=E5=B1=80?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0=20barcode=20=E4=BA=8C?= =?UTF-8?q?=E7=BB=B4=E7=A0=81=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/effects/common-ui/package.json | 1 + .../src/components/barcode/barcode.vue | 131 ++++++++++++++++++ .../common-ui/src/components/barcode/index.ts | 2 + .../common-ui/src/components/barcode/types.ts | 18 +++ .../effects/common-ui/src/components/index.ts | 1 + pnpm-lock.yaml | 11 ++ pnpm-workspace.yaml | 1 + 7 files changed, 165 insertions(+) create mode 100644 packages/effects/common-ui/src/components/barcode/barcode.vue create mode 100644 packages/effects/common-ui/src/components/barcode/index.ts create mode 100644 packages/effects/common-ui/src/components/barcode/types.ts diff --git a/packages/effects/common-ui/package.json b/packages/effects/common-ui/package.json index 542b6a979..3a7cc70f5 100644 --- a/packages/effects/common-ui/package.json +++ b/packages/effects/common-ui/package.json @@ -41,6 +41,7 @@ "@vben/types": "workspace:*", "@vueuse/core": "catalog:", "@vueuse/integrations": "catalog:", + "jsbarcode": "catalog:", "json-bigint": "catalog:", "qrcode": "catalog:", "tippy.js": "catalog:", diff --git a/packages/effects/common-ui/src/components/barcode/barcode.vue b/packages/effects/common-ui/src/components/barcode/barcode.vue new file mode 100644 index 000000000..f8fe1cf6f --- /dev/null +++ b/packages/effects/common-ui/src/components/barcode/barcode.vue @@ -0,0 +1,131 @@ + + + diff --git a/packages/effects/common-ui/src/components/barcode/index.ts b/packages/effects/common-ui/src/components/barcode/index.ts new file mode 100644 index 000000000..3091e0401 --- /dev/null +++ b/packages/effects/common-ui/src/components/barcode/index.ts @@ -0,0 +1,2 @@ +export { default as Barcode } from './barcode.vue'; +export * from './types'; diff --git a/packages/effects/common-ui/src/components/barcode/types.ts b/packages/effects/common-ui/src/components/barcode/types.ts new file mode 100644 index 000000000..6d31e665b --- /dev/null +++ b/packages/effects/common-ui/src/components/barcode/types.ts @@ -0,0 +1,18 @@ +/** 条码格式枚举 */ +export const BarcodeFormatEnum = { + QR_CODE: 1, + EAN13: 2, + CODE39: 3, + UPC_A: 4, +} as const; + +export type BarcodeFormat = + (typeof BarcodeFormatEnum)[keyof typeof BarcodeFormatEnum]; + +/** 条码格式映射表(枚举值 -> JsBarcode 格式名) */ +export const BARCODE_FORMAT_MAP: Record = { + [BarcodeFormatEnum.QR_CODE]: 'QR_CODE', + [BarcodeFormatEnum.EAN13]: 'EAN13', + [BarcodeFormatEnum.CODE39]: 'CODE39', + [BarcodeFormatEnum.UPC_A]: 'UPC_A', +}; diff --git a/packages/effects/common-ui/src/components/index.ts b/packages/effects/common-ui/src/components/index.ts index f2c4faea8..82e729384 100644 --- a/packages/effects/common-ui/src/components/index.ts +++ b/packages/effects/common-ui/src/components/index.ts @@ -1,4 +1,5 @@ export * from './api-component'; +export * from './barcode'; export * from './captcha'; export * from './card/comparison-card'; export * from './card/statistic-card'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a8d9c629b..7d4dd8716 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -357,6 +357,9 @@ catalogs: is-ci: specifier: ^4.1.0 version: 4.1.0 + jsbarcode: + specifier: ^3.12.3 + version: 3.12.3 jsencrypt: specifier: ^3.5.4 version: 3.5.4 @@ -1955,6 +1958,9 @@ importers: '@vueuse/integrations': specifier: 'catalog:' version: 14.2.1(async-validator@4.2.5)(axios@1.15.0)(change-case@5.4.4)(focus-trap@8.0.1)(nprogress@0.2.0)(qrcode@1.5.4)(sortablejs@1.15.7)(vue@3.5.32(typescript@6.0.2)) + jsbarcode: + specifier: 'catalog:' + version: 3.12.3 json-bigint: specifier: 'catalog:' version: 1.0.0 @@ -9196,6 +9202,9 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + jsbarcode@3.12.3: + resolution: {integrity: sha512-CuHU9hC6dPsHF5oVFMo8NW76uQVjH4L22CsP4hW+dNnGywJHC/B0ThA1CTDVLnxKLrrpYdicBLnd2xsgTfRnvg==} + jsdoc-type-pratt-parser@7.1.1: resolution: {integrity: sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA==} engines: {node: '>=20.0.0'} @@ -19810,6 +19819,8 @@ snapshots: dependencies: argparse: 2.0.1 + jsbarcode@3.12.3: {} + jsdoc-type-pratt-parser@7.1.1: {} jsencrypt@3.5.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ce284cee7..ad9a84d14 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -138,6 +138,7 @@ catalog: highlight.js: ^11.11.1 html-minifier-terser: ^7.2.0 is-ci: ^4.1.0 + jsbarcode: ^3.12.3 jsencrypt: ^3.5.4 json-bigint: ^1.0.0 lefthook: ^2.1.5 From 0246fa1ebc14504a4eeb9adbb0df3ee7c8eec8b3 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 17 May 2026 23:09:18 +0800 Subject: [PATCH 014/100] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20order=20receipt=20=E7=9A=84=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=EF=BC=8C=E5=AF=B9=E9=BD=90=20vue3=20+=20ep=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/wms/order/receipt/data.ts | 167 ++++-- .../src/views/wms/order/receipt/index.vue | 43 +- .../wms/order/receipt/modules/detail.vue | 125 +++++ .../views/wms/order/receipt/modules/form.vue | 474 ++++++++++++++++++ .../views/wms/order/receipt/modules/print.vue | 218 ++++++++ 5 files changed, 965 insertions(+), 62 deletions(-) create mode 100644 apps/web-antd/src/views/wms/order/receipt/modules/detail.vue create mode 100644 apps/web-antd/src/views/wms/order/receipt/modules/form.vue create mode 100644 apps/web-antd/src/views/wms/order/receipt/modules/print.vue diff --git a/apps/web-antd/src/views/wms/order/receipt/data.ts b/apps/web-antd/src/views/wms/order/receipt/data.ts index 335162883..84854af93 100644 --- a/apps/web-antd/src/views/wms/order/receipt/data.ts +++ b/apps/web-antd/src/views/wms/order/receipt/data.ts @@ -1,53 +1,29 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { DescriptionItemSchema } from '#/components/description'; -import { markRaw } from 'vue'; +import { h, markRaw } from 'vue'; import { DICT_TYPE } from '@vben/constants'; import { getDictOptions } from '@vben/hooks'; +import { formatDate, formatDateTime } from '@vben/utils'; import { z } from '#/adapter/form'; import { getSimpleUserList } from '#/api/system/user'; +import { DictTag } from '#/components/dict-tag'; +import { buildNumberRangeSchema } from '#/components/number-range-input'; import { getRangePickerDefaultProps } from '#/utils'; import { WmsMerchantSelect } from '#/views/wms/md/merchant/components'; import { WmsWarehouseSelect } from '#/views/wms/md/warehouse/components'; import { + formatPrice, + formatQuantity, + formatSumPrice, + formatSumQuantity, PRICE_PRECISION, QUANTITY_PRECISION, } from '#/views/wms/utils/format'; -import NumberRangeInput from './modules/number-range-input.vue'; - -function splitNumberRange(minFieldName: string, maxFieldName: string) { - return ( - value: [number | undefined, number | undefined] | undefined, - setValue: (fieldName: string, value: any) => void, - ) => { - setValue(minFieldName, value?.[0]); - setValue(maxFieldName, value?.[1]); - return undefined; - }; -} - -function buildNumberRangeSchema( - label: string, - fieldName: string, - minFieldName: string, - maxFieldName: string, - precision: number, -): VbenFormSchema { - return { - component: markRaw(NumberRangeInput), - componentProps: { - min: 0, - precision, - }, - fieldName, - label, - valueFormat: splitNumberRange(minFieldName, maxFieldName), - }; -} - /** 列表的搜索表单 */ export function useGridFormSchema(): VbenFormSchema[] { return [ @@ -247,10 +223,97 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { ]; } +/** 详情的字段 */ +export function useDetailSchema(): DescriptionItemSchema[] { + return [ + { + field: 'no', + label: '入库单号', + render: (val) => val || '-', + }, + { + field: 'type', + label: '入库类型', + render: (val) => + val === undefined || val === null + ? '-' + : h(DictTag, { + type: DICT_TYPE.WMS_RECEIPT_ORDER_TYPE, + value: val, + }), + }, + { + field: 'warehouseName', + label: '仓库', + render: (val) => val || '-', + }, + { + field: 'status', + label: '单据状态', + render: (val) => + val === undefined || val === null + ? '-' + : h(DictTag, { + type: DICT_TYPE.WMS_ORDER_STATUS, + value: val, + }), + }, + { + field: 'orderTime', + label: '单据日期', + render: (val) => formatDate(val, 'YYYY-MM-DD') || '-', + }, + { + field: 'merchantName', + label: '供应商', + render: (val) => val || '-', + }, + { + field: 'bizOrderNo', + label: '业务单号', + render: (val) => val || '-', + }, + { + field: 'totalQuantity', + label: '总数量', + render: (val) => formatQuantity(val) || '-', + }, + { + field: 'totalPrice', + label: '总金额', + render: (val) => formatPrice(val) || '-', + }, + { + field: 'createTime', + label: '创建时间', + render: (val) => formatDateTime(val) || '-', + }, + { + field: 'creatorName', + label: '创建人', + render: (val, data) => val || data?.creator || '-', + }, + { + field: 'updateTime', + label: '更新时间', + render: (val) => formatDateTime(val) || '-', + }, + { + field: 'updaterName', + label: '更新人', + render: (val, data) => val || data?.updater || '-', + }, + { + field: 'remark', + label: '备注', + render: (val) => val || '-', + span: 2, + }, + ]; +} + /** 表单的配置项 */ -export function useFormSchema( - handleWarehouseChange: () => Promise | void, -): VbenFormSchema[] { +export function useFormSchema(): VbenFormSchema[] { return [ { component: 'Input', @@ -283,9 +346,6 @@ export function useFormSchema( }, { component: markRaw(WmsWarehouseSelect), - componentProps: { - onChange: handleWarehouseChange, - }, fieldName: 'warehouseId', label: '仓库', rules: 'required', @@ -332,3 +392,32 @@ export function useFormSchema( }, ]; } + +interface ReceiptOrderDetailFooterRow { + quantity?: number; + totalPrice?: number; +} + +/** 明细表格的合计行 */ +export function getDetailFooter({ + columns, + data, +}: { + columns: Array<{ field?: string }>; + data: ReceiptOrderDetailFooterRow[]; +}) { + return [ + columns.map((column, index) => { + if (index === 0) { + return '合计'; + } + if (column.field === 'quantity') { + return formatSumQuantity(data, (detail) => detail.quantity); + } + if (column.field === 'totalPrice') { + return formatSumPrice(data, (detail) => detail.totalPrice); + } + return ''; + }), + ]; +} diff --git a/apps/web-antd/src/views/wms/order/receipt/index.vue b/apps/web-antd/src/views/wms/order/receipt/index.vue index 0b226fcb0..10ec0ef9d 100644 --- a/apps/web-antd/src/views/wms/order/receipt/index.vue +++ b/apps/web-antd/src/views/wms/order/receipt/index.vue @@ -3,9 +3,6 @@ import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { WmsReceiptOrderApi } from '#/api/wms/order/receipt'; import type { WmsReceiptOrderDetailApi } from '#/api/wms/order/receipt/detail'; -// TODO @AI:对齐 system user index.vue 的界面,function 上必要的注释,需要加; -// TODO @AI:row。id 这种防御性编程,建议都去掉,不存在这个情况;;; - import { reactive, ref } from 'vue'; import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; @@ -56,27 +53,24 @@ const [DetailModal, detailModalApi] = useVbenModal({ destroyOnClose: true, }); +/** 刷新表格 */ function handleRefresh() { gridApi.query(); } +/** 创建入库单 */ function handleCreate() { formModalApi.setData({ type: 'create' }).open(); } +/** 编辑入库单 */ function handleEdit(row: WmsReceiptOrderApi.ReceiptOrder) { - formModalApi.setData({ id: row.id, type: 'update' }).open(); + formModalApi.setData({ id: row.id!, type: 'update' }).open(); } +/** 查看入库单详情 */ function handleDetail(row: WmsReceiptOrderApi.ReceiptOrder) { - detailModalApi.setData({ id: row.id }).open(); -} - -function handlePrint(row: WmsReceiptOrderApi.ReceiptOrder) { - // TODO @AI:不用过度封装; - if (row.id) { - printRef.value?.print(row.id); - } + detailModalApi.setData({ id: row.id! }).open(); } /** 计算单据明细金额 */ @@ -86,31 +80,34 @@ function getDetailTotalPrice( return detail.totalPrice ?? multiplyPrice(detail.quantity, detail.price); } +/** 获取已展开行的明细 */ function getExpandedDetails(row: WmsReceiptOrderApi.ReceiptOrder) { - return row.id ? detailMap[row.id] || [] : []; + return detailMap[row.id!] || []; } /** 展开列表行时懒加载入库明细 */ -// TODO @AI:点击 > 才展开,不用整行点击都展开; async function handleExpandChange( row: WmsReceiptOrderApi.ReceiptOrder, expanded: boolean, ) { - if (!row.id || !expanded) { + if (!expanded) { return; } - delete detailMap[row.id]; - detailMap[row.id] = await getReceiptOrderDetailListByOrderId(row.id); + delete detailMap[row.id!]; + detailMap[row.id!] = await getReceiptOrderDetailListByOrderId(row.id!); } +/** 判断入库单是否可修改 */ function canUpdateReceiptOrder(status?: number) { return status !== undefined && OrderUpdateStatusList.includes(status); } +/** 判断入库单是否可删除 */ function canDeleteReceiptOrder(status?: number) { return status !== undefined && OrderDeleteStatusList.includes(status); } +/** 获取修改按钮禁用提示 */ function getReceiptOrderUpdateTip(status?: number) { if (canUpdateReceiptOrder(status)) { return undefined; @@ -124,6 +121,7 @@ function getReceiptOrderUpdateTip(status?: number) { return '当前状态无法修改'; } +/** 获取删除按钮禁用提示 */ function getReceiptOrderDeleteTip(status?: number) { if (canDeleteReceiptOrder(status)) { return undefined; @@ -134,16 +132,14 @@ function getReceiptOrderDeleteTip(status?: number) { return '当前状态无法删除'; } +/** 删除入库单 */ async function handleDelete(row: WmsReceiptOrderApi.ReceiptOrder) { - if (!row.id) { - return; - } const hideLoading = message.loading({ content: $t('ui.actionMessage.deleting', [row.no]), duration: 0, }); try { - await deleteReceiptOrder(row.id); + await deleteReceiptOrder(row.id!); message.success($t('ui.actionMessage.deleteSuccess', [row.no])); handleRefresh(); } finally { @@ -151,6 +147,7 @@ async function handleDelete(row: WmsReceiptOrderApi.ReceiptOrder) { } } +/** 导出入库单 */ async function handleExport() { const data = await exportReceiptOrder(await gridApi.formApi.getValues()); downloadFileFromBlobPart({ fileName: '入库单.xls', source: data }); @@ -165,7 +162,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ columns: useGridColumns(), expandConfig: { padding: true, - trigger: 'row', + trigger: 'default', }, height: 'auto', keepSource: true, @@ -331,7 +328,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ label: '打印', type: 'link', auth: ['wms:receipt-order:query'], - onClick: handlePrint.bind(null, row), + onClick: () => printRef?.print(row.id!), }, ]" /> diff --git a/apps/web-antd/src/views/wms/order/receipt/modules/detail.vue b/apps/web-antd/src/views/wms/order/receipt/modules/detail.vue new file mode 100644 index 000000000..a9ea3dda1 --- /dev/null +++ b/apps/web-antd/src/views/wms/order/receipt/modules/detail.vue @@ -0,0 +1,125 @@ + + + diff --git a/apps/web-antd/src/views/wms/order/receipt/modules/form.vue b/apps/web-antd/src/views/wms/order/receipt/modules/form.vue new file mode 100644 index 000000000..e7980994c --- /dev/null +++ b/apps/web-antd/src/views/wms/order/receipt/modules/form.vue @@ -0,0 +1,474 @@ + + + diff --git a/apps/web-antd/src/views/wms/order/receipt/modules/print.vue b/apps/web-antd/src/views/wms/order/receipt/modules/print.vue new file mode 100644 index 000000000..a0b98775d --- /dev/null +++ b/apps/web-antd/src/views/wms/order/receipt/modules/print.vue @@ -0,0 +1,218 @@ + + + + + From 08511191f73b59edc88963dc810c03e934c2dcd8 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 17 May 2026 23:15:16 +0800 Subject: [PATCH 015/100] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20print=20=E9=A1=B6=E9=83=A8=E7=99=BD?= =?UTF-8?q?=E5=9D=97=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E5=AF=B9=E9=BD=90?= =?UTF-8?q?=20vue3=20+=20ep=20=E7=9A=84=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/wms/order/receipt/modules/print.vue | 237 +++++++++--------- 1 file changed, 125 insertions(+), 112 deletions(-) diff --git a/apps/web-antd/src/views/wms/order/receipt/modules/print.vue b/apps/web-antd/src/views/wms/order/receipt/modules/print.vue index a0b98775d..4bb43a4a1 100644 --- a/apps/web-antd/src/views/wms/order/receipt/modules/print.vue +++ b/apps/web-antd/src/views/wms/order/receipt/modules/print.vue @@ -37,6 +37,7 @@ const printRows = computed(() => })), ); +/** 等待条码和打印 DOM 完成绘制,避免浏览器打印到旧内容 */ function waitForPaint() { return new Promise((resolve) => { requestAnimationFrame(() => { @@ -45,10 +46,12 @@ function waitForPaint() { }); } +/** 退出打印模式,恢复当前页面显示 */ function removePrintMode() { document.body.classList.remove('wms-receipt-order-printing'); } +/** 获取打印用字典文案,空值统一显示为横杠 */ function getPrintDictLabel(dictType: string, value?: number) { if (value === undefined || value === null) { return '-'; @@ -56,6 +59,7 @@ function getPrintDictLabel(dictType: string, value?: number) { return getDictLabel(dictType, value) || '-'; } +/** 打印入库单:加载数据后只展示打印区域,再调用浏览器打印 */ async function print(id: number) { const order = await getReceiptOrder(id); const details = order.details || (await getReceiptOrderDetailListByOrderId(id)); @@ -71,126 +75,134 @@ defineExpose({ print }); From f8c2d4b1ffd7df382570b44dbd73aa2b40c7e2a2 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 17 May 2026 23:56:05 +0800 Subject: [PATCH 018/100] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20antd=E3=80=81ele=20=E7=9A=84=20order=20rec?= =?UTF-8?q?eipt=20=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/wms/order/receipt/data.ts | 6 ++++- .../src/views/wms/order/receipt/index.vue | 9 +++++++- .../wms/order/receipt/modules/detail.vue | 14 ++++------- .../views/wms/order/receipt/modules/form.vue | 23 +++++++++++-------- .../src/views/wms/order/receipt/data.ts | 6 ++++- .../src/views/wms/order/receipt/index.vue | 1 - .../views/wms/order/receipt/modules/form.vue | 23 +++++++++++-------- 7 files changed, 51 insertions(+), 31 deletions(-) diff --git a/apps/web-antd/src/views/wms/order/receipt/data.ts b/apps/web-antd/src/views/wms/order/receipt/data.ts index 84854af93..ad6cc502f 100644 --- a/apps/web-antd/src/views/wms/order/receipt/data.ts +++ b/apps/web-antd/src/views/wms/order/receipt/data.ts @@ -397,13 +397,17 @@ interface ReceiptOrderDetailFooterRow { quantity?: number; totalPrice?: number; } +type ReceiptOrderDetailFooterColumn = Pick< + NonNullable[number]>, + 'field' +>; /** 明细表格的合计行 */ export function getDetailFooter({ columns, data, }: { - columns: Array<{ field?: string }>; + columns: ReceiptOrderDetailFooterColumn[]; data: ReceiptOrderDetailFooterRow[]; }) { return [ diff --git a/apps/web-antd/src/views/wms/order/receipt/index.vue b/apps/web-antd/src/views/wms/order/receipt/index.vue index 10ec0ef9d..ea12bf79b 100644 --- a/apps/web-antd/src/views/wms/order/receipt/index.vue +++ b/apps/web-antd/src/views/wms/order/receipt/index.vue @@ -53,8 +53,16 @@ const [DetailModal, detailModalApi] = useVbenModal({ destroyOnClose: true, }); +/** 清空展开明细缓存 */ +function clearDetailMap() { + for (const id of Object.keys(detailMap)) { + delete detailMap[Number(id)]; + } +} + /** 刷新表格 */ function handleRefresh() { + clearDetailMap(); gridApi.query(); } @@ -162,7 +170,6 @@ const [Grid, gridApi] = useVbenVxeGrid({ columns: useGridColumns(), expandConfig: { padding: true, - trigger: 'default', }, height: 'auto', keepSource: true, diff --git a/apps/web-antd/src/views/wms/order/receipt/modules/detail.vue b/apps/web-antd/src/views/wms/order/receipt/modules/detail.vue index a9ea3dda1..5fbe78a1a 100644 --- a/apps/web-antd/src/views/wms/order/receipt/modules/detail.vue +++ b/apps/web-antd/src/views/wms/order/receipt/modules/detail.vue @@ -15,12 +15,10 @@ import { useDescription } from '#/components/description'; import { formatPrice, formatQuantity, - formatSumPrice, - formatSumQuantity, multiplyPrice, } from '#/views/wms/utils/format'; -import { useDetailSchema } from '../data'; +import { getDetailFooter, useDetailSchema } from '../data'; interface DetailRow extends WmsReceiptOrderDetailApi.ReceiptOrderDetail { totalPrice?: number; @@ -80,7 +78,9 @@ const [Modal, modalApi] = useVbenModal({ :data="detailRows" border empty-text="暂无商品明细" + :footer-method="getDetailFooter" :show-overflow="true" + show-footer size="small" > @@ -99,7 +99,7 @@ const [Modal, modalApi] = useVbenModal({
- + @@ -110,16 +110,12 @@ const [Modal, modalApi] = useVbenModal({ {{ formatPrice(row.price) || '-' }} - + -
- 合计数量:{{ formatSumQuantity(detailRows, (detail) => detail.quantity) }} - 合计金额:{{ formatSumPrice(detailRows, (detail) => detail.totalPrice) }} -
diff --git a/apps/web-antd/src/views/wms/order/receipt/modules/form.vue b/apps/web-antd/src/views/wms/order/receipt/modules/form.vue index e7980994c..23f07f4b6 100644 --- a/apps/web-antd/src/views/wms/order/receipt/modules/form.vue +++ b/apps/web-antd/src/views/wms/order/receipt/modules/form.vue @@ -7,6 +7,7 @@ import type { WmsReceiptOrderDetailApi } from '#/api/wms/order/receipt/detail'; import { computed, nextTick, ref } from 'vue'; import { confirm, useVbenModal } from '@vben/common-ui'; +import { isEqual } from '@vben/utils'; import { InputNumber, message } from 'ant-design-vue'; @@ -46,9 +47,9 @@ defineOptions({ name: 'WmsReceiptOrderForm' }); const emit = defineEmits(['success']); -const formData = ref(); +const formData = ref({}); const formMode = ref('create'); -const originalSubmitData = ref(''); +const originalSubmitData = ref(); const details = ref([]); const detailTableRef = ref(); const skuSelectRef = ref>(); @@ -237,7 +238,7 @@ async function buildSubmitData(): Promise { totalPrice: _totalPrice, totalQuantity: _totalQuantity, ...order - } = formData.value || {}; + } = formData.value; return { ...order, ...values, @@ -255,7 +256,7 @@ async function handleFormComplete() { modalApi.lock(); try { const data = await buildSubmitData(); - if (JSON.stringify(data) !== originalSubmitData.value) { + if (!isEqual(data, originalSubmitData.value)) { await updateReceiptOrder(data); } await completeReceiptOrder(formData.value.id); @@ -307,8 +308,8 @@ const [Modal, modalApi] = useVbenModal({ }, async onOpenChange(isOpen: boolean) { if (!isOpen) { - formData.value = undefined; - originalSubmitData.value = ''; + formData.value = {}; + originalSubmitData.value = undefined; setDetails([]); return; } @@ -329,7 +330,7 @@ const [Modal, modalApi] = useVbenModal({ setDetails(orderDetails); // 设置到 values await formApi.setValues(formData.value); - originalSubmitData.value = JSON.stringify(await buildSubmitData()); + originalSubmitData.value = await buildSubmitData(); } finally { modalApi.unlock(); } @@ -343,14 +344,18 @@ const [Modal, modalApi] = useVbenModal({ }; setDetails([]); await formApi.setValues(formData.value); - originalSubmitData.value = JSON.stringify(await buildSubmitData()); + originalSubmitData.value = await buildSubmitData(); await nextTick(); }, });