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