添加消息通知功能

This commit is contained in:
Administrator 2023-06-29 17:24:38 +08:00
parent 6eb8d4516b
commit 4c23c2c6f2
7 changed files with 89 additions and 19 deletions

35
Config/log.py Normal file
View File

@ -0,0 +1,35 @@
uvicorn_log_config = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"default": {
"()": "uvicorn.logging.DefaultFormatter",
"fmt": "%(asctime)s %(levelprefix)s %(message)s",
"datefmt": "%Y-%m-%d %H:%M:%S",
"use_colors": True,
},
"access": {
"()": "uvicorn.logging.AccessFormatter",
"fmt": '%(asctime)s %(levelprefix)s %(client_addr)s - "%(request_line)s" %(status_code)s', # noqa: E501
"datefmt": "%Y-%m-%d %H:%M:%S",
"use_colors": True,
},
},
"handlers": {
"default": {
"formatter": "default",
"class": "logging.StreamHandler",
"stream": "ext://sys.stderr",
},
"access": {
"formatter": "access",
"class": "logging.StreamHandler",
"stream": "ext://sys.stdout",
},
},
"loggers": {
"uvicorn": {"handlers": ["default"], "level": "INFO", "propagate": False},
"uvicorn.error": {"level": "INFO"},
"uvicorn.access": {"handlers": ["access"], "level": "INFO", "propagate": False},
},
}

View File

@ -78,7 +78,7 @@ def daily_query(db: Session, params: DailyQuery, department: str, auth: str = No
query = query.filter(getattr(db_model, key) >= datetime.fromtimestamp(value[0] / 1000))
print(datetime.fromtimestamp(value[0] / 1000))
if value[1] is not None:
query = query.filter(getattr(db_model, key) <= datetime.fromtimestamp(value[1] / 1000))
query = query.filter(getattr(db_model, key) < datetime.fromtimestamp(value[1] / 1000))
print(datetime.fromtimestamp(value[1] / 1000))
else:
query = query.filter(getattr(db_model, key) == value)

View File

@ -1,3 +1,4 @@
import threading
import time
from concurrent.futures import ThreadPoolExecutor
@ -82,21 +83,27 @@ class DailyNotice:
emails.append(user.email)
with ThreadPoolExecutor(max_workers=8) as executor:
for i in range(5):
for i in range(2):
pass
# executor.submit(send_email, "每日运行日报已上传", 'wuchunquan@fecr.com.cn', '每日运行日报已上传')
# executor.submit(send_email, "每日运行日报已上传", 'wangsichuan@fecr.com.cn', '每日运行日报已上传')
@staticmethod
def start_timer_to_notice_daily_fill():
print("start_timer_to_notice_daily_fill")
sended = False
while True:
time.sleep(60)
if is_workday() and datetime.now().hour == 15 and not sended:
if is_workday() and datetime.now().hour == 17 and datetime.now().minute==18 and not sended:
sended = True
try:
pass
send_email('日报填报提醒', "fecribd@fecr.com.cn", "填报提醒")
print("邮件发送了")
except Exception as e:
print(e, 'start_timer_to_notice_daily_fill错误')
if datetime.now().hour > 15:
sended = False
threading.Thread(target=DailyNotice.start_timer_to_notice_daily_fill).start()
# DailyNotice.start_timer_to_notice_daily_fill()

View File

@ -2,6 +2,7 @@ import os.path
import time
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy import cast, DATE
from sqlalchemy.orm import Session
from starlette.responses import FileResponse
@ -119,3 +120,26 @@ def daily_export(req: QueryParams, db: Session = Depends(get_db)):
return {"url": "/" + file_path}
# return FileResponse(
# path=file_path, headers={'Content-Disposition': f'attachment; filename="{file_name}"'}, filename=file_name)
@router.post("/daily_export_to_pdf", summary="每日运行日报导出")
def daily_export_to_pdf(req: DailySchemas.DailyExportToPdfReq, db: Session = Depends(get_db)):
query = db.query(Daily).filter(cast(Daily.daily_time, DATE) == cast(req.day, DATE))
query = query.order_by(Daily.daily_time.desc())
department_name_dic = {item.id: item.name for item in db.query(Department).all()}
daily_items = []
for item in query:
daily_item = {"日报类型": item.type.name,
"填报人": item.user_info.name,
"部门": department_name_dic.get(item.department), "标题": item.title,
"内容": item.content, "填报时间": item.daily_time}
daily_items.append(daily_item)
temp_path = "static_data/daily_out_temp"
if not os.path.exists(temp_path):
os.makedirs(temp_path)
file_name = f"{time.strftime('%Y%m%d%H%M%S')}.xlsx"
file_path = f"{temp_path}/{file_name}"
pd.DataFrame(daily_items).to_excel(file_path, index=False)
return {"url": "/" + file_path}
# return FileResponse(
# path=file_path, headers={'Content-Disposition': f'attachment; filename="{file_name}"'}, filename=file_name)

View File

@ -1,7 +1,7 @@
from enum import Enum, unique
from typing import Optional, List, Union
from pydantic import BaseModel
from datetime import datetime
from datetime import datetime, date
from Schemas.UserSchemas import UserInfo
@ -16,7 +16,8 @@ class DailyTypeEnum(Enum):
# 经营情况 = "经营情况"
财务营收 = "财务营收"
动态 = "动态"
class DailyExportToPdfReq(BaseModel):
day:date
class CommentInfo(BaseModel):
id: Optional[int]

View File

@ -5,6 +5,18 @@ from pydantic import BaseModel
from typing import Union, Optional, List
@unique
class DepartmentTypeEnum(Enum):
enum01 = "董监高"
enum02 = "评级部门"
enum03 = "业务部门"
enum04 = "研发部门"
enum05 = "职能部门"
enum06 = "战略部门"
enum07 = "子分公司"
enum08 = "质量部门"
class LoginToAppReq(BaseModel):
code: str
@ -23,6 +35,7 @@ class DepartmentInfo(BaseModel):
id: int
belong: Optional[int]
name: str
type: Optional[DepartmentTypeEnum]
class PostInfo(BaseModel):
@ -121,15 +134,3 @@ class GetUserByDepartmentTypeRes(BaseModel):
class GetUserByDepartmentTypeReq(BaseModel):
department_type: str
@unique
class DepartmentTypeEnum(Enum):
enum01 = "董监高"
enum02 = "评级部门"
enum03 = "业务部门"
enum04 = "研发部门"
enum05 = "职能部门"
enum06 = "战略部门"
enum07 = "子分公司"
enum08 = "质量部门"

View File

@ -3,6 +3,8 @@ import uvicorn
from fastapi import FastAPI
from fastapi.exceptions import RequestValidationError
from fastapi.middleware.cors import CORSMiddleware
from Config.log import uvicorn_log_config
from Router import UserRouter, DailyRouter, AuthRouter, FileRouter
from Utils.MiddlewareUtils import exception_handler, validation_exception_handler
from Utils.SqlAlchemyUtils import init_database, get_db_i
@ -39,4 +41,4 @@ app.include_router(ModsRouter.router)
# app.exception_handler(RequestValidationError)(validation_exception_handler)
uvicorn.run(app=app, host="0.0.0.0", port=8006)
uvicorn.run(app=app, host="0.0.0.0", port=8006, log_config=uvicorn_log_config)