change_att.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. 'use strict';
  2. /**
  3. *
  4. * 附件
  5. * @author Ellisran
  6. * @date 2019/1/11
  7. * @version
  8. */
  9. const archiver = require('archiver');
  10. const path = require('path');
  11. const fs = require('fs');
  12. module.exports = app => {
  13. class ChangeAtt extends app.BaseService {
  14. /**
  15. * 构造函数
  16. *
  17. * @param {Object} ctx - egg全局变量
  18. * @return {void}
  19. */
  20. constructor(ctx) {
  21. super(ctx);
  22. this.tableName = 'change_attachment';
  23. }
  24. /**
  25. * 添加附件
  26. * @param {Object} postData - 表单信息
  27. * @param {Object} fileData - 文件信息
  28. * @param {int} uid - 上传者id
  29. * @return {void}
  30. */
  31. async save(postData, fileData, uid) {
  32. const data = {
  33. tid: postData.tid,
  34. cid: postData.cid,
  35. uid,
  36. };
  37. Object.assign(data, fileData);
  38. const result = await this.db.insert(this.tableName, data);
  39. return result;
  40. }
  41. /**
  42. * 获取 变更令 所有附件
  43. * @param {uuid} cid - 变更令id
  44. * @return {Promise<void>}
  45. */
  46. async getChangeAttachment(cid, sort = 'asc') {
  47. const sql = 'SELECT ca.*, pa.name As u_name, pa.role As u_role ' +
  48. ' FROM ?? As ca ' +
  49. ' Left Join ?? As pa ' +
  50. ' On ca.uid = pa.id ' +
  51. ' Where ca.cid = ? order by id ' + sort;
  52. const sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, cid];
  53. return await this.db.query(sql, sqlParam);
  54. }
  55. /**
  56. * 获取所有附件
  57. * @param {String} cid 变更令id
  58. */
  59. async getAllChangeFiles(cid) {
  60. const { ctx } = this;
  61. const result = await this.db.select(this.tableName, { where: { cid } });
  62. return result.map(item => {
  63. if (!ctx.helper.canPreview(item.fileext)) {
  64. item.filepath = `/change/download/file/${item.id}`;
  65. } else {
  66. item.filepath = item.filepath.replace(/^app|\/app/, '');
  67. }
  68. return item;
  69. });
  70. }
  71. /**
  72. * 将文件压缩成zip,并返回zip文件的路径
  73. * @param {array} fileIds - 文件数组id
  74. * @param {string} zipPath - 压缩文件存储路径
  75. * @return {string} 压缩后的zip文件路径
  76. */
  77. async compressedFile(fileIds, zipPath) {
  78. this.initSqlBuilder();
  79. this.sqlBuilder.setAndWhere('id', {
  80. value: fileIds,
  81. operate: 'in',
  82. });
  83. const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
  84. const files = await this.db.query(sql, sqlParam);
  85. return new Promise((resolve, reject) => {
  86. // 每次开一个新的archiver
  87. const ziparchiver = archiver('zip');
  88. const outputPath = fs.createWriteStream(path.resolve(this.app.baseDir, zipPath));
  89. outputPath.on('error', err => {
  90. reject(err);
  91. });
  92. ziparchiver.pipe(outputPath);
  93. files.forEach(item => {
  94. ziparchiver.file(path.resolve(this.app.baseDir, item.filepath), { name: item.filename + item.fileext });
  95. });
  96. // 存档警告
  97. ziparchiver.on('warning', function(err) {
  98. if (err.code === 'ENOENT') {
  99. console.warn('stat故障和其他非阻塞错误');
  100. }
  101. reject(err);
  102. });
  103. // 存档出错
  104. ziparchiver.on('error', function(err) {
  105. console.log(err);
  106. reject(err);
  107. });
  108. ziparchiver.finalize();
  109. outputPath.on('close', () => {
  110. resolve(ziparchiver.pointer());
  111. });
  112. });
  113. }
  114. /**
  115. * 返回所查询的变更令的名称
  116. * @param {string} cid - 变更令id
  117. */
  118. async getChangeName(cid) {
  119. const sql = 'SELECT name FROM ?? WHERE cid = ?';
  120. const sqlParam = [this.ctx.service.change.tableName, cid];
  121. return await this.db.queryOne(sql, sqlParam);
  122. }
  123. }
  124. return ChangeAtt;
  125. };