<!-- 工作间环境条件要求 详情 --> <script name="EnvironmentRequireDetail" lang="ts" setup> import { ElLoading, ElMessage, ElMessageBox, dayjs } from 'element-plus' import type { IConditionRequire, IWorkRoomRequireInfo } from './require-confition-interface' import ConditionDialog from './dialog/conditionDialog.vue' import SelectLabRoomsDialog from './dialog/selectLabRoomsDialog.vue' // import FilterStandard from '@/views/resource/common/filterStandard.vue' // import FilterStandard from '@/views/business/taskMeasure/measureData/dialog/selectStandardDialog.vue' import FilterStandard from '@/views/equipement/standardStateMaintenance/dialog/selectStandardDialog.vue' import { getLocationList } from '@/api/business/taskMeasure/measureData' import type { IDictType } from '@/commonInterface/resource-interface' import { batchCheck } from '@/api/equipment/standard/book' import { detailEnvRequire, getStream, saveEnvRequire, updateEnvRequire } from '@/api/resource/environment' import useUserStore from '@/store/modules/user' import { getDictByCode } from '@/api/system/dict' import { exportFile } from '@/utils/exportUtils' import { printPdf } from '@/utils/printUtils' import type { deptType } from '@/global' import { useCheckList } from '@/commonMethods/useCheckList' // 变量 // 从路由中传过来的参数 const type = ref<string>('') const id = ref<string>('') // 关键字段是否可以编辑 const keyFieldsDisable = ref<boolean>(true) const userInfo = useUserStore() const route = useRoute() const router = useRouter() const title = ref('') const rules = ref({ standardEquipmentName: [{ required: true, message: '标准名称不能为空', trigger: ['change', 'blur'] }], labCode: [{ required: true, message: '实验室不能为空', trigger: ['change', 'blur'] }], groupCode: [{ required: true, message: '部门不能为空', trigger: ['change', 'blur'] }], workRoom: [{ required: true, message: '工作间名称不能为空', trigger: ['change', 'blur'] }], }) // 表单验证规则 // 子组件 const conditionsRef = ref() const conditionDialogRef = ref() const standardFilterRef = ref() const detailRequire = ref<IWorkRoomRequireInfo>({ id: '', formNo: '', formName: '工作间环境条件要求一览表', workRoom: '', standardEquipmentId: '', standardEquipmentName: '', createUserId: '', createUserName: '', createTime: '', remark: '', groupCode: '', // 部门 groupCodeName: '', // 部门 labCode: '', // 实验室 labCodeName: '', // 实验室 conditionList: [], }) const condList: any = ref([]) const condColumns = [ { text: '开展量传参数', value: 'params', align: 'center', required: true }, { text: '环境条件要求', value: 'environmentRequire', align: 'center', required: true }, { text: '环境条件依据', value: 'environmentAccord', align: 'center', required: true }, { text: '备注', value: 'remark', align: 'center' }, ] // 表头 // 字典值 const environmentAccordDict = ref<IDictType[]>([]) const recordSelected = ref<IConditionRequire[]>([]) // 逻辑 // 关闭 const resetForm = () => { router.go(-1) } const jointEnvAccordName = (condition: IConditionRequire) => { let filename = '' if (condition.environmentAccord === '1' && condition.fileId !== '') { filename = `:${condition.fileName}` } const targetDict = environmentAccordDict.value.filter(dict => dict.value === condition.environmentAccord) if (targetDict.length > 0) { condition.environmentAccordName = targetDict[0].name return condition.environmentAccordName + filename } else { return '' } } // 新增(from:越哥,环境条件依据:选择技术规范、仪器说明书需求---暂时隐藏) const addEditableRow = () => { conditionDialogRef.value.showRecordDialog(true) } // 新增(from-dtt, 环境条件依据是标准装置带出来的,不允许修改) const add = () => { if (!useCheckList(condList.value, condColumns, '要求一览表')) { return false } condList.value.push({ id: '', params: '', environmentRequire: '', environmentAccordName: '', remark: '', }) } const delRecords = () => { if (recordSelected.value.length === 0) { ElMessage.warning('请至少选择一行') return } condList.value = condList.value.filter((item: any) => recordSelected.value.includes(item) === false) } const recordMultiSelect = (e: any) => { recordSelected.value = e } const updateCondition = (row: IConditionRequire, index: number) => { conditionDialogRef.value.showRecordDialog(true) conditionDialogRef.value.initRecordData(row, index) } // 新建 const saveRequire = () => { detailRequire.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss') // 创建时间改为提交时间 saveEnvRequire(detailRequire.value).then((res) => { if (res.code === 200) { // 提示保存成功 ElMessage.success('保存成功') // 设置返回的id和编号 detailRequire.value.formNo = res.data.formNo detailRequire.value.id = res.data.id id.value = res.data.id type.value = 'detail' } else { // 提示失败信息 ElMessage.error(`保存失败:${res.message}`) } }) } // 编辑 const updateRequire = () => { updateEnvRequire(detailRequire.value).then((res) => { if (res.code === 200) { // 提示保存成功 ElMessage.success('保存成功') type.value = 'detail' } else { // 提示失败信息 ElMessage.error(`保存失败:${res.message}`) } }) } // 编辑按钮点击事件处理函数 const editClickedHandler = () => { type.value = 'update' keyFieldsDisable.value = false title.value = '工作间环境条件要求一览表(编辑)' } // 新建时保存后的处理 获取返回的id const saveButtonHandler = async () => { if (!conditionsRef) { return } if (condList.value.length === 0) { ElMessage.warning('要求一览表不能为空') return } if (!useCheckList(condList.value, condColumns, '要求一览表')) { return false } await conditionsRef.value.validate((valid: boolean) => { if (valid === true) { detailRequire.value.conditionList = condList.value.map((item: any) => { return { ...item, standardEquipmentName: detailRequire.value.standardEquipmentName, // 标准装置名称 workRoom: detailRequire.value.workRoom, // 工作间 labCode: detailRequire.value.labCode, // 实验室代码 labCodeName: detailRequire.value.labCodeName, // 实验室名称 } }) ElMessageBox.confirm( '确认保存吗?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }, ).then(() => { if (type.value === 'create') { saveRequire() } else if (type.value === 'update') { updateRequire() } }) } }) } // 根据id查询详情 const detailById = async (id: string) => { await detailEnvRequire({ id }).then((res) => { if (res.code === 200) { detailRequire.value = res.data condList.value = detailRequire.value.conditionList!.map((cond) => { return { ...cond, environmentAccordName: jointEnvAccordName(cond), } }) } }) } // ------------------------------------选择标准装置-------------------------------------------- // 显示弹窗 筛选标准装置 const showStandardEquipmentFilter = () => { standardFilterRef.value.initDialog(true) } // 选中标准装置返回 const standardSelected = (standardList: any) => { if (standardList && standardList.length) { const params = standardList.map((item: { id: string }) => item.id) detailRequire.value.standardEquipmentId = params.join(',') detailRequire.value.standardEquipmentName = standardList.map((item: { standardName: string }) => item.standardName).join(',') batchCheck({ ids: params }).then((res) => { condList.value = res.data.map((item: { environmentAccord: string }) => { return { ...item, environmentAccordName: item.environmentAccord, } }) }) } // detailRequire.value.standardEquipmentId = row.id // detailRequire.value.standardEquipmentName = row.standardName // standardFilterRef.value.showOrHideFilterDialog(false) } // ----------------------------------------------------------------------------------------------- // 新增量传参数返回 const appendToConditionList = (row: IConditionRequire) => { if (row.index === undefined || row.index < 0) { condList.value.push({ id: '', requireId: id.value, params: row.params, environmentRequire: row.environmentRequire, environmentAccord: row.environmentAccord, environmentAccordName: jointEnvAccordName(row), fileId: row.fileId, fileName: row.fileName, remark: row.remark, createTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss'), }) } else { condList.value[row.index] = { id: row.id, requireId: id.value, params: row.params, environmentRequire: row.environmentRequire, environmentAccord: row.environmentAccord, environmentAccordName: jointEnvAccordName(row), fileId: row.fileId, fileName: row.fileName, remark: row.remark, createTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss'), } } } const getEnvironmentAccord = async () => { // 先从缓存中获取 if (sessionStorage.getItem('bizEnvironmentAccord') === null || sessionStorage.getItem('bizEnvironmentAccord') === undefined) { // 缓存中没有则调用接口查询 await getDictByCode('bizEnvironmentAccord').then((res) => { if (res.code === 200) { environmentAccordDict.value = res.data sessionStorage.setItem('bizEnvironmentAccord', JSON.stringify(res.data)) } }) } else { environmentAccordDict.value = JSON.parse(sessionStorage.getItem('bizEnvironmentAccord')!) } } const getStorageLocationDict = async () => { // 存放地点 先从缓存中获取 if (sessionStorage.getItem('bizStorageLocation') === null || sessionStorage.getItem('bizStorageLocation') === undefined) { // 缓存中没有则调用接口查询 await getDictByCode('bizStorageLocation').then((res) => { if (res.code === 200) { sessionStorage.setItem('bizStorageLocation', JSON.stringify(res.data)) } }) } } const initDict = async () => { getEnvironmentAccord() getStorageLocationDict() } const initDialog = (params: any) => { // 从路由中获取参数 type.value = params.type id.value = params.id !== undefined ? params.id : '' switch (params.type) { case 'create' : title.value = '工作间环境条件要求一览表(新增)' detailRequire.value.createUserId = userInfo.id detailRequire.value.createUserName = userInfo.name detailRequire.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss') detailRequire.value.groupCode = userInfo.groupNo // 部门 detailRequire.value.groupCodeName = userInfo.groupName // 部门 detailRequire.value.labCode = userInfo.bizLabCode // 实验室 detailRequire.value.labCodeName = userInfo.labCodeName // 实验室 keyFieldsDisable.value = false break case 'update': title.value = '工作间环境条件要求一览表(编辑)' detailById(id.value) // 判断显示哪些流程操作按钮 keyFieldsDisable.value = false break case 'detail': title.value = '工作间环境条件要求一览表(详情)' id.value = params.id detailById(id.value) // 查看详情时所有的操作按钮都隐藏 keyFieldsDisable.value = true break default: title.value = '' break } } // --------------------------------导出word、pdf、打印---------------------------------------------------- const stream = ref() const streamNormal = ref(true) // 流是否正常 // 获取流 const fetchStream = async (isPdf = true) => { const loading = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(255, 255, 255, 0.6)', }) const res = await getStream({ id: id.value, pdf: isPdf }) stream.value = res.data loading.close() } // 打印Word const printToWord = () => { fetchStream(false).then(() => { if (streamNormal.value) { exportFile(stream.value, '工作间环境条件要求一览表.doc') } }) } // 导出PDF const printToPDF = () => { fetchStream().then(() => { if (streamNormal.value) { exportFile(new Blob([stream.value]), '工作间环境条件要求一览表.pdf') } }) } // 打印 const printClickedHandler = () => { fetchStream().then(() => { if (streamNormal.value) { const blobUrl = URL.createObjectURL(stream.value) printPdf(blobUrl) } }) } // --------------------------------------字典----------------------------------------------- const groupCodeList = ref<deptType[]>([]) // 部门 const labCodeList = ref<deptType[]>([]) // 实验室 // 查询字典 const getDictFun = () => { // 实验室 getDictByCode('bizLabCode').then((response) => { labCodeList.value = response.data }) // 部门 getDictByCode('bizGroupCode').then((response) => { groupCodeList.value = response.data }) } getDictFun() // ------------------------------------------选择工作间-------------------------------------------------------- const workRoomList = ref([]) // 工作间列表 const selectLabRoomsRef = ref() // 点击选择工作间 const selectLabRooms = () => { selectLabRoomsRef.value.initDialog() } // 确定选择工作间 const confirmSelectLabRooms = (val: any) => { if (val && val.length) { detailRequire.value.workRoom = val[0].locationName } } // 请求工作间 const fetchLocationList = () => { let lab = '' if (detailRequire.value.labCode === 'X') { lab = '西昌实验室' } else if (detailRequire.value.labCode === 'H') { lab = '海口实验室' } const params = { locationName: '', // 地点名称 locationNo: '', // 地点编号 labName: lab, // 所属实验室 limit: 999999, offset: 1, } getLocationList(params).then((response) => { workRoomList.value = response.data.rows.map((item: { locationName: string }) => { return { value: item.locationName, } }) }) } // 匹配辅助字段输入建议 const querySearchWorkRoom = (queryString: string, cb: any) => { const results = queryString ? workRoomList.value.filter((item: any) => item.value.includes(queryString)) : workRoomList.value // 调用 callback 返回建议列表的数据 cb(results) } // ------------------------------------------------------------------------------------------------------- // 修改实验室 const changeLab = (val: string) => { if (val === 'X' || val === 'H') { // 选择西昌或者海口的时候清除工作间、选择全站时不必清除 detailRequire.value.workRoom = '' // 清空工作间 } fetchLocationList() // 获取工作间数据 } onMounted(() => { initDict() initDialog(route.query) fetchLocationList() // 获取工作间数据 }) </script> <template> <app-container> <el-form ref="conditionsRef" :model="detailRequire" :rules="rules" label-position="right" label-width="110px" border stripe> <detail-page :title="`${title}`"> <template #btns> <template v-if="type === 'detail'"> <el-button type="primary" @click="printToWord"> 导出Word </el-button> <el-button type="primary" @click="printToPDF"> 导出PDF </el-button> <el-button type="primary" @click="printClickedHandler"> 打印 </el-button> <el-button type="primary" @click="editClickedHandler()"> 编辑 </el-button> </template> <el-button v-if="type !== 'detail'" type="primary" @click="saveButtonHandler"> 保存 </el-button> <el-button type="info" @click="resetForm()"> 关闭 </el-button> </template> <el-row :gutter="24"> <el-col :span="6"> <el-form-item label="实验室" prop="labCode"> <el-select v-model="detailRequire.labCode" placeholder="请选择实验室" :disabled="type === 'detail'" style="width: 100%;" @change="changeLab"> <el-option v-for="dict in labCodeList" :key="dict.id" :label="dict.name" :value="dict.value" /> </el-select> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="部门" prop="groupCode"> <el-select v-model="detailRequire.groupCode" placeholder="请选择部门" :disabled="type === 'detail'" style="width: 100%;"> <el-option v-for="dict in groupCodeList" :key="dict.id" :label="dict.name" :value="dict.value" /> </el-select> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="创建人"> <el-input v-model="detailRequire.createUserName" :disabled="true" /> <el-input v-model="detailRequire.createUserId" type="hidden" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="创建时间"> <el-input v-model="detailRequire.createTime" :disabled="true" /> </el-form-item> </el-col> <!-- <el-col :span="6"> <el-form-item label="文件编号"> <el-input v-model="detailRequire.formNo" placeholder="系统自动生成" :disabled="true" /> </el-form-item> </el-col> --> <el-col :span="6"> <el-form-item label="文件名称"> <el-input v-model="detailRequire.formName" :disabled="true" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="工作间名称" prop="workRoom"> <!-- <el-input v-model="detailRequire.workRoom" :disabled="true" placeholder="请选择工作间"> <template v-if="type !== 'detail'" #append> <el-button size="small" @click="selectLabRooms"> 选择 </el-button> </template> </el-input> --> <el-autocomplete v-model="detailRequire.workRoom" :fetch-suggestions="querySearchWorkRoom" placeholder="工作间名称" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="标准名称" prop="standardEquipmentName"> <el-input v-model="detailRequire.standardEquipmentName" placeholder="请选择标准装置" :disabled="true"> <template v-if="type !== 'detail'" #append> <el-button size="small" @click="showStandardEquipmentFilter"> 选择 </el-button> </template> </el-input> </el-form-item> </el-col> </el-row> </detail-page> <table-container title="要求一览表"> <template v-if="type !== 'detail'" #btns-right> <el-button type="primary" @click="add"> 增加行 </el-button> <el-button type="info" @click="delRecords"> 删除行 </el-button> </template> <!-- 表格区域 --> <el-table :data="condList" border style="width: 100%;" @selection-change="recordMultiSelect"> <el-table-column v-if="type !== 'detail'" type="selection" align="center" width="38" /> <el-table-column align="center" label="序号" width="55" type="index" /> <el-table-column v-for="item in condColumns" :key="item.value" :prop="item.value" :label="item.text" :width="item.width" align="center" > <template #header> <span v-show="item.required && type !== 'detail'" style="color: red;">*</span><span>{{ item.text }}</span> </template> <template #default="scope"> <el-input v-if="type !== 'detail'" v-model="scope.row[item.value]" :placeholder="pageType === 'detail' ? ' ' : `${item.text}`" type="textarea" autosize /> <span v-else> {{ scope.row[item.value] }}</span> </template> </el-table-column> <!-- <el-table-column v-if="type !== 'detail'" label="操作" align="center" width="75"> <template #default="scope"> <el-button size="small" type="primary" link @click="updateCondition(scope.row, scope.$index)"> 编辑 </el-button> </template> </el-table-column> --> </el-table> </table-container> </el-form> <!-- 选择标准装置组件 --> <filter-standard ref="standardFilterRef" :is-multi="true" @confirm="standardSelected" /> <condition-dialog ref="conditionDialogRef" @record-saved="appendToConditionList" /> <!-- 选择工作间 --> <select-lab-rooms-dialog ref="selectLabRoomsRef" @confirm="confirmSelectLabRooms" /> </app-container> </template>