diff --git a/common/utils/common.js b/common/utils/common.js index c0ac215..8217e6c 100644 --- a/common/utils/common.js +++ b/common/utils/common.js @@ -102,6 +102,28 @@ export const buzStatusMap = { } /** + * 工作流节点动作按钮颜色(与统一动作弹窗保持一致) + * @param {string} code - 动作编码,如 ASSIGN/REJECT/RETURN_PREV + */ +export const getActionButtonType = (code) => { + switch (code) { + case 'APPROVE': + case 'HANDLE': + case 'COMPLETE': + return 'success' + case 'REJECT': + return 'error' + case 'RETURN': + case 'RETURN_PREV': + return 'warning' + case 'WITHDRAW': + return 'info' + default: + return 'primary' + } +} + +/** * 计算两个时间的时间差,返回格式化字符串(天/小时/分钟/秒,按需显示,无无效单位) * @param {string | Date | number} startTime - 开始时间(时间字符串/Date对象/10位/13位时间戳) * @param {string | Date | number} endTime - 结束时间(时间字符串/Date对象/10位/13位时间戳) diff --git a/components/unified-task-actions/unified-task-actions.vue b/components/unified-task-actions/unified-task-actions.vue index 60e2194..37ae527 100644 --- a/components/unified-task-actions/unified-task-actions.vue +++ b/components/unified-task-actions/unified-task-actions.vue @@ -175,7 +175,7 @@ const getButtonType = (code) => { case 'COMPLETE': return 'success' case 'REJECT': - return 'danger' + return 'error' case 'RETURN': case 'RETURN_PREV': return 'warning' diff --git a/pages-sub/daily/maintain-manage/type-list-page.vue b/pages-sub/daily/maintain-manage/type-list-page.vue index 88c20bb..cb3dba2 100644 --- a/pages-sub/daily/maintain-manage/type-list-page.vue +++ b/pages-sub/daily/maintain-manage/type-list-page.vue @@ -33,8 +33,8 @@ 有效期:{{ timeFormat(item.beginTime, 'yyyy-mm-dd') }}—{{ timeFormat(item.endTime, 'yyyy-mm-dd') }} - - + 结束任务 @@ -255,18 +255,18 @@ const handleEndTaskModalCancel = () => { // 确认结束任务,真正调用接口【新增】 const confirmEndTask = async () => { const item = currentEndTaskItem.value - // draftCommitId 由明细列表接口回填(commit_state=1),按钮只在有值时渲染 - if (!item || !item.draftCommitId) return + // commitId 由明细列表接口回填(commit_state=1),按钮只在有值时渲染 + if (!item || !item.commitId) return endTaskModalShow.value = false uni.showLoading({ title: '提交中...', mask: true }) try { // 后端 /finish 只认 commitId,且要求本次养护至少有一条有效子上报 - await finishPlan({ commitId: item.draftCommitId }) + await finishPlan({ commitId: item.commitId }) // 先关 loading 再弹提示:微信端 showLoading/showToast 共用同一个 toast,顺序反了会把成功提示顶掉 uni.hideLoading() uni.showToast({ title: '结束任务成功', icon: 'success' }) - // 操作成功,重新加载数据,刷新列表(draftCommitId 随之清空,按钮消失) + // 操作成功,重新加载数据,刷新列表(commitId 随之清空,按钮消失) await loadData() pagingRef.value?.reload() } catch (err) { diff --git a/pages-sub/problem/ai-manage/index.vue b/pages-sub/problem/ai-manage/index.vue index 9aede49..9acad73 100644 --- a/pages-sub/problem/ai-manage/index.vue +++ b/pages-sub/problem/ai-manage/index.vue @@ -94,16 +94,25 @@ 提交时间: {{ timeFormat(item.createTime, 'yyyy-mm-dd hh:MM:ss') }} - - - - 回退 - - {{ getProcessButtonText(item) }} - - - 详情 + + + + + @@ -267,7 +276,7 @@ import { } from '@/api/regional-order-manage/regional-order-manage' import { getTaskActions } from '@/api/work-order-manage/work-order-manage' import { useUserStore } from '@/pinia/user'; -import { nextStepMap, buzStatusMap } from '@/common/utils/common' +import { nextStepMap, buzStatusMap, getActionButtonType } from '@/common/utils/common' import { useUploadImgs } from '@/common/utils/useUploadImgs' // ========== 全局实例 & 常量 ========== @@ -497,14 +506,18 @@ const getProcessButtonText = (item) => { return nextStepMap[item.taskKey]?.btnText || '处理' } -/** 待办-处理工单:已配置统一动作时走新逻辑,否则回退原有处理 */ -const handleUnifiedProcess = async (item) => { +/** 是否已配置统一动作(配置后按配置逐个渲染动作按钮) */ +const hasConfiguredActions = (item) => + Array.isArray(item?.configuredActions) && item.configuredActions.length > 0 + +/** 待办-处理工单:已配置统一动作时直接执行点击的配置动作,否则回退原有处理 */ +const handleUnifiedProcess = async (item, action = null) => { const actions = Array.isArray(item?.configuredActions) ? item.configuredActions : await queryUnifiedActions(item) if (actions) { - // 主按钮文案就是第一个动作,直接执行该动作,不再弹「请选择操作」让用户二次选择 - unifiedActionsRef.value?.open(item, actions.slice(0, 1)) + // 传入的动作即用户点击的配置按钮,直接执行该动作,不再弹「请选择操作」二次选择 + unifiedActionsRef.value?.open(item, [action || actions[0]]) return } handleProcess(item) @@ -730,8 +743,44 @@ onShow(() => { box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04); } -.u-body-item-btn-wrap :deep(.u-button--large){ - height: 28px; +// 卡片操作按钮:自动换行、右对齐,动作多时每行 3~4 个,不再整行铺满 +.task-btn-row { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + margin-bottom: -10rpx; +} + +.task-btn { + box-sizing: border-box; + height: 56rpx; + line-height: 56rpx; + padding: 0 24rpx; + margin: 0 0 10rpx 12rpx; + border-radius: 8rpx; + font-size: 24rpx; + color: #fff; + white-space: nowrap; +} + +.task-btn--primary { + background-color: #3c9cff; +} + +.task-btn--success { + background-color: #5ac725; +} + +.task-btn--warning { + background-color: #f9ae3d; +} + +.task-btn--error { + background-color: #f56c6c; +} + +.task-btn--info { + background-color: #909399; } diff --git a/pages-sub/problem/regional-order-manage/index.vue b/pages-sub/problem/regional-order-manage/index.vue index 0167441..bf3f2bc 100644 --- a/pages-sub/problem/regional-order-manage/index.vue +++ b/pages-sub/problem/regional-order-manage/index.vue @@ -106,12 +106,27 @@ {{ item.createTime ? timeFormat(item.createTime, 'yyyy-mm-dd hh:MM:ss') : '-' }} - - - 回退 - 重新提交 - {{ getProcessButtonText(item) }} - 详情 + + + + + @@ -226,7 +241,7 @@ import { } from '@/api/regional-order-manage/regional-order-manage' import { getTaskActions } from '@/api/work-order-manage/work-order-manage' import { useUserStore } from '@/pinia/user'; -import { nextStepMap, buzStatusMap } from '@/common/utils/common' +import { nextStepMap, buzStatusMap, getActionButtonType } from '@/common/utils/common' import { useUploadImgs } from '@/common/utils/useUploadImgs' // ========== 全局实例 & 常量 ========== @@ -472,14 +487,18 @@ const getProcessButtonText = (item) => { return nextStepMap[item.taskKey]?.btnText } -/** 待办-处理工单:已配置统一动作时走新逻辑,否则回退原有处理 */ -const handleUnifiedProcess = async (item) => { +/** 是否已配置统一动作(配置后按配置逐个渲染动作按钮) */ +const hasConfiguredActions = (item) => + Array.isArray(item?.configuredActions) && item.configuredActions.length > 0 + +/** 待办-处理工单:已配置统一动作时直接执行点击的配置动作,否则回退原有处理 */ +const handleUnifiedProcess = async (item, action = null) => { const actions = Array.isArray(item?.configuredActions) ? item.configuredActions : await queryUnifiedActions(item) if (actions) { - // 主按钮文案就是第一个动作,直接执行该动作,不再弹「请选择操作」让用户二次选择 - unifiedActionsRef.value?.open(item, actions.slice(0, 1)) + // 传入的动作即用户点击的配置按钮,直接执行该动作,不再弹「请选择操作」二次选择 + unifiedActionsRef.value?.open(item, [action || actions[0]]) return } handleProcess(item) @@ -720,8 +739,44 @@ onLoad(() => { box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04); } -.u-body-item-btn-wrap :deep(.u-button--large){ - height: 28px; +// 卡片操作按钮:自动换行、右对齐,动作多时每行 3~4 个,不再整行铺满 +.task-btn-row { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + margin-bottom: -10rpx; +} + +.task-btn { + box-sizing: border-box; + height: 56rpx; + line-height: 56rpx; + padding: 0 24rpx; + margin: 0 0 10rpx 12rpx; + border-radius: 8rpx; + font-size: 24rpx; + color: #fff; + white-space: nowrap; +} + +.task-btn--primary { + background-color: #3c9cff; +} + +.task-btn--success { + background-color: #5ac725; +} + +.task-btn--warning { + background-color: #f9ae3d; +} + +.task-btn--error { + background-color: #f56c6c; +} + +.task-btn--info { + background-color: #909399; } diff --git a/pages-sub/problem/regional-order-manage/list-detail.vue b/pages-sub/problem/regional-order-manage/list-detail.vue index 8920549..36fbcd9 100644 --- a/pages-sub/problem/regional-order-manage/list-detail.vue +++ b/pages-sub/problem/regional-order-manage/list-detail.vue @@ -8,7 +8,7 @@ color="#3c9cff" > - + - - - 回退 - 重新提交 - - {{ processButtonText }} - + + + + {{ action.name }} + + + + 回退 + 重新提交 + {{ processButtonText }} @@ -335,7 +337,7 @@ import { timeFormat } from '@/uni_modules/uview-plus' import { getApprovalDetail,workOrderDetailByID } from '@/api/regional-order-manage/regional-order-manage' import { getTaskActions } from '@/api/work-order-manage/work-order-manage' -import { nextStepMap, calculateFormatTimeDiff } from '@/common/utils/common' +import { nextStepMap, calculateFormatTimeDiff, getActionButtonType } from '@/common/utils/common' import { useUploadImgs } from '@/common/utils/useUploadImgs' import { useUserStore } from '@/pinia/user' @@ -517,6 +519,21 @@ const showRejectButton = computed(() => { return !!nextStepMap[orderDetail.value.taskKey]?.backShow }) +/** 是否已配置统一动作(配置后按配置逐个渲染动作按钮) */ +const hasConfiguredActions = computed(() => + Array.isArray(configuredActions.value) && configuredActions.value.length > 0) + +/** 底部操作栏行数:详情内容据此预留底部间距,避免按钮遮挡内容 */ +const actionBarRows = computed(() => { + if (hasConfiguredActions.value) { + return Math.ceil(configuredActions.value.length / 3) + } + let rows = 1 + if (showRejectButton.value) rows++ + if (nextStepMap[orderDetail.value.taskKey]?.renewShow) rows++ + return rows +}) + /** 主按钮文案:已配置统一动作时取配置的动作名称,未配置时沿用原有节点规则 */ const processButtonText = computed(() => { const actions = configuredActions.value @@ -529,14 +546,14 @@ const processButtonText = computed(() => { /** 统一动作弹窗 */ const unifiedActionsRef = ref(null) -/** 处理:已配置统一动作时走统一接口,否则回退原有处理 */ -const handleUnifiedProcess = async (item: any) => { +/** 处理:已配置统一动作时直接执行点击的配置动作,否则回退原有处理 */ +const handleUnifiedProcess = async (item: any, action: any = null) => { const actions = Array.isArray(configuredActions.value) ? configuredActions.value : await queryUnifiedActions(item?.taskId) if (actions) { - // 主按钮文案就是第一个动作,直接执行该动作,不再弹「请选择操作」让用户二次选择 - unifiedActionsRef.value?.open(item, actions.slice(0, 1)) + // 传入的动作即用户点击的配置按钮,直接执行该动作,不再弹「请选择操作」二次选择 + unifiedActionsRef.value?.open(item, [action || actions[0]]) return } handleProcess(item) @@ -1001,4 +1018,74 @@ onLoad((options: any) => { width: 70px !important; height: 70px !important; } + +// 底部动作按钮:动作多时自动换行 +// 底部操作栏:白底 + 顶部投影,按钮每行最多 3 个,避免多动作时整屏遮挡工单详情 +.order-action-bar { + background-color: #fff; + box-shadow: 0 -2rpx 12rpx rgba(0, 0, 0, 0.06); + padding: 10rpx 14rpx; + padding-bottom: calc(10rpx + constant(safe-area-inset-bottom)); + padding-bottom: calc(10rpx + env(safe-area-inset-bottom)); +} + +.order-action-row { + display: flex; + flex-wrap: wrap; + margin: -6rpx; +} + +.order-action-btn { + box-sizing: border-box; + width: calc((100% - 36rpx) / 3); + height: 68rpx; + line-height: 68rpx; + margin: 6rpx; + padding: 0 8rpx; + border-radius: 8rpx; + font-size: 26rpx; + text-align: center; + color: #fff; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +// 未配置统一动作时按钮整行展示,保持原有观感 +.order-action-row--single .order-action-btn { + width: 100%; +} + +.order-action-btn--primary { + background-color: #3c9cff; +} + +.order-action-btn--success { + background-color: #5ac725; +} + +.order-action-btn--warning { + background-color: #f9ae3d; +} + +.order-action-btn--error { + background-color: #f56c6c; +} + +.order-action-btn--info { + background-color: #909399; +} + +// 按操作栏行数给内容预留底部间距 +.main-content.pb-rows-1 { + padding-bottom: 190rpx; +} + +.main-content.pb-rows-2 { + padding-bottom: 290rpx; +} + +.main-content.pb-rows-3 { + padding-bottom: 390rpx; +} \ No newline at end of file diff --git a/pages-sub/problem/regional-order-manage/order-detail.vue b/pages-sub/problem/regional-order-manage/order-detail.vue index ef94b08..81348e3 100644 --- a/pages-sub/problem/regional-order-manage/order-detail.vue +++ b/pages-sub/problem/regional-order-manage/order-detail.vue @@ -9,7 +9,7 @@ > - + - - - 回退 - - - 重新提交 - - - {{ - processButtonText - }} - - + + + + {{ action.name }} + + + + 回退 + 重新提交 + {{ processButtonText }} @@ -377,7 +381,7 @@ import { dcyUniversalApproval, aiUniversalApproval } from '@/api/regional-order-manage/regional-order-manage'; -import {nextStepMap, buzStatusMap, calculateFormatTimeDiff} from '@/common/utils/common' +import {nextStepMap, buzStatusMap, calculateFormatTimeDiff, getActionButtonType} from '@/common/utils/common' import {getTaskActions} from '@/api/work-order-manage/work-order-manage'; import {useUploadImgs} from '@/common/utils/useUploadImgs' import { useUserStore } from '@/pinia/user'; @@ -585,6 +589,21 @@ const showRejectButton = computed(() => { return !!nextStepMap[orderDetail.value.taskKey]?.backShow }) +/** 是否已配置统一动作(配置后按配置逐个渲染动作按钮) */ +const hasConfiguredActions = computed(() => + Array.isArray(configuredActions.value) && configuredActions.value.length > 0) + +/** 底部操作栏行数:详情内容据此预留底部间距,避免按钮遮挡内容 */ +const actionBarRows = computed(() => { + if (hasConfiguredActions.value) { + return Math.ceil(configuredActions.value.length / 3) + } + let rows = 1 + if (showRejectButton.value) rows++ + if (nextStepMap[orderDetail.value.taskKey]?.renewShow) rows++ + return rows +}) + /** 主按钮文案:已配置统一动作时取配置的动作名称,未配置时沿用原有节点规则 */ const processButtonText = computed(() => { const actions = configuredActions.value @@ -597,14 +616,14 @@ const processButtonText = computed(() => { /** 统一动作弹窗 */ const unifiedActionsRef = ref(null) -/** 处理:已配置统一动作时走统一接口,否则回退原有处理 */ -const handleUnifiedProcess = async (item: any) => { +/** 处理:已配置统一动作时直接执行点击的配置动作,否则回退原有处理 */ +const handleUnifiedProcess = async (item: any, action: any = null) => { const actions = Array.isArray(configuredActions.value) ? configuredActions.value : await queryUnifiedActions(item?.taskId) if (actions) { - // 主按钮文案就是第一个动作,直接执行该动作,不再弹「请选择操作」让用户二次选择 - unifiedActionsRef.value?.open(item, actions.slice(0, 1)) + // 传入的动作即用户点击的配置按钮,直接执行该动作,不再弹「请选择操作」二次选择 + unifiedActionsRef.value?.open(item, [action || actions[0]]) return } handleProcess(item) @@ -1146,4 +1165,74 @@ onShow(() => {}); width: 70px !important; height: 70px !important; } + +// 底部动作按钮:动作多时自动换行 +// 底部操作栏:白底 + 顶部投影,按钮每行最多 3 个,避免多动作时整屏遮挡工单详情 +.order-action-bar { + background-color: #fff; + box-shadow: 0 -2rpx 12rpx rgba(0, 0, 0, 0.06); + padding: 10rpx 14rpx; + padding-bottom: calc(10rpx + constant(safe-area-inset-bottom)); + padding-bottom: calc(10rpx + env(safe-area-inset-bottom)); +} + +.order-action-row { + display: flex; + flex-wrap: wrap; + margin: -6rpx; +} + +.order-action-btn { + box-sizing: border-box; + width: calc((100% - 36rpx) / 3); + height: 68rpx; + line-height: 68rpx; + margin: 6rpx; + padding: 0 8rpx; + border-radius: 8rpx; + font-size: 26rpx; + text-align: center; + color: #fff; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +// 未配置统一动作时按钮整行展示,保持原有观感 +.order-action-row--single .order-action-btn { + width: 100%; +} + +.order-action-btn--primary { + background-color: #3c9cff; +} + +.order-action-btn--success { + background-color: #5ac725; +} + +.order-action-btn--warning { + background-color: #f9ae3d; +} + +.order-action-btn--error { + background-color: #f56c6c; +} + +.order-action-btn--info { + background-color: #909399; +} + +// 按操作栏行数给内容预留底部间距 +.main-content.pb-rows-1 { + padding-bottom: 190rpx; +} + +.main-content.pb-rows-2 { + padding-bottom: 290rpx; +} + +.main-content.pb-rows-3 { + padding-bottom: 390rpx; +} \ No newline at end of file diff --git a/pages-sub/problem/work-order-manage/index.vue b/pages-sub/problem/work-order-manage/index.vue index c563855..da4909c 100644 --- a/pages-sub/problem/work-order-manage/index.vue +++ b/pages-sub/problem/work-order-manage/index.vue @@ -101,20 +101,27 @@ {{ timeFormat(item.createTime, 'yyyy-mm-dd hh:MM:ss') }} - - 回退 - - - 重新提交 - - - {{ - getProcessButtonText(item) - }} - - 详情 + + + + + @@ -291,7 +298,7 @@ import { } from '@/api/work-order-manage/work-order-manage' // 从用户store获取角色信息 import { useUserStore } from '@/pinia/user'; -import { nextStepMap, buzStatusMap } from '@/common/utils/common' +import { nextStepMap, buzStatusMap, getActionButtonType } from '@/common/utils/common' // 引入图片上传组合式函数(与参考页面一致) import { useUploadImgs } from '@/common/utils/useUploadImgs' @@ -539,14 +546,18 @@ const getProcessButtonText = (item) => { return nextStepMap[item.taskKey]?.btnText } -/** 待办-处理工单:已配置统一动作时走新逻辑,否则回退原有处理 */ -const handleUnifiedProcess = async (item) => { +/** 是否已配置统一动作(配置后按配置逐个渲染动作按钮) */ +const hasConfiguredActions = (item) => + Array.isArray(item?.configuredActions) && item.configuredActions.length > 0 + +/** 待办-处理工单:已配置统一动作时直接执行点击的配置动作,否则回退原有处理 */ +const handleUnifiedProcess = async (item, action = null) => { const actions = Array.isArray(item?.configuredActions) ? item.configuredActions : await queryUnifiedActions(item) if (actions) { - // 主按钮文案就是第一个动作,直接执行该动作,不再弹「请选择操作」让用户二次选择 - unifiedActionsRef.value?.open(item, actions.slice(0, 1)) + // 传入的动作即用户点击的配置按钮,直接执行该动作,不再弹「请选择操作」二次选择 + unifiedActionsRef.value?.open(item, [action || actions[0]]) return } handleProcess(item) @@ -842,9 +853,44 @@ onUnload(() => { border-radius: 12rpx; box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04); } -.u-body-item-btn-wrap :deep(.u-button--large){ +// 卡片操作按钮:自动换行、右对齐,动作多时每行 3~4 个,不再整行铺满 +.task-btn-row { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + margin-bottom: -10rpx; +} + +.task-btn { + box-sizing: border-box; + height: 56rpx; + line-height: 56rpx; + padding: 0 24rpx; + margin: 0 0 10rpx 12rpx; + border-radius: 8rpx; + font-size: 24rpx; + color: #fff; + white-space: nowrap; +} + +.task-btn--primary { + background-color: #3c9cff; +} + +.task-btn--success { + background-color: #5ac725; +} + +.task-btn--warning { + background-color: #f9ae3d; +} + +.task-btn--error { + background-color: #f56c6c; +} - height: 28px; +.task-btn--info { + background-color: #909399; } diff --git a/pages-sub/problem/work-order-manage/order-detail.vue b/pages-sub/problem/work-order-manage/order-detail.vue index a9b1b3d..361e2e7 100644 --- a/pages-sub/problem/work-order-manage/order-detail.vue +++ b/pages-sub/problem/work-order-manage/order-detail.vue @@ -9,7 +9,7 @@ > - + - - - 回退 - - - 重新提交 - - - {{ - processButtonText - }} - + + + + {{ action.name }} + + + + 回退 + 重新提交 + {{ processButtonText }} @@ -376,7 +381,7 @@ import { universalApproval, getTaskActions } from '@/api/work-order-manage/work-order-manage'; -import {nextStepMap, buzStatusMap, calculateFormatTimeDiff} from '@/common/utils/common' +import {nextStepMap, buzStatusMap, calculateFormatTimeDiff, getActionButtonType} from '@/common/utils/common' // 引入图片上传组合式函数 import {useUploadImgs} from '@/common/utils/useUploadImgs' @@ -722,6 +727,21 @@ const showRejectButton = computed(() => { return !!nextStepMap[orderDetail.value.taskKey]?.backShow }) +/** 是否已配置统一动作(配置后按配置逐个渲染动作按钮) */ +const hasConfiguredActions = computed(() => + Array.isArray(configuredActions.value) && configuredActions.value.length > 0) + +/** 底部操作栏行数:详情内容据此预留底部间距,避免按钮遮挡内容 */ +const actionBarRows = computed(() => { + if (hasConfiguredActions.value) { + return Math.ceil(configuredActions.value.length / 3) + } + let rows = 1 + if (showRejectButton.value) rows++ + if (nextStepMap[orderDetail.value.taskKey]?.renewShow) rows++ + return rows +}) + /** 主按钮文案:已配置统一动作时取配置的动作名称,未配置时沿用原有节点规则 */ const processButtonText = computed(() => { const actions = configuredActions.value @@ -745,14 +765,14 @@ const queryUnifiedActions = async (item: any) => { return null } -/** 处理工单:已配置统一动作时走新逻辑,否则回退原有处理 */ -const handleUnifiedProcess = async (item: any) => { +/** 处理工单:已配置统一动作时直接执行点击的配置动作,否则回退原有处理 */ +const handleUnifiedProcess = async (item: any, action: any = null) => { const actions = Array.isArray(configuredActions.value) ? configuredActions.value : await queryUnifiedActions(item) if (actions) { - // 主按钮文案就是第一个动作,直接执行该动作,不再弹「请选择操作」让用户二次选择 - unifiedActionsRef.value?.open(item, actions.slice(0, 1)) + // 传入的动作即用户点击的配置按钮,直接执行该动作,不再弹「请选择操作」二次选择 + unifiedActionsRef.value?.open(item, [action || actions[0]]) return } handleProcess(item) @@ -1151,4 +1171,74 @@ onShow(() => { width: 70px !important; // 与多图保持一致 height: 70px !important; } + +// 底部动作按钮:动作多时自动换行 +// 底部操作栏:白底 + 顶部投影,按钮每行最多 3 个,避免多动作时整屏遮挡工单详情 +.order-action-bar { + background-color: #fff; + box-shadow: 0 -2rpx 12rpx rgba(0, 0, 0, 0.06); + padding: 10rpx 14rpx; + padding-bottom: calc(10rpx + constant(safe-area-inset-bottom)); + padding-bottom: calc(10rpx + env(safe-area-inset-bottom)); +} + +.order-action-row { + display: flex; + flex-wrap: wrap; + margin: -6rpx; +} + +.order-action-btn { + box-sizing: border-box; + width: calc((100% - 36rpx) / 3); + height: 68rpx; + line-height: 68rpx; + margin: 6rpx; + padding: 0 8rpx; + border-radius: 8rpx; + font-size: 26rpx; + text-align: center; + color: #fff; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +// 未配置统一动作时按钮整行展示,保持原有观感 +.order-action-row--single .order-action-btn { + width: 100%; +} + +.order-action-btn--primary { + background-color: #3c9cff; +} + +.order-action-btn--success { + background-color: #5ac725; +} + +.order-action-btn--warning { + background-color: #f9ae3d; +} + +.order-action-btn--error { + background-color: #f56c6c; +} + +.order-action-btn--info { + background-color: #909399; +} + +// 按操作栏行数给内容预留底部间距 +.main-content.pb-rows-1 { + padding-bottom: 190rpx; +} + +.main-content.pb-rows-2 { + padding-bottom: 290rpx; +} + +.main-content.pb-rows-3 { + padding-bottom: 390rpx; +} \ No newline at end of file