diff --git a/api/api_v1/endpoints/interview.py b/api/api_v1/endpoints/interview.py index f910bce..b82bf75 100644 --- a/api/api_v1/endpoints/interview.py +++ b/api/api_v1/endpoints/interview.py @@ -12,7 +12,7 @@ from fastapi import APIRouter, Depends, Request, File, UploadFile from motor.motor_asyncio import AsyncIOMotorDatabase from pandas import DataFrame from starlette.responses import StreamingResponse -from utils.jianli import get_resume +from utils.jianli import get_resume import crud, schemas from common import * @@ -320,7 +320,7 @@ async def download_inter( 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 + '(包含起止日)' + xlsx_name = data_in.start_time + '~' + data_in.end_time + '(包含起止日)' datas = [] for i in range(len(df)): one_data = [] @@ -355,10 +355,43 @@ async def event_edit( @router.post("/find_remark") async def event_edit( request: Request, - data_in: schemas.Ins_Job, + 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='') diff --git a/core/configuration.py b/core/configuration.py index 241742e..744e416 100644 --- a/core/configuration.py +++ b/core/configuration.py @@ -17,4 +17,18 @@ education_dict = {1: '大专', 2: '本科', 3: '研究生', 4: '博士', 5: '硕 # 推荐状态 mmended_state_dict = {0: '未推荐', 1: '已推荐'} # 当前面试状态 -interview_state_dict = {1: '待安排', 2: '面试中', 3: '已结束'} \ No newline at end of file +interview_state_dict = {1: '待安排', 2: '面试中', 3: '已结束'} +# 候选人状态 +men_state_dict = {1: '未反馈', 2: '已接受', 3: '已拒绝', 4: '未到场'} +# 面试官状态 +teacher_state_dict = {1: '未反馈', 2: '已反馈'} +# 面试官反馈 +teacher_back_dict = {1: '满意', 2: '非常满意', 3: '不满意', 4: '非常不满意'} +# offer状态 +offer_state_dict = {1: '未创建', 2: '未发送', 3: '待接受', 4: '已接受', 5: '已拒绝'} +# offer审批状态 +offer_exam_state_dict = {1: '未发起', 2: '审批中', 3: '已通过', 4: '已驳回', 5: '已撤回'} +# 通知状态 +notice_state_dict = {0: '未通知', 1: '已通知'} +# 淘汰原因 +pass_why_dict = {1: '招聘需求变更', 2: '福利待遇不匹配', 3: '与公司文化不符', 4: '淘汰', 5: '胜任力不足', 6: '没有回应', 7: '其他'} diff --git a/liwei_接口文档.md b/liwei_接口文档.md index f783c67..57871b0 100644 --- a/liwei_接口文档.md +++ b/liwei_接口文档.md @@ -51,3 +51,16 @@ api:/api/v1/itr/download_interview 参数: start_time: str # 开始时间 end_time: str # 结束时间 + +#获取标准版简历 +api:/api/v1/itr/find_criterion +请求方式:post +参数: + uid: str # 面试者简历在CK中的唯一标识 + +#保存附件id +api:/api/v1/itr/resume_affix +请求方式:post +参数: + uid: str # 面试者简历在CK中的唯一标识 + resume_affix_id: List[str] # 附件id diff --git a/schemas/interview_plan.py b/schemas/interview_plan.py index 80c48a7..1db63fc 100644 --- a/schemas/interview_plan.py +++ b/schemas/interview_plan.py @@ -21,3 +21,12 @@ class Interview(BaseModel): class Timesinter(BaseModel): start_time: str # 开始时间 end_time: str # 结束时间 + + +class Post_uid(BaseModel): + uid: str # 面试者简历在CK中的唯一标识 + resume_affix_id: List[str] # 附件id + + +class get_uid(BaseModel): + uid: str # 面试者简历在CK中的唯一标识 diff --git a/utils/casbin/dingding.py b/utils/casbin/dingding.py new file mode 100644 index 0000000..ba8f215 --- /dev/null +++ b/utils/casbin/dingding.py @@ -0,0 +1,120 @@ +import json + +import requests + +from db.redisdb import get_redis_pool + +redisdb=get_redis_pool() +def get_token(): + """ + 获取钉钉token + :return: + """ + corpid = 'dingd10b2fc689700431' + corpsecret = 'eL2gsI4Hgqx__FC8T5Bjmue_zQoyG5sm-SJqEDdS4NmKPTzFLQ2G93CX24VP2_n3' + url = f"https://oapi.dingtalk.com/gettoken" + # 请求头 + headers = {'Content-type': 'text/html;charset=utf-8', 'Access-Control-Allow-Origin': '*'} + # query查询参数 + query = { + 'corpid': corpid, + 'corpsecret': corpsecret + } + r = requests.get(url=url, params=query, headers=headers) + date = r.json() + tokens = date['access_token'] + # print(tokens) + return tokens + + +def get_uid(dept_id): + """ + 获取钉钉部门的成员名和uid + :return: + """ + url = "https://oapi.dingtalk.com/topapi/user/listsimple" + query = { + 'access_token': get_redistoken() + } + data = { + 'dept_id': dept_id, + 'cursor': 0, + 'size': 100 + } + r = requests.post(url=url, params=query, data=data) + datas = r.json() + return datas['result']['list'] + + +def get_zi(): + """ + 获取钉钉的所有部门列表 + :return: + """ + url = "https://oapi.dingtalk.com/department/list" + query = { + 'access_token': get_redistoken() + } + r = requests.get(url=url, params=query) + datas = r.json() + return datas['department'] + + + + +def send_date(name, job, times, hr, interview_name, userid_list): + """ + 发送消息至钉钉 + :param name: 面试者姓名 + :param job: 面试岗位 + :param times: 面试时间 + :param hr: hr名字 + :param interview_name: 面试官 + :param userid_list: 要发送的人的uid,列表 + :return: + """ + userid_list = ','.join(userid_list) + url = "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2" + query = { + 'access_token': get_redistoken() + } + data = { + 'agent_id': 792756727, + "to_all_user": "false", + 'userid_list': userid_list, + "msg": { + "msgtype": "text", + "text": { + "content": f"【面试通知】\n面试者:{name}\n面试岗位:{job}\n面试时间:{times}\nHR:{hr}\n面试官:{interview_name}" + } + } + } + json_data = json.dumps(data) + # 发送消息到钉钉 + requests.post(url=url, params=query, data=json_data) + + + +def get_redistoken(): + """ + 获取redis中存的token,如没有重新获取再存数据库中,再获取 + :return: str + """ + redistoken = redisdb.get('token') + if redistoken == None: + # token = '16524325693811559' + token = get_token() + redisdb.set(name='token', value=token, ex=3600) # 1小时 3600 + redistoken = redisdb.get('token') + return redistoken.decode() + + +def qujian_time(start_time, end_time): + """ + 把两个时间变成区间 + :param start_time: '2022-07-01 10:00:00' + :param end_time: '2022-07-01 10:30:00' + :return: '2022-07-01 10:00:00~10:30:00' + """ + timess = str(end_time).split(' ')[-1] + return str(start_time) + '~' + timess