feat(notify): 站内通知补齐完成、到期逾期与知识事件
CI / backend (push) Waiting to run

This commit is contained in:
Steven
2026-11-10 13:47:56 +08:00
parent 4b7627d70e
commit f54df70811
15 changed files with 791 additions and 32 deletions
+58 -10
View File
@@ -205,6 +205,48 @@ async def _apply_update(
return item
async def _notify_status_change(
session: AsyncSession,
*,
ws_id: uuid.UUID,
item: Item,
previous: str,
to_status: str,
actor_id: uuid.UUID,
actor_name: str,
) -> None:
"""状态变化的通知。
"完成"单独一种 kind:收件人一眼能看出是结项,而不是又一次普通的状态流转;
其余状态仍走 `task_status_changed`,正文里写清从什么改成了什么。
"""
if to_status == "done":
await notify(
session,
ws_id=ws_id,
user_ids=(item.creator_id, item.assignee_id),
kind="task_completed",
item_id=item.id,
title=f"「{item.title}」已完成",
body=f"{actor_name} 把它标记为完成。",
actor_id=actor_id,
)
return
await notify(
session,
ws_id=ws_id,
user_ids=(item.creator_id, item.assignee_id),
kind="task_status_changed",
item_id=item.id,
title=f"「{item.title}」变成{TASK_STATUS_CN.get(to_status, to_status)}了",
body=(
f"{actor_name} 把它从 {TASK_STATUS_CN.get(previous, previous)} "
f"改成了 {TASK_STATUS_CN.get(to_status, to_status)}"
),
actor_id=actor_id,
)
# ── 列表 ────────────────────────────────────────────────────────────────
def _apply_filters(
stmt: Select,
@@ -581,6 +623,17 @@ async def batch_status(body: BatchStatusIn, ctx: MemberDep, session: SessionDep)
}
)
continue
# 批量改状态以前是"悄悄改完":被指派人/创建人收不到任何通知,
# 和单条改状态的行为不一致。这里补上同一条通知。
await _notify_status_change(
session,
ws_id=ctx.ws_id,
item=item,
previous=previous,
to_status=body.status,
actor_id=ctx.user.id,
actor_name=ctx.user.nickname or "同事",
)
updated.append({"id": str(item.id), "version": item.version, "unchanged": False})
return ok(
@@ -682,19 +735,14 @@ async def change_status(
payload={"from": previous, "to": body.status},
)
tags = await _tags_of(session, ctx.ws_id, [item.id])
await notify(
await _notify_status_change(
session,
ws_id=ctx.ws_id,
user_ids=(item.creator_id, item.assignee_id),
kind="task_status_changed",
item_id=item.id,
title=f"「{item.title}」变成{TASK_STATUS_CN.get(body.status, body.status)}了",
body=(
f"{ctx.user.nickname or '同事'} 把它从 "
f"{TASK_STATUS_CN.get(previous, previous)} 改成了 "
f"{TASK_STATUS_CN.get(body.status, body.status)}"
),
item=item,
previous=previous,
to_status=body.status,
actor_id=ctx.user.id,
actor_name=ctx.user.nickname or "同事",
)
return ok(_item_out(item, tags.get(item.id)), message="状态已更新")