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 = 'JN202600186'; const mainRows = await prisma.invoice_application_match_view.findMany({ where: { projectNumber: { contains: project } }, select: { dataId: true, invoiceJobNumber: true, projectNumber: true, bu_han_shui_jin_e_yuan_duo: true, han_shui_jin_e_yuan_duo: true, bu_han_shui_jin_e_yuan_du: true, bu_han_shui_jin_e_yuan_other: true, bu_han_shui_jin_e_yuan_da: true, bu_han_shui_jin_e_yuan_da_du: true, kai_piao_ri_qi: true, }, }); const filteredRows = mainRows.filter((r) => splitProjectNumbers(r.projectNumber).includes(project)); const ids = [...new Set(filteredRows.map((r) => r.dataId).filter(Boolean))]; const detailRows = ids.length > 0 ? await prisma.invoice_amount_details.findMany({ where: { dataid: { in: ids }, project_number: project, }, select: { dataid: true, project_number: true, invoice_amount: true, yu_ji_bao_xiao_di_san_fang_cheng_ben: true, }, }) : []; const summaryByDataId = ids.map((dataId) => { const mainForDataId = filteredRows.filter((r) => r.dataId === dataId); const detailForDataId = detailRows.filter((r) => r.dataid === dataId); const duoBuHan = Number(mainForDataId.find((r) => r.bu_han_shui_jin_e_yuan_duo)?.bu_han_shui_jin_e_yuan_duo || 0); const duoHan = Number(mainForDataId.find((r) => r.han_shui_jin_e_yuan_duo)?.han_shui_jin_e_yuan_duo || 0); const detailHanShuiSum = detailForDataId.reduce((s, r) => s + Number(r.invoice_amount || 0), 0); const calcBuHan = duoHan > 0 ? (detailHanShuiSum * duoBuHan) / duoHan : detailHanShuiSum; return { dataId, mainRowCount: mainForDataId.length, detailRowCount: detailForDataId.length, detailHanShuiSum, duoBuHan, duoHan, calcBuHan, detailSamples: detailForDataId.slice(0, 5), }; }); const totalBuHan = summaryByDataId.reduce((s, r) => s + r.calcBuHan, 0); console.log( JSON.stringify( { project, filteredCount: filteredRows.length, ids, summaryByDataId, totalBuHan, }, null, 2 ) ); } main() .catch((e) => { console.error(e); process.exitCode = 1; }) .finally(async () => { await prisma.$disconnect(); });