fix: implement sequential order_no generation and enforce UTC+8 Beijing time for adjustments
This commit is contained in:
@ -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()})
|
||||
|
||||
Reference in New Issue
Block a user