From 8ac7e0ca090ab5ce0f8435e8af6f78a23c0dd6e0 Mon Sep 17 00:00:00 2001 From: pyt <626651354@qq.com> Date: 星期一, 19 五月 2025 18:04:45 +0800 Subject: [PATCH] feat --- culture/src/views/strain-library/strain-library-manage/components/StrainDetail.vue | 459 ++++++++++++++++++++++++++++++++------------------------- 1 files changed, 257 insertions(+), 202 deletions(-) diff --git a/culture/src/views/strain-library/strain-library-manage/components/StrainDetail.vue b/culture/src/views/strain-library/strain-library-manage/components/StrainDetail.vue index eaa73e3..342fec3 100644 --- a/culture/src/views/strain-library/strain-library-manage/components/StrainDetail.vue +++ b/culture/src/views/strain-library/strain-library-manage/components/StrainDetail.vue @@ -1,231 +1,286 @@ <template> - <div> - <el-dialog title="原始细胞库详情" :visible.sync="visible" width="70%" :close-on-click-modal="false" - custom-class="strain-detail-dialog" @close="$emit('update:visible', false)" @opened="fetchDetail"> - <div class="strain-info"> - <!-- 第一行信息 --> - <div class="info-row"> - <div class="info-item left-column"> - <span class="label">菌种编号:</span> - <span class="value">{{ detail.strainCode }}</span> - </div> - <div class="info-item flex-column"> - <span class="label">鉴定方法:</span> - <span class="value">{{ detail.appraisalMethod }}</span> - </div> - <div class="info-item flex-column"> - <span class="label">保藏位置:</span> - <span class="value">{{ detail.saveLocation }}</span> - </div> - </div> + <div> + <el-dialog + title="原始细胞库详情" + :visible.sync="visible" + width="70%" + :close-on-click-modal="false" + custom-class="strain-detail-dialog" + @close="$emit('update:visible', false)" + @opened="fetchDetail" + > + <div class="strain-info"> + <!-- 第一行信息 --> + <div class="info-row"> + <div class="info-item left-column"> + <span class="label">菌种编号:</span> + <span class="value">{{ detail.strainCode }}</span> + </div> + <div class="info-item flex-column"> + <span class="label">鉴定方法:</span> + <span class="value">{{ detail.appraisalMethod }}</span> + </div> + <div class="info-item flex-column"> + <span class="label">保藏位置:</span> + <span class="value">{{ detail.saveLocation }}</span> + </div> + </div> - <!-- 第二行信息 --> - <div class="info-row"> - <div class="info-item left-column"> - <span class="label">菌种名称:</span> - <span class="value">{{ detail.strainName }}</span> - </div> - <div class="info-item flex-column full-width"> - <span class="label">特性描述:</span> - <span class="value">{{ detail.features }}</span> - </div> - </div> + <!-- 第二行信息 --> + <div class="info-row"> + <div class="info-item left-column"> + <span class="label">菌种名称:</span> + <span class="value">{{ detail.strainName }}</span> + </div> + <div class="info-item flex-column full-width"> + <span class="label">特性描述:</span> + <span class="value">{{ detail.features }}</span> + </div> + </div> - <!-- 第三行信息 --> - <div class="info-row"> - <div class="info-item left-column"> - <span class="label">菌种来源:</span> - <span class="value">{{ detail.strainSource }}</span> - </div> - <div class="info-item flex-column"> - <span class="label">菌种保存方法:</span> - <span class="value">{{ detail.saveMethod }}</span> - </div> - <div class="info-item flex-column"> - <span class="label">出入库状态:</span> - <span class="value">{{ { - 1: '已出库', - 2: '出库待确认', - 3: '已入库', - 4: '入库待确认' - }[detail.status] || '' }}</span> - </div> - </div> - </div> + <!-- 第三行信息 --> + <div class="info-row"> + <div class="info-item left-column"> + <span class="label">菌种来源:</span> + <span class="value">{{ detail.strainSource }}</span> + </div> + <div class="info-item flex-column"> + <span class="label">菌种保存方法:</span> + <span class="value">{{ detail.saveMethod }}</span> + </div> + <div class="info-item flex-column"> + <span class="label">出入库状态:</span> + <span class="value">{{ + { + 1: "已出库", + 2: "出库待确认", + 3: "已入库", + 4: "入库待确认", + }[detail.status] || "" + }}</span> + </div> + </div> + </div> - <div class="record-table"> - <div class="table-title">原始细胞库出/入库记录</div> - <el-table :data="detail.records" style="width: 100%"> - <el-table-column label="出库/入库"> - <template #default="{ row }"> - {{ { 1: '出库', 2: '入库' }[row.type] || '' }} - </template> - </el-table-column> - <el-table-column prop="boundTime" label="操作时间" /> - <el-table-column prop="handleName" label="操作人姓名" /> - <el-table-column prop="preserveName" label="签核确认人姓名" /> - <el-table-column label="状态"> - <template #default="{ row }"> - <el-tag :type="row.confirmTime ? 'success' : 'warning'"> - {{ row.confirmTime ? '已确认' : '待确认' }} - </el-tag> - </template> - </el-table-column> - <el-table-column label="操作" width="100"> - <template #default="{ row }"> - <el-button type="text" @click="handleView(row)">确认</el-button> - <el-button style="margin-left: 10px;" type="text" @click="handleView(row)">详情</el-button> - </template> - </el-table-column> - </el-table> - <div class="pagination"> - <el-pagination :current-page.sync="currentPage" :page-size="10" layout="total, prev, pager, next" - :total="total" @current-change="handlePageChange" /> - </div> - </div> - </el-dialog> - <RecordDetailDialog :visible="visibleRecordDetailDialog" :recordData="recordData" @close="visibleRecordDetailDialog = false" /> - </div> - + <div class="record-table"> + <div class="table-title">原始细胞库出/入库记录</div> + <el-table :data="detail.records" style="width: 100%"> + <el-table-column label="出库/入库"> + <template #default="{ row }"> + {{ { 1: "出库", 2: "入库" }[row.type] || "" }} + </template> + </el-table-column> + <el-table-column prop="boundTime" label="操作时间" /> + <el-table-column prop="handleName" label="操作人姓名" /> + <el-table-column prop="preserveName" label="签核确认人姓名" /> + <el-table-column label="状态"> + <template #default="{ row }"> + <el-tag :type="row.confirmTime ? 'success' : 'warning'"> + {{ row.confirmTime ? "已确认" : "待确认" }} + </el-tag> + </template> + </el-table-column> + <el-table-column label="操作" width="100"> + <template #default="{ row }"> + <el-button v-if="!row.confirmTime && roleType == 3" style="margin-right: 10px" type="text" @click="handleConfirm(row)">确认</el-button> + <el-button + type="text" + @click="handleView(row)" + >详情</el-button + > + </template> + </el-table-column> + </el-table> + <div class="pagination"> + <el-pagination + :current-page.sync="currentPage" + :page-size="10" + layout="total, prev, pager, next" + :total="total" + @current-change="handlePageChange" + /> + </div> + </div> + </el-dialog> + <RecordDetailDialog + :visible="visibleRecordDetailDialog" + :recordData="recordData" + @close="handleDialogClose" + @confirm="handleOutbound" + :type="dialogType" + /> + + </div> </template> <script> -import { getDetailById } from '../service' -import RecordDetailDialog from './RecordDetailDialog.vue' +import { getDetailById,confirmWarehousing } from "../service"; +import RecordDetailDialog from "./RecordDetailDialog.vue"; export default { - components: { RecordDetailDialog }, - name: 'StrainDetail', - props: { - visible: { - type: Boolean, - default: false - }, - detail: { - type: Object, - default: () => ({}) - } + components: { RecordDetailDialog }, + name: "StrainDetail", + props: { + visible: { + type: Boolean, + default: false, }, - data() { - return { - visibleRecordDetailDialog: false, - recordData: {}, - currentPage: 1, - total: 0, - query: { - endTime: '', - id: '', - pageNum: 1, - pageSize: 10, - startTime: '' - } - } + detail: { + type: Object, + default: () => ({}), }, - methods: { - fetchDetail() { - this.query.id = this.detail.id - getDetailById(this.query).then(res => { - this.detail.records = res.warehousingList?.records || []; - this.total = res.warehousingList?.total || 0; - this.currentPage = res.warehousingList?.current || 1; - }) - }, - handleView(row) { - console.log('View record:', row) - this.visibleRecordDetailDialog = true; - this.recordData = row; - }, - handlePageChange(page) { - this.currentPage = page - this.$emit('page-change', page) + }, + data() { + return { + visibleRecordDetailDialog: false, + recordData: {}, + currentPage: 1, + total: 0, + dialogType: "", + query: { + endTime: "", + id: "", + pageNum: 1, + pageSize: 10, + startTime: "", + roleType: "", + }, + }; + }, + + methods: { + handleDialogClose() { + this.recordData = {}; + this.visibleRecordDetailDialog = false; + }, + fetchDetail() { + this.roleType = JSON.parse(sessionStorage.getItem("userInfo")).roleType; + this.query.id = this.detail.id; + getDetailById(this.query).then((res) => { + this.detail.records = res.warehousingList?.records || []; + this.total = res.warehousingList?.total || 0; + this.currentPage = res.warehousingList?.current || 1; + this.$forceUpdate(); + }); + }, + handleView(row) { + this.dialogType = "detail"; + this.recordData = row; + this.visibleRecordDetailDialog = true; + + }, + handleOutbound(data) { + // 这里调用出库API + confirmWarehousing({ + id: this.recordData.id, + preserveSignature: data.preserveSignature, + }).then((res) => { + if (res.code == 200) { + this.$message.success("操作成功"); + this.visibleRecordDetailDialog = false; + // 刷新列表 + this.fetchDetail(); + } else { + this.$message.error(res.msg); } - } -} + }); + }, + handleConfirm(row) { + this.dialogType = "confirm"; + this.recordData = row; + this.visibleRecordDetailDialog = true; + }, + handlePageChange(page) { + this.currentPage = page; + this.$emit("page-change", page); + }, + }, +}; </script> <style lang="less" scoped> .strain-detail-dialog { - :deep(.el-dialog__header) { - padding: 20px; - border-bottom: 1px solid #EBEEF5; - margin-right: 0; + :deep(.el-dialog__header) { + padding: 20px; + border-bottom: 1px solid #ebeef5; + margin-right: 0; - .el-dialog__title { - font-size: 18px; - font-weight: bold; - color: #303133; - } + .el-dialog__title { + font-size: 18px; + font-weight: bold; + color: #303133; } + } - :deep(.el-dialog__body) { - padding: 20px; - } + :deep(.el-dialog__body) { + padding: 20px; + } } .strain-info { - background: #F5F7FA; - border-radius: 4px; - padding: 20px; - margin-bottom: 20px; + background: #f5f7fa; + border-radius: 4px; + padding: 20px; + margin-bottom: 20px; - .info-row { - display: flex; - flex-wrap: wrap; - margin-bottom: 16px; + .info-row { + display: flex; + flex-wrap: wrap; + margin-bottom: 16px; - &:last-child { - margin-bottom: 0; - } - - .info-item { - display: flex; - align-items: flex-start; - margin-right: 24px; - margin-bottom: 8px; - - &.left-column { - width: 33%; - min-width: 200px; - } - - &.flex-column { - flex: 1; - min-width: 150px; - } - - &.full-width { - flex: 1; - min-width: 300px; - } - - .label { - color: #606266; - margin-right: 8px; - white-space: nowrap; - } - - .value { - flex: 1; - color: #303133; - word-break: break-all; - } - } + &:last-child { + margin-bottom: 0; } + + .info-item { + display: flex; + align-items: flex-start; + margin-right: 24px; + margin-bottom: 8px; + + &.left-column { + width: 33%; + min-width: 200px; + } + + &.flex-column { + flex: 1; + min-width: 150px; + } + + &.full-width { + flex: 1; + min-width: 300px; + } + + .label { + color: #606266; + margin-right: 8px; + white-space: nowrap; + } + + .value { + flex: 1; + color: #303133; + word-break: break-all; + } + } + } } .record-table { - .table-title { - font-size: 16px; - font-weight: bold; - color: #303133; - margin-bottom: 16px; - padding-left: 8px; - border-left: 4px solid #049C9A; - } + .table-title { + font-size: 16px; + font-weight: bold; + color: #303133; + margin-bottom: 16px; + padding-left: 8px; + border-left: 4px solid #049c9a; + } - .pagination { - margin-top: 20px; - display: flex; - justify-content: center; - } + .pagination { + margin-top: 20px; + display: flex; + justify-content: center; + } } -</style> \ No newline at end of file +</style> -- Gitblit v1.7.1