index.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import BaseController from "../../common/base/base_controller";
  2. const facade = require('../facade/index');
  3. const config = require("../../../config/config.js");
  4. const excel = require('node-xlsx');
  5. const fs = require('fs');
  6. const multiparty = require('multiparty');
  7. class PriceInfoClassController extends BaseController {
  8. async main(req, res) {
  9. const renderData = {
  10. title: '材料信息价类别总表',
  11. userAccount: req.session.managerData.username,
  12. userID: req.session.managerData.userID,
  13. LicenseKey: config.getLicenseKey(process.env.NODE_ENV),
  14. };
  15. await facade.setIDForData();
  16. res.render("maintain/price_info_class/html/main.html", renderData);
  17. }
  18. // 获取分页数据
  19. async getPagingData(req, res) {
  20. try {
  21. const { page, pageSize, searchStr } = JSON.parse(req.body.data);
  22. const data = await facade.getPagingData(page, pageSize, searchStr);
  23. res.json({ error: 0, message: 'getData success', data });
  24. } catch (err) {
  25. console.log(err);
  26. }
  27. }
  28. // 编辑
  29. async editClassData(req, res) {
  30. try {
  31. const { postData } = JSON.parse(req.body.data);
  32. await facade.editClassData(postData);
  33. res.json({ error: 0, message: 'editPrice success' });
  34. } catch (err) {
  35. console.log(err);
  36. res.json({ error: 1, message: err.toString() });
  37. }
  38. }
  39. async exportClassData(request, response) {
  40. try {
  41. const excelData = await facade.exportExcelData();
  42. const buffer = excel.build([{ name: "材料信息价类别总表", data: excelData }]);
  43. const filePath = './public/exportPriceClass.xlsx';
  44. fs.writeFileSync(filePath, buffer, 'binary');
  45. const stats = fs.statSync(filePath);
  46. // 下载相关header
  47. response.set({
  48. 'Content-Type': 'application/octet-stream',
  49. 'Content-Disposition': 'attachment; filename=infoPriceClass.xlsx',
  50. 'Content-Length': stats.size
  51. });
  52. fs.createReadStream(filePath).pipe(response);
  53. fs.unlink(filePath);
  54. } catch (error) {
  55. response.end(error);
  56. }
  57. }
  58. async importExcel(req, res) {
  59. let responseData = {
  60. err: 0,
  61. msg: ''
  62. };
  63. res.setTimeout(1000 * 60 * 10);
  64. const allowHeader = ['application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'];
  65. const uploadOption = {
  66. uploadDir: './public'
  67. };
  68. const form = new multiparty.Form(uploadOption);
  69. let uploadFullName;
  70. form.parse(req, async function (err, fields, files) {
  71. try {
  72. const file = files.file !== undefined ? files.file[0] : null;
  73. if (err || file === null) {
  74. throw '上传失败。';
  75. }
  76. // 判断类型
  77. if (file.headers['content-type'] === undefined || allowHeader.indexOf(file.headers['content-type']) < 0) {
  78. throw '不支持该类型';
  79. }
  80. // 重命名文件名
  81. uploadFullName = uploadOption.uploadDir + '/' + file.originalFilename;
  82. fs.renameSync(file.path, uploadFullName);
  83. const sheet = excel.parse(uploadFullName);
  84. if (sheet[0] === undefined || sheet[0].data === undefined || sheet[0].data.length <= 0) {
  85. throw 'excel没有对应数据。';
  86. }
  87. // 提取excel数据并入库
  88. await facade.importExcelData(sheet[0].data);
  89. // 删除文件
  90. if (uploadFullName && fs.existsSync(uploadFullName)) {
  91. fs.unlink(uploadFullName);
  92. }
  93. res.json(responseData);
  94. }
  95. catch (error) {
  96. console.log(error);
  97. if (uploadFullName && fs.existsSync(uploadFullName)) {
  98. fs.unlink(uploadFullName);
  99. }
  100. responseData.err = 1;
  101. responseData.msg = error.toString();
  102. res.json(responseData);
  103. }
  104. });
  105. }
  106. }
  107. module.exports = {
  108. priceInfoClassController: new PriceInfoClassController()
  109. };