Saya mencoba menggabungkan beberapa file (dan pembuatan dokumen PDF jika hasil database mengembalikan banyak elemen dengan bidang 'json' yang tidak kosong).
Sekarang penggabungan hanya terjadi sekali dan menggabungkan elemen pertama dengan element['json'] != ''
dengan dirinya sendiri.
Merging logic is:
Mungkin memasukkan semua janji ke dalam array dan meneruskannya ke Promise.all() membantu? Benar-benar terjebak sekarang.
app.get("/api/generatePDF", jsonParser, function(req, res) {
var saveFilename, savePath;
var idDocument, idPatient, idDoctor, idItem;
var orientation = "";
var url = req.route.path;
var tbl = "";
var html = "";
var hasTables = 0;
console.log(req.query.json);
var savedJSON = JSON.parse(req.query.json);
var flag = 4;
var id_inventory = parseInt(savedJSON['id_inventory']);
var request = new sql.Request();
var files = new Array();
var badFiles = new Array();
var options = "";
var mergeNeeded = parseInt(savedJSON['param']);
if (mergeNeeded == 1) {
flag = 14;
}
var cnt = 0;
var output = parseInt(savedJSON['output']);
var mergedName = savedJSON['merged_name'];
var numRows = 0;
var idSpec = mergeNeeded;
if (id_inventory == 0) {
var pid = savedJSON['id_patient'];
var idDocType = savedJSON['id_doc_type'];
idSpec = savedJSON['id_spec'];
flag = 10;
request.input('id_patient', sql.Int, pid);
request.input('id_doc_type', sql.Int, idDocType);
}
request.input('id_spec', sql.Int, idSpec);
request.input('flag', sql.Int, flag);
request.input('redo', sql.Int, 1);
request.input('id_inventory', sql.Int, id_inventory);
request.execute("create_json").then(function(result) {
var size = result.recordset.length;
return Promise.all(result.recordset.map(function(element) {
savePath = element['path'];
idItem = element['id_item'];
saveFilename = element['filename'];
options = { "format": "A4", "orientation": element['orientation'], "renderDelay": "undefined", "border": "10mm" }
idPatient = element['id_patient'];
htmlFile = element['id_template'];
var fillTemplate = new Promise((resolve, reject) => {
files.push(basePath + element['path'] + separator + element['filename']);
if (element['json'] != "") {
fs.readFile('templates' + separator + element['id_template'] + '.html', 'utf8', function(err, data) {
if (err) {
return console.log(err);
reject(err);
}
html = data;
// filling the template
resolve(html);
});
}
});
var makeDirectory = new Promise((resolve, reject) => {
if (element['json'] != "") {
mkdirp(basePath + element['path'], function(err) {
if (err) {
reject(err);
}
resolve(element);
});
}
});
var makePDF = (html) => {
return new Promise((resolve, reject) => {
if (element['json'] != "") {
pdf.create(html, options).toFile(basePath + element['path'] + separator + element['filename'], function(err, res) {
if (err) {
console.log(err);
reject(err);
} else {
var request2 = new sql.Request();
request2.input('flag', sql.Int, 5);
request2.input('id_inventory', sql.Int, element['id_item']);
request2.execute("PDF_create_json", (err2, result2) => {});
}
if (mergeNeeded == 1) {
if ((files.length > 100) || (files.length == size)) {
PDFMerge(files, { output: basePath + mergedName }).then(() => {
files.length = 0;
files.push(basePath + mergedName);
return "OK";
})
}
} resolve("OK");
});
} else {
if (mergeNeeded == 1) {
if ((files.length > 100) || (files.length == size)) {
PDFMerge(files, { output: basePath + mergedName }).then(() => {
files.length = 0;
files.push(basePath + mergedName);
return "OK";
})
}
console.log("mergedname: " + mergedName);
console.log("Files have been merged");
resolve("OK");
}
}
});
};
return makeDirectory
.then(() => {
return fillTemplate
})
.then(makePDF)
.then(() => {
console.log(files);
})
}
))
}).then(results => {
res.end("all done");
})
});