specimenDetails.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. <template>
  2. <el-skeleton :loading="loading" animated>
  3. <el-row :gutter="8" justify="space-between">
  4. <el-col :xl="16" :lg="16" :md="24" :sm="24" :xs="24">
  5. <div>
  6. <el-row>
  7. <el-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24" style="margin-outside: 0px">
  8. <el-card style="margin-bottom: 5px" >
  9. <template #header>
  10. <div class="card-header" style="text-align: center">
  11. <h1 class="text1">标本基本信息</h1>
  12. </div>
  13. </template>
  14. <el-descriptions
  15. v-if="specimenData"
  16. :column="2"
  17. :size="size"
  18. border
  19. >
  20. <el-descriptions-item label-class-name="my-label" label="序号:" label-align="right">{{ specimenData.id }}</el-descriptions-item>
  21. <el-descriptions-item label-class-name="my-label" label="标本类型:" label-align="right" >{{ specimenTypeText }}
  22. </el-descriptions-item>
  23. <el-descriptions-item label-class-name="my-label" label="标本编号:" label-align="right">{{
  24. specimenData.specimenNumber
  25. }}
  26. </el-descriptions-item>
  27. <el-descriptions-item label="资产号:" label-align="right" label-class-name="my-label" >{{
  28. specimenData.assetNumber
  29. }}
  30. </el-descriptions-item>
  31. <el-descriptions-item label="存放位置:" label-align="right" label-class-name="my-label" >{{
  32. specimenData.storageLocation
  33. }}
  34. </el-descriptions-item>
  35. <el-descriptions-item label="中文名称:" label-align="right" label-class-name="my-label" >{{
  36. specimenData.chineseName
  37. }}
  38. </el-descriptions-item>
  39. <el-descriptions-item label="英文名称:" label-align="right" label-class-name="my-label" >{{
  40. specimenData.englishName
  41. }}
  42. </el-descriptions-item>
  43. </el-descriptions>
  44. </el-card>
  45. <el-card style="margin-bottom: 5px">
  46. <template #header>
  47. <div class="card-header" style="text-align: center;">
  48. <h1 class="text1">标本特征</h1>
  49. </div>
  50. </template>
  51. <el-descriptions
  52. v-if="specimenData"
  53. :column="2"
  54. :size="size"
  55. border
  56. >
  57. <el-descriptions-item label="成分:" label-align="right" label-class-name="my-label" > {{
  58. specimenData.composition
  59. }}
  60. </el-descriptions-item>
  61. <el-descriptions-item label="产地:" label-align="right" label-class-name="my-label" >{{
  62. specimenData.origin
  63. }}
  64. </el-descriptions-item>
  65. <el-descriptions-item label="时代:" label-align="right" label-class-name="my-label" >{{ specimenData.era }}</el-descriptions-item>
  66. <el-descriptions-item label="保存地层:" label-width="100px" label-align="right" label-class-name="my-label" >{{
  67. specimenData.discoveryTime
  68. }}
  69. </el-descriptions-item>
  70. <el-descriptions-item label="陨石类型:" label-width="100px" label-align="right" label-class-name="my-label" >{{ specimenData.meteoriteType }}
  71. </el-descriptions-item>
  72. <el-descriptions-item label="国际命名:" label-width="100px" label-align="right" label-class-name="my-label" >{{
  73. specimenData.internationalName
  74. }}
  75. </el-descriptions-item>
  76. <el-descriptions-item label="重量(g):" label-width="100px" label-align="right" label-class-name="my-label" >{{
  77. specimenData.weight
  78. }}
  79. </el-descriptions-item>
  80. </el-descriptions>
  81. </el-card>
  82. <el-card style="margin-bottom: 5px">
  83. <template #header>
  84. <div class="card-header" style="text-align: center">
  85. <h1 class="text1">标本保存与来源</h1>
  86. </div>
  87. </template>
  88. <el-descriptions
  89. v-if="specimenData"
  90. :column="2"
  91. :size="size"
  92. border
  93. >
  94. <el-descriptions-item label="保存类型" label-class-name="my-label" >{{ preservationTypeText }}
  95. </el-descriptions-item>
  96. <el-descriptions-item label="来源" label-class-name="my-label" >{{ sourceText }}</el-descriptions-item>
  97. <el-descriptions-item label="标本提供者" label-class-name="my-label" >{{
  98. specimenData.provider
  99. }}
  100. </el-descriptions-item>
  101. <el-descriptions-item label="发现时间" label-class-name="my-label" > {{
  102. specimenData.discoveryTime
  103. }}
  104. </el-descriptions-item>
  105. <el-descriptions-item label="降落时间" label-class-name="my-label" >{{
  106. specimenData.fallTime
  107. }}
  108. </el-descriptions-item>
  109. </el-descriptions>
  110. </el-card>
  111. <el-card style="margin-bottom: 5px">
  112. <template #header>
  113. <div class="card-header" style="text-align: center">
  114. <h1 class="text1" style="">标本用途与状态</h1>
  115. </div>
  116. </template>
  117. <el-descriptions
  118. v-if="specimenData"
  119. :column="2"
  120. :size="size"
  121. border
  122. >
  123. <el-descriptions-item label="入馆时间" label-class-name="my-label" >{{
  124. specimenData.acquisitionTime
  125. }}
  126. </el-descriptions-item>
  127. <el-descriptions-item label="描述" label-class-name="my-label" >{{
  128. specimenData.description
  129. }}
  130. </el-descriptions-item>
  131. <el-descriptions-item label="用途" label-class-name="my-label" >{{
  132. specimenData.purpose
  133. }}
  134. </el-descriptions-item>
  135. <el-descriptions-item label="备注" label-class-name="my-label" >{{
  136. specimenData.notes
  137. }}
  138. </el-descriptions-item>
  139. </el-descriptions>
  140. </el-card>
  141. </el-col>
  142. </el-row>
  143. </div>
  144. </el-col>
  145. <el-col :xl="8" :lg="8" :md="24" :sm="24" :xs="24" class="mb-8px">
  146. <el-card>
  147. <template #header>
  148. <div class="card-header" style="text-align: center">
  149. <h1>标本图片</h1>
  150. </div>
  151. </template>
  152. <el-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24" class="mb-8px">
  153. <div class="demo-image__preview" v-if="specimenData ">
  154. <el-image
  155. style=" align-items: center"
  156. :src="specimenData.imagePath[0]"
  157. :zoom-rate="1.2"
  158. :max-scale="7"
  159. :min-scale="0.2"
  160. :preview-src-list="specimenData.imagePath"
  161. :initial-index="4"
  162. fit="cover"
  163. />
  164. </div>
  165. <div>
  166. <el-space style="margin-top: 10px" v-if="specimenData ">
  167. <div class="demo-image__preview" v-for="(url, index) in specimenData.imagePath"
  168. :key="index">
  169. <el-image
  170. style="width: 50px; height: 40px"
  171. :src="url"
  172. :zoom-rate="1.2"
  173. :max-scale="7"
  174. :min-scale="0.2"
  175. :initial-index="4"
  176. :preview-src-list="[url]"
  177. fit="cover"
  178. />
  179. </div>
  180. </el-space>
  181. </div>
  182. </el-col>
  183. </el-card>
  184. <el-card style="margin-top: 10px">
  185. <template #header>
  186. <div class="card-header" >
  187. <h1 class="text1" style="margin-bottom: 10px">馆藏状态</h1>
  188. <span v-if="specimenRecord">{{collectionStatusText}}</span>
  189. </div>
  190. </template>
  191. <el-scrollbar height="600px">
  192. <el-timeline style="max-width: 600px;margin-left: 15px" >
  193. <el-timeline-item
  194. v-for="(item, index) in specimenData"
  195. :key="index"
  196. :timestamp="item.outgoingTime"
  197. placement="top">
  198. <el-card>
  199. <p>{{ }}</p>
  200. <p>状态:{{ }}</p>
  201. <p>申请人或单位:{{item.applicantName }}</p>
  202. <p>用途:{{item.applicationUsage}}</p>
  203. <p>审批员:{{item.approveUsers}}</p>
  204. <p>审批时间:{{}}</p>
  205. <p>出库员:{{ item.operator }}</p>
  206. </el-card>
  207. </el-timeline-item>
  208. <el-timeline-item
  209. v-for="(item, index) in specimenData"
  210. :key="index"
  211. :timestamp="item.acquisitionTime"
  212. placement="top">
  213. <el-card>
  214. <p>回库</p>
  215. <p>退还人:{{ item.operator }}</p>
  216. <p>点收人:{{item.applicationUsage}}</p>
  217. <p>退还日期:{{item.approveUsers}}</p>
  218. <p>标本情况:{{}}</p>
  219. </el-card>
  220. </el-timeline-item>
  221. </el-timeline>
  222. </el-scrollbar>
  223. </el-card>
  224. </el-col>
  225. </el-row>
  226. </el-skeleton>
  227. </template>
  228. <script setup lang="ts">
  229. import {ref, onMounted, computed} from "vue";
  230. import {useRouter} from 'vue-router';
  231. import {SpecimenInfoApi} from "@/api/museums/specimeninfo";
  232. import {ElCol, ElImage} from 'element-plus';
  233. const loading = ref(false)
  234. const router = useRouter() // 路由
  235. const {query} = useRoute() // 查询参数
  236. import type {ComponentSize} from 'element-plus'
  237. import {formatDate} from "@/utils/formatTime";
  238. const size = ref<ComponentSize>('large')
  239. const url = ref()
  240. const srcList = ref([])
  241. let specimenData = ref(null); // 初始化响应式数据
  242. const fetchData = async () => {
  243. try {
  244. console.log(query.dataId)
  245. let res: any = await SpecimenInfoApi.getSpecimenInfo(query.dataId)
  246. console.log(res)
  247. res.discoveryTime = formatDate(res.discoveryTime)
  248. res.fallTime = formatDate(res.fallTime)
  249. res.acquisitionTime = formatDate(res.acquisitionTime)
  250. specimenData.value = res
  251. console.log(specimenData.value)
  252. } finally {
  253. }
  254. }
  255. // // 在组件加载时获取数据
  256. onMounted(async () => {
  257. console.log(1)
  258. await fetchData()
  259. })
  260. /**标本类型**/
  261. const specimenTypeText = computed(() => {
  262. if (specimenData.value === null) {
  263. return '';
  264. }
  265. switch (specimenData.value.specimenType) {
  266. case 0:
  267. return '矿物';
  268. case 1:
  269. return '岩石矿石';
  270. case 2:
  271. return '化石';
  272. case 3:
  273. return '陨石';
  274. default:
  275. return '';
  276. }
  277. });
  278. /**保存类型**/
  279. const preservationTypeText = computed(() => {
  280. if (specimenData.value === null) {
  281. return '';
  282. }
  283. switch (specimenData.value.preservationType) {
  284. case 0:
  285. return '标本';
  286. case 1:
  287. return '光片';
  288. case 2:
  289. return '薄片模型';
  290. default:
  291. return '';
  292. }
  293. });
  294. /**来源**/
  295. const collectionStatusText = computed(() => {
  296. if (specimenData.value === null) {
  297. return '';
  298. }
  299. switch (specimenData.value.collectionStatus) {
  300. case 0:
  301. return '在馆';
  302. case 1:
  303. return '借出';
  304. default:
  305. return '';
  306. }
  307. });
  308. /**馆藏状态(在馆、借出)**/
  309. const sourceText = computed(() => {
  310. if (specimenData.value === null) {
  311. return '';
  312. }
  313. switch (specimenData.value.source) {
  314. case 0:
  315. return '采购';
  316. case 1:
  317. return '捐赠';
  318. case 2:
  319. return '采集';
  320. default:
  321. return '';
  322. }
  323. });
  324. </script>
  325. <style scoped lang="scss">
  326. .demo-image__error .image-slot {
  327. font-size: 30px;
  328. }
  329. .demo-image__error .image-slot .el-icon {
  330. font-size: 30px;
  331. }
  332. .demo-image__error .el-image {
  333. width: 100%;
  334. height: 200px;
  335. }
  336. .text1 {
  337. font-weight: bold;
  338. color: #0f2438;
  339. }
  340. :deep(.my-label) {
  341. background: #FAF8F7 !important;
  342. }
  343. .label {
  344. display: inline-block;
  345. text-align: right;
  346. width: 100px;
  347. font-weight: bold;
  348. color: black;
  349. }
  350. .scrollbar-imag-item {
  351. flex-shrink: 0;
  352. display: flex;
  353. align-items: center;
  354. justify-content: center;
  355. width: 100px;
  356. height: 50px;
  357. margin: 10px;
  358. text-align: center;
  359. background: var(--el-color-danger-light-9);
  360. color: var(--el-color-danger);
  361. }
  362. .label-width .el-descriptions-item__label {
  363. width: 90px;
  364. flex: 1;
  365. }
  366. .el-descriptions-item {
  367. margin-bottom: 20px;
  368. margin-top: 20px;
  369. }
  370. </style>