Explorar el Código

合同支付,Bug#3590,删除、新增合同支付项&删除期等复合操作,行引用引起循环计算

MaiXinRong hace 1 año
padre
commit
b9cb904f9a

+ 1 - 1
app/lib/rm/tender.js

@@ -58,7 +58,7 @@ class rptMemPaymentSafe extends RptMemBase {
             case 'stage':
                 return service.stage.getStageById(params.stage_id);
             case 'stage_pay':
-                return service.stagePay.getAuditorStageData(params.stage_id, params.stage_times, params.stage_order);
+                return service.stagePay.getStagePays(ctx.stage);
             case 'mem_stage_im_zl':
                 return service.reportMemory.getStageImZlData(params.tender_id, params.stage_id, fields);
             case 'mem_month_progress':

+ 1 - 1
app/service/pay.js

@@ -204,7 +204,7 @@ module.exports = app => {
                 const preStage = await this.ctx.service.stage.getDataByCondition({ tid: stage.tid, order: stage.order - 1});
                 const max = await this.db.queryOne('SELECT MAX(stimes) as stimes, MAX(sorder) as sorder FROM ?? WHERE sid = ?', [this.ctx.service.stagePay.tableName, preStage.id]);
                 const resortSql = `UPDATE ${this.tableName} p LEFT JOIN ${this.ctx.service.stagePay.tableName} sp ON p.id = sp.pid`+
-                    '  SET p.`order` = sp.porder WHERE p.tid = ? and p.valid = 1 and sp.sid = ? and sp.stimes = ? and sp.sorder = ?';
+                    '  SET p.`order` = sp.porder, p.`expr` = sp.`expr`, p.valid = 1 WHERE p.tid = ? and sp.sid = ? and sp.stimes = ? and sp.sorder = ?';
                 await transaction.query(resortSql, [stage.tid, preStage.id, max.stimes, max.sorder]);
             }
         }

+ 1 - 1
app/service/report.js

@@ -116,7 +116,7 @@ module.exports = app => {
                             break;
                         case 'stage_pay':
                             await this.checkStg(this.ctx, params);
-                            runnableRst.push(service.stagePay.getAuditorStageData(params.stage_id, params.stage_times, params.stage_order));
+                            runnableRst.push(service.stagePay.getStagePays(this.ctx.stage));
                             runnableKey.push(filter);
                             break;
                         case 'mem_stage_im_zl':

+ 10 - 9
app/service/stage_pay.js

@@ -41,7 +41,7 @@ module.exports = app => {
                 '  FROM ' + this.tableName + ' As SP ' +
                 '  LEFT JOIN ' + this.ctx.service.pay.tableName + ' As P ' +
                 '  ON SP.pid = P.id' +
-                '  WHERE SP.`sid` = ? AND SP.`stimes` = ? AND SP.`sorder` = ? AND SP.`pid` = P.`id` AND P.`valid`' + pidSql +
+                '  WHERE SP.`sid` = ? AND SP.`stimes` = ? AND SP.`sorder` = ? AND SP.`pid` = P.`id` AND (P.`valid` || SP.porder > 0)' + pidSql +
                 '  ORDER BY P.`order`';
             const sqlParam = [sid, times, order, pid];
             if (pid instanceof Array) {
@@ -66,7 +66,7 @@ module.exports = app => {
                 '  FROM ' + this.tableName + ' As SP ' +
                 '  LEFT JOIN ' + this.ctx.service.pay.tableName + ' As P ' +
                 '  ON SP.pid = P.id' +
-                '  WHERE SP.`sid` = ? AND SP.`stimes` = ? AND SP.`sorder` = ? AND SP.`pid` = P.`id` AND P.`valid`' +
+                '  WHERE SP.`sid` = ? AND SP.`stimes` = ? AND SP.`sorder` = ? AND SP.`pid` = P.`id` AND (P.`valid` || SP.porder > 0)' +
                 '  ORDER BY P.`order`';
             const sqlParam = [sid, times, order];
             return await this.db.query(sql, sqlParam);
@@ -100,7 +100,7 @@ module.exports = app => {
                 if (!preStage) {
                     throw '标段数据有误';
                 }
-                const prePays = await this.getStageLastestPays(preStage.id);
+                const prePays = await this.getStageLastestPays(preStage);
                 for (const pp of prePays) {
                     const p = this._.find(pays, {id: pp.pid});
                     stagePays.push({
@@ -158,10 +158,10 @@ module.exports = app => {
         /**
          * 获取某期最后数据(不限制该期是否已经审批通过)
          *
-         * @param {Number} sid - 期id
+         * @param {Number} stage - 期数据(通过StageController._getStageData()获取)
          * @returns {Promise<*>}
          */
-        async getStageLastestPays(sid) {
+        async getStageLastestPays(stage) {
             const sql = 'SELECT SP.*, P.`order`, P.uid, P.minus, P.ptype, P.sprice, P.sexpr, P.rprice, P.rexpr, P.is_yf, P.dl_type, P.dl_count, P.dl_tp_type, P.dl_tp ' +
                 '  FROM ' + this.tableName + ' As SP' +
                 '  INNER JOIN ' + this.ctx.service.pay.tableName + ' As P ON SP.pid = P.id' +
@@ -170,10 +170,11 @@ module.exports = app => {
                 '      FROM ' + this.tableName +
                 '      WHERE `sid` = ? ' +
                 '      GROUP BY `sid`) As M ON (SP.`stimes` * ' + timesLen + ' + SP.`sorder`) = M.`sprogress`' +
-                '  WHERE SP.`sid` = ? AND P.`valid` = true' +
+                '  WHERE SP.`sid` = ? AND (P.`valid` || SP.porder > 0)' +
                 '  ORDER BY P.`order`';
-            const sqlParam = [sid, sid];
+            const sqlParam = [stage.id, stage.id];
             const result = await this.db.query(sql, sqlParam);
+            this.resortStagePays(stage, result);
             return result;
         }
 
@@ -279,7 +280,7 @@ module.exports = app => {
         async getHistorySf(stage) {
             if (!stage) return 0;
             const stagePays = stage.status === auditConst.stage.status.checked
-                ? await this.getStageLastestPays(stage.id)
+                ? await this.getStageLastestPays(stage)
                 : await this.getStagePays(stage);
             const sf = this._.find(stagePays, {ptype: payConst.payType.sf});
             return sf;
@@ -496,7 +497,7 @@ module.exports = app => {
         }
 
         async cacheOrder(stage, transaction) {
-            const sql = `UPDATE ${this.tableName} sp LEFT JOIN ${this.ctx.service.pay.tableName} p ON sp.pid = p.id SET sp.porder = p.\`order\` Where sp.sid = ?`;
+            const sql = `UPDATE ${this.tableName} sp LEFT JOIN ${this.ctx.service.pay.tableName} p ON sp.pid = p.id SET sp.porder = p.\`order\` Where sp.sid = ? AND p.valid`;
             await transaction.query(sql, [stage.id]);
         }
     }

+ 1 - 1
test/app/lib/pay_calc.test.js

@@ -37,7 +37,7 @@ describe('test/app/lib/pay_calc.test.js', () => {
         ctx.stage.curOrder = 0;
 
         const calc = new Calc(ctx, ctx.tender.info.decimal);
-        const dealPay = yield ctx.service.stagePay.getStageLastestPays(ctx.stage.id);
+        const dealPay = yield ctx.service.stagePay.getStageLastestPays(ctx.stage);
         yield calc.calculateAll(dealPay);
 
         const bqwc = app._.find(dealPay, {ptype: PayConst.payType.wc});

+ 5 - 5
test/app/service/pay.test.js

@@ -60,25 +60,25 @@ describe('test/app/service/pay.test.js', () => {
     it('test add', function* () {
         const ctx = app.mockContext(mockData);
 
-        const orgStagePays = yield ctx.service.stagePay.getStageLastestPays(ctx.stage.id);
+        const orgStagePays = yield ctx.service.stagePay.getStageLastestPays(ctx.stage);
 
         const result = yield ctx.service.pay.add();
         assert(result);
         testPayId = result.pid;
 
-        const stagePays = yield ctx.service.stagePay.getStageLastestPays(ctx.stage.id);
+        const stagePays = yield ctx.service.stagePay.getStageLastestPays(ctx.stage);
         assert(stagePays.length === orgStagePays.length + 1);
     });
     // 删除
     it('test del', function* () {
         const ctx = app.mockContext(mockData);
 
-        const orgStagePays = yield ctx.service.stagePay.getStageLastestPays(ctx.stage.id);
+        const orgStagePays = yield ctx.service.stagePay.getStageLastestPays(ctx.stage);
 
         const result = yield ctx.service.pay.del(testPayId);
         assert(result);
 
-        const stagePays = yield ctx.service.stagePay.getStageLastestPays(ctx.stage.id);
+        const stagePays = yield ctx.service.stagePay.getStageLastestPays(ctx.stage);
         assert(stagePays.length === orgStagePays.length - 1);
     });
     // 调整顺序
@@ -93,7 +93,7 @@ describe('test/app/service/pay.test.js', () => {
         const result = yield ctx.service.pay.changeOrder(node1.pid, node2.pid);
         assert(result);
 
-        const stagePays = yield ctx.service.stagePay.getStageLastestPays(ctx.stage.id);
+        const stagePays = yield ctx.service.stagePay.getStageLastestPays(ctx.stage);
         const newNode1 = _.find(stagePays, {order: node1.order});
         assert(newNode1.pid === node2.pid);
         const newNode2 = _.find(stagePays, {order: node2.order});

+ 3 - 3
test/app/service/stage_pay.test.js

@@ -119,7 +119,7 @@ describe('test/app/service/stage_pay.test.js', () => {
     });
     it('test getLastestStageData', function* () {
         const ctx = app.mockContext(mockData);
-        const stagePays = yield ctx.service.stagePay.getStageLastestPays(ctx.stage.id);
+        const stagePays = yield ctx.service.stagePay.getStageLastestPays(ctx.stage);
         assert(stagePays.length === 5);
         let node = _.find(stagePays, {name: '本期完成计量'});
         assert(node);
@@ -127,7 +127,7 @@ describe('test/app/service/stage_pay.test.js', () => {
     // syncAdd 由 pay.add 调用测试
     it('test syncAdd', function* () {
         const ctx = app.mockContext(mockData);
-        const orgStagePays = yield ctx.service.stagePay.getStageLastestPays(ctx.stage.id);
+        const orgStagePays = yield ctx.service.stagePay.getStageLastestPays(ctx.stage);
 
         const result = yield ctx.service.pay.add();
         assert(result);
@@ -156,7 +156,7 @@ describe('test/app/service/stage_pay.test.js', () => {
         const ctx = app.mockContext(mockData);
 
         const calc = new Calc(ctx, ctx.tender.info.decimal);
-        const dealPay = yield ctx.service.stagePay.getStageLastestPays(ctx.stage.id);
+        const dealPay = yield ctx.service.stagePay.getStageLastestPays(ctx.stage);
         yield calc.calculateAll(dealPay);
 
         const bqwc = app._.find(dealPay, {name: '本期完成计量'});