<!-- 废弃物资处理交接记录 详情 --> <script name="ConsumableHandoverEdit" lang="ts" setup> import { ElLoading, ElMessage, ElMessageBox, dayjs } from 'element-plus' import type { IConsumableHandover, IConsumableHandoverGoods } from './consumable-interface' import HandoverDetailDialog from './handoverDetailDialog.vue' import type { IDictType } from '@/commonInterface/resource-interface' import { detailConsumableHandover, getStreamConsumableHandover as getStream, saveConsumableHandover, updateConsumableHandover } from '@/api/resource/supplierConsumable' import useUserStore from '@/store/modules/user' import { getDictByCode } from '@/api/system/dict' import { exportFile } from '@/utils/exportUtils' import { printPdf } from '@/utils/printUtils' // 变量 // 从路由中传过来的参数 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 consumableHandoverRef = ref() const refHandoverDetailDialog = ref() const consumableHandover = ref<IConsumableHandover>({ id: '', labCode: '', groupCode: '', recordNo: '', recordName: '废弃物资处理交接记录', createUserId: '', createTime: '', goodsHandleDetailList: [], createUserName: '', draft: '1', // 1/2是否是草稿箱 }) const goodsList = ref<Array<IConsumableHandoverGoods>>([]) const goodsColumns = [ { text: '物资名称', value: 'goodsName', align: 'center', required: true }, { text: '交接时间', value: 'handoverTime', align: 'center', width: '200', required: true }, { text: '交接数量', value: 'handoverAmount', align: 'center', width: '160', required: true }, { text: '计量单位', value: 'company', align: 'center', width: '200' }, { text: '交接人', value: 'handoverUserName', align: 'center', width: '200', required: true }, { text: '接收人', value: 'receiver', align: 'center', width: '160' }, ] // 表头 const handoverRules = ref({ labCode: [{ required: true, message: '实验室代码不能为空,请选择', trigger: ['change', 'blur'] }], groupCode: [{ required: true, message: '部门不能为空,请选择', trigger: ['change', 'blur'] }], }) // 表单验证规则 // 字典值 const labCodeDict = ref<IDictType[]>([]) const groupCodeDict = ref<IDictType[]>([]) const recordSelected = ref<IConsumableHandoverGoods[]>([]) // 逻辑 // 关闭 const resetForm = () => { router.go(-1) } // 新增 const addEditableRow = () => { refHandoverDetailDialog.value.showRecordDialog(true) } const delConsumableRecords = () => { if (recordSelected.value.length === 0) { ElMessage.warning('请至少选择一行') return } goodsList.value = goodsList.value.filter(item => recordSelected.value.includes(item) === false) } const consumableMultiSelect = (e: any) => { recordSelected.value = e } // 保存至草稿箱 const saveDraftHandover = () => { consumableHandover.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss') // 创建时间改为提交时间 const params = { ...consumableHandover.value, draft: '1', } const loading = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(255, 255, 255, 0.6)', }) saveConsumableHandover(params).then((res) => { if (res.code === 200) { // 提示保存成功 ElMessage.success('保存成功') // 设置返回的id和编号 consumableHandover.value.recordNo = res.data.recordNo consumableHandover.value.id = res.data.id id.value = res.data.id type.value = 'detail' } else { // 提示失败信息 ElMessage.error(`保存失败:${res.message}`) } loading.close() }) } // 编辑草稿箱(不走流程审批) const updateDraftHandover = () => { const loading = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(255, 255, 255, 0.6)', }) updateConsumableHandover(consumableHandover.value).then((res) => { if (res.code === 200) { // 提示保存成功 ElMessage.success('保存成功') } else { // 提示失败信息 ElMessage.error(`保存失败:${res.message}`) } loading.close() }) } // 提交 const submit = () => { const params = { ...consumableHandover.value, draft: '2', } const loading = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(255, 255, 255, 0.6)', }) updateConsumableHandover(params).then((res) => { if (res.code === 200) { // 提示保存成功 ElMessage.success('提交成功') type.value = 'detail' consumableHandover.value.draft = '2' } else { // 提示失败信息 ElMessage.error(`保存失败:${res.message}`) } loading.close() }) } // 新建时保存后的处理 获取返回的id const saveButtonHandler = async () => { if (!consumableHandoverRef) { return } if (goodsList.value.length === 0) { ElMessage.error('交接详情不能为空,请添加使用详情明细') return } await consumableHandoverRef.value.validate((valid: boolean) => { if (valid === true) { consumableHandover.value.goodsHandleDetailList = goodsList.value ElMessageBox.confirm( '确认保存吗?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }, ).then(() => { if (type.value === 'create') { saveDraftHandover() } else if (type.value === 'update') { updateDraftHandover() } }) } }) } // 根据id查询详情 const detailById = async (id: string) => { await detailConsumableHandover({ id }).then((res) => { if (res.code === 200) { consumableHandover.value = res.data goodsList.value = consumableHandover.value.goodsHandleDetailList consumableHandover.value.draft = `${consumableHandover.value.draft}` } }) } const consumableHandoverAddHandler = (useDetail: IConsumableHandoverGoods) => { goodsList.value.push(useDetail) } const getLabCodeDict = async () => { // 先从缓存中获取 if (sessionStorage.getItem('bizLabCode') === null || sessionStorage.getItem('bizLabCode') === undefined) { // 缓存中没有则调用接口查询 await getDictByCode('bizLabCode').then((res) => { if (res.code === 200) { labCodeDict.value = res.data } }) } else { labCodeDict.value = JSON.parse(sessionStorage.getItem('bizLabCode')!) } } const getGroupCodeDict = async () => { // 先从缓存中获取 if (sessionStorage.getItem('bizGroupCode') === null || sessionStorage.getItem('bizLabbizGroupCodeCode') === undefined) { // 缓存中没有则调用接口查询 await getDictByCode('bizGroupCode').then((res) => { if (res.code === 200) { groupCodeDict.value = res.data } }) } else { groupCodeDict.value = JSON.parse(sessionStorage.getItem('bizGroupCode')!) } } const initDict = async () => { await getLabCodeDict() await getGroupCodeDict() } const initDialog = (params: any) => { // 从路由中获取参数 type.value = params.type id.value = params.id !== undefined ? params.id : '' switch (params.type) { case 'create' : title.value = '废弃物资处理交接记录(新增)' consumableHandover.value.createUserId = userInfo.id consumableHandover.value.createUserName = userInfo.name consumableHandover.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss') keyFieldsDisable.value = false break case 'update': title.value = '废弃物资处理交接记录(编辑)' detailById(id.value) break case 'detail': title.value = '废弃物资处理交接记录(详情)' detailById(id.value) 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) } }) } onMounted(() => { initDict() initDialog(route.query) }) </script> <template> <app-container> <el-form ref="consumableHandoverRef" :model="consumableHandover" :rules="handoverRules" 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> </template> <el-button v-if="(type === 'detail' || type === 'update') && consumableHandover.draft === '1'" type="primary" @click="submit"> 提交 </el-button> <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="consumableUse.labCode" placeholder="请选择实验室" :disabled="keyFieldsDisable" style="width: 100%;"> <el-option v-for="dict in labCodeDict" :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="consumableUse.groupCode" placeholder="请选择部门" :disabled="keyFieldsDisable" style="width: 100%;"> <el-option v-for="dict in groupCodeDict" :key="dict.id" :label="dict.name" :value="dict.value" /> </el-select> </el-form-item> </el-col> </el-row> --> <el-row :gutter="24"> <el-col :span="6"> <el-form-item label="文件编号"> <el-input v-model="consumableHandover.recordNo" placeholder="文件编号,保存后自动生成" :disabled="true" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="文件名称"> <el-input v-model="consumableHandover.recordName" :disabled="true" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="创建人"> <el-input v-model="consumableHandover.createUserName" :disabled="true" /> <el-input v-model="consumableHandover.createUserId" type="hidden" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="创建时间"> <el-input v-model="consumableHandover.createTime" :disabled="true" /> </el-form-item> </el-col> </el-row> </detail-page> <table-container title="交接详情"> <template v-if="type !== 'detail'" #btns-right> <el-button type="primary" @click="addEditableRow"> 增加行 </el-button> <el-button type="info" @click="delConsumableRecords"> 删除行 </el-button> </template> <!-- 表格区域 --> <el-table :data="goodsList" border style="width: 100%;" @selection-change="consumableMultiSelect"> <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 goodsColumns" :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> </el-table-column> </el-table> </table-container> </el-form> <handover-detail-dialog ref="refHandoverDetailDialog" @record-saved="consumableHandoverAddHandler" /> </app-container> </template>