Spaces:
Sleeping
Sleeping
| from fastapi import APIRouter, Depends, HTTPException, status | |
| from sqlalchemy.orm import Session | |
| from typing import List, Optional | |
| import json | |
| from database import get_db | |
| from models.customer_relationship import CustomerRelationship | |
| from models.user import User | |
| from schemas.customer_relationship import CustomerRelationshipResponse, CustomerRelationshipCreate, CustomerRelationshipUpdate | |
| from routers.auth import get_current_user, is_admin_user | |
| from routers.operation_log import create_operation_log | |
| router = APIRouter() | |
| # 获取客户关系列表 | |
| async def get_customer_relationships( | |
| current_user: User = Depends(get_current_user), | |
| db: Session = Depends(get_db) | |
| ): | |
| # admin用户和超级管理员可以查看所有客户关系 | |
| if is_admin_user(current_user) or current_user.is_superadmin: | |
| customer_relationships = db.query(CustomerRelationship).all() | |
| else: | |
| # 普通用户只能查看自己公司的客户关系 | |
| customer_relationships = db.query(CustomerRelationship).filter( | |
| CustomerRelationship.company_code == current_user.company_code | |
| ).all() | |
| # 转换social_media字段从JSON字符串到字典 | |
| for cr in customer_relationships: | |
| if cr.social_media: | |
| try: | |
| cr.social_media = json.loads(cr.social_media) | |
| except: | |
| cr.social_media = {} | |
| return customer_relationships | |
| # 通过ID获取客户关系详情 | |
| async def get_customer_relationship( | |
| customer_id: int, | |
| current_user: User = Depends(get_current_user), | |
| db: Session = Depends(get_db) | |
| ): | |
| customer_relationship = db.query(CustomerRelationship).filter(CustomerRelationship.id == customer_id).first() | |
| if customer_relationship is None: | |
| raise HTTPException( | |
| status_code=status.HTTP_404_NOT_FOUND, | |
| detail=f"Customer relationship with ID '{customer_id}' not found" | |
| ) | |
| # 检查权限:admin用户和超级管理员可以查看所有客户关系,普通用户只能查看自己公司的 | |
| if not is_admin_user(current_user) and not current_user.is_superadmin and customer_relationship.company_code != current_user.company_code: | |
| raise HTTPException( | |
| status_code=status.HTTP_403_FORBIDDEN, | |
| detail="You don't have permission to access this customer relationship" | |
| ) | |
| # 转换social_media字段从JSON字符串到字典 | |
| if customer_relationship.social_media: | |
| try: | |
| customer_relationship.social_media = json.loads(customer_relationship.social_media) | |
| except: | |
| customer_relationship.social_media = {} | |
| return customer_relationship | |
| # 创建客户关系 | |
| async def create_customer_relationship( | |
| customer_relationship: CustomerRelationshipCreate, | |
| current_user: User = Depends(get_current_user), | |
| db: Session = Depends(get_db) | |
| ): | |
| # 检查权限:admin用户和超级管理员可以为任何公司创建客户关系,普通用户只能为自己公司创建 | |
| if not is_admin_user(current_user) and not current_user.is_superadmin and customer_relationship.company_code != current_user.company_code: | |
| raise HTTPException( | |
| status_code=status.HTTP_403_FORBIDDEN, | |
| detail="You don't have permission to create customer relationships for other companies" | |
| ) | |
| # 转换social_media字典为JSON字符串 | |
| customer_data = customer_relationship.model_dump() | |
| if customer_data.get('social_media'): | |
| customer_data['social_media'] = json.dumps(customer_data['social_media'], ensure_ascii=False) | |
| db_customer = CustomerRelationship(**customer_data) | |
| db.add(db_customer) | |
| db.commit() | |
| db.refresh(db_customer) | |
| # 记录操作日志 | |
| create_operation_log( | |
| db=db, | |
| user=current_user, | |
| module="customer_relationship", | |
| operation_type="add", | |
| operation_detail=f"新增客户关系:{db_customer.customer_name}(联系人:{db_customer.contact_person})", | |
| company_code=current_user.company_code | |
| ) | |
| # 转换social_media字段从JSON字符串到字典 | |
| if db_customer.social_media: | |
| try: | |
| db_customer.social_media = json.loads(db_customer.social_media) | |
| except: | |
| db_customer.social_media = {} | |
| return db_customer | |
| # 更新客户关系 | |
| async def update_customer_relationship( | |
| customer_id: int, | |
| customer_update: CustomerRelationshipUpdate, | |
| current_user: User = Depends(get_current_user), | |
| db: Session = Depends(get_db) | |
| ): | |
| customer_relationship = db.query(CustomerRelationship).filter(CustomerRelationship.id == customer_id).first() | |
| if customer_relationship is None: | |
| raise HTTPException( | |
| status_code=status.HTTP_404_NOT_FOUND, | |
| detail=f"Customer relationship with ID '{customer_id}' not found" | |
| ) | |
| # 检查权限:admin用户和超级管理员可以更新所有客户关系,普通用户只能更新自己公司的 | |
| if not is_admin_user(current_user) and not current_user.is_superadmin and customer_relationship.company_code != current_user.company_code: | |
| raise HTTPException( | |
| status_code=status.HTTP_403_FORBIDDEN, | |
| detail="You don't have permission to update this customer relationship" | |
| ) | |
| # 记录修改前的数据 | |
| before_data_dict = { | |
| "customer_name": customer_relationship.customer_name, | |
| "contact_person": customer_relationship.contact_person, | |
| "phone": customer_relationship.phone, | |
| "email": customer_relationship.email, | |
| "social_media": customer_relationship.social_media, | |
| "address": customer_relationship.address, | |
| "notes": customer_relationship.notes | |
| } | |
| # 更新客户关系信息 | |
| update_data = customer_update.model_dump(exclude_unset=True) | |
| if 'social_media' in update_data: | |
| update_data['social_media'] = json.dumps(update_data['social_media'], ensure_ascii=False) | |
| for field, value in update_data.items(): | |
| setattr(customer_relationship, field, value) | |
| db.commit() | |
| db.refresh(customer_relationship) | |
| # 记录修改后的数据 | |
| after_data_dict = { | |
| "customer_name": customer_relationship.customer_name, | |
| "contact_person": customer_relationship.contact_person, | |
| "phone": customer_relationship.phone, | |
| "email": customer_relationship.email, | |
| "social_media": customer_relationship.social_media, | |
| "address": customer_relationship.address, | |
| "notes": customer_relationship.notes | |
| } | |
| # 只记录有修改的字段,使用中文解析 | |
| modified_fields = [] | |
| field_names = { | |
| "customer_name": "客户名称", | |
| "contact_person": "联系人", | |
| "phone": "电话", | |
| "email": "邮箱", | |
| "social_media": "社交平台账号", | |
| "address": "地址", | |
| "notes": "备注" | |
| } | |
| for field, chinese_name in field_names.items(): | |
| if before_data_dict[field] != after_data_dict[field]: | |
| modified_fields.append(f"{chinese_name}:{before_data_dict[field]} → {after_data_dict[field]}") | |
| # 生成中文描述的修改内容 | |
| if modified_fields: | |
| modification_detail = ";".join(modified_fields) | |
| else: | |
| modification_detail = "无字段修改" | |
| # 记录操作日志 | |
| create_operation_log( | |
| db=db, | |
| user=current_user, | |
| module="customer_relationship", | |
| operation_type="edit", | |
| operation_detail=f"编辑客户关系:{customer_relationship.customer_name}(联系人:{customer_relationship.contact_person})", | |
| before_data=modification_detail, | |
| after_data=None, | |
| company_code=current_user.company_code | |
| ) | |
| # 转换social_media字段从JSON字符串到字典 | |
| if customer_relationship.social_media: | |
| try: | |
| customer_relationship.social_media = json.loads(customer_relationship.social_media) | |
| except: | |
| customer_relationship.social_media = {} | |
| return customer_relationship | |
| # 删除客户关系 | |
| async def delete_customer_relationship( | |
| customer_id: int, | |
| current_user: User = Depends(get_current_user), | |
| db: Session = Depends(get_db) | |
| ): | |
| customer_relationship = db.query(CustomerRelationship).filter(CustomerRelationship.id == customer_id).first() | |
| if customer_relationship is None: | |
| raise HTTPException( | |
| status_code=status.HTTP_404_NOT_FOUND, | |
| detail=f"Customer relationship with ID '{customer_id}' not found" | |
| ) | |
| # 检查权限:admin用户和超级管理员可以删除所有客户关系,普通用户只能删除自己公司的 | |
| if not is_admin_user(current_user) and not current_user.is_superadmin and customer_relationship.company_code != current_user.company_code: | |
| raise HTTPException( | |
| status_code=status.HTTP_403_FORBIDDEN, | |
| detail="You don't have permission to delete this customer relationship" | |
| ) | |
| # 记录客户关系名称和联系人,用于日志 | |
| customer_name = customer_relationship.customer_name | |
| contact_person = customer_relationship.contact_person | |
| db.delete(customer_relationship) | |
| db.commit() | |
| # 记录操作日志 | |
| create_operation_log( | |
| db=db, | |
| user=current_user, | |
| module="customer_relationship", | |
| operation_type="delete", | |
| operation_detail=f"删除客户关系:{customer_name}(联系人:{contact_person})", | |
| company_code=current_user.company_code | |
| ) | |
| return {"message": f"Customer relationship with ID '{customer_id}' deleted successfully"} |