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 import Blueprint, request, jsonify
|
||||||
from flask_jwt_extended import jwt_required, get_jwt_identity, get_jwt
|
from flask_jwt_extended import jwt_required, get_jwt_identity, get_jwt
|
||||||
from app.utils.decorators import permission_required
|
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.stock.adjustment import StockAdjustment
|
||||||
from app.models.base import MaterialBase
|
from app.models.base import MaterialBase
|
||||||
from app.models.inbound.buy import StockBuy
|
from app.models.inbound.buy import StockBuy
|
||||||
from app.models.inbound.semi import StockSemi
|
from app.models.inbound.semi import StockSemi
|
||||||
from app.models.inbound.product import StockProduct
|
from app.models.inbound.product import StockProduct
|
||||||
from app.models.inbound.stocktake import StocktakeDraft
|
from app.models.inbound.stocktake import StocktakeDraft
|
||||||
from datetime import datetime
|
from datetime import datetime, timedelta
|
||||||
import random
|
from sqlalchemy import func
|
||||||
import string
|
|
||||||
|
|
||||||
adjustment_bp = Blueprint('adjustment', __name__, url_prefix='/stock/adjustment')
|
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():
|
def generate_order_no():
|
||||||
"""生成单号 ADJ-YYYYMMDD-XXXX"""
|
"""生成单号 ADJ-YYYYMMDD-XXXX,按天严格自增"""
|
||||||
today = datetime.now().strftime('%Y%m%d')
|
bj_time = get_beijing_time()
|
||||||
suffix = ''.join(random.choices(string.digits, k=4))
|
date_str = bj_time.strftime('%Y%m%d')
|
||||||
return f'ADJ-{today}-{suffix}'
|
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):
|
def get_stock_model(source_table):
|
||||||
@ -134,7 +155,8 @@ def create():
|
|||||||
return jsonify({'code': 400, 'msg': '无效的调整类型'}), 400
|
return jsonify({'code': 400, 'msg': '无效的调整类型'}), 400
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# 创建调整单
|
# 创建调整单(强制使用北京时间)
|
||||||
|
bj_time = get_beijing_time()
|
||||||
adjustment = StockAdjustment(
|
adjustment = StockAdjustment(
|
||||||
order_no=generate_order_no(),
|
order_no=generate_order_no(),
|
||||||
base_id=base_id,
|
base_id=base_id,
|
||||||
@ -148,7 +170,9 @@ def create():
|
|||||||
adjust_quantity=adjust_quantity,
|
adjust_quantity=adjust_quantity,
|
||||||
reason=reason,
|
reason=reason,
|
||||||
status='completed',
|
status='completed',
|
||||||
operator=operator
|
operator=operator,
|
||||||
|
create_time=bj_time,
|
||||||
|
update_time=bj_time
|
||||||
)
|
)
|
||||||
db.session.add(adjustment)
|
db.session.add(adjustment)
|
||||||
|
|
||||||
@ -351,7 +375,8 @@ def import_from_stocktake():
|
|||||||
# 生成调整单号
|
# 生成调整单号
|
||||||
order_no = generate_order_no()
|
order_no = generate_order_no()
|
||||||
|
|
||||||
# 创建调整单(使用北京时间)
|
# 创建调整单(强制使用北京时间)
|
||||||
|
bj_time = get_beijing_time()
|
||||||
adjustment = StockAdjustment(
|
adjustment = StockAdjustment(
|
||||||
order_no=order_no,
|
order_no=order_no,
|
||||||
base_id=base_id,
|
base_id=base_id,
|
||||||
@ -364,7 +389,8 @@ def import_from_stocktake():
|
|||||||
reason=reason,
|
reason=reason,
|
||||||
status='pending',
|
status='pending',
|
||||||
operator=operator,
|
operator=operator,
|
||||||
create_time=beijing_time()
|
create_time=bj_time,
|
||||||
|
update_time=bj_time
|
||||||
)
|
)
|
||||||
db.session.add(adjustment)
|
db.session.add(adjustment)
|
||||||
count += 1
|
count += 1
|
||||||
@ -418,6 +444,7 @@ def process_adjustment(id):
|
|||||||
|
|
||||||
adjustment.status = 'completed'
|
adjustment.status = 'completed'
|
||||||
adjustment.operator = operator
|
adjustment.operator = operator
|
||||||
|
adjustment.update_time = get_beijing_time()
|
||||||
|
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return jsonify({'code': 200, 'msg': '处理成功', 'data': adjustment.to_dict()})
|
return jsonify({'code': 200, 'msg': '处理成功', 'data': adjustment.to_dict()})
|
||||||
|
|||||||
Reference in New Issue
Block a user