From 7446bd01fb7eb8ee4dd80176cd0dd5b049edee99 Mon Sep 17 00:00:00 2001
From: 马宇豪 <978517621@qq.com>
Date: 星期四, 18 一月 2024 16:24:49 +0800
Subject: [PATCH] 新增

---
 src/views/safetyReview/projectManage/components/innerReview.vue       |  263 +++++++++++
 src/views/safetyReview/projectManage/components/techLeaderReview.vue  |  260 +++++++++++
 src/views/safetyReview/projectManage/components/siteCheckRcd.vue      |  101 +++-
 src/views/safetyReview/projectManage/process.vue                      |   25 
 src/views/safetyReview/projectManage/components/processCtrlReview.vue |  266 ++++++++++++
 src/views/safetyReview/projectManage/components/rateConclusion.vue    |  186 ++++++++
 src/views/safetyReview/projectManage/components/uploadReviewRcd.vue   |  176 ++++++++
 7 files changed, 1,249 insertions(+), 28 deletions(-)

diff --git a/src/views/safetyReview/projectManage/components/innerReview.vue b/src/views/safetyReview/projectManage/components/innerReview.vue
new file mode 100644
index 0000000..b739bdc
--- /dev/null
+++ b/src/views/safetyReview/projectManage/components/innerReview.vue
@@ -0,0 +1,263 @@
+<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-form-item prop="transmitDate" label="审核日期">
+            <el-date-picker
+                style="width: 100%"
+                v-model="state.formData.transmitDate"
+                type="date"
+                value-format="YYYY-MM-DD 00:00:00"
+                placeholder="选择日期"
+                size="large"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item prop="leader.name" label="内部审核员">
+            <el-input
+                v-model="state.formData.leader.name"
+                size="large"
+                placeholder="请选择内部审核员"
+            >
+              <template #append>
+                <el-button :icon="Search" @click="openExperts('项目负责人')"/>
+              </template>
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item prop="transmitDate" label="内部审核确认日期">
+            <el-date-picker
+                style="width: 100%"
+                v-model="state.formData.transmitDate"
+                type="date"
+                value-format="YYYY-MM-DD 00:00:00"
+                placeholder="选择日期"
+                size="large"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="30">
+        <el-col :span="6">
+          <el-form-item label="附件上传">
+            <el-upload accept="image/*" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='state.imgLimit' v-model:file-list="state.fileList" list-type="picture-card" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove">
+              <el-icon><Plus /></el-icon>
+              <template #tip>
+                <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传1张</div>
+              </template>
+            </el-upload>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-table  :data="state.tableData" :border="true" style="margin: 20px 0">
+        <el-table-column label="序号" width="60" align="center" type="index"></el-table-column>
+        <el-table-column label="内容" prop="content" header-align="center" :show-overflow-tooltip="true"/>
+        <el-table-column label="选择" header-align="center" class-name="small-padding fixed-width" width="175">
+          <template #default="scope">
+            <el-radio-group v-model="scope.row.status" >
+              <el-radio :label="1">是</el-radio>
+              <el-radio :label="0">否</el-radio>
+            </el-radio-group>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-form-item prop="technology" label="存在问题及建议">
+        <el-input
+            v-model="state.formData.technology"
+            :autosize="{ minRows: 6 }"
+            maxlength="500"
+            show-word-limit
+            type="textarea">
+        </el-input>
+      </el-form-item>
+    </el-form>
+    <el-dialog v-model="state.dialogImg">
+      <el-image style="width: 100%; height: 100%" :src="state.dialogImageUrl"/>
+    </el-dialog>
+    <experts-list ref="expertsListRef" @getName="getSelected"></experts-list>
+  </div>
+</template>
+<script setup>
+
+import {defineEmits, onMounted, reactive, ref} 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"
+import ExpertsList from "./expertsList";
+const emit = defineEmits(["getNextStatus"]);
+
+const state = reactive({
+  formData: {
+    id: '',
+    leader: {
+      name: ''
+    },
+    leaderId: null,
+    linkMan: '',
+    transmitPerson: '',
+    transmitDate: ''
+  },
+  rules: {
+    "leader.name": [{required: true, message: '请选择项目负责人', trigger: 'blur'}],
+    linkMan: [{required: true, message: '请输入联系人', trigger: 'blur'}],
+    linkPhone: [{required: true, message: '请输入联系电话', trigger: 'blur'}],
+    transmitDate: [{required: true, message: '请选择任务下达时间', trigger: 'blur'}]
+  },
+  tableData: [
+    {id: 1, content: '评价依据是否充分、准确、有效', status: 1},
+    {id: 2, content: '评价范围是否与合同一致', status: 1},
+    {id: 3, content: '危险有害因素识别是否全面', status: 1},
+    {id: 4, content: '评价单元划分是否合理', status: 1},
+    {id: 5, content: '评价方法选择是否适当', status: 1},
+    {id: 6, content: '对策措施与建议是否可行', status: 1},
+    {id: 7, content: '结论是否正确', status: 1},
+    {id: 8, content: '格式是否符合要求', status: 1},
+    {id: 9, content: '附件与附图是否有效及规范', status: 1},
+    {id: 10, content: '文字、数据是否准确', status: 1},
+    {id: 11, content: '已按要求修改完成', status: 1},
+    {id: 12, content: '可报技术负责人审核', status: 1}
+  ],
+  imgLimit: 1,
+  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
+  header: {
+    Authorization: 'Bearer ' + getToken()
+  },
+  dialogImageUrl: '',
+  dialogImg: false
+})
+const props = {
+  expandTrigger: 'hover',
+  value: 'name',
+  label: 'name'
+}
+const isAmin = ref(false)
+const formRef = ref()
+const expertsListRef = 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)
+        }
+      }
+    }
+  }
+}
+
+const openExperts = (type) =>{
+  expertsListRef.value.openDialog(type)
+}
+
+const getSelected = (type,obj)=>{
+  state.formData.leader.name = obj.name
+  state.formData.leaderId = obj.id
+}
+
+// 图片上传
+const showTip =()=>{
+  ElMessage({
+    type: 'warning',
+    message: '超出文件上传数量'
+  });
+}
+
+const picSize = async (rawFile) => {
+  if(rawFile.size / 1024 / 1024 > 5){
+    ElMessage({
+      type: 'warning',
+      message: '文件大小不能超过5M'
+    });
+    return false
+  }
+};
+
+const handlePictureCardPreview = (uploadFile) => {
+  state.dialogImageUrl = uploadFile.url
+  state.dialogImg = true
+};
+
+
+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/processCtrlReview.vue b/src/views/safetyReview/projectManage/components/processCtrlReview.vue
new file mode 100644
index 0000000..1f96f84
--- /dev/null
+++ b/src/views/safetyReview/projectManage/components/processCtrlReview.vue
@@ -0,0 +1,266 @@
+<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-form-item prop="transmitDate" label="审核日期">
+            <el-date-picker
+                style="width: 100%"
+                v-model="state.formData.transmitDate"
+                type="date"
+                value-format="YYYY-MM-DD 00:00:00"
+                placeholder="选择日期"
+                size="large"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item prop="leader.name" label="过程控制负责人">
+            <el-input
+                v-model="state.formData.leader.name"
+                size="large"
+                placeholder="请选择内部审核员"
+            >
+              <template #append>
+                <el-button :icon="Search" @click="openExperts('过程控制负责人')"/>
+              </template>
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item prop="technology" label="审核结论:是否满足过程控制要求">
+            <el-radio-group v-model="state.formData.status" >
+              <el-radio :label="1">是</el-radio>
+              <el-radio :label="0">否</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="30">
+        <el-col :span="6">
+          <el-form-item label="附件上传">
+            <el-upload accept="image/*" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='state.imgLimit' v-model:file-list="state.fileList" list-type="picture-card" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove">
+              <el-icon><Plus /></el-icon>
+              <template #tip>
+                <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传1张</div>
+              </template>
+            </el-upload>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-table  :data="state.tableData" :border="true" style="margin: 20px 0">
+        <el-table-column label="序号" width="60" align="center" type="index"></el-table-column>
+        <el-table-column label="过程控制关键点" prop="content" header-align="center" :show-overflow-tooltip="true"/>
+        <el-table-column label="审核结果" header-align="center" class-name="small-padding fixed-width" width="175">
+          <template #default="scope">
+            <el-radio-group v-model="scope.row.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" width="175">
+          <template #default="scope">
+            <el-input
+                v-model="state.formData.leader.name"
+                size="large"
+                disabled
+                placeholder="如不符合,请填写不符合描述"
+            />
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-form-item prop="technology" label="存在问题及建议">
+        <el-input
+            v-model="state.formData.technology"
+            :autosize="{ minRows: 6 }"
+            maxlength="500"
+            show-word-limit
+            type="textarea">
+        </el-input>
+      </el-form-item>
+    </el-form>
+    <el-dialog v-model="state.dialogImg">
+      <el-image style="width: 100%; height: 100%" :src="state.dialogImageUrl"/>
+    </el-dialog>
+    <experts-list ref="expertsListRef" @getName="getSelected"></experts-list>
+  </div>
+</template>
+<script setup>
+
+import {defineEmits, onMounted, reactive, ref} 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"
+import ExpertsList from "./expertsList";
+const emit = defineEmits(["getNextStatus"]);
+
+const state = reactive({
+  formData: {
+    id: '',
+    leader: {
+      name: ''
+    },
+    leaderId: null,
+    linkMan: '',
+    transmitPerson: '',
+    transmitDate: ''
+  },
+  rules: {
+    "leader.name": [{required: true, message: '请选择项目负责人', trigger: 'blur'}],
+    linkMan: [{required: true, message: '请输入联系人', trigger: 'blur'}],
+    linkPhone: [{required: true, message: '请输入联系电话', trigger: 'blur'}],
+    transmitDate: [{required: true, message: '请选择任务下达时间', trigger: 'blur'}]
+  },
+  tableData: [
+    {id: 1, content: '报告中所列评价依据是否得到引用和验证', status: 1},
+    {id: 2, content: '现场收集的有关资料是否齐全、有效', status: 1},
+    {id: 3, content: '危险有害因素识别是否充分', status: 1},
+    {id: 4, content: '报告是否有重大遗漏', status: 0},
+    {id: 5, content: '评价方法选用是否合理', status: 1},
+    {id: 6, content: '对策措施及建议是否具有针对性、合理性', status: 1},
+    {id: 7, content: '评价结论及格式是否正确', status: 1},
+    {id: 8, content: '已按要求修改完成', status: 1},
+    {id: 9, content: '可报过程控制负责人审核', status: 1}
+  ],
+  imgLimit: 1,
+  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
+  header: {
+    Authorization: 'Bearer ' + getToken()
+  },
+  dialogImageUrl: '',
+  dialogImg: false
+})
+const props = {
+  expandTrigger: 'hover',
+  value: 'name',
+  label: 'name'
+}
+const isAmin = ref(false)
+const formRef = ref()
+const expertsListRef = 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)
+        }
+      }
+    }
+  }
+}
+
+const openExperts = (type) =>{
+  expertsListRef.value.openDialog(type)
+}
+
+const getSelected = (type,obj)=>{
+  state.formData.leader.name = obj.name
+  state.formData.leaderId = obj.id
+}
+
+// 图片上传
+const showTip =()=>{
+  ElMessage({
+    type: 'warning',
+    message: '超出文件上传数量'
+  });
+}
+
+const picSize = async (rawFile) => {
+  if(rawFile.size / 1024 / 1024 > 5){
+    ElMessage({
+      type: 'warning',
+      message: '文件大小不能超过5M'
+    });
+    return false
+  }
+};
+
+const handlePictureCardPreview = (uploadFile) => {
+  state.dialogImageUrl = uploadFile.url
+  state.dialogImg = true
+};
+
+
+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/rateConclusion.vue b/src/views/safetyReview/projectManage/components/rateConclusion.vue
new file mode 100644
index 0000000..b5d1f45
--- /dev/null
+++ b/src/views/safetyReview/projectManage/components/rateConclusion.vue
@@ -0,0 +1,186 @@
+<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="18">
+          <el-form-item label="附件上传">
+            <el-upload accept=".pdf,.doc,.docx" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" :limit='state.imgLimit' v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove">
+              <el-button type="primary">附件上传</el-button>
+              <template #tip>
+                <div class="el-upload__tip">支持上传pdf/word/doc/docx格式文件,尺寸小于2M,最多可上传3张</div>
+              </template>
+            </el-upload>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-form-item prop="technology" label="评价结论">
+        <el-input
+            v-model="state.formData.technology"
+            :autosize="{ minRows: 6 }"
+            maxlength="500"
+            show-word-limit
+            type="textarea">
+        </el-input>
+      </el-form-item>
+      <el-row :gutter="30">
+        <el-col :span="9">
+          <el-form-item prop="technology" label="是否有评价报告修改说明">
+            <el-radio-group v-model="state.formData.status" >
+              <el-radio :label="1">是</el-radio>
+              <el-radio :label="0">否</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+  </div>
+</template>
+<script setup>
+
+import {defineEmits, onMounted, reactive, ref} 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({
+  formData: {
+    id: '',
+    leader: {
+      name: ''
+    },
+    leaderId: null,
+    linkMan: '',
+    transmitPerson: '',
+    transmitDate: ''
+  },
+  rules: {
+    "leader.name": [{required: true, message: '请选择项目负责人', trigger: 'blur'}],
+    linkMan: [{required: true, message: '请输入联系人', trigger: 'blur'}],
+    linkPhone: [{required: true, message: '请输入联系电话', trigger: 'blur'}],
+    transmitDate: [{required: true, message: '请选择任务下达时间', trigger: 'blur'}]
+  },
+  tableData: [],
+  imgLimit: 3,
+  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
+  header: {
+    Authorization: 'Bearer ' + getToken()
+  }
+})
+const props = {
+  expandTrigger: 'hover',
+  value: 'name',
+  label: 'name'
+}
+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)
+        }
+      }
+    }
+  }
+}
+
+// 图片上传
+const showTip =()=>{
+  ElMessage({
+    type: 'warning',
+    message: '超出文件上传数量'
+  });
+}
+
+const picSize = async (rawFile) => {
+  if(rawFile.size / 1024 / 1024 > 2){
+    ElMessage({
+      type: 'warning',
+      message: '文件大小不能超过2M'
+    });
+    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/siteCheckRcd.vue b/src/views/safetyReview/projectManage/components/siteCheckRcd.vue
index 1c0da84..1230979 100644
--- a/src/views/safetyReview/projectManage/components/siteCheckRcd.vue
+++ b/src/views/safetyReview/projectManage/components/siteCheckRcd.vue
@@ -1,6 +1,15 @@
 <template>
   <div class="riskBox">
     <el-form ref="formRef" :model="state.formData" :rules="state.rules" class="register-form" label-position="top">
+      <el-row :gutter="30" style="margin-bottom: 20px">
+        <el-col :span="18">
+          <el-alert title="说明:现场勘验记录由项目组成员通过APP端进行信息填报,组长完成现场勘验并在APP端提交后,电脑可对资料信息完善并进行下一步操作。" type="warning" />
+        </el-col>
+        <el-col :span="6" style="display:flex;justify-content: right">
+          <el-button type="primary">全部查看</el-button>
+          <el-button type="primary">全部下载</el-button>
+        </el-col>
+      </el-row>
       <el-row :gutter="30">
         <el-col :span="6">
           <el-form-item prop="investigationDate" label="现场勘验时间">
@@ -36,29 +45,18 @@
           </el-form-item>
         </el-col>
       </el-row>
-<!--      <el-row :gutter="30">-->
-<!--        <el-col :span="6">-->
-<!--          <el-form-item label="附件上传">-->
-<!--            <el-upload-->
-<!--                accept="image/*"-->
-<!--                :action="state.uploadUrl"-->
-<!--                :headers="state.header"-->
-<!--                method="post"-->
-<!--                :on-success="(response, file, fileList) => handleAvatarSuccess(response, file, fileList, 1)"-->
-<!--                :on-preview="handlePictureCardPreview"-->
-<!--                v-model:file-list="state.socialList"-->
-<!--                list-type="picture-card"-->
-<!--                :before-upload="picSize"-->
-<!--                :on-remove="(file, file_list)=>{handleRemove(file, file_list, 1)}"-->
-<!--            >-->
-<!--              <el-icon><Plus /></el-icon>-->
-<!--              <template #tip>-->
-<!--                <div class="el-upload__tip">上传jpg/png图片尺寸小于5M</div>-->
-<!--              </template>-->
-<!--            </el-upload>-->
-<!--          </el-form-item>-->
-<!--        </el-col>-->
-<!--      </el-row>-->
+      <el-row :gutter="30">
+        <el-col :span="6">
+          <el-form-item label="附件上传">
+            <el-upload accept="image/*" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='state.imgLimit' v-model:file-list="state.fileList" list-type="picture-card" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove">
+              <el-icon><Plus /></el-icon>
+              <template #tip>
+                <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传1张</div>
+              </template>
+            </el-upload>
+          </el-form-item>
+        </el-col>
+      </el-row>
       <el-form-item prop="recordData" label="现场勘验记录">
         <el-input
             v-model="state.formData.recordData"
@@ -81,6 +79,8 @@
 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"])
 import MapLocation from "./mapLocation.vue"
@@ -97,6 +97,11 @@
   planPersons: [],
   rules: {
     recordData: [{required: true, message: '请填写现场勘验记录', trigger: 'blur'}]
+  },
+  imgLimit: 1,
+  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
+  header: {
+    Authorization: 'Bearer ' + getToken()
   }
 })
 
@@ -163,6 +168,56 @@
   state.formData.location = lng + ',' + lat
 }
 
+// 图片上传
+const showTip =()=>{
+  ElMessage({
+    type: 'warning',
+    message: '超出文件上传数量'
+  });
+}
+
+const picSize = async (rawFile) => {
+  if(rawFile.size / 1024 / 1024 > 5){
+    ElMessage({
+      type: 'warning',
+      message: '文件大小不能超过5M'
+    });
+    return false
+  }
+};
+
+const handlePictureCardPreview = (uploadFile) => {
+  state.dialogImageUrl = uploadFile.url
+  state.dialogImg = true
+};
+
+
+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
 });
diff --git a/src/views/safetyReview/projectManage/components/techLeaderReview.vue b/src/views/safetyReview/projectManage/components/techLeaderReview.vue
new file mode 100644
index 0000000..f208022
--- /dev/null
+++ b/src/views/safetyReview/projectManage/components/techLeaderReview.vue
@@ -0,0 +1,260 @@
+<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-form-item prop="transmitDate" label="审核日期">
+            <el-date-picker
+                style="width: 100%"
+                v-model="state.formData.transmitDate"
+                type="date"
+                value-format="YYYY-MM-DD 00:00:00"
+                placeholder="选择日期"
+                size="large"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item prop="leader.name" label="技术负责人">
+            <el-input
+                v-model="state.formData.leader.name"
+                size="large"
+                placeholder="请选择内部审核员"
+            >
+              <template #append>
+                <el-button :icon="Search" @click="openExperts('技术负责人')"/>
+              </template>
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item prop="transmitDate" label="确认日期">
+            <el-date-picker
+                style="width: 100%"
+                v-model="state.formData.transmitDate"
+                type="date"
+                value-format="YYYY-MM-DD 00:00:00"
+                placeholder="选择日期"
+                size="large"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="30">
+        <el-col :span="6">
+          <el-form-item label="附件上传">
+            <el-upload accept="image/*" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='state.imgLimit' v-model:file-list="state.fileList" list-type="picture-card" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove">
+              <el-icon><Plus /></el-icon>
+              <template #tip>
+                <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传1张</div>
+              </template>
+            </el-upload>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-table  :data="state.tableData" :border="true" style="margin: 20px 0">
+        <el-table-column label="序号" width="60" align="center" type="index"></el-table-column>
+        <el-table-column label="内容" prop="content" header-align="center" :show-overflow-tooltip="true"/>
+        <el-table-column label="选择" header-align="center" class-name="small-padding fixed-width" width="175">
+          <template #default="scope">
+            <el-radio-group v-model="scope.row.status" >
+              <el-radio :label="1">是</el-radio>
+              <el-radio :label="0">否</el-radio>
+            </el-radio-group>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-form-item prop="technology" label="存在问题及建议">
+        <el-input
+            v-model="state.formData.technology"
+            :autosize="{ minRows: 6 }"
+            maxlength="500"
+            show-word-limit
+            type="textarea">
+        </el-input>
+      </el-form-item>
+    </el-form>
+    <el-dialog v-model="state.dialogImg">
+      <el-image style="width: 100%; height: 100%" :src="state.dialogImageUrl"/>
+    </el-dialog>
+    <experts-list ref="expertsListRef" @getName="getSelected"></experts-list>
+  </div>
+</template>
+<script setup>
+
+import {defineEmits, onMounted, reactive, ref} 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"
+import ExpertsList from "./expertsList";
+const emit = defineEmits(["getNextStatus"]);
+
+const state = reactive({
+  formData: {
+    id: '',
+    leader: {
+      name: ''
+    },
+    leaderId: null,
+    linkMan: '',
+    transmitPerson: '',
+    transmitDate: ''
+  },
+  rules: {
+    "leader.name": [{required: true, message: '请选择项目负责人', trigger: 'blur'}],
+    linkMan: [{required: true, message: '请输入联系人', trigger: 'blur'}],
+    linkPhone: [{required: true, message: '请输入联系电话', trigger: 'blur'}],
+    transmitDate: [{required: true, message: '请选择任务下达时间', trigger: 'blur'}]
+  },
+  tableData: [
+    {id: 1, content: '报告中所列评价依据是否得到引用和验证', status: 1},
+    {id: 2, content: '现场收集的有关资料是否齐全、有效', status: 1},
+    {id: 3, content: '危险有害因素识别是否充分', status: 1},
+    {id: 4, content: '报告是否有重大遗漏', status: 0},
+    {id: 5, content: '评价方法选用是否合理', status: 1},
+    {id: 6, content: '对策措施及建议是否具有针对性、合理性', status: 1},
+    {id: 7, content: '评价结论及格式是否正确', status: 1},
+    {id: 8, content: '已按要求修改完成', status: 1},
+    {id: 9, content: '可报过程控制负责人审核', status: 1}
+  ],
+  imgLimit: 1,
+  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
+  header: {
+    Authorization: 'Bearer ' + getToken()
+  },
+  dialogImageUrl: '',
+  dialogImg: false
+})
+const props = {
+  expandTrigger: 'hover',
+  value: 'name',
+  label: 'name'
+}
+const isAmin = ref(false)
+const formRef = ref()
+const expertsListRef = 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)
+        }
+      }
+    }
+  }
+}
+
+const openExperts = (type) =>{
+  expertsListRef.value.openDialog(type)
+}
+
+const getSelected = (type,obj)=>{
+  state.formData.leader.name = obj.name
+  state.formData.leaderId = obj.id
+}
+
+// 图片上传
+const showTip =()=>{
+  ElMessage({
+    type: 'warning',
+    message: '超出文件上传数量'
+  });
+}
+
+const picSize = async (rawFile) => {
+  if(rawFile.size / 1024 / 1024 > 5){
+    ElMessage({
+      type: 'warning',
+      message: '文件大小不能超过5M'
+    });
+    return false
+  }
+};
+
+const handlePictureCardPreview = (uploadFile) => {
+  state.dialogImageUrl = uploadFile.url
+  state.dialogImg = true
+};
+
+
+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/uploadReviewRcd.vue b/src/views/safetyReview/projectManage/components/uploadReviewRcd.vue
new file mode 100644
index 0000000..ce8a4f0
--- /dev/null
+++ b/src/views/safetyReview/projectManage/components/uploadReviewRcd.vue
@@ -0,0 +1,176 @@
+<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="18">
+          <el-form-item label="附件上传">
+            <el-upload accept=".pdf,.doc,.docx" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" :limit='state.imgLimit' v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove">
+              <el-button type="primary">上传评审记录</el-button>
+              <template #tip>
+                <div class="el-upload__tip">支持上传pdf/word/doc/docx格式文件,尺寸小于2M,最多可上传3张</div>
+              </template>
+            </el-upload>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-table  :data="state.tableData" :border="true" style="margin: 20px 0">
+        <el-table-column label="序号" width="60" align="center" type="index"></el-table-column>
+        <el-table-column label="内容" prop="content" header-align="center" :show-overflow-tooltip="true"/>
+        <el-table-column label="操作" header-align="center" class-name="small-padding fixed-width" width="175">
+          <template #default="scope">
+            <el-button link type="primary">查看</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 {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({
+  formData: {
+    id: '',
+    leader: {
+      name: ''
+    },
+    leaderId: null,
+    linkMan: '',
+    transmitPerson: '',
+    transmitDate: ''
+  },
+  rules: {
+    "leader.name": [{required: true, message: '请选择项目负责人', trigger: 'blur'}],
+    linkMan: [{required: true, message: '请输入联系人', trigger: 'blur'}],
+    linkPhone: [{required: true, message: '请输入联系电话', trigger: 'blur'}],
+    transmitDate: [{required: true, message: '请选择任务下达时间', trigger: 'blur'}]
+  },
+  tableData: [],
+  imgLimit: 3,
+  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
+  header: {
+    Authorization: 'Bearer ' + getToken()
+  }
+})
+const props = {
+  expandTrigger: 'hover',
+  value: 'name',
+  label: 'name'
+}
+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)
+        }
+      }
+    }
+  }
+}
+
+// 图片上传
+const showTip =()=>{
+  ElMessage({
+    type: 'warning',
+    message: '超出文件上传数量'
+  });
+}
+
+const picSize = async (rawFile) => {
+  if(rawFile.size / 1024 / 1024 > 2){
+    ElMessage({
+      type: 'warning',
+      message: '文件大小不能超过2M'
+    });
+    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/process.vue b/src/views/safetyReview/projectManage/process.vue
index 970b2a2..2c3a2c9 100644
--- a/src/views/safetyReview/projectManage/process.vue
+++ b/src/views/safetyReview/projectManage/process.vue
@@ -44,6 +44,11 @@
             <evaluate-plan ref="evalPlanRef" v-if="selectedObj.id === 4" @getNextStatus="getNextStatus"></evaluate-plan>
             <employ-notice-record ref="employNoticeRcdRef" v-if="selectedObj.id === 5" @getNextStatus="getNextStatus"></employ-notice-record>
             <site-check-rcd ref="siteCheckRcdRef" v-if="selectedObj.id === 6" @getNextStatus="getNextStatus"></site-check-rcd>
+            <inner-review ref="innerReviewRef" v-if="selectedObj.id === 7" @getNextStatus="getNextStatus"></inner-review>
+            <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>
           </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>
@@ -82,6 +87,11 @@
 import EvaluatePlan from "./components/evaluatePlan";
 import EmployNoticeRecord from "./components/employNoticeRecord"
 import SiteCheckRcd from "./components/siteCheckRcd"
+import InnerReview from "./components/innerReview"
+import TechLeaderReview from "./components/techLeaderReview"
+import UploadReviewRcd from "./components/uploadReviewRcd"
+import RateConclusion from "./components/rateConclusion"
+import ProcessCtrlReview from "./components/processCtrlReview"
 
 const route = useRoute()
 const menuList = ref([
@@ -197,12 +207,17 @@
 const evalPlanRef = ref()
 const employNoticeRcdRef = ref()
 const siteCheckRcdRef = ref()
-const isShowMenu = ref(false);
+const innerReviewRef = ref()
+const techReviewRef = ref()
+const uploadReviewRef = ref()
+const rateConRef = ref()
+const proCtrlRef = ref()
+const isShowMenu = ref(false)
 const selectedObj = ref({})
-const middleHeight = ref(0);
-const middleContentHeight = ref(0);
-const projectId = ref();
-const projectStatus = ref();
+const middleHeight = ref(0)
+const middleContentHeight = ref(0)
+const projectId = ref()
+const projectStatus = ref()
 onMounted(() => {
   middleHeight.value = window.innerHeight - 250;
   middleContentHeight.value = window.innerHeight - 385;

--
Gitblit v1.9.2