From 1d552a3bad95caae4af15322df28e6240b797693 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Thu, 13 Aug 2026 15:32:06 +0800
Subject: [PATCH] feat: app视频封面图
---
uniapps/work-app/src/subPackages/workDetail/index.vue | 918 ++++++++++++++++++++++++++++++++++++++++-----------------
1 files changed, 642 insertions(+), 276 deletions(-)
diff --git a/uniapps/work-app/src/subPackages/workDetail/index.vue b/uniapps/work-app/src/subPackages/workDetail/index.vue
index c61f9fc..dd1fa26 100644
--- a/uniapps/work-app/src/subPackages/workDetail/index.vue
+++ b/uniapps/work-app/src/subPackages/workDetail/index.vue
@@ -4,7 +4,7 @@
<!-- 自定义导航栏 -->
<u-navbar title="工单详情" :is-back="true" back-text="" :back-icon-size="40" @left-click="onBackClick">
<template #right>
- <div v-if="isH5" class="tapShare-icon"><img src="/static/images/work/share.svg" @click="onShareClick"/></div>
+ <div v-if="isH5" class="tapShare-icon"><img src="/static/images/work/share.svg" @click="onShareClick" /></div>
<div v-else class="share-btn" @click="onShareClick"></div>
</template>
</u-navbar>
@@ -24,182 +24,411 @@
></u-swiper>
</div>
</div>
- <!-- 工单内容 -->
- <div class="worderContainer">
- <div class="workOrderContent">
- <div class="workOrderTitle">工单内容</div>
- <div class="workOrderContainer">
- <div class="orderRow">
- <div class="rowTitle">工单编号</div>
- <div>{{ workDetailData.eventNum }}</div>
- </div>
- <div class="orderRow">
- <div class="rowTitle">工单处置人</div>
- <div>{{ workDetailData.disposeUserName }}</div>
- </div>
- <div class="orderRow">
- <div class="rowTitle">处置部门</div>
- <div>{{ workDetailData.disposeDeptName }}</div>
- </div>
- <div class="orderRow">
- <div class="rowTitle">拍摄时间</div>
- <div>{{ workDetailData.shootTime }}</div>
- </div>
- <div class="orderRow">
- <div class="rowTitle">分发人员</div>
- <div>{{ workDetailData.distributeUserName }}</div>
- </div>
- <div class="orderRow">
- <div class="rowTitle">分发部门</div>
- <div>{{ workDetailData.distributeDeptName }}</div>
- </div>
+ <!-- 工单内容 -->
+ <div class="worderContainer">
+ <div class="workOrderContent">
+ <div class="workOrderTitle">工单内容</div>
+ <div class="workOrderContainer">
+ <div class="orderRow">
+ <div class="rowTitle">工单名称</div>
+ <div>{{ workDetailData.eventName }}</div>
+ </div>
+ <div class="orderRow">
+ <div class="rowTitle">工单编号</div>
+ <div>{{ workDetailData.eventNum }}</div>
+ </div>
+ <div class="orderRow">
+ <div class="rowTitle">工单状态</div>
+ <!-- <template v-if="[1, 3].includes(workDetailData.eventStatus)">
+ <picker
+ mode="selector"
+ :range="statusOptions"
+ range-key="name"
+ :value="statusPickerIndex"
+ @change="onStatusChange"
+ class="status-picker"
+ >
+ <div class="picker-value">
+ {{ currentStatusLabel || '请选择' }}
+ <text class="picker-arrow">▼</text>
+ </div>
+ </picker>
+ </template> -->
+ <div>{{ getStatusLabel(workDetailData.eventStatus) }}</div>
+ </div>
+ <div class="orderRow">
+ <div class="rowTitle">工单处置人</div>
+ <div>{{ workDetailData.disposeUserName }}</div>
+ </div>
+ <div class="orderRow">
+ <div class="rowTitle">处置部门</div>
+ <div>{{ workDetailData.disposeDeptName }}</div>
+ </div>
+ <div class="orderRow">
+ <div class="rowTitle">拍摄时间</div>
+ <div>{{ workDetailData.shootTime }}</div>
+ </div>
+ <div class="orderRow">
+ <div class="rowTitle">分发人员</div>
+ <div>{{ workDetailData.distributeUserName }}</div>
+ </div>
+ <div class="orderRow">
+ <div class="rowTitle">分发部门</div>
+ <div>{{ workDetailData.distributeDeptName }}</div>
+ </div>
- <div class="orderRow">
- <div class="rowTitle">分发时间</div>
- <div>{{ workDetailData.distributeTime }}</div>
- </div>
- <div class="orderRow">
- <div class="rowTitle">工单位置</div>
- <div class="rowAddress" @click="jumpMap(workDetailData)">{{ workDetailData.eventLocation }}</div>
- </div>
- </div>
- </div>
- </div>
- <!-- 操作按钮 -->
- <div class="actionButton" >
- <div class="btngroups" v-if="workDetailData.eventStatus !== 3">
- <up-button type="primary" color="#AEAEAE" text="退回" @click="rejectTicket"></up-button>
- <up-button type="primary" color="#1D6FE9" text="确认" @click="confirmTheTicket"></up-button>
- </div>
- <div class="btngroups" v-if="workDetailData.eventStatus === 3">
- <up-button type="primary" color="#1D6FE9" text="已确认" @click="confirmedHandle"></up-button>
- </div>
- </div>
- <!-- 分享弹出层 -->
- <div v-if="showShareModal" class="share-modal-overlay" @click="onShareModalClose">
- <div class="share-modal-content" @click.stop>
- <div class="share-modal-header">
- <div class="share-modal-title">分享到</div>
- <div class="share-modal-close" @click="onShareModalClose">×</div>
- </div>
- <div class="share-modal-body">
- <div class="share-item" @click="shareToWechat">
- <div class="share-icon wechat"></div>
- <div class="share-name">微信好友</div>
- </div>
- <div class="share-item" @click="shareToMoments">
- <div class="share-icon moments"></div>
- <div class="share-name">朋友圈</div>
- </div>
- <div class="share-item" @click="copyLink">
- <div class="share-icon link"></div>
- <div class="share-name">复制链接</div>
- </div>
- </div>
- </div>
- </div>
- </div>
+ <div class="orderRow">
+ <div class="rowTitle">分发时间</div>
+ <div>{{ workDetailData.distributeTime }}</div>
+ </div>
+ <div class="orderRow">
+ <div class="rowTitle">工单位置</div>
+ <div class="" v-if="workDetailData.attachmentType == 3">
+ {{ workDetailData.areaCode }}
+ </div>
+ <div v-else class="rowAddress" @click="jumpMap(workDetailData)">
+ {{ workDetailData.eventLocation }}
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- 操作按钮 -->
+ <div class="actionButton">
+ <div class="btngroups" v-if="workDetailData.eventStatus === 0">
+ <up-button type="primary" color="#AEAEAE" text="退回" @click="rejectTicket"></up-button>
+ <up-button type="primary" color="#1D6FE9" text="确认" @click="confirmTheTicket"></up-button>
+ </div>
+ <div class="btngroups" v-if="workDetailData.eventStatus === 1">
+ <up-button type="primary" color="#1D6FE9" text="处置记录" @click="handlelogs"></up-button>
+ <up-button type="primary" color="#1D6FE9" text="上传处置" @click="uploadHandle"></up-button>
+ </div>
+ <div class="btngroups" v-if="workDetailData.eventStatus === 3">
+ <up-button type="primary" color="#1D6FE9" text="处置记录" @click="handlelogs"></up-button>
+ <up-button type="primary" color="#1D6FE9" text="继续上传处置" @click="uploadHandle"></up-button>
+ <up-button type="primary" color="#1D6FE9" text="完成" @click="confirmedHandle"></up-button>
+ </div>
+ <div class="btngroups" v-if="workDetailData.eventStatus === 4">
+ <up-button type="primary" color="#1D6FE9" text="处置记录" @click="handlelogs"></up-button>
+ </div>
+ </div>
+ </div>
+
+ <!-- 完成情况弹窗 -->
+ <view v-if="showCompleteModal" class="complete-modal-overlay" @click="closeCompleteModal">
+ <view class="complete-modal" @click.stop>
+ <view class="complete-modal-title">填写完成情况</view>
+ <view class="complete-input-wrapper">
+ <textarea
+ v-model="completeContent"
+ class="complete-input"
+ maxlength="200"
+ placeholder="请输入完成情况"
+ :show-confirm-bar="false"
+ />
+ <text class="complete-word-count">{{ completeContent.length }}/200</text>
+ </view>
+ <view class="complete-modal-actions">
+ <button class="complete-action-btn complete-cancel-btn" :disabled="completing" @click="closeCompleteModal">
+ 取消
+ </button>
+ <button class="complete-action-btn complete-confirm-btn" :disabled="completing" @click="submitComplete">
+ {{ completing ? '提交中...' : '确认' }}
+ </button>
+ </view>
+ </view>
+ </view>
+ <!-- 分享弹出层 -->
+ <div v-if="showShareModal" class="share-modal-overlay" @click="onShareModalClose">
+ <div class="share-modal-content" @click.stop>
+ <div class="share-modal-header">
+ <div class="share-modal-title">分享到</div>
+ <!-- <div class="share-modal-close" @click="onShareModalClose">×</div> -->
+ </div>
+ <div class="share-modal-body">
+ <!-- <div class="share-item" @click="shareToWechat">-->
+ <!-- <div class="share-icon wechat"></div>-->
+ <!-- <div class="share-name">微信好友</div>-->
+ <!-- </div>-->
+ <!-- <div class="share-item" @click="shareToMoments">-->
+ <!-- <div class="share-icon moments"></div>-->
+ <!-- <div class="share-name">朋友圈</div>-->
+ <!-- </div>-->
+ <div class="share-item" @click="copyLink">
+ <div class="share-icon link"></div>
+ <div class="share-name">复制链接</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
</template>
<script setup>
// import { getShowImg, getSmallImg } from '@/utils/util'
-import {getGddetailedData,backGdApi} from '/src/api/work/index.js'
+import { getGddetailedData, backGdApi, shareCacheApi, updateStatus, addDisposeRecord } from '/src/api/work/index.js'
import { getWebViewUrl } from '@/utils/index.js'
import WebViewPlus from '@/components/WebViewPlus.vue'
+import { onShow } from '@dcloudio/uni-app'
const eventNum = ref('')
// 工单内容
const workDetailData = ref({})
// 环境判断
const isH5 = ref(false)
-const sWebViewRef = ref(null);
-const viewUrl = ref("");
-onLoad(async options => {
- eventNum.value = options.id
- await getDataList(options.id)
- checkEnvironment()
- viewUrl.value = getWebViewUrl("/workDetail", { workDetailData: JSON.stringify(workDetailData.value) });
+const sWebViewRef = ref(null)
+const viewUrl = ref('')
+const showCompleteModal = ref(false)
+const completeContent = ref('')
+const completing = ref(false)
+const PREVIEW_IMG_CACHE_KEY_PREFIX = 'work-detail-ai-img-'
+
+// 状态选项列表
+const statusOptions = [
+ { name: '处置中', value: 1 },
+ { name: '已处置', value: 3 },
+ // { name: '已完成', value: 4 },
+]
+// 当前选中状态的索引
+const statusPickerIndex = computed(() => {
+ const status = workDetailData.value?.eventStatus
+ return statusOptions.findIndex(item => item.value === status)
})
-const getDataList = async val => {
- const params = {
- id: val,
- }
- const res = await getGddetailedData(params)
- const response = res.data.data
- workDetailData.value = response
+// 当前状态文本
+const currentStatusLabel = computed(() => {
+ const option = statusOptions.find(item => item.value === workDetailData.value?.eventStatus)
+ return option?.name || ''
+})
+
+// 页面加载时读取预览图缓存
+onLoad(async options => {
+ eventNum.value = options.id
+ const previewImgCacheKey = `${PREVIEW_IMG_CACHE_KEY_PREFIX}${options.id}`
+ const previewUrl = uni.getStorageSync(previewImgCacheKey)
+ uni.removeStorageSync(previewImgCacheKey)
+ await getDataList(options.id, previewUrl)
+ checkEnvironment()
+ viewUrl.value = getWebViewUrl('/workDetail', { workDetailData: JSON.stringify(workDetailData.value) })
+})
+
+// 页面显示时刷新工单详情
+onShow(() => {
+ getDataList(eventNum.value)
+})
+
+// 获取工单详情并保留预览原图
+const getDataList = async (val, previewUrl) => {
+ const params = {
+ id: val,
+ }
+ const res = await getGddetailedData(params)
+ const response = res.data.data
+ workDetailData.value = { ...response, previewUrl: previewUrl || workDetailData.value.previewUrl }
}
+
+// 获取状态文本
+const getStatusLabel = status => {
+ const map = {
+ 0: '待确认',
+ 1: '处置中',
+ 2: '已退回',
+ 3: '已处置',
+ 4: '已完成',
+ }
+ return map[status] || '未知'
+}
+
+// 切换状态
+const onStatusChange = e => {
+ const index = e.detail.value
+ const selectedOption = statusOptions[index]
+ if (!selectedOption) return
+
+ const id = workDetailData.value.id
+
+ if (workDetailData.value.eventStatus === 1 && selectedOption.value === 3) {
+ // 跳转上传处置页面
+ uni.navigateTo({
+ url: `/subPackages/workDetail/HandleWorking/index?id=${workDetailData.value.id}&eventStatus=${workDetailData.value.eventStatus}`,
+ })
+ }
+
+ if (workDetailData.value.eventStatus === 3 && selectedOption.value === 1) {
+ updateStatus({
+ eventId: workDetailData.value.id,
+ targetStatus: 1,
+ }).then(res => {
+ workDetailData.value.eventStatus = selectedOption.value
+ })
+ }
+
+ // console.log(selectedOption, '3333')
+ // backGdApi({ eventId: id, eventStatus: String(selectedOption.value) })
+ // .then(res => {
+ // uni.showToast({
+ // title: '状态更新成功',
+ // icon: 'success',
+ // duration: 1500,
+ // })
+ // workDetailData.value.eventStatus = selectedOption.value
+ // })
+ // .catch(() => {
+ // uni.showToast({
+ // title: '状态更新失败',
+ // icon: 'none',
+ // })
+ // })
+}
+
// 检查运行环境
const checkEnvironment = () => {
- const systemInfo = uni.getSystemInfoSync()
- // #ifdef APP-PLUS
- isH5.value = false
- // #endif
+ const systemInfo = uni.getSystemInfoSync()
+ // #ifdef APP-PLUS
+ isH5.value = false
+ // #endif
- // #ifdef H5
- isH5.value = true
- // #endif
+ // #ifdef H5
+ isH5.value = true
+ // #endif
- // console.log('当前环境:', isH5.value ? 'H5' : 'App')
+ // console.log('当前环境:', isH5.value ? 'H5' : 'App')
}
// 图片预览
const previewImage = index => {
- if (getImageList.value.length === 0) return
- const currentIndex = typeof index === 'number' ? index : 0
- uni.previewImage({
- urls: getImageList.value,
- current: currentIndex,
- })
+ if (getImageList.value.length === 0) return
+ const currentIndex = typeof index === 'number' ? index : 0
+ uni.previewImage({
+ urls: getImageList.value,
+ current: currentIndex,
+ })
}
+// 获取详情预览图片列表
const getImageList = computed(() => {
- const imageArr = []
- const detail = workDetailData.value
- if (detail.eventImageUrl) {
- const smallUrl = detail.eventImageUrl
- imageArr.push(smallUrl)
- }
-
- return imageArr
+ const imageArr = []
+ const detail = workDetailData.value
+ if (detail.eventImageUrl) {
+ imageArr.push(detail.previewUrl || detail.eventImageUrl)
+ }
+ return imageArr
})
// 跳转地图
const jumpMap = item => {
- // const contactStr = encodeURIComponent(JSON.stringify(item))
- const contactStr = JSON.stringify(item)
- uni.navigateTo({
- url: `/subPackages/workDetail/mapWork/index?eventNum=${contactStr}`,
- })
+ // const contactStr = encodeURIComponent(JSON.stringify(item))
+ const contactStr = JSON.stringify(item)
+ uni.navigateTo({
+ url: `/subPackages/workDetail/mapWork/index?eventNum=${contactStr}`,
+ })
}
// 退回
const rejectTicket = () => {
- const id = workDetailData.value.id
- backGdApi({eventId : id,eventStatus:'0'}).then(res => {
- uni.showToast({
- title: '退回成功',
- icon: 'success',
- duration: 1500
- })
- setTimeout(() => {
- uni.navigateBack()
- })
- })
-
+ // const id = workDetailData.value.id
+ // backGdApi({ eventId: id, eventStatus: '0' }).then(res => {
+ // uni.showToast({
+ // title: '退回成功',
+ // icon: 'success',
+ // duration: 1500,
+ // })
+ // setTimeout(() => {
+ // uni.navigateBack()
+ // })
+ // })
+ updateStatus({
+ eventId: workDetailData.value.id,
+ targetStatus: 2,
+ }).then(res => {
+ uni.showToast({
+ title: '退回成功',
+ icon: 'success',
+ duration: 1500,
+ })
+ setTimeout(() => {
+ uni.navigateBack()
+ })
+ })
}
// 确认工单
const confirmTheTicket = () => {
- const id = workDetailData.value.id
- backGdApi({eventId : id,eventStatus:'1'}).then(res => {
- uni.showToast({
- title: '确认成功',
- icon: 'success',
- duration: 1500
- })
- setTimeout(() => {
- uni.navigateBack()
- })
- })
+ // const id = workDetailData.value.id
+ // backGdApi({ eventId: id, eventStatus: '1' }).then(res => {
+ // uni.showToast({
+ // title: '确认成功',
+ // icon: 'success',
+ // duration: 1500,
+ // })
+ // setTimeout(() => {
+ // uni.navigateBack()
+ // })
+ // })
+ updateStatus({
+ eventId: workDetailData.value.id,
+ targetStatus: 1,
+ }).then(res => {
+ uni.showToast({
+ title: '确认成功',
+ icon: 'success',
+ duration: 1500,
+ })
+ setTimeout(() => {
+ // uni.navigateBack()
+ workDetailData.value.eventStatus = 1
+ })
+ })
}
-// 已确认
+
+// 处置记录 - 跳转至处置记录页面
+function handlelogs() {
+ uni.navigateTo({
+ url: `/subPackages/workDetail/HandleWork/index?id=${workDetailData.value.id}&eventStatus=${workDetailData.value.eventStatus}`,
+ })
+}
+// 上传处置记录
+function uploadHandle() {
+ uni.navigateTo({
+ url: `/subPackages/workDetail/HandleWorking/index?id=${workDetailData.value.id}&eventStatus=${workDetailData.value.eventStatus}`,
+ })
+}
+
+// 打开完成情况弹窗
const confirmedHandle = () => {
- uni.navigateBack()
+ completeContent.value = ''
+ showCompleteModal.value = true
+}
+
+// 关闭完成情况弹窗
+const closeCompleteModal = () => {
+ if (completing.value) return
+ showCompleteModal.value = false
+}
+
+// 提交完成情况
+const submitComplete = async () => {
+ const operateContent = completeContent.value.trim()
+ if (!operateContent) {
+ uni.showToast({ title: '请输入完成情况', icon: 'none' })
+ return
+ }
+ completing.value = true
+ try {
+ // await updateStatus({
+ // eventId: workDetailData.value.id,
+ // targetStatus: 4,
+ // operateContent,
+ // })
+ await addDisposeRecord({
+ eventId: workDetailData.value.id,
+ disposeContent: operateContent,
+ recordType: 1,
+ targetEventStatus: 4,
+ updateEventStatus: true,
+ // attachUrl: ''
+ })
+ uni.showToast({ title: '操作成功', icon: 'success' })
+ setTimeout(() => {
+ uni.navigateBack()
+ }, 1000)
+ } catch {
+ completing.value = false
+ uni.showToast({ title: '操作失败,请重试', icon: 'none' })
+ }
}
// 分享模态框状态
const showShareModal = ref(false)
@@ -226,7 +455,8 @@
// 复制链接
const copyLink = async () => {
- const shareUrl =getWebViewUrl("/workDetail", { workDetailData: JSON.stringify(workDetailData.value) })
+ const res = await shareCacheApi(workDetailData.value)
+ const shareUrl = getWebViewUrl('/workDetail', { workDetailData: JSON.stringify(res.data.data) })
try {
await uni.setClipboardData({
data: shareUrl,
@@ -276,7 +506,7 @@
type: 0,
title: workDetailData.value.event_name || '工单详情',
summary: '查看工单详情',
- href: getWebViewUrl("/workDetail", { workDetailData: JSON.stringify(workDetailData.value) }),
+ href: getWebViewUrl('/workDetail', { workDetailData: JSON.stringify(workDetailData.value) }),
imageUrl: workDetailData.value.eventImageUrl,
success: () => {
uni.showToast({ title: '分享成功', icon: 'success' })
@@ -310,152 +540,289 @@
// 返回按钮点击事件
const onBackClick = () => {
- uni.navigateBack()
+ uni.navigateBack()
}
// 监听导航栏右侧按钮点击事件(兼容原来的配置)
const onNavigationBarButtonTap = e => {
- if (e.index === 0) {
- onShareClick()
- }
+ if (e.index === 0) {
+ onShareClick()
+ }
}
</script>
<style lang="scss" scoped>
.workDetailContainer {
- // 添加导航栏高度的padding-top,避免内容被遮挡
- padding-top: 88rpx;
- :deep(){
- .u-navbar__content{
- background: url("https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ztzf_app_assets/images/user/bg.png") no-repeat !important;
- background-size: 100%!important;
- height: 88rpx !important;
- }
-} // 分享按钮样式
- .share-btn {
- // #ifdef APP-PLUS
- width: 40rpx;
- height: 40rpx;
- background-image: url('/static/images/work/share.svg');
- background-size: contain;
- background-repeat: no-repeat;
- background-position: center;
- // #endif
- }
- .tapShare-icon {
- width: 40rpx;
- height: 40rpx;
- img {
- width: 40rpx;
- height: 40rpx;
- }
- }
- .detailTop {
- // #ifdef APP-PLUS
- padding-top: 60rpx;
- // #endif
- .image-container {
- position: relative;
- width: 100%;
- height: 410rpx;
+ // 添加导航栏高度的padding-top,避免内容被遮挡
+ padding-top: 88rpx;
+ height: 100vh;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ :deep() {
+ .u-navbar__content {
+ background: url('https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ztzf_app_assets/images/user/bg.png')
+ no-repeat !important;
+ background-size: 100% !important;
+ height: 88rpx !important;
+ }
+ } // 分享按钮样式
+ .share-btn {
+ // #ifdef APP-PLUS
+ width: 40rpx;
+ height: 40rpx;
+ background-image: url('/static/images/work/share.svg');
+ background-size: contain;
+ background-repeat: no-repeat;
+ background-position: center;
+ // #endif
+ }
+ .tapShare-icon {
+ width: 40rpx;
+ height: 40rpx;
+ img {
+ width: 40rpx;
+ height: 40rpx;
+ }
+ }
+ .detailTop {
+ flex-shrink: 0;
+ // #ifdef APP-PLUS
+ padding-top: 60rpx;
+ // #endif
+ .image-container {
+ position: relative;
+ width: 100%;
+ height: 410rpx;
- .detailImage {
- width: 100%;
- height: 100%;
- display: block;
- object-fit: cover;
- }
- // 轮播图容器
- :deep(.u-swiper) {
- // 指示器容器 - 修改为居中对齐
- .u-swiper__indicator {
- position: absolute;
- left: 50%;
- transform: translateX(-50%);
- bottom: 20rpx;
- display: flex;
- justify-content: center;
- align-items: center;
- z-index: 10;
- }
- .u-swiper-indicator__wrapper__dot--active {
- width: 5px !important;
- }
- }
+ .detailImage {
+ width: 100%;
+ height: 100%;
+ display: block;
+ object-fit: cover;
+ }
+ // 轮播图容器
+ :deep(.u-swiper) {
+ // 指示器容器 - 修改为居中对齐
+ .u-swiper__indicator {
+ position: absolute;
+ left: 50%;
+ transform: translateX(-50%);
+ bottom: 20rpx;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ z-index: 10;
+ }
+ .u-swiper-indicator__wrapper__dot--active {
+ width: 5px !important;
+ }
+ }
+ }
+ }
- }
- }
+ .worderContainer {
+ flex: 1;
+ min-height: 0;
+ padding: 0 24rpx;
+ padding-bottom: 4rpx;
+ background: #f6f6f6;
+ margin-top: 20rpx;
+ overflow-y: auto;
+ overflow-x: hidden;
+ -webkit-overflow-scrolling: touch;
+ }
+ .workOrderContent {
+ margin-top: 30epx;
+ background-color: #fff;
+ border-radius: 12rpx;
+ padding: 20rpx;
+ margin-bottom: 34rpx;
+ .workOrderTitle {
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: bold;
+ font-size: 32rpx;
+ color: #222324;
+ }
+ .workOrderContainer {
+ .orderRow {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ min-height: 96rpx;
+ border-bottom: 1px solid #f5f5f5;
+ color: #7b7b7b;
+ .rowTitle {
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: 400;
+ font-size: 30rpx;
+ color: #222324;
+ white-space: nowrap;
+ }
+ .rowAddress {
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: 400;
+ font-size: 28rpx;
+ color: #1d6fe9;
+ text-decoration: underline;
+ text-align: right;
- .worderContainer {
- padding: 0 24rpx;
- padding-bottom: 4rpx;
- background: #f6f6f6;
- margin-top: 20rpx;
- }
- .workOrderContent {
- margin-top: 30epx;
- background-color: #fff;
- border-radius: 12rpx;
- padding: 20rpx;
- margin-bottom: 34rpx;
- .workOrderTitle {
- font-family: Source Han Sans CN, Source Han Sans CN;
- font-weight: bold;
- font-size: 32rpx;
- color: #222324;
- }
- .workOrderContainer {
- .orderRow {
- display: flex;
- justify-content: space-between;
- align-items: center;
- min-height: 96rpx;
- border-bottom: 1px solid #f5f5f5;
- color: #7b7b7b;
- .rowTitle {
- font-family: Source Han Sans CN, Source Han Sans CN;
- font-weight: 400;
- font-size: 30rpx;
- color: #222324;
- white-space: nowrap;
- }
- .rowAddress {
- font-family: Source Han Sans CN, Source Han Sans CN;
- font-weight: 400;
- font-size: 28rpx;
- color: #1d6fe9;
- text-decoration: underline;
- text-align: right;
+ padding-top: 1px;
+ padding-left: 5px;
+ padding-right: 2px;
+ }
+ .status-picker {
+ .picker-value {
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: 400;
+ font-size: 28rpx;
+ color: #1d6fe9;
+ display: flex;
+ align-items: center;
+ gap: 8rpx;
+ }
+ .picker-arrow {
+ font-size: 20rpx;
+ color: #999;
+ }
+ }
+ }
+ }
+ }
- padding-top: 1px;
- padding-left: 5px;
- padding-right: 2px;
- }
- }
- }
- }
+ .actionButton {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ box-sizing: border-box;
+ width: 100%;
+ height: 61px;
+ padding: 0 24rpx;
- .actionButton {
- display: flex;
- justify-content: center;
- align-items: center;
- width: 100%;
- height: 61px;
+ border-radius: 6px 6px 6px 6px;
- border-radius: 6px 6px 6px 6px;
+ .btngroups {
+ display: flex;
+ align-items: center;
+ width: 100%;
+ min-width: 0;
+ :deep(.u-button) {
+ width: 0 !important;
+ min-width: 0;
+ margin: 0 !important;
+ flex: 1;
+ height: 76rpx !important;
+ }
+ &:not(.three-actions) {
+ :deep(.u-button + .u-button) {
+ margin-left: 20rpx !important;
+ }
+ }
+ &.three-actions {
+ justify-content: center;
+ :deep(.u-button) {
+ width: 210rpx !important;
+ flex: 0 0 210rpx;
+ }
+ :deep(.u-button:last-child) {
+ margin-left: 20rpx !important;
+ }
+ }
+ }
+ }
+}
- .btngroups {
- display: flex;
- justify-content: space-between;
- align-items: center;
- :deep(.u-button) {
- width: 276rpx !important;
- height: 76rpx !important;
- &:last-child {
- margin-left: 30rpx;
- }
- }
- }
- }
+.complete-modal-overlay {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 10000;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ box-sizing: border-box;
+ padding: 40rpx;
+ background: rgba(0, 0, 0, 0.55);
+}
+
+.complete-modal {
+ box-sizing: border-box;
+ width: 620rpx;
+ max-width: 100%;
+ padding: 32rpx;
+ background: #ffffff;
+ border-radius: 12rpx;
+}
+
+.complete-modal-title {
+ margin-bottom: 28rpx;
+ font-size: 32rpx;
+ font-weight: 500;
+ color: #222324;
+ text-align: center;
+}
+
+.complete-input-wrapper {
+ position: relative;
+ box-sizing: border-box;
+ height: 220rpx;
+ padding-bottom: 38rpx;
+ background: #f6f7f9;
+ border: 1rpx solid #e5e7eb;
+ border-radius: 6rpx;
+}
+
+.complete-input {
+ box-sizing: border-box;
+ width: 100%;
+ height: 100%;
+ padding: 20rpx;
+ font-size: 28rpx;
+ line-height: 1.5;
+ color: #222324;
+}
+
+.complete-word-count {
+ position: absolute;
+ right: 16rpx;
+ bottom: 10rpx;
+ font-size: 22rpx;
+ color: #999999;
+}
+
+.complete-modal-actions {
+ display: flex;
+ gap: 24rpx;
+ margin-top: 30rpx;
+}
+
+.complete-action-btn {
+ height: 76rpx;
+ margin: 0;
+ flex: 1;
+ font-size: 28rpx;
+ line-height: 76rpx;
+ border-radius: 6rpx;
+}
+
+.complete-action-btn::after {
+ border: 0;
+}
+
+.complete-cancel-btn {
+ color: #666666;
+ background: #f1f2f4;
+}
+
+.complete-confirm-btn {
+ color: #ffffff;
+ background: #1d6fe9;
+}
+
+.complete-action-btn[disabled] {
+ opacity: 0.65;
}
/* 分享弹出层样式 */
@@ -541,7 +908,6 @@
.share-icon.moments {
background-image: url('@/static/images/work/moments.svg');
}
-
.share-icon.link {
background-image: url('@/static/images/work/link.svg');
--
Gitblit v1.9.3