431 lines
16 KiB
Python
431 lines
16 KiB
Python
import re
|
||
from typing import Tuple
|
||
import datetime
|
||
import arrow
|
||
import sqlalchemy as sa
|
||
import json
|
||
|
||
from fastapi import Depends
|
||
|
||
import pandas as pd
|
||
import numpy as np
|
||
from utils.func import get_uid
|
||
from sqlalchemy import func, or_, and_, not_
|
||
from copy import deepcopy
|
||
import crud
|
||
import schemas
|
||
from dateutil import parser
|
||
from core.config import settings
|
||
from db import get_database
|
||
|
||
from db.redisdb import get_redis_pool, RedisDrive
|
||
from models.user_label import UserClusterDef
|
||
from utils import get_week, strptime, start_end_month, strptime1
|
||
|
||
|
||
# 面试数据ck增删改查
|
||
class InterviewDo:
|
||
def __init__(self, query_in: schemas.InterviewQuery):
|
||
self.query_in = query_in
|
||
self.find_column = set()
|
||
self.data_in = {}
|
||
self.where = {}
|
||
|
||
async def init(self, *args, **kwargs):
|
||
self.find_column = self.query_in.find_column
|
||
self.data_in = self.query_in.data_in
|
||
self.where = self.query_in.interview_query
|
||
|
||
def handler_filts(self, where):
|
||
"""
|
||
|
||
:param filters: (filts:list,relation:str)
|
||
:param g_f:
|
||
:param relation:
|
||
:return:
|
||
"""
|
||
|
||
filters = []
|
||
for col, value in where.items():
|
||
filters.append(col == value)
|
||
return filters
|
||
|
||
async def scatter_model_sql(self):
|
||
time = self.where.get('time', '')
|
||
start_time0 = self.where.get('start_time', '')
|
||
end_time0 = self.where.get('end_time', '')
|
||
global where
|
||
# 判断是分布分析里面的分组详情,改时间范围,其他情况都走else
|
||
if time != '':
|
||
timeParticleSize = self.where.get('timeParticleSize', 'P1M') # 筛选是按周,按月,合计等情况,用不同的时间
|
||
if timeParticleSize == 'P1W': # 按周
|
||
start_date, end_date = get_week(time)
|
||
if start_date < strptime(start_time0): # 开头的时间
|
||
where = [
|
||
func.addHours("event_time") >= start_time0,
|
||
func.addHours("event_time") <= end_date,
|
||
]
|
||
elif end_date < strptime(end_time0): # 中间的时间
|
||
where = [
|
||
func.addHours("event_time") >= start_date,
|
||
func.addHours("event_time") <= end_date, ]
|
||
else: # 结尾的时间
|
||
where = [
|
||
func.addHours("event_time") >= start_date,
|
||
func.addHours("event_time") <= end_time0, ]
|
||
elif timeParticleSize == 'P1M': # 按月
|
||
start_date, end_date = start_end_month(time)
|
||
if strptime(start_time0) > strptime1(time):
|
||
where = [
|
||
func.addHours("event_time") >= start_time0,
|
||
func.addHours("event_time") <= end_date,
|
||
]
|
||
else:
|
||
where = [
|
||
func.addHours("event_time") >= start_date,
|
||
func.addHours("event_time") <= end_time0,
|
||
]
|
||
else:
|
||
where = [
|
||
func.addHours("event_time") >= start_time0,
|
||
func.addHours("event_time") <= end_time0, ]
|
||
else:
|
||
where = [
|
||
func.addHours("event_time") >= start_time0,
|
||
func.addHours("event_time") <= end_time0,
|
||
]
|
||
|
||
filter = self.handler_filts(self.where)
|
||
where.extend(filter)
|
||
|
||
qry = sa.select(*self.find_column).where(and_(*where))
|
||
|
||
sql = str(qry.compile(compile_kwargs={"literal_binds": True}))
|
||
print(sql)
|
||
return {
|
||
'sql': sql
|
||
}
|
||
|
||
# 插入面试数据
|
||
def insert_interview_sql(self):
|
||
# 简历初始文档
|
||
data_mode = {
|
||
"interview_name": "吴操",
|
||
"interview_type": 1,
|
||
"interview_sign": 0,
|
||
"hope_money": "",
|
||
"feedback": 0,
|
||
"interview_round": 0,
|
||
"event_time": "",
|
||
"name": "",
|
||
"phone": "",
|
||
"job_name": "",
|
||
"hr_name": "吴操",
|
||
"work_exp": 0,
|
||
"interview_stage": 1,
|
||
"owner_name": 2,
|
||
"education": 1,
|
||
"work_undergo": [],
|
||
"project_undergo": [],
|
||
"work_list": [],
|
||
"school": "",
|
||
"at_school": "",
|
||
"specialty": "",
|
||
"specialty_do": [],
|
||
"mmended_state": 0,
|
||
"mail": "",
|
||
"account": "",
|
||
"id_card": "",
|
||
"gender": "",
|
||
"age": 0,
|
||
"gam": "",
|
||
"interview_state": 1,
|
||
"counts": 1,
|
||
"nation": "汉",
|
||
"review": [],
|
||
"upgrade": [],
|
||
"come_time": "",
|
||
"now_money": "",
|
||
"men_state": 1,
|
||
"teacher_state": 1,
|
||
"teacher_back": 1,
|
||
"offer_state": 1,
|
||
"offer_exam_state": 1,
|
||
"notice_state": 1,
|
||
"pass_why": 0,
|
||
"pass_text": [],
|
||
}
|
||
|
||
insert_data = []
|
||
res_data = []
|
||
if isinstance(self.data_in, dict):
|
||
insert_data = [self.data_in]
|
||
if isinstance(self.data_in, list):
|
||
insert_data = self.data_in
|
||
|
||
sql = f"insert into HR.resumes(interview_name, interview_type, interview_sign, hope_money, feedback," \
|
||
f" interview_round, event_time, uid, name, phone, job_name, hr_name, work_exp, interview_stage, owner_name," \
|
||
f" education, work_undergo, project_undergo, work_list, school, at_school, specialty, specialty_do, " \
|
||
f"mmended_state, mail, account, id_card, gender, age, gam, interview_state, counts, nation, come_time," \
|
||
f" review, upgrade, now_money, men_state, teacher_state, teacher_back, offer_state, offer_exam_state," \
|
||
f" notice_state, pass_why, pass_text) values"
|
||
now_time = datetime.datetime.now()
|
||
for data in insert_data:
|
||
s1 = data['event_time']
|
||
s2 = data['hope_money']
|
||
s3 = data['now_money']
|
||
if not s1:
|
||
data['event_time'] = now_time
|
||
else:
|
||
data['event_time'] = parser.parse(s1)
|
||
if s2 and isinstance(s2, int):
|
||
data['hope_money'] = str(s2)
|
||
if s3 and isinstance(s3, int):
|
||
data['now_money'] = str(s3)
|
||
data_true = deepcopy(data)
|
||
data_true['uid'] = get_uid()
|
||
education = data_true['education']
|
||
# 学历int转化
|
||
education_int = {
|
||
'大专': 1,
|
||
'本科': 2,
|
||
'研究生': 3,
|
||
'博士': 4,
|
||
'硕士': 5,
|
||
}
|
||
if education and isinstance(education, str):
|
||
data_true['education'] = education_int.get(education, 1)
|
||
age = data_true['age']
|
||
# 年龄int转化
|
||
if age and isinstance(age, str):
|
||
true_age = re.search(r"\d+\.?\d*", age)
|
||
if len(true_age.group()) > 2:
|
||
data_true['age'] = 20
|
||
else:
|
||
data_true['age'] = int(true_age.group())
|
||
work_exp = data_true['work_exp']
|
||
# 工作经验float转化
|
||
if not work_exp:
|
||
data_true['work_exp'] = 0
|
||
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_true['work_exp'] = 0.0
|
||
else:
|
||
data_true['work_exp'] = float(true_work_exp.group())
|
||
append_data = deepcopy(data_mode)
|
||
append_data.update(data_true)
|
||
res_data.append(append_data)
|
||
print(sql)
|
||
return {
|
||
'sql': sql,
|
||
'insert_data': res_data
|
||
}
|
||
|
||
# 更新面试数据sql
|
||
def update_interview_sql(self):
|
||
updateStr = ''
|
||
whereStr = ''
|
||
for key, value in self.data_in.items():
|
||
if isinstance(value, str):
|
||
updateStr += str(key) + ' = ' + "'" + value + "'" + ' '
|
||
continue
|
||
updateStr += str(key) + ' = ' + str(value) + ' '
|
||
for key, value in self.where.items():
|
||
if isinstance(value, str):
|
||
whereStr += str(key) + ' = ' + "'" + value + "'" + ' '
|
||
continue
|
||
whereStr += str(key) + ' = ' + str(value) + ' '
|
||
updateStr.strip()
|
||
whereStr.strip()
|
||
sql = f"alter table HR.resumes update {updateStr} where {whereStr}"
|
||
|
||
print(sql)
|
||
return {
|
||
'sql': sql,
|
||
}
|
||
|
||
def find_interview_sql(self):
|
||
whereStr = ''
|
||
findStr = ''
|
||
for fstr in self.find_column:
|
||
findStr += fstr + ', '
|
||
for key, value in self.where.items():
|
||
if isinstance(value, str):
|
||
whereStr += str(key) + ' = ' + "'" + value + "'" + ' '
|
||
continue
|
||
whereStr += str(key) + ' = ' + str(value) + ' '
|
||
whereStr = whereStr.strip()
|
||
findStr = findStr.strip().strip(',')
|
||
sql = f"select {findStr} from HR.resumes where {whereStr}"
|
||
# sql = f"select * from HR.resumes where {whereStr}"
|
||
print(sql)
|
||
return {
|
||
'sql': sql,
|
||
}
|
||
|
||
# 主页初筛查询
|
||
def find_interview_home_sql(self):
|
||
self.where.update({'interview_stage': 1})
|
||
whereStr = ''
|
||
findStr = ''
|
||
# 主页查询字段
|
||
self.find_column = ["uid", "age", "gender", "at_school", "name", "event_time", "owner_name", "education",
|
||
"school", "specialty", "interview_name", "mmended_state", "work_list", "work_exp",
|
||
"notice_state", "job_name", "interview_stage"]
|
||
for fstr in self.find_column:
|
||
findStr += fstr + ', '
|
||
for key, value in self.where.items():
|
||
if isinstance(value, str):
|
||
whereStr += str(key) + ' = ' + "'" + value + "'" + ' '
|
||
continue
|
||
whereStr += str(key) + ' = ' + str(value) + ' '
|
||
whereStr = whereStr.strip()
|
||
findStr = findStr.strip().strip(',')
|
||
sql = f"select {findStr} from HR.resumes where {whereStr}"
|
||
print(sql)
|
||
return {
|
||
'sql': sql,
|
||
}
|
||
|
||
# 复筛查询
|
||
def find_interview_screen_sql(self):
|
||
self.where.update({'interview_stage': 2})
|
||
whereStr = ''
|
||
findStr = ''
|
||
# 主页查询字段
|
||
self.find_column = ["uid", "age", "gender", "at_school", "name", "event_time", "owner_name", "education",
|
||
"school", "specialty", "interview_name", "mmended_state", "work_list", "work_exp",
|
||
"notice_state", "job_name", "interview_stage"]
|
||
for fstr in self.find_column:
|
||
findStr += fstr + ', '
|
||
for key, value in self.where.items():
|
||
if isinstance(value, str):
|
||
whereStr += str(key) + ' = ' + "'" + value + "'" + ' '
|
||
continue
|
||
whereStr += str(key) + ' = ' + str(value) + ' '
|
||
whereStr = whereStr.strip()
|
||
findStr = findStr.strip().strip(',')
|
||
sql = f"select {findStr} from HR.resumes where {whereStr}"
|
||
print(sql)
|
||
return {
|
||
'sql': sql,
|
||
}
|
||
|
||
# 面试阶段查询
|
||
def find_interview_exam_sql(self):
|
||
self.where.update({'interview_stage': 3})
|
||
whereStr = ''
|
||
findStr = ''
|
||
# 面试阶段查询字段
|
||
self.find_column = ["uid", "age", "gender", "at_school", "name", "event_time", "owner_name", "education",
|
||
"school", "specialty", "interview_name", "mmended_state", "work_list", "work_exp",
|
||
"job_name", "feedback", "interview_round", "interview_state", "interview_stage"]
|
||
for fstr in self.find_column:
|
||
findStr += fstr + ', '
|
||
for key, value in self.where.items():
|
||
if isinstance(value, str):
|
||
whereStr += str(key) + ' = ' + "'" + value + "'" + ' '
|
||
continue
|
||
whereStr += str(key) + ' = ' + str(value) + ' '
|
||
whereStr = whereStr.strip()
|
||
findStr = findStr.strip().strip(',')
|
||
sql = f"select {findStr} from HR.resumes where {whereStr}"
|
||
print(sql)
|
||
return {
|
||
'sql': sql,
|
||
}
|
||
|
||
# offer阶段查询
|
||
def find_interview_offer_sql(self):
|
||
self.where.update({'interview_stage': 4})
|
||
whereStr = ''
|
||
findStr = ''
|
||
# 面试阶段查询字段
|
||
self.find_column = ["uid", "age", "gender", "at_school", "name", "event_time", "owner_name", "education",
|
||
"school", "specialty", "interview_name", "mmended_state", "work_list", "work_exp",
|
||
"job_name", "feedback", "interview_round", "interview_state", "interview_stage"]
|
||
for fstr in self.find_column:
|
||
findStr += fstr + ', '
|
||
for key, value in self.where.items():
|
||
if isinstance(value, str):
|
||
whereStr += str(key) + ' = ' + "'" + value + "'" + ' '
|
||
continue
|
||
whereStr += str(key) + ' = ' + str(value) + ' '
|
||
whereStr = whereStr.strip()
|
||
findStr = findStr.strip().strip(',')
|
||
sql = f"select {findStr} from HR.resumes where {whereStr}"
|
||
print(sql)
|
||
return {
|
||
'sql': sql,
|
||
}
|
||
|
||
# 待入职阶段查询
|
||
def find_interview_waite_in_sql(self):
|
||
self.where.update({'interview_stage': 5})
|
||
whereStr = ''
|
||
findStr = ''
|
||
# 面试阶段查询字段
|
||
self.find_column = ["uid", "age", "gender", "at_school", "name", "event_time", "owner_name", "education",
|
||
"school", "specialty", "interview_name", "mmended_state", "work_list", "work_exp",
|
||
"job_name", "feedback", "interview_round", "interview_state", "interview_stage", "pass_why",
|
||
"pass_text"]
|
||
for fstr in self.find_column:
|
||
findStr += fstr + ', '
|
||
for key, value in self.where.items():
|
||
if isinstance(value, str):
|
||
whereStr += str(key) + ' = ' + "'" + value + "'" + ' '
|
||
continue
|
||
whereStr += str(key) + ' = ' + str(value) + ' '
|
||
whereStr = whereStr.strip()
|
||
findStr = findStr.strip().strip(',')
|
||
sql = f"select {findStr} from HR.resumes where {whereStr}"
|
||
print(sql)
|
||
return {
|
||
'sql': sql,
|
||
}
|
||
|
||
# 分组报表候选人质量查询
|
||
def get_man_mass_form_sql(self):
|
||
whereStr = ''
|
||
findStr = ''
|
||
# 查询字段
|
||
self.find_column = ["uid", "age", "gender", "name", "education", "owner_name", "school", "work_exp", "job_name",
|
||
"account", "work_list"]
|
||
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', '')
|
||
sql = f"select {findStr} from HR.resumes where {whereStr}"
|
||
if start_time:
|
||
sql += f" and toDate(event_time) >= `{start_time}`"
|
||
if end_time:
|
||
sql += f" and toDate(event_time) <= `{end_time}`"
|
||
# 没有日期条件
|
||
else:
|
||
sql = f"select {findStr} from HR.resumes where {whereStr}"
|
||
|
||
print(sql)
|
||
return {
|
||
'sql': sql
|
||
}
|
||
|
||
|
||
if __name__ == '__main__':
|
||
find = re.search(r"\d+\.?\d*", "18岁")
|
||
print(len(find.group()))
|