fix: implement sequential order_no generation and enforce UTC+8 Beijing time for adjustments

This commit is contained in:
DXC
2026-03-19 15:42:36 +08:00
parent b37049a4d7
commit fa8b113f9d

View File

@ -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()})