from flask import Blueprint, request, jsonify from app.services.outbound_service import OutboundService from flask_jwt_extended import jwt_required, get_jwt_identity import traceback outbound_bp = Blueprint('outbound', __name__, url_prefix='/outbound') # -------------------------------------------------------- # 1. 扫码查询库存接口 (关联三个库存表) # GET /api/v1/outbound/scan?barcode=... # -------------------------------------------------------- @outbound_bp.route('/scan', methods=['GET']) @jwt_required() def scan_barcode(): barcode = request.args.get('barcode') if not barcode: return jsonify({'code': 400, 'msg': '请提供条码'}), 400 try: # 调用 Service 层去三个表中查找 (Service已更新,会返回价格) result = OutboundService.get_stock_by_barcode(barcode) if result: return jsonify({ 'code': 200, 'msg': '扫描成功', 'data': result }) else: return jsonify({ 'code': 404, 'msg': '未找到对应的库存记录,请确认条码是否正确' }), 404 except Exception as e: traceback.print_exc() return jsonify({'code': 500, 'msg': f'扫描查询出错: {str(e)}'}), 500 # -------------------------------------------------------- # 2. 提交出库单接口 (批量) # POST /api/v1/outbound # -------------------------------------------------------- @outbound_bp.route('', methods=['POST']) @jwt_required() def create_outbound(): data = request.get_json() if not data: return jsonify({'code': 400, 'msg': '无有效数据'}), 400 # 获取当前登录用户名 (JWT identity) current_user_name = get_jwt_identity() if not current_user_name: current_user_name = 'Unknown' # 获取最终的操作员名称 final_operator = data.get('operator_name') if not final_operator: final_operator = current_user_name # 必填校验 (针对整个单据) # items 必须是列表且不为空,consumer_name 和 signature_path 必填 if 'items' not in data or not data['items']: return jsonify({'code': 400, 'msg': '出库商品列表不能为空'}), 400 if not data.get('consumer_name') or not data.get('signature_path'): return jsonify({'code': 400, 'msg': '领用人及签名信息缺失'}), 400 try: # ★ [修改] 调用批量创建服务 outbound_no = OutboundService.create_outbound_batch(data, operator_name=final_operator) return jsonify({ 'code': 200, 'msg': '出库成功', 'data': {'outbound_no': outbound_no} }) except ValueError as e: # 业务逻辑错误 (如库存不足) return jsonify({'code': 400, 'msg': str(e)}), 400 except Exception as e: traceback.print_exc() return jsonify({'code': 500, 'msg': f'服务器内部错误: {str(e)}'}), 500 # -------------------------------------------------------- # 3. 获取出库记录列表 (分组展示) # GET /api/v1/outbound # -------------------------------------------------------- @outbound_bp.route('', methods=['GET']) @jwt_required() def get_outbound_list(): try: page = int(request.args.get('page', 1)) limit = int(request.args.get('limit', 10)) keyword = request.args.get('keyword', '') # 如果前端传了日期范围,可以解析处理,这里暂略 # ★ [修改] 调用分组查询服务 result = OutboundService.get_grouped_list(page, limit, keyword) return jsonify({ 'code': 200, 'msg': '获取成功', 'data': result }) except Exception as e: traceback.print_exc() return jsonify({'code': 500, 'msg': str(e)}), 500