<!-- 物资验收记录单详情 --> <script name="ConsumableCheckDetail" lang="ts" setup> import { ElLoading, ElMessage, ElMessageBox, dayjs } from 'element-plus' import type { IConsumableApply, IGoodsCheckRecord, IRecordDetail } from './consumable-interface' import ApprovalDialog from '@/views/resource/common/approvalDialog.vue' import FilterConsumableApply from '@/views/resource/common/filterConsumableApply.vue' import type { IDictType } from '@/commonInterface/resource-interface' import { SCHEDULE } from '@/utils/scheduleDict' import { detailConsumableApply, detailGoodsCheck, draftDeleteCheck, failUpdateGoodsCheck, refuseApprovalCheck, revokeApprovalCheck, saveGoodsCheck, submitGoodsCheck, updateGoodsCheck } from '@/api/resource/supplierConsumable' import ApprovalRecordTable from '@/components/ApprovalRecord/ApprovalRecordTable.vue' import useUserStore from '@/store/modules/user' import { getDictByCode } from '@/api/system/dict' import { useCheckList } from '@/commonMethods/useCheckList' // 变量 // 从路由中传过来的参数 const type = ref<string>('') const id = ref<string>('') const status = ref<string>('') // 关键字段是否可以编辑 const keyFieldsDisable = ref<boolean>(true) const userInfo = useUserStore() const route = useRoute() const router = useRouter() const title = ref('') const radioItems = ref([ { name: '基本信息', value: 'consumable-check-basic' }, { name: '审批详情', value: 'consumable-check-approval' }, ]) const current = ref('') const currentLabel = ref('') // 子组件 const approvalDialog = ref() const goodsCheckRef = ref() const applyFilterRef = ref() const goodsCheckForm = ref<IGoodsCheckRecord>({ id: '', labCode: '', groupCode: '', recordNo: '', recordName: '物资验收记录单', createDeptId: '', createDept: '', createUserId: '', goodsName: '', goodsModel: '', goodsSupplier: '', goodsWorth: '', goodsApplyId: '', goodsApplyNo: '', acceptTime: '', performance: '', createTime: '', approvalStatus: '', approvalStatusName: '', processId: '', taskId: '', }) const checkRules = ref({ labCode: [{ required: true, message: '实验室不能为空', trigger: ['change', 'blur'] }], groupCode: [{ required: true, message: '部门不能为空', trigger: ['change', 'blur'] }], acceptTime: [{ required: true, message: '验收时间不能为空', trigger: 'blur' }], goodsApplyNo: [{ required: true, message: '易耗物资申请单不能为空', trigger: 'blur' }], }) // 表单验证规则 const recordDetailList = ref<IRecordDetail[]>([]) // 验收详情表格 const recordDetailCheckoutList = ref<IRecordDetail[]>([]) // 验收详情多选 const goodsColumns = [ { text: '名称', value: 'goodsName', align: 'center', required: true }, { text: '规格型号', value: 'goodsModel', align: 'center', required: true }, { text: '生产厂家', value: 'goodsSupplier', align: 'center', required: true }, { text: '价值', value: 'goodsWorth', align: 'center', required: true }, { text: '数量', value: 'goodsAmount', align: 'center', required: true }, { text: '主要性能指标', value: 'performance', align: 'center', required: true }, ] // 表头 // 是否显示相关按钮 const saveButtVisable = ref<boolean>(false) // 是否显示 保存 按钮 const submitButtVisable = ref<boolean>(false) // 是否显示 提交 按钮 const flowButtsVisable = ref<boolean>(false) // 是否显示 同意和拒绝 按钮 const cancelButtVisable = ref<boolean>(false) // 是否显示 取消 按钮 const deleteButtVisable = ref<boolean>(false) // 是否显示 删除 按钮 const editButtVisable = ref<boolean>(false) // 是否显示 编辑 按钮 // 字典值 const labCodeDict = ref<IDictType[]>([]) const groupCodeDict = ref<IDictType[]>([]) // 逻辑 // 详情页的各个tab切换操作 const radioChangeHandler = (newVal: string | number | boolean) => { const radioTarget = radioItems.value.filter(item => item.name === newVal) if (radioTarget.length > 0) { currentLabel.value = radioTarget[0].name current.value = radioTarget[0].value } else { currentLabel.value = radioItems.value[0].name current.value = radioItems.value[0].value } } // 将所有流程操作的按钮隐藏 const hideAllOpterationButtons = () => { saveButtVisable.value = false submitButtVisable.value = false flowButtsVisable.value = false cancelButtVisable.value = false deleteButtVisable.value = false editButtVisable.value = false } // 根据审批状态显示对应的流程操作按钮 const showOperationButtonByStatus = () => { switch (status.value) { case '0': // 全部:保存按钮可见 if (type.value === 'update') { saveButtVisable.value = true } else { saveButtVisable.value = false } break case '1': // 草稿箱:保存、提交按钮可见 saveButtVisable.value = true submitButtVisable.value = true break case '2': // 待审批:同意、拒绝按钮可见 flowButtsVisable.value = true break case '3': // 审批中:取消按钮可见 cancelButtVisable.value = true break case '5': // 未通过:编辑 按钮可见 editButtVisable.value = true break case '6': // 已取消:编辑 删除按钮可见 editButtVisable.value = true deleteButtVisable.value = true break default: // 默认不显示所有的操作按钮 hideAllOpterationButtons() break } } // 关闭 const resetForm = () => { sessionStorage.removeItem('consumableCheckTaskId') // 返回列表时 将缓存中的数据删除 router.go(-1) } // 保存至草稿箱 const saveDraftCheck = () => { goodsCheckForm.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss') // 创建时间改为提交时间 const params = { ...goodsCheckForm.value, recordDetailList: recordDetailList.value, } const loading = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(255, 255, 255, 0.6)', }) saveGoodsCheck(params).then((res) => { if (res.code === 200) { // 提示保存成功 ElMessage.success('保存成功') // 设置返回的id和编号 goodsCheckForm.value.recordNo = res.data.recordNo goodsCheckForm.value.id = res.data.id id.value = res.data.id type.value = 'update' status.value = '1' // 保存成功后进入草稿箱 为了不显示审批详情 loading.close() } else { // 提示失败信息 ElMessage.error(`保存失败:${res.message}`) loading.close() } }) } // 编辑草稿箱(不走流程审批) const updateDraftCheck = () => { const loading = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(255, 255, 255, 0.6)', }) updateGoodsCheck(goodsCheckForm.value).then((res) => { if (res.code === 200) { // 提示保存成功 ElMessage.success('保存成功') } else { // 提示失败信息 ElMessage.error(`保存失败:${res.message}`) } loading.close() }) } // 编辑按钮点击事件处理函数 const editClickedHandler = () => { type.value = 'update' title.value = '物资验收记录单(编辑)' // 隐藏编辑按钮 显示提交按钮 editButtVisable.value = false submitButtVisable.value = true } // 新建时保存后的处理 获取返回的id const saveButtonHandler = async () => { if (!goodsCheckRef) { return } if (!useCheckList(recordDetailList.value, goodsColumns, '物资明细')) { return false } await goodsCheckRef.value.validate((valid: boolean) => { if (valid === true) { ElMessageBox.confirm( '确认保存吗?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }, ).then(() => { if (type.value === 'create') { saveDraftCheck() } else if (type.value === 'update') { updateDraftCheck() } }) } }) } // 提交按钮 const submitButtonHandler = async () => { if (goodsCheckForm.value === null || goodsCheckForm.value.processId === undefined || goodsCheckForm.value.processId === '') { // 流程id为空 表示还未进入流程中 直接提交 ElMessageBox.confirm(`是否提交物资验收记录单 ${goodsCheckForm.value.recordNo}`, '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }).then(() => { const loading = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(255, 255, 255, 0.6)', }) submitGoodsCheck({ formId: SCHEDULE.CHECK_MATERIAL_RECORD_APPROVAL, id: goodsCheckForm.value.id, }).then((res) => { if (res.code === 200) { ElMessage.success(`物资验收记录单 ${goodsCheckForm.value.recordNo} 提交成功`) type.value = 'detail' hideAllOpterationButtons() } else { ElMessage.error(`物资验收记录单 ${goodsCheckForm.value.recordNo} 提交失败:${res.message}`) } loading.close() }) }) } else { // 之前已经在流程中的表单 保存提交 await goodsCheckRef.value.validate((valid: boolean) => { if (valid === true) { const loading = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(255, 255, 255, 0.6)', }) failUpdateGoodsCheck(goodsCheckForm.value).then((res) => { if (res.code === 200) { // 提示保存成功 ElMessage.success(`物资验收记录单 ${goodsCheckForm.value.recordNo} 提交成功`) type.value = 'detail' hideAllOpterationButtons() } else { // 提示失败信息 ElMessage.error(`物资验收记录单 ${goodsCheckForm.value.recordNo} 提交失败:${res.message}`) } loading.close() }) } }) } } // 根据id查询详情 const detailById = async (id: string) => { const loading = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(255, 255, 255, 0.6)', }) const res = await detailGoodsCheck({ id }) if (res.code === 200) { goodsCheckForm.value = res.data if (goodsCheckForm.value.taskId === '') { goodsCheckForm.value.taskId = sessionStorage.getItem('consumableCheckTaskId')! } detailConsumableApply({ id: goodsCheckForm.value.goodsApplyId }).then((response) => { goodsCheckForm.value.goodsApplyNo = response.data.applyNo }) recordDetailList.value = res.data.recordDetailList // 物资明细 loading.close() } } // 流程审批-拒绝 const approvalRefuseHandler = () => { approvalDialog.value.initDialog('refuse', goodsCheckForm.value.id, goodsCheckForm.value.taskId || route.query.taskId, '') } // 流程审批-同意 const approvalAgreeHandler = () => { approvalDialog.value.initDialog('agree', goodsCheckForm.value.id, goodsCheckForm.value.taskId || route.query.taskId, '') } // 取消流程 const revokeClickedHandler = () => { ElMessageBox.confirm( '确认取消该审批吗?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }, ) .then(() => { const loading = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(255, 255, 255, 0.6)', }) const params = { processInstanceId: goodsCheckForm.value.processId!, comments: '', id: id.value, } revokeApprovalCheck(params).then((res) => { ElMessage({ type: 'success', message: '已取消', }) cancelButtVisable.value = false loading.close() }) }) } // 删除审批单 const deleteClickedHandler = () => { ElMessageBox.confirm(`是否删除审批单 ${goodsCheckForm.value.recordNo}`, '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }).then(() => { draftDeleteCheck({ id: id.value }).then((res) => { if (res.code === 200) { ElMessage.success(`审批单 ${goodsCheckForm.value.recordNo} 删除成功`) resetForm() } else { ElMessage.error(`审批单 ${goodsCheckForm.value.recordNo} 删除失败: ${res.message}`) } }) }) } // 流程审批(同意、拒绝、取消)结束后的操作 将按钮都隐藏(本身就不能编辑了) const approvalSuccessHandler = (type: string) => { if (type === 'agree' || type === 'refuse') { flowButtsVisable.value = false } else if (type === 'revoke') { cancelButtVisable.value = false } } // 拒绝 const refuseHandler = (param: any) => { refuseApprovalCheck(param).then((res) => { if (res.code === 200) { ElMessage.success('拒绝审批完成') } else { ElMessage.error(`拒绝审批失败:${res.message}`) } // 关闭弹窗 approvalDialog.value.handleClose() flowButtsVisable.value = false }) } // ------------------------------------物资明细表格------------------------------------------------------------- // 多选 const multiSelect = (e: any) => { recordDetailCheckoutList.value = e } // 增加行 const addRow = () => { if (!useCheckList(recordDetailList.value, goodsColumns, '物资明细')) { return false } recordDetailList.value.push({ goodsAmount: '', // 数量 goodsModel: '', // 型号 goodsName: '', // 名称 goodsSupplier: '', // 生产厂家 goodsWorth: '', // 价值 id: '', recordId: '', performance: '', // 性能指标 }) } // 删除行 const delRow = () => { if (recordDetailCheckoutList.value.length === 0) { ElMessage.warning('请至少选择一行') return } recordDetailList.value = recordDetailList.value.filter(item => recordDetailCheckoutList.value.includes(item) === false) } // ------------------------------------物资申请单------------------------------------------------------------------------ // 点击选择物资申请单 const showConsumableApplyFilter = () => { applyFilterRef.value.showOrHideFilterDialog(true) } // 选好物资申请单 const applyFormSelectedHandler = (apply: IConsumableApply) => { goodsCheckForm.value.goodsApplyId = apply.id goodsCheckForm.value.goodsApplyNo = apply.applyNo goodsCheckForm.value.goodsApply = apply.applyName applyFilterRef.value.showOrHideFilterDialog(false) // 查询物资申请单详情-获取物资列表 if (apply.id) { detailConsumableApply({ id: apply.id }).then((res) => { recordDetailList.value = res.data.goodsDetailList.map((item: any) => { return { goodsAmount: item.goodsQuantity, // 数量 goodsModel: item.goodsModel, // 型号 goodsName: item.goodsName, // 名称 goodsSupplier: item.supplierName, // 生产厂家 goodsWorth: '', // 价值 id: '', recordId: item.id, performance: '', // 性能指标 } }) }) } } // --------------------------------------------------------------------------------------------------------------------- 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 : '' status.value = params.status // 默认显示第一个tab内容 current.value = radioItems.value[0].value currentLabel.value = radioItems.value[0].name switch (params.type) { case 'create' : title.value = '物资验收记录单(新增)' saveButtVisable.value = true submitButtVisable.value = true goodsCheckForm.value.createUserId = userInfo.id goodsCheckForm.value.createUserName = userInfo.name goodsCheckForm.value.createDeptId = userInfo.deptId goodsCheckForm.value.createDept = userInfo.deptName goodsCheckForm.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss') goodsCheckForm.value.labCode = userInfo.bizLabCode // 实验室代码 goodsCheckForm.value.labCodeName = userInfo.labCodeName // 实验室名称 goodsCheckForm.value.groupCode = userInfo.groupNo // 部门代码 goodsCheckForm.value.groupCodeName = userInfo.groupName // 部门名称 keyFieldsDisable.value = false break case 'update': title.value = '物资验收记录单(编辑)' detailById(id.value) // 判断显示哪些流程操作按钮 showOperationButtonByStatus() keyFieldsDisable.value = true break case 'detail': title.value = '物资验收记录单(详情)' id.value = params.id detailById(id.value) // 查看详情时所有的操作按钮都隐藏 showOperationButtonByStatus() keyFieldsDisable.value = true break default: title.value = '' break } } watch(() => status.value, (val) => { if (val === '1' || type.value === 'create') { // 草稿箱\新建把审批详情删了 if (radioItems.value[radioItems.value.length - 1].value === 'consumable-check-approval') { radioItems.value.pop() } console.log(radioItems.value) } else { // 非新建和草稿箱把审批详情加上 if (radioItems.value[radioItems.value.length - 1].value !== 'consumable-check-approval') { radioItems.value.push({ name: '审批详情', value: 'consumable-check-approval' }) } } }) onMounted(() => { initDict() initDialog(route.query) }) </script> <template> <app-container> <el-form ref="goodsCheckRef" :model="goodsCheckForm" :rules="checkRules" label-position="right" label-width="110px" border stripe> <detail-page :title="`${title}`"> <template #btns> <el-button v-if="editButtVisable" type="primary" @click="editClickedHandler()"> 编辑 </el-button> <template v-if="flowButtsVisable"> <el-button type="primary" @click="approvalAgreeHandler"> 同意 </el-button> <el-button type="danger" @click="approvalRefuseHandler"> 拒绝 </el-button> </template> <el-button v-if="submitButtVisable" :disabled="id === ''" type="primary" @click="submitButtonHandler"> 提交 </el-button> <el-button v-if="saveButtVisable" :disabled="type === 'create' && id !== ''" type="primary" @click="saveButtonHandler"> 保存 </el-button> <el-button v-if="deleteButtVisable" type="danger" @click="deleteClickedHandler"> 删除 </el-button> <el-button v-if="cancelButtVisable" type="info" @click="revokeClickedHandler"> 取消 </el-button> <el-button type="info" @click="resetForm()"> 关闭 </el-button> </template> <el-radio-group v-model="currentLabel" @change="radioChangeHandler"> <el-radio-button v-for="item in radioItems" :key="item.value" :label="item.name" :disabled="id === ''" /> </el-radio-group> </detail-page> <detail-block v-if="current === 'consumable-check-basic'" title=""> <el-row :gutter="24"> <!-- 第一行 第一列 --> <el-col :span="6"> <el-form-item label="实验室" prop="labCode"> <el-select v-model="goodsCheckForm.labCode" placeholder="请选择实验室" :disabled="keyFieldsDisable || type === 'detail'" 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-form-item label="验收部门"> <el-input v-model="goodsCheckForm.createDept" :disabled="true" /> <el-input v-model="goodsCheckForm.createDeptId" type="hidden" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="部门" prop="groupCode"> <el-select v-model="goodsCheckForm.groupCode" placeholder="请选择部门" :disabled="keyFieldsDisable || type === 'detail'" 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-form-item label="验收人"> <el-input v-model="goodsCheckForm.createUserName" :disabled="true" /> <el-input v-model="goodsCheckForm.createUserId" type="hidden" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="文件编号"> <el-input v-model="goodsCheckForm.recordNo" placeholder="系统自动生成" :disabled="true" /> </el-form-item> <el-form-item label="验收时间" prop="acceptTime"> <el-date-picker v-model="goodsCheckForm.acceptTime" :placeholder="type === 'detail' ? ' ' : '验收时间'" format="YYYY-MM-DD" value-format="YYYY-MM-DD" :disabled="type === 'detail'" style="width: 100%;" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="文件名称"> <el-input v-model="goodsCheckForm.recordName" :disabled="true" /> </el-form-item> <el-form-item label="物资申请单" prop="goodsApplyNo"> <el-input v-model="goodsCheckForm.goodsApplyId" type="hidden" /> <el-input v-model="goodsCheckForm.goodsApplyNo" :disabled="true"> <template v-if="type !== 'detail'" #append> <el-button size="small" :disabled="keyFieldsDisable" @click="showConsumableApplyFilter"> 选择 </el-button> </template> </el-input> </el-form-item> </el-col> </el-row> </detail-block> <detail-block v-if="current === 'consumable-check-basic'" title="物资明细"> <template v-if="type !== 'detail'" #btns> <el-button type="primary" @click="addRow"> 增加行 </el-button> <el-button type="info" @click="delRow"> 删除行 </el-button> </template> <!-- 表格区域 --> <el-table :data="recordDetailList" border @selection-change="multiSelect"> <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> <template #default="scope"> <el-input v-if="item.required === true && type !== 'detail'" v-model="scope.row[item.value]" :placeholder="item.text" type="textarea" autosize /> </template> </el-table-column> </el-table> </detail-block> </el-form> <approval-dialog ref="approvalDialog" @on-success="approvalSuccessHandler" @on-refuse="refuseHandler" /> <filter-consumable-apply ref="applyFilterRef" @record-selected="applyFormSelectedHandler" /> <template v-if="current === 'consumable-check-approval' && status !== '1'"> <approval-record-table :process-id="goodsCheckForm.processId" /> </template> </app-container> </template>