马宇豪
2025-05-27 d0d78b9fbe144326f136ee048bb59d314413032e
src/views/analyse/applyReview/components/reportDialog.vue
@@ -24,7 +24,8 @@
<!--                                <el-radio :label="5">特种设备类</el-radio>-->
<!--                                <el-radio :label="6">其他类</el-radio>-->
<!--                            </el-radio-group>-->
                            {{reportDialogState.experimentTypeList.find(i=>i.id === reportDialogState.reportForm.experimentType)?.name}}
<!--                            {{reportDialogState.experimentTypeList.find(i=>i.id === reportDialogState.reportForm.experimentType)?.name}}-->
                          {{typeValue}}
                        </td>
                    </tr>
                    <tr>
@@ -107,28 +108,11 @@
                        <div>{{item.siteType}}</div>
                      </td>
                    </tr>
                    <tr>
                      <td class="w-25 m-color required">评估人</td>
                      <td class="w-75 m-color">
<!--                        <el-select style="width: 100%" :disabled="reportDialogState.disabled" v-model="reportDialogState.reportForm.assessPerson" clearable filterable>-->
<!--                          <el-option-->
<!--                              v-for="item in reportDialogState.allPersonList"-->
<!--                              :key="item.id"-->
<!--                              :value="item.id"-->
<!--                              :label="item.personName"-->
<!--                          ></el-option>-->
<!--                        </el-select>-->
                        <el-input :disabled="reportDialogState.disabled" v-model="reportDialogState.reportForm.assessPerson" placeholder="评估人" />
                      </td>
<!--                      <td class="w-25 m-color required">评估时间</td>-->
<!--                      <td class="w-25 m-color">-->
<!--                        <el-date-picker :disabled="reportDialogState.disabled"  type="datetime" format="YYYY/MM/DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" v-model="reportDialogState.reportForm.assessTime" />-->
<!--                      </td>-->
                    </tr>
                    <tr class="m-color b-font" style="text-align: center">实验概况</tr>
                    <tr>
                        <el-input type="textarea" :autosize="{ minRows: 3}" disabled v-model="reportDialogState.reportForm.experimentDesc" placeholder="(简要描述实验原理、实验步骤、所用试剂或材料设备等)" />
<!--                        <el-input type="textarea" :autosize="{ minRows: 3}" disabled v-model="reportDialogState.reportForm.experimentDesc" placeholder="(简要描述实验原理、实验步骤、所用试剂或材料设备等)" />-->
                      <el-input type="textarea" :autosize="{ minRows: 3}" disabled v-model="reportDialogState.reportForm.process" placeholder="(简要描述实验原理、实验步骤、所用试剂或材料设备等)" />
                    </tr>
                    <tr class="m-color b-font" style="text-align: center">实验涉及的危险源</tr>
                    <tr>
@@ -160,17 +144,49 @@
                    </tr>
                    <tr class="m-color b-font required" style="text-align: center">实验和实验项目综合风险等级评定</tr>
                    <tr>
                      <td class="m-color" style="width: 100%">
                      <td class="m-color" style="width: 100%;height: 65px">
                        <el-radio-group :disabled="reportDialogState.disabled"  v-model="reportDialogState.reportForm.assessLevel">
                          <el-radio :label="1">低风险(一级)</el-radio>
                          <el-radio :label="2">一般风险(二级)</el-radio>
                          <el-radio :label="3">较大风险(三级)</el-radio>
                          <el-radio :label="4">重大风险(四级)</el-radio>
                            <div style="display: flex;justify-content: center">
                                <div style="display: flex;flex-direction: column">
                                    <el-radio :label="1">重大风险(一级)</el-radio>
                                    <el-tag v-if="reportDialogState.reportForm.assessLevel == 1" class="tag-style tag-bg1" />
                                </div>
                                <div style="display: flex;flex-direction: column">
                                    <el-radio :label="2">较大风险(二级)</el-radio>
                                    <el-tag v-if="reportDialogState.reportForm.assessLevel == 2" class="tag-style tag-bg2"  />
                                </div>
                                <div style="display: flex;flex-direction: column">
                                    <el-radio :label="3">一般风险(三级)</el-radio>
                                    <el-tag v-if="reportDialogState.reportForm.assessLevel == 3" class="tag-style tag-bg3"  />
                                </div>
                                <div style="display: flex;flex-direction: column">
                                    <el-radio :label="4">低风险(四级)</el-radio>
                                    <el-tag v-if="reportDialogState.reportForm.assessLevel == 4" style="width: 43px;margin-left: 20px;" class="tag-bg4" />
                                </div>
                            </div>
                        </el-radio-group>
                      </td>
                    </tr>
                    <tr>
                      <el-input type="textarea" :autosize="{ minRows: 3}" :disabled="reportDialogState.disabled" v-model="reportDialogState.reportForm.description" placeholder="评定依据(必填)" />
                    </tr>
                    <tr>
                      <td class="w-25 m-color required">评估人</td>
                      <td class="w-75 m-color">
                        <!--                        <el-select style="width: 100%" :disabled="reportDialogState.disabled" v-model="reportDialogState.reportForm.assessPerson" clearable filterable>-->
                        <!--                          <el-option-->
                        <!--                              v-for="item in reportDialogState.allPersonList"-->
                        <!--                              :key="item.id"-->
                        <!--                              :value="item.id"-->
                        <!--                              :label="item.personName"-->
                        <!--                          ></el-option>-->
                        <!--                        </el-select>-->
                        <el-input :disabled="reportDialogState.disabled" v-model="reportDialogState.reportForm.assessPerson" placeholder="评估人" />
                      </td>
                      <!--                      <td class="w-25 m-color required">评估时间</td>-->
                      <!--                      <td class="w-25 m-color">-->
                      <!--                        <el-date-picker :disabled="reportDialogState.disabled"  type="datetime" format="YYYY/MM/DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" v-model="reportDialogState.reportForm.assessTime" />-->
                      <!--                      </td>-->
                    </tr>
                    <tr v-if="reportDialogState.reportForm.person?.length>0" class="m-color b-font" style="text-align: center">审批内容</tr>
                    <template v-if="reportDialogState.reportForm.person?.length>0" v-for="item in reportDialogState.reportForm.person">
@@ -194,6 +210,7 @@
              <span class="dialog-footer" style="padding-top:10px;text-align: center !important;">
                <el-button @click="reportDialogState.reportDialogVisible = !reportDialogState.reportDialogVisible" size="default">取 消</el-button>
                <el-button type="primary" v-if="!reportDialogState.disabled" @click="onSubmitProject()" size="default">提交审批</el-button>
                <el-button type="primary" v-if="reportDialogState.disabled" @click="startGeneration()" size="default">导出评估报告</el-button>
              </span>
            </template>
        </el-dialog>
@@ -208,10 +225,11 @@
import {userApi} from "/@/api/systemManage/user";
import {roomApi} from "/@/api/basic/room";
import {assessApplyApi} from "/@/api/analyse/assessApply";
import {generateWordDocument} from "/@/views/experiment/developing/components/exportWord.js";
const SelectDanger = defineAsyncComponent(() => import('./selectDanger.vue'))
const selectDangerRef = ref()
const reportFormRef = ref()
const typeValue = ref([])
const reportDialogState = reactive<ReportDialogType>({
    title: '',
    disabled: false,
@@ -236,7 +254,10 @@
        riskSource: [],
        riskSourceType: [],
        description: '',
        person: []
        person: [],
        process:'',
      experimentAndType: [],
      oldRiskAssess: []
    },
    reportFormRules: {
      assessPerson: [{ required: true, message: '请填写评估人员', trigger: 'blur' }],
@@ -254,7 +275,23 @@
      {id: 4, name: '机电类'},
      {id: 5, name: '特种设备类'},
      {id: 6, name: '其它类'}
    ]
    ],
  riskSourceTypeList: [
    {id: 1, name: '化学安全'},
    {id: 2, name: '辐射安全'},
    {id: 3, name: '生物安全'},
    {id: 4, name: '机电安全'},
    {id: 5, name: '电气安全'},
    {id: 6, name: '激光安全'},
    {id: 7, name: '特种设备安全'},
    {id: 8, name: '其他安全'},
  ],
  riskLevelList: [
    {id: 1, name: '重大风险(一级)'},
    {id: 2, name: '较大风险(二级)'},
    {id: 3, name: '一般风险(三级)'},
    {id: 4, name: '低风险(四级)'},
  ],
})
const showReportDialog = (title: string, value: ProjectType, allRoomList: RoomType []) => {
@@ -303,6 +340,8 @@
        reportDialogState.reportForm[i] = res.data.data[0][i];
      }
    }
    const arr = reportDialogState.reportForm.experimentAndType.map(item => item.type.experimentType)
    typeValue.value = arr.join(',')
    console.log(reportDialogState.reportForm,'reportDialogState.reportForm')
  }else{
    ElMessage({
@@ -383,7 +422,7 @@
        realName: ''
      }
    });
    if(res.data.code === 200){
    if(res.data.code === 100){
        reportDialogState.systemPersonList = JSON.parse(JSON.stringify(res.data.data));
    }else{
        ElMessage({
@@ -410,6 +449,76 @@
defineExpose({
    showReportDialog,
});
const templatePath = '/static/exampleScience.docx'
const startGeneration = async () => {
  const data = JSON.parse(JSON.stringify(reportDialogState.reportForm))
  const experimentTypeNameList = data.experimentAndType.map(item => {
    return {
      id: item.type.id,
      experimentType: item.type.experimentType
    }
  })
  const experimentTypeListExample =  JSON.parse(JSON.stringify(reportDialogState.experimentTypeList))
  experimentTypeListExample.forEach(item => {
    if(experimentTypeNameList.some(i => i.experimentType == item.name)){
      item.label = item.name
      item.checked = false
    }else {
      item.label = item.name
      item.checked = true
    }
  })
  data.typeList = experimentTypeListExample
  data.depNameList = data.dep
  const siteTest = data.experimentSite.map(item => item.siteName)
  data.siteList = siteTest.join(',')
  const riskType = data.riskSourceType.filter(item => item.status == 1)
  const riskListExample = reportDialogState.riskSourceTypeList
  riskListExample.forEach(item => {
    if(riskType.some(i => i.riskSourceType === item.name)){
      item.label = item.name
      item.checked = false
    }else {
      item.label = item.name
      item.checked = true
    }
  })
  data.riskList = riskListExample
  const level = data.assessLevel.toString().split(',')
  const levelExample =  JSON.parse(JSON.stringify(reportDialogState.riskLevelList))
  levelExample.forEach(item => {
    if(level.some(i => i == item.id)){
      item.label = item.name
      item.checked = false
    }else {
      item.label = item.name
      item.checked = true
    }
  })
  data.riskLevel = levelExample
  data.tableData = data.oldRiskAssess ?data.oldRiskAssess: []
  data.riskSource = data.riskSource ? data.riskSource.map(item => {
    return {
      ...item,
      description: item.description ? item.description: ''
    }
  }) :  []
  data.safeRiskAnalysis = data.safeRiskAnalysis ?data.safeRiskAnalysis : ''
  try {
    generateWordDocument(templatePath, data, `材料科学姑苏实验室安全风险评估表---${data.experimentName}.docx`);
  } catch (error){
    ElMessage({
      type: 'warning',
      message: '失败'
    });
  }
};
onMounted(() => {
    getAllPersonList();
@@ -586,6 +695,22 @@
    display: flex;
    justify-content: center;
}
.tag-style{
    width: 58px;
    margin-left: 20px;
}
.tag-bg1 {
    background: rgba(255,0,0,0.65);
}
.tag-bg2 {
    background: rgba(248,82,8,0.65);
}
.tag-bg3 {
    background: rgba(247,255,0,0.65);
}
.tag-bg4 {
    background: rgba(0,112,192,0.65);
}
</style>