From c35ec9a65942af4464ae075a076b0b45416e8263 Mon Sep 17 00:00:00 2001 From: yueli Date: Thu, 10 Sep 2026 12:06:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(records):=20=E5=87=BA=E5=BA=93/=E5=80=9F?= =?UTF-8?q?=E8=BF=98=E8=AE=B0=E5=BD=95=E7=BB=9F=E4=B8=80=E9=AB=98=E7=BA=A7?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E7=89=88=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 三个记录页(出库/借还/报废)此前搜索区形态各异:出库用裸 div + 分散样式, 借还缺日期范围,报废只有 SKU 输入框。现统一为 el-form :inline="true" + .filter-form 版式,并补齐缺失的过滤维度。 借还记录(新增日期范围能力): · 后端 get_records 增加 start_date/end_date 参数,按「借出时间」过滤; · 边界补全时分秒(YYYY-MM-DD → 当日 00:00:00 / 23:59:59), 与出库记录同口径,解决零点截断导致当天记录漏查的问题; · API 层透传两个新参数。 出库记录: · 版式统一为 inline 表单,日期选择器加 label; · 新增「重置」按钮; · 搜索类型切换由 500ms 防抖改为立即查询。 借还记录: · 新增「重置」按钮;搜索类型/状态切换改为立即查询(取消防抖)。 实测(SUPER_ADMIN): 报废 全部/单号/SKU/操作人/物料名/日期 六类过滤均 200 且命中正确; 借还 无过滤 52 单 / 本月 18 单 / 空区间 0 单(日期过滤生效); 出库 无过滤 395 单 / SKU 277 / 姓名 7 / 物料名 16 / 单号 OUT-2026 命中 395。 --- inventory-backend/app/api/v1/transactions.py | 5 +- .../app/services/trans_service.py | 24 +++- inventory-web/src/views/outbound/index.vue | 107 ++++++++++----- .../src/views/transaction/records.vue | 122 +++++++++++++----- 4 files changed, 187 insertions(+), 71 deletions(-) diff --git a/inventory-backend/app/api/v1/transactions.py b/inventory-backend/app/api/v1/transactions.py index 2c2207e..ef5c60f 100644 --- a/inventory-backend/app/api/v1/transactions.py +++ b/inventory-backend/app/api/v1/transactions.py @@ -162,6 +162,8 @@ def get_records(): page = int(request.args.get('page', 1)) keyword = request.args.get('keyword', '') search_type = request.args.get('search_type', 'all') + start_date = request.args.get('start_date', '') + end_date = request.args.get('end_date', '') # ★ 数据权限:普通用户只看“借用人=本人姓名(不含账号前缀)”的借还记录;管理者看全部 borrower_name = None @@ -175,7 +177,8 @@ def get_records(): res = TransService.get_records( page=page, limit=10, status=status, keyword=keyword, - search_type=search_type, borrower_name=borrower_name + search_type=search_type, borrower_name=borrower_name, + start_date=start_date, end_date=end_date, ) # ★ service 层异常时:code==500 的字典(带 traceback),需要直通到前端,便于排查 diff --git a/inventory-backend/app/services/trans_service.py b/inventory-backend/app/services/trans_service.py index 1f10c57..78c8172 100644 --- a/inventory-backend/app/services/trans_service.py +++ b/inventory-backend/app/services/trans_service.py @@ -414,7 +414,8 @@ class TransService: raise e @staticmethod - def get_records(page=1, limit=10, status='all', keyword=None, search_type='all', borrower_name=None): + def get_records(page=1, limit=10, status='all', keyword=None, search_type='all', + borrower_name=None, start_date=None, end_date=None): """ 获取借还记录列表(按单号 borrow_no 维度分页,避免明细撑爆 pageSize) @@ -429,7 +430,14 @@ class TransService: 状态过滤按"单号聚合"判定: - borrowed: 单号下至少有一条 is_returned=False - returned: 单号下所有明细 is_returned=True + + 日期范围按「借出时间」过滤,边界补全时分秒以解决零点截断问题。 """ + # 日期补全:与出库记录同口径 + if end_date and len(str(end_date).strip()) == 10: + end_date = f"{str(end_date).strip()} 23:59:59" + if start_date and len(str(start_date).strip()) == 10: + start_date = f"{str(start_date).strip()} 00:00:00" try: # ==================================================================== # 步骤 1a:构造"单号维度"基础子查询(GROUP BY borrow_no 在这里完成) @@ -680,6 +688,20 @@ class TransService: order_subq.c.borrow_no.in_(company_borrow_nos_subq) ) + # 日期范围过滤(按借出时间;边界已在入口补全时分秒) + if start_date: + borrow_no_q = borrow_no_q.filter(order_subq.c.borrow_no.in_( + db.session.query(TransBorrow.borrow_no) + .filter(TransBorrow.borrow_time >= start_date) + .distinct() + )) + if end_date: + borrow_no_q = borrow_no_q.filter(order_subq.c.borrow_no.in_( + db.session.query(TransBorrow.borrow_no) + .filter(TransBorrow.borrow_time <= end_date) + .distinct() + )) + # 状态过滤(按"单号聚合"判定) if status == 'borrowed': # 单号下至少一条未还 diff --git a/inventory-web/src/views/outbound/index.vue b/inventory-web/src/views/outbound/index.vue index 6c6a251..66a369f 100644 --- a/inventory-web/src/views/outbound/index.vue +++ b/inventory-web/src/views/outbound/index.vue @@ -1,41 +1,51 @@