|
@@ -7,19 +7,39 @@
|
|
label-width="140px"
|
|
label-width="140px"
|
|
v-loading="formLoading"
|
|
v-loading="formLoading"
|
|
>
|
|
>
|
|
- <el-form-item label="标本ID" prop="infoId">
|
|
|
|
- <el-input v-model="formData.infoId" placeholder="请输入标本ID" />
|
|
|
|
- </el-form-item>
|
|
|
|
- <el-form-item label="中文名称" prop="chineseName">
|
|
|
|
- <el-input v-model="formData.chineseName" placeholder="请输入中文名称" />
|
|
|
|
|
|
+<!-- <div>-->
|
|
|
|
+<!-- <div style="margin-bottom: 20px;color: red;font-size: 20px">-->
|
|
|
|
+<!-- 申请驳回原因:{{formData.processInstanceId}}-->
|
|
|
|
+<!-- </div>-->
|
|
|
|
+<!-- <div style="margin-bottom: 20px;margin-left: 70px;font-size: 18px; font-weight: bold">请重新申请</div>-->
|
|
|
|
+<!-- </div>-->
|
|
|
|
+
|
|
|
|
+ <!-- 点击添加的时候扩展一栏,即formData.specimenNumber的长度+1-->
|
|
|
|
+ <el-button type="primary"
|
|
|
|
+ style="float: right ;margin-left: 5px; padding: 5px 10px; font-size: 12px;"
|
|
|
|
+ @click="removeSpecimenNumber">-</el-button>
|
|
|
|
+ <el-button type="primary"
|
|
|
|
+ style="float: right; padding: 5px 10px; font-size: 12px;"
|
|
|
|
+ @click="addSpecimenNumber">+</el-button>
|
|
|
|
+ <el-form-item label="标本编号" prop="number" label-width="150px">
|
|
|
|
+ <el-input v-model="formData.number[0]" placeholder="请输入标本编号" label-width="150px"/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- <el-form-item label="标本编号" prop="specimenNumber">
|
|
|
|
- <el-input v-model="formData.specimenNumber" placeholder="请输入标本编号" />
|
|
|
|
|
|
+ <el-form-item
|
|
|
|
+ v-for="(item, index) in formData.number.slice(1)"
|
|
|
|
+ :key="index + 1"
|
|
|
|
+ :label="`标本编号 ${index + 2}`"
|
|
|
|
+ prop="number"
|
|
|
|
+ label-width="150px"
|
|
|
|
+ >
|
|
|
|
+ <el-input v-model="formData.number[index + 1]" placeholder="请输入标本编号" />
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <el-form-item label="申请人姓名" prop="applicantName" label-width="150px">
|
|
|
|
+ <el-input v-model="formData.applicantName" placeholder="请输入申请人姓名" label-width="150px"/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- <el-form-item label="申请人或申请单位" prop="applicantName">
|
|
|
|
- <el-input v-model="formData.applicantName" placeholder="请输入申请人或申请单位" />
|
|
|
|
|
|
+ <el-form-item label="申请单位" prop="applicantName" label-width="150px">
|
|
|
|
+ <el-input v-model="formData.applicationUsage" placeholder="请输入申请人姓名" label-width="150px"/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- <el-form-item label="申请日期" prop="applicationDate">
|
|
|
|
|
|
+ <el-form-item label="申请日期" prop="applicationDate" label-width="150px">
|
|
<el-date-picker
|
|
<el-date-picker
|
|
v-model="formData.applicationDate"
|
|
v-model="formData.applicationDate"
|
|
type="date"
|
|
type="date"
|
|
@@ -27,56 +47,51 @@
|
|
placeholder="选择申请日期"
|
|
placeholder="选择申请日期"
|
|
/>
|
|
/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- <el-form-item label="申请出库的用途" prop="applicationUsage">
|
|
|
|
- <el-input v-model="formData.applicationUsage" placeholder="请输入申请出库的用途" />
|
|
|
|
|
|
+ <el-form-item label="研究项目名称" prop="projectName" label-width="150px">
|
|
|
|
+ <el-input v-model="formData.projectName" placeholder="请输入申请出库的用途" label-width="150px"/>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <el-form-item label="电话号码" prop="phoneNumber" label-width="150px">
|
|
|
|
+ <el-input v-model="formData.phoneNumber" placeholder="电话号码" label-width="150px"/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- <el-form-item label="附件上传" prop="attachments">
|
|
|
|
- <UploadImg v-model="formData.attachments" />
|
|
|
|
|
|
+ <el-form-item label="附件上传" prop="attachments" label-width="150px">
|
|
|
|
+ <el-upload
|
|
|
|
+ ref="uploadRef"
|
|
|
|
+ v-model:file-list="fileList"
|
|
|
|
+ :action="importUrl + '?another=' + 1"
|
|
|
|
+ :auto-upload="false"
|
|
|
|
+ :data="data"
|
|
|
|
+ :disabled="formLoading"
|
|
|
|
+ :limit="1"
|
|
|
|
+ :on-change="handleFileChange"
|
|
|
|
+ :on-error="submitFormError"
|
|
|
|
+ :on-exceed="handleExceed"
|
|
|
|
+ :on-success="submitFormSuccess"
|
|
|
|
+ drag
|
|
|
|
+ :headers="uploadHeaders"
|
|
|
|
+ >
|
|
|
|
+ <i class="el-icon-upload"></i>
|
|
|
|
+ <div class="el-upload__text"> 将文件拖到此处,或 <em>点击上传</em></div>
|
|
|
|
+ </el-upload>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
-<!-- <el-form-item label="审批状态" prop="status">-->
|
|
|
|
-<!-- <el-select v-model="formData.status" placeholder="请选择审批状态">-->
|
|
|
|
-<!-- <el-option label="请选择字典生成" value="" />-->
|
|
|
|
-<!-- </el-select>-->
|
|
|
|
-<!-- </el-form-item>-->
|
|
|
|
-<!-- <el-form-item label="备注信息" prop="remarks">-->
|
|
|
|
-<!-- <el-input v-model="formData.remarks" placeholder="请输入备注信息" />-->
|
|
|
|
-<!-- </el-form-item>-->
|
|
|
|
-<!-- <el-form-item label="流程实例的编号" prop="processInstanceId">-->
|
|
|
|
-<!-- <el-input v-model="formData.processInstanceId" placeholder="请输入流程实例的编号" />-->
|
|
|
|
-<!-- </el-form-item>-->
|
|
|
|
-<!-- <el-form-item label="出库员" prop="operator">-->
|
|
|
|
-<!-- <el-input v-model="formData.operator" placeholder="请输入出库员" />-->
|
|
|
|
-<!-- </el-form-item>-->
|
|
|
|
-<!-- <el-form-item label="出库时间" prop="outgoingTime">-->
|
|
|
|
-<!-- <el-date-picker-->
|
|
|
|
-<!-- v-model="formData.outgoingTime"-->
|
|
|
|
-<!-- type="date"-->
|
|
|
|
-<!-- value-format="x"-->
|
|
|
|
-<!-- placeholder="选择出库时间"-->
|
|
|
|
-<!-- />-->
|
|
|
|
-<!-- </el-form-item>-->
|
|
|
|
-<!-- <el-form-item label="退还人" prop="returner">-->
|
|
|
|
-<!-- <el-input v-model="formData.returner" placeholder="请输入退还人" />-->
|
|
|
|
-<!-- </el-form-item>-->
|
|
|
|
-<!-- <el-form-item label="点收人" prop="receiver">-->
|
|
|
|
-<!-- <el-input v-model="formData.receiver" placeholder="请输入点收人" />-->
|
|
|
|
-<!-- </el-form-item>-->
|
|
|
|
- <el-form-item label="退还日期" prop="returnDate">
|
|
|
|
|
|
+
|
|
|
|
+ <el-form-item label="预计领取日期" prop="outgoingTime" label-width="150px">
|
|
<el-date-picker
|
|
<el-date-picker
|
|
- v-model="formData.returnDate"
|
|
|
|
|
|
+ v-model="formData.expectedCollectionTime"
|
|
|
|
+ type="date"
|
|
|
|
+ value-format="x"
|
|
|
|
+ placeholder="选择领取日期"
|
|
|
|
+ />
|
|
|
|
+ </el-form-item>
|
|
|
|
+
|
|
|
|
+ <el-form-item label="预计退还日期" prop="returnDate" label-width="150px">
|
|
|
|
+ <el-date-picker
|
|
|
|
+ v-model="formData.estimatedReturnTime"
|
|
type="date"
|
|
type="date"
|
|
value-format="x"
|
|
value-format="x"
|
|
placeholder="选择退还日期"
|
|
placeholder="选择退还日期"
|
|
/>
|
|
/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
-<!-- <el-form-item label="标本情况" prop="specimenCondition">-->
|
|
|
|
-<!-- <el-input v-model="formData.specimenCondition" placeholder="请输入标本情况" />-->
|
|
|
|
-<!-- </el-form-item>-->
|
|
|
|
-<!-- <el-form-item label="标本状态(已出库、已回库、出库审批中)" prop="sampleStatus">-->
|
|
|
|
-<!-- <el-select v-model="formData.sampleStatus" placeholder="请选择标本状态(已出库、已回库、出库审批中)">-->
|
|
|
|
-<!-- <el-option label="请选择字典生成" value="" />-->
|
|
|
|
-<!-- </el-select>-->
|
|
|
|
-<!-- </el-form-item>-->
|
|
|
|
|
|
+
|
|
</el-form>
|
|
</el-form>
|
|
<template #footer>
|
|
<template #footer>
|
|
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
|
|
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
|
|
@@ -87,14 +102,17 @@
|
|
</template>
|
|
</template>
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
import { SpecimenOutboundApi, SpecimenOutboundVO } from '@/api/museums/specimenoutbound'
|
|
import { SpecimenOutboundApi, SpecimenOutboundVO } from '@/api/museums/specimenoutbound'
|
|
-import { UploadFilled } from '@element-plus/icons-vue'
|
|
|
|
-import {ref} from "vue";
|
|
|
|
|
|
+//import { UploadFilled } from '@element-plus/icons-vue'
|
|
|
|
+import {ref, reactive, defineEmits} from "vue";
|
|
/** 标本出库回库信息 表单 */
|
|
/** 标本出库回库信息 表单 */
|
|
defineOptions({ name: 'SpecimenOutboundForm' })
|
|
defineOptions({ name: 'SpecimenOutboundForm' })
|
|
-
|
|
|
|
|
|
+const importUrl =
|
|
|
|
+ import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + 'museums:specimen-outbound:create'
|
|
const { t } = useI18n() // 国际化
|
|
const { t } = useI18n() // 国际化
|
|
const message = useMessage() // 消息弹窗
|
|
const message = useMessage() // 消息弹窗
|
|
-
|
|
|
|
|
|
+const fileList = ref([]) // 文件列表
|
|
|
|
+const data = ref({ path: '' })
|
|
|
|
+const uploadRef = ref()
|
|
const dialogVisible = ref(false) // 弹窗的是否展示
|
|
const dialogVisible = ref(false) // 弹窗的是否展示
|
|
const dialogTitle = ref('') // 弹窗的标题
|
|
const dialogTitle = ref('') // 弹窗的标题
|
|
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
|
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
|
@@ -102,8 +120,8 @@ const formType = ref('') // 表单的类型:create - 新增;update - 修改
|
|
const formData = ref({
|
|
const formData = ref({
|
|
id: undefined,
|
|
id: undefined,
|
|
infoId: undefined,
|
|
infoId: undefined,
|
|
- chineseName: undefined,
|
|
|
|
- specimenNumber: undefined,
|
|
|
|
|
|
+ chineseName: [],// 确保初始值为数组
|
|
|
|
+ number: [''],// 确保初始值为数组
|
|
applicantName: undefined,
|
|
applicantName: undefined,
|
|
applicationDate: undefined,
|
|
applicationDate: undefined,
|
|
applicationUsage: undefined,
|
|
applicationUsage: undefined,
|
|
@@ -117,21 +135,33 @@ const formData = ref({
|
|
receiver: undefined,
|
|
receiver: undefined,
|
|
returnDate: undefined,
|
|
returnDate: undefined,
|
|
specimenCondition: undefined,
|
|
specimenCondition: undefined,
|
|
- sampleStatus: undefined
|
|
|
|
|
|
+ sampleStatus: undefined,
|
|
|
|
+ estimatedReturnTime: undefined,
|
|
|
|
+ expectedCollectionTime:undefined
|
|
})
|
|
})
|
|
|
|
+
|
|
|
|
+
|
|
const formRules = reactive({
|
|
const formRules = reactive({
|
|
- infoId: [{ required: true, message: '关联到总表中的标本ID不能为空', trigger: 'blur' }],
|
|
|
|
chineseName: [{ required: true, message: '中文名称不能为空', trigger: 'blur' }],
|
|
chineseName: [{ required: true, message: '中文名称不能为空', trigger: 'blur' }],
|
|
- specimenNumber: [{ required: true, message: '申请出库的标本编号不能为空', trigger: 'blur' }],
|
|
|
|
|
|
+ number: [{ required: true, message: '申请出库的标本编号不能为空', trigger: 'blur' }],
|
|
applicantName: [{ required: true, message: '申请人或申请单位不能为空', trigger: 'blur' }],
|
|
applicantName: [{ required: true, message: '申请人或申请单位不能为空', trigger: 'blur' }],
|
|
applicationUsage: [{ required: true, message: '申请出库的用途不能为空', trigger: 'blur' }],
|
|
applicationUsage: [{ required: true, message: '申请出库的用途不能为空', trigger: 'blur' }],
|
|
operator: [{ required: true, message: '出库员不能为空', trigger: 'blur' }],
|
|
operator: [{ required: true, message: '出库员不能为空', trigger: 'blur' }],
|
|
returner: [{ required: true, message: '退还人不能为空', trigger: 'blur' }],
|
|
returner: [{ required: true, message: '退还人不能为空', trigger: 'blur' }],
|
|
receiver: [{ required: true, message: '点收人不能为空', trigger: 'blur' }],
|
|
receiver: [{ required: true, message: '点收人不能为空', trigger: 'blur' }],
|
|
- returnDate: [{ required: true, message: '退还日期不能为空', trigger: 'blur' }]
|
|
|
|
|
|
+ estimatedReturnTime: [{ required: true, message: '预计退还日期不能为空', trigger: 'blur' }],
|
|
|
|
+ expectedCollectionTime: [{ required: true, message: '预计领取日期不能为空', trigger: 'blur' }]
|
|
})
|
|
})
|
|
const formRef = ref() // 表单 Ref
|
|
const formRef = ref() // 表单 Ref
|
|
-
|
|
|
|
|
|
+/**增减标本编号**/
|
|
|
|
+const addSpecimenNumber = () => {
|
|
|
|
+ formData.value.number.push(''); // 向数组中添加一个新的空字符串
|
|
|
|
+};
|
|
|
|
+const removeSpecimenNumber = () => {
|
|
|
|
+ if (formData.value.number.length > 0) { // 确保至少保留一个输入框
|
|
|
|
+ formData.value.number.pop(); // 从数组中移除最后一个元素
|
|
|
|
+ }
|
|
|
|
+};
|
|
/** 打开弹窗 */
|
|
/** 打开弹窗 */
|
|
const open = async (type: string, id?: number) => {
|
|
const open = async (type: string, id?: number) => {
|
|
dialogVisible.value = true
|
|
dialogVisible.value = true
|
|
@@ -150,37 +180,123 @@ const open = async (type: string, id?: number) => {
|
|
}
|
|
}
|
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+// /** 标本搜索选择 */
|
|
|
|
+// const props = reactive({
|
|
|
|
+// value: 'value',
|
|
|
|
+// label: 'label',
|
|
|
|
+// children: 'children',
|
|
|
|
+// multiple: true
|
|
|
|
+// });
|
|
|
|
+//
|
|
|
|
+// const options = ref([]);
|
|
|
|
+//
|
|
|
|
+// const fetchOptions = async () => {
|
|
|
|
+// try {
|
|
|
|
+// const response = await SpecimenOutboundApi.createSpecimenOutbound();
|
|
|
|
+// options.value = processOptions(response.data);
|
|
|
|
+// } catch (error) {
|
|
|
|
+// console.error('获取选项数据失败:', error);
|
|
|
|
+// }
|
|
|
|
+// };
|
|
|
|
+//
|
|
|
|
+// const processOptions = (data) => {
|
|
|
|
+// // 将后端数据格式化为 el-cascader 需要的格式
|
|
|
|
+// return data.map(item => ({
|
|
|
|
+// value: item.id, // 假设后端返回的ID字段是id
|
|
|
|
+// label: item.name, // 假设后端返回的名称字段是name
|
|
|
|
+// children: item.children ? processOptions(item.children) : undefined
|
|
|
|
+// }));
|
|
|
|
+// };
|
|
|
|
+//
|
|
|
|
+//
|
|
|
|
+// const handleCascaderChange = (value, formData) => {
|
|
|
|
+// formData.value.chineseName = value;
|
|
|
|
+// };
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/** 上传错误提示 */
|
|
|
|
+const submitFormError = (): void => {
|
|
|
|
+ message.error('上传失败,请您重新上传!')
|
|
|
|
+ formLoading.value = false
|
|
|
|
+}
|
|
|
|
+/** 处理上传的文件发生变化 */
|
|
|
|
+const handleFileChange = (file) => {
|
|
|
|
+ data.value.path = file.name
|
|
|
|
+}
|
|
|
|
+const uploadHeaders = ref() // 上传 Header 头
|
|
|
|
+
|
|
|
|
+/** 文件数超出提示 */
|
|
|
|
+const handleExceed = (): void => {
|
|
|
|
+ message.error('最多只能上传一个文件!')
|
|
|
|
+}
|
|
|
|
+
|
|
/** 提交表单 */
|
|
/** 提交表单 */
|
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
|
|
|
+// const submitForm = async () => {
|
|
|
|
+// // 校验表单
|
|
|
|
+// await formRef.value.validate()
|
|
|
|
+// // 提交请求
|
|
|
|
+// formLoading.value = true
|
|
|
|
+// try {
|
|
|
|
+// const data = formData.value as unknown as SpecimenOutboundVO
|
|
|
|
+// if (formType.value === 'create') {
|
|
|
|
+// await SpecimenOutboundApi.createSpecimenOutbound(data)
|
|
|
|
+// message.success(t('新增标本出库申请成功'))
|
|
|
|
+// } else {
|
|
|
|
+// await SpecimenOutboundApi.alterSpecimenOutbound(data)
|
|
|
|
+// message.success(t('标本出库申请修改成功'))
|
|
|
|
+// }
|
|
|
|
+// dialogVisible.value = false
|
|
|
|
+// // 发送操作成功的事件
|
|
|
|
+// emit('success')
|
|
|
|
+// } finally {
|
|
|
|
+// formLoading.value = false
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+
|
|
const submitForm = async () => {
|
|
const submitForm = async () => {
|
|
// 校验表单
|
|
// 校验表单
|
|
- await formRef.value.validate()
|
|
|
|
|
|
+
|
|
|
|
+ await formRef.value.validate();
|
|
|
|
+
|
|
|
|
+ // // 将数组字段转换为字符串
|
|
|
|
+ // if (formData.value.chineseName.length) {
|
|
|
|
+ // formData.value.chineseName = formData.value.chineseName.join(',');
|
|
|
|
+ // }
|
|
|
|
+ // if (formData.value.specimenNumber.length) {
|
|
|
|
+ // formData.value.specimenNumber = formData.value.specimenNumber.join(',');
|
|
|
|
+ // }
|
|
|
|
+
|
|
// 提交请求
|
|
// 提交请求
|
|
- formLoading.value = true
|
|
|
|
|
|
+ formLoading.value = true;
|
|
try {
|
|
try {
|
|
- const data = formData.value as unknown as SpecimenOutboundVO
|
|
|
|
|
|
+ const data = formData.value as unknown as SpecimenOutboundVO;
|
|
if (formType.value === 'create') {
|
|
if (formType.value === 'create') {
|
|
- await SpecimenOutboundApi.createSpecimenOutbound(data)
|
|
|
|
- message.success(t('新增标本出库申请成功'))
|
|
|
|
|
|
+ await SpecimenOutboundApi.createSpecimenOutbound(data);
|
|
|
|
+ message.success(t('新增标本出库申请成功'));
|
|
} else {
|
|
} else {
|
|
- await SpecimenOutboundApi.alterSpecimenOutbound(data)
|
|
|
|
- message.success(t('标本出库申请修改成功'))
|
|
|
|
|
|
+ await SpecimenOutboundApi.alterSpecimenOutbound(data);
|
|
|
|
+ message.success(t('标本出库申请修改成功'));
|
|
}
|
|
}
|
|
- dialogVisible.value = false
|
|
|
|
|
|
+ dialogVisible.value = false;
|
|
// 发送操作成功的事件
|
|
// 发送操作成功的事件
|
|
- emit('success')
|
|
|
|
|
|
+ emit('success');
|
|
} finally {
|
|
} finally {
|
|
- formLoading.value = false
|
|
|
|
|
|
+ formLoading.value = false;
|
|
}
|
|
}
|
|
-}
|
|
|
|
-//
|
|
|
|
|
|
+};
|
|
/** 重置表单 */
|
|
/** 重置表单 */
|
|
const resetForm = () => {
|
|
const resetForm = () => {
|
|
formData.value = {
|
|
formData.value = {
|
|
id: undefined,
|
|
id: undefined,
|
|
infoId: undefined,
|
|
infoId: undefined,
|
|
- chineseName: undefined,
|
|
|
|
- specimenNumber: undefined,
|
|
|
|
|
|
+ chineseName: [],// 确保初始值为数组
|
|
|
|
+ number: [],// 确保初始值为数组
|
|
applicantName: undefined,
|
|
applicantName: undefined,
|
|
applicationDate: undefined,
|
|
applicationDate: undefined,
|
|
applicationUsage: undefined,
|
|
applicationUsage: undefined,
|
|
@@ -198,4 +314,6 @@ const resetForm = () => {
|
|
}
|
|
}
|
|
formRef.value?.resetFields()
|
|
formRef.value?.resetFields()
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+
|
|
</script>
|
|
</script>
|