import os import re import pandas as pd from fastapi import APIRouter, Depends, Request, File, UploadFile from motor.motor_asyncio import AsyncIOMotorDatabase from utils.jianli import get_resume import crud, schemas from core.configuration import * from db import get_database from db.ckdb import get_ck_db, CKDrive from models.interview_zsgc import InterviewDo from utils import get_time, qujian_time, Download_xlsx router = APIRouter() # 面试查询 @router.post("/interview_find") async def interview_find( request: Request, interview: InterviewDo = Depends(InterviewDo), db: CKDrive = Depends(get_ck_db), ) -> 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=-9, msg='无数据', data=None) return schemas.Msg(code=200, msg='ok', data=data) # 面试_主页初筛查询 @router.post("/interview_home_find") async def interview_find( request: Request, interview: InterviewDo = Depends(InterviewDo), db: CKDrive = Depends(get_ck_db), ) -> 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=-9, msg='无数据', data=None) return schemas.Msg(code=200, msg='ok', data=data) # 复筛查询 @router.post("/interview_screen_find") async def interview_find( request: Request, interview: InterviewDo = Depends(InterviewDo), db: CKDrive = Depends(get_ck_db), ) -> 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=-9, msg='无数据', data=None) return schemas.Msg(code=200, msg='ok', data=data) # 面试阶段查询 @router.post("/interview_exam_find") async def interview_find( request: Request, interview: InterviewDo = Depends(InterviewDo), db: CKDrive = Depends(get_ck_db), ) -> 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=-9, msg='无数据', data=None) return schemas.Msg(code=200, msg='ok', data=data) # offer阶段查询 @router.post("/interview_offer_find") async def interview_find( request: Request, interview: InterviewDo = Depends(InterviewDo), db: CKDrive = Depends(get_ck_db), ) -> schemas.Msg: """ interview面试数据offer阶段查询 """ await interview.init() res = interview.find_interview_offer_sql() sql = res['sql'] data = await db.execute(sql) if not data: return schemas.Msg(code=-9, msg='无数据', data=None) return schemas.Msg(code=200, msg='ok', data=data) # 待入职阶段查询 @router.post("/interview_waite_in_find") async def interview_find( request: Request, interview: InterviewDo = Depends(InterviewDo), db: CKDrive = Depends(get_ck_db), ) -> 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=-9, msg='无数据', data=None) return schemas.Msg(code=200, msg='ok', data=data) # 面试修改 @router.post("/interview_update") async def interview_update( request: Request, interview: InterviewDo = Depends(InterviewDo), db: CKDrive = Depends(get_ck_db), ) -> schemas.Msg: """ interview面试数据更新 """ await interview.init() res = interview.update_interview_sql() sql = res['sql'] try: data = await db.execute(sql) except: return schemas.Msg(code=-9, msg='数据有误', data=None) 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), ) -> 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("/interview_file_insert") async def interview_insert( request: Request, file: UploadFile = File(...), ) -> schemas.Msg: """ interview面试数据导入 """ path_data = os.getcwd() + '/jianli/' # 当前文件所在的目录 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) data = get_resume(filename, path_data) 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) return schemas.Msg(code=200, msg='ok', data=data) @router.post("/add_job") async def event_edit( request: Request, data_in: schemas.Ins_Job, db: AsyncIOMotorDatabase = Depends(get_database), ) -> schemas.Msg: """新增职位""" await crud.jobs.insert_job(db, data_in) return schemas.Msg(code=200, msg='ok', data='') @router.post("/condition") async def interview_insert( request: Request, data_in: schemas.Interview, ckdb: CKDrive = Depends(get_ck_db) ) -> 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: 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}' ORDER BY event_time""" sql = f"""select interview_round,interview_type,star_time,end_time,name,phone,job_name,hr_name, 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}""" # 明天及之后的面试 elif data_in.time_type == 'tomorrow': 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_name,hr_name, 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}""" # 昨天及以前的面试 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_name,hr_name, 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: return schemas.Msg(code=-9, msg='无数据', data='') data = {'lens': len_date, 'columns': df.columns.tolist(), 'values': df.values.tolist() } return schemas.Msg(code=200, msg='ok', data=data) @router.post("/get_job") async def event_edit( request: Request, data_in: schemas.Jobs = None, db: AsyncIOMotorDatabase = Depends(get_database) ) -> schemas.Msg: """获取职位名称""" # 获取对应条件的职位 res = await crud.jobs.all_fields(db, data_in) # 获取职位数量 num = len(res) job_list = [] job_id = [] for i in res: # 获取职位名称 job_list.append(i['job_name']) job_id.append(i['job_id']) data = { 'num': num, 'job_list': job_list, 'job_id': job_id } return schemas.Msg(code=200, msg='ok', data=data) @router.post("/download_interview") async def download_inter( request: Request, data_in: schemas.Timesinter, ckdb: CKDrive = Depends(get_ck_db)): """导出所有面试安排""" 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) # 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 event_edit( request: Request, data_in: schemas.BaseRemark, db: AsyncIOMotorDatabase = Depends(get_database), ) -> 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 event_edit( request: Request, data_in: schemas.FindRemark, db: AsyncIOMotorDatabase = Depends(get_database), ) -> 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 event_edit( request: Request, data_in: schemas.get_uid, ckdb: CKDrive = Depends(get_ck_db) ) -> 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}' """ df = await ckdb.query_dataframe(sql) data = {} column = df.columns for i in column: data[i] = df[i][0] return schemas.Msg(code=200, msg='ok', data=data) @router.post("/resume_affix") async def event_edit( request: Request, data_in: schemas.Post_uid, ckdb: CKDrive = Depends(get_ck_db) ) -> schemas.Msg: """保存附件id""" sql = f""" ALTER table HR.resumes update resume_affix_id = {data_in.resume_affix_id} WHERE uid = '{data_in.uid}' """ await ckdb.execute(sql) return schemas.Msg(code=200, msg='ok', data='')