prs_server/api/api_v1/endpoints/interview.py
2022-11-02 17:50:07 +08:00

3208 lines
138 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)