|  | @@ -12,6 +12,8 @@ const auditConst = require('../const/audit').stage;
 | 
	
		
			
				|  |  |  const spreadSetting = require('../lib/spread_setting');
 | 
	
		
			
				|  |  |  const measureType = require('../const/tender').measureType;
 | 
	
		
			
				|  |  |  const tenderConst = require('../const/tender');
 | 
	
		
			
				|  |  | +const sendToWormhole = require('stream-wormhole');
 | 
	
		
			
				|  |  | +const path = require('path');
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  module.exports = app => {
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -154,6 +156,7 @@ module.exports = app => {
 | 
	
		
			
				|  |  |          async load(ctx) {
 | 
	
		
			
				|  |  |              try {
 | 
	
		
			
				|  |  |                  const relaStage = await this.ctx.service.stageRela.getDataById(ctx.params.trid);
 | 
	
		
			
				|  |  | +                const stage = await this.ctx.service.stage.getDataById(relaStage.rela_sid);
 | 
	
		
			
				|  |  |                  const data = JSON.parse(ctx.request.body.data);
 | 
	
		
			
				|  |  |                  const filter = data.filter.split(';');
 | 
	
		
			
				|  |  |                  const responseData = { err: 0, msg: '', data: {} };
 | 
	
	
		
			
				|  | @@ -167,6 +170,7 @@ module.exports = app => {
 | 
	
		
			
				|  |  |                              break;
 | 
	
		
			
				|  |  |                          case 'detail':
 | 
	
		
			
				|  |  |                              responseData.data.detailData = await ctx.service.stageDetail.getLastestStageData(relaStage.rela_tid, relaStage.rela_sid);
 | 
	
		
			
				|  |  | +                            responseData.data.detailAtt = await this.ctx.service.stageDetailAtt.getStageData(relaStage.rela_sid, stage.im_type);
 | 
	
		
			
				|  |  |                              break;
 | 
	
		
			
				|  |  |                          case 'change':
 | 
	
		
			
				|  |  |                              responseData.data.changeData = await ctx.service.stageChange.getLastestAllStageData(relaStage.rela_tid, relaStage.rela_sid);
 | 
	
	
		
			
				|  | @@ -185,6 +189,104 @@ module.exports = app => {
 | 
	
		
			
				|  |  |                  ctx.body = { err: 1, msg: err.toString(), data: null };
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        async uploadImFile(ctx) {
 | 
	
		
			
				|  |  | +            let stream;
 | 
	
		
			
				|  |  | +            try {
 | 
	
		
			
				|  |  | +                const relaStage = await this.ctx.service.stageRela.getDataById(ctx.params.trid);
 | 
	
		
			
				|  |  | +                const stage = await this.ctx.service.stage.getDataById(relaStage.rela_sid);
 | 
	
		
			
				|  |  | +                const parts = ctx.multipart({ autoFields: true });
 | 
	
		
			
				|  |  | +                let index = 0;
 | 
	
		
			
				|  |  | +                const create_time = Date.parse(new Date()) / 1000;
 | 
	
		
			
				|  |  | +                stream = await parts();
 | 
	
		
			
				|  |  | +                const uploadFiles = [];
 | 
	
		
			
				|  |  | +                while (stream !== undefined) {
 | 
	
		
			
				|  |  | +                    if (!stream.filename) throw '未发现上传文件!';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    const fileInfo = path.parse(stream.filename);
 | 
	
		
			
				|  |  | +                    const dirName = path.join('app', 'public', 'upload', relaStage.tid.toString(), 'im');
 | 
	
		
			
				|  |  | +                    const fileName = `${ctx.session.sessionUser.accountId}_${create_time}_${index}${fileInfo.ext}`;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    // 保存文件
 | 
	
		
			
				|  |  | +                    await ctx.helper.saveStreamFile(stream, path.join(this.app.baseDir, dirName, fileName));
 | 
	
		
			
				|  |  | +                    await sendToWormhole(stream);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    // 插入到stage_pay对应的附件列表中
 | 
	
		
			
				|  |  | +                    uploadFiles.push({
 | 
	
		
			
				|  |  | +                        file_id: this.ctx.app.uuid.v4(),
 | 
	
		
			
				|  |  | +                        filename: fileInfo.name,
 | 
	
		
			
				|  |  | +                        fileext: fileInfo.ext,
 | 
	
		
			
				|  |  | +                        filesize: Array.isArray(parts.field.size) ? parts.field.size[index] : parts.field.size,
 | 
	
		
			
				|  |  | +                        filepath: path.join(dirName, fileName),
 | 
	
		
			
				|  |  | +                        uid: ctx.session.sessionUser.accountId,
 | 
	
		
			
				|  |  | +                        in_time: ctx.moment(create_time * 1000).format('YYYY-MM-DD'),
 | 
	
		
			
				|  |  | +                        renew: true,
 | 
	
		
			
				|  |  | +                    });
 | 
	
		
			
				|  |  | +                    ++index;
 | 
	
		
			
				|  |  | +                    if (Array.isArray(parts.field.size) && index < parts.field.size.length) {
 | 
	
		
			
				|  |  | +                        stream = await parts();
 | 
	
		
			
				|  |  | +                    } else {
 | 
	
		
			
				|  |  | +                        stream = undefined;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                const baseInfo = JSON.parse(parts.field.base);
 | 
	
		
			
				|  |  | +                const result = await ctx.service.stageDetailAtt.addFiles(stage, baseInfo, uploadFiles);
 | 
	
		
			
				|  |  | +                ctx.body = { err: 0, mgs: '', data: result };
 | 
	
		
			
				|  |  | +            } catch (err) {
 | 
	
		
			
				|  |  | +                console.log(err);
 | 
	
		
			
				|  |  | +                // 失败需要消耗掉stream 以防卡死
 | 
	
		
			
				|  |  | +                if (stream) await sendToWormhole(stream);
 | 
	
		
			
				|  |  | +                ctx.log(err);
 | 
	
		
			
				|  |  | +                ctx.ajaxErrorBody(err, '上传附件失败');
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        async deleteImFile(ctx) {
 | 
	
		
			
				|  |  | +            try {
 | 
	
		
			
				|  |  | +                const data = JSON.parse(ctx.request.body.data);
 | 
	
		
			
				|  |  | +                if (!data.uuid || !data.file_id) throw '数据错误';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                const result = await ctx.service.stageDetailAtt.delFiles(data.uuid, data.file_id);
 | 
	
		
			
				|  |  | +                ctx.body = { err: 0, msg: '', data: result };
 | 
	
		
			
				|  |  | +            } catch (err) {
 | 
	
		
			
				|  |  | +                ctx.log(err);
 | 
	
		
			
				|  |  | +                ctx.ajaxErrorBody(err, '删除附件失败');
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        async downloadImFile(ctx) {
 | 
	
		
			
				|  |  | +            try {
 | 
	
		
			
				|  |  | +                const uuid = ctx.query.im_id;
 | 
	
		
			
				|  |  | +                const file_id = ctx.query.file_id;
 | 
	
		
			
				|  |  | +                if (!uuid || !file_id) throw '数据错误';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                const fileInfo = await ctx.service.stageDetailAtt.getFiles(uuid, file_id);
 | 
	
		
			
				|  |  | +                if (!fileInfo) throw '文件不存在';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                const fileName = path.join(this.app.baseDir, fileInfo.filepath);
 | 
	
		
			
				|  |  | +                // 解决中文无法下载问题
 | 
	
		
			
				|  |  | +                const userAgent = (ctx.request.header['user-agent'] || '').toLowerCase();
 | 
	
		
			
				|  |  | +                let disposition = '';
 | 
	
		
			
				|  |  | +                if (userAgent.indexOf('msie') >= 0 || userAgent.indexOf('chrome') >= 0) {
 | 
	
		
			
				|  |  | +                    disposition = 'attachment; filename=' + encodeURIComponent(fileInfo.filename + fileInfo.fileext);
 | 
	
		
			
				|  |  | +                } else if (userAgent.indexOf('firefox') >= 0) {
 | 
	
		
			
				|  |  | +                    disposition = 'attachment; filename*="utf8\'\'' + encodeURIComponent(fileInfo.filename + fileInfo.fileext) + '"';
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    /* safari等其他非主流浏览器只能自求多福了 */
 | 
	
		
			
				|  |  | +                    disposition = 'attachment; filename=' + new Buffer(fileInfo.filename + fileInfo.fileext).toString('binary');
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                ctx.response.set({
 | 
	
		
			
				|  |  | +                    'Content-Type': 'application/octet-stream',
 | 
	
		
			
				|  |  | +                    'Content-Disposition': disposition,
 | 
	
		
			
				|  |  | +                    'Content-Length': fileInfo.filesize,
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +                ctx.body = await fs.createReadStream(fileName);
 | 
	
		
			
				|  |  | +            } catch (err) {
 | 
	
		
			
				|  |  | +                ctx.log(err);
 | 
	
		
			
				|  |  | +                ctx.postError(err, '下载文件失败');
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 |