# inventory-backend/app/api/v1/inbound/product.py from flask import Blueprint, request, jsonify from app.services.inbound.product_service import ProductInboundService import traceback inbound_product_bp = Blueprint('stock_product', __name__) # ------------------------------------------------------------------ # 0. 基础物料搜索 (关键接口:配合 Service 实现自动回填) # ------------------------------------------------------------------ @inbound_product_bp.route('/search-base', methods=['GET']) def search_base(): """ 对应前端 API: /inbound/product/search-base 功能: 模糊搜索基础物料,返回 spec, unit, category, type 等详细信息 """ try: keyword = request.args.get('keyword', '') # 调用 Service 层已修复的 search_base_material 方法 data = ProductInboundService.search_base_material(keyword) return jsonify({"code": 200, "msg": "success", "data": data}) except Exception as e: # 捕获异常并打印堆栈,方便调试 traceback.print_exc() return jsonify({"code": 500, "msg": str(e)}), 500 # ------------------------------------------------------------------ # 1. 获取列表 (支持 status 多选筛选) # ------------------------------------------------------------------ @inbound_product_bp.route('/list', methods=['GET']) def get_list(): try: page = request.args.get('page', 1, type=int) limit = request.args.get('pageSize', 15, type=int) keyword = request.args.get('keyword', '') # 接收状态参数 (逗号分隔字符串 -> 列表) statuses_str = request.args.get('statuses', '') statuses = statuses_str.split(',') if statuses_str else [] result = ProductInboundService.get_list(page, limit, keyword, statuses) return jsonify({"code": 200, "msg": "success", "data": result}) except Exception as e: traceback.print_exc() return jsonify({"code": 500, "msg": str(e)}), 500 # ------------------------------------------------------------------ # 2. 新增入库 # ------------------------------------------------------------------ @inbound_product_bp.route('/submit', methods=['POST']) def submit(): try: # 调用 Service 处理入库,获取新创建的对象 new_stock = ProductInboundService.handle_inbound(request.get_json()) # 返回成功信息以及新创建的数据(包含生成的ID和SKU),供前端自动打印使用 return jsonify({ "code": 200, "msg": "入库成功", "data": new_stock.to_dict() }) except Exception as e: traceback.print_exc() return jsonify({"code": 500, "msg": str(e)}), 500 # ------------------------------------------------------------------ # 3. 更新入库 # ------------------------------------------------------------------ @inbound_product_bp.route('/', methods=['PUT']) def update(id): try: ProductInboundService.update_inbound(id, request.get_json()) return jsonify({"code": 200, "msg": "更新成功"}) except Exception as e: traceback.print_exc() return jsonify({"code": 500, "msg": str(e)}), 500 # ------------------------------------------------------------------ # 4. 删除 # ------------------------------------------------------------------ @inbound_product_bp.route('/', methods=['DELETE']) def delete(id): try: ProductInboundService.delete_inbound(id) return jsonify({"code": 200, "msg": "删除成功"}) except Exception as e: traceback.print_exc() return jsonify({"code": 500, "msg": str(e)}), 500 # ------------------------------------------------------------------ # 5. 获取出库历史 # ------------------------------------------------------------------ @inbound_product_bp.route('//history', methods=['GET']) def get_history(id): try: data = ProductInboundService.get_outbound_history(id) return jsonify({"code": 200, "msg": "success", "data": data}) except Exception as e: traceback.print_exc() return jsonify({"code": 500, "msg": str(e)}), 500 # ------------------------------------------------------------------ # 6. 系统用户建议 # ------------------------------------------------------------------ @inbound_product_bp.route('/suggestions/users', methods=['GET']) def get_user_suggestions(): keyword = request.args.get('keyword', '') data = ProductInboundService.search_system_users(keyword) return jsonify({"code": 200, "msg": "success", "data": data}) # ------------------------------------------------------------------ # 7. 获取筛选选项 # ------------------------------------------------------------------ @inbound_product_bp.route('/options', methods=['GET']) def get_options(): try: data = ProductInboundService.get_filter_options() return jsonify({"code": 200, "msg": "success", "data": data}) except Exception as e: return jsonify({"code": 500, "msg": str(e)}), 500