diff --git a/api/api_v1/api.py b/api/api_v1/api.py index 490546e..65680ed 100644 --- a/api/api_v1/api.py +++ b/api/api_v1/api.py @@ -9,6 +9,7 @@ from .endpoints import report from .endpoints import data_mana from .endpoints import query from .endpoints import xquery +from .endpoints import interview from .endpoints import data_auth from .endpoints import event_mana from .endpoints import test @@ -38,3 +39,6 @@ api_router.include_router(xquery.router, tags=["xck"], prefix='/ck') api_router.include_router(authz.router, tags=["api接口管理"], prefix='/authz') api_router.include_router(check_data.router, tags=["打点验证"], prefix='/check_data') api_router.include_router(user_label.router, tags=["用户标签"], prefix='/user_label') + +api_router.include_router(interview.router, tags=["面试数据管理"], prefix='/itr') + diff --git a/api/api_v1/endpoints/interview.py b/api/api_v1/endpoints/interview.py new file mode 100644 index 0000000..25a7982 --- /dev/null +++ b/api/api_v1/endpoints/interview.py @@ -0,0 +1,76 @@ +import datetime +import mimetypes +from collections import defaultdict +import time +from urllib.parse import quote +import re +from clickhouse_driver import Client +import pandas as pd +import numpy as np +from fastapi import APIRouter, Depends, Request +from motor.motor_asyncio import AsyncIOMotorDatabase +from pandas import DataFrame +from starlette.responses import StreamingResponse + +import crud, schemas +from common import * + +from api import deps +from db import get_database +from db.ckdb import get_ck_db, CKDrive, ckdb +from db.redisdb import get_redis_pool, RedisDrive + +from models.behavior_analysis import BehaviorAnalysis +from models.user_analysis import UserAnalysis +from models.interview_zsgc import InterviewDo +from utils import DfToStream, get_bijiao + +router = APIRouter() + + +# 面试查询 +@router.post("/interview_find") +async def interview_find( + request: Request, + interview: InterviewDo = Depends(InterviewDo), + db: CKDrive = Depends(get_ck_db), +) -> schemas.Msg: + """ interview面试数据查询 """ + await interview.init() + res = await interview.find_interview_sql() + sql = res['sql'] + data = await db.execute(sql) + return schemas.Msg(code=200, msg='ok', data=data) + + +# 面试修改 +@router.post("/interview_update") +async def interview_update( + request: Request, + interview: InterviewDo = Depends(InterviewDo), + db: CKDrive = Depends(get_ck_db), +) -> schemas.Msg: + """ interview面试数据更新 """ + await interview.init() + res = await interview.update_interview_sql() + sql = res['sql'] + data = await db.execute(sql) + return schemas.Msg(code=200, msg='ok', data=data) + + +# 写入面试数据 +@router.post("/interview_insert") +async def interview_insert( + request: Request, + interview: InterviewDo = Depends(InterviewDo), + db: CKDrive = Depends(get_ck_db), +) -> schemas.Msg: + """ interview面试数据写入 """ + await interview.init() + res = await interview.insert_interview_sql() + sql = res['sql'] + insert_data = res['insert_data'] + data = await db.execute_dict(sql, insert_data) + return schemas.Msg(code=200, msg='ok', data=data) + + diff --git a/crud/crud_interview.py b/crud/crud_interview.py new file mode 100644 index 0000000..de0815a --- /dev/null +++ b/crud/crud_interview.py @@ -0,0 +1,38 @@ +from motor.motor_asyncio import AsyncIOMotorDatabase +import schemas +from crud.base import CRUDBase + +__all__ = 'api_interview', + + +class ApiInterview(CRUDBase): + + # 获取所有面试安排信息 + async def get_api_interview(self, db: AsyncIOMotorDatabase): + return await self.find_many(db) + + # 获取单个面试安排数据 + async def get_one(self, db: AsyncIOMotorDatabase, data_in: schemas.Url_quanxian): + return await self.find_one(db, {'user_id': data_in.user_id}) + + # 插入一条全新的面试安排数据 + async def insert_quanxian(self, db: AsyncIOMotorDatabase, data_in: schemas.Url_module): + return await self.insert_one(db, data_in.dict()) + + # 更新一条面试安排数据 + async def updata_quanxian_module(self, db: AsyncIOMotorDatabase, data_in: schemas.Url_module): + return await self.update_one(db, {'auth_id': data_in.auth_id, 'path_name': data_in.path_name}, + {'$set': {'api_list': data_in.api_list, 'api_name': data_in.api_name, + 'state': data_in.state}}) + + # 获取一条权限模板信息 + async def get_one_module(self, db: AsyncIOMotorDatabase, data_in: schemas.Add_module): + return await self.find_one(db, {'auth_id': data_in.auth_id}) + + # 更新一条面试安排数据 + async def update_one_interview(self, db: AsyncIOMotorDatabase, res): + return await self.update_one(db, {'_id': res['_id']}, { + '$set': res}) + + +api_interview = ApiInterview('api_interview') diff --git a/db/ckdb.py b/db/ckdb.py index dd7c624..cd35a14 100644 --- a/db/ckdb.py +++ b/db/ckdb.py @@ -33,6 +33,10 @@ class CKDrive: df = pd.DataFrame({col[0]: d for d, col in zip(data, columns)}) return df.T.to_dict() + async def execute_dict(self, sql, insert_data) -> dict: + data = await self._execute(sql, insert_data, types_check=True) + return data + async def query_dataframe(self, sql): data, columns = await self._execute(sql, with_column_types=True, columnar=True) df = pd.DataFrame({col[0]: d for d, col in zip(data, columns)}) @@ -72,6 +76,7 @@ class CKDrive: df = await self.query_dataframe(sql) return df.T.to_dict().values() + ckdb = CKDrive() diff --git a/models/interview_zsgc.py b/models/interview_zsgc.py new file mode 100644 index 0000000..a628324 --- /dev/null +++ b/models/interview_zsgc.py @@ -0,0 +1,71 @@ +import re +from typing import Tuple + +import arrow +import sqlalchemy as sa +import json + +from fastapi import Depends + +import pandas as pd +import numpy as np + +from sqlalchemy import func, or_, and_, not_ + +import crud +import schemas +from core.config import settings +from db import get_database + +from db.redisdb import get_redis_pool, RedisDrive +from models.user_label import UserClusterDef + + +# 面试数据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 insert_interview_sql(self): + insert_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 test.interview(auth, state, name, phone, position, teacher_name, boss_name, stage, " \ + # f"interview_type,interview_location, interview_time) values" + sql = f"insert into test.interview(name, kardid) values" + print(sql) + return {'sql': sql, + 'insert_data': insert_data + } + + def update_interview_sql(self): + updateStr = '' + whereStr = '' + for key, value in self.data_in.items(): + updateStr += str(key) + ' = ' + str(value) + ' ' + for key, value in self.where.items(): + whereStr += str(key) + ' = ' + str(value) + ' ' + updateStr = updateStr.strip() + whereStr = whereStr.strip() + sql = f"alter table test.interview update `{updateStr}` where `{whereStr}`" + + print(sql) + return {'sql': sql, + } + + def find_interview_sql(self): + sql = f"select `{self.find_column}` from test.interview where {self.where}" + print(sql) + return {'sql': sql, + } diff --git a/schemas/__init__.py b/schemas/__init__.py index c297ede..9c9e463 100644 --- a/schemas/__init__.py +++ b/schemas/__init__.py @@ -24,4 +24,5 @@ from .api_board import * from .url_list import * from .user_url import * from .api_module import * -from .event_list import * \ No newline at end of file +from .event_list import * +from .interview import * diff --git a/schemas/interview.py b/schemas/interview.py new file mode 100644 index 0000000..3f73d56 --- /dev/null +++ b/schemas/interview.py @@ -0,0 +1,24 @@ +from typing import Dict, List, Union, Any +from pydantic import BaseModel + + +# 面试数据包含字段样式 +class InterviewModel(BaseModel): + auth: int # 可操作最低权限 权限控制0表示最高权限 数字越大权限越小 + state: str # 反馈状态,面试安排数据的反馈 + name: str # 被面试人名 + phone: int # 被面试者手机号 + position: str # 面试职位 + teacher_name: str # 面试官名 + boss_name: str # 面试负责人 + stage: int # 当前面试阶段 1-5 表示初试,复式,终试,offer,入职 0表示离职 -1表示拒绝 + interview_type: str # 当前阶段面试类型 视频面试, 现场面试 + interview_location: str # 面试地点 + interview_time: str # 面试时间 + + +# 面试查询格式 +class InterviewQuery(BaseModel): + data_in: Any + interview_query: dict = dict() # 查询删选条件 + find_column: List[str] = None # 显示列名