|
@@ -1,29 +1,33 @@
|
|
|
<template>
|
|
|
- <Dialog title="编辑标本出库申请" v-model="dialogVisible">
|
|
|
+ <Dialog title="编辑标本出库申请" v-model="dialogVisible" style="width: 850px">
|
|
|
<el-form
|
|
|
ref="formRef"
|
|
|
:model="formData"
|
|
|
:rules="formRules"
|
|
|
label-width="140px"
|
|
|
v-loading="formLoading"
|
|
|
+
|
|
|
>
|
|
|
-<!-- <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>-->
|
|
|
+ <div v-if="formData.status === 6 && formData.status === 2">
|
|
|
+ <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-->
|
|
|
+<!-- 点击添加的时候扩展一栏,即formData.specimenNumber的长度+1-->
|
|
|
+ <div>
|
|
|
<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>
|
|
|
+ </div>
|
|
|
<el-form-item label="标本编号" prop="number" label-width="150px">
|
|
|
<el-input v-model="formData.number[0]" placeholder="请输入标本编号" label-width="150px"/>
|
|
|
</el-form-item>
|
|
|
+ <template v-if="formData.number && formData.number.length > 1">
|
|
|
<el-form-item
|
|
|
v-for="(item, index) in formData.number.slice(1)"
|
|
|
:key="index + 1"
|
|
@@ -33,62 +37,47 @@
|
|
|
>
|
|
|
<el-input v-model="formData.number[index + 1]" placeholder="请输入标本编号" />
|
|
|
</el-form-item>
|
|
|
+ </template>
|
|
|
+
|
|
|
<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 label="申请单位" prop="applicantName" label-width="150px">
|
|
|
- <el-input v-model="formData.applicationUsage" placeholder="请输入申请人姓名" label-width="150px"/>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="申请日期" prop="applicationDate" label-width="150px">
|
|
|
- <el-date-picker
|
|
|
- v-model="formData.applicationDate"
|
|
|
- type="date"
|
|
|
- value-format="x"
|
|
|
- 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 label="研究项目名称" prop="projectName" label-width="150px">
|
|
|
- <el-input v-model="formData.projectName" placeholder="请输入申请出库的用途" 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 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"
|
|
|
+ <UploadFile
|
|
|
+ v-model="formData.attachments"
|
|
|
: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>
|
|
|
+ class="min-w-80px"
|
|
|
+ />
|
|
|
+
|
|
|
</el-form-item>
|
|
|
|
|
|
- <el-form-item label="预计领取日期" prop="outgoingTime" label-width="150px">
|
|
|
+ <el-form-item label="项目开始时间" prop="outgoingTime" label-width="150px">
|
|
|
<el-date-picker
|
|
|
- v-model="formData.expectedCollectionTime"
|
|
|
+ v-model="formData.startTime"
|
|
|
type="date"
|
|
|
value-format="x"
|
|
|
- placeholder="选择领取日期"
|
|
|
+ placeholder="选择项目开始时间"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
|
|
|
- <el-form-item label="预计退还日期" prop="returnDate" label-width="150px">
|
|
|
+ <el-form-item label="项目结束时间" prop="returnDate" label-width="150px">
|
|
|
<el-date-picker
|
|
|
- v-model="formData.estimatedReturnTime"
|
|
|
+ v-model="formData.endTime"
|
|
|
type="date"
|
|
|
value-format="x"
|
|
|
- placeholder="选择退还日期"
|
|
|
+ placeholder="选择项目结束时间"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
|
|
@@ -101,26 +90,27 @@
|
|
|
|
|
|
</template>
|
|
|
<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, reactive, defineEmits} from "vue";
|
|
|
+
|
|
|
/** 标本出库回库信息 表单 */
|
|
|
-defineOptions({ name: 'SpecimenOutboundForm' })
|
|
|
-const importUrl =
|
|
|
- import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + 'museums:specimen-outbound:create'
|
|
|
-const { t } = useI18n() // 国际化
|
|
|
+defineOptions({name: 'SpecimenOutboundForm'})
|
|
|
+
|
|
|
+const {t} = useI18n() // 国际化
|
|
|
const message = useMessage() // 消息弹窗
|
|
|
-const fileList = ref([]) // 文件列表
|
|
|
-const data = ref({ path: '' })
|
|
|
-const uploadRef = ref()
|
|
|
+// const fileList = ref([]) // 文件列表
|
|
|
+// const data = ref({path: ''})
|
|
|
+// const uploadRef = ref()
|
|
|
const dialogVisible = ref(false) // 弹窗的是否展示
|
|
|
const dialogTitle = ref('') // 弹窗的标题
|
|
|
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
|
|
const formType = ref('') // 表单的类型:create - 新增;update - 修改
|
|
|
const formData = ref({
|
|
|
id: undefined,
|
|
|
- infoId: undefined,
|
|
|
- chineseName: [],// 确保初始值为数组
|
|
|
+ infoId: [],
|
|
|
+ chineseName: undefined,// 确保初始值为数组
|
|
|
number: [''],// 确保初始值为数组
|
|
|
applicantName: undefined,
|
|
|
applicationDate: undefined,
|
|
@@ -136,21 +126,21 @@ const formData = ref({
|
|
|
returnDate: undefined,
|
|
|
specimenCondition: undefined,
|
|
|
sampleStatus: undefined,
|
|
|
- estimatedReturnTime: undefined,
|
|
|
- expectedCollectionTime:undefined
|
|
|
+ startTime: undefined,
|
|
|
+ endTime: undefined,
|
|
|
+ projectName:undefined,
|
|
|
+ phoneNumber:undefined
|
|
|
})
|
|
|
|
|
|
|
|
|
const formRules = reactive({
|
|
|
- chineseName: [{ required: true, message: '中文名称不能为空', trigger: 'blur' }],
|
|
|
- number: [{ required: true, message: '申请出库的标本编号不能为空', trigger: 'blur' }],
|
|
|
- applicantName: [{ required: true, message: '申请人或申请单位不能为空', trigger: 'blur' }],
|
|
|
- applicationUsage: [{ required: true, message: '申请出库的用途不能为空', trigger: 'blur' }],
|
|
|
- operator: [{ required: true, message: '出库员不能为空', trigger: 'blur' }],
|
|
|
- returner: [{ required: true, message: '退还人不能为空', trigger: 'blur' }],
|
|
|
- receiver: [{ required: true, message: '点收人不能为空', trigger: 'blur' }],
|
|
|
- estimatedReturnTime: [{ required: true, message: '预计退还日期不能为空', trigger: 'blur' }],
|
|
|
- expectedCollectionTime: [{ required: true, message: '预计领取日期不能为空', trigger: 'blur' }]
|
|
|
+
|
|
|
+ number: [{required: true, message: '标本编号不能为空', trigger: 'blur'}],
|
|
|
+ applicantName: [{required: true, message: '申请人姓名不能为空', trigger: 'blur'}],
|
|
|
+ applicationUsage: [{required: true, message: '申请单位不能为空', trigger: 'blur'}],
|
|
|
+ projectName: [{required: true, message: '研究项目名称不能为空', trigger: 'blur'}],
|
|
|
+ startTime: [{required: true, message: '项目开始时间不能为空', trigger: 'blur'}],
|
|
|
+ endTime: [{required: true, message: '项目结束时间不能为空', trigger: 'blur'}]
|
|
|
})
|
|
|
const formRef = ref() // 表单 Ref
|
|
|
/**增减标本编号**/
|
|
@@ -163,6 +153,7 @@ const removeSpecimenNumber = () => {
|
|
|
}
|
|
|
};
|
|
|
/** 打开弹窗 */
|
|
|
+
|
|
|
const open = async (type: string, id?: number) => {
|
|
|
dialogVisible.value = true
|
|
|
dialogTitle.value = t('action.' + type)
|
|
@@ -173,96 +164,33 @@ const open = async (type: string, id?: number) => {
|
|
|
formLoading.value = true
|
|
|
try {
|
|
|
formData.value = await SpecimenOutboundApi.getSpecimenOutbound(id)
|
|
|
+ //
|
|
|
+ // if (!formData.value.number || !Array.isArray(formData.value.number) || formData.value.number.length === 0) {
|
|
|
+ // formData.value.number = ['']; // 如果不是数组或为空,则初始化为包含一个空字符串的数组
|
|
|
+ // }
|
|
|
+ if (!Array.isArray(formData.value.number)) {
|
|
|
+ formData.value.number = [];// 如果不是数组,则转换为包含该数据的数组
|
|
|
+ } else if (formData.value.number.length === 0) {
|
|
|
+ formData.value.number = ['']; // 如果数组为空,则初始化为包含一个空字符串的数组
|
|
|
+ }
|
|
|
+
|
|
|
} finally {
|
|
|
formLoading.value = false
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-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 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 () => {
|
|
|
- // 校验表单
|
|
|
|
|
|
- await formRef.value.validate();
|
|
|
|
|
|
// // 将数组字段转换为字符串
|
|
|
// if (formData.value.chineseName.length) {
|
|
@@ -271,6 +199,8 @@ const submitForm = async () => {
|
|
|
// if (formData.value.specimenNumber.length) {
|
|
|
// formData.value.specimenNumber = formData.value.specimenNumber.join(',');
|
|
|
// }
|
|
|
+ // 校验表单
|
|
|
+ await formRef.value.validate()
|
|
|
|
|
|
// 提交请求
|
|
|
formLoading.value = true;
|
|
@@ -294,8 +224,8 @@ const submitForm = async () => {
|
|
|
const resetForm = () => {
|
|
|
formData.value = {
|
|
|
id: undefined,
|
|
|
- infoId: undefined,
|
|
|
- chineseName: [],// 确保初始值为数组
|
|
|
+ infoId: [],
|
|
|
+ chineseName: undefined,// 确保初始值为数组
|
|
|
number: [],// 确保初始值为数组
|
|
|
applicantName: undefined,
|
|
|
applicationDate: undefined,
|
|
@@ -310,10 +240,25 @@ const resetForm = () => {
|
|
|
receiver: undefined,
|
|
|
returnDate: undefined,
|
|
|
specimenCondition: undefined,
|
|
|
- sampleStatus: undefined
|
|
|
+ sampleStatus: undefined,
|
|
|
+ startTime: undefined,
|
|
|
+ endTime:undefined,
|
|
|
+ projectName:undefined,
|
|
|
+ phoneNumber:undefined
|
|
|
}
|
|
|
formRef.value?.resetFields()
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+// // 在组件加载时获取数据
|
|
|
+// onMounted(async () => {
|
|
|
+// const formData = await SpecimenOutboundApi.getSpecimenOutbound(data);
|
|
|
+// if (formData && typeof formData.number === 'string') {
|
|
|
+// try {
|
|
|
+// formData.value.number = JSON.parse(formData.number);
|
|
|
+// } catch (error) {
|
|
|
+// console.error('解析numberStr出错:', error);
|
|
|
+// formData.value.number = [];
|
|
|
+// }
|
|
|
+// }
|
|
|
+// })
|
|
|
</script>
|