From f499346f7423a2e0c39910e41aa783fc18cd9665 Mon Sep 17 00:00:00 2001 From: yueli Date: Mon, 31 Aug 2026 13:49:11 +0800 Subject: [PATCH] =?UTF-8?q?refactor(purchase):=20=E6=89=B9=E6=AC=A1?= =?UTF-8?q?=E6=A6=82=E5=BF=B5=E6=94=B9=E4=B8=BA=E5=9F=BA=E4=BA=8E=20reques?= =?UTF-8?q?t=5Fno=20=E5=89=8D=E7=BC=80=E6=8E=A8=E5=AF=BC=EF=BC=8C=E6=92=A4?= =?UTF-8?q?=E9=94=80=E6=95=B0=E6=8D=AE=E5=BA=93=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按用户反馈:不需要新增数据库字段,现有 request_no (PUR-20260831-1021-0001) 本身就能推导批次——去掉末尾4位流水号即为批次前缀。 - 撤销 purchase_request.batch_no 字段(模型/数据库) - 撤销 create 接口的 batch_no 参数与 generate_batch_no - 批次标识 = request_no 去掉末尾 -XXXX 段 getBatchKey('PUR-20260831-1021-0001') = 'PUR-20260831-1021' - 按批次查询/批量审批接口改用 batch_key (request_no LIKE 前缀) - 前端列表批次号列、整批弹窗、一键审批本批均基于前缀推导 - 零数据库迁移,历史数据立即可用 --- inventory-backend/app/api/v1/purchase.py | 28 +++++------ inventory-backend/app/models/purchase.py | 3 -- .../app/services/purchase_service.py | 16 ------- inventory-web/src/api/purchase.ts | 8 ++-- inventory-web/src/views/purchase/index.vue | 48 +++++++++---------- 5 files changed, 40 insertions(+), 63 deletions(-) diff --git a/inventory-backend/app/api/v1/purchase.py b/inventory-backend/app/api/v1/purchase.py index 7fcc250..b15507e 100644 --- a/inventory-backend/app/api/v1/purchase.py +++ b/inventory-backend/app/api/v1/purchase.py @@ -158,18 +158,18 @@ def get_purchase_detail(purchase_id): # -------------------------------------------------------- -# 3.5 按批次查询采购申请(同一批提交的多条记录) -# GET /api/v1/purchase/batch/ +# 3.5 按批次查询采购申请(同一批提交的多条记录,批次=request_no去掉末尾流水号) +# GET /api/v1/purchase/batch/ # -------------------------------------------------------- -@purchase_bp.route('/batch/', methods=['GET']) +@purchase_bp.route('/batch/', methods=['GET']) @jwt_required() -def get_purchase_by_batch(batch_no): - """按批次号查询同一批提交的所有采购申请记录""" +def get_purchase_by_batch(batch_key): + """按批次前缀(request_no 去掉末尾4位流水号)查询同一批的所有记录""" try: from app.models.purchase import PurchaseRequest records = PurchaseRequest.query.filter( - PurchaseRequest.batch_no == batch_no - ).order_by(PurchaseRequest.id.asc()).all() + PurchaseRequest.request_no.like(f"{batch_key}-%") + ).order_by(PurchaseRequest.request_no.asc()).all() user_id = get_current_user_id() has_perm = _user_has_purchase_perm() @@ -183,7 +183,7 @@ def get_purchase_by_batch(batch_no): d.pop(k, None) items.append(d) - return jsonify({'code': 200, 'msg': '获取成功', 'data': {'batch_no': batch_no, 'items': items}}), 200 + return jsonify({'code': 200, 'msg': '获取成功', 'data': {'batch_key': batch_key, 'items': items}}), 200 except Exception as e: traceback.print_exc() return jsonify({'code': 500, 'msg': str(e)}), 500 @@ -248,7 +248,7 @@ def batch_approve_purchase(): { "ids": [1, 2, 3], // 按 ID 列表审批 或 - "batch_no": "BATCH-xxx", // 按批次号审批整批(同一批提交的记录) + "batch_key": "PUR-20260831-1021", // 按批次前缀审批整批(同批流水号连续) "action": "approve" | "reject", "reject_reason": "驳回原因(reject 时必填)" } @@ -257,15 +257,15 @@ def batch_approve_purchase(): user_id = get_current_user_id() data = request.get_json() or {} ids = data.get('ids', []) - batch_no = data.get('batch_no') + batch_key = data.get('batch_key') action = data.get('action', 'approve') reject_reason = data.get('reject_reason') - # 若传 batch_no,则查出该批次的所有待审批记录 ID - if batch_no: + # 若传 batch_key(request_no 去掉末尾流水号的前缀),查出该批次所有待审批记录 + if batch_key: from app.models.purchase import PurchaseRequest records = PurchaseRequest.query.filter( - PurchaseRequest.batch_no == batch_no, + PurchaseRequest.request_no.like(f"{batch_key}-%"), PurchaseRequest.status == 0 ).all() ids = [r.id for r in records] @@ -273,7 +273,7 @@ def batch_approve_purchase(): return jsonify({'code': 400, 'msg': '该批次没有待审批的记录'}), 400 if not ids or not isinstance(ids, list): - return jsonify({'code': 400, 'msg': 'ids 或 batch_no 不能为空'}), 400 + return jsonify({'code': 400, 'msg': 'ids 或 batch_key 不能为空'}), 400 if action not in ('approve', 'reject'): return jsonify({'code': 400, 'msg': '无效的审批操作'}), 400 if action == 'reject' and not reject_reason: diff --git a/inventory-backend/app/models/purchase.py b/inventory-backend/app/models/purchase.py index 0236fa1..2f43f0d 100644 --- a/inventory-backend/app/models/purchase.py +++ b/inventory-backend/app/models/purchase.py @@ -11,8 +11,6 @@ class PurchaseRequest(db.Model): id = db.Column(db.Integer, primary_key=True) request_no = db.Column(db.String(100), unique=True, nullable=False, index=True) - # [新增] 采购批次号:同一批循环提交的多条记录共享,用于分组查看/统计 - batch_no = db.Column(db.String(100), index=True, comment='采购批次号(同一批提交的多条记录共享)') # [新增] 硬关联基础物料表,打通"按单入库"链路 base_id = db.Column(db.Integer, db.ForeignKey('material_base.id'), index=True, comment='关联基础物料ID') name = db.Column(db.String(255), nullable=False, comment='采购名称') @@ -81,7 +79,6 @@ class PurchaseRequest(db.Model): return { 'id': self.id, 'request_no': self.request_no, - 'batch_no': self.batch_no or '', 'base_id': self.base_id, 'name': self.name, 'spec_model': self.spec_model or '', diff --git a/inventory-backend/app/services/purchase_service.py b/inventory-backend/app/services/purchase_service.py index 700fa6b..adf9eaf 100644 --- a/inventory-backend/app/services/purchase_service.py +++ b/inventory-backend/app/services/purchase_service.py @@ -20,18 +20,6 @@ class PurchaseService: .filter(PurchaseRequest.request_no.like(f"{prefix}%")).scalar() return f"{prefix}{(existing_count + 1):04d}" - @staticmethod - def generate_batch_no(): - """生成采购批次号: BATCH-yyyyMMdd-HHmm-当日流水(4位) - 同一批循环提交的多条记录共享同一 batch_no""" - import uuid - beijing_tz = timezone(timedelta(hours=8)) - now = datetime.now(beijing_tz) - date_str = now.strftime('%Y%m%d') - time_str = now.strftime('%H%M') - # 用时间戳 + 随机段确保唯一 - return f"BATCH-{date_str}-{time_str}-{uuid.uuid4().hex[:4].upper()}" - @staticmethod def auto_fill_from_material(keyword: str): """ @@ -79,12 +67,8 @@ class PurchaseService: if material: base_id = material.id - # [新增] 批次号:前端同一批循环提交时传入同一 batch_no,无则自动生成 - batch_no = data.get('batch_no') or PurchaseService.generate_batch_no() - purchase = PurchaseRequest( request_no=request_no, - batch_no=batch_no, # [新增] base_id=base_id, # [新增] name=data['name'], spec_model=data.get('spec_model', ''), diff --git a/inventory-web/src/api/purchase.ts b/inventory-web/src/api/purchase.ts index 8bb259d..c626819 100644 --- a/inventory-web/src/api/purchase.ts +++ b/inventory-web/src/api/purchase.ts @@ -90,7 +90,7 @@ export function approvePurchase(id: number, data: { // 批量审批采购申请(循环提交产生的多条记录可一次审批) export function batchApprovePurchase(data: { ids?: number[] - batch_no?: string + batch_key?: string action: 'approve' | 'reject' reject_reason?: string }) { @@ -101,10 +101,10 @@ export function batchApprovePurchase(data: { }) } -// 按批次号查询同批次的采购申请记录 -export function getPurchaseByBatch(batchNo: string) { +// 按批次前缀查询同批次的采购申请记录(批次=request_no去掉末尾流水号) +export function getPurchaseByBatch(batchKey: string) { return request({ - url: `/purchase/batch/${encodeURIComponent(batchNo)}`, + url: `/purchase/batch/${encodeURIComponent(batchKey)}`, method: 'get' }) } diff --git a/inventory-web/src/views/purchase/index.vue b/inventory-web/src/views/purchase/index.vue index 1ce5eed..41f301e 100644 --- a/inventory-web/src/views/purchase/index.vue +++ b/inventory-web/src/views/purchase/index.vue @@ -52,11 +52,11 @@ - + @@ -69,7 +69,7 @@