|
|
@@ -0,0 +1,369 @@
|
|
|
+<!--
|
|
|
+ * @Author: wanglj wanglijie@dashoo.cn
|
|
|
+ * @Date: 2025-03-29 14:15:09
|
|
|
+ * @LastEditors: wanglj wanglijie@dashoo.cn
|
|
|
+ * @LastEditTime: 2025-03-29 14:51:56
|
|
|
+ * @FilePath: \labsop_h5\src\view\entry\detail.vue
|
|
|
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
|
|
+-->
|
|
|
+<!--
|
|
|
+ * @Author: wanglj wanglijie@dashoo.cn
|
|
|
+ * @Date: 2025-03-24 09:17:15
|
|
|
+ * @LastEditors: wanglj wanglijie@dashoo.cn
|
|
|
+ * @LastEditTime: 2025-03-29 14:28:02
|
|
|
+ * @FilePath: \labsop_h5\src\view\instr\detail.vue
|
|
|
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
|
|
+-->
|
|
|
+<template>
|
|
|
+ <div class="instr-detail">
|
|
|
+ <header class="flex">
|
|
|
+ <div class="i-right ml10">
|
|
|
+ <div class="h100 flex flex-top flex-column flex-between">
|
|
|
+ <div class="flex flex-top mb4 ml2">
|
|
|
+ <div class="detailTxt name">{{ `${state.form.memberName}的${state.form.platformName}入室申请` }}</div>
|
|
|
+ </div>
|
|
|
+ <footer>
|
|
|
+ <div class="flex flex-top mt-auto">
|
|
|
+ <img class="i-r-icon" src="../../assets/img/user.png" />
|
|
|
+ <div class="detailTxt">{{ state.form.createdName }}</div>
|
|
|
+ </div>
|
|
|
+ <div class="flex flex-top">
|
|
|
+ <div class="detailTxt">{{ state.form.createdTime }}</div>
|
|
|
+ </div>
|
|
|
+ </footer>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </header>
|
|
|
+ <div class="content">
|
|
|
+ <div class="card">
|
|
|
+ <h4>申请入室平台</h4>
|
|
|
+ <ul v-if="state.form.platformTime">
|
|
|
+ <li>
|
|
|
+ <label>申请平台</label>
|
|
|
+ <span>细胞</span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <label>申请时长</label>
|
|
|
+ <span>{{ state.form.platformTime }}个月</span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <label>拟培养细胞种类</label>
|
|
|
+ <span>{{ state.form.cellType }}</span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <label>细胞房预约需求</label>
|
|
|
+ <span>{{ state.form.cellSourceType == '10' ? '普通' : '层流' }}</span>
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ <ul v-else>
|
|
|
+ <li>
|
|
|
+ <label>申请平台</label>
|
|
|
+ <span>分子生物平台</span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <label>申请时长</label>
|
|
|
+ <span>{{ state.form.molecularTime }}个月 </span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <label>其他需求</label>
|
|
|
+ <span>{{ state.form.platOtherNeed }}</span>
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ <div class="card">
|
|
|
+ <h4>申请人信息</h4>
|
|
|
+ <ul>
|
|
|
+ <li>
|
|
|
+ <label>申请人姓名</label>
|
|
|
+ <span>{{ state.form.memberName }}</span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <label>人员类型</label>
|
|
|
+ <span>{{ getDictLabel(userTypeList, state.form.memberType) }}</span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <label>申请人手机号</label>
|
|
|
+ <span>{{ state.form.memberPhone }}</span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <label>申请人科室</label>
|
|
|
+ <span>{{ state.form.deptName }}</span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <label>课题组</label>
|
|
|
+ <span>{{ state.form.pgName }}</span>
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ <div class="card">
|
|
|
+ <h4>审批记录</h4>
|
|
|
+ <FlowTable :id="state.form.id" :businessCode="`${state.form.id}`" defCode="plat_platform_appoint" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script lang="ts" setup>
|
|
|
+ import to from 'await-to-js'
|
|
|
+ import { useRoute, useRouter } from 'vue-router'
|
|
|
+ import { defineAsyncComponent, onMounted, reactive, ref } from 'vue'
|
|
|
+ import { useTrainingApi } from '/@/api/training'
|
|
|
+ import { useDictApi } from '/@/api/system/dict'
|
|
|
+ import { getDictLabel } from '/@/utils/other'
|
|
|
+ import { usePlatformAppointApi } from '/@/api/platform/appoint'
|
|
|
+ import { useFlowApi } from '/@/api/execution/flow'
|
|
|
+ const FlowTable = defineAsyncComponent(() => import('/@/components/FlowTable.vue'))
|
|
|
+ const platformAppointApi = usePlatformAppointApi()
|
|
|
+ const flowApi = useFlowApi()
|
|
|
+ const route = useRoute()
|
|
|
+ const router = useRouter()
|
|
|
+ const dictApi = useDictApi()
|
|
|
+ const apprList = ref<any[]>([])
|
|
|
+ const userTypeList = ref(<RowDicDataType[]>[])
|
|
|
+ const state = reactive({
|
|
|
+ detailsLoading: false,
|
|
|
+ form: {
|
|
|
+ id: 0,
|
|
|
+ deptId: null,
|
|
|
+ deptName: '',
|
|
|
+ isTemporary: '10',
|
|
|
+ memberId: 0,
|
|
|
+ memberName: '',
|
|
|
+ memberPhone: '',
|
|
|
+ memberType: '',
|
|
|
+ mentorObj: null,
|
|
|
+ pgId: null,
|
|
|
+ pgName: '',
|
|
|
+ mentorId: null,
|
|
|
+ mentorName: '',
|
|
|
+ mentorDeptName: '',
|
|
|
+ mentorPhone: '',
|
|
|
+ platformId: null,
|
|
|
+ platformName: '',
|
|
|
+ platformTime: null,
|
|
|
+ platformType: '',
|
|
|
+ platformList: [] as any[],
|
|
|
+ isCellChecked: '20',
|
|
|
+ cellType: '',
|
|
|
+ cellSourceType: '',
|
|
|
+ isMolecularChecked: '20',
|
|
|
+ molecularTime: null,
|
|
|
+ platOtherNeed: '',
|
|
|
+ createdName: '',
|
|
|
+ createdTime: ''
|
|
|
+ },
|
|
|
+ queryParams: {
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ appointStatus: []
|
|
|
+ }
|
|
|
+ })
|
|
|
+ const getDicts = () => {
|
|
|
+ Promise.all([dictApi.getDictDataByType('sys_user_type')]).then(([type]) => {
|
|
|
+ userTypeList.value = type?.data?.values || []
|
|
|
+ })
|
|
|
+ }
|
|
|
+ //详情
|
|
|
+ const getDetail = async (id: number) => {
|
|
|
+ state.detailsLoading = true
|
|
|
+ const [err, res]: ToResponse = await to(platformAppointApi.getDetail({ id }))
|
|
|
+ state.detailsLoading = false
|
|
|
+ if (err) return
|
|
|
+ if (res?.code === 200) {
|
|
|
+ state.form = res.data
|
|
|
+ }
|
|
|
+ }
|
|
|
+ onMounted(() => {
|
|
|
+ const id = route.query.id ? +route.query.id : 0
|
|
|
+ getDicts()
|
|
|
+ getDetail(id)
|
|
|
+ })
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+ .instr-detail {
|
|
|
+ flex: 1;
|
|
|
+ overflow-y: auto;
|
|
|
+ background-color: #f7f8fa;
|
|
|
+ .my-swipe {
|
|
|
+ background-color: #fff;
|
|
|
+ height: 30px !important;
|
|
|
+ line-height: 30px !important;
|
|
|
+ :deep(.flex) {
|
|
|
+ height: 30px;
|
|
|
+ overflow: hidden;
|
|
|
+ padding: 0 12px;
|
|
|
+ span {
|
|
|
+ display: inline-block;
|
|
|
+ height: 30px;
|
|
|
+ line-height: 30px;
|
|
|
+ }
|
|
|
+ span:first-child {
|
|
|
+ flex: 1;
|
|
|
+ white-space: nowrap;
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ > header {
|
|
|
+ height: 40px;
|
|
|
+ background-color: #fff;
|
|
|
+ padding: 12px;
|
|
|
+ }
|
|
|
+ .inst-info {
|
|
|
+ display: flex;
|
|
|
+ }
|
|
|
+ .i-right {
|
|
|
+ flex: 1;
|
|
|
+ font-size: 14px;
|
|
|
+ height: 40px;
|
|
|
+ .i-r-icon {
|
|
|
+ width: 15px;
|
|
|
+ height: 15px;
|
|
|
+ margin-right: 10px;
|
|
|
+ }
|
|
|
+ footer {
|
|
|
+ width: 100%;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .detailTxt {
|
|
|
+ font-size: 12px;
|
|
|
+ color: #333333;
|
|
|
+ white-space: nowrap;
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ &.name {
|
|
|
+ font-weight: bold;
|
|
|
+ font-size: 16px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .content {
|
|
|
+ padding: 10px;
|
|
|
+ }
|
|
|
+ .card {
|
|
|
+ border-radius: 4px;
|
|
|
+ background-color: #fff;
|
|
|
+ padding: 10px;
|
|
|
+ box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.12);
|
|
|
+ & + .card {
|
|
|
+ margin-top: 10px;
|
|
|
+ }
|
|
|
+ h4 {
|
|
|
+ height: 18px;
|
|
|
+ line-height: 18px;
|
|
|
+ display: flex;
|
|
|
+ margin-bottom: 10px;
|
|
|
+ span {
|
|
|
+ font-weight: normal;
|
|
|
+ margin-left: auto;
|
|
|
+ }
|
|
|
+ &::before {
|
|
|
+ display: inline-block;
|
|
|
+ content: '';
|
|
|
+ width: 3px;
|
|
|
+ height: 18px;
|
|
|
+ background-color: #1c9bfd;
|
|
|
+ margin-right: 4px;
|
|
|
+ vertical-align: middle;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ > ul {
|
|
|
+ li {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ padding: 6px 0;
|
|
|
+ label {
|
|
|
+ width: 100px;
|
|
|
+ min-width: 80px;
|
|
|
+ color: #969799;
|
|
|
+ }
|
|
|
+ span {
|
|
|
+ word-break: break-all;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .text {
|
|
|
+ white-space: pre-wrap;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .van-list {
|
|
|
+ padding: 10px;
|
|
|
+ border-radius: 4px;
|
|
|
+ flex: 1;
|
|
|
+ .van-cell {
|
|
|
+ background-color: #fff;
|
|
|
+ + .van-cell {
|
|
|
+ margin-top: 10px;
|
|
|
+ }
|
|
|
+ header,
|
|
|
+ footer {
|
|
|
+ color: #333;
|
|
|
+ }
|
|
|
+ .title {
|
|
|
+ flex: 1;
|
|
|
+ white-space: nowrap;
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ text-align: left;
|
|
|
+ }
|
|
|
+ .inst-title {
|
|
|
+ color: #333;
|
|
|
+ text-align: left;
|
|
|
+ flex: 1;
|
|
|
+ overflow: hidden;
|
|
|
+ white-space: nowrap;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ margin-top: 4px;
|
|
|
+ span:first-child {
|
|
|
+ display: inline-block;
|
|
|
+ width: 80px;
|
|
|
+ min-width: 80px;
|
|
|
+ color: rgb(120, 120, 120);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .time {
|
|
|
+ color: #f69a4d;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .btns {
|
|
|
+ flex: 1;
|
|
|
+ display: flex;
|
|
|
+ li {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ padding: 0 8px;
|
|
|
+ font-size: 12px;
|
|
|
+ i {
|
|
|
+ margin-bottom: 4px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ :deep(.follow .van-icon) {
|
|
|
+ color: #fdc33e;
|
|
|
+ }
|
|
|
+ .need-to-know {
|
|
|
+ height: calc(100% - 20px);
|
|
|
+ overflow: hidden;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ padding: 10px 20px;
|
|
|
+ white-space: pre-wrap;
|
|
|
+ p {
|
|
|
+ flex: 1;
|
|
|
+ overflow-y: auto;
|
|
|
+ }
|
|
|
+ footer {
|
|
|
+ flex: 0 0 45px;
|
|
|
+ margin-top: 4px;
|
|
|
+ border-top: 1px solid #f7f8fa;
|
|
|
+ }
|
|
|
+ }
|
|
|
+</style>
|