年度趋势

This commit is contained in:
Àî×ÚÕñ 2022-07-26 19:17:55 +08:00
parent 2b5ec1c32d
commit 75b1fecb53
4 changed files with 287 additions and 1 deletions

View File

@ -8,7 +8,7 @@ from motor.motor_asyncio import AsyncIOMotorDatabase
from utils.dingding import get_redis_alluid, send_dates
from utils.jianli import get_resume
from utils.func import get_every_days
from utils.func import get_every_days, get_every_months
import crud, schemas
from datetime import datetime
from core.configuration import *
@ -724,3 +724,65 @@ async def interview_trend_form(
res_msg[chk_date]['创建面试的申请数'] += 1 * count_num
return schemas.Msg(code=200, msg='ok', data=res_msg)
# 年度招聘趋势报表
@router.post("/year_trend_form")
async def year_trend_form(
request: Request,
interview: InterviewDo = Depends(InterviewDo),
ck_db: CKDrive = Depends(get_ck_db)
) -> schemas.Msg:
""" 招聘趋势分析报表 """
await interview.init()
res = interview.get_year_form_sql()
sql = res['sql']
data = await ck_db.execute(sql)
if not data:
return schemas.Msg(code=-9, msg='无数据', data=None)
sdate = res['sdate']
edate = res['edate']
months = get_every_months(sdate, edate)
res_msg = {}
for i in months:
res_msg[str(i)] = {
'简历推荐数': 0,
'有效简历数': 0,
'到场面试数': 0,
'面试通过': 0,
'offer发出数': 0,
'入职人数': 0,
'转正人数': 0,
'离职人数': 0,
'主动离职': 0,
'被动离职': 0
}
for chk_data in data.values():
chk_date = datetime.strftime(chk_data['date'], '%Y-%m')
if chk_date not in res_msg:
continue
chk_stage = chk_data['interview_stage']
count_num = chk_data['value']
if chk_stage >= 1:
res_msg[chk_date]['简历推荐数'] += 1 * count_num
if chk_stage >= 2:
res_msg[chk_date]['有效简历数'] += 1 * count_num
if chk_stage >= 3:
res_msg[chk_date]['到场面试数'] += 1 * count_num
if chk_stage >= 4:
res_msg[chk_date]['面试通过'] += 1 * count_num
if chk_stage >= 5:
res_msg[chk_date]['offer发出数'] += 1 * count_num
if chk_stage >= 7:
res_msg[chk_date]['入职人数'] += 1 * count_num
if chk_stage >= 8:
res_msg[chk_date]['转正人数'] += 1 * count_num
if chk_stage >= 9:
res_msg[chk_date]['离职人数'] += 1 * count_num
res_msg[chk_date]['主动离职'] += 1 * count_num
if chk_stage >= 10:
res_msg[chk_date]['离职人数'] += 1 * count_num
res_msg[chk_date]['被动离职'] += 1 * count_num
return schemas.Msg(code=200, msg='ok', data=res_msg)

View File

@ -677,6 +677,52 @@ class InterviewDo:
'sql': sql
}
# 年度招聘数据sql
def get_year_form_sql(self):
whereStr = ''
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()
# 有日期条件
start_time = self.where.get('start_time', '')
end_time = self.where.get('end_time', '')
if is_date:
if whereStr:
sql = f"select toStartOfMonth(addHours(`event_time`, 0)) as date,interview_stage, count() as value from HR.resumes where {whereStr}"
else:
sql = f"select toStartOfMonth(addHours(`event_time`, 0)) as date,interview_stage, count() as value from HR.resumes"
if start_time or end_time:
sql += f" where"
if start_time:
if whereStr:
sql += f" and date >= '{start_time}'"
else:
sql += f" date >= '{start_time}'"
if end_time:
sql += f" and date <= '{end_time}'"
# 没有日期条件
else:
if whereStr:
sql = f"select toStartOfMonth(addHours(`event_time`, 0)) as date,interview_stage, count() as value from HR.resumes where {whereStr}"
else:
sql = f"select toStartOfMonth(addHours(`event_time`, 0)) as date,interview_stage, count() as value from HR.resumes"
sql += f" group by date, interview_stage"
print(sql)
return {
'sql': sql,
'sdate': start_time,
'edate': end_time,
}
if __name__ == '__main__':
col = 'max_interview_stage'

View File

@ -294,3 +294,18 @@ def get_every_days(sdate, edate):
true_day = datetime.datetime.strftime(day, '%Y-%m-%d')
days.append(true_day)
return days
# 获取两个日期之间的所有月份
def get_every_months(sdate, edate):
start_date = datetime.datetime.strptime(sdate, '%Y-%m-%d')
end_date = datetime.datetime.strptime(edate, '%Y-%m-%d')
months = (start_date.year - end_date.year) * 12 + end_date.month - start_date.month
month_range = ['%04d-%02d' % (int(start_date.year + mon // 12), int(mon % 12 + 1))
for mon in range(start_date.month - 1, start_date.month + months)]
return month_range
if __name__ == '__main__':
get_every_months('2022-01-01', '2022-12-31')

View File

@ -0,0 +1,163 @@
路由: /api/v1/forms/year_trend_form
参数:
{
"data_in": "string", # 为空""
"interview_query": {"start_time":"2022-01-01", "end_time":"2022-12-31"}, # 时间区间 样式 年-月-日 字符串
"find_column": [
"string" # 为空 []
]
}
返回值:
{
"code": 200,
"msg": "ok",
"data": {
"2022-01": { # 月份对应的数据
"简历推荐数": 0,
"有效简历数": 0,
"到场面试数": 0,
"面试通过": 0,
"offer发出数": 0,
"入职人数": 0,
"转正人数": 0,
"离职人数": 0,
"主动离职": 0,
"被动离职": 0
},
"2022-02": {
"简历推荐数": 0,
"有效简历数": 0,
"到场面试数": 0,
"面试通过": 0,
"offer发出数": 0,
"入职人数": 0,
"转正人数": 0,
"离职人数": 0,
"主动离职": 0,
"被动离职": 0
},
"2022-03": {
"简历推荐数": 0,
"有效简历数": 0,
"到场面试数": 0,
"面试通过": 0,
"offer发出数": 0,
"入职人数": 0,
"转正人数": 0,
"离职人数": 0,
"主动离职": 0,
"被动离职": 0
},
"2022-04": {
"简历推荐数": 0,
"有效简历数": 0,
"到场面试数": 0,
"面试通过": 0,
"offer发出数": 0,
"入职人数": 0,
"转正人数": 0,
"离职人数": 0,
"主动离职": 0,
"被动离职": 0
},
"2022-05": {
"简历推荐数": 0,
"有效简历数": 0,
"到场面试数": 0,
"面试通过": 0,
"offer发出数": 0,
"入职人数": 0,
"转正人数": 0,
"离职人数": 0,
"主动离职": 0,
"被动离职": 0
},
"2022-06": {
"简历推荐数": 0,
"有效简历数": 0,
"到场面试数": 0,
"面试通过": 0,
"offer发出数": 0,
"入职人数": 0,
"转正人数": 0,
"离职人数": 0,
"主动离职": 0,
"被动离职": 0
},
"2022-07": {
"简历推荐数": 23,
"有效简历数": 23,
"到场面试数": 23,
"面试通过": 23,
"offer发出数": 23,
"入职人数": 0,
"转正人数": 0,
"离职人数": 0,
"主动离职": 0,
"被动离职": 0
},
"2022-08": {
"简历推荐数": 0,
"有效简历数": 0,
"到场面试数": 0,
"面试通过": 0,
"offer发出数": 0,
"入职人数": 0,
"转正人数": 0,
"离职人数": 0,
"主动离职": 0,
"被动离职": 0
},
"2022-09": {
"简历推荐数": 0,
"有效简历数": 0,
"到场面试数": 0,
"面试通过": 0,
"offer发出数": 0,
"入职人数": 0,
"转正人数": 0,
"离职人数": 0,
"主动离职": 0,
"被动离职": 0
},
"2022-10": {
"简历推荐数": 0,
"有效简历数": 0,
"到场面试数": 0,
"面试通过": 0,
"offer发出数": 0,
"入职人数": 0,
"转正人数": 0,
"离职人数": 0,
"主动离职": 0,
"被动离职": 0
},
"2022-11": {
"简历推荐数": 0,
"有效简历数": 0,
"到场面试数": 0,
"面试通过": 0,
"offer发出数": 0,
"入职人数": 0,
"转正人数": 0,
"离职人数": 0,
"主动离职": 0,
"被动离职": 0
},
"2022-12": {
"简历推荐数": 0,
"有效简历数": 0,
"到场面试数": 0,
"面试通过": 0,
"offer发出数": 0,
"入职人数": 0,
"转正人数": 0,
"离职人数": 0,
"主动离职": 0,
"被动离职": 0
}
}
}