93 lines
2.6 KiB
JavaScript
93 lines
2.6 KiB
JavaScript
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();
|
|
});
|