|
@@ -9,7 +9,7 @@ import { useUserStore } from '@/stores/user'
|
|
|
import {
|
|
import {
|
|
|
acceptWorkOrder, applyDelayWorkOrder, auditDelayWorkOrder, cancelWorkOrder, dispatchWorkOrder,
|
|
acceptWorkOrder, applyDelayWorkOrder, auditDelayWorkOrder, cancelWorkOrder, dispatchWorkOrder,
|
|
|
getAssignableUsers, getMobileWorkOrderDetail, processWorkOrder, resolveAttachmentUrl, splitAttachments,
|
|
getAssignableUsers, getMobileWorkOrderDetail, processWorkOrder, resolveAttachmentUrl, splitAttachments,
|
|
|
- submitVerifyWorkOrder, uploadWorkOrderFile, verifyWorkOrder, workOrderLevelText, workOrderStatusText,
|
|
|
|
|
|
|
+ submitVerifyWorkOrder, uploadWorkOrderFiles, verifyWorkOrder, workOrderLevelText, workOrderStatusText,
|
|
|
type AssignableUser, type WorkOrder, type WorkOrderDetail, type WorkOrderLog,
|
|
type AssignableUser, type WorkOrder, type WorkOrderDetail, type WorkOrderLog,
|
|
|
} from '@/services/workorders'
|
|
} from '@/services/workorders'
|
|
|
|
|
|
|
@@ -39,8 +39,8 @@ const statusLabel = computed(() => order.value?.orderStatus === 3 && order.value
|
|
|
const statusTone = computed(() => order.value?.orderStatus === 0 || order.value?.delayApplyStatus === 1 ? 'orange' : [3, 6].includes(Number(order.value?.orderStatus)) ? 'purple' : [4, 5].includes(Number(order.value?.orderStatus)) ? 'green' : order.value?.orderStatus === 7 ? 'gray' : '')
|
|
const statusTone = computed(() => order.value?.orderStatus === 0 || order.value?.delayApplyStatus === 1 ? 'orange' : [3, 6].includes(Number(order.value?.orderStatus)) ? 'purple' : [4, 5].includes(Number(order.value?.orderStatus)) ? 'green' : order.value?.orderStatus === 7 ? 'gray' : '')
|
|
|
const currentStep = computed(() => ({ 0: 2, 1: 3, 2: 4, 3: 4, 4: 5, 5: 6, 6: 4, 7: 4 }[Number(order.value?.orderStatus)] || 1))
|
|
const currentStep = computed(() => ({ 0: 2, 1: 3, 2: 4, 3: 4, 4: 5, 5: 6, 6: 4, 7: 4 }[Number(order.value?.orderStatus)] || 1))
|
|
|
const isTerminated = computed(() => order.value?.orderStatus === 7)
|
|
const isTerminated = computed(() => order.value?.orderStatus === 7)
|
|
|
-const beforeImages = computed(() => splitAttachments(order.value?.maintenanceBeforeImg).map(path => resolveAttachmentUrl(path, detail.value?.attachmentBaseUrl)))
|
|
|
|
|
-const afterImages = computed(() => splitAttachments(order.value?.maintenanceAfterImg).map(path => resolveAttachmentUrl(path, detail.value?.attachmentBaseUrl)))
|
|
|
|
|
|
|
+const beforeImages = computed(() => splitAttachments(order.value?.maintenanceBeforeImg).map(path => resolveAttachmentUrl(path)))
|
|
|
|
|
+const afterImages = computed(() => splitAttachments(order.value?.maintenanceAfterImg).map(path => resolveAttachmentUrl(path)))
|
|
|
|
|
|
|
|
const actions = computed(() => {
|
|
const actions = computed(() => {
|
|
|
const result: string[] = []
|
|
const result: string[] = []
|
|
@@ -110,7 +110,7 @@ async function submitted(action: string, payload: ActionPayload) {
|
|
|
submitting.value = true
|
|
submitting.value = true
|
|
|
uni.showLoading({ title: payload.files.length ? '上传并提交...' : '正在提交...' })
|
|
uni.showLoading({ title: payload.files.length ? '上传并提交...' : '正在提交...' })
|
|
|
try {
|
|
try {
|
|
|
- const paths = await Promise.all(payload.files.map(uploadWorkOrderFile))
|
|
|
|
|
|
|
+ const paths = await uploadWorkOrderFiles(payload.files)
|
|
|
const common = { content: payload.content || '', attachUrl: paths.join(',') }
|
|
const common = { content: payload.content || '', attachUrl: paths.join(',') }
|
|
|
if (action === '派单') await dispatchWorkOrder(orderId.value, { handlerId: payload.handlerId, verifyUser: payload.verifyUser, remarks: payload.remarks, planFinishTime: payload.planFinishTime })
|
|
if (action === '派单') await dispatchWorkOrder(orderId.value, { handlerId: payload.handlerId, verifyUser: payload.verifyUser, remarks: payload.remarks, planFinishTime: payload.planFinishTime })
|
|
|
else if (action === '核查接单') await acceptWorkOrder(orderId.value, common)
|
|
else if (action === '核查接单') await acceptWorkOrder(orderId.value, common)
|
|
@@ -168,7 +168,7 @@ function timeLabel(time?: string) { return time ? time.slice(11, 16) : '--:--' }
|
|
|
<view class="info-section"><view class="section-heading">附件</view><view class="attachments"><view><view class="attach-head"><text>维修前</text><text>{{ beforeImages.length }} 项</text></view><view class="photos"><image v-for="url in beforeImages" :key="url" :src="url" mode="aspectFill" @tap="preview(url,beforeImages)" /><text v-if="!beforeImages.length">暂无</text></view></view><view><view class="attach-head"><text>维修后</text><text>{{ afterImages.length }} 项</text></view><view class="photos"><image v-for="url in afterImages" :key="url" :src="url" mode="aspectFill" @tap="preview(url,afterImages)" /><text v-if="!afterImages.length">暂无</text></view></view></view></view>
|
|
<view class="info-section"><view class="section-heading">附件</view><view class="attachments"><view><view class="attach-head"><text>维修前</text><text>{{ beforeImages.length }} 项</text></view><view class="photos"><image v-for="url in beforeImages" :key="url" :src="url" mode="aspectFill" @tap="preview(url,beforeImages)" /><text v-if="!beforeImages.length">暂无</text></view></view><view><view class="attach-head"><text>维修后</text><text>{{ afterImages.length }} 项</text></view><view class="photos"><image v-for="url in afterImages" :key="url" :src="url" mode="aspectFill" @tap="preview(url,afterImages)" /><text v-if="!afterImages.length">暂无</text></view></view></view></view>
|
|
|
<view class="info-section"><view class="section-heading">延期申请</view><view v-if="order.delayApplyStatus" class="delay"><text class="status-pill" :class="order.delayApplyStatus === 2 ? 'green' : 'orange'">{{ ['','待延期审核','延期审核通过','延期审核驳回'][order.delayApplyStatus] }}</text><view><text>{{ order.delayedReason || '—' }}</text><text>延期截止:{{ order.delayedDeadline || '—' }}</text></view></view><view v-else class="empty">没有延期信息</view></view>
|
|
<view class="info-section"><view class="section-heading">延期申请</view><view v-if="order.delayApplyStatus" class="delay"><text class="status-pill" :class="order.delayApplyStatus === 2 ? 'green' : 'orange'">{{ ['','待延期审核','延期审核通过','延期审核驳回'][order.delayApplyStatus] }}</text><view><text>{{ order.delayedReason || '—' }}</text><text>延期截止:{{ order.delayedDeadline || '—' }}</text></view></view><view v-else class="empty">没有延期信息</view></view>
|
|
|
</view>
|
|
</view>
|
|
|
- <view v-else class="log-panel"><view class="log-tip">按时间倒序分组 · 滑动即可回溯</view><view v-if="!logGroups.length" class="empty">暂无处置记录</view><template v-for="group in logGroups" :key="group.day"><view class="log-day">{{ dayLabel(group.day) }}</view><view v-for="(log, index) in group.items" :key="log.logId" class="log-item" :class="{ 'last-log': index === group.items.length - 1 }"><text class="time">{{ timeLabel(log.operTime) }}</text><view><text class="log-title">{{ log.operUserName || '系统' }} · {{ log.operTypeDesc || '操作' }}</text><text>{{ log.operDesc || '—' }}</text><view v-if="log.attachList?.length" class="log-images"><image v-for="path in log.attachList" :key="path" :src="resolveAttachmentUrl(path,detail?.attachmentBaseUrl)" mode="aspectFill" @tap="preview(resolveAttachmentUrl(path,detail?.attachmentBaseUrl),log.attachList!.map(item=>resolveAttachmentUrl(item,detail?.attachmentBaseUrl)))" /></view></view></view></template></view>
|
|
|
|
|
|
|
+ <view v-else class="log-panel"><view class="log-tip">按时间倒序分组 · 滑动即可回溯</view><view v-if="!logGroups.length" class="empty">暂无处置记录</view><template v-for="group in logGroups" :key="group.day"><view class="log-day">{{ dayLabel(group.day) }}</view><view v-for="(log, index) in group.items" :key="log.logId" class="log-item" :class="{ 'last-log': index === group.items.length - 1 }"><text class="time">{{ timeLabel(log.operTime) }}</text><view><text class="log-title">{{ log.operUserName || '系统' }} · {{ log.operTypeDesc || '操作' }}</text><text>{{ log.operDesc || '—' }}</text><view v-if="log.attachList?.length" class="log-images"><image v-for="path in log.attachList" :key="path" :src="resolveAttachmentUrl(path)" mode="aspectFill" @tap="preview(resolveAttachmentUrl(path),log.attachList!.map(item=>resolveAttachmentUrl(item)))" /></view></view></view></template></view>
|
|
|
</view>
|
|
</view>
|
|
|
<view v-if="actions.length" class="bottom-actions"><button v-for="action in actions" :key="action" :class="action === '取消工单' ? 'danger' : action === actions[actions.length - 1] ? 'primary' : 'default'" @tap="openAction(action)">{{ action }}</button></view>
|
|
<view v-if="actions.length" class="bottom-actions"><button v-for="action in actions" :key="action" :class="action === '取消工单' ? 'danger' : action === actions[actions.length - 1] ? 'primary' : 'default'" @tap="openAction(action)">{{ action }}</button></view>
|
|
|
<ActionFormDrawer v-model="drawerOpen" :action="activeAction" domain="workorder" :handler-options="handlers" :reviewer-options="reviewers" :default-reviewer-id="currentUserId" :submitting="submitting" @submitted="submitted" />
|
|
<ActionFormDrawer v-model="drawerOpen" :action="activeAction" domain="workorder" :handler-options="handlers" :reviewer-options="reviewers" :default-reviewer-id="currentUserId" :submitting="submitting" @submitted="submitted" />
|