From ebc686d80df3b0f13204bf66ed08cba5adf606a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=80=C3=AE=C3=97=C3=9A=C3=95=C3=B1?= Date: Wed, 14 Sep 2022 18:04:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=A5=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/api_v1/endpoints/forms.py | 285 ++++++++++++++++++++++++---------- 1 file changed, 202 insertions(+), 83 deletions(-) diff --git a/api/api_v1/endpoints/forms.py b/api/api_v1/endpoints/forms.py index f8485c7..7ad8936 100644 --- a/api/api_v1/endpoints/forms.py +++ b/api/api_v1/endpoints/forms.py @@ -782,12 +782,12 @@ async def man_info_form( "phone": "电话", "work_for": "上家公司" } - res_data = { + res_true_data = { 'data': res_data, 'level_list': level_list } res_msg = { - 'data': res_data, + 'data': res_true_data, 'table_data': table_data } return schemas.Msg(code=200, msg='ok', data=res_msg) @@ -814,13 +814,14 @@ async def every_stage_form( job_id_to_name[job_id] = job_name res_job_data = deepcopy({k: v for k, v in job_data.items() if k != 'job_id'}) res_job_data.update({ - '初筛': 0, - '复筛': 0, - '面试': 0, - 'offer': 0, - '待入职': 0, - '已入职': job_data['now_job_num'], + 'start_num': 0, + 'screen_num': 0, + 'exam_num': 0, + 'offer_num': 0, + 'wait_work_num': 0, + 'work_in_num': job_data['now_job_num'], }) + res_job_data['principal'] = res_job_data['principal'][0]['name'] res_msg[job_name] = res_job_data await interview.init() @@ -844,21 +845,42 @@ async def every_stage_form( ck_job_name = job_id_to_name[ck_data['job_id']] stage = ck_data['interview_stage'] if stage == 1: - res_msg[ck_job_name]['初筛'] += 1 + res_msg[ck_job_name]['start_num'] += 1 elif stage == 2: - res_msg[ck_job_name]['复筛'] += 1 + res_msg[ck_job_name]['screen_num'] += 1 elif stage == 3: - res_msg[ck_job_name]['面试'] += 1 + res_msg[ck_job_name]['exam_num'] += 1 elif stage == 4: - res_msg[ck_job_name]['offer'] += 1 + res_msg[ck_job_name]['offer_num'] += 1 elif stage == 5: - res_msg[ck_job_name]['待入职'] += 1 + res_msg[ck_job_name]['wait_work_num'] += 1 - res_data = { - 'data': res_msg, + res_data = [] + for k, v in res_msg.items(): + res_value = deepcopy(v) + res_data.append(res_value) + level_list = { + "job_name": "职位", + "job_sector": "部门", + "principal": "负责人", + "start_time": "招聘开始时间", + "job_num": "招聘人数", + "start_num": "初筛", + "screen_num": "复筛", + "exam_num": "面试", + "offer_num": "offer", + "wait_work_num": "待入职", + "work_in_num": "已入职" + } + res_true_data = { + 'data': res_data, + 'level_list': level_list + } + res_back_data = { + 'data': res_true_data, 'table_data': table_data } - return schemas.Msg(code=200, msg='ok', data=res_data) + return schemas.Msg(code=200, msg='ok', data=res_back_data) # hr工作量报表 @@ -1021,13 +1043,14 @@ async def stage_success_form( job_id_to_name[job_id] = job_name res_job_data = deepcopy({k: v for k, v in job_data.items() if k not in ['job_id', 'now_job_num']}) res_job_data.update({ - '初筛': 0, - '复筛': 0, - '面试': 0, - 'offer': 0, - '待入职': 0, - '已入职': 0 + 'start_num': 0, + 'screen_num': 0, + 'exam_num': 0, + 'offer_num': 0, + 'wait_work_num': 0, + 'work_in_num': 0 }) + res_job_data['principal'] = res_job_data['principal'][0]['name'] res_msg[job_name] = res_job_data await interview.init() @@ -1051,25 +1074,25 @@ async def stage_success_form( ck_job_name = job_id_to_name[ck_data['job_id']] stage = ck_data['interview_stage'] if stage >= 1: - res_msg[ck_job_name]['初筛'] += 1 + res_msg[ck_job_name]['start_num'] += 1 if stage >= 2: - res_msg[ck_job_name]['复筛'] += 1 + res_msg[ck_job_name]['screen_num'] += 1 if stage >= 3: - res_msg[ck_job_name]['面试'] += 1 + res_msg[ck_job_name]['exam_num'] += 1 if stage >= 4: - res_msg[ck_job_name]['offer'] += 1 + res_msg[ck_job_name]['offer_num'] += 1 if stage >= 5: - res_msg[ck_job_name]['待入职'] += 1 + res_msg[ck_job_name]['wait_work_num'] += 1 if stage >= 7: - res_msg[ck_job_name]['已入职'] += 1 + res_msg[ck_job_name]['work_in_num'] += 1 for res_name, res_data in res_msg.items(): - chk_num1 = res_data['初筛'] - chk_num2 = res_data['复筛'] - chk_num3 = res_data['面试'] - chk_num4 = res_data['offer'] - chk_num5 = res_data['待入职'] - chk_num7 = res_data['已入职'] + chk_num1 = res_data['start_num'] + chk_num2 = res_data['screen_num'] + chk_num3 = res_data['exam_num'] + chk_num4 = res_data['offer_num'] + chk_num5 = res_data['wait_work_num'] + chk_num7 = res_data['work_in_num'] if chk_num1 and chk_num2: chance_1 = round(chk_num2 / chk_num1, 2) else: @@ -1091,17 +1114,43 @@ async def stage_success_form( else: chance_5 = 0 res_msg[res_name].update({ - '初筛通过率': chance_1, - '复筛通过率': chance_2, - '面试通过率': chance_3, - 'offer通过率': chance_4, - '待入职通过率': chance_5 + 'chance_1': chance_1, + 'chance_2': chance_2, + 'chance_3': chance_3, + 'chance_4': chance_4, + 'chance_5': chance_5 }) - res_data = { - 'data': res_msg, - 'table_data': table_data, + res_data1 = [] + for k, v in res_msg.items(): + res_value = deepcopy(v) + res_data1.append(res_value) + level_list = { + "job_name": "职位", + "job_sector": "部门", + "principal": "负责人", + "start_time": "招聘开始时间", + "job_num": "招聘人数", + "start_num": "初筛", + "screen_num": "复筛", + "exam_num": "面试", + "offer_num": "offer", + "wait_work_num": "待入职", + "work_in_num": "已入职", + "chance_1": "初筛通过率", + "chance_2": "复筛通过率", + "chance_3": "面试通过率", + "chance_4": "offer通过率", + "chance_5": "待入职通过率" } - return schemas.Msg(code=200, msg='ok', data=res_data) + res_true_data = { + 'data': res_data1, + 'level_list': level_list + } + res_back_data = { + 'data': res_true_data, + 'table_data': table_data + } + return schemas.Msg(code=200, msg='ok', data=res_back_data) # 招聘漏斗报表 @@ -1237,11 +1286,28 @@ async def owner_form( res_msg[key]['work_num'] = work_num res_msg[key]['offer_chance'] = offer_chance res_msg[key]['work_chance'] = work_chance - res_data = { - 'data': res_msg, + res_data = [] + for k, v in res_msg.items(): + v.update({'owner_name': k}) + res_value = deepcopy(v) + res_data.append(res_value) + level_list = { + "owner_name": "渠道", + "count": "总数", + "offer_num": "面试通过", + "work_num": "入职人数", + "offer_chance": "面试通过率", + "work_chance": "入职率", + } + res_true_data = { + 'data': res_data, + 'level_list': level_list + } + res_back_data = { + 'data': res_true_data, 'table_data': table_data } - return schemas.Msg(code=200, msg='ok', data=res_data) + return schemas.Msg(code=200, msg='ok', data=res_back_data) # 渠道效果报表 @@ -1306,27 +1372,50 @@ async def owner_effect( for key, data_list in chk_data.items(): count_num = len(data_list) - star_num = len([1 for i in data_list if i['interview_stage'] >= 1]) # 初筛 + start_num = len([1 for i in data_list if i['interview_stage'] >= 1]) # 初筛 screen_num = len([1 for i in data_list if i['interview_stage'] >= 2]) # 复筛 exam_num = len([1 for i in data_list if i['interview_stage'] >= 3]) # 面试 offer_num = len([1 for i in data_list if i['interview_stage'] >= 4]) # offer work_num = len([1 for i in data_list if i['interview_stage'] >= 7]) # 入职 res_msg[key]['count'] = count_num - res_msg[key]['star_num'] = star_num + res_msg[key]['start_num'] = start_num res_msg[key]['screen_num'] = screen_num res_msg[key]['exam_num'] = exam_num res_msg[key]['offer_num'] = offer_num res_msg[key]['work_num'] = work_num res_msg[key]['year_money'] = 0 + res_msg[key]['one_money'] = 0 year = interview.where.get('start_time', '2022').split('-')[0] owner_info = await crud.owner_info.find_owner_some(db, where={'year': year}, findlist=['owner_name', 'year_money']) for i in owner_info: if i['owner_name'] in res_msg: res_msg[i['owner_name']]['year_money'] = i['year_money'] - + if res_msg[i['owner_name']]['count'] != 0: + res_msg[i['owner_name']]['one_money'] = res_msg[i['owner_name']]['year_money'] / res_msg[i['count']][ + 'one_money'] + res_data = [] + for k, v in res_msg.items(): + v.update({'owner_name': k}) + res_value = deepcopy(v) + res_data.append(res_value) + level_list = { + "owner_name": "渠道", + "count": "总数", + "start_num": "推荐简历", + "screen_num": "有效简历", + "exam_num": "到场面试数", + "offer_num": "面试通过", + "work_num": "入职人数", + "year_money": "成本", + "one_money": "人均成本", + } + res_true_msg = { + 'data': res_data, + 'level_list': level_list + } res_true_data = { - 'data': res_msg, + 'data': res_true_msg, 'table_data': table_data } return schemas.Msg(code=200, msg='ok', data=res_true_data) @@ -1415,16 +1504,16 @@ async def year_trend_form( res_msg = {} for i in months: res_msg[str(i)] = { - '简历推荐数': 0, - '有效简历数': 0, - '到场面试数': 0, - '面试通过': 0, - 'offer发出数': 0, - '入职人数': 0, - '转正人数': 0, - '离职人数': 0, - '主动离职': 0, - '被动离职': 0 + 'start_num': 0, + 'ok_num': 0, + 'exam_num': 0, + 'exam_pass_num': 0, + 'offer_num': 0, + 'work_num': 0, + 'work_ok_num': 0, + 'out_num': 0, + 'out_self_num': 0, + 'out_must_num': 0 } for chk_data in data.values(): @@ -1434,30 +1523,52 @@ async def year_trend_form( chk_stage = chk_data['interview_stage'] count_num = chk_data['value'] if chk_stage >= 1: - res_msg[chk_date]['简历推荐数'] += 1 * count_num + res_msg[chk_date]['start_num'] += 1 * count_num if chk_stage >= 2: - res_msg[chk_date]['有效简历数'] += 1 * count_num + res_msg[chk_date]['ok_num'] += 1 * count_num if chk_stage >= 3: - res_msg[chk_date]['到场面试数'] += 1 * count_num + res_msg[chk_date]['exam_num'] += 1 * count_num if chk_stage >= 4: - res_msg[chk_date]['面试通过'] += 1 * count_num + res_msg[chk_date]['exam_pass_num'] += 1 * count_num if chk_stage >= 5: - res_msg[chk_date]['offer发出数'] += 1 * count_num + res_msg[chk_date]['offer_num'] += 1 * count_num if chk_stage >= 7: - res_msg[chk_date]['入职人数'] += 1 * count_num + res_msg[chk_date]['work_num'] += 1 * count_num if chk_stage >= 8: - res_msg[chk_date]['转正人数'] += 1 * count_num + res_msg[chk_date]['work_ok_num'] += 1 * count_num if chk_stage == 9: - res_msg[chk_date]['离职人数'] += 1 * count_num - res_msg[chk_date]['主动离职'] += 1 * count_num + res_msg[chk_date]['out_num'] += 1 * count_num + res_msg[chk_date]['out_self_num'] += 1 * count_num if chk_stage == 10: - res_msg[chk_date]['离职人数'] += 1 * count_num - res_msg[chk_date]['被动离职'] += 1 * count_num - res_data = { - 'data': res_msg, + res_msg[chk_date]['out_num'] += 1 * count_num + res_msg[chk_date]['out_must_num'] += 1 * count_num + res_data = [] + for k, v in res_msg.items(): + v.update({'time': k}) + res_v = deepcopy(v) + res_data.append(res_v) + level_list = { + "time": "时间", + "start_num": "简历推荐数", + "ok_num": "有效简历数", + "exam_num": "到场面试数", + "exam_pass_num": "面试通过", + "offer_num": "offer发出数", + "work_num": "入职人数", + "work_ok_num": "转正人数", + "out_num": "离职人数", + "out_self_num": "主动离职", + "out_must_num": "被动离职" + } + res_true_data = { + 'data': res_data, + 'level_list': level_list + } + res_back_data = { + 'data': res_true_data, 'table_data': table_data } - return schemas.Msg(code=200, msg='ok', data=res_data) + return schemas.Msg(code=200, msg='ok', data=res_back_data) # 年度岗位招聘数据报表 @@ -1548,7 +1659,16 @@ async def year_job_form( else: res_data[k]['其他'] = {} res_data[k]['其他'].update({'其他': v1}) - + level_list = { + "time": "时间", + "start_num": "简历推荐数", + "ok_num": "有效简历数", + "exam_num": "到场面试数", + "exam_pass_num": "面试通过", + "offer_num": "offer发出数", + "work_num": "入职人数", + "out_num": "离职人数" + } res_true_data = { 'data': res_data, 'table_data': table_data @@ -1586,28 +1706,27 @@ async def year_in_out( edate = res['edate'] months = get_every_months(sdate, edate) res_msg = { - '入职': {}, - '离职': {} } for i in months: - res_msg['入职'][str(i)] = 0 - res_msg['离职'][str(i)] = 0 + res_msg[str(i)] = {} + res_msg[str(i)]['入职'] = 0 + res_msg[str(i)]['离职'] = 0 # 入职数据处理 for in_data in data_in.values(): in_date = datetime.strftime(in_data['date'], '%Y-%m') - if in_date not in res_msg['入职']: + if in_date not in res_msg: continue value = in_data['value'] - res_msg['入职'][in_date] += value + res_msg[in_date]['入职'] += value # 离职数据处理 for out_data in data_out.values(): out_date = datetime.strftime(out_data['date'], '%Y-%m') - if out_date not in res_msg['离职']: + if out_date not in res_msg: continue value = out_data['value'] - res_msg['离职'][out_date] += value + res_msg[out_date]['离职'] += value res_data = { 'data': res_msg, 'table_data': table_data