|  | @@ -326,6 +326,75 @@ module.exports = app => {
 | 
	
		
			
				|  |  |                  stage.id, copyTimes, copyOrder];
 | 
	
		
			
				|  |  |              return await transaction.query(sql, sqlParam);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        _newExprAfterChangeOrder(expr, orderPart1, orderPart2) {
 | 
	
		
			
				|  |  | +            if (!expr) return [false, expr];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            const orderParam = [...expr.matchAll(/f\d+/ig)];
 | 
	
		
			
				|  |  | +            if (orderParam.length === 0) return [false, expr];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            const exprPart = [], newExprPart = [];
 | 
	
		
			
				|  |  | +            for (const [i, op] of orderParam.entries()) {
 | 
	
		
			
				|  |  | +                if (i === 0) {
 | 
	
		
			
				|  |  | +                    exprPart.push(expr.substring(0, op.index));
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    const preOp = orderParam[i-1];
 | 
	
		
			
				|  |  | +                    exprPart.push(expr.substring(preOp.index + preOp[0].length, op.index));
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                exprPart.push(op[0]);
 | 
	
		
			
				|  |  | +                if (i === orderParam.length - 1) exprPart.push(expr.substring(op.index + op[0].length, expr.length));
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            let change = false;
 | 
	
		
			
				|  |  | +            for (const ep of exprPart) {
 | 
	
		
			
				|  |  | +                if (ep === orderPart1) {
 | 
	
		
			
				|  |  | +                    newExprPart.push(orderPart2);
 | 
	
		
			
				|  |  | +                    change = true;
 | 
	
		
			
				|  |  | +                } else if (ep === orderPart2) {
 | 
	
		
			
				|  |  | +                    newExprPart.push(orderPart1);
 | 
	
		
			
				|  |  | +                    change = true;
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    newExprPart.push(ep);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            return [change, newExprPart.join('')];
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        /**
 | 
	
		
			
				|  |  | +         * 交换两个合同支付项的顺序
 | 
	
		
			
				|  |  | +         * @param {Number} id1 - 合同支付项1的id
 | 
	
		
			
				|  |  | +         * @param {Number} id2 - 合同支付项1的id
 | 
	
		
			
				|  |  | +         * @returns {Promise<void>}
 | 
	
		
			
				|  |  | +         */
 | 
	
		
			
				|  |  | +        async changeOrder(id1, id2) {
 | 
	
		
			
				|  |  | +            if (!this.ctx.tender || !this.ctx.stage) throw '数据错误';
 | 
	
		
			
				|  |  | +            const pay1 = await this.ctx.service.pay.getDataByCondition({tid: this.ctx.tender.id, id: id1});
 | 
	
		
			
				|  |  | +            const pay2 = await this.ctx.service.pay.getDataByCondition({tid: this.ctx.tender.id, id: id2});
 | 
	
		
			
				|  |  | +            if (!pay1 || !pay2) throw '数据错误';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            const stagePays = await this.getStagePays(this.ctx.stage);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            const conn = await this.db.beginTransaction();
 | 
	
		
			
				|  |  | +            try {
 | 
	
		
			
				|  |  | +                const orderPart1 = `f${pay1.order}`;
 | 
	
		
			
				|  |  | +                const orderPart2 = `f${pay2.order}`;
 | 
	
		
			
				|  |  | +                const updateData = [{id: pay1.id, order: pay2.order}, {id: pay2.id, order: pay1.order}];
 | 
	
		
			
				|  |  | +                const updateStageData = [];
 | 
	
		
			
				|  |  | +                for (const p of stagePays) {
 | 
	
		
			
				|  |  | +                    const [change, newExpr] = this._newExprAfterChangeOrder(p.expr, orderPart1, orderPart2);
 | 
	
		
			
				|  |  | +                    if (change) {
 | 
	
		
			
				|  |  | +                        updateStageData.push({ condition: { where: { pid: p.pid } }, update: { expr: newExpr } });
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                await conn.updateRows(this.ctx.service.pay.tableName, updateData);
 | 
	
		
			
				|  |  | +                for (const usd of updateStageData) {
 | 
	
		
			
				|  |  | +                    await conn.update(this.tableName, usd.update, usd.condition);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                await conn.commit();
 | 
	
		
			
				|  |  | +                return await this.getStagePays(this.ctx.stage);
 | 
	
		
			
				|  |  | +            } catch (err) {
 | 
	
		
			
				|  |  | +                await conn.rollback();
 | 
	
		
			
				|  |  | +                throw err;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      return StagePay;
 |