From ba43273f338c7305da02984a40e710513d3b96fd Mon Sep 17 00:00:00 2001 From: sergeyyarkov Date: Tue, 17 Mar 2026 10:13:55 +0300 Subject: [PATCH] report executors link --- repositories/report.repository.js | 16 +++++++++------- schemas/report.schema.js | 2 +- services/reports.service.js | 20 +++++++++++--------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/repositories/report.repository.js b/repositories/report.repository.js index d56690d..d683601 100644 --- a/repositories/report.repository.js +++ b/repositories/report.repository.js @@ -19,7 +19,7 @@ export const reportRepository = { const result = await request.query(`select top 1 * from ${ReportTable.tableName} order by id desc`); const report = ReportModel.fromRecordset(result.recordset); - return report[0]; + return report.at(0); }, /** @@ -50,15 +50,17 @@ export const reportRepository = { }, /** - * @param {Record>} links + * @param {Record>[]} links * @param {sql.Transaction} [trx] */ async attachExecutors(links, trx) { const request = trx ? new sql.Request(trx) : new sql.Request(db); const table = ReportExecutorTable.createInstance(); - for (const [rId, executorIds] of Object.entries(links)) { - executorIds.forEach((eId) => table.rows.add(rId, eId)); + for (const report of Object.values(links)) { + for (const [rId, executorIds] of Object.entries(report)) { + executorIds.forEach((eId) => table.rows.add(rId, eId)); + } } await request.bulk(table); @@ -72,8 +74,8 @@ export const reportRepository = { async bulk(entries, trx) { const request = trx ? new sql.Request(trx) : new sql.Request(db); const table = ReportTable.createInstance(); - const lastReportId = (await this.getLast()).id; - let nextAddId = Number.parseInt(lastReportId, 10); + const lastReportId = (await this.getLast())?.id || 0; + let nextAddId = typeof lastReportId === "string" ? Number.parseInt(lastReportId, 10) : lastReportId; for (const e of entries) { table.rows.add( @@ -89,6 +91,6 @@ export const reportRepository = { const res = await request.bulk(table); - return res.rowsAffected; + return { rowsAffected: res.rowsAffected, addedRowIds: table.rows.map((r) => r[0]) }; } }; diff --git a/schemas/report.schema.js b/schemas/report.schema.js index bf89015..2bf658f 100644 --- a/schemas/report.schema.js +++ b/schemas/report.schema.js @@ -20,7 +20,7 @@ export const reportItemSchema = y.object({ job_description: y.string(), root_cause: y.string(), applicant: y.object({ id: y.number(), name: y.string() }).nullable(), - executors: y.array(y.object({ id: y.number(), fullname: y.string() })).required() + executors: y.array(y.object({ id: y.number().required(), fullname: y.string().required() })).required() }); export const reportsSchema = y.object({ reports: y.array(reportItemSchema).min(1).required() }).required(); diff --git a/services/reports.service.js b/services/reports.service.js index c581b65..0259993 100644 --- a/services/reports.service.js +++ b/services/reports.service.js @@ -175,13 +175,10 @@ export const reportsService = { * @param {InferType['reports']} inReports */ async syncReportsWithDatabase(inReports) { + const INVALID_DATE_FALLBACK = new Date("2016-10-24"); // дата для постановки вместо неверной. (колонка `date` в таблице имеет ограничение not null) const trx = new mssql.Transaction(db); const reports = await reportRepository.getAll(); - /** - * 3. установить связь добавленных отчетов с исполнителями и завершить транзакцию - */ - /** Отфильтровывание дубликатов по полям. */ const filteredInReports = inReports.filter((inputR) => { const isDub = reports.some((dbR) => { @@ -198,15 +195,16 @@ export const reportsService = { if (filteredInReports.length === 0) return 0; + /** Добавление отчетов и связей с исполнителями к ним */ try { await trx.begin(); - const countRows = await reportRepository.bulk( + const bulkResult = await reportRepository.bulk( filteredInReports.map((r) => { const reportDate = new Date(r.date || ""); return { applicant_id: r.applicant?.id || null, equipment_id: r.equipment?.id || null, - date: utilsDate.isDateValid(reportDate) ? reportDate : new Date("2016-10-24"), + date: utilsDate.isDateValid(reportDate) ? reportDate : INVALID_DATE_FALLBACK, job_description: r.job_description || "", reason_call: r.reason_call || "", root_cause: r.root_cause || "" @@ -214,10 +212,14 @@ export const reportsService = { }), trx ); - // filteredInReports.map((r) => ({ [r.]: "" })); - // await reportRepository.attachExecutors() + + const executorsLinks = filteredInReports.map((r, i) => { + return Object.fromEntries([[`${bulkResult.addedRowIds[i]}`, r.executors.map((e) => e.id)]]); + }); + + await reportRepository.attachExecutors(executorsLinks, trx); await trx.commit(); - return countRows; + return bulkResult.rowsAffected; } catch (error) { console.error(error); await trx.rollback();