Files
012-kaopeilian/backend/scripts/update_position_descriptions.py
111 998211c483 feat: 初始化考培练系统项目
- 从服务器拉取完整代码
- 按框架规范整理项目结构
- 配置 Drone CI 测试环境部署
- 包含后端(FastAPI)、前端(Vue3)、管理端

技术栈: Vue3 + TypeScript + FastAPI + MySQL
2026-01-24 19:33:28 +08:00

134 lines
6.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
更新岗位描述脚本
为瑞小美轻医美连锁品牌的真实岗位添加专业描述
"""
import asyncio
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent))
from sqlalchemy import select, update
from app.core.database import AsyncSessionLocal
from app.models.position import Position
from app.core.logger import get_logger
logger = get_logger(__name__)
# 轻医美岗位描述映射
POSITION_DESCRIPTIONS = {
# 医疗专业类
"护士": "负责医美项目的护理工作,包括术前准备、术中配合、术后护理及客户健康指导",
"护士长": "管理护理团队,制定护理标准流程,确保医疗安全和服务质量",
"副护士长": "协助护士长管理护理团队,负责日常护理工作的督导和质量控制",
"区域医务主任兼护士长": "统筹区域内各门店的医务管理工作,制定护理标准和培训体系",
"储备护士长": "接受护士长岗位培训,准备承担护理团队管理工作",
"皮肤科医生": "提供专业皮肤诊疗服务,制定个性化医美方案,确保客户安全和效果",
"皮肤科助理医生": "协助主治医生进行皮肤诊疗工作,参与医美项目的实施",
"微创技术院长": "负责微创医美技术的研发和应用,带领技术团队提升专业水平",
# 咨询销售类
"美学规划师": "为客户提供专业医美咨询,设计个性化美丽方案,促进项目成交",
"美学规划师兼店长": "负责门店运营管理的同时,担任首席美学规划师",
"见习美学规划师": "接受美学规划专业培训,学习咨询技巧和方案设计",
"会员服务经理": "负责VIP会员的全周期服务管理提升客户满意度和复购率",
"网络咨询专员": "通过线上渠道为客户提供医美咨询服务,引导到店体验",
# 管理类
"院长": "全面负责门店运营管理、团队建设、业绩达成和客户服务质量",
"连锁院长": "统筹多家门店的运营管理,制定标准化流程,推动连锁发展",
"店长": "负责门店日常运营管理、团队协调和业绩目标达成",
"区域总经理&人才战略董事&瑞小美学苑苑长": "负责区域战略规划、人才培养体系建设和学苑运营管理",
"微创运营经理": "负责微创项目的运营推广和业绩管理",
"储备总经理助理": "接受高管培训,准备承担门店总经理工作",
# 客服服务类
"前厅接待": "负责客户接待、预约管理、环境维护,提供优质的前台服务",
"分诊结算专员": "负责客户分诊引导和费用结算工作,确保流程顺畅",
"客服总监": "统筹客户服务体系建设,制定服务标准,提升客户满意度",
# 运营支持类
"保洁员": "负责门店环境卫生维护,确保医美场所的清洁和消毒标准",
"瑞柏美五象总院保洁员": "负责五象总院的环境卫生和消毒管理工作",
"药房兼行政": "负责药品和医疗器械管理,同时协助行政事务处理",
"行政采购": "负责门店物资采购和供应商管理,确保运营物资供应",
# 市场品牌类
"小红书运营专员": "负责小红书平台的内容运营和粉丝互动,提升品牌影响力",
"电商运营": "负责线上商城的运营管理,推动电商业务发展",
"医生IP运营": "负责医生个人品牌打造和IP运营提升医生影响力",
"设计总监": "负责品牌视觉设计、营销物料设计和品牌形象管理",
"平面设计师": "负责平面设计工作,包括海报、宣传册、广告物料等",
"摄影剪辑师": "负责门店的摄影摄像和视频剪辑工作,制作营销内容",
"首席文化传播官": "负责企业文化建设和品牌传播策略制定",
"AI PR": "负责品牌公关工作运用AI技术提升传播效率",
# 人力财务类
"人事经理&瑞小美学苑执行秘书长": "负责人力资源管理和学苑行政工作",
"人事专员&瑞小美学苑执行秘书": "负责人事日常工作和学苑事务协调",
"薪酬服务BP": "负责薪酬福利管理和人力资源业务支持",
"财务经理": "负责财务管理、成本控制和财务报表分析",
"财务专员": "负责日常财务核算、报销审核和账务处理",
"资金管理专员": "负责资金流管理、账户管理和资金调度",
# 战略发展类
"战投经理": "负责战略投资项目的评估和推进,支持公司扩张发展",
"商业分析师": "负责业务数据分析和商业模式研究,支持决策制定",
"AI维护程序员": "负责AI系统的维护和优化支持智能化运营",
# 高管类
"总裁": "负责公司整体战略规划和经营管理,带领团队实现发展目标",
"区域经理": "负责区域内多家门店的运营管理和业绩达成",
}
async def update_position_descriptions():
"""更新岗位描述"""
logger.info("=" * 60)
logger.info("开始更新岗位描述")
logger.info("=" * 60)
async with AsyncSessionLocal() as db:
try:
# 查询所有未删除的岗位
stmt = select(Position).where(Position.is_deleted == False)
result = await db.execute(stmt)
positions = result.scalars().all()
logger.info(f"找到 {len(positions)} 个岗位")
updated_count = 0
for position in positions:
# 查找匹配的描述
description = POSITION_DESCRIPTIONS.get(position.name)
if description:
position.description = description
logger.info(f"✓ 更新岗位: {position.name}")
updated_count += 1
else:
# 如果没有匹配的描述,使用通用描述
position.description = f"{position.name}岗位,负责相关专业工作"
logger.info(f"○ 使用通用描述: {position.name}")
updated_count += 1
# 提交更新
await db.commit()
logger.info("=" * 60)
logger.info(f"✅ 成功更新 {updated_count} 个岗位描述")
logger.info("=" * 60)
except Exception as e:
logger.error(f"更新失败: {str(e)}")
await db.rollback()
raise
if __name__ == "__main__":
asyncio.run(update_position_descriptions())