模板
This commit is contained in:
parent
3c8ca38a86
commit
cf9408449b
@ -212,9 +212,35 @@ async def man_mass_form(
|
||||
return schemas.Msg(code=200, msg='ok', data=res_msg)
|
||||
|
||||
|
||||
# 候选人明细报表
|
||||
@router.post("/man_info_form")
|
||||
async def man_info_form(
|
||||
request: Request,
|
||||
interview: InterviewDo = Depends(InterviewDo),
|
||||
db: CKDrive = Depends(get_ck_db),
|
||||
) -> schemas.Msg:
|
||||
""" 候选人明细报表 """
|
||||
await interview.init()
|
||||
res = interview.get_man_info_form_sql()
|
||||
sql = res['sql']
|
||||
data = await db.execute(sql)
|
||||
if not data:
|
||||
return schemas.Msg(code=-9, msg='无数据', data=None)
|
||||
for key, interview_data in data.items():
|
||||
i_work_list = interview_data.get('work_list', '')
|
||||
if i_work_list:
|
||||
data_work = eval(i_work_list[0])
|
||||
i_work_for = data_work.get('name', '')
|
||||
if i_work_for:
|
||||
data[key]['work_for'] = i_work_for
|
||||
continue
|
||||
data[key]['work_for'] = ''
|
||||
return schemas.Msg(code=200, msg='ok', data=data)
|
||||
|
||||
|
||||
# 职位阶段数据报表
|
||||
@router.post("/every_stage_form")
|
||||
async def owner_form(
|
||||
async def every_stage_form(
|
||||
request: Request,
|
||||
interview: InterviewDo = Depends(InterviewDo),
|
||||
ck_db: CKDrive = Depends(get_ck_db),
|
||||
@ -265,9 +291,122 @@ async def owner_form(
|
||||
return schemas.Msg(code=200, msg='ok', data=res_msg)
|
||||
|
||||
|
||||
# hr工作量报表
|
||||
@router.post("/hr_works_form")
|
||||
async def hr_works_form(
|
||||
request: Request,
|
||||
interview: InterviewDo = Depends(InterviewDo),
|
||||
ck_db: CKDrive = Depends(get_ck_db),
|
||||
db: AsyncIOMotorDatabase = Depends(get_database)
|
||||
) -> schemas.Msg:
|
||||
""" hr工作量报表 """
|
||||
await interview.init()
|
||||
res = interview.get_hr_works_form_sql()
|
||||
sql = res['sql']
|
||||
data = await ck_db.execute(sql)
|
||||
res_msg = {}
|
||||
job_name_sector = {}
|
||||
hr_names = [] # 查询面试数据
|
||||
job_ids = []
|
||||
for ck_data in data.values():
|
||||
ck_job_id = ck_data['job_id']
|
||||
hr_name = ck_data['hr_name']
|
||||
|
||||
if hr_name not in hr_names:
|
||||
hr_names.append(hr_name)
|
||||
|
||||
job_data = await crud.jobs.find_job_name(db, ck_job_id)
|
||||
job_name = job_data['job_name'] # 职位
|
||||
job_sector = job_data['job_sector'] # 部门
|
||||
job_name_sector.update({
|
||||
job_name: job_sector
|
||||
})
|
||||
|
||||
# 未录入职位
|
||||
if ck_job_id not in job_ids:
|
||||
job_ids.append(ck_job_id)
|
||||
res_msg[job_name] = {hr_name: {
|
||||
'初筛': 0,
|
||||
'复筛': 0,
|
||||
'面试': 0,
|
||||
'创建面试': 0,
|
||||
'面试签到': 0,
|
||||
'offer': 0,
|
||||
'待入职': 0,
|
||||
'已入职': 0
|
||||
}}
|
||||
# 已录入职位
|
||||
else:
|
||||
if hr_name not in res_msg[job_name]:
|
||||
res_msg[job_name][hr_name] = {
|
||||
'初筛': 0,
|
||||
'复筛': 0,
|
||||
'面试': 0,
|
||||
'创建面试': 0,
|
||||
'面试签到': 0,
|
||||
'offer': 0,
|
||||
'待入职': 0,
|
||||
'已入职': 0
|
||||
}
|
||||
|
||||
stage = ck_data['interview_stage']
|
||||
if stage >= 1:
|
||||
res_msg[job_name][hr_name]['初筛'] += 1
|
||||
if stage >= 2:
|
||||
res_msg[job_name][hr_name]['复筛'] += 1
|
||||
if stage >= 3:
|
||||
res_msg[job_name][hr_name]['面试'] += 1
|
||||
if stage >= 4:
|
||||
res_msg[job_name][hr_name]['offer'] += 1
|
||||
if stage >= 5:
|
||||
res_msg[job_name][hr_name]['待入职'] += 1
|
||||
if stage >= 7:
|
||||
res_msg[job_name][hr_name]['已入职'] += 1
|
||||
interview_records = await crud.interview_record.find_job_some(db, hr_names)
|
||||
for record in interview_records:
|
||||
record_job_name = record['job_names']
|
||||
record_hr_name = record['hr_name']
|
||||
record_interview_sign = record['interview_sign']
|
||||
if record_job_name in res_msg:
|
||||
if record_hr_name not in res_msg[record_job_name]:
|
||||
res_msg[record_job_name][record_hr_name] = {
|
||||
'初筛': 0,
|
||||
'复筛': 0,
|
||||
'面试': 0,
|
||||
'创建面试': 0,
|
||||
'面试签到': 0,
|
||||
'offer': 0,
|
||||
'待入职': 0,
|
||||
'已入职': 0
|
||||
}
|
||||
res_msg[record_job_name][record_hr_name]['创建面试'] += 1
|
||||
if record_interview_sign:
|
||||
res_msg[record_job_name][record_hr_name]['面试签到'] += 1
|
||||
for job_name1, msg_data in res_msg.items():
|
||||
count_data = {
|
||||
'初筛': 0,
|
||||
'复筛': 0,
|
||||
'面试': 0,
|
||||
'创建面试': 0,
|
||||
'面试签到': 0,
|
||||
'offer': 0,
|
||||
'待入职': 0,
|
||||
'已入职': 0
|
||||
}
|
||||
for key, value_data in msg_data.items():
|
||||
for true_key, num in value_data.items():
|
||||
count_data[true_key] += num
|
||||
res_msg[job_name1].update({'总计': count_data})
|
||||
res_data = {
|
||||
'msg': res_msg,
|
||||
'job_sector': job_name_sector
|
||||
}
|
||||
return schemas.Msg(code=200, msg='ok', data=res_data)
|
||||
|
||||
|
||||
# 职位阶段通过率报表
|
||||
@router.post("/stage_success_form")
|
||||
async def owner_form(
|
||||
async def stage_success_form(
|
||||
request: Request,
|
||||
interview: InterviewDo = Depends(InterviewDo),
|
||||
ck_db: CKDrive = Depends(get_ck_db),
|
||||
@ -354,6 +493,44 @@ async def owner_form(
|
||||
return schemas.Msg(code=200, msg='ok', data=res_msg)
|
||||
|
||||
|
||||
# 招聘漏斗报表
|
||||
@router.post("/interview_funnel_form")
|
||||
async def interview_funnel_form(
|
||||
request: Request,
|
||||
interview: InterviewDo = Depends(InterviewDo),
|
||||
ck_db: CKDrive = Depends(get_ck_db)
|
||||
) -> schemas.Msg:
|
||||
""" 招聘漏斗报表 """
|
||||
await interview.init()
|
||||
res = interview.get_hr_works_form_sql()
|
||||
sql = res['sql']
|
||||
data = await ck_db.execute(sql)
|
||||
res_msg = {
|
||||
'初筛': 0,
|
||||
'复筛': 0,
|
||||
'面试': 0,
|
||||
'offer': 0,
|
||||
'待入职': 0,
|
||||
'已入职': 0
|
||||
}
|
||||
for i_data in data.values():
|
||||
stage = i_data['interview_stage']
|
||||
if stage >= 1:
|
||||
res_msg['初筛'] += 1
|
||||
if stage >= 2:
|
||||
res_msg['复筛'] += 1
|
||||
if stage >= 3:
|
||||
res_msg['面试'] += 1
|
||||
if stage >= 4:
|
||||
res_msg['offer'] += 1
|
||||
if stage >= 5:
|
||||
res_msg['待入职'] += 1
|
||||
if stage >= 7:
|
||||
res_msg['已入职'] += 1
|
||||
|
||||
return schemas.Msg(code=200, msg='ok', data=res_msg)
|
||||
|
||||
|
||||
# 渠道质量报表
|
||||
@router.post("/owner_form")
|
||||
async def owner_form(
|
||||
@ -419,3 +596,4 @@ async def owner_form(
|
||||
res_msg[key]['work_chance'] = work_chance
|
||||
|
||||
return schemas.Msg(code=200, msg='ok', data=res_msg)
|
||||
|
||||
|
@ -5,11 +5,16 @@ from crud.base import CRUDBase
|
||||
__all__ = 'interview_record',
|
||||
|
||||
|
||||
class CRUDJobs(CRUDBase):
|
||||
class CRUDInterview(CRUDBase):
|
||||
# 获取所有面试数据
|
||||
async def all_field(self, db: AsyncIOMotorDatabase):
|
||||
return await self.find_many(db, {}, {'_id': 0})
|
||||
|
||||
# 获取对应job_id的名字,以及部门, 招聘数量
|
||||
async def find_job_some(self, db: AsyncIOMotorDatabase, hr_names):
|
||||
|
||||
return await self.find_many(db, {'hr_name': {"$in": hr_names}},
|
||||
{'_id': 0, 'job_names': 1, 'hr_name': 1, 'interview_sign': 1, 'job_id': 1})
|
||||
# 获取所有对应条件面试数据
|
||||
# async def all_fields(self, db: AsyncIOMotorDatabase, data_in: schemas.Jobs):
|
||||
# if data_in == None:
|
||||
@ -36,4 +41,4 @@ class CRUDJobs(CRUDBase):
|
||||
await self.insert_one(db, data_in.dict())
|
||||
|
||||
|
||||
interview_record = CRUDJobs('interview_record')
|
||||
interview_record = CRUDInterview('interview_record')
|
||||
|
@ -38,13 +38,21 @@ class CRUDJobs(CRUDBase):
|
||||
|
||||
# 插入一条新的职位数据
|
||||
async def insert_job(self, db: AsyncIOMotorDatabase, data_in: schemas.Ins_Job):
|
||||
|
||||
await self.insert_one(db, data_in.dict())
|
||||
|
||||
# 获取对应jobid的信息
|
||||
async def find_job(self, db: AsyncIOMotorDatabase, job_id):
|
||||
|
||||
return await self.find_one(db, {'job_id': job_id})
|
||||
|
||||
# 获取对应job_id的部门和名称
|
||||
async def find_job_name(self, db: AsyncIOMotorDatabase, job_id):
|
||||
return await self.find_one(db, {'job_id': job_id}, {'_id': 0, 'job_name': 1, 'job_sector': 1})
|
||||
|
||||
# 获取对应job_id的名字,以及部门, 招聘数量
|
||||
async def find_job_some(self, db: AsyncIOMotorDatabase, job_ids):
|
||||
return await self.find_many(db, {'job_id': {"$in": job_ids}},
|
||||
{'_id': 0, 'job_name': 1, 'job_sector': 1, 'job_num': 1, 'job_id': 1,
|
||||
'principal': 1})
|
||||
|
||||
|
||||
jobs = CRUDJobs('jobs')
|
||||
|
@ -412,9 +412,9 @@ class InterviewDo:
|
||||
end_time = self.where.get('end_time', '')
|
||||
sql = f"select {findStr} from HR.resumes where {whereStr}"
|
||||
if start_time:
|
||||
sql += f" and toDate(event_time) >= `{start_time}`"
|
||||
sql += f" and toDate(event_time) >= {start_time}"
|
||||
if end_time:
|
||||
sql += f" and toDate(event_time) <= `{end_time}`"
|
||||
sql += f" and toDate(event_time) <= {end_time}"
|
||||
# 没有日期条件
|
||||
else:
|
||||
sql = f"select {findStr} from HR.resumes where {whereStr}"
|
||||
@ -424,6 +424,51 @@ class InterviewDo:
|
||||
'sql': sql
|
||||
}
|
||||
|
||||
# 分组报表候选人明细查询
|
||||
def get_man_info_form_sql(self):
|
||||
whereStr = ''
|
||||
findStr = ''
|
||||
# 查询字段
|
||||
self.find_column = ["uid", "age", "gender", "name", "education", "school", "work_exp", "job_name", "account",
|
||||
"work_list", "graduate_time", "phone"]
|
||||
for fstr in self.find_column:
|
||||
findStr += fstr + ', '
|
||||
is_date = 0
|
||||
for key, value in self.where.items():
|
||||
if key in ['start_time', 'end_time']:
|
||||
is_date = 1
|
||||
continue
|
||||
if isinstance(value, str):
|
||||
whereStr += str(key) + ' = ' + "'" + value + "'" + ' '
|
||||
continue
|
||||
whereStr += str(key) + ' = ' + str(value) + ' '
|
||||
whereStr = whereStr.strip()
|
||||
findStr = findStr.strip().strip(',')
|
||||
|
||||
# 有日期条件
|
||||
if is_date:
|
||||
start_time = self.where.get('start_time', '')
|
||||
end_time = self.where.get('end_time', '')
|
||||
if whereStr:
|
||||
sql = f"select {findStr} from HR.resumes where {whereStr}"
|
||||
else:
|
||||
sql = f"select {findStr} from HR.resumes"
|
||||
if start_time:
|
||||
sql += f" and toDate(event_time) >= {start_time}"
|
||||
if end_time:
|
||||
sql += f" and toDate(event_time) <= {end_time}"
|
||||
# 没有日期条件
|
||||
else:
|
||||
if whereStr:
|
||||
sql = f"select {findStr} from HR.resumes where {whereStr}"
|
||||
else:
|
||||
sql = f"select {findStr} from HR.resumes"
|
||||
|
||||
print(sql)
|
||||
return {
|
||||
'sql': sql
|
||||
}
|
||||
|
||||
# 渠道质量sql
|
||||
def get_owner_form_sql(self):
|
||||
findStr = ''
|
||||
@ -454,9 +499,9 @@ class InterviewDo:
|
||||
else:
|
||||
sql = f"select {findStr} from HR.resumes where '1'"
|
||||
if start_time:
|
||||
sql += f" and toDate(event_time) >= `{start_time}`"
|
||||
sql += f" and toDate(event_time) >= {start_time}"
|
||||
if end_time:
|
||||
sql += f" and toDate(event_time) <= `{end_time}`"
|
||||
sql += f" and toDate(event_time) <= {end_time}"
|
||||
# 没有日期条件
|
||||
else:
|
||||
if whereStr:
|
||||
@ -468,7 +513,7 @@ class InterviewDo:
|
||||
'sql': sql
|
||||
}
|
||||
|
||||
# 渠道质量sql
|
||||
# 阶段数据sql
|
||||
def get_every_stage_form_sql(self, job_ids):
|
||||
findStr = ''
|
||||
whereStr = ''
|
||||
@ -498,9 +543,9 @@ class InterviewDo:
|
||||
else:
|
||||
sql = f"select {findStr} from HR.resumes where job_id in {job_ids}"
|
||||
if start_time:
|
||||
sql += f" and toDate(event_time) >= `{start_time}`"
|
||||
sql += f" and toDate(event_time) >= {start_time}"
|
||||
if end_time:
|
||||
sql += f" and toDate(event_time) <= `{end_time}`"
|
||||
sql += f" and toDate(event_time) <= {end_time}"
|
||||
# 没有日期条件
|
||||
else:
|
||||
if whereStr:
|
||||
@ -512,6 +557,50 @@ class InterviewDo:
|
||||
'sql': sql
|
||||
}
|
||||
|
||||
# hr工作量sql
|
||||
def get_hr_works_form_sql(self):
|
||||
findStr = ''
|
||||
whereStr = ''
|
||||
# 查询字段
|
||||
self.find_column = ["name", "interview_stage", "job_id", 'hr_name']
|
||||
for fstr in self.find_column:
|
||||
findStr += fstr + ', '
|
||||
is_date = 0
|
||||
if self.where:
|
||||
for key, value in self.where.items():
|
||||
if key in ['start_time', 'end_time']:
|
||||
is_date = 1
|
||||
continue
|
||||
if isinstance(value, str):
|
||||
whereStr += str(key) + ' = ' + "'" + value + "'" + ' '
|
||||
continue
|
||||
whereStr += str(key) + ' = ' + str(value) + ' '
|
||||
whereStr = whereStr.strip()
|
||||
findStr = findStr.strip().strip(',')
|
||||
|
||||
# 有日期条件
|
||||
if is_date:
|
||||
start_time = self.where.get('start_time', '')
|
||||
end_time = self.where.get('end_time', '')
|
||||
if whereStr:
|
||||
sql = f"select {findStr} from HR.resumes where {whereStr}"
|
||||
else:
|
||||
sql = f"select {findStr} from HR.resumes"
|
||||
if start_time:
|
||||
sql += f" and toDate(event_time) >= {start_time}"
|
||||
if end_time:
|
||||
sql += f" and toDate(event_time) <= {end_time}"
|
||||
# 没有日期条件
|
||||
else:
|
||||
if whereStr:
|
||||
sql = f"select {findStr} from HR.resumes where {whereStr}"
|
||||
else:
|
||||
sql = f"select {findStr} from HR.resumes"
|
||||
print(sql)
|
||||
return {
|
||||
'sql': sql
|
||||
}
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
find = re.search(r"\d+\.?\d*", "18岁")
|
||||
|
68
接口文档/hr工作量模板接口文档.txt
Normal file
68
接口文档/hr工作量模板接口文档.txt
Normal file
@ -0,0 +1,68 @@
|
||||
路由: /api/v1/forms/hr_works_form
|
||||
|
||||
参数:
|
||||
{
|
||||
"data_in": "", # 参数可都为空
|
||||
"interview_query": {},
|
||||
"find_column": [
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
返回值:
|
||||
{
|
||||
"code": 200,
|
||||
"msg": "ok",
|
||||
"data": {
|
||||
"msg": {
|
||||
"python开发": { # 职位下面的hr对应的数据{'吴操':{}, '李伟':{},...}
|
||||
"吴操": {
|
||||
"初筛": 1,
|
||||
"复筛": 1,
|
||||
"面试": 1,
|
||||
"创建面试": 2,
|
||||
"面试签到": 1,
|
||||
"offer": 1,
|
||||
"待入职": 1,
|
||||
"已入职": 1
|
||||
},
|
||||
"总计": { # 这个职位的数据合计
|
||||
"初筛": 1,
|
||||
"复筛": 1,
|
||||
"面试": 1,
|
||||
"创建面试": 2,
|
||||
"面试签到": 1,
|
||||
"offer": 1,
|
||||
"待入职": 1,
|
||||
"已入职": 1
|
||||
}
|
||||
},
|
||||
"高级游戏测试工程师": {
|
||||
"吴操": {
|
||||
"初筛": 1,
|
||||
"复筛": 1,
|
||||
"面试": 1,
|
||||
"创建面试": 0,
|
||||
"面试签到": 0,
|
||||
"offer": 1,
|
||||
"待入职": 1,
|
||||
"已入职": 0
|
||||
},
|
||||
"总计": {
|
||||
"初筛": 1,
|
||||
"复筛": 1,
|
||||
"面试": 1,
|
||||
"创建面试": 0,
|
||||
"面试签到": 0,
|
||||
"offer": 1,
|
||||
"待入职": 1,
|
||||
"已入职": 0
|
||||
}
|
||||
}
|
||||
},
|
||||
"job_sector": { # 职位对应部门
|
||||
"python开发": "平台部",
|
||||
"高级游戏测试工程师": "研发部"
|
||||
}
|
||||
}
|
||||
}
|
50
接口文档/候选人明细模板接口文档.txt
Normal file
50
接口文档/候选人明细模板接口文档.txt
Normal file
@ -0,0 +1,50 @@
|
||||
路由: /api/v1/forms/man_info_form
|
||||
|
||||
参数:
|
||||
{
|
||||
"data_in": "", # 参数可都为空
|
||||
"interview_query": {},
|
||||
"find_column": [
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
返回值:
|
||||
{
|
||||
"code": 200,
|
||||
"msg": "ok",
|
||||
"data": {
|
||||
"0": {
|
||||
"uid": "3ae63e44e24a38",
|
||||
"age": 29, # 年龄
|
||||
"gender": "男", # 性别
|
||||
"name": "陈亚雄", # 姓名
|
||||
"education": 2, # 学历 1-5 大专,本科,研究生,博士,硕士
|
||||
"school": "武汉纺织大学", # 毕业学校
|
||||
"work_exp": 6, # 工作经验
|
||||
"job_name": "Android软件工程师", # 应聘职位
|
||||
"account": "", # 所在地
|
||||
"work_list": [
|
||||
"{'name': '中软国际科技服务有限公司', 'time': '2016.08-2017.6'}"
|
||||
],
|
||||
"graduate_time": "", # 毕业时间
|
||||
"phone": "15902799433", # 电话
|
||||
"work_for": "中软国际科技服务有限公司" # 最近公司
|
||||
},
|
||||
"1": {
|
||||
"uid": "3ae3f4d54e03ca",
|
||||
"age": 20,
|
||||
"gender": "男",
|
||||
"name": "陈超峰",
|
||||
"education": 2,
|
||||
"school": "中南民族大学",
|
||||
"work_exp": 0,
|
||||
"job_name": "android开发工程师",
|
||||
"account": "湖北黄冈",
|
||||
"work_list": [],
|
||||
"graduate_time": "",
|
||||
"phone": "15827578935",
|
||||
"work_for": ""
|
||||
}
|
||||
}
|
||||
}
|
24
接口文档/招聘漏斗模板接口文档.txt
Normal file
24
接口文档/招聘漏斗模板接口文档.txt
Normal file
@ -0,0 +1,24 @@
|
||||
路由: /api/v1/forms/interview_funnel_form
|
||||
|
||||
参数:
|
||||
{
|
||||
"data_in": "", # 参数可都为空
|
||||
"interview_query": {},
|
||||
"find_column": [
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
返回值:
|
||||
{
|
||||
"code": 200,
|
||||
"msg": "ok",
|
||||
"data": { # 漏斗数据
|
||||
"初筛": 2,
|
||||
"复筛": 2,
|
||||
"面试": 2,
|
||||
"offer": 2,
|
||||
"待入职": 2,
|
||||
"已入职": 1
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user