Newer
Older
xc-business-system / src / views / quality / review / work / components / addOtherDialog.vue
lyg on 8 Mar 2024 9 KB 质量活动
<!-- 创建其他评审材料 -->
<script lang="ts" setup name="EditArea">
import type { Ref } from 'vue'
import { defineExpose, nextTick, reactive, ref } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
import dayjs from 'dayjs'
import axios from 'axios'
import { getDictByCode } from '@/api/system/dict'
import { UploadFile, getPhotoUrl } from '@/api/file'
import { getSearchDept } from '@/api/quality/supervise/record'
import { addOther, otherFileTypes } from '@/api/quality/review/work'
import { getListByUrl } from '@/api/quality/prevent/index'
const emits = defineEmits(['confirm'])
const dataFormRef = ref()
const $route = useRoute()
const dialogFormVisible = ref(false) // 对话框是否显示
// 表单
const areaForm = ref({
  createTime: '',
  fileCode: '',
  fileName: '',
  filePath: '',
  fileType: '',
  managementId: $route.query.id as string,
  MaterialSource: '1',
  targetId: '',
})
// 附件名称
const uploadName = ref('')
// 前端校验规则
const rules: FormRules = {
  MaterialSource: [{ required: true, message: '材料来源必选', trigger: ['blur', 'change'] }],
  fileType: [{ required: true, message: '文件类型必选', trigger: ['blur', 'change'] }],
  fileName: [{ required: true, message: '文件名称必填', trigger: ['blur', 'change'] }],
  filePath: [{ required: true, message: '附件必须上传', trigger: ['blur', 'change'] }],
  fileCode: [{ required: true, message: '文件编号必填', trigger: ['blur', 'change'] }],
  // bizLabCode: [{ required: true, message: '实验室必选', trigger: ['blur', 'change'] }],
  // deptId: [{ required: true, message: '部门必须按', trigger: ['blur', 'change'] }],
}
// 重置表单
const resetForm = () => {
  areaForm.value = {
    createTime: '',
    fileCode: '',
    fileName: '',
    filePath: '',
    fileType: '',
    managementId: $route.query.id as string,
    MaterialSource: '1',
    targetId: '',
  }
  uploadName.value = ''
}
// 获取字典
const MaterialSource = ref<{ id: string; value: string; name: string }[]>([
  {
    name: '系统',
    id: '1',
    value: '1',
  },
  {
    name: '上传',
    id: '2',
    value: '2',
  },
]) // 材料来源
const fileTypeList = ref<any[]>([]) // 文件类型
const fileTypeAllList = ref<any[]>([]) // 文件类型
const fetchDict = () => {
  otherFileTypes({}).then((res) => {
    fileTypeList.value = res.data.filter((item: any) => item.name !== '其他材料')
    fileTypeAllList.value = res.data
  })
}
fetchDict()
watch(() => areaForm.value.MaterialSource, (newVal) => {
  if (newVal === '1') {
    fileTypeList.value = fileTypeAllList.value.filter((item: any) => item.name !== '其他材料')
  }
  else {
    fileTypeList.value = fileTypeAllList.value
  }
})
const fileCodeList = ref<any[]>([])
watch(() => areaForm.value.fileType, (newVal) => {
  if (areaForm.value.MaterialSource === '1') {
    const data = fileTypeAllList.value.filter((item: any) => item.code === newVal)[0]
    getListByUrl({ formId: data.formId || undefined, offset: 1, limit: 100, approvalStatus: '0' }, data.tips.slice(1)).then((res) => {
      fileCodeList.value = res.data.rows
    })
  }
})
watch(() => areaForm.value.fileCode, (newVal) => {
  if (areaForm.value.MaterialSource === '1' && newVal) {
    const data = fileCodeList.value.filter((item: any) => item.reportNo === newVal)[0] || {}
    areaForm.value.targetId = data.data.id
    areaForm.value.fileName = data.reportName
    // areaForm.value.filePath = data.filePath
  }
})
// 保存按钮
const saveForm = async (formEl: FormInstance | undefined) => {
  if (!formEl) { return }
  await formEl.validate((valid, fields) => {
    if (valid) {
      // emits('confirm', {
      //   ...areaForm.value,
      // })
      // dialogFormVisible.value = false
      addOther({ ...areaForm.value, formName: areaForm.value.fileName, formNo: areaForm.value.fileCode }).then((res) => {
        emits('confirm', {})
        dialogFormVisible.value = false
      })
    }
  })
}
// 初始化对话框
const initDialog = (row: any = {}) => {
  dialogFormVisible.value = true
  resetForm()
  nextTick(() => {
    dataFormRef.value?.clearValidate()
  })
  areaForm.value.createTime = dayjs().format('YYYY-MM-DD HH:mm:ss')
  areaForm.value.MaterialSource = '1'
  areaForm.value.managementId = $route.query.id as string
  // console.log($route.params.id, '$route.params.id')
}
defineExpose({
  initDialog,
})

const cancel = () => {
  dialogFormVisible.value = false
}
// 上传附件
const fileRef = ref() // 文件上传input,获取input的引用
const onFileChange = (event: any) => {
  // 原生上传
  if (event.target.files?.length !== 0) {
    const fd = new FormData()
    fd.append('multipartFile', event.target.files[0])
    UploadFile(fd).then((res1) => {
      fileRef.value.value = ''
      if (res1.code === 200) {
        ElMessage.success('上传成功')
        getPhotoUrl(res1.data[0]).then((res) => {
          areaForm.value.filePath = res.data
          // 展示上传文件名称
          const data = res.data.split('/')
          uploadName.value = data[data.length - 1]
          dataFormRef.value?.clearValidate('filePath')
        })
      }
    })
  }
}
// 导入
const importList = () => {
  fileRef.value.click()
}
// 删除
const close = () => {
  areaForm.value.filePath = ''
}
</script>

<template>
  <el-dialog v-model="dialogFormVisible" title="创建其他评审材料" append-to-body width="30%">
    <el-form ref="dataFormRef" :rules="rules" :model="areaForm" label-position="right" label-width="80px">
      <el-row :gutter="24">
        <el-col :span="24">
          <el-form-item label="材料来源" prop="MaterialSource">
            <el-select v-model="areaForm.MaterialSource" placeholder="材料来源">
              <el-option
                v-for="item in MaterialSource"
                :key="item.value"
                :label="item.name"
                :value="item.value"
              />
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="文件类型" prop="fileType">
            <el-select v-model="areaForm.fileType" placeholder="文件类型">
              <el-option
                v-for="item in fileTypeList"
                :key="item.name"
                :label="item.name"
                :value="item.code"
              />
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="文件编号" prop="fileCode">
            <el-input v-if="areaForm.MaterialSource === '2'" v-model="areaForm.fileCode" placeholder="文件编号" style="width: 100%;" />
            <el-select v-if="areaForm.MaterialSource === '1'" v-model="areaForm.fileCode" placeholder="文件编号">
              <el-option
                v-for="item in fileCodeList"
                :key="item.id"
                :label="item.name || item.formName || item.fileName"
                :value="item.code || item.formNo || item.fileCode"
              />
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="文件名称" prop="fileName">
            <el-input v-model="areaForm.fileName" placeholder="文件名称" style="width: 100%;" />
          </el-form-item>
        </el-col>
        <el-col v-if="areaForm.MaterialSource === '2'" :span="24">
          <el-form-item label="附件" prop="filePath">
            <!-- <el-input-number v-model="areaForm.fileName" style="width: 100%;" /> -->
            <a class="link" :href="areaForm.filePath" type="primary" style="margin-right: 10px;" target="_blank">
              {{ uploadName }}
              <span v-if="!$route.path.includes('detail')" class="close" @click.stop.capture.prevent="close">x</span>
            </a>
            <el-button v-if="!areaForm.filePath" type="primary" @click="importList">
              上传
            </el-button>
            <input ref="fileRef" style="display: none;" type="file" accept=".doc,.docx,.pdf,.xls,.xlsx" @change="onFileChange">
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="创建时间">
            <el-date-picker
              v-model="areaForm.createTime"
              type="datetime"
              style="width: 100%;"
              format="YYYY-MM-DD HH:mm:ss"
              value-format="YYYY-MM-DD HH:mm:ss"
              placeholder="创建时间"
            />
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <template #footer>
      <div class="dialog-footer">
        <el-button type="primary" @click="saveForm(dataFormRef)">
          保存
        </el-button>
        <el-button @click="cancel">
          取消
        </el-button>
      </div>
    </template>
  </el-dialog>
</template>

<style lang="scss" scoped>
.el-dialog {
  width: 700px;
}

.el-select {
  width: 100%;
}

.link {
  position: relative;
  color: #5d93ff;
  // display: inline-block;
  font-size: 16px;
  text-decoration: none;
  // margin-right: 10px;
  padding-right: 10px;
  // height: 33px;
  line-height: 33px;

  &:hover {
    text-decoration: underline;

    .close {
      display: block;
    }
  }

  .close {
    position: absolute;
    top: -20px;
    right: -10px;
    display: none;
    z-index: 99;
    height: 40px;
    width: 40px;
    color: rgb(121 118 115);
    // background-color: #ccc;
    text-align: center;
  }
  // &::before {
  //   content: "x";
  //   width: 15px;
  //   height: 15px;
  //   position: absolute;
  //   right: -4px;
  //   top: -16px;
  //   color: #817d7d;
  //   font-size: 16px;
  //   // background-color: #ccc;
  //   // border-radius: 50%;
  //   display: none;
  // }

  // &:hover {
  //   &::before {
  //     display: block;
  //   }
  // }
}
</style>