<script setup lang="ts" name="ProcessConfig"> import { ref } from 'vue' import draggable from 'vuedraggable' import ProcessNode from './processNode.vue' import ProcessNodeAdd from './processNodeAdd.vue' import chooseLab from './chooseLab.vue' import type { ILabList } from './lab-interface' const props = defineProps({ // 是否为详情展示页面 detail: { type: Boolean, default: false, }, // 样品id sampleId: { type: String, required: true, }, // 委托单id orderId: { type: String, required: true, }, }) const emits = defineEmits(['saveOver']) // 默认流程节点 const defaultProcess = { id: '', // 检测节点id executiveItem: '', // 检测项目 executiveDept: '', // 检测部门 executiveDeptName: '', // 检测部门 executivePerson: '', // 检测人员 executivePersonName: '', // 检测人员 measureState: '0', // 检测状态:待分发,待分配,待检测,检测中,检测完,退回,取消 measureStateName: '', // 检测状态 currentCertifications: '', // 当前证书数 requireCertifications: '', // 应出具证书数 updateTime: '', // 更新时间 backPerson: '', // 退回人 backReason: '', // 退回原因 backTime: '', // 退回时间 distributePerson: '', // 分配人 distributeTime: '', // 分配时间 startTime: '', // 检测开始时间 overTime: '', // 检测结束时间 } // 检定流程列表 const processList = ref([ { ...defaultProcess }, ]) // 获取当前样品检测流程,参数待定 const fetchProcess = () => { // TODO: 模拟数据 processList.value = [ { id: '1', // 检测节点id executiveItem: '', // 检测项目 executiveDept: '1601423635973935106', // 检测部门 executiveDeptName: '力学实验室', // 检测部门 executivePerson: '', // 检测人员 executivePersonName: '张三', // 检测人员 measureState: '2', // 检测状态:待分发,待分配,待检测,检测中,检测完,退回,取消 measureStateName: '待检测', // 检测状态 currentCertifications: '0', // 当前证书数 requireCertifications: '2', // 应出具证书数 updateTime: '2023-02-01 09:00:05', // 更新时间 backPerson: '', // 退回人 backReason: '', // 退回原因 backTime: '', // 退回时间 distributePerson: '', // 分配人 distributeTime: '', // 分配时间 startTime: '', // 检测开始时间 overTime: '', // 检测结束时间 }, { id: '2', // 检测节点id executiveItem: '', // 检测项目 executiveDept: '1601423577505337346', // 检测部门 executiveDeptName: '热学实验室', // 检测部门 executivePerson: '', // 检测人员 executivePersonName: '', // 检测人员 measureState: '1', // 检测状态:待分发,待分配,待检测,检测中,检测完,退回,取消 measureStateName: '待分配', // 检测状态 currentCertifications: '', // 当前证书数 requireCertifications: '', // 应出具证书数 updateTime: '', // 更新时间 backPerson: '', // 退回人 backReason: '', // 退回原因 backTime: '', // 退回时间 distributePerson: '', // 分配人 distributeTime: '', // 分配时间 startTime: '', // 检测开始时间 overTime: '', // 检测结束时间 }, ] } fetchProcess() // 点击添加流程 const processAdd = () => { processList.value.push({ ...defaultProcess }) } // 检查是否允许移动 const checkMove = (evt: any) => { // 目的位置元素evt.relatedContext.element // 当前拖动元素evt.draggedContext.element if (evt.relatedContext.element.measureState !== '0') { return false } return true } // 选择实验室弹窗 const chooseLabDialog = ref() // 批量添加流程 const batchProcessAdd = () => { chooseLabDialog.value.initDialog(true) } // 批量添加实验室 const batchChooseOver = (labs: ILabList[]) => { for (const item of labs) { const processTemp = { id: '', executiveItem: '', // 检测项目 executiveDept: item.deptId, // 检测部门 executiveDeptName: item.organizeName, // 检测部门 executivePerson: '', // 检测人员 executivePersonName: '', // 检测人员 measureState: '0', // 检测状态:待分发,待分配,待检测,检测中,检测完,退回,取消 measureStateName: '', // 检测状态 currentCertifications: '', // 当前证书数 requireCertifications: '', // 应出具证书数 updateTime: '', // 更新时间 backPerson: '', // 退回人 backReason: '', // 退回原因 backTime: '', // 退回时间 distributePerson: '', // 分配人 distributeTime: '', // 分配时间 startTime: '', // 检测开始时间 overTime: '', // 检测结束时间 } processList.value.push(processTemp) } } // 保存流程 const saveProcess = () => { // TODO: 保存流程 console.log(processList.value) emits('saveOver') } // 删除流程 const deleteProcess = (index: number) => { processList.value.splice(index, 1) } // --------暴露方法 defineExpose({ saveProcess, batchProcessAdd, deleteProcess }) </script> <template> <div> <div class="process-container"> <draggable v-model="processList" item-key="id" class="process-draggable" handle=".handle" :move="checkMove"> <!-- eslint-disable-next-line vue/no-unused-vars --> <template #item="{ process, index }"> <process-node v-model="processList[index]" :step="index + 1" @delete="deleteProcess(index)" /> </template> <template #footer> <process-node-add v-if="!props.detail" @click="processAdd" /> </template> </draggable> </div> <choose-lab ref="chooseLabDialog" @confirm-checkout="batchChooseOver" /> </div> </template> <style lang="scss" scoped> .process-container { .process-draggable { display: flex; flex-wrap: wrap; } } </style>