|  | @@ -1,9 +1,133 @@
 | 
	
		
			
				|  |  |  '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;
 | 
	
		
			
				|  |  | +};
 |