采购件,半成品,产品页面初步完成

This commit is contained in:
dxc
2026-01-29 09:27:56 +08:00
parent b0df5c7458
commit 06ba2d7563
11 changed files with 836 additions and 244 deletions

View File

@ -1,22 +1,14 @@
from flask import Blueprint
# 1. 导入子模块蓝图
# 注意:确保 .buy, .semi, .base 文件在同级目录下真实存在
from .buy import inbound_buy_bp
from .semi import inbound_semi_bp
# 如果你还有 base.py 文件,就取消注释下面这行
from .base import inbound_base_bp
# 导入 product
from .product import inbound_product_bp
# 2. 创建父级聚合蓝图
inbound_bp = Blueprint('inbound', __name__)
# 3. 挂载子蓝图
# 访问地址: /api/v1/inbound/buy/list
inbound_bp.register_blueprint(inbound_buy_bp, url_prefix='/buy')
# 访问地址: /api/v1/inbound/semi/list
inbound_bp.register_blueprint(inbound_semi_bp, url_prefix='/semi')
# 如果有 base
inbound_bp.register_blueprint(inbound_base_bp, url_prefix='/base')
inbound_bp.register_blueprint(inbound_base_bp, url_prefix='/base')
# 挂载 product前缀改为 /product
inbound_bp.register_blueprint(inbound_product_bp, url_prefix='/product')

View File

@ -1,51 +1,55 @@
# 文件路径: app/api/v1/inbound/base.py
from flask import Blueprint, request, jsonify
# 修改为这一行,指向 app/services/inbound/base_service.py
from app.services.inbound.base_service import MaterialBaseService
import traceback
# 定义蓝图
# name='inbound_base' 确保全局唯一,防止和其他蓝图重名
inbound_base_bp = Blueprint('inbound_base', __name__)
# ------------------------------------------------------------------
# 1. 获取基础信息列表 (GET)
# 路由: /api/v1/inbound/base/list
# ------------------------------------------------------------------
@inbound_base_bp.route('/list', methods=['GET'])
def get_list():
# ==============================================================================
# 1. 搜索接口 (GET /api/v1/inbound/base/search)
# ==============================================================================
@inbound_base_bp.route('/search', methods=['GET'])
def search_base():
try:
# 获取分页参数
page = request.args.get('pageNum', 1, type=int)
limit = request.args.get('pageSize', 10, type=int)
# 获取筛选参数
filters = {
"keyword": request.args.get('keyword'),
"category": request.args.get('category'),
"type": request.args.get('type'),
"isEnabled": request.args.get('isEnabled')
}
# 调用 Service 层逻辑
result = MaterialBaseService.get_list(page, limit, filters)
return jsonify({
"code": 200,
"msg": "success",
"data": result
})
keyword = request.args.get('keyword', '')
data = MaterialBaseService.search_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
# ------------------------------------------------------------------
# 2. 新增基础信息 (POST)
# 路由: /api/v1/inbound/base/
# ------------------------------------------------------------------
# ==============================================================================
# 2. 列表接口 (GET /api/v1/inbound/base/list)
# ==============================================================================
@inbound_base_bp.route('/list', methods=['GET'])
def get_list():
try:
page = request.args.get('pageNum', 1, type=int) # 前端传的是 pageNum
limit = request.args.get('pageSize', 10, type=int)
# 构造筛选条件
filters = {
'keyword': request.args.get('keyword', ''),
'category': request.args.get('category', ''),
'type': request.args.get('type', ''),
'isEnabled': request.args.get('isEnabled', None)
}
result = MaterialBaseService.get_list(page, limit, filters)
return jsonify({"code": 200, "msg": "success", "data": result})
except Exception as e:
traceback.print_exc()
return jsonify({"code": 500, "msg": str(e)}), 500
# ==============================================================================
# 3. 新增接口 (POST /api/v1/inbound/base/)
# 注意:前端 material_base.ts 可能会请求 / 或 /add这里统一匹配
# ==============================================================================
@inbound_base_bp.route('/', methods=['POST'])
def add_material():
def create():
try:
data = request.get_json()
if not data:
@ -53,44 +57,37 @@ def add_material():
MaterialBaseService.create_material(data)
return jsonify({"code": 200, "msg": "新增成功"})
except ValueError as ve:
# 捕获业务逻辑验证错误如名称重复)
return jsonify({"code": 400, "msg": str(ve)}), 400
except ValueError as e:
# 捕获业务逻辑验证错误 (如名称为空)
return jsonify({"code": 400, "msg": str(e)}), 400
except Exception as e:
# 捕获系统错误
traceback.print_exc()
return jsonify({"code": 500, "msg": "系统错误"}), 500
return jsonify({"code": 500, "msg": f"系统错误: {str(e)}"}), 500
# ------------------------------------------------------------------
# 3. 修改基础信息 (PUT)
# 路由: /api/v1/inbound/base/
# ------------------------------------------------------------------
@inbound_base_bp.route('/', methods=['PUT'])
def update_material():
# ==============================================================================
# 4. 修改接口 (PUT /api/v1/inbound/base/<id>)
# ==============================================================================
@inbound_base_bp.route('/<int:id>', methods=['PUT'])
def update(id):
try:
data = request.get_json()
if not data or not data.get('id'):
return jsonify({"code": 400, "msg": "ID不能为空"}), 400
MaterialBaseService.update_material(data.get('id'), data)
return jsonify({"code": 200, "msg": "更新成功"})
MaterialBaseService.update_material(id, data)
return jsonify({"code": 200, "msg": "修改成功"})
except Exception as e:
traceback.print_exc()
return jsonify({"code": 500, "msg": str(e)}), 500
# ------------------------------------------------------------------
# 4. 删除基础信息 (DELETE)
# 路由: /api/v1/inbound/base/<id>
# ------------------------------------------------------------------
# ==============================================================================
# 5. 删除接口 (DELETE /api/v1/inbound/base/<id>)
# ==============================================================================
@inbound_base_bp.route('/<int:id>', methods=['DELETE'])
def delete_material(id):
def delete(id):
try:
MaterialBaseService.delete_material(id)
return jsonify({"code": 200, "msg": "删除成功"})
except ValueError as ve:
# 捕获依赖检查错误(如已被库存引用)
return jsonify({"code": 400, "msg": str(ve)}), 400
except Exception as e:
traceback.print_exc()
return jsonify({"code": 500, "msg": str(e)}), 500

View File

@ -0,0 +1,50 @@
from flask import Blueprint, request, jsonify
# 引用更名后的服务
from app.services.inbound.product_service import ProductInboundService
import traceback
# 蓝图命名改为 inbound_product_bp
inbound_product_bp = Blueprint('inbound_product', __name__)
@inbound_product_bp.route('/search-base', methods=['GET'])
def search_base():
try:
data = ProductInboundService.search_base_material(request.args.get('keyword', ''))
return jsonify({"code": 200, "msg": "success", "data": data})
except Exception as e:
return jsonify({"code": 500, "msg": str(e)}), 500
@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', '')
result = ProductInboundService.get_list(page, limit, keyword)
return jsonify({"code": 200, "msg": "success", "data": result})
except Exception as e:
return jsonify({"code": 500, "msg": str(e)}), 500
@inbound_product_bp.route('/submit', methods=['POST'])
def submit():
try:
ProductInboundService.handle_inbound(request.get_json())
return jsonify({"code": 200, "msg": "入库成功"})
except Exception as e:
return jsonify({"code": 500, "msg": str(e)}), 500
@inbound_product_bp.route('/<int:id>', methods=['PUT'])
def update(id):
try:
ProductInboundService.update_inbound(id, request.get_json())
return jsonify({"code": 200, "msg": "更新成功"})
except Exception as e:
return jsonify({"code": 500, "msg": str(e)}), 500
@inbound_product_bp.route('/<int:id>', methods=['DELETE'])
def delete(id):
try:
ProductInboundService.delete_inbound(id)
return jsonify({"code": 200, "msg": "删除成功"})
except Exception as e:
return jsonify({"code": 500, "msg": str(e)}), 500