From 20d49c0b0d923ec73b25cc306976ddf5bf230668 Mon Sep 17 00:00:00 2001 From: yueli Date: Thu, 10 Sep 2026 15:37:11 +0800 Subject: [PATCH] =?UTF-8?q?feat(my-requests):=20=E6=88=91=E7=9A=84?= =?UTF-8?q?=E7=94=B3=E8=AF=B7=E5=8D=95=E7=8B=AC=E7=AB=8B=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=EF=BC=88=E9=87=87=E8=B4=AD=E7=AE=A1=E7=90=86=E4=B9=8B=E5=90=8E?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 路由位置 -------- 放在「采购管理」之后,作为独立一级模块: 采购管理 我的申请单 ← 新增(icon: Tickets) 借库管理 ★ 独立模块而非挂在某个业务页下:申请人可能提交出库/借库/报废三类单据, 放在任一业务模块下都会让其它模块的人找不到。 页面功能 -------- · 类型筛选:全部 / 出库 / 借库 / 报废 · 状态筛选:全部 / 待审批 / 已通过 / 已驳回 / 已完成 / 已撤回 · 展开行显示物料明细(数量字段已由后端归一化) · 撤回按钮仅对 status 0/1 可见(已预占但未执行) 撤回不硬编码 URL —— 使用后端回传的 withdraw_endpoint 分发: const res = await request({ url: row.withdraw_endpoint, method: 'post' }) 这样将来模块端点调整(如借库从 close 换成正式 withdraw),前端无需改动。 权限说明 -------- 菜单不做权限过滤(Sidebar 只过滤 meta.hidden),所有角色都会看到本页。 这正是预期 —— 申请人本就不应需要任何权限码。数据由后端强制按 applicant_id 过滤,看不到他人单据。 顺带清理 -------- 移除先前加在 Selection.vue 的重复实现(约 110 行模板/脚本/样式), 改为一个跳转链接「查看我的申请单 >」;并移除随之失效的 3 个导入 (onMounted / Refresh / 两个 API 函数)。 验证:新页面 SFC 编译零告警;Selection.vue 清理后编译通过。 --- inventory-web/src/api/outbound.ts | 44 ++++ inventory-web/src/router/index.ts | 19 ++ inventory-web/src/views/my-requests/index.vue | 238 ++++++++++++++++++ .../src/views/outbound/Selection.vue | 7 +- 4 files changed, 307 insertions(+), 1 deletion(-) create mode 100644 inventory-web/src/views/my-requests/index.vue diff --git a/inventory-web/src/api/outbound.ts b/inventory-web/src/api/outbound.ts index e934cef..c20c83b 100644 --- a/inventory-web/src/api/outbound.ts +++ b/inventory-web/src/api/outbound.ts @@ -195,3 +195,47 @@ export function getStockAlternatives( } }) } + +/** + * 我的申请单(申请人视角) + * + * 走专用端点,仅需登录态 —— 服务端硬编码 applicant_id = 当前用户, + * 普通申请人无需持有 outbound_approval(那是管理权限)即可查看自己的单据。 + */ +export function getMyOutboundRequests(params: { page?: number; limit?: number; status?: number | '' }) { + return request({ + url: '/v1/outbound/my-requests', + method: 'get', + params + }) +} + +/** + * 撤回自己的申请单(待审批 或 已通过但未执行) + * 服务端会断言单据归属,非本人且非管理者将返回 403。 + */ +export function withdrawOutboundRequest(id: number) { + return request({ + url: `/v1/outbound/request/${id}/withdraw`, + method: 'post' + }) +} + +/** + * 我的申请单(跨模块聚合:出库 + 借库 + 报废) + * + * 走专用的 /my-requests 聚合端点,仅需登录态 —— 服务端硬编码 + * applicant_id = 当前用户,普通员工无需任何审批类权限即可查看自己的单据。 + */ +export function getMyRequests(params: { + page?: number + limit?: number + status?: number | '' + type?: 'all' | 'outbound' | 'borrow' | 'scrap' +}) { + return request({ + url: '/v1/my-requests', + method: 'get', + params + }) +} diff --git a/inventory-web/src/router/index.ts b/inventory-web/src/router/index.ts index a3ad2ed..87de087 100644 --- a/inventory-web/src/router/index.ts +++ b/inventory-web/src/router/index.ts @@ -201,6 +201,25 @@ const routes: Array = [ ] }, + // 6.0 我的申请单(申请人视角,跨模块聚合) + // + // ★ 独立模块而非挂在某个业务页下:申请人可能提交出库/借库/报废三类单据, + // 放在任一业务模块下都会让其它模块的人找不到。 + // 本页数据来自 /my-requests 聚合端点(仅需登录态,服务端硬编码 + // applicant_id=当前用户),因此不需要也不应配置审批类权限码。 + { + path: '/my-requests', + component: Layout, + children: [ + { + path: '', + name: 'MyRequests', + component: () => import('@/views/my-requests/index.vue'), + meta: { title: '我的申请单', icon: 'Tickets' } + } + ] + }, + // 6. 借库管理 { path: '/operation', diff --git a/inventory-web/src/views/my-requests/index.vue b/inventory-web/src/views/my-requests/index.vue new file mode 100644 index 0000000..a22685c --- /dev/null +++ b/inventory-web/src/views/my-requests/index.vue @@ -0,0 +1,238 @@ + + + + + diff --git a/inventory-web/src/views/outbound/Selection.vue b/inventory-web/src/views/outbound/Selection.vue index a74e9f8..4a447e1 100644 --- a/inventory-web/src/views/outbound/Selection.vue +++ b/inventory-web/src/views/outbound/Selection.vue @@ -115,6 +115,11 @@ 共 {{ selectedItems.length }} 种物品, 合计出库 {{ totalExportCount }} 件 +
+ + 查看我的申请单 > + +
@@ -1345,10 +1350,10 @@ const confirmExport = () => { exportLoading.value = false; } } +