3208 lines
138 KiB
Python
3208 lines
138 KiB
Python
import ast
|
||
import itertools
|
||
import json
|
||
import operator
|
||
import os
|
||
import re
|
||
from typing import Any, List, Union
|
||
from obs import ObsClient
|
||
from copy import deepcopy
|
||
import pandas as pd
|
||
import pymongo
|
||
from fastapi import APIRouter, Depends, Request, File, UploadFile, Form
|
||
from fastapi.security import OAuth2PasswordRequestForm
|
||
from motor.motor_asyncio import AsyncIOMotorDatabase
|
||
|
||
from api import deps
|
||
# from utils.dingding import get_redis_alluid, send_dates,unionid,get_alluid_list
|
||
from core import security
|
||
from core.config import settings
|
||
from core.security import get_password_hash
|
||
from schemas import ExtendendOAuth
|
||
from utils.dingding import *
|
||
from utils.jianli import get_resume
|
||
from utils.re_to_jianli import fmt_txt, getText_pdf
|
||
from utils.func import get_uid, send_affix_mail, judge, hours
|
||
import crud, schemas
|
||
from datetime import datetime
|
||
from core.configuration import *
|
||
from db import get_database
|
||
from db.ckdb import get_ck_db, CKDrive
|
||
from datetime import timedelta
|
||
from models.interview_zsgc import InterviewDo
|
||
from utils import get_time, qujian_time, Download_xlsx, send_str_mail, doc2pdf, png2pdf
|
||
from LAC import LAC
|
||
|
||
lac = LAC(mode='lac')
|
||
router = APIRouter()
|
||
|
||
# 创建ObsClient实例
|
||
obsClient = ObsClient(
|
||
access_key_id='UPEO770G619UPU8TU61Y',
|
||
secret_access_key='M7zVRT1pjRtGSZ2TOZwKBRoVJLeWAOf633kHaNcu',
|
||
server='obs.cn-east-2.myhuaweicloud.com'
|
||
)
|
||
|
||
|
||
def chkData(data):
|
||
res_data = []
|
||
for i in data.values():
|
||
res1 = deepcopy(i)
|
||
if 'interview_type' in res1:
|
||
key1 = res1['interview_type']
|
||
res1['interview_type'] = interview_type_dict.get(key1, '线下面试')
|
||
if 'interview_sign' in res1:
|
||
key2 = res1['interview_sign']
|
||
res1['interview_sign'] = interview_sign_dict.get(key2, '未签到')
|
||
if 'feedback' in res1:
|
||
key3 = res1['feedback']
|
||
res1['feedback'] = feedback_dict.get(key3, '未反馈')
|
||
if 'interview_round' in res1:
|
||
key4 = res1['interview_round']
|
||
res1['interview_round'] = interview_round_dict.get(key4, '初试')
|
||
if 'interview_stage' in res1:
|
||
key5 = res1['interview_stage']
|
||
res1['interview_stage'] = interview_stage_dict.get(key5, '初筛')
|
||
if 'owner_name' in res1:
|
||
key6 = res1['owner_name']
|
||
res1['owner_name'] = owner_name_dict.get(key6, '人才库')
|
||
if 'mmended_state' in res1:
|
||
key8 = res1['mmended_state']
|
||
res1['mmended_state'] = mmended_state_dict.get(key8, '未推荐')
|
||
if 'interview_state' in res1:
|
||
key9 = res1['interview_state']
|
||
res1['interview_state'] = interview_state_dict.get(key9, '待安排')
|
||
if 'men_state' in res1:
|
||
key10 = res1['men_state']
|
||
res1['men_state'] = men_state_dict.get(key10, '未反馈')
|
||
if 'teacher_state' in res1:
|
||
key11 = res1['teacher_state']
|
||
res1['teacher_state'] = teacher_state_dict.get(key11, '未反馈')
|
||
# if 'teacher_back' in res1:
|
||
# key12 = res1['teacher_back']
|
||
# res1['teacher_back'] = teacher_back_dict.get(key12, '非常不满意')
|
||
if 'offer_state' in res1:
|
||
key13 = res1['offer_state']
|
||
res1['offer_state'] = offer_state_dict.get(key13, '未创建')
|
||
if 'offer_exam_state' in res1:
|
||
key14 = res1['offer_exam_state']
|
||
res1['offer_exam_state'] = offer_exam_state_dict.get(key14, '未发起')
|
||
if 'notice_state' in res1:
|
||
key15 = res1['notice_state']
|
||
res1['notice_state'] = notice_state_dict.get(key15, '未通知')
|
||
if 'pass_why' in res1:
|
||
key16 = res1['pass_why']
|
||
res1['pass_why'] = pass_why_dict.get(key16, '')
|
||
if 'work_list' in res1:
|
||
work_list = res1['work_list']
|
||
if work_list:
|
||
work_list = [json.loads(i) for i in work_list]
|
||
if isinstance(work_list[0], str):
|
||
work_list = [eval(i) for i in work_list]
|
||
if len(work_list) > 1:
|
||
true_index = 0
|
||
for index, i in enumerate(work_list):
|
||
if index == 0:
|
||
continue
|
||
split_str1 = ''
|
||
split_str2 = ''
|
||
if '-' in i['time']:
|
||
split_str1 = '-'
|
||
if '-' in work_list[true_index]['time']:
|
||
split_str2 = '-'
|
||
if '–' in i['time']:
|
||
split_str1 = '–'
|
||
if '–' in work_list[true_index]['time']:
|
||
split_str2 = '–'
|
||
if '―' in i['time']:
|
||
split_str1 = '―'
|
||
if '―' in work_list[true_index]['time']:
|
||
split_str2 = '―'
|
||
if '—' in i['time']:
|
||
split_str1 = '—'
|
||
if '—' in work_list[true_index]['time']:
|
||
split_str2 = '—'
|
||
if int(i['time'].split(split_str1)[0].replace('.', '').replace('/', '')) > int(
|
||
work_list[true_index]['time'].split(split_str2)[0].replace('.', '').replace('/', '')):
|
||
true_index = index
|
||
work_dict = work_list[true_index]
|
||
work_list = [work_dict]
|
||
bast_index = 0
|
||
bast_time = 0
|
||
for index, i in enumerate(work_list):
|
||
time = i.get('time' '').replace('.', '/')
|
||
if time:
|
||
split_str3 = ''
|
||
if '-' in time:
|
||
split_str3 = '-'
|
||
if '–' in time:
|
||
split_str3 = '–'
|
||
if '―' in time:
|
||
split_str3 = '―'
|
||
if '—' in time:
|
||
split_str3 = '—'
|
||
if time.split(split_str3)[-1].split('/')[0].strip().isdigit():
|
||
chk_time = int(time.split('-')[-1].split('/')[0])
|
||
else:
|
||
chk_time = int(datetime.now().year)
|
||
if chk_time > bast_time:
|
||
bast_time = chk_time
|
||
bast_index = index
|
||
res1['firm'] = work_list[bast_index]['company_name']
|
||
else:
|
||
work_list = []
|
||
res1['work_list'] = work_list
|
||
if 'project_undergo' in res1:
|
||
project_undergo = res1['project_undergo']
|
||
if project_undergo:
|
||
project_undergo = [json.loads(i) for i in project_undergo]
|
||
if isinstance(project_undergo[0], str):
|
||
project_undergo = [eval(i) for i in project_undergo]
|
||
else:
|
||
project_undergo = []
|
||
res1['project_undergo'] = project_undergo
|
||
if 'language' in res1:
|
||
language = res1['language']
|
||
if language:
|
||
language = [json.loads(i) for i in language]
|
||
if isinstance(language[0], str):
|
||
language = [eval(i) for i in language]
|
||
else:
|
||
language = []
|
||
res1['language'] = language
|
||
if 'remembrance' in res1:
|
||
remembrance = res1['remembrance']
|
||
if remembrance:
|
||
remembrance = [json.loads(i) for i in remembrance]
|
||
if isinstance(remembrance[0], str):
|
||
remembrance = [eval(i) for i in remembrance]
|
||
else:
|
||
remembrance = []
|
||
res1['remembrance'] = remembrance
|
||
if 'education' in res1:
|
||
education = res1['education']
|
||
res1['education'] = education_dict[education]
|
||
if 'teacher_txt' in res1:
|
||
teacher_txt = res1['teacher_txt']
|
||
if not teacher_txt:
|
||
teacher_txt = teacher_txt
|
||
else:
|
||
teacher_txt = json.loads(teacher_txt)
|
||
res1['teacher_txt'] = teacher_txt
|
||
res_data.append(res1)
|
||
return res_data
|
||
|
||
|
||
# 面试查询
|
||
@router.post("/interview_find")
|
||
async def interview_find(
|
||
request: Request,
|
||
interview: InterviewDo = Depends(InterviewDo),
|
||
db: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" interview面试数据查询 """
|
||
await interview.init()
|
||
res = interview.find_interview_sql()
|
||
sql = res['sql']
|
||
data = await db.execute(sql)
|
||
if not data:
|
||
return schemas.Msg(code=200, msg='无数据', data=[])
|
||
# 格式化数据
|
||
res_data = chkData(data)
|
||
|
||
return schemas.Msg(code=200, msg='ok', data=res_data)
|
||
|
||
|
||
# 面试查询
|
||
@router.post("/interview_manner_num")
|
||
async def interview_find(
|
||
request: Request,
|
||
interview: InterviewDo = Depends(InterviewDo),
|
||
db: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" interview面试数据查询 """
|
||
await interview.init()
|
||
res = interview.find_interview_every_sql()
|
||
sql = res['sql']
|
||
print(sql)
|
||
data = await db.execute(sql)
|
||
if not data:
|
||
res_msg = {
|
||
'manner_2_num': 0,
|
||
'manner_01_num': 0,
|
||
}
|
||
return schemas.Msg(code=200, msg='无数据', data=res_msg)
|
||
# 格式化数据
|
||
res_data = chkData(data)
|
||
|
||
# 统计数量
|
||
manner_2_num = len([1 for i in res_data if i['hr_manner'] == 2])
|
||
manner_01_num = len([1 for i in res_data if i['hr_manner'] in [0, 1]])
|
||
|
||
res_msg = {
|
||
'manner_2_num': manner_2_num,
|
||
'manner_01_num': manner_01_num,
|
||
}
|
||
return schemas.Msg(code=200, msg='ok', data=res_msg)
|
||
|
||
|
||
# 面试_主页初筛查询
|
||
@router.post("/interview_home_find")
|
||
async def interview_home_find(
|
||
request: Request,
|
||
interview: InterviewDo = Depends(InterviewDo),
|
||
db: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" interview面试数据主页初筛查询 """
|
||
await interview.init()
|
||
res = interview.find_interview_home_sql()
|
||
sql = res['sql']
|
||
data = await db.execute(sql)
|
||
if not data:
|
||
return schemas.Msg(code=200, msg='无数据', data=[])
|
||
# 格式化数据
|
||
res_data = chkData(data)
|
||
return schemas.Msg(code=200, msg='ok', data=res_data)
|
||
|
||
|
||
# 复筛查询
|
||
@router.post("/interview_screen_find")
|
||
async def interview_screen_find(
|
||
request: Request,
|
||
interview: InterviewDo = Depends(InterviewDo),
|
||
db: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" interview面试数据复筛查询 """
|
||
await interview.init()
|
||
res = interview.find_interview_screen_sql()
|
||
sql = res['sql']
|
||
data = await db.execute(sql)
|
||
if not data:
|
||
return schemas.Msg(code=200, msg='无数据', data=[])
|
||
# 格式化数据
|
||
res_data = chkData(data)
|
||
return schemas.Msg(code=200, msg='ok', data=res_data)
|
||
|
||
|
||
# 面试阶段查询
|
||
@router.post("/interview_exam_find")
|
||
async def interview_exam_find(
|
||
request: Request,
|
||
interview: InterviewDo = Depends(InterviewDo),
|
||
db: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" interview面试数据面试阶段查询 """
|
||
await interview.init()
|
||
res = interview.find_interview_exam_sql()
|
||
sql = res['sql']
|
||
data = await db.execute(sql)
|
||
if not data:
|
||
return schemas.Msg(code=200, msg='无数据', data=[])
|
||
# 格式化数据
|
||
res_data = chkData(data)
|
||
return schemas.Msg(code=200, msg='ok', data=res_data)
|
||
|
||
|
||
# offer阶段查询
|
||
@router.post("/interview_stage_num")
|
||
async def interview_stage_num(
|
||
request: Request,
|
||
interview: InterviewDo = Depends(InterviewDo),
|
||
db: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" interview面试数据offer阶段查询 """
|
||
await interview.init()
|
||
res = interview.find_stage_num_sql()
|
||
sql = res['sql']
|
||
data = await db.execute(sql)
|
||
res_data = {
|
||
'0': 0,
|
||
'1': 0,
|
||
'2': 0,
|
||
'3': 0,
|
||
'4': 0,
|
||
'5': 0,
|
||
'6': 0,
|
||
'7': 0,
|
||
'8': 0,
|
||
'9': 0,
|
||
'10': 0,
|
||
}
|
||
if not data:
|
||
return schemas.Msg(code=200, msg='无数据', data=res_data)
|
||
for i in data.values():
|
||
key = str(i['interview_stage'])
|
||
if key not in res_data:
|
||
continue
|
||
res_data[key] = i['value']
|
||
return schemas.Msg(code=200, msg='ok', data=res_data)
|
||
|
||
|
||
# 待入职阶段查询
|
||
@router.post("/interview_waite_in_find")
|
||
async def interview_waite_in_find(
|
||
request: Request,
|
||
interview: InterviewDo = Depends(InterviewDo),
|
||
db: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" interview面试数据待入职阶段查询 """
|
||
await interview.init()
|
||
res = interview.find_interview_waite_in_sql()
|
||
sql = res['sql']
|
||
data = await db.execute(sql)
|
||
if not data:
|
||
return schemas.Msg(code=200, msg='无数据', data=[])
|
||
# 格式化数据
|
||
res_data = chkData(data)
|
||
return schemas.Msg(code=200, msg='ok', data=res_data)
|
||
|
||
|
||
# 面试修改
|
||
@router.post("/interview_update")
|
||
async def interview_update(
|
||
request: Request,
|
||
interview: InterviewDo = Depends(InterviewDo),
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" interview面试数据更新 """
|
||
await interview.init()
|
||
res = interview.update_interview_sql()
|
||
sql = res['sql']
|
||
print(sql)
|
||
# try:
|
||
inte_stage = interview.data_in.get('interview_stage', 0) # 修改的简历阶段
|
||
if inte_stage == 1: # 人才推荐进入初筛时分配面试官和HR
|
||
job = await crud.jobs.find_job(db, interview.data_in.get('job_id'))
|
||
# 面试官
|
||
if job.get('interview') != []:
|
||
nickname = []
|
||
user_id = []
|
||
for i in job.get('interview'):
|
||
nickname.append(i['nickname'])
|
||
user_id.append(i['user_id'])
|
||
nicknames = ','.join(nickname)
|
||
user_ids = ','.join(user_id)
|
||
sql = sql.replace('interview_stage = 1 ,',
|
||
f"interview_stage = 1 ,interview_name = '{nicknames}',interview_id = '{user_ids}',", 1)
|
||
# hr
|
||
if job.get('patronn') != []:
|
||
nickname1 = []
|
||
user_id1 = []
|
||
for i in job.get('patronn'):
|
||
nickname1.append(i['nickname'])
|
||
user_id1.append(i['user_id'])
|
||
nicknames1 = ','.join(nickname1)
|
||
user_ids1 = ','.join(user_id1)
|
||
sql = sql.replace('interview_stage = 1 ,',
|
||
f"interview_stage = 1 ,hr_name = '{nicknames1}',hr_id = '{user_ids1}',", 1)
|
||
interviews = int(interview.data.get('interview_stage', '0')) # 当前简历阶段
|
||
if interview.data_in.get('interview_stage', '') == 11: # 当是淘汰时则把淘汰的时间,阶段等都记录下来
|
||
now = str(datetime.now()).split('.')[0]
|
||
sql = sql.replace("interview_stage = 11", f"interview_stage = 11,ago={interviews},pass_time='{now}'")
|
||
data = await ckdb.execute(sql)
|
||
print(sql)
|
||
# except:
|
||
# return schemas.Msg(code=-9, msg='数据有误', data=None)
|
||
if interview.data_in.get('interview_stage', '') == 11 and interviews > 2: # 淘汰的时候发送钉钉消息通知面试官该求职者被淘汰(面试之后的阶段才会发通知)
|
||
send_sql = f"""
|
||
select interview_id,name,job_names from HR.resumes where uid = '{interview.where.get('uid')}' limit 1
|
||
"""
|
||
interview_id = await ckdb.execute(send_sql)
|
||
userid_list = interview_id[0]['interview_id'].split(',')
|
||
interview_stage = interview_stage_dict[interviews] # 映射简历阶段
|
||
why = pass_why_dict[interview.data_in.get('pass_why')] # 映射淘汰原因
|
||
if interview.data_in.get('pass_text') == None or interview.data_in.get('pass_text') == '':
|
||
content = f"""【淘汰通知】\n姓名:{interview_id[0]['name']}\n求职岗位:{interview_id[0]['job_names']}\n淘汰原因:{why}\n简历阶段:{interview_stage}\n操作人:{current_user.nickname}"""
|
||
else:
|
||
content = f"""【淘汰通知】\n姓名:{interview_id[0]['name']}\n求职岗位:{interview_id[0]['job_names']}\n淘汰原因:{why}\n具体淘汰原因:{interview.data_in.get('pass_text')}\n简历阶段:{interview_stage}\n操作人:{current_user.nickname}"""
|
||
if current_user.name != 'root':
|
||
# send_dates(content, userid_list)# 工作通知
|
||
res = await crud.user.get_users(db, userid_list)
|
||
unionid_list = [i['unionid'] for i in res]
|
||
Sample.create_task('淘汰通知', current_user.unionid, content, unionid_list) # 待办通知
|
||
if interview.data_in.get('hr_manner', 10) in [0, 1]: # 1表示用人经理同意你的推荐人进入复筛阶段,0不同意
|
||
# 更新推荐记录
|
||
await crud.department.update(db, {'types': True}, interview.where.get('uid'))
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|
||
|
||
|
||
# 写入面试数据
|
||
@router.post("/interview_insert")
|
||
async def interview_insert(
|
||
request: Request,
|
||
interview: InterviewDo = Depends(InterviewDo),
|
||
db: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" interview面试数据写入 """
|
||
await interview.init()
|
||
res = interview.insert_interview_sql()
|
||
sql = res['sql']
|
||
insert_data = res['insert_data']
|
||
data = await db.execute_dict(sql, insert_data)
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|
||
|
||
|
||
# 转存简历到华为云
|
||
@router.post("/file_to_hw")
|
||
async def file_to_hw(
|
||
request: Request,
|
||
file: UploadFile = File(...),
|
||
db: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" 简历上传到华为云 """
|
||
path_data = os.getcwd() + '/jianli' # 当前文件所在的目录
|
||
if not os.path.exists(path_data):
|
||
os.makedirs(path_data)
|
||
contents = await file.read()
|
||
filename = file.filename
|
||
try:
|
||
with open(path_data + '/' + filename, "wb") as f:
|
||
# 将获取的file文件内容,写入到新文件中
|
||
f.write(contents)
|
||
f.close()
|
||
except:
|
||
return schemas.Msg(code=400, msg='上传文件有误', data=None)
|
||
|
||
try:
|
||
fn = path_data + '/' + filename
|
||
if not fn.endswith('pdf'): # pdf正常上传到华为云
|
||
# res = obsClient.putFile('legu-cdn-source', 'hrms/' + filename, path_data + '/' + filename)
|
||
# doc/docx则转化为pdf上传到华为云
|
||
fn, fil = doc2pdf(fn, path_data, filename)
|
||
filename = fil
|
||
|
||
# 简历初始文档
|
||
data_mode = {
|
||
"interview_name": "",
|
||
"interview_type": 1,
|
||
"interview_sign": 0,
|
||
"hope_money": "",
|
||
"feedback": 0,
|
||
"interview_round": 0,
|
||
"event_time": datetime.now(),
|
||
"name": "",
|
||
"phone": "",
|
||
"job_name": "",
|
||
"hr_name": "",
|
||
"work_exp": 0,
|
||
"interview_stage": 1,
|
||
"owner_name": 2,
|
||
"education": 1,
|
||
"work_undergo": [],
|
||
"project_undergo": [],
|
||
"work_list": [],
|
||
"school": "",
|
||
"at_school": "",
|
||
"specialty": "",
|
||
"specialty_do": [],
|
||
"mmended_state": 0,
|
||
"mail": "",
|
||
"account": "",
|
||
"id_card": "",
|
||
"gender": "",
|
||
"age": 0,
|
||
"gam": "",
|
||
"interview_state": 1,
|
||
"counts": 1,
|
||
"nation": "汉",
|
||
"review": "",
|
||
"upgrade": [],
|
||
"come_time": "",
|
||
"now_money": "",
|
||
"men_state": 1,
|
||
"teacher_state": 1,
|
||
"teacher_back": 1,
|
||
"offer_state": 1,
|
||
"offer_exam_state": 1,
|
||
"notice_state": 1,
|
||
"pass_why": 0,
|
||
"pass_text": "",
|
||
"now_address": "",
|
||
"language": [],
|
||
"remembrance": [],
|
||
"file_url": '',
|
||
"hr_manner": 2,
|
||
}
|
||
uid = get_uid()
|
||
data_mode['uid'] = uid
|
||
# 存数据
|
||
chk_txt = getText_pdf(path_data + '/' + filename)
|
||
data = fmt_txt(chk_txt)
|
||
education = data['education']
|
||
# 学历int转化
|
||
education_int = {
|
||
'大专': 1,
|
||
'本科': 2,
|
||
'研究生': 3,
|
||
'博士': 4,
|
||
'硕士': 5,
|
||
}
|
||
if education and isinstance(education, str):
|
||
data['education'] = education_int.get(education, 1)
|
||
age = data['age']
|
||
if not age:
|
||
data['age'] = 20
|
||
# 年龄int转化
|
||
if age and isinstance(age, str):
|
||
true_age = re.search(r"\d+\.?\d*", age)
|
||
if len(true_age.group()) > 2:
|
||
data['age'] = 20
|
||
else:
|
||
data['age'] = int(true_age.group())
|
||
work_exp = data['work_exp']
|
||
if not work_exp:
|
||
data['work_exp'] = 0
|
||
# 工作经验float转化
|
||
if work_exp and isinstance(work_exp, str):
|
||
true_work_exp = re.search(r"\d+\.?\d*", work_exp)
|
||
if len(true_work_exp.group()) > 3:
|
||
data['work_exp'] = 0
|
||
else:
|
||
data['work_exp'] = float(true_work_exp.group())
|
||
|
||
data_mode.update(data)
|
||
# 转json字符串
|
||
if 'remembrance_list' in data_mode:
|
||
remembrance = data_mode.pop('remembrance_list')
|
||
data_mode['remembrance'] = remembrance
|
||
if 'language_list' in data_mode:
|
||
language = data_mode.pop('language_list')
|
||
data_mode['language'] = language
|
||
if 'project_undergo' in data_mode:
|
||
if data_mode.get('project_undergo', []):
|
||
data_mode['project_undergo'] = [json.dumps(i) for i in data_mode['project_undergo']]
|
||
else:
|
||
data_mode['project_undergo'] = []
|
||
if 'work_list' in data_mode:
|
||
if data_mode.get('work_list', []):
|
||
data_mode['work_list'] = [json.dumps(i) for i in data_mode['work_list']]
|
||
else:
|
||
data_mode['work_list'] = []
|
||
if 'language' in data_mode:
|
||
if data_mode.get('language', []):
|
||
data_mode['language'] = [json.dumps(i) for i in data_mode['language']]
|
||
else:
|
||
data_mode['language'] = []
|
||
if 'remembrance' in data_mode:
|
||
if data_mode.get('remembrance', []):
|
||
data_mode['remembrance'] = [json.dumps(i) for i in data_mode['remembrance']]
|
||
else:
|
||
data_mode['remembrance'] = []
|
||
|
||
# 字符串转datetime
|
||
if data_mode.get('in_time', ''):
|
||
chk_in_time = data_mode['in_time'].replace('-', '/').replace('.', '/')
|
||
if len(chk_in_time.split('/')) == 2:
|
||
data_mode['in_time'] = str(datetime.strptime(chk_in_time, "%Y/%m").date())
|
||
if len(chk_in_time.split('/')) == 3:
|
||
data_mode['in_time'] = str(datetime.strptime(chk_in_time, "%Y/%m/%d").date())
|
||
|
||
if data_mode.get('out_time', ''):
|
||
chk_out_time = data_mode['out_time'].replace('-', '/').replace('.', '/')
|
||
if len(chk_out_time.split('/')) == 2:
|
||
data_mode['out_time'] = str(datetime.strptime(chk_out_time, "%Y/%m").date())
|
||
if len(chk_out_time.split('/')) == 3:
|
||
data_mode['out_time'] = str(datetime.strptime(chk_out_time, "%Y/%m/%d").date())
|
||
|
||
if data_mode.get('birthday', ''):
|
||
chk_birthday = data_mode['birthday'].replace('-', '/').replace('.', '/')
|
||
if len(chk_birthday.split('/')) == 2:
|
||
data_mode['birthday'] = str(datetime.strptime(chk_birthday, "%Y/%m").date())
|
||
if len(chk_birthday.split('/')) == 3:
|
||
data_mode['birthday'] = str(datetime.strptime(chk_birthday, "%Y/%m/%d").date())
|
||
|
||
if data_mode.get('star_time', ''):
|
||
chk_star_time = data_mode['star_time'].replace('-', '/').replace('.', '/')
|
||
if len(chk_star_time.split('/')) == 2:
|
||
data_mode['star_time'] = str(datetime.strptime(chk_star_time, "%Y/%m").date())
|
||
if len(chk_star_time.split('/')) == 3:
|
||
data_mode['star_time'] = str(datetime.strptime(chk_star_time, "%Y/%m/%d").date())
|
||
|
||
if data_mode.get('end_time', ''):
|
||
chk_end_time = data_mode['end_time'].replace('-', '/').replace('.', '/')
|
||
if len(chk_end_time.split('/')) == 2:
|
||
data_mode['end_time'] = str(datetime.strptime(chk_end_time, "%Y/%m").date())
|
||
if len(chk_end_time.split('/')) == 3:
|
||
data_mode['end_time'] = str(datetime.strptime(chk_end_time, "%Y/%m/%d").date())
|
||
|
||
if data_mode.get('graduate_time', ''):
|
||
chk_graduate = data_mode['graduate_time'].replace('-', '/').replace('.', '/')
|
||
if len(chk_graduate.split('/')) == 2:
|
||
data_mode['graduate_time'] = str(datetime.strptime(chk_graduate, "%Y/%m").date())
|
||
if len(chk_graduate.split('/')) == 3:
|
||
data_mode['graduate_time'] = str(datetime.strptime(chk_graduate, "%Y/%m/%d").date())
|
||
|
||
work_list = data['work_list']
|
||
language = data['language']
|
||
project_undergo = data['project_undergo']
|
||
remembrance = data['remembrance']
|
||
|
||
# 简历查重,姓名,手机号,性别name,phone,gender
|
||
find_name = data['name']
|
||
find_phone = data['phone']
|
||
find_gender = data['gender']
|
||
where = {}
|
||
if find_name:
|
||
where.update({
|
||
'name': find_name
|
||
})
|
||
if find_phone:
|
||
where.update({
|
||
'phone': find_phone
|
||
})
|
||
if find_gender:
|
||
where.update({
|
||
'gender': find_gender
|
||
})
|
||
whereStr = ''
|
||
for key, value in where.items():
|
||
if isinstance(value, str):
|
||
if not value.strip():
|
||
continue
|
||
if whereStr:
|
||
whereStr += 'and ' + str(key) + ' = ' + "'" + value + "'" + ' '
|
||
else:
|
||
whereStr += str(key) + ' = ' + "'" + value + "'" + ' '
|
||
continue
|
||
if whereStr:
|
||
whereStr += 'and ' + str(key) + ' = ' + str(value) + ' '
|
||
else:
|
||
whereStr += str(key) + ' = ' + str(value) + ' '
|
||
whereStr = whereStr.strip()
|
||
sql = f"select uid from HR.resumes where {whereStr}"
|
||
is_in_data = await db.execute(sql)
|
||
exist = 0
|
||
if is_in_data:
|
||
exist = 1
|
||
uid = list(is_in_data.values())[0]['uid']
|
||
# os.rename(path_data + '/' + filename, path_data + '/' + find_phone + '.pdf')
|
||
res = obsClient.putFile('legu-cdn-source', 'hrms/' + uid + '.pdf', fn)
|
||
if res.status < 300:
|
||
# 地址
|
||
url = res.body.objectUrl
|
||
data_mode['file_url'] = url
|
||
data['file_url'] = url
|
||
res_data = {
|
||
'data': data,
|
||
'file_url': url,
|
||
'uid': uid,
|
||
'exist': exist,
|
||
'project_undergo': project_undergo,
|
||
'work_list': work_list,
|
||
'language_list': language,
|
||
'remembrance_list': remembrance
|
||
}
|
||
if exist:
|
||
return schemas.Msg(code=0, msg='ok', data=res_data)
|
||
sql = f"insert into HR.resumes(interview_name, interview_type, interview_sign, hope_money, feedback," \
|
||
f" interview_round, event_time, uid, name, phone, job_name, hr_name, work_exp, interview_stage, owner_name," \
|
||
f" education, work_undergo, project_undergo, work_list, school, at_school, specialty, specialty_do, " \
|
||
f"mmended_state, mail, account, id_card, gender, age, gam, interview_state, counts, nation, come_time," \
|
||
f" review, upgrade, now_money, men_state, teacher_state, teacher_back, offer_state, offer_exam_state," \
|
||
f" notice_state, pass_why, pass_text, now_address,language,remembrance, file_url, hr_manner) values"
|
||
|
||
await db.execute_dict(sql, [data_mode])
|
||
return schemas.Msg(code=0, msg='ok', data=res_data)
|
||
else:
|
||
print('errorCode:', res.errorCode)
|
||
print('errorMessage:', res.errorMessage)
|
||
return schemas.Msg(code=400, msg='上传华为云失败', data=None)
|
||
except Exception as e:
|
||
print(e)
|
||
return schemas.Msg(code=400, msg='上传华为云失败或者解析失败', data=None)
|
||
|
||
|
||
# 批量导入简历
|
||
@router.post("/files_to_hw")
|
||
async def files_to_hw(
|
||
request: Request,
|
||
file_path: str,
|
||
db: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" 批量导入简历 """
|
||
insert_list = [] # 插入数据
|
||
error_files = [] # 解析错误简历文件
|
||
error_to_fw_files = [] # 上传失败简历文件
|
||
over_files = [] # 已经检测过的pdf文件
|
||
# 简历初始文档
|
||
data_mode = {
|
||
"interview_name": "",
|
||
"interview_type": 1,
|
||
"interview_sign": 0,
|
||
"hope_money": "",
|
||
"feedback": 0,
|
||
"interview_round": 0,
|
||
"event_time": datetime.now(),
|
||
"name": "",
|
||
"phone": "",
|
||
"job_name": "",
|
||
"hr_name": "",
|
||
"work_exp": 0,
|
||
"interview_stage": -1,
|
||
"owner_name": 2,
|
||
"education": 1,
|
||
"work_undergo": [],
|
||
"project_undergo": [],
|
||
"work_list": [],
|
||
"school": "",
|
||
"at_school": "",
|
||
"specialty": "",
|
||
"specialty_do": [],
|
||
"mmended_state": 0,
|
||
"mail": "",
|
||
"account": "",
|
||
"id_card": "",
|
||
"gender": "",
|
||
"age": 0,
|
||
"gam": "",
|
||
"interview_state": 1,
|
||
"counts": 1,
|
||
"nation": "汉",
|
||
"review": "",
|
||
"upgrade": [],
|
||
"come_time": "",
|
||
"now_money": "",
|
||
"men_state": 1,
|
||
"teacher_state": 1,
|
||
"teacher_back": 1,
|
||
"offer_state": 1,
|
||
"offer_exam_state": 1,
|
||
"notice_state": 1,
|
||
"pass_why": 0,
|
||
"pass_text": "",
|
||
"now_address": "",
|
||
"language": [],
|
||
"remembrance": [],
|
||
"file_url": '',
|
||
"hr_manner": 2,
|
||
"resume_affix_id": [],
|
||
}
|
||
file_list = os.listdir(file_path)
|
||
for file in file_list:
|
||
# 文件夹
|
||
if os.path.isdir(file):
|
||
continue
|
||
# 附件
|
||
if '作品' in file:
|
||
continue
|
||
# 已经检测过
|
||
if file in over_files:
|
||
continue
|
||
try:
|
||
fn = file_path + '/' + file
|
||
end_str = file.split('.')[-1].lower() # 文件类型
|
||
# 文件类型支持
|
||
if end_str not in ['pdf', 'doc', 'docx', 'word']:
|
||
continue
|
||
if end_str in ['doc', 'docx', 'word']: # doc,docx, word转pdf
|
||
fn, fil = doc2pdf(fn, file_path, file)
|
||
file = fil
|
||
# if end_str in ['png', 'jpg', 'jpeg']: # 图片转pdf
|
||
# fn, fil = png2pdf(file_path, file)
|
||
# file = fil
|
||
data_mode1 = deepcopy(data_mode)
|
||
uid = get_uid()
|
||
data_mode1['uid'] = uid
|
||
# 存数据
|
||
chk_txt = getText_pdf(file_path + '/' + file)
|
||
data = fmt_txt(chk_txt)
|
||
education = data['education']
|
||
# 学历int转化
|
||
education_int = {
|
||
'大专': 1,
|
||
'本科': 2,
|
||
'研究生': 3,
|
||
'博士': 4,
|
||
'硕士': 5,
|
||
}
|
||
if education and isinstance(education, str):
|
||
data['education'] = education_int.get(education, 1)
|
||
age = data['age']
|
||
if not age:
|
||
data['age'] = 20
|
||
# 年龄int转化
|
||
if age and isinstance(age, str):
|
||
true_age = re.search(r"\d+\.?\d*", age)
|
||
if len(true_age.group()) > 2:
|
||
data['age'] = 20
|
||
else:
|
||
data['age'] = int(true_age.group())
|
||
work_exp = data['work_exp']
|
||
if not work_exp:
|
||
data['work_exp'] = 0
|
||
# 工作经验float转化
|
||
if work_exp and isinstance(work_exp, str):
|
||
true_work_exp = re.search(r"\d+\.?\d*", work_exp)
|
||
if len(true_work_exp.group()) > 3:
|
||
data['work_exp'] = 0
|
||
else:
|
||
data['work_exp'] = float(true_work_exp.group())
|
||
|
||
data_mode1.update(data)
|
||
# 转json字符串
|
||
if 'remembrance_list' in data_mode1:
|
||
remembrance = data_mode1.pop('remembrance_list')
|
||
data_mode1['remembrance'] = remembrance
|
||
if 'language_list' in data_mode1:
|
||
language = data_mode1.pop('language_list')
|
||
data_mode1['language'] = language
|
||
if 'project_undergo' in data_mode1:
|
||
if data_mode1.get('project_undergo', []):
|
||
data_mode1['project_undergo'] = [json.dumps(i) for i in data_mode1['project_undergo']]
|
||
else:
|
||
data_mode1['project_undergo'] = []
|
||
if 'work_list' in data_mode1:
|
||
if data_mode1.get('work_list', []):
|
||
data_mode1['work_list'] = [json.dumps(i) for i in data_mode1['work_list']]
|
||
else:
|
||
data_mode1['work_list'] = []
|
||
if 'language' in data_mode1:
|
||
if data_mode1.get('language', []):
|
||
data_mode1['language'] = [json.dumps(i) for i in data_mode1['language']]
|
||
else:
|
||
data_mode1['language'] = []
|
||
if 'remembrance' in data_mode1:
|
||
if data_mode1.get('remembrance', []):
|
||
data_mode1['remembrance'] = [json.dumps(i) for i in data_mode1['remembrance']]
|
||
else:
|
||
data_mode1['remembrance'] = []
|
||
|
||
# 字符串转datetime
|
||
if data_mode1.get('in_time', ''):
|
||
chk_in_time = data_mode1['in_time'].replace('-', '/').replace('.', '/')
|
||
if len(chk_in_time.split('/')) == 2:
|
||
data_mode1['in_time'] = str(datetime.strptime(chk_in_time, "%Y/%m").date())
|
||
if len(chk_in_time.split('/')) == 3:
|
||
data_mode1['in_time'] = str(datetime.strptime(chk_in_time, "%Y/%m/%d").date())
|
||
|
||
if data_mode1.get('out_time', ''):
|
||
chk_out_time = data_mode1['out_time'].replace('-', '/').replace('.', '/')
|
||
if len(chk_out_time.split('/')) == 2:
|
||
data_mode1['out_time'] = str(datetime.strptime(chk_out_time, "%Y/%m").date())
|
||
if len(chk_out_time.split('/')) == 3:
|
||
data_mode1['out_time'] = str(datetime.strptime(chk_out_time, "%Y/%m/%d").date())
|
||
|
||
if data_mode1.get('birthday', ''):
|
||
chk_birthday = data_mode1['birthday'].replace('-', '/').replace('.', '/')
|
||
if len(chk_birthday.split('/')) == 2:
|
||
data_mode1['birthday'] = str(datetime.strptime(chk_birthday, "%Y/%m").date())
|
||
if len(chk_birthday.split('/')) == 3:
|
||
data_mode1['birthday'] = str(datetime.strptime(chk_birthday, "%Y/%m/%d").date())
|
||
|
||
if data_mode1.get('star_time', ''):
|
||
chk_star_time = data_mode1['star_time'].replace('-', '/').replace('.', '/')
|
||
if len(chk_star_time.split('/')) == 2:
|
||
data_mode1['star_time'] = str(datetime.strptime(chk_star_time, "%Y/%m").date())
|
||
if len(chk_star_time.split('/')) == 3:
|
||
data_mode1['star_time'] = str(datetime.strptime(chk_star_time, "%Y/%m/%d").date())
|
||
|
||
if data_mode1.get('end_time', ''):
|
||
chk_end_time = data_mode1['end_time'].replace('-', '/').replace('.', '/')
|
||
if len(chk_end_time.split('/')) == 2:
|
||
data_mode1['end_time'] = str(datetime.strptime(chk_end_time, "%Y/%m").date())
|
||
if len(chk_end_time.split('/')) == 3:
|
||
data_mode1['end_time'] = str(datetime.strptime(chk_end_time, "%Y/%m/%d").date())
|
||
|
||
if data_mode1.get('graduate_time', ''):
|
||
chk_graduate = data_mode1['graduate_time'].replace('-', '/').replace('.', '/')
|
||
if len(chk_graduate.split('/')) == 2:
|
||
data_mode1['graduate_time'] = str(datetime.strptime(chk_graduate, "%Y/%m").date())
|
||
if len(chk_graduate.split('/')) == 3:
|
||
data_mode1['graduate_time'] = str(datetime.strptime(chk_graduate, "%Y/%m/%d").date())
|
||
|
||
# 简历查重,姓名,手机号,性别name,phone,gender
|
||
find_name = data['name']
|
||
find_phone = data['phone']
|
||
find_gender = data['gender']
|
||
where = {}
|
||
if find_name:
|
||
where.update({
|
||
'name': find_name
|
||
})
|
||
if find_phone:
|
||
where.update({
|
||
'phone': find_phone
|
||
})
|
||
if find_gender:
|
||
where.update({
|
||
'gender': find_gender
|
||
})
|
||
whereStr = ''
|
||
for key, value in where.items():
|
||
if isinstance(value, str):
|
||
if not value.strip():
|
||
continue
|
||
if whereStr:
|
||
whereStr += 'and ' + str(key) + ' = ' + "'" + value + "'" + ' '
|
||
else:
|
||
whereStr += str(key) + ' = ' + "'" + value + "'" + ' '
|
||
continue
|
||
if whereStr:
|
||
whereStr += 'and ' + str(key) + ' = ' + str(value) + ' '
|
||
else:
|
||
whereStr += str(key) + ' = ' + str(value) + ' '
|
||
whereStr = whereStr.strip()
|
||
sql = f"select uid from HR.resumes where {whereStr}"
|
||
is_in_data = await db.execute(sql)
|
||
exist = 0
|
||
if is_in_data:
|
||
exist = 1
|
||
uid = list(is_in_data.values())[0]['uid']
|
||
# os.rename(path_data + '/' + filename, path_data + '/' + find_phone + '.pdf')
|
||
res = obsClient.putFile('legu-cdn-source', 'hrms_bata/' + uid + '.pdf', fn)
|
||
if res.status < 300:
|
||
# 地址
|
||
url = res.body.objectUrl
|
||
data_mode1['file_url'] = url
|
||
data['file_url'] = url
|
||
if exist:
|
||
continue
|
||
# 查找相关附件
|
||
chk_name = r'[赵|钱|孙|李|周|吴|郑|王|冯|陈|褚|卫|蒋|沈|韩|杨|朱|秦|尤|许|何|吕|施|张|孔|曹|严|华|金|魏|陶|姜|戚|谢|邹|喻|柏|水|窦|章|云|苏|潘|葛|奚|范|彭|郎|鲁|韦|昌|马|苗|凤|花|方|俞|任|袁|柳|酆|鲍|史|唐|费|廉|岑|薛|雷|贺|倪|汤|滕|殷|罗|毕|郝|邬|安|常|乐|于|时|傅|皮|卞|齐|康|伍|余|元|卜|顾|孟|平|黄|和|穆|萧|尹|姚|邵|湛|汪|祁|毛|禹|狄|米|贝|明|臧|计|伏|成|戴|谈|宋|茅|庞|熊|纪|舒|屈|项|祝|董|梁|杜|阮|蓝|闵|席|季|麻|强|贾|路|娄|危|江|童|颜|郭|梅|盛|林|刁|锺|徐|邱|骆|高|夏|蔡|田|樊|胡|凌|霍|虞|万|支|柯|昝|管|卢|莫|经|房|裘|缪|干|解|应|宗|丁|宣|贲|邓|郁|单|杭|洪|包|诸|左|石|崔|吉|钮|龚|程|嵇|邢|滑|裴|陆|荣|翁|荀|羊|於|惠|甄|麴|家|封|芮|羿|储|靳|汲|邴|糜|松|井|段|富|巫|乌|焦|巴|弓|牧|隗|山|谷|车|侯|宓|蓬|全|郗|班|仰|秋|仲|伊|宫|宁|仇|栾|暴|甘|钭|历|戎|祖|武|符|刘|景|詹|束|龙|叶|幸|司|韶|郜|黎|溥|印|宿|白|怀|蒲|邰|从|鄂|索|咸|籍|卓|蔺|屠|蒙|池|乔|阳|郁|胥|能|苍|双|闻|莘|党|翟|谭|贡|劳|逄|姬|申|扶|堵|冉|宰|郦|雍|却|桑|桂|濮|牛|寿|通|边|扈|燕|冀|浦|尚|农|温|别|庄|晏|柴|瞿|充|慕|连|茹|习|宦|艾|鱼|容|向|古|易|慎|戈|廖|庾|终|暨|居|衡|步|都|耿|满|弘|匡|国|文|寇|广|禄|阙|东|欧|沃|利|蔚|越|夔|隆|师|巩|厍|聂|晁|勾|敖|融|冷|訾|辛|阚|那|简|饶|空|曾|毋|沙|乜|养|鞠|须|丰|巢|关|蒯|相|荆|红|游|竺|权|司马|上官|欧阳|夏侯|诸葛|闻人|东方|赫连|皇甫|尉迟|公羊|澹台|公冶宗政|濮阳|淳于|单于|太叔|申屠|公孙|仲孙|轩辕|令狐|钟离|宇文|长孙|慕容|司徒|司空|召|有|舜|岳|黄辰|寸|贰|皇|侨|彤|竭|端|赫|实|甫|集|象|翠|狂|辟|典|良|函|芒|苦|其|京|中|夕|乌孙|完颜|富察|费莫|蹇|称|诺|来|多|繁|戊|朴|回|毓|鉏|税|荤|靖|绪|愈|硕|牢|买|但|巧|枚|撒|泰|秘|亥|绍|以|壬|森|斋|释|奕|姒|朋|求|羽|用|占|真|穰|翦|闾|漆|贵|代|贯|旁|崇|栋|告|休|褒|谏|锐|皋|闳|在|歧|禾|示|是|委|钊|频|嬴|呼|大|威|昂|律|冒|保|系|抄|定|化|莱|校|么|抗|祢|綦|悟|宏|功|庚|务|敏|捷|拱|兆|丑|丙|畅|苟|随|类|卯|俟|友|答|乙|允|甲|留|尾|佼|玄|乘|裔|延|植|环|矫|赛|昔|侍|度|旷|遇|偶|前|由|咎|塞|敛|受|泷|袭|衅|叔|圣|御|夫|仆|镇|藩|邸|府|掌|首|员|焉|戏|可|智|尔|凭|悉|进|笃|厚|仁|业|肇|资|合|仍|九|衷|哀|刑|俎|仵|圭|夷|徭|蛮|汗|孛|乾|帖|罕|洛|淦|洋|邶|郸|郯|邗|邛|剑|虢|隋|蒿|茆|菅|苌|树|桐|锁|钟|机|盘|铎|斛|玉|线|针|箕|庹|绳|磨|蒉|瓮|弭|刀|疏|牵|浑|恽|势|世|仝|同|蚁|止|戢|睢|冼|种|涂|肖|己|泣|潜|卷|脱|谬|蹉|赧|浮|顿|说|次|错|念|夙|斯|完|丹|表|聊|源|姓|吾|寻|展|出|不|户|闭|才|无|书|学|愚|本|性|雪|霜|烟|寒|少|字|桥|板|斐|独|千|诗|嘉|扬|善|揭|祈|析|赤|紫|青|柔|刚|奇|拜|佛|陀|弥|阿|素|长|僧|隐|仙|隽|宇|祭|酒|淡|塔|琦|闪|始|星|南|天|接|波|碧|速|禚|腾|潮|镜|似|澄|潭|謇|纵|渠|奈|风|春|濯|沐|茂|英|兰|檀|藤|枝|检|生|折|登|驹|骑|貊|虎|肥|鹿|雀|野|禽|飞|节|宜|鲜|粟|栗|豆|帛|官|布|衣|藏|宝|钞|银|门|盈|庆|喜|及|普|建|营|巨|望|希|道|载|声|漫|犁|力|贸|勤|革|改|兴|亓|睦|修|信|闽|北|守|坚|勇|汉|练|尉|士|旅|五|令|将|旗|军|行|奉|敬|恭|仪|母|堂|丘|义|礼|慈|孝|理|伦|卿|问|永|辉|位|让|尧|依|犹|介|承|市|所|苑|杞|剧|第|零|谌|招|续|达|忻|六|鄞|战|迟|候|宛|励|粘|萨|邝|覃|辜|初|楼|城|区|局|台|原|考|妫|纳|泉|老|清|德|卑|过|麦|曲|竹|百|福|言|第五|佟|爱|年|笪|谯|哈|墨|连|南宫|赏|伯|佴|佘|牟|商|西门|东门|左丘|梁丘|琴|后|况|亢|缑|帅|微生|羊舌|海|归|呼延|南门|东郭|百里|钦|鄢|汝|法|闫|楚|晋|谷梁|宰父|夹谷|拓跋|壤驷|乐正|漆雕|公西|巫马|端木|颛孙|子车|督|仉|司寇|亓官|三小|鲜于|锺离|盖|逯|库|郏|逢|阴|薄|厉|稽|闾丘|公良|段干|开|光|操|瑞|眭|泥|运|摩|伟|铁|迮][\u4e00-\u9fa5]{1,2}'
|
||
name = re.findall(chk_name, file)
|
||
user_chk_name = ''
|
||
if name:
|
||
name_txt = ','.join(name)
|
||
rank_result = lac.run(name_txt)
|
||
for index, i in enumerate(rank_result[1]):
|
||
if i == 'PER':
|
||
user_chk_name = rank_result[0][index]
|
||
break
|
||
if not user_chk_name:
|
||
user_chk_name = file.split('.')[0]
|
||
files_other = [i for i in file_list if user_chk_name in i and i.split('.')[0] != file.split('.')[0]]
|
||
# 存在相关附件
|
||
if files_other:
|
||
resume_affix_id = []
|
||
for other_file in files_other:
|
||
other_fn = file_path + '/' + other_file
|
||
try:
|
||
res = obsClient.putFile('legu-cdn-source', 'hrms_bata/' + other_file, other_fn)
|
||
if res.status < 300:
|
||
# 地址
|
||
url = res.body.objectUrl
|
||
resume_affix_id.append(url)
|
||
except:
|
||
continue
|
||
if resume_affix_id:
|
||
data_mode1['resume_affix_id'] = resume_affix_id
|
||
insert_list.append(data_mode1)
|
||
over_files.append(file)
|
||
else:
|
||
error_to_fw_files.append(file)
|
||
continue
|
||
except:
|
||
error_files.append(file)
|
||
continue
|
||
sql = f"insert into HR.resumes(interview_name, interview_type, interview_sign, hope_money, feedback," \
|
||
f" interview_round, event_time, uid, name, phone, job_name, hr_name, work_exp, interview_stage, owner_name," \
|
||
f" education, work_undergo, project_undergo, work_list, school, at_school, specialty, specialty_do, " \
|
||
f"mmended_state, mail, account, id_card, gender, age, gam, interview_state, counts, nation, come_time," \
|
||
f" review, upgrade, now_money, men_state, teacher_state, teacher_back, offer_state, offer_exam_state," \
|
||
f" notice_state, pass_why, pass_text, now_address,language,remembrance, file_url, hr_manner, resume_affix_id) values"
|
||
ok_num = len(insert_list)
|
||
await db.execute_dict(sql, insert_list)
|
||
res_data = {
|
||
'ok_num': ok_num,
|
||
'error_to_fw_files': error_to_fw_files,
|
||
'error_files': error_files,
|
||
}
|
||
return schemas.Msg(code=0, msg='ok', data=res_data)
|
||
|
||
|
||
# 导入面试数据
|
||
@router.post("/interview_file_insert")
|
||
async def interview_file_insert(
|
||
request: Request,
|
||
data_in: schemas.Filenames,
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" interview面试数据导入 """
|
||
path_data = os.getcwd() + '/jianli' # 当前文件所在的目录
|
||
if not os.path.exists(path_data):
|
||
os.makedirs(path_data)
|
||
filename = data_in.filenames.split('/')[-1]
|
||
try:
|
||
res = obsClient.getObject('legu-cdn-source', data_in.filenames, path_data + '/' + filename)
|
||
if res.status < 300:
|
||
chk_txt = getText_pdf(path_data + '/' + filename)
|
||
data = fmt_txt(chk_txt)
|
||
education = data['education']
|
||
# 学历int转化
|
||
education_int = {
|
||
'大专': 1,
|
||
'本科': 2,
|
||
'研究生': 3,
|
||
'博士': 4,
|
||
'硕士': 5,
|
||
}
|
||
if education and isinstance(education, str):
|
||
data['education'] = education_int.get(education, 1)
|
||
age = data['age']
|
||
if not age:
|
||
data['age'] = 20
|
||
# 年龄int转化
|
||
if age and isinstance(age, str):
|
||
true_age = re.search(r"\d+\.?\d*", age)
|
||
if len(true_age.group()) > 2:
|
||
data['age'] = 20
|
||
else:
|
||
data['age'] = int(true_age.group())
|
||
work_exp = data['work_exp']
|
||
if not work_exp:
|
||
data['work_exp'] = 0
|
||
# 工作经验float转化
|
||
if work_exp and isinstance(work_exp, str):
|
||
true_work_exp = re.search(r"\d+\.?\d*", work_exp)
|
||
if len(true_work_exp.group()) > 3:
|
||
data['work_exp'] = 0
|
||
else:
|
||
data['work_exp'] = float(true_work_exp.group())
|
||
|
||
print(data)
|
||
|
||
work_list = data['work_list']
|
||
language = data['language']
|
||
project_undergo = data['project_undergo']
|
||
remembrance = data['remembrance']
|
||
|
||
res_data = {
|
||
'data': data,
|
||
'project_undergo': project_undergo,
|
||
'work_list': work_list,
|
||
'language_list': language,
|
||
'remembrance_list': remembrance
|
||
}
|
||
|
||
return schemas.Msg(code=200, msg='ok', data=res_data)
|
||
else:
|
||
return schemas.Msg(code=-9, msg='解析失败', data='')
|
||
except:
|
||
return schemas.Msg(code=-9, msg='解析失败', data='')
|
||
|
||
|
||
@router.post("/add_job")
|
||
async def add_job(
|
||
request: Request,
|
||
data_in: schemas.Ins_Job,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""新增职位"""
|
||
await crud.jobs.insert_job(db, data_in)
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/find_job")
|
||
async def find_job(
|
||
request: Request,
|
||
data_in: schemas.Find_job,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""获取单个职位信息"""
|
||
res = await crud.jobs.find_job(db, data_in.job_id)
|
||
return schemas.Msg(code=200, msg='ok', data=res)
|
||
|
||
|
||
@router.post("/condition")
|
||
async def condition(
|
||
request: Request,
|
||
data_in: schemas.Interview,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" 面试情况 """
|
||
res = data_in.date
|
||
strs = []
|
||
for k, v in res.items():
|
||
if v != '':
|
||
if 'int' in str(type(v)):
|
||
str_s = f"{k} = {v}"
|
||
strs.append(str_s)
|
||
else:
|
||
if k in ['hr_id', 'interview_id', 'interview_name', 'hr_name'] and v != '':
|
||
str_s = f"{k} like '%{v}%'"
|
||
else:
|
||
str_s = f"{k} = '{v}'"
|
||
strs.append(str_s)
|
||
where = ' and '.join(strs)
|
||
# 当前日期
|
||
times = get_time()
|
||
# 今天的面试
|
||
if data_in.time_type == 'now':
|
||
# 查询返回的数据一共多少条
|
||
len_sql = f"""select uid from HR.resumes where {where} and toDate(star_time) == '{times}' and interview_stage = 3 ORDER BY event_time"""
|
||
sql = f"""select interview_round,interview_type,star_time,end_time,name,phone,job_names,hr_name,uid,interview_id,
|
||
feedback,interview_name from HR.resumes where {where} and toDate(star_time) == '{times}' and interview_stage = 3 ORDER BY event_time
|
||
LIMIT 10 OFFSET {(data_in.pages - 1) * 10}"""
|
||
# 明天及之后的面试
|
||
elif data_in.time_type == 'tomorrow':
|
||
len_sql = f"""select uid from HR.resumes where {where} and toDate(star_time) > '{times}' and interview_stage = 3 ORDER BY event_time"""
|
||
sql = f"""select interview_round,interview_type,star_time,end_time,name,phone,job_names,hr_name,uid,interview_id,
|
||
feedback,interview_name from HR.resumes where {where} and toDate(star_time) > '{times}' and interview_stage = 3 ORDER BY event_time
|
||
LIMIT 10 OFFSET {(data_in.pages - 1) * 10}"""
|
||
# 今天及之后的面试
|
||
elif data_in.time_type == 'later':
|
||
len_sql = f"""select uid from HR.resumes where {where} and toDate(star_time) > '{times}' and interview_stage = 3 ORDER BY event_time"""
|
||
sql = f"""select interview_round,interview_type,star_time,end_time,name,phone,job_names,hr_name,uid,interview_id,
|
||
feedback,interview_name from HR.resumes where {where} and toDate(star_time) >= '{times}' and interview_stage = 3 ORDER BY event_time
|
||
LIMIT 10 OFFSET {(data_in.pages - 1) * 10}"""
|
||
# 昨天及以前的面试
|
||
else:
|
||
len_sql = f"""select uid from HR.resumes where {where} and toDate(star_time) < '{times}' ORDER BY event_time"""
|
||
sql = f"""select interview_round,interview_type,star_time,end_time,name,phone,job_names,hr_name,uid,interview_id,
|
||
feedback,interview_name from HR.resumes where {where} and toDate(star_time) < '{times}' ORDER BY event_time
|
||
LIMIT 10 OFFSET {(data_in.pages - 1) * 10}"""
|
||
if where == '':
|
||
len_sql = len_sql.replace('where and', 'where', 1)
|
||
sql = sql.replace('where and', 'where', 1)
|
||
# 返回数据条数
|
||
df_len = await ckdb.query_dataframe(len_sql)
|
||
len_date = len(df_len)
|
||
df = await ckdb.query_dataframe(sql)
|
||
if df.empty:
|
||
data = {'lens': 0,
|
||
'data': []
|
||
}
|
||
return schemas.Msg(code=200, msg='无数据', data=data)
|
||
datas = []
|
||
for i in range(len(df)):
|
||
dates = {}
|
||
dates['key'] = df['uid'][i]
|
||
date = {} # 面试信息
|
||
date['interview_round'] = int(df['interview_round'][i])
|
||
date['interview_type'] = int(df['interview_type'][i])
|
||
noe = str(df['end_time'][i]).split(' ')[-1]
|
||
timess = str(df['star_time'][i]) + '~' + noe
|
||
date['time'] = timess
|
||
dates['msg'] = date
|
||
dates['name'] = df['name'][i]
|
||
dates['phone'] = df['phone'][i]
|
||
dates['job_names'] = df['job_names'][i]
|
||
dates['hr_name'] = df['hr_name'][i]
|
||
date1 = {}
|
||
date1['type'] = int(df['feedback'][i])
|
||
date1['name'] = df['interview_name'][i]
|
||
dates['type'] = date1
|
||
dates['interview_id'] = df['interview_id'][i]
|
||
datas.append(dates)
|
||
data = {'lens': len_date,
|
||
'data': datas
|
||
}
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|
||
|
||
|
||
@router.post("/get_job")
|
||
async def get_job(
|
||
request: Request,
|
||
data_in: schemas.Jobs = None,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""获取职位名称"""
|
||
# 获取对应条件的职位
|
||
res = await crud.jobs.all_fields(db, data_in)
|
||
# 获取职位数量
|
||
if data_in != None:
|
||
if data_in.state == True:
|
||
nums = len(res)
|
||
ress = await crud.jobs.all_fields(db, schemas.Jobs(state=False))
|
||
number = len(ress)
|
||
else:
|
||
number = len(res)
|
||
ress = await crud.jobs.all_fields(db, schemas.Jobs(state=True))
|
||
nums = len(ress)
|
||
job = []
|
||
job_list = [i['job_id'] for i in res]
|
||
sql1 = f"""
|
||
select job_id,count(*) as nu from HR.resumes where job_id in {job_list} and interview_stage < 6 group by job_id
|
||
"""
|
||
# 获取各个职位的候选人总数
|
||
df = await ckdb.query_dataframe(sql1)
|
||
if df.empty:
|
||
return schemas.Msg(code=-9, msg='无数据', data='')
|
||
job_dict = dict(zip(df['job_id'], df['nu']))
|
||
for i in res:
|
||
job_list = {}
|
||
job_list['key'] = i['job_id'] # 职位id
|
||
job_list['job_name'] = i['job_name'] # 职位名
|
||
job_list['principal'] = i['principal'] # 招聘负责人
|
||
job_list['job_sector'] = i['job_sector'] # 部门
|
||
job_list['job_num'] = i['job_num'] # 目标招聘人数
|
||
job_list['now_job_num'] = i['now_job_num'] # 对应职位的入职人数
|
||
job_list['hou_num'] = job_dict.get(i['job_id'], 0) # 候选人总数
|
||
job_list['creat_time'] = i['creat_time'] # 创建职位的时间
|
||
job.append(job_list)
|
||
# 按创建职位的最新时间排序
|
||
job.sort(key=lambda item: item['creat_time'], reverse=True)
|
||
if data_in != None:
|
||
data = {
|
||
'start_num': nums,
|
||
'end_num': number,
|
||
'job': job
|
||
}
|
||
else:
|
||
data = {'job': job}
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|
||
|
||
|
||
@router.post("/download_interview")
|
||
async def download_interview(
|
||
request: Request,
|
||
data_in: schemas.Timesinter,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
):
|
||
"""导出所有面试安排"""
|
||
sql = f"""SELECT interview_type,interview_stage,star_time,end_time,name,phone,job_name,hr_name,interview_name,
|
||
interview_sign FROM HR.resumes WHERE toDate(star_time) >= '{data_in.start_time}' and toDate(star_time) <= '{data_in.end_time}'"""
|
||
df = await ckdb.query_dataframe(sql)
|
||
if df.empty:
|
||
return schemas.Msg(code=200, msg='无数据', data='')
|
||
# xlsx表名
|
||
xlsx_name = data_in.start_time + '~' + data_in.end_time + '(包含起止日)'
|
||
datas = []
|
||
for i in range(len(df)):
|
||
one_data = []
|
||
one_data.append(interview_type_dict[df['interview_type'][i]])
|
||
one_data.append(interview_stage_dict[df['interview_stage'][i]])
|
||
df_time = qujian_time(df['star_time'][i], df['end_time'][i])
|
||
one_data.append(df_time)
|
||
one_data.append(df['name'][i])
|
||
one_data.append(df['phone'][i])
|
||
one_data.append(df['job_name'][i])
|
||
one_data.append(df['hr_name'][i])
|
||
one_data.append(df['interview_name'][i])
|
||
one_data.append(interview_sign_dict[df['interview_sign'][i]])
|
||
datas.append(one_data)
|
||
columns = ['面试类型', '面试阶段', '面试时间', '候选人', '联系方式', '应聘职位', '面试负责人', '面试官', '面试签到']
|
||
dfmi = pd.DataFrame(data=datas, columns=columns)
|
||
Download = Download_xlsx(dfmi, xlsx_name)
|
||
return Download
|
||
|
||
|
||
@router.post("/add_remark")
|
||
async def add_remark(
|
||
request: Request,
|
||
data_in: schemas.BaseRemark,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""添加备注"""
|
||
await crud.api_interview_remark.insert_remark(db, data_in)
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/find_remark")
|
||
async def find_remark(
|
||
request: Request,
|
||
data_in: schemas.FindRemark,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""查找备注"""
|
||
data = await crud.api_interview_remark.get_interview_remarks(db, data_in)
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|
||
|
||
|
||
@router.post("/find_criterion")
|
||
async def find_criterion(
|
||
request: Request,
|
||
data_in: schemas.get_uids,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""获取标准版简历"""
|
||
# sql = f"""
|
||
# select name,phone,job_name,work_exp,owner_name,education,work_undergo,school,specialty,
|
||
# graduate_time,mail,account,id_card,gender,nation,age,at_school,specialty_do,hope_money,resume_affix_id,
|
||
# review,work_list,project_undergo,upgrade,come_time,now_money,work_in_time from HR.resumes WHERE uid = '{data_in.uid}'
|
||
# """
|
||
sql = f"""
|
||
select * from HR.resumes WHERE uid = '{data_in.uid}' limit 1
|
||
"""
|
||
df = await ckdb.query_dataframe(sql)
|
||
data = {}
|
||
column = df.columns
|
||
for i in column:
|
||
if 'int' in str(type(df[i][0])):
|
||
data[i] = int(df[i][0])
|
||
else:
|
||
data[i] = df[i][0]
|
||
if data.get('work_list', []):
|
||
work_list = [json.loads(i) for i in data['work_list']]
|
||
if isinstance(work_list[0], str):
|
||
work_list = [eval(i) for i in work_list]
|
||
data['work_list'] = work_list
|
||
bast_index = 0
|
||
bast_time = 0
|
||
for index, i in enumerate(work_list):
|
||
time = i.get('time' '')
|
||
if time:
|
||
chk_time = int(time.split('-')[-1].split('/')[0])
|
||
if chk_time > bast_time:
|
||
bast_time = chk_time
|
||
bast_index = index
|
||
data['firm'] = work_list[bast_index]['company_name']
|
||
if data.get('project_undergo', []):
|
||
project_undergo = [json.loads(i) for i in data['project_undergo']]
|
||
if isinstance(project_undergo[0], str):
|
||
project_undergo = [eval(i) for i in project_undergo]
|
||
data['project_undergo'] = project_undergo
|
||
if data.get('remembrance', []):
|
||
remembrance = [json.loads(i) for i in data['remembrance']]
|
||
if isinstance(remembrance[0], str):
|
||
remembrance = [eval(i) for i in remembrance]
|
||
data['remembrance'] = remembrance
|
||
data['remembrance_list'] = remembrance
|
||
if data.get('language', []):
|
||
language = [json.loads(i) for i in data['language']]
|
||
if isinstance(language[0], str):
|
||
language = [eval(i) for i in language]
|
||
data['language'] = language
|
||
data['language_list'] = language
|
||
res_data = {k: v for k, v in data.items() if k not in ['event_time']}
|
||
return schemas.Msg(code=200, msg='ok', data=res_data)
|
||
|
||
|
||
@router.post("/resume_affix")
|
||
async def resume_affix(
|
||
request: Request,
|
||
file: UploadFile = File(...),
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""附件上传到华为云"""
|
||
path_data = os.getcwd() + '/accessory' # 当前文件所在的目录
|
||
if not os.path.exists(path_data):
|
||
os.makedirs(path_data)
|
||
contents = await file.read()
|
||
filename = file.filename
|
||
try:
|
||
with open(path_data + '/' + filename, "wb") as f:
|
||
# 将获取的file文件内容,写入到新文件中
|
||
f.write(contents)
|
||
f.close()
|
||
except:
|
||
return schemas.Msg(code=400, msg='上传文件有误', data='')
|
||
try:
|
||
# 附件正常上传到华为云
|
||
res = obsClient.putFile('legu-cdn-source', 'hrms/accessory/' + filename, path_data + '/' + filename)
|
||
if res.status < 300:
|
||
# 地址
|
||
url = res.body.objectUrl
|
||
resData = {'file_url': url, 'filename': 'hrms/accessory/' + filename}
|
||
res = json.dumps(resData)
|
||
# sql = f"""
|
||
# ALTER table HR.resumes update resume_affix_id = {url} WHERE uid = '{data_in.uid}'
|
||
# """
|
||
# await ckdb.execute(sql)
|
||
return schemas.Msg(code=200, msg='ok', data=res)
|
||
else:
|
||
# print('errorCode:', res.errorCode)
|
||
# print('errorMessage:', res.errorMessage)
|
||
return schemas.Msg(code=400, msg='上传华为云失败', data='')
|
||
except:
|
||
import traceback
|
||
print(traceback.format_exc())
|
||
return schemas.Msg(code=400, msg='上传华为云失败', data='')
|
||
|
||
|
||
@router.post("/mail_affix")
|
||
async def mail_affix(
|
||
request: Request,
|
||
file: UploadFile = File(...),
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""邮箱附件上传到华为云"""
|
||
path_data = os.getcwd() + '/mail_affix' # 当前文件所在的目录
|
||
if not os.path.exists(path_data):
|
||
os.makedirs(path_data)
|
||
contents = await file.read()
|
||
filename = file.filename
|
||
try:
|
||
with open(path_data + '/' + filename, "wb") as f:
|
||
# 将获取的file文件内容,写入到新文件中
|
||
f.write(contents)
|
||
f.close()
|
||
except:
|
||
return schemas.Msg(code=400, msg='上传文件有误', data='')
|
||
try:
|
||
# 附件正常上传到华为云
|
||
res = obsClient.putFile('legu-cdn-source', 'hrms/mail_affix/' + filename, path_data + '/' + filename)
|
||
if res.status < 300:
|
||
# 地址
|
||
url = res.body.objectUrl
|
||
resData = {'file_url': url, 'filename': 'hrms/mail_affix/' + filename}
|
||
res = json.dumps(resData)
|
||
# sql = f"""
|
||
# ALTER table HR.resumes update resume_affix_id = {url} WHERE uid = '{data_in.uid}'
|
||
# """
|
||
# await ckdb.execute(sql)
|
||
return schemas.Msg(code=200, msg='ok', data=res)
|
||
else:
|
||
# print('errorCode:', res.errorCode)
|
||
# print('errorMessage:', res.errorMessage)
|
||
return schemas.Msg(code=400, msg='上传华为云失败', data='')
|
||
except:
|
||
import traceback
|
||
print(traceback.format_exc())
|
||
return schemas.Msg(code=400, msg='上传华为云失败', data='')
|
||
|
||
|
||
@router.post("/updata_entry")
|
||
async def updata_entry(
|
||
request: Request,
|
||
data_in: schemas.Entry,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""修改入职状态"""
|
||
sql = f"""
|
||
ALTER table HR.resumes update interview_stage = {data_in.interview_stage} WHERE uid = '{data_in.uid}'
|
||
"""
|
||
await ckdb.execute(sql)
|
||
# 给招聘中职位计入职数
|
||
res = await crud.jobs.find_job(db, data_in.job_id)
|
||
num = res['now_job_num'] + 1
|
||
await crud.jobs.update_job(db, schemas.Jobs(job_id=data_in.job_id, now_job_num=num))
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/get_str_mail")
|
||
async def get_str_mail(
|
||
request: Request,
|
||
data_in: schemas.Email_str,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""获取邮件文本"""
|
||
data = [f"""
|
||
{data_in.name},您好\n\n感谢关注乐谷在线科技有限公司!很高兴的通知您通过了我们的面试,真诚的邀请您加入我们的团队\n职位:{data_in.job}\n入职时间:{data_in.times}
|
||
\n薪酬:{data_in.money}\n联系人:{data_in.hr_name}\n联系电话:{data_in.phone}\n联系邮箱:{data_in.email}\n\n如有问题请用以上联系方式及时与我们沟通,谢谢!\n(系统邮件,请勿回复)
|
||
""",
|
||
f"""
|
||
{data_in.name},您好\n\n感谢关注乐谷在线科技有限公司!很高兴收到您的简\n历,想和您就{data_in.job}职位安排一次面试。\n\n1.面试日期:{data_in.times}
|
||
\n2.面试时长:30分钟(可能视面试情况缩减或延长,请预留一定缓冲时间)\n3.面试形式:现场面试\n4.面试地址:武汉市洪山区野芷湖西路创意天地5号楼2层\n\n
|
||
联系人:{data_in.hr_name}\n联系电话:{data_in.phone}\n联系邮箱:{data_in.email}\n\n以上面试信息,如需另行安排时间请用以上联系方式及时与我们沟通,谢谢!\n(系统邮件,请勿回复)
|
||
"""
|
||
]
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|
||
|
||
|
||
@router.post("/send_str_mail")
|
||
async def send_mail(
|
||
request: Request,
|
||
data_in: schemas.send_str_mail,
|
||
# file: List[UploadFile] = File(...),
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""发送邮件"""
|
||
path_data = os.getcwd() + '/mail_affix' # 当前文件所在的目录
|
||
if not os.path.exists(path_data):
|
||
os.makedirs(path_data)
|
||
filename = data_in.file.split('/')[-1]
|
||
try:
|
||
res = obsClient.getObject('legu-cdn-source', data_in.file, path_data + '/' + filename)
|
||
if res.status < 300:
|
||
send_affix_mail(data_in.email_str, [data_in.email], path_data + '/' + filename)
|
||
# send_str_mail(data_in.email_str, data_in.email)
|
||
# 保存发送邮件的记录
|
||
now_time = str(datetime.now()).split('.')[0]
|
||
await crud.email_record.create(db, schemas.email_record(user_id=data_in.user_id, text=data_in.email_str,
|
||
times=now_time, name=name, state=1,
|
||
read_status=0, type='email', mail_affix=data_in.file))
|
||
return schemas.Msg(code=200, msg='邮件发送成功', data='')
|
||
except Exception as e:
|
||
print(e)
|
||
now_time = str(datetime.now()).split('.')[0]
|
||
await crud.email_record.create(db, schemas.email_record(user_id=data_in.user_id, text=data_in.email_str,
|
||
times=now_time, name=name, state=0,
|
||
read_status=0, type='email', mail_affix=data_in.file))
|
||
return schemas.Msg(code=200, msg='邮件发送失败', data='')
|
||
|
||
|
||
@router.post("/email_record")
|
||
async def email_record(
|
||
request: Request,
|
||
data_in: schemas.get_email_record,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""获取发送邮件的记录"""
|
||
data = await crud.email_record.all_record(db, data_in)
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|
||
|
||
|
||
@router.post("/operate_log")
|
||
async def operate_log(
|
||
request: Request,
|
||
data_in: schemas.operate_log,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""同步插入操作记录"""
|
||
await crud.operate_log.create(db, data_in)
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/get_operate_log")
|
||
async def get_operate_log(
|
||
request: Request,
|
||
data_in: schemas.get_operate_log,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""获取操作记录"""
|
||
data = await crud.operate_log.all_log(db, data_in)
|
||
# 对时间进行排序
|
||
data = sorted(data, key=operator.itemgetter('times'))
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|
||
|
||
|
||
@router.get("/get_dding_user")
|
||
async def get_dding_user(
|
||
request: Request,
|
||
current_user: schemas.User = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""获取钉钉的用户id"""
|
||
data = get_redis_alluid()
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|
||
|
||
|
||
@router.post("/teacher_state")
|
||
async def teacher_state(
|
||
request: Request,
|
||
data_in: schemas.user_id,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""催促面试官反馈功能"""
|
||
# 同步钉钉发消息给面试官
|
||
try:
|
||
now_time = str(datetime.now()).split('.')[0]
|
||
if current_user.name != 'root':
|
||
content = f"【催促反馈】\n请面试官尽快给{data_in.name}做面试反馈\n提醒时间:{now_time}"
|
||
# send_dates(content, data_in.user_id)#工作通知
|
||
res = await crud.user.get_users(db, data_in.user_id)
|
||
unionid_list = [i['unionid'] for i in res]
|
||
Sample.create_task('催促反馈', current_user.unionid, content, unionid_list) # 待办通知
|
||
return schemas.Msg(code=200, msg='发送成功', data='')
|
||
except Exception:
|
||
return schemas.Msg(code=-9, msg='发送失败', data='')
|
||
|
||
|
||
@router.post("/add_mode")
|
||
async def add_mode(
|
||
request: Request,
|
||
data_in: schemas.InsertModes,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""添加hr分组"""
|
||
await crud.api_interview_modes.insert_modes(db, data_in)
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/add_table")
|
||
async def add_table(
|
||
request: Request,
|
||
data_in: schemas.InsertTables,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""添加分组报表"""
|
||
await crud.api_interview_tables.insert_tables(db, data_in)
|
||
mode_id = data_in.mode_id
|
||
mode_info = await crud.api_interview_modes.get_one_mode(db, mode_id)
|
||
mode_list = mode_info.get('mode_list', [])
|
||
table_id = data_in.table_id
|
||
# 不存在则添加
|
||
if table_id not in mode_list:
|
||
mode_list.append(table_id)
|
||
await crud.api_interview_modes.update_mode_list(db, mode_id, mode_list)
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/update_table")
|
||
async def update_table(
|
||
request: Request,
|
||
data_in: schemas.UpdateTables,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""修改表报"""
|
||
await crud.api_interview_tables.update_tables(db, data_in)
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/find_mode")
|
||
async def find_mode(
|
||
request: Request,
|
||
data_in: schemas.FindModes,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""查找hr所有分组"""
|
||
data = await crud.api_interview_modes.get_interview_modes(db, data_in)
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|
||
|
||
|
||
@router.post("/find_mode_tables")
|
||
async def find_mode_tables(
|
||
request: Request,
|
||
data_in: schemas.UpdateModes,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""获取一条hr分组包含的报表"""
|
||
mode_data = await crud.api_interview_modes.get_one_mode(db, data_in.mode_id)
|
||
table_data = []
|
||
new_table_data = []
|
||
if mode_data:
|
||
tables = mode_data['mode_list']
|
||
if tables:
|
||
table_data = await crud.api_interview_tables.get_tables(db, {'table_id': {'$in': tables}})
|
||
if table_data:
|
||
for data in table_data:
|
||
table_id = data.get('table_id')
|
||
sort_key = tables.index(table_id)
|
||
data.update({'sort_key': sort_key})
|
||
new_data = deepcopy(data)
|
||
new_table_data.append(new_data)
|
||
if new_table_data:
|
||
new_table_data.sort(key=lambda i: i.get('sort_key'))
|
||
|
||
return schemas.Msg(code=200, msg='ok', data=new_table_data)
|
||
|
||
|
||
@router.post("/update_mode")
|
||
async def update_mode(
|
||
request: Request,
|
||
data_in: schemas.UpdateModes,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.User = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""更新一条hr分组数据"""
|
||
await crud.api_interview_modes.update_modes(db, data_in)
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.get("/name")
|
||
async def name(
|
||
request: Request,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.User = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""获取所有用户角色"""
|
||
res = await crud.user.get_all_users(db, {})
|
||
data = []
|
||
for i in res:
|
||
if i.get('name') != 'root':
|
||
data_dict = {}
|
||
data_dict['_id'] = str(i.get('_id'))
|
||
data_dict['name'] = i.get('name')
|
||
data_dict['user_id'] = i.get('user_id')
|
||
data_dict['unionid'] = i.get('unionid')
|
||
data_dict['email'] = i.get('email')
|
||
data_dict['rank'] = i.get('rank') # 用于区分是面试官还是hr
|
||
data_dict['nickname'] = i.get('nickname') # 显示名
|
||
data.append(data_dict)
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|
||
|
||
|
||
@router.post("/amend_job")
|
||
async def amend_job(
|
||
request: Request,
|
||
data_in: schemas.Jobs,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.User = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""修改职位信息,修改职位招聘状态"""
|
||
await crud.jobs.update_job(db, data_in)
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/create")
|
||
async def create(
|
||
request: Request,
|
||
data_in: schemas.DashboardCreate,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""创建看板"""
|
||
try:
|
||
await crud.dashboard.create(db, data_in.name, user_id=current_user.id)
|
||
except pymongo.errors.DuplicateKeyError:
|
||
return schemas.Msg(code=-1, msg='看板已存在', data='看板已存在')
|
||
|
||
return schemas.Msg(code=200, msg='ok', data='创建成功')
|
||
|
||
|
||
@router.post("/delete")
|
||
async def delete(
|
||
request: Request,
|
||
data_in: schemas.DashboardDelete,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""删除看板"""
|
||
del_dashboard = await crud.dashboard.delete(db, {'_id': {'$in': data_in.ids}})
|
||
if del_dashboard.deleted_count == 0:
|
||
return schemas.Msg(code=-1, msg='error', data='删除失败')
|
||
return schemas.Msg(code=200, msg='ok', data='删除成功')
|
||
|
||
|
||
@router.post("/get_dashboard")
|
||
async def get_dashboard(
|
||
request: Request,
|
||
data_in: schemas.ReadDashboard,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
):
|
||
"""获取一个看板"""
|
||
res = await crud.dashboard.get(db, id=data_in.id)
|
||
reports = {item['report_id']: item for item in res['reports']}
|
||
reports_detail = await crud.report.find_many(db, {'_id': {'$in': list(reports.keys())}}, {'query.cachedata': False})
|
||
for item in reports_detail:
|
||
reports[item['_id']].update(item)
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/edit")
|
||
async def edit(
|
||
request: Request,
|
||
data_in: schemas.EditDashboard,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
):
|
||
"""编辑看板名"""
|
||
await crud.dashboard.update_one(db, {'_id': data_in.dashboard_id}, {'$set': {'name': data_in.new_name}})
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/notarize")
|
||
async def notarize(
|
||
request: Request,
|
||
data_in: schemas.Notarize,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""简历确认进入面试阶段"""
|
||
sql = f"""
|
||
ALTER table HR.resumes update interview_state = 2,hr_name = '{data_in.hr_name}',hr_id = '{data_in.hr_id}',interview_name = '{data_in.interview_name}',interview_id = '{data_in.interview_id}' WHERE uid = '{data_in.uid}'
|
||
"""
|
||
await ckdb.execute(sql)
|
||
find_sql = f"""
|
||
select uid,name,interview_name,hr_name,star_time,interview_sign,job_id,job_names,mail from HR.resumes where uid = '{data_in.uid}'
|
||
"""
|
||
df = await ckdb.query_dataframe(find_sql)
|
||
# 存份面试数据到mongodb
|
||
now_time = str(datetime.now()).split('.')[0]
|
||
await crud.interview_record.insert_record(db, schemas.interview_record(uid=df['uid'][0], # 唯一id
|
||
name=df['name'][0], # 求职者姓名
|
||
interview_name=df['interview_name'][0],
|
||
# 面试官姓名
|
||
hr_name=df['hr_name'][0], # hr姓名
|
||
star_time=df['star_time'][0], # 开始面试时间
|
||
interview_sign=0, # 签到状态
|
||
job_id=df['job_id'][0], # 我们自己招聘的职位id
|
||
job_names=df['job_names'][0], # 我们自己招聘的职位名
|
||
times=now_time, # 创建数据日期
|
||
read_status=0, # 读取状态
|
||
type='interview' # 记录的类型
|
||
))
|
||
if df['mail'][0] != '':
|
||
# 发送邮件给面试者通知面试
|
||
msg = f"""{df['name'][0]},您好\n\n感谢关注乐谷在线科技有限公司!请于{df['star_time'][0]}到公司参见面试。\n联系人:{data_in.hr_name}\n联系电话:{data_in.hr_phone}\n联系邮箱:{
|
||
data_in.hr_email}\n\n如有问题请用以上联系方式及时与我们沟通,谢谢!\n(系统邮件,请勿回复)
|
||
"""
|
||
send_str_mail(msg, df['mail'][0])
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/alter")
|
||
async def alter(
|
||
request: Request,
|
||
data_in: schemas.Stage,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""更改简历阶段"""
|
||
if data_in.stage == 1: # 初筛
|
||
sql = f"""
|
||
ALTER table HR.resumes update interview_stage = 1,job_id = '{data_in.data['job_id']}',job_names = '{data_in.data['job_names']}' WHERE uid = '{data_in.uid}'
|
||
"""
|
||
else:
|
||
sql = f"""
|
||
ALTER table HR.resumes update interview_stage = {data_in.stage} WHERE uid = '{data_in.uid}'
|
||
"""
|
||
await ckdb.execute(sql)
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/get_report")
|
||
async def get_report(
|
||
request: Request,
|
||
data_in: schemas.Findreport,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""获得已添加的报表"""
|
||
# 获取自己的报表
|
||
res = await crud.dashboard.find_report(db, user_id=data_in.report_id)
|
||
return schemas.Msg(code=200, msg='ok', data=res)
|
||
|
||
|
||
@router.post("/create_report")
|
||
async def create_report(
|
||
request: Request,
|
||
data_in: schemas.ReportCreate,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""新建报表"""
|
||
try:
|
||
await crud.report.create(db, data_in)
|
||
except pymongo.errors.DuplicateKeyError:
|
||
return schemas.Msg(code=-9, msg='error', data='报表已存在')
|
||
return schemas.Msg(code=200, msg='创建成功', data='')
|
||
|
||
|
||
@router.post("/up_report")
|
||
async def up_report(
|
||
request: Request,
|
||
data_in: schemas.ReportEdit,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""编辑报表"""
|
||
await crud.report.update_one(db, {'_id': data_in.report_id},
|
||
{'$set': {'query': data_in.query, 'name': data_in.name, 'desc': data_in.desc}})
|
||
# 只能报表所有者编辑
|
||
# res = await crud.report.update_one(db, {'_id': data_in.report_id, 'user_id': request.user.id},
|
||
# {'$set': {'query': data_in.query, 'name': data_in.name, 'desc': data_in.desc}})
|
||
|
||
# if not res.matched_count:
|
||
# #if res.matched_count:
|
||
# return schemas.Msg(code=-1, msg='只能报表所有者编辑')
|
||
return schemas.Msg(code=200, msg='编辑成功', data='')
|
||
|
||
|
||
@router.post("/edit_report")
|
||
async def edit_report(
|
||
request: Request,
|
||
data_in: schemas.EditReport,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""看板样式设置"""
|
||
await crud.dashboard.update_one(db, {'_id': data_in.id, 'reports.report_id': data_in.report.report_id},
|
||
{'$set': {f'reports.$.{k}': v for k, v in
|
||
data_in.report.dict(skip_defaults=True).items()}})
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/head")
|
||
async def head(
|
||
request: Request,
|
||
data_in: schemas.Post_head,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""保存头像链接"""
|
||
sql = f"""
|
||
ALTER table HR.resumes update head = '{data_in.head_id}' WHERE uid = '{data_in.uid}'
|
||
"""
|
||
await ckdb.execute(sql)
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.get("/hint")
|
||
async def hint(
|
||
request: Request,
|
||
data_in: schemas.Get_hr,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""重要事项-面试相关"""
|
||
# 邮件,反馈
|
||
res = await crud.email_record.all_hint(db)
|
||
# 面试记录
|
||
interview = await crud.interview_record.all_fields(db, {'hr_name': data_in.hr_name})
|
||
for i in interview:
|
||
res.append(i)
|
||
data = sorted(res, key=operator.itemgetter('times'))
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|
||
|
||
|
||
@router.post("/up_hint")
|
||
async def up_hint(
|
||
request: Request,
|
||
data_in: schemas.Up_hint,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""批量修改已读状态"""
|
||
# 面试记录
|
||
if data_in.type == 'interview':
|
||
await crud.interview_record.up_interview(db, data_in)
|
||
# 邮件,反馈
|
||
else:
|
||
await crud.email_record.up_hint(db, data_in)
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/login")
|
||
async def login(
|
||
# data_in: schemas.Login,
|
||
data: ExtendendOAuth = Depends(),
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
) -> Any:
|
||
"""
|
||
OAuth2兼容令牌登录,获取将来令牌的访问令牌
|
||
"""
|
||
if data.unionid == None:
|
||
# 账号密码登录
|
||
user = await crud.user.authenticate(db,
|
||
name=data.username, password=data.password
|
||
)
|
||
if not user:
|
||
# raise HTTPException(status_code=400, detail="Incorrect name or password")
|
||
return schemas.Msg(code=-1, msg='密码或用户名错误')
|
||
access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
|
||
# access_token_expires = timedelta(seconds=5)
|
||
await crud.user.update_login_time(db, data.username)
|
||
else:
|
||
# 钉钉扫码登录
|
||
user_id = Unionid(data.unionid)
|
||
user_list = get_alluid_list()
|
||
if user_id not in user_list:
|
||
return schemas.Msg(code=-1, msg='密码或用户名错误')
|
||
user = await crud.user.gets_user(db, user_id=user_id)
|
||
if user.state == 1:
|
||
return schemas.Msg(code=-1, msg='您的账号已被锁定,请联系管理员解锁')
|
||
access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
|
||
await crud.user.update_login_time(db, user.id) # 更新最后一次登录时间
|
||
return {
|
||
'data': {
|
||
'name': user.name, # 名字
|
||
'email': user.email, # 邮箱
|
||
'tel': user.tel, # 电话
|
||
'user_id': user.user_id, # 钉钉id
|
||
'unionid': user.unionid, # 钉钉unionid
|
||
'id': user.id, # 账号的唯一标识
|
||
'rank': user.rank, # 区分hr和面试官
|
||
'nickname': user.nickname, # 显示名
|
||
'token': security.create_access_token(
|
||
expires_delta=access_token_expires, user_id=user.user_id, email=user.email, nickname=user.nickname,
|
||
tel=user.tel, name=user.name, rank=user.rank, unionid=user.unionid, _id=str(user.id)),
|
||
"token_type": "bearer"},
|
||
'access_token': security.create_access_token(
|
||
expires_delta=access_token_expires, user_id=user.user_id, email=user.email, nickname=user.nickname,
|
||
tel=user.tel, name=user.name, rank=user.rank, unionid=user.unionid, _id=str(user.id)
|
||
),
|
||
"token_type": "bearer",
|
||
'code': 200,
|
||
'msg': 'success',
|
||
}
|
||
|
||
|
||
@router.post("/reset_password")
|
||
async def reset_password(request: Request,
|
||
data_in: schemas.UserRestPassword,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.User = Depends(deps.get_current_user)
|
||
) -> Any:
|
||
"""
|
||
修改其他人密码
|
||
"""
|
||
try:
|
||
await crud.user.reset_password(db, data_in)
|
||
except Exception as e:
|
||
return schemas.Msg(code=-9, msg='修改失败', data={'username': data_in})
|
||
return schemas.Msg(code=200, msg='ok')
|
||
|
||
|
||
@router.post("/set_userinfo")
|
||
async def reset_my_password(request: Request,
|
||
data_in: schemas.UserRestMyPassword,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.User = Depends(deps.get_current_user)
|
||
) -> Any:
|
||
"""
|
||
修改自己的密码,用户名,电话,邮箱
|
||
"""
|
||
await crud.user.reset_password(db,
|
||
schemas.UserRestPassword(user_id=current_user.user_id, password=data_in.password,
|
||
nickname=data_in.nickname, tel=data_in.tel,
|
||
email=data_in.email))
|
||
return schemas.Msg(code=200, msg='ok')
|
||
|
||
|
||
@router.post("/add_account")
|
||
async def add_account(
|
||
request: Request,
|
||
data_in: schemas.Createuser,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.User = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""
|
||
创建新账号
|
||
"""
|
||
# user_id = Unionid(data_in.unionid)
|
||
# user_list = get_alluid_list()
|
||
# if user_id not in user_list:
|
||
# return schemas.Msg(code=-9, msg="不是本公司的员工")
|
||
user = get_redis_alluid()
|
||
user_lists = [i['user_id'] for i in user]
|
||
user_list = list(itertools.chain.from_iterable(user_lists))
|
||
a = 0
|
||
for i in user_list:
|
||
if i['name'] == data_in.name:
|
||
user_id = i['userid']
|
||
a += 1
|
||
break
|
||
if a == 1:
|
||
return schemas.Msg(code=-9, msg="不是本公司的员工")
|
||
if is_exists := await crud.user.exists(db, {'user_id': user_id}):
|
||
return schemas.Msg(code=-9, msg='已创建该账号')
|
||
else:
|
||
new_account = schemas.UserCreate(name=data_in.name, hashed_password=get_password_hash('123'),
|
||
unionid=data_in.unionid,
|
||
rank=data_in.rank, email=data_in.email, tel=data_in.tel, user_id=user_id)
|
||
await crud.user.create(db, new_account) # 创建账号
|
||
|
||
return schemas.Msg(code=200, msg='创建成功', data='')
|
||
|
||
|
||
@router.post("/forbid_login")
|
||
async def forbid_login(request: Request,
|
||
data_in: schemas.Get_userid,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.User = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""
|
||
禁止/解禁用户登录功能
|
||
"""
|
||
if data_in.type == 1:
|
||
await crud.user.forbid_lojin(db, data_in, 1)
|
||
elif data_in.type == 0:
|
||
await crud.user.forbid_lojin(db, data_in, 0)
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/owner_list")
|
||
async def owner_list(
|
||
request: Request,
|
||
data_in: schemas.Getdate,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""获取基本信息列表"""
|
||
try:
|
||
res = await crud.basic_data.one_owner(db, data_in)
|
||
except Exception as e:
|
||
return schemas.Msg(code=-9, msg='查无数据', data='')
|
||
|
||
return schemas.Msg(code=200, msg='ok', data=res)
|
||
|
||
|
||
@router.post("/owner_edit")
|
||
async def owner_edit(
|
||
request: Request,
|
||
data_in: schemas.Ownername,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""新增,删除基本信息"""
|
||
await crud.basic_data.update(db, data_in)
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.get("/get_section")
|
||
async def get_section(
|
||
request: Request,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""获取对应部门及职位"""
|
||
res = await crud.section.get_all(db)
|
||
return schemas.Msg(code=200, msg='ok', data=res)
|
||
|
||
|
||
@router.post("/ins_section")
|
||
async def get_section(
|
||
request: Request,
|
||
data_in: schemas.Ins_section,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""新增对应部门及职位"""
|
||
await crud.section.ins_section(db, data_in)
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.get("/api_list")
|
||
async def api_list(
|
||
request: Request,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""
|
||
所有的api
|
||
"""
|
||
re = await crud.api_module.get_api_module(db)
|
||
res = []
|
||
for i in re:
|
||
if i['path_name'] != 'root':
|
||
i['_id'] = str(i['_id'])
|
||
res.append(i)
|
||
return schemas.Msg(code=200, msg='ok', data=res)
|
||
|
||
|
||
@router.post("/alter_api_module")
|
||
async def add_policy(
|
||
request: Request,
|
||
data_in: schemas.Add_module,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
):
|
||
"""修改api_module权限状态"""
|
||
res = await crud.api_module.get_one_module(db, data_in)
|
||
for i in range(len(res['state'])):
|
||
if data_in.url == res['api_list'][i]:
|
||
if data_in.types == False:
|
||
res['state'][i] = False
|
||
else:
|
||
res['state'][i] = True
|
||
await crud.api_module.update_one_module(db, res)
|
||
return schemas.Msg(code=200, msg='修改成功', data='')
|
||
|
||
|
||
@router.get("/api_module")
|
||
async def domain_list(
|
||
request: Request,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""
|
||
角色管理创建角色时显示的各个模块
|
||
"""
|
||
res = await crud.api_module.get_api_module(db)
|
||
api_module = []
|
||
for i in res:
|
||
if i['path_name'] != 'root':
|
||
data = []
|
||
data.append(i['auth_id'])
|
||
data.append(i['path_name'])
|
||
api_module.append(data)
|
||
return schemas.Msg(code=200, msg='ok', data=api_module)
|
||
|
||
|
||
@router.post("/add_api")
|
||
async def add_api(
|
||
request: Request,
|
||
data_in: schemas.AddApi,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""
|
||
'在api_module'添加api
|
||
"""
|
||
res = await crud.api_module.get_api_module(db)
|
||
for i in res: # 判断路由是否存在
|
||
if data_in.path in i['api_list']:
|
||
return schemas.Msg(code=200, msg='该路由已存在', data='')
|
||
path_list = []
|
||
for i in res:
|
||
path_list.append(i['path_name'])
|
||
if data_in.name in path_list: # 在原有的基础上添加路由
|
||
for i in res:
|
||
if data_in.name == i['path_name']:
|
||
i['api_list'].append(data_in.path)
|
||
i['api_name'].append(data_in.desc)
|
||
i['state'].append(True)
|
||
await crud.api_module.updata_quanxian_module(db, schemas.Url_module(auth_id=i['auth_id'],
|
||
path_name=data_in.name,
|
||
api_list=i['api_list'],
|
||
api_name=i['api_name'],
|
||
state=i['state']))
|
||
return schemas.Msg(code=200, msg='ok', data='路由添加成功!')
|
||
else: # 另外添加新的权限模块
|
||
auth_list = []
|
||
for i in res:
|
||
auth_list.append(i['auth_id'])
|
||
auth_id = max(auth_list)
|
||
auth_id = 'abc' + str(int(auth_id.split('c')[-1]) + 1)
|
||
await crud.api_module.insert_quanxian(db, schemas.Url_module(auth_id=auth_id, path_name=data_in.name,
|
||
api_list=[data_in.path],
|
||
api_name=[data_in.desc], state=[True]))
|
||
return schemas.Msg(code=200, msg='ok', data='路由添加成功!')
|
||
|
||
|
||
@router.post("/add_policy")
|
||
async def add_policy(
|
||
request: Request,
|
||
data_in: schemas.Datalist,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
):
|
||
"""
|
||
向当前权限添加新路由
|
||
"""
|
||
res = await crud.url_list.find_one_url(db, data_in)
|
||
for i in range(len(res['api_list'])):
|
||
if res['api_list'][i] == data_in.path:
|
||
res['state'][i] = True
|
||
await crud.url_list.update_url_url(db, res)
|
||
return schemas.Msg(code=200, msg='修改成功', data='')
|
||
|
||
|
||
@router.post("/del_policy")
|
||
async def remove_policy(
|
||
request: Request,
|
||
data_in: schemas.Del_role,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
):
|
||
"""
|
||
修改角色api权限
|
||
"""
|
||
res = await crud.url_list.find_one_url(db, data_in)
|
||
for i in range(len(res['api_list'])):
|
||
if res['api_list'][i] == data_in.path:
|
||
res['state'][i] = False
|
||
await crud.url_list.update_url_url(db, res)
|
||
return schemas.Msg(code=200, msg='修改成功', data='')
|
||
|
||
|
||
@router.get("/roles")
|
||
async def roles(
|
||
request: Request,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""
|
||
获取所有的管理员用户
|
||
"""
|
||
res = await crud.url_list.get_all(db)
|
||
role = []
|
||
data = []
|
||
# 区分不同项目下的权限用户
|
||
for i in res:
|
||
if i['system'] == 1 and i['name'] != 'root':
|
||
role.append(i['name'])
|
||
# 得到不同权限用户
|
||
role = list(set(role))
|
||
for id in role:
|
||
data_dcit = {}
|
||
data_dcit['name'] = id
|
||
auth_id = []
|
||
system = []
|
||
data_list = []
|
||
for i in res:
|
||
if i['name'] == id:
|
||
data_one = {}
|
||
auth_id.append(i['auth_id'])
|
||
system.append(i['system'])
|
||
data_one['path_name'] = i['path_name']
|
||
data_one['api_name'] = i['api_name']
|
||
data_one['api_list'] = i['api_list']
|
||
data_one['state'] = i['state']
|
||
data_list.append(data_one)
|
||
data_dcit['datalist'] = data_list
|
||
data_dcit['auth_id'] = auth_id[0]
|
||
data_dcit['system'] = system[0]
|
||
data.append(data_dcit)
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|
||
|
||
|
||
@router.post("/add_roles")
|
||
async def add_roles(
|
||
request: Request,
|
||
data_in: schemas.Add_role,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""
|
||
创建不同权限角色
|
||
"""
|
||
res = await crud.url_list.get_all(db)
|
||
for i in res: # 判断创建的角色是否已经存在
|
||
if data_in.system == 1:
|
||
if data_in.name == i['name']:
|
||
return schemas.Msg(code=200, msg='该角色已存在!')
|
||
else:
|
||
if data_in.name == i['name']:
|
||
return schemas.Msg(code=200, msg='该角色已存在!')
|
||
auth = []
|
||
# 系统默认权限角色
|
||
if data_in.system == 1:
|
||
for i in res:
|
||
auth.append(i['auth_id'])
|
||
max_auth = 'ab' + str(int(max(auth).split('b')[-1]) + 1)
|
||
api_module = await crud.api_module.get_api_module(db)
|
||
for i in api_module:
|
||
if i['auth_id'] in data_in.path_name:
|
||
await crud.url_list.insert_url(db, schemas.Url_list(name=data_in.name, auth_id=max_auth,
|
||
path_name=i['path_name'], api_list=i['api_list'],
|
||
api_name=i['api_name'], state=i['state'],
|
||
system=data_in.system))
|
||
else:
|
||
state = []
|
||
for nu in range(len(i['state'])):
|
||
state.append(False)
|
||
if i['path_name'] != 'root':
|
||
await crud.url_list.insert_url(db, schemas.Url_list(name=data_in.name, auth_id=max_auth,
|
||
path_name=i['path_name'],
|
||
api_list=i['api_list'], api_name=i['api_name'],
|
||
state=state, system=data_in.system))
|
||
return schemas.Msg(code=200, msg='添加角色成功', data='')
|
||
else: # 系统其他权限角色
|
||
for i in res:
|
||
auth.append(i['auth_id'])
|
||
max_auth = 'ab' + str(int(max(auth).split('b')[-1]) + 1)
|
||
api_module = await crud.api_module.get_api_module(db)
|
||
for i in api_module:
|
||
if i['auth_id'] in data_in.path_name:
|
||
await crud.url_list.insert_urls(db, schemas.Url_lists(name=data_in.name, auth_id=max_auth,
|
||
path_name=i['path_name'], api_list=i['api_list'],
|
||
api_name=i['api_name'], state=i['state'],
|
||
system=data_in.system))
|
||
else:
|
||
state = []
|
||
for nu in range(len(i['state'])):
|
||
state.append(False)
|
||
if i['path_name'] != 'root':
|
||
await crud.url_list.insert_urls(db, schemas.Url_lists(name=data_in.name, auth_id=max_auth,
|
||
path_name=i['path_name'],
|
||
api_list=i['api_list'],
|
||
api_name=i['api_name'], state=state,
|
||
system=data_in.system))
|
||
return schemas.Msg(code=200, msg='添加角色成功', data='')
|
||
|
||
|
||
@router.post("/add_role_domain")
|
||
async def add_role_domain(
|
||
request: Request,
|
||
data_in: schemas.AddRoleForUsersInDomain,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
):
|
||
"""
|
||
在当前项目为角色添加相应权限
|
||
"""
|
||
res = await crud.url_list.get_all(db)
|
||
role_id = {}
|
||
for i in res:
|
||
role_id[i['auth_id']] = i['name']
|
||
for item in data_in.data:
|
||
now_quanxian = await crud.user_url.get_quanxian(db, schemas.Url_quanxian(user_id=item.role_id))
|
||
# 如果不存在该用户其他的权限,则新增一个
|
||
if now_quanxian == {}:
|
||
await crud.user_url.insert_quanxian(db, schemas.Url_quanxian(user=item.username,
|
||
user_id=item.role_id,
|
||
quanxian=role_id[item.auth_id],
|
||
quanxian_id=item.auth_id))
|
||
return schemas.Msg(code=200, msg='添加成功', data='')
|
||
# 存在则在这个用户表示已经有权限
|
||
else:
|
||
return schemas.Msg(code=-9, msg='权限已存在', data='')
|
||
|
||
|
||
@router.post("/send_interviewee")
|
||
async def send_interviewee(
|
||
request: Request,
|
||
data_in: schemas.send_in,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""推送给用人经理"""
|
||
sql = f"""
|
||
select job_id,name,job_names from HR.resumes where uid = '{data_in.uid}' limit 1
|
||
"""
|
||
res = await ckdb.execute(sql)
|
||
job_id = res[0]['job_id']
|
||
user = await crud.jobs.find_job(db, job_id)
|
||
if not user:
|
||
return schemas.Msg(code=-9, msg='职位不存在', data='')
|
||
user_list = [i['user_id'] for i in user['hr_name']]
|
||
if current_user.name != 'root':
|
||
send = f"""【推荐通知】\n{current_user.nickname}给你推荐了一位面试者\n面试者姓名:{res[0]['name']}\n岗位:{res[0]['job_names']}"""
|
||
unionid_list = [i['unionid'] for i in user['hr_name']]
|
||
# send_dates(send, user_list) #工作通知
|
||
Sample.create_task('推荐通知', current_user.unionid, send, unionid_list) # 待办通知
|
||
# 存一份推荐,如到一定时间没有处理推荐,则返回通知推荐人处理
|
||
datas = {'uid': data_in.uid, 'name': res[0]['name'], 'job_name': res[0]['job_names'],
|
||
'hr_name': user['hr_name'],
|
||
'referrer_name': current_user.nickname, 'referrer_id': current_user.unionid, 'types': False,
|
||
'create': str(datetime.now()).split('.')[0]}
|
||
# 先查有没有推荐记录
|
||
res = await crud.department.where_dep(db, {'uid': data_in.uid})
|
||
# 放入任务之中
|
||
judge(**{'uid': data_in.uid, 'subject': '推荐通知', 'creator_id': current_user.unionid,
|
||
'description': send, 'executor_ids': unionid_list, "types": False, 'times': hours()})
|
||
if res == []: # 没有则创建
|
||
await crud.department.create(db, datas)
|
||
else: # 有就更新
|
||
datas.pop('uid')
|
||
await crud.department.update(db, datas, data_in.uid)
|
||
|
||
department = ','.join(user_list)
|
||
up_sql = f"""ALTER TABLE HR.resumes update department = '{department}' where uid = '{data_in.uid}'"""
|
||
print(up_sql)
|
||
await ckdb.execute(up_sql)
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/add_interviewee")
|
||
async def add_interviewee(
|
||
request: Request,
|
||
data_in: schemas.add_inter,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""添加面试"""
|
||
name = await crud.user.get_users(db, data_in.user_id)
|
||
name_list = [i['nickname'] for i in name]
|
||
interview_name = ','.join(name_list)
|
||
userid = ','.join(data_in.user_id)
|
||
|
||
hr = await crud.user.get_users(db, data_in.hr_user)
|
||
hr_list = [i['nickname'] for i in hr]
|
||
hr_name = ','.join(hr_list)
|
||
hrid = ','.join(data_in.hr_user)
|
||
sql = f"""
|
||
ALTER TABLE HR.resumes update interview_name = '{interview_name}',interview_id = '{userid}',star_time='{data_in.star_time}',
|
||
end_time='{data_in.end_time}',hr_name='{hr_name}',hr_id='{hrid}',interview_stage=3
|
||
WHERE uid = '{data_in.uid}'
|
||
""" # 添加面试官和hr并自动进入下一阶段
|
||
await ckdb.execute(sql)
|
||
# 同步发送邮件通知被安排了面试
|
||
find_sql = f"""select job_names,name from HR.resumes where uid = '{data_in.uid}' limit 1"""
|
||
df = await ckdb.query_dataframe(find_sql)
|
||
interview_names = ','.join(name_list)
|
||
hr_names = ','.join(hr_list)
|
||
send = f"""【面试通知】\n面试岗位:{df['job_names'][0]}\n面试时间:{data_in.star_time}\n面试者:{df['name'][0]}\nHR:{hr_names}\n面试官:{interview_names}"""
|
||
hr_user = data_in.hr_user
|
||
hr_user.extend(data_in.user_id)
|
||
if current_user.name != 'root':
|
||
# send_dates(send, hr_user)#工作通知
|
||
res = await crud.user.get_users(db, hr_user)
|
||
unionid_list = [i['unionid'] for i in res]
|
||
Sample.create_task('面试通知', current_user.unionid, send, unionid_list) # 待办通知
|
||
find_sql = f"""
|
||
select uid,name,interview_name,hr_name,star_time,interview_sign,interview_id,job_id,job_names,mail from HR.resumes where uid = '{data_in.uid}'
|
||
"""
|
||
# df = await ckdb.query_dataframe(find_sql)
|
||
df1 = await ckdb.execute(find_sql)
|
||
user_data = df1[0]
|
||
# 存份面试数据到mongodb
|
||
now_time = str(datetime.now()).split('.')[0]
|
||
relevancy_id = get_uid()
|
||
await crud.interview_record.insert_record(db, {'uid': user_data['uid'], # 唯一id
|
||
'name': user_data['name'], # 求职者姓名
|
||
'interview_name': user_data['interview_name'], # 面试官姓名
|
||
'interview_id': user_data['interview_id'], # 面试官姓名
|
||
'hr_name': user_data['hr_name'], # hr姓名
|
||
'star_time': user_data['star_time'], # 开始面试时间
|
||
'interview_sign': 0, # 签到状态
|
||
'job_id': user_data['job_id'], # 我们自己招聘的职位id
|
||
'job_names': user_data['job_names'], # 我们自己招聘的职位名
|
||
'times': now_time, # 创建数据日期
|
||
'read_status': 0, # 读取状态
|
||
'back_status': 0, # 反馈状态
|
||
'type': 'interview', # 记录的类型
|
||
'relevancy_id' : relevancy_id # 标识,关联面试反馈用
|
||
})
|
||
# 创建空白的面试反馈到mdb数据库
|
||
survey = {}
|
||
for us in [name, hr]:
|
||
for i in us:
|
||
survey[i['user_id']] = {
|
||
"name": i['nickname'],
|
||
"voice": 0,
|
||
"thought": 0,
|
||
"diathesis": 0,
|
||
"evaluate": "",
|
||
"teacher_back": 0,
|
||
'type': False}
|
||
await crud.feedback.ins_feedback(db, schemas.Feedback(uid=data_in.uid, survey=survey,relevancy_id=relevancy_id))
|
||
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
# 头像上传到华为云
|
||
@router.post("/head_to_hw")
|
||
async def head_to_hw(
|
||
request: Request,
|
||
# data_in: schemas.Post_uid,
|
||
file: UploadFile = File(...),
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" 头像上传到华为云 """
|
||
path_data = os.getcwd() + '/head' # 当前文件所在的目录
|
||
if not os.path.exists(path_data):
|
||
os.makedirs(path_data)
|
||
contents = await file.read()
|
||
filename = file.filename
|
||
try:
|
||
with open(path_data + '/' + filename, "wb") as f:
|
||
# 将获取的file文件内容,写入到新文件中
|
||
f.write(contents)
|
||
f.close()
|
||
except:
|
||
return schemas.Msg(code=400, msg='上传文件有误', data=None)
|
||
try:
|
||
# 头像正常上传到华为云
|
||
res = obsClient.putFile('legu-cdn-source', 'hrms/user_icon/' + filename, path_data + '/' + filename)
|
||
if res.status < 300:
|
||
# 地址
|
||
url = res.body.objectUrl
|
||
resData = {'file_url': url, 'filename': 'hrms/user_icon/' + filename}
|
||
# sql = f"""
|
||
# ALTER table HR.resumes update head = {url} WHERE uid = '{data_in.uid}'
|
||
# """
|
||
# await ckdb.execute(sql)
|
||
return schemas.Msg(code=200, msg='ok', data=resData)
|
||
else:
|
||
# print('errorCode:', res.errorCode)
|
||
# print('errorMessage:', res.errorMessage)
|
||
return schemas.Msg(code=400, msg='上传华为云失败', data=None)
|
||
except:
|
||
import traceback
|
||
print(traceback.format_exc())
|
||
return schemas.Msg(code=400, msg='上传华为云失败', data=None)
|
||
|
||
|
||
# 候选人管理,模糊查询
|
||
@router.post("/find_like")
|
||
async def find_like(
|
||
request: Request,
|
||
data_in: schemas.find_like,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
find_column = ["uid", "age", "gender", "at_school", "name", "event_time", "owner_name", "education",
|
||
"school", "specialty", "interview_name", "mmended_state", "work_list", "work_exp",
|
||
"graduate_time",
|
||
"job_name", "feedback", "interview_round", "interview_state", "interview_stage", "pass_why",
|
||
"pass_text"]
|
||
find_columns = ','.join(find_column)
|
||
if data_in.date != {}:
|
||
strs = []
|
||
for k, v in data_in.date.items():
|
||
if v != '':
|
||
str_s = f"{k} like '%{v}%'"
|
||
strs.append(str_s)
|
||
where = ' and '.join(strs)
|
||
sql = f"""
|
||
select {find_columns} from HR.resumes where interview_stage = '{data_in.interview_stage}' and {where}
|
||
"""
|
||
else:
|
||
sql = f"""
|
||
select {find_columns} from HR.resumes where interview_stage = '{data_in.interview_stage}'
|
||
"""
|
||
data = await ckdb.execute(sql)
|
||
if not data:
|
||
return schemas.Msg(code=-9, msg='无数据', data='')
|
||
res = chkData(data)
|
||
return schemas.Msg(code=200, msg='ok', data=res)
|
||
|
||
|
||
# 总览
|
||
@router.post("/interview_stage_nu")
|
||
async def interview_stage_nu(
|
||
request: Request,
|
||
data_in: schemas.nterview,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
res_data = {'0': 0, '1': 0, '2': 0, '3': 0, '4': 0, '5': 0, '6': 0, '7': 0, '8': 0, '9': 0, '10': 0, '11': 0}
|
||
res = data_in.date
|
||
strs = []
|
||
for k, v in res.items():
|
||
if v != '':
|
||
if 'int' in str(type(v)):
|
||
str_s = f"{k} = {v}"
|
||
strs.append(str_s)
|
||
else:
|
||
if k in ['hr_id', 'interview_id'] and v != '':
|
||
str_s = f"{k} like '%{v}%'"
|
||
else:
|
||
str_s = f"{k} = '{v}'"
|
||
strs.append(str_s)
|
||
where = ' and '.join(strs)
|
||
# 当前日期
|
||
times = get_time()
|
||
len_sql = f"""select uid from HR.resumes where {where} and toDate(star_time) == '{times}' and interview_stage = 3"""
|
||
if where == '':
|
||
len_sql = len_sql.replace('where and', 'where', 1)
|
||
# 面试人数
|
||
df_len = await ckdb.query_dataframe(len_sql)
|
||
if df_len.empty:
|
||
len_date = 0
|
||
else:
|
||
len_date = len(df_len)
|
||
res_data['now'] = len_date
|
||
# 1:初筛 2:复筛 3:面试 4:沟通offer 5:待入职 6:放弃入职 7:已入职 8:转正 9:主动离职 10:被动离职 11:淘汰
|
||
sql = """select interview_stage,count(*) as value from HR.resumes group by interview_stage"""
|
||
data = await ckdb.execute(sql)
|
||
for i in data.values():
|
||
key = str(i['interview_stage'])
|
||
if key not in res_data:
|
||
continue
|
||
res_data[key] = i['value']
|
||
# 待发送offer
|
||
off_sql = """select count(*) as value from HR.resumes where offer_state <= 2 and interview_stage = 4"""
|
||
res = await ckdb.execute(off_sql)
|
||
res_data['offer'] = res[0]['value']
|
||
|
||
return schemas.Msg(code=200, msg='ok', data=res_data)
|
||
|
||
|
||
@router.post("/interview_finds")
|
||
async def interview_find(
|
||
request: Request,
|
||
interview: InterviewDo = Depends(InterviewDo),
|
||
db: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" interview面试数据查询 """
|
||
await interview.init()
|
||
res = interview.find_interview_sql()
|
||
sql = res['sql']
|
||
data = await db.execute(sql)
|
||
if not data:
|
||
return schemas.Msg(code=200, msg='无数据', data=[])
|
||
# 格式化数据
|
||
res_data = len(data)
|
||
return schemas.Msg(code=200, msg='ok', data=res_data)
|
||
|
||
|
||
@router.post("/interview")
|
||
async def interview(
|
||
request: Request,
|
||
data_in: schemas.interviews,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" 面试情况 """
|
||
res = data_in.date
|
||
strs = []
|
||
for k, v in res.items():
|
||
if v != '':
|
||
if 'int' in str(type(v)):
|
||
str_s = f"{k} = {v}"
|
||
strs.append(str_s)
|
||
else:
|
||
if k in ['hr_id', 'interview_id', 'interview_name', 'hr_name'] and v != '':
|
||
str_s = f"{k} like '%{v}%'"
|
||
else:
|
||
str_s = f"{k} = '{v}'"
|
||
strs.append(str_s)
|
||
where = ' and '.join(strs)
|
||
# 当前日期
|
||
times = get_time()
|
||
# 今天及之后的面试
|
||
len_sql = f"""select count(*) as v from HR.resumes where {where} and toDate(star_time) >= '{times}' and interview_stage = 3"""
|
||
print(len_sql)
|
||
# 已反馈的面试
|
||
sql1 = f"""select count(*) as v from HR.resumes where {where} and teacher_state = 2 and interview_stage = 3"""
|
||
print(sql1)
|
||
# 未反馈的面试
|
||
sql2 = f"""select count(*) as v from HR.resumes where {where} and teacher_state = 1 and interview_stage = 3 """
|
||
print(sql2)
|
||
# 已失效的面试
|
||
sql3 = f"""
|
||
|
||
"""
|
||
if where == '':
|
||
len_sql = len_sql.replace('where and', 'where', 1)
|
||
sql1 = sql1.replace('where and', 'where', 1)
|
||
sql2 = sql2.replace('where and', 'where', 1)
|
||
df_len = await ckdb.execute(len_sql)
|
||
len1 = await ckdb.execute(sql1)
|
||
len2 = await ckdb.execute(sql2)
|
||
len3 = 0
|
||
data = {
|
||
'later': df_len[0]['v'], # 今天及之后的面试
|
||
'teacher_true': len1[0]['v'], # 已反馈的面试
|
||
'later_false': len2[0]['v'], # 未反馈的面试
|
||
'later_invalid': len3 # 已失效的面试
|
||
}
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|
||
|
||
|
||
@router.post("/interviews")
|
||
async def interviews(
|
||
request: Request,
|
||
data_in: schemas.interviews,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" 面试官端详情"""
|
||
res = data_in.date
|
||
strs = []
|
||
for k, v in res.items():
|
||
if v != '':
|
||
if 'int' in str(type(v)):
|
||
str_s = f"{k} = {v}"
|
||
strs.append(str_s)
|
||
else:
|
||
if k in ['hr_id', 'interview_id', 'interview_name', 'hr_name'] and v != '':
|
||
str_s = f"{k} like '%{v}%'"
|
||
else:
|
||
str_s = f"{k} = '{v}'"
|
||
strs.append(str_s)
|
||
where = ' and '.join(strs)
|
||
# 当前日期
|
||
times = get_time()
|
||
# 今天及之后的面试
|
||
sql = f"""select uid,name,job_names,end_time,star_time,interview_type,hr_name,interview_stage,teacher_back from HR.resumes
|
||
where {where} and toDate(star_time) >= '{times}' and interview_stage = 3"""
|
||
print(sql)
|
||
# 已反馈的面试
|
||
sql1 = f"""select uid,name,job_names,end_time,star_time,interview_type,hr_name,interview_stage,teacher_back from HR.resumes
|
||
where {where} and teacher_state = 2 and interview_stage = 3"""
|
||
print(sql1)
|
||
# 未反馈的面试
|
||
sql2 = f"""select uid,name,job_names,end_time,star_time,interview_type,hr_name,interview_stage,teacher_back from HR.resumes
|
||
where {where} and teacher_state = 1 and interview_stage = 3 """
|
||
print(sql2)
|
||
# 已失效的面试
|
||
sql3 = f"""
|
||
|
||
"""
|
||
if where == '':
|
||
sql = sql.replace('where and', 'where', 1)
|
||
sql1 = sql1.replace('where and', 'where', 1)
|
||
sql2 = sql2.replace('where and', 'where', 1)
|
||
|
||
data = await ckdb.execute(sql)
|
||
res = chkData(data)
|
||
data1 = await ckdb.execute(sql1)
|
||
res1 = chkData(data1)
|
||
data2 = await ckdb.execute(sql2)
|
||
res2 = chkData(data2)
|
||
res3 = []
|
||
datas = {'later': res, # 今天及之后的面试
|
||
'teacher_true': res1, # 已反馈的面试
|
||
'later_false': res2, # 未反馈的面试
|
||
'later_invalid': res3} # 已失效的面试
|
||
|
||
return schemas.Msg(code=200, msg='ok', data=datas)
|
||
|
||
|
||
# 废除了,有默认加反馈模版的地方
|
||
@router.post("/interview_teacher")
|
||
async def interview_teacher(
|
||
request: Request,
|
||
data_in: schemas.Feedback,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" 新增面试反馈 """
|
||
await crud.feedback.ins_feedback(db, data_in)
|
||
|
||
# sql = f"""ALTER TABLE HR.resumes update teacher_state = 2 WHERE uid = '{data_in.uid}'"""
|
||
# await ckdb.execute(sql)
|
||
# await crud.interview_record.update_back_status(db, data_in.uid, data_in.teacher_back)
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/up_teacher")
|
||
async def interview_teacher(
|
||
request: Request,
|
||
data_in: schemas.Feedback,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" 修改面试反馈 """
|
||
data = await crud.feedback.one_feedback(db, {'uid': data_in.uid})
|
||
for k, v in data['survey'].items():
|
||
if k == list(data_in.survey.keys())[0]:
|
||
data['survey'][k] = data_in.survey[k]
|
||
data['survey'][k]['type'] = True
|
||
|
||
await crud.feedback.up_feedback(db, schemas.Feedback(uid=data_in.uid, survey=data['survey']))
|
||
res = await crud.feedback.one_feedback(db, {'uid': data_in.uid})
|
||
teacher_back = [v['teacher_back'] for v in res['survey'].values()]
|
||
types = [v['type'] for v in res['survey'].values()]
|
||
if 0 not in teacher_back and False not in types: # 当所有的反馈都处理完后,修改简历状态
|
||
up_sql = f"""ALTER TABLE HR.resumes update teacher_state = 2 WHERE uid = '{data_in.uid}'"""
|
||
await ckdb.execute(up_sql)
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/get_teacher")
|
||
async def interview_teacher(
|
||
request: Request,
|
||
data_in: schemas.get_teacher,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
""" 获取面试反馈 """
|
||
data = await crud.feedback.one_feedback(db, {'uid': data_in.uid})
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|
||
|
||
|
||
@router.post("/record")
|
||
async def hint(
|
||
request: Request,
|
||
data_in: schemas.record,
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""个人面试记录"""
|
||
res = []
|
||
interview = await crud.interview_record.all_fields(db, {'uid': data_in.uid})
|
||
#面试反馈
|
||
data = await crud.feedback.one_feedback(db, {'uid': data_in.uid})
|
||
for i in interview:
|
||
i.pop('_id')
|
||
for ii in data:
|
||
if i['relevancy_id'] == ii ['relevancy_id']:
|
||
survey=[]
|
||
for k,v in ii['survey'].items():
|
||
vlave=v
|
||
vlave['user_id']=k
|
||
survey.append(vlave)
|
||
i['survey']=survey
|
||
res.append(i)
|
||
data = sorted(res, key=operator.itemgetter('times'))
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|
||
|
||
|
||
@router.post("/talent_pool")
|
||
async def talent_pool(
|
||
request: Request,
|
||
data_in: schemas.find,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""获取人才库数据,分页查询"""
|
||
find_column = ["uid", "gender", "at_school", "name", "event_time", "education", "school", "specialty", "work_list",
|
||
"work_exp", "job_id", "job_names", "ago", "age", "pass_time", "job_name", "pass_why", "pass_text"]
|
||
find_columns = ','.join(find_column)
|
||
if data_in.date != {}:
|
||
strs = []
|
||
for k, v in data_in.date.items():
|
||
if v != '':
|
||
str_s = f"{k} like '%{v}%'"
|
||
strs.append(str_s)
|
||
where = ' and '.join(strs)
|
||
sql = f"""
|
||
select {find_columns} from HR.resumes where interview_stage = 11 and {where} ORDER BY event_time
|
||
LIMIT 10 OFFSET {(data_in.pages - 1) * 10}
|
||
"""
|
||
else:
|
||
sql = f"""
|
||
select {find_columns} from HR.resumes where interview_stage = 11 ORDER BY event_time
|
||
LIMIT 10 OFFSET {(data_in.pages - 1) * 10}
|
||
"""
|
||
print(sql)
|
||
data = await ckdb.execute(sql)
|
||
if not data:
|
||
return schemas.Msg(code=-9, msg='无数据', data='')
|
||
res = chkData(data)
|
||
job_id = [i['job_id'] for i in res]
|
||
# 查询对应职位数量
|
||
sql1 = f"""select job_id,count(*) as values from HR.resumes where interview_stage = 11 and job_id in {job_id} group by job_id"""
|
||
df = await ckdb.query_dataframe(sql1)
|
||
if not df.empty:
|
||
job_dict = dict(zip(df['job_id'], df['values']))
|
||
for i in res:
|
||
i['similarity'] = job_dict.get(i['job_id'], 0)
|
||
# res = [
|
||
# {"uid": "3b37c7d9a4f104", "gender": "女", "at_school": "2018/09-2020/06", "name": "张双琪",
|
||
# "event_time": "2022-10-27", "education": "大专",
|
||
# "school": "湖北科技职业学院", "specialty": "移动应用开发", "work_list": [
|
||
# {
|
||
# "company_name": "武汉筑梦科技有限公司",
|
||
# "time": "2019/07-2020/01",
|
||
# "position_name": "web前端 ",
|
||
# "duty": ": 主要从事自己负责Web前端开发。根据需求说明和设计文档,完成所分模块的开发及负责模块的单元测试工作。\n协助UI设计师完成也是设计工作,提出技术实现条件。负责前端页面的开发和前端交互的设计,以及网站前端\n性能的优化和提升\n"
|
||
# }
|
||
# ],
|
||
# "work_exp": 0, "job_id": "", "job_names": "", "ago": 1, "age": 22, "pass_time": "2022-10-28",
|
||
# "job_name": " Web开发工程师", "pass_why": "招聘需求变更", "pass_text": "dfbhg", "similarity": 11
|
||
# }, {"uid": "3b37c7d9a4f105", "gender": "女", "at_school": "2018/09-2020/06", "name": "张双琪1",
|
||
# "event_time": "2022-10-27", "education": "大专",
|
||
# "school": "湖北科技职业学院", "specialty": "移动应用开发", "work_list": [
|
||
# {
|
||
# "company_name": "武汉筑梦科技有限公司",
|
||
# "time": "2019/07-2020/01",
|
||
# "position_name": "web前端 ",
|
||
# "duty": ": 主要从事自己负责Web前端开发。根据需求说明和设计文档,完成所分模块的开发及负责模块的单元测试工作。\n协助UI设计师完成也是设计工作,提出技术实现条件。负责前端页面的开发和前端交互的设计,以及网站前端\n性能的优化和提升\n"
|
||
# }
|
||
# ],
|
||
# "work_exp": 0, "job_id": "", "job_names": "", "ago": 2, "age": 22, "pass_time": "2022-10-28",
|
||
# "job_name": " Web开发工程师", "pass_why": "招聘需求变更", "pass_text": "dfbhg", "similarity": 9
|
||
# }, {"uid": "3b37c7d9a4f106", "gender": "女", "at_school": "2018/09-2020/06", "name": "张双琪2",
|
||
# "event_time": "2022-10-27", "education": "大专",
|
||
# "school": "湖北科技职业学院", "specialty": "移动应用开发", "work_list": [
|
||
# {
|
||
# "company_name": "武汉筑梦科技有限公司",
|
||
# "time": "2019/07-2020/01",
|
||
# "position_name": "web前端 ",
|
||
# "duty": ": 主要从事自己负责Web前端开发。根据需求说明和设计文档,完成所分模块的开发及负责模块的单元测试工作。\n协助UI设计师完成也是设计工作,提出技术实现条件。负责前端页面的开发和前端交互的设计,以及网站前端\n性能的优化和提升\n"
|
||
# }
|
||
# ],
|
||
# "work_exp": 0, "job_id": "", "job_names": "", "ago": 3, "age": 28, "pass_time": "2022-10-28",
|
||
# "job_name": " Web开发工程师", "pass_why": "招聘需求变更", "pass_text": "dfbhg", "similarity": 5
|
||
# }, {"uid": "3b37c7d9a4f107", "gender": "女", "at_school": "2018/09-2020/06", "name": "张双琪3",
|
||
# "event_time": "2022-10-27", "education": "大专",
|
||
# "school": "湖北科技职业学院", "specialty": "移动应用开发", "work_list": [
|
||
# {
|
||
# "company_name": "武汉筑梦科技有限公司",
|
||
# "time": "2019/07-2020/01",
|
||
# "position_name": "web前端 ",
|
||
# "duty": ": 主要从事自己负责Web前端开发。根据需求说明和设计文档,完成所分模块的开发及负责模块的单元测试工作。\n协助UI设计师完成也是设计工作,提出技术实现条件。负责前端页面的开发和前端交互的设计,以及网站前端\n性能的优化和提升\n"
|
||
# }
|
||
# ],
|
||
# "work_exp": 0, "job_id": "", "job_names": "", "ago": 4, "age": 26, "pass_time": "2022-10-28",
|
||
# "job_name": " Web开发工程师", "pass_why": "招聘需求变更", "pass_text": "dfbhg", "similarity": 2
|
||
# }, {"uid": "3b37c7d9a4f108", "gender": "女", "at_school": "2018/09-2020/06", "name": "张双琪4",
|
||
# "event_time": "2022-10-27", "education": "大专",
|
||
# "school": "湖北科技职业学院", "specialty": "移动应用开发", "work_list": [
|
||
# {
|
||
# "company_name": "武汉筑梦科技有限公司",
|
||
# "time": "2019/07-2020/01",
|
||
# "position_name": "web前端 ",
|
||
# "duty": ": 主要从事自己负责Web前端开发。根据需求说明和设计文档,完成所分模块的开发及负责模块的单元测试工作。\n协助UI设计师完成也是设计工作,提出技术实现条件。负责前端页面的开发和前端交互的设计,以及网站前端\n性能的优化和提升\n"
|
||
# }
|
||
# ],
|
||
# "work_exp": 0, "job_id": "", "job_names": "", "ago": 5, "age": 23, "pass_time": "2022-10-28",
|
||
# "job_name": " Web开发工程师", "pass_why": "招聘需求变更", "pass_text": "dfbhg", "similarity": 0
|
||
# }, {"uid": "3b37c7d9a4f109", "gender": "女", "at_school": "2018/09-2020/06", "name": "张双琪5",
|
||
# "event_time": "2022-10-27", "education": "大专",
|
||
# "school": "湖北科技职业学院", "specialty": "移动应用开发", "work_list": [
|
||
# {
|
||
# "company_name": "武汉筑梦科技有限公司",
|
||
# "time": "2019/07-2020/01",
|
||
# "position_name": "web前端 ",
|
||
# "duty": ": 主要从事自己负责Web前端开发。根据需求说明和设计文档,完成所分模块的开发及负责模块的单元测试工作。\n协助UI设计师完成也是设计工作,提出技术实现条件。负责前端页面的开发和前端交互的设计,以及网站前端\n性能的优化和提升\n"
|
||
# }
|
||
# ],
|
||
# "work_exp": 0, "job_id": "", "job_names": "", "ago": 0, "age": 22,
|
||
# "pass_time": "2022-10-28", "job_name": " Web开发工程师", "pass_why": "招聘需求变更",
|
||
# "pass_text": "dfbhg", "similarity": 1
|
||
# },
|
||
# ]
|
||
else:
|
||
if len(res) > 0:
|
||
for i in res:
|
||
i['similarity'] = 0
|
||
return schemas.Msg(code=200, msg='ok', data=res)
|
||
|
||
|
||
@router.post("/talent_pool_nu")
|
||
async def talent_pool_nu(
|
||
request: Request,
|
||
data_in: schemas.find,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""获取人才库数据数量"""
|
||
if data_in.date != {}:
|
||
strs = []
|
||
for k, v in data_in.date.items():
|
||
if v != '':
|
||
if k not in ['event_time']:
|
||
str_s = f"{k} like '%{v}%'"
|
||
else:
|
||
str_s = f"{k} = '{v}'"
|
||
strs.append(str_s)
|
||
where = ' and '.join(strs)
|
||
sql = f"""select count(*) as nu from HR.resumes where interview_stage = 11 and {where}"""
|
||
else:
|
||
sql = f"""select count(*) as nu from HR.resumes where interview_stage = 11"""
|
||
print(sql)
|
||
data = await ckdb.query_dataframe(sql)
|
||
if data.empty:
|
||
return schemas.Msg(code=-9, msg='无数据', data='')
|
||
res = int(data['nu'][0])
|
||
return schemas.Msg(code=200, msg='ok', data=res)
|
||
|
||
|
||
@router.get("/option")
|
||
async def option(
|
||
request: Request,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""获取人才库筛选项"""
|
||
res = await crud.talentpool_filtrate.where_filtrate(db, ['default', current_user.id])
|
||
if len(res) > 1: # 自定义筛选项
|
||
for i in res:
|
||
if i['user_id'] != 'default':
|
||
data = i['where']
|
||
break
|
||
else: # 默认筛选项
|
||
data = res[0]['where']
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|
||
|
||
|
||
@router.post("/up_option")
|
||
async def up_option(
|
||
request: Request,
|
||
data_in: schemas.Where,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""修改/新增人才库筛选项"""
|
||
res = await crud.talentpool_filtrate.where_filtrate(db, ['default', current_user.id])
|
||
if len(res) > 1: # 修改自己的自定义筛选项
|
||
for i in res:
|
||
if i['user_id'] != 'default':
|
||
for up_id in i['where']:
|
||
if up_id['id'] in data_in.where:
|
||
up_id['type'] = True
|
||
else:
|
||
up_id['type'] = False
|
||
i.pop('user_id')
|
||
await crud.talentpool_filtrate.update_filtrate(db, current_user.id, i)
|
||
break
|
||
else: # 新增自己的自定义筛选项
|
||
for i in res[0]['where']:
|
||
if i['id'] in data_in.where:
|
||
i['type'] = True
|
||
else:
|
||
i['type'] = False
|
||
res[0].pop('user_id')
|
||
await crud.talentpool_filtrate.ins_filtrate(db,
|
||
schemas.Filtrate(where=res[0]['where'], user_id=current_user.id))
|
||
return schemas.Msg(code=200, msg='ok', data='')
|
||
|
||
|
||
@router.post("/option_data")
|
||
async def option_data(
|
||
request: Request,
|
||
data_in: schemas.Where_list,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""获取才库筛选项数据"""
|
||
data = {}
|
||
for i in data_in.where:
|
||
if i == 'job_id': # 应聘职位
|
||
res = await crud.jobs.where_field(db)
|
||
job = []
|
||
for i in res:
|
||
job_s = {}
|
||
job_s['id'] = i['job_id']
|
||
job_s['name'] = i['job_name']
|
||
job.append(job_s)
|
||
data['job_id'] = job
|
||
elif i == 'pass_why': # 归档原因
|
||
pass_why = []
|
||
for k, v in pass_why_dict.items():
|
||
pass_w = {}
|
||
pass_w['id'] = k
|
||
pass_w['name'] = v
|
||
pass_why.append(pass_w)
|
||
data['pass_why'] = pass_why
|
||
elif i == 'owner_name': # 渠道
|
||
owner_name = []
|
||
for k, v in owner_name_dict.items():
|
||
owner = {}
|
||
owner['id'] = k
|
||
owner['name'] = v
|
||
owner_name.append(owner)
|
||
data['owner_name'] = owner_name
|
||
elif i == 'education': # 学历
|
||
education = []
|
||
for k, v in education_dict.items():
|
||
educa = {}
|
||
educa['id'] = k
|
||
educa['name'] = v
|
||
education.append(educa)
|
||
data['education'] = education
|
||
elif i == 'gender': # 性别
|
||
data['gender'] = ['男', '女']
|
||
elif i == 'department': # 职位负责人
|
||
res1 = await crud.user.get_all_users(db, {'rank': 2})
|
||
department = []
|
||
for i in res1:
|
||
depar = {}
|
||
depar['id'] = i['_id']
|
||
depar['name'] = i['nickname']
|
||
department.append(depar)
|
||
data['department'] = department
|
||
elif i == 'hr_name': # 候选人所有者
|
||
res2 = await crud.user.get_all_users(db, {})
|
||
hr_name = []
|
||
for i in res2:
|
||
hr_n = {}
|
||
hr_n['id'] = i['_id']
|
||
hr_n['name'] = i['nickname']
|
||
hr_name.append(hr_n)
|
||
data['hr_name'] = hr_name
|
||
elif i == 'ago': # 归档前的阶段
|
||
ago = []
|
||
for k, v in interview_stage_dict.items():
|
||
stage = {}
|
||
stage['id'] = k
|
||
stage['name'] = v
|
||
ago.append(stage)
|
||
data['ago'] = ago
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|
||
|
||
|
||
@router.get("/get_number")
|
||
async def option_data(
|
||
request: Request,
|
||
ckdb: CKDrive = Depends(get_ck_db),
|
||
db: AsyncIOMotorDatabase = Depends(get_database),
|
||
current_user: schemas.UserDB = Depends(deps.get_current_user)
|
||
) -> schemas.Msg:
|
||
"""获取才库候选人总数和今日归档人数"""
|
||
now = datetime.now().strftime('%Y-%m-%d')
|
||
start_time = now + ' 00:00:00'
|
||
end_time = now + ' 23:59:59'
|
||
sql = f"""SELECT count(*) as values from HR.resumes where addHours(pass_time,0) >= '{start_time}' and addHours(pass_time,0) <= '{end_time}' and interview_stage = 11"""
|
||
# 今日归档人数
|
||
print(sql)
|
||
nu = await ckdb.execute(sql)
|
||
num = nu[0]['values']
|
||
_sql = f"""SELECT count(*) as values from HR.resumes where interview_stage <=6"""
|
||
_nu = await ckdb.execute(_sql)
|
||
_num = _nu[0]['values']
|
||
data = {'now': num, 'candidate': _num}
|
||
return schemas.Msg(code=200, msg='ok', data=data)
|