Kaynağa Gözat

合同支付,上下移,修改公式

MaiXinRong 2 yıl önce
ebeveyn
işleme
cb111a7926

+ 1 - 1
app/controller/stage_controller.js

@@ -1032,7 +1032,7 @@ module.exports = app => {
                         await this._updateStageCache(ctx, payCalculator);
                         break;
                     case 'changeOrder':
-                        responseData.data = await ctx.service.pay.changeOrder(data.id1, data.id2);
+                        responseData.data = await ctx.service.stagePay.changeOrder(data.id1, data.id2);
                         break;
                     case 'info':
                         responseData.data = await ctx.service.pay.save(data.updateData);

+ 16 - 8
app/public/js/stage_pay.js

@@ -643,10 +643,13 @@ $(document).ready(() => {
             const sheet = paySpread.getActiveSheet();
             const cur = SpreadJsObj.getSelectObject(sheet);
             const up = dealPay[dealPay.indexOf(cur) - 1];
-            postData(window.location.pathname + '/save', {type: 'changeOrder', id1: cur.pid, id2: up.pid}, function () {
-                const order = cur.order;
-                cur.order = up.order;
-                up.order = order;
+            postData(window.location.pathname + '/save', {type: 'changeOrder', id1: cur.pid, id2: up.pid}, function (result) {
+                for (const r of result) {
+                    const p = dealPay.find(x => { return x.pid === r.pid });
+                    if (!p) continue;
+                    p.order = r.order;
+                    p.expr = r.expr;
+                }
                 dealPay.sort(function (a, b) {
                     return a.order - b.order
                 });
@@ -655,6 +658,7 @@ $(document).ready(() => {
                 const index = dealPay.indexOf(cur);
                 sheet.setSelection(index, sel.length > 0 ? sel[0].col : 0, 1, 1);
                 paySpreadObj.refreshActn();
+                paySpreadObj.loadExprToInput();
             });
         },
         downMove: function () {
@@ -665,10 +669,13 @@ $(document).ready(() => {
                 type: 'changeOrder',
                 id1: cur.pid,
                 id2: down.pid
-            }, function () {
-                const order = cur.order;
-                cur.order = down.order;
-                down.order = order;
+            }, function (result) {
+                for (const r of result) {
+                    const p = dealPay.find(x => { return x.pid === r.pid });
+                    if (!p) continue;
+                    p.order = r.order;
+                    p.expr = r.expr;
+                }
                 dealPay.sort(function (a, b) {
                     return a.order - b.order
                 });
@@ -677,6 +684,7 @@ $(document).ready(() => {
                 const index = dealPay.indexOf(cur);
                 sheet.setSelection(index, sel.length > 0 ? sel[0].col : 0, 1, 1);
                 paySpreadObj.refreshActn();
+                paySpreadObj.loadExprToInput();
             });
         },
         selectionChanged: function (e, info) {

+ 0 - 31
app/service/pay.js

@@ -140,37 +140,6 @@ module.exports = app => {
             }
         }
 
-        /**
-         * 交换两个合同支付项的顺序
-         * @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.getDataByCondition({tid: this.ctx.tender.id, id: id1});
-            const pay2 = await this.getDataByCondition({tid: this.ctx.tender.id, id: id2});
-            if (!pay1 || !pay2) {
-                throw '数据错误';
-            }
-
-            const transaction = await this.db.beginTransaction();
-            try {
-                const order = pay1.order;
-                pay1.order = pay2.order;
-                pay2.order = order;
-                await transaction.update(this.tableName, {id: pay1.id, order: pay1.order});
-                await transaction.update(this.tableName, {id: pay2.id, order: pay2.order});
-                await transaction.commit();
-                return true;
-            } catch (err) {
-                await transaction.rollback();
-                throw err;
-            }
-        }
-
         async _save(data, transaction) {
             const pay = await this.getDataByCondition({tid: this.ctx.tender.id, id: data.id});
             if(!pay) {

+ 69 - 0
app/service/stage_pay.js

@@ -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;