'use strict'; /** * * * @author Mai * @date 2018/5/7 * @version */ const fs = require('fs'); const path = require('path'); const excel = require('node-xlsx'); const xlsx = require('js-xlsx'); const sendToWormhole = require('stream-wormhole'); const loadExcelType = { display: 1, actual: 2, }; const loadType = loadExcelType.display; module.exports = app => { class DealBillsController extends app.BaseController { /** * 获取标段的签约清单数据 * @param ctx * @return {Promise} */ async getData(ctx) { const responseData = { err: 0, msg: '', data: [], }; try { responseData.data = await ctx.service.dealBills.getAllDataByCondition({ where: { tender_id: ctx.tender.id } }); } catch (error) { this.log(error); responseData.err = 1; responseData.msg = error.toString(); } ctx.body = responseData; } /** * 导入Excel数据 * @param ctx * @return {Promise} */ async loadExcel(ctx) { let stream; try { stream = await ctx.getFileStream(); const create_time = Date.parse(new Date()) / 1000; const fileInfo = path.parse(stream.filename); const fileName = this.app.config.filePath + '/cache/deal_bills/uploads/' + 'deal_bills' + create_time + fileInfo.ext; // 保存文件 await ctx.helper.saveStreamFile(stream, fileName); if (loadType === loadExcelType.display) { const wb = xlsx.readFile(fileName); const name = wb.SheetNames[0]; const sheetData = { rows: xlsx.utils.sheet_to_json(wb.Sheets[name], {header: 1}), merge: wb.Sheets[name]["!merges"], }; const result = await ctx.service.dealBills.importDataJsXlsx(sheetData, ctx.tender.id); if (!result) { throw '导入数据失败'; } } else { // 读取文件 const sheet = excel.parse(fileName); if (!sheet || sheet.length === 0 || sheet[0] === undefined || sheet[0].data === undefined) { throw 'excel没有对应数据'; } const result = await ctx.service.dealBills.importData(sheet[0], ctx.tender.id); if (!result) { throw '导入数据失败'; } } const dealBills = await this.ctx.service.dealBills.getAllDataByCondition({ where: { tender_id: ctx.tender.id } }); ctx.body = {err: 0, msg: '', data: dealBills}; } catch (err) { this.log(err); // 失败需要消耗掉stream 以防卡死 if (stream) { await sendToWormhole(stream); } ctx.body = {err: 1, msg: err.toString(), data: null}; } } /** * 下载模板文件 * @param ctx * @return {Promise} */ async download(ctx) { const file = ctx.params.file; if (file) { try { let fileName; if (file === '签约清单导入格式.xls') { fileName = this.app.baseDir + '/app/public/deal_bills/template.xls'; } else { const create_time = Date.parse(new Date()) / 1000; fileName = this.app.baseDir + '/app/public/deal_bills/downloads/' + ctx.tender.id + '-' + create_time + '.xlsx'; // todo 导出签约清单Excel } ctx.body = await fs.readFileSync(fileName); } catch (err) { this.log(err); } } } } return DealBillsController; };