diff --git a/api/api_v1/endpoints/forms.py b/api/api_v1/endpoints/forms.py index e3c8a73..7842d81 100644 --- a/api/api_v1/endpoints/forms.py +++ b/api/api_v1/endpoints/forms.py @@ -1,6 +1,6 @@ import operator import os -import re,json +import re, json import pandas as pd from copy import deepcopy from fastapi import APIRouter, Depends, Request, File, UploadFile @@ -2681,36 +2681,124 @@ async def find_count_info( return schemas.Msg(code=200, msg='ok', data=res_data) -# 通用报表 -@router.post("/currency_form") -async def currency_form( +# 添加一条查询字段对照表数据 +@router.post("/find_column_insert") +async def find_column_insert( + request: Request, + insert_data: dict, + db: AsyncIOMotorDatabase = Depends(get_database), + current_user: schemas.UserDB = Depends(deps.get_current_user) +) -> schemas.Msg: + """ 添加一条查询字段对照表数据 """ + await crud.api_find_column.insert_columns(db, insert_data) + return schemas.Msg(code=200, msg='ok', data='') + + +# 修改一条查询字段对照表数据 +@router.post("/find_column_update") +async def find_column_update( + request: Request, + column_type: str, + update_data: dict, + db: AsyncIOMotorDatabase = Depends(get_database), + current_user: schemas.UserDB = Depends(deps.get_current_user) +) -> schemas.Msg: + """ 修改一条查询字段对照表数据 """ + data = await crud.api_find_column.update_columns(db, update_data, where={'column_type': column_type}) + return schemas.Msg(code=200, msg='ok', data=data) + + +# 报表查询字段对照列表 +@router.post("/find_column_list") +async def find_column_list( + request: Request, + column_type: str, + db: AsyncIOMotorDatabase = Depends(get_database), + current_user: schemas.UserDB = Depends(deps.get_current_user) +) -> schemas.Msg: + """ 报表查询字段对照列表 """ + data = await crud.api_find_column.get_one_column(db, where={'column_type': column_type}) + return schemas.Msg(code=200, msg='ok', data=data) + + +# 通用简历分析报表 +@router.post("/currency_interview_form") +async def currency_interview_form( request: Request, interview: InterviewDo = Depends(InterviewDo), ck_db: CKDrive = Depends(get_ck_db), db: AsyncIOMotorDatabase = Depends(get_database), current_user: schemas.UserDB = Depends(deps.get_current_user) ) -> schemas.Msg: - """ 通用模板报表 """ + """ 通用简历分析报表 """ await interview.init() - res = interview.year_job_form_sql() + res = interview.find_interview_every_sql() sql = res['sql'] - data = await ck_db.execute(sql) - # 获取报表相关参数 table_id = interview.data_in.get('table_id', '') if not table_id: return schemas.Msg(code=200, msg='报表数据错误', data={}) table_data = await crud.api_interview_tables.get_one_table(db, table_id) - if not table_data: return schemas.Msg(code=200, msg='报表数据错误', data={}) - level_list = { - 'count_id': '月份' - } + + find_column = table_data.get('find_column', []) + title = table_data['title'] + data = await ck_db.execute(sql) + level_list_data = await crud.api_find_column.get_one_column(db, where={'column_type': 'interview'}) + level_list = {k: v for k, v in level_list_data.items() if k in find_column} # 导出报表 if interview.out_form == 'out': - xls_name = '在职人员年份分布' + interview.where.get('start_time', '') + '~' + interview.where.get('start_time', '') + xls_name = title + interview.where.get('start_time', '') + '~' + interview.where.get('start_time', '') + chk_data = [] + columns = list(level_list.values()) + key_dict = {v: k for k, v in level_list.items()} + for i in data.values(): + add_data = [] + for key in columns: + add_data.append(i.get(key_dict[key], '')) + true_add_data = deepcopy(add_data) + chk_data.append(true_add_data) + chk_df = pd.DataFrame(data=chk_data, columns=columns) + download_xls = Download_xlsx(chk_df, xls_name) + return download_xls + res_msg = { + 'data': data.values(), + 'level_list': level_list + } + res_data = { + 'data': res_msg, + 'table_data': table_data + } + return schemas.Msg(code=200, msg='ok', data=res_data) + +# 通用入职人员分析报表 +@router.post("/currency_worker_form") +async def currency_worker_form( + request: Request, + interview: InterviewDo = Depends(InterviewDo), + ck_db: CKDrive = Depends(get_ck_db), + db: AsyncIOMotorDatabase = Depends(get_database), + current_user: schemas.UserDB = Depends(deps.get_current_user) +) -> schemas.Msg: + """ 通用入职人员分析报表 """ + # 获取报表相关参数 + table_id = interview.data_in.get('table_id', '') + if not table_id: + return schemas.Msg(code=200, msg='报表数据错误', data={}) + + table_data = await crud.api_interview_tables.get_one_table(db, table_id) + if not table_data: + return schemas.Msg(code=200, msg='报表数据错误', data={}) + find_column = table_data.get('find_column', []) + title = table_data['title'] + data = await crud.worker_info.find_worker_some(db, findlist=find_column) + level_list_data = await crud.api_find_column.get_one_column(db, where={'column_type': 'worker'}) + level_list = {k: v for k, v in level_list_data.items() if k in find_column} + # 导出报表 + if interview.out_form == 'out': + xls_name = title + interview.where.get('start_time', '') + '~' + interview.where.get('start_time', '') chk_data = [] columns = list(level_list.values()) key_dict = {v: k for k, v in level_list.items()} @@ -2724,7 +2812,17 @@ async def currency_form( download_xls = Download_xlsx(chk_df, xls_name) return download_xls + res_msg = { + 'data': data, + 'level_list': level_list + } + res_data = { + 'data': res_msg, + 'table_data': table_data + } + return schemas.Msg(code=200, msg='ok', data=res_data) +# 读取邮箱简历方法 def email_user(dir_name, mail_dict): file_list = [] # 简历文件 # 获取当前文件所在目录的绝对路径 @@ -2780,10 +2878,10 @@ async def chk_email_files( ) -> schemas.Msg: """ 获取hr邮箱简历 """ mail_user = { - '3a0c9e4958d12e': { # 李宗振 user表的_id - 'mail': '1986461823@qq.com', # 接收简历的邮箱 - 'host': 'imap.qq.com', # imap服务器地址 - 'pwd': 'hoosihokeaqkifdf' # 第三方提供的安全码 + '3a0c9e4958d12e': { # 李宗振 user表的_id + 'mail': '1986461823@qq.com', # 接收简历的邮箱 + 'host': 'imap.qq.com', # imap服务器地址 + 'pwd': 'hoosihokeaqkifdf' # 第三方提供的安全码 } # '吴操': { # 'mail': '2787668634@qq.com', diff --git a/crud/__init__.py b/crud/__init__.py index 359573f..cab9c60 100644 --- a/crud/__init__.py +++ b/crud/__init__.py @@ -34,4 +34,5 @@ from .crud_owner_info import owner_info from .crud_count_in_worker import count_in_worker from .crud_basic_data import basic_data from .crud_section import section -from .crud_feedback import feedback \ No newline at end of file +from .crud_feedback import feedback +from .crud_find_column import api_find_column diff --git a/crud/crud_find_column.py b/crud/crud_find_column.py new file mode 100644 index 0000000..e5d8212 --- /dev/null +++ b/crud/crud_find_column.py @@ -0,0 +1,31 @@ +from motor.motor_asyncio import AsyncIOMotorDatabase +import schemas +from crud.base import CRUDBase + +__all__ = 'api_find_column', + + +class ApiFindColumn(CRUDBase): + + # 获取所有 + async def get_find_columns(self, db: AsyncIOMotorDatabase): + return await self.find_many(db, {}, {'_id': 0}) + + # 插入一条新数据 + async def insert_columns(self, db: AsyncIOMotorDatabase, insert_data): + return await self.insert_one(db, insert_data) + + # 更新一条数据 + async def update_columns(self, db: AsyncIOMotorDatabase, update_data, where={}): + return await self.update_one(db, where, {'$set': update_data}) + + # 查询数据 + async def get_columns(self, db: AsyncIOMotorDatabase, where={}): + return await self.find_many(db, where, {'_id': 0}) + + # 获取一条数据 + async def get_one_column(self, db: AsyncIOMotorDatabase, where={}): + return await self.find_one(db, where, {'_id': 0}) + + +api_find_column = ApiFindColumn('find_column') diff --git a/models/interview_zsgc.py b/models/interview_zsgc.py index 56051cf..9aa83b5 100644 --- a/models/interview_zsgc.py +++ b/models/interview_zsgc.py @@ -375,8 +375,12 @@ class InterviewDo: else: for fstr in self.find_column: findStr += fstr + ', ' + is_date = 0 for key, value in self.where.items(): - if key in ['interview_id', 'hr_id', 'interview_name', 'hr_name','department']: + if key in ['start_time', 'end_time']: + is_date = 1 + continue + if key in ['interview_id', 'hr_id', 'interview_name', 'hr_name', 'department']: # 多个条件 if ',' in value: values = value.split(',') @@ -422,10 +426,23 @@ class InterviewDo: else: whereStr += str(key) + ' = ' + "'" + value + "'" + ' ' continue - if whereStr: - whereStr += 'and ' + str(key) + ' = ' + str(value) + ' ' + # 有日期条件 + 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: + if whereStr: + sql += f" and toDate(addHours(`event_time`, 0)) >= '{start_time}'" + else: + sql += f" toDate(addHours(`event_time`, 0)) >= '{start_time}'" + if end_time: + sql += f" and toDate(addHours(`event_time`, 0)) <= '{end_time}'" else: - whereStr += str(key) + ' = ' + str(value) + ' ' + if whereStr: + whereStr += 'and ' + str(key) + ' = ' + str(value) + ' ' + else: + whereStr += str(key) + ' = ' + str(value) + ' ' whereStr = whereStr.strip() findStr = findStr.strip().strip(',') if whereStr: