diff --git a/backend/app/api/v1/endpoints/tasks.py b/backend/app/api/v1/endpoints/tasks.py index cd0c78a..a07510d 100644 --- a/backend/app/api/v1/endpoints/tasks.py +++ b/backend/app/api/v1/endpoints/tasks.py @@ -308,4 +308,4 @@ async def add_task_record_endpoint( current_user: dict = Depends(get_current_user), ): """追加进度记录(备注+图片),不改变任务状态""" - return await task_service.add_task_record(db, uuid.UUID(task_id), data) + return await task_service.add_task_record(db, uuid.UUID(task_id), data, current_user) diff --git a/backend/app/models/notification.py b/backend/app/models/notification.py index 4ae76f5..aab12d4 100644 --- a/backend/app/models/notification.py +++ b/backend/app/models/notification.py @@ -11,6 +11,7 @@ from app.core.time_utils import get_beijing_time # 通知类型常量 NOTIFY_TRANSFER = "TRANSFER" # 新任务派发/转交 NOTIFY_REJECT = "REJECT" # 品质驳回 +NOTIFY_COMMENT = "COMMENT" # 留言提醒 class Notification(Base): diff --git a/backend/app/services/task_service.py b/backend/app/services/task_service.py index b866038..91803ff 100644 --- a/backend/app/services/task_service.py +++ b/backend/app/services/task_service.py @@ -1042,7 +1042,8 @@ async def create_subtask( # ============================================================ async def add_task_record( - db: AsyncSession, task_id: uuid.UUID, data: TaskRecordCreate + db: AsyncSession, task_id: uuid.UUID, data: TaskRecordCreate, + current_user: dict | None = None, ) -> TaskResponse: """追加进度记录(备注+图片),不改变任务状态""" import json @@ -1055,6 +1056,32 @@ async def add_task_record( images=json.dumps(data.images) if data.images else None, ) db.add(record) + await db.flush() + + # 🚀 留言通知:给任务当前负责人发送提醒(不给自己发) + if ( + current_user + and task.assignee_id + and task.assignee_id != current_user.get("username", "") + and data.remark + ): + # 截取留言内容前 30 字作为摘要 + remark_text = data.remark.strip() + short_content = remark_text[:30] + ("..." if len(remark_text) > 30 else "") + # 查询产品条码 + product_result = await db.execute( + select(Product).where(Product.id == task.product_id) + ) + product = product_result.scalar_one_or_none() + product_sn = product.serial_number if product else "未知" + db.add(Notification( + user_id=task.assignee_id, + title="💬 收到新留言", + content=f"产品 [{product_sn}] 的「{task.task_name}」有新留言:{short_content}", + type="COMMENT", + task_id=task.id, + )) + await db.commit() await db.refresh(record) diff --git a/track-uniapp/src/pages/notify/index.vue b/track-uniapp/src/pages/notify/index.vue index a117ab9..9092b8e 100644 --- a/track-uniapp/src/pages/notify/index.vue +++ b/track-uniapp/src/pages/notify/index.vue @@ -51,6 +51,7 @@ import { getNotifications, markNotificationRead } from "../../api/notification"; const TYPE_CONFIG = { TRANSFER: { icon: "🟢", title: "新任务派发" }, REJECT: { icon: "🔴", title: "品质驳回提醒" }, + COMMENT: { icon: "💬", title: "收到新留言" }, }; const notifications = ref([]);