From ff77ba16ccc1970ccd45a5a8c40e9a3f66677f3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=8C=E5=85=88=E8=88=9C?= <2499071264@qq.com> Date: Tue, 8 Sep 2026 20:12:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=A7=AF=E5=88=86=E5=95=86=E5=9F=8E-?= =?UTF-8?q?=E4=BE=9B=E5=BA=94=E5=95=86-=E5=AF=B9=E8=B4=A6-=E5=8F=91?= =?UTF-8?q?=E7=A5=A84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- supplied-admin/src/api/admin.ts | 4 + .../src/components/MerchantAfterSaleTable.vue | 116 +++++++++++++++--- supplied-admin/src/layouts/AdminLayout.vue | 4 +- supplied-admin/src/router/index.ts | 5 +- supplied-admin/src/styles/index.scss | 8 +- .../src/views/after-sales/audit.vue | 2 +- supplied-admin/src/views/invoices/index.vue | 88 +++++++++++++ supplied-admin/src/views/orders/index.vue | 18 ++- supplied-admin/src/views/products/index.vue | 59 +++++++-- .../src/views/reconciliation/index.vue | 20 +-- supplied-h5/src/api/merchant-session.js | 15 +++ supplied-h5/src/api/supplied-service.js | 30 ++++- supplied-h5/src/router/index.js | 26 +++- .../src/view/joyful-selection/layout.vue | 4 + .../merchant/after-sale-detail.vue | 12 +- .../view/joyful-selection/merchant/index.vue | 6 +- .../view/joyful-selection/merchant/login.vue | 56 +++++++++ .../view/joyful-selection/products/index.vue | 7 +- .../view/joyful-selection/profile/index.vue | 4 +- .../src/controllers/basic.controller.ts | 12 ++ .../merchant-invoice.controller.ts | 21 ++++ .../src/controllers/product.controller.ts | 4 +- supplied-service/src/dao/order.dao.ts | 8 +- supplied-service/src/dao/product.dao.ts | 28 +++-- supplied-service/src/dao/supplied-user.dao.ts | 5 + supplied-service/src/functions/file.ts | 1 + .../src/functions/merchant-invoice-file.ts | 1 + .../src/functions/merchant-invoice-list.ts | 1 + supplied-service/src/server.ts | 19 +++ .../src/services/after-sale.service.ts | 9 +- .../src/services/merchant-invoice.service.ts | 40 ++++++ .../src/services/merchant.service.ts | 23 ++-- .../src/services/minio-upload.service.ts | 26 +++- .../src/services/order-action.service.ts | 33 ++++- .../src/services/product.service.ts | 28 +++-- .../services/reconciliation-result.service.ts | 24 ++-- .../src/services/supplier-file.service.ts | 9 ++ .../services/supplier-open-order.service.ts | 9 +- supplied-service/tools/mock-invoice-pdf.js | 56 +++++++-- 39 files changed, 705 insertions(+), 136 deletions(-) create mode 100644 supplied-admin/src/views/invoices/index.vue create mode 100644 supplied-h5/src/api/merchant-session.js create mode 100644 supplied-h5/src/view/joyful-selection/merchant/login.vue create mode 100644 supplied-service/src/controllers/merchant-invoice.controller.ts create mode 100644 supplied-service/src/functions/file.ts create mode 100644 supplied-service/src/functions/merchant-invoice-file.ts create mode 100644 supplied-service/src/functions/merchant-invoice-list.ts create mode 100644 supplied-service/src/services/merchant-invoice.service.ts diff --git a/supplied-admin/src/api/admin.ts b/supplied-admin/src/api/admin.ts index 61e93e6..55460c6 100644 --- a/supplied-admin/src/api/admin.ts +++ b/supplied-admin/src/api/admin.ts @@ -4,6 +4,10 @@ const API_BASE = import.meta.env.VITE_SUPPLIED_ADMIN_API_BASE || 'http://127.0.0 const normalizeBase = (base: string) => base.replace(/\/$/, '') +export const resolveImageUrl = (value: string) => /^\/api\/(?:file|upload-preview)\?/.test(value) + ? `${normalizeBase(API_BASE).replace(/\/api\/admin$/, '')}${value.replace('/api/upload-preview?', '/api/file?')}` + : value + export const postAdmin = async (name: string, body: Record): Promise => { const token = readAdminSession()?.token const response = await fetch(`${normalizeBase(API_BASE)}/${name}`, { diff --git a/supplied-admin/src/components/MerchantAfterSaleTable.vue b/supplied-admin/src/components/MerchantAfterSaleTable.vue index 001c6c8..5ae2217 100644 --- a/supplied-admin/src/components/MerchantAfterSaleTable.vue +++ b/supplied-admin/src/components/MerchantAfterSaleTable.vue @@ -1,23 +1,111 @@ - + diff --git a/supplied-admin/src/layouts/AdminLayout.vue b/supplied-admin/src/layouts/AdminLayout.vue index 4d93cae..6d720fa 100644 --- a/supplied-admin/src/layouts/AdminLayout.vue +++ b/supplied-admin/src/layouts/AdminLayout.vue @@ -3,8 +3,8 @@
供应商管理
- - 订单列表售后审核售后处理售后记录 + 订单对账发票管理 + 订单列表订单售后售后记录
diff --git a/supplied-admin/src/router/index.ts b/supplied-admin/src/router/index.ts index 8505fa9..3d9f190 100644 --- a/supplied-admin/src/router/index.ts +++ b/supplied-admin/src/router/index.ts @@ -6,10 +6,11 @@ import { clearAdminSession, readAdminSession } from '@/utils/auth' const routes: RouteRecordRaw[] = [{ path: '/login', name: 'Login', component: () => import('@/views/login/index.vue'), meta: { title: '登录' } }, { path: '/', component: AdminLayout, redirect: '/reconciliation', children: [ { path: 'reconciliation', name: 'Reconciliation', component: () => import('@/views/reconciliation/index.vue'), meta: { title: '订单对账' } }, + { path: 'invoices', name: 'Invoices', component: () => import('@/views/invoices/index.vue'), meta: { title: '发票管理' } }, { path: 'orders', redirect: '/orders/list' }, { path: 'orders/list', name: 'Orders', component: () => import('@/views/orders/index.vue'), meta: { title: '订单列表' } }, - { path: 'orders/after-sales/audit', name: 'AfterSaleAudit', component: () => import('@/views/after-sales/audit.vue'), meta: { title: '售后审核' } }, - { path: 'orders/after-sales/process', name: 'AfterSaleProcess', component: () => import('@/views/after-sales/process.vue'), meta: { title: '售后处理' } }, + { path: 'orders/after-sales/audit', name: 'AfterSaleAudit', component: () => import('@/views/after-sales/audit.vue'), meta: { title: '订单售后' } }, + { path: 'orders/after-sales/process', name: 'AfterSaleProcess', redirect: '/orders/after-sales/audit' }, { path: 'orders/after-sales/history', name: 'AfterSaleHistory', component: () => import('@/views/after-sales/history.vue'), meta: { title: '售后记录' } }, { path: 'products', name: 'Products', component: () => import('@/views/products/index.vue'), meta: { title: '商品管理' } } ] }] diff --git a/supplied-admin/src/styles/index.scss b/supplied-admin/src/styles/index.scss index 49f57e2..f696884 100644 --- a/supplied-admin/src/styles/index.scss +++ b/supplied-admin/src/styles/index.scss @@ -34,9 +34,9 @@ button, input, textarea { font: inherit; } .page-title h2 { margin: 0 0 8px; color: #202e45; font-size: 22px; font-weight: 600; letter-spacing: .5px; } .page-title p { margin: 0; color: #78859a; font-size: 13px; line-height: 1.7; } .query-form.el-form--inline { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 16px 20px; padding: 20px; margin-bottom: 24px; border: 1px solid #e9eef5; border-radius: 10px; background: #f8fafc; } -.query-form.el-form--inline .el-form-item { display: flex; flex-direction: column; align-items: stretch; margin: 0; } -.query-form .el-form-item__label { justify-content: flex-start; height: auto; padding: 0 0 8px; color: #526078; font-size: 13px; line-height: 18px; } -.query-form .el-form-item__content { min-height: 36px; } +.query-form.el-form--inline .el-form-item { display: flex; flex-direction: row; align-items: center; margin: 0; } +.query-form .el-form-item__label { justify-content: flex-start; flex-shrink: 0; height: 36px; padding: 0 12px 0 0; color: #526078; font-size: 13px; line-height: 36px; white-space: nowrap; } +.query-form .el-form-item__content { min-width: 0; min-height: 36px; } .query-form .el-input, .query-form .el-select { width: 208px; max-width: 100%; } .query-form .el-button { min-width: 76px; height: 36px; } .el-input__wrapper, .el-select__wrapper { min-height: 36px; } @@ -78,7 +78,7 @@ button, input, textarea { font: inherit; } .el-dialog .el-form-item:last-child { margin-bottom: 0; } .el-dialog .el-select, .el-dialog .el-input-number { width: 100%; } .el-dialog__footer .el-button { min-width: 80px; height: 36px; } -.el-message-box { max-width: calc(100vw - 32px); padding: 20px; border-radius: 12px; } +.el-message-box { width: 360px; max-width: calc(100vw - 32px); padding: 20px; border-radius: 12px; } @media (max-width: 1200px) { .page-card { padding: 22px; } diff --git a/supplied-admin/src/views/after-sales/audit.vue b/supplied-admin/src/views/after-sales/audit.vue index 3b32508..ee36c32 100644 --- a/supplied-admin/src/views/after-sales/audit.vue +++ b/supplied-admin/src/views/after-sales/audit.vue @@ -1,2 +1,2 @@ - + diff --git a/supplied-admin/src/views/invoices/index.vue b/supplied-admin/src/views/invoices/index.vue new file mode 100644 index 0000000..188686d --- /dev/null +++ b/supplied-admin/src/views/invoices/index.vue @@ -0,0 +1,88 @@ +