Newer
Older
xc-metering-front / src / views / tested / document / list / edit.vue
lyg on 31 Jan 2024 9 KB 文档管理修改
<!-- 文档管理-编辑 -->
<script lang="ts" setup name="DocumentEdit">
import type { FormInstance, FormRules, UploadUserFile } from 'element-plus'
import { ElLoading, ElMessage, ElMessageBox } from 'element-plus'
import dayjs from 'dayjs'
import tableList from './tableList.vue'
import type { IDocumentList } from './document-interface'
import { uploadApi } from '@/api/system/notice'
import showPhoto from '@/views/tested/device/info/components/showPhotoSinge.vue'
import { getDictByCode } from '@/api/system/dict'
import useUserStore from '@/store/modules/user'
import { getUserDept } from '@/api/system/user'
import { addDocument, detailDocument, updateDocument } from '@/api/eqpt/document/index'
const $route = useRoute()
const $router = useRouter()
const userStore = useUserStore()
const ruleFormRef = ref<FormInstance>() // from组件
const tableRef = ref()
// 显示标题
const textMap: { [key: string]: string } = {
  update: '编辑',
  create: '新增',
  detail: '详情',
}
// 对话框类型:create,update
const dialogStatus = ref('create')
const list = ref()
const ruleForm = ref({
  attachment: '',
  createTime: '',
  createUserId: '',
  createUserName: '',
  fileName: '',
  fileNo: '',
  fileType: '',
  id: '',
  implementationStatus: '',
  remark: '',
  updateTime: '',
}) // 表单
const rules = ref<FormRules>({
  fileName: [{ required: true, message: '文件名称必填', trigger: ['blur', 'change'] }],
  fileNo: [{ required: true, message: '文件号必填', trigger: ['blur', 'change'] }],
  fileType: [{ required: true, message: '文件类别必选', trigger: ['blur', 'change'] }],
  implementationStatus: [{ required: true, message: '实施状态必选', trigger: ['blur', 'change'] }],
  publishScope: [{ required: true, message: '发布范围必选', trigger: ['blur', 'change'] }],
  // remark: [{ required: true, message: '备注必填', trigger: ['blur', 'change'] }],
  attachment: [{ required: true, message: '文件附件需上传', trigger: ['blur', 'change'] }],
}) // 表单验证规则
// 弹窗初始化
const initDialog = () => {
  dialogStatus.value = $route.params.type as string
  ruleFormRef.value?.resetFields()
  if ($route.params.type !== 'create') {
    const data = JSON.parse($route.query.row as string)
    ruleForm.value = data
    // 获取变更记录详情
    detailDocument(data.id).then((res) => {
      list.value = res.data
    })
  }
  if ($route.params.type === 'create' || $route.params.type === 'update') {
    ruleForm.value.createTime = dayjs().format('YYYY-MM-DD HH:mm:ss') // 创建时间
    ruleForm.value.createUserId = userStore.id
    ruleForm.value.createUserName = userStore.name
  }
}
onMounted(() => {
  initDialog()
})
// 获取字典下拉
const fileTypeList = ref<{ id: string; value: string; name: string }[]>() // 文件类别
const statusList = ref<{ id: string; value: string; name: string }[]>() // 实施状态
const publishScope = ref<{ id: string; value: string; name: string }[]>() // 发布范围
const fetchListData = () => {
  // 文件类别
  getDictByCode('eqptFileType').then((res) => {
    fileTypeList.value = res.data
  })
  getDictByCode('eqptImplementStatus').then((res) => {
    statusList.value = res.data
  })
  // 发布范围
  getDictByCode('eqptPublishScope').then((res) => {
    publishScope.value = res.data
  })
}
fetchListData()
// 关闭弹窗
const close = () => {
  $router.back()
}
// 新增
const add = () => {
  addDocument(ruleForm.value).then((res) => {
    ElMessage.success('新增成功')
    close()
  })
}
// 编辑
const update = () => {
  updateDocument(ruleForm.value).then((res) => {
    ElMessage.success('修改成功')
    close()
  })
}
// 保存
const saveForm = async (formEl: FormInstance | undefined) => {
  if (!formEl) { return }
  await formEl.validate((valid, fields) => {
    if (valid) {
      ElMessageBox.confirm(
        '确认保存吗?',
        '提示',
        {
          confirmButtonText: '确认',
          cancelButtonText: '取消',
          type: 'warning',
        },
      ).then((res) => {
        if (dialogStatus.value === 'create') {
          add()
        }
        else {
          update()
        }
      })
    }
  })
}
// 取消
const resetForm = (formEl: FormInstance | undefined) => {
  formEl?.resetFields()
  close()
}
const fileRef = ref() // 文件上传input
const onFileChange = (event: any) => {
  if (event.target.files?.length !== 0) {
    // 创建formdata对象
    const fd = new FormData()
    const loading = ElLoading.service({
      lock: true,
      background: 'rgba(255, 255, 255, 0.8)',
    })
    fd.append('multipartFile', event.target.files[0])
    uploadApi(fd).then((res) => {
      if (res.code === 200) {
        ruleFormRef.value?.clearValidate('attachment')
        ruleForm.value.attachment = res.data[0]
        // 重置当前验证
        ElMessage.success('文件上传成功')
        fileRef.value.value = ''
        loading.close()
      }
      else {
        fileRef.value.value = ''
        ElMessage.error(res.message)
        loading.close()
      }
    }).catch(() => {
      fileRef.value.value = ''
    })
  }
}
const upload = () => {
  fileRef.value.click()
}
</script>

<template>
  <app-container style="overflow: hidden;">
    <approval-dialog ref="approvalDialogRef" @on-success="() => { $router.back() }" />
    <detail-page :title="`文档管理-${textMap[dialogStatus]}`">
      <template #btns>
        <el-button v-if="!$route.path.includes('detail')" type="primary" @click="saveForm(ruleFormRef)">
          保存
        </el-button>
        <el-button type="info" @click="resetForm(ruleFormRef)">
          关闭
        </el-button>
      </template>
    </detail-page>
    <detail-block-com>
      <el-form ref="ruleFormRef" :model="ruleForm" :class="$route.path.includes('detail') ? 'isDetail' : ''" :rules="rules" label-position="right" label-width="120px" class="form" :disabled="$route.path.includes('detail')">
        <el-row :gutter="24" class="marg">
          <el-col :span="6">
            <el-form-item label="文件号" prop="fileNo">
              <el-input v-model.trim="ruleForm.fileNo" placeholder="文件号" />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="文件名称" prop="fileName">
              <el-input v-model.trim="ruleForm.fileName" placeholder="文件名称" />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="创建人">
              <el-input v-model.trim="ruleForm.createUserName" disabled />
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="创建时间">
              <el-input v-model.trim="ruleForm.createTime" disabled />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24" class="marg">
          <el-col :span="6">
            <el-form-item label="文件类别" prop="fileType">
              <el-select v-model="ruleForm.fileType" placeholder="文件类别" style="width: 100%;">
                <el-option v-for="item in fileTypeList" :key="item.id" :label="item.name" :value="item.value" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="发布范围" prop="publishScope">
              <el-select v-model="ruleForm.publishScope" placeholder="发布范围" style="width: 100%;">
                <el-option v-for="item in publishScope" :key="item.id" :label="item.name" :value="item.value" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="实施状态" prop="implementationStatus">
              <el-select v-model="ruleForm.implementationStatus" placeholder="实施状态" style="width: 100%;">
                <el-option v-for="item in statusList" :key="item.id" :label="item.name" :value="item.value" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24" class="marg">
          <el-col :span="24">
            <el-form-item label="文件附件" prop="attachment">
              <!-- 上传组件 -->
              <input ref="fileRef" style="display: none;" type="file" accept="application/msword,application/pdf" @change="onFileChange">
              <show-photo :minio-file-name="ruleForm.attachment" />
              <el-button v-if="!$route.path.includes('detail')" type="primary" @click="upload()">
                {{ '上传' }}
              </el-button>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24" class="marg">
          <el-col :span="12">
            <el-form-item label="备注" prop="remark">
              <el-input v-model.trim="ruleForm.remark" placeholder="备注" />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </detail-block-com>
    <detail-block-com v-if="!$route.path.includes('create')">
      <table-list ref="tableRef" :data="list" :status="dialogStatus" />
    </detail-block-com>
  </app-container>
</template>

<style lang="scss" scoped>
// 详情页面隐藏小红点
.isDetail {
  ::v-deep {
    .el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap > .el-form-item__label::before,
    .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label::before {
      content: "";
      display: none;
    }
  }
}
</style>