template_controller.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Mai
  6. * @date
  7. * @version
  8. */
  9. const path = require('path');
  10. const fs = require('fs');
  11. module.exports = app => {
  12. class TemplateController extends app.BaseController {
  13. /**
  14. * 下载 各种模板
  15. * @param ctx
  16. * @returns {Promise<void>}
  17. */
  18. async download(ctx) {
  19. const file = ctx.params.file;
  20. if (file) {
  21. try {
  22. let fileName;
  23. switch (file) {
  24. case '导入分项清单EXCEL格式.xlsx':
  25. fileName = path.join(this.app.baseDir, 'app', 'public', 'files', 'template', 'ledger', '导入分项清单EXCEL格式.xlsx');
  26. break;
  27. case '导入工程量清单EXCEL格式.xls':
  28. fileName = path.join(this.app.baseDir, 'app', 'public', 'files', 'template', 'ledger', '导入工程量清单EXCEL格式.xls');
  29. break;
  30. case '估概预算示例EXCEL格式.xlsx':
  31. fileName = path.join(this.app.baseDir, 'app', 'public', 'files', 'template', file);
  32. break;
  33. case '控制价示例EXCEL格式.xlsx':
  34. fileName = path.join(this.app.baseDir, 'app', 'public', 'files', 'template', file);
  35. break;
  36. default:
  37. throw '参数错误'
  38. }
  39. ctx.body = await fs.readFileSync(fileName);
  40. } catch (err) {
  41. this.log(err);
  42. if (err.stack) {
  43. ctx.body = '您下载的示例文件不存在';
  44. } else {
  45. ctx.body = err;
  46. }
  47. }
  48. } else {
  49. ctx.body = '参数错误';
  50. }
  51. }
  52. async posCalc(ctx) {
  53. try {
  54. if (!ctx.subProject.page_show.posCalcDetail) throw '该功能已关闭';
  55. const renderData = {
  56. validColInfo: ctx.service.calcTmpl.TemplateRela.posCalc.ValidColInfo,
  57. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.template.posCalc),
  58. };
  59. renderData.templateList = await ctx.service.calcTmpl.getAllTemplate(ctx.subProject.id, 'posCalc');
  60. await ctx.service.calcTmpl.checkTemplateUsed(renderData.templateList, 'posCalc');
  61. const specList = await ctx.service.stdExtraList.getList(0);
  62. renderData.specList = specList.map(x => { return { value: x.id, text: x.name }; });
  63. await this.layout('template/pos_calc.ejs', renderData, 'template/preview_modal.ejs');
  64. } catch (err) {
  65. ctx.log(err);
  66. ctx.postError(err, '查看模板数据错误');
  67. ctx.redirect(ctx.request.header.referer);
  68. }
  69. }
  70. async cost(ctx) {
  71. try {
  72. // if (!ctx.subProject.page_show.cost) throw '该功能已关闭';
  73. const renderData = {
  74. validColInfo: ctx.service.calcTmpl.TemplateRela.cost.ValidColInfo,
  75. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.template.cost),
  76. };
  77. renderData.templateList = await ctx.service.calcTmpl.getAllTemplate(ctx.subProject.id, 'cost');
  78. await ctx.service.calcTmpl.checkTemplateUsed(renderData.templateList, 'cost');
  79. await this.layout('template/cost.ejs', renderData, 'template/cost_modal.ejs');
  80. } catch (err) {
  81. ctx.log(err);
  82. ctx.postError(err, '查看模板数据错误');
  83. ctx.redirect(ctx.request.header.referer);
  84. }
  85. }
  86. // ------------ 以下方法为所有模板共用 --------------
  87. async load(ctx) {
  88. try {
  89. const data = JSON.parse(ctx.request.body.data);
  90. const filter = data.filter ? data.filter.split(';') : [];
  91. const result = {};
  92. for (const f of filter) {
  93. switch(f) {
  94. case 'detail':
  95. result[f] = await this.ctx.service.calcTmpl.getTemplate(data.id, data.type);
  96. break;
  97. default:
  98. throw '未知数据类型';
  99. }
  100. }
  101. ctx.body = { err: 0, msg: '', data: result };
  102. } catch (error) {
  103. ctx.log(error);
  104. ctx.ajaxErrorBody(error, '加载数据失败');
  105. }
  106. }
  107. async saveTemplate(ctx) {
  108. try {
  109. const data = JSON.parse(ctx.request.body.data);
  110. const result = await ctx.service.calcTmpl.saveTemplate(data);
  111. ctx.body = { err: 0, msg: '', data: result };
  112. } catch (err) {
  113. ctx.log(err);
  114. ctx.ajaxErrorBody(err, '修改数据失败');
  115. }
  116. }
  117. async preview(ctx) {
  118. try {
  119. const data = JSON.parse(ctx.request.body.data);
  120. const spreadSetting = this.ctx.service.calcTmpl.calcSpreadCache(data.type, data.col_set, data.multi_header);
  121. const testData = await this.ctx.service.calcTmpl.getCalcTestData(data.col_set, data.type, 3);
  122. ctx.body = { err: 0, msg: '', data: { spreadSetting, testData} };
  123. } catch (error) {
  124. ctx.log(error);
  125. ctx.ajaxErrorBody(error, '预览失败');
  126. }
  127. }
  128. // ---------------------------------------------------
  129. }
  130. return TemplateController;
  131. };