- 后端新增 JD-R(工作要求-资源)理论维度数据生成,包含工作要求、工作资源、
个人资源、中介变量共 16 个新特征列
- 新增 JD-R 分析服务与 API(维度统计、倦怠投入分析、双路径中介分析、
分组轮廓、风险分布)
- 新增 SHAP 可解释性分析模块(全局重要性、局部解释、特征交互、依赖图)
- 预测服务增加风险分类模型加载与概率预测能力
- 前端新增 JD-R 分析页面(JDRAnalysis.vue),含雷达图、散点图、路径分析等可视化
- 预测页面增加风险概率展示与 SHAP 特征解释
- 路由与导航菜单同步更新
118 lines
3.1 KiB
Python
118 lines
3.1 KiB
Python
from flask import Blueprint, jsonify, request
|
|
|
|
from services.predict_service import predict_service
|
|
|
|
predict_bp = Blueprint('predict', __name__, url_prefix='/api/predict')
|
|
|
|
|
|
@predict_bp.route('/single', methods=['POST'])
|
|
def predict_single():
|
|
try:
|
|
data = request.get_json()
|
|
|
|
if not data:
|
|
return jsonify({
|
|
'code': 400,
|
|
'message': 'Request body is required',
|
|
'data': None
|
|
}), 400
|
|
|
|
model_type = data.get('model_type')
|
|
|
|
result = predict_service.predict_single(data, model_type)
|
|
|
|
return jsonify({
|
|
'code': 200,
|
|
'message': 'success',
|
|
'data': result
|
|
})
|
|
except Exception as e:
|
|
return jsonify({
|
|
'code': 500,
|
|
'message': str(e),
|
|
'data': None
|
|
}), 500
|
|
|
|
|
|
@predict_bp.route('/compare', methods=['POST'])
|
|
def predict_compare():
|
|
try:
|
|
data = request.get_json()
|
|
|
|
if not data:
|
|
return jsonify({
|
|
'code': 400,
|
|
'message': 'Request body is required',
|
|
'data': None
|
|
}), 400
|
|
|
|
results = predict_service.predict_compare(data)
|
|
|
|
return jsonify({
|
|
'code': 200,
|
|
'message': 'success',
|
|
'data': {
|
|
'results': results,
|
|
'total_models': len(results)
|
|
}
|
|
})
|
|
except Exception as e:
|
|
return jsonify({
|
|
'code': 500,
|
|
'message': str(e),
|
|
'data': None
|
|
}), 500
|
|
|
|
|
|
@predict_bp.route('/models', methods=['GET'])
|
|
def get_models():
|
|
try:
|
|
models = predict_service.get_available_models()
|
|
|
|
return jsonify({
|
|
'code': 200,
|
|
'message': 'success',
|
|
'data': {
|
|
'models': models,
|
|
'total': len(models)
|
|
}
|
|
})
|
|
except Exception as e:
|
|
return jsonify({
|
|
'code': 500,
|
|
'message': str(e),
|
|
'data': None
|
|
}), 500
|
|
|
|
|
|
@predict_bp.route('/model-info', methods=['GET'])
|
|
def get_model_info():
|
|
try:
|
|
result = predict_service.get_model_info()
|
|
return jsonify({
|
|
'code': 200,
|
|
'message': 'success',
|
|
'data': result
|
|
})
|
|
except Exception as e:
|
|
return jsonify({
|
|
'code': 500,
|
|
'message': str(e),
|
|
'data': None
|
|
}), 500
|
|
|
|
|
|
@predict_bp.route('/risk-classify', methods=['POST'])
|
|
def risk_classify():
|
|
try:
|
|
data = request.get_json()
|
|
if not data:
|
|
return jsonify({'code': 400, 'message': 'Request body is required', 'data': None}), 400
|
|
model_type = data.get('model_type')
|
|
result = predict_service.predict_risk_classification(data, model_type)
|
|
if result is None:
|
|
return jsonify({'code': 404, 'message': 'No classifier available', 'data': None}), 404
|
|
return jsonify({'code': 200, 'message': 'success', 'data': result})
|
|
except Exception as e:
|
|
return jsonify({'code': 500, 'message': str(e), 'data': None}), 500
|