Compare commits
2 Commits
3cb85f28b4
...
991d713777
| Author | SHA1 | Date | |
|---|---|---|---|
| 991d713777 | |||
| 7e4d796ce3 |
@ -308,4 +308,4 @@ async def add_task_record_endpoint(
|
|||||||
current_user: dict = Depends(get_current_user),
|
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)
|
||||||
|
|||||||
@ -11,6 +11,7 @@ from app.core.time_utils import get_beijing_time
|
|||||||
# 通知类型常量
|
# 通知类型常量
|
||||||
NOTIFY_TRANSFER = "TRANSFER" # 新任务派发/转交
|
NOTIFY_TRANSFER = "TRANSFER" # 新任务派发/转交
|
||||||
NOTIFY_REJECT = "REJECT" # 品质驳回
|
NOTIFY_REJECT = "REJECT" # 品质驳回
|
||||||
|
NOTIFY_COMMENT = "COMMENT" # 留言提醒
|
||||||
|
|
||||||
|
|
||||||
class Notification(Base):
|
class Notification(Base):
|
||||||
|
|||||||
@ -1042,7 +1042,8 @@ async def create_subtask(
|
|||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
async def add_task_record(
|
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:
|
) -> TaskResponse:
|
||||||
"""追加进度记录(备注+图片),不改变任务状态"""
|
"""追加进度记录(备注+图片),不改变任务状态"""
|
||||||
import json
|
import json
|
||||||
@ -1055,6 +1056,32 @@ async def add_task_record(
|
|||||||
images=json.dumps(data.images) if data.images else None,
|
images=json.dumps(data.images) if data.images else None,
|
||||||
)
|
)
|
||||||
db.add(record)
|
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.commit()
|
||||||
await db.refresh(record)
|
await db.refresh(record)
|
||||||
|
|
||||||
|
|||||||
@ -109,35 +109,32 @@ export default {
|
|||||||
success: (modalRes) => {
|
success: (modalRes) => {
|
||||||
if (!modalRes.confirm) return;
|
if (!modalRes.confirm) return;
|
||||||
|
|
||||||
// 🚀 使用原生等待框,原地更新文字,杜绝闪烁
|
// 初始反馈:告知用户已转入后台
|
||||||
plus.nativeUI.showWaiting("正在下载 0%");
|
uni.showToast({ title: '已转入后台下载...', icon: 'none', position: 'top' });
|
||||||
|
|
||||||
const downloadTask = uni.downloadFile({
|
const downloadTask = uni.downloadFile({
|
||||||
url: wgtUrl,
|
url: wgtUrl,
|
||||||
success: (downloadRes) => {
|
success: (downloadRes) => {
|
||||||
if (downloadRes.statusCode !== 200) {
|
if (downloadRes.statusCode !== 200) {
|
||||||
plus.nativeUI.closeWaiting();
|
|
||||||
uni.showToast({ title: "下载失败", icon: "none" });
|
uni.showToast({ title: "下载失败", icon: "none" });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 安装阶段 — 原生等待框直接更新文字,无闪烁
|
// 安装阶段 — toast 轻提示
|
||||||
plus.nativeUI.showWaiting("正在安装...");
|
uni.showToast({ title: "正在安装...", icon: "none", position: "top" });
|
||||||
|
|
||||||
plus.runtime.install(
|
plus.runtime.install(
|
||||||
downloadRes.tempFilePath,
|
downloadRes.tempFilePath,
|
||||||
{ force: true },
|
{ force: true },
|
||||||
() => {
|
() => {
|
||||||
plus.nativeUI.closeWaiting();
|
|
||||||
console.log("[OTA] WGT 安装成功");
|
console.log("[OTA] WGT 安装成功");
|
||||||
// 🚀 静默重启:toast 提示后自动重启,无需用户杀后台
|
// 🚀 静默重启:toast 提示后自动重启
|
||||||
plus.nativeUI.toast("新版本已就绪,即将重启...");
|
plus.nativeUI.toast("新版本已就绪,即将重启...");
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
plus.runtime.restart();
|
plus.runtime.restart();
|
||||||
}, 2000);
|
}, 2000);
|
||||||
},
|
},
|
||||||
(err) => {
|
(err) => {
|
||||||
plus.nativeUI.closeWaiting();
|
|
||||||
console.error("[OTA] 安装失败:", err.message);
|
console.error("[OTA] 安装失败:", err.message);
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: "更新失败: " + (err.message || "未知错误"),
|
title: "更新失败: " + (err.message || "未知错误"),
|
||||||
@ -148,18 +145,24 @@ export default {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
fail: (err) => {
|
fail: (err) => {
|
||||||
plus.nativeUI.closeWaiting();
|
|
||||||
console.error("[OTA] 下载失败:", err.errMsg);
|
console.error("[OTA] 下载失败:", err.errMsg);
|
||||||
uni.showToast({ title: "下载失败,请检查网络", icon: "none" });
|
uni.showToast({ title: "下载失败,请检查网络", icon: "none" });
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
// 下载进度 — 稳定更新原生等待框文字,不会闪烁
|
// 🚀 核心性能优化:节流阀 — 每跨越 20% 才触发一次轻提示
|
||||||
|
let lastProgress = 0;
|
||||||
if (downloadTask && downloadTask.onProgressUpdate) {
|
if (downloadTask && downloadTask.onProgressUpdate) {
|
||||||
downloadTask.onProgressUpdate((res) => {
|
downloadTask.onProgressUpdate((res) => {
|
||||||
const pct = res.progress;
|
const pct = res.progress;
|
||||||
if (pct < 100) {
|
if (pct - lastProgress >= 20 && pct < 100) {
|
||||||
plus.nativeUI.showWaiting(`正在下载 ${pct}%`);
|
lastProgress = pct;
|
||||||
|
uni.showToast({
|
||||||
|
title: `新版本下载中 ${pct}%`,
|
||||||
|
icon: "none",
|
||||||
|
position: "top",
|
||||||
|
duration: 1200,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -51,6 +51,7 @@ import { getNotifications, markNotificationRead } from "../../api/notification";
|
|||||||
const TYPE_CONFIG = {
|
const TYPE_CONFIG = {
|
||||||
TRANSFER: { icon: "🟢", title: "新任务派发" },
|
TRANSFER: { icon: "🟢", title: "新任务派发" },
|
||||||
REJECT: { icon: "🔴", title: "品质驳回提醒" },
|
REJECT: { icon: "🔴", title: "品质驳回提醒" },
|
||||||
|
COMMENT: { icon: "💬", title: "收到新留言" },
|
||||||
};
|
};
|
||||||
|
|
||||||
const notifications = ref([]);
|
const notifications = ref([]);
|
||||||
|
|||||||
Reference in New Issue
Block a user