diff --git a/backend/my_work/routers/apiWorkOrder.go b/backend/my_work/routers/apiWorkOrder.go index 3513e9b..049b58e 100644 --- a/backend/my_work/routers/apiWorkOrder.go +++ b/backend/my_work/routers/apiWorkOrder.go @@ -400,10 +400,13 @@ func ApiWorkOrder(r *gin.RouterGroup) { } canModify := canModifyWorkOrder(user.ID, order.UserID) + // 所有登录用户都可以提交进度 + canCommit := true ReturnJson(ctx, "apiOK", gin.H{ "order": order, "canModify": canModify, + "canCommit": canCommit, "photos": files, "commits": commitsWithPhotos, }) @@ -457,11 +460,6 @@ func ApiWorkOrder(r *gin.RouterGroup) { return } - if !canModifyWorkOrder(user.ID, order.UserID) { - ReturnJson(ctx, "no_permission", nil) - return - } - oldStatus := order.CurrentStatus models.DB.Model(&order).Update("current_status", from.Status) diff --git a/frontend/ops_vue_js/src/stores/users.js b/frontend/ops_vue_js/src/stores/users.js index 0efaf48..988d1a9 100644 --- a/frontend/ops_vue_js/src/stores/users.js +++ b/frontend/ops_vue_js/src/stores/users.js @@ -5,6 +5,8 @@ import { ref } from 'vue' import { usersApi } from '@/api/users'; const usersInfo = ref([]); +// 正在请求中的 promiseMap,同一 userID 只发一次请求 +const inflightRequests = new Map(); export const useUsersStore = defineStore('users', () => { @@ -13,16 +15,33 @@ export const useUsersStore = defineStore('users', () => { } function fetchUser(userID) { - // 缓存命中则不再请求(依赖 usersInfo 的响应式) + // 已缓存则直接返回 if (getUserFromUserID(userID)) return - usersApi.getUserInfoFromUserID(userID).then((r) => { + + // 同一请求已在飞中,等待它完成后再更新缓存引用 + if (inflightRequests.has(userID)) return + + // 立即占位:同步标记为"请求中",同一帧内后续调用能命中 + const placeholder = { UserID: userID, _loading: true } + usersInfo.value.push(placeholder) + + const promise = usersApi.getUserInfoFromUserID(userID).then((r) => { if (r.errCode == 0 && r.raw.err_code == 0 && r.raw.return?.userinfo) { - // 防止并发写入重复数据 - if (!usersInfo.value.find(item => item.UserID === userID)) { - usersInfo.value.push(r.raw.return.userinfo) + const info = r.raw.return.userinfo + // 替换占位对象为真实数据 + const idx = usersInfo.value.findIndex(item => item.UserID === userID) + if (idx !== -1) { + usersInfo.value.splice(idx, 1, info) } + } else { + // 请求失败,移除占位 + usersInfo.value = usersInfo.value.filter(item => item.UserID !== userID) } + }).finally(() => { + inflightRequests.delete(userID) }) + + inflightRequests.set(userID, promise) } function getUsernameFromUserID(userID) { diff --git a/frontend/ops_vue_js/src/views/work_order/ShowWorkOrder.vue b/frontend/ops_vue_js/src/views/work_order/ShowWorkOrder.vue index 1f1d6f1..81ad0e4 100644 --- a/frontend/ops_vue_js/src/views/work_order/ShowWorkOrder.vue +++ b/frontend/ops_vue_js/src/views/work_order/ShowWorkOrder.vue @@ -33,6 +33,7 @@ const order = ref(null) const photos = ref([]) const commits = ref([]) const canModify = ref(false) +const canCommit = ref(false) const loading = ref(true) const notFound = ref(false) @@ -117,6 +118,7 @@ async function fetchOrder() { if (errCode === 0 && data) { order.value = data.order ?? null canModify.value = data.canModify ?? false + canCommit.value = data.canCommit ?? false photos.value = data.photos ?? [] commits.value = data.commits ?? [] // 初始化进度提交状态为当前状态 @@ -376,9 +378,9 @@ onUnmounted(() => { {{ formatDate(order?.CreatedAt) }} - +