From 66d9c9f157d6336d2325d65d9ec0012f325ee447 Mon Sep 17 00:00:00 2001
From: 马宇豪 <978517621@qq.com>
Date: 星期五, 19 一月 2024 13:28:32 +0800
Subject: [PATCH] 新增页面组件

---
 src/views/safetyReview/projectManage/components/confirmEnd.vue        |  198 ++++++++++++++++++
 src/views/safetyReview/projectManage/components/innerReview.vue       |    1 
 src/views/safetyReview/projectManage/components/projectArchive.vue    |  237 +++++++++++++++++++++
 src/views/safetyReview/projectManage/components/signConfirm.vue       |  153 +++++++++++++
 src/views/safetyReview/projectManage/process.vue                      |   14 +
 src/views/safetyReview/projectManage/components/processCtrlReview.vue |    2 
 6 files changed, 602 insertions(+), 3 deletions(-)

diff --git a/src/views/safetyReview/projectManage/components/confirmEnd.vue b/src/views/safetyReview/projectManage/components/confirmEnd.vue
new file mode 100644
index 0000000..f265876
--- /dev/null
+++ b/src/views/safetyReview/projectManage/components/confirmEnd.vue
@@ -0,0 +1,198 @@
+<template>
+  <div class="riskBox">
+    <el-form ref="formRef" :model="state.formData" :rules="state.rules" class="register-form" label-position="top">
+      <el-row :gutter="30">
+        <el-col :span="6">
+          <el-button type="primary" @click="addRectify">新增整改</el-button>
+        </el-col>
+      </el-row>
+      <el-table  :data="state.rectifyList" :border="true" style="margin: 20px 0">
+        <el-table-column label="序号" width="60" align="center" type="index"></el-table-column>
+        <el-table-column label="整改时间" header-align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-date-picker
+                style="width: 100%"
+                v-model="scope.row.startDate"
+                type="date"
+                value-format="YYYY-MM-DD 00:00:00"
+                placeholder="选择日期"
+                size="large"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="整改人" header-align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-input v-model="scope.row.deviceName" maxlength="50" show-word-limit type="text" size="large"/>
+          </template>
+        </el-table-column>
+        <el-table-column label="附件" header-align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-upload accept=".pdf" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" :limit='1' v-model:file-list="state.fileList[scope.$index]" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove">
+              <el-button type="primary">附件上传</el-button>
+              <template #tip>
+                <div class="el-upload__tip">上传pdf尺寸小于5M,最多可上传1张</div>
+              </template>
+            </el-upload>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" header-align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-button link type="danger" @click="delRectify(scope.$index)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-form>
+  </div>
+
+</template>
+<script setup>
+
+import {defineEmits, onMounted, reactive, ref} from "vue";
+import {ElMessage} from "element-plus";
+import {addRecord, editRecord, getDetail} from "@/api/projectManage/contractMng";
+import Cookies from "js-cookie";
+import { getToken } from "@/utils/auth";
+
+const emit = defineEmits(["getNextStatus"]);
+const state = reactive({
+  formData: {
+    id: '',
+    contractSignDate: '',
+    contractMoney: '',
+    contractIntroduction: ''
+  },
+  rectifyList: [],
+  rules: {
+    contractSignDate: [{required: true, message: '请选择合同签订日期', trigger: 'blur'}],
+    contractMoney: [{required: true, message: '请输入项目合同额', trigger: 'blur'}]
+  },
+  fileList: [],
+  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
+  header: {
+    Authorization: 'Bearer ' + getToken()
+  }
+})
+
+const isAmin = ref(false)
+const formRef = ref();
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  if(userInfo.identity === 0){
+    isAmin.value = true;
+  }
+});
+
+const riskOpen = async (type,val) => {
+  state.formData.projectId = val;
+  if(type === 'detail' || type === 'edit' ){
+    const res = await getDetail({projectId: val});
+    if(res.code == 200){
+      state.formData = res.data;
+    }else {
+      ElMessage.warning(res.message)
+    }
+  }
+  if(type === 'add' || type === 'clickEdit') {
+    const valid = await formRef.value.validate();
+    if(valid){
+      if (isAmin.value) {
+        ElMessage.warning("当前用户暂无权限");
+        return;
+      }
+      if(type === 'add'){
+        const {id, ...data} = JSON.parse(JSON.stringify(state.formData))
+        const res = await addRecord(data);
+        if (res.code == 200) {
+          ElMessage.success('保存成功')
+          formRef.value.clearValidate();
+          emit('getNextStatus', state.formData.projectId);
+        } else {
+          ElMessage.warning(res.message)
+        }
+      }else if(type === 'clickEdit'){
+        const { ...data} = JSON.parse(JSON.stringify(state.formData))
+        const res = await editRecord(data);
+        if (res.code == 200) {
+          ElMessage.success('变更成功')
+          formRef.value.clearValidate();
+          // emit('getNextStatus', data.project.id);
+        } else {
+          ElMessage.warning(res.message)
+        }
+      }
+    }
+  }
+}
+
+const addRectify = ()=>{
+  let file = {
+    fileName: '',
+    deviceName: '',
+    startDate: '',
+    endDate: ''
+  }
+  state.rectifyList.push(file)
+}
+
+const delRectify = (index)=>{
+  state.rectifyList.splice(index,1)
+}
+
+// 图片上传
+const showTip =()=>{
+  ElMessage({
+    type: 'warning',
+    message: '超出文件上传数量'
+  });
+}
+
+const picSize = async (rawFile) => {
+  if(rawFile.size / 1024 / 1024 > 5){
+    ElMessage({
+      type: 'warning',
+      message: '文件大小不能超过5M'
+    });
+    return false
+  }
+};
+
+const handleAvatarSuccess = (res, uploadFile) => {
+  if(res.code == 200){
+    // state.registerForm.agency.reportPath = res.data.path
+  }else{
+    ElMessage({
+      type: 'warning',
+      message: '文件上传失败'
+    })
+  }
+}
+
+const handleRemove = async (file, uploadFiles) => {
+  const res = await delPic({path: state.registerForm.agency.reportPath})
+  if(res.code == 200){
+    ElMessage({
+      type: 'success',
+      message: '文件已删除'
+    })
+  }else{
+    ElMessage({
+      type: 'warning',
+      message: res.message
+    })
+  }
+}
+
+defineExpose({
+  riskOpen
+});
+
+
+</script>
+<style scoped lang="scss">
+.riskBox{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+}
+
+</style>
diff --git a/src/views/safetyReview/projectManage/components/innerReview.vue b/src/views/safetyReview/projectManage/components/innerReview.vue
index b739bdc..fab78be 100644
--- a/src/views/safetyReview/projectManage/components/innerReview.vue
+++ b/src/views/safetyReview/projectManage/components/innerReview.vue
@@ -124,6 +124,7 @@
     {id: 12, content: '可报技术负责人审核', status: 1}
   ],
   imgLimit: 1,
+  fileList: [],
   uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
   header: {
     Authorization: 'Bearer ' + getToken()
diff --git a/src/views/safetyReview/projectManage/components/processCtrlReview.vue b/src/views/safetyReview/projectManage/components/processCtrlReview.vue
index 1f96f84..53a9102 100644
--- a/src/views/safetyReview/projectManage/components/processCtrlReview.vue
+++ b/src/views/safetyReview/projectManage/components/processCtrlReview.vue
@@ -59,7 +59,7 @@
             </el-radio-group>
           </template>
         </el-table-column>
-        <el-table-column label="不符合描述" header-align="center" class-name="small-padding fixed-width" width="175">
+        <el-table-column label="不符合描述" header-align="center" class-name="small-padding fixed-width" width="700">
           <template #default="scope">
             <el-input
                 v-model="state.formData.leader.name"
diff --git a/src/views/safetyReview/projectManage/components/projectArchive.vue b/src/views/safetyReview/projectManage/components/projectArchive.vue
new file mode 100644
index 0000000..7f832e3
--- /dev/null
+++ b/src/views/safetyReview/projectManage/components/projectArchive.vue
@@ -0,0 +1,237 @@
+<template>
+  <div class="riskBox">
+    <el-form ref="formRef" :model="state.formData" :rules="state.rules" class="register-form" label-position="top">
+      <el-row :gutter="30">
+        <el-col :span="6">
+          <el-button type="primary" @click="addUpload">新增附件</el-button>
+        </el-col>
+      </el-row>
+      <el-table  :data="state.uploadList" :border="true" style="margin: 20px 0">
+        <el-table-column label="序号" width="60" align="center" type="index"></el-table-column>
+        <el-table-column label="名称" header-align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-input v-model="scope.row.fileName" maxlength="30" show-word-limit type="text" size="large"/>
+          </template>
+        </el-table-column>
+        <el-table-column label="是否必须文件" header-align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-radio-group v-model="state.formData.status" >
+              <el-radio :label="1">是</el-radio>
+              <el-radio :label="0">否</el-radio>
+            </el-radio-group>
+          </template>
+        </el-table-column>
+        <el-table-column label="原因说明" header-align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-input v-model="scope.row.deviceName" maxlength="50" show-word-limit type="text" size="large"/>
+          </template>
+        </el-table-column>
+        <el-table-column label="附件上传" header-align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-upload accept="image/*,.pdf" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" :limit='1' v-model:file-list="state.fileList[scope.$index]" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove">
+              <el-button type="primary">附件上传</el-button>
+              <template #tip>
+                <div class="el-upload__tip">上传图片或pdf尺寸小于5M,最多可上传1张</div>
+              </template>
+            </el-upload>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" header-align="center" class-name="small-padding fixed-width">
+          <template #default="scope">
+            <el-button link type="danger" @click="delUpload(scope.$index)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-row :gutter="30">
+        <el-col :span="6">
+          <el-form-item prop="contractSignDate" label="合同签订日期">
+            <el-date-picker
+                style="width: 100%"
+                v-model="state.formData.contractSignDate"
+                type="date"
+                value-format="YYYY-MM-DD 00:00:00"
+                placeholder="选择日期"
+                size="large"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="18">
+          <el-form-item prop="contractMoney">
+            <template #label>
+              项目合同额<span style="font-size: 13px;color: red;font-weight: normal;display: inline-block;margin-left: 6px">预估合同金额,归档阶段可以进行修改。仅支持数字,单位万元,小数点后最多两位,数值范围(0.01-999.99)</span>
+            </template>
+            <el-input
+                v-model="state.formData.contractMoney"
+                size="large"
+                type="number"
+                placeholder="请输入项目合同额"
+            >
+              <template #append>万元</template>
+            </el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-form-item label="实际合同额说明">
+        <el-input
+            v-model="state.formData.contractIntroduction"
+            :autosize="{ minRows: 6 }"
+            maxlength="100"
+            show-word-limit
+            type="textarea">
+        </el-input>
+      </el-form-item>
+    </el-form>
+  </div>
+
+</template>
+<script setup>
+
+import {defineEmits, onMounted, reactive, ref} from "vue";
+import {ElMessage} from "element-plus";
+import {addRecord, editRecord, getDetail} from "@/api/projectManage/contractMng";
+import Cookies from "js-cookie";
+import { getToken } from "@/utils/auth";
+
+const emit = defineEmits(["getNextStatus"]);
+const state = reactive({
+  formData: {
+    id: '',
+    contractSignDate: '',
+    contractMoney: '',
+    contractIntroduction: ''
+  },
+  uploadList: [],
+  rules: {
+    contractSignDate: [{required: true, message: '请选择合同签订日期', trigger: 'blur'}],
+    contractMoney: [{required: true, message: '请输入项目合同额', trigger: 'blur'}]
+  },
+  fileList: [],
+  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
+  header: {
+    Authorization: 'Bearer ' + getToken()
+  }
+})
+
+const isAmin = ref(false)
+const formRef = ref();
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  if(userInfo.identity === 0){
+    isAmin.value = true;
+  }
+});
+
+const riskOpen = async (type,val) => {
+  state.formData.projectId = val;
+  if(type === 'detail' || type === 'edit' ){
+    const res = await getDetail({projectId: val});
+    if(res.code == 200){
+      state.formData = res.data;
+    }else {
+      ElMessage.warning(res.message)
+    }
+  }
+  if(type === 'add' || type === 'clickEdit') {
+    const valid = await formRef.value.validate();
+    if(valid){
+      if (isAmin.value) {
+        ElMessage.warning("当前用户暂无权限");
+        return;
+      }
+      if(type === 'add'){
+        const {id, ...data} = JSON.parse(JSON.stringify(state.formData))
+        const res = await addRecord(data);
+        if (res.code == 200) {
+          ElMessage.success('保存成功')
+          formRef.value.clearValidate();
+          emit('getNextStatus', state.formData.projectId);
+        } else {
+          ElMessage.warning(res.message)
+        }
+      }else if(type === 'clickEdit'){
+        const { ...data} = JSON.parse(JSON.stringify(state.formData))
+        const res = await editRecord(data);
+        if (res.code == 200) {
+          ElMessage.success('变更成功')
+          formRef.value.clearValidate();
+          // emit('getNextStatus', data.project.id);
+        } else {
+          ElMessage.warning(res.message)
+        }
+      }
+    }
+  }
+}
+
+const addUpload = ()=>{
+  let file = {
+    fileName: '',
+    deviceName: '',
+    startDate: '',
+    endDate: ''
+  }
+  state.uploadList.push(file)
+}
+
+const delUpload = (index)=>{
+  state.uploadList.splice(index,1)
+}
+
+// 图片上传
+const showTip =()=>{
+  ElMessage({
+    type: 'warning',
+    message: '超出文件上传数量'
+  });
+}
+
+const picSize = async (rawFile) => {
+  if(rawFile.size / 1024 / 1024 > 5){
+    ElMessage({
+      type: 'warning',
+      message: '文件大小不能超过5M'
+    });
+    return false
+  }
+};
+
+const handleAvatarSuccess = (res, uploadFile) => {
+  if(res.code == 200){
+    // state.registerForm.agency.reportPath = res.data.path
+  }else{
+    ElMessage({
+      type: 'warning',
+      message: '文件上传失败'
+    })
+  }
+}
+
+const handleRemove = async (file, uploadFiles) => {
+  const res = await delPic({path: state.registerForm.agency.reportPath})
+  if(res.code == 200){
+    ElMessage({
+      type: 'success',
+      message: '文件已删除'
+    })
+  }else{
+    ElMessage({
+      type: 'warning',
+      message: res.message
+    })
+  }
+}
+
+defineExpose({
+  riskOpen
+});
+
+
+</script>
+<style scoped lang="scss">
+.riskBox{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+}
+
+</style>
diff --git a/src/views/safetyReview/projectManage/components/signConfirm.vue b/src/views/safetyReview/projectManage/components/signConfirm.vue
new file mode 100644
index 0000000..2d4c53a
--- /dev/null
+++ b/src/views/safetyReview/projectManage/components/signConfirm.vue
@@ -0,0 +1,153 @@
+<template>
+  <div class="riskBox">
+    <el-table v-loading="loading" ref="tableRef" :data="tableData" :border="true">
+      <el-table-column type="index" width="55" />
+      <el-table-column label="人员姓名" prop="name" align="center"/>
+      <el-table-column label="联系电话" prop="phone" align="center"/>
+      <el-table-column label="职位" prop="phone" align="center"/>
+      <el-table-column label="项目担任角色" prop="username" align="center"/>
+      <el-table-column label="评价师等级" prop="username" align="center"/>
+      <el-table-column label="专业能力" prop="username" align="center"/>
+      <el-table-column label="人员类型" prop="username" align="center"/>
+      <el-table-column label="扫脸时间" prop="username" align="center"/>
+      <el-table-column label="是否扫脸" prop="username" align="center"/>
+      <el-table-column label="是否变更" prop="username" align="center"/>
+      <el-table-column label="人员类型" prop="username" align="center"/>
+      <el-table-column label="人脸照片" prop="socialSecurity" align="center" width="120">
+        <template #default="scope">
+          <div class="demo-image__preview" v-if="scope.row.socialAttach && scope.row.socialAttach.length>0">
+            <el-image
+                style="width: 100px; height: 100px"
+                :src= "scope.row.socialAttach[0]"
+                :zoom-rate="1.2"
+                :max-scale="7"
+                :min-scale="0.2"
+                :preview-src-list="scope.row.socialAttach"
+                :initial-index="0"
+                fit="cover"
+                preview-teleported="true"
+            />
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="签字图片" prop="socialSecurity" align="center" width="120">
+        <template #default="scope">
+          <div class="demo-image__preview" v-if="scope.row.socialAttach && scope.row.socialAttach.length>0">
+            <el-image
+                style="width: 100px; height: 100px"
+                :src= "scope.row.socialAttach[0]"
+                :zoom-rate="1.2"
+                :max-scale="7"
+                :min-scale="0.2"
+                :preview-src-list="scope.row.socialAttach"
+                :initial-index="0"
+                fit="cover"
+                preview-teleported="true"
+            />
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="承诺书" prop="socialSecurity" align="center" width="120">
+        <template #default="scope">
+          <el-button link>承诺书</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total > 0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+  </div>
+</template>
+<script setup>
+
+import {defineEmits, onMounted, reactive, ref, toRefs} from "vue";
+import {ElMessage} from "element-plus";
+import {Search} from '@element-plus/icons-vue'
+import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis"
+import {delPic} from "@/api/login"
+import { getToken } from "@/utils/auth";
+import Cookies from "js-cookie"
+const emit = defineEmits(["getNextStatus"]);
+
+const state = reactive({
+  loading: false,
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+  },
+  total: 0,
+  tableData: []
+})
+
+const {loading,queryParams,total,tableData} = toRefs(state)
+
+const isAmin = ref(false)
+const formRef = ref()
+onMounted(() => {
+  const userInfo = JSON.parse(Cookies.get('userInfo'))
+  if(userInfo.identity === 0){
+    isAmin.value = true;
+  }
+})
+
+const riskOpen = async (type,val) => {
+  if(type === 'detail' || type === 'edit' ){
+    const res = await getRiskDetail({projectId: val});
+    if(res.code == 200){
+      state.formData = res.data;
+    }else {
+      ElMessage.warning(res.message)
+    }
+  }
+  if(type === 'add' || type === 'clickEdit') {
+    const valid = await formRef.value.validate();
+    if(valid){
+      if (isAmin.value) {
+        ElMessage.warning("当前用户暂无权限");
+        return;
+      }
+      if(type === 'add'){
+        const {id, ...data} = JSON.parse(JSON.stringify(state.formData))
+        const res = await addRisk(data);
+        if (res.code == 200) {
+          ElMessage.success('保存成功')
+          formRef.value.clearValidate();
+          emit('getNextStatus', res.data);
+
+        } else {
+          ElMessage.warning(res.message)
+        }
+      }else if(type === 'clickEdit'){
+        const { ...data} = JSON.parse(JSON.stringify(state.formData))
+        const res = await editRisk(data);
+        if (res.code == 200) {
+          ElMessage.success('变更成功')
+          formRef.value.clearValidate();
+          // emit('getNextStatus', data.project.id);
+        } else {
+          ElMessage.warning(res.message)
+        }
+      }
+    }
+  }
+}
+
+defineExpose({
+  riskOpen
+});
+
+
+</script>
+<style scoped lang="scss">
+.riskBox{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+}
+
+</style>
diff --git a/src/views/safetyReview/projectManage/process.vue b/src/views/safetyReview/projectManage/process.vue
index 2c3a2c9..6c494dc 100644
--- a/src/views/safetyReview/projectManage/process.vue
+++ b/src/views/safetyReview/projectManage/process.vue
@@ -38,7 +38,7 @@
         <div class="card-header">{{selectedObj.id}}- {{selectedObj.name}}</div>
         <div class="card-content">
           <div :style="'height:' + middleContentHeight + 'px'" style="overflow-y: scroll;">
-            <rickAnalysis ref="riskRef" v-if="selectedObj.id === 2" @getNextStatus="getNextStatus"></rickAnalysis>
+            <rickAnalysis ref="riskRef" v-if="selectedObj.id === 1" @getNextStatus="getNextStatus"></rickAnalysis>
             <contract-manage ref="contractMngRef" v-if="selectedObj.id === 2" @getNextStatus="getNextStatus"></contract-manage>
             <evaluate-task-notice ref="evaluteRef" v-if="selectedObj.id === 3" @getNextStatus="getNextStatus"></evaluate-task-notice>
             <evaluate-plan ref="evalPlanRef" v-if="selectedObj.id === 4" @getNextStatus="getNextStatus"></evaluate-plan>
@@ -48,7 +48,10 @@
             <tech-leader-review ref="techReviewRef" v-if="selectedObj.id === 8" @getNextStatus="getNextStatus"></tech-leader-review>
             <upload-review-rcd ref="uploadReviewRef" v-if="selectedObj.id === 9" @getNextStatus="getNextStatus"></upload-review-rcd>
             <rate-conclusion ref="rateConRef" v-if="selectedObj.id === 10" @getNextStatus="getNextStatus"></rate-conclusion>
-            <process-ctrl-review ref="proCtrlRef" v-if="selectedObj.id === 1" @getNextStatus="getNextStatus"></process-ctrl-review>
+            <process-ctrl-review ref="proCtrlRef" v-if="selectedObj.id === 11" @getNextStatus="getNextStatus"></process-ctrl-review>
+            <project-archive ref="proArchRef" v-if="selectedObj.id === 12" @getNextStatus="getNextStatus"></project-archive>
+            <sign-confirm ref="signConfirmRef" v-if="selectedObj.id === 13" @getNextStatus="getNextStatus"></sign-confirm>
+            <confirm-end ref="confirmEndRef" v-if="selectedObj.id === 14" @getNextStatus="getNextStatus"></confirm-end>
           </div>
           <div style="display: flex;align-items: center;justify-content: center;margin-bottom: -20px">
             <el-button type="primary" v-if="selectedObj.id !== 1" style="width: 80px" @click="back">上一步</el-button>
@@ -92,6 +95,9 @@
 import UploadReviewRcd from "./components/uploadReviewRcd"
 import RateConclusion from "./components/rateConclusion"
 import ProcessCtrlReview from "./components/processCtrlReview"
+import ProjectArchive from "./components/projectArchive"
+import SignConfirm from "./components/signConfirm"
+import ConfirmEnd from "./components/confirmEnd"
 
 const route = useRoute()
 const menuList = ref([
@@ -212,6 +218,10 @@
 const uploadReviewRef = ref()
 const rateConRef = ref()
 const proCtrlRef = ref()
+const proArchRef = ref()
+const signConfirmRef = ref()
+const confirmEndRef = ref()
+
 const isShowMenu = ref(false)
 const selectedObj = ref({})
 const middleHeight = ref(0)

--
Gitblit v1.9.2