feat: 添加 JD-R 理论分析模块与 SHAP 可解释性分析功能

- 后端新增 JD-R(工作要求-资源)理论维度数据生成,包含工作要求、工作资源、
    个人资源、中介变量共 16 个新特征列
  - 新增 JD-R 分析服务与 API(维度统计、倦怠投入分析、双路径中介分析、
    分组轮廓、风险分布)
  - 新增 SHAP 可解释性分析模块(全局重要性、局部解释、特征交互、依赖图)
  - 预测服务增加风险分类模型加载与概率预测能力
  - 前端新增 JD-R 分析页面(JDRAnalysis.vue),含雷达图、散点图、路径分析等可视化
  - 预测页面增加风险概率展示与 SHAP 特征解释
  - 路由与导航菜单同步更新
This commit is contained in:
shuo
2026-04-04 07:15:46 +08:00
parent eab1a62ffb
commit e8235bf3ca
30 changed files with 6302 additions and 10 deletions

51
backend/api/jdr_routes.py Normal file
View File

@@ -0,0 +1,51 @@
from flask import Blueprint, jsonify, request
from services.jdr_service import jdr_service
jdr_bp = Blueprint('jdr', __name__, url_prefix='/api/jdr')
@jdr_bp.route('/dimensions', methods=['GET'])
def get_dimensions():
try:
result = jdr_service.get_dimension_scores()
return jsonify({'code': 200, 'message': 'success', 'data': result})
except Exception as e:
return jsonify({'code': 500, 'message': str(e), 'data': None}), 500
@jdr_bp.route('/burnout-engagement', methods=['GET'])
def get_burnout_engagement():
try:
result = jdr_service.get_burnout_engagement_analysis()
return jsonify({'code': 200, 'message': 'success', 'data': result})
except Exception as e:
return jsonify({'code': 500, 'message': str(e), 'data': None}), 500
@jdr_bp.route('/path-analysis', methods=['GET'])
def get_path_analysis():
try:
result = jdr_service.get_jdr_path_analysis()
return jsonify({'code': 200, 'message': 'success', 'data': result})
except Exception as e:
return jsonify({'code': 500, 'message': str(e), 'data': None}), 500
@jdr_bp.route('/profile', methods=['GET'])
def get_profile():
try:
dimension = request.args.get('dimension', '所属行业')
result = jdr_service.get_jdr_profile(dimension)
return jsonify({'code': 200, 'message': 'success', 'data': result})
except Exception as e:
return jsonify({'code': 500, 'message': str(e), 'data': None}), 500
@jdr_bp.route('/risk-distribution', methods=['GET'])
def get_risk_distribution():
try:
result = jdr_service.get_risk_distribution()
return jsonify({'code': 200, 'message': 'success', 'data': result})
except Exception as e:
return jsonify({'code': 500, 'message': str(e), 'data': None}), 500