马宇豪
2024-01-29 5c357cd927e74cc57531bd0a95338635e39be9af
修改强密码
已修改11个文件
已添加9个文件
1930 ■■■■ 文件已修改
src/api/projectManage/employNoticeRcd.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/projectManage/evaPlan.js 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/projectManage/evaTaskNotice.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/projectManage/innerReview.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/projectManage/processCtrl.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/projectManage/rateConclude.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/projectManage/siteCheckRcd.js 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/contractManage.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/deviceDialog.vue 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/employNoticeRecord.vue 110 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/evaluatePlan.vue 271 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/innerReview.vue 122 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/riskAnalysis.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/signConfirm.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/siteCheckRcd.vue 391 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/techLeaderReview.vue 121 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/uploadReviewRcd.vue 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/worksDialog.vue 205 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/process.vue 83 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/projectManage/employNoticeRcd.js
对比新文件
@@ -0,0 +1,25 @@
import request from '@/utils/request'
export function addWorkRecord(data) {
    return request({
        url: '/manage/work-notification/add',
        method: 'post',
        data: data
    })
}
export function editWorkRecord(params) {
    return request({
        url: `/manage/work-notification/edit`,
        method: 'put',
        data: params
    })
}
export function getWorkDetail(data) {
    return request({
        url: '/manage/work-notification/getWorkNotificationByProjectId',
        method: 'get',
        params: data
    })
}
src/api/projectManage/evaPlan.js
对比新文件
@@ -0,0 +1,95 @@
import request from '@/utils/request'
export function addRecord(data) {
    return request({
        url: '/manage/estimate-plan/add',
        method: 'post',
        data: data
    })
}
export function editRecord(params) {
    return request({
        url: `/manage/estimate-plan/edit`,
        method: 'put',
        data: params
    })
}
export function getDetail(data) {
    return request({
        url: '/manage/estimate-plan/getPlanByProjectId',
        method: 'get',
        params: data
    })
}
export function addWorks(data) {
    return request({
        url: '/manage/plan-person/add',
        method: 'post',
        data: data
    })
}
export function getWorks(data) {
    return request({
        url: `/manage/plan-person/getPlanPersonByProjectId`,
        method: 'get',
        params: data
    })
}
export function getWorksDetail(data) {
    return request({
        url: `/manage/plan-person/getPlanPersonByPersonId`,
        method: 'get',
        params: data
    })
}
export function editWorks(params) {
    return request({
        url: `/manage/plan-person/edit`,
        method: 'put',
        data: params
    })
}
export function delWorks(id) {
    return request({
        url: '/manage/plan-person/remove/' + id,
        method: 'delete'
    })
}
export function addDevice(data) {
    return request({
        url: '/manage/device/add',
        method: 'post',
        data: data
    })
}
export function getDevice(data) {
    return request({
        url: `/manage/device/getDeviceByProjectId`,
        method: 'get',
        params: data
    })
}
export function editDevice(params) {
    return request({
        url: `/manage/device/edit`,
        method: 'put',
        data: params
    })
}
export function delDevice(id) {
    return request({
        url: `/manage/device/remove/` + id,
        method: 'delete'
    })
}
src/api/projectManage/evaTaskNotice.js
对比新文件
@@ -0,0 +1,25 @@
import request from '@/utils/request'
export function addRecord(data) {
    return request({
        url: '/manage/estimate-task/add',
        method: 'post',
        data: data
    })
}
export function editRecord(params) {
    return request({
        url: `/manage/estimate-task/edit`,
        method: 'put',
        data: params
    })
}
export function getDetail(data) {
    return request({
        url: '/manage/estimate-task/getTaskByProjectId',
        method: 'get',
        params: data
    })
}
src/api/projectManage/innerReview.js
对比新文件
@@ -0,0 +1,25 @@
import request from '@/utils/request'
export function addInnerReview(data) {
    return request({
        url: '/manage/ass-audit/add',
        method: 'post',
        data: data
    })
}
export function editInnerReview(params){
    return request({
        url: `/manage/ass-audit/edit`,
        method: 'put',
        data: params
    })
}
export function getInnerReviewDetail(data){
    return request({
        url: '/manage/ass-audit/getAuditByProjectId',
        method: 'get',
        params: data
    })
}
src/api/projectManage/processCtrl.js
对比新文件
@@ -0,0 +1,25 @@
import request from '@/utils/request'
export function addProcessCtrl(data) {
    return request({
        url: '/manage/process-audit/add',
        method: 'post',
        data: data
    })
}
export function editProcessCtrl(params){
    return request({
        url: `/manage/process-audit/edit`,
        method: 'put',
        data: params
    })
}
export function getProcessCtrlDetail(data){
    return request({
        url: '/manage/process-audit/getProcessByProjectId',
        method: 'get',
        params: data
    })
}
src/api/projectManage/rateConclude.js
对比新文件
@@ -0,0 +1,25 @@
import request from '@/utils/request'
export function addRateConclude(data) {
    return request({
        url: '/manage/conclusion/add',
        method: 'post',
        data: data
    })
}
export function editRateConclude(params){
    return request({
        url: `/manage/conclusion/edit`,
        method: 'put',
        data: params
    })
}
export function getRateConcludeDetail(data){
    return request({
        url: '/manage/conclusion/getConclusionByProjectId',
        method: 'get',
        params: data
    })
}
src/api/projectManage/siteCheckRcd.js
对比新文件
@@ -0,0 +1,48 @@
import request from '@/utils/request'
export function addSiteCheck(data) {
    return request({
        url: '/manage/investigation/add',
        method: 'post',
        data: data
    })
}
export function editSiteCheck(params) {
    return request({
        url: `/manage/investigation/edit`,
        method: 'put',
        data: params
    })
}
export function getSiteCheckDetail(data) {
    return request({
        url: '/manage/investigation/getInvestigationByProjectId',
        method: 'get',
        params: data
    })
}
export function getFiles(data) {
    return request({
        url: `/manage/accessory-file/getAccessoryFileByProjectId`,
        method: 'get',
        params: data
    })
}
export function delFile(id) {
    return request({
        url: `/manage/accessory-file/remove/` + id,
        method: 'delete'
    })
}
export function getReviewDone(data) {
    return request({
        url: `/manage/review-record/doReview`,
        method: 'post',
        data: data
    })
}
src/views/safetyReview/projectManage/components/contractManage.vue
@@ -54,6 +54,7 @@
const state = reactive({
  formData: {
    id: '',
    projectId: null,
    contractSignDate: '',
    contractMoney: '',
    contractIntroduction: ''
src/views/safetyReview/projectManage/components/deviceDialog.vue
对比新文件
@@ -0,0 +1,140 @@
<template>
    <div class="notice">
        <el-dialog
            v-model="dialogVisible"
            :title="title"
            width="500px"
            :before-close="handleClose"
        >
            <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-position="top">
                <el-form-item label="设备名称:" prop="deviceName">
                  <el-input v-model="state.form.deviceName" maxlength="30" show-word-limit type="text" size="large"/>
                </el-form-item>
                <el-form-item label="开始时间:" prop="startDate">
                  <el-date-picker
                      style="width: 100%"
                      v-model="state.form.startDate"
                      type="date"
                      value-format="YYYY-MM-DD 00:00:00"
                      placeholder="选择日期"
                      size="large"
                  />
                </el-form-item>
                <el-form-item label="结束时间:" prop="endDate">
                  <el-date-picker
                      style="width: 100%"
                      v-model="state.form.endDate"
                      type="date"
                      value-format="YYYY-MM-DD 00:00:00"
                      placeholder="选择日期"
                      size="large"
                  />
                </el-form-item>
            </el-form>
            <template #footer>
                    <span class="dialog-footer">
                        <el-button @click="handleClose" size="default">取 消</el-button>
                        <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
                    </span>
            </template>
        </el-dialog>
    </div>
</template>
<script setup>
import {defineProps, nextTick, reactive, ref, toRefs} from 'vue'
import {ElMessage} from "element-plus";
import {addDevice, editDevice} from "@/api/projectManage/evaPlan"
const dialogVisible = ref(false)
const title = ref("")
const busRef = ref()
const props = defineProps(['workList','typeList'])
const emit = defineEmits(["getList"])
const state = reactive({
    form: {
      id: null,
      projectId: null,
      deviceName: '',
      startDate: '',
      endDate: ''
    },
    formRules:{
      deviceName: [{ required: true, message: '请填写设备名称', trigger: 'blur' }],
      startDate: [{ required: true, message: '请选择开始日期', trigger: 'blur' }],
      endDate: [{ required: true, message: '请选择结束日期', trigger: 'blur' }]
    }
})
const openDialog = async (type, value,projectId) => {
    title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'
    state.form.projectId = projectId
    if(type == 'add'){
      nextTick(()=>{
        busRef.value.resetFields()
      })
    }else if(type === 'edit') {
      state.form = JSON.parse(JSON.stringify(value))
    }
    dialogVisible.value = true;
}
const onSubmit = async () => {
    const valid = await busRef.value.validate();
    if(valid){
        if(title.value === '新增'){
            const {id,...data} = state.form
            const res = await addDevice(data)
            if(res.code === 200){
                ElMessage({
                    type: 'success',
                    message: '新增成功'
                });
            }else{
                ElMessage.warning(res.message)
            }
            emit("getList")
            busRef.value.clearValidate();
            busRef.value.resetFields()
            dialogVisible.value = false;
        }else if(title.value === '编辑'){
            const {...data} = state.form
            const res = await editDevice(data)
            if(res.code === 200){
                ElMessage({
                    type: 'success',
                    message: '修改成功'
                });
            }else{
                ElMessage.warning(res.message)
            }
            emit("getList")
            busRef.value.clearValidate();
            busRef.value.resetFields()
            dialogVisible.value = false;
        }
    }
}
const handleClose = () => {
    busRef.value.clearValidate();
    busRef.value.resetFields()
    dialogVisible.value = false;
}
defineExpose({
    openDialog
});
</script>
<style scoped lang="scss">
.notice{
    :deep(.el-form .el-form-item__label) {
        font-size: 15px;
    }
    .file {
        display: flex;
        flex-direction: column;
        align-items: flex-start;
    }
}
</style>
src/views/safetyReview/projectManage/components/employNoticeRecord.vue
@@ -29,29 +29,6 @@
          </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>
        <el-col :span="18">
          <div style="display: flex;align-items: center">项目组成员<el-icon style="margin-left: 10px;margin-right: 4px"><InfoFilled /></el-icon><span style="font-size: 13px">金属、非金属矿及其他矿采选业:安全、机械、电气、采矿、通风、地质、水工结构</span></div>
@@ -60,31 +37,21 @@
      <el-table  :data="state.planPersons" :border="true" style="margin: 20px 0">
        <el-table-column label="序号" width="60" align="center" type="index"></el-table-column>
        <el-table-column label="评价组成员" prop="person.name" header-align="center" :show-overflow-tooltip="true"/>
        <el-table-column label="资格证书" prop="person.certificateNo" header-align="center" :show-overflow-tooltip="true"/>
        <el-table-column label="专业能力" prop="person.major" header-align="center" :show-overflow-tooltip="true"/>
        <el-table-column label="承担工作" header-align="center" class-name="small-padding fixed-width">
        <el-table-column label="专业能力/资格证书" prop="person.certificateNo" header-align="center" :show-overflow-tooltip="true">
          <template #default="scope">
            <el-select v-model="scope.row.work" multiple placeholder="承担工作" style="width: 100%" size="large" disabled>
              <el-option v-for="item in state.workList" :key="item.value" :label="item.label" :value="item.value"/>
            </el-select>
            {{ getCertNo(scope.row) }}
          </template>
        </el-table-column>
        <el-table-column label="承诺后期前往现场勘验" header-align="center" class-name="small-padding fixed-width">
        <el-table-column label="承担工作" prop="work" header-align="center" class-name="small-padding fixed-width"></el-table-column>
        <el-table-column label="承诺后期前往现场勘验" prop="laterPromise" header-align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-radio-group v-model="scope.row.laterPromise" size="large" disabled>
              <el-radio :label="1" size="large">是</el-radio>
              <el-radio :label="0" size="large">否</el-radio>
            </el-radio-group>
            {{(scope.row.laterPromise==1 || scope.row.laterPromise==true)?'是':'否'}}
          </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.reason" maxlength="30" show-word-limit type="text" size="large" readonly/>
          </template>
        </el-table-column>
        <el-table-column label="未到现场勘验原因" prop="reason" header-align="center" class-name="small-padding fixed-width"></el-table-column>
        <el-table-column label="是否已告知" header-align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-radio-group v-model="scope.row.informed" size="large">
            <el-radio-group v-model="scope.row.informed" size="large" @change="(value)=>changePerson(value,scope.row)">
              <el-radio :label="1" size="large">是</el-radio>
              <el-radio :label="0" size="large">否</el-radio>
            </el-radio-group>
@@ -96,25 +63,29 @@
</template>
<script setup>
import {defineEmits, onMounted, reactive, ref} from "vue"
import {defineEmits, defineProps, onMounted, reactive, ref, watchEffect} from "vue"
import {ElMessage} from "element-plus"
import {Search} from '@element-plus/icons-vue'
import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis"
import {addWorkRecord, editWorkRecord, getWorkDetail} from "@/api/projectManage/employNoticeRcd"
import {getWorks, editWorks} from "@/api/projectManage/evaPlan"
import Cookies from "js-cookie"
const props = defineProps(['projectId'])
const emit = defineEmits(["getNextStatus"])
const state = reactive({
  formData: {
    id: null,
    projectId: null,
    timeRange: [],
    serviceStartDate: '',
    serviceEndDate: '',
    investigationPlanDate: ''
  },
  projectId: null,
  planPersons: [],
  rules: {
    timeRange: [{required: true, message: '请选择技术服务期限', trigger: 'blur'}],
    investigationPlanDate: [{required: true, message: '请选择计划现场勘验时间', trigger: 'blur'}],
    investigationPlanDate: [{required: true, message: '请选择计划现场勘验时间', trigger: 'blur'}]
  }
})
@@ -125,16 +96,19 @@
  if(userInfo.identity === 0){
    isAmin.value = true;
  }
  // getWorksList(props.projectId)
});
const riskOpen = async (type,val) => {
  console.log("type",type,val)
  state.formData.projectId = val
  state.projectId = val
  await getWorksList(val)
  if(type === 'detail' || type === 'edit' ){
    const res = await getRiskDetail({projectId: val});
    const res = await getWorkDetail({projectId: val})
    if(res.code == 200){
      state.formData = res.data;
      state.formData.project.business = parseInt(res.data.project.business);
      state.formData.project.area = [res.data.project.province,res.data.project.city];
      state.formData = JSON.parse(JSON.stringify(res.data))
      state.formData.timeRange = [state.formData.serviceStartDate,state.formData.serviceEndDate]
    }else {
      ElMessage.warning(res.message)
    }
@@ -149,19 +123,19 @@
      state.formData.serviceStartDate = state.formData.timeRange[0]
      state.formData.serviceEndDate = state.formData.timeRange[1]
      if(type === 'add'){
        const {projectId,timeRange, ...data} = JSON.parse(JSON.stringify(state.formData))
        const res = await addRisk(data);
        const {timeRange,id,...data} = JSON.parse(JSON.stringify(state.formData))
        const res = await addWorkRecord(data)
        if (res.code == 200) {
          ElMessage.success('保存成功')
          formRef.value.clearValidate();
          emit('getNextStatus', res.data);
        } else {
          ElMessage.warning(res.message)
        }
      }else if(type === 'clickEdit'){
        const {timeRange, ...data} = JSON.parse(JSON.stringify(state.formData))
        const res = await editRisk(data);
        const res = await editWorkRecord(data);
        if (res.code == 200) {
          ElMessage.success('变更成功')
          formRef.value.clearValidate();
@@ -174,6 +148,38 @@
  }
}
const getWorksList = async (id) =>{
  const works = await getWorks({projectId: id ? id : props.projectId})
  if(works.code == 200){
    state.planPersons = works.data
  }else {
    ElMessage.warning(works.message)
  }
}
const getCertNo = (row)=>{
  const obj = JSON.parse(row.person.certificateNo)
  const noArr = Object.values(obj)
  return row.person.majorNames.map((item,index)=>{
    return item + '(' + noArr[index] + ')'
  }).join(',')
}
const changePerson = async (value,row)=>{
  const params = {
    id: row.id,
    projectId: row.projectId,
    informed: value
  }
  const res = await editWorks(params)
  if(res.code === 200){
    console.log(res.message)
  }else{
    ElMessage.warning(res.message)
  }
  await getWorksList(props.projectId)
}
defineExpose({
  riskOpen
});
src/views/safetyReview/projectManage/components/evaluatePlan.vue
@@ -32,6 +32,7 @@
                v-model="state.formData.auser.name"
                size="large"
                placeholder="请选择机构评价负责人"
                @focus="openExperts('机构评价负责人')"
            >
              <template #append>
                <el-button :icon="Search" @click="openExperts('机构评价负责人')"/>
@@ -39,19 +40,6 @@
            </el-input>
          </el-form-item>
        </el-col>
<!--        <el-col :span="6">-->
<!--          <el-form-item prop="deliver" label="技术负责人">-->
<!--            <el-input-->
<!--                v-model="state.formData.deliver"-->
<!--                size="large"-->
<!--                placeholder="请选择技术负责人"-->
<!--            >-->
<!--              <template #append>-->
<!--                <el-button :icon="Search" @click="openExperts('技术负责人')"/>-->
<!--              </template>-->
<!--            </el-input>-->
<!--          </el-form-item>-->
<!--        </el-col>-->
      </el-row>
      <el-row>
        <el-col :span="18">
@@ -92,38 +80,30 @@
        </el-col>
        <el-col :span="6">
          <div style="width: 100%;display: flex;justify-content: right">
            <el-button type="primary" icon="Plus" @click="openExperts('项目组成员')">添加成员</el-button>
            <el-button type="primary" icon="Plus" @click="openWorksDialog('add',{})">添加成员</el-button>
          </div>
        </el-col>
      </el-row>
      <el-table  :data="state.formData.planPersons" :border="true" style="margin: 20px 0">
      <el-table  :data="state.planPersons" :border="true" style="margin: 20px 0">
        <el-table-column label="序号" width="60" align="center" type="index"></el-table-column>
        <el-table-column label="评价组成员" prop="person.name" header-align="center" :show-overflow-tooltip="true"/>
        <el-table-column label="资格证书" prop="person.certificateNo" header-align="center" :show-overflow-tooltip="true"/>
        <el-table-column label="专业能力" prop="person.major" header-align="center" :show-overflow-tooltip="true"/>
        <el-table-column label="承担工作" header-align="center" class-name="small-padding fixed-width">
        <el-table-column label="专业能力/资格证书" prop="person.certificateNo" header-align="center" :show-overflow-tooltip="true">
          <template #default="scope">
            <el-select v-model="scope.row.work" multiple placeholder="承担工作" style="width: 100%" size="large">
              <el-option v-for="item in state.workList" :key="item.value" :label="item.label" :value="item.value"/>
            </el-select>
            {{ getCertNo(scope.row) }}
          </template>
        </el-table-column>
        <el-table-column label="承诺后期前往现场勘验" header-align="center" class-name="small-padding fixed-width">
<!--        <el-table-column label="专业能力" header-align="center" :show-overflow-tooltip="true"></el-table-column>-->
        <el-table-column label="承担工作" prop="work" header-align="center" class-name="small-padding fixed-width"></el-table-column>
        <el-table-column label="承诺后期前往现场勘验" prop="laterPromise" header-align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-radio-group v-model="scope.row.laterPromise" size="large">
              <el-radio :label="1" size="large">是</el-radio>
              <el-radio :label="0" size="large">否</el-radio>
            </el-radio-group>
            {{(scope.row.laterPromise==1 || scope.row.laterPromise==true)?'是':'否'}}
          </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.reason" maxlength="30" show-word-limit type="text" size="large"/>
          </template>
        </el-table-column>
        <el-table-column label="未到现场勘验原因" prop="reason" header-align="center" class-name="small-padding fixed-width"></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="delMember(scope.$index)">删除</el-button>
            <el-button link @click="openWorksDialog('edit',scope.row)">修改</el-button>
            <el-button link type="danger" @click="delMember(scope.row)">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
@@ -133,63 +113,52 @@
        </el-col>
        <el-col :span="6">
          <div style="width: 100%;display: flex;justify-content: right">
            <el-button type="primary" icon="Plus" @click="addDevice">添加设备</el-button>
            <el-button type="primary" icon="Plus" @click="openDeviceDialog('add',{})">添加设备</el-button>
          </div>
        </el-col>
      </el-row>
      <el-table  :data="state.formData.devices" :border="true" style="margin: 20px 0">
      <el-table  :data="state.devices" :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">
        <el-table-column label="设备名称" prop="deviceName" header-align="center" class-name="small-padding fixed-width"/>
        <el-table-column label="开始时间" prop="startDate" header-align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-input v-model="scope.row.deviceName" maxlength="30" show-word-limit type="text" size="large"/>
            {{scope.row.startDate.substring(0,10)}}
          </template>
        </el-table-column>
        <el-table-column label="开始时间" header-align="center" class-name="small-padding fixed-width">
        <el-table-column label="结束时间" prop="endDate" 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-date-picker
                style="width: 100%"
                v-model="scope.row.endDate"
                type="date"
                value-format="YYYY-MM-DD 00:00:00"
                placeholder="选择日期"
                size="large"
            />
            {{scope.row.endDate.substring(0,10)}}
          </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="delDevice(scope.$index)">删除</el-button>
            <el-button link @click="openDeviceDialog('edit',scope.row)">修改</el-button>
            <el-button link type="danger" @click="delDeviceItem(scope.row)">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
    </el-form>
    <experts-list ref="expertsListRef" @getName="getSelected"></experts-list>
    <works-dialog ref="worksRef" @getList="getWorksList" :workList="state.workList" :typeList="state.jobTypeList"></works-dialog>
    <device-dialog ref="deviceRef" @getList="getDeviceList"></device-dialog>
  </div>
</template>
<script setup>
import {defineEmits, onMounted, reactive, ref} from "vue"
import {ElMessage} from "element-plus"
import {defineEmits, defineProps, onMounted, reactive, ref} from "vue"
import {ElMessage, ElMessageBox} from "element-plus"
import {Search} from '@element-plus/icons-vue'
import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis"
import {addRecord, editRecord, getDetail, getWorks, getDevice, delWorks, delDevice} from "@/api/projectManage/evaPlan"
import Cookies from "js-cookie"
import ExpertsList from "./expertsList"
import WorksDialog from './worksDialog'
import DeviceDialog from './deviceDialog'
const props = defineProps(['projectId'])
const emit = defineEmits(["getNextStatus"])
const state = reactive({
  formData: {
    id: null,
    projectId: null,
    auser: {
      name: ''
@@ -198,69 +167,87 @@
    estimateSchedules: [
      {
        id: 1,
        sort: 1,
        name: '勘验准备',
        startDate: '',
        endDate: '',
        scheduleType: 1
        scheduleType: 1,
        projectId: null
      },
      {
        id: 2,
        sort: 2,
        name: '现场勘验',
        startDate: '',
        endDate: '',
        scheduleType: 2
        scheduleType: 2,
        projectId: null
      },
      {
        id: 3,
        sort: 3,
        name: '材料分析整理',
        startDate: '',
        endDate: '',
        scheduleType: 3
        scheduleType: 3,
        projectId: null
      },
      {
        id: 4,
        sort: 4,
        name: '评价报告编写',
        startDate: '',
        endDate: '',
        scheduleType: 4
        scheduleType: 4,
        projectId: null
      },
      {
        id: 5,
        sort: 5,
        name: '整改情况现场确认',
        startDate: '',
        endDate: '',
        scheduleType: 5
        scheduleType: 5,
        projectId: null
      },
      {
        id: 6,
        sort: 6,
        name: '整理评价报告',
        startDate: '',
        endDate: '',
        scheduleType: 6
        scheduleType: 6,
        projectId: null
      },
      {
        id: 7,
        sort: 7,
        name: '报告审核',
        startDate: '',
        endDate: '',
        scheduleType: 7
        scheduleType: 7,
        projectId: null
      },
      {
        id: 8,
        sort: 8,
        name: '报告修改',
        startDate: '',
        endDate: '',
        scheduleType: 8
        scheduleType: 8,
        projectId: null
      },
    ],
    planPersons: [],
    devices: [],
    startDate: '',
    endDate: '',
    id: ''
    endDate: ''
  },
  projectId: null,
  planPersons: [],
  devices: [],
  rules: {
    "auser.name": [{required: true, message: '请填写机构评价负责人', trigger: 'blur'}],
    "auser.name": [{required: true, message: '请填写机构评价负责人', trigger: 'change'}],
    startDate: [{required: true, message: '请选择评价开始时间', trigger: 'blur'}],
    endDate: [{required: true, message: '请选择评价结束时间', trigger: 'blur'}]
  },
@@ -269,31 +256,37 @@
    {value: '文字校对',label: '文字校对'},
    {value: '现场勘验',label: '现场勘验'},
    {value: '资料收集整理',label: '资料收集整理'}
  ],
  jobTypeList: [
    {value: 1,label: '普通人员'},
    {value: 2,label: '组长'},
  ]
})
const props = {
  expandTrigger: 'hover',
  value: 'name',
  label: 'name'
}
const isAmin = ref(false)
const formRef = ref()
const expertsListRef = ref()
const worksRef = ref()
const deviceRef = ref()
onMounted(() => {
  const userInfo = JSON.parse(Cookies.get('userInfo'))
  if(userInfo.identity === 0){
    isAmin.value = true;
    isAmin.value = true
  }
});
})
const riskOpen = async (type,val) => {
  console.log("type",type,val)
  state.formData.projectId = val
  state.projectId = val
  for(let i of state.formData.estimateSchedules){
    i.projectId = val
  }
  await getWorksList(val)
  await getDeviceList(val)
  if(type === 'detail' || type === 'edit' ){
    const res = await getRiskDetail({projectId: val});
    const res = await getDetail({projectId: val})
    if(res.code == 200){
      state.formData = res.data;
      state.formData.project.business = parseInt(res.data.project.business);
      state.formData.project.area = [res.data.project.province,res.data.project.city];
      state.formData = JSON.parse(JSON.stringify(res.data))
    }else {
      ElMessage.warning(res.message)
    }
@@ -307,10 +300,8 @@
      }
      if(type === 'add'){
        const {id, ...data} = JSON.parse(JSON.stringify(state.formData))
        delete data.project.area;
        delete data.project.id;
        console.log('data', data)
        const res = await addRisk(data);
        console.log(data)
        const res = await addRecord(data);
        if (res.code == 200) {
          ElMessage.success('保存成功')
          formRef.value.clearValidate();
@@ -321,9 +312,7 @@
        }
      }else if(type === 'clickEdit'){
        const { ...data} = JSON.parse(JSON.stringify(state.formData))
        delete data.project.area;
        console.log('data', data)
        const res = await editRisk(data);
        const res = await editRecord(data);
        if (res.code == 200) {
          ElMessage.success('变更成功')
          formRef.value.clearValidate();
@@ -336,46 +325,88 @@
  }
}
const getWorksList = async (id) =>{
  const works = await getWorks({projectId: id ? id : props.projectId})
  if(works.code == 200){
    state.planPersons = works.data
  }else {
    ElMessage.warning(works.message)
  }
}
const getDeviceList = async (id) =>{
  const device = await getDevice({projectId: id ? id : props.projectId})
  if(device.code == 200){
    state.devices = device.data
  }else {
    ElMessage.warning(device.message)
  }
}
const getCertNo = (row)=>{
  const obj = JSON.parse(row.person.certificateNo)
  const noArr = Object.values(obj)
  return row.person.majorNames.map((item,index)=>{
    return item + '(' + noArr[index] + ')'
  }).join(',')
}
const openExperts = (type) =>{
  expertsListRef.value.openDialog(type)
}
const getSelected = (type,obj)=>{
  if(type == '项目负责人'){
    state.formData.auser.name = obj.name
    state.formData.auserId = obj.id
  }else{
    let member = {
      person: {
        name: obj.name,
        certificateNo: obj.certificateNo?obj.certificateNo:'',
        major: obj.speciality,
      },
      informed: 0,
      work: '',
      laterPromise: 0,
      reason: ''
    }
    state.formData.planPersons.push(member)
  }
  state.formData.auser.name = obj.name
  state.formData.auserId = obj.id
}
const delMember = (index)=>{
  state.formData.planPersons.splice(index,1)
const openWorksDialog = (type,data)=>{
  worksRef.value.openDialog(type,data,props.projectId)
}
const addDevice = ()=>{
  let device = {
    projectId: null,
    deviceName: '',
    startDate: '',
    endDate: ''
  }
  state.formData.devices.push(device)
const openDeviceDialog = (type,data)=>{
  deviceRef.value.openDialog(type,data,props.projectId)
}
const delDevice = (index)=>{
  state.formData.devices.splice(index,1)
const delMember = (row)=>{
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delWorks(row.id)
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getWorksList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
const delDeviceItem = (row)=>{
  console.log(row,'row')
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delDevice(row.id)
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getDeviceList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
defineExpose({
src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue
@@ -8,6 +8,7 @@
                v-model="state.formData.leader.name"
                size="large"
                placeholder="请选择项目负责人"
                @focus="openExperts('项目负责人')"
            >
              <template #append>
                <el-button :icon="Search" @click="openExperts('项目负责人')"/>
@@ -53,6 +54,7 @@
                v-model="state.formData.transmitPerson"
                size="large"
                placeholder="请选择任务下达人"
                @focus="openExperts('任务下达人')"
            >
              <template #append>
                <el-button :icon="Search" @click="openExperts('任务下达人')"/>
@@ -82,7 +84,7 @@
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 {addRecord, editRecord, getDetail} from "@/api/projectManage/evaTaskNotice";
import Cookies from "js-cookie"
import ExpertsList from "./expertsList";
const emit = defineEmits(["getNextStatus"]);
@@ -90,9 +92,11 @@
const state = reactive({
  formData: {
    id: '',
    projectId: null,
    leader: {
      name: ''
    },
    fax: '',
    leaderId: null,
    linkMan: '',
    transmitPerson: '',
@@ -121,8 +125,9 @@
})
const riskOpen = async (type,val) => {
  state.formData.projectId = val
  if(type === 'detail' || type === 'edit' ){
    const res = await getRiskDetail({projectId: val});
    const res = await getDetail({projectId: val});
    if(res.code == 200){
      state.formData = res.data;
    }else {
@@ -138,18 +143,18 @@
      }
      if(type === 'add'){
        const {id, ...data} = JSON.parse(JSON.stringify(state.formData))
        const res = await addRisk(data);
        const res = await addRecord(data);
        if (res.code == 200) {
          ElMessage.success('保存成功')
          formRef.value.clearValidate();
          emit('getNextStatus', res.data);
          emit('getNextStatus', state.formData.projectId);
        } else {
          ElMessage.warning(res.message)
        }
      }else if(type === 'clickEdit'){
      }else{
        const { ...data} = JSON.parse(JSON.stringify(state.formData))
        const res = await editRisk(data);
        const res = await editRecord(data);
        if (res.code == 200) {
          ElMessage.success('变更成功')
          formRef.value.clearValidate();
src/views/safetyReview/projectManage/components/innerReview.vue
@@ -3,10 +3,10 @@
    <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-form-item prop="auditDate" label="审核日期">
            <el-date-picker
                style="width: 100%"
                v-model="state.formData.transmitDate"
                v-model="state.formData.auditDate"
                type="date"
                value-format="YYYY-MM-DD 00:00:00"
                placeholder="选择日期"
@@ -17,7 +17,7 @@
        <el-col :span="6">
          <el-form-item prop="leader.name" label="内部审核员">
            <el-input
                v-model="state.formData.leader.name"
                v-model="state.formData.assessor.name"
                size="large"
                placeholder="请选择内部审核员"
            >
@@ -28,10 +28,10 @@
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item prop="transmitDate" label="内部审核确认日期">
          <el-form-item label="内部审核确认日期">
            <el-date-picker
                style="width: 100%"
                v-model="state.formData.transmitDate"
                v-model="state.formData.affirmDate"
                type="date"
                value-format="YYYY-MM-DD 00:00:00"
                placeholder="选择日期"
@@ -40,18 +40,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="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-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"/>
@@ -64,9 +64,9 @@
          </template>
        </el-table-column>
      </el-table>
      <el-form-item prop="technology" label="存在问题及建议">
      <el-form-item prop="suggestions" label="存在问题及建议">
        <el-input
            v-model="state.formData.technology"
            v-model="state.formData.suggestions"
            :autosize="{ minRows: 6 }"
            maxlength="500"
            show-word-limit
@@ -74,9 +74,9 @@
        </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>
<!--    <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>
@@ -85,7 +85,7 @@
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 {addInnerReview, editInnerReview, getInnerReviewDetail} from "@/api/projectManage/innerReview"
import {delPic} from "@/api/login"
import { getToken } from "@/utils/auth";
import Cookies from "js-cookie"
@@ -95,48 +95,44 @@
const state = reactive({
  formData: {
    id: '',
    leader: {
    projectId: '',
    auditDate:'',
    auditType: 1,
    assessor: {
      name: ''
    },
    leaderId: null,
    linkMan: '',
    transmitPerson: '',
    transmitDate: ''
    assessorId: null,
    affirmDate: '',
    suggestions: ''
  },
  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'}]
    "assessor.name": [{required: true, message: '请选择内部审核员', trigger: 'blur'}],
    auditDate: [{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}
    {id: 1, content: '评价依据是否充分、准确、有效',key: 'isBasis', status: 1},
    {id: 2, content: '评价范围是否与合同一致', key: 'isScope', status: 1},
    {id: 3, content: '危险有害因素识别是否全面', key: 'isDangerOverall', status: 1},
    {id: 4, content: '评价单元划分是否合理', key: 'isUnitDivision', status: 1},
    {id: 5, content: '评价方法选择是否适当', key: 'isMethodSelection', status: 1},
    {id: 6, content: '对策措施与建议是否可行', key: 'isMeasure', status: 1},
    {id: 7, content: '结论是否正确', key: 'isConclusion', status: 1},
    {id: 8, content: '格式是否符合要求', key: 'isFormat', status: 1},
    {id: 9, content: '附件与附图是否有效及规范', key: 'isFile', status: 1},
    {id: 10, content: '文字、数据是否准确', key: 'isText', status: 1},
    {id: 11, content: '已按要求修改完成', key: 'isAmendFinish', status: 1},
    {id: 12, content: '可报技术负责人审核', key: 'isReportAudit', status: 1}
  ],
  imgLimit: 1,
  fileList: [],
  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
  header: {
    Authorization: 'Bearer ' + getToken()
    Authorization: getToken()
  },
  dialogImageUrl: '',
  dialogImg: false
})
const props = {
  expandTrigger: 'hover',
  value: 'name',
  label: 'name'
}
const isAmin = ref(false)
const formRef = ref()
const expertsListRef = ref()
@@ -148,10 +144,18 @@
})
const riskOpen = async (type,val) => {
  state.formData.projectId = val
  if(type === 'detail' || type === 'edit' ){
    const res = await getRiskDetail({projectId: val});
    const res = await getInnerReviewDetail({projectId: val,auditType: 1});
    if(res.code == 200){
      state.formData = res.data;
      state.formData = res.data
      for(let key in res.data){
        for(let item of state.tableData){
          if(item.key == key){
            item.status = res.data[key]==true?1:0
          }
        }
      }
    }else {
      ElMessage.warning(res.message)
    }
@@ -165,7 +169,10 @@
      }
      if(type === 'add'){
        const {id, ...data} = JSON.parse(JSON.stringify(state.formData))
        const res = await addRisk(data);
        for(let i of state.tableData){
          data[i.key] = i.status
        }
        const res = await addInnerReview(data);
        if (res.code == 200) {
          ElMessage.success('保存成功')
          formRef.value.clearValidate();
@@ -176,7 +183,10 @@
        }
      }else if(type === 'clickEdit'){
        const { ...data} = JSON.parse(JSON.stringify(state.formData))
        const res = await editRisk(data);
        for(let i of state.tableData){
          data[i.key] = i.status
        }
        const res = await editInnerReview(data);
        if (res.code == 200) {
          ElMessage.success('变更成功')
          formRef.value.clearValidate();
@@ -194,8 +204,8 @@
}
const getSelected = (type,obj)=>{
  state.formData.leader.name = obj.name
  state.formData.leaderId = obj.id
  state.formData.assessor.name = obj.name
  state.formData.assessorId = obj.id
}
// 图片上传
src/views/safetyReview/projectManage/components/riskAnalysis.vue
@@ -365,7 +365,11 @@
    if(res.code == 200){
      state.formData = res.data;
      state.formData.project.business = parseInt(res.data.project.business);
      state.formData.project.area = [res.data.project.province,res.data.project.city];
      if(res.data.project.province == '北京市' || res.data.project.province == '天津市' || res.data.project.province == '上海市' || res.data.project.province == '重庆市' || res.data.project.province == '香港特别行政区' || res.data.project.province == '澳门特别行政区'){
        state.formData.project.area = [res.data.project.province]
      }else{
        state.formData.project.area = [res.data.project.province,res.data.project.city];
      }
      state.tableData[0].status = res.data.isInBusiness ? 1 : 0;
      state.tableData[1].status = res.data.isSatisfyNeed ? 1 : 0;
      state.tableData[2].status = res.data.isNeedExpert ? 1 : 0;
@@ -387,13 +391,15 @@
        const {id, ...data} = JSON.parse(JSON.stringify(state.formData))
        delete data.project.area;
        delete data.project.id;
        if(data.project.province == '北京市' || data.project.province == '天津市' || data.project.province == '上海市' || data.project.province == '重庆市' || data.project.province == '香港特别行政区' || data.project.province == '澳门特别行政区'){
          data.project.city = data.project.province
        }
        data.isInBusiness = state.tableData[0].status === 1;
        data.isSatisfyNeed = state.tableData[1].status === 1;
        data.isNeedExpert = state.tableData[2].status === 1;
        data.isFinishReport = state.tableData[3].status === 1;
        data.isAcceptChargess = state.tableData[4].status === 1;
        data.isFeasibility = state.tableData[5].status === 1;
        console.log('data', data)
        const res = await addRisk(data);
        if (res.code == 200) {
          ElMessage.success('保存成功')
@@ -407,6 +413,9 @@
        const { ...data} = JSON.parse(JSON.stringify(state.formData))
        data.id = val;
        data.project.id = val;
        if(data.project.province == '北京市' || data.project.province == '天津市' || data.project.province == '上海市' || data.project.province == '重庆市' || data.project.province == '香港特别行政区' || data.project.province == '澳门特别行政区'){
          data.project.city = data.project.province
        }
        delete data.project.area;
        data.isInBusiness = state.tableData[0].status === 1
        data.isSatisfyNeed = state.tableData[1].status === 1
src/views/safetyReview/projectManage/components/signConfirm.vue
@@ -96,6 +96,7 @@
})
const riskOpen = async (type,val) => {
  state.formData.projectId = val
  if(type === 'detail' || type === 'edit' ){
    const res = await getRiskDetail({projectId: val});
    if(res.code == 200){
@@ -117,8 +118,7 @@
        if (res.code == 200) {
          ElMessage.success('保存成功')
          formRef.value.clearValidate();
          emit('getNextStatus', res.data);
          emit('getNextStatus', res.data)
        } else {
          ElMessage.warning(res.message)
        }
src/views/safetyReview/projectManage/components/siteCheckRcd.vue
@@ -5,17 +5,17 @@
        <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-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="现场勘验时间">
            <el-date-picker
                style="width: 100%"
                v-model="state.formData.investigationPlanDate"
                v-model="state.formData.investigationDate"
                type="date"
                value-format="YYYY-MM-DD 00:00:00"
                placeholder="选择日期"
@@ -24,7 +24,7 @@
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item prop="investigationDate" label="现场勘验位置">
          <el-form-item prop="location" label="现场勘验位置">
            <el-input
                v-model="state.formData.location"
                size="large"
@@ -39,51 +39,115 @@
        <el-col :span="6">
          <el-form-item prop="isSafetyCheck" label="编制现场安全检查表">
            <el-radio-group v-model="state.formData.isSafetyCheck" size="large">
              <el-radio :label="true" size="large">是</el-radio>
              <el-radio :label="false" size="large">否</el-radio>
              <el-radio :label="1" size="large">是</el-radio>
              <el-radio :label="0" size="large">否</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-col :span="24" v-if="state.formData.isSafetyCheck == 1">
          <el-form-item label="安全检查表上传" prop="assAccessoryFiles">
            <el-upload accept="image/*,.pdf,.doc,.docx,.xlsx,.xls" :action="state.uploadUrl" :data="{moduleType: 5,projectId: props.projectId}" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,5)" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='1' v-model:file-list="state.safetyList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,5)" :before-remove="beforeRemove">
              <el-button type="primary">附件上传</el-button>
              <template #tip>
                <div class="el-upload__tip">上传文件尺寸小于5M,最多可上传1份</div>
              </template>
            </el-upload>
          </el-form-item>
        </el-col>
        <el-col :span="24" v-if="state.formData.isSafetyCheck == 0">
          <el-form-item prop="recordData" label="现场勘验记录">
            <el-input
                v-model="state.formData.recordData"
                :autosize="{ minRows: 6 }"
                maxlength="200"
                show-word-limit
                type="textarea">
            </el-input>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row style="border: 1px dashed #999;border-radius: 4px;padding: 10px;margin-top: 20px">
        <el-col :span="24">
          <el-form-item label="主要装置前合影照片" prop="deviceImages">
            <el-upload accept="image/*" :action="state.uploadUrl" :data="{moduleType: 1,projectId: props.projectId}" list-type="picture-card" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,1)" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='10' v-model:file-list="state.beforeDeviceList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,1)" :before-remove="beforeRemove">
              <el-icon><Plus /></el-icon>
              <template #tip>
                <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传1张</div>
                <div class="el-upload__tip">上传照片尺寸小于5M,最多可上传10张</div>
              </template>
            </el-upload>
          </el-form-item>
        </el-col>
      </el-row>
      <el-form-item prop="recordData" label="现场勘验记录">
        <el-input
            v-model="state.formData.recordData"
            :autosize="{ minRows: 6 }"
            maxlength="200"
            show-word-limit
            type="textarea">
        </el-input>
      </el-form-item>
      <el-form-item label="企业陪同照片">
      </el-form-item>
      <el-row style="border: 1px dashed #999;border-radius: 4px;padding: 10px;margin-top: 20px">
        <el-col :span="24">
          <el-form-item label="现场勘验照片" prop="investingationImages">
            <el-upload accept="image/*" :action="state.uploadUrl" :data="{moduleType: 2,projectId: props.projectId}" list-type="picture-card" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,2)" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='10' v-model:file-list="state.siteCheckList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,2)" :before-remove="beforeRemove">
              <el-icon><Plus /></el-icon>
              <template #tip>
                <div class="el-upload__tip">上传照片尺寸小于5M,最多可上传10张</div>
              </template>
            </el-upload>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row style="border: 1px dashed #999;border-radius: 4px;padding: 10px;margin-top: 20px;margin-bottom: 20px">
        <el-col :span="24">
          <el-form-item label="企业陪同人员照片" prop="ccompanyImages">
            <el-upload accept="image/*" :action="state.uploadUrl" :data="{moduleType: 3,projectId: props.projectId}" list-type="picture-card" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,3)" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='10' v-model:file-list="state.companyList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,3)" :before-remove="beforeRemove">
              <el-icon><Plus /></el-icon>
              <template #tip>
                <div class="el-upload__tip">上传照片尺寸小于5M,最多可上传10张</div>
              </template>
            </el-upload>
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <el-dialog v-model="state.imgDialog">
      <img style="width: 100%" :src="state.imgUrl" alt="Preview Image" />
    </el-dialog>
    <map-location ref="mapLocationRef" @giveLatLng="achieveLatLng"></map-location>
  </div>
</template>
<script setup>
import {defineEmits, onMounted, reactive, ref} from "vue"
import {ElMessage} from "element-plus"
import {ElMessage, ElMessageBox} from "element-plus"
import {Search} from '@element-plus/icons-vue'
import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis"
import {delPic} from "@/api/login"
import {addSiteCheck,editSiteCheck,getSiteCheckDetail, delFile, getFiles} from "@/api/projectManage/siteCheckRcd";
import { getToken } from "@/utils/auth";
import Cookies from "js-cookie"
const props = defineProps(['projectId'])
const emit = defineEmits(["getNextStatus"])
import MapLocation from "./mapLocation.vue"
let checkSafetyFiles = (rule, value, callback)=>{
  if(state.safetyList.length === 0){
    callback(new Error('请上传现场安全检查表'))
  }else{
    callback()
  }
}
let checkInvestFiles = (rule, value, callback)=>{
  if(state.siteCheckList.length === 0){
    callback(new Error('请上传现场勘验照片'))
  }else{
    callback()
  }
}
let checkCompanyFiles = (rule, value, callback)=>{
  if(state.companyList.length === 0){
    callback(new Error('请上传企业陪同人员照片'))
  }else{
    callback()
  }
}
const state = reactive({
  formData: {
@@ -92,17 +156,34 @@
    investigationDate: '',
    location: '',
    isSafetyCheck: null,
    recordData: ''
    recordData: '',
    assAccessoryFiles: [],
    deviceImages: [],
    investingationImages: [],
    ccompanyImages:[]
  },
  projectId: null,
  planPersons: [],
  rules: {
    recordData: [{required: true, message: '请填写现场勘验记录', trigger: 'blur'}]
    investigationDate: [{required: true, message: '请选择现场勘验时间', trigger: 'blur'}],
    location: [{required: true, message: '请选择现场勘验位置', trigger: 'blur'}],
    isSafetyCheck: [{required: true, message: '请选择现场勘验位置', trigger: 'blur'}],
    recordData: [{required: true, message: '请填写现场勘验记录', trigger: 'blur'}],
    assAccessoryFiles: [{required: true, validator: checkSafetyFiles, trigger: 'blur'}],
    // investingationImages: [{required: true, validator: checkInvestFiles, trigger: 'blur'}],
    // ccompanyImages: [{required: true, validator: checkCompanyFiles, trigger: 'blur'}]
  },
  beforeDeviceList: [],
  siteCheckList: [],
  companyList: [],
  safetyList: [],
  imgLimit: 1,
  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/manage/accessory-file/uploadFile',
  header: {
    Authorization: 'Bearer ' + getToken()
  }
    Authorization: getToken()
  },
  imgDialog: false,
  imgUrl: ''
})
const isAmin = ref(false)
@@ -116,13 +197,48 @@
});
const riskOpen = async (type,val) => {
  console.log("type",type,val)
  state.formData.projectId = val
  state.projectId = val
  if(type === 'detail' || type === 'edit' ){
    const res = await getRiskDetail({projectId: val});
    const res = await getSiteCheckDetail({projectId: val});
    if(res.code == 200){
      state.formData = res.data;
      state.formData.project.business = parseInt(res.data.project.business);
      state.formData.project.area = [res.data.project.province,res.data.project.city];
      state.beforeDeviceList = res.data.deviceImages.map(i=>{
        return {
          name: i.fileName,
          url: import.meta.env.VITE_APP_BASE_API + '/' + i.path,
          id: i.id,
          projectId: i.projectId,
          moduleType: i.moduleType
        }
      })
      state.siteCheckList = res.data.investingationImages.map(i=>{
        return {
          name: i.fileName,
          url: import.meta.env.VITE_APP_BASE_API + '/' + i.path,
          id: i.id,
          projectId: i.projectId,
          moduleType: i.moduleType
        }
      })
      state.companyList = res.data.ccompanyImages.map(i=>{
        return {
          name: i.fileName,
          url: import.meta.env.VITE_APP_BASE_API + '/' + i.path,
          id: i.id,
          projectId: i.projectId,
          moduleType: i.moduleType
        }
      })
      state.safetyList = res.data.assAccessoryFiles.map(i=>{
        return {
          name: i.fileName,
          url: import.meta.env.VITE_APP_BASE_API + '/' + i.path,
          id: i.id,
          projectId: i.projectId,
          moduleType: i.moduleType
        }
      })
    }else {
      ElMessage.warning(res.message)
    }
@@ -135,21 +251,49 @@
        return;
      }
      if(type === 'add'){
        const {projectId, ...data} = JSON.parse(JSON.stringify(state.formData))
        const res = await addRisk(data);
        if(state.formData.isSafetyCheck == 1){
          state.formData.recordData = ''
        }
        const {id, ...data} = JSON.parse(JSON.stringify(state.formData))
        const res = await addSiteCheck(data);
        if (res.code == 200) {
          ElMessage.success('保存成功')
          if(state.formData.isSafetyCheck == 0){
            const res = await delFile(state.safetyList[0].id)
            if(res.code == 200){
              console.log('删除原有附件')
              await getSafetyFiles()
            }else{
              ElMessage({
                type: 'warning',
                message: res.message
              })
            }
          }
          formRef.value.clearValidate();
          emit('getNextStatus', res.data);
        } else {
          ElMessage.warning(res.message)
        }
      }else if(type === 'clickEdit'){
        if(state.formData.isSafetyCheck == 1){
          state.formData.recordData = ''
        }
        const { ...data} = JSON.parse(JSON.stringify(state.formData))
        const res = await editRisk(data);
        const res = await editSiteCheck(data);
        if (res.code == 200) {
          ElMessage.success('变更成功')
          if(state.formData.isSafetyCheck == 0){
            const res = await delFile(state.safetyList[0].id)
            if(res.code == 200){
              await getSafetyFiles()
            }else{
              ElMessage({
                type: 'warning',
                message: res.message
              })
            }
          }
          formRef.value.clearValidate();
          // emit('getNextStatus', data.project.id);
        } else {
@@ -157,6 +301,90 @@
        }
      }
    }
  }
}
const getBeforeFiles = async (id)=>{
  const res = await getFiles({projectId: id ? id : props.projectId,moduleType: 1})
  if(res.code == 200){
    if(res.data && res.data.length>0){
      state.beforeDeviceList = res.data.map(i=>{
        return {
          name: i.fileName,
          url: import.meta.env.VITE_APP_BASE_API + '/' + i.path,
          id: i.id,
          projectId: i.projectId,
          moduleType: i.moduleType
        }
      })
    }else{
      state.beforeDeviceList=[]
    }
  }else {
    ElMessage.warning(res.message)
  }
}
const getSiteCheckFiles = async (id)=>{
  const res = await getFiles({projectId: id ? id : props.projectId,moduleType: 2})
  if(res.code == 200){
    if(res.data && res.data.length>0){
      state.siteCheckList = res.data.map(i=>{
        return {
          name: i.fileName,
          url: import.meta.env.VITE_APP_BASE_API + '/' + i.path,
          id: i.id,
          projectId: i.projectId,
          moduleType: i.moduleType
        }
      })
    }else{
      state.siteCheckList = []
    }
  }else {
    ElMessage.warning(res.message)
  }
}
const getCompanyFiles = async (id)=>{
  const res = await getFiles({projectId: id ? id : props.projectId,moduleType: 3})
  if(res.code == 200){
    if(res.data && res.data.length>0){
      state.companyList = res.data.map(i=>{
        return {
          name: i.fileName,
          url: import.meta.env.VITE_APP_BASE_API + '/' + i.path,
          id: i.id,
          projectId: i.projectId,
          moduleType: i.moduleType
        }
      })
    }else{
      state.companyList=[]
    }
  }else {
    ElMessage.warning(res.message)
  }
}
const getSafetyFiles = async (id)=>{
  const res = await getFiles({projectId: id ? id : props.projectId,moduleType: 5})
  if(res.code == 200){
    if(res.data && res.data.length>0){
      state.safetyList = res.data.map(i=>{
        return {
          name: i.fileName,
          url: import.meta.env.VITE_APP_BASE_API + '/' + i.path,
          id: i.id,
          projectId: i.projectId,
          moduleType: i.moduleType
        }
      })
    }else{
      state.safetyList = []
    }
  }else {
    ElMessage.warning(res.message)
  }
}
@@ -187,14 +415,27 @@
};
const handlePictureCardPreview = (uploadFile) => {
  state.dialogImageUrl = uploadFile.url
  state.dialogImg = true
  console.log(uploadFile,'file')
  state.imgUrl = uploadFile.url
  state.imgDialog = true
};
const handleAvatarSuccess = (res, uploadFile) => {
const handleAvatarSuccess = (res, uploadFile, type) => {
  if(res.code == 200){
    // state.registerForm.agency.reportPath = res.data.path
    if(type == 1){
      getBeforeFiles()
    }
    if(type == 2){
      getSiteCheckFiles()
    }
    if(type == 3){
      getCompanyFiles()
    }
    if(type == 5){
      console.log(res,'res')
      getSafetyFiles()
    }
  }else{
    ElMessage({
      type: 'warning',
@@ -203,19 +444,55 @@
  }
}
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
    })
  }
const handleRemove = async (file, uploadFiles,type) => {
  ElMessageBox.confirm(
      '确定删除该附件?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delFile(file.id)
        if(res.code == 200){
          ElMessage({
            type: 'success',
            message: '文件已删除'
          })
          if(type == 1){
            await getBeforeFiles()
          }
          if(type == 2){
            await getSiteCheckFiles()
          }
          if(type == 3){
            await getCompanyFiles()
          }
          if(type == 5){
            await getSafetyFiles()
          }
        }else{
          ElMessage({
            type: 'warning',
            message: res.message
          })
        }
      })
      .catch(()=>{
        if(type == 1){
          getBeforeFiles()
        }
        if(type == 2){
          getSiteCheckFiles()
        }
        if(type == 3){
          getCompanyFiles()
        }
        if(type == 5){
          getSafetyFiles()
        }
      })
}
defineExpose({
src/views/safetyReview/projectManage/components/techLeaderReview.vue
@@ -3,10 +3,10 @@
    <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-form-item prop="auditDate" label="审核日期">
            <el-date-picker
                style="width: 100%"
                v-model="state.formData.transmitDate"
                v-model="state.formData.auditDate"
                type="date"
                value-format="YYYY-MM-DD 00:00:00"
                placeholder="选择日期"
@@ -15,11 +15,11 @@
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item prop="leader.name" label="技术负责人">
          <el-form-item prop="assessor.name" label="技术负责人">
            <el-input
                v-model="state.formData.leader.name"
                v-model="state.formData.assessor.name"
                size="large"
                placeholder="请选择内部审核员"
                placeholder="请选择技术负责人"
            >
              <template #append>
                <el-button :icon="Search" @click="openExperts('技术负责人')"/>
@@ -28,10 +28,10 @@
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item prop="transmitDate" label="确认日期">
          <el-form-item label="确认日期">
            <el-date-picker
                style="width: 100%"
                v-model="state.formData.transmitDate"
                v-model="state.formData.affirmDate"
                type="date"
                value-format="YYYY-MM-DD 00:00:00"
                placeholder="选择日期"
@@ -40,18 +40,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="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-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"/>
@@ -64,9 +64,9 @@
          </template>
        </el-table-column>
      </el-table>
      <el-form-item prop="technology" label="存在问题及建议">
      <el-form-item label="存在问题及建议">
        <el-input
            v-model="state.formData.technology"
            v-model="state.formData.suggestions"
            :autosize="{ minRows: 6 }"
            maxlength="500"
            show-word-limit
@@ -85,54 +85,50 @@
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 {addInnerReview, editInnerReview, getInnerReviewDetail} from "@/api/projectManage/innerReview"
import {delPic} from "@/api/login"
import { getToken } from "@/utils/auth";
import Cookies from "js-cookie"
import ExpertsList from "./expertsList";
const emit = defineEmits(["getNextStatus"]);
const emit = defineEmits(["getNextStatus"])
const state = reactive({
  formData: {
    id: '',
    leader: {
    projectId: '',
    auditDate:'',
    auditType: 2,
    assessor: {
      name: ''
    },
    leaderId: null,
    linkMan: '',
    transmitPerson: '',
    transmitDate: ''
    assessorId: null,
    affirmDate: '',
    suggestions: ''
  },
  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'}]
    "assessor.name": [{required: true, message: '请选择内部审核员', trigger: 'blur'}],
    auditDate: [{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}
    {id: 1, content: '报告中所列评价依据是否得到引用和验证',key: 'isBasisQuote', status: 1},
    {id: 2, content: '现场收集的有关资料是否齐全、有效',key: 'isData', status: 1},
    {id: 3, content: '危险有害因素识别是否充分', key: 'isDangerFull',status: 1},
    {id: 4, content: '报告是否有重大遗漏', key: 'isOmission',status: 1},
    {id: 5, content: '评价方法选用是否合理', key: 'isMethodRational',status: 1},
    {id: 6, content: '对策措施及建议是否具有针对性、合理性', key: 'isMeasureEquitable',status: 1},
    {id: 7, content: '评价结论及格式是否正确', key: 'isConclusionRight',status: 1},
    {id: 8, content: '已按要求修改完成', key: 'isAmendFinish',status: 1},
    {id: 9, content: '可报过程控制负责人审核', key: 'isReportAudit',status: 1}
  ],
  imgLimit: 1,
  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
  header: {
    Authorization: 'Bearer ' + getToken()
    Authorization: getToken()
  },
  dialogImageUrl: '',
  dialogImg: false
})
const props = {
  expandTrigger: 'hover',
  value: 'name',
  label: 'name'
}
const isAmin = ref(false)
const formRef = ref()
const expertsListRef = ref()
@@ -144,10 +140,18 @@
})
const riskOpen = async (type,val) => {
  state.formData.projectId = val
  if(type === 'detail' || type === 'edit' ){
    const res = await getRiskDetail({projectId: val});
    const res = await getInnerReviewDetail({projectId: val,auditType: 2});
    if(res.code == 200){
      state.formData = res.data;
      state.formData = res.data
      for(let key in res.data){
        for(let item of state.tableData){
          if(item.key == key){
            item.status = res.data[key]==true?1:0
          }
        }
      }
    }else {
      ElMessage.warning(res.message)
    }
@@ -161,7 +165,10 @@
      }
      if(type === 'add'){
        const {id, ...data} = JSON.parse(JSON.stringify(state.formData))
        const res = await addRisk(data);
        for(let i of state.tableData){
          data[i.key] = i.status
        }
        const res = await addInnerReview(data);
        if (res.code == 200) {
          ElMessage.success('保存成功')
          formRef.value.clearValidate();
@@ -172,7 +179,10 @@
        }
      }else if(type === 'clickEdit'){
        const { ...data} = JSON.parse(JSON.stringify(state.formData))
        const res = await editRisk(data);
        for(let i of state.tableData){
          data[i.key] = i.status
        }
        const res = await editInnerReview(data);
        if (res.code == 200) {
          ElMessage.success('变更成功')
          formRef.value.clearValidate();
@@ -190,8 +200,8 @@
}
const getSelected = (type,obj)=>{
  state.formData.leader.name = obj.name
  state.formData.leaderId = obj.id
  state.formData.assessor.name = obj.name
  state.formData.assessorId = obj.id
}
// 图片上传
@@ -210,11 +220,6 @@
    });
    return false
  }
};
const handlePictureCardPreview = (uploadFile) => {
  state.dialogImageUrl = uploadFile.url
  state.dialogImg = true
};
src/views/safetyReview/projectManage/components/uploadReviewRcd.vue
@@ -4,10 +4,10 @@
      <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-upload accept="image/*,.pdf,.doc,.docx" :action="state.uploadUrl" :data="{moduleType: 6,projectId: props.projectId}" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" v-model:file-list="state.fileList" :before-upload="picSize">
              <el-button type="primary">上传评审记录</el-button>
              <template #tip>
                <div class="el-upload__tip">支持上传pdf/word/doc/docx格式文件,尺寸小于2M,最多可上传3张</div>
                <div class="el-upload__tip">上传文件尺寸尺寸小于2M</div>
              </template>
            </el-upload>
          </el-form-item>
@@ -15,10 +15,11 @@
      </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">
        <el-table-column label="原名称" prop="originName" header-align="center" :show-overflow-tooltip="true"/>
        <el-table-column label="操作" header-align="center" class-name="small-padding fixed-width" width="120">
          <template #default="scope">
            <el-button link type="primary">查看</el-button>
            <el-button link type="primary" @click="checkFile(scope.row)">查看</el-button>
            <el-button link type="danger" @click="handleRemove(scope.row,[])">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
@@ -28,43 +29,25 @@
<script setup>
import {defineEmits, onMounted, reactive, ref} from "vue";
import {ElMessage} from "element-plus";
import {ElMessage, ElMessageBox} from "element-plus";
import {Search} from '@element-plus/icons-vue'
import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis"
import {delPic} from "@/api/login"
import {delFile, getFiles, getReviewDone} from "@/api/projectManage/siteCheckRcd";
import { getToken } from "@/utils/auth";
import Cookies from "js-cookie"
import axios from 'axios'
const emit = defineEmits(["getNextStatus"]);
const props = defineProps(['projectId'])
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'}]
  },
  formData: {},
  rules: {},
  tableData: [],
  imgLimit: 3,
  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/manage/accessory-file/uploadFile',
  header: {
    Authorization: 'Bearer ' + getToken()
  }
    Authorization: getToken()
  },
  fileList: []
})
const props = {
  expandTrigger: 'hover',
  value: 'name',
  label: 'name'
}
const isAmin = ref(false)
const formRef = ref()
onMounted(() => {
@@ -72,16 +55,12 @@
  if(userInfo.identity === 0){
    isAmin.value = true;
  }
  getReviewFiles(props.projectId)
})
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)
    }
    await getReviewFiles
  }
  if(type === 'add' || type === 'clickEdit') {
    const valid = await formRef.value.validate();
@@ -91,28 +70,53 @@
        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 {
        const res = await getFiles({projectId: val,moduleType: 6})
        if(res.code == 200){
          if(res.data && res.data.length>0){
            state.tableData = res.data
            ElMessage.success('保存成功')
            getReviewDone({projectId: val}).then((res)=>{
              if(res.code == 200){
                emit('getNextStatus', val);
              }else{
                ElMessage.warning(res.message)
              }
            })
          }else{
            state.tableData=[]
            ElMessage.warning('请上传评审记录附件')
          }
        }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 {
        const res = await getFiles({projectId: val,moduleType: 6})
        if(res.code == 200){
          if(res.data && res.data.length>0){
            state.tableData = res.data
            ElMessage.success('变更成功')
          }else{
            state.tableData=[]
            ElMessage.warning('请上传评审记录附件')
          }
        }else {
          ElMessage.warning(res.message)
        }
      }
    }
  }
}
const getReviewFiles = async (id)=>{
  const res = await getFiles({projectId: id ? id : props.projectId,moduleType: 6})
  if(res.code == 200){
    if(res.data && res.data.length>0){
      state.tableData = res.data
    }else{
      state.tableData=[]
    }
  }else {
    ElMessage.warning(res.message)
  }
}
@@ -125,18 +129,25 @@
}
const picSize = async (rawFile) => {
  if(rawFile.size / 1024 / 1024 > 2){
  if(rawFile.size / 1024 / 1024 > 5){
    ElMessage({
      type: 'warning',
      message: '文件大小不能超过2M'
      message: '文件大小不能超过5M'
    });
    return false
  }
};
const handleAvatarSuccess = (res, uploadFile) => {
const handlePictureCardPreview = (uploadFile) => {
  console.log(uploadFile,'file')
  state.imgUrl = uploadFile.url
  state.imgDialog = true
};
const handleAvatarSuccess = (res, uploadFile, type) => {
  if(res.code == 200){
    // state.registerForm.agency.reportPath = res.data.path
    getReviewFiles()
  }else{
    ElMessage({
      type: 'warning',
@@ -146,18 +157,49 @@
}
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
    })
  }
  ElMessageBox.confirm(
      '确定删除该附件?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delFile(file.id)
        if(res.code == 200){
          ElMessage({
            type: 'success',
            message: '文件已删除'
          })
          await getReviewFiles()
        }else{
          ElMessage({
            type: 'warning',
            message: res.message
          })
        }
      })
      .catch(()=>{
        getReviewFiles()
      })
}
const checkFile = async (file)=>{
  axios.get(import.meta.env.VITE_APP_BASE_API +'/' + file.path,{headers:{'Content-Type': 'application/json','Authorization': `${getToken()}`,'uid':`${Cookies.get('uid')}`},responseType: 'blob'}).then(res=>{
    if (res) {
      const link = document.createElement('a')
      let blob = new Blob([res.data],{type: res.data.type})
      link.style.display = "none";
      link.href = URL.createObjectURL(blob); // 创建URL
      window.open(link.href)
    } else {
      ElMessage({
        type: 'warning',
        message: '文件读取失败'
      });
    }
  })
}
defineExpose({
src/views/safetyReview/projectManage/components/worksDialog.vue
对比新文件
@@ -0,0 +1,205 @@
<template>
    <div class="notice">
        <el-dialog
            v-model="dialogVisible"
            :title="title"
            width="500px"
            :before-close="handleClose"
        >
            <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-position="top">
                <el-form-item label="评价组成员:" prop="person.name">
                  <el-input
                      v-model="state.form.person.name"
                      size="large"
                      placeholder="请选择评价组成员"
                      @focus="openExperts('评价组成员')"
                  >
                    <template #append>
                      <el-button :icon="Search" @click="openExperts('评价组成员')"/>
                    </template>
                  </el-input>
                </el-form-item>
                <el-form-item label="工作类型:" prop="jobType">
                  <el-select v-model="state.form.jobType" placeholder="工作类型" style="width: 100%" size="large">
                    <el-option v-for="(item,index) in props.typeList" :key="index" :label="item.label" :value="item.value"/>
                  </el-select>
                </el-form-item>
<!--                <el-form-item label="专业能力:" prop="person.major">-->
<!--                  <el-select v-model="state.form.person.majorName" placeholder="专业能力" style="width: 100%" size="large" @change="getCerNo">-->
<!--                    <el-option v-for="(item,index) in state.form.person.majorNames" :key="index" :label="item" :value="item"/>-->
<!--                  </el-select>-->
<!--                </el-form-item>-->
<!--                <el-form-item label="资格证书:" prop="person.certificateNo">-->
<!--                  <el-input-->
<!--                      v-model="state.form.person.certificateNo"-->
<!--                      size="large"-->
<!--                      readonly-->
<!--                  />-->
<!--                </el-form-item>-->
              <el-form-item label="承担工作:" prop="work">
                <el-select v-model="state.form.work" multiple placeholder="承担工作" style="width: 100%" size="large">
                  <el-option v-for="item in props.workList" :key="item.value" :label="item.label" :value="item.value"/>
                </el-select>
              </el-form-item>
              <el-form-item label="承诺后期前往现场勘验:" prop="laterPromise">
                <el-radio-group v-model="state.form.laterPromise" size="large">
                  <el-radio :label="1" size="large">是</el-radio>
                  <el-radio :label="0" size="large">否</el-radio>
                </el-radio-group>
              </el-form-item>
              <el-form-item label="未到现场勘验原因:">
                <el-input v-model="state.form.reason" maxlength="30" show-word-limit type="text" size="large"/>
              </el-form-item>
            </el-form>
            <template #footer>
                    <span class="dialog-footer">
                        <el-button @click="handleClose" size="default">取 消</el-button>
                        <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
                    </span>
            </template>
          <experts-list ref="expertsListRef" @getName="getSelected"></experts-list>
        </el-dialog>
    </div>
</template>
<script setup>
import {defineProps, nextTick, reactive, ref, toRefs} from 'vue'
import {ElMessage} from "element-plus";
import {Search} from '@element-plus/icons-vue'
import {addWorks, editWorks} from "@/api/projectManage/evaPlan"
import ExpertsList from "./expertsList"
const dialogVisible = ref(false);
const title = ref("");
const busRef = ref();
const expertsListRef = ref()
const props = defineProps(['workList','typeList'])
const emit = defineEmits(["getList"]);
const state = reactive({
    form: {
      id: null,
      person: {
        name: '',
        // major: {},
        // certificateNo: '',
        // certs: '',
        // majorName: '',
        // majorNames: [],
        // ids: []
      },
      personId: null,
      jobType: null,
      projectId: null,
      informed: 0,
      work: [],
      laterPromise: 0,
      reason: ''
    },
    formRules:{
        'person.name': [{ required: true, message: '请选择评价组成员', trigger: 'change' }],
        'person.major': [{ required: true, message: '请选择专业能力', trigger: 'blur' }],
        work: [{ required: true, message: '请选择承担工作', trigger: 'blur' }],
        jobType: [{ required: true, message: '请选择工作类型', trigger: 'blur' }]
    },
})
const openDialog = async (type, value,projectId) => {
    title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'
    state.form.projectId = projectId
    if(type == 'add'){
      nextTick(()=>{
        busRef.value.resetFields()
      })
    }else if(type === 'edit') {
      state.form = JSON.parse(JSON.stringify(value))
      state.form.work = value.work.split(',')
      state.form.laterPromise = value.laterPromise?1:0
    }
    dialogVisible.value = true;
}
const openExperts = (type) =>{
  expertsListRef.value.openDialog(type)
}
const getSelected = (type,obj)=>{
    state.form.person.name = obj.name
    state.form.personId = obj.id
    // state.form.person.certs = obj.certificateNo
    // state.form.person.majorNames = obj.majorNames
    // state.form.person.ids = obj.major.split(',')
}
// const getCerNo = () =>{
//   const i = state.form.person.majorNames.indexOf(state.form.person.majorName)
//   const obj = JSON.parse(state.form.person.certs)
//   state.form.person.certificateNo = Object.values(obj)[i]
//   state.form.person.major[state.form.person.ids[i]] = state.form.person.certificateNo
// }
const onSubmit = async () => {
    const valid = await busRef.value.validate();
    if(valid){
        if(title.value === '新增'){
            const {id,work,...data} = state.form
            data['work'] =  state.form.work.join(',')
            // const {name,major,...rest} = state.form.person
            // data.person = { name,major }
            // data.person.major =  JSON.stringify(state.form.person.major)
            const res = await addWorks(data)
            if(res.code === 200){
                ElMessage({
                    type: 'success',
                    message: '新增成功'
                });
            }else{
                ElMessage.warning(res.message)
            }
            emit("getList")
            busRef.value.clearValidate();
            busRef.value.resetFields()
            dialogVisible.value = false;
        }else if(title.value === '编辑'){
            const {...data} = state.form
            data['work'] =  state.form.work.join(',')
            const res = await editWorks(data)
            if(res.code === 200){
                ElMessage({
                    type: 'success',
                    message: '修改成功'
                });
            }else{
                ElMessage.warning(res.message)
            }
            emit("getList")
            busRef.value.clearValidate();
            busRef.value.resetFields()
            dialogVisible.value = false;
        }
    }
}
const handleClose = () => {
    busRef.value.clearValidate();
    busRef.value.resetFields()
    dialogVisible.value = false;
}
defineExpose({
    openDialog
});
</script>
<style scoped lang="scss">
.notice{
    :deep(.el-form .el-form-item__label) {
        font-size: 15px;
    }
    .file {
        display: flex;
        flex-direction: column;
        align-items: flex-start;
    }
}
</style>
src/views/safetyReview/projectManage/process.vue
@@ -41,14 +41,14 @@
            <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>
            <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>
            <evaluate-plan ref="evalPlanRef" v-if="selectedObj.id === 4" @getNextStatus="getNextStatus" :projectId="projectId"></evaluate-plan>
            <employ-notice-record ref="employNoticeRcdRef" v-if="selectedObj.id === 5" @getNextStatus="getNextStatus" :projectId="projectId"></employ-notice-record>
            <site-check-rcd ref="siteCheckRcdRef" v-if="selectedObj.id === 6" @getNextStatus="getNextStatus" :projectId="projectId"></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 === 11" @getNextStatus="getNextStatus"></process-ctrl-review>
            <upload-review-rcd ref="uploadReviewRef" v-if="selectedObj.id === 9" @getNextStatus="getNextStatus" :projectId="projectId"></upload-review-rcd>
            <rate-conclusion ref="rateConRef" v-if="selectedObj.id === 10" @getNextStatus="getNextStatus" :projectId="projectId"></rate-conclusion>
            <process-ctrl-review ref="proCtrlRef" v-if="selectedObj.id === 11" @getNextStatus="getNextStatus" :projectId="projectId"></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>
@@ -527,7 +527,7 @@
  // }, 100)
}
const  nextMenu =  (id) => {
const nextMenu = (id) => {
  menuList.value[id].subMenus.forEach( item => {
    if(item.id === selectedObj.value.id + 1){
      chooseSubMenu(item,true);
@@ -565,8 +565,7 @@
  goRouter(selectedObj.value.id,'clickEdit')
}
const getNextStatus = async (val) => {
  projectId.value = val;
  console.log("val",val)
  projectId.value = val
  const res = await getProjectStatus(val);
  if(res.code == 200){
    if(res.data <=4){
@@ -740,21 +739,87 @@
      console.log("3")
      break;
    case 4:
      if(type === 'add'){
        evalPlanRef.value.riskOpen('add',projectId.value);
      }else if (type === 'clickEdit'){
        evalPlanRef.value.riskOpen('clickEdit',projectId.value);
      }else {
        if(projectStatus.value === 'view' || projectStatus.value === 'add'){
          evalPlanRef.value.riskOpen('detail',projectId.value);
        }else if(projectStatus.value === 'edit'){
          evalPlanRef.value.riskOpen('edit',projectId.value);
        }
      }
      console.log("4")
      break;
    case 5:
      if(type === 'add'){
        employNoticeRcdRef.value.riskOpen('add',projectId.value);
      }else if (type === 'clickEdit'){
        employNoticeRcdRef.value.riskOpen('clickEdit',projectId.value);
      }else {
        if(projectStatus.value === 'view' || projectStatus.value === 'add'){
          employNoticeRcdRef.value.riskOpen('detail',projectId.value);
        }else if(projectStatus.value === 'edit'){
          employNoticeRcdRef.value.riskOpen('edit',projectId.value);
        }
      }
      console.log("5")
      break;
    case 6:
      if(type === 'add'){
        siteCheckRcdRef.value.riskOpen('add',projectId.value);
      }else if (type === 'clickEdit'){
        siteCheckRcdRef.value.riskOpen('clickEdit',projectId.value);
      }else {
        if(projectStatus.value === 'view' || projectStatus.value === 'add'){
          siteCheckRcdRef.value.riskOpen('detail',projectId.value);
        }else if(projectStatus.value === 'edit'){
          siteCheckRcdRef.value.riskOpen('edit',projectId.value);
        }
      }
      console.log("6")
      break;
    case 7:
      if(type === 'add'){
        innerReviewRef.value.riskOpen('add',projectId.value);
      }else if (type === 'clickEdit'){
        innerReviewRef.value.riskOpen('clickEdit',projectId.value);
      }else {
        if(projectStatus.value === 'view' || projectStatus.value === 'add'){
          innerReviewRef.value.riskOpen('detail',projectId.value);
        }else if(projectStatus.value === 'edit'){
          innerReviewRef.value.riskOpen('edit',projectId.value);
        }
      }
      console.log("7")
      break;
    case 8:
      if(type === 'add'){
        techReviewRef.value.riskOpen('add',projectId.value);
      }else if (type === 'clickEdit'){
        techReviewRef.value.riskOpen('clickEdit',projectId.value);
      }else {
        if(projectStatus.value === 'view' || projectStatus.value === 'add'){
          techReviewRef.value.riskOpen('detail',projectId.value);
        }else if(projectStatus.value === 'edit'){
          techReviewRef.value.riskOpen('edit',projectId.value);
        }
      }
      console.log("8")
      break;
    case 9:
      if(type === 'add'){
        uploadReviewRef.value.riskOpen('add',projectId.value);
      }else if (type === 'clickEdit'){
        uploadReviewRef.value.riskOpen('clickEdit',projectId.value);
      }else {
        if(projectStatus.value === 'view' || projectStatus.value === 'add'){
          uploadReviewRef.value.riskOpen('detail',projectId.value);
        }else if(projectStatus.value === 'edit'){
          uploadReviewRef.value.riskOpen('edit',projectId.value);
        }
      }
      console.log("9")
      break;
    case 10: