feat: switch protocol view cert/insurance handle panels to sample level.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-10-13 11:04:25 +08:00
1 parent 8cebb8e0b8
commit efbf8f6ac9
6 files changed
+353 -14

No files matched your search

@@ -1,5 +1,6 @@
<template>
<div class="protocol-handle-panel">
<p v-if="sampleCode" class="handle-sample-hint">当前样本:{{ sampleCode }}</p>
<el-form label-position="top" class="biz-dialog-form" @submit.prevent>
<div class="form-grid-2">
<el-form-item label="办理时间" required>
@@ -31,6 +32,26 @@
/>
</el-select>
</el-form-item>
<el-form-item v-if="mode === 'storage-cert'" label="邮寄储存证时间">
<el-date-picker
v-model="form.mailCertTime"
type="datetime"
placeholder="可选"
value-format="YYYY-MM-DD HH:mm:ss"
style="width: 100%"
clearable
/>
</el-form-item>
<el-form-item v-if="mode === 'insurance'" label="保单发送时间">
<el-date-picker
v-model="form.policySendTime"
type="datetime"
placeholder="可选"
value-format="YYYY-MM-DD HH:mm:ss"
style="width: 100%"
clearable
/>
</el-form-item>
<el-form-item :label="attachmentLabel" class="form-col-span-2">
<div class="attachment-upload">
<div class="attachment-list">
@@ -78,7 +99,11 @@
import { fetchUserList } from '@/api/admin'
import { fetchUploadAttachment } from '@/api/business'
import {
fetchSampleInsurance,
fetchSampleStorageCert,
fetchUpdateFullmoonHandle,
fetchUpdateSampleInsurance,
fetchUpdateSampleStorageCert,
fetchUpdateStorageCertHandle
} from '@/api/sample-info-handle'
import { useUserStore } from '@/store/modules/user'
@@ -88,6 +113,8 @@
const props = defineProps<{
mode: 'storage-cert' | 'insurance'
protocolId: string
/** 有值时按样本级读写(客户服务管理入口) */
sampleCode?: string
initial?: Record<string, unknown> | null
}>()
@@ -101,13 +128,17 @@
const form = reactive({
handleTime: '' as string,
handlerUserId: '' as string,
remark: ''
remark: '',
mailCertTime: '',
policySendTime: ''
})
const attachmentLabel = computed(() =>
props.mode === 'storage-cert' ? '储存证附件' : '保险附件'
)
const useSampleLevel = computed(() => Boolean((props.sampleCode || '').trim()))
function urlsToFiles(raw: string) {
return String(raw || '')
.split(',')
@@ -120,32 +151,55 @@
}))
}
function applyInitial() {
const init = props.initial || {}
function applyInitial(init: Record<string, unknown>) {
form.handleTime = String(init.handleTime || '')
form.handlerUserId = String(init.handlerUserId || '')
form.remark = String(
props.mode === 'storage-cert' ? init.remark || '' : init.handleRemark || ''
props.mode === 'storage-cert' ? init.remark || '' : init.handleRemark || init.remark || ''
)
form.mailCertTime = String(init.mailCertTime || '')
form.policySendTime = String(init.policySendTime || '')
const urlField = props.mode === 'storage-cert' ? 'certImageUrls' : 'insuranceAttachments'
files.value = urlsToFiles(String(init[urlField] || ''))
const uid = form.handlerUserId || String(userStore.info?.userId || '')
const uid = form.handlerUserId || String((userStore.getUserInfo as any)?.id || '')
if (!form.handlerUserId && !form.handleTime) {
form.handlerUserId = uid
}
if (form.handlerUserId) {
const name = String(init.handlerUserName || userStore.info?.userName || '')
const name = String(
init.handlerUserName ||
(userStore.getUserInfo as any)?.realName ||
(userStore.getUserInfo as any)?.userName ||
''
)
if (name) {
userOptions.value = [
{ id: form.handlerUserId, nickName: name, userName: name }
]
userOptions.value = [{ id: form.handlerUserId, nickName: name, userName: name }]
}
}
}
async function loadSampleInitial() {
const code = (props.sampleCode || '').trim()
if (!code) {
applyInitial(props.initial || {})
return
}
try {
const res =
props.mode === 'storage-cert'
? ((await fetchSampleStorageCert(code)) as Record<string, unknown>)
: ((await fetchSampleInsurance(code)) as Record<string, unknown>)
applyInitial(res || {})
} catch {
applyInitial(props.initial || {})
}
}
watch(
() => [props.protocolId, props.initial],
() => applyInitial(),
() => [props.protocolId, props.sampleCode, props.initial, props.mode],
() => {
void loadSampleInitial()
},
{ immediate: true, deep: true }
)
@@ -182,11 +236,33 @@
ElMessage.warning('填写办理时间时必须指定办理人员')
return
}
if (!props.protocolId) return
const code = (props.sampleCode || '').trim()
if (useSampleLevel.value && !code) return
if (!useSampleLevel.value && !props.protocolId) return
saving.value = true
try {
const urls = files.value.map((f) => f.fileUrl).filter(Boolean).join(',')
if (props.mode === 'storage-cert') {
if (useSampleLevel.value) {
if (props.mode === 'storage-cert') {
await fetchUpdateSampleStorageCert(code, {
handleTime: form.handleTime || null,
handlerUserId: form.handleTime ? form.handlerUserId : null,
certImageUrls: urls,
remark: form.remark,
mailCertTime: form.mailCertTime || null,
collectionProtocolId: props.protocolId
})
} else {
await fetchUpdateSampleInsurance(code, {
handleTime: form.handleTime || null,
handlerUserId: form.handleTime ? form.handlerUserId : null,
insuranceAttachments: urls,
handleRemark: form.remark,
policySendTime: form.policySendTime || null,
collectionProtocolId: props.protocolId
})
}
} else if (props.mode === 'storage-cert') {
await fetchUpdateStorageCertHandle(props.protocolId, {
handleTime: form.handleTime || null,
handlerUserId: form.handleTime ? form.handlerUserId : null,
@@ -210,6 +286,12 @@
</script>
<style scoped lang="scss">
.handle-sample-hint {
margin: 0 0 10px;
font-size: 13px;
color: var(--mint-text-muted, #64748b);
}
.handle-actions {
margin-top: 8px;
}