199 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
| /* eslint-disable */
 | |
| var fs = require('fs')
 | |
| const PDFDocument = require('pdfkit');
 | |
| var JsBarcode = require('jsbarcode');
 | |
| const dayjs = require('dayjs')
 | |
| const { Client } = require('pg')
 | |
| var _ = require('@sailshq/lodash')
 | |
| var async = require('async')
 | |
| var archiver = require('archiver')
 | |
| const { query } = require('../async-db')
 | |
| 
 | |
| // Canvas v2
 | |
| var { createCanvas } = require("canvas");
 | |
| 
 | |
| process.on('message', async (batch_num) => {
 | |
| 
 | |
|   console.log('Message from parent:', batch_num);
 | |
|   await createPdf(batch_num)
 | |
| });
 | |
| 
 | |
| async function template_004 (embarkingInfo, itineraries, batch_num) {
 | |
|   try {
 | |
|     let isJapan = false
 | |
|     // let pdf_path = 'assets/pdf_file/' + embarkingInfo.cruise
 | |
|     let pdf_path = '/mnt/assets/pdf_file/' + embarkingInfo.cruise
 | |
|     cruise = embarkingInfo.cruise
 | |
|     let filename = embarkingInfo.cruise + '-' + embarkingInfo.room_number + '-' + embarkingInfo.last_name
 | |
|       + ' ' + embarkingInfo.first_name + '.pdf'
 | |
|     let path = pdf_path + '/' + filename
 | |
|     if (!embarkingInfo['ship_name_cn']) {
 | |
|       let shipInfo = await query(`select * from ship where id = ? limit 1`, [embarkingInfo.ship])
 | |
|       console.log(shipInfo)
 | |
|       if (shipInfo.length > 0) {
 | |
|         embarkingInfo['ship_name_cn'] = shipInfo[0].name_cn
 | |
|         embarkingInfo['ship_name_en'] = shipInfo[0].name_en
 | |
|       }
 | |
|     }
 | |
|     console.log()
 | |
|     let berthInfo = await query(`select * from berthinfo where ship = ? and room_number = ? limit 1`, [embarkingInfo.ship, embarkingInfo.room_number])
 | |
|     if (berthInfo.length > 0) {
 | |
|       berthInfo = berthInfo[0]
 | |
|     } else {
 | |
|       berthInfo = null;
 | |
|     }
 | |
| 
 | |
|     var doc = new PDFDocument({size: 'A4'});
 | |
|     // var stream = doc.pipe(blobStream());
 | |
|     if (!fs.existsSync(pdf_path)) {
 | |
|       fs.mkdirSync(pdf_path);
 | |
|     }
 | |
| 
 | |
|     doc.pipe(fs.createWriteStream(path))
 | |
|     doc.image('assets/images/qingdao/page1.png', 19, 0, {fit: [595, 843]})
 | |
|     var canvas = createCanvas(400, 45);
 | |
|     JsBarcode(canvas, embarkingInfo.ticket_code, {displayValue: false});
 | |
|     const buf = canvas.toBuffer()
 | |
|     var lCanvas = createCanvas(150, 45);
 | |
|     let lCode = embarkingInfo.ticket_code;
 | |
|     for (let i = 0; i < (9 - embarkingInfo.ticket_code.length); i ++) {
 | |
|       lCode = '0' + lCode
 | |
|     }
 | |
|     lCode = '0' + lCode + '1'
 | |
|     JsBarcode(lCanvas, lCode,{displayValue: true});
 | |
|     const lbuf = lCanvas.toBuffer()
 | |
|     if (embarkingInfo.tour_group_code && embarkingInfo.tour_group_code != '' && embarkingInfo.tour_group_code != 'CH820897' && embarkingInfo.tour_group_code != 'CH821897') {
 | |
|       doc.font('assets/SIMHEI.TTF').fontSize(15)
 | |
|         .text(embarkingInfo.tour_group_code, 110, 121);
 | |
|     } else {
 | |
|     }
 | |
| 
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(13)
 | |
|       .text('歌诗达邮轮', 110, 240);
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(13)
 | |
|       .text('Costa Cruises', 110, 254)
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(10)
 | |
|       .text(embarkingInfo.ship_name_cn, 110, 268)
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(10)
 | |
|       .text(embarkingInfo.ship_name_en, 110, 279)
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(13)
 | |
|       .text(cruise, 110, 320)
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(13)
 | |
|       .text(dayjs.unix(embarkingInfo.date + 28800).format('YYYY-MM-DD'), 110, 358)
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(13)
 | |
|       .text('青岛国际邮轮母港中心', 110, 392)
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(13)
 | |
|       .text('Qingdao Cruise Terminal', 110, 406)
 | |
|     let y = 435
 | |
|     console.log(itineraries)
 | |
|     _.each(itineraries, item => {
 | |
|       if (item.country == 'Japan') {
 | |
|         isJapan = true
 | |
|       }
 | |
|       let a = item.date + 28800
 | |
|       doc.font('assets/SIMHEI.TTF').fontSize(12)
 | |
|         .text(dayjs.unix(a).format('YYYY-MM-DD') + ' ' + item.location_cn + item.location, 110, y)
 | |
|       y = y + 12
 | |
|     })
 | |
|     doc.image(buf, 308, 144, {width: 260, height: 42.5})
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(10)
 | |
|       .text(embarkingInfo.ticket_code, 408, 190);
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(15)
 | |
|       .text(embarkingInfo.name_cn, 110, 560);
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(15)
 | |
|       .text(embarkingInfo.last_name + ' ' + embarkingInfo.first_name, 110, 580);
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(15)
 | |
|       .text(embarkingInfo.country_code && embarkingInfo.country_code == 'RC' ? 'CHN' : embarkingInfo.country_code, 110, 614);
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(15)
 | |
|       .text(embarkingInfo.passport_code, 110, 657);
 | |
|     let identity_card = embarkingInfo.identity_card
 | |
|     // const preiStr = identity_card && identity_card.slice(0, 6);
 | |
|     // const endiStr = identity_card && identity_card.slice(14).padStart(12, '*')
 | |
|     // doc.font('assets/SIMHEI.TTF').fontSize(15)
 | |
|     //   .text(preiStr + endiStr, 121, 676);
 | |
|     let prepStr = ''
 | |
|     let endpStr = ''
 | |
|     if (embarkingInfo.phone && embarkingInfo.phone != '-') {
 | |
|       let phone = embarkingInfo.phone
 | |
|       prepStr = phone && phone.slice(0, 3);
 | |
|       endpStr = phone && phone.slice(7).padStart(8, '*')
 | |
|     }
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(15)
 | |
|       .text(prepStr + endpStr, 110, 700)
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(15)
 | |
|       .text(embarkingInfo.order_no, 368, 248)
 | |
|     if (berthInfo) {
 | |
|       doc.font('assets/SIMHEI.TTF').fontSize(15)
 | |
|         .text(berthInfo["floor"], 368, 290)
 | |
|     }
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(15)
 | |
|       .text(embarkingInfo.room_number, 368, 335)
 | |
|     if (embarkingInfo.tour_group_code && embarkingInfo.tour_group_code != '' && embarkingInfo.tour_group_code != 'CH820897' && embarkingInfo.tour_group_code != 'CH821897') {
 | |
|       doc.font('assets/SIMHEI.TTF').fontSize(15)
 | |
|         .text('团队', 368, 381);
 | |
|     } else {
 | |
|       doc.font('assets/SIMHEI.TTF').fontSize(15)
 | |
|         .text('散客', 368, 381);
 | |
|     }
 | |
|     if (berthInfo) {
 | |
|       // doc.image('assets/muster_station.png', 475, 338, {fit: [72, 62]})
 | |
|       doc.font('assets/SIMHEI.TTF').fontSize(20).fillColor('white')
 | |
|         .text(berthInfo.area, 500, 370)
 | |
|       // if (berthInfo.area == 'A') {
 | |
|       //   doc.image('assets/muster_station_A.png', 485, 338, {fit: [72, 62]})
 | |
|       // } else {
 | |
|       //   doc.image('assets/muster_station_B.png', 485, 338, {fit: [72, 62]})
 | |
|       // }
 | |
|     } else {
 | |
|       // doc.image('assets/muster_station_other.png', 485, 338, {fit: [72, 62]})
 | |
|     }
 | |
|     if (isJapan) {
 | |
|       doc.addPage().image('assets/images/qingdao/page3.png', 19, 0, {fit: [595, 843]})
 | |
|     } else {
 | |
|       doc.addPage().image('assets/images/qingdao/page2.png', 19, 0, {fit: [595, 843]})
 | |
|     }
 | |
|     doc.image(buf, 388, 36, {width: 200, height: 45})
 | |
|     // doc.rotate(90)
 | |
|     // doc.image('assets/muster_station_A.png',0,0,{fit: [72, 62]})
 | |
|     // doc.rotate(180, {origin: [0, 0]})
 | |
|     // doc.restore()
 | |
|     doc.addPage().image('assets/page3.png', 0, 0, {fit: [595, 843]})
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(18)
 | |
|       .text(embarkingInfo.ship_name_en, 226, 500, {width: 169.5, align: 'center'})
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(18)
 | |
|       .text(dayjs.unix(embarkingInfo.date).format('YYYY-MM-DD'), 226, 535,{width: 169.5, align: 'center'})
 | |
|     doc.font('Helvetica-Bold').fontSize(18)
 | |
|       .text(embarkingInfo.room_number, 297, 567)
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(18)
 | |
|       .image(lbuf, 261, 621, {width: 113, height: 50})
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(18)
 | |
|       .text(embarkingInfo.last_name + ' ' + embarkingInfo.first_name, 226, 695, {width: 169.5, align: 'center'})
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(18)
 | |
|       .text(embarkingInfo.order_no, 226, 740,{width: 169.5, align: 'center'})
 | |
| 
 | |
|     doc.save()
 | |
|     doc.rotate(180, {origin: [0, 0]})
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(18)
 | |
|       .text(embarkingInfo.order_no, -396.5, -100,{width: 169.5, align: 'center'})
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(18)
 | |
|       .text(embarkingInfo.last_name + ' ' + embarkingInfo.first_name, -396.5, -146,{width: 169.5, align: 'center'})
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(18)
 | |
|       .image(lbuf, -375, -229, {width: 113, height: 50})
 | |
|     doc.font('Helvetica-Bold').fontSize(18)
 | |
|       .text(embarkingInfo.room_number, -324, -277)
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(18)
 | |
|       .text(dayjs.unix(embarkingInfo.date).format('YYYY-MM-DD'), -396.5, -307,{width: 169.5, align: 'center'})
 | |
|     doc.font('assets/SIMHEI.TTF').fontSize(18)
 | |
|       .text(embarkingInfo.ship_name_en, -396.5, -342,{width: 169.5, align: 'center'})
 | |
|     doc.restore()
 | |
|     doc.end()
 | |
|   } catch (e) {
 | |
|     console.log(e.toString())
 | |
|     let taskmessage = await query("update taskmessage set status = ? where name = ? and status = ? ", ['fail', batch_num+'_create_pdf', 'process'])
 | |
|     // await client.end()
 | |
|     process.exit(0)
 | |
|   }
 | |
| }
 | |
| 
 | |
| module.exports = template_004
 |