Browse Source

最新前端

lmm 9 months ago
parent
commit
e3c7e2714f

+ 8 - 7
src/api/museums/photogroup/index.ts

@@ -14,31 +14,32 @@ export interface PhotoGroupVO {
 export const PhotoGroupApi = {
   // 查询博物馆照片组分页
   getPhotoGroupPage: async (params: any) => {
-    return await request.get({ url: `/museums/photo-group/page`, params })
+    return await request.get({ url: `/photosmanage/photo-group/page`, params })
   },
 
   // 查询博物馆照片组详情
   getPhotoGroup: async (id: number) => {
-    return await request.get({ url: `/museums/photo-group/get?id=` + id })
+    return await request.get({ url: `/photosmanage/photo-group/get?id=` + id })
   },
 
   // 新增博物馆照片组
   createPhotoGroup: async (data: PhotoGroupVO) => {
-    return await request.post({ url: `/museums/photo-group/create`, data })
+    return await request.post({ url: `/photosmanage/photo-group/create`, data })
   },
 
   // 修改博物馆照片组
   updatePhotoGroup: async (data: PhotoGroupVO) => {
-    return await request.put({ url: `/museums/photo-group/update`, data })
+    return await request.put({ url: `/photosmanage/photo-group/update`, data })
   },
 
   // 删除博物馆照片组
   deletePhotoGroup: async (id: number) => {
-    return await request.delete({ url: `/museums/photo-group/delete?id=` + id })
+
+    return await request.delete({ url: `/photosmanage/photo-group/delete?id=` + id })
   },
 
   // 导出博物馆照片组 Excel
   exportPhotoGroup: async (params) => {
-    return await request.download({ url: `/museums/photo-group/export-excel`, params })
+    return await request.download({ url: `/photosmanage/photo-group/export-excel`, params })
   }
-}
+}

+ 10 - 7
src/api/museums/photos/index.ts

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

+ 15 - 3
src/api/museums/specimeninfo/index.ts

@@ -31,7 +31,7 @@ export interface SpecimenInfoVO {
   imagePath: string // 图片路径
   deletedReason: string // 注销原因
   operator: string // 入库操作员
-  entryDate: Date // 入库时间
+  entryDate:  [] // 入库时间
 }
 
 // 标本管理 API
@@ -60,9 +60,21 @@ export const SpecimenInfoApi = {
   deleteSpecimenInfo: async (id: number) => {
     return await request.delete({ url: `/museums/specimen-info/delete?id=` + id })
   },
+  //下载导入标本信息模板
+  importSpecimenInfTemplate: async(data: SpecimenInfoVO) => {
+    return await request.download({ url: '/museums/specimen-info/get-specimen-import-template' , data })
+  },
 
   // 导出标本管理 Excel
   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 })
+    }
+}
+//下载导入标本信息模板
+// export const importSpecimenInfTemplate = () => {
+//   return request.download({ url: '/museums/specimen-info/get-specimen-import-template' })
+// }

+ 9 - 2
src/api/museums/specimenoutbound/index.ts

@@ -20,6 +20,7 @@ export interface SpecimenOutboundVO {
   returnDate: Date // 退还日期
   specimenCondition: string // 标本情况
   sampleStatus: number // 标本状态(已出库、已回库、出库审批中)
+
 }
 
 // 标本出库回库信息 API
@@ -52,5 +53,11 @@ export const SpecimenOutboundApi = {
   // 导出标本出库回库信息 Excel
   exportSpecimenOutbound: async (params) => {
     return await request.download({ url: `/museums/specimen-outbound/export-excel`, params })
-  }
-}
+  },
+
+  // 审批驳回标本出库回库
+ ApprovalSpecimenOutbound: async (id: number) => {
+    return await request.put({ url: `/museums/specimen-outbound/reject?id=` + id })
+  },
+
+}

+ 70 - 0
src/api/system/text/index.ts

@@ -0,0 +1,70 @@
+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() {
+//     const route = useRoute();
+//     const dataId = route.query.dataId;
+//     const  recordsId = route.query.recordsId
+//     return {
+//       dataId,
+//       recordsId
+//
+//     }
+//   }
+// }
+

+ 1 - 1
src/components/UploadFile/src/UploadFile.vue

@@ -80,7 +80,7 @@ const emit = defineEmits(['update:modelValue'])
 
 const props = defineProps({
   modelValue: propTypes.oneOfType<string | string[]>([String, Array<String>]).isRequired,
-  fileType: propTypes.array.def(['doc', 'xls', 'ppt', 'txt', 'pdf']), // 文件类型, 例如['png', 'jpg', 'jpeg']
+  fileType: propTypes.array.def(['doc', 'xls', 'ppt', 'txt', 'pdf','png', 'jpg', 'jpeg']), // 文件类型, 例如['png', 'jpg', 'jpeg']
   fileSize: propTypes.number.def(5), // 大小限制(MB)
   limit: propTypes.number.def(5), // 数量限制
   autoUpload: propTypes.bool.def(true), // 自动上传

+ 49 - 0
src/router/index.ts

@@ -26,3 +26,52 @@ export const setupRouter = (app: App<Element>) => {
 }
 
 export default router
+
+
+// /**标本详情页面跳转**/
+// // src/router/index.ts
+// import { createRouter, createWebHistory } from 'vue-router';
+// import type { App } from 'vue';
+// import type { RouteRecordRaw } from 'vue-router';
+// import remainingRouter from './modules/remaining';
+//
+// // 添加新的路由规则
+// const newRoutes: RouteRecordRaw[] = [
+//   {
+//     path: '/museums/specimeninfo',
+//     name: 'specimeninfo',
+//     component: () => import('@/views/museums/specimeninfo/index.vue')
+//   },
+//   {
+//     path: '/system/text',
+//     name: 'text',
+//     component: () => import('@/views/system/text/index.vue')
+//   },
+//   // ...其他路由
+// ];
+//
+// // 合并原有路由和新添加的路由
+// const allRoutes: RouteRecordRaw[] = [...remainingRouter, ...(newRoutes as RouteRecordRaw[])];
+//
+// // 创建路由实例
+// const router = createRouter({
+//   history: createWebHistory(import.meta.env.VITE_BASE_PATH), // 使用Vite环境变量设置基路径
+//   strict: true,
+//   routes: allRoutes,
+//   scrollBehavior: () => ({ left: 0, top: 0 }) // 滚动行为配置
+// });
+//
+// export const resetRouter = (): void => {
+//   const resetWhiteNameList = ['Redirect', 'Login', 'NoFind', 'Root'];
+//   router.getRoutes().forEach((route) => {
+//     if (route.name && !resetWhiteNameList.includes(route.name)) {
+//       router.removeRoute(route.name);
+//     }
+//   });
+// };
+//
+// export const setupRouter = (app: App) => {
+//   app.use(router);
+// };
+//
+// export default router;

+ 46 - 2
src/router/modules/remaining.ts

@@ -448,6 +448,25 @@ const remainingRouter: AppRouteRecordRaw[] = [
       }
     ]
   },
+  {
+    path: '/museums',
+    name: 'museums',
+    meta: { hidden: true },
+    component: Layout,
+    children: [
+      {
+        path: '/museums/specimen-info',
+        name: 'SpecimenInfo',
+        meta: {
+          title: '信息',
+          noCache: true,
+          hidden: true,
+          activeMenu: '/museums/specimeninfo'
+        },
+        component: () => import('@/views/museums/specimeninfo/index.vue')
+      }
+    ]
+  },
   {
     path: '/diy',
     name: 'DiyCenter',
@@ -571,7 +590,31 @@ const remainingRouter: AppRouteRecordRaw[] = [
           activeMenu: '/crm/product'
         },
         component: () => import('@/views/crm/product/detail/index.vue')
-      }
+      },
+      {
+        path: '/system/text/index.vue',
+        component: () => import('@/views//system/text/index.vue'),
+        name: 'Details',
+        meta: {
+          noCache: true,
+          hidden: true,
+          canTo: true,
+          title: '查看标本详情',
+          activeMenu: '/crm/specimen'
+        }
+      },
+      {
+        path: '/museums/photos/index.vue',
+        component: () => import('@/views/museums/photos/index.vue'),
+        name: 'ImageDetails',
+        meta: {
+          noCache: true,
+          hidden: true,
+          canTo: true,
+          title: '查看标本图片详情',
+          activeMenu: '/crm/photo'
+        }
+      },
     ]
   },
   {
@@ -603,7 +646,8 @@ const remainingRouter: AppRouteRecordRaw[] = [
       hidden: true,
       breadcrumb: false
     }
-  }
+  },
+
 ]
 
 export default remainingRouter

+ 1 - 1
src/views/Home/Index.vue

@@ -85,7 +85,7 @@
             >
               <el-card shadow="hover" class="mr-5px mt-5px">
                 <div class="flex items-center">
-                  <Icon :icon="item.icon" :size="25" class="mr-8px" />
+                  <Icon :icon="item.icon" :size="50" class="mr-8px" />
                   <span class="text-16px">{{ item.name }}</span>
                 </div>
                 <div class="mt-12px text-9px text-gray-400">{{ t(item.message) }}</div>

+ 98 - 0
src/views/museums/photogroup/ImageImportForm .vue

@@ -0,0 +1,98 @@
+<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"
+    >
+      <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>
+    <template #footer >
+      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+
+</template>
+</Dialog>
+</template>
+
+
+<script lang="ts" setup>
+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: 'imageImportForm' })
+const dialogVisible = ref(false) // 弹窗的是否展示
+const formLoading = ref(false) // 表单的加载中
+const uploadRef = ref()
+const message = useMessage() // 消息弹窗
+const updateSupport = ref(0) // 是否更新已经存在的用户数据
+const fileList = ref([]) // 文件列表
+/** 打开弹窗 */
+const open = () => {
+  dialogVisible.value = true
+  updateSupport.value = 0
+  fileList.value = []
+  resetForm()
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+const {  httpRequest } = useUpload()
+
+/** 图片上传成功 */
+
+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
+}
+
+/** 提交表单 */
+const submitForm = async () => {
+  if (fileList.value.length == 0) {
+    message.error('请上传文件')
+    return
+  }
+
+  formLoading.value = true
+  uploadRef.value!.submit()
+}
+
+/** 重置表单 */
+const resetForm = async (): Promise<void> => {
+  // 重置上传状态和文件
+  formLoading.value = false
+  await nextTick()
+  uploadRef.value?.clearFiles()
+}
+</script>

+ 60 - 5
src/views/museums/photogroup/PhotoGroupForm.vue

@@ -30,28 +30,59 @@
         />
       </el-form-item>
       <el-form-item label="照片组上传" prop="uploadPhotos">
-        <UploadFile v-model="formData.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>
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
+<!--      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>-->
+      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</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,
@@ -83,7 +114,7 @@ const open = async (type: string, id?: number) => {
   }
 }
 defineExpose({ open }) // 提供 open 方法,用于打开弹窗
-
+const {  httpRequest } = useUpload()
 /** 提交表单 */
 const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
 const submitForm = async () => {
@@ -108,6 +139,7 @@ const submitForm = async () => {
   }
 }
 
+
 /** 重置表单 */
 const resetForm = () => {
   formData.value = {
@@ -120,4 +152,27 @@ const resetForm = () => {
   }
   formRef.value?.resetFields()
 }
-</script>
+
+
+/** 图片上传成功 */
+
+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>

+ 71 - 26
src/views/museums/photogroup/index.vue

@@ -8,16 +8,17 @@
       :inline="true"
       label-width="68px"
     >
-      <el-form-item label="照片组名称" prop="groupName">
+      <el-form-item label="照片组名称" prop="groupName" label-width="100px">
         <el-input
           v-model="queryParams.groupName"
           placeholder="请输入照片组名称"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
+
         />
       </el-form-item>
-      <el-form-item label="照片组时间" prop="groupDate">
+      <el-form-item label="照片组时间" prop="groupDate" label-width="100px">
         <el-date-picker
           v-model="queryParams.groupDate"
           value-format="YYYY-MM-DD HH:mm:ss"
@@ -28,7 +29,7 @@
           class="!w-220px"
         />
       </el-form-item>
-      <el-form-item label="创建时间" prop="createdAt">
+      <el-form-item label="创建时间" prop="createdAt" label-width="100px">
         <el-date-picker
           v-model="queryParams.createdAt"
           value-format="YYYY-MM-DD"
@@ -38,17 +39,17 @@
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="创建时间" prop="createTime">
-        <el-date-picker
-          v-model="queryParams.createTime"
-          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="createTime">-->
+<!--        <el-date-picker-->
+<!--          v-model="queryParams.createTime"-->
+<!--          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>
         <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>
@@ -60,6 +61,13 @@
         >
           <Icon icon="ep:plus" class="mr-5px" /> 新增
         </el-button>
+<!--        <el-button-->
+<!--          type="warning"-->
+<!--          plain-->
+<!--          @click="handleImport"-->
+<!--        >-->
+<!--          <Icon icon="ep:upload" /> 批量导入图片-->
+<!--        </el-button>-->
         <el-button
           type="success"
           plain
@@ -86,13 +94,13 @@
         width="180px"
       />
       <el-table-column label="照片组简介" align="center" prop="groupDescription" />
-      <el-table-column
-        label="创建时间"
-        align="center"
-        prop="createdAt"
-        :formatter="dateFormatter"
-        width="180px"
-      />
+<!--      <el-table-column-->
+<!--        label="创建时间"-->
+<!--        align="center"-->
+<!--        prop="createdAt"-->
+<!--        :formatter="dateFormatter"-->
+<!--        width="180px"-->
+<!--      />-->
       <el-table-column
         label="创建时间"
         align="center"
@@ -100,14 +108,29 @@
         :formatter="dateFormatter"
         width="180px"
       />
-      <el-table-column label="照片组上传" align="center" prop="uploadPhotos" />
+      <el-table-column label="照片组上传" align="center" prop="uploadPhotos" >
+<!--        <el-image-->
+<!--        style="width: 40px; height:40px"-->
+<!--        class="h-80px w-80px"-->
+<!--        lazy-->
+<!--        :src=""-->
+<!--        :preview-src-list="[]"-->
+<!--        preview-teleported-->
+<!--        fit="cover"-->
+<!--      />-->
+        </el-table-column>
       <el-table-column label="操作" align="center" min-width="120px">
         <template #default="scope">
+          <el-button
+            link
+            @click="viewImageDetails(scope.row.id)"
+            v-hasPermi="['museums:photos:query']"
+          >查看</el-button>
           <el-button
             link
             type="primary"
             @click="openForm('update', scope.row.id)"
-            v-hasPermi="['museums:photo-group:update']"
+
           >
             编辑
           </el-button>
@@ -133,6 +156,7 @@
 
   <!-- 表单弹窗:添加/修改 -->
   <PhotoGroupForm ref="formRef" @success="getList" />
+<!--  <ImageImportForm ref="importFormRef" @success="getList" />-->
 </template>
 
 <script setup lang="ts">
@@ -140,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'
 /** 博物馆照片组 列表 */
 defineOptions({ name: 'PhotoGroup' })
 
@@ -156,7 +180,7 @@ const queryParams = reactive({
   groupName: undefined,
   groupDate: [],
   groupDescription: undefined,
-  createdAt: undefined,
+ // createdAt: undefined,
   createdAt: [],
   createTime: [],
   uploadPhotos: undefined
@@ -169,6 +193,7 @@ const getList = async () => {
   loading.value = true
   try {
     const data = await PhotoGroupApi.getPhotoGroupPage(queryParams)
+    console.log(data)
     list.value = data.list
     total.value = data.total
   } finally {
@@ -207,6 +232,13 @@ const handleDelete = async (id: number) => {
   } catch {}
 }
 
+// /** 批量图片导入 */
+// const importFormRef = ref()
+// const handleImport = () => {
+//   importFormRef.value.open()
+//
+// }
+
 /** 导出按钮操作 */
 const handleExport = async () => {
   try {
@@ -226,4 +258,17 @@ const handleExport = async () => {
 onMounted(() => {
   getList()
 })
-</script>
+
+/** 查看页面 **/
+import { useRouter } from 'vue-router';
+const router = useRouter();
+const viewImageDetails=(groupId: number) => {
+  router.push({
+    name: 'ImageDetails',
+    query: {
+      groupId: groupId,
+    }
+  })
+}
+
+</script>

+ 82 - 25
src/views/museums/photos/index.vue

@@ -1,6 +1,6 @@
 <template>
   <ContentWrap>
-    <!-- 搜索工作栏 -->
+<!--     搜索工作栏-->
     <el-form
       class="-mb-15px"
       :model="queryParams"
@@ -8,24 +8,24 @@
       :inline="true"
       label-width="68px"
     >
-      <el-form-item label="照片组表id" prop="groupId">
+      <el-form-item label="照片id" prop="Id" label-width="100px" >
         <el-input
-          v-model="queryParams.groupId"
-          placeholder="请输入照片组表id"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="照片存储路径" prop="photoUrl">
-        <el-input
-          v-model="queryParams.photoUrl"
-          placeholder="请输入照片存储路径"
+          v-model="queryParams.id"
+          placeholder="照片id"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
         />
       </el-form-item>
+<!--      <el-form-item label="照片存储路径" prop="photoUrl">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.photoUrl"-->
+<!--          placeholder="请输入照片存储路径"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
       <el-form-item label="上传时间" prop="createdAt">
         <el-date-picker
           v-model="queryParams.createdAt"
@@ -58,6 +58,7 @@
         >
           <Icon icon="ep:plus" class="mr-5px" /> 新增
         </el-button>
+
         <el-button
           type="success"
           plain
@@ -69,14 +70,51 @@
         </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="groupId" />
-      <el-table-column label="照片存储路径" align="center" prop="photoUrl" />
+      <el-table-column label="序号" align="center" prop="id" />
+      <el-table-column label="照片id" align="center" prop="groupId" />
+      <el-table-column label="照片" align="center" prop="photoUrl" >
+        <template #default="{ row }">
+          <el-image
+            lazy
+            :src="row.photoUrl"
+            :zoom-rate="1.2"
+            :max-scale="7"
+            :min-scale="0.2"
+            :initial-index="4"
+            fit="cover"
+          />
+        </template>
+      </el-table-column>
+      <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;-->
+<!--            class="h-80px w-80px"-->
+<!--            lazy-->
+<!--            :src="scope.row.photoUrl"-->
+<!--            :preview-src-list="[scope.row.photoUrl]"-->
+<!--            preview-teleported-->
+<!--            fit="cover"-->
+<!--          />-->
+<!--&lt;!&ndash;          <el-link&ndash;&gt;-->
+<!--            v-else-if="url.includes('pdf')"-->
+<!--            type="primary"-->
+<!--            :href="url"-->
+<!--            :underline="false"-->
+<!--            target="_blank"-->
+<!--          >预览</el-link-->
+<!--          >-->
+<!--          <el-link v-else type="primary" download :href="url" :underline="false" target="_blank"-->
+<!--          >下载</el-link-->
+<!--          >-->
+<!--        </template>-->
+      </el-table-column>
       <el-table-column
         label="上传时间"
         align="center"
@@ -128,25 +166,26 @@
 <script setup lang="ts">
 import { dateFormatter } from '@/utils/formatTime'
 import download from '@/utils/download'
-import { PhotosApi, PhotosVO } from '@/api/museums/photos'
+import { PhotosApi, } from '@/api/museums/photos'
 import PhotosForm from './PhotosForm.vue'
+import {ref} from "vue";
+import SpecimenImportForm from "@/views/museums/specimeninfo/SpecimenImportForm.vue";
 
 /** 博物馆照片 列表 */
 defineOptions({ name: 'Photos' })
-
+const {query} = useRoute() // 查询参数
 const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化
-
 const loading = ref(true) // 列表的加载中
-const list = ref<PhotosVO[]>([]) // 列表的数据
+const list = ref<any>([]) // 列表的数据
 const total = ref(0) // 列表的总页数
 const queryParams = reactive({
+  id: 1 ,
   pageNo: 1,
   pageSize: 10,
-  groupId: undefined,
+  groupId: query.groupId,
   photoUrl: undefined,
   createdAt: undefined,
-  createdAt: [],
   createTime: []
 })
 const queryFormRef = ref() // 搜索的表单
@@ -157,8 +196,8 @@ const getList = async () => {
   loading.value = true
   try {
     const data = await PhotosApi.getPhotosPage(queryParams)
-    list.value = data.list
-    total.value = data.total
+    list.value = data
+    //total.value = data.total
   } finally {
     loading.value = false
   }
@@ -195,6 +234,7 @@ const handleDelete = async (id: number) => {
   } catch {}
 }
 
+
 /** 导出按钮操作 */
 const handleExport = async () => {
   try {
@@ -213,5 +253,22 @@ const handleExport = async () => {
 /** 初始化 **/
 onMounted(() => {
   getList()
+
 })
-</script>
+
+
+</script>
+
+
+<style scoped>
+.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;
+}
+</style>

+ 189 - 0
src/views/museums/specimeninfo/SpecimenImportForm.vue

@@ -0,0 +1,189 @@
+<template>
+  <Dialog v-model="dialogVisible" title="标本信息导入" width="600">
+    <el-upload
+      ref="uploadRef"
+      v-model:file-list="fileList"
+      :action="importUrl + '?updateSupport=' + updateSupport"
+      :auto-upload="false"
+      :disabled="formLoading"
+      :headers="uploadHeaders"
+      :limit="1"
+      :on-error="submitFormError"
+      :on-exceed="handleExceed"
+      :on-success="submitFormSuccess"
+      accept=".xlsx, .xls"
+      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>仅允许导入 xls、xlsx 格式文件。</span>
+          <el-link
+            :underline="false"
+            style="font-size: 12px; vertical-align: baseline"
+            type="primary"
+            @click="importTemplate"
+          >
+            下载模板
+          </el-link>
+        </div>
+      </template>
+    </el-upload>
+
+    <el-upload
+      ref="uploadimageRef"
+      v-model:file-list="imageList"
+      drag
+      :action="importImageUrl + '?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">
+        <em>点击批量上传图片</em>
+      </div>
+      <template #tip>
+        <div class="el-upload__tip text-center">
+          <el-checkbox v-model="updateSupport" />
+<!--          是否更新已经存在的标本图片-->
+        <span>仅允许导入jpg、png、gif 格式文件。</span>
+                </div>
+      </template>
+    </el-upload>
+    <template #footer>
+      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+
+<script lang="ts" setup>
+import download from '@/utils/download'
+import { getAccessToken, getTenantId } from '@/utils/auth'
+import {SpecimenInfoApi} from "@/api/museums/specimeninfo";
+import {UploadFilled} from "@element-plus/icons-vue";
+import {useUpload} from "@/components/UploadFile/src/useUpload";
+
+defineOptions({ name: 'SpecimenImportForm' })
+const dialogVisible = ref(false) // 弹窗的是否展示
+const formLoading = ref(false) // 表单的加载中
+const uploadRef = ref()
+// const uploadimageRef = ref()
+const message = useMessage() // 消息弹窗
+const updateSupport = ref(0) // 是否更新已经存在的用户数据
+//const updateImageSupport = ref()  //是否更新已经存在的标本图片
+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'
+/** 打开弹窗 */
+const open = () => {
+  dialogVisible.value = true
+  updateSupport.value = 0
+  fileList.value = []
+  imageList.value = []
+  resetForm()
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+const {  httpRequest } = useUpload()
+
+/** 提交表单 */
+const submitForm = async () => {
+  if (fileList.value.length == 0) {
+    message.error('请上传文件')
+    return
+  }
+  // 提交请求
+  uploadHeaders.value = {
+    Authorization: 'Bearer ' + getAccessToken(),
+    'tenant-id': getTenantId()
+  }
+  formLoading.value = true
+  uploadRef.value!.submit()
+
+}
+
+/** 文件上传成功 */
+const emits = defineEmits(['success'])
+const submitFormSuccess = (response: any) => {
+  if (response.code !== 0) {
+    message.error(response.msg)
+    formLoading.value = false
+    return
+  }
+  // 拼接提示语
+  const data = response.data
+  let text = '上传成功数量:' + data.createSpecimenNumbers.length + ';'
+  for (let specimenInfodata of data.createSpecimenNumbers) {
+    text += '< ' + specimenInfodata + ' >'
+  }
+  text += '更新成功数量:' + data.updateSpecimenNumbers.length + ';'
+  for (const specimenInfodata of data.updateSpecimenNumbers) {
+    text += '< ' + specimenInfodata + ' >'
+  }
+  text += '更新失败数量:' + Object.keys(data.failureSpecimenNumbers).length + ';'
+  for (const specimenInfodata in data.failureSpecimenNumbers) {
+    text += '< ' + specimenInfodata + ': ' + data.failureSpecimenNumbers[specimenInfodata] + ' >'
+  }
+  message.alert(text)
+  formLoading.value = false
+  dialogVisible.value = false
+  // 发送操作成功的事件
+  emits('success')
+}
+
+/** 上传错误提示 */
+const submitFormError = (): void => {
+  message.error('上传失败,请您重新上传!')
+  formLoading.value = false
+}
+
+/** 重置表单 */
+const resetForm = async (): Promise<void> => {
+  // 重置上传状态和文件
+  formLoading.value = false
+  await nextTick()
+  uploadRef.value?.clearFiles()
+}
+
+/** 文件数超出提示 */
+const handleExceed = (): void => {
+  message.error('最多只能上传一个文件!')
+}
+/** 下载模板操作 */
+const importTemplate = async () => {
+  const res = await SpecimenInfoApi.importSpecimenInfTemplate()
+  download.excel(res, '用户导入模版.xls')
+}
+
+/** 图片上传成功 */
+
+const submitImageSuccess = (response: any) => {
+  console.log('tj',response)
+  if (response.code !== 0) {
+    message.error(response.msg)
+    formLoading.value = false
+    return
+  }
+  formLoading.value = false
+  dialogVisible.value = false
+  // 发送操作成功的事件
+
+}
+
+
+
+
+</script>

+ 96 - 41
src/views/museums/specimeninfo/SpecimenInfoForm.vue

@@ -7,8 +7,9 @@
       label-width="100px"
       v-loading="formLoading"
     >
-      <el-form-item label="标本类型(矿物、岩石矿石、化石、陨石)" prop="specimenType">
-        <el-select v-model="formData.specimenType" placeholder="请选择标本类型(矿物、岩石矿石、化石、陨石)">
+      <el-form-item label="标本类型)" prop="specimenType">
+        <el-select v-model="formData.specimenType"
+                   placeholder="请选择标本类型(矿物、岩石矿石、化石、陨石)">
           <el-option
             v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_SPECIMEN_INFO)"
             :key="dict.value"
@@ -18,37 +19,37 @@
         </el-select>
       </el-form-item>
       <el-form-item label="标本编号" prop="specimenNumber">
-        <el-input v-model="formData.specimenNumber" placeholder="请输入标本编号" />
+        <el-input v-model="formData.assetNumber" placeholder="请输入标本编号"/>
       </el-form-item>
       <el-form-item label="资产号" prop="assetNumber">
-        <el-input v-model="formData.assetNumber" placeholder="请输入资产号" />
+        <el-input v-model="formData.assetNumber" placeholder="请输入资产号"/>
       </el-form-item>
       <el-form-item label="存放位置" prop="storageLocation">
-        <el-input v-model="formData.storageLocation" placeholder="请输入存放位置" />
+        <el-input v-model="formData.storageLocation" placeholder="请输入存放位置"/>
       </el-form-item>
       <el-form-item label="中文名称" prop="chineseName">
-        <el-input v-model="formData.chineseName" placeholder="请输入中文名称" />
+        <el-input v-model="formData.chineseName" placeholder="请输入中文名称"/>
       </el-form-item>
       <el-form-item label="英文名称" prop="englishName">
-        <el-input v-model="formData.englishName" placeholder="请输入英文名称" />
+        <el-input v-model="formData.englishName" placeholder="请输入英文名称"/>
       </el-form-item>
       <el-form-item label="成分" prop="composition">
-        <el-input v-model="formData.composition" placeholder="请输入成分" />
+        <el-input v-model="formData.composition" placeholder="请输入成分"/>
       </el-form-item>
       <el-form-item label="产地" prop="origin">
-        <el-input v-model="formData.origin" placeholder="请输入产地" />
+        <el-input v-model="formData.origin" placeholder="请输入产地"/>
       </el-form-item>
       <el-form-item label="时代" prop="era">
-        <el-input v-model="formData.era" placeholder="请输入时代" />
+        <el-input v-model="formData.era" placeholder="请输入时代"/>
       </el-form-item>
       <el-form-item label="保存地层" prop="preservedLayer">
-        <el-input v-model="formData.preservedLayer" placeholder="请输入保存地层" />
+        <el-input v-model="formData.preservedLayer" placeholder="请输入保存地层"/>
       </el-form-item>
       <el-form-item label="陨石类型" prop="meteoriteType">
-        <el-input v-model="formData.meteoriteType" placeholder="请输入陨石类型" />
+        <el-input v-model="formData.meteoriteType" placeholder="请输入陨石类型"/>
       </el-form-item>
       <el-form-item label="国际命名" prop="internationalName">
-        <el-input v-model="formData.internationalName" placeholder="请输入国际命名" />
+        <el-input v-model="formData.internationalName" placeholder="请输入国际命名"/>
       </el-form-item>
       <el-form-item label="发现时间" prop="discoveryTime">
         <el-date-picker
@@ -66,8 +67,9 @@
           placeholder="选择降落时间"
         />
       </el-form-item>
-      <el-form-item label="保存类型(标本、光片、薄片模型及其他)" prop="preservationType">
-        <el-select v-model="formData.preservationType" placeholder="请选择保存类型(标本、光片、薄片模型及其他)">
+      <el-form-item label="保存类型" prop="preservationType">
+        <el-select v-model="formData.preservationType"
+                   placeholder="请选择保存类型(标本、光片、薄片模型及其他)">
           <el-option
             v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_SPECIMEN_INFO)"
             :key="dict.value"
@@ -77,12 +79,12 @@
         </el-select>
       </el-form-item>
       <el-form-item label="尺寸" prop="size">
-        <el-input v-model="formData.size" placeholder="请输入尺寸" />
+        <el-input v-model="formData.size" placeholder="请输入尺寸"/>
       </el-form-item>
       <el-form-item label="重量" prop="weight">
-        <el-input v-model="formData.weight" placeholder="请输入重量" />
+        <el-input v-model="formData.weight" placeholder="请输入重量"/>
       </el-form-item>
-      <el-form-item label="来源(采购、捐赠、采集)" prop="source">
+      <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)"
@@ -92,10 +94,10 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="标本提供者(供应商、捐赠人、采集人)" prop="provider">
-        <el-input v-model="formData.provider" placeholder="请输入标本提供者(供应商、捐赠人、采集人)" />
+      <el-form-item label="标本提供者" prop="provider">
+        <el-input v-model="formData.provider" placeholder="请输入标本提供者(供应商、捐赠人、采集人)"/>
       </el-form-item>
-      <el-form-item label="入藏时间(购买、捐赠、采集时间)" prop="acquisitionTime">
+      <el-form-item label="入藏时间" prop="acquisitionTime">
         <el-date-picker
           v-model="formData.acquisitionTime"
           type="date"
@@ -104,12 +106,12 @@
         />
       </el-form-item>
       <el-form-item label="用途" prop="purpose">
-        <el-input v-model="formData.purpose" placeholder="请输入用途" />
+        <el-input v-model="formData.purpose" placeholder="请输入用途"/>
       </el-form-item>
       <el-form-item label="描述" prop="description">
-        <Editor v-model="formData.description" height="150px" />
+        <Editor v-model="formData.description" height="150px"/>
       </el-form-item>
-      <el-form-item label="馆藏状态(在馆、借出)" prop="collectionStatus">
+      <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)"
@@ -121,19 +123,39 @@
         </el-radio-group>
       </el-form-item>
       <el-form-item label="备注" prop="notes">
-        <el-input v-model="formData.notes" placeholder="请输入备注" />
+        <el-input v-model="formData.notes" placeholder="请输入备注"/>
       </el-form-item>
       <el-form-item label="图片名称" prop="imageName">
-        <el-input v-model="formData.imageName" placeholder="请输入图片名称" />
-      </el-form-item>
-      <el-form-item label="图片路径" prop="imagePath">
-        <el-input v-model="formData.imagePath" placeholder="请输入图片路径" />
+        <el-input v-model="formData.imageName" placeholder="请输入图片名称"/>
       </el-form-item>
+            <el-form-item label="图片路径" prop="imagePath">
+              <UploadImg v-model="formData.imagePath" />
+<!--              <el-upload-->
+<!--                v-model="formData.imagePath"-->
+<!--                class="upload-demo"-->
+<!--                drag-->
+<!--                :action="importUrl + '?updateSupport=' + updateSupport"-->
+<!--                :on-success="submitFormSuccess"-->
+<!--                style="max-width:250px;max-height: 20vh;margin-left: 20px"-->
+<!--              >-->
+<!--                <el-icon class="el-icon&#45;&#45;upload"><upload-filled /></el-icon>-->
+<!--                <div class="el-upload__text">-->
+<!--                  <em>点击批量上传图片</em>-->
+<!--                </div>-->
+<!--                <template #tip>-->
+<!--                  <div class="el-upload__tip">-->
+<!--                    <el-checkbox v-model="updateSupport" />-->
+<!--                    是否更新已经存在的标本图片-->
+<!--                  </div>-->
+<!--                </template>-->
+<!--              </el-upload>-->
+                    </el-form-item>
+
       <el-form-item label="注销原因" prop="deletedReason">
-        <el-input v-model="formData.deletedReason" placeholder="请输入注销原因" />
+        <el-input v-model="formData.deletedReason" placeholder="请输入注销原因"/>
       </el-form-item>
       <el-form-item label="入库操作员" prop="operator">
-        <el-input v-model="formData.operator" placeholder="请输入入库操作员" />
+        <el-input v-model="formData.operator" placeholder="请输入入库操作员"/>
       </el-form-item>
       <el-form-item label="入库时间" prop="entryDate">
         <el-date-picker
@@ -151,13 +173,16 @@
   </Dialog>
 </template>
 <script setup lang="ts">
-import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
-import { SpecimenInfoApi, SpecimenInfoVO } from '@/api/museums/specimeninfo'
-
+import {getIntDictOptions, DICT_TYPE} from '@/utils/dict'
+import {SpecimenInfoApi, SpecimenInfoVO} from '@/api/museums/specimeninfo'
+//import type {UploadProps, UploadUserFile} from 'element-plus'
+import { UploadFilled } from '@element-plus/icons-vue'
+import { ref, reactive, defineExpose, defineEmits } from 'vue'
+//import {log} from "echarts/types/src/util/log";
 /** 标本管理 表单 */
-defineOptions({ name: 'SpecimenInfoForm' })
+defineOptions({name: 'SpecimenInfoForm'})
 
-const { t } = useI18n() // 国际化
+const {t} = useI18n() // 国际化
 const message = useMessage() // 消息弹窗
 
 const dialogVisible = ref(false) // 弹窗的是否展示
@@ -197,16 +222,23 @@ const formData = ref({
   entryDate: undefined
 })
 const formRules = reactive({
-  specimenType: [{ required: true, message: '标本类型(矿物、岩石矿石、化石、陨石)不能为空', trigger: 'change' }],
-  specimenNumber: [{ required: true, message: '标本编号不能为空', trigger: 'blur' }]
+  specimenType: [{
+    required: true,
+    message: '标本类型(矿物、岩石矿石、化石、陨石)不能为空',
+    trigger: 'change'
+  }],
+  specimenNumber: [{required: true, message: '标本编号不能为空', trigger: 'blur'}]
 })
 const formRef = ref() // 表单 Ref
-
+const updateSupport = ref(0) // 是否更新已经存在的用户数据
+const importUrl =
+  import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + '/museums/specimen-info/import-specimen-images'
 /** 打开弹窗 */
 const open = async (type: string, id?: number) => {
   dialogVisible.value = true
   dialogTitle.value = t('action.' + type)
   formType.value = type
+  //updateSupport.value = 0
   resetForm()
   // 修改时,设置数据
   if (id) {
@@ -218,7 +250,7 @@ const open = async (type: string, id?: number) => {
     }
   }
 }
-defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+defineExpose({open}) // 提供 open 方法,用于打开弹窗
 
 /** 提交表单 */
 const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
@@ -244,6 +276,29 @@ const submitForm = async () => {
   }
 }
 
+
+/**图片上传**/
+
+
+
+// /** 图片上传成功 */
+//
+// 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 resetForm = () => {
   formData.value = {
@@ -280,4 +335,4 @@ const resetForm = () => {
   }
   formRef.value?.resetFields()
 }
-</script>
+</script>

+ 103 - 0
src/views/museums/specimeninfo/imageImportForm.vue

@@ -0,0 +1,103 @@
+<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"
+
+    >
+      <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>
+    <template #footer >
+      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+
+</template>
+
+<script lang="ts" setup>
+import {UploadFilled} from "@element-plus/icons-vue";
+
+import { useUpload } from '@/components/UploadFile/src/useUpload'
+import {getAccessToken, getTenantId} from "@/utils/auth";
+const importUrl =
+  import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + '/museums/specimen-info/import-specimen-images'
+defineOptions({ name: 'imageImportForm' })
+const dialogVisible = ref(false) // 弹窗的是否展示
+const formLoading = ref(false) // 表单的加载中
+const uploadRef = ref()
+const message = useMessage() // 消息弹窗
+const updateSupport = ref(0) // 是否更新已经存在的用户数据
+const fileList = ref([]) // 文件列表
+const uploadHeaders = ref() // 上传 Header 头
+/** 打开弹窗 */
+const open = () => {
+  dialogVisible.value = true
+  updateSupport.value = 0
+  fileList.value = []
+  resetForm()
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+const {  httpRequest } = useUpload()
+
+console.log(httpRequest , importUrl)
+/** 提交表单 */
+const submitForm = async () => {
+  if (fileList.value.length == 0) {
+    message.error('请上传文件')
+    return
+  }
+
+  formLoading.value = true
+  uploadRef.value!.submit()
+}
+
+/** 上传错误提示 */
+const submitFormError = (): void => {
+  message.error('上传失败,请您重新上传!')
+  formLoading.value = false
+}
+/** 图片上传成功 */
+
+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 resetForm = async (): Promise<void> => {
+  // 重置上传状态和文件
+  formLoading.value = false
+  await nextTick()
+  uploadRef.value?.clearFiles()
+}
+
+
+</script>

+ 296 - 233
src/views/museums/specimeninfo/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <ContentWrap>
+  <ContentWrap >
     <!-- 搜索工作栏 -->
     <el-form
       class="-mb-15px"
@@ -7,22 +7,9 @@
       ref="queryFormRef"
       :inline="true"
       label-width="68px"
+      style="margin-left: 20px"
     >
-      <el-form-item label="标本类型(矿物、岩石矿石、化石、陨石)" prop="specimenType">
-        <el-select
-          v-model="queryParams.specimenType"
-          placeholder="请选择标本类型(矿物、岩石矿石、化石、陨石)"
-          clearable
-          class="!w-240px"
-        >
-          <el-option
-            v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_SPECIMEN_INFO)"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
+
       <el-form-item label="标本编号" prop="specimenNumber">
         <el-input
           v-model="queryParams.specimenNumber"
@@ -32,24 +19,6 @@
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="资产号" prop="assetNumber">
-        <el-input
-          v-model="queryParams.assetNumber"
-          placeholder="请输入资产号"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="存放位置" prop="storageLocation">
-        <el-input
-          v-model="queryParams.storageLocation"
-          placeholder="请输入存放位置"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
       <el-form-item label="中文名称" prop="chineseName">
         <el-input
           v-model="queryParams.chineseName"
@@ -59,15 +28,49 @@
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="英文名称" prop="englishName">
-        <el-input
-          v-model="queryParams.englishName"
-          placeholder="请输入英文名称"
+      <el-form-item label="标本类型" prop="specimenType">
+        <el-select
+          v-model="queryParams.specimenType"
+          placeholder="请选择标本类型(矿物、岩石矿石、化石、陨石)"
           clearable
-          @keyup.enter="handleQuery"
           class="!w-240px"
-        />
+        >
+          <el-option
+            v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_SPECIMEN_INFO)"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
       </el-form-item>
+<!--      <el-form-item label="资产号" prop="assetNumber">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.assetNumber"-->
+<!--          placeholder="请输入资产号"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="存放位置" prop="storageLocation">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.storageLocation"-->
+<!--          placeholder="请输入存放位置"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
+
+<!--      <el-form-item label="英文名称" prop="englishName">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.englishName"-->
+<!--          placeholder="请输入英文名称"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
       <el-form-item label="成分" prop="composition">
         <el-input
           v-model="queryParams.composition"
@@ -77,15 +80,15 @@
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="产地" prop="origin">
-        <el-input
-          v-model="queryParams.origin"
-          placeholder="请输入产地"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
+<!--      <el-form-item label="产地" prop="origin">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.origin"-->
+<!--          placeholder="请输入产地"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
       <el-form-item label="时代" prop="era">
         <el-input
           v-model="queryParams.era"
@@ -95,24 +98,24 @@
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="保存地层" prop="preservedLayer">
-        <el-input
-          v-model="queryParams.preservedLayer"
-          placeholder="请输入保存地层"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="陨石类型" prop="meteoriteType">
-        <el-input
-          v-model="queryParams.meteoriteType"
-          placeholder="请输入陨石类型"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
+<!--      <el-form-item label="保存地层" prop="preservedLayer">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.preservedLayer"-->
+<!--          placeholder="请输入保存地层"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="陨石类型" prop="meteoriteType">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.meteoriteType"-->
+<!--          placeholder="请输入陨石类型"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
       <el-form-item label="国际命名" prop="internationalName">
         <el-input
           v-model="queryParams.internationalName"
@@ -122,29 +125,29 @@
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="发现时间" prop="discoveryTime">
-        <el-date-picker
-          v-model="queryParams.discoveryTime"
-          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="fallTime">
-        <el-date-picker
-          v-model="queryParams.fallTime"
-          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="preservationType">
+<!--      <el-form-item label="发现时间" prop="discoveryTime">-->
+<!--        <el-date-picker-->
+<!--          v-model="queryParams.discoveryTime"-->
+<!--          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="fallTime">-->
+<!--        <el-date-picker-->
+<!--          v-model="queryParams.fallTime"-->
+<!--          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="preservationType">
         <el-select
           v-model="queryParams.preservationType"
           placeholder="请选择保存类型(标本、光片、薄片模型及其他)"
@@ -159,25 +162,25 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="尺寸" prop="size">
-        <el-input
-          v-model="queryParams.size"
-          placeholder="请输入尺寸"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="重量" prop="weight">
-        <el-input
-          v-model="queryParams.weight"
-          placeholder="请输入重量"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="来源(采购、捐赠、采集)" prop="source">
+<!--      <el-form-item label="尺寸" prop="size">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.size"-->
+<!--          placeholder="请输入尺寸"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="重量" prop="weight">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.weight"-->
+<!--          placeholder="请输入重量"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
+      <el-form-item label="来源" prop="source">
         <el-select
           v-model="queryParams.source"
           placeholder="请选择来源(采购、捐赠、采集)"
@@ -192,16 +195,16 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="标本提供者(供应商、捐赠人、采集人)" prop="provider">
-        <el-input
-          v-model="queryParams.provider"
-          placeholder="请输入标本提供者(供应商、捐赠人、采集人)"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="入藏时间(购买、捐赠、采集时间)" prop="acquisitionTime">
+<!--      <el-form-item label="标本提供者" prop="provider">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.provider"-->
+<!--          placeholder="请输入标本提供者(供应商、捐赠人、采集人)"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
+      <el-form-item label="入藏时间" prop="acquisitionTime">
         <el-date-picker
           v-model="queryParams.acquisitionTime"
           value-format="YYYY-MM-DD HH:mm:ss"
@@ -221,88 +224,88 @@
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="馆藏状态(在馆、借出)" prop="collectionStatus">
-        <el-select
-          v-model="queryParams.collectionStatus"
-          placeholder="请选择馆藏状态(在馆、借出)"
-          clearable
-          class="!w-240px"
-        >
-          <el-option
-            v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_SPECIMEN_INFO)"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="备注" prop="notes">
-        <el-input
-          v-model="queryParams.notes"
-          placeholder="请输入备注"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="图片名称" prop="imageName">
-        <el-input
-          v-model="queryParams.imageName"
-          placeholder="请输入图片名称"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="图片路径" prop="imagePath">
-        <el-input
-          v-model="queryParams.imagePath"
-          placeholder="请输入图片路径"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="创建时间" prop="createTime">
-        <el-date-picker
-          v-model="queryParams.createTime"
-          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="deletedReason">
-        <el-input
-          v-model="queryParams.deletedReason"
-          placeholder="请输入注销原因"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="入库操作员" prop="operator">
-        <el-input
-          v-model="queryParams.operator"
-          placeholder="请输入入库操作员"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="入库时间" prop="entryDate">
-        <el-date-picker
-          v-model="queryParams.entryDate"
-          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="collectionStatus">-->
+<!--        <el-select-->
+<!--          v-model="queryParams.collectionStatus"-->
+<!--          placeholder="请选择馆藏状态(在馆、借出)"-->
+<!--          clearable-->
+<!--          class="!w-240px"-->
+<!--        >-->
+<!--          <el-option-->
+<!--            v-for="dict in getIntDictOptions(DICT_TYPE.MUSEUMS_SPECIMEN_INFO)"-->
+<!--            :key="dict.value"-->
+<!--            :label="dict.label"-->
+<!--            :value="dict.value"-->
+<!--          />-->
+<!--        </el-select>-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="备注" prop="notes">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.notes"-->
+<!--          placeholder="请输入备注"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="图片名称" prop="imageName">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.imageName"-->
+<!--          placeholder="请输入图片名称"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="图片路径" prop="imagePath">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.imagePath"-->
+<!--          placeholder="请输入图片路径"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="创建时间" prop="createTime">-->
+<!--        <el-date-picker-->
+<!--          v-model="queryParams.createTime"-->
+<!--          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="deletedReason">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.deletedReason"-->
+<!--          placeholder="请输入注销原因"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--&lt;!&ndash;      </el-form-item>&ndash;&gt;-->
+<!--      <el-form-item label="入库操作员" prop="operator">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.operator"-->
+<!--          placeholder="请输入入库操作员"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="入库时间" prop="entryDate">-->
+<!--        <el-date-picker-->
+<!--          v-model="queryParams.entryDate"-->
+<!--          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>
         <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>
@@ -314,12 +317,20 @@
         >
           <Icon icon="ep:plus" class="mr-5px" /> 新增
         </el-button>
+        <el-button
+          type="warning"
+          plain
+          @click="handleImport"
+          v-hasPermi="['museums:specimen-info:import']"
+        >
+          <Icon icon="ep:upload" /> 导入信息
+        </el-button>
         <el-button
           type="success"
           plain
           @click="handleExport"
           :loading="exportLoading"
-          v-hasPermi="['museums:specimen-info:export']"
+
         >
           <Icon icon="ep:download" class="mr-5px" /> 导出
         </el-button>
@@ -330,52 +341,67 @@
   <!-- 列表 -->
   <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="标本类型(矿物、岩石矿石、化石、陨石)" align="center" prop="specimenType">
+
+      <el-table-column label="序号" align="center" prop="id" />
+      <el-table-column label="中文名称" align="center" prop="chineseName" />
+      <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" />
         </template>
       </el-table-column>
-      <el-table-column label="标本编号" align="center" prop="specimenNumber" />
-      <el-table-column label="资产号" align="center" prop="assetNumber" />
+<!--      <el-table-column label="资产号" align="center" prop="assetNumber" />-->
       <el-table-column label="存放位置" align="center" prop="storageLocation" />
-      <el-table-column label="中文名称" align="center" prop="chineseName" />
-      <el-table-column label="英文名称" align="center" prop="englishName" />
-      <el-table-column label="成分" align="center" prop="composition" />
-      <el-table-column label="产地" align="center" prop="origin" />
-      <el-table-column label="时代" align="center" prop="era" />
-      <el-table-column label="保存地层" align="center" prop="preservedLayer" />
-      <el-table-column label="陨石类型" align="center" prop="meteoriteType" />
-      <el-table-column label="国际命名" align="center" prop="internationalName" />
-      <el-table-column label="发现时间" align="center" prop="discoveryTime" />
-      <el-table-column label="降落时间" align="center" prop="fallTime" />
-      <el-table-column label="保存类型(标本、光片、薄片模型及其他)" align="center" prop="preservationType">
+
+<!--      <el-table-column label="英文名称" align="center" prop="englishName" />-->
+<!--      <el-table-column label="成分" align="center" prop="composition" />-->
+<!--      <el-table-column label="产地" align="center" prop="origin" />-->
+<!--      <el-table-column label="时代" align="center" prop="era" />-->
+<!--      <el-table-column label="保存地层" align="center" prop="preservedLayer" />-->
+<!--      <el-table-column label="陨石类型" align="center" prop="meteoriteType" />-->
+<!--      <el-table-column label="国际命名" align="center" prop="internationalName" />-->
+<!--      <el-table-column label="发现时间" align="center" prop="discoveryTime" />-->
+<!--      <el-table-column label="降落时间" align="center" prop="fallTime" />-->
+      <el-table-column label="保存类型" align="center" prop="preservationType">
         <template #default="scope">
           <dict-tag :type="DICT_TYPE.MUSEUMS_SPECIMEN_INFO" :value="scope.row.preservationType" />
         </template>
       </el-table-column>
-      <el-table-column label="尺寸" align="center" prop="size" />
-      <el-table-column label="重量" align="center" prop="weight" />
-      <el-table-column label="来源(采购、捐赠、采集)" align="center" prop="source">
+<!--      <el-table-column label="尺寸" align="center" prop="size" />-->
+      <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" />
         </template>
       </el-table-column>
-      <el-table-column label="标本提供者(供应商、捐赠人、采集人)" align="center" prop="provider" />
-      <el-table-column label="入藏时间(购买、捐赠、采集时间)" align="center" prop="acquisitionTime" />
+<!--      <el-table-column label="标本提供者(供应商、捐赠人、采集人)" align="center" prop="provider" />-->
+      <el-table-column label="入藏时间" align="center" prop="acquisitionTime" />
       <el-table-column label="用途" align="center" prop="purpose" />
-      <el-table-column label="描述" align="center" prop="description" />
-      <el-table-column label="馆藏状态(在馆、借出)" align="center" prop="collectionStatus">
+<!--      <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" />
         </template>
       </el-table-column>
-      <el-table-column label="备注" align="center" prop="notes" />
-      <el-table-column label="图片名称" align="center" prop="imageName" />
-      <el-table-column label="图片路径" align="center" prop="imagePath" />
-      <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="notes" />-->
+<!--      <el-table-column label="图片名称" align="center" prop="imageName" />-->
+      <el-table-column label="图片" align="center" prop="url" width="110px">
+        <template #default="{ row }">
+          <el-image
+
+            style="width: 40px; height:40px"
+            class="h-80px w-80px"
+            lazy
+            :src="row.imagePath"
+            :preview-src-list="[row.imagePath]"
+            preview-teleported
+            fit="cover"
+          />
+        </template>
+      </el-table-column>
+<!--      <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"
@@ -383,8 +409,14 @@
         :formatter="dateFormatter"
         width="180px"
       />
-      <el-table-column label="操作" align="center" min-width="120px">
+
+      <el-table-column label="操作" align="center" min-width="150px" >
         <template #default="scope">
+          <el-button
+            link
+            @click="viewDetails(scope.row.id)"
+
+          >查看</el-button>
           <el-button
             link
             type="primary"
@@ -403,7 +435,9 @@
           </el-button>
         </template>
       </el-table-column>
+
     </el-table>
+
     <!-- 分页 -->
     <Pagination
       :total="total"
@@ -415,6 +449,8 @@
 
   <!-- 表单弹窗:添加/修改 -->
   <SpecimenInfoForm ref="formRef" @success="getList" />
+  <SpecimenImportForm ref="importFormRef" @success="getList" />
+
 </template>
 
 <script setup lang="ts">
@@ -423,7 +459,8 @@ import { dateFormatter } from '@/utils/formatTime'
 import download from '@/utils/download'
 import { SpecimenInfoApi, SpecimenInfoVO } from '@/api/museums/specimeninfo'
 import SpecimenInfoForm from './SpecimenInfoForm.vue'
-
+import SpecimenImportForm from './SpecimenImportForm.vue'
+import  ImageImportForm from './imageImportForm.vue'
 /** 标本管理 列表 */
 defineOptions({ name: 'SpecimenInfo' })
 
@@ -477,6 +514,7 @@ const getList = async () => {
     const data = await SpecimenInfoApi.getSpecimenInfoPage(queryParams)
     list.value = data.list
     total.value = data.total
+    console.log(data )
   } finally {
     loading.value = false
   }
@@ -513,6 +551,15 @@ const handleDelete = async (id: number) => {
   } catch {}
 }
 
+/** 批量导入 */
+const importFormRef = ref()
+const handleImport = () => {
+  importFormRef.value.open()
+
+}
+
+
+
 /** 导出按钮操作 */
 const handleExport = async () => {
   try {
@@ -532,4 +579,20 @@ const handleExport = async () => {
 onMounted(() => {
   getList()
 })
-</script>
+
+
+/** 查看页面 **/
+import { useRouter } from 'vue-router';
+import UserImportForm from "@/views/system/user/UserImportForm.vue";
+const router = useRouter();
+const viewDetails=(dataId: number) => {
+  router.push({
+    name: 'Details',
+    query: {
+      dataId: dataId,
+    }
+  })
+}
+
+</script>
+

+ 235 - 0
src/views/museums/specimenoutbound/ApproalProcess.vue

@@ -0,0 +1,235 @@
+<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>
+        <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="primary"
+          plain
+          @click="openForm('create')"
+          v-hasPermi="['museums:specimen-outbound:create']"
+        >
+          <Icon icon="ep:plus" 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="danger"
+            @click="handleApproval(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>
+  <Approval ref="ApprovalRef" @success="getList" />
+</template>
+
+
+<script setup lang="ts">
+import Approval from "@/views/museums/specimenoutbound/approval.vue"
+import download from '@/utils/download'
+import { SpecimenOutboundApi, SpecimenOutboundVO } from '@/api/museums/specimenoutbound'
+import {dateFormatter} from "@/utils/formatTime";
+import {ref} from "vue";
+
+defineOptions({ name: 'ApproalProcess' })
+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 formRef = ref()
+const openForm = (type: string, id?: number) => {
+  formRef.value.open(type, id)
+}
+/** 查询列表 */
+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 resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+
+/** 审批按钮操作 */
+
+// 检查用户权限的方法
+
+
+const ApprovalRef = ref()
+const handleApproval = (type: string, id?: number) => {
+  ApprovalRef.value.open(type, id)
+
+}
+/** 导出按钮操作 */
+const handleExport = async () => {
+  try {
+    // 导出的二次确认
+    await message.exportConfirm()
+    // 发起导出
+    exportLoading.value = true
+    const data = await SpecimenOutboundApi.ApprovalSpecimenOutbound(queryParams)
+    download.excel(data, '标本出库回库信息.xls')
+  } catch {
+  } finally {
+    exportLoading.value = false
+  }
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+
+</script>

+ 269 - 0
src/views/museums/specimenoutbound/OutboundApplication.vue

@@ -0,0 +1,269 @@
+<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="primary"
+        plain
+        @click="openForm('create')"
+        v-hasPermi="['museums:specimen-outbound:create']"
+      >
+        <Icon icon="ep:plus" 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="openForm('update', scope.row.id)"
+            v-hasPermi="['museums:specimen-outbound:update']"
+          >
+            编辑
+          </el-button>
+          <el-button
+            link
+            type="danger"
+            @click="handleDelete(scope.row.id)"
+            v-hasPermi="['museums:specimen-outbound:delete']"
+          >
+            删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </ContentWrap>
+
+  <!-- 表单弹窗:添加/修改 -->
+  <SpecimenOutboundForm ref="formRef" @success="getList" />
+  <Approval ref="ApprovalRef" @success="getList" />
+</template>
+
+
+
+
+<script setup lang="ts">
+import {dateFormatter} from "@/utils/formatTime";
+import download from '@/utils/download'
+import { SpecimenOutboundApi, SpecimenOutboundVO } from '@/api/museums/specimenoutbound'
+import Approval from "@/views/museums/specimenoutbound/approval.vue";
+import SpecimenOutboundForm from "@/views/museums/specimenoutbound/SpecimenOutboundForm.vue";
+import {ref} from "vue";
+defineOptions({ name: 'OutboundApplication' })
+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 resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+
+
+/** 添加/修改操作 */
+const formRef = ref()
+const openForm = (type: string, id?: number) => {
+  formRef.value.open(type, id)
+}
+
+
+/** 删除按钮操作 */
+const handleDelete = async (id: number) => {
+  try {
+    // 删除的二次确认
+    await message.delConfirm()
+    // 发起删除
+    await SpecimenOutboundApi.deleteSpecimenOutbound(id)
+    message.success(t('common.delSuccess'))
+    // 刷新列表
+    await getList()
+  } catch {}
+}
+
+/** 导出按钮操作 */
+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
+  }
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+
+
+</script>

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

@@ -196,4 +196,4 @@ const resetForm = () => {
   }
   formRef.value?.resetFields()
 }
-</script>
+</script>

+ 193 - 141
src/views/museums/specimenoutbound/index.vue

@@ -8,10 +8,10 @@
       :inline="true"
       label-width="68px"
     >
-      <el-form-item label="关联到总表中的标本ID" prop="infoId">
+      <el-form-item label="标本ID" prop="infoId">
         <el-input
           v-model="queryParams.infoId"
-          placeholder="请输入关联到总表中的标本ID"
+          placeholder="标本ID"
           clearable
           @keyup.enter="handleQuery"
           class="!w-240px"
@@ -26,7 +26,7 @@
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="申请出库的标本编号" prop="specimenNumber">
+      <el-form-item label="标本编号" prop="specimenNumber">
         <el-input
           v-model="queryParams.specimenNumber"
           placeholder="请输入申请出库的标本编号"
@@ -35,15 +35,15 @@
           class="!w-240px"
         />
       </el-form-item>
-      <el-form-item label="申请人或申请单位" prop="applicantName">
-        <el-input
-          v-model="queryParams.applicantName"
-          placeholder="请输入申请人或申请单位"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
+<!--      <el-form-item label="申请人或申请单位" prop="applicantName">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.applicantName"-->
+<!--          placeholder="请输入申请人或申请单位"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
       <el-form-item label="申请日期" prop="applicationDate">
         <el-date-picker
           v-model="queryParams.applicationDate"
@@ -55,24 +55,24 @@
           class="!w-220px"
         />
       </el-form-item>
-      <el-form-item label="申请出库的用途" prop="applicationUsage">
-        <el-input
-          v-model="queryParams.applicationUsage"
-          placeholder="请输入申请出库的用途"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="附件上传" prop="attachments">
-        <el-input
-          v-model="queryParams.attachments"
-          placeholder="请输入附件上传"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
+<!--      <el-form-item label="申请出库的用途" prop="applicationUsage">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.applicationUsage"-->
+<!--          placeholder="请输入申请出库的用途"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="附件上传" prop="attachments">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.attachments"-->
+<!--          placeholder="请输入附件上传"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
       <el-form-item label="审批状态" prop="status">
         <el-select
           v-model="queryParams.status"
@@ -83,97 +83,97 @@
           <el-option label="请选择字典生成" value="" />
         </el-select>
       </el-form-item>
-      <el-form-item label="备注信息" prop="remarks">
-        <el-input
-          v-model="queryParams.remarks"
-          placeholder="请输入备注信息"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="流程实例的编号" prop="processInstanceId">
-        <el-input
-          v-model="queryParams.processInstanceId"
-          placeholder="请输入流程实例的编号"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="出库员" prop="operator">
-        <el-input
-          v-model="queryParams.operator"
-          placeholder="请输入出库员"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="出库时间" prop="outgoingTime">
-        <el-date-picker
-          v-model="queryParams.outgoingTime"
-          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="returner">
-        <el-input
-          v-model="queryParams.returner"
-          placeholder="请输入退还人"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="点收人" prop="receiver">
-        <el-input
-          v-model="queryParams.receiver"
-          placeholder="请输入点收人"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="退还日期" prop="returnDate">
-        <el-date-picker
-          v-model="queryParams.returnDate"
-          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="specimenCondition">
-        <el-input
-          v-model="queryParams.specimenCondition"
-          placeholder="请输入标本情况"
-          clearable
-          @keyup.enter="handleQuery"
-          class="!w-240px"
-        />
-      </el-form-item>
-      <el-form-item label="创建时间" prop="createTime">
-        <el-date-picker
-          v-model="queryParams.createTime"
-          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="sampleStatus">
+<!--      <el-form-item label="备注信息" prop="remarks">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.remarks"-->
+<!--          placeholder="请输入备注信息"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="流程实例的编号" prop="processInstanceId">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.processInstanceId"-->
+<!--          placeholder="请输入流程实例的编号"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="出库员" prop="operator">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.operator"-->
+<!--          placeholder="请输入出库员"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="出库时间" prop="outgoingTime">-->
+<!--        <el-date-picker-->
+<!--          v-model="queryParams.outgoingTime"-->
+<!--          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="returner">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.returner"-->
+<!--          placeholder="请输入退还人"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="点收人" prop="receiver">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.receiver"-->
+<!--          placeholder="请输入点收人"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="退还日期" prop="returnDate">-->
+<!--        <el-date-picker-->
+<!--          v-model="queryParams.returnDate"-->
+<!--          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="specimenCondition">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.specimenCondition"-->
+<!--          placeholder="请输入标本情况"-->
+<!--          clearable-->
+<!--          @keyup.enter="handleQuery"-->
+<!--          class="!w-240px"-->
+<!--        />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="创建时间" prop="createTime">-->
+<!--        <el-date-picker-->
+<!--          v-model="queryParams.createTime"-->
+<!--          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="sampleStatus">
         <el-select
           v-model="queryParams.sampleStatus"
-          placeholder="请选择标本状态(已出库、已回库、出库审批中)"
+          placeholder="请选择标本状态"
           clearable
           class="!w-240px"
         >
@@ -207,11 +207,11 @@
   <!-- 列表 -->
   <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="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" prop="applicantName" />
+      <el-table-column label="申请人或单位" align="center" prop="applicantName" />
       <el-table-column
         label="申请日期"
         align="center"
@@ -220,11 +220,11 @@
         width="180px"
       />
       <el-table-column label="申请出库的用途" align="center" prop="applicationUsage" />
-      <el-table-column label="附件上传" align="center" prop="attachments" />
+<!--      <el-table-column label="附件上传" align="center" prop="attachments" />-->
       <el-table-column label="审批状态" align="center" prop="status" />
-      <el-table-column label="备注信息" align="center" prop="remarks" />
-      <el-table-column label="流程实例的编号" align="center" prop="processInstanceId" />
-      <el-table-column label="出库员" align="center" prop="operator" />
+<!--      <el-table-column label="备注信息" align="center" prop="remarks" />-->
+<!--      <el-table-column label="流程实例的编号" align="center" prop="processInstanceId" />-->
+<!--      <el-table-column label="出库员" align="center" prop="operator" />-->
       <el-table-column
         label="出库时间"
         align="center"
@@ -232,8 +232,8 @@
         :formatter="dateFormatter"
         width="180px"
       />
-      <el-table-column label="退还人" align="center" prop="returner" />
-      <el-table-column label="点收人" align="center" prop="receiver" />
+<!--      <el-table-column label="退还人" align="center" prop="returner" />-->
+<!--      <el-table-column label="点收人" align="center" prop="receiver" />-->
       <el-table-column
         label="退还日期"
         align="center"
@@ -242,16 +242,26 @@
         width="180px"
       />
       <el-table-column label="标本情况" align="center" prop="specimenCondition" />
-      <el-table-column
-        label="创建时间"
-        align="center"
-        prop="createTime"
-        :formatter="dateFormatter"
-        width="180px"
-      />
-      <el-table-column label="标本状态(已出库、已回库、出库审批中)" align="center" prop="sampleStatus" />
-      <el-table-column label="操作" align="center" min-width="120px">
-        <template #default="scope">
+<!--      <el-table-column-->
+<!--        label="创建时间"-->
+<!--        align="center"-->
+<!--        prop="createTime"-->
+<!--        :formatter="dateFormatter"-->
+<!--        width="180px"-->
+<!--      />-->
+      <el-table-column label="标本状态" align="center" prop="sampleStatus" />
+      <el-table-column label="操作" align="center" min-width="150px">
+        <template #default="scope" >
+
+          <el-button
+            link
+            type="danger"
+            :disabled="!hasPermission"
+            @click="handleApproval(scope.row.id)"
+
+          >
+            审批
+          </el-button>
           <el-button
             link
             type="primary"
@@ -282,6 +292,7 @@
 
   <!-- 表单弹窗:添加/修改 -->
   <SpecimenOutboundForm ref="formRef" @success="getList" />
+  <Approval ref="ApprovalRef" @success="getList" />
 </template>
 
 <script setup lang="ts">
@@ -289,10 +300,17 @@ import { dateFormatter } from '@/utils/formatTime'
 import download from '@/utils/download'
 import { SpecimenOutboundApi, SpecimenOutboundVO } from '@/api/museums/specimenoutbound'
 import SpecimenOutboundForm from './SpecimenOutboundForm.vue'
-
+import {ref} from "vue";
+//import {SpecimenInfoApi} from "@/api/museums/specimeninfo";
+//import SpecimenImportForm from "@/views/museums/specimeninfo/SpecimenImportForm.vue";
+import Approval from "@/views/museums/specimenoutbound/approval.vue";
 /** 标本出库回库信息 列表 */
 defineOptions({ name: 'SpecimenOutbound' })
-
+// const dialogVisible = ref(false) // 弹窗的是否展示
+// const fileList = ref([]) // 文件列表
+// const formLoading = ref(false) // 表单的加载中
+// const updateSupport = ref(0) // 是否更新已经存在的用户数据
+// const uploadRef = ref()
 const message = useMessage() // 消息弹窗
 const { t } = useI18n() // 国际化
 
@@ -354,6 +372,40 @@ const openForm = (type: string, id?: number) => {
   formRef.value.open(type, id)
 }
 
+/** 审批按钮操作 */
+const hasPermission = ref(checkUserPermission('APPROVE'));
+// 检查用户权限的方法
+function checkUserPermission(permission) {
+  // 这里应该是您的权限检查逻辑
+  // 例如,从Vuex store或者API获取用户权限列表,并检查是否包含所需权限
+  const userPermissions = getUserPermissions(); // 获取用户权限列表的示例方法
+  return userPermissions.includes(permission);
+}
+// 获取用户权限列表的示例方法
+function getUserPermissions() {
+
+  // 示例返回一个权限数组
+  return ['APPROVE', 'OTHER_PERMISSION'];
+}
+
+// 处理审批的方法
+function handleApproval(id) {
+  if (hasPermission.value) {
+    // 用户具有权限,执行审批逻辑
+    console.log('审批ID:', id);
+    // ... 审批逻辑 ...
+  } else {
+    // 用户没有权限,可以提示用户或不做任何操作
+    console.log('用户没有审批权限');
+  }
+}
+const ApprovalRef = ref()
+// const handleApproval = (type: string, id?: number) => {
+//   ApprovalRef.value.open(type, id)
+//
+// }
+
+
 /** 删除按钮操作 */
 const handleDelete = async (id: number) => {
   try {
@@ -386,4 +438,4 @@ const handleExport = async () => {
 onMounted(() => {
   getList()
 })
-</script>
+</script>

+ 2 - 0
src/views/system/dept/index.vue

@@ -136,6 +136,7 @@ const getList = async () => {
   try {
     const data = await DeptApi.getDeptPage(queryParams)
     list.value = handleTree(data)
+
   } finally {
     loading.value = false
   }
@@ -187,4 +188,5 @@ onMounted(async () => {
   // 获取用户列表
   userList.value = await UserApi.getSimpleUserList()
 })
+
 </script>