添加消息通知功能
This commit is contained in:
parent
6eb8d4516b
commit
4c23c2c6f2
|
@ -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},
|
||||
},
|
||||
}
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
|
@ -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)
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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 = "质量部门"
|
||||
|
|
4
main.py
4
main.py
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue