'use strict'; /** * 合同支付 * * @author Mai * @date * @version */ module.exports = app => { class PayController extends app.BaseController { /** * 构造函数 * * @param {Object} ctx - egg全局变量 * @return {void} */ constructor(ctx) { super(ctx); } async index(ctx) { try { const pays = await this.ctx.service.pay.getAllDataByCondition({ where: { tid: ctx.tender.id } }); const renderData = { jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.pay.list) }; await this.layout('pay/index.ejs', renderData); } catch (err) { ctx.helper.log(err); } } async uploadFile(ctx) { let stream; try { const parts = ctx.multipart({ autoFields: true }); let index = 0; const create_time = Date.parse(new Date()) / 1000; let stream = await parts(); const bonus = await ctx.service.stageBonus.getStageDataById(parts.field.bonus_id); //if (!bonus || bonus.sid !== ctx.stage.id) throw '该奖罚金,当前不允许上传附件'; while (stream !== undefined) { if (!stream.filename) { throw '未发现上传文件!'; } const fileInfo = path.parse(stream.filename); const dirName = 'app/public/upload/extra/' + moment().format('YYYYMMDD'); const fileName = create_time + '_' + index + fileInfo.ext; // 保存文件 await ctx.helper.saveStreamFile(stream, path.join(this.app.baseDir, dirName, fileName)); await sendToWormhole(stream); // 插入到stage_pay对应的附件列表中 bonus.proof_file.push({ 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: moment(create_time * 1000).format('YYYY-MM-DD'), renew: bonus.sid === ctx.stage.id ? ctx.stage.status === auditConst.status.checked : true, }); ++index; if (Array.isArray(parts.field.size) && index < parts.field.size.length) { stream = await parts(); } else { stream = undefined; } } const result = await ctx.service.stageBonus.updateDatas({ update: [ { id: bonus.id, proof_file: bonus.proof_file }, ] }); for (const pf of bonus.proof_file) { pf.username = (await ctx.service.projectAccount.getAccountInfoById(pf.uid)).name; if (ctx.helper.canPreview(pf.fileext)){ pf.viewpath = pf.filepath.substr(3, pf.filepath.length - 3); } delete pf.filepath; } ctx.body = {err: 0, msg: '', data: bonus.proof_file}; } catch (error) { ctx.helper.log(error); // 失败需要消耗掉stream 以防卡死 if (stream) { await sendToWormhole(stream); } ctx.body = this.ajaxErrorBody(error, '上传附件失败,请重试'); } } async deleteFile(ctx) { try { const data = JSON.parse(ctx.request.body.data); const bonus = await ctx.service.stageBonus.getStageDataById(data.b_id); if (!bonus || !bonus.proof_file || !bonus.proof_file[data.index]) throw '删除的文件不存在'; const fileInfo = bonus.proof_file[data.index]; if (fileInfo.uid !== ctx.session.sessionUser.accountId) throw '您无权删除该文件'; const deleteFilePermission = PermissionCheck.delFile(this.ctx.session.sessionUser.permission); if (ctx.stage.status === auditConst.status.checked && !fileInfo.renew && !deleteFilePermission) throw '不可删除该文件'; // 先删除文件 await fs.unlinkSync(path.join(this.app.baseDir, fileInfo.filepath)); // 再删除数据库 bonus.proof_file.splice(data.index, 1); const result = await ctx.service.stageBonus.updateDatas({ update: [ { id: bonus.id, proof_file: bonus.proof_file }, ] }); for (const pf of bonus.proof_file) { delete pf.filepath; pf.username = (await ctx.service.projectAccount.getAccountInfoById(pf.uid)).name; } ctx.body = {err: 0, msg: '', data: bonus.proof_file}; } catch (err) { this.log(err); this.ctx.ajaxErrorBody(err, '删除文件失败'); } } } return PayController; };