|
@@ -184,13 +184,16 @@
|
|
|
<div class="item-content1-img">
|
|
<div class="item-content1-img">
|
|
|
<template
|
|
<template
|
|
|
v-for="(path, index) in checkBookDetail.rectificationImage?.split(',') || []"
|
|
v-for="(path, index) in checkBookDetail.rectificationImage?.split(',') || []"
|
|
|
- :key="index"
|
|
|
|
|
|
|
+ :key="'img' + index"
|
|
|
>
|
|
>
|
|
|
<div class="item-content1-img-item">
|
|
<div class="item-content1-img-item">
|
|
|
- <img class="img-item" :src="buildFileUrl(path)" alt="" @click="handlePreview(buildFileUrl(path), 'image')" />
|
|
|
|
|
- <div class="list-item-tool">
|
|
|
|
|
- <el-icon class="icon" @click="() => handlePreview(buildFileUrl(path), 'image')"><View /></el-icon>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <el-image
|
|
|
|
|
+ class="img-item"
|
|
|
|
|
+ :src="buildFileUrl(path)"
|
|
|
|
|
+ :preview-src-list="[buildFileUrl(path)]"
|
|
|
|
|
+ fit="cover"
|
|
|
|
|
+ preview-teleported
|
|
|
|
|
+ />
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
</div>
|
|
</div>
|
|
@@ -200,13 +203,12 @@
|
|
|
<div class="item-content1-img">
|
|
<div class="item-content1-img">
|
|
|
<template
|
|
<template
|
|
|
v-for="(path, index) in checkBookDetail.rectificationVideo?.split(',') || []"
|
|
v-for="(path, index) in checkBookDetail.rectificationVideo?.split(',') || []"
|
|
|
- :key="index"
|
|
|
|
|
|
|
+ :key="'vid' + index"
|
|
|
>
|
|
>
|
|
|
- <div class="item-content1-img-item">
|
|
|
|
|
- <video class="img-item" :src="buildFileUrl(path)" alt="" @click="handlePreview(buildFileUrl(path), 'video')"></video>
|
|
|
|
|
- <!-- 视频播放按钮 -->
|
|
|
|
|
- <div class="list-item-tool">
|
|
|
|
|
- <el-icon class="icon" @click="() => handlePreview(buildFileUrl(path), 'video')"><View /></el-icon>
|
|
|
|
|
|
|
+ <div class="item-content1-img-item" @click="handlePreview(buildFileUrl(path), 'video')">
|
|
|
|
|
+ <video class="img-item" :src="buildFileUrl(path)"></video>
|
|
|
|
|
+ <div class="video-play-overlay">
|
|
|
|
|
+ <el-icon :size="28"><VideoPlay /></el-icon>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
@@ -603,6 +605,30 @@
|
|
|
:reportList="reportList"
|
|
:reportList="reportList"
|
|
|
@confirm="handleRefresh"
|
|
@confirm="handleRefresh"
|
|
|
/>
|
|
/>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 回退原因弹窗(面板收缩时使用) -->
|
|
|
|
|
+ <el-dialog
|
|
|
|
|
+ v-model="rejectionReasonDialogVisible"
|
|
|
|
|
+ title="请输入回退原因"
|
|
|
|
|
+ width="450px"
|
|
|
|
|
+ :close-on-click-modal="false"
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-form ref="rejectionReasonDialogFormRef" :model="tempRejectionReason" :rules="returnFormRules">
|
|
|
|
|
+ <el-form-item label="回退原因" prop="rejectionReason">
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-model="tempRejectionReason.rejectionReason"
|
|
|
|
|
+ type="textarea"
|
|
|
|
|
+ :rows="5"
|
|
|
|
|
+ maxlength="100"
|
|
|
|
|
+ placeholder="请输入回退原因"
|
|
|
|
|
+ />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-form>
|
|
|
|
|
+ <template #footer>
|
|
|
|
|
+ <el-button @click="rejectionReasonDialogVisible = false">取消</el-button>
|
|
|
|
|
+ <el-button type="primary" @click="handleRejectionReasonDialogConfirm">确定回退</el-button>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-dialog>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<!-- 新加 -->
|
|
<!-- 新加 -->
|
|
@@ -832,7 +858,7 @@ import SmartTable from '@/components/SmartTable/SmartTable'
|
|
|
import CustomUploadFile from '@/components/CustomUploadFile/index.vue'
|
|
import CustomUploadFile from '@/components/CustomUploadFile/index.vue'
|
|
|
import { computed, nextTick, reactive, ref, watch } from 'vue'
|
|
import { computed, nextTick, reactive, ref, watch } from 'vue'
|
|
|
import { useRouter, useRoute } from 'vue-router'
|
|
import { useRouter, useRoute } from 'vue-router'
|
|
|
-import { InfoFilled, View, Back, Right, WarningFilled } from '@element-plus/icons-vue'
|
|
|
|
|
|
|
+import { InfoFilled, View, Back, Right, WarningFilled, VideoPlay } from '@element-plus/icons-vue'
|
|
|
import { dayjs, ElMessage, ElMessageBox, FormInstance, FormRules } from 'element-plus'
|
|
import { dayjs, ElMessage, ElMessageBox, FormInstance, FormRules } from 'element-plus'
|
|
|
const CustomDialog = defineAsyncComponent(() => import('@/components/CustomDialog/index.vue'))
|
|
const CustomDialog = defineAsyncComponent(() => import('@/components/CustomDialog/index.vue'))
|
|
|
import VuePdfEmbed from 'vue-pdf-embed'
|
|
import VuePdfEmbed from 'vue-pdf-embed'
|
|
@@ -1255,6 +1281,10 @@ const returnFormRules = ref({
|
|
|
})
|
|
})
|
|
|
const returnFormRef = ref()
|
|
const returnFormRef = ref()
|
|
|
|
|
|
|
|
|
|
+const rejectionReasonDialogVisible = ref(false)
|
|
|
|
|
+const tempRejectionReason = ref({ rejectionReason: '' })
|
|
|
|
|
+const rejectionReasonDialogFormRef = ref()
|
|
|
|
|
+
|
|
|
const isCompleteInput = computed(() => {
|
|
const isCompleteInput = computed(() => {
|
|
|
return props.selectedItem?.taskStatus >= PressureCheckerMyTaskStatus.RECORD_CHECK
|
|
return props.selectedItem?.taskStatus >= PressureCheckerMyTaskStatus.RECORD_CHECK
|
|
|
})
|
|
})
|
|
@@ -1270,10 +1300,44 @@ const handlePass = async (type) => {
|
|
|
approvalType: type
|
|
approvalType: type
|
|
|
}
|
|
}
|
|
|
if (type === 1) {
|
|
if (type === 1) {
|
|
|
- const valid = await returnFormRef.value.validate()
|
|
|
|
|
- if (!valid) return
|
|
|
|
|
- params.rejectionReason = returnForm.value.rejectionReason
|
|
|
|
|
|
|
+ if (isExpanded.value) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ await returnFormRef.value.validate()
|
|
|
|
|
+ } catch {
|
|
|
|
|
+ ElMessage.warning('请填写回退原因')
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ params.rejectionReason = returnForm.value.rejectionReason
|
|
|
|
|
+ executePass(params, type)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ tempRejectionReason.value.rejectionReason = returnForm.value.rejectionReason
|
|
|
|
|
+ rejectionReasonDialogVisible.value = true
|
|
|
|
|
+ }
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ executePass(params, type)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 弹出框确认回退
|
|
|
|
|
+const handleRejectionReasonDialogConfirm = async () => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ await rejectionReasonDialogFormRef.value.validate()
|
|
|
|
|
+ } catch {
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ rejectionReasonDialogVisible.value = false
|
|
|
|
|
+ // 同步到主表单以便保持数据一致
|
|
|
|
|
+ returnForm.value.rejectionReason = tempRejectionReason.value.rejectionReason
|
|
|
|
|
+ const params: Record<string, any> = {
|
|
|
|
|
+ reportId: props.selectedItem?.id,
|
|
|
|
|
+ approvalType: 1,
|
|
|
|
|
+ rejectionReason: tempRejectionReason.value.rejectionReason
|
|
|
}
|
|
}
|
|
|
|
|
+ executePass(params, 1)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 执行通过/退回操作
|
|
|
|
|
+const executePass = (params: Record<string, any>, type: number) => {
|
|
|
const tipText = type === 1 ? '退回' : type === 2 ? '整改不通过' : '整改通过'
|
|
const tipText = type === 1 ? '退回' : type === 2 ? '整改不通过' : '整改通过'
|
|
|
ElMessageBox.confirm(`确定${tipText}吗?`, '提示', {
|
|
ElMessageBox.confirm(`确定${tipText}吗?`, '提示', {
|
|
|
confirmButtonText: '确定',
|
|
confirmButtonText: '确定',
|
|
@@ -2617,39 +2681,28 @@ watch(() => props.isFullscreen, () => {
|
|
|
width: 100px;
|
|
width: 100px;
|
|
|
height: 100px;
|
|
height: 100px;
|
|
|
position: relative;
|
|
position: relative;
|
|
|
|
|
+ border-radius: 8px;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
|
|
|
- .list-item-tool {
|
|
|
|
|
|
|
+ .video-play-overlay {
|
|
|
position: absolute;
|
|
position: absolute;
|
|
|
top: 0;
|
|
top: 0;
|
|
|
left: 0;
|
|
left: 0;
|
|
|
width: 100%;
|
|
width: 100%;
|
|
|
height: 100%;
|
|
height: 100%;
|
|
|
- z-index: 99;
|
|
|
|
|
border-radius: 8px;
|
|
border-radius: 8px;
|
|
|
- transition: all 0.5s ease;
|
|
|
|
|
- cursor: pointer;
|
|
|
|
|
|
|
+ transition: all 0.3s ease;
|
|
|
display: flex;
|
|
display: flex;
|
|
|
justify-content: center;
|
|
justify-content: center;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
- gap: 5px;
|
|
|
|
|
|
|
+ background-color: rgba(0, 0, 0, 0.2);
|
|
|
|
|
+ color: #ffffffcc;
|
|
|
|
|
+ pointer-events: none;
|
|
|
|
|
+
|
|
|
&:hover {
|
|
&:hover {
|
|
|
- backdrop-filter: blur(2px);
|
|
|
|
|
- background-color: #00000076;
|
|
|
|
|
- z-index: 1;
|
|
|
|
|
- .icon {
|
|
|
|
|
- display: inline-block;
|
|
|
|
|
- opacity: 1;
|
|
|
|
|
- &:hover {
|
|
|
|
|
- color: #ffffff;
|
|
|
|
|
- transition: all 0.5s ease;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- .icon {
|
|
|
|
|
- color: #ffffff99;
|
|
|
|
|
- opacity: 0;
|
|
|
|
|
- transition: all 0.5s ease;
|
|
|
|
|
- font-size: 16px;
|
|
|
|
|
|
|
+ background-color: rgba(0, 0, 0, 0.45);
|
|
|
|
|
+ color: #ffffff;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -2856,39 +2909,28 @@ watch(() => props.isFullscreen, () => {
|
|
|
width: 100px;
|
|
width: 100px;
|
|
|
height: 100px;
|
|
height: 100px;
|
|
|
position: relative;
|
|
position: relative;
|
|
|
|
|
+ border-radius: 8px;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
|
|
|
- .list-item-tool {
|
|
|
|
|
|
|
+ .video-play-overlay {
|
|
|
position: absolute;
|
|
position: absolute;
|
|
|
top: 0;
|
|
top: 0;
|
|
|
left: 0;
|
|
left: 0;
|
|
|
width: 100%;
|
|
width: 100%;
|
|
|
height: 100%;
|
|
height: 100%;
|
|
|
- z-index: 99;
|
|
|
|
|
border-radius: 8px;
|
|
border-radius: 8px;
|
|
|
- transition: all 0.5s ease;
|
|
|
|
|
- cursor: pointer;
|
|
|
|
|
|
|
+ transition: all 0.3s ease;
|
|
|
display: flex;
|
|
display: flex;
|
|
|
justify-content: center;
|
|
justify-content: center;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
- gap: 5px;
|
|
|
|
|
|
|
+ background-color: rgba(0, 0, 0, 0.2);
|
|
|
|
|
+ color: #ffffffcc;
|
|
|
|
|
+ pointer-events: none;
|
|
|
|
|
+
|
|
|
&:hover {
|
|
&:hover {
|
|
|
- backdrop-filter: blur(2px);
|
|
|
|
|
- background-color: #00000076;
|
|
|
|
|
- z-index: 1;
|
|
|
|
|
- .icon {
|
|
|
|
|
- display: inline-block;
|
|
|
|
|
- opacity: 1;
|
|
|
|
|
- &:hover {
|
|
|
|
|
- color: #ffffff;
|
|
|
|
|
- transition: all 0.5s ease;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- .icon {
|
|
|
|
|
- color: #ffffff99;
|
|
|
|
|
- opacity: 0;
|
|
|
|
|
- transition: all 0.5s ease;
|
|
|
|
|
- font-size: 16px;
|
|
|
|
|
|
|
+ background-color: rgba(0, 0, 0, 0.45);
|
|
|
|
|
+ color: #ffffff;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|