specimenDetails.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  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="标本编号:"
  22. label-align="right">{{
  23. specimenData.specimenNumber
  24. }}
  25. </el-descriptions-item>
  26. <el-descriptions-item label-class-name="my-label" label="标本类型:"
  27. label-align="right">
  28. <dict-tag :type="DICT_TYPE.MUSEUMS_SPECIMEN_TYPE" :value="specimenData.specimenType" />
  29. </el-descriptions-item>
  30. <el-descriptions-item label="资产号:" label-align="right"
  31. label-class-name="my-label">{{
  32. specimenData.assetNumber
  33. }}
  34. </el-descriptions-item>
  35. <el-descriptions-item label="保存类型:" label-class-name="my-label"
  36. label-align="right">
  37. <dict-tag :type="DICT_TYPE.MUSEUMS_SPECIMEN_INFO" :value="specimenData.preservationType" />
  38. </el-descriptions-item>
  39. <el-descriptions-item label="中文名称:" label-align="right"
  40. label-class-name="my-label">{{
  41. specimenData.chineseName
  42. }}
  43. </el-descriptions-item>
  44. <el-descriptions-item label-class-name="my-label" label="保存状态:"
  45. label-align="right">
  46. <dict-tag :type="DICT_TYPE.MUSEUMS_SPECIMEN_PRESERVATION_STATUS" :value="specimenData.saveStatus" />
  47. </el-descriptions-item>
  48. <!-- <el-descriptions-item label="存放位置:" label-align="right"-->
  49. <!-- label-class-name="my-label">{{-->
  50. <!-- specimenData.storageLocation-->
  51. <!-- }}-->
  52. <!-- </el-descriptions-item>-->
  53. <el-descriptions-item label="外文名称:" label-align="right"
  54. label-class-name="my-label">{{
  55. specimenData.englishName
  56. }}
  57. </el-descriptions-item>
  58. <el-descriptions-item label="存放位置:" label-align="right"
  59. label-class-name="my-label">{{
  60. specimenData.storageLocation
  61. }}
  62. </el-descriptions-item>
  63. <!-- <el-descriptions-item label="国家:" label-align="right"-->
  64. <!-- label-class-name="my-label">{{-->
  65. <!-- specimenData.country-->
  66. <!-- }}-->
  67. <!-- </el-descriptions-item>-->
  68. <el-descriptions-item label="国际命名:" label-align="right"
  69. label-class-name="my-label"
  70. v-if="specimenData.specimenType !== 2 && specimenData.specimenType !== 0 && specimenData.specimenType !== 1 ">
  71. {{
  72. specimenData.internationalName
  73. }}
  74. </el-descriptions-item>
  75. <el-descriptions-item label="国家:" label-align="right"
  76. label-class-name="my-label">{{
  77. specimenData.country
  78. }}
  79. </el-descriptions-item>
  80. <el-descriptions-item label="省:" label-align="right" label-class-name="my-label">
  81. {{
  82. specimenData.economize
  83. }}
  84. </el-descriptions-item>
  85. <el-descriptions-item label="备注:" label-class-name="my-label"
  86. label-align="right">{{
  87. specimenData.notes
  88. }}
  89. </el-descriptions-item>
  90. </el-descriptions>
  91. </el-card>
  92. <el-card style="margin-bottom: 5px">
  93. <template #header>
  94. <div class="card-header" style="text-align: center;">
  95. <h1 class="text1">标本特征</h1>
  96. </div>
  97. </template>
  98. <el-descriptions
  99. v-if="specimenData"
  100. :column="2"
  101. :size="size"
  102. border
  103. >
  104. <el-descriptions-item label="成分/化学式:" label-align="right"
  105. label-class-name="my-label"
  106. v-if="specimenData.specimenType !== 2"> {{
  107. specimenData.composition
  108. }}
  109. </el-descriptions-item>
  110. <el-descriptions-item label="产地/发现地:" label-align="right"
  111. label-class-name="my-label">{{
  112. specimenData.origin
  113. }}
  114. </el-descriptions-item>
  115. <!-- <el-descriptions-item label="保存地层:" label-width="100px" label-align="right"-->
  116. <!-- label-class-name="my-label">{{-->
  117. <!-- specimenData.preservedLayer-->
  118. <!-- }}-->
  119. <!-- </el-descriptions-item>-->
  120. <!-- <el-descriptions-item label="陨石类型:" label-width="100px" label-align="right"-->
  121. <!-- label-class-name="my-label">{{ specimenData.meteoriteType }}-->
  122. <!-- </el-descriptions-item>-->
  123. <el-descriptions-item label="形成时代:" label-width="100px" label-align="right"
  124. label-class-name="my-label"
  125. v-if="specimenData.specimenType !== 1 && specimenData.specimenType !== 3 ">
  126. {{
  127. specimenData.era
  128. }}
  129. </el-descriptions-item>
  130. <el-descriptions-item label="地质产状或层位:" label-width="100px"
  131. label-align="right" label-class-name="my-label">{{
  132. specimenData.preservedLayer
  133. }}
  134. </el-descriptions-item>
  135. <el-descriptions-item label="分类:" label-width="100px" label-align="right"
  136. label-class-name="my-label">{{
  137. specimenData.meteoriteType
  138. }}
  139. </el-descriptions-item>
  140. <el-descriptions-item label="发现时间:" label-class-name="my-label"
  141. label-align="right"
  142. v-if="specimenData.specimenType !== 2 && specimenData.specimenType !== 0 && specimenData.specimenType !== 1 ">
  143. {{
  144. specimenData.discoveryTime
  145. }}
  146. </el-descriptions-item>
  147. <el-descriptions-item label="降落时间:" label-class-name="my-label"
  148. label-align="right"
  149. v-if="specimenData.specimenType !== 2 && specimenData.specimenType !== 0 && specimenData.specimenType !== 1 ">
  150. {{
  151. specimenData.fallTime
  152. }}
  153. </el-descriptions-item>
  154. <el-descriptions-item label="重量(g):" label-width="100px" label-align="right"
  155. label-class-name="my-label"
  156. v-if="specimenData.specimenType !== 2">{{
  157. specimenData.weight
  158. }}
  159. </el-descriptions-item>
  160. <el-descriptions-item label="规格(cm):" label-align="right"
  161. label-class-name="my-label">{{
  162. specimenData.size
  163. }}
  164. </el-descriptions-item>
  165. <el-descriptions-item label="主要用途:" label-class-name="my-label"
  166. label-align="right">
  167. <dict-tag :type="DICT_TYPE.MUSEUMS_SPECIMEN_MAIN_USES" :value="specimenData.mainPurpose" />
  168. </el-descriptions-item>
  169. <el-descriptions-item label="具体用途:" label-class-name="my-label"
  170. label-align="right">
  171. {{
  172. specimenData.purpose
  173. }}
  174. </el-descriptions-item>
  175. </el-descriptions>
  176. </el-card>
  177. <el-card style="margin-bottom: 5px">
  178. <template #header>
  179. <div class="card-header" style="text-align: center">
  180. <h1 class="text1">标本来源</h1>
  181. </div>
  182. </template>
  183. <el-descriptions
  184. v-if="specimenData"
  185. :column="2"
  186. :size="size"
  187. border
  188. >
  189. <el-descriptions-item label="来源:" label-class-name="my-label"
  190. label-align="right">{{ sourceText }}
  191. </el-descriptions-item>
  192. <el-descriptions-item label="单价:" label-class-name="my-label"
  193. label-align="right">{{
  194. specimenData.specimenPrice
  195. }}
  196. </el-descriptions-item>
  197. <el-descriptions-item label="入馆时间:" label-class-name="my-label"
  198. label-align="right">{{
  199. specimenData.acquisitionTime
  200. }}
  201. </el-descriptions-item>
  202. <el-descriptions-item label="数量(件/套):" label-align="right"
  203. label-class-name="my-label">{{
  204. specimenData.specimenAmount
  205. }}
  206. </el-descriptions-item>
  207. <el-descriptions-item label="标本提供者:" label-class-name="my-label"
  208. label-align="right">{{
  209. specimenData.provider
  210. }}
  211. </el-descriptions-item>
  212. <!-- <el-descriptions-item label="发现时间:" label-class-name="my-label"-->
  213. <!-- label-align="right"-->
  214. <!-- v-if="specimenData.specimenType !== 2 && specimenData.specimenType !== 0 && specimenData.specimenType !== 1 ">-->
  215. <!-- {{-->
  216. <!-- specimenData.discoveryTime-->
  217. <!-- }}-->
  218. <!-- </el-descriptions-item>-->
  219. <!-- <el-descriptions-item label="降落时间:" label-class-name="my-label"-->
  220. <!-- label-align="right"-->
  221. <!-- v-if="specimenData.specimenType !== 2 && specimenData.specimenType !== 0 && specimenData.specimenType !== 1 ">-->
  222. <!-- {{-->
  223. <!-- specimenData.fallTime-->
  224. <!-- }}-->
  225. <!-- </el-descriptions-item>-->
  226. </el-descriptions>
  227. </el-card>
  228. <el-card style="margin-bottom: 5px">
  229. <template #header>
  230. <div class="card-header" style="text-align: center">
  231. <h1 class="text1" style="">标本文献资料</h1>
  232. </div>
  233. </template>
  234. <el-descriptions
  235. style="margin-bottom: 30px"
  236. v-if="specimenData"
  237. :column="2"
  238. :size="size"
  239. border
  240. >
  241. <el-descriptions-item label="文献资料:" label-class-name="my-label"
  242. label-align="right">
  243. <div v-html="specimenData.description">
  244. </div>
  245. </el-descriptions-item>
  246. </el-descriptions>
  247. </el-card>
  248. </el-col>
  249. </el-row>
  250. </div>
  251. </el-col>
  252. <el-col :xl="8" :lg="8" :md="24" :sm="24" :xs="24" class="mb-8px">
  253. <el-card>
  254. <template #header>
  255. <div class="card-header" style="text-align: center">
  256. <h1>标本图片</h1>
  257. </div>
  258. </template>
  259. <el-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24" class="mb-8px">
  260. <div v-if="specimenData.imagePath && specimenData.imagePath.length">
  261. <div class="demo-image__preview">
  262. <el-image
  263. style=" align-items: center"
  264. :src="specimenData.imagePath[0]"
  265. :zoom-rate="1.2"
  266. :max-scale="7"
  267. :min-scale="0.2"
  268. :preview-src-list="specimenData.imagePath"
  269. :initial-index="index"
  270. fit="cover"
  271. />
  272. </div>
  273. <div>
  274. <el-space style="margin-top: 10px">
  275. <div class="demo-image__preview" v-for="(url, index) in specimenData.imagePath"
  276. :key="index">
  277. <el-image
  278. style="width: 50px; height: 40px"
  279. :src="url"
  280. :zoom-rate="1.2"
  281. :max-scale="7"
  282. :min-scale="0.2"
  283. :initial-index="4"
  284. :preview-src-list="[url]"
  285. fit="cover"
  286. />
  287. </div>
  288. </el-space>
  289. </div>
  290. </div>
  291. <el-empty v-else description="暂无图片"/>
  292. </el-col>
  293. </el-card>
  294. <el-card style="margin-top: 10px">
  295. <template #header>
  296. <div class="card-header">
  297. <h1 class="text1" style="margin-bottom: 10px">馆藏状态:
  298. <dict-tag :type="DICT_TYPE.MUSEUMS_COLLECTION_STATUS" :value="specimenData.collectionStatus" />
  299. </h1>
  300. </div>
  301. </template>
  302. <el-scrollbar height="650px">
  303. <el-timeline style="max-width: 600px;margin-left: 15px">
  304. <el-timeline-item
  305. v-for="(item, index) in stustuss"
  306. :key="index"
  307. type="primary"
  308. :hollow="true"
  309. >
  310. <h4>{{ formatDate(item.createTime) }}</h4>
  311. <el-card>
  312. <h4>操作类型:{{ item.subType }}</h4>
  313. <div style="line-height: 30px">操作人:{{ item.userName }}</div>
  314. <div style="line-height: 20px">操作内容:{{ item.action }}</div>
  315. </el-card>
  316. </el-timeline-item>
  317. </el-timeline>
  318. </el-scrollbar>
  319. </el-card>
  320. </el-col>
  321. </el-row>
  322. </el-skeleton>
  323. </template>
  324. <script setup lang="ts">
  325. import {ref, onMounted, computed} from "vue";
  326. import {useRouter} from 'vue-router';
  327. import {SpecimenInfoApi} from "@/api/museums/specimeninfo";
  328. import {ElCol, ElImage} from 'element-plus';
  329. const loading = ref(false)
  330. const router = useRouter() // 路由
  331. const {query} = useRoute() // 查询参数
  332. import type {ComponentSize} from 'element-plus'
  333. import {formatDate} from "@/utils/formatTime";
  334. import {DICT_TYPE} from "@/utils/dict";
  335. const stustuss = ref()
  336. const specimenData = ref({
  337. imagePath: []
  338. }); // 初始化响应式数据
  339. const size = ref<ComponentSize>('large')
  340. const url = ref()
  341. const srcList = ref([])
  342. const fetchData = async () => {
  343. loading.value = true
  344. try {
  345. console.log(query.dataId)
  346. let res: any = await SpecimenInfoApi.getSpecimenInfo(query.dataId)
  347. const stutus = await SpecimenInfoApi.getStustusInfo(query.dataId)
  348. stustuss.value = stutus
  349. console.log('stustuss', stustuss.value)
  350. console.log(res)
  351. res.discoveryTime = formatDate(res.discoveryTime)
  352. res.fallTime = formatDate(res.fallTime)
  353. res.acquisitionTime = formatDate(res.acquisitionTime)
  354. specimenData.value = res
  355. console.log(specimenData.value)
  356. } finally {
  357. loading.value = false
  358. }
  359. }
  360. /**保存状态**/
  361. const saveStatusText = computed(() => {
  362. if (specimenData.value === null) {
  363. return '';
  364. }
  365. switch (specimenData.value.saveStatus) {
  366. case 0:
  367. return '完整';
  368. case 1:
  369. return '受损';
  370. case 2:
  371. return '严重受损';
  372. case 3:
  373. return '无实物';
  374. default:
  375. return '';
  376. }
  377. });
  378. /**来源**/
  379. const sourceText = computed(() => {
  380. if (specimenData.value === null) {
  381. return '';
  382. }
  383. switch (specimenData.value.source) {
  384. case 0:
  385. return '采购';
  386. case 1:
  387. return '捐赠';
  388. case 2:
  389. return '采集';
  390. default:
  391. return '';
  392. }
  393. });
  394. /**主要用途**/
  395. const mainPurposeText = computed(() => {
  396. if (specimenData.value === null) {
  397. return '';
  398. }
  399. switch (specimenData.value.mainPurpose) {
  400. case 0:
  401. return '工业原料';
  402. case 1:
  403. return '药用';
  404. case 2:
  405. return '建材';
  406. case 3:
  407. return '科学研究';
  408. case 4:
  409. return '观赏';
  410. case 5:
  411. return '其他';
  412. default:
  413. return '';
  414. }
  415. });
  416. // // 在组件加载时获取数据
  417. onMounted(async () => {
  418. await fetchData()
  419. })
  420. </script>
  421. <style scoped lang="scss">
  422. .demo-image__error .image-slot {
  423. font-size: 30px;
  424. }
  425. .demo-image__error .image-slot .el-icon {
  426. font-size: 30px;
  427. }
  428. .demo-image__error .el-image {
  429. width: 100%;
  430. height: 200px;
  431. }
  432. .text1 {
  433. font-weight: bold;
  434. color: #0f2438;
  435. }
  436. :deep(.my-label) {
  437. background: #FAF8F7 !important;
  438. }
  439. .label {
  440. display: inline-block;
  441. text-align: right;
  442. width: 100px;
  443. font-weight: bold;
  444. color: black;
  445. }
  446. .scrollbar-imag-item {
  447. flex-shrink: 0;
  448. display: flex;
  449. align-items: center;
  450. justify-content: center;
  451. width: 100px;
  452. height: 50px;
  453. margin: 10px;
  454. text-align: center;
  455. background: var(--el-color-danger-light-9);
  456. color: var(--el-color-danger);
  457. }
  458. .label-width .el-descriptions-item__label {
  459. width: 90px;
  460. flex: 1;
  461. }
  462. .el-descriptions-item {
  463. margin-bottom: 20px;
  464. margin-top: 20px;
  465. }
  466. :deep(.my-label) {
  467. background: #FAF8F7 !important;
  468. width: 150px;
  469. }
  470. </style>