From fa8b113f9d45ff852f632f835f1ccfbd5ff036fd Mon Sep 17 00:00:00 2001 From: DXC Date: Thu, 19 Mar 2026 15:42:36 +0800 Subject: [PATCH] fix: implement sequential order_no generation and enforce UTC+8 Beijing time for adjustments --- .../app/api/v1/stock/adjustment.py | 51 ++++++++++++++----- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/inventory-backend/app/api/v1/stock/adjustment.py b/inventory-backend/app/api/v1/stock/adjustment.py index 1986821..eb29563 100644 --- a/inventory-backend/app/api/v1/stock/adjustment.py +++ b/inventory-backend/app/api/v1/stock/adjustment.py @@ -2,25 +2,46 @@ from flask import Blueprint, request, jsonify from flask_jwt_extended import jwt_required, get_jwt_identity, get_jwt from app.utils.decorators import permission_required -from app.extensions import db, beijing_time +from app.extensions import db from app.models.stock.adjustment import StockAdjustment from app.models.base import MaterialBase from app.models.inbound.buy import StockBuy from app.models.inbound.semi import StockSemi from app.models.inbound.product import StockProduct from app.models.inbound.stocktake import StocktakeDraft -from datetime import datetime -import random -import string +from datetime import datetime, timedelta +from sqlalchemy import func adjustment_bp = Blueprint('adjustment', __name__, url_prefix='/stock/adjustment') +def get_beijing_time(): + """获取北京时间 (UTC+8)""" + return datetime.utcnow() + timedelta(hours=8) + + def generate_order_no(): - """生成单号 ADJ-YYYYMMDD-XXXX""" - today = datetime.now().strftime('%Y%m%d') - suffix = ''.join(random.choices(string.digits, k=4)) - return f'ADJ-{today}-{suffix}' + """生成单号 ADJ-YYYYMMDD-XXXX,按天严格自增""" + bj_time = get_beijing_time() + date_str = bj_time.strftime('%Y%m%d') + prefix = f"ADJ-{date_str}-" + + # 查询今天已有的最大单号 + last_order = StockAdjustment.query.filter( + StockAdjustment.order_no.like(f"{prefix}%") + ).order_by(StockAdjustment.order_no.desc()).first() + + if last_order: + # 解析最后的 4 位流水号并 +1 + try: + last_seq = int(last_order.order_no.split('-')[-1]) + new_seq = last_seq + 1 + except (ValueError, IndexError): + new_seq = 1 + else: + new_seq = 1 + + return f"{prefix}{new_seq:04d}" # 补齐 4 位,如 0001 def get_stock_model(source_table): @@ -134,7 +155,8 @@ def create(): return jsonify({'code': 400, 'msg': '无效的调整类型'}), 400 try: - # 创建调整单 + # 创建调整单(强制使用北京时间) + bj_time = get_beijing_time() adjustment = StockAdjustment( order_no=generate_order_no(), base_id=base_id, @@ -148,7 +170,9 @@ def create(): adjust_quantity=adjust_quantity, reason=reason, status='completed', - operator=operator + operator=operator, + create_time=bj_time, + update_time=bj_time ) db.session.add(adjustment) @@ -351,7 +375,8 @@ def import_from_stocktake(): # 生成调整单号 order_no = generate_order_no() - # 创建调整单(使用北京时间) + # 创建调整单(强制使用北京时间) + bj_time = get_beijing_time() adjustment = StockAdjustment( order_no=order_no, base_id=base_id, @@ -364,7 +389,8 @@ def import_from_stocktake(): reason=reason, status='pending', operator=operator, - create_time=beijing_time() + create_time=bj_time, + update_time=bj_time ) db.session.add(adjustment) count += 1 @@ -418,6 +444,7 @@ def process_adjustment(id): adjustment.status = 'completed' adjustment.operator = operator + adjustment.update_time = get_beijing_time() db.session.commit() return jsonify({'code': 200, 'msg': '处理成功', 'data': adjustment.to_dict()})