浏览代码

变更概况调整

MaiXinRong 3 年之前
父节点
当前提交
1278366a35
共有 4 个文件被更改,包括 79 次插入8 次删除
  1. 1 1
      app/controller/stage_controller.js
  2. 11 6
      app/public/js/stage_change.js
  3. 2 1
      app/service/change.js
  4. 65 0
      app/service/stage_change.js

+ 1 - 1
app/controller/stage_controller.js

@@ -1087,7 +1087,7 @@ module.exports = app => {
                 data.tenderInfo = ctx.tender.info;
                 data.ledger = await ctx.service.ledger.getData(ctx.tender.id);
                 data.usedChangesId = await ctx.service.stageChange.getStageUsedChangeId(ctx.stage.id);
-                data.changes = await ctx.service.change.getChangeAndUsedInfo(ctx.tender.id);
+                data.changes = await ctx.service.stageChange.getChangeWithUsedInfo(ctx.stage);
                 if (data.changes.length > 0) {
                     const change = data.changes[0];
                     change.detail = await this._getChangeDetailData(ctx.tender.id, ctx.stage.id, change.cid);

+ 11 - 6
app/public/js/stage_change.js

@@ -70,11 +70,15 @@ $(document).ready(() => {
     // 初始化变更令spread
     const changeSpreadSetting = {
         cols: [
-            {title: '变更令号', colSpan: '1', rowSpan: '1', field: 'p_code', hAlign: 0, width: 150, formatter: '@', readOnly: true},
-            {title: '变更名称', colSpan: '1', rowSpan: '1', field: 'name', hAlign: 0, width: 350, formatter: '@', readOnly: true},
-            {title: '金额', colSpan: '1', rowSpan: '1', field: 'total_price', hAlign: 2, width: 100, type: 'Number', readOnly: true},
-            {title: '批复文号', colSpan: '1', rowSpan: '1', field: 'w_code', hAlign: 0, width: 150, formatter: '@', readOnly: true},
-            {title: '已执行(%)', colSpan: '1', rowSpan: '1', field: 'used_pt', hAlign: 2, width: 100, type: 'Number', readOnly: true},
+            {title: '变更令号', colSpan: '1', rowSpan: '1', field: 'p_code', hAlign: 0, width: 150, formatter: '@'},
+            {title: '变更名称', colSpan: '1', rowSpan: '1', field: 'name', hAlign: 0, width: 350, formatter: '@'},
+            {title: '金额', colSpan: '1', rowSpan: '1', field: 'total_price', hAlign: 2, width: 100, type: 'Number'},
+            {title: '批复文号', colSpan: '1', rowSpan: '1', field: 'w_code', hAlign: 0, width: 150, formatter: '@'},
+            {title: '已执行(%)', colSpan: '1', rowSpan: '1', field: 'used_pt', hAlign: 2, width: 100, type: 'Number'},
+            {title: '正变更已计量', colSpan: '1', rowSpan: '1', field: 'p_used_tp', hAlign: 2, width: 80, type: 'Number'},
+            {title: '正变更执行率', colSpan: '1', rowSpan: '1', field: 'p_used_pt', hAlign: 2, width: 80, type: 'Number'},
+            {title: '负变更已计量', colSpan: '1', rowSpan: '1', field: 'n_used_tp', hAlign: 2, width: 80, type: 'Number'},
+            {title: '负变更执行率', colSpan: '1', rowSpan: '1', field: 'n_used_pt', hAlign: 2, width: 80, type: 'Number'},
         ],
         emptyRows: 0,
         headRows: 1,
@@ -86,7 +90,8 @@ $(document).ready(() => {
         localCache: {
             key: 'stage-change',
             colWidth: true,
-        }
+        },
+        readOnly: true,
     };
     const changeSpread = SpreadJsObj.createNewSpread($('#bgl-spread')[0]);
     SpreadJsObj.initSheet(changeSpread.getActiveSheet(), changeSpreadSetting);

+ 2 - 1
app/service/change.js

@@ -1261,7 +1261,8 @@ module.exports = app => {
             const sql =
                 'SELECT C.*, Sum(U.utp) As used_tp, TRUNCATE(Sum(U.utp) / C.total_price * 100 + 0.005, 2) As used_pt' +
                 '  FROM ' + this.tableName + ' As C' +
-                '  LEFT JOIN (SELECT sc.tid, sc.cid, sc.cbid, IF(SUM(sc.qty) > 0, TRUNCATE(SUM(sc.qty) * cb.unit_price + ?, ?), TRUNCATE(SUM(sc.qty) * cb.unit_price - ?, ?)) As utp' +
+                '  LEFT JOIN (SELECT sc.tid, sc.cid, sc.cbid, IF(SUM(sc.qty) > 0, TRUNCATE(SUM(sc.qty) * cb.unit_price + ?, ?), TRUNCATE(SUM(sc.qty) * cb.unit_price - ?, ?)) As utp,' +
+                '      IF(SUM(sc.qty) > 0, TRUNCATE(SUM(sc.qty) * cb.unit_price + ?, ?), 0, ?)) As utp_po, IF(SUM(sc.qty) > 0, 0, TRUNCATE(SUM(sc.qty) * cb.unit_price - ?, ?)) As utp_ne' +
                 '    FROM ' + this.ctx.service.stageChange.tableName + ' As sc' +
                 '    INNER JOIN (' +
                 '      SELECT MAX(`stimes`) As `stimes`, MAX(`sorder`) As `sorder`, `lid`, `pid`, `cbid`, sChange.`sid` ' +

+ 65 - 0
app/service/stage_change.js

@@ -428,6 +428,71 @@ module.exports = app => {
             result.great = helper.sum(helper._.map(bqData.filter(x => {return x.quality === changeConst.quality.great.value; }), 'tp'));
             return result;
         }
+
+        async _getChangeBillsWithUsedInfo(stage) {
+            if (stage.status === audit.stage.status.checked) {
+                const sql = 'SELECT scf.*, cal.unit_price ' +
+                    '  FROM ' + this.tableName + ' scf ' +
+                    '  LEFT JOIN ' + this.ctx.service.stage.tableName + ' s ON scf.sid = s.id' +
+                    '  WHERE scf.tid = ? And s.order <= ?';
+                const result = await this.db.query(sql, [stage.tid, stage.order]);
+                return result;
+            } else {
+                const preSql = 'SELECT scf.* ' +
+                    '  FROM ' + this.tableName + ' scf ' +
+                    '  LEFT JOIN ' + this.ctx.service.stage.tableName + ' s ON scf.sid = s.id' +
+                    '  WHERE scf.tid = ? And s.order < ?';
+                const pre = await this.db.query(preSql, [stage.tid, stage.order]);
+                const sql = 'SELECT * FROM ' + this.ctx.service.stageChange.tableName + ' WHERE sid = ? AND (stimes * 100 + sorder) <= (? * 100 + ?)';
+                const curAll = await this.db.query(sql, [stage.id, stage.curTimes, stage.curOrder]);
+                const cur = this.ctx.helper.filterLastestData(curAll, ['lid', 'pid', 'cid', 'cbid']);
+                return [...pre, ...cur];
+            }
+        }
+
+        async getChangeWithUsedInfo(stage) {
+            const change = await this.ctx.service.change.getAllDataByCondition({
+                where: { tid: stage.tid, status: audit.flow.status.checked }
+            });
+            if (change.length === 0) return [];
+
+            const changeBills = await this.ctx.service.changeAuditList.getAllDataByCondition({
+                where: { cid: change.map(x => { return x.cid; }) }
+            });
+            const changeBillsIndex = {}, changeBillsPart = {};
+            for (const cb of changeBills) {
+                changeBillsIndex[cb.id] = cb;
+                if (!changeBillsPart[cb.cid]) changeBillsPart[cb.cid] = [];
+                changeBillsPart[cb.cid].push(cb);
+            }
+            const stageChangeBills = await this._getChangeBillsWithUsedInfo(stage);
+            for (const scb of stageChangeBills) {
+                const cb = changeBillsIndex[scb.cbid];
+                cb.used_qty = this.ctx.helper.add(cb.used_qty, scb.qty);
+            }
+            for (const cid in changeBillsPart) {
+                const c = change.find(x => { return x.cid === cid });
+                if (!c) continue;
+
+                for (const cb of changeBillsPart[cid]) {
+                    cb.tp = this.ctx.helper.mul(cb.spamount, cb.unit_price, c.tp_decimal);
+                    cb.used_tp = this.ctx.helper.mul(cb.used_qty, cb.unit_price, this.ctx.tender.info.decimal.tp);
+
+                    c.used_tp = this.ctx.helper.add(c.used_tp, cb.used_tp);
+                    if (cb.spamount > 0) {
+                        c.p_tp = this.ctx.helper.add(c.p_tp, cb.tp);
+                        c.p_used_tp = this.ctx.helper.add(c.p_used_tp, cb.used_tp);
+                    } else if (cb.spamount < 0){
+                        c.n_tp = this.ctx.helper.add(c.n_tp, cb.tp);
+                        c.n_used_tp = this.ctx.helper.add(c.n_used_tp, cb.used_tp);
+                    }
+                }
+                c.used_pt = c.total_price ? this.ctx.helper.mul(this.ctx.helper.div(c.used_tp, c.total_price, 4), 100) : 0;
+                c.p_used_pt = c.p_tp ? this.ctx.helper.mul(this.ctx.helper.div(c.p_used_tp, c.p_tp, 4), 100) : 0;
+                c.n_used_pt = c.n_tp ? this.ctx.helper.mul(this.ctx.helper.div(c.n_used_tp, c.n_tp, 4), 100) : 0;
+            }
+            return change;
+        }
     }
 
     return StageChange;