add feedback
This commit is contained in:
parent
db01d32dda
commit
3e683e9708
142
app/api/endpoints/feedback.py
Normal file
142
app/api/endpoints/feedback.py
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
from fastapi import APIRouter, Depends, HTTPException
|
||||||
|
from sqlalchemy.orm import Session
|
||||||
|
from app.models.database import get_db
|
||||||
|
from app.models.user import UserDB
|
||||||
|
from app.api.deps import get_current_user
|
||||||
|
from app.core.response import success_response, error_response, ResponseModel
|
||||||
|
from app.models.feedback import (
|
||||||
|
FeedbackCommunityApplyDB,
|
||||||
|
FeedbackPartnerApplyDB,
|
||||||
|
CommunityApplyCreate,
|
||||||
|
CommunityApplyInfo,
|
||||||
|
PartnerApplyCreate,
|
||||||
|
PartnerApplyInfo
|
||||||
|
)
|
||||||
|
from typing import List
|
||||||
|
import logging
|
||||||
|
from app.core.config import settings
|
||||||
|
|
||||||
|
router = APIRouter()
|
||||||
|
|
||||||
|
@router.post("/community-apply", response_model=ResponseModel)
|
||||||
|
async def apply_community(
|
||||||
|
apply_data: CommunityApplyCreate,
|
||||||
|
db: Session = Depends(get_db)
|
||||||
|
):
|
||||||
|
"""申请小区开通"""
|
||||||
|
try:
|
||||||
|
|
||||||
|
if apply_data.user_id>0:
|
||||||
|
current_user = db.query(UserDB).filter(UserDB.userid == apply_data.user_id).first()
|
||||||
|
else:
|
||||||
|
current_user = get_current_user(db)
|
||||||
|
|
||||||
|
# 创建申请记录
|
||||||
|
new_apply = FeedbackCommunityApplyDB(
|
||||||
|
user_id=current_user.userid,
|
||||||
|
community_name=apply_data.community_name,
|
||||||
|
community_address=apply_data.community_address
|
||||||
|
)
|
||||||
|
|
||||||
|
db.add(new_apply)
|
||||||
|
db.commit()
|
||||||
|
db.refresh(new_apply)
|
||||||
|
|
||||||
|
# 发送企业微信通知
|
||||||
|
try:
|
||||||
|
from app.core.wecombot import WecomBot
|
||||||
|
wecom_bot = WecomBot()
|
||||||
|
message = f"""📢 新的小区开通申请
|
||||||
|
|
||||||
|
> 申请人: {current_user.nickname}
|
||||||
|
> 联系电话: {current_user.phone}
|
||||||
|
> 小区名称: {apply_data.community_name}
|
||||||
|
> 小区地址: {apply_data.community_address}
|
||||||
|
> 申请时间: {new_apply.create_time}
|
||||||
|
"""
|
||||||
|
await wecom_bot.send_markdown(message,webhook_url=settings.FEEDBACK_NEED_WECOM_BOT_WEBHOOK_URL)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"发送企业微信通知失败: {str(e)}")
|
||||||
|
|
||||||
|
return success_response(message="申请提交成功,我们会尽快处理", data=CommunityApplyInfo.model_validate(new_apply))
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
db.rollback()
|
||||||
|
logging.exception(f"申请小区开通失败: {str(e)}")
|
||||||
|
return error_response(code=500, message="申请提交失败,请稍后重试")
|
||||||
|
|
||||||
|
@router.post("/partner-apply", response_model=ResponseModel)
|
||||||
|
async def apply_partner(
|
||||||
|
apply_data: PartnerApplyCreate,
|
||||||
|
db: Session = Depends(get_db),
|
||||||
|
):
|
||||||
|
"""申请成为合伙人"""
|
||||||
|
if apply_data.user_id>0:
|
||||||
|
current_user = db.query(UserDB).filter(UserDB.userid == apply_data.user_id).first()
|
||||||
|
else:
|
||||||
|
current_user = get_current_user(db)
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 创建申请记录
|
||||||
|
new_apply = FeedbackPartnerApplyDB(
|
||||||
|
user_id=current_user.userid,
|
||||||
|
name=apply_data.name,
|
||||||
|
phone=apply_data.phone,
|
||||||
|
type=apply_data.type,
|
||||||
|
service_target=apply_data.service_target
|
||||||
|
)
|
||||||
|
|
||||||
|
db.add(new_apply)
|
||||||
|
db.commit()
|
||||||
|
db.refresh(new_apply)
|
||||||
|
|
||||||
|
# 发送企业微信通知
|
||||||
|
try:
|
||||||
|
from app.core.wecombot import WecomBot
|
||||||
|
wecom_bot = WecomBot()
|
||||||
|
message = f"""📢 新的合伙人申请
|
||||||
|
|
||||||
|
> 申请类型: {apply_data.type}
|
||||||
|
> 申请人: {apply_data.name}
|
||||||
|
> 联系电话: {apply_data.phone}
|
||||||
|
> 服务对象/区域: {apply_data.service_target}
|
||||||
|
> 申请时间: {new_apply.create_time}
|
||||||
|
"""
|
||||||
|
await wecom_bot.send_markdown(message,webhook_url=settings.FEEDBACK_NEED_WECOM_BOT_WEBHOOK_URL)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"发送企业微信通知失败: {str(e)}")
|
||||||
|
|
||||||
|
return success_response(message="申请提交成功,我们会尽快联系您", data=PartnerApplyInfo.model_validate(new_apply))
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
db.rollback()
|
||||||
|
logging.exception(f"申请合伙人失败: {str(e)}")
|
||||||
|
return error_response(code=500, message="申请提交失败,请稍后重试")
|
||||||
|
|
||||||
|
@router.get("/my-community-applies", response_model=ResponseModel)
|
||||||
|
async def get_my_community_applies(
|
||||||
|
db: Session = Depends(get_db),
|
||||||
|
current_user: UserDB = Depends(get_current_user)
|
||||||
|
):
|
||||||
|
"""获取我的小区开通申请列表"""
|
||||||
|
applies = db.query(FeedbackCommunityApplyDB).filter(
|
||||||
|
FeedbackCommunityApplyDB.user_id == current_user.userid
|
||||||
|
).order_by(FeedbackCommunityApplyDB.create_time.desc()).all()
|
||||||
|
|
||||||
|
return success_response(data={
|
||||||
|
"items": [CommunityApplyInfo.model_validate(apply) for apply in applies]
|
||||||
|
})
|
||||||
|
|
||||||
|
@router.get("/my-partner-applies", response_model=ResponseModel)
|
||||||
|
async def get_my_partner_applies(
|
||||||
|
db: Session = Depends(get_db),
|
||||||
|
current_user: UserDB = Depends(get_current_user)
|
||||||
|
):
|
||||||
|
"""获取我的合伙人申请列表"""
|
||||||
|
applies = db.query(FeedbackPartnerApplyDB).filter(
|
||||||
|
FeedbackPartnerApplyDB.user_id == current_user.userid
|
||||||
|
).order_by(FeedbackPartnerApplyDB.create_time.desc()).all()
|
||||||
|
|
||||||
|
return success_response(data={
|
||||||
|
"items": [PartnerApplyInfo.model_validate(apply) for apply in applies]
|
||||||
|
})
|
||||||
@ -104,6 +104,8 @@ class Settings(BaseSettings):
|
|||||||
#配送订单取消
|
#配送订单取消
|
||||||
DELIVERY_ORDER_CANCELLED_TEMPLATE_ID: str = "iGR0rPtOFC_u8Xj5-R730zoDD_4Kbswkf_jSTnSSd6E"
|
DELIVERY_ORDER_CANCELLED_TEMPLATE_ID: str = "iGR0rPtOFC_u8Xj5-R730zoDD_4Kbswkf_jSTnSSd6E"
|
||||||
|
|
||||||
|
# 反馈需求企业微信
|
||||||
|
FEEDBACK_NEED_WECOM_BOT_WEBHOOK_URL: str = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=ccd6e8d4-4c8a-45b4-9b6b-dd4cae563176"
|
||||||
class Config:
|
class Config:
|
||||||
case_sensitive = True
|
case_sensitive = True
|
||||||
env_file = ".env"
|
env_file = ".env"
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
from fastapi import FastAPI
|
from fastapi import FastAPI
|
||||||
from fastapi.middleware.cors import CORSMiddleware
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
from app.api.endpoints import wechat,user, address, community, station, order, coupon, community_building, upload, merchant, merchant_product, merchant_order, point, config, merchant_category, log, account,merchant_pay_order, message, bank_card, withdraw, mp, point_product, point_product_order, coupon_activity, ocr, dashboard
|
from app.api.endpoints import wechat,user, address, community, station, order, coupon, community_building, upload, merchant, merchant_product, merchant_order, point, config, merchant_category, log, account,merchant_pay_order, message, bank_card, withdraw, mp, point_product, point_product_order, coupon_activity, ocr, dashboard, wecom
|
||||||
from app.models.database import Base, engine
|
from app.models.database import Base, engine
|
||||||
from fastapi.exceptions import RequestValidationError
|
from fastapi.exceptions import RequestValidationError
|
||||||
from fastapi.responses import JSONResponse
|
from fastapi.responses import JSONResponse
|
||||||
@ -12,6 +12,7 @@ import logging
|
|||||||
from app.core.config import settings
|
from app.core.config import settings
|
||||||
from app.core.wecombot import WecomBot
|
from app.core.wecombot import WecomBot
|
||||||
from app.api.endpoints import wecom
|
from app.api.endpoints import wecom
|
||||||
|
from app.api.endpoints import feedback
|
||||||
|
|
||||||
# 创建数据库表
|
# 创建数据库表
|
||||||
Base.metadata.create_all(bind=engine)
|
Base.metadata.create_all(bind=engine)
|
||||||
@ -74,7 +75,7 @@ app.include_router(upload.router, prefix="/api/upload", tags=["文件上传"])
|
|||||||
app.include_router(config.router, prefix="/api/config", tags=["系统配置"])
|
app.include_router(config.router, prefix="/api/config", tags=["系统配置"])
|
||||||
app.include_router(log.router, prefix="/api/logs", tags=["系统日志"])
|
app.include_router(log.router, prefix="/api/logs", tags=["系统日志"])
|
||||||
app.include_router(ocr.router, prefix="/api/ai/ocr", tags=["图像识别"])
|
app.include_router(ocr.router, prefix="/api/ai/ocr", tags=["图像识别"])
|
||||||
|
app.include_router(feedback.router, prefix="/api/feedback", tags=["反馈"])
|
||||||
|
|
||||||
@app.get("/")
|
@app.get("/")
|
||||||
async def root():
|
async def root():
|
||||||
|
|||||||
74
app/models/feedback.py
Normal file
74
app/models/feedback.py
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Text, Enum
|
||||||
|
from sqlalchemy.sql import func
|
||||||
|
from pydantic import BaseModel, Field
|
||||||
|
from typing import Optional
|
||||||
|
from datetime import datetime
|
||||||
|
from .database import Base
|
||||||
|
import enum
|
||||||
|
|
||||||
|
class FeedbackCommunityApplyDB(Base):
|
||||||
|
"""小区开通申请表"""
|
||||||
|
__tablename__ = "feedback_community_apply"
|
||||||
|
|
||||||
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||||
|
user_id = Column(Integer, ForeignKey("users.userid"), nullable=False)
|
||||||
|
community_name = Column(String(100), nullable=False) # 小区名称
|
||||||
|
community_address = Column(String(200), nullable=False) # 小区地址
|
||||||
|
create_time = Column(DateTime(timezone=True), server_default=func.now())
|
||||||
|
update_time = Column(DateTime(timezone=True), onupdate=func.now())
|
||||||
|
|
||||||
|
class PartnerType(str, enum.Enum):
|
||||||
|
"""合伙人类型"""
|
||||||
|
COMMUNITY = "社区合伙人" # 社区合伙人
|
||||||
|
BUSINESS = "商家合伙人" # 商家合伙人
|
||||||
|
DELIVERY = "配送合伙人" # 配送合伙人
|
||||||
|
|
||||||
|
class FeedbackPartnerApplyDB(Base):
|
||||||
|
"""合伙人申请表"""
|
||||||
|
__tablename__ = "feedback_partner_apply"
|
||||||
|
|
||||||
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||||
|
user_id = Column(Integer, ForeignKey("users.userid"), nullable=False)
|
||||||
|
name = Column(String(50), nullable=False) # 姓名
|
||||||
|
phone = Column(String(20), nullable=False) # 联系电话
|
||||||
|
type = Column(String(50), nullable=False) # 合伙人类型
|
||||||
|
service_target = Column(String(200), nullable=False) # 服务对象/区域
|
||||||
|
create_time = Column(DateTime(timezone=True), server_default=func.now())
|
||||||
|
update_time = Column(DateTime(timezone=True), onupdate=func.now())
|
||||||
|
|
||||||
|
# Pydantic 模型
|
||||||
|
class CommunityApplyCreate(BaseModel):
|
||||||
|
user_id: int = Field(..., description="用户ID")
|
||||||
|
community_name: str = Field(..., max_length=100, description="小区名称")
|
||||||
|
community_address: str = Field(..., max_length=200, description="小区地址")
|
||||||
|
|
||||||
|
class CommunityApplyInfo(BaseModel):
|
||||||
|
id: int
|
||||||
|
user_id: int
|
||||||
|
community_name: str
|
||||||
|
community_address: str
|
||||||
|
create_time: datetime
|
||||||
|
update_time: Optional[datetime] = None
|
||||||
|
|
||||||
|
class Config:
|
||||||
|
from_attributes = True
|
||||||
|
|
||||||
|
class PartnerApplyCreate(BaseModel):
|
||||||
|
user_id: int = Field(..., description="用户ID")
|
||||||
|
name: str = Field(..., max_length=50, description="姓名")
|
||||||
|
phone: str = Field(..., max_length=20, description="联系电话")
|
||||||
|
type: str = Field(..., max_length=50, description="合伙人类型")
|
||||||
|
service_target: str = Field(..., max_length=200, description="服务对象/区域")
|
||||||
|
|
||||||
|
class PartnerApplyInfo(BaseModel):
|
||||||
|
id: int
|
||||||
|
user_id: int
|
||||||
|
name: str
|
||||||
|
phone: str
|
||||||
|
type: str
|
||||||
|
service_target: str
|
||||||
|
create_time: datetime
|
||||||
|
update_time: Optional[datetime] = None
|
||||||
|
|
||||||
|
class Config:
|
||||||
|
from_attributes = True
|
||||||
Loading…
Reference in New Issue
Block a user