const { PrismaClient } = require('@prisma/client'); const prisma = new PrismaClient(); function splitProjectNumbers(value) { return String(value ?? '') .split(/[,,、\s]+/) .map((s) => s.trim()) .filter(Boolean); } async function main() { const project = 'DJ202500868'; const rows = await prisma.invoice_application_match_view.findMany({ where: { projectNumber: { contains: project } }, select: { dataId: true, invoiceJobNumber: true, projectNumber: true, yuJiBaoXiaoDiSanFangChengBenYuan: true, kai_piao_ri_qi: true, }, }); const filtered = rows.filter((r) => splitProjectNumbers(r.projectNumber).includes(project)); const dataIds = [...new Set(filtered.map((r) => r.dataId).filter(Boolean))]; const details = dataIds.length > 0 ? await prisma.invoice_amount_details.findMany({ where: { dataid: { in: dataIds }, project_number: project, }, select: { dataid: true, project_number: true, invoice_amount: true, yu_ji_bao_xiao_di_san_fang_cheng_ben: true, }, }) : []; const mainByDataId = dataIds.map((id) => { const arr = filtered.filter((r) => r.dataId === id); const uniqueMainThirdParty = [...new Set(arr.map((r) => String(r.yuJiBaoXiaoDiSanFangChengBenYuan ?? '')).filter(Boolean))]; const detailThirdPartyRaw = details .filter((d) => d.dataid === id) .map((d) => String(d.yu_ji_bao_xiao_di_san_fang_cheng_ben ?? '')) .filter((s) => s !== ''); return { dataId: id, mainCount: arr.length, uniqueMainThirdParty, detailRows: details.filter((d) => d.dataid === id).length, detailThirdPartyRaw, }; }); const mainDedupByInvoiceKey = new Map(); filtered.forEach((r) => { const key = `${r.dataId || ''}||${r.invoiceJobNumber || ''}`; if (!mainDedupByInvoiceKey.has(key)) { mainDedupByInvoiceKey.set(key, Number(r.yuJiBaoXiaoDiSanFangChengBenYuan || 0)); } }); const mainTotal = [...mainDedupByInvoiceKey.values()].reduce((s, n) => s + n, 0); const detailTotal = details.reduce((s, r) => s + Number(r.yu_ji_bao_xiao_di_san_fang_cheng_ben || 0), 0); console.log( JSON.stringify( { project, filteredCount: filtered.length, dataIds, mainByDataId, mainTotal, detailTotal, }, null, 2 ) ); } main() .catch((e) => { console.error(e); process.exitCode = 1; }) .finally(async () => { await prisma.$disconnect(); });