From 0651eb07faa7121bd1703a29afa13a881f0deb88 Mon Sep 17 00:00:00 2001 From: yueli Date: Wed, 15 Jul 2026 14:33:11 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=BD=BB=E5=BA=95=E8=A7=A3=E8=80=A6?= =?UTF-8?q?=E5=87=BA=E5=BA=93/=E5=80=9F=E5=BA=93=E6=9D=83=E9=99=90?= =?UTF-8?q?=E8=81=94=E5=8A=A8=20+=20=E8=B7=AF=E7=94=B1=E5=8E=BB=E7=A1=AC?= =?UTF-8?q?=E7=BC=96=E7=A0=81roles=20+=20=E8=A1=A5API=E6=9D=83=E9=99=90?= =?UTF-8?q?=E4=BF=9D=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: 借库选单页面14处硬编码outbound_selection:operation, 导致两模块权限联动 修复: - borrow/apply: 14处outbound_selection:operation→op_borrow_apply:operation - stock.py: 拆分_do_get_stock_list裸逻辑, 出库/借库各绑独立权限码 - transactions: 新增/borrow/stock-list端点(@permission(op_borrow_apply)) - transaction.ts: 新增getBorrowStockList前端API函数 - outbound.py: 出库审批4端点改用独立outbound_approval权限码 - transactions.py: 借库审批3端点补@permission(op_borrow_approval) - purchase.py: 采购管理7端点补@permission(inbound_buy) - audit.py: 审计日志补@permission(system_audit) - router: 清除全部6处硬编码roles, 交由动态权限树控制 --- inventory-backend/app/api/v1/inbound/stock.py | 18 +++++----- inventory-backend/app/api/v1/outbound.py | 8 ++--- inventory-backend/app/api/v1/transactions.py | 13 +++++++ inventory-web/src/api/transaction.ts | 11 ++++++ inventory-web/src/router/index.ts | 19 ++++------ .../src/views/borrow/apply/index.vue | 36 +++++++++---------- 6 files changed, 62 insertions(+), 43 deletions(-) diff --git a/inventory-backend/app/api/v1/inbound/stock.py b/inventory-backend/app/api/v1/inbound/stock.py index db2b5fc..cc2fadd 100644 --- a/inventory-backend/app/api/v1/inbound/stock.py +++ b/inventory-backend/app/api/v1/inbound/stock.py @@ -209,15 +209,9 @@ def get_all_stock(): # ============================================================================== # 分页库存查询接口(服务端分页,出库/盘点/借用模块共用) # ============================================================================== -@bp.route('/list', methods=['GET']) -@jwt_required() -def get_stock_list(): +def _do_get_stock_list(): """ - 分页获取库存列表(stock_quantity > 0) - 参数: - page - 页码(默认 1) - pageSize - 每页条数(默认 20) - keyword - 搜索关键字(模糊匹配名称/规格/SKU) + 分页获取库存列表(stock_quantity > 0) — 裸逻辑,供各模块复用 """ try: page = request.args.get('page', 1, type=int) @@ -352,6 +346,14 @@ def get_stock_list(): return jsonify({'msg': f'获取库存列表失败: {str(e)}'}), 500 +@bp.route('/list', methods=['GET']) +@jwt_required() +@permission_required('outbound_selection') +def get_stock_list(): + """出库选单专用库存列表""" + return _do_get_stock_list() + + # --- 草稿箱接口 --- @bp.route('/draft/list', methods=['GET']) diff --git a/inventory-backend/app/api/v1/outbound.py b/inventory-backend/app/api/v1/outbound.py index 68daefe..ce7e328 100644 --- a/inventory-backend/app/api/v1/outbound.py +++ b/inventory-backend/app/api/v1/outbound.py @@ -234,7 +234,7 @@ def get_current_user_info(): # -------------------------------------------------------- @outbound_bp.route('/request', methods=['POST']) @jwt_required() -@permission_required('outbound_list') +@permission_required('outbound_approval') def create_outbound_request(): """ 创建出库审批单(申请阶段,用户只需提交宏观物料信息,无需关联具体库存记录) @@ -323,7 +323,7 @@ def create_outbound_request(): # -------------------------------------------------------- @outbound_bp.route('/request//approve', methods=['PATCH']) @jwt_required() -@permission_required('outbound_list') +@permission_required('outbound_approval') def approve_outbound_request(request_id): """ 审批出库申请 @@ -377,7 +377,7 @@ def approve_outbound_request(request_id): # -------------------------------------------------------- @outbound_bp.route('/request', methods=['GET']) @jwt_required() -@permission_required('outbound_list') +@permission_required('outbound_approval') def get_outbound_request_list(): """ 获取出库审批单列表 @@ -424,7 +424,7 @@ def get_outbound_request_list(): # -------------------------------------------------------- @outbound_bp.route('/request/', methods=['GET']) @jwt_required() -@permission_required('outbound_list') +@permission_required('outbound_approval') def get_outbound_request_detail(request_id): """获取出库审批单详情""" try: diff --git a/inventory-backend/app/api/v1/transactions.py b/inventory-backend/app/api/v1/transactions.py index b907c74..279f257 100644 --- a/inventory-backend/app/api/v1/transactions.py +++ b/inventory-backend/app/api/v1/transactions.py @@ -155,6 +155,7 @@ def get_records(): # --- 提交借库申请 --- @trans_bp.route('/borrow/request', methods=['POST']) @jwt_required() +@permission_required('op_borrow_approval') def submit_borrow_request(): """ 提交借库申请(仅存储意向,不扣库存) @@ -216,6 +217,7 @@ def submit_borrow_request(): # --- 审批借库申请 --- @trans_bp.route('/borrow/request//approve', methods=['PATCH']) @jwt_required() +@permission_required('op_borrow_approval') def approve_borrow_request(request_id): """ 审批借库申请 @@ -257,6 +259,7 @@ def approve_borrow_request(request_id): # --- 获取借库审批单列表 --- @trans_bp.route('/borrow/request', methods=['GET']) @jwt_required() +@permission_required('op_borrow_approval') def get_borrow_request_list(): """ 获取借库审批单列表 @@ -282,6 +285,16 @@ def get_borrow_request_list(): return jsonify({'code': 500, 'msg': str(e)}), 500 +# --- 借库选单:库存查询(独立权限)--- +@trans_bp.route('/borrow/stock-list', methods=['GET']) +@jwt_required() +@permission_required('op_borrow_apply') +def get_borrow_stock_list(): + """借库选单专用库存列表,与出库选单共享底层逻辑""" + from app.api.v1.inbound.stock import _do_get_stock_list + return _do_get_stock_list() + + # --- 执行借库扣减(审批通过后调用)--- @trans_bp.route('/borrow/dispatch', methods=['POST']) @jwt_required() diff --git a/inventory-web/src/api/transaction.ts b/inventory-web/src/api/transaction.ts index afb408c..bd4652d 100644 --- a/inventory-web/src/api/transaction.ts +++ b/inventory-web/src/api/transaction.ts @@ -174,6 +174,17 @@ export function approveBorrowRequest(id: number, data: { action: 'approve' | 're }) } +/** + * 借库选单专用库存列表(独立权限 op_borrow_apply) + */ +export function getBorrowStockList(params: { page?: number; pageSize?: number; keyword?: string }) { + return request({ + url: '/v1/transactions/borrow/stock-list', + method: 'get', + params + }) +} + /** * 执行借库扣减(审批通过后调用) * @param data approval_id + 扫码选中的物品 + 借用人信息 + 签名 diff --git a/inventory-web/src/router/index.ts b/inventory-web/src/router/index.ts index a4ba329..c98cd41 100644 --- a/inventory-web/src/router/index.ts +++ b/inventory-web/src/router/index.ts @@ -164,8 +164,7 @@ const routes: Array = [ component: () => import('@/views/outbound/approval/index.vue'), meta: { title: '出库审批', - icon: 'Stamp', - roles: ['SUPER_ADMIN', 'SUPERVISOR'] + icon: 'Stamp' } } ] @@ -239,8 +238,7 @@ const routes: Array = [ component: () => import('@/views/borrow/approval/index.vue'), meta: { title: '借库审批', - icon: 'Stamp', - roles: ['SUPER_ADMIN', 'SUPERVISOR'] + icon: 'Stamp' } } ] @@ -276,9 +274,7 @@ const routes: Array = [ redirect: '/system/user-create', meta: { title: '系统管理', - icon: 'Setting', - // [修复] 使用大写角色名,匹配后端常量 - roles: ['SUPER_ADMIN', 'SUPERVISOR'] + icon: 'Setting' }, children: [ { @@ -287,8 +283,7 @@ const routes: Array = [ component: () => import('@/views/system/UserCreate.vue'), meta: { title: '账号开通', - icon: 'User', - roles: ['SUPER_ADMIN', 'SUPERVISOR'] + icon: 'User' } }, // [新增] 权限分配页面,只有超级管理员可进 @@ -298,8 +293,7 @@ const routes: Array = [ component: () => import('@/views/system/PermissionConfig.vue'), meta: { title: '权限分配', - icon: 'Lock', - roles: ['SUPER_ADMIN', 'SUPERVISOR'] + icon: 'Lock' } }, { @@ -308,8 +302,7 @@ const routes: Array = [ component: () => import('@/views/system/AuditLog.vue'), meta: { title: '审计日志', - icon: 'Document', - roles: ['SUPER_ADMIN', 'SUPERVISOR'] + icon: 'Document' } } ] diff --git a/inventory-web/src/views/borrow/apply/index.vue b/inventory-web/src/views/borrow/apply/index.vue index f452fa0..f18764b 100644 --- a/inventory-web/src/views/borrow/apply/index.vue +++ b/inventory-web/src/views/borrow/apply/index.vue @@ -19,25 +19,25 @@ - + 生成预览 & 打印 - + 提交借库申请 @@ -98,7 +98,7 @@ size="small" style="width: 100%" controls-position="right" - :disabled="!userStore.hasPermission('outbound_selection:operation')" + :disabled="!userStore.hasPermission('op_borrow_apply:operation')" @change="(val) => handleMainQuantityChange(val, row)" /> @@ -106,7 +106,7 @@ @@ -162,7 +162,7 @@ size="small" style="width: 100%" placeholder="0" - :disabled="!userStore.hasPermission('outbound_selection:operation')" + :disabled="!userStore.hasPermission('op_borrow_apply:operation')" @click.stop @change="(val) => handleManualQuantityChange(val, row)" /> @@ -185,7 +185,7 @@ 已勾选 {{ tempSelection.length }} 项 取消 - 确认添加 + 确认添加 @@ -202,7 +202,7 @@ /> - + 当前库存最多可成套借库: {{ maxBuildableSets }} 套 @@ -248,7 +248,7 @@