Browse Source

测试菜单档案修改

duy 3 months ago
parent
commit
d2aeefce53

BIN
src/assets/hande-over/file-close-line.png


+ 1 - 0
src/assets/hande-over/file-close-line.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="rgba(234,46,46,1)"><path d="M12 22V20H5V4H15V8H19V13H20.9998V7L16 2H3.9985C3.44749 2 3 2.44405 3 2.9918V21.0082C3 21.5447 3.44476 22 3.9934 22H12ZM21.5356 21.1212L19.4143 18.9999L21.5356 16.8786L20.1214 15.4644L18.0001 17.5857L15.8788 15.4644L14.4646 16.8786L16.5859 18.9999L14.4646 21.1212L15.8788 22.5354L18.0001 20.4141L20.1214 22.5354L21.5356 21.1212Z"></path></svg>

+ 1 - 1
src/router/modules/base.js

@@ -206,7 +206,7 @@ export default [
             {
                 path: '/statistics/stats',
                 name: 'statistics-stats',
-                meta: { title: '案统计' },
+                meta: { title: '案统计' },
                 component: () => import('~src/views/statistics/stats.vue'),
             },
             {

+ 292 - 0
src/views/archives/manage/components/media-mic/index.vue

@@ -0,0 +1,292 @@
+<template>
+    <div class="hc-media-mic-box">
+        <div v-loading="isLoading" class="hc-icon-mic" @click="startClick">
+            <HcIcon :fill="isMicShow" name="mic" />
+        </div>
+
+        <!-- 语音识别 -->
+        <hc-new-dialog v-model="isMicShow" save-text="确认" title="语音识别搜索" ui="hc-media-recorder-dialog" widths="360px" @close="closeClick">
+            <!-- 录音中 -->
+            <div v-if="isMicType === 0" class="hc-media-recorder-box" @click="endClick">
+                <img :src="imageViewMic" alt="">
+                <div class="content-box">
+                    <div class="shut-down-icon">
+                        <HcIcon name="shut-down" />
+                    </div>
+                    <div class="time-box">
+                        <span class="time">{{ micTime }}</span>
+                        <span> / 01:00</span>
+                    </div>
+                </div>
+            </div>
+            <!-- 语音转换中 -->
+            <div v-if="isMicType === 1" class="hc-media-recorder-box ban">
+                <img :src="imageViewMic" alt="">
+                <div class="content-box">
+                    <div class="shut-down-icon">
+                        <HcIcon name="mic-off" />
+                    </div>
+                    <div class="time-box">
+                        <span class="time">语音转换中...</span>
+                    </div>
+                </div>
+            </div>
+            <!-- 语音转换完成 -->
+            <div v-if="isMicType === 2" class="content-search-word">
+                <div class="content-word-box">
+                    <div class="title">识别结果:</div>
+                    <div class="search-word">{{ searchInfo.searchWord ?? '未识别到内容,请重新录入语音' }}</div>
+                </div>
+                <div class="word-btn-box">
+                    <el-row :gutter="10">
+                        <el-col :span="8">
+                            <el-button block type="warning" @click="startClick">
+                                <HcIcon name="mic" />
+                                <span>重录语音</span>
+                            </el-button>
+                        </el-col>
+                        <el-col :span="8">
+                            <el-button :disabled="!fileBlobUrl" :loading="downloadLoading" block type="info" @click="fileDownload">
+                                <HcIcon name="download" />
+                                <span>下载语音</span>
+                            </el-button>
+                        </el-col>
+                        <el-col :span="8">
+                            <el-button :disabled="!searchInfo.searchWord" block type="primary" @click="searchClick">
+                                <HcIcon name="search-2" />
+                                <span>确认搜索</span>
+                            </el-button>
+                        </el-col>
+                    </el-row>
+                </div>
+            </div>
+        </hc-new-dialog>
+    </div>
+</template>
+
+<script setup>
+import { ref, watch } from 'vue'
+import archiveQueryApi from '~api/using/query.js'
+import imageViewMic from '~src/assets/view/mic.gif'
+import { getObjValue } from 'js-fast-way'
+
+//参数
+const props = defineProps({
+    loading: {
+        type: Boolean,
+        default: false,
+    },
+})
+
+//事件
+const emit = defineEmits(['change'])
+
+const isLoading = ref(props.loading)
+
+//监听
+watch(() => [
+    props.loading,
+], ([loading]) => {
+    isLoading.value = loading
+})
+
+//弹窗变量
+const isMicShow = ref(false)
+
+//类型变量,0录音中, 1识别转换中,2转换完
+const isMicType = ref(2)
+
+//时间变量
+const micTime = ref('00:00')
+const micTimeRef = ref(null)
+
+//语音API变量
+const streamRef = ref(null)
+const mediaRecorderRef = ref(null)
+
+//开始录音
+const startClick = async () => {
+    isMicType.value = 0
+    if (streamRef.value === null) {
+        const stream = await getUserMedia()
+        if (stream === false) {
+            return false
+        }
+        streamRef.value = stream
+    }
+    isMicShow.value = true
+    startRecorder() //执行录音
+}
+
+//结束录音
+const endClick = () => {
+    isClose.value = false
+    isMicType.value = 1
+    mediaRecorderRef.value?.stop()
+    mediaRecorderRef.value = null
+    clearTimeout(micTimeRef.value)
+    micTimeRef.value = null
+    micTime.value = '00:00'
+}
+
+//关闭
+const isClose = ref(false)
+const closeClick = () => {
+    isClose.value = true
+    isMicShow.value = false
+    endClick()
+}
+
+//开始录音
+const startRecorder = () => {
+    //获取音频流
+    const { stream } = setSampleRate()
+    let mediaRecorder = new MediaRecorder(stream), chunks
+    //开始录音
+    mediaRecorder.start()
+    setMicTimeFormat() //开始计时
+    // 录音结束时,停止并下载录音文件
+    mediaRecorder.addEventListener('dataavailable', (e) => {
+        clearTimeout(micTimeRef.value)
+        micTimeRef.value = null
+        chunks = e.data
+    })
+    // 录音结束
+    mediaRecorder.addEventListener('stop', () => {
+        if (!isClose.value) {
+            //获取wav格式音频数据
+            let blob = new Blob([chunks], { type: 'audio/wav' })
+            const fileName = new Date().getTime() + '.wav'
+            fileBlobName.value = fileName
+            let file = new window.File([blob], fileName, { type: 'audio/wav' })
+            // 创建一个blob的对象,把Json转化为字符串作为我们的值
+            fileBlobUrl.value = window.URL.createObjectURL(blob)
+            // 准备上传
+            const formData = new FormData()
+            formData.append('file', file)
+            transcribeApi(formData)
+        }
+    })
+    mediaRecorderRef.value = mediaRecorder
+}
+
+//下载录音文件
+const downloadLoading = ref(false)
+const fileBlobUrl = ref(null)
+const fileBlobName = ref('')
+const fileDownload = () => {
+    if (fileBlobUrl.value) {
+        downloadLoading.value = true
+        // 创建一个链接元素,是属于 a 标签的链接元素,所以括号里才是a,
+        let link = document.createElement('a')
+        link.href = fileBlobUrl.value
+        // 把上面获得的blob的对象链接赋值给新创建的这个 a 链接
+        link.setAttribute('download', fileBlobName.value ?? '录音.wav')
+        // 后面的是文件名字,可以更改
+        link.click()
+        setTimeout(() => {
+            downloadLoading.value = false
+        }, 5000)
+    }
+}
+
+//发起请求
+const searchInfo = ref({})
+const transcribeApi = async (formData) => {
+    const { error, code, data } = await archiveQueryApi.micSearchInfo(formData)
+    //处理数据
+    isMicType.value = 2
+    if (!error && code === 200) {
+        searchInfo.value = getObjValue(data)
+    } else {
+        searchInfo.value = {}
+    }
+}
+
+//确认搜索
+const searchClick = () => {
+    emit('change', searchInfo.value)
+    isMicShow.value = false
+    isMicType.value = 0
+    mediaRecorderRef.value = null
+    streamRef.value = null
+}
+
+//设置采样率
+const setSampleRate = () => {
+    if (streamRef.value) {
+        const audioContext = new AudioContext({
+            sampleRate: 16000,
+        })
+        const mediaStreamAudioSourceNode = new MediaStreamAudioSourceNode(audioContext, {
+            mediaStream: streamRef.value,
+        })
+        const mediaStreamAudioDestinationNode = new MediaStreamAudioDestinationNode(audioContext)
+        mediaStreamAudioSourceNode.connect(mediaStreamAudioDestinationNode)
+        return mediaStreamAudioDestinationNode
+    } else {
+        return {}
+    }
+}
+
+//获取录音权限
+const getUserMedia = () => {
+    return new Promise((resolve) => {
+        // 老的浏览器可能根本没有实现 mediaDevices,所以我们可以先设置一个空的对象
+        if (navigator.mediaDevices === undefined) {
+            navigator.mediaDevices = {}
+        }
+        // 一些浏览器部分支持 mediaDevices。我们不能直接给对象设置 getUserMedia
+        // 因为这样可能会覆盖已有的属性。这里我们只会在没有 getUserMedia 属性的时候添加它。
+        if (navigator.mediaDevices.getUserMedia === undefined) {
+            navigator.mediaDevices.getUserMedia = function (constraints) {
+                // 首先,如果有 getUserMedia 的话,就获得它
+                let getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia
+                // 一些浏览器根本没实现它 - 那么就返回一个 error 到 promise 的 reject 来保持一个统一的接口
+                if (!getUserMedia) {
+                    window?.$message.error('当前浏览器不支持语音功能')
+                    resolve(false)
+                }
+                // 否则,为老的 navigator.getUserMedia 方法包裹一个 Promise
+                return new Promise(function (resolve, reject) {
+                    getUserMedia.call(navigator, constraints, resolve, reject)
+                })
+            }
+        }
+        // 使用新方法的API
+        navigator.mediaDevices.getUserMedia({
+            audio: true,
+        }).then(stream => {
+            resolve(stream)
+        }).catch(err => {
+            window?.$message.error('获取麦克风权限失败了')
+            resolve(false)
+        })
+    })
+}
+
+//设置时间格式
+const setMicTimeFormat = () => {
+    let startNum = 0
+    micTime.value = '00:00'
+    micTimeRef.value = setInterval(() => {
+        if (startNum < 60) {
+            startNum++
+            let min = Math.floor(startNum / 60) //分
+            let sec = Math.floor(startNum % 60) //秒
+            min = min < 10 ? '0' + min : min
+            sec = sec < 10 ? '0' + sec : sec
+            micTime.value = `${min}:${sec}`
+        } else {
+            clearTimeout(micTimeRef.value)
+            micTimeRef.value = null
+            micTime.value = '00:00'
+            endClick()
+        }
+    }, 1000)
+}
+</script>
+
+<style lang="scss">
+@import "style";
+</style>

+ 89 - 0
src/views/archives/manage/components/media-mic/style.scss

@@ -0,0 +1,89 @@
+.hc-media-mic-box {
+
+}
+
+.el-dialog.hc-media-recorder-dialog {
+    --el-dialog-margin-top: 30vh;
+    .el-dialog__header {
+        padding: 10px 20px !important;
+        border-color: #EEEEEE !important;
+        .el-dialog__title {
+            color: #464646;
+        }
+        .el-dialog__headerbtn {
+            right: 6px;
+            width: 32px;
+            height: 32px;
+        }
+    }
+    .el-dialog__body {
+        padding: 10px;
+    }
+    .el-dialog__footer {
+        display: none;
+    }
+    .hc-media-recorder-box {
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        cursor: pointer;
+        img {
+            width: 300px;
+        }
+        .content-box {
+            position: absolute;
+            width: 140px;
+            height: 60px;
+            text-align: center;
+            color: #464646;
+            .shut-down-icon {
+                font-size: 24px;
+                margin-bottom: 14px;
+            }
+            .time-box {
+                position: relative;
+                .time {
+                    color: #FFAF75;
+                }
+            }
+        }
+        &.ban {
+            cursor: not-allowed;
+        }
+    }
+    .content-search-word {
+        position: relative;
+        height: 300px;
+        .content-word-box {
+            font-size: 16px;
+            position: relative;
+            display: flex;
+            align-items: flex-start;
+            color: #444444;
+            .search-word {
+                position: relative;
+                color: #ec7c2b;
+                flex: 1;
+            }
+        }
+        .word-btn-box {
+            position: absolute;
+            overflow: hidden;
+            width: 100%;
+            bottom: 0;
+        }
+    }
+}
+
+html.dark {
+    .hc-media-mic-box .hc-icon-mic .el-loading-mask{
+        backdrop-filter: none;
+        background-color: var(--el-mask-color);
+        .el-loading-spinner {
+            top: 50%;
+        }
+    }
+    .el-dialog.hc-media-recorder-dialog {
+        --el-dialog-bg-color: #ffffff !important;
+    }
+}

+ 214 - 0
src/views/archives/manage/components/meta-table.vue

@@ -0,0 +1,214 @@
+<template>
+    <div v-loading="isLoading" class="hc-csc-meta-table-data">
+        <el-scrollbar>
+            <table class="hc-csc-meta-table" border="1">
+                <tbody>
+                    <tr class="hc-csc-meta-table-tr">
+                        <td v-if="!iShowFile" colspan="2" class="hc-csc-meta-table-td title">
+                            案卷元数据信息
+                        </td>
+                        <td v-else colspan="2" class="hc-csc-meta-table-td title">
+                            文件元数据信息
+                        </td>
+                    </tr>
+                    <template v-for="item in metaDataTableVal" :key="item.id">
+                        <tr v-if="item.isType === 1" class="hc-csc-meta-table-tr">
+                            <td colspan="2" class="hc-csc-meta-table-td title">
+                                {{ item.containerName }}
+                            </td>
+                        </tr>
+                        <tr v-if="item.isType === 3" class="hc-csc-meta-table-tr">
+                            <td colspan="2" class="hc-csc-meta-table-td" style="text-align: center;">
+                                {{ item.containerName }}
+                            </td>
+                        </tr>
+                        <tr v-else class="hc-csc-meta-table-tr">
+                            <td class="hc-csc-meta-table-td name">
+                                {{ item.containerName }}
+                            </td>
+                            <td class="hc-csc-meta-table-td val">
+                                {{ item.keyValue }}
+                            </td>
+                        </tr>
+                    </template>
+                </tbody>
+            </table>
+            <hc-empty v-if="metaDataTableVal.length == 0" />
+        </el-scrollbar>
+    </div>
+</template>
+
+<script setup>
+import { ref, watch } from 'vue'
+
+//参数
+const props = defineProps({
+    projectId: {
+        type: [String, Number],
+        default: '',
+    },
+    contractId: {
+        type: [String, Number],
+        default: '',
+    },
+    loading: {
+        type: Boolean,
+        default: false,
+    },
+    ishowFile:{
+        type: Boolean,
+        default: false,
+    },
+    metaDataTable:{
+        type: [Array],
+        default: '',
+    },
+})
+
+//变量
+const projectId = ref(props.projectId)
+const contractId = ref(props.contractId)
+const isLoading = ref(props.loading)
+const iShowFile = ref(props.ishowFile)
+const metaDataTableVal = ref(props.metaDataTable)
+
+//监听
+watch(() => [
+    props.loading,
+    props.ishowFile,
+    props.metaDataTable,
+], ([loading, ishowFile, metaDataTable]) => {
+    console.log(metaDataTable, 'metaDataTable')
+    console.log(ishowFile, 'ishowFile')
+    isLoading.value = loading
+    console.log(ishowFile, 'ishowFile')
+    iShowFile.value = ishowFile
+    metaDataTableVal.value = metaDataTable
+})
+
+//元数据
+const metaDataTable = ref([
+    { type: 1, title: '聚合层次', val: '' },
+    { type: 2, title: '来源', val: '' },
+    { type: 1, title: '全宗名称', val: '' },
+    { type: 1, title: '立档单位名称', val: '' },
+    { type: 1, title: '电子文件号', val: '' },
+    { type: 2, title: '文件联', val: '' },
+    { type: 1, title: '目录文件', val: '' },
+    { type: 1, title: '文件件数', val: '' },
+    { type: 1, title: '文件页数', val: '' },
+    { type: 1, title: '元数据目录文件', val: '' },
+    { type: 1, title: '验证码', val: '' },
+    { type: 2, title: '内容描述', val: '' },
+    { type: 1, title: '题名', val: '' },
+    { type: 1, title: '关键词', val: '' },
+    { type: 1, title: '摘要', val: '' },
+    { type: 1, title: '生成方式', val: '' },
+    { type: 1, title: '责任者', val: '' },
+    { type: 1, title: '文件创建日期', val: '' },
+    { type: 2, title: '组件', val: '' },
+    { type: 1, title: 'IP地址', val: '' },
+    { type: 1, title: '桩号', val: '' },
+    { type: 1, title: '上传时间', val: '' },
+    { type: 2, title: '文件标识码', val: '' },
+    { type: 1, title: '文号', val: '' },
+    { type: 1, title: '表单标识码', val: '' },
+    { type: 2, title: '竣工图', val: '' },
+    { type: 1, title: '图号', val: '' },
+    { type: 1, title: '图幅', val: '' },
+    { type: 1, title: '图表来源', val: '' },
+    { type: 1, title: '引用变更令编号', val: '' },
+    { type: 2, title: '照片文件', val: '' },
+    { type: 1, title: '主题', val: '' },
+    { type: 1, title: '拍摄时间', val: '' },
+    { type: 1, title: '拍摄地点', val: '' },
+    { type: 1, title: '摄影者', val: '' },
+    { type: 1, title: '背景', val: '' },
+    { type: 1, title: '分组号', val: '' },
+    { type: 1, title: '组内照片编号', val: '' },
+    { type: 1, title: '水平分辨率', val: '' },
+    { type: 1, title: '垂直分辨率', val: '' },
+    { type: 1, title: '保管期限', val: '' },
+    { type: 1, title: '格式信息', val: '' },
+    { type: 2, title: '电子属性', val: '' },
+    { type: 1, title: '位置', val: '' },
+    { type: 1, title: '计算机文件名', val: '' },
+    { type: 1, title: '计算机文件大小', val: '' },
+    { type: 2, title: '数字化属性', val: '' },
+    { type: 1, title: '扫描分辨率', val: '' },
+    { type: 1, title: '扫描色彩模式', val: '' },
+    { type: 2, title: '电子签名', val: '' },
+    { type: 1, title: '签名类型', val: '' },
+    { type: 1, title: '签名时间', val: '' },
+    { type: 1, title: '签名人', val: '' },
+    { type: 1, title: '建设项目', val: '' },
+    { type: 2, title: '业务事项', val: '' },
+    { type: 1, title: '单位工程', val: '' },
+    { type: 1, title: '分部工程', val: '' },
+    { type: 1, title: '分项工程', val: '' },
+    { type: 1, title: '单位工程编码', val: '' },
+    { type: 1, title: '分部工程编码', val: '' },
+    { type: 1, title: '分项工程编码', val: '' },
+    { type: 2, title: '责任者', val: '' },
+    { type: 1, title: '责任者名称', val: '' },
+    { type: 1, title: '个人职位', val: '' },
+    { type: 1, title: '责任者手机号', val: '' },
+    { type: 2, title: '关系实体', val: '' },
+    { type: 1, title: '关系标识', val: '' },
+    { type: 1, title: '关系类型', val: '' },
+    { type: 1, title: '关系', val: '' },
+    { type: 1, title: '相关实体标识', val: '' },
+])
+</script>
+
+<style lang="scss" scoped>
+.hc-csc-meta-table-data {
+    position: relative;
+    height: 100%;
+    .hc-csc-meta-table {
+        border-spacing: 0;
+        border: 1px solid #E9E9E9;
+        border-collapse: collapse;
+        width: 100%;
+        .hc-csc-meta-table-tr {
+            position: relative;
+            background: #f1f5f8;
+            color: #50545e;
+            transition: background-color .25s ease;
+            &:hover {
+                background: var(--el-color-primary-light-9);
+            }
+            .hc-csc-meta-table-td {
+                text-align: left;
+                padding: 10px 12px;
+                font-size: 14px;
+                border: 1px solid #E9E9E9;
+                &.name {
+                    width: 150px;
+                }
+                &.title {
+                    color: #1a1a1a;
+                    text-align: center;
+                    background-color: #dae8f3;
+                }
+            }
+        }
+    }
+}
+html.dark{
+    .hc-csc-meta-table-data .hc-csc-meta-table{
+        border: 1px solid var(--el-color-primary);
+        .hc-csc-meta-table-tr{
+            background-color: transparent;
+            color: white;
+            .hc-csc-meta-table-td{
+                border: 1px solid var(--el-color-primary);
+                &.title {
+                    color: white;
+                    background-color: transparent;
+                }
+            }
+        }
+    }
+}
+</style>

+ 1 - 1
src/views/archives/manage/inspects.vue

@@ -646,7 +646,7 @@ const getmetaInfo = async (fileId)=>{
 
 <style lang="scss">
 @import '~style/transfer/inspects.scss';
-@import '../../styles/theme/transfer/inspect.scss';
+@import '~/src/styles/theme/transfer/inspect.scss';
 .act-border{
     border: 1px solid var(--el-color-primary);
 }

+ 2 - 1
src/views/archives/manage/query.vue

@@ -537,7 +537,8 @@
 import { onMounted, ref, watch } from 'vue'
 import { useAppStore } from '~src/store'
 import { arrIndex, arrToId, downloadBlob, getArrValue, getObjValue, isArrIndex, isNullES } from 'js-fast-way'
-import MetaTable from '../transfer/components/meta-table.vue'
+import MetaTable from './components/meta-table.vue'
+
 import HcMediaMic from './components/media-mic/index.vue'
 import archiveQueryApi from '~api/using/query.js'
 import tuningApi from '~api/archiveConfig/tuning.js'

+ 32 - 9
src/views/transfer/hand-over.vue

@@ -11,7 +11,7 @@
             </div>
 
             <div v-if="stepsKey === 0" class="hc-body-center-box">
-                <el-button type="primary" hc-btn @click="isExpertAcceptance = !isExpertAcceptance">切换通过状态</el-button>
+                <el-button type="primary" hc-btn @click="isExpertAcceptance = !isExpertAcceptance">切换验收通过状态</el-button>
                 <div v-if="!isExpertAcceptance" class="hc-content-box">
                     <div class="mb-5 text-gray">当前项目档案未通过验收,未达到移交条件</div>
                     <el-button type="primary" hc-btn style="width: 268px;height: 68px;font-weight: bold;" @click="toTransferInitial">去申请验收</el-button>
@@ -23,27 +23,43 @@
             </div>
 
             <div v-if="stepsKey === 1" class="hc-body-center-box">
-                <el-button type="primary" hc-btn @click="isCustodyTest = !isCustodyTest">切换通过状态</el-button>
+                <el-button type="primary" hc-btn @click="changeIsCustodyTest">切换四性检测状态</el-button>
+                <el-button type="primary" hc-btn @click="isTesting = !isTesting">切换四性检测中状态</el-button>
                 <div v-if="!isCustodyTest" class="hc-content-box">
                     <img :src="bgColor" alt="">
                    
                     <div class="mb-5 text-3xl text-gray">专家验收已通过</div>
                     <el-button type="primary" hc-btn style="width: 268px;height: 68px;font-weight: bold;" @click="custodyTesting">点击进入四性检测</el-button>
                 </div>
-                <div v-else class="hc-content-box">
-                    <img :src="jianCe" alt="">
-                    <div class="mt-5 text-3xl text-gray">检测中</div>
+              
+                <div v-else>
+                    <div v-if="isTesting" class="hc-content-box">
+                        <div class="mb-5 text-gray">当前项目档案未通过四性检测,未达到移交条件</div>
+                        <el-button type="primary" hc-btn style="width: 268px;height: 68px;font-weight: bold;" @click="toTransferInitial">重新检测</el-button>
+                    </div>
+                    <div v-else class="hc-content-box">
+                        <img :src="jianCe" alt="">
+                        <div class="mt-5 text-3xl text-gray">检测中</div>
+                    </div>
                 </div>
             </div>
 
             <div v-if="stepsKey === 2 && stepsKeys === 1 && !isShowMoveSubmit " class="hc-body-center-box">
-                <div class="hc-content-box">
+                <el-button type="primary" hc-btn @click="isOverTest = !isOverTest">切换检测通过状态</el-button>
+                <div v-if="isOverTest" class="hc-content-box">
                     <img :src="bgColor" alt="">
-                    <div class="mb-5 text-3xl text-black">
+                    <div class="mb-5 text-3xl text-gray">
                         四性检测已通过
                     </div>
                     <el-button type="primary" hc-btn style="width: 268px;height: 68px;font-weight: bold;" @click="moveClick">点击进入移交登记</el-button>
                 </div>
+                <div v-else class="hc-content-box">
+                    <img :src="fileClose" alt="" class="h-240px w-240px">
+                    <div class="mb-5 text-3xl text-gray">
+                        四性检测未通过
+                    </div>
+                    <el-button type="primary" hc-btn style="width: 268px;height: 68px;font-weight: bold;" @click="moveClick">点击进入移交登记</el-button>
+                </div>
             </div>
             <div v-if="stepsKey === 2 && stepsKeys === 1 && isShowMoveSubmit" class="hc-content-box-submit">
                 <moveSubmit />
@@ -155,6 +171,7 @@ import yanShou from '~src/assets/hande-over/yanshou.png'
 import jianCe from '~src/assets/hande-over/jiance.png'
 import seal from '~src/assets/hande-over/seal.svg'
 import moveSubmit from './move-submit.vue'
+import fileClose from '~src/assets/hande-over/file-close-line.svg'
 //变量
 const router = useRouter()
 const useAppState = useAppStore()
@@ -178,8 +195,13 @@ const stepsKeysClick = (val) => {
     stepsKeys.value = val
 }
 //是否正在专家验收中
-const isExpertAcceptance = ref(true)
-const isCustodyTest = ref(true)
+const isExpertAcceptance = ref(false)
+const isCustodyTest = ref(false)
+const isTesting = ref(false)
+const changeIsCustodyTest = () => {
+    isCustodyTest.value = !isCustodyTest.value
+    // isTesting.value = !isTesting.value
+}
 //去申请验收
 const toTransferInitial = () => {
     router.push({
@@ -256,6 +278,7 @@ const isShowMoveSubmit = ref(false)
 const stepsData = ref([
     
 ])
+const isOverTest = ref(true)
 </script>
 
 <style lang="scss" scoped>