<!-- 创建其他评审材料 -->
<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 }, 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).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.name"
:label="item.name"
:value="item.code"
/>
</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>