fix: 协议子资源单事务保存,并补齐样本编码/OA/质检等近期能力

锁定缴费校验失败时整单回滚,避免样本半成功落库;前端禁止删除锁定缴费样本,改码走更正编码。同步落地样本更正、采集微信通知、OA提及未读、细胞产品套餐与相关迁移文档。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-10-26 11:02:25 +08:00
1 parent 19bc66ba45
commit 5dad1bb0e3
142 files changed
+95584 -65717

No files matched your search

+27
View File
@@ -1675,6 +1675,33 @@ export function fetchDeleteCellProductSpec(id: string) {
return request.del({ url: `/web/admin/cell-product-specs/${id}` })
}
// ---------------------------------------------------------------------------
// 中试服务管理 — 细胞产品包装
// ---------------------------------------------------------------------------
export function fetchCellProductPackageList(params?: {
page?: number
pageSize?: number
keyword?: string
}) {
return request.get({
url: '/web/admin/cell-product-packages',
params
})
}
export function fetchCreateCellProductPackage(data: Record<string, any>) {
return request.post({ url: '/web/admin/cell-product-packages', params: data })
}
export function fetchUpdateCellProductPackage(id: string, data: Record<string, any>) {
return request.put({ url: `/web/admin/cell-product-packages/${id}`, params: data })
}
export function fetchDeleteCellProductPackage(id: string) {
return request.del({ url: `/web/admin/cell-product-packages/${id}` })
}
// ---------------------------------------------------------------------------
// 中试服务管理 — 细胞产品价格
// ---------------------------------------------------------------------------
+11
View File
@@ -488,6 +488,17 @@ export function fetchOaCcUnreadCount() {
return request.get<{ count: number }>({ url: `${BASE}/tasks/cc/unread-count` })
}
export function fetchOaMentionUnreadCount() {
return request.get<{ count: number }>({ url: `${BASE}/mentions/unread-count` })
}
export function fetchMarkOaMentionRead(instanceId: string) {
return request.post({
url: `${BASE}/mentions/${instanceId}/read`,
showSuccessMessage: false
})
}
export function fetchMarkOaCcTaskRead(taskId: string) {
return request.post({
url: `${BASE}/tasks/${taskId}/read`,
+2
View File
@@ -234,6 +234,8 @@ export function fetchQcWorkOrderList(params?: {
pageSize?: number
keyword?: string
workOrderStatus?: string
/** 协议/捐赠状态,逗号分隔;科研捐赠 Tab 使用;空串表示无匹配 */
protocolStatus?: string
workOrderType?: string
bizType?: string
receptionSource?: string
@@ -0,0 +1,63 @@
import request from '@/utils/http'
export type SampleCodeCorrectionSource = 'cell_storage' | 'research_donation'
export interface SampleCodeCorrectionImpact {
table: string
label: string
count: number
}
export interface SampleCodeCorrectionPreview {
ok: boolean
blockers: string[]
receptionSource: SampleCodeCorrectionSource
oldSampleCode: string
newSampleCode: string
sampleId?: string | null
impacts: SampleCodeCorrectionImpact[]
totalAffectedRows: number
hints?: {
sameProductCodeAsOld?: number
sameProductCodeAsNew?: number
labStorageCodeUnchanged?: boolean
cellProductCodeNotAutoUpdated?: boolean
}
}
export interface SampleCodeCorrectionApplyResult {
ok: boolean
logId: string
receptionSource: SampleCodeCorrectionSource
oldSampleCode: string
newSampleCode: string
impactCounts: Record<string, number>
totalAffectedRows: number
hints?: SampleCodeCorrectionPreview['hints']
}
export function fetchPreviewSampleCodeCorrection(data: {
receptionSource: SampleCodeCorrectionSource
oldSampleCode: string
newSampleCode: string
newSampleCodeId?: string | null
reason?: string
}) {
return request.post<SampleCodeCorrectionPreview>({
url: '/web/admin/sample-code-corrections/preview',
data
})
}
export function fetchApplySampleCodeCorrection(data: {
receptionSource: SampleCodeCorrectionSource
oldSampleCode: string
newSampleCode: string
newSampleCodeId?: string | null
reason?: string
}) {
return request.post<SampleCodeCorrectionApplyResult>({
url: '/web/admin/sample-code-corrections/apply',
data
})
}