巡检-早于巡检时间,禁止提交
This commit is contained in:
@@ -5,8 +5,8 @@
|
||||
<!-- 已选图片 -->
|
||||
<view v-for="(img, index) in innerList" :key="index" class="image-item">
|
||||
<image :src="img.url || img" class="img" mode="aspectFill" @tap="preview(index)"></image>
|
||||
<!-- 删除按钮 -->
|
||||
<view class="delete-btn" @tap.stop="remove(index)">
|
||||
<!-- 删除按钮 禁用时隐藏 -->
|
||||
<view v-if="!props.disabled" class="delete-btn" @tap.stop="remove(index)">
|
||||
<uni-icons type="closeempty" size="16" color="#fff"></uni-icons>
|
||||
</view>
|
||||
<!-- 上传状态 -->
|
||||
@@ -14,19 +14,22 @@
|
||||
<text>上传中...</text>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 添加按钮 -->
|
||||
<view class="add-btn" @tap="choose" v-if="innerList.length < props.limit">
|
||||
<!-- 添加按钮 禁用或者达到上限不显示 -->
|
||||
<view
|
||||
class="add-btn"
|
||||
:class="{ 'add-btn-disabled': props.disabled }"
|
||||
@tap="choose"
|
||||
v-if="innerList.length < props.limit"
|
||||
>
|
||||
<uni-icons color="#a6a6a6" type="plusempty" size="25"></uni-icons>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, watch } from 'vue'
|
||||
import baseUrl from '@/api/BaseUrl.js'
|
||||
import { requestAuth } from '@/utils/Auth.js'
|
||||
|
||||
// ======================
|
||||
// Props(可配置)
|
||||
// ======================
|
||||
@@ -65,19 +68,21 @@ const props = defineProps({
|
||||
extraData: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
},
|
||||
// ✅ 新增:禁用组件
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
})
|
||||
|
||||
// ======================
|
||||
// Emits
|
||||
// ======================
|
||||
const emit = defineEmits(['update:modelValue', 'success', 'fail', 'remove'])
|
||||
|
||||
// ======================
|
||||
// 内部数据
|
||||
// ======================
|
||||
const innerList = ref([])
|
||||
|
||||
// 监听外部数据变化
|
||||
watch(
|
||||
() => props.modelValue,
|
||||
@@ -91,13 +96,13 @@ watch(
|
||||
},
|
||||
{ immediate: true, deep: true }
|
||||
)
|
||||
|
||||
// ======================
|
||||
// 核心方法
|
||||
// ======================
|
||||
|
||||
// 1. 选择图片
|
||||
function choose() {
|
||||
// 禁用直接返回
|
||||
if (props.disabled) return
|
||||
uni.chooseImage({
|
||||
count: props.limit - innerList.value.length,
|
||||
sourceType: props.sourceType,
|
||||
@@ -146,13 +151,13 @@ function choose() {
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 2. 上传单张图片
|
||||
async function uploadSingle(filePath) {
|
||||
// 禁用不再新增上传
|
||||
if (props.disabled) return
|
||||
// 先添加到列表,标记为上传中
|
||||
const tempItem = { url: filePath, uploading: true }
|
||||
innerList.value = [...innerList.value, tempItem]
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
uni.uploadFile({
|
||||
url: `${baseUrl}${props.uploadUrl}`,
|
||||
@@ -167,7 +172,6 @@ async function uploadSingle(filePath) {
|
||||
success: res => {
|
||||
try {
|
||||
const data = JSON.parse(res.data)
|
||||
|
||||
// 假设后端返回格式:{ code: 200, url: "https://xxx.com/xxx.png" }
|
||||
// 如果你的后端返回格式不同,请在这里修改
|
||||
if (data.code === 200 || data.url) {
|
||||
@@ -201,9 +205,10 @@ async function uploadSingle(filePath) {
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// 3. 删除图片
|
||||
function remove(index) {
|
||||
// 禁用禁止删除
|
||||
if (props.disabled) return
|
||||
const removed = innerList.value.splice(index, 1)[0]
|
||||
emit(
|
||||
'update:modelValue',
|
||||
@@ -211,8 +216,7 @@ function remove(index) {
|
||||
)
|
||||
emit('remove', { index, url: removed.url })
|
||||
}
|
||||
|
||||
// 4. 预览图片
|
||||
// 4. 预览图片(预览保留,禁用也可以看)
|
||||
function preview(index) {
|
||||
const urls = innerList.value.map(i => i.url).filter(Boolean)
|
||||
if (urls.length <= 0) return
|
||||
@@ -222,12 +226,10 @@ function preview(index) {
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.simple-uploader {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.image-list {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
@@ -236,19 +238,16 @@ function preview(index) {
|
||||
margin-right: 20rpx;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.image-item {
|
||||
position: relative;
|
||||
width: 160rpx;
|
||||
height: 160rpx;
|
||||
}
|
||||
|
||||
.img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: 8rpx;
|
||||
}
|
||||
|
||||
.delete-btn {
|
||||
position: absolute;
|
||||
top: 0rpx;
|
||||
@@ -261,7 +260,6 @@ function preview(index) {
|
||||
justify-content: center;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
.uploading-mask {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
@@ -276,7 +274,6 @@ function preview(index) {
|
||||
color: #fff;
|
||||
font-size: 24rpx;
|
||||
}
|
||||
|
||||
.add-btn {
|
||||
width: 160rpx;
|
||||
height: 160rpx;
|
||||
@@ -285,4 +282,8 @@ function preview(index) {
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.add-btn-disabled {
|
||||
background-color: #eee;
|
||||
opacity: 0.6;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -77,6 +77,7 @@
|
||||
file-field-name="file"
|
||||
uploadUrl="/api/butler/file/uploadImage"
|
||||
@fail="onUploadFail"
|
||||
:disabled="disableUpload"
|
||||
></filePicker>
|
||||
</view>
|
||||
<view class="filePickerbox showimagegrid" v-else>
|
||||
@@ -92,7 +93,14 @@
|
||||
</view>
|
||||
</view>
|
||||
</uni-forms>
|
||||
<view class="submitbox" @tap="handleSubmit(ite)" v-if="!ite.complated">
|
||||
<view
|
||||
class="submitbox"
|
||||
@tap="handleSubmit(ite)"
|
||||
v-if="!ite.complated"
|
||||
:class="{
|
||||
disable: disableUpload
|
||||
}"
|
||||
>
|
||||
<text>提交</text>
|
||||
</view>
|
||||
<view class="line" v-if="ind + 1 < item.points.length"> </view>
|
||||
@@ -149,6 +157,26 @@ const rules = {
|
||||
}
|
||||
}
|
||||
|
||||
// 限制提交任务时间段 true 不可以提交 false 可以提交
|
||||
const disableUpload = computed(() => {
|
||||
if (info.value) {
|
||||
const day = new Date()
|
||||
const [start, end] = info.value.taskTime.split('-') ?? []
|
||||
if (start && end) {
|
||||
const startTime = day.toLocaleDateString() + ' ' + start + ':00'
|
||||
const endTime = day.toLocaleDateString() + ' ' + end + ':00'
|
||||
if (new Date(startTime).getTime() <= day.getTime()) {
|
||||
return false
|
||||
} else {
|
||||
return true
|
||||
}
|
||||
} else {
|
||||
return true
|
||||
}
|
||||
} else {
|
||||
return true
|
||||
}
|
||||
})
|
||||
function init() {
|
||||
if (!taskid.value) return
|
||||
getInspectionMain(taskid.value)
|
||||
@@ -168,7 +196,6 @@ function init() {
|
||||
files: ite.imgUrl ? ite.imgUrl.split(',') : []
|
||||
}
|
||||
})
|
||||
console.log(points)
|
||||
return {
|
||||
routeName: item.routeName,
|
||||
routeId: item.routeId,
|
||||
@@ -192,7 +219,6 @@ onLoad(options => {
|
||||
})
|
||||
|
||||
// ----------------------------------------------
|
||||
|
||||
function onUploadFail() {
|
||||
uni.showToast({
|
||||
icon: 'error',
|
||||
@@ -200,14 +226,28 @@ function onUploadFail() {
|
||||
})
|
||||
}
|
||||
|
||||
let isSubmit = false
|
||||
|
||||
/** 提交巡检点 检查情况 */
|
||||
function handleSubmit(item) {
|
||||
if (isSubmit) return
|
||||
isSubmit = true
|
||||
if (disableUpload.value) {
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
title: '不在任务时间段内',
|
||||
mask: true
|
||||
})
|
||||
isSubmit = false
|
||||
return
|
||||
}
|
||||
if (item.files.length <= 0) {
|
||||
uni.showToast({
|
||||
icon: 'error',
|
||||
mask: true,
|
||||
title: '必须拍照'
|
||||
})
|
||||
isSubmit = false
|
||||
return
|
||||
}
|
||||
uni.showLoading({
|
||||
@@ -243,6 +283,7 @@ function handleSubmit(item) {
|
||||
})
|
||||
.finally(() => {
|
||||
uni.hideLoading()
|
||||
isSubmit = false
|
||||
})
|
||||
}
|
||||
|
||||
@@ -393,6 +434,11 @@ function previewImages(images, currentIndex) {
|
||||
color: #ffffff;
|
||||
line-height: 80rpx;
|
||||
margin-top: 40rpx;
|
||||
|
||||
&.disable {
|
||||
background-color: #ccc;
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -16,9 +16,7 @@
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<span class="subtitle">{{ data.desc }}</span>
|
||||
<span class="subtime" v-if="currentStep == index + 1">{{
|
||||
repairInfo.updateTime
|
||||
}}</span>
|
||||
<span class="subtime">{{ data.time }}</span>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
@@ -150,10 +148,10 @@ import { getTicketMainById, shareRepairUser } from '@/api/ticket.js'
|
||||
const currentStep = ref(2)
|
||||
// 步骤数据
|
||||
const stepList = ref([
|
||||
{ title: '提交维修信息', desc: '等待提交报修' },
|
||||
{ title: '待分配', desc: '等待物业派单中' },
|
||||
{ title: '待解决', desc: '等待维修人员' },
|
||||
{ title: '维修完成', desc: '填写维修记录' }
|
||||
{ title: '提交维修信息', desc: '等待提交报修', time: '' },
|
||||
{ title: '待分配', desc: '等待物业派单中', time: '' },
|
||||
{ title: '待解决', desc: '等待维修人员', time: '' },
|
||||
{ title: '维修完成', desc: '填写维修记录', time: '' }
|
||||
])
|
||||
// --------------------------------------
|
||||
const queryParams = ref({
|
||||
@@ -231,18 +229,21 @@ function getTicketById() {
|
||||
function handleStop(row) {
|
||||
// 0 已提交 1 已分配 2已解决
|
||||
let status = row.problemStatus
|
||||
|
||||
const repairInfo = row.repairProcessList[0]
|
||||
currentStep.value = 0
|
||||
// 维修步骤:0提交 1分配 2维修完成 / 待解决 3记录完成 完成
|
||||
if (status === '0') {
|
||||
currentStep.value = 1
|
||||
stepList.value[0].desc = '提交报修成功'
|
||||
stepList.value[0].time = repairInfo.submitTime
|
||||
return
|
||||
}
|
||||
if (status === '1') {
|
||||
currentStep.value = 2
|
||||
stepList.value[0].time = repairInfo.submitTime
|
||||
stepList.value[1].title = '已派单'
|
||||
stepList.value[1].desc = '物业已派单'
|
||||
stepList.value[1].time = repairInfo.allocateTime
|
||||
stepList.value[2].title = '待解决'
|
||||
stepList.value[2].desc = `维修人员(${row.repairName})维修中`
|
||||
return
|
||||
@@ -250,10 +251,14 @@ function handleStop(row) {
|
||||
if (status === '2') {
|
||||
currentStep.value = 4
|
||||
stepList.value[0].desc = '提交报修成功'
|
||||
stepList.value[0].time = repairInfo.submitTime
|
||||
stepList.value[1].title = '已派单'
|
||||
stepList.value[1].desc = '物业已派单'
|
||||
stepList.value[1].time = repairInfo.allocateTime
|
||||
stepList.value[2].title = '已解决'
|
||||
stepList.value[2].desc = `维修人员(${row.repairName})已解决`
|
||||
stepList.value[2].time = repairInfo.completeTime
|
||||
stepList.value[3].time = repairInfo.completeTime
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -346,7 +351,7 @@ function handlePrivew(items, index = 0) {
|
||||
.subtime {
|
||||
font-weight: 400;
|
||||
font-size: 22rpx;
|
||||
color: #999999;
|
||||
color: rgba(77, 93, 250, 1);
|
||||
line-height: 40rpx;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user