This commit is contained in:
zlwu committed 2026-05-23 21:27:10 +08:00
1 parent 05684ba2a4
commit 7fbf71b6e1
150 files changed
+19834 -12611

No files matched your search

@@ -0,0 +1,42 @@
import request from '@/utils/http'
type PageList<T> = {
list: T[]
total: number
page: number
pageSize: number
totalPages: number
}
/** 查询列表(联查 sample_reception + sms_notification) */
export function fetchSampleSmsNotificationList(params?: {
page?: number
pageSize?: number
keyword?: string
acceptConclusion?: string
smsNotified?: string
}) {
return request.get<PageList<Record<string, unknown>>>({
url: '/web/admin/sample-sms-notifications/list',
params
})
}
/** 切换通知状态 */
export function fetchToggleSmsNotified(
id: string,
data: { smsNotified: number; sampleReceptionId?: string }
) {
return request.put({
url: `/web/admin/sample-sms-notifications/${id}/toggle-status`,
data
})
}
/** 生成短信内容 */
export function fetchGenerateSms(id: string, sampleReceptionId?: string) {
return request.post<{ smsContent: string }>({
url: `/web/admin/sample-sms-notifications/${id}/generate-sms`,
params: sampleReceptionId ? { sampleReceptionId } : undefined
})
}
@@ -0,0 +1,42 @@
import request from '@/utils/http'
type PageList<T> = {
list: T[]
total: number
page: number
pageSize: number
totalPages: number
}
/** 查询列表(联查 storage_release_review + sms_notification) */
export function fetchStorageEntrySmsList(params?: {
page?: number
pageSize?: number
keyword?: string
storageStatus?: string
smsNotified?: string
}) {
return request.get<PageList<Record<string, unknown>>>({
url: '/web/admin/storage-entry-sms-notifications/list',
params
})
}
/** 切换通知状态 */
export function fetchToggleStorageEntrySmsNotified(
id: string,
data: { smsNotified: number; storageReviewId?: string }
) {
return request.put({
url: `/web/admin/storage-entry-sms-notifications/${id}/toggle-status`,
data
})
}
/** 生成短信内容 */
export function fetchGenerateStorageEntrySms(id: string, storageReviewId?: string) {
return request.post<{ smsContent: string }>({
url: `/web/admin/storage-entry-sms-notifications/${id}/generate-sms`,
params: storageReviewId ? { storageReviewId } : undefined
})
}
@@ -1,4 +1,5 @@
import request from '@/utils/http'
import type { QcWorkOrderReceptionDetail } from '@/api/qc-work-order'
type PageList<T> = {
list: T[]
@@ -24,6 +25,12 @@ export type StorageReleaseReview = {
reviewTime?: string
storageStatus?: string
storageStatusLabel?: string
sampleTypeName?: string
handlerName?: string
receptionTime?: string
motherName?: string
protocolStatus?: string
protocolStatusLabel?: string
storageBy?: string
storageByName?: string
storageTime?: string
@@ -77,6 +84,7 @@ export type QcInfoTask = {
export type QcInfo = {
workOrderNo?: string
workOrderStatus?: string
workOrderStatusLabel?: string
tasks?: QcInfoTask[]
}
@@ -93,6 +101,7 @@ export type ProductionInfoTask = {
export type ProductionInfo = {
workOrderNo?: string
workOrderStatus?: string
workOrderStatusLabel?: string
tasks?: ProductionInfoTask[]
}
@@ -101,6 +110,7 @@ export type StorageReleaseReviewDetail = {
protocolInfo?: ProtocolInfo
transportInfo?: TransportInfo
receptionInfo?: ReceptionInfo
reception?: QcWorkOrderReceptionDetail
qcInfo?: QcInfo
productionInfo?: ProductionInfo
}
@@ -43,7 +43,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(index) => index + 1"
@@ -63,7 +63,7 @@
{{ row.qty != null && row.qty !== '' ? row.qty : '—' }}
</template>
</el-table-column>
<el-table-column label="单位" width="72" align="center" header-align="center">
<el-table-column label="单位" min-width="72" align="center" header-align="center">
<template #default="{ row }">{{ row.unit || '—' }}</template>
</el-table-column>
<el-table-column label="备注" min-width="140" align="center" header-align="center">
@@ -0,0 +1,317 @@
<!-- 样本查看 — 生产信息卡片(协议单查看弹窗复用) -->
<template>
<div class="sample-card__section sample-card__section--production">
<div class="sample-card__section-label">生产信息</div>
<div v-if="!productionInfo" class="sample-production-empty">暂无生产信息</div>
<template v-else>
<div class="production-work-order-row">
<div class="qc-kv">
<span class="qc-kv__label">工单号</span>
<span class="qc-kv__value qc-kv__value--code">{{
productionInfo.workOrderNo || '—'
}}</span>
</div>
<div class="qc-kv">
<span class="qc-kv__label">工单状态</span>
<span class="qc-kv__value">
<el-tag
:type="productionWorkOrderStatusTagType(productionInfo.workOrderStatus || '')"
size="small"
>
{{
productionInfo.workOrderStatusLabel ||
productionWorkOrderStatusLabel(productionInfo.workOrderStatus || '')
}}
</el-tag>
</span>
</div>
</div>
<div
v-if="productionInfo.workOrderStatus === 'dpz' && !productionInfo.tasks?.length"
class="sample-production-hint"
>
工单待配置生产任务
</div>
<div v-if="productionInfo.tasks?.length" class="production-task-cards">
<div v-for="task in productionInfo.tasks" :key="task.id" class="production-task-card">
<div class="production-task-card__header">
<span class="production-task-card__name">{{
task.taskName || task.taskNo || '—'
}}</span>
<el-tag :type="productionTaskStatusTagType(task.taskStatus || '')" size="small">
{{ task.taskStatusLabel || productionTaskStatusLabel(task.taskStatus || '') }}
</el-tag>
</div>
<div class="production-task-card__body">
<div class="qc-kv">
<span class="qc-kv__label">任务号</span>
<span class="qc-kv__value">{{ task.taskNo || '—' }}</span>
</div>
<div class="qc-kv">
<span class="qc-kv__label">开始时间</span>
<span class="qc-kv__value">{{ task.startedTime || '—' }}</span>
</div>
<div class="qc-kv">
<span class="qc-kv__label">完成时间</span>
<span class="qc-kv__value">{{ task.completedTime || '—' }}</span>
</div>
<!-- 输入信息 -->
<div v-if="task.inputs?.length" class="production-task-card__io">
<div class="production-task-card__io-label">输入</div>
<div class="production-task-card__io-items">
<div v-for="(inp, idx) in task.inputs" :key="'in-' + idx" class="io-item">
<el-tag type="info" size="small" class="io-item__type">{{
inputTypeLabel(inp.inputType)
}}</el-tag>
<span class="io-item__name">{{ inp.inputName || inp.inputCode || '—' }}</span>
</div>
</div>
</div>
<!-- 输出信息 -->
<div v-if="task.outputs?.length" class="production-task-card__io">
<div class="production-task-card__io-label">输出</div>
<div class="production-task-card__io-items">
<div v-for="(out, idx) in task.outputs" :key="'out-' + idx" class="io-item">
<el-tag type="success" size="small" class="io-item__type">{{
outputTypeLabel(out.outputType)
}}</el-tag>
<span class="io-item__name">{{ out.outputName || out.outputCode || '—' }}</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div v-else-if="productionInfo.workOrderStatus !== 'dpz'" class="sample-production-hint">
暂无生产任务
</div>
</template>
</div>
</template>
<script setup lang="ts">
export type ProductionTaskInput = {
inputType?: string
inputCode?: string
inputName?: string
}
export type ProductionTaskOutput = {
outputType?: string
outputCode?: string
outputName?: string
}
export type ProductionTask = {
id?: string
taskNo?: string
taskName?: string
taskStatus?: string
taskStatusLabel?: string
startedTime?: string
completedTime?: string
inputs?: ProductionTaskInput[]
outputs?: ProductionTaskOutput[]
}
export type ProductionInfo = {
workOrderNo?: string
workOrderStatus?: string
workOrderStatusLabel?: string
tasks?: ProductionTask[]
}
const PRODUCTION_WORK_ORDER_STATUS_LABELS: Record<string, string> = {
dpz: '待配置',
jxz: '进行中',
ywc: '已完成'
}
const PRODUCTION_TASK_STATUS_LABELS: Record<string, string> = {
dpz: '待配置',
dzx: '待执行',
jxz: '执行中',
ywc: '已完成'
}
defineProps<{
productionInfo?: ProductionInfo | null
}>()
function productionWorkOrderStatusLabel(status: string) {
return PRODUCTION_WORK_ORDER_STATUS_LABELS[status] || status || '—'
}
function productionWorkOrderStatusTagType(status: string) {
if (status === 'ywc') return 'success' as const
if (status === 'jxz') return 'warning' as const
return 'info' as const
}
function productionTaskStatusLabel(status: string) {
return PRODUCTION_TASK_STATUS_LABELS[status] || status || '—'
}
function productionTaskStatusTagType(status: string) {
if (status === 'ywc') return 'success' as const
if (status === 'jxz') return 'warning' as const
if (status === 'dzx') return 'info' as const
return 'info' as const
}
function inputTypeLabel(type?: string) {
if (type === 'sample') return '样本'
if (type === 'reagent') return '试剂'
if (type === 'consumable') return '耗材'
return type || '—'
}
function outputTypeLabel(type?: string) {
if (type === 'sample') return '样本'
if (type === 'cell_product') return '细胞产品'
if (type === 'other') return '其他'
return type || '—'
}
</script>
<style scoped lang="scss">
.sample-card__section--production {
margin-top: 4px;
padding-top: 14px;
border-top: 1px dashed #e2e8f0;
}
.sample-card__section-label {
font-size: 11px;
font-weight: 600;
color: #94a3b8;
margin-bottom: 10px;
letter-spacing: 0.3px;
}
.sample-production-empty,
.sample-production-hint {
font-size: 13px;
color: #94a3b8;
padding: 8px 0;
}
.production-work-order-row {
display: flex;
flex-wrap: wrap;
align-items: flex-start;
gap: 12px 24px;
margin-bottom: 12px;
padding: 0 2px;
}
.production-work-order-row .qc-kv {
flex: 1;
min-width: 140px;
}
.production-task-cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 10px;
}
.production-task-card {
border: 1px solid #e2e8f0;
border-radius: 8px;
background: #fff;
overflow: hidden;
}
.production-task-card__header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
padding: 10px 12px;
border-bottom: 1px solid #f1f5f9;
}
.production-task-card__name {
font-size: 13px;
font-weight: 600;
color: #1e293b;
text-align: left;
flex: 1;
word-break: break-word;
}
.production-task-card__body {
padding: 10px 12px;
display: flex;
flex-direction: column;
gap: 8px;
}
.production-task-card__io {
margin-top: 4px;
padding-top: 8px;
border-top: 1px dashed #f1f5f9;
}
.production-task-card__io-label {
font-size: 11px;
font-weight: 600;
color: #94a3b8;
margin-bottom: 6px;
}
.production-task-card__io-items {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.io-item {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 12px;
color: #475569;
.io-item__type {
flex-shrink: 0;
}
.io-item__name {
max-width: 120px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.qc-kv {
display: flex;
align-items: flex-start;
gap: 8px;
font-size: 12px;
}
.qc-kv__label {
color: #94a3b8;
flex-shrink: 0;
min-width: 56px;
}
.qc-kv__value {
color: #1e293b;
font-weight: 500;
word-break: break-word;
&--code {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
font-size: 12px;
}
}
</style>
@@ -0,0 +1,182 @@
<!-- 样本查看 — 入库放行审核信息(协议单查看弹窗复用) -->
<template>
<div class="sample-card__section sample-card__section--storage-release">
<div class="sample-card__section-label">入库放行审核信息</div>
<div v-if="!storageReleaseInfo" class="sample-storage-release-empty">
暂无入库放行审核信息
</div>
<template v-else>
<div class="storage-release-info-grid">
<div class="qc-kv">
<span class="qc-kv__label">审核结论</span>
<span class="qc-kv__value">
<el-tag
v-if="storageReleaseInfo.reviewConclusion"
:type="storageReleaseInfo.reviewConclusion === 'tg' ? 'success' : 'danger'"
size="small"
>
{{
storageReleaseInfo.reviewConclusionLabel ||
conclusionLabel(storageReleaseInfo.reviewConclusion)
}}
</el-tag>
<span v-else class="qc-kv__muted">待审核</span>
</span>
</div>
<div class="qc-kv">
<span class="qc-kv__label">审核人</span>
<span class="qc-kv__value">{{ storageReleaseInfo.reviewByName || '—' }}</span>
</div>
<div class="qc-kv">
<span class="qc-kv__label">审核时间</span>
<span class="qc-kv__value">{{ storageReleaseInfo.reviewTime || '—' }}</span>
</div>
<div v-if="storageReleaseInfo.reviewRemark" class="qc-kv qc-kv--full">
<span class="qc-kv__label">审核备注</span>
<span class="qc-kv__value qc-kv__value--muted">{{
storageReleaseInfo.reviewRemark
}}</span>
</div>
</div>
<div v-if="attachmentFiles.length" class="storage-release-attachments">
<div class="qc-kv">
<span class="qc-kv__label">审核附件</span>
<span class="qc-kv__value">
<ProtocolAttachmentReadonly
:files="attachmentFiles"
@preview="handlePreview"
@download="handleDownload"
/>
</span>
</div>
</div>
</template>
</div>
</template>
<script setup lang="ts">
import ProtocolAttachmentReadonly from '@/views/cell-storage/protocol/ProtocolAttachmentReadonly.vue'
import { downloadAttachmentFile } from '@/utils/download-attachment'
export type StorageReleaseInfo = {
reviewConclusion?: string
reviewConclusionLabel?: string
reviewByName?: string
reviewTime?: string
reviewRemark?: string
reviewAttachments?: string
}
const props = defineProps<{
storageReleaseInfo?: StorageReleaseInfo | null
}>()
const minioBaseUrl = (import.meta.env.VITE_MINIO_BASE_URL || '').replace(/\/$/, '')
const attachmentFiles = computed(() => {
const urls = String(props.storageReleaseInfo?.reviewAttachments || '').trim()
if (!urls) return []
return urls
.split(',')
.map((u) => u.trim())
.filter(Boolean)
.map((fileUrl, i) => ({
id: `srr_${i}`,
fileUrl,
fileName: fileUrl.split('/').pop() || `附件${i + 1}`
}))
})
function conclusionLabel(conclusion: string) {
if (conclusion === 'tg') return '通过'
if (conclusion === 'btg') return '不通过'
return conclusion
}
function fullFileUrl(suffix: string) {
if (!suffix) return ''
if (suffix.startsWith('http://') || suffix.startsWith('https://') || suffix.startsWith('/'))
return suffix
return minioBaseUrl ? `${minioBaseUrl}/${suffix.replace(/^\//, '')}` : suffix
}
function handlePreview(file: Record<string, any>) {
const url = fullFileUrl(String(file.fileUrl || ''))
if (url) window.open(url, '_blank')
}
function handleDownload(file: Record<string, any>) {
downloadAttachmentFile(file, { fullFileUrl })
}
</script>
<style scoped lang="scss">
.sample-card__section--storage-release {
margin-top: 4px;
padding-top: 14px;
border-top: 1px dashed #e2e8f0;
}
.sample-card__section-label {
font-size: 11px;
font-weight: 600;
color: #94a3b8;
margin-bottom: 10px;
letter-spacing: 0.3px;
}
.sample-storage-release-empty {
font-size: 13px;
color: #94a3b8;
padding: 8px 0;
}
.storage-release-info-grid {
display: flex;
flex-wrap: wrap;
align-items: flex-start;
gap: 12px 24px;
padding: 0 2px;
}
.storage-release-attachments {
margin-top: 8px;
padding-top: 8px;
border-top: 1px dashed #f1f5f9;
}
.qc-kv {
display: flex;
align-items: flex-start;
gap: 8px;
font-size: 12px;
&--full {
flex-basis: 100%;
}
}
.qc-kv__label {
color: #94a3b8;
flex-shrink: 0;
min-width: 56px;
}
.qc-kv__value {
color: #1e293b;
font-weight: 500;
word-break: break-word;
&--muted {
color: #64748b;
font-weight: 400;
}
}
.qc-kv__muted {
color: #94a3b8;
font-weight: 400;
}
</style>
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_consumable_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/consumable/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_storage_release_review_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_types_import_components_d_ts", "label": "components.d.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_reagent_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/reagent/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_api_storage_release_review_ts", "label": "storage-release-review.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts", "source_location": "L1"}, {"id": "api_storage_release_review_fetchstoragereleasereviewlist", "label": "fetchStorageReleaseReviewList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts", "source_location": "L118"}, {"id": "api_storage_release_review_fetchstoragereleasereviewdetail", "label": "fetchStorageReleaseReviewDetail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts", "source_location": "L132"}, {"id": "api_storage_release_review_submitstoragereleasereview", "label": "submitStorageReleaseReview()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts", "source_location": "L138"}, {"id": "api_storage_release_review_batchreviewstoragerelease", "label": "batchReviewStorageRelease()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts", "source_location": "L152"}, {"id": "api_storage_release_review_storesample", "label": "storeSample()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts", "source_location": "L164"}, {"id": "api_storage_release_review_batchstoresample", "label": "batchStoreSample()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts", "source_location": "L170"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_storage_release_review_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_http", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_storage_release_review_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_work_order", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts", "source_location": "L2", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_storage_release_review_ts", "target": "api_storage_release_review_fetchstoragereleasereviewlist", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts", "source_location": "L118", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_storage_release_review_ts", "target": "api_storage_release_review_fetchstoragereleasereviewdetail", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts", "source_location": "L132", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_storage_release_review_ts", "target": "api_storage_release_review_submitstoragereleasereview", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts", "source_location": "L138", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_storage_release_review_ts", "target": "api_storage_release_review_batchreviewstoragerelease", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts", "source_location": "L152", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_storage_release_review_ts", "target": "api_storage_release_review_storesample", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts", "source_location": "L164", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_storage_release_review_ts", "target": "api_storage_release_review_batchstoresample", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts", "source_location": "L170", "weight": 1.0}], "raw_calls": [{"caller_nid": "api_storage_release_review_fetchstoragereleasereviewlist", "callee": "get", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts", "source_location": "L126"}, {"caller_nid": "api_storage_release_review_fetchstoragereleasereviewdetail", "callee": "get", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/storage-release-review.ts", "source_location": "L133"}, {"caller_nid": "api_storage_release_revLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_storage_release_review_storagereleaseviewdialog_vue", "label": "StorageReleaseViewDialog.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseViewDialog.vue", "source_location": "L1"}, {"id": "storage_release_review_storagereleaseviewdialog_formatmetric", "label": "formatMetric()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseViewDialog.vue", "source_location": "L211"}, {"id": "storage_release_review_storagereleaseviewdialog_attachmentfullurl", "label": "attachmentFullUrl()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseViewDialog.vue", "source_location": "L428"}, {"id": "storage_release_review_storagereleaseviewdialog_handlereceptionattachmentpreview", "label": "handleReceptionAttachmentPreview()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseViewDialog.vue", "source_location": "L435"}, {"id": "storage_release_review_storagereleaseviewdialog_handlereceptionattachmentdownload", "label": "handleReceptionAttachmentDownload()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseViewDialog.vue", "source_location": "L440"}, {"id": "storage_release_review_storagereleaseviewdialog_handleattachmentpreview", "label": "handleAttachmentPreview()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseViewDialog.vue", "source_location": "L444"}, {"id": "storage_release_review_storagereleaseviewdialog_handleattachmentdownload", "label": "handleAttachmentDownload()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseViewDialog.vue", "source_location": "L448"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_storage_release_review_storagereleaseviewdialog_vue", "target": "storage_release_review_storagereleaseviewdialog_formatmetric", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseViewDialog.vue", "source_location": "L211", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_storage_release_review_storagereleaseviewdialog_vue", "target": "storage_release_review_storagereleaseviewdialog_attachmentfullurl", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseViewDialog.vue", "source_location": "L428", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_storage_release_review_storagereleaseviewdialog_vue", "target": "storage_release_review_storagereleaseviewdialog_handlereceptionattachmentpreview", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseViewDialog.vue", "source_location": "L435", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_storage_release_review_storagereleaseviewdialog_vue", "target": "storage_release_review_storagereleaseviewdialog_handlereceptionattachmentdownload", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseViewDialog.vue", "source_location": "L440", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_storage_release_review_storagereleaseviewdialog_vue", "target": "storage_release_review_storagereleaseviewdialog_handleattachmentpreview", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseViewDialog.vue", "source_location": "L444", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_storage_release_review_storagereleaseviewdialog_vue", "target": "storage_release_review_storagereleaseviewdialog_handleattachmentdownload", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseViewDialog.vue", "source_location": "L448", "weightLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_types_import_components_d_ts", "label": "components.d.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts", "source_location": "L1"}], "edges": [], "raw_calls": []}
+14
View File
@@ -251,6 +251,20 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
component: '/cell-storage/refund-confirm/index',
meta: { title: '退费确认(财务)', keepAlive: true, menuCode: 'biz:cellStorageRefundConfirm:list' }
},
{
id: '50000000000000000000000000000011',
name: 'CellStorageSampleReceptionInfo',
path: 'sample-reception-info',
component: '/cell-storage/sample-reception-info/index',
meta: { title: '样本接收信息', keepAlive: true, menuCode: 'cell-storage:sample-reception-info:list' }
},
{
id: '50000000000000000000000000000012',
name: 'CellStorageStorageEntryInfo',
path: 'storage-entry-info',
component: '/cell-storage/storage-entry-info/index',
meta: { title: '样本入库信息', keepAlive: true, menuCode: 'cell-storage:storage-entry-info:list' }
},
{
id: '50000000000000000000000000000006',
name: 'CellStorageStorageCert',
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -85,14 +85,14 @@
<el-table-column
prop="storageYears"
label="存储年限(年)"
width="120"
min-width="120"
align="center"
header-align="center"
/>
<el-table-column
prop="storagePrice"
label="存储价格(元)"
width="120"
min-width="120"
align="center"
header-align="center"
>
@@ -109,7 +109,7 @@
/>
<el-table-column
label="操作"
width="320"
min-width="320"
fixed="right"
align="center"
header-align="center"
@@ -95,11 +95,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -114,7 +114,7 @@
<el-table-column
prop="issued"
label="是否下发"
width="80"
min-width="80"
align="center"
header-align="center"
>
@@ -159,7 +159,7 @@
/>
<el-table-column
label="操作"
width="320"
min-width="320"
fixed="right"
align="center"
header-align="center"
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -117,7 +117,7 @@
/>
<el-table-column
label="操作"
width="400"
min-width="400"
fixed="right"
align="center"
header-align="center"
@@ -231,11 +231,11 @@
max-height="360"
@selection-change="onHospitalSelectionChange"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
/>
@@ -261,7 +261,7 @@
</el-table-column>
<el-table-column
label="操作"
width="260"
min-width="260"
fixed="right"
align="center"
header-align="center"
@@ -63,11 +63,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -79,7 +79,7 @@
align="center"
header-align="center"
/>
<el-table-column prop="sex" label="性别" width="72" align="center" header-align="center">
<el-table-column prop="sex" label="性别" min-width="72" align="center" header-align="center">
<template #default="{ row }">{{ sexLabel(row.sex) }}</template>
</el-table-column>
<el-table-column
@@ -92,7 +92,7 @@
<el-table-column
prop="age"
label="年龄"
width="72"
min-width="72"
align="center"
header-align="center"
/>
@@ -118,7 +118,7 @@
/>
<el-table-column
label="操作"
width="320"
min-width="320"
fixed="right"
align="center"
header-align="center"
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(i) => (pagination.page - 1) * pagination.pageSize + i + 1"
@@ -72,7 +72,7 @@
<el-table-column prop="companyAddress" label="地址" min-width="180" align="center" header-align="center" />
<el-table-column prop="contactName" label="联系人" min-width="100" align="center" header-align="center" />
<el-table-column prop="contactPhone" label="联系电话" min-width="120" align="center" header-align="center" />
<el-table-column prop="tag" label="状态" width="90" align="center" header-align="center">
<el-table-column prop="tag" label="状态" min-width="90" align="center" header-align="center">
<template #default="{ row }">
<el-tag :type="row.status == '1' ? 'success' : 'info'" size="small">{{ row.status == '1' ? '正常' : '停用' }}</el-tag>
</template>
@@ -196,13 +196,13 @@
max-height="460"
@selection-change="onItemSelectionChange"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="index" label="序号" width="68" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column type="index" label="序号" min-width="68" align="center" header-align="center" />
<el-table-column prop="projectName" label="险种名称" min-width="160" align="center" header-align="center" />
<el-table-column prop="projectFee" label="险种费用(元)" width="120" align="center" header-align="center">
<el-table-column prop="projectFee" label="险种费用(元)" min-width="120" align="center" header-align="center">
<template #default="{ row }">{{ row.projectFee != null ? `¥${row.projectFee}` : '—' }}</template>
</el-table-column>
<el-table-column prop="status" label="状态" width="90" align="center" header-align="center">
<el-table-column prop="status" label="状态" min-width="90" align="center" header-align="center">
<template #default="{ row }">
<el-tag :type="row.status == '1' ? 'success' : 'info'" size="small">{{ row.status == '1' ? '正常' : '停用' }}</el-tag>
</template>
@@ -106,11 +106,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -125,7 +125,7 @@
<el-table-column
prop="sampleCodeType"
label="编码类型"
width="100"
min-width="100"
align="center"
header-align="center"
>
@@ -134,7 +134,7 @@
<el-table-column
prop="issued"
label="是否下发"
width="80"
min-width="80"
align="center"
header-align="center"
>
@@ -179,7 +179,7 @@
/>
<el-table-column
label="操作"
width="320"
min-width="320"
fixed="right"
align="center"
header-align="center"
@@ -87,11 +87,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(i) => (pagination.page - 1) * pagination.pageSize + i + 1"
@@ -103,6 +103,19 @@
align="center"
header-align="center"
/>
<el-table-column
prop="protocolStatus"
label="协议状态"
min-width="100"
align="center"
header-align="center"
>
<template #default="{ row }">
<el-tag :type="protocolStatusTagType(String(row.protocolStatus || ''))" size="small">{{
protocolStatusLabel(String(row.protocolStatus || ''))
}}</el-tag>
</template>
</el-table-column>
<el-table-column
prop="motherName"
label="母亲姓名"
@@ -166,7 +179,7 @@
/>
<el-table-column
label="操作"
width="260"
min-width="260"
fixed="right"
align="center"
header-align="center"
@@ -461,6 +474,10 @@
fetchInsuranceCompanyList,
fetchInsuranceProjectPrices
} from '@/api/admin'
import {
protocolStatusLabel,
protocolStatusTagType,
} from '@/utils/status-tag-registry'
defineOptions({ name: 'CellStorageFullmoonTodo' })
@@ -58,7 +58,7 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -76,11 +76,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -506,15 +506,15 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(index) => index + 1"
/>
<el-table-column prop="materialCode" label="物料编码" min-width="120" align="center" header-align="center" />
<el-table-column prop="materialName" label="物料名称" min-width="140" align="center" header-align="center" />
<el-table-column prop="unit" label="单位" width="80" align="center" header-align="center" />
<el-table-column label="当前库存" width="100" align="center" header-align="center">
<el-table-column prop="unit" label="单位" min-width="80" align="center" header-align="center" />
<el-table-column label="当前库存" min-width="100" align="center" header-align="center">
<template #default="{ row }">{{ row.stockQty }}</template>
</el-table-column>
<el-table-column label="入库数量" min-width="130" align="center" header-align="center">
@@ -534,7 +534,7 @@
<el-input v-model="row.remark" placeholder="可选" clearable class="inner-cell-input" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" header-align="center">
<el-table-column label="操作" min-width="80" align="center" header-align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="batchStockInLines.splice($index, 1)">
移除
@@ -670,15 +670,15 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(index) => index + 1"
/>
<el-table-column prop="materialCode" label="物料编码" min-width="120" align="center" header-align="center" />
<el-table-column prop="materialName" label="物料名称" min-width="140" align="center" header-align="center" />
<el-table-column prop="unit" label="单位" width="80" align="center" header-align="center" />
<el-table-column label="当前库存" width="100" align="center" header-align="center">
<el-table-column prop="unit" label="单位" min-width="80" align="center" header-align="center" />
<el-table-column label="当前库存" min-width="100" align="center" header-align="center">
<template #default="{ row }">{{ row.stockQty }}</template>
</el-table-column>
<el-table-column label="出库数量" min-width="130" align="center" header-align="center">
@@ -699,7 +699,7 @@
<el-input v-model="row.remark" placeholder="可选" clearable class="inner-cell-input" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" header-align="center">
<el-table-column label="操作" min-width="80" align="center" header-align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="batchStockOutLines.splice($index, 1)">
移除
@@ -31,11 +31,11 @@
</div>
<div class="list-body list-wrap payment-confirm-table-wrap">
<el-table class="list-table" :data="tableData" v-loading="loading" stripe row-key="id">
<el-table class="list-table" :data="tableData" v-loading="loading" stripe row-key="id" @row-dblclick="handleRowDblClick">
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -59,33 +59,33 @@
>
<template #default="{ row }">{{ maskIdCard(row.newbornIdCard) }}</template>
</el-table-column>
<el-table-column prop="protocolStatus" label="协议状态" width="100" align="center" header-align="center">
<el-table-column prop="protocolStatus" label="协议状态" min-width="100" align="center" header-align="center">
<template #default="{ row }">
<el-tag :type="protocolStatusTagType(String(row.protocolStatus || ''))" size="small">{{ protocolStatusLabel(String(row.protocolStatus || '')) }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="payMode" label="缴费方式" width="100" align="center" header-align="center">
<el-table-column prop="payMode" label="缴费方式" min-width="100" align="center" header-align="center">
<template #default="{ row }">{{ payModeLabel(String(row.payMode || '')) }}</template>
</el-table-column>
<el-table-column prop="installmentNo" label="期数" width="80" align="center" header-align="center">
<el-table-column prop="installmentNo" label="期数" min-width="80" align="center" header-align="center">
<template #default="{ row }">{{ row.installmentNo ?? '-' }}</template>
</el-table-column>
<el-table-column prop="installmentDueDate" label="应缴费时间" width="120" align="center" header-align="center">
<el-table-column prop="installmentDueDate" label="应缴费时间" min-width="120" align="center" header-align="center">
<template #default="{ row }">{{ formatPaymentDueDate(row.installmentDueDate) }}</template>
</el-table-column>
<el-table-column prop="dueAmount" label="应缴金额(元)" width="120" align="center" header-align="center">
<el-table-column prop="dueAmount" label="应缴金额(元)" min-width="120" align="center" header-align="center">
<template #default="{ row }">{{ formatPaymentAmount(row.dueAmount) }}</template>
</el-table-column>
<el-table-column prop="transferAmount" label="实缴金额(元)" width="120" align="center" header-align="center">
<el-table-column prop="transferAmount" label="实缴金额(元)" min-width="120" align="center" header-align="center">
<template #default="{ row }">{{ formatPaymentAmount(row.transferAmount) }}</template>
</el-table-column>
<el-table-column prop="transferType" label="转账方式" width="110" align="center" header-align="center">
<el-table-column prop="transferType" label="转账方式" min-width="110" align="center" header-align="center">
<template #default="{ row }">{{ transferTypeLabel(String(row.transferType || '')) }}</template>
</el-table-column>
<el-table-column prop="transferTime" label="转账时间" min-width="170" align="center" header-align="center">
<template #default="{ row }">{{ row.transferTime || '-' }}</template>
</el-table-column>
<el-table-column prop="payStatus" label="状态" width="110" align="center" header-align="center">
<el-table-column prop="payStatus" label="状态" min-width="110" align="center" header-align="center">
<template #default>
<el-tag :type="activeTab === 'pending' ? 'warning' : 'success'" size="small">
{{ activeTab === 'pending' ? '缴费确认中' : '已缴费' }}
@@ -346,6 +346,11 @@
viewDialogVisible.value = true
}
/** 双击行:非待确认 tab 时等同于点击「查看确认信息」 */
function handleRowDblClick(row: Record<string, unknown>) {
if (activeTab.value !== 'pending') openViewConfirm(row)
}
async function submitConfirm() {
if (!currentDetailId.value) return
if (attachments.value.some((f) => f._uploading)) {
@@ -91,18 +91,19 @@
row-key="id"
:row-class-name="paymentRowClassName"
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column
v-if="activeTab === 'dfj' || activeTab === 'yjf'"
type="selection"
width="55"
min-width="55"
align="center"
header-align="center"
/>
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -161,7 +162,7 @@
<el-table-column
prop="protocolStatus"
label="协议状态"
width="100"
min-width="100"
align="center"
header-align="center"
>
@@ -172,7 +173,7 @@
<el-table-column
prop="payMode"
label="缴费方式"
width="100"
min-width="100"
align="center"
header-align="center"
>
@@ -183,14 +184,14 @@
<el-table-column
prop="installmentNo"
label="期数"
width="80"
min-width="80"
align="center"
header-align="center"
/>
<el-table-column
prop="installmentDueDate"
label="应缴费时间"
width="130"
min-width="130"
align="center"
header-align="center"
>
@@ -201,7 +202,7 @@
<el-table-column
prop="dueAmount"
label="应缴金额(元)"
width="130"
min-width="130"
align="center"
header-align="center"
>
@@ -212,7 +213,7 @@
<el-table-column
prop="transferAmount"
label="实缴金额(元)"
width="130"
min-width="130"
align="center"
header-align="center"
>
@@ -223,7 +224,7 @@
<el-table-column
prop="transferType"
label="转账方式"
width="120"
min-width="120"
align="center"
header-align="center"
>
@@ -245,7 +246,7 @@
<el-table-column
prop="payStatus"
label="状态"
width="120"
min-width="120"
align="center"
header-align="center"
>
@@ -89,11 +89,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -108,7 +108,7 @@
<el-table-column
prop="protocolStatus"
label="状态"
width="100"
min-width="100"
align="center"
header-align="center"
>
@@ -121,7 +121,7 @@
<el-table-column
prop="registerDate"
label="登记日期"
width="120"
min-width="120"
align="center"
header-align="center"
/>
@@ -156,7 +156,7 @@
<el-table-column
prop="newbornSex"
label="新生儿性别"
width="110"
min-width="110"
align="center"
header-align="center"
>
@@ -167,7 +167,7 @@
<el-table-column
prop="deliveryMode"
label="分娩方式"
width="100"
min-width="100"
align="center"
header-align="center"
>
@@ -178,7 +178,7 @@
<el-table-column
prop="newbornWeightGram"
label="新生儿体重(克)"
width="140"
min-width="140"
align="center"
header-align="center"
/>
File diff suppressed because it is too large. Load diff
@@ -73,11 +73,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -92,7 +92,7 @@
<el-table-column
prop="protocolStatus"
label="状态"
width="100"
min-width="100"
align="center"
header-align="center"
>
@@ -105,7 +105,7 @@
<el-table-column
prop="registerDate"
label="登记日期"
width="120"
min-width="120"
align="center"
header-align="center"
/>
@@ -140,7 +140,7 @@
<el-table-column
prop="newbornSex"
label="新生儿性别"
width="110"
min-width="110"
align="center"
header-align="center"
>
@@ -151,7 +151,7 @@
<el-table-column
prop="deliveryMode"
label="分娩方式"
width="100"
min-width="100"
align="center"
header-align="center"
>
@@ -162,7 +162,7 @@
<el-table-column
prop="newbornWeightGram"
label="新生儿体重(克)"
width="140"
min-width="140"
align="center"
header-align="center"
/>
@@ -210,7 +210,7 @@
/>
<el-table-column
label="操作"
width="320"
min-width="320"
fixed="right"
align="center"
header-align="center"
@@ -31,11 +31,11 @@
</div>
<div class="list-body list-wrap refund-confirm-table-wrap">
<el-table class="list-table" :data="tableData" v-loading="loading" stripe row-key="id">
<el-table class="list-table" :data="tableData" v-loading="loading" stripe row-key="id" @row-dblclick="handleRowDblClick">
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -59,33 +59,33 @@
>
<template #default="{ row }">{{ maskIdCard(row.newbornIdCard) }}</template>
</el-table-column>
<el-table-column prop="protocolStatus" label="协议状态" width="100" align="center" header-align="center">
<el-table-column prop="protocolStatus" label="协议状态" min-width="100" align="center" header-align="center">
<template #default="{ row }">
<el-tag :type="protocolStatusTagType(String(row.protocolStatus || ''))" size="small">{{ protocolStatusLabel(String(row.protocolStatus || '')) }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="payMode" label="缴费方式" width="100" align="center" header-align="center">
<el-table-column prop="payMode" label="缴费方式" min-width="100" align="center" header-align="center">
<template #default="{ row }">{{ payModeLabel(String(row.payMode || '')) }}</template>
</el-table-column>
<el-table-column prop="installmentNo" label="期数" width="80" align="center" header-align="center">
<el-table-column prop="installmentNo" label="期数" min-width="80" align="center" header-align="center">
<template #default="{ row }">{{ row.installmentNo ?? '-' }}</template>
</el-table-column>
<el-table-column prop="installmentDueDate" label="应缴费时间" width="120" align="center" header-align="center">
<el-table-column prop="installmentDueDate" label="应缴费时间" min-width="120" align="center" header-align="center">
<template #default="{ row }">{{ formatPaymentDueDate(row.installmentDueDate) }}</template>
</el-table-column>
<el-table-column prop="dueAmount" label="应缴金额(元)" width="120" align="center" header-align="center">
<el-table-column prop="dueAmount" label="应缴金额(元)" min-width="120" align="center" header-align="center">
<template #default="{ row }">{{ formatPaymentAmount(row.dueAmount) }}</template>
</el-table-column>
<el-table-column prop="transferAmount" label="实缴金额(元)" width="120" align="center" header-align="center">
<el-table-column prop="transferAmount" label="实缴金额(元)" min-width="120" align="center" header-align="center">
<template #default="{ row }">{{ formatPaymentAmount(row.transferAmount) }}</template>
</el-table-column>
<el-table-column prop="transferType" label="转账方式" width="110" align="center" header-align="center">
<el-table-column prop="transferType" label="转账方式" min-width="110" align="center" header-align="center">
<template #default="{ row }">{{ transferTypeLabel(String(row.transferType || '')) }}</template>
</el-table-column>
<el-table-column prop="transferTime" label="转账时间" min-width="170" align="center" header-align="center">
<template #default="{ row }">{{ row.transferTime || '-' }}</template>
</el-table-column>
<el-table-column prop="refundAmount" label="退费金额(元)" width="120" align="center" header-align="center">
<el-table-column prop="refundAmount" label="退费金额(元)" min-width="120" align="center" header-align="center">
<template #default="{ row }">{{ formatPaymentAmount(row.refundAmount) }}</template>
</el-table-column>
<el-table-column
@@ -98,7 +98,7 @@
>
<template #default="{ row }">{{ row.refundRemark || '-' }}</template>
</el-table-column>
<el-table-column prop="payStatus" label="状态" width="110" align="center" header-align="center">
<el-table-column prop="payStatus" label="状态" min-width="110" align="center" header-align="center">
<template #default>
<el-tag :type="activeTab === 'pending' ? 'warning' : 'success'" size="small">
{{ activeTab === 'pending' ? '退费确认中' : '已退费' }}
@@ -363,6 +363,11 @@
viewDialogVisible.value = true
}
/** 双击行:非待确认 tab 时等同于点击「查看确认信息」 */
function handleRowDblClick(row: Record<string, unknown>) {
if (activeTab.value !== 'pending') openViewConfirm(row)
}
async function submitConfirm() {
if (!currentDetailId.value) return
if (attachments.value.some((f) => f._uploading)) {
@@ -0,0 +1,245 @@
<!-- 样本接收信息 -->
<template>
<div class="page-container">
<header class="page-head">
<h1>样本接收信息</h1>
<p class="page-desc">查看样本接收信息,提取短信通知内容并管理通知状态。</p>
</header>
<section class="panel">
<div class="panel-top">
<h2 class="title-bar-heading">样本接收列表</h2>
</div>
<div class="filter-block">
<el-form :model="searchForm" class="filter-form" @submit.prevent>
<div class="filter-grid">
<el-form-item label="关键词">
<el-input v-model="searchForm.keyword" placeholder="协议号/姓名/样本编码" clearable />
</el-form-item>
<el-form-item label="接收结论">
<el-select v-model="searchForm.acceptConclusion" placeholder="全部" clearable style="width: 100%">
<el-option label="接收" value="js" />
<el-option label="拒收" value="bj" />
<el-option label="待接收确认" value="dqr" />
</el-select>
</el-form-item>
<el-form-item label="通知状态">
<el-select v-model="searchForm.smsNotified" placeholder="全部" clearable style="width: 100%">
<el-option label="已通知" value="1" />
<el-option label="未通知" value="0" />
</el-select>
</el-form-item>
</div>
<div class="filter-actions-row">
<div class="filter-actions-end">
<el-button class="btn-ghost" @click="handleReset">
<el-icon><RefreshLeft /></el-icon>重置
</el-button>
<el-button class="btn-main" type="primary" @click="handleSearch">
<el-icon><Search /></el-icon>搜索
</el-button>
</div>
</div>
</el-form>
</div>
<div class="list-body list-wrap">
<el-table
class="list-table"
:data="tableData"
v-loading="loading"
stripe
row-key="id"
@row-dblclick="handleView"
>
<el-table-column
type="index"
label="序号"
min-width="68"
align="center"
header-align="center"
:index="(i) => (pagination.page - 1) * pagination.pageSize + i + 1"
/>
<el-table-column prop="protocolNo" label="协议号" min-width="140" align="center" header-align="center" />
<el-table-column
prop="protocolStatus"
label="协议状态"
min-width="100"
align="center"
header-align="center"
>
<template #default="{ row }">
<el-tag :type="protocolStatusTagType(String(row.protocolStatus || ''))" size="small">{{
protocolStatusLabel(String(row.protocolStatus || ''))
}}</el-tag>
</template>
</el-table-column>
<el-table-column prop="motherName" label="母亲姓名" min-width="100" align="center" header-align="center" />
<el-table-column prop="newbornName" label="新生儿姓名" min-width="110" align="center" header-align="center" show-overflow-tooltip />
<el-table-column prop="sampleCode" label="样本编码" min-width="130" align="center" header-align="center" />
<el-table-column prop="sampleTypeName" label="样本类型" min-width="110" align="center" header-align="center" />
<el-table-column prop="receptionTime" label="接收时间" min-width="170" align="center" header-align="center" />
<el-table-column prop="acceptConclusion" label="接收结论" min-width="110" align="center" header-align="center">
<template #default="{ row }">
<el-tag
:type="row.acceptConclusion === 'js' ? 'success' : row.acceptConclusion === 'bj' ? 'danger' : 'warning'"
size="small"
>
{{ row.acceptConclusionLabel || (row.acceptConclusion === 'js' ? '接收' : row.acceptConclusion === 'bj' ? '拒收' : '待接收确认') }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="smsNotified" label="通知状态" min-width="100" align="center" header-align="center">
<template #default="{ row }">
<el-tag :type="row.smsNotified == 1 ? 'success' : 'info'" size="small">
{{ row.smsNotified == 1 ? '已通知' : '未通知' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" min-width="260" fixed="right" align="center" header-align="center">
<template #default="{ row }">
<el-button class="btn-op-item primary" @click="handleView(row)">
<el-icon><View /></el-icon>查看
</el-button>
<el-button class="btn-op-item" @click="handleExtractSms(row)">
<el-icon><ChatDotRound /></el-icon>提取短信
</el-button>
<el-button class="btn-op-item" @click="handleToggleNotified(row)">
<el-icon><Bell /></el-icon>{{ row.smsNotified == 1 ? '标记未通知' : '标记已通知' }}
</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination list-pager-bar">
<el-pagination
:current-page="pagination.page"
:page-size="pagination.pageSize"
:total="pagination.total"
:page-sizes="[10, 20, 50]"
layout="total, sizes, prev, pager, next"
@size-change="(val) => ((pagination.page = 1), (pagination.pageSize = val), loadData())"
@current-change="(val) => ((pagination.page = val), loadData())"
/>
</div>
</div>
<ProtocolViewDialog
v-model="viewVisible"
:protocol-id="viewProtocolId"
:list-row="viewRow"
show-audit-history
show-storage-cert
show-fullmoon-insurance
/>
</section>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
import { Search, RefreshLeft, View, ChatDotRound, Bell } from '@element-plus/icons-vue'
import { useClipboard } from '@vueuse/core'
import ProtocolViewDialog from '../protocol/ProtocolViewDialog.vue'
import {
fetchSampleSmsNotificationList,
fetchToggleSmsNotified,
fetchGenerateSms
} from '@/api/sample-sms-notification'
import { type CollectionProtocolRow } from '@/api/collection-protocol'
import {
protocolStatusLabel,
protocolStatusTagType,
} from '@/utils/status-tag-registry'
defineOptions({ name: 'CellStorageSampleReceptionInfo' })
const searchForm = reactive({ keyword: '', acceptConclusion: '', smsNotified: '' })
const tableData = ref<any[]>([])
const loading = ref(false)
const pagination = reactive({ page: 1, pageSize: 10, total: 0 })
const viewVisible = ref(false)
const viewProtocolId = ref<string | null>(null)
const viewRow = ref<CollectionProtocolRow | null>(null)
const { copy } = useClipboard()
async function loadData() {
loading.value = true
try {
const result = await fetchSampleSmsNotificationList({
page: pagination.page,
pageSize: pagination.pageSize,
keyword: searchForm.keyword || undefined,
acceptConclusion: searchForm.acceptConclusion || undefined,
smsNotified: searchForm.smsNotified || undefined
})
const res = (result as any) || {}
tableData.value = res.list || []
pagination.total = res.total || 0
} finally {
loading.value = false
}
}
function handleSearch() {
pagination.page = 1
loadData()
}
function handleReset() {
Object.assign(searchForm, { keyword: '', acceptConclusion: '', smsNotified: '' })
handleSearch()
}
function handleView(row: Record<string, unknown>) {
const pid = String(row.collectionProtocolId || row.protocolId || '')
if (!pid) {
ElMessage.warning('缺少关联协议单,无法查看')
return
}
viewProtocolId.value = pid
viewRow.value = {
id: pid,
protocolNo: row.protocolNo,
motherName: row.motherName,
newbornName: row.newbornName
}
viewVisible.value = true
}
async function handleExtractSms(row: any) {
try {
const result = await fetchGenerateSms(row.id, row.sampleReceptionId)
const content = (result as any)?.smsContent || ''
if (!content) {
ElMessage.warning('短信内容为空')
return
}
await copy(content)
ElMessage.success('短信内容已复制到剪贴板')
} catch {
ElMessage.error('提取短信失败')
}
}
async function handleToggleNotified(row: any) {
const newVal = row.smsNotified == 1 ? 0 : 1
try {
await fetchToggleSmsNotified(row.id, {
smsNotified: newVal,
sampleReceptionId: row.sampleReceptionId
})
ElMessage.success(newVal === 1 ? '已标记为已通知' : '已标记为未通知')
loadData()
} catch {
ElMessage.error('操作失败')
}
}
onMounted(() => {
loadData()
})
</script>
@@ -46,17 +46,31 @@
stripe
row-key="id"
:row-class-name="storageCertRowClassName"
@row-dblclick="handleView"
>
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(i) => (pagination.page - 1) * pagination.pageSize + i + 1"
/>
<el-table-column prop="protocolNo" label="采集协议号" width="160" align="center" header-align="center" />
<el-table-column prop="motherName" label="母亲姓名" width="100" align="center" header-align="center" />
<el-table-column prop="protocolNo" label="采集协议号" min-width="160" align="center" header-align="center" />
<el-table-column
prop="protocolStatus"
label="协议状态"
min-width="100"
align="center"
header-align="center"
>
<template #default="{ row }">
<el-tag :type="protocolStatusTagType(String(row.protocolStatus || ''))" size="small">{{
protocolStatusLabel(String(row.protocolStatus || ''))
}}</el-tag>
</template>
</el-table-column>
<el-table-column prop="motherName" label="母亲姓名" min-width="100" align="center" header-align="center" />
<el-table-column prop="motherPhone" label="母亲联系方式" min-width="130" align="center" header-align="center">
<template #default="{ row }">{{ row.motherPhone || '—' }}</template>
</el-table-column>
@@ -65,17 +79,17 @@
</el-table-column>
<el-table-column prop="newbornInfo" label="新生儿信息" min-width="200" align="center" header-align="center" show-overflow-tooltip />
<el-table-column prop="sampleInfo" label="样本信息" min-width="200" align="center" header-align="center" show-overflow-tooltip />
<el-table-column prop="storageInDate" label="入库日期" width="120" align="center" header-align="center">
<el-table-column prop="storageInDate" label="入库日期" min-width="120" align="center" header-align="center">
<template #default="{ row }">{{ row.storageInDate || '—' }}</template>
</el-table-column>
<el-table-column prop="makeStatus" label="制作状态" width="100" align="center" header-align="center">
<el-table-column prop="makeStatus" label="制作状态" min-width="100" align="center" header-align="center">
<template #default="{ row }">
<el-tag :type="row.makeStatus == '1' ? 'success' : 'warning'" size="small">
{{ row.makeStatus == '1' ? '已制作' : '未制作' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="makeDate" label="制作日期" width="120" align="center" header-align="center" />
<el-table-column prop="makeDate" label="制作日期" min-width="120" align="center" header-align="center" />
<el-table-column label="操作" min-width="260" fixed="right" align="center" header-align="center">
<template #default="{ row }">
<el-button class="btn-op-item primary" @click="handleUpload(row)">
@@ -284,6 +298,10 @@
import { fetchUploadAttachment } from '@/api/business'
import { downloadAttachmentFile } from '@/utils/download-attachment'
import { maskIdCard } from '@/utils/mask-sensitive'
import {
protocolStatusLabel,
protocolStatusTagType,
} from '@/utils/status-tag-registry'
interface CertAttachmentItem {
id: string
@@ -0,0 +1,251 @@
<!-- 样本入库信息 -->
<template>
<div class="page-container">
<header class="page-head">
<h1>样本入库信息</h1>
<p class="page-desc">查看样本入库信息,提取短信通知内容并管理通知状态。</p>
</header>
<section class="panel">
<div class="panel-top">
<h2 class="title-bar-heading">样本入库列表</h2>
</div>
<div class="filter-block">
<el-form :model="searchForm" class="filter-form" @submit.prevent>
<div class="filter-grid">
<el-form-item label="关键词">
<el-input v-model="searchForm.keyword" placeholder="协议号/姓名/样本编码" clearable />
</el-form-item>
<el-form-item label="入库状态">
<el-select v-model="searchForm.storageStatus" placeholder="全部" clearable style="width: 100%">
<el-option label="已入库" value="yrk" />
<el-option label="拒绝入库" value="btg" />
<el-option label="待入库确认" value="drk" />
</el-select>
</el-form-item>
<el-form-item label="通知状态">
<el-select v-model="searchForm.smsNotified" placeholder="全部" clearable style="width: 100%">
<el-option label="已通知" value="1" />
<el-option label="未通知" value="0" />
</el-select>
</el-form-item>
</div>
<div class="filter-actions-row">
<div class="filter-actions-end">
<el-button class="btn-ghost" @click="handleReset">
<el-icon><RefreshLeft /></el-icon>重置
</el-button>
<el-button class="btn-main" type="primary" @click="handleSearch">
<el-icon><Search /></el-icon>搜索
</el-button>
</div>
</div>
</el-form>
</div>
<div class="list-body list-wrap">
<el-table
class="list-table"
:data="tableData"
v-loading="loading"
stripe
row-key="id"
@row-dblclick="handleView"
>
<el-table-column
type="index"
label="序号"
min-width="68"
align="center"
header-align="center"
:index="(i) => (pagination.page - 1) * pagination.pageSize + i + 1"
/>
<el-table-column prop="protocolNo" label="协议号" min-width="140" align="center" header-align="center" />
<el-table-column
prop="protocolStatus"
label="协议状态"
min-width="100"
align="center"
header-align="center"
>
<template #default="{ row }">
<el-tag :type="protocolStatusTagType(String(row.protocolStatus || ''))" size="small">{{
protocolStatusLabel(String(row.protocolStatus || ''))
}}</el-tag>
</template>
</el-table-column>
<el-table-column prop="motherName" label="母亲姓名" min-width="100" align="center" header-align="center" />
<el-table-column prop="newbornName" label="新生儿姓名" min-width="110" align="center" header-align="center" show-overflow-tooltip />
<el-table-column prop="sampleCode" label="样本编码" min-width="130" align="center" header-align="center" />
<el-table-column prop="sampleTypeName" label="样本类型" min-width="110" align="center" header-align="center" />
<el-table-column prop="storageTime" label="入库时间" min-width="170" align="center" header-align="center" />
<el-table-column prop="storageStatusLabel" label="入库状态" min-width="100" align="center" header-align="center">
<template #default="{ row }">
<el-tag
:type="
row.storageStatusLabel === '已入库'
? 'success'
: row.storageStatusLabel === '拒绝入库'
? 'danger'
: 'warning'
"
size="small"
>
{{ row.storageStatusLabel }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="smsNotified" label="通知状态" min-width="100" align="center" header-align="center">
<template #default="{ row }">
<el-tag :type="row.smsNotified == 1 ? 'success' : 'info'" size="small">
{{ row.smsNotified == 1 ? '已通知' : '未通知' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" min-width="260" fixed="right" align="center" header-align="center">
<template #default="{ row }">
<el-button class="btn-op-item primary" @click="handleView(row)">
<el-icon><View /></el-icon>查看
</el-button>
<el-button class="btn-op-item" @click="handleExtractSms(row)">
<el-icon><ChatDotRound /></el-icon>提取短信
</el-button>
<el-button class="btn-op-item" @click="handleToggleNotified(row)">
<el-icon><Bell /></el-icon>{{ row.smsNotified == 1 ? '标记未通知' : '标记已通知' }}
</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination list-pager-bar">
<el-pagination
:current-page="pagination.page"
:page-size="pagination.pageSize"
:total="pagination.total"
:page-sizes="[10, 20, 50]"
layout="total, sizes, prev, pager, next"
@size-change="(val) => ((pagination.page = 1), (pagination.pageSize = val), loadData())"
@current-change="(val) => ((pagination.page = val), loadData())"
/>
</div>
</div>
<ProtocolViewDialog
v-model="viewVisible"
:protocol-id="viewProtocolId"
:list-row="viewRow"
show-audit-history
show-storage-cert
show-fullmoon-insurance
/>
</section>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
import { Search, RefreshLeft, View, ChatDotRound, Bell } from '@element-plus/icons-vue'
import { useClipboard } from '@vueuse/core'
import ProtocolViewDialog from '../protocol/ProtocolViewDialog.vue'
import {
fetchStorageEntrySmsList,
fetchToggleStorageEntrySmsNotified,
fetchGenerateStorageEntrySms
} from '@/api/storage-entry-sms-notification'
import { type CollectionProtocolRow } from '@/api/collection-protocol'
import {
protocolStatusLabel,
protocolStatusTagType,
} from '@/utils/status-tag-registry'
defineOptions({ name: 'CellStorageStorageEntryInfo' })
const searchForm = reactive({ keyword: '', storageStatus: '', smsNotified: '' })
const tableData = ref<any[]>([])
const loading = ref(false)
const pagination = reactive({ page: 1, pageSize: 10, total: 0 })
const viewVisible = ref(false)
const viewProtocolId = ref<string | null>(null)
const viewRow = ref<CollectionProtocolRow | null>(null)
const { copy } = useClipboard()
async function loadData() {
loading.value = true
try {
const result = await fetchStorageEntrySmsList({
page: pagination.page,
pageSize: pagination.pageSize,
keyword: searchForm.keyword || undefined,
storageStatus: searchForm.storageStatus || undefined,
smsNotified: searchForm.smsNotified || undefined
})
const res = (result as any) || {}
tableData.value = res.list || []
pagination.total = res.total || 0
} finally {
loading.value = false
}
}
function handleSearch() {
pagination.page = 1
loadData()
}
function handleReset() {
Object.assign(searchForm, { keyword: '', storageStatus: '', smsNotified: '' })
handleSearch()
}
function handleView(row: Record<string, unknown>) {
const pid = String(row.collectionProtocolId || row.protocolId || '')
if (!pid) {
ElMessage.warning('缺少关联协议单,无法查看')
return
}
viewProtocolId.value = pid
viewRow.value = {
id: pid,
protocolNo: row.protocolNo,
motherName: row.motherName,
newbornName: row.newbornName
}
viewVisible.value = true
}
async function handleExtractSms(row: any) {
try {
const result = await fetchGenerateStorageEntrySms(row.id, row.storageReviewId)
const content = (result as any)?.smsContent || ''
if (!content) {
ElMessage.warning('短信内容为空')
return
}
await copy(content)
ElMessage.success('短信内容已复制到剪贴板')
} catch {
ElMessage.error('提取短信失败')
}
}
async function handleToggleNotified(row: any) {
const newVal = row.smsNotified == 1 ? 0 : 1
try {
await fetchToggleStorageEntrySmsNotified(row.id, {
smsNotified: newVal,
storageReviewId: row.storageReviewId
})
ElMessage.success(newVal === 1 ? '已标记为已通知' : '已标记为未通知')
loadData()
} catch {
ElMessage.error('操作失败')
}
}
onMounted(() => {
loadData()
})
</script>
@@ -59,32 +59,32 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
/>
<el-table-column prop="roomCode" label="编号" width="140" align="center" header-align="center" />
<el-table-column prop="roomCode" label="编号" min-width="140" align="center" header-align="center" />
<el-table-column prop="roomName" label="名称" min-width="160" align="center" header-align="center" />
<el-table-column label="等级" width="100" align="center" header-align="center">
<el-table-column label="等级" min-width="100" align="center" header-align="center">
<template #default="{ row }">
<el-tag class="clean-room-grade-tag" :class="gradeTagClass(row.roomGrade)" effect="light">
{{ gradeLabel(row.roomGrade) }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="状态" width="100" align="center" header-align="center">
<el-table-column label="状态" min-width="100" align="center" header-align="center">
<template #default="{ row }">
<el-tag :type="row.roomStatus === 'zc' ? 'success' : 'danger'" effect="plain">
{{ row.roomStatus === 'zc' ? '正常' : '异常' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="areaSqm" label="面积(m²)" width="120" align="center" header-align="center" />
<el-table-column prop="areaSqm" label="面积(m²)" min-width="120" align="center" header-align="center" />
<el-table-column label="操作" min-width="320" fixed="right" align="center" header-align="center">
<template #default="{ row }">
<el-button class="btn-op-item" @click="handleView(row)"
@@ -218,7 +218,7 @@
<el-table-column
type="index"
label="序号"
width="60"
min-width="60"
align="center"
header-align="center"
:index="(index) => (logPagination.page - 1) * logPagination.pageSize + index + 1"
@@ -228,7 +228,7 @@
<el-table-column prop="enterTime" label="进入时间" min-width="160" align="center" header-align="center" />
<el-table-column prop="purpose" label="目的" min-width="120" align="center" header-align="center" show-overflow-tooltip />
<el-table-column prop="leaveTime" label="离开时间" min-width="160" align="center" header-align="center" />
<el-table-column prop="bodyTemp" label="体温(℃)" width="90" align="center" header-align="center">
<el-table-column prop="bodyTemp" label="体温(℃)" min-width="90" align="center" header-align="center">
<template #default="{ row }">{{ row.bodyTemp != null ? row.bodyTemp + '℃' : '-' }}</template>
</el-table-column>
<el-table-column prop="remark" label="备注" min-width="160" align="center" header-align="center" show-overflow-tooltip />
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -381,8 +381,8 @@
</el-button>
</div>
<el-table :data="occupancyList" v-loading="occupancyLoading" size="small" max-height="360">
<el-table-column type="index" label="序号" width="60" />
<el-table-column label="物品类型" width="120">
<el-table-column type="index" label="序号" min-width="60" />
<el-table-column label="物品类型" min-width="120">
<template #default="{ row }">
<el-tag :type="row.itemType === 'cell_product' ? 'primary' : 'info'" size="small">
{{ row.itemType === 'cell_product' ? '细胞产品' : '其他' }}
@@ -391,13 +391,13 @@
</el-table-column>
<el-table-column prop="itemCode" label="物品编码" min-width="140" />
<el-table-column prop="itemName" label="物品名称" min-width="140" />
<el-table-column label="来源" width="120">
<el-table-column label="来源" min-width="120">
<template #default="{ row }">
{{ { production: '生产入库', manual: '手动入库', transfer: '转移' }[row.itemSource] || row.itemSource }}
</template>
</el-table-column>
<el-table-column prop="storedAt" label="入库时间" width="170" />
<el-table-column label="操作" width="80" fixed="right">
<el-table-column prop="storedAt" label="入库时间" min-width="170" />
<el-table-column label="操作" min-width="80" fixed="right">
<template #default="{ row }">
<el-button type="danger" link size="small" @click="handleRemoveOccupancy(row)">
出库
@@ -419,8 +419,8 @@
<el-tab-pane label="出入库历史" name="history">
<el-table :data="historyList" v-loading="historyLoading" size="small" max-height="400">
<el-table-column type="index" label="序号" width="60" />
<el-table-column label="物品类型" width="120">
<el-table-column type="index" label="序号" min-width="60" />
<el-table-column label="物品类型" min-width="120">
<template #default="{ row }">
<el-tag :type="row.itemType === 'cell_product' ? 'primary' : 'info'" size="small">
{{ row.itemType === 'cell_product' ? '细胞产品' : '其他' }}
@@ -429,14 +429,14 @@
</el-table-column>
<el-table-column prop="itemCode" label="物品编码" min-width="120" />
<el-table-column prop="itemName" label="物品名称" min-width="120" />
<el-table-column label="来源" width="100">
<el-table-column label="来源" min-width="100">
<template #default="{ row }">
{{ { production: '生产入库', manual: '手动入库', transfer: '转移' }[row.itemSource] || row.itemSource }}
</template>
</el-table-column>
<el-table-column prop="storedAt" label="入库时间" width="170" />
<el-table-column prop="removedAt" label="出库时间" width="170" />
<el-table-column label="状态" width="100">
<el-table-column prop="storedAt" label="入库时间" min-width="170" />
<el-table-column prop="removedAt" label="出库时间" min-width="170" />
<el-table-column label="状态" min-width="100">
<template #default="{ row }">
<el-tag :type="row.occupancyStatus === 'stored' ? 'success' : 'warning'" size="small">
{{ row.occupancyStatus === 'stored' ? '在库' : '已出库' }}
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -235,7 +235,7 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
/>
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -688,7 +688,7 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
/>
@@ -768,7 +768,7 @@
</el-table-column>
<el-table-column
label="操作"
width="100"
min-width="100"
fixed="right"
align="center"
header-align="center"
@@ -954,7 +954,7 @@
>
<el-table-column
type="selection"
width="45"
min-width="45"
align="center"
header-align="center"
:selectable="priceSelectorRowSelectable"
@@ -22,17 +22,17 @@
max-height="420"
@selection-change="(rows) => (selectedRows = rows)"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="index" label="序号" width="68" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column type="index" label="序号" min-width="68" align="center" header-align="center" />
<el-table-column prop="packageName" label="套餐名称" min-width="140" align="center" header-align="center" />
<el-table-column prop="packageCode" label="套餐编码" min-width="120" align="center" header-align="center" />
<el-table-column prop="itemCount" label="项目数" width="80" align="center" header-align="center" />
<el-table-column label="合计费用(元)" width="120" align="center" header-align="center">
<el-table-column prop="itemCount" label="项目数" min-width="80" align="center" header-align="center" />
<el-table-column label="合计费用(元)" min-width="120" align="center" header-align="center">
<template #default="{ row }">{{
row.totalFee != null ? `¥${row.totalFee}` : '—'
}}</template>
</el-table-column>
<el-table-column prop="status" label="状态" width="90" align="center">
<el-table-column prop="status" label="状态" min-width="90" align="center">
<template #default="{ row }">
<el-tag :type="row.status == '1' ? 'success' : 'info'" size="small">{{ row.status == '1' ? '正常' : '停用' }}</el-tag>
</template>
@@ -117,7 +117,7 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
/>
@@ -138,7 +138,7 @@
/>
</template>
</el-table-column>
<el-table-column label="状态" width="90" align="center" header-align="center">
<el-table-column label="状态" min-width="90" align="center" header-align="center">
<template #default="{ row }">
<el-tag :type="row.status == '1' ? 'success' : 'info'" size="small">{{
row.status == '1' ? '正常' : '停用'
@@ -206,7 +206,7 @@
max-height="360"
@selection-change="(rows) => (projectSelectorSelected = rows)"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
prop="projectName"
label="项目名称"
@@ -214,12 +214,12 @@
align="center"
header-align="center"
/>
<el-table-column label="项目费用(元)" width="120" align="center" header-align="center">
<el-table-column label="项目费用(元)" min-width="120" align="center" header-align="center">
<template #default="{ row }">{{
row.projectFee != null ? `¥${row.projectFee}` : '—'
}}</template>
</el-table-column>
<el-table-column prop="status" label="状态" width="90" align="center" header-align="center">
<el-table-column prop="status" label="状态" min-width="90" align="center" header-align="center">
<template #default="{ row }">
<el-tag :type="row.status == '1' ? 'success' : 'info'" size="small">{{
row.status == '1' ? '正常' : '停用'
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(i) => (pagination.page - 1) * pagination.pageSize + i + 1"
@@ -72,7 +72,7 @@
<el-table-column prop="institutionAddress" label="机构地址" min-width="180" align="center" header-align="center" />
<el-table-column prop="contactName" label="联系人" min-width="100" align="center" header-align="center" />
<el-table-column prop="contactPhone" label="联系电话" min-width="120" align="center" header-align="center" />
<el-table-column prop="status" label="状态" width="90" align="center" header-align="center">
<el-table-column prop="status" label="状态" min-width="90" align="center" header-align="center">
<template #default="{ row }">
<el-tag :type="row.status == '1' ? 'success' : 'info'" size="small">{{ row.status == '1' ? '正常' : '停用' }}</el-tag>
</template>
@@ -197,13 +197,13 @@
max-height="460"
@selection-change="onItemSelectionChange"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="index" label="序号" width="68" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column type="index" label="序号" min-width="68" align="center" header-align="center" />
<el-table-column prop="projectName" label="项目名称" min-width="160" align="center" header-align="center" />
<el-table-column prop="projectFee" label="项目费用(元)" width="120" align="center" header-align="center">
<el-table-column prop="projectFee" label="项目费用(元)" min-width="120" align="center" header-align="center">
<template #default="{ row }">{{ row.projectFee != null ? `¥${row.projectFee}` : '—' }}</template>
</el-table-column>
<el-table-column prop="status" label="状态" width="90" align="center" header-align="center">
<el-table-column prop="status" label="状态" min-width="90" align="center" header-align="center">
<template #default="{ row }">
<el-tag :type="row.status == '1' ? 'success' : 'info'" size="small">{{ row.status == '1' ? '正常' : '停用' }}</el-tag>
</template>
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -172,7 +172,7 @@
</el-button>
</div>
<el-table :data="detailItems" size="small" class="detail-table" max-height="320">
<el-table-column type="index" label="序号" width="55" align="center" header-align="center" />
<el-table-column type="index" label="序号" min-width="55" align="center" header-align="center" />
<el-table-column prop="projectName" label="项目名称" min-width="120" align="center" header-align="center" />
<el-table-column prop="projectCode" label="项目编码" min-width="100" align="center" header-align="center" />
<el-table-column prop="cellTypeName" label="细胞类型" min-width="100" align="center" header-align="center" />
@@ -195,7 +195,7 @@
<el-input v-model="row.remark" placeholder="备注" clearable />
</template>
</el-table-column>
<el-table-column label="操作" width="80" fixed="right" align="center" header-align="center">
<el-table-column label="操作" min-width="80" fixed="right" align="center" header-align="center">
<template #default="{ $index }">
<el-button class="btn-op-item" type="danger" link size="small" @click="detailItems.splice($index, 1)">
<el-icon><Delete /></el-icon>删除
@@ -242,7 +242,7 @@
max-height="400"
@selection-change="handlePriceSelectorChange"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column prop="projectName" label="项目名称" min-width="120" align="center" header-align="center" />
<el-table-column prop="projectCode" label="项目编码" min-width="100" align="center" header-align="center" />
<el-table-column prop="cellTypeName" label="细胞类型" min-width="100" align="center" header-align="center" />
@@ -99,14 +99,14 @@
>
<el-table-column
type="selection"
width="55"
min-width="55"
align="center"
header-align="center"
/>
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -146,7 +146,7 @@
<el-table-column
prop="passage"
label="代次"
width="80"
min-width="80"
align="center"
>
<template #default="{ row }">
@@ -182,7 +182,7 @@
<el-table-column
prop="viability"
label="活性(%)"
width="90"
min-width="90"
align="center"
>
<template #default="{ row }">
@@ -192,7 +192,7 @@
<el-table-column
prop="productStatus"
label="状态"
width="100"
min-width="100"
align="center"
>
<template #default="{ row }">
@@ -508,7 +508,7 @@
<el-table-column
type="index"
label="序号"
width="64"
min-width="64"
align="center"
/>
<el-table-column label="产品编码" min-width="200">
@@ -63,11 +63,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -168,7 +168,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(index) => index + 1"
@@ -244,7 +244,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(index) => index + 1"
@@ -267,7 +267,7 @@
<el-input v-model="row.remark" placeholder="备注" class="inner-cell-input" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" header-align="center">
<el-table-column label="操作" min-width="80" align="center" header-align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="formData.items.splice($index, 1)">
删除
@@ -321,7 +321,7 @@
row-key="id"
@selection-change="handleConsumableSelectionChange"
>
<el-table-column type="selection" width="48" align="center" header-align="center" :reserve-selection="true" />
<el-table-column type="selection" min-width="48" align="center" header-align="center" :reserve-selection="true" />
<el-table-column prop="consumableCode" label="耗材编码" min-width="120" align="center" header-align="center" />
<el-table-column prop="consumableName" label="耗材名称" min-width="140" align="center" header-align="center" />
<el-table-column prop="specModel" label="规格型号" min-width="120" align="center" header-align="center" />
@@ -76,11 +76,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -182,7 +182,7 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (logPagination.page - 1) * logPagination.pageSize + index + 1"
@@ -527,15 +527,15 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(index) => index + 1"
/>
<el-table-column prop="materialCode" label="耗材编码" min-width="120" align="center" header-align="center" />
<el-table-column prop="materialName" label="耗材名称" min-width="140" align="center" header-align="center" />
<el-table-column prop="unit" label="单位" width="80" align="center" header-align="center" />
<el-table-column label="当前库存" width="100" align="center" header-align="center">
<el-table-column prop="unit" label="单位" min-width="80" align="center" header-align="center" />
<el-table-column label="当前库存" min-width="100" align="center" header-align="center">
<template #default="{ row }">{{ row.stockQty }}</template>
</el-table-column>
<el-table-column label="入库数量" min-width="130" align="center" header-align="center">
@@ -555,7 +555,7 @@
<el-input v-model="row.remark" placeholder="可选" clearable class="inner-cell-input" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" header-align="center">
<el-table-column label="操作" min-width="80" align="center" header-align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="batchStockInLines.splice($index, 1)">
移除
@@ -682,15 +682,15 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(index) => index + 1"
/>
<el-table-column prop="materialCode" label="耗材编码" min-width="120" align="center" header-align="center" />
<el-table-column prop="materialName" label="耗材名称" min-width="140" align="center" header-align="center" />
<el-table-column prop="unit" label="单位" width="80" align="center" header-align="center" />
<el-table-column label="当前库存" width="100" align="center" header-align="center">
<el-table-column prop="unit" label="单位" min-width="80" align="center" header-align="center" />
<el-table-column label="当前库存" min-width="100" align="center" header-align="center">
<template #default="{ row }">{{ row.stockQty }}</template>
</el-table-column>
<el-table-column label="出库数量" min-width="130" align="center" header-align="center">
@@ -711,7 +711,7 @@
<el-input v-model="row.remark" placeholder="可选" clearable class="inner-cell-input" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" header-align="center">
<el-table-column label="操作" min-width="80" align="center" header-align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="batchStockOutLines.splice($index, 1)">
移除
@@ -763,7 +763,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(index) => (stockLogPagination.page - 1) * stockLogPagination.pageSize + index + 1"
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -85,11 +85,11 @@
row-key="id"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index: number) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -410,7 +410,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(i: number) => i + 1"
@@ -478,7 +478,7 @@
</el-select>
</template>
</el-table-column>
<el-table-column label="关键物料" width="90" align="center" header-align="center">
<el-table-column label="关键物料" min-width="90" align="center" header-align="center">
<template #default="{ row }">
<el-switch v-model="row.isKeyMaterial" @change="saveReagents" />
</template>
@@ -488,7 +488,7 @@
<el-input v-model="row.remark" placeholder="备注" class="inner-cell-input" @change="saveReagents" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" header-align="center">
<el-table-column label="操作" min-width="80" align="center" header-align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="removeReagentRow($index)">删除</el-button>
</template>
@@ -509,7 +509,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(i: number) => i + 1"
@@ -577,7 +577,7 @@
</el-select>
</template>
</el-table-column>
<el-table-column label="必需" width="80" align="center" header-align="center">
<el-table-column label="必需" min-width="80" align="center" header-align="center">
<template #default="{ row }">
<el-switch v-model="row.isRequired" @change="saveConsumables" />
</template>
@@ -587,7 +587,7 @@
<el-input v-model="row.remark" placeholder="备注" class="inner-cell-input" @change="saveConsumables" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" header-align="center">
<el-table-column label="操作" min-width="80" align="center" header-align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="removeConsumableRow($index)">删除</el-button>
</template>
@@ -608,7 +608,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(i: number) => i + 1"
@@ -640,7 +640,7 @@
<el-input v-model="row.remark" placeholder="备注" class="inner-cell-input" @change="saveOutputs" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" header-align="center">
<el-table-column label="操作" min-width="80" align="center" header-align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="removeOutputRow($index)">删除</el-button>
</template>
@@ -661,7 +661,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(i: number) => i + 1"
@@ -700,7 +700,7 @@
<el-input v-model="row.remark" placeholder="备注" class="inner-cell-input" @change="saveDataCollections" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" header-align="center">
<el-table-column label="操作" min-width="80" align="center" header-align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="removeDataCollectionRow($index)">删除</el-button>
</template>
@@ -62,11 +62,11 @@
row-key="id"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -256,7 +256,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(index) => index + 1"
@@ -274,7 +274,7 @@
</template>
</el-table-column>
<el-table-column prop="unit" label="单位" min-width="80" align="center" header-align="center" />
<el-table-column label="关键物料" width="90" align="center" header-align="center">
<el-table-column label="关键物料" min-width="90" align="center" header-align="center">
<template #default="{ row }">
<el-switch v-model="row.isKeyMaterial" />
</template>
@@ -284,7 +284,7 @@
<el-input v-model="row.remark" placeholder="备注" class="inner-cell-input" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" header-align="center">
<el-table-column label="操作" min-width="80" align="center" header-align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="reagentList.splice($index, 1)">删除</el-button>
</template>
@@ -312,7 +312,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(index) => index + 1"
@@ -330,7 +330,7 @@
</template>
</el-table-column>
<el-table-column prop="unit" label="单位" min-width="80" align="center" header-align="center" />
<el-table-column label="必填" width="80" align="center" header-align="center">
<el-table-column label="必填" min-width="80" align="center" header-align="center">
<template #default="{ row }">
<el-switch v-model="row.isRequired" />
</template>
@@ -340,7 +340,7 @@
<el-input v-model="row.remark" placeholder="备注" class="inner-cell-input" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" header-align="center">
<el-table-column label="操作" min-width="80" align="center" header-align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="consumableList.splice($index, 1)">删除</el-button>
</template>
@@ -392,7 +392,7 @@
<el-input v-model="row.remark" placeholder="备注" class="inner-cell-input" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" header-align="center">
<el-table-column label="操作" min-width="80" align="center" header-align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="outputList.splice($index, 1)">删除</el-button>
</template>
@@ -421,7 +421,7 @@
stripe
class="inner-table data-collection-sort-table"
>
<el-table-column label="" width="52" align="center" header-align="center" class-name="drag-col">
<el-table-column label="" min-width="52" align="center" header-align="center" class-name="drag-col">
<template #default>
<el-icon class="data-collection-drag-handle" title="拖拽排序"><Rank /></el-icon>
</template>
@@ -429,7 +429,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(index) => index + 1"
@@ -462,7 +462,7 @@
</el-select>
</template>
</el-table-column>
<el-table-column label="排序号" width="88" align="center" header-align="center">
<el-table-column label="排序号" min-width="88" align="center" header-align="center">
<template #default="{ $index }">
<span class="data-collection-order-num">{{ $index + 1 }}</span>
</template>
@@ -472,7 +472,7 @@
<el-input v-model="row.remark" placeholder="备注" class="inner-cell-input" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" header-align="center">
<el-table-column label="操作" min-width="80" align="center" header-align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="removeDataCollectionRow($index)">删除</el-button>
</template>
@@ -526,7 +526,7 @@
row-key="id"
@selection-change="handleReagentSelectionChange"
>
<el-table-column type="selection" width="48" align="center" header-align="center" :reserve-selection="true" />
<el-table-column type="selection" min-width="48" align="center" header-align="center" :reserve-selection="true" />
<el-table-column prop="reagentCode" label="试剂编码" min-width="120" align="center" header-align="center" />
<el-table-column prop="reagentName" label="试剂名称" min-width="140" align="center" header-align="center" />
<el-table-column prop="spec" label="规格" min-width="100" align="center" header-align="center" />
@@ -578,7 +578,7 @@
row-key="id"
@selection-change="handleConsumableSelectionChange"
>
<el-table-column type="selection" width="48" align="center" header-align="center" :reserve-selection="true" />
<el-table-column type="selection" min-width="48" align="center" header-align="center" :reserve-selection="true" />
<el-table-column prop="consumableCode" label="耗材编码" min-width="120" align="center" header-align="center" />
<el-table-column prop="consumableName" label="耗材名称" min-width="140" align="center" header-align="center" />
<el-table-column prop="specModel" label="规格型号" min-width="120" align="center" header-align="center" />
@@ -625,7 +625,7 @@
row-key="id"
@row-click="handlePackRowClick"
>
<el-table-column label="" width="52" align="center" header-align="center">
<el-table-column label="" min-width="52" align="center" header-align="center">
<template #default="{ row }">
<el-radio v-model="selectedPackId" :value="row.id" @click.stop />
</template>
@@ -46,19 +46,27 @@
stripe
@row-dblclick="handleViewDetail"
>
<el-table-column type="index" label="序号" width="68" align="center" :index="(i: number) => (pagination.page - 1) * pagination.pageSize + i + 1" />
<el-table-column type="index" label="序号" min-width="68" align="center" :index="(i: number) => (pagination.page - 1) * pagination.pageSize + i + 1" />
<el-table-column prop="taskNo" label="任务号" min-width="150" align="center" />
<el-table-column prop="workOrderNo" label="所属工单号" min-width="140" align="center" />
<el-table-column prop="protocolNo" label="协议号" min-width="140" align="center">
<template #default="{ row }">{{ row.protocolNo || '—' }}</template>
</el-table-column>
<el-table-column prop="protocolStatus" label="协议状态" min-width="100" align="center">
<template #default="{ row }">
<el-tag
:type="protocolStatusTagTypeBySource(String(row.protocolStatus || ''), row.receptionSource || 'cell_storage')"
size="small"
>{{ protocolStatusLabelBySource(String(row.protocolStatus || ''), row.receptionSource || 'cell_storage') }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="sampleCode" label="样本编码" min-width="130" align="center">
<template #default="{ row }">{{ row.sampleCode || '—' }}</template>
</el-table-column>
<el-table-column prop="sampleTypeName" label="样本类型" min-width="110" align="center">
<template #default="{ row }">{{ row.sampleTypeName || '—' }}</template>
</el-table-column>
<el-table-column prop="taskType" label="任务类型" width="120" align="center">
<el-table-column prop="taskType" label="任务类型" min-width="120" align="center">
<template #default="{ row }">
<el-tag :type="taskTypeTag(row.taskType).type" size="small">{{ taskTypeTag(row.taskType).label }}</el-tag>
</template>
@@ -73,7 +81,7 @@
<el-table-column prop="receptionTime" label="接收时间" min-width="170" align="center">
<template #default="{ row }">{{ row.receptionTime || '—' }}</template>
</el-table-column>
<el-table-column prop="taskStatus" label="任务状态" width="110" align="center">
<el-table-column prop="taskStatus" label="任务状态" min-width="110" align="center">
<template #default="{ row }">
<el-tag :type="taskStatusTag(row.taskStatus).type" size="small">{{ taskStatusTag(row.taskStatus).label }}</el-tag>
</template>
@@ -119,8 +127,23 @@
<script setup lang="ts">
import { RefreshLeft, Search, VideoPlay, View } from '@element-plus/icons-vue'
import { fetchProductionTaskList } from '@/api/production-task'
import {
protocolStatusLabel,
protocolStatusTagType,
donationStatusLabel,
donationStatusTagType,
} from '@/utils/status-tag-registry'
import type { TagType } from '@/utils/status-tag-registry'
import TaskExecutionDialog from '../production-work-order/TaskExecutionDialog.vue'
/** 根据来源类型返回协议状态标签 */
function protocolStatusLabelBySource(status: string, source: string): string {
return source === 'research_donation' ? donationStatusLabel(status) : protocolStatusLabel(status)
}
function protocolStatusTagTypeBySource(status: string, source: string): TagType {
return source === 'research_donation' ? donationStatusTagType(status) : protocolStatusTagType(status)
}
defineOptions({ name: 'ProductionProductionTask' })
const route = useRoute()
@@ -132,7 +132,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
:index="(i: number) => i + 1"
/>
@@ -237,7 +237,7 @@
<span v-else>{{ row.unit || '—' }}</span>
</template>
</el-table-column>
<el-table-column label="关键物料" width="90" align="center">
<el-table-column label="关键物料" min-width="90" align="center">
<template #default="{ row }">
<el-switch v-if="!readonly" v-model="row.isKeyMaterial" />
<el-tag v-else :type="row.isKeyMaterial ? 'success' : 'info'" size="small">
@@ -256,7 +256,7 @@
<span v-else>{{ row.remark || '—' }}</span>
</template>
</el-table-column>
<el-table-column v-if="!readonly" label="操作" width="80" align="center">
<el-table-column v-if="!readonly" label="操作" min-width="80" align="center">
<template #default="{ $index }">
<el-button
link
@@ -295,7 +295,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
:index="(i: number) => i + 1"
/>
@@ -400,7 +400,7 @@
<span v-else>{{ row.unit || '—' }}</span>
</template>
</el-table-column>
<el-table-column label="必需" width="80" align="center">
<el-table-column label="必需" min-width="80" align="center">
<template #default="{ row }">
<el-switch v-if="!readonly" v-model="row.isRequired" />
<el-tag v-else :type="row.isRequired ? 'success' : 'info'" size="small">
@@ -419,7 +419,7 @@
<span v-else>{{ row.remark || '—' }}</span>
</template>
</el-table-column>
<el-table-column v-if="!readonly" label="操作" width="80" align="center">
<el-table-column v-if="!readonly" label="操作" min-width="80" align="center">
<template #default="{ $index }">
<el-button
link
@@ -453,7 +453,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
:index="(i: number) => i + 1"
/>
@@ -513,7 +513,7 @@
<span v-else>{{ row.remark || '—' }}</span>
</template>
</el-table-column>
<el-table-column v-if="!readonly" label="操作" width="80" align="center">
<el-table-column v-if="!readonly" label="操作" min-width="80" align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="editor.removeOutputRow($index)"
>删除</el-button
@@ -548,7 +548,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
:index="(i: number) => i + 1"
/>
@@ -619,7 +619,7 @@
<span v-else>{{ row.remark || '—' }}</span>
</template>
</el-table-column>
<el-table-column v-if="!readonly" label="操作" width="80" align="center">
<el-table-column v-if="!readonly" label="操作" min-width="80" align="center">
<template #default="{ $index }">
<el-button
link
@@ -25,8 +25,8 @@
v-loading="loading"
empty-text="暂无原材料"
>
<el-table-column type="index" label="序号" width="56" align="center" />
<el-table-column label="类型" width="100" align="center">
<el-table-column type="index" label="序号" min-width="56" align="center" />
<el-table-column label="类型" min-width="100" align="center">
<template #default="{ row }">
<el-tag :type="inputTypeTagType(row.inputType)" size="small">
{{ row.inputType === 'cell_product' ? '细胞产品' : '样本' }}
@@ -55,7 +55,7 @@
{{ row.productTypeName || '—' }}
</template>
</el-table-column>
<el-table-column label="代次" width="70" align="center">
<el-table-column label="代次" min-width="70" align="center">
<template #default="{ row }">
{{ row.passage || '—' }}
</template>
@@ -65,7 +65,7 @@
{{ row.storageSlotName || '—' }}
</template>
</el-table-column>
<el-table-column label="状态" width="90" align="center">
<el-table-column label="状态" min-width="90" align="center">
<template #default="{ row }">
<template v-if="row.inputType === 'cell_product'">
<el-tag :type="inputStatusTagType(row.productStatus)" size="small">
@@ -83,7 +83,7 @@
<template v-else>{{ row.remark || '—' }}</template>
</template>
</el-table-column>
<el-table-column v-if="!disabled" label="操作" width="80" fixed="right" align="center">
<el-table-column v-if="!disabled" label="操作" min-width="80" fixed="right" align="center">
<template #default="{ $index }">
<el-button type="danger" link size="small" @click="handleDelete($index)">
删除
@@ -129,7 +129,7 @@
>
<el-table-column
type="selection"
width="45"
min-width="45"
align="center"
:selectable="isRowSelectable"
/>
@@ -151,14 +151,14 @@
min-width="90"
show-overflow-tooltip
/>
<el-table-column label="代次" prop="passage" width="70" align="center" />
<el-table-column label="代次" prop="passage" min-width="70" align="center" />
<el-table-column
label="储物格位置"
prop="storageSlotName"
min-width="160"
show-overflow-tooltip
/>
<el-table-column label="状态" width="80" align="center">
<el-table-column label="状态" min-width="80" align="center">
<template #default="{ row }">
<el-tag :type="inputStatusTagType(row.productStatus)" size="small">
{{ inputStatusLabel(row.productStatus) }}
@@ -182,7 +182,7 @@
{{ row.expectedCellCount ?? '—' }}
</template>
</el-table-column>
<el-table-column label="活性" prop="viability" width="80" align="center">
<el-table-column label="活性" prop="viability" min-width="80" align="center">
<template #default="{ row }">
{{ row.viability != null ? row.viability : '—' }}
</template>
@@ -19,7 +19,7 @@
v-loading="loading"
empty-text="暂无产出产品"
>
<el-table-column type="index" label="序号" width="56" align="center" />
<el-table-column type="index" label="序号" min-width="56" align="center" />
<el-table-column label="产品编码" prop="productCode" min-width="140" show-overflow-tooltip />
<el-table-column label="产品名称" prop="productName" min-width="120" show-overflow-tooltip />
<el-table-column label="产品类型" min-width="100" show-overflow-tooltip>
@@ -32,7 +32,7 @@
{{ row.specName || '—' }}
</template>
</el-table-column>
<el-table-column label="代次" prop="passage" width="70" align="center" />
<el-table-column label="代次" prop="passage" min-width="70" align="center" />
<el-table-column label="批次号" prop="batchNo" min-width="110" show-overflow-tooltip />
<el-table-column label="储物格位置" min-width="160" show-overflow-tooltip>
<template #default="{ row }">
@@ -44,7 +44,7 @@
{{ row.expectedCellCount ?? '—' }}
</template>
</el-table-column>
<el-table-column label="活性" width="80" align="center">
<el-table-column label="活性" min-width="80" align="center">
<template #default="{ row }">
{{ row.viability != null ? row.viability : '—' }}
</template>
@@ -59,20 +59,20 @@
{{ formatDateOnly(row.expiryDate) }}
</template>
</el-table-column>
<el-table-column label="数量" width="80" align="center">
<el-table-column label="数量" min-width="80" align="center">
<template #default="{ row }">
{{ row.quantity ?? '—' }}
</template>
</el-table-column>
<el-table-column label="单位" prop="unit" width="70" align="center" />
<el-table-column label="状态" width="90" align="center">
<el-table-column label="单位" prop="unit" min-width="70" align="center" />
<el-table-column label="状态" min-width="90" align="center">
<template #default="{ row }">
<el-tag :type="statusTagType(row.productStatus)" size="small">
{{ statusLabel(row.productStatus) }}
</el-tag>
</template>
</el-table-column>
<el-table-column v-if="!disabled" label="操作" width="140" fixed="right" align="center">
<el-table-column v-if="!disabled" label="操作" min-width="140" fixed="right" align="center">
<template #default="{ row, $index }">
<el-button type="primary" link size="small" @click="handleEdit(row, $index)">
编辑
@@ -260,7 +260,7 @@
>
</div>
<el-table :data="productLines" size="small" class="product-lines-table">
<el-table-column type="index" label="序号" width="64" align="center" />
<el-table-column type="index" label="序号" min-width="64" align="center" />
<el-table-column label="产品编码" min-width="200">
<template #default="{ row }">
<el-input
@@ -56,14 +56,22 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
:index="(i) => (pagination.page - 1) * pagination.pageSize + i + 1"
/>
<el-table-column prop="workOrderNo" label="工单号" min-width="150" align="center" />
<el-table-column prop="protocolNo" label="协议号" min-width="140" align="center" />
<el-table-column prop="protocolStatus" label="协议状态" min-width="100" align="center">
<template #default="{ row }">
<el-tag
:type="protocolStatusTagTypeBySource(String(row.protocolStatus || ''), row.receptionSource || 'cell_storage')"
size="small"
>{{ protocolStatusLabelBySource(String(row.protocolStatus || ''), row.receptionSource || 'cell_storage') }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="sampleCode" label="样本编码" min-width="120" align="center" />
<el-table-column prop="receptionSource" label="来源类型" width="110" align="center">
<el-table-column prop="receptionSource" label="来源类型" min-width="110" align="center">
<template #default="{ row }">
<el-tag :type="sourceTag(row.receptionSource).type" size="small">
{{ row.receptionSourceLabel || sourceTag(row.receptionSource).label }}
@@ -79,7 +87,7 @@
<el-table-column prop="receptionTime" label="接收时间" min-width="170" align="center">
<template #default="{ row }">{{ row.receptionTime || '—' }}</template>
</el-table-column>
<el-table-column prop="workOrderStatus" label="工单状态" width="100" align="center">
<el-table-column prop="workOrderStatus" label="工单状态" min-width="100" align="center">
<template #default="{ row }">
<el-tag :type="woStatusTag(row.workOrderStatus).type" size="small">
{{ woStatusTag(row.workOrderStatus).label }}
@@ -89,7 +97,7 @@
<el-table-column prop="createTime" label="创建时间" min-width="170" align="center" />
<el-table-column
label="操作"
width="460"
min-width="460"
fixed="right"
align="center"
header-align="center"
@@ -190,7 +198,7 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
:index="(i) => i + 1"
/>
@@ -198,7 +206,7 @@
<el-table-column prop="routeName" label="工艺路线" min-width="140">
<template #default="{ row }">{{ row.routeName || '—' }}</template>
</el-table-column>
<el-table-column prop="taskStatus" label="任务状态" width="100" align="center">
<el-table-column prop="taskStatus" label="任务状态" min-width="100" align="center">
<template #default="{ row }">
<el-tag :type="taskStatusLabel(row.taskStatus).type" size="small">
{{ taskStatusLabel(row.taskStatus).label }}
@@ -208,8 +216,8 @@
<el-table-column prop="remark" label="备注" min-width="140">
<template #default="{ row }">{{ row.remark || '—' }}</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间" width="170" align="center" />
<el-table-column label="操作" width="250" align="center" fixed="right">
<el-table-column prop="createTime" label="创建时间" min-width="170" align="center" />
<el-table-column label="操作" min-width="250" align="center" fixed="right">
<template #default="{ row }">
<el-button link type="primary" size="small" @click="openEditTaskInfo(row)"
>编辑信息</el-button
@@ -258,6 +266,21 @@
acceptConclusionLabel,
transportTypeLabel
} from '@/utils/qc-labels'
import {
protocolStatusLabel,
protocolStatusTagType,
donationStatusLabel,
donationStatusTagType,
} from '@/utils/status-tag-registry'
import type { TagType } from '@/utils/status-tag-registry'
/** 根据来源类型返回协议状态标签 */
function protocolStatusLabelBySource(status: string, source: string): string {
return source === 'research_donation' ? donationStatusLabel(status) : protocolStatusLabel(status)
}
function protocolStatusTagTypeBySource(status: string, source: string): TagType {
return source === 'research_donation' ? donationStatusTagType(status) : protocolStatusTagType(status)
}
import ProtocolAttachmentReadonly from '@/views/cell-storage/protocol/ProtocolAttachmentReadonly.vue'
import SystemViewDialog from '@/components/business/system-view-dialog/index.vue'
import type { ViewSection } from '@/components/business/system-view-dialog/index.vue'
@@ -404,6 +427,11 @@
fields: [
{ label: '工单号', value: d.workOrderNo },
{ label: '协议号', value: d.protocolNo },
{
label: '协议状态',
value: protocolStatusLabelBySource(String(d.protocolStatus || ''), d.receptionSource || 'cell_storage'),
tagType: protocolStatusTagTypeBySource(String(d.protocolStatus || ''), d.receptionSource || 'cell_storage')
},
{ label: '样本编码', value: d.sampleCode },
{
label: '来源类型',
@@ -82,11 +82,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -259,7 +259,7 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (allLogPagination.page - 1) * allLogPagination.pageSize + index + 1"
@@ -667,7 +667,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(index) => index + 1"
@@ -689,11 +689,11 @@
<el-table-column
prop="unit"
label="单位"
width="80"
min-width="80"
align="center"
header-align="center"
/>
<el-table-column label="当前库存" width="100" align="center" header-align="center">
<el-table-column label="当前库存" min-width="100" align="center" header-align="center">
<template #default="{ row }">{{ row.stockQty }}</template>
</el-table-column>
<el-table-column label="入库数量" min-width="130" align="center" header-align="center">
@@ -713,7 +713,7 @@
<el-input v-model="row.remark" placeholder="可选" clearable class="inner-cell-input" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" header-align="center">
<el-table-column label="操作" min-width="80" align="center" header-align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="batchStockInLines.splice($index, 1)">
移除
@@ -840,7 +840,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(index) => index + 1"
@@ -862,11 +862,11 @@
<el-table-column
prop="unit"
label="单位"
width="80"
min-width="80"
align="center"
header-align="center"
/>
<el-table-column label="当前库存" width="100" align="center" header-align="center">
<el-table-column label="当前库存" min-width="100" align="center" header-align="center">
<template #default="{ row }">{{ row.stockQty }}</template>
</el-table-column>
<el-table-column label="出库数量" min-width="130" align="center" header-align="center">
@@ -887,7 +887,7 @@
<el-input v-model="row.remark" placeholder="可选" clearable class="inner-cell-input" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" header-align="center">
<el-table-column label="操作" min-width="80" align="center" header-align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="batchStockOutLines.splice($index, 1)">
移除
@@ -948,7 +948,7 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (stockLogPagination.page - 1) * stockLogPagination.pageSize + index + 1"
+2 -2
View File
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -51,12 +51,12 @@
@selection-change="(r: QcLabTestItem[]) => (selectedRows.value = r)"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column type="index" label="序号" width="68" align="center" :index="(i) => (pagination.page - 1) * pagination.pageSize + i + 1" />
<el-table-column type="selection" min-width="55" align="center" />
<el-table-column type="index" label="序号" min-width="68" align="center" :index="(i) => (pagination.page - 1) * pagination.pageSize + i + 1" />
<el-table-column prop="itemCode" label="项目编码" min-width="140" align="center" />
<el-table-column prop="itemName" label="项目名称" min-width="160" align="center" />
<el-table-column prop="description" label="描述" min-width="200" align="center" show-overflow-tooltip />
<el-table-column prop="status" label="状态" width="90" align="center">
<el-table-column prop="status" label="状态" min-width="90" align="center">
<template #default="{ row }">
<el-tag :type="row.status === '1' ? 'success' : 'info'" size="small">{{ row.status === '1' ? '启用' : '停用' }}</el-tag>
</template>
@@ -76,7 +76,7 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -66,11 +66,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -480,15 +480,15 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(index) => index + 1"
/>
<el-table-column prop="materialCode" label="物料编码" min-width="120" align="center" header-align="center" />
<el-table-column prop="materialName" label="物料名称" min-width="140" align="center" header-align="center" />
<el-table-column prop="unit" label="单位" width="80" align="center" header-align="center" />
<el-table-column label="当前库存" width="100" align="center" header-align="center">
<el-table-column prop="unit" label="单位" min-width="80" align="center" header-align="center" />
<el-table-column label="当前库存" min-width="100" align="center" header-align="center">
<template #default="{ row }">{{ row.stockQty }}</template>
</el-table-column>
<el-table-column label="入库数量" min-width="130" align="center" header-align="center">
@@ -508,7 +508,7 @@
<el-input v-model="row.remark" placeholder="可选" clearable class="inner-cell-input" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" header-align="center">
<el-table-column label="操作" min-width="80" align="center" header-align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="batchStockInLines.splice($index, 1)">
移除
@@ -644,15 +644,15 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(index) => index + 1"
/>
<el-table-column prop="materialCode" label="物料编码" min-width="120" align="center" header-align="center" />
<el-table-column prop="materialName" label="物料名称" min-width="140" align="center" header-align="center" />
<el-table-column prop="unit" label="单位" width="80" align="center" header-align="center" />
<el-table-column label="当前库存" width="100" align="center" header-align="center">
<el-table-column prop="unit" label="单位" min-width="80" align="center" header-align="center" />
<el-table-column label="当前库存" min-width="100" align="center" header-align="center">
<template #default="{ row }">{{ row.stockQty }}</template>
</el-table-column>
<el-table-column label="出库数量" min-width="130" align="center" header-align="center">
@@ -673,7 +673,7 @@
<el-input v-model="row.remark" placeholder="可选" clearable class="inner-cell-input" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" header-align="center">
<el-table-column label="操作" min-width="80" align="center" header-align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="batchStockOutLines.splice($index, 1)">
移除
@@ -53,15 +53,15 @@
<div class="list-body list-wrap">
<el-table class="list-table" :data="tableData" v-loading="loading" stripe @row-dblclick="handleView">
<el-table-column type="index" label="序号" width="68" align="center" :index="(i) => (pagination.page - 1) * pagination.pageSize + i + 1" />
<el-table-column type="index" label="序号" min-width="68" align="center" :index="(i) => (pagination.page - 1) * pagination.pageSize + i + 1" />
<el-table-column prop="taskNo" label="任务号" min-width="150" align="center" />
<el-table-column prop="qcBizTypeLabel" label="业务类型" width="100" align="center">
<el-table-column prop="qcBizTypeLabel" label="业务类型" min-width="100" align="center">
<template #default="{ row }">
<el-tag type="success" size="small">{{ row.qcBizTypeLabel || qcBizTypeLabel(row.qcBizType || '') }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="workOrderNo" label="工单号" min-width="140" align="center" />
<el-table-column prop="receptionSourceLabel" label="样本来源" width="100" align="center">
<el-table-column prop="receptionSourceLabel" label="样本来源" min-width="100" align="center">
<template #default="{ row }">
<el-tag :type="row.receptionSource === 'research_donation' ? 'warning' : 'success'" size="small">
{{ row.receptionSourceLabel || receptionSourceLabel(row.receptionSource || '') }}
@@ -80,7 +80,7 @@
<el-table-column prop="handlerName" label="接收经手人" min-width="110" align="center">
<template #default="{ row }">{{ row.handlerName || '—' }}</template>
</el-table-column>
<el-table-column prop="taskType" label="检测类型" width="110" align="center">
<el-table-column prop="taskType" label="检测类型" min-width="110" align="center">
<template #default="{ row }">
<el-tag :type="row.taskType === 'sysz' ? 'success' : 'info'" size="small">{{ taskTypeLabel(row.taskType) }}</el-tag>
</template>
@@ -89,7 +89,7 @@
<el-table-column prop="companyName" label="第三方公司" min-width="120" align="center">
<template #default="{ row }">{{ row.companyName || '—' }}</template>
</el-table-column>
<el-table-column prop="conclusion" label="质检结论" width="100" align="center">
<el-table-column prop="conclusion" label="质检结论" min-width="100" align="center">
<template #default="{ row }">
<el-tag
v-if="row.conclusion === 'tg'"
@@ -108,7 +108,7 @@
<el-tag v-else type="info" size="small">—</el-tag>
</template>
</el-table-column>
<el-table-column prop="taskStatus" label="状态" width="100" align="center">
<el-table-column prop="taskStatus" label="状态" min-width="100" align="center">
<template #default="{ row }">
<el-tag :type="row.taskStatus === 'ywc' ? 'success' : row.taskStatus === 'jxz' ? 'warning' : 'info'" size="small">
{{ taskStatusLabel(row.taskStatus) }}
@@ -199,7 +199,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(index) => index + 1"
@@ -239,7 +239,7 @@
/>
</template>
</el-table-column>
<el-table-column label="单位" width="72" align="center" header-align="center">
<el-table-column label="单位" min-width="72" align="center" header-align="center">
<template #default="{ row }">{{ row.unit || '—' }}</template>
</el-table-column>
<el-table-column label="备注" min-width="140" align="center" header-align="center">
@@ -247,7 +247,7 @@
<el-input v-model="row.remark" placeholder="选填" clearable class="inner-cell-input" />
</template>
</el-table-column>
<el-table-column label="操作" width="96" align="center" header-align="center" fixed="right">
<el-table-column label="操作" min-width="96" align="center" header-align="center" fixed="right">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="removeMaterialRow($index)">
删除
@@ -328,7 +328,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(index) => index + 1"
@@ -348,7 +348,7 @@
{{ row.qty != null && row.qty !== '' ? row.qty : '—' }}
</template>
</el-table-column>
<el-table-column label="单位" width="72" align="center" header-align="center">
<el-table-column label="单位" min-width="72" align="center" header-align="center">
<template #default="{ row }">{{ row.unit || '—' }}</template>
</el-table-column>
<el-table-column label="备注" min-width="140" align="center" header-align="center">
@@ -412,6 +412,21 @@
workOrderStatusLabel,
qcTaskConclusionLabel
} from '@/utils/qc-labels'
import {
protocolStatusLabel,
protocolStatusTagType,
donationStatusLabel,
donationStatusTagType,
} from '@/utils/status-tag-registry'
import type { TagType } from '@/utils/status-tag-registry'
/** 根据来源类型返回协议状态标签 */
function protocolStatusLabelBySource(status: string, source: string): string {
return source === 'research_donation' ? donationStatusLabel(status) : protocolStatusLabel(status)
}
function protocolStatusTagTypeBySource(status: string, source: string): TagType {
return source === 'research_donation' ? donationStatusTagType(status) : protocolStatusTagType(status)
}
import { downloadAttachmentFile } from '@/utils/download-attachment'
defineOptions({ name: 'QualityInspectionQcTask' })
@@ -735,6 +750,11 @@
title: '样本信息',
fields: [
{ label: '协议号', value: r.protocolNo || d.protocolNo || '—' },
{
label: '协议状态',
value: protocolStatusLabelBySource(String(d.protocolStatus || r.protocolStatus || ''), d.receptionSource || r.sourceType || 'cell_storage'),
tagType: protocolStatusTagTypeBySource(String(d.protocolStatus || r.protocolStatus || ''), d.receptionSource || r.sourceType || 'cell_storage')
},
{ label: '样本编码', value: r.sampleCode || d.sampleCode || '—' },
{
label: '样本来源',
@@ -37,11 +37,19 @@
<div class="list-body list-wrap">
<el-table class="list-table" :data="tableData" v-loading="loading" stripe @row-dblclick="handleView">
<el-table-column type="index" label="序号" width="68" align="center" :index="(i) => (pagination.page - 1) * pagination.pageSize + i + 1" />
<el-table-column type="index" label="序号" min-width="68" align="center" :index="(i) => (pagination.page - 1) * pagination.pageSize + i + 1" />
<el-table-column prop="workOrderNo" label="工单号" min-width="150" align="center" />
<el-table-column prop="protocolNo" label="协议号" min-width="140" align="center" />
<el-table-column prop="protocolStatus" label="协议状态" min-width="100" align="center">
<template #default="{ row }">
<el-tag
:type="protocolStatusTagTypeBySource(String(row.protocolStatus || ''), row.receptionSource || 'cell_storage')"
size="small"
>{{ protocolStatusLabelBySource(String(row.protocolStatus || ''), row.receptionSource || 'cell_storage') }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="sampleCode" label="样本编码" min-width="120" align="center" />
<el-table-column prop="receptionSourceLabel" label="来源类型" width="100" align="center">
<el-table-column prop="receptionSourceLabel" label="来源类型" min-width="100" align="center">
<template #default="{ row }">
<el-tag :type="row.receptionSource === 'research_donation' ? 'warning' : 'success'" size="small">
{{ row.receptionSourceLabel || receptionSourceLabel(row.receptionSource || '') }}
@@ -57,7 +65,7 @@
<el-table-column prop="handlerName" label="接收经手人" min-width="110" align="center">
<template #default="{ row }">{{ row.handlerName || '—' }}</template>
</el-table-column>
<el-table-column prop="workOrderStatus" label="状态" width="100" align="center">
<el-table-column prop="workOrderStatus" label="状态" min-width="100" align="center">
<template #default="{ row }">
<el-tag :type="row.workOrderStatus === 'ywc' ? 'success' : row.workOrderStatus === 'ypz' ? 'warning' : 'info'" size="small">
{{ workOrderStatusLabel(row.workOrderStatus) }}
@@ -198,6 +206,21 @@
taskStatusLabel,
qcTaskConclusionLabel
} from '@/utils/qc-labels'
import {
protocolStatusLabel,
protocolStatusTagType,
donationStatusLabel,
donationStatusTagType,
} from '@/utils/status-tag-registry'
import type { TagType } from '@/utils/status-tag-registry'
/** 根据来源类型返回协议状态标签 */
function protocolStatusLabelBySource(status: string, source: string): string {
return source === 'research_donation' ? donationStatusLabel(status) : protocolStatusLabel(status)
}
function protocolStatusTagTypeBySource(status: string, source: string): TagType {
return source === 'research_donation' ? donationStatusTagType(status) : protocolStatusTagType(status)
}
import ProtocolAttachmentReadonly from '@/views/cell-storage/protocol/ProtocolAttachmentReadonly.vue'
import SystemViewDialog from '@/components/business/system-view-dialog/index.vue'
import type { ViewField, ViewSection } from '@/components/business/system-view-dialog/index.vue'
@@ -457,6 +480,11 @@
fields: [
{ label: '工单号', value: d.workOrderNo },
{ label: '协议号', value: d.protocolNo },
{
label: '协议状态',
value: protocolStatusLabelBySource(String(d.protocolStatus || ''), d.receptionSource || 'cell_storage'),
tagType: protocolStatusTagTypeBySource(String(d.protocolStatus || ''), d.receptionSource || 'cell_storage')
},
{ label: '样本编码', value: d.sampleCode },
{
label: '来源类型',
@@ -67,19 +67,19 @@
row-key="id"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
/>
<el-table-column prop="itemCode" label="检查项编码" min-width="140" align="center" header-align="center" />
<el-table-column prop="itemName" label="检查项名称" min-width="160" align="center" header-align="center" />
<el-table-column prop="orderNum" label="排序" width="80" align="center" header-align="center" />
<el-table-column prop="status" label="状态" width="90" align="center" header-align="center">
<el-table-column prop="orderNum" label="排序" min-width="80" align="center" header-align="center" />
<el-table-column prop="status" label="状态" min-width="90" align="center" header-align="center">
<template #default="{ row }">
<el-tag :type="row.status === '1' ? 'success' : 'info'" size="small">{{ row.status === '1' ? '启用' : '停用' }}</el-tag>
</template>
@@ -96,7 +96,7 @@
<el-table-column
v-if="activeTab === 'pending'"
type="selection"
width="48"
min-width="48"
align="center"
header-align="center"
reserve-selection
@@ -104,13 +104,21 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
/>
<el-table-column prop="protocolNo" label="协议号" min-width="130" align="center" header-align="center" />
<el-table-column prop="sourceTypeLabel" label="来源类型" width="100" align="center" header-align="center">
<el-table-column prop="protocolStatus" label="协议状态" min-width="100" align="center" header-align="center">
<template #default="{ row }">
<el-tag
:type="protocolStatusTagTypeBySource(String(row.protocolStatus || ''), row.sourceType || 'cell_storage')"
size="small"
>{{ protocolStatusLabelBySource(String(row.protocolStatus || ''), row.sourceType || 'cell_storage') }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="sourceTypeLabel" label="来源类型" min-width="100" align="center" header-align="center">
<template #default="{ row }">
<el-tag :type="row.sourceType === 'research_donation' ? 'warning' : 'success'" size="small">
{{ row.sourceTypeLabel || '细胞存储' }}
@@ -132,7 +140,7 @@
<el-table-column prop="etaTime" label="预计到达时间" min-width="170" align="center" header-align="center">
<template #default="{ row }">{{ row.etaTime || '-' }}</template>
</el-table-column>
<el-table-column prop="transportType" label="运输方式" width="100" align="center" header-align="center">
<el-table-column prop="transportType" label="运输方式" min-width="100" align="center" header-align="center">
<template #default="{ row }">{{ transportTypeLabel(String(row.transportType || '')) }}</template>
</el-table-column>
<el-table-column prop="waybillNo" label="快递单号" min-width="140" align="center" header-align="center">
@@ -159,7 +167,7 @@
v-if="activeTab === 'received'"
prop="handlerName"
label="经手人"
width="100"
min-width="100"
align="center"
header-align="center"
>
@@ -169,7 +177,7 @@
v-if="activeTab === 'received'"
prop="acceptConclusion"
label="结论"
width="90"
min-width="90"
align="center"
header-align="center"
>
@@ -222,6 +230,7 @@
<h4 class="detail-section-title">样本信息</h4>
<div class="readonly-grid form-grid-3">
<div class="readonly-item"><span class="label">协议号</span>{{ currentRow.protocolNo || '-' }}</div>
<div class="readonly-item"><span class="label">协议状态</span><el-tag :type="protocolStatusTagTypeBySource(String(currentRow.protocolStatus || ''), currentRow.sourceType || 'cell_storage')" size="small">{{ protocolStatusLabelBySource(String(currentRow.protocolStatus || ''), currentRow.sourceType || 'cell_storage') }}</el-tag></div>
<div class="readonly-item"><span class="label">样本编码</span>{{ currentRow.sampleCode || '-' }}</div>
<div class="readonly-item"><span class="label">样本类型</span>{{ currentRow.sampleTypeName || '-' }}</div>
<div class="readonly-item"><span class="label">预计到达</span>{{ currentRow.etaTime || '-' }}</div>
@@ -353,6 +362,7 @@
<h4 class="detail-section-title">样本信息</h4>
<div class="readonly-grid form-grid-2">
<div class="readonly-item"><span class="label">协议号</span>{{ viewRow.protocolNo || '-' }}</div>
<div class="readonly-item"><span class="label">协议状态</span><el-tag :type="protocolStatusTagTypeBySource(String(viewRow.protocolStatus || ''), viewRow.sourceType || 'cell_storage')" size="small">{{ protocolStatusLabelBySource(String(viewRow.protocolStatus || ''), viewRow.sourceType || 'cell_storage') }}</el-tag></div>
<div class="readonly-item"><span class="label">样本编码</span>{{ viewRow.sampleCode || '-' }}</div>
<div class="readonly-item"><span class="label">样本类型</span>{{ viewRow.sampleTypeName || '-' }}</div>
<div class="readonly-item"><span class="label">预计到达</span>{{ viewRow.etaTime || '-' }}</div>
@@ -439,8 +449,8 @@
</h4>
<div class="readonly-grid form-grid-2 batch-receive-card__meta">
<div class="readonly-item"><span class="label">协议号</span>{{ entry.protocolNo || '—' }}</div>
<div class="readonly-item"><span class="label">协议状态</span><el-tag :type="protocolStatusTagTypeBySource(String(entry.protocolStatus || ''), entry.sourceType || 'cell_storage')" size="small">{{ protocolStatusLabelBySource(String(entry.protocolStatus || ''), entry.sourceType || 'cell_storage') }}</el-tag></div>
<div class="readonly-item"><span class="label">样本类型</span>{{ entry.sampleTypeName || '—' }}</div>
<div class="readonly-item"><span class="label">快递单号</span>{{ entry.waybillNo || '—' }}</div>
<div class="readonly-item form-col-span-2">
<span class="label">客户</span>{{ entry.motherName || '—' }} / {{ entry.newbornName || '—' }}
</div>
@@ -569,7 +579,23 @@
} from '@/components/business/protocol-finance-confirm-fields/finance-attachments'
import { useUserStore } from '@/store/modules/user'
import { downloadAttachmentFile } from '@/utils/download-attachment'
import { transportTypeLabel, acceptConclusionLabel } from '@/utils/status-tag-registry'
import {
transportTypeLabel,
acceptConclusionLabel,
protocolStatusLabel,
protocolStatusTagType,
donationStatusLabel,
donationStatusTagType,
} from '@/utils/status-tag-registry'
import type { TagType } from '@/utils/status-tag-registry'
/** 根据来源类型返回协议状态标签 */
function protocolStatusLabelBySource(status: string, source: string): string {
return source === 'research_donation' ? donationStatusLabel(status) : protocolStatusLabel(status)
}
function protocolStatusTagTypeBySource(status: string, source: string): TagType {
return source === 'research_donation' ? donationStatusTagType(status) : protocolStatusTagType(status)
}
defineOptions({ name: 'QualityInspectionSampleReception' })
@@ -4,14 +4,31 @@
<SystemViewDialog
v-model:visible="innerVisible"
title="入库放行审核详情"
width="960px"
:grid-columns="2"
width="1120px"
:grid-columns="4"
compact
:icon="CircleCheck"
:meta="detail?.review?.protocolNo || ''"
:sections="viewSections"
:loading="loading"
append-to-body
modal-class="storage-release-view-dialog-mask"
>
<template #reception-extra>
<div class="view-reception-attachments">
<div class="view-kv view-kv-span-2">
<dt>接收附件</dt>
<dd>
<ProtocolAttachmentReadonly
:files="viewReceptionAttachmentFiles"
@preview="handleReceptionAttachmentPreview"
@download="handleReceptionAttachmentDownload"
/>
</dd>
</div>
</div>
</template>
<template #qc-tasks>
<div v-if="detail?.qcInfo?.tasks?.length" class="view-section-slot">
<div class="qc-task-cards">
@@ -36,17 +53,9 @@
<div class="qc-kv">
<span class="qc-kv__label">任务状态</span>
<span class="qc-kv__value">
<el-tag
:type="
task.taskStatus === 'ywc'
? 'success'
: task.taskStatus === 'jxz'
? 'warning'
: 'info'
"
size="small"
>{{ task.taskStatusLabel || task.taskStatus || '—' }}</el-tag
>
<el-tag :type="taskStatusTagType(task.taskStatus)" size="small">{{
task.taskStatusLabel || taskStatusLabel(task.taskStatus || '') || '—'
}}</el-tag>
</span>
</div>
</div>
@@ -63,17 +72,9 @@
<div class="qc-task-card__header">
<span class="qc-task-card__name">{{ task.taskName || task.taskNo || '—' }}</span>
<span class="qc-task-card__conclusion">
<el-tag
:type="
task.taskStatus === 'ywc'
? 'success'
: task.taskStatus === 'jxz'
? 'warning'
: 'info'
"
size="small"
>{{ task.taskStatusLabel || task.taskStatus || '—' }}</el-tag
>
<el-tag :type="taskStatusTagType(task.taskStatus)" size="small">{{
task.taskStatusLabel || productionTaskStatusLabel(task.taskStatus || '') || '—'
}}</el-tag>
</span>
</div>
<div class="qc-task-card__body">
@@ -113,25 +114,31 @@
import SystemViewDialog from '@/components/business/system-view-dialog/index.vue'
import type { ViewSection } from '@/components/business/system-view-dialog/index.vue'
import ProtocolAttachmentReadonly from '@/views/cell-storage/protocol/ProtocolAttachmentReadonly.vue'
import type { QcWorkOrderReceptionDetail } from '@/api/qc-work-order'
import {
fetchStorageReleaseReviewDetail,
type StorageReleaseReview,
type StorageReleaseReviewDetail,
type ProtocolInfo,
type TransportInfo,
type ReceptionInfo,
type QcInfo,
type ProductionInfo
type ProtocolInfo
} from '@/api/storage-release-review'
import {
receptionSourceLabel,
receptionSourceTagType,
storageReleaseConclusionLabel,
storageReleaseConclusionTagType,
acceptConclusionLabel,
acceptConclusionTagType,
transportTypeLabel
protocolStatusLabel,
protocolStatusTagType,
donationStatusLabel,
donationStatusTagType
} from '@/utils/status-tag-registry'
import {
workOrderStatusLabel,
workOrderStatusTagType,
acceptConclusionLabel,
transportTypeLabel,
taskStatusLabel,
taskStatusTagType
} from '@/utils/qc-labels'
import { downloadAttachmentFile } from '@/utils/download-attachment'
const props = defineProps<{
@@ -153,6 +160,35 @@
const minioBaseUrl = (import.meta.env.VITE_MINIO_BASE_URL || '').replace(/\/$/, '')
const PRODUCTION_WO_STATUS_LABELS: Record<string, string> = {
dpz: '待配置',
jxz: '进行中',
ywc: '已完成'
}
const PRODUCTION_TASK_STATUS_LABELS: Record<string, string> = {
dpz: '待配置',
dzx: '待执行',
jxz: '执行中',
ywc: '已完成'
}
function productionWorkOrderStatusLabel(status?: string) {
const s = status || ''
return PRODUCTION_WO_STATUS_LABELS[s] || s || '—'
}
function productionWorkOrderStatusTagType(status?: string) {
if (status === 'ywc') return 'success' as const
if (status === 'jxz') return 'warning' as const
return 'info' as const
}
function productionTaskStatusLabel(status?: string) {
const s = status || ''
return PRODUCTION_TASK_STATUS_LABELS[s] || s || '—'
}
watch(
() => [props.visible, props.reviewId] as const,
async ([vis, id]) => {
@@ -172,11 +208,67 @@
{ immediate: true }
)
function formatVal(v: unknown) {
function formatMetric(v: unknown) {
if (v === null || v === undefined || v === '') return '—'
return String(v)
}
function formatCheckResults(
items?: Array<{ itemName?: string; checked?: boolean }>
) {
if (!items?.length) return '—'
return items.map((x) => `${x.itemName || ''}${x.checked ? '(✓)' : '(×)'}`).join('、')
}
function protocolStatusDisplay(proto: Partial<ProtocolInfo>, source: string) {
const status = proto.protocolStatus || ''
if (!status) return { value: '—', tagType: 'info' as const }
const isDonation = source === 'research_donation'
return {
value: isDonation ? donationStatusLabel(status) : protocolStatusLabel(status),
tagType: isDonation ? donationStatusTagType(status) : protocolStatusTagType(status)
}
}
const viewReception = computed(() => {
const d = detail.value
if (!d) return {} as QcWorkOrderReceptionDetail
if (d.reception) return d.reception
const ri = d.receptionInfo || {}
return {
receptionTime: ri.receptionTime,
handlerName: ri.handlerName,
receiveTemperature: ri.receiveTemperature,
volumeMl: ri.volumeMl,
netWeightG: ri.netWeightG,
acceptConclusion: ri.acceptConclusion,
transportType: d.transportInfo?.transportType,
waybillNo: d.transportInfo?.waybillNo,
carrierName: d.transportInfo?.carrierName,
carrierPhone: d.transportInfo?.carrierPhone,
etaTime: d.transportInfo?.etaTime
} as QcWorkOrderReceptionDetail
})
const viewReceptionAttachmentFiles = computed(() => {
const r = viewReception.value
if (!r) return []
if (Array.isArray(r.receiveAttachmentFiles) && r.receiveAttachmentFiles.length) {
return r.receiveAttachmentFiles as Array<Record<string, unknown>>
}
const urls = String(r.receiveAttachments || '')
if (!urls.trim()) return []
return urls
.split(',')
.map((u, i) => {
const url = u.trim()
if (!url) return null
const name = url.includes('/') ? url.split('/').pop() || `附件${i + 1}` : url
return { id: `url_${i}`, fileUrl: url, fileName: name }
})
.filter(Boolean) as Array<Record<string, unknown>>
})
const reviewAttachmentFiles = computed(() => {
const urls = detail.value?.review?.reviewAttachments || ''
if (!urls.trim()) return []
@@ -196,19 +288,48 @@
if (!d) return []
const rev: Partial<StorageReleaseReview> = d.review || {}
const proto: Partial<ProtocolInfo> = d.protocolInfo || {}
const transport: Partial<TransportInfo> = d.transportInfo || {}
const reception: Partial<ReceptionInfo> = d.receptionInfo || {}
const qc: Partial<QcInfo> = d.qcInfo || {}
const production: Partial<ProductionInfo> = d.productionInfo || {}
const r = viewReception.value
const qc = d.qcInfo || {}
const production = d.productionInfo || {}
const source = rev.receptionSource || 'cell_storage'
const protocolStatus = protocolStatusDisplay(proto, source)
const reviewConclusionValue = rev.reviewConclusion || ''
const reviewConclusionDisplay = reviewConclusionValue
? storageReleaseConclusionLabel(reviewConclusionValue)
: '待审核'
const reviewConclusionTagType = reviewConclusionValue
const reviewConclusionTag = reviewConclusionValue
? storageReleaseConclusionTagType(reviewConclusionValue)
: 'info'
const transportFields: ViewSection['fields'] = [
{
label: '运输方式',
value: transportTypeLabel(String(r.transportType || ''))
}
]
if (r.transportType === 'kdys') {
transportFields.push(
{ label: '快递公司', value: r.expressCompanyName || '—' },
{ label: '快递单号', value: r.waybillNo || '—' }
)
} else if (r.transportType === 'ryxd') {
transportFields.push(
{ label: '携带人', value: r.carrierName || '—' },
{ label: '携带人电话', value: r.carrierPhone || '—' }
)
}
if (r.etaTime) {
transportFields.push({ label: '预计到达', value: r.etaTime })
}
const transportSection =
transportFields.length > 1 || r.transportType
? [{ title: '运输信息', fields: transportFields }]
: []
const qcWoStatus = qc.workOrderStatus || ''
const prodWoStatus = production.workOrderStatus || ''
return [
{
title: '基础信息',
@@ -219,44 +340,41 @@
value: receptionSourceLabel(rev.receptionSource || ''),
tagType: receptionSourceTagType(rev.receptionSource || '')
},
{
label: '协议状态',
value: protocolStatus.value,
tagType: protocolStatus.tagType
},
{ label: '样本编码', value: proto.sampleCode || rev.sampleCode || '—' },
{ label: '样本名称', value: rev.sampleName || '—' },
{ label: '样本类型', value: proto.sampleTypeName || '—' },
{ label: '样本类型', value: proto.sampleTypeName || r.sampleTypeName || '—' },
{ label: '母亲姓名', value: proto.motherName || '—' },
{ label: '母亲电话', value: proto.motherPhone || '—' },
{ label: '新生儿姓名', value: proto.newbornName || '—' }
]
},
...transportSection,
{
title: '运输信息',
fields: transport.transportType
? [
{ label: '运输方式', value: transportTypeLabel(transport.transportType) },
...(transport.transportType === 'kdys'
? [{ label: '快递单号', value: transport.waybillNo || '—' }]
: [
{ label: '携带人', value: transport.carrierName || '—' },
{ label: '携带人电话', value: transport.carrierPhone || '—' }
]),
{ label: '预计到达', value: transport.etaTime || '—' }
]
: []
},
{
title: '接收信息',
fields: reception.receptionTime
? [
{ label: '接收时间', value: reception.receptionTime || '—' },
{ label: '接收经手人', value: reception.handlerName || '—' },
{
label: '接收结论',
value: acceptConclusionLabel(reception.acceptConclusion || ''),
tagType: acceptConclusionTagType(reception.acceptConclusion || '')
},
{ label: '接收温度(℃)', value: formatVal(reception.receiveTemperature) },
{ label: '体积(ml)', value: formatVal(reception.volumeMl) }
]
: []
title: '样本接收',
slot: 'reception-extra',
fields: [
{ label: '接收时间', value: r.receptionTime || '—' },
{ label: '接收经手人', value: r.handlerName || '—' },
{
label: '接收温度(℃)',
value: r.receiveTemperature ? `${r.receiveTemperature}℃` : '—'
},
{ label: '体积(ml)', value: formatMetric(r.volumeMl) },
{ label: '净重(g)', value: formatMetric(r.netWeightG) },
{
label: '结论',
value: r.acceptConclusionLabel || acceptConclusionLabel(String(r.acceptConclusion || '')),
tagType:
r.acceptConclusion === 'js' ? 'success' : r.acceptConclusion === 'jj' ? 'danger' : 'info'
},
{ label: '检查项', value: formatCheckResults(r.checkResults), span: true },
{ label: '备注', value: r.remark || '—', span: true }
]
},
{
title: '质检信息',
@@ -266,17 +384,11 @@
{
label: '工单状态',
value:
qc.workOrderStatus === 'ywc'
? '已完成'
: qc.workOrderStatus === 'ypz'
? '已配置'
: qc.workOrderStatus || '—',
tagType:
qc.workOrderStatus === 'ywc'
? 'success'
: qc.workOrderStatus === 'ypz'
? 'warning'
: 'info'
qc.workOrderStatusLabel ||
workOrderStatusLabel(qcWoStatus) ||
qcWoStatus ||
'—',
tagType: workOrderStatusTagType(qcWoStatus)
}
]
},
@@ -288,17 +400,11 @@
{
label: '工单状态',
value:
production.workOrderStatus === 'ywc'
? '已完成'
: production.workOrderStatus === 'jxz'
? '执行中'
: production.workOrderStatus || '—',
tagType:
production.workOrderStatus === 'ywc'
? 'success'
: production.workOrderStatus === 'jxz'
? 'warning'
: 'info'
production.workOrderStatusLabel ||
productionWorkOrderStatusLabel(prodWoStatus) ||
prodWoStatus ||
'—',
tagType: productionWorkOrderStatusTagType(prodWoStatus)
}
]
},
@@ -309,7 +415,7 @@
{
label: '审核结论',
value: reviewConclusionDisplay,
tagType: reviewConclusionTagType
tagType: reviewConclusionTag
},
{ label: '审核人', value: rev.reviewByName || '—' },
{ label: '审核时间', value: rev.reviewTime || '—' },
@@ -326,14 +432,22 @@
return minioBaseUrl ? `${minioBaseUrl}/${u.replace(/^\//, '')}` : u
}
function handleAttachmentPreview(file: Record<string, unknown>) {
function handleReceptionAttachmentPreview(file: Record<string, unknown>) {
const url = attachmentFullUrl(String(file.fileUrl || ''))
if (url) window.open(url, '_blank')
}
function handleAttachmentDownload(file: Record<string, unknown>) {
function handleReceptionAttachmentDownload(file: Record<string, unknown>) {
downloadAttachmentFile(file, { fullFileUrl: attachmentFullUrl })
}
function handleAttachmentPreview(file: Record<string, unknown>) {
handleReceptionAttachmentPreview(file)
}
function handleAttachmentDownload(file: Record<string, unknown>) {
handleReceptionAttachmentDownload(file)
}
</script>
<style scoped lang="scss">
@@ -400,4 +514,27 @@
color: #94a3b8;
font-weight: 400;
}
.view-reception-attachments {
margin-top: 4px;
.view-kv {
display: grid;
grid-template-columns: 96px 1fr;
gap: 8px 12px;
font-size: 13px;
align-items: start;
dt {
margin: 0;
color: #64748b;
font-weight: 500;
}
dd {
margin: 0;
color: #1e293b;
}
}
}
</style>
@@ -106,7 +106,7 @@
<div class="list-body list-wrap">
<el-table
class="list-table"
class="list-table storage-release-review-table"
:data="tableData"
v-loading="loading"
stripe
@@ -114,32 +114,86 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="50" align="center" header-align="center" />
<el-table-column type="selection" min-width="50" align="center" header-align="center" />
<el-table-column
prop="protocolNo"
label="协议编号"
width="160"
min-width="160"
align="center"
header-align="center"
/>
<el-table-column
prop="sampleCode"
label="样本编码"
width="140"
min-width="140"
align="center"
header-align="center"
/>
<el-table-column
prop="sampleName"
label="样本名称"
width="140"
min-width="140"
align="center"
header-align="center"
/>
<el-table-column
prop="sampleTypeName"
label="样本类型"
min-width="110"
align="center"
header-align="center"
>
<template #default="{ row }">{{ row.sampleTypeName || '—' }}</template>
</el-table-column>
<el-table-column
prop="handlerName"
label="接收人"
min-width="100"
align="center"
header-align="center"
>
<template #default="{ row }">{{ row.handlerName || '—' }}</template>
</el-table-column>
<el-table-column
prop="receptionTime"
label="接收时间"
min-width="170"
align="center"
header-align="center"
>
<template #default="{ row }">{{ row.receptionTime || '—' }}</template>
</el-table-column>
<el-table-column
prop="motherName"
label="母亲姓名"
min-width="100"
align="center"
header-align="center"
>
<template #default="{ row }">{{ row.motherName || '—' }}</template>
</el-table-column>
<el-table-column
prop="protocolStatus"
label="协议状态"
min-width="100"
align="center"
header-align="center"
>
<template #default="{ row }">
<el-tag
v-if="row.protocolStatus"
:type="protocolStatusTagForRow(row)"
size="small"
>
{{ protocolStatusLabelForRow(row) }}
</el-tag>
<span v-else>—</span>
</template>
</el-table-column>
<el-table-column
prop="receptionSource"
label="协议类别"
width="100"
min-width="100"
align="center"
header-align="center"
>
@@ -152,7 +206,7 @@
<el-table-column
prop="reviewConclusion"
label="审核结论"
width="100"
min-width="100"
align="center"
header-align="center"
>
@@ -170,7 +224,7 @@
<el-table-column
prop="storageStatus"
label="入库状态"
width="100"
min-width="100"
align="center"
header-align="center"
>
@@ -183,20 +237,20 @@
<el-table-column
prop="reviewByName"
label="审核人"
width="100"
min-width="100"
align="center"
header-align="center"
/>
<el-table-column
prop="reviewTime"
label="审核时间"
width="170"
min-width="170"
align="center"
header-align="center"
/>
<el-table-column
label="操作"
min-width="260"
min-width="220"
fixed="right"
align="center"
header-align="center"
@@ -259,12 +313,33 @@
storageReleaseConclusionLabel,
storageReleaseConclusionTagType,
storageStatusLabel,
storageStatusTagType
storageStatusTagType,
protocolStatusLabel,
protocolStatusTagType,
donationStatusLabel,
donationStatusTagType
} from '@/utils/status-tag-registry'
import { withFullscreenLoading, fullscreenLoadingText } from '@/utils/fullscreen-loading'
defineOptions({ name: 'QualityInspectionStorageReleaseReview' })
function protocolStatusLabelForRow(row: StorageReleaseReview) {
if (row.protocolStatusLabel) return row.protocolStatusLabel
const status = row.protocolStatus || ''
if (!status) return '—'
return row.receptionSource === 'research_donation'
? donationStatusLabel(status)
: protocolStatusLabel(status)
}
function protocolStatusTagForRow(row: StorageReleaseReview) {
const status = row.protocolStatus || ''
if (!status) return 'info'
return row.receptionSource === 'research_donation'
? donationStatusTagType(status)
: protocolStatusTagType(status)
}
const receptionSourceOptions = [
{ value: 'cell_storage', label: '细胞存储' },
{ value: 'research_donation', label: '科研捐赠' }
@@ -396,3 +471,14 @@
loadData()
})
</script>
<style scoped lang="scss">
/* Narrower op column than global 260px (fits 查看/审核/样本入库) */
.storage-release-review-table {
:deep(td.el-table__cell:has(.btn-op-item)),
:deep(td.el-table-fixed-column--right:has(.btn-op-item)),
:deep(th.el-table-fixed-column--right) {
min-width: 220px !important;
}
}
</style>
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column type="selection" min-width="55" align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
:index="(i) => (pagination.page - 1) * pagination.pageSize + i + 1"
/>
@@ -71,7 +71,7 @@
<el-table-column prop="companyName" label="公司名称" min-width="160" align="center" />
<el-table-column prop="contactName" label="联系人" min-width="100" align="center" />
<el-table-column prop="contactPhone" label="联系电话" min-width="120" align="center" />
<el-table-column prop="status" label="状态" width="90" align="center">
<el-table-column prop="status" label="状态" min-width="90" align="center">
<template #default="{ row }">
<el-tag :type="row.status === '1' ? 'success' : 'info'" size="small">{{ row.status === '1' ? '启用' : '停用' }}</el-tag>
</template>
@@ -199,14 +199,14 @@
max-height="460"
@selection-change="onItemSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column type="index" label="序号" width="68" align="center" />
<el-table-column type="selection" min-width="55" align="center" />
<el-table-column type="index" label="序号" min-width="68" align="center" />
<el-table-column prop="itemCode" label="项目编码" min-width="120" align="center" />
<el-table-column prop="itemName" label="项目名称" min-width="160" align="center" />
<el-table-column prop="feeAmount" label="费用(元)" width="110" align="center">
<el-table-column prop="feeAmount" label="费用(元)" min-width="110" align="center">
<template #default="{ row }">{{ row.feeAmount != null ? `¥${row.feeAmount}` : '—' }}</template>
</el-table-column>
<el-table-column prop="status" label="状态" width="90" align="center">
<el-table-column prop="status" label="状态" min-width="90" align="center">
<template #default="{ row }">
<el-tag :type="row.status === '1' ? 'success' : 'info'" size="small">{{ row.status === '1' ? '启用' : '停用' }}</el-tag>
</template>
@@ -291,7 +291,7 @@
<el-table-column
type="index"
label="序号"
width="56"
min-width="56"
align="center"
header-align="center"
:index="(i) => i + 1"
@@ -328,7 +328,7 @@
</el-select>
</template>
</el-table-column>
<el-table-column label="类型" width="110" align="center" header-align="center">
<el-table-column label="类型" min-width="110" align="center" header-align="center">
<template #default="{ row }">
<el-select v-model="row.paramType" class="inner-cell-select">
<el-option label="文本" value="text" />
@@ -336,12 +336,12 @@
</el-select>
</template>
</el-table-column>
<el-table-column label="必填" width="72" align="center" header-align="center">
<el-table-column label="必填" min-width="72" align="center" header-align="center">
<template #default="{ row }">
<el-switch v-model="row.requiredFlag" active-value="1" inactive-value="0" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" header-align="center">
<el-table-column label="操作" min-width="80" align="center" header-align="center">
<template #default="{ $index }">
<el-button link type="danger" size="small" @click="removeItemParam($index)">删除</el-button>
</template>
@@ -105,11 +105,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -124,7 +124,7 @@
<el-table-column
prop="donationStatus"
label="状态"
width="100"
min-width="100"
align="center"
header-align="center"
>
@@ -137,7 +137,7 @@
<el-table-column
prop="donationDate"
label="捐赠日期"
width="120"
min-width="120"
align="center"
header-align="center"
/>
@@ -172,7 +172,7 @@
<el-table-column
prop="newbornSex"
label="新生儿性别"
width="110"
min-width="110"
align="center"
header-align="center"
>
@@ -183,7 +183,7 @@
<el-table-column
prop="deliveryMode"
label="分娩方式"
width="100"
min-width="100"
align="center"
header-align="center"
>
@@ -194,7 +194,7 @@
<el-table-column
prop="newbornWeightGram"
label="新生儿体重(克)"
width="140"
min-width="140"
align="center"
header-align="center"
/>
@@ -496,7 +496,7 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
/>
@@ -510,7 +510,7 @@
<el-table-column
prop="auditStatus"
label="审核状态"
width="120"
min-width="120"
align="center"
header-align="center"
>
@@ -73,11 +73,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -92,7 +92,7 @@
<el-table-column
prop="donationStatus"
label="状态"
width="100"
min-width="100"
align="center"
header-align="center"
>
@@ -105,7 +105,7 @@
<el-table-column
prop="donationDate"
label="捐赠日期"
width="120"
min-width="120"
align="center"
header-align="center"
/>
@@ -140,7 +140,7 @@
<el-table-column
prop="newbornSex"
label="新生儿性别"
width="110"
min-width="110"
align="center"
header-align="center"
>
@@ -151,7 +151,7 @@
<el-table-column
prop="deliveryMode"
label="分娩方式"
width="100"
min-width="100"
align="center"
header-align="center"
>
@@ -162,7 +162,7 @@
<el-table-column
prop="newbornWeightGram"
label="新生儿体重(克)"
width="140"
min-width="140"
align="center"
header-align="center"
/>
@@ -210,7 +210,7 @@
/>
<el-table-column
label="操作"
width="320"
min-width="320"
fixed="right"
align="center"
header-align="center"
+10 -10
View File
@@ -91,11 +91,11 @@
@selection-change="handleCategoryTableSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="index => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -115,7 +115,7 @@
</div>
</template>
</el-table-column>
<el-table-column label="图片" width="80" align="center" header-align="center">
<el-table-column label="图片" min-width="80" align="center" header-align="center">
<template #default="{ row }">
<el-image
v-if="row.imageUrl"
@@ -126,25 +126,25 @@
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column prop="parameterCount" label="参数数量" width="100" align="center">
<el-table-column prop="parameterCount" label="参数数量" min-width="100" align="center">
<template #default="{ row }">
<el-tag v-if="row.parameterCount > 0" type="primary" size="small">{{ row.parameterCount }}</el-tag>
<span v-else class="text-gray">-</span>
</template>
</el-table-column>
<el-table-column label="价格系数" width="110" align="center">
<el-table-column label="价格系数" min-width="110" align="center">
<template #default="{ row }">
<span>{{ formatPriceCoefficient(row.priceCoefficient) }}</span>
</template>
</el-table-column>
<el-table-column prop="isActive" label="状态" width="80" align="center" header-align="center">
<el-table-column prop="isActive" label="状态" min-width="80" align="center" header-align="center">
<template #default="{ row }">
<el-tag :type="row.isActive ? 'success' : 'info'" size="small">
{{ row.isActive ? '启用' : '禁用' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="createAt" label="创建时间" width="180" align="center" header-align="center" />
<el-table-column prop="createAt" label="创建时间" min-width="180" align="center" header-align="center" />
<el-table-column label="操作" min-width="400" fixed="right" align="center" header-align="center">
<template #default="{ row }">
<el-button class="btn-op-item" @click="handleView(row)"><el-icon><View /></el-icon>查看</el-button>
@@ -377,11 +377,11 @@
@selection-change="handleSelectionChange"
@row-click="handleRowClick"
>
<el-table-column type="selection" width="50" fixed />
<el-table-column type="selection" min-width="50" fixed />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
fixed
@@ -389,7 +389,7 @@
/>
<el-table-column prop="name" label="参数名称" min-width="120" />
<el-table-column prop="code" label="参数编码" min-width="100" />
<el-table-column label="参数类型" width="90" align="center">
<el-table-column label="参数类型" min-width="90" align="center">
<template #default="{ row }">
<el-tag v-if="row.paramType === 'text'" type="info">文本</el-tag>
<el-tag v-else-if="row.paramType === 'select'" type="primary">下拉</el-tag>
+6 -6
View File
@@ -57,7 +57,7 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
prop="deptName"
label="组织名称"
@@ -68,7 +68,7 @@
<el-table-column
prop="deptCategoryCode"
label="组织类别"
width="120"
min-width="120"
align="center"
header-align="center"
>
@@ -79,7 +79,7 @@
<el-table-column
prop="status"
label="状态"
width="80"
min-width="80"
align="center"
header-align="center"
>
@@ -92,20 +92,20 @@
<el-table-column
prop="leader"
label="负责人"
width="160"
min-width="160"
align="center"
header-align="center"
/>
<el-table-column
prop="leaderPhone"
label="联系电话"
width="180"
min-width="180"
align="center"
header-align="center"
/>
<el-table-column
label="操作"
width="400"
min-width="400"
fixed="right"
align="center"
header-align="center"
+6 -6
View File
@@ -64,14 +64,14 @@
>
<el-table-column
type="selection"
width="55"
min-width="55"
align="center"
header-align="center"
/>
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -106,7 +106,7 @@
/>
<el-table-column
label="操作"
width="400"
min-width="400"
fixed="right"
align="center"
header-align="center"
@@ -224,7 +224,7 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
/>
@@ -288,7 +288,7 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="
@@ -320,7 +320,7 @@
/>
<el-table-column
label="操作"
width="260"
min-width="260"
fixed="right"
align="center"
header-align="center"
+2 -2
View File
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
+7 -7
View File
@@ -54,18 +54,18 @@
v-loading="loading"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column prop="leaveTypeLabel" label="请假类型" width="100" align="center" header-align="center" />
<el-table-column prop="startDate" label="开始日期" width="120" align="center" header-align="center" />
<el-table-column prop="endDate" label="结束日期" width="120" align="center" header-align="center" />
<el-table-column prop="days" label="天数" width="80" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column prop="leaveTypeLabel" label="请假类型" min-width="100" align="center" header-align="center" />
<el-table-column prop="startDate" label="开始日期" min-width="120" align="center" header-align="center" />
<el-table-column prop="endDate" label="结束日期" min-width="120" align="center" header-align="center" />
<el-table-column prop="days" label="天数" min-width="80" align="center" header-align="center" />
<el-table-column prop="reason" label="请假原因" min-width="180" show-overflow-tooltip />
<el-table-column prop="status" label="状态" width="100" align="center" header-align="center">
<el-table-column prop="status" label="状态" min-width="100" align="center" header-align="center">
<template #default="{ row }">
<el-tag :type="statusTagType(row.status)" size="small">{{ statusLabel(row.status) }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间" width="180" align="center" header-align="center" />
<el-table-column prop="createTime" label="创建时间" min-width="180" align="center" header-align="center" />
<el-table-column label="操作" fixed="right" min-width="260" align="center" header-align="center">
<template #default="{ row }">
<template v-if="row.status === 'draft' || row.status === 'rejected'">
+5 -5
View File
@@ -58,7 +58,7 @@
>
<el-table-column
type="selection"
width="55"
min-width="55"
align="center"
header-align="center"
/>
@@ -72,7 +72,7 @@
<el-table-column
prop="menuType"
label="类型"
width="90"
min-width="90"
align="center"
header-align="center"
>
@@ -121,7 +121,7 @@
<el-table-column
prop="visible"
label="可见"
width="80"
min-width="80"
align="center"
header-align="center"
>
@@ -134,7 +134,7 @@
<el-table-column
prop="status"
label="状态"
width="80"
min-width="80"
align="center"
header-align="center"
>
@@ -146,7 +146,7 @@
</el-table-column>
<el-table-column
label="操作"
width="400"
min-width="400"
fixed="right"
align="center"
header-align="center"
+13 -13
View File
@@ -115,12 +115,12 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="index => (pagination.page - 1) * pagination.pageSize + index + 1"
/>
<el-table-column type="expand" width="48">
<el-table-column type="expand" min-width="48">
<template #default="{ row }">
<div class="order-row-expand-wrap" v-loading="!!expandedRowLoadingMap[row.id]">
<div
@@ -134,7 +134,7 @@
class="order-row-expand-table sqxp-subtable"
@row-dblclick="openOrderProductView"
>
<el-table-column type="index" label="序号" width="68" align="center" header-align="center" :index="index => index + 1" />
<el-table-column type="index" label="序号" min-width="68" align="center" header-align="center" :index="index => index + 1" />
<el-table-column prop="productName" label="商品" min-width="220">
<template #default="{ row: line }">
<div class="expand-product-cell">
@@ -147,11 +147,11 @@
</template>
</el-table-column>
<el-table-column prop="supplierName" label="供货商" min-width="120" />
<el-table-column label="计量" width="88" align="center">
<el-table-column label="计量" min-width="88" align="center">
<template #default="{ row: line }">{{ formatMeasureCell(line.measureValue) }}</template>
</el-table-column>
<el-table-column prop="unitName" label="单位" width="70" align="center" />
<el-table-column prop="quantity" label="数量" width="80" align="right" />
<el-table-column prop="unitName" label="单位" min-width="70" align="center" />
<el-table-column prop="quantity" label="数量" min-width="80" align="right" />
<el-table-column label="供货价" min-width="110" align="right">
<template #default="{ row: line }">¥{{ formatAmount(line.supplierUnitPrice) }}</template>
</el-table-column>
@@ -429,7 +429,7 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="index => index + 1"
@@ -477,7 +477,7 @@
</template>
</el-table-column>
<el-table-column prop="supplierName" label="供货商" min-width="130" align="center" />
<el-table-column label="计量" width="100" align="center">
<el-table-column label="计量" min-width="100" align="center">
<template #default="{ row }">{{ formatMeasureCell(row.measureValue) }}</template>
</el-table-column>
<el-table-column prop="unitName" label="单位" min-width="80" align="center" />
@@ -964,7 +964,7 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="index => index + 1"
@@ -1012,7 +1012,7 @@
</template>
</el-table-column>
<el-table-column prop="supplierName" label="供货商" min-width="130" align="center" />
<el-table-column label="计量" width="100" align="center">
<el-table-column label="计量" min-width="100" align="center">
<template #default="{ row }">{{ formatMeasureCell(row.measureValue) }}</template>
</el-table-column>
<el-table-column prop="unitName" label="单位" min-width="80" align="center" />
@@ -1290,7 +1290,7 @@
v-loading="adjustItemsLoading"
@row-dblclick="openOrderProductView"
>
<el-table-column type="index" label="序号" width="68" align="center" header-align="center" :index="index => index + 1" />
<el-table-column type="index" label="序号" min-width="68" align="center" header-align="center" :index="index => index + 1" />
<el-table-column
prop="productName"
label="商品名称"
@@ -1429,7 +1429,7 @@
header-align="center"
@row-dblclick="openOrderProductView"
>
<el-table-column type="index" label="序号" width="68" align="center" header-align="center" :index="index => index + 1" />
<el-table-column type="index" label="序号" min-width="68" align="center" header-align="center" :index="index => index + 1" />
<el-table-column prop="productName" label="商品名称" min-width="200" align="center">
<template #default="{ row }">
<div class="order-pv-name-cell">
@@ -1464,7 +1464,7 @@
<el-table-column label="供货商" min-width="120" align="center">
<template #default>{{ orderPriceVersionDetail?.supplierName || '-' }}</template>
</el-table-column>
<el-table-column label="计量" width="88" align="center">
<el-table-column label="计量" min-width="88" align="center">
<template #default="{ row }">{{ formatMeasureCell(row.measureValue) }}</template>
</el-table-column>
<el-table-column prop="unitName" label="单位" min-width="72" align="center" />
+2 -2
View File
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
+6 -5
View File
@@ -85,12 +85,13 @@
stripe
row-key="id"
@selection-change="handleProductTableSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="index => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -716,11 +717,11 @@
@selection-change="handleSelectionChange"
@row-click="handleRowClick"
>
<el-table-column type="selection" width="50" fixed />
<el-table-column type="selection" min-width="50" fixed />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
fixed
@@ -728,7 +729,7 @@
/>
<el-table-column prop="name" label="参数名称" min-width="120" />
<el-table-column prop="code" label="参数编码" min-width="100" />
<el-table-column label="参数类型" width="90" align="center">
<el-table-column label="参数类型" min-width="90" align="center">
<template #default="{ row }">
<el-tag v-if="row.paramType === 'text'" type="info">文本</el-tag>
<el-tag v-else-if="row.paramType === 'select'" type="primary">下拉</el-tag>
+4 -4
View File
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index: number) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -89,7 +89,7 @@
<el-table-column
prop="status"
label="状态"
width="100"
min-width="100"
align="center"
header-align="center"
>
@@ -108,7 +108,7 @@
/>
<el-table-column
label="操作"
width="480"
min-width="480"
fixed="right"
align="center"
header-align="center"
+2 -2
View File
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
+3 -3
View File
@@ -65,7 +65,7 @@
>
<el-table-column
type="selection"
width="55"
min-width="55"
align="center"
header-align="center"
:selectable="rowSelectable"
@@ -73,7 +73,7 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -127,7 +127,7 @@
/>
<el-table-column
label="操作"
width="320"
min-width="320"
fixed="right"
align="center"
header-align="center"
+2 -2
View File
@@ -59,11 +59,11 @@
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
+1 -1
View File
@@ -171,7 +171,7 @@
<span class="card-title">最近登录记录</span>
</div>
<el-table :data="loginLogs" stripe max-height="300">
<el-table-column type="index" label="序号" width="68" align="center" header-align="center" :index="index => index + 1" />
<el-table-column type="index" label="序号" min-width="68" align="center" header-align="center" :index="index => index + 1" />
<el-table-column prop="loginTime" label="登录时间" min-width="180" />
<el-table-column prop="ipAddress" label="IP地址" min-width="150" />
<el-table-column prop="loginLocation" label="登录地点" min-width="150" />
+2 -2
View File
@@ -81,7 +81,7 @@
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index: number) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -98,7 +98,7 @@
{{ row.phoneNo || '-' }}
</template>
</el-table-column>
<el-table-column prop="status" label="状态" width="80" align="center" header-align="center">
<el-table-column prop="status" label="状态" min-width="80" align="center" header-align="center">
<template #default="{ row }">
<el-tag :type="row.status === '1' ? 'success' : 'info'" size="small">
{{ row.status === '1' ? '正常' : '停用' }}
@@ -47,11 +47,12 @@
v-loading="loading"
stripe
row-key="id"
@row-dblclick="handleViewDetail"
>
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -67,7 +68,7 @@
<el-table-column
prop="businessTypeLabel"
label="业务类型"
width="120"
min-width="120"
align="center"
header-align="center"
/>
@@ -82,7 +83,7 @@
<el-table-column
prop="status"
label="状态"
width="100"
min-width="100"
align="center"
header-align="center"
>
@@ -64,11 +64,11 @@
row-key="id"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" header-align="center" />
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -76,7 +76,7 @@
<el-table-column
prop="processCode"
label="流程编码"
width="150"
min-width="150"
align="center"
header-align="center"
/>
@@ -87,7 +87,7 @@
align="center"
header-align="center"
/>
<el-table-column label="状态" width="100" align="center" header-align="center">
<el-table-column label="状态" min-width="100" align="center" header-align="center">
<template #default="{ row }">
<el-switch
:model-value="row.status"
@@ -97,7 +97,7 @@
/>
</template>
</el-table-column>
<el-table-column label="最新版本" width="100" align="center" header-align="center">
<el-table-column label="最新版本" min-width="100" align="center" header-align="center">
<template #default="{ row }">
{{ row.latestVersion != null ? `V${row.latestVersion}` : '--' }}
</template>
@@ -105,7 +105,7 @@
<el-table-column
prop="createTime"
label="创建时间"
width="160"
min-width="160"
align="center"
header-align="center"
/>
@@ -40,11 +40,12 @@
v-loading="loading"
stripe
row-key="id"
@row-dblclick="handleViewDetail"
>
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -59,7 +60,7 @@
<el-table-column
prop="businessTypeLabel"
label="业务类型"
width="120"
min-width="120"
align="center"
header-align="center"
/>
@@ -74,11 +75,11 @@
<el-table-column
prop="starterUserName"
label="发起人"
width="100"
min-width="100"
align="center"
header-align="center"
/>
<el-table-column label="审批结果" width="100" align="center" header-align="center">
<el-table-column label="审批结果" min-width="100" align="center" header-align="center">
<template #default="{ row }">
<ProcessStatusTag :status="row.status || ''" />
</template>
@@ -40,11 +40,12 @@
v-loading="loading"
stripe
row-key="id"
@row-dblclick="handleViewDetail"
>
<el-table-column
type="index"
label="序号"
width="68"
min-width="68"
align="center"
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
@@ -52,7 +53,7 @@
<el-table-column
prop="processName"
label="流程名称"
width="160"
min-width="160"
align="center"
header-align="center"
show-overflow-tooltip
@@ -60,7 +61,7 @@
<el-table-column
prop="businessTypeLabel"
label="业务类型"
width="120"
min-width="120"
align="center"
header-align="center"
/>
@@ -75,14 +76,14 @@
<el-table-column
prop="starterUserName"
label="发起人"
width="100"
min-width="100"
align="center"
header-align="center"
/>
<el-table-column
prop="createTime"
label="到达时间"
width="180"
min-width="180"
align="center"
header-align="center"
/>