增加入库记录页面,同时修正三组入库的时间问题

This commit is contained in:
dxc
2026-02-05 14:30:11 +08:00
parent 10e53cab23
commit 0bc47d306d
12 changed files with 511 additions and 85 deletions

View File

@ -41,7 +41,6 @@ class SemiInboundService:
@staticmethod
def handle_inbound(data):
# 局部导入 Model解决循环引用
from app.models.inbound.semi import StockSemi
try:
@ -53,16 +52,21 @@ class SemiInboundService:
if not material:
raise ValueError(f"ID为 {base_id} 的基础物料不存在")
# 1. 处理入库日期
in_date_val = datetime.utcnow().date()
# [核心修改] 处理入库日期(production_date),包含时分秒
current_time = datetime.now()
in_date_val = current_time
if data.get('in_date'):
try:
date_str = str(data['in_date'])
if len(date_str) > 10:
date_str = date_str[:10]
in_date_val = datetime.strptime(date_str, '%Y-%m-%d').date()
in_date_val = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S')
else:
d_temp = datetime.strptime(date_str, '%Y-%m-%d')
in_date_val = datetime(d_temp.year, d_temp.month, d_temp.day,
current_time.hour, current_time.minute, current_time.second)
except ValueError:
pass
in_date_val = current_time
# 2. 处理生产时间
p_start = None
@ -102,18 +106,15 @@ class SemiInboundService:
print("❌ 数据库序列 global_print_seq 不存在请执行SQL创建")
raise e
# 5. 自动生成 SKU
generated_sku = str(next_global_id).zfill(10)
final_sku = data.get('sku')
if not final_sku:
final_sku = generated_sku
# 6. 条码逻辑处理
final_barcode = data.get('barcode')
if not final_barcode:
final_barcode = final_sku
# 7. 图片列表转 JSON 字符串处理
arrival_list = data.get('arrival_photo', [])
quality_report_list = data.get('quality_report_link', [])
@ -125,7 +126,7 @@ class SemiInboundService:
base_id=material.id,
global_print_id=next_global_id,
sku=final_sku,
production_date=in_date_val,
production_date=in_date_val, # 存入 DateTime
serial_number=data.get('serial_number'),
batch_number=data.get('batch_number'),
@ -151,7 +152,6 @@ class SemiInboundService:
manual_cost=manual_cost,
total_price=total_value,
# [核心修改] 将列表转为 JSON 字符串存储
arrival_photo=json.dumps(arrival_list),
quality_report_link=json.dumps(quality_report_list),
@ -174,8 +174,6 @@ class SemiInboundService:
from app.models.inbound.semi import StockSemi
try:
print(f"----- UPDATE SEMI DEBUG: ID={stock_id} -----")
stock = StockSemi.query.get(stock_id)
if not stock:
raise ValueError("记录不存在")
@ -200,7 +198,6 @@ class SemiInboundService:
if frontend_key in data:
setattr(stock, db_attr, data[frontend_key])
# [核心修改] 图片字段更新 (List -> JSON String)
if 'arrival_photo' in data:
imgs = data['arrival_photo']
if isinstance(imgs, list):
@ -211,7 +208,6 @@ class SemiInboundService:
if isinstance(imgs, list):
stock.quality_report_link = json.dumps(imgs)
# 时间处理
if 'production_start_time' in data:
try:
if data['production_start_time']:
@ -232,7 +228,6 @@ class SemiInboundService:
except:
pass
# 更新 production_time_range 字符串
if 'production_time_range' in data:
raw_range = data['production_time_range']
if isinstance(raw_range, list):
@ -269,8 +264,6 @@ class SemiInboundService:
except Exception as e:
db.session.rollback()
print(f"----- UPDATE SEMI FAILED: {str(e)} -----")
traceback.print_exc()
raise e
@staticmethod
@ -287,9 +280,6 @@ class SemiInboundService:
db.session.rollback()
raise e
# ------------------------------------------------------------------
# [核心修改] 获取关联出库历史 (跟 Buy 保持一致)
# ------------------------------------------------------------------
@staticmethod
def get_outbound_history(stock_id):
"""获取出库历史"""
@ -301,9 +291,9 @@ class SemiInboundService:
except:
return []
# ------------------------------------------------------------------
# [核心修改] 列表查询支持状态筛选、默认隐藏0库存、去除聚合
# ------------------------------------------------------------------
# ============================================================
# 6. 获取列表 (修改:按时间倒序排序 + 展示只显示日期)
# ============================================================
@staticmethod
def get_list(page, limit, keyword=None, statuses=None):
from app.models.inbound.semi import StockSemi
@ -324,11 +314,9 @@ class SemiInboundService:
)
)
# [新增] 状态筛选与零库存隐藏逻辑
if not statuses:
statuses = ['在库', '借库']
# 如果筛选包含'已出库',则显示所有数量;否则隐藏 stock_quantity <= 0 的记录
if '已出库' in statuses:
query = query.filter(StockSemi.status.in_(statuses))
else:
@ -339,7 +327,9 @@ class SemiInboundService:
)
)
pagination = query.order_by(StockSemi.id.desc()).paginate(page=page, per_page=limit, error_out=False)
# [核心修改] 按照 production_date (入库日期) 倒序排序
pagination = query.order_by(StockSemi.production_date.desc()).paginate(page=page, per_page=limit,
error_out=False)
current_items = pagination.items
@ -354,19 +344,22 @@ class SemiInboundService:
for item in current_items:
d = item.to_dict()
# 直接使用当前行的库存,不再聚合
# [核心修改] 格式化展示日期,覆盖 to_dict 的默认行为
date_display = ''
if item.production_date:
try:
date_display = item.production_date.strftime('%Y-%m-%d')
except:
date_display = str(item.production_date)[:10]
d['inbound_date'] = date_display
d['qty_stock'] = float(item.stock_quantity or 0)
d['qty_available'] = float(item.available_quantity or 0)
# 兼容前端字段名
d['sum_stock'] = d['qty_stock']
d['sum_available'] = d['qty_available']
# 图片解析
d['arrival_photo'] = parse_img(item.arrival_photo)
d['quality_report_link'] = parse_img(item.quality_report_link)
# 打印ID
d['global_print_id'] = item.global_print_id
items.append(d)