|
@@ -907,49 +907,330 @@ def update_business_card_status(card_id, status):
|
|
|
'data': None
|
|
|
}
|
|
|
|
|
|
-'''
|
|
|
-def get_business_card_image_from_minio(image_path):
|
|
|
+def create_talent_tag(tag_data):
|
|
|
"""
|
|
|
- 从MinIO获取名片图片
|
|
|
+ 创建人才标签节点
|
|
|
|
|
|
Args:
|
|
|
- image_path (str): MinIO中的图片路径
|
|
|
+ tag_data: 包含标签信息的字典,包括:
|
|
|
+ - name: 标签名称
|
|
|
+ - category: 标签分类
|
|
|
+ - description: 标签描述
|
|
|
+ - status: 启用状态
|
|
|
+
|
|
|
+ Returns:
|
|
|
+ dict: 操作结果字典
|
|
|
+ """
|
|
|
+ try:
|
|
|
+ from app.services.neo4j_driver import neo4j_driver
|
|
|
|
|
|
+ # 准备节点属性
|
|
|
+ tag_properties = {
|
|
|
+ 'name': tag_data.get('name'),
|
|
|
+ 'category': tag_data.get('category', '未分类'),
|
|
|
+ 'describe': tag_data.get('description', ''), # 使用describe与现有系统保持一致
|
|
|
+ 'status': tag_data.get('status', 'active'),
|
|
|
+ 'time': datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
|
+ }
|
|
|
+
|
|
|
+ # 生成标签的英文名(可选)
|
|
|
+ from app.core.graph.graph_operations import create_or_get_node
|
|
|
+
|
|
|
+ # 如果提供了名称,尝试获取英文翻译
|
|
|
+ if 'name' in tag_data and tag_data['name']:
|
|
|
+ try:
|
|
|
+ from app.api.data_interface.routes import translate_and_parse
|
|
|
+ en_name = translate_and_parse(tag_data['name'])
|
|
|
+ tag_properties['en_name'] = en_name[0] if en_name and isinstance(en_name, list) else ''
|
|
|
+ except Exception as e:
|
|
|
+ logging.warning(f"获取标签英文名失败: {str(e)}")
|
|
|
+ tag_properties['en_name'] = ''
|
|
|
+
|
|
|
+ # 创建节点
|
|
|
+ node_id = create_or_get_node('data_label', **tag_properties)
|
|
|
+
|
|
|
+ if node_id:
|
|
|
+ return {
|
|
|
+ 'code': 200,
|
|
|
+ 'success': True,
|
|
|
+ 'message': '人才标签创建成功',
|
|
|
+ 'data': {
|
|
|
+ 'id': node_id,
|
|
|
+ **tag_properties
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else:
|
|
|
+ return {
|
|
|
+ 'code': 500,
|
|
|
+ 'success': False,
|
|
|
+ 'message': '人才标签创建失败',
|
|
|
+ 'data': None
|
|
|
+ }
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ logging.error(f"创建人才标签失败: {str(e)}", exc_info=True)
|
|
|
+ return {
|
|
|
+ 'code': 500,
|
|
|
+ 'success': False,
|
|
|
+ 'message': f'创建人才标签失败: {str(e)}',
|
|
|
+ 'data': None
|
|
|
+ }
|
|
|
+
|
|
|
+def get_talent_tag_list():
|
|
|
+ """
|
|
|
+ 从Neo4j图数据库获取人才标签列表
|
|
|
+
|
|
|
Returns:
|
|
|
- tuple: (success, file_data, content_type, status_code)
|
|
|
- - success: 是否成功获取图片
|
|
|
- - file_data: 图片二进制数据
|
|
|
- - content_type: 图片内容类型
|
|
|
- - status_code: HTTP状态码
|
|
|
+ dict: 包含操作结果和标签列表的字典
|
|
|
"""
|
|
|
- response = None
|
|
|
try:
|
|
|
- minio_client = get_minio_client()
|
|
|
+ from app.services.neo4j_driver import neo4j_driver
|
|
|
|
|
|
- if not minio_client:
|
|
|
- logging.error("MinIO客户端初始化失败")
|
|
|
- return False, None, None, 500
|
|
|
+ # 构建Cypher查询语句,获取分类为talent的标签
|
|
|
+ query = """
|
|
|
+ MATCH (n:data_label)
|
|
|
+ WHERE n.category CONTAINS 'talent' OR n.category CONTAINS '人才'
|
|
|
+ RETURN id(n) as id, n.name as name, n.en_name as en_name,
|
|
|
+ n.category as category, n.describe as description,
|
|
|
+ n.status as status, n.time as time
|
|
|
+ ORDER BY n.time DESC
|
|
|
+ """
|
|
|
|
|
|
- # 获取文件
|
|
|
- try:
|
|
|
- response = minio_client.get_object(
|
|
|
- Bucket=minio_bucket,
|
|
|
- Key=image_path
|
|
|
- )
|
|
|
- file_data = response.read()
|
|
|
- content_type = response.content_type
|
|
|
+ # 执行查询
|
|
|
+ tags = []
|
|
|
+ with neo4j_driver.get_session() as session:
|
|
|
+ result = session.run(query)
|
|
|
|
|
|
- return True, file_data, content_type, 200
|
|
|
+ # 处理查询结果
|
|
|
+ for record in result:
|
|
|
+ tag = {
|
|
|
+ 'id': record['id'],
|
|
|
+ 'name': record['name'],
|
|
|
+ 'en_name': record['en_name'],
|
|
|
+ 'category': record['category'],
|
|
|
+ 'description': record['description'],
|
|
|
+ 'status': record['status'],
|
|
|
+ 'time': record['time']
|
|
|
+ }
|
|
|
+ tags.append(tag)
|
|
|
+
|
|
|
+ return {
|
|
|
+ 'code': 200,
|
|
|
+ 'success': True,
|
|
|
+ 'message': '获取人才标签列表成功',
|
|
|
+ 'data': tags
|
|
|
+ }
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ error_msg = f"获取人才标签列表失败: {str(e)}"
|
|
|
+ logging.error(error_msg, exc_info=True)
|
|
|
+
|
|
|
+ return {
|
|
|
+ 'code': 500,
|
|
|
+ 'success': False,
|
|
|
+ 'message': error_msg,
|
|
|
+ 'data': []
|
|
|
+ }
|
|
|
+
|
|
|
+def update_talent_tag(tag_id, tag_data):
|
|
|
+ """
|
|
|
+ 更新人才标签节点属性
|
|
|
+
|
|
|
+ Args:
|
|
|
+ tag_id: 标签节点ID
|
|
|
+ tag_data: 包含更新信息的字典,可能包括:
|
|
|
+ - name: 标签名称
|
|
|
+ - category: 标签分类
|
|
|
+ - description: 标签描述
|
|
|
+ - status: 启用状态
|
|
|
+
|
|
|
+ Returns:
|
|
|
+ dict: 操作结果字典
|
|
|
+ """
|
|
|
+ try:
|
|
|
+ from app.services.neo4j_driver import neo4j_driver
|
|
|
+
|
|
|
+ # 准备要更新的属性
|
|
|
+ update_properties = {}
|
|
|
+
|
|
|
+ # 检查并添加需要更新的属性
|
|
|
+ if 'name' in tag_data and tag_data['name']:
|
|
|
+ update_properties['name'] = tag_data['name']
|
|
|
|
|
|
- except Exception as e:
|
|
|
- logging.error(f"MinIO获取图片失败: {str(e)}")
|
|
|
- return False, None, None, 404
|
|
|
+ # 如果名称更新了,尝试更新英文名称
|
|
|
+ try:
|
|
|
+ from app.api.data_interface.routes import translate_and_parse
|
|
|
+ en_name = translate_and_parse(tag_data['name'])
|
|
|
+ update_properties['en_name'] = en_name[0] if en_name and isinstance(en_name, list) else ''
|
|
|
+ except Exception as e:
|
|
|
+ logging.warning(f"更新标签英文名失败: {str(e)}")
|
|
|
+
|
|
|
+ if 'category' in tag_data and tag_data['category']:
|
|
|
+ update_properties['category'] = tag_data['category']
|
|
|
+
|
|
|
+ if 'description' in tag_data:
|
|
|
+ update_properties['describe'] = tag_data['description']
|
|
|
+
|
|
|
+ if 'status' in tag_data:
|
|
|
+ update_properties['status'] = tag_data['status']
|
|
|
+
|
|
|
+ # 添加更新时间
|
|
|
+ update_properties['time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
|
|
|
|
+ # 如果没有可更新的属性,返回错误
|
|
|
+ if not update_properties:
|
|
|
+ return {
|
|
|
+ 'code': 400,
|
|
|
+ 'success': False,
|
|
|
+ 'message': '未提供任何可更新的属性',
|
|
|
+ 'data': None
|
|
|
+ }
|
|
|
+
|
|
|
+ # 构建更新的Cypher查询
|
|
|
+ set_clauses = []
|
|
|
+ params = {'nodeId': tag_id}
|
|
|
+
|
|
|
+ for key, value in update_properties.items():
|
|
|
+ param_name = f"param_{key}"
|
|
|
+ set_clauses.append(f"n.{key} = ${param_name}")
|
|
|
+ params[param_name] = value
|
|
|
+
|
|
|
+ set_clause = ", ".join(set_clauses)
|
|
|
+
|
|
|
+ query = f"""
|
|
|
+ MATCH (n:data_label)
|
|
|
+ WHERE id(n) = $nodeId
|
|
|
+ SET {set_clause}
|
|
|
+ RETURN id(n) as id, n.name as name, n.en_name as en_name,
|
|
|
+ n.category as category, n.describe as description,
|
|
|
+ n.status as status, n.time as time
|
|
|
+ """
|
|
|
+
|
|
|
+ # 执行更新查询
|
|
|
+ with neo4j_driver.get_session() as session:
|
|
|
+ result = session.run(query, **params)
|
|
|
+ record = result.single()
|
|
|
+
|
|
|
+ if not record:
|
|
|
+ return {
|
|
|
+ 'code': 404,
|
|
|
+ 'success': False,
|
|
|
+ 'message': f'未找到ID为{tag_id}的标签',
|
|
|
+ 'data': None
|
|
|
+ }
|
|
|
+
|
|
|
+ # 提取更新后的标签信息
|
|
|
+ updated_tag = {
|
|
|
+ 'id': record['id'],
|
|
|
+ 'name': record['name'],
|
|
|
+ 'en_name': record['en_name'],
|
|
|
+ 'category': record['category'],
|
|
|
+ 'description': record['description'],
|
|
|
+ 'status': record['status'],
|
|
|
+ 'time': record['time']
|
|
|
+ }
|
|
|
+
|
|
|
+ return {
|
|
|
+ 'code': 200,
|
|
|
+ 'success': True,
|
|
|
+ 'message': '人才标签更新成功',
|
|
|
+ 'data': updated_tag
|
|
|
+ }
|
|
|
+
|
|
|
except Exception as e:
|
|
|
- logging.error(f"获取图片过程中发生错误: {str(e)}")
|
|
|
- return False, None, None, 500
|
|
|
- finally:
|
|
|
- # 关闭响应连接(如果存在)
|
|
|
- if response and hasattr(response.get('Body', None), 'close'):
|
|
|
- response['Body'].close()
|
|
|
-'''
|
|
|
+ error_msg = f"更新人才标签失败: {str(e)}"
|
|
|
+ logging.error(error_msg, exc_info=True)
|
|
|
+
|
|
|
+ return {
|
|
|
+ 'code': 500,
|
|
|
+ 'success': False,
|
|
|
+ 'message': error_msg,
|
|
|
+ 'data': None
|
|
|
+ }
|
|
|
+
|
|
|
+def delete_talent_tag(tag_id):
|
|
|
+ """
|
|
|
+ 删除人才标签节点及其相关关系
|
|
|
+
|
|
|
+ Args:
|
|
|
+ tag_id: 标签节点ID
|
|
|
+
|
|
|
+ Returns:
|
|
|
+ dict: 操作结果字典
|
|
|
+ """
|
|
|
+ try:
|
|
|
+ from app.services.neo4j_driver import neo4j_driver
|
|
|
+
|
|
|
+ # 首先获取要删除的标签信息,以便在成功后返回
|
|
|
+ get_query = """
|
|
|
+ MATCH (n:data_label)
|
|
|
+ WHERE id(n) = $nodeId
|
|
|
+ RETURN id(n) as id, n.name as name, n.en_name as en_name,
|
|
|
+ n.category as category, n.describe as description,
|
|
|
+ n.status as status, n.time as time
|
|
|
+ """
|
|
|
+
|
|
|
+ # 构建删除节点和关系的Cypher查询
|
|
|
+ delete_query = """
|
|
|
+ MATCH (n:data_label)
|
|
|
+ WHERE id(n) = $nodeId
|
|
|
+ OPTIONAL MATCH (n)-[r]-()
|
|
|
+ DELETE r, n
|
|
|
+ RETURN count(n) AS deleted
|
|
|
+ """
|
|
|
+
|
|
|
+ # 执行查询
|
|
|
+ tag_info = None
|
|
|
+ with neo4j_driver.get_session() as session:
|
|
|
+ # 先获取标签信息
|
|
|
+ result = session.run(get_query, nodeId=tag_id)
|
|
|
+ record = result.single()
|
|
|
+
|
|
|
+ if not record:
|
|
|
+ return {
|
|
|
+ 'code': 404,
|
|
|
+ 'success': False,
|
|
|
+ 'message': f'未找到ID为{tag_id}的标签',
|
|
|
+ 'data': None
|
|
|
+ }
|
|
|
+
|
|
|
+ # 保存标签信息用于返回
|
|
|
+ tag_info = {
|
|
|
+ 'id': record['id'],
|
|
|
+ 'name': record['name'],
|
|
|
+ 'en_name': record['en_name'],
|
|
|
+ 'category': record['category'],
|
|
|
+ 'description': record['description'],
|
|
|
+ 'status': record['status'],
|
|
|
+ 'time': record['time']
|
|
|
+ }
|
|
|
+
|
|
|
+ # 执行删除操作
|
|
|
+ delete_result = session.run(delete_query, nodeId=tag_id)
|
|
|
+ deleted = delete_result.single()['deleted']
|
|
|
+
|
|
|
+ if deleted > 0:
|
|
|
+ return {
|
|
|
+ 'code': 200,
|
|
|
+ 'success': True,
|
|
|
+ 'message': '人才标签删除成功',
|
|
|
+ 'data': tag_info
|
|
|
+ }
|
|
|
+ else:
|
|
|
+ return {
|
|
|
+ 'code': 404,
|
|
|
+ 'success': False,
|
|
|
+ 'message': f'未能删除ID为{tag_id}的标签',
|
|
|
+ 'data': None
|
|
|
+ }
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ error_msg = f"删除人才标签失败: {str(e)}"
|
|
|
+ logging.error(error_msg, exc_info=True)
|
|
|
+
|
|
|
+ return {
|
|
|
+ 'code': 500,
|
|
|
+ 'success': False,
|
|
|
+ 'message': error_msg,
|
|
|
+ 'data': None
|
|
|
+ }
|