Browse Source

最新前端

lmm 6 months ago
parent
commit
193008a6a8

+ 6 - 6
src/api/museums/photos/index.ts

@@ -12,32 +12,32 @@ export interface PhotosVO {
 export const PhotosApi = {
   // 查询博物馆照片分页
   getPhotosPage: async (params: any) => {
-    return await request.get({ url: `/photos-manage/photos/photos`, params })
+    return await request.get({ url: `/photosmanage/photos/photos`, params })
   },
 
   // 查询博物馆照片详情
   getPhotos: async (id: number) => {
-    return await request.get({ url: `/photos-manage/photos/get?id=` + id })
+    return await request.get({ url: `/photosmanage/photos/get?id=` + id })
   },
 
   // 新增博物馆照片
   createPhotos: async (data: PhotosVO) => {
-    return await request.post({ url: `/photos-manage/photos/create`, data })
+    return await request.post({ url: `/photosmanage/photos/create`, data })
   },
 
   // 修改博物馆照片
   updatePhotos: async (data: PhotosVO) => {
-    return await request.put({ url: `/photos-manage/photos/update`, data })
+    return await request.put({ url: `/photosmanage/photos/update`, data })
   },
 
   // 删除博物馆照片
   deletePhotos: async (id: number) => {
-    return await request.delete({ url: `/photos-manage/photos/delete?id=` + id })
+    return await request.delete({ url: `/photosmanage/photos/delete?id=` + id })
   },
 
   // 导出博物馆照片 Excel
   exportPhotos: async (params) => {
-    return await request.download({ url: `/photos-manage/photos/export-excel`, params })
+    return await request.download({ url: `/photosmanage/photos/export-excel`, params })
   }
   //  getImageDetail : async (id ?: string ): Promise<any> => {
   //   return await request.get({ url: '/photos-manage/photo-group/get?id=' + id })

+ 8 - 4
src/api/museums/specimeninfo/index.ts

@@ -69,10 +69,14 @@ export const SpecimenInfoApi = {
   exportSpecimenInfo: async (params) => {
     return await request.download({ url: `/museums/specimen-info/export-excel`, params })
   },
- // 导入标本图片
-    exportSpecimenInfoImage: async (params) => {
-      return await request.download({ url: `/admin-api/museums/specimen-info/import-specimen-images`, params })
-    }
+  //标本详情界面
+  // getSpecimenRecord:async (id: number ) => {
+  //   return await request.get({ url: '/museums/specimen-info/records??id=' + id })
+  // }
+ // // 导入标本图片
+ //    exportSpecimenInfoImage: async (params) => {
+ //      return await request.download({ url: `/admin-api/museums/specimen-info/import-specimen-images`, params })
+ //    }
 }
 //下载导入标本信息模板
 // export const importSpecimenInfTemplate = () => {

+ 4 - 1
src/api/museums/specimenoutbound/index.ts

@@ -59,5 +59,8 @@ export const SpecimenOutboundApi = {
  ApprovalSpecimenOutbound: async (id: number) => {
     return await request.put({ url: `/museums/specimen-outbound/reject?id=` + id })
   },
-
+  // 确认回标本出库
+  ConfirmSpecimenOutbound: async (id: number) => {
+    return await request.put({ url: `/museums/specimen-outbound/confirmOutbound?id=` + id })
+  },
 }

+ 56 - 56
src/api/system/text/index.ts

@@ -1,59 +1,59 @@
-import request from '@/config/axios'
-//
- export interface Specimen {
-   id: number // 主键
-   specimenType: number // 标本类型(矿物、岩石矿石、化石、陨石)
-   specimenNumber: string // 标本编号
-   assetNumber: string // 资产号
-   storageLocation: string // 存放位置
-   chineseName: string // 中文名称
-   englishName: string // 英文名称
-   composition: string // 成分
-   origin: string // 产地
-   era: string // 时代
-   preservedLayer: string // 保存地层
-   meteoriteType: string // 陨石类型
-   internationalName: string // 国际命名
-   discoveryTime: Date // 发现时间
-   fallTime: Date // 降落时间
-   preservationType: number // 保存类型(标本、光片、薄片模型及其他)
-   size: string // 尺寸
-   weight: number // 重量
-   source: number // 来源(采购、捐赠、采集)
-   provider: string // 标本提供者(供应商、捐赠人、采集人)
-   acquisitionTime: string// 入藏时间(购买、捐赠、采集时间)
-   purpose: string // 用途
-   description: string // 描述
-   collectionStatus: number // 馆藏状态(在馆、借出)
-   notes: string // 备注
-   imageName: string // 图片名称
-   imagePath: string // 图片路径
-   deletedReason: string // 注销原因
-   operator: string // 入库操作员
-   entryDate: Date // 入库时间l
-   outgoingTime:string//出库时间
-   returner:string//退还人
-   returnDate:string//退还日期
-   receiver:string//点收人
-   specimen_condition:string//标本情况
-   applicationUsage:string//借出用途
- }
-//
-// //查询(精简)列表
-export const getList = async (): Promise<Specimen[]> => {
-  return await request.get({ url: '/museums/specimen-info/get?id=' })
-}
-export const getDetail = async (id ?: string ): Promise<any> => {
-  return await request.get({ url: '/museums/specimen-info/get?id=' + id })
-}
-//馆藏状态记录
-export const getRecord = async (id ?: string ): Promise<any> => {
-  return await request.get({ url: '/museums/specimen-info/records?id=' + id })
-}
-//标本图片
-export const getImage= async (id ?: string ): Promise<any> => {
-  return await request.get({ url: '/museums/photos/get?id=' + id })
-}
+// import request from '@/config/axios'
+// //
+//  export interface Specimen {
+//    id: number // 主键
+//    specimenType: number // 标本类型(矿物、岩石矿石、化石、陨石)
+//    specimenNumber: string // 标本编号
+//    assetNumber: string // 资产号
+//    storageLocation: string // 存放位置
+//    chineseName: string // 中文名称
+//    englishName: string // 英文名称
+//    composition: string // 成分
+//    origin: string // 产地
+//    era: string // 时代
+//    preservedLayer: string // 保存地层
+//    meteoriteType: string // 陨石类型
+//    internationalName: string // 国际命名
+//    discoveryTime: Date // 发现时间
+//    fallTime: Date // 降落时间
+//    preservationType: number // 保存类型(标本、光片、薄片模型及其他)
+//    size: string // 尺寸
+//    weight: number // 重量
+//    source: number // 来源(采购、捐赠、采集)
+//    provider: string // 标本提供者(供应商、捐赠人、采集人)
+//    acquisitionTime: string// 入藏时间(购买、捐赠、采集时间)
+//    purpose: string // 用途
+//    description: string // 描述
+//    collectionStatus: number // 馆藏状态(在馆、借出)
+//    notes: string // 备注
+//    imageName: string // 图片名称
+//    imagePath: string // 图片路径
+//    deletedReason: string // 注销原因
+//    operator: string // 入库操作员
+//    entryDate: Date // 入库时间l
+//    outgoingTime:string//出库时间
+//    returner:string//退还人
+//    returnDate:string//退还日期
+//    receiver:string//点收人
+//    specimen_condition:string//标本情况
+//    applicationUsage:string//借出用途
+//  }
+// //
+// // //查询(精简)列表
+// export const getList = async (): Promise<Specimen[]> => {
+//   return await request.get({ url: '/museums/specimen-info/get?id=' })
+// }
+// // export const getDetail = async (id ?: string ): Promise<any> => {
+// //   return await request.get({ url: '/museums/specimen-info/get?id=' + id })
+// // }
+// // //馆藏状态记录
+// export const getRecord = async (id ?: string ): Promise<any> => {
+//   return await request.get({ url: '/museums/specimen-info/records?id=' + id })
+// }
+// //标本图片
+// export const getImage= async (id ?: string ): Promise<any> => {
+//   return await request.get({ url: '/museums/photos/get?id=' + id })
+// }
 //import { useRoute } from 'vue-router';
 // export default {
 //   setup() {

+ 12 - 0
src/hooks/web/useMessage.ts

@@ -83,6 +83,18 @@ export const useMessage = () => {
         }
       )
     },
+    // 出库窗体
+    OutboundConfirm(content?: string, tip?: string) {
+      return ElMessageBox.confirm(
+        content ? content : t('是否确认标本出库'),
+        tip ? tip : t('common.confirmTitle'),
+        {
+          confirmButtonText: t('common.ok'),
+          cancelButtonText: t('common.cancel'),
+          type: 'warning'
+        }
+      )
+    },
     // 提交内容
     prompt(content: string, tip: string) {
       return ElMessageBox.prompt(content, tip, {

+ 53 - 5
src/router/modules/remaining.ts

@@ -464,6 +464,17 @@ const remainingRouter: AppRouteRecordRaw[] = [
           activeMenu: '/museums/specimeninfo'
         },
         component: () => import('@/views/museums/specimeninfo/index.vue')
+      },
+      {
+        path: '/photogroup/index',
+        name: 'PhotoGroup',
+        meta: {
+          title: '照片组管理',
+          noCache: true,
+          hidden: true,
+          activeMenu: '/photogroup/index'
+        },
+        component: () => import('@/views/museums/photogroup/index.vue')
       }
     ]
   },
@@ -591,16 +602,41 @@ const remainingRouter: AppRouteRecordRaw[] = [
         },
         component: () => import('@/views/crm/product/detail/index.vue')
       },
-      {
-        path: '/system/text/index.vue',
-        component: () => import('@/views//system/text/index.vue'),
-        name: 'Details',
+
+      //
+      // {
+      //   path: '/specimeninfo',
+      //   component: Layout,
+      //   name: 'specimeninfo',
+      //   meta: {
+      //     hidden: true
+      //   },
+      //   children: [
+      //     {
+      //       path: '/museums/specimeninfo/specimenDetails.vue',
+      //       component: () => import('@/views/museums/specimeninfo/specimenDetails.vue'),
+      //       name: 'SystemDictData',
+      //       meta: {
+      //         title: '查看标本详情',
+      //         noCache: true,
+      //         hidden: true,
+      //         canTo: true,
+      //         icon: '',
+      //         activeMenu: '/crm/specimeninfo'
+      //       }
+      //     }
+      //   ]
+      // },
+      {
+        path: '/museums/specimeninfo/specimenDetails.vue',
+        component: () => import('@/views/museums/specimeninfo/specimenDetails.vue'),
+        name: 'specimenDetails',
         meta: {
           noCache: true,
           hidden: true,
           canTo: true,
           title: '查看标本详情',
-          activeMenu: '/crm/specimen'
+          activeMenu: '/crm/specimen-info'
         }
       },
       {
@@ -615,6 +651,18 @@ const remainingRouter: AppRouteRecordRaw[] = [
           activeMenu: '/crm/photo'
         }
       },
+      {
+        path: '/museums/specimenoutbound/OutboundForm/outboundDetail.vue',
+        component: () => import('@/views/museums/specimenoutbound/OutboundForm/outboundDetail.vue'),
+        name: 'OutboundDetail',
+        meta: {
+          noCache: true,
+          hidden: true,
+          canTo: true,
+          title: '查看标本出库详情',
+          activeMenu: '/crm/outbound'
+        }
+      },
     ]
   },
   {

+ 5 - 1
src/utils/dict.ts

@@ -229,5 +229,9 @@ export enum DICT_TYPE {
   AI_WRITE_LANGUAGE = 'ai_write_language', // AI 写作语言
 
   // ========== MUSEUMS - 地质博物馆模块  ==========
-  MUSEUMS_SPECIMEN_INFO='museums_specimen_info'
+  MUSEUMS_SPECIMEN_INFO='museums_specimen_info',//博物馆标本保存类型
+  MUSEUMS_COLLECTION_STATUS='museums_collection_status',//标本馆藏状态
+  MUSEUMS_SOURCE='museums_source',//博物馆标本来源
+  MUSEUMS_SPECIMEN_TYPE='museums_specimen_type',//博物馆标本类型
+
 }

+ 2 - 6
src/views/Login/Login.vue

@@ -7,11 +7,7 @@
       <div
         :class="`${prefixCls}__left flex-1 bg-gray-500 bg-opacity-20 relative p-30px lt-xl:hidden overflow-x-hidden overflow-y-auto`"
       >
-        <!-- 左上角的 logo + 系统标题 -->
-        <div class="relative flex items-center text-white">
-          <img alt="" class="mr-10px h-48px w-48px" src="@/assets/imgs/logo.png" />
-          <span class="text-20px font-bold">{{ underlineToHump(appStore.getTitle) }}</span>
-        </div>
+
         <!-- 左边的背景图 + 欢迎语 -->
         <div class="h-[calc(100%-60px)] flex items-center justify-center">
           <TransitionGroup
@@ -116,4 +112,4 @@ $prefix-cls: #{$namespace}-login;
     background-color: var(--login-bg-color);
   }
 }
-</style>
+</style>

+ 15 - 15
src/views/Login/components/LoginForm.vue

@@ -125,21 +125,21 @@
           </div>
         </el-form-item>
       </el-col>
-      <el-divider content-position="center">萌新必读</el-divider>
-      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
-        <el-form-item>
-          <div class="w-[100%] flex justify-between">
-            <el-link href="https://doc.iocoder.cn/" target="_blank">📚开发指南</el-link>
-            <el-link href="https://doc.iocoder.cn/video/" target="_blank">🔥视频教程</el-link>
-            <el-link href="https://www.iocoder.cn/Interview/good-collection/" target="_blank">
-              ⚡面试手册
-            </el-link>
-            <el-link href="http://static.yudao.iocoder.cn/mp/Aix9975.jpeg" target="_blank">
-              🤝外包咨询
-            </el-link>
-          </div>
-        </el-form-item>
-      </el-col>
+<!--      <el-divider content-position="center">萌新必读</el-divider>-->
+<!--      <el-col :span="24" style="padding-right: 10px; padding-left: 10px">-->
+<!--        <el-form-item>-->
+<!--          <div class="w-[100%] flex justify-between">-->
+<!--            <el-link href="https://doc.iocoder.cn/" target="_blank">📚开发指南</el-link>-->
+<!--            <el-link href="https://doc.iocoder.cn/video/" target="_blank">🔥视频教程</el-link>-->
+<!--            <el-link href="https://www.iocoder.cn/Interview/good-collection/" target="_blank">-->
+<!--              ⚡面试手册-->
+<!--            </el-link>-->
+<!--            <el-link href="http://static.yudao.iocoder.cn/mp/Aix9975.jpeg" target="_blank">-->
+<!--              🤝外包咨询-->
+<!--            </el-link>-->
+<!--          </div>-->
+<!--        </el-form-item>-->
+<!--      </el-col>-->
     </el-row>
   </el-form>
 </template>

+ 110 - 0
src/views/museums/OutboundForm/ReturnForm.vue

@@ -0,0 +1,110 @@
+<template>
+  <Dialog :title="dialogTitle" v-model="dialogVisible">
+    <el-form
+      ref="formRef"
+      :model="formData"
+      :rules="formRules"
+      label-width="100px"
+      v-loading="formLoading">
+      <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-date-picker
+          v-model="formData.returnDate"
+          type="date"
+          value-format="x"
+          placeholder="选择退还日期"
+        />
+      </el-form-item>
+      <el-form-item label="标本情况" prop="specimenCondition">
+        <el-input v-model="formData.specimenCondition" placeholder="请输入标本情况"/>
+      </el-form-item>
+    </el-form>
+
+  </Dialog>
+</template>
+
+<script setup lang="ts">
+import { SpecimenOutboundApi } from '@/api/museums/specimenoutbound'
+import {ref,reactive} from "vue"
+/** 标本出库回库信息 表单 */
+defineOptions({ name: 'ReturnForm' })
+
+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: undefined,
+specimenNumber: undefined,
+applicantName: undefined,
+applicationDate: undefined,
+applicationUsage: undefined,
+attachments: undefined,
+status: undefined,
+remarks: undefined,
+processInstanceId: undefined,
+operator: undefined,
+outgoingTime: undefined,
+returner: undefined,
+receiver: undefined,
+returnDate: undefined,
+specimenCondition: undefined,
+sampleStatus: undefined
+})
+
+const formRules = reactive({
+  operator: [{ required: true, message: '出库员不能为空', trigger: 'blur' }],
+  returner: [{ required: true, message: '退还人不能为空', trigger: 'blur' }],
+  receiver: [{ required: true, message: '点收人不能为空', trigger: 'blur' }],
+  returnDate: [{ required: true, message: '退还日期不能为空', trigger: 'blur' }]
+})
+const formRef = ref() // 表单 Ref
+
+/** 打开弹窗 */
+const open = async (type: string, id?: number) => {
+  dialogVisible.value = true
+  formType.value = type
+  resetForm()
+  if (id) {
+    formLoading.value = true
+    try {
+      formData.value = await SpecimenOutboundApi.getSpecimenOutbound(id)
+    } finally {
+      formLoading.value = false
+    }
+  }
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+/** 重置表单 */
+const resetForm = () => {
+  formData.value = {
+    id: undefined,
+    infoId: undefined,
+    chineseName: undefined,
+    specimenNumber: undefined,
+    applicantName: undefined,
+    applicationDate: undefined,
+    applicationUsage: undefined,
+    attachments: undefined,
+    status: undefined,
+    remarks: undefined,
+    processInstanceId: undefined,
+    operator: undefined,
+    outgoingTime: undefined,
+    returner: undefined,
+    receiver: undefined,
+    returnDate: undefined,
+    specimenCondition: undefined,
+    sampleStatus: undefined
+  }
+  formRef.value?.resetFields()
+}
+</script>

+ 128 - 0
src/views/museums/OutboundForm/outboundDetail.vue

@@ -0,0 +1,128 @@
+<!--<template>-->
+
+<!--  <el-row :gutter="8" justify="space-between">-->
+<!--    <el-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24">-->
+<!--      <div>-->
+<!--        <el-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24" >-->
+<!--          <el-card style="margin-bottom: 5px">-->
+
+<!--            <template #header>-->
+<!--              <div class="card-header" style="text-align: center">-->
+<!--                <h1 class="text1">标本出库申请详情</h1>-->
+<!--              </div>-->
+<!--            </template>-->
+<!--            <el-descriptions-->
+
+<!--              v-if="outboundData"-->
+<!--              :column="3"-->
+<!--              :size="small"-->
+<!--              border-->
+
+
+<!--            >-->
+<!--              <el-descriptions-item label="序号:"    label-align="right" >{{ outboundData.id }}</el-descriptions-item>-->
+<!--              <el-descriptions-item label="标本编号"    label-align="right">{{-->
+<!--                  outboundData.number-->
+<!--                }}-->
+<!--              </el-descriptions-item>-->
+<!--              <el-descriptions-item label="申请人或申请单位:" >{{-->
+<!--                  outboundData.applicantName-->
+<!--                }}-->
+<!--              </el-descriptions-item>-->
+<!--              <el-descriptions-item label="申请日期:" >{{-->
+<!--                  outboundData.applicationDate-->
+<!--                }}-->
+<!--              </el-descriptions-item>-->
+<!--              <el-descriptions-item label="申请出库的用途:" >{{-->
+<!--                  outboundData.applicationUsage-->
+<!--                }}-->
+<!--              </el-descriptions-item>-->
+<!--              <el-descriptions-item label="审批状态:" >{{-->
+<!--                  outboundData.status-->
+<!--                }}-->
+<!--              </el-descriptions-item>-->
+<!--              <el-descriptions-item label="审批员:">{{-->
+<!--                  outboundData.approveUsers-->
+<!--                }}-->
+<!--              </el-descriptions-item>-->
+<!--              <el-descriptions-item label="审批时间:">{{-->
+<!--                  outboundData.approvalTime-->
+<!--                }}-->
+<!--              </el-descriptions-item>-->
+<!--              <el-descriptions-item label="备注信息:" >{{outboundData.remarks}}-->
+<!--              </el-descriptions-item>-->
+<!--            </el-descriptions>-->
+<!--          </el-card>-->
+<!--          <el-card >-->
+<!--              <template #header>-->
+<!--                <div class="card-header" style="text-align: center">-->
+<!--                  <h1 class="text1">标本出库入库详情</h1>-->
+<!--                </div>-->
+<!--              </template>-->
+<!--            <el-descriptions-->
+<!--              v-if="outboundData"-->
+<!--              :column="3"-->
+<!--              :size="small"-->
+<!--              border-->
+<!--            >-->
+<!--              <div >-->
+<!--              <el-descriptions-item label="出库时间:">{{ outboundData.outgoingTime }}</el-descriptions-item>-->
+<!--              <el-descriptions-item label="出库员:">{{  outboundData.operator}}-->
+<!--              </el-descriptions-item>-->
+
+<!--              <el-descriptions-item label="退还日期">{{-->
+<!--                  outboundData.returnDate-->
+<!--                }}-->
+<!--              </el-descriptions-item>-->
+<!--              <el-descriptions-item label="点收人:">{{-->
+<!--                  outboundData.receiver-->
+<!--                }}-->
+<!--              </el-descriptions-item>-->
+
+
+<!--              <el-descriptions-item label="退还人">{{-->
+<!--                  outboundData.returner-->
+<!--                }}-->
+<!--              </el-descriptions-item>-->
+<!--              </div>-->
+<!--            </el-descriptions>-->
+<!--            </el-card>-->
+
+<!--        </el-col>-->
+<!--      </div>-->
+<!--    </el-col>-->
+<!--  </el-row>-->
+
+<!--</template>-->
+<!--<script setup lang="ts">-->
+<!--import {ElCol} from "element-plus";-->
+<!--import {ref} from "vue";-->
+
+<!--import {SpecimenOutboundApi} from "@/api/museums/specimenoutbound";-->
+<!--const {query} = useRoute() // 查询参数-->
+
+
+
+
+<!--let outboundData = ref(null); // 初始化响应式数据-->
+<!--const fetchData = async () => {-->
+<!--  try {-->
+<!--    console.log(query.dataId)-->
+<!--    let res: any = await SpecimenOutboundApi.getSpecimenOutbound(query.dataId)-->
+<!--    console.log(res)-->
+<!--    outboundData.value = res-->
+<!--    console.log(outboundData.value)-->
+<!--  }  finally {-->
+<!--  }-->
+<!--}-->
+
+<!--// // 在组件加载时获取数据-->
+<!--onMounted(async () => {-->
+<!--  await fetchData()-->
+<!--})-->
+
+<!--</script>-->
+
+<!--<style scoped>-->
+
+<!--</style>-->

+ 81 - 32
src/views/museums/photogroup/ImageImportForm .vue

@@ -1,51 +1,90 @@
 <template>
-  <Dialog v-model="dialogVisible" title="标本图片批量导入" width="500">
-    <el-upload
-      ref="uploadRef"
-      v-model:file-list="fileList"
-      drag
-      :action="importUrl + '?updateSupport=' + updateSupport"
-      :on-success="submitFormSuccess"
-      style="max-width:250px;max-height: 30vh;margin-left: 20px"
-      :auto-upload="false"
-      :disabled="formLoading"
-      :limit="1"
-      :on-error="submitFormError"
-      :http-request="httpRequest"
+<!--  <Dialog v-model="dialogVisible" title="标本图片批量导入" width="500">-->
+  <Dialog :title="dialogTitle" v-model="dialogVisible">
+    <el-form
+      ref="formRef"
+      :model="formData"
+      :rules="formRules"
+      label-width="100px"
     >
-      <el-icon class="el-icon--upload"><upload-filled /></el-icon>
-      <div class="el-upload__text">
-        <em>点击批量上传图片</em>
-        <span>仅允许导入jpg、png、gif 格式文件。</span>
-      </div>
-      <template #tip>
-        <div class="el-upload__tip">
-          <el-checkbox v-model="updateSupport" />
-          是否更新已经存在的标本图片
-        </div>
-      </template>
-    </el-upload>
+      <el-form-item label="照片组名称" prop="groupName">
+        <el-input v-model="formData.groupName" placeholder="请输入照片组名称" />
+      </el-form-item>
+      <el-form-item label="照片组时间" prop="groupDate">
+        <el-date-picker
+          v-model="formData.groupDate"
+          type="date"
+          value-format="x"
+          placeholder="选择照片组时间"
+        />
+      </el-form-item>
+
+      <el-form-item label="照片组简介" prop="groupDescription">
+        <Editor v-model="formData.groupDescription" height="150px" />
+      </el-form-item>
+      <el-form-item label="照片组上传" prop="uploadPhotos">
+          <el-upload
+            ref="uploadRef"
+            v-model:file-list="fileList"
+            :action="importUrl + '?updateSupport=' + updateSupport + '&groupName=' + formData.groupName + '&groupDescription=' + formData.groupDescription"
+            :auto-upload="false"
+            :disabled="formLoading"
+            :headers="uploadHeaders"
+            :limit="1"
+            :on-error="submitFormError"
+            :on-success="submitFormSuccess"
+            accept=".zip"
+            drag
+          >
+            <Icon icon="ep:upload" />
+            <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+            <template #tip>
+              <div class="el-upload__tip text-center">
+                <div class="el-upload__tip">
+                  <el-checkbox v-model="updateSupport" />
+                  是否更新已经存在的用户数据
+                </div>
+                <span>仅允许导入 zip格式文件。</span>
+              </div>
+            </template>
+          </el-upload>
+      </el-form-item>
+    </el-form>
     <template #footer >
       <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
       <el-button @click="dialogVisible = false">取 消</el-button>
-
-</template>
-</Dialog>
+    </template>
+  </Dialog>
 </template>
 
 
 <script lang="ts" setup>
-import {UploadFilled} from "@element-plus/icons-vue";
-import {useUpload} from "@/components/UploadFile/src/useUpload";
+import { useUpload } from "@/components/UploadFile/src/useUpload";
+import { getAccessToken } from "@/utils/auth";
 const importUrl =
   import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + '/photosmanage/photo-group/createe'
 defineOptions({ name: 'imageImportForm' })
 const dialogVisible = ref(false) // 弹窗的是否展示
+const dialogTitle = ref('') // 弹窗的标题
 const formLoading = ref(false) // 表单的加载中
 const uploadRef = ref()
 const message = useMessage() // 消息弹窗
 const updateSupport = ref(0) // 是否更新已经存在的用户数据
 const fileList = ref([]) // 文件列表
+
+const formData = ref({
+  id: undefined,
+  groupName: undefined,
+  groupDate: undefined,
+  groupDescription: undefined,
+
+  uploadPhotos: undefined
+})
+const formRules = reactive({
+  groupName: [{ required: true, message: '照片组名称不能为空', trigger: 'blur' }],
+
+})
+const formRef = ref() // 表单 Ref
 /** 打开弹窗 */
 const open = () => {
   dialogVisible.value = true
@@ -54,7 +93,7 @@ const open = () => {
   resetForm()
 }
 defineExpose({ open }) // 提供 open 方法,用于打开弹窗
-const {  httpRequest } = useUpload()
+//const {  httpRequest } = useUpload()
 
 /** 图片上传成功 */
 
@@ -76,6 +115,7 @@ const submitFormError = (): void => {
   message.error('上传失败,请您重新上传!')
   formLoading.value = false
 }
+const uploadHeaders = ref() // 上传 Header 头
 
 /** 提交表单 */
 const submitForm = async () => {
@@ -83,13 +123,22 @@ const submitForm = async () => {
     message.error('请上传文件')
     return
   }
-
+  uploadHeaders.value = {
+    Authorization: 'Bearer ' + getAccessToken(),
+  }
   formLoading.value = true
   uploadRef.value!.submit()
 }
 
 /** 重置表单 */
 const resetForm = async (): Promise<void> => {
+  formData.value = {
+    id: undefined,
+    groupName: undefined,
+    groupDate: undefined,
+    groupDescription: undefined,
+    uploadPhotos: undefined
+  }
   // 重置上传状态和文件
   formLoading.value = false
   await nextTick()

+ 13 - 67
src/views/museums/photogroup/PhotoGroupForm.vue

@@ -21,68 +21,37 @@
       <el-form-item label="照片组简介" prop="groupDescription">
         <Editor v-model="formData.groupDescription" height="150px" />
       </el-form-item>
-      <el-form-item label="创建时间" prop="createdAt">
-        <el-date-picker
-          v-model="formData.createdAt"
-          type="date"
-          value-format="x"
-          placeholder="选择创建时间"
-        />
-      </el-form-item>
+<!--      <el-form-item label="创建时间" prop="createdAt">-->
+<!--        <el-date-picker-->
+<!--          v-model="formData.createdAt"-->
+<!--          type="date"-->
+<!--          value-format="x"-->
+<!--          placeholder="选择创建时间"-->
+<!--        />-->
+<!--      </el-form-item>-->
       <el-form-item label="照片组上传" prop="uploadPhotos">
-<!--        <UploadFile v-model="formData.uploadPhotos" />-->
-        <el-upload
-          ref="uploadRef"
-          v-model:file-list="fileList"
-          drag
-          :action="importUrl + '?updateSupport=' + updateSupport"
-          :on-success="submitFormSuccess"
-          style="max-width:250px;max-height: 30vh;margin-left: 20px"
-          :auto-upload="false"
-          :disabled="formLoading"
-          :limit="1"
-          :on-error="submitFormError"
-          :http-request="httpRequest"
-        >
-        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
-        <div class="el-upload__text">
-          <em>请上传图片压缩包</em>
-          <span>仅允许导入jpg、png、gif 格式文件。</span>
-        </div>
-        <template #tip>
-          <div class="el-upload__tip">
-            <el-checkbox v-model="updateSupport" />
-            是否更新已经存在的标本图片
-          </div>
-        </template>
-        </el-upload>
+        <UploadFile v-model="formData.uploadPhotos" />
       </el-form-item>
     </el-form>
     <template #footer>
-<!--      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>-->
-      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
       <el-button @click="dialogVisible = false">取 消</el-button>
     </template>
   </Dialog>
 </template>
 <script setup lang="ts">
 import { PhotoGroupApi, PhotoGroupVO } from '@/api/museums/photogroup'
-import {UploadFilled} from "@element-plus/icons-vue";
-import {useUpload} from "@/components/UploadFile/src/useUpload";
-const importUrl =
-  import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + '/photosmanage/photo-group/createe'
 
 /** 博物馆照片组 表单 */
 defineOptions({ name: 'PhotoGroupForm' })
 
 const { t } = useI18n() // 国际化
 const message = useMessage() // 消息弹窗
-const fileList = ref([]) // 文件列表
+
 const dialogVisible = ref(false) // 弹窗的是否展示
 const dialogTitle = ref('') // 弹窗的标题
 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
 const formType = ref('') // 表单的类型:create - 新增;update - 修改
-const updateSupport = ref(0) // 是否更新已经存在的用户数据
 const formData = ref({
   id: undefined,
   groupName: undefined,
@@ -114,7 +83,7 @@ const open = async (type: string, id?: number) => {
   }
 }
 defineExpose({ open }) // 提供 open 方法,用于打开弹窗
-const {  httpRequest } = useUpload()
+
 /** 提交表单 */
 const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
 const submitForm = async () => {
@@ -136,10 +105,10 @@ const submitForm = async () => {
     emit('success')
   } finally {
     formLoading.value = false
+
   }
 }
 
-
 /** 重置表单 */
 const resetForm = () => {
   formData.value = {
@@ -152,27 +121,4 @@ const resetForm = () => {
   }
   formRef.value?.resetFields()
 }
-
-
-/** 图片上传成功 */
-
-const submitFormSuccess = (response: any) => {
-  console.log('tj',response)
-  if (response.code !== 0) {
-    message.error(response.msg)
-    formLoading.value = false
-    return
-  }
-  formLoading.value = false
-  dialogVisible.value = false
-  // 发送操作成功的事件
-
-}
-
-/** 上传错误提示 */
-const submitFormError = (): void => {
-  message.error('上传失败,请您重新上传!')
-  formLoading.value = false
-}
-
 </script>

+ 9 - 9
src/views/museums/photogroup/index.vue

@@ -56,7 +56,7 @@
         <el-button
           type="primary"
           plain
-          @click="openForm('create')"
+          @click="handleImport "
           v-hasPermi="['museums:photo-group:create']"
         >
           <Icon icon="ep:plus" class="mr-5px" /> 新增
@@ -156,7 +156,7 @@
 
   <!-- 表单弹窗:添加/修改 -->
   <PhotoGroupForm ref="formRef" @success="getList" />
-<!--  <ImageImportForm ref="importFormRef" @success="getList" />-->
+  <ImageImportForm ref="importFormRef" @success="getList" />
 </template>
 
 <script setup lang="ts">
@@ -164,7 +164,7 @@ import { dateFormatter } from '@/utils/formatTime'
 import download from '@/utils/download'
 import { PhotoGroupApi, PhotoGroupVO } from '@/api/museums/photogroup'
 import PhotoGroupForm from './PhotoGroupForm.vue'
-// import ImageImportForm from './ImageImportForm .vue'
+import ImageImportForm from './ImageImportForm .vue'
 /** 博物馆照片组 列表 */
 defineOptions({ name: 'PhotoGroup' })
 
@@ -232,12 +232,12 @@ const handleDelete = async (id: number) => {
   } catch {}
 }
 
-// /** 批量图片导入 */
-// const importFormRef = ref()
-// const handleImport = () => {
-//   importFormRef.value.open()
-//
-// }
+/** 批量图片导入 */
+const importFormRef = ref()
+const handleImport = () => {
+  importFormRef.value.open()
+
+}
 
 /** 导出按钮操作 */
 const handleExport = async () => {

+ 6 - 3
src/views/museums/photos/index.vue

@@ -77,12 +77,15 @@
   <ContentWrap>
     <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
       <el-table-column label="序号" align="center" prop="id" />
-      <el-table-column label="照片id" align="center" prop="groupId" />
+<!--      <el-table-column label="照片id" align="center" prop="groupId" />-->
       <el-table-column label="照片" align="center" prop="photoUrl" >
         <template #default="{ row }">
           <el-image
             lazy
+            class="h-80px w-80px"
             :src="row.photoUrl"
+            :preview-src-list="[row.photoUrl]"
+            preview-teleported
             :zoom-rate="1.2"
             :max-scale="7"
             :min-scale="0.2"
@@ -91,7 +94,7 @@
           />
         </template>
       </el-table-column>
-      <el-table-column label="照片" align="center" prop="url" width="110px">
+<!--      <el-table-column label="照片" align="center" prop="url" width="110px">-->
 <!--&lt;!&ndash;        #default="{ row }"->-->
 <!--          <el-image-->
 <!--&lt;!&ndash;            v-if="scope.row.photoUrl"&ndash;&gt;-->
@@ -114,7 +117,7 @@
 <!--          >下载</el-link-->
 <!--          >-->
 <!--        </template>-->
-      </el-table-column>
+<!--      </el-table-column>-->
       <el-table-column
         label="上传时间"
         align="center"

+ 22 - 5
src/views/museums/specimeninfo/SpecimenImportForm.vue

@@ -11,6 +11,7 @@
       :on-error="submitFormError"
       :on-exceed="handleExceed"
       :on-success="submitFormSuccess"
+
       accept=".xlsx, .xls"
       drag
     >
@@ -39,13 +40,14 @@
       ref="uploadimageRef"
       v-model:file-list="imageList"
       drag
-      :action="importImageUrl + '?updateSupport=' + updateSupport"
+      :action="importUrl + '?updateSupport=' + updateSupport"
       :on-success="submitImageSuccess"
       :auto-upload="false"
       :disabled="formLoading"
       :limit="1"
       :on-error="submitFormError"
       :http-request="httpRequest"
+
     >
       <el-icon class="el-icon--upload" ><upload-filled /></el-icon>
       <div class="el-upload__text">
@@ -85,9 +87,9 @@ const fileList = ref([]) // 文件列表
 const imageList = ref([])
 const uploadHeaders = ref() // 上传 Header 头
 const importUrl =
-  import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + '/museums/specimen-info/import-specimen'
-const importImageUrl =
-  import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + '/museums/specimen-info/import-specimen-images'
+  import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + '/museums/specimen-info/import-specimen-with-images'
+// const importImageUrl =
+//   import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + '/museums/specimen-info/import-specimen-images'
 /** 打开弹窗 */
 const open = () => {
   dialogVisible.value = true
@@ -143,7 +145,22 @@ const submitFormSuccess = (response: any) => {
   // 发送操作成功的事件
   emits('success')
 }
-
+// ///文件反馈上传
+//
+// const handleExceed = () => {
+//   message.error('最多只能上传一个文件,支持修改代码文件和压缩包分开上传!')
+// }
+//
+// const beforeUpload = (file: File) => {
+//   // 在这里添加文件类型检查逻辑
+//   // 例如,检查文件扩展名是否为 .zip 或 .txt
+//   const fileExtension = file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase();
+//   if (fileExtension !== 'zip' && fileExtension !== 'txt') {
+//     message.error('只支持上传.zip或.txt文件!');
+//     return false;
+//   }
+//   return true;
+// }
 /** 上传错误提示 */
 const submitFormError = (): void => {
   message.error('上传失败,请您重新上传!')

+ 3 - 3
src/views/museums/specimeninfo/SpecimenInfoForm.vue

@@ -11,7 +11,7 @@
         <el-select v-model="formData.specimenType"
                    placeholder="请选择标本类型(矿物、岩石矿石、化石、陨石)">
           <el-option
-            v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_SPECIMEN_INFO)"
+            v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_SPECIMEN_TYPE)"
             :key="dict.value"
             :label="dict.label"
             :value="dict.value"
@@ -87,7 +87,7 @@
       <el-form-item label="来源" prop="source">
         <el-select v-model="formData.source" placeholder="请选择来源(采购、捐赠、采集)">
           <el-option
-            v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_SPECIMEN_INFO)"
+            v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_SOURCE)"
             :key="dict.value"
             :label="dict.label"
             :value="dict.value"
@@ -114,7 +114,7 @@
       <el-form-item label="馆藏状态" prop="collectionStatus">
         <el-radio-group v-model="formData.collectionStatus">
           <el-radio
-            v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_SPECIMEN_INFO)"
+            v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_COLLECTION_STATUS)"
             :key="dict.value"
             :label="dict.value"
           >

+ 13 - 13
src/views/museums/specimeninfo/index.vue

@@ -36,7 +36,7 @@
           class="!w-240px"
         >
           <el-option
-            v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_SPECIMEN_INFO)"
+            v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_SPECIMEN_TYPE)"
             :key="dict.value"
             :label="dict.label"
             :value="dict.value"
@@ -188,7 +188,7 @@
           class="!w-240px"
         >
           <el-option
-            v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_SPECIMEN_INFO)"
+            v-for="dict in getIntDictOptions(DICT_TYPE. MUSEUMS_SOURCE)"
             :key="dict.value"
             :label="dict.label"
             :value="dict.value"
@@ -347,7 +347,7 @@
       <el-table-column label="标本编号" align="center" prop="specimenNumber" />
       <el-table-column label="标本类型" align="center" prop="specimenType">
         <template #default="scope">
-          <dict-tag :type="DICT_TYPE.MUSEUMS_SPECIMEN_INFO" :value="scope.row.specimenType" />
+          <dict-tag :type="DICT_TYPE.MUSEUMS_SPECIMEN_TYPE" :value="scope.row.specimenType" />
         </template>
       </el-table-column>
 <!--      <el-table-column label="资产号" align="center" prop="assetNumber" />-->
@@ -371,7 +371,7 @@
       <el-table-column label="重量(g)" align="center" prop="weight" />
       <el-table-column label="来源" align="center" prop="source">
         <template #default="scope">
-          <dict-tag :type="DICT_TYPE.MUSEUMS_SPECIMEN_INFO" :value="scope.row.source" />
+          <dict-tag :type="DICT_TYPE.MUSEUMS_SOURCE" :value="scope.row.source" />
         </template>
       </el-table-column>
 <!--      <el-table-column label="标本提供者(供应商、捐赠人、采集人)" align="center" prop="provider" />-->
@@ -380,7 +380,7 @@
 <!--      <el-table-column label="描述" align="center" prop="description" />-->
       <el-table-column label="馆藏状态" align="center" prop="collectionStatus">
         <template #default="scope">
-          <dict-tag :type="DICT_TYPE.MUSEUMS_SPECIMEN_INFO" :value="scope.row.collectionStatus" />
+          <dict-tag :type="DICT_TYPE.MUSEUMS_COLLECTION_STATUS" :value="scope.row.collectionStatus" />
         </template>
       </el-table-column>
 <!--      <el-table-column label="备注" align="center" prop="notes" />-->
@@ -402,13 +402,13 @@
 <!--      <el-table-column label="创建时间" align="center" prop="createTime" />-->
 <!--      <el-table-column label="注销原因" align="center" prop="deletedReason" />-->
 <!--      <el-table-column label="入库操作员" align="center" prop="operator" />-->
-      <el-table-column
-        label="入库时间"
-        align="center"
-        prop="entryDate"
-        :formatter="dateFormatter"
-        width="180px"
-      />
+<!--      <el-table-column-->
+<!--        label="入库时间"-->
+<!--        align="center"-->
+<!--        prop="entryDate"-->
+<!--        :formatter="dateFormatter"-->
+<!--        width="180px"-->
+<!--      />-->
 
       <el-table-column label="操作" align="center" min-width="150px" >
         <template #default="scope">
@@ -587,7 +587,7 @@ import UserImportForm from "@/views/system/user/UserImportForm.vue";
 const router = useRouter();
 const viewDetails=(dataId: number) => {
   router.push({
-    name: 'Details',
+    name: 'specimenDetails',
     query: {
       dataId: dataId,
     }

+ 410 - 0
src/views/museums/specimeninfo/specimenDetails.vue

@@ -0,0 +1,410 @@
+<template>
+
+
+
+  <el-row :gutter="8" justify="space-between">
+    <el-col :xl="16" :lg="16" :md="24" :sm="24" :xs="24">
+      <div>
+        <el-row>
+          <el-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24" style="margin-outside: 0px">
+            <el-card style="margin-bottom: 5px">
+              <template #header>
+                <div class="card-header" style="text-align: center">
+                  <h1 class="text1">标本基本信息</h1>
+                </div>
+              </template>
+              <el-descriptions
+                v-if="specimenData"
+                :column="2"
+                :size="size"
+                border
+              >
+                <el-descriptions-item label="序号:" label-align="right">{{ specimenData.id }}</el-descriptions-item>
+
+                <el-descriptions-item label="标本类型:" label-align="right" >{{ specimenTypeText }}
+                </el-descriptions-item>
+                <el-descriptions-item label="标本编号:" label-align="right">{{
+                    specimenData.specimenNumber
+                  }}
+                </el-descriptions-item>
+                <el-descriptions-item label="资产号:" label-align="right">{{
+                    specimenData.assetNumber
+                  }}
+                </el-descriptions-item>
+                <el-descriptions-item label="存放位置:" label-align="right">{{
+                    specimenData.storageLocation
+                  }}
+                </el-descriptions-item>
+                <el-descriptions-item label="中文名称:" label-align="right">{{
+                    specimenData.chineseName
+                  }}
+                </el-descriptions-item>
+                <el-descriptions-item label="英文名称:" label-align="right">{{
+                    specimenData.englishName
+                  }}
+                </el-descriptions-item>
+              </el-descriptions>
+
+            </el-card>
+
+            <el-card style="margin-bottom: 5px">
+              <template #header>
+                <div class="card-header" style="text-align: center;">
+                  <h1 class="text1">标本特征</h1>
+                </div>
+              </template>
+              <el-descriptions
+                v-if="specimenData"
+                :column="2"
+                :size="size"
+                border
+              >
+                <el-descriptions-item label="成分:"  label-align="right">{{
+                    specimenData.composition
+                  }}
+                </el-descriptions-item>
+                <el-descriptions-item label="产地:" label-align="right">{{
+                    specimenData.origin
+                  }}
+                </el-descriptions-item>
+                <el-descriptions-item label="时代:" label-align="right">{{ specimenData.era }}</el-descriptions-item>
+                <el-descriptions-item label="保存地层:" label-width="100px" label-align="right">{{
+                    specimenData.discoveryTime
+                  }}
+                </el-descriptions-item>
+                <el-descriptions-item label="陨石类型:" label-width="100px" label-align="right">{{ specimenData.meteoriteType }}
+                </el-descriptions-item>
+                <el-descriptions-item label="国际命名:" label-width="100px" label-align="right">{{
+                    specimenData.internationalName
+                  }}
+                </el-descriptions-item>
+                <el-descriptions-item label="重量(g):" label-width="100px" label-align="right">{{
+                    specimenData.weight
+                  }}
+                </el-descriptions-item>
+              </el-descriptions>
+            </el-card>
+            <el-card style="margin-bottom: 5px">
+              <template #header>
+                <div class="card-header" style="text-align: center">
+                  <h1 class="text1">标本保存与来源</h1>
+                </div>
+              </template>
+              <el-descriptions
+
+                v-if="specimenData"
+                :column="2"
+                :size="size"
+                border
+              >
+                <el-descriptions-item label="保存类型">{{ preservationTypeText }}
+                </el-descriptions-item>
+                <el-descriptions-item label="来源">{{ sourceText }}</el-descriptions-item>
+                <el-descriptions-item label="标本提供者">{{
+                    specimenData.provider
+                  }}
+                </el-descriptions-item>
+                <el-descriptions-item label="发现时间">{{
+                    specimenData.discoveryTime
+                  }}
+                </el-descriptions-item>
+                <el-descriptions-item label="降落时间">{{
+                    specimenData.fallTime
+                  }}
+                </el-descriptions-item>
+              </el-descriptions>
+            </el-card>
+            <el-card style="margin-bottom: 5px">
+              <template #header>
+                <div class="card-header" style="text-align: center">
+                  <h1 class="text1" style="">标本用途与状态</h1>
+                </div>
+              </template>
+              <el-descriptions
+
+                v-if="specimenData"
+                :column="2"
+                :size="size"
+                border
+              >
+                <el-descriptions-item label="入馆时间">{{
+                    specimenData.acquisitionTime
+                  }}
+                </el-descriptions-item>
+                <el-descriptions-item label="描述">{{
+                    specimenData.description
+                  }}
+                </el-descriptions-item>
+                <el-descriptions-item label="用途">{{
+                    specimenData.purpose
+                  }}
+                </el-descriptions-item>
+                <el-descriptions-item label="备注">{{
+                    specimenData.notes
+                  }}
+                </el-descriptions-item>
+              </el-descriptions>
+            </el-card>
+          </el-col>
+
+        </el-row>
+
+      </div>
+    </el-col>
+    <el-col :xl="8" :lg="8" :md="24" :sm="24" :xs="24" class="mb-8px">
+      <el-card>
+        <template #header>
+          <div class="card-header" style="text-align: center">
+            <h1>标本图片</h1>
+          </div>
+        </template>
+        <el-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24" class="mb-8px">
+          <div class="demo-image__preview" v-if="specimenData ">
+            <el-image
+              style=" align-items: center"
+              :src="url"
+              :zoom-rate="1.2"
+              :max-scale="7"
+              :min-scale="0.2"
+              :preview-src-list="srcList"
+              :initial-index="4"
+              fit="cover"
+            />
+          </div>
+
+          <div>
+            <el-space style="margin-top: 10px">
+              <div class="demo-image__preview" v-for="(url, index) in srcList"
+                   :key="index">
+                <el-image
+                  style="width: 50px; height: 40px"
+                  :src="url"
+                  :zoom-rate="1.2"
+                  :max-scale="7"
+                  :min-scale="0.2"
+                  :preview-src-list="srcList"
+                  :initial-index="4"
+                  fit="cover"
+                />
+              </div>
+      </el-space>
+          </div>
+        </el-col>
+
+      </el-card>
+      <el-card style="margin-top: 10px">
+        <template #header>
+          <div class="card-header" >
+            <h1 class="text1" style="margin-bottom: 10px">馆藏状态</h1>
+            <span v-if="specimenRecord">{{collectionStatusText}}</span>
+          </div>
+        </template>
+        <el-scrollbar height="600px">
+          <el-timeline style="max-width: 600px;margin-left: 15px" >
+            <el-timeline-item
+              v-for="(item, index) in specimenData"
+              :key="index"
+              :timestamp="item.outgoingTime"
+              placement="top">
+              <el-card>
+                <p>{{  }}</p>
+                <p>状态:{{  }}</p>
+                <p>申请人或单位:{{item.applicantName }}</p>
+                <p>用途:{{item.applicationUsage}}</p>
+                <p>审批员:{{item.approveUsers}}</p>
+                <p>审批时间:{{}}</p>
+                <p>出库员:{{ item.operator }}</p>
+              </el-card>
+            </el-timeline-item>
+            <el-timeline-item
+              v-for="(item, index) in specimenData"
+              :key="index"
+              :timestamp="item.acquisitionTime"
+              placement="top">
+              <el-card>
+                <p>回库</p>
+                <p>退还人:{{ item.operator }}</p>
+                <p>点收人:{{item.applicationUsage}}</p>
+                <p>退还日期:{{item.approveUsers}}</p>
+                <p>标本情况:{{}}</p>
+              </el-card>
+            </el-timeline-item>
+
+          </el-timeline>
+        </el-scrollbar>
+      </el-card>
+
+    </el-col>
+  </el-row>
+
+
+
+
+
+</template>
+
+<script setup lang="ts">
+
+import {ref, onMounted, computed} from "vue";
+import {useRouter} from 'vue-router';
+import  {SpecimenInfoApi} from "@/api/museums/specimeninfo";
+import {ElCol, ElImage} from 'element-plus';
+
+const router = useRouter() // 路由
+const {query} = useRoute() // 查询参数
+import type {ComponentSize} from 'element-plus'
+
+
+const size = ref<ComponentSize>('large')
+
+
+
+const url = ref()
+const srcList = ref([])
+
+
+
+
+let specimenData = ref(null); // 初始化响应式数据
+const fetchData = async () => {
+  try {
+    console.log(query.dataId)
+    let res: any = await SpecimenInfoApi.getSpecimenInfo(query.dataId)
+    console.log(res)
+    specimenData.value = res
+    console.log('tj',specimenData.value)
+    srcList.value = specimenData.value.imagePath.split(',')
+    url.value = srcList.value[0]
+    console.log('tj',srcList.value)
+  }  finally {
+  }
+}
+
+// // 在组件加载时获取数据
+onMounted(async () => {
+  console.log(1)
+  await fetchData()
+  await fetchRecord()
+
+})
+
+
+/**标本类型**/
+const specimenTypeText = computed(() => {
+  if (specimenData.value === null) {
+    return '';
+  }
+  switch (specimenData.value.specimenType) {
+    case 0:
+      return '矿物';
+    case 1:
+      return '岩石矿石';
+    case 2:
+      return '化石';
+    case 3:
+      return '陨石';
+    default:
+      return '';
+  }
+});
+/**保存类型**/
+const preservationTypeText = computed(() => {
+  if (specimenData.value === null) {
+    return '';
+  }
+  switch (specimenData.value.preservationType) {
+    case 0:
+      return '标本';
+    case 1:
+      return '光片';
+    case 2:
+      return '薄片模型';
+    default:
+      return '';
+  }
+});
+/**来源**/
+const collectionStatusText = computed(() => {
+  if (specimenData.value === null) {
+    return '';
+  }
+  switch (specimenData.value.collectionStatus) {
+    case 0:
+      return '在馆';
+    case 1:
+      return '借出';
+    default:
+      return '';
+  }
+});
+/**馆藏状态(在馆、借出)**/
+const sourceText = computed(() => {
+  if (specimenData.value === null) {
+    return '';
+  }
+  switch (specimenData.value.source) {
+    case 0:
+      return '采购';
+    case 1:
+      return '捐赠';
+    case 2:
+      return '采集';
+    default:
+      return '';
+  }
+});
+
+
+</script>
+
+<style scoped lang="scss">
+.demo-image__error .image-slot {
+  font-size: 30px;
+}
+
+.demo-image__error .image-slot .el-icon {
+  font-size: 30px;
+}
+
+.demo-image__error .el-image {
+  width: 100%;
+  height: 200px;
+
+}
+
+.text1 {
+  font-weight: bold;
+  color: #0f2438;
+}
+
+.label {
+  display: inline-block;
+  text-align: right;
+  width: 100px;
+  font-weight: bold;
+  color: black;
+}
+
+
+.scrollbar-imag-item {
+  flex-shrink: 0;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 100px;
+  height: 50px;
+  margin: 10px;
+  text-align: center;
+  background: var(--el-color-danger-light-9);
+  color: var(--el-color-danger);
+}
+.label-width .el-descriptions-item__label  {
+  width: 90px;
+  flex: 1;
+}
+.el-descriptions-item {
+  margin-bottom: 20px;
+  margin-top: 20px;
+}
+
+</style>

+ 3 - 3
src/views/museums/specimenoutbound/OutboundApplication.vue

@@ -74,7 +74,7 @@
         @click="openForm('create')"
         v-hasPermi="['museums:specimen-outbound:create']"
       >
-        <Icon icon="ep:plus" class="mr-5px" /> 新增
+        <Icon icon="ep:plus" class="mr-5px" /> 新增申请出库
       </el-button>
       <el-button
         type="success"
@@ -131,7 +131,7 @@
             @click="openForm('update', scope.row.id)"
             v-hasPermi="['museums:specimen-outbound:update']"
           >
-            编辑
+          编辑
           </el-button>
           <el-button
             link
@@ -153,7 +153,7 @@
     />
   </ContentWrap>
 
-  <!-- 表单弹窗:添加/修改 -->
+  <!-- 表单弹窗:审批 -->
   <SpecimenOutboundForm ref="formRef" @success="getList" />
   <Approval ref="ApprovalRef" @success="getList" />
 </template>

+ 56 - 0
src/views/museums/specimenoutbound/OutboundForm/OutboundForm.vue

@@ -0,0 +1,56 @@
+<template>
+  <Dialog :title="dialogTitle" v-model="dialogVisible">
+
+    <template #footer>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+
+<script setup lang="ts">
+
+
+const dialogVisible = ref(false) // 弹窗的是否展示
+const formData = ref({
+  id: undefined,
+  infoId: undefined,
+  chineseName: undefined,
+  specimenNumber: undefined,
+  applicantName: undefined,
+  applicationDate: undefined,
+  applicationUsage: undefined,
+  attachments: undefined,
+  status: undefined,
+  remarks: undefined,
+  processInstanceId: undefined,
+  operator: undefined,
+  outgoingTime: undefined,
+  returner: undefined,
+  receiver: undefined,
+  returnDate: undefined,
+  specimenCondition: undefined,
+  sampleStatus: undefined
+})
+
+
+
+/** 打开弹窗 */
+const open = async (type: string, id?: number) => {
+  dialogVisible.value = true
+  dialogTitle.value = t('action.' + type)
+  formType.value = type
+  resetForm()
+  // 修改时,设置数据
+  if (id) {
+    formLoading.value = true
+    try {
+      formData.value = await SpecimenOutboundApi.getSpecimenOutbound(id)
+    } finally {
+      formLoading.value = false
+    }
+  }
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+</script>

+ 110 - 0
src/views/museums/specimenoutbound/OutboundForm/ReturnForm.vue

@@ -0,0 +1,110 @@
+<template>
+  <Dialog :title="dialogTitle" v-model="dialogVisible">
+    <el-form
+      ref="formRef"
+      :model="formData"
+      :rules="formRules"
+      label-width="100px"
+      v-loading="formLoading">
+      <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-date-picker
+          v-model="formData.returnDate"
+          type="date"
+          value-format="x"
+          placeholder="选择退还日期"
+        />
+      </el-form-item>
+      <el-form-item label="标本情况" prop="specimenCondition">
+        <el-input v-model="formData.specimenCondition" placeholder="请输入标本情况"/>
+      </el-form-item>
+    </el-form>
+
+  </Dialog>
+</template>
+
+<script setup lang="ts">
+import { SpecimenOutboundApi } from '@/api/museums/specimenoutbound'
+import {ref,reactive} from "vue"
+/** 标本出库回库信息 表单 */
+defineOptions({ name: 'ReturnForm' })
+
+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: undefined,
+specimenNumber: undefined,
+applicantName: undefined,
+applicationDate: undefined,
+applicationUsage: undefined,
+attachments: undefined,
+status: undefined,
+remarks: undefined,
+processInstanceId: undefined,
+operator: undefined,
+outgoingTime: undefined,
+returner: undefined,
+receiver: undefined,
+returnDate: undefined,
+specimenCondition: undefined,
+sampleStatus: undefined
+})
+
+const formRules = reactive({
+  operator: [{ required: true, message: '出库员不能为空', trigger: 'blur' }],
+  returner: [{ required: true, message: '退还人不能为空', trigger: 'blur' }],
+  receiver: [{ required: true, message: '点收人不能为空', trigger: 'blur' }],
+  returnDate: [{ required: true, message: '退还日期不能为空', trigger: 'blur' }]
+})
+const formRef = ref() // 表单 Ref
+
+/** 打开弹窗 */
+const open = async (type: string, id?: number) => {
+  dialogVisible.value = true
+  formType.value = type
+  resetForm()
+  if (id) {
+    formLoading.value = true
+    try {
+      formData.value = await SpecimenOutboundApi.getSpecimenOutbound(id)
+    } finally {
+      formLoading.value = false
+    }
+  }
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+/** 重置表单 */
+const resetForm = () => {
+  formData.value = {
+    id: undefined,
+    infoId: undefined,
+    chineseName: undefined,
+    specimenNumber: undefined,
+    applicantName: undefined,
+    applicationDate: undefined,
+    applicationUsage: undefined,
+    attachments: undefined,
+    status: undefined,
+    remarks: undefined,
+    processInstanceId: undefined,
+    operator: undefined,
+    outgoingTime: undefined,
+    returner: undefined,
+    receiver: undefined,
+    returnDate: undefined,
+    specimenCondition: undefined,
+    sampleStatus: undefined
+  }
+  formRef.value?.resetFields()
+}
+</script>

+ 128 - 0
src/views/museums/specimenoutbound/OutboundForm/outboundDetail.vue

@@ -0,0 +1,128 @@
+<template>
+
+  <el-row :gutter="8" justify="space-between">
+    <el-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24">
+      <div>
+        <el-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24" >
+          <el-card style="margin-bottom: 5px">
+
+            <template #header>
+              <div class="card-header" style="text-align: center">
+                <h1 class="text1">标本出库申请详情</h1>
+              </div>
+            </template>
+            <el-descriptions
+
+              v-if="outboundData"
+              :column="3"
+              :size="small"
+              border
+
+
+            >
+              <el-descriptions-item label="序号:"    label-align="right" >{{ outboundData.id }}</el-descriptions-item>
+              <el-descriptions-item label="标本编号"    label-align="right">{{
+                  outboundData.number
+                }}
+              </el-descriptions-item>
+              <el-descriptions-item label="申请人或申请单位:" >{{
+                  outboundData.applicantName
+                }}
+              </el-descriptions-item>
+              <el-descriptions-item label="申请日期:" >{{
+                  outboundData.applicationDate
+                }}
+              </el-descriptions-item>
+              <el-descriptions-item label="申请出库的用途:" >{{
+                  outboundData.applicationUsage
+                }}
+              </el-descriptions-item>
+              <el-descriptions-item label="审批状态:" >{{
+                  outboundData.status
+                }}
+              </el-descriptions-item>
+              <el-descriptions-item label="审批员:">{{
+                  outboundData.approveUsers
+                }}
+              </el-descriptions-item>
+              <el-descriptions-item label="审批时间:">{{
+                  outboundData.approvalTime
+                }}
+              </el-descriptions-item>
+              <el-descriptions-item label="备注信息:" >{{outboundData.remarks}}
+              </el-descriptions-item>
+            </el-descriptions>
+          </el-card>
+          <el-card >
+              <template #header>
+                <div class="card-header" style="text-align: center">
+                  <h1 class="text1">标本出库入库详情</h1>
+                </div>
+              </template>
+            <el-descriptions
+              v-if="outboundData"
+              :column="3"
+              :size="small"
+              border
+            >
+              <div >
+              <el-descriptions-item label="出库时间:">{{ outboundData.outgoingTime }}</el-descriptions-item>
+              <el-descriptions-item label="出库员:">{{  outboundData.operator}}
+              </el-descriptions-item>
+
+              <el-descriptions-item label="退还日期">{{
+                  outboundData.returnDate
+                }}
+              </el-descriptions-item>
+              <el-descriptions-item label="点收人:">{{
+                  outboundData.receiver
+                }}
+              </el-descriptions-item>
+
+
+              <el-descriptions-item label="退还人">{{
+                  outboundData.returner
+                }}
+              </el-descriptions-item>
+              </div>
+            </el-descriptions>
+            </el-card>
+
+        </el-col>
+      </div>
+    </el-col>
+  </el-row>
+
+</template>
+<script setup lang="ts">
+import {ElCol} from "element-plus";
+import {ref} from "vue";
+
+import {SpecimenOutboundApi} from "@/api/museums/specimenoutbound";
+const {query} = useRoute() // 查询参数
+
+
+
+
+let outboundData = ref(null); // 初始化响应式数据
+const fetchData = async () => {
+  try {
+    console.log(query.dataId)
+    let res: any = await SpecimenOutboundApi.getSpecimenOutbound(query.dataId)
+    console.log(res)
+    outboundData.value = res
+    console.log(outboundData.value)
+  }  finally {
+  }
+}
+
+// // 在组件加载时获取数据
+onMounted(async () => {
+  await fetchData()
+})
+
+</script>
+
+<style scoped>
+
+</style>

+ 265 - 0
src/views/museums/specimenoutbound/OutboundManagement.vue

@@ -0,0 +1,265 @@
+<template>
+  <ContentWrap>
+    <!-- 搜索工作栏 -->
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="68px">
+      <el-form-item label="标本ID" prop="infoId">
+        <el-input
+          v-model="queryParams.infoId"
+          placeholder="标本ID"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="中文名称" prop="chineseName">
+        <el-input
+          v-model="queryParams.chineseName"
+          placeholder="请输入中文名称"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="标本编号" prop="specimenNumber">
+        <el-input
+          v-model="queryParams.specimenNumber"
+          placeholder="请输入申请出库的标本编号"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="申请日期" prop="applicationDate">
+        <el-date-picker
+          v-model="queryParams.applicationDate"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-220px"
+        />
+      </el-form-item>
+      <el-form-item label="审批状态" prop="status">
+        <el-select
+          v-model="queryParams.status"
+          placeholder="请选择审批状态"
+          clearable
+          class="!w-240px"
+        >
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="标本状态" prop="sampleStatus">
+        <el-select
+          v-model="queryParams.sampleStatus"
+          placeholder="请选择标本状态"
+          clearable
+          class="!w-240px"
+        >
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
+        <el-button
+          type="success"
+          plain
+          @click="handleExport"
+          :loading="exportLoading"
+          v-hasPermi="['museums:specimen-outbound:export']"
+        >
+          <Icon icon="ep:download" class="mr-5px" /> 导出
+        </el-button>
+
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+
+  <!-- 列表 -->
+  <ContentWrap>
+    <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
+      <el-table-column label="序号" align="center" prop="id" />
+      <el-table-column label="标本ID" align="center" prop="infoId" />
+      <el-table-column label="中文名称" align="center" prop="chineseName" />
+      <el-table-column label="标本编号" align="center" prop="specimenNumber" />
+      <el-table-column label="申请人(单位)" align="center" width="120px" prop="applicantName" />
+      <el-table-column
+        label="申请日期"
+        align="center"
+        prop="applicationDate"
+        :formatter="dateFormatter"
+        width="180px"
+      />
+      <el-table-column label="用途" align="center" prop="applicationUsage" />
+      <el-table-column label="审批状态" align="center" prop="status" />
+      <el-table-column
+        label="出库时间"
+        align="center"
+        prop="outgoingTime"
+        :formatter="dateFormatter"
+        width="180px"
+      />
+      <el-table-column
+        label="退还日期"
+        align="center"
+        prop="returnDate"
+        :formatter="dateFormatter"
+        width="180px"
+      />
+<!--      <el-table-column label="标本情况" align="center" prop="specimenCondition" />-->
+      <el-table-column label="标本状态" align="center" prop="sampleStatus" />
+      <el-table-column label="操作" align="center" min-width="150px">
+        <template #default="scope" >
+          <el-button
+            link
+            type="primary"
+            @click="detail(scope.row.id)"
+          >
+          查看
+          </el-button>
+          <el-button
+            link
+            type="primary"
+            @click="handleOutbound(scope.row.id)"
+          >
+            出库
+          </el-button>
+          <el-button
+            link
+            type="success"
+            @click="handleReturn(scope.row.id)"
+          >
+            回库
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </ContentWrap>
+
+  <!-- 表单弹窗:回库 -->
+  <ReturnForm ref="formRef" @success="getList" />
+</template>
+
+<script setup lang="ts">
+import {defineComponent, ref} from "vue";
+import { SpecimenOutboundApi, SpecimenOutboundVO } from '@/api/museums/specimenoutbound'
+
+ defineComponent({name:'OutboundManagement'})
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+
+const loading = ref(true) // 列表的加载中
+const list = ref<SpecimenOutboundVO[]>([]) // 列表的数据
+const total = ref(0) // 列表的总页数
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  infoId: undefined,
+  chineseName: undefined,
+  specimenNumber: undefined,
+  applicantName: undefined,
+  applicationDate: [],
+  applicationUsage: undefined,
+  attachments: undefined,
+  status: undefined,
+  remarks: undefined,
+  processInstanceId: undefined,
+  operator: undefined,
+  outgoingTime: [],
+  returner: undefined,
+  receiver: undefined,
+  returnDate: [],
+  specimenCondition: undefined,
+  createTime: [],
+  sampleStatus: undefined
+})
+const queryFormRef = ref() // 搜索的表单
+const exportLoading = ref(false) // 导出的加载中
+
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await SpecimenOutboundApi.getSpecimenOutboundPage(queryParams)
+    list.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+
+/** 导出按钮操作 */
+const handleExport = async () => {
+  try {
+    // 导出的二次确认
+    await message.exportConfirm()
+    // 发起导出
+    exportLoading.value = true
+    const data = await SpecimenOutboundApi.exportSpecimenOutbound(queryParams)
+    download.excel(data, '标本出库回库信息.xls')
+  } catch {
+  } finally {
+    exportLoading.value = false
+  }
+}
+
+
+
+/** 查看详情页面 **/
+import { useRouter } from 'vue-router';
+const router = useRouter();
+const detail=(dataId: number) => {
+  router.push({
+    name: 'OutboundDetail',
+    query: {
+      dataId: dataId,
+    }
+  })
+}
+
+/** 出库操作 */
+const handleOutbound = async (id: number) => {
+  try {
+    // 出库的二次确认
+    await message.OutboundConfirm()
+    // 发起出库
+    await  SpecimenOutboundApi.ConfirmSpecimenOutbound(id)
+    message.success(t('common.outboundSuccess'))
+    // 刷新列表
+    await getList()
+  } catch {}
+}
+
+/** 回库 */
+const formRef = ref()
+const handleReturn= (type: string, id?: number) => {
+  formRef.value.open(type, id)
+}
+
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+
+</script>

+ 29 - 29
src/views/museums/specimenoutbound/SpecimenOutboundForm.vue

@@ -7,14 +7,14 @@
       label-width="100px"
       v-loading="formLoading"
     >
-      <el-form-item label="关联到总表中的标本ID" prop="infoId">
-        <el-input v-model="formData.infoId" placeholder="请输入关联到总表中的标本ID" />
+      <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="请输入中文名称" />
       </el-form-item>
-      <el-form-item label="申请出库的标本编号" prop="specimenNumber">
-        <el-input v-model="formData.specimenNumber" placeholder="请输入申请出库的标本编号" />
+      <el-form-item label="标本编号" prop="specimenNumber">
+        <el-input v-model="formData.specimenNumber" placeholder="请输入标本编号" />
       </el-form-item>
       <el-form-item label="申请人或申请单位" prop="applicantName">
         <el-input v-model="formData.applicantName" placeholder="请输入申请人或申请单位" />
@@ -33,17 +33,17 @@
       <el-form-item label="附件上传" prop="attachments">
         <el-input v-model="formData.attachments" placeholder="请输入附件上传" />
       </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="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>
@@ -55,12 +55,12 @@
           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="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-date-picker
           v-model="formData.returnDate"
@@ -69,14 +69,14 @@
           placeholder="选择退还日期"
         />
       </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-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>
     <template #footer>
       <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>

+ 493 - 484
src/views/system/text/index.vue

@@ -1,484 +1,493 @@
-<template>
-
-
-
-      <el-row :gutter="8" justify="space-between">
-        <el-col :xl="16" :lg="16" :md="24" :sm="24" :xs="24">
-          <div>
-            <el-row>
-              <el-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24" style="margin-outside: 0px">
-                <el-card style="margin-bottom: 5px;min-height: 300px">
-                  <template #header>
-                    <div class="card-header" style="text-align: center">
-                      <h1 class="text1">标本基本信息</h1>
-                    </div>
-                  </template>
-                  <el-descriptions
-                    direction="vertical"
-                    v-if="specimenData"
-                    :column="4"
-                    :size="size"
-                    border
-                  >
-                    <el-descriptions-item label="序号">{{ specimenData.id }}</el-descriptions-item>
-                    <el-descriptions-item label="标本类型">{{ specimenTypeText }}
-                    </el-descriptions-item>
-                    <el-descriptions-item label="标本编号">{{
-                        specimenData.specimenNumber
-                      }}
-                    </el-descriptions-item>
-                    <el-descriptions-item label="资产号">{{
-                        specimenData.assetNumber
-                      }}
-                    </el-descriptions-item>
-                    <el-descriptions-item label="存放位置">{{
-                        specimenData.storageLocation
-                      }}
-                    </el-descriptions-item>
-                    <el-descriptions-item label="中文名称">{{
-                        specimenData.chineseName
-                      }}
-                    </el-descriptions-item>
-                    <el-descriptions-item label="英文名称">{{
-                        specimenData.englishName
-                      }}
-                    </el-descriptions-item>
-                  </el-descriptions>
-                </el-card>
-
-                <el-card style="margin-bottom: 5px;min-height: 300px">
-                  <template #header>
-                    <div class="card-header" style="text-align: center;">
-                      <h1 class="text1">标本特征</h1>
-                    </div>
-                  </template>
-                  <el-descriptions
-                    direction="vertical"
-                    v-if="specimenData"
-                    :column="4"
-                    :size="size"
-                    border
-                  >
-                    <el-descriptions-item label="成分">{{
-                        specimenData.composition
-                      }}
-                    </el-descriptions-item>
-                    <el-descriptions-item label="产地">{{
-                        specimenData.origin
-                      }}
-                    </el-descriptions-item>
-                    <el-descriptions-item label="时代">{{ specimenData.era }}</el-descriptions-item>
-                    <el-descriptions-item label="保存地层">{{
-                        specimenData.discoveryTime
-                      }}
-                    </el-descriptions-item>
-                    <el-descriptions-item label="陨石类型">{{ specimenData.meteoriteType }}
-                    </el-descriptions-item>
-                    <el-descriptions-item label="国际命名">{{
-                        specimenData.internationalName
-                      }}
-                    </el-descriptions-item>
-                    <el-descriptions-item label="重量">{{
-                        specimenData.weight
-                      }}
-                    </el-descriptions-item>
-                  </el-descriptions>
-                </el-card>
-                <el-card style="margin-bottom: 5px;;min-height: 300px">
-                  <template #header>
-                    <div class="card-header" style="text-align: center">
-                      <h1 class="text1">标本保存与来源</h1>
-                    </div>
-                  </template>
-                  <el-descriptions
-                    direction="vertical"
-                    v-if="specimenData"
-                    :column="4"
-                    :size="size"
-                    border
-                  >
-                    <el-descriptions-item label="保存类型">{{ preservationTypeText }}
-                    </el-descriptions-item>
-                    <el-descriptions-item label="来源">{{ sourceText }}</el-descriptions-item>
-                    <el-descriptions-item label="标本提供者">{{
-                        specimenData.provider
-                      }}
-                    </el-descriptions-item>
-                    <el-descriptions-item label="发现时间">{{
-                        specimenData.discoveryTime
-                      }}
-                    </el-descriptions-item>
-                    <el-descriptions-item label="降落时间">{{
-                        specimenData.fallTime
-                      }}
-                    </el-descriptions-item>
-                  </el-descriptions>
-                </el-card>
-                <el-card style="margin-bottom: 5px;min-height: 300px">
-                  <template #header>
-                    <div class="card-header" style="text-align: center">
-                      <h1 class="text1" style="">标本用途与状态</h1>
-                    </div>
-                  </template>
-                  <el-descriptions
-                    direction="vertical"
-                    v-if="specimenData"
-                    :column="4"
-                    :size="size"
-                    border
-                  >
-                    <el-descriptions-item label="入馆时间">{{
-                        specimenData.acquisitionTime
-                      }}
-                    </el-descriptions-item>
-                    <el-descriptions-item label="描述">{{
-                        specimenData.description
-                      }}
-                    </el-descriptions-item>
-                    <el-descriptions-item label="用途">{{
-                        specimenData.purpose
-                      }}
-                    </el-descriptions-item>
-                    <el-descriptions-item label="备注">{{
-                        specimenData.notes
-                      }}
-                    </el-descriptions-item>
-                  </el-descriptions>
-                </el-card>
-              </el-col>
-
-            </el-row>
-
-          </div>
-        </el-col>
-        <el-col :xl="8" :lg="8" :md="24" :sm="24" :xs="24" class="mb-8px">
-          <el-card>
-            <template #header>
-              <div class="card-header" style="text-align: center">
-                <h1>标本图片</h1>
-              </div>
-            </template>
-            <el-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24" class="mb-8px">
-              <div class="demo-image__preview" v-if="specimenData ">
-                <el-image
-                  style=" align-items: center"
-                  :src="url"
-                  :zoom-rate="1.2"
-                  :max-scale="7"
-                  :min-scale="0.2"
-                  :preview-src-list="srcList"
-                  :initial-index="4"
-                  fit="cover"
-                />
-              </div>
-
-                            <div>
-                              <el-space style="margin-top: 10px">
-                                <div class="demo-image__preview">
-                                  <el-image
-                                    style="width: 50px; height: 40px"
-                                    :src="url"
-                                    :zoom-rate="1.2"
-                                    :max-scale="7"
-                                    :min-scale="0.2"
-                                    :preview-src-list="srcList"
-                                    :initial-index="4"
-                                    fit="cover"
-                                  />
-                                </div>
-                                <div class="demo-image__preview">
-                                  <el-image
-                                    style="width: 50px; height: 40px"
-                                    :src="url"
-                                    :zoom-rate="1.2"
-                                    :max-scale="7"
-                                    :min-scale="0.2"
-                                    :preview-src-list="srcList"
-                                    :initial-index="4"
-                                    fit="cover"
-                                  />
-                                </div>
-                                <div class="demo-image__preview">
-                                  <el-image
-                                    style="width: 50px; height: 40px"
-                                    :src="url"
-                                    :zoom-rate="1.2"
-                                    :max-scale="7"
-                                    :min-scale="0.2"
-                                    :preview-src-list="srcList"
-                                    :initial-index="4"
-                                    fit="cover"
-                                  />
-                                </div>
-                                <div class="demo-image__preview">
-                                  <el-image
-                                    style="width: 50px; height: 40px"
-                                    :src="url"
-                                    :zoom-rate="1.2"
-                                    :max-scale="7"
-                                    :min-scale="0.2"
-                                    :preview-src-list="srcList"
-                                    :initial-index="4"
-                                    fit="cover"
-                                  />
-                                </div>
-                                <div class="demo-image__preview">
-                                  <el-image
-                                    style="width: 50px; height: 40px"
-                                    :src="url"
-                                    :zoom-rate="1.2"
-                                    :max-scale="7"
-                                    :min-scale="0.2"
-                                    :preview-src-list="srcList"
-                                    :initial-index="4"
-                                    fit="cover"
-                                  />
-                                </div>
-                                <div class="demo-image__preview">
-                                  <el-image
-                                    style="width: 50px; height: 40px"
-                                    :src="url"
-                                    :zoom-rate="1.2"
-                                    :max-scale="7"
-                                    :min-scale="0.2"
-                                    :preview-src-list="srcList"
-                                    :initial-index="4"
-                                    fit="cover"
-                                  />
-                                </div>
-                                <div class="demo-image__preview">
-                                  <el-image
-                                    style="width: 50px; height: 40px"
-                                    :src="url"
-                                    :zoom-rate="1.2"
-                                    :max-scale="7"
-                                    :min-scale="0.2"
-                                    :preview-src-list="srcList"
-                                    :initial-index="4"
-                                    fit="cover"
-                                  />
-                                </div>
-                              </el-space>
-                            </div>
-            </el-col>
-
-          </el-card>
-          <el-card style="margin-top: 10px">
-            <template #header>
-              <div class="card-header" >
-                <h1 class="text1" style="margin-bottom: 10px">馆藏状态</h1>
-                <span v-if="specimenRecord">{{collectionStatusText}}</span>
-              </div>
-            </template>
-            <el-scrollbar height="600px">
-            <el-timeline style="max-width: 600px;margin-left: 15px" >
-              <el-timeline-item
-                v-for="(item, index) in specimenRecord"
-                :key="index"
-                :timestamp="item.outgoingTime"
-                placement="top">
-                  <el-card>
-                    <p>{{  }}</p>
-                    <p>状态:{{  }}</p>
-                    <p>申请人或单位:{{item.applicantName }}</p>
-                    <p>用途:{{item.applicationUsage}}</p>
-                    <p>审批员:{{item.approveUsers}}</p>
-                    <p>审批时间:{{}}</p>
-                    <p>出库员:{{ item.operator }}</p>
-                  </el-card>
-              </el-timeline-item>
-              <el-timeline-item
-                v-for="(item, index) in specimenRecord"
-                :key="index"
-                :timestamp="item.acquisitionTime"
-                placement="top">
-                <el-card>
-                  <p>回库</p>
-                  <p>退还人:{{ item.operator }}</p>
-                  <p>点收人:{{item.applicationUsage}}</p>
-                  <p>退还日期:{{item.approveUsers}}</p>
-                  <p>标本情况:{{}}</p>
-                </el-card>
-              </el-timeline-item>
-
-            </el-timeline>
-            </el-scrollbar>
-          </el-card>
-
-        </el-col>
-      </el-row>
-
-
-
-
-
-</template>
-
-<script setup lang="ts">
-
-import {ref, onMounted, computed} from "vue";
-import {useRouter} from 'vue-router';
-import * as textApi from "@/api/system/text";
-import {ElCol, ElImage} from 'element-plus';
-
-const router = useRouter() // 路由
-const {query} = useRoute() // 查询参数
-import type {ComponentSize} from 'element-plus'
-import {getRecord} from "@/api/system/text";
-
-const size = ref<ComponentSize>('large')
-
-
-
-const url = ref()
-const srcList = ref([])
-
-
-
-
-let specimenData = ref(null); // 初始化响应式数据
-const fetchData = async () => {
-  try {
-    console.log(query.dataId)
-    let res: any = await textApi.getDetail(query.dataId)
-   console.log(res)
-    specimenData.value = res
-    console.log('tj',specimenData.value)
-    srcList.value = specimenData.value.imagePath.split(',')
-    url.value = srcList.value[0]
-    console.log('tj',srcList.value)
-  }  finally {
-  }
-  }
-/**馆藏状态记录**/
-let specimenRecord = ref(null);
-const  fetchRecord = async () => {
-  try {
-
-    console.log(query.dataId)
-    let res: any = await textApi.getRecord(query.dataId)
-    console.log(res)
-    specimenRecord.value = res
-
-  } finally {
-  }
-}
-// // 在组件加载时获取数据
-onMounted(async () => {
-  console.log(1)
-  await fetchData()
-   await fetchRecord()
-
-})
-
-
-/**标本类型**/
-const specimenTypeText = computed(() => {
-  if (specimenData.value === null) {
-    return '';
-  }
-  switch (specimenData.value.specimenType) {
-    case 0:
-      return '矿物';
-    case 1:
-      return '岩石矿石';
-    case 2:
-      return '化石';
-    case 3:
-      return '陨石';
-    default:
-      return '';
-  }
-});
-/**保存类型**/
-const preservationTypeText = computed(() => {
-  if (specimenData.value === null) {
-    return '';
-  }
-  switch (specimenData.value.preservationType) {
-    case 0:
-      return '标本';
-    case 1:
-      return '光片';
-    case 2:
-      return '薄片模型';
-    default:
-      return '';
-  }
-});
-/**来源**/
-const collectionStatusText = computed(() => {
-  if (specimenData.value === null) {
-    return '';
-  }
-  switch (specimenData.value.collectionStatus) {
-    case 0:
-      return '在馆';
-    case 1:
-      return '借出';
-    default:
-      return '';
-  }
-});
-/**馆藏状态(在馆、借出)**/
-const sourceText = computed(() => {
-  if (specimenRecord.value === null) {
-    return '';
-  }
-  switch (specimenRecord.value.source) {
-    case 0:
-      return '采购';
-    case 1:
-      return '捐赠';
-    case 2:
-      return '采集';
-    default:
-      return '';
-  }
-});
-
-
-</script>
-<style scoped lang="scss">
-.demo-image__error .image-slot {
-  font-size: 30px;
-}
-
-.demo-image__error .image-slot .el-icon {
-  font-size: 30px;
-}
-
-.demo-image__error .el-image {
-  width: 100%;
-  height: 200px;
-
-}
-
-.text1 {
-  font-weight: bold;
-  color: #0f2438;
-}
-
-.label {
-  display: inline-block;
-  text-align: right;
-  width: 100px;
-  font-weight: bold;
-  color: black;
-}
-
-
-.scrollbar-imag-item {
-  flex-shrink: 0;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  width: 100px;
-  height: 50px;
-  margin: 10px;
-  text-align: center;
-  background: var(--el-color-danger-light-9);
-  color: var(--el-color-danger);
-}
-
-</style>
+<!--<template>-->
+
+
+
+<!--      <el-row :gutter="8" justify="space-between">-->
+<!--        <el-col :xl="16" :lg="16" :md="24" :sm="24" :xs="24">-->
+<!--          <div>-->
+<!--            <el-row>-->
+<!--              <el-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24" style="margin-outside: 0px">-->
+<!--                <el-card style="margin-bottom: 5px">-->
+<!--                  <template #header>-->
+<!--                    <div class="card-header" style="text-align: center">-->
+<!--                      <h1 class="text1">标本基本信息</h1>-->
+<!--                    </div>-->
+<!--                  </template>-->
+<!--                  <el-descriptions-->
+<!--                    v-if="specimenData"-->
+<!--                    :column="2"-->
+<!--                    :size="size"-->
+<!--                    border-->
+<!--                  >-->
+<!--                    <el-descriptions-item label="序号:" label-align="right">{{ specimenData.id }}</el-descriptions-item>-->
+
+<!--                    <el-descriptions-item label="标本类型:" label-align="right" >{{ specimenTypeText }}-->
+<!--                    </el-descriptions-item>-->
+<!--                    <el-descriptions-item label="标本编号:" label-align="right">{{-->
+<!--                        specimenData.specimenNumber-->
+<!--                      }}-->
+<!--                    </el-descriptions-item>-->
+<!--                    <el-descriptions-item label="资产号:" label-align="right">{{-->
+<!--                        specimenData.assetNumber-->
+<!--                      }}-->
+<!--                    </el-descriptions-item>-->
+<!--                    <el-descriptions-item label="存放位置:" label-align="right">{{-->
+<!--                        specimenData.storageLocation-->
+<!--                      }}-->
+<!--                    </el-descriptions-item>-->
+<!--                    <el-descriptions-item label="中文名称:" label-align="right">{{-->
+<!--                        specimenData.chineseName-->
+<!--                      }}-->
+<!--                    </el-descriptions-item>-->
+<!--                    <el-descriptions-item label="英文名称:" label-align="right">{{-->
+<!--                        specimenData.englishName-->
+<!--                      }}-->
+<!--                    </el-descriptions-item>-->
+<!--                  </el-descriptions>-->
+
+<!--                </el-card>-->
+
+<!--                <el-card style="margin-bottom: 5px">-->
+<!--                  <template #header>-->
+<!--                    <div class="card-header" style="text-align: center;">-->
+<!--                      <h1 class="text1">标本特征</h1>-->
+<!--                    </div>-->
+<!--                  </template>-->
+<!--                  <el-descriptions-->
+<!--                    v-if="specimenData"-->
+<!--                    :column="2"-->
+<!--                    :size="size"-->
+<!--                    border-->
+<!--                  >-->
+<!--                    <el-descriptions-item label="成分:"  label-align="right">{{-->
+<!--                        specimenData.composition-->
+<!--                      }}-->
+<!--                    </el-descriptions-item>-->
+<!--                    <el-descriptions-item label="产地:" label-align="right">{{-->
+<!--                        specimenData.origin-->
+<!--                      }}-->
+<!--                    </el-descriptions-item>-->
+<!--                    <el-descriptions-item label="时代:" label-align="right">{{ specimenData.era }}</el-descriptions-item>-->
+<!--                    <el-descriptions-item label="保存地层:" label-width="100px" label-align="right">{{-->
+<!--                        specimenData.discoveryTime-->
+<!--                      }}-->
+<!--                    </el-descriptions-item>-->
+<!--                    <el-descriptions-item label="陨石类型:" label-width="100px" label-align="right">{{ specimenData.meteoriteType }}-->
+<!--                    </el-descriptions-item>-->
+<!--                    <el-descriptions-item label="国际命名:" label-width="100px" label-align="right">{{-->
+<!--                        specimenData.internationalName-->
+<!--                      }}-->
+<!--                    </el-descriptions-item>-->
+<!--                    <el-descriptions-item label="重量(g):" label-width="100px" label-align="right">{{-->
+<!--                        specimenData.weight-->
+<!--                      }}-->
+<!--                    </el-descriptions-item>-->
+<!--                  </el-descriptions>-->
+<!--                </el-card>-->
+<!--                <el-card style="margin-bottom: 5px">-->
+<!--                  <template #header>-->
+<!--                    <div class="card-header" style="text-align: center">-->
+<!--                      <h1 class="text1">标本保存与来源</h1>-->
+<!--                    </div>-->
+<!--                  </template>-->
+<!--                  <el-descriptions-->
+
+<!--                    v-if="specimenData"-->
+<!--                    :column="2"-->
+<!--                    :size="size"-->
+<!--                    border-->
+<!--                  >-->
+<!--                    <el-descriptions-item label="保存类型">{{ preservationTypeText }}-->
+<!--                    </el-descriptions-item>-->
+<!--                    <el-descriptions-item label="来源">{{ sourceText }}</el-descriptions-item>-->
+<!--                    <el-descriptions-item label="标本提供者">{{-->
+<!--                        specimenData.provider-->
+<!--                      }}-->
+<!--                    </el-descriptions-item>-->
+<!--                    <el-descriptions-item label="发现时间">{{-->
+<!--                        specimenData.discoveryTime-->
+<!--                      }}-->
+<!--                    </el-descriptions-item>-->
+<!--                    <el-descriptions-item label="降落时间">{{-->
+<!--                        specimenData.fallTime-->
+<!--                      }}-->
+<!--                    </el-descriptions-item>-->
+<!--                  </el-descriptions>-->
+<!--                </el-card>-->
+<!--                <el-card style="margin-bottom: 5px">-->
+<!--                  <template #header>-->
+<!--                    <div class="card-header" style="text-align: center">-->
+<!--                      <h1 class="text1" style="">标本用途与状态</h1>-->
+<!--                    </div>-->
+<!--                  </template>-->
+<!--                  <el-descriptions-->
+
+<!--                    v-if="specimenData"-->
+<!--                    :column="2"-->
+<!--                    :size="size"-->
+<!--                    border-->
+<!--                  >-->
+<!--                    <el-descriptions-item label="入馆时间">{{-->
+<!--                        specimenData.acquisitionTime-->
+<!--                      }}-->
+<!--                    </el-descriptions-item>-->
+<!--                    <el-descriptions-item label="描述">{{-->
+<!--                        specimenData.description-->
+<!--                      }}-->
+<!--                    </el-descriptions-item>-->
+<!--                    <el-descriptions-item label="用途">{{-->
+<!--                        specimenData.purpose-->
+<!--                      }}-->
+<!--                    </el-descriptions-item>-->
+<!--                    <el-descriptions-item label="备注">{{-->
+<!--                        specimenData.notes-->
+<!--                      }}-->
+<!--                    </el-descriptions-item>-->
+<!--                  </el-descriptions>-->
+<!--                </el-card>-->
+<!--              </el-col>-->
+
+<!--            </el-row>-->
+
+<!--          </div>-->
+<!--        </el-col>-->
+<!--        <el-col :xl="8" :lg="8" :md="24" :sm="24" :xs="24" class="mb-8px">-->
+<!--          <el-card>-->
+<!--            <template #header>-->
+<!--              <div class="card-header" style="text-align: center">-->
+<!--                <h1>标本图片</h1>-->
+<!--              </div>-->
+<!--            </template>-->
+<!--            <el-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24" class="mb-8px">-->
+<!--              <div class="demo-image__preview" v-if="specimenData ">-->
+<!--                <el-image-->
+<!--                  style=" align-items: center"-->
+<!--                  :src="url"-->
+<!--                  :zoom-rate="1.2"-->
+<!--                  :max-scale="7"-->
+<!--                  :min-scale="0.2"-->
+<!--                  :preview-src-list="srcList"-->
+<!--                  :initial-index="4"-->
+<!--                  fit="cover"-->
+<!--                />-->
+<!--              </div>-->
+
+<!--                            <div>-->
+<!--                              <el-space style="margin-top: 10px">-->
+<!--                                <div class="demo-image__preview">-->
+<!--                                  <el-image-->
+<!--                                    style="width: 50px; height: 40px"-->
+<!--                                    :src="url"-->
+<!--                                    :zoom-rate="1.2"-->
+<!--                                    :max-scale="7"-->
+<!--                                    :min-scale="0.2"-->
+<!--                                    :preview-src-list="srcList"-->
+<!--                                    :initial-index="4"-->
+<!--                                    fit="cover"-->
+<!--                                  />-->
+<!--                                </div>-->
+<!--                                <div class="demo-image__preview">-->
+<!--                                  <el-image-->
+<!--                                    style="width: 50px; height: 40px"-->
+<!--                                    :src="url"-->
+<!--                                    :zoom-rate="1.2"-->
+<!--                                    :max-scale="7"-->
+<!--                                    :min-scale="0.2"-->
+<!--                                    :preview-src-list="srcList"-->
+<!--                                    :initial-index="4"-->
+<!--                                    fit="cover"-->
+<!--                                  />-->
+<!--                                </div>-->
+<!--                                <div class="demo-image__preview">-->
+<!--                                  <el-image-->
+<!--                                    style="width: 50px; height: 40px"-->
+<!--                                    :src="url"-->
+<!--                                    :zoom-rate="1.2"-->
+<!--                                    :max-scale="7"-->
+<!--                                    :min-scale="0.2"-->
+<!--                                    :preview-src-list="srcList"-->
+<!--                                    :initial-index="4"-->
+<!--                                    fit="cover"-->
+<!--                                  />-->
+<!--                                </div>-->
+<!--                                <div class="demo-image__preview">-->
+<!--                                  <el-image-->
+<!--                                    style="width: 50px; height: 40px"-->
+<!--                                    :src="url"-->
+<!--                                    :zoom-rate="1.2"-->
+<!--                                    :max-scale="7"-->
+<!--                                    :min-scale="0.2"-->
+<!--                                    :preview-src-list="srcList"-->
+<!--                                    :initial-index="4"-->
+<!--                                    fit="cover"-->
+<!--                                  />-->
+<!--                                </div>-->
+<!--                                <div class="demo-image__preview">-->
+<!--                                  <el-image-->
+<!--                                    style="width: 50px; height: 40px"-->
+<!--                                    :src="url"-->
+<!--                                    :zoom-rate="1.2"-->
+<!--                                    :max-scale="7"-->
+<!--                                    :min-scale="0.2"-->
+<!--                                    :preview-src-list="srcList"-->
+<!--                                    :initial-index="4"-->
+<!--                                    fit="cover"-->
+<!--                                  />-->
+<!--                                </div>-->
+<!--                                <div class="demo-image__preview">-->
+<!--                                  <el-image-->
+<!--                                    style="width: 50px; height: 40px"-->
+<!--                                    :src="url"-->
+<!--                                    :zoom-rate="1.2"-->
+<!--                                    :max-scale="7"-->
+<!--                                    :min-scale="0.2"-->
+<!--                                    :preview-src-list="srcList"-->
+<!--                                    :initial-index="4"-->
+<!--                                    fit="cover"-->
+<!--                                  />-->
+<!--                                </div>-->
+<!--                                <div class="demo-image__preview">-->
+<!--                                  <el-image-->
+<!--                                    style="width: 50px; height: 40px"-->
+<!--                                    :src="url"-->
+<!--                                    :zoom-rate="1.2"-->
+<!--                                    :max-scale="7"-->
+<!--                                    :min-scale="0.2"-->
+<!--                                    :preview-src-list="srcList"-->
+<!--                                    :initial-index="4"-->
+<!--                                    fit="cover"-->
+<!--                                  />-->
+<!--                                </div>-->
+<!--                              </el-space>-->
+<!--                            </div>-->
+<!--            </el-col>-->
+
+<!--          </el-card>-->
+<!--          <el-card style="margin-top: 10px">-->
+<!--            <template #header>-->
+<!--              <div class="card-header" >-->
+<!--                <h1 class="text1" style="margin-bottom: 10px">馆藏状态</h1>-->
+<!--                <span v-if="specimenRecord">{{collectionStatusText}}</span>-->
+<!--              </div>-->
+<!--            </template>-->
+<!--            <el-scrollbar height="600px">-->
+<!--            <el-timeline style="max-width: 600px;margin-left: 15px" >-->
+<!--              <el-timeline-item-->
+<!--                v-for="(item, index) in specimenRecord"-->
+<!--                :key="index"-->
+<!--                :timestamp="item.outgoingTime"-->
+<!--                placement="top">-->
+<!--                  <el-card>-->
+<!--                    <p>{{  }}</p>-->
+<!--                    <p>状态:{{  }}</p>-->
+<!--                    <p>申请人或单位:{{item.applicantName }}</p>-->
+<!--                    <p>用途:{{item.applicationUsage}}</p>-->
+<!--                    <p>审批员:{{item.approveUsers}}</p>-->
+<!--                    <p>审批时间:{{}}</p>-->
+<!--                    <p>出库员:{{ item.operator }}</p>-->
+<!--                  </el-card>-->
+<!--              </el-timeline-item>-->
+<!--              <el-timeline-item-->
+<!--                v-for="(item, index) in specimenRecord"-->
+<!--                :key="index"-->
+<!--                :timestamp="item.acquisitionTime"-->
+<!--                placement="top">-->
+<!--                <el-card>-->
+<!--                  <p>回库</p>-->
+<!--                  <p>退还人:{{ item.operator }}</p>-->
+<!--                  <p>点收人:{{item.applicationUsage}}</p>-->
+<!--                  <p>退还日期:{{item.approveUsers}}</p>-->
+<!--                  <p>标本情况:{{}}</p>-->
+<!--                </el-card>-->
+<!--              </el-timeline-item>-->
+
+<!--            </el-timeline>-->
+<!--            </el-scrollbar>-->
+<!--          </el-card>-->
+
+<!--        </el-col>-->
+<!--      </el-row>-->
+
+
+
+
+
+<!--</template>-->
+
+<!--<script setup lang="ts">-->
+
+<!--import {ref, onMounted, computed} from "vue";-->
+<!--import {useRouter} from 'vue-router';-->
+<!--import * as textApi from "@/api/system/text";-->
+<!--import {ElCol, ElImage} from 'element-plus';-->
+
+<!--const router = useRouter() // 路由-->
+<!--const {query} = useRoute() // 查询参数-->
+<!--import type {ComponentSize} from 'element-plus'-->
+<!--import {getRecord} from "@/api/system/text";-->
+
+<!--const size = ref<ComponentSize>('large')-->
+
+
+
+<!--const url = ref()-->
+<!--const srcList = ref([])-->
+
+
+
+
+<!--let specimenData = ref(null); // 初始化响应式数据-->
+<!--const fetchData = async () => {-->
+<!--  try {-->
+<!--    console.log(query.dataId)-->
+<!--    let res: any = await textApi.getDetail(query.dataId)-->
+<!--   console.log(res)-->
+<!--    specimenData.value = res-->
+<!--    console.log('tj',specimenData.value)-->
+<!--    srcList.value = specimenData.value.imagePath.split(',')-->
+<!--    url.value = srcList.value[0]-->
+<!--    console.log('tj',srcList.value)-->
+<!--  }  finally {-->
+<!--  }-->
+<!--  }-->
+<!--/**馆藏状态记录**/-->
+<!--let specimenRecord = ref(null);-->
+<!--const  fetchRecord = async () => {-->
+<!--  try {-->
+
+<!--    console.log(query.dataId)-->
+<!--    let res: any = await textApi.getRecord(query.dataId)-->
+<!--    console.log(res)-->
+<!--    specimenRecord.value = res-->
+
+<!--  } finally {-->
+<!--  }-->
+<!--}-->
+<!--// // 在组件加载时获取数据-->
+<!--onMounted(async () => {-->
+<!--  console.log(1)-->
+<!--  await fetchData()-->
+<!--   await fetchRecord()-->
+
+<!--})-->
+
+
+<!--/**标本类型**/-->
+<!--const specimenTypeText = computed(() => {-->
+<!--  if (specimenData.value === null) {-->
+<!--    return '';-->
+<!--  }-->
+<!--  switch (specimenData.value.specimenType) {-->
+<!--    case 0:-->
+<!--      return '矿物';-->
+<!--    case 1:-->
+<!--      return '岩石矿石';-->
+<!--    case 2:-->
+<!--      return '化石';-->
+<!--    case 3:-->
+<!--      return '陨石';-->
+<!--    default:-->
+<!--      return '';-->
+<!--  }-->
+<!--});-->
+<!--/**保存类型**/-->
+<!--const preservationTypeText = computed(() => {-->
+<!--  if (specimenData.value === null) {-->
+<!--    return '';-->
+<!--  }-->
+<!--  switch (specimenData.value.preservationType) {-->
+<!--    case 0:-->
+<!--      return '标本';-->
+<!--    case 1:-->
+<!--      return '光片';-->
+<!--    case 2:-->
+<!--      return '薄片模型';-->
+<!--    default:-->
+<!--      return '';-->
+<!--  }-->
+<!--});-->
+<!--/**来源**/-->
+<!--const collectionStatusText = computed(() => {-->
+<!--  if (specimenData.value === null) {-->
+<!--    return '';-->
+<!--  }-->
+<!--  switch (specimenData.value.collectionStatus) {-->
+<!--    case 0:-->
+<!--      return '在馆';-->
+<!--    case 1:-->
+<!--      return '借出';-->
+<!--    default:-->
+<!--      return '';-->
+<!--  }-->
+<!--});-->
+<!--/**馆藏状态(在馆、借出)**/-->
+<!--const sourceText = computed(() => {-->
+<!--  if (specimenRecord.value === null) {-->
+<!--    return '';-->
+<!--  }-->
+<!--  switch (specimenRecord.value.source) {-->
+<!--    case 0:-->
+<!--      return '采购';-->
+<!--    case 1:-->
+<!--      return '捐赠';-->
+<!--    case 2:-->
+<!--      return '采集';-->
+<!--    default:-->
+<!--      return '';-->
+<!--  }-->
+<!--});-->
+
+
+<!--</script>-->
+
+<!--<style scoped lang="scss">-->
+<!--.demo-image__error .image-slot {-->
+<!--  font-size: 30px;-->
+<!--}-->
+
+<!--.demo-image__error .image-slot .el-icon {-->
+<!--  font-size: 30px;-->
+<!--}-->
+
+<!--.demo-image__error .el-image {-->
+<!--  width: 100%;-->
+<!--  height: 200px;-->
+
+<!--}-->
+
+<!--.text1 {-->
+<!--  font-weight: bold;-->
+<!--  color: #0f2438;-->
+<!--}-->
+
+<!--.label {-->
+<!--  display: inline-block;-->
+<!--  text-align: right;-->
+<!--  width: 100px;-->
+<!--  font-weight: bold;-->
+<!--  color: black;-->
+<!--}-->
+
+
+<!--.scrollbar-imag-item {-->
+<!--  flex-shrink: 0;-->
+<!--  display: flex;-->
+<!--  align-items: center;-->
+<!--  justify-content: center;-->
+<!--  width: 100px;-->
+<!--  height: 50px;-->
+<!--  margin: 10px;-->
+<!--  text-align: center;-->
+<!--  background: var(&#45;&#45;el-color-danger-light-9);-->
+<!--  color: var(&#45;&#45;el-color-danger);-->
+<!--}-->
+<!--.label-width .el-descriptions-item__label  {-->
+<!--  width: 90px;-->
+<!--  flex: 1;-->
+<!--}-->
+<!--.el-descriptions-item {-->
+<!--  margin-bottom: 20px;-->
+<!--  margin-top: 20px;-->
+<!--}-->
+
+<!--</style>-->