fix: enforce drainage uniqueness and carrier-specific reporting
This commit is contained in:
@@ -71,47 +71,48 @@ export class ReportChannelExportService {
|
||||
: missing.length
|
||||
? `缺少字段:${missing.map((field) => field.exportName || field.name).join('、')}`
|
||||
: null;
|
||||
const reportCarriers =
|
||||
reportType === 'signature'
|
||||
? item.eligibleTargets
|
||||
.filter((target) => target.channelId === channelId)
|
||||
.map((target) => target.carrier as 'mobile' | 'unicom' | 'telecom')
|
||||
: [null];
|
||||
const reportCarriers = item.eligibleTargets
|
||||
.filter((target) => target.channelId === channelId)
|
||||
.map((target) => target.carrier as 'mobile' | 'unicom' | 'telecom');
|
||||
const tasks: Array<{ task: { id: string; reason: string | null }; existingTask: { status: string } | null }> =
|
||||
[];
|
||||
for (const carrier of reportCarriers) {
|
||||
const existingTask = await this.prisma.channelSignatureReportTask.findFirst({
|
||||
where: {
|
||||
signatureId: item.signature.id,
|
||||
channelId,
|
||||
carrier,
|
||||
reportType,
|
||||
drainageItemId: reportType === 'drainage' ? item.drainageInfo!.id : null,
|
||||
},
|
||||
const entry = await this.prisma.$transaction(async (tx) => {
|
||||
await tx.$executeRaw`SELECT pg_advisory_xact_lock(hashtextextended(${item.signature.id}, 910))`;
|
||||
const existingTask = await tx.channelSignatureReportTask.findFirst({
|
||||
where: {
|
||||
signatureId: item.signature.id,
|
||||
channelId,
|
||||
carrier,
|
||||
reportType,
|
||||
drainageItemId: reportType === 'drainage' ? item.drainageInfo!.id : null,
|
||||
},
|
||||
});
|
||||
const task = existingTask
|
||||
? await tx.channelSignatureReportTask.update({
|
||||
where: { id: existingTask.id },
|
||||
data: {
|
||||
status: missingReason ? 'waiting_material' : 'exporting',
|
||||
reason: missingReason,
|
||||
approvedAt: null,
|
||||
},
|
||||
})
|
||||
: await tx.channelSignatureReportTask.create({
|
||||
data: {
|
||||
tenantId: item.signature.tenantId,
|
||||
signatureId: item.signature.id,
|
||||
channelId,
|
||||
carrier,
|
||||
approvalScope: 'carrier_specific',
|
||||
reportType,
|
||||
drainageItemId: item.drainageInfo?.id,
|
||||
status: missingReason ? 'waiting_material' : 'exporting',
|
||||
reason: missingReason,
|
||||
},
|
||||
});
|
||||
return { task, existingTask };
|
||||
});
|
||||
const task = existingTask
|
||||
? await this.prisma.channelSignatureReportTask.update({
|
||||
where: { id: existingTask.id },
|
||||
data: {
|
||||
status: missingReason ? 'waiting_material' : 'exporting',
|
||||
reason: missingReason,
|
||||
...(reportType === 'signature' ? { approvedAt: null } : {}),
|
||||
},
|
||||
})
|
||||
: await this.prisma.channelSignatureReportTask.create({
|
||||
data: {
|
||||
tenantId: item.signature.tenantId,
|
||||
signatureId: item.signature.id,
|
||||
channelId,
|
||||
carrier,
|
||||
approvalScope: reportType === 'signature' ? 'carrier_specific' : 'legacy_channel',
|
||||
reportType,
|
||||
drainageItemId: item.drainageInfo?.id,
|
||||
status: missingReason ? 'waiting_material' : 'exporting',
|
||||
reason: missingReason,
|
||||
},
|
||||
});
|
||||
tasks.push({ task, existingTask });
|
||||
tasks.push(entry);
|
||||
}
|
||||
const task = tasks[0].task;
|
||||
if (missingReason) {
|
||||
|
||||
Reference in New Issue
Block a user