Просмотр исходного кода

台账、计量台账,计算1相关

MaiXinRong 4 месяцев назад
Родитель
Сommit
941b48e015

+ 34 - 23
app/base/base_bills_service.js

@@ -11,11 +11,11 @@
 const TreeService = require('./base_tree_service');
 // sql拼装器
 const rootId = -1;
-const calcFields = ['unit_price', 'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'deal_qty', 'deal_tp', 'dgn_qty1', 'dgn_qty2'];
+const calcFields = ['unit_price', 'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'deal_qty', 'deal_tp', 'dgn_qty1', 'dgn_qty2', 'ex_qty1', 'ex_tp1'];
 const readOnlyFields = ['id', 'tender_id', 'ledger_id', 'ledger_pid', 'order', 'level', 'full_path', 'is_leaf'];
 const upFields = ['unit_price'];
-const qtyFields = ['sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'quantity', 'deal_qty'];
-const tpFields = ['sgfh_tp', 'sjcl_tp', 'qtcl_tp', 'total_price', 'deal_tp'];
+const qtyFields = ['sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'quantity', 'deal_qty', 'ex_qty1'];
+const tpFields = ['sgfh_tp', 'sjcl_tp', 'qtcl_tp', 'total_price', 'deal_tp', 'ex_tp1'];
 const measureType = require('../const/tender').measureType;
 const billsUtils = require('../lib/bills_utils');
 
@@ -52,17 +52,19 @@ class BaseBillsSerivce extends TreeService {
 
     // 继承方法
     clearParentingData(data) {
-        data.unit_price = null;
-        data.sgfh_qty = null;
-        data.sgfh_tp = null;
-        data.sjcl_qty = null;
-        data.sjcl_tp = null;
-        data.qtcl_qty = null;
-        data.qtcl_tp = null;
-        data.quantity = null;
-        data.total_price = null;
-        data.deal_qty = null;
-        data.deal_tp = null;
+        data.unit_price = 0;
+        data.sgfh_qty = 0;
+        data.sgfh_tp = 0;
+        data.sjcl_qty = 0;
+        data.sjcl_tp = 0;
+        data.qtcl_qty = 0;
+        data.qtcl_tp = 0;
+        data.quantity = 0;
+        data.total_price = 0;
+        data.deal_qty = 0;
+        data.deal_tp = 0;
+        data.ex_qty1 = 0;
+        data.ex_tp1 = 0;
     }
 
     /**
@@ -130,8 +132,8 @@ class BaseBillsSerivce extends TreeService {
                 await this.transaction.update(this.tableName,
                     {
                         is_leaf: false,
-                        sgfh_qty: null, sgfh_tp: null, qtcl_qty: null, qtcl_tp: null, sjcl_qty: null, sjcl_tp: null,
-                        quantity: null, unit_price: null, total_price: null, deal_qty: null, deal_tp: null
+                        sgfh_qty: 0, sgfh_tp: 0, qtcl_qty: 0, qtcl_tp: 0, sjcl_qty: 0, sjcl_tp: 0,
+                        quantity: 0, unit_price: 0, total_price: 0, deal_qty: 0, deal_tp: 0, ex_qty1: 0, ex_tp1: 0,
                     },
                     { where: {tender_id: tenderId, ledger_id: selectData.ledger_id} });
             }
@@ -466,6 +468,7 @@ class BaseBillsSerivce extends TreeService {
                     if (row.sjcl_qty === undefined) { row.sjcl_qty = updateNode.sjcl_qty; }
                     if (row.qtcl_qty === undefined) { row.qtcl_qty = updateNode.qtcl_qty; }
                     if (row.deal_qty === undefined) { row.deal_qty = updateNode.deal_qty; }
+                    if (row.ex_qty1 === undefined) { row.ex_qty1 = updateNode.ex_qty1; }
                 }
 
                 // 项目节、工程量清单相关
@@ -488,34 +491,38 @@ class BaseBillsSerivce extends TreeService {
                     if (row.unit_price === undefined) calcData.unit_price = updateNode.unit_price;
                     // 计算
                     if (row.sgfh_qty !== undefined || row.sjcl_qty !== undefined || row.qtcl_qty !== undefined ||
-                        row.deal_qty !== undefined || row.unit_price) {
+                        row.deal_qty !== undefined || row.ex_qty1 !== undefined || row.unit_price) {
                         if (row.sgfh_qty === undefined) calcData.sgfh_qty = updateNode.sgfh_qty;
                         if (row.sjcl_qty === undefined) calcData.sjcl_qty = updateNode.sjcl_qty;
                         if (row.qtcl_qty === undefined) calcData.qtcl_qty = updateNode.qtcl_qty;
                         if (row.deal_qty === undefined) calcData.deal_qty = updateNode.deal_qty;
+                        if (row.ex_qty1 === undefined) calcData.ex_qty1 = updateNode.ex_qty1;
                         calcData.quantity = helper.sum([calcData.sgfh_qty, calcData.sjcl_qty, calcData.qtcl_qty]);
                         calcData.sgfh_tp = helper.mul(calcData.sgfh_qty, calcData.unit_price, info.decimal.tp);
                         calcData.sjcl_tp = helper.mul(calcData.sjcl_qty, calcData.unit_price, info.decimal.tp);
                         calcData.qtcl_tp = helper.mul(calcData.qtcl_qty, calcData.unit_price, info.decimal.tp);
                         calcData.total_price = helper.mul(calcData.quantity, calcData.unit_price, info.decimal.tp);
                         calcData.deal_tp = helper.mul(calcData.deal_qty, calcData.unit_price, info.decimal.tp);
-                    } else if (row.sgfh_tp !== undefined || row.sjcl_tp !== undefined || row.qtcl_tp !== undefined || row.deal_tp !== undefined) {
-                        calcData.sgfh_qty = null;
-                        calcData.sjcl_qty = null;
-                        calcData.qtcl_qty = null;
-                        calcData.quantity = null;
-                        calcData.deal_qty = null;
+                        calcData.ex_tp1 = helper.mul(calcData.ex_qty1, calcData.unit_price, info.decimal.tp);
+                    } else if (row.sgfh_tp !== undefined || row.sjcl_tp !== undefined || row.qtcl_tp !== undefined || row.deal_tp !== undefined || row.ex_tp1 !== undefined) {
+                        calcData.sgfh_qty = 0;
+                        calcData.sjcl_qty = 0;
+                        calcData.qtcl_qty = 0;
+                        calcData.quantity = 0;
+                        calcData.deal_qty = 0;
                         calcData.sgfh_tp = helper.round(row.sgfh_tp !== undefined ? calcData.row.sgfh_tp : updateNode.sgfh_tp, info.decimal.tp);
                         calcData.sjcl_tp = helper.round(row.sgfh_tp !== undefined ? calcData.row.sjcl_tp : updateNode.sjcl_tp, info.decimal.tp);
                         calcData.qtcl_tp = helper.round(row.sgfh_tp !== undefined ? calcData.row.qtcl_tp : updateNode.qtcl_tp, info.decimal.tp);
                         calcData.total_price = helper.sum([calcData.sgfh_tp, calcData.sjcl_tp, calcData.qtcl_tp]);
                         calcData.deal_tp = helper.round(row.deal_tp !== undefined ? calcData.row.deal_tp : updateNode.deal_tp, info.decimal.tp);
+                        calcData.ex_tp1 = helper.round(row.ex_tp1 !== undefined ? calcData.row.ex_tp1 : updateNode.ex_tp1, info.decimal.tp);
                     } else if (row.unit_price !== undefined) {
                         calcData.sgfh_tp = helper.mul(calcData.sgfh_qty, calcData.unit_price, info.decimal.tp);
                         calcData.sjcl_tp = helper.mul(calcData.sjcl_qty, calcData.unit_price, info.decimal.tp);
                         calcData.qtcl_tp = helper.mul(calcData.qtcl_qty, calcData.unit_price, info.decimal.tp);
                         calcData.total_price = helper.mul(calcData.quantity, calcData.unit_price, info.decimal.tp);
                         calcData.deal_tp = helper.mul(calcData.deal_qty, calcData.unit_price, info.decimal.tp);
+                        calcData.ex_tp1 = helper.mul(calcData.ex_qty1, calcData.unit_price, info.decimal.tp);
                     }
                     updateData = this._filterUpdateInvalidField(updateNode.id, calcData);
                 } else {
@@ -707,9 +714,11 @@ class BaseBillsSerivce extends TreeService {
                         this._calcExpr(newPos, 'qtcl_qty', pos.qtcl_expr, pos.qtcl_qty, precision);
                         newPos.quantity = this.ctx.helper.add(newPos.sgfh_qty,
                             this.ctx.helper.add(newPos.sjcl_qty, newPos.qtcl_qty));
+                        newPos.ex_qty1 = this.ctx.helper.round(pos.ex_qty1, precision.value);
                         newBills.sgfh_qty = this.ctx.helper.add(newBills.sgfh_qty, newPos.sgfh_qty);
                         newBills.sjcl_qty = this.ctx.helper.add(newBills.sjcl_qty, newPos.sjcl_qty);
                         newBills.qtcl_qty = this.ctx.helper.add(newBills.qtcl_qty, newPos.qtcl_qty);
+                        newBills.ex_qty1 = this.ctx.helper.add(newBills.ex_qty1, newPos.ex_qty1);
                         if (defaultData) this.ctx.helper._.assignIn(newPos, defaultData);
                         pastePosData.push(newPos);
                     }
@@ -717,6 +726,7 @@ class BaseBillsSerivce extends TreeService {
                     this._calcExpr(newBills, 'sgfh_qty', newBills.sgfh_expr, d.sgfh_qty, precision);
                     this._calcExpr(newBills, 'sjcl_qty', newBills.sjcl_expr, d.sjcl_qty, precision);
                     this._calcExpr(newBills, 'qtcl_qty', newBills.qtcl_expr, d.qtcl_qty, precision);
+                    newBills.ex_qty1 = this.ctx.helper.round(d.ex_qty1, precision.value);
                 }
                 newBills.quantity = this.ctx.helper.add(newBills.sgfh_qty,
                     this.ctx.helper.add(newBills.sjcl_qty, newBills.qtcl_qty));
@@ -725,6 +735,7 @@ class BaseBillsSerivce extends TreeService {
                 newBills.qtcl_tp = this.ctx.helper.mul(newBills.qtcl_qty, newBills.unit_price, tpDecimal);
                 newBills.total_price = this.ctx.helper.mul(newBills.quantity, newBills.unit_price, tpDecimal);
                 newBills.deal_tp = this.ctx.helper.mul(newBills.deal_qty, newBills.unit_price, tpDecimal);
+                newBills.ex_tp1 = this.ctx.helper.mul(newBills.ex_qty1, newBills.unit_price, tpDecimal);
                 if (defaultData) this.ctx.helper._.assignIn(newBills, defaultData);
                 if (d.ancGcl && d.ancGcl.length > 0) {
                     for (const gcl of d.ancGcl) {

+ 76 - 4
app/const/spread.js

@@ -131,6 +131,7 @@ const BaseSetCol = {
         { key: 'memo', name: '备注', fixed: ['alias'], bills: 1, pos: 0 },
         { key: 'ex_memo2', name: '备注2', fixed: [], bills: 1, pos: 1, },
         { key: 'ex_memo3', name: '备注3', fixed: [], bills: 1, pos: 1, },
+        { key: 'ex_calc1', name: '计算1', fixed: [], bills: 1, pos: 1, },
     ],
     tz_stage_set: [
         { key: 'code', name: '项目节编号', fixed: ['move', 'valid', 'alias'], bills: 1, pos: 0 },
@@ -158,6 +159,9 @@ const BaseSetCol = {
         { key: 'is_tp', name: '总额计量', fixed: [], bills: 1, pos: 0 },
         { key: 'gxby', name: '工序报验', fixed: ['valid', 'alias'], bills: 1, pos: 1, },
         { key: 'dagl', name: '档案管理', fixed: ['valid', 'alias'], bills: 1, pos: 1, },
+        { key: 'ex_calc1', name: '计算1', fixed: [], bills: 1, pos: 1, },
+        { key: 'cur_ex_calc1', name: '本期计算1', fixed: [], bills: 1, pos: 1, },
+        { key: 'end_ex_calc1', name: '截止本期计算1', fixed: [], bills: 1, pos: 1, },
     ],
     gcl_ledger_set: [
         { key: 'code', name: '项目节编号', fixed: ['move', 'valid', 'alias'], bills: 1, pos: 0, },
@@ -177,6 +181,7 @@ const BaseSetCol = {
         { key: 'memo', name: '备注', fixed: ['alias'], bills: 1, pos: 0 },
         { key: 'ex_memo2', name: '备注2', fixed: [], bills: 1, pos: 1, },
         { key: 'ex_memo3', name: '备注3', fixed: [], bills: 1, pos: 1, },
+        { key: 'ex_calc1', name: '计算1', fixed: [], bills: 1, pos: 1, },
     ],
     gcl_stage_set: [
         { key: 'code', name: '项目节编号', fixed: ['move', 'valid', 'alias'], bills: 1, pos: 0 },
@@ -205,6 +210,9 @@ const BaseSetCol = {
         { key: 'is_tp', name: '总额计量', fixed: [], bills: 1, pos: 0 },
         { key: 'gxby', name: '工序报验', fixed: ['valid', 'alias'], bills: 1, pos: 1, },
         { key: 'dagl', name: '档案管理', fixed: ['valid', 'alias'], bills: 1, pos: 1, },
+        { key: 'ex_calc1', name: '计算1', fixed: [], bills: 1, pos: 1, },
+        { key: 'cur_ex_calc1', name: '本期计算1', fixed: [], bills: 1, pos: 1, },
+        { key: 'end_ex_calc1', name: '截止本期计算1', fixed: [], bills: 1, pos: 1, },
     ],
 };
 // 默认的列设置
@@ -227,6 +235,7 @@ const glSpreadTemplate = {
         { key: 'memo', valid: 1 },
         { key: 'ex_memo2', valid: 0 },
         { key: 'ex_memo3', valid: 0 },
+        { key: 'ex_calc1', valid: 0 },
     ],
     tz_stage_set: [
         { key: 'code', valid: 1 },
@@ -254,6 +263,9 @@ const glSpreadTemplate = {
         { key: 'is_tp', valid: 1},
         { key: 'gxby', valid: 1},
         { key: 'dagl', valid: 1},
+        { key: 'ex_calc1', valid: 0 },
+        { key: 'cur_ex_calc1', valid: 0 },
+        { key: 'end_ex_calc1', valid: 0 },
     ],
     gcl_ledger_set: [
         { key: 'code', valid: 1 },
@@ -273,6 +285,7 @@ const glSpreadTemplate = {
         { key: 'memo', valid: 1 },
         { key: 'ex_memo2', valid: 0 },
         { key: 'ex_memo3', valid: 0 },
+        { key: 'ex_calc1', valid: 0 },
     ],
     gcl_stage_set: [
         { key: 'code', valid: 1 },
@@ -301,6 +314,9 @@ const glSpreadTemplate = {
         { key: 'add_stage_order', valid: 1},
         { key: 'gxby', valid: 1},
         { key: 'dagl', valid: 1},
+        { key: 'ex_calc1', valid: 0 },
+        { key: 'cur_ex_calc1', valid: 0 },
+        { key: 'end_ex_calc1', valid: 0 },
     ],
 };
 const szSpreadTemplate = {
@@ -322,6 +338,7 @@ const szSpreadTemplate = {
         { key: 'memo', valid: 1 },
         { key: 'ex_memo2', valid: 0 },
         { key: 'ex_memo3', valid: 0 },
+        { key: 'ex_calc1', valid: 0 },
     ],
     tz_stage_set: [
         { key: 'code', valid: 1 },
@@ -349,6 +366,9 @@ const szSpreadTemplate = {
         { key: 'is_tp', valid: 1},
         { key: 'gxby', valid: 1},
         { key: 'dagl', valid: 1},
+        { key: 'ex_calc1', valid: 0 },
+        { key: 'cur_ex_calc1', valid: 0 },
+        { key: 'end_ex_calc1', valid: 0 },
     ],
     gcl_ledger_set: [
         { key: 'code', valid: 1 },
@@ -368,6 +388,7 @@ const szSpreadTemplate = {
         { key: 'memo', valid: 1 },
         { key: 'ex_memo2', valid: 0 },
         { key: 'ex_memo3', valid: 0 },
+        { key: 'ex_calc1', valid: 0 },
     ],
     gcl_stage_set: [
         { key: 'code', valid: 1 },
@@ -396,6 +417,9 @@ const szSpreadTemplate = {
         { key: 'add_stage_order', valid: 1},
         { key: 'gxby', valid: 1},
         { key: 'dagl', valid: 1},
+        { key: 'ex_calc1', valid: 0 },
+        { key: 'cur_ex_calc1', valid: 0 },
+        { key: 'end_ex_calc1', valid: 0 },
     ],
 };
 const fjSpreadTemplate = {
@@ -417,6 +441,7 @@ const fjSpreadTemplate = {
         { key: 'memo', valid: 1 },
         { key: 'ex_memo2', valid: 0 },
         { key: 'ex_memo3', valid: 0 },
+        { key: 'ex_calc1', valid: 0 },
     ],
     tz_stage_set: [
         { key: 'code', valid: 1 },
@@ -444,6 +469,9 @@ const fjSpreadTemplate = {
         { key: 'is_tp', valid: 1},
         { key: 'gxby', valid: 1},
         { key: 'dagl', valid: 1},
+        { key: 'ex_calc1', valid: 0 },
+        { key: 'cur_ex_calc1', valid: 0 },
+        { key: 'end_ex_calc1', valid: 0 },
     ],
     gcl_ledger_set: [
         { key: 'code', valid: 1 },
@@ -463,6 +491,7 @@ const fjSpreadTemplate = {
         { key: 'memo', valid: 1 },
         { key: 'ex_memo2', valid: 0 },
         { key: 'ex_memo3', valid: 0 },
+        { key: 'ex_calc1', valid: 0 },
     ],
     gcl_stage_set: [
         { key: 'code', valid: 1 },
@@ -491,6 +520,9 @@ const fjSpreadTemplate = {
         { key: 'add_stage_order', valid: 1},
         { key: 'gxby', valid: 1},
         { key: 'dagl', valid: 1},
+        { key: 'ex_calc1', valid: 0 },
+        { key: 'cur_ex_calc1', valid: 0 },
+        { key: 'end_ex_calc1', valid: 0 },
     ],
 };
 const ProjectSpreadTemplate = [
@@ -533,7 +565,11 @@ const BaseSpreadColSetting = {
             memo: [{title: '备注', colSpan: '1', rowSpan: '2', field: 'memo', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}],
             ex_memo1: [{title: 'ex_memo1', colSpan: '1', rowSpan: '2', field: 'ex_memo1', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}, ],
             ex_memo2: [{title: 'ex_memo2', colSpan: '1', rowSpan: '2', field: 'ex_memo2', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}, ],
-            ex_memo3: [{title: 'ex_memo3', colSpan: '1', rowSpan: '2', field: 'ex_memo3', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}]
+            ex_memo3: [{title: 'ex_memo3', colSpan: '1', rowSpan: '2', field: 'ex_memo3', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}],
+            ex_calc1: [
+                {title: '计算1|数量', colSpan: '2|1', rowSpan: '1|1', field: 'ex_qty1', hAlign: 2, width: 60, type: 'Number', aliasFormat: '{%s}|数量'},
+                {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'ex_tp1', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+            ],
         },
         pos: {
             name: [{title: '计量单元', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 230, formatter: '@'}],
@@ -548,7 +584,8 @@ const BaseSpreadColSetting = {
             drawing_code: [{title: '图(册)号', colSpan: '1', rowSpan: '2', field: 'drawing_code', hAlign: 0, width: 80, formatter: '@', textIndent: 1}],
             ex_memo1: [{title: 'ex_memo1', colSpan: '1', rowSpan: '2', field: 'ex_memo1', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}],
             ex_memo2: [{title: 'ex_memo2', colSpan: '1', rowSpan: '2', field: 'ex_memo2', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}],
-            ex_memo3: [{title: 'ex_memo3', colSpan: '1', rowSpan: '2', field: 'ex_memo3', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}]
+            ex_memo3: [{title: 'ex_memo3', colSpan: '1', rowSpan: '2', field: 'ex_memo3', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}],
+            ex_calc1: [{title: '计算1数量', colSpan: '1', rowSpan: '2', field: 'ex_qty1', hAlign: 2, width: 100, type: 'Number', aliasFormat: '{%s}数量'}],
         }
     },
     tz_stage_set: {
@@ -608,6 +645,18 @@ const BaseSpreadColSetting = {
             ex_memo1: [{title: 'ex_memo1', colSpan: '1', rowSpan: '2', field: 'ex_memo1', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}],
             ex_memo2: [{title: 'ex_memo2', colSpan: '1', rowSpan: '2', field: 'ex_memo2', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}],
             ex_memo3: [{title: 'ex_memo3', colSpan: '1', rowSpan: '2', field: 'ex_memo3', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}],
+            ex_calc1: [
+                {title: '计算1|数量', colSpan: '2|1', rowSpan: '1|1', field: 'ex_qty1', hAlign: 2, width: 60, type: 'Number', readOnly: true, aliasFormat: '{%s}|数量'},
+                {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'ex_tp1', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+            ],
+            cur_ex_calc1: [
+                {title: '本期计算1|数量', colSpan: '2|1', rowSpan: '1|1', field: 'ex_stage_qty1', hAlign: 2, width: 60, type: 'Number', aliasFormat: '{%s}|数量'},
+                {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'ex_stage_tp1', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+            ],
+            end_ex_calc1: [
+                {title: '截止本期计量1|数量', colSpan: '2|1', rowSpan: '1|1', field: 'end_ex_stage_qty1', hAlign: 2, width: 60, type: 'Number', readOnly: true, aliasFormat: '{%s}|数量'},
+                {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'end_ex_stage_tp1', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+            ],
         },
         pos: {
             name: [{title: '计量单元', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 180, formatter: '@', readOnly: true}],
@@ -636,6 +685,9 @@ const BaseSpreadColSetting = {
             add_stage_order: [{title: '添加期数', colSpan: '1', rowSpan: '2', field: 'add_stage_order', hAlign:1, width: 80, readOnly: true}],
             gxby: [{title: '工序报验', colSpan: '1', rowSpan: '2', field: 'gxby', hAlign: 0, width: 80, formatter: '@', readOnly: true}],
             dagl: [{title: '档案管理', colSpan: '1', rowSpan: '2', field: 'dagl', hAlign: 0, width: 80, formatter: '@', readOnly: true}],
+            ex_calc1: [{title: '计算1数量', colSpan: '1', rowSpan: '2', field: 'ex_qty1', hAlign: 2, width: 100, type: 'Number', readOnly: true, aliasFormat: '{%s}数量'}],
+            cur_ex_calc1: [{title: '本期计量1数量', colSpan: '1', rowSpan: '2', field: 'ex_stage_qty1', hAlign: 2, width: 100, type: 'Number', aliasFormat: '{%s}数量'}],
+            end_ex_calc1: [{title: '截止本期计量1数量', colSpan: '1', rowSpan: '2', field: 'end_ex_stage_qty1', hAlign: 2, width: 100, type: 'Number', readOnly: true, aliasFormat: '{%s}数量'}],
         }
     },
     gcl_ledger_set: {
@@ -671,7 +723,11 @@ const BaseSpreadColSetting = {
             memo: [{title: '备注', colSpan: '1', rowSpan: '2', field: 'memo', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}],
             ex_memo1: [{title: 'ex_memo1', colSpan: '1', rowSpan: '2', field: 'ex_memo1', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}, ],
             ex_memo2: [{title: 'ex_memo2', colSpan: '1', rowSpan: '2', field: 'ex_memo2', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}, ],
-            ex_memo3: [{title: 'ex_memo3', colSpan: '1', rowSpan: '2', field: 'ex_memo3', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}]
+            ex_memo3: [{title: 'ex_memo3', colSpan: '1', rowSpan: '2', field: 'ex_memo3', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}],
+            ex_calc1: [
+                {title: '计算1|数量', colSpan: '2|1', rowSpan: '1|1', field: 'ex_qty1', hAlign: 2, width: 60, type: 'Number', aliasFormat: '{%s}|数量'},
+                {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'ex_tp1', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+            ],
         },
         pos: {
             name: [{title: '计量单元', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 230, formatter: '@'}],
@@ -686,7 +742,8 @@ const BaseSpreadColSetting = {
             drawing_code: [{title: '图(册)号', colSpan: '1', rowSpan: '2', field: 'drawing_code', hAlign: 0, width: 80, formatter: '@', textIndent: 1}],
             ex_memo1: [{title: 'ex_memo1', colSpan: '1', rowSpan: '2', field: 'ex_memo1', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}],
             ex_memo2: [{title: 'ex_memo2', colSpan: '1', rowSpan: '2', field: 'ex_memo2', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}],
-            ex_memo3: [{title: 'ex_memo3', colSpan: '1', rowSpan: '2', field: 'ex_memo3', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}]
+            ex_memo3: [{title: 'ex_memo3', colSpan: '1', rowSpan: '2', field: 'ex_memo3', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}],
+            ex_calc1: [{title: '计算1数量', colSpan: '1', rowSpan: '2', field: 'ex_qty1', hAlign: 2, width: 100, type: 'Number', aliasFormat: '{%s}数量'}],
         }
     },
     gcl_stage_set: {
@@ -746,6 +803,18 @@ const BaseSpreadColSetting = {
             ex_memo1: [{title: 'ex_memo1', colSpan: '1', rowSpan: '2', field: 'ex_memo1', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}],
             ex_memo2: [{title: 'ex_memo2', colSpan: '1', rowSpan: '2', field: 'ex_memo2', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}],
             ex_memo3: [{title: 'ex_memo3', colSpan: '1', rowSpan: '2', field: 'ex_memo3', hAlign: 0, width: 100, formatter: '@', cellType: 'ellipsisAutoTip'}],
+            ex_calc1: [
+                {title: '计算1|数量', colSpan: '2|1', rowSpan: '1|1', field: 'ex_qty1', hAlign: 2, width: 60, type: 'Number', readOnly: true, aliasFormat: '{%s}|数量'},
+                {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'ex_tp1', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+            ],
+            cur_ex_calc1: [
+                {title: '本期计算1|数量', colSpan: '2|1', rowSpan: '1|1', field: 'ex_stage_qty1', hAlign: 2, width: 60, type: 'Number', aliasFormat: '{%s}|数量'},
+                {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'ex_stage_tp1', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+            ],
+            end_ex_calc1: [
+                {title: '截止本期计量1|数量', colSpan: '2|1', rowSpan: '1|1', field: 'end_ex_stage_qty1', hAlign: 2, width: 60, type: 'Number', readOnly: true, aliasFormat: '{%s}|数量'},
+                {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'end_ex_stage_tp1', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+            ],
         },
         pos: {
             name: [{title: '计量单元', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 180, formatter: '@'}],
@@ -774,6 +843,9 @@ const BaseSpreadColSetting = {
             add_stage_order: [{title: '添加期数', colSpan: '1', rowSpan: '2', field: 'add_stage_order', hAlign:1, width: 80, readOnly: true}],
             gxby: [{title: '工序报验', colSpan: '1', rowSpan: '2', field: 'gxby', hAlign: 0, width: 80, formatter: '@', readOnly: true}],
             dagl: [{title: '档案管理', colSpan: '1', rowSpan: '2', field: 'dagl', hAlign: 0, width: 80, formatter: '@', readOnly: true}],
+            ex_calc1: [{title: '计算1数量', colSpan: '1', rowSpan: '2', field: 'ex_qty1', hAlign: 2, width: 100, type: 'Number', aliasFormat: '{%s}数量'}],
+            cur_ex_calc1: [{title: '本期计量1数量', colSpan: '1', rowSpan: '2', field: 'ex_stage_qty1', hAlign: 2, width: 100, type: 'Number', aliasFormat: '{%s}数量'}],
+            end_ex_calc1: [{title: '截止本期计量1数量', colSpan: '1', rowSpan: '2', field: 'end_ex_stage_qty1', hAlign: 2, width: 100, type: 'Number', readOnly: true, aliasFormat: '{%s}数量'}],
         }
     },
 };

+ 2 - 2
app/controller/ledger_controller.js

@@ -73,11 +73,11 @@ module.exports = app => {
             const ledgerColumn = [
                 'id', 'tender_id', 'ledger_id', 'ledger_pid', 'level', 'order', 'full_path', 'is_leaf',
                 'code', 'b_code', 'name', 'unit', 'unit_price', 'quantity', 'total_price',
-                'sgfh_qty', 'sgfh_expr', 'sgfh_tp', 'memo', 'features', 'drawing_code', 'node_type'];
+                'sgfh_qty', 'sgfh_expr', 'sgfh_tp', 'memo', 'features', 'drawing_code', 'node_type', 'ex_qty1', 'ex_tp1'];
             if (tender.info.display.ledger.deal) ledgerColumn.push('deal_qty', 'deal_tp');
             if (tender.info.display.ledger.dgnQty) ledgerColumn.push('dgn_qty1', 'dgn_qty2');
             if (tender.info.display.ledger.clQty) ledgerColumn.push('sjcl_qty', 'qtcl_qty', 'sjcl_expr', 'qtcl_expr', 'sjcl_tp', 'qtcl_tp');
-            const posColumn = ['id', 'tid', 'lid', 'name', 'position', 'porder', 'sgfh_qty', 'sgfh_expr', 'add_stage_order', 'drawing_code', 'quantity'];
+            const posColumn = ['id', 'tid', 'lid', 'name', 'position', 'porder', 'sgfh_qty', 'sgfh_expr', 'add_stage_order', 'drawing_code', 'quantity', 'ex_qty1'];
             if (tender.info.display.ledger.clQty) posColumn.push('sjcl_qty', 'qtcl_qty', 'sjcl_expr', 'qtcl_expr');
 
             const extraFields = await spreadSetting.getExtraFields(this.ctx, tender.id);

+ 6 - 6
app/controller/stage_controller.js

@@ -274,8 +274,8 @@ module.exports = app => {
                 { data: memoData, fields: this.ledgerMemoColumn, prefix: '', relaId: 'id' },
                 { data: extraData, fields: this.ledgerExtraColumn, prefix: '', relaId: 'id' },
                 { data: importData, fields: ['is_import'], prefix: '', relaId: 'lid' },
-                { data: curStageData, fields: ['contract_qty', 'contract_expr', 'contract_tp', 'qc_qty', 'qc_tp', 'qc_minus_qty', 'postil'], prefix: '', relaId: 'lid' },
-                { data: preStageData, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'qc_minus_qty', 'used'], prefix: 'pre_', relaId: 'lid' },
+                { data: curStageData, fields: ['contract_qty', 'contract_expr', 'contract_tp', 'qc_qty', 'qc_tp', 'qc_minus_qty', 'postil', 'ex_stage_qty1', 'ex_stage_tp1'], prefix: '', relaId: 'lid' },
+                { data: preStageData, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'qc_minus_qty', 'used', 'ex_stage_qty1', 'ex_stage_tp1'], prefix: 'pre_', relaId: 'lid' },
                 { data: pcData, fields: ['contract_pc_tp', 'qc_pc_tp', 'pc_tp', 'org_price'], prefix: '', relaId: 'lid' },
                 { data: changeData, fields: ['qc_qty', 'qc_tp', 'qc_minus_qty'], prefix: 'due_', relaId: 'gcl_id' },
                 { data: settleStatus, fields: ['settle_status'], prefix: '', relaId: 'lid' },
@@ -309,8 +309,8 @@ module.exports = app => {
             this.ctx.helper.assignRelaData(posData, [
                 { data: memoData, fields: this.posMemoColumn, prefix: '', relaId: 'id'},
                 { data: extraData, fields: this.posExtraColumn, prefix: '', relaId: 'id'},
-                { data: curStageData, fields: ['contract_qty', 'contract_expr', 'qc_qty', 'qc_minus_qty', 'postil'], prefix: '', relaId: 'pid' },
-                { data: preStageData, fields: ['contract_qty', 'qc_qty', 'qc_minus_qty'], prefix: 'pre_', relaId: 'pid' },
+                { data: curStageData, fields: ['contract_qty', 'contract_expr', 'qc_qty', 'qc_minus_qty', 'postil', 'ex_stage_qty1'], prefix: '', relaId: 'pid' },
+                { data: preStageData, fields: ['contract_qty', 'qc_qty', 'qc_minus_qty', 'ex_stage_qty1'], prefix: 'pre_', relaId: 'pid' },
                 { data: settleStatus, fields: ['settle_status'], prefix: '', relaId: 'pid' },
             ]);
             return posData;
@@ -561,8 +561,8 @@ module.exports = app => {
                 // 查询截止上期数据
                 const preStageData = ctx.stage.preCheckedStage ? await ctx.service.stagePosFinal.getFinalData(ctx.tender.data, ctx.stage.preCheckedStage.order) : [];
                 this.ctx.helper.assignRelaData(responseData.data, [
-                    { data: curStageData, fields: ['contract_qty', 'qc_qty', 'qc_minus_qty', 'postil'], prefix: '', relaId: 'pid' },
-                    { data: preStageData, fields: ['contract_qty', 'qc_qty', 'qc_minus_qty'], prefix: 'pre_', relaId: 'pid' },
+                    { data: curStageData, fields: ['contract_qty', 'qc_qty', 'qc_minus_qty', 'postil', 'ex_stage_qty1'], prefix: '', relaId: 'pid' },
+                    { data: preStageData, fields: ['contract_qty', 'qc_qty', 'qc_minus_qty', 'ex_stage_qty1'], prefix: 'pre_', relaId: 'pid' },
                 ]);
                 ctx.body = responseData;
             } catch (err) {

+ 4 - 1
app/lib/ledger.js

@@ -1229,6 +1229,7 @@ class reviseTree extends billsTree {
         d.sjcl_tp = helper.mul(d.sjcl_qty, d.unit_price, this.decimal.tp);
         d.qtcl_tp = helper.mul(d.qtcl_qty, d.unit_price, this.decimal.tp);
         d.total_price = helper.mul(d.quantity, d.unit_price, this.decimal.tp);
+        d.ex_tp1 = helper.mul(d.ex_qty1, d.unit_price, this.decimal.tp);
         return true;
     }
     loadDatas(datas) {
@@ -1256,6 +1257,7 @@ class reviseTree extends billsTree {
                     sjcl_qty: 0, sjcl_tp: 0, sjcl_expr: '',
                     qtcl_qty: 0, qtcl_tp: 0, qtcl_expr: '',
                     deal_qty: 0, deal_tp: 0,
+                    ex_qty1: 0, ex_tp1: 0,
                 };
             } else {
                 return {
@@ -1269,7 +1271,8 @@ class reviseTree extends billsTree {
                     sgfh_qty: x.sgfh_qty, sgfh_tp: x.sgfh_tp, sgfh_expr: x.sgfh_expr,
                     sjcl_qty: x.sjcl_qty, sjcl_tp: x.sjcl_tp, sjcl_expr: x.sjcl_expr,
                     qtcl_qty: x.qtcl_qty, qtcl_tp: x.qtcl_tp, qtcl_expr: x.qtcl_expr,
-                    deal_qty: x.deal_qty, deal_tp: x.deal_tp,
+                    _qty: x.deal_qty, deal_tp: x.deal_tp,
+                    ex_qty1: x.ex_qty1, ex_tp1: x.ex_tp1,
                 };
             }
         });

+ 19 - 6
app/public/js/change_revise.js

@@ -10,10 +10,10 @@
 
 const ckBillsSpread = '/tender/' + window.location.pathname.split('/')[2] + '/change/revise-billsSelect';
 const invalidFields = {
-    parent: ['sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'deal_qty', 'deal_tp', 'unit_price'],
+    parent: ['sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'deal_qty', 'deal_tp', 'unit_price', 'ex_qty1', 'ex_tp1'],
     gcl: ['dgn_qty1', 'dgn_qty2'],
     posCode: ['b_code'],
-    posCalc: ['sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp'],
+    posCalc: ['sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'ex_qty1', 'ex_tp1'],
     posXmj: ['code'],
 };
 function getExprInfo (field, converse = false) {
@@ -306,11 +306,13 @@ $(document).ready(() => {
                 let sgfh_qty = 0;
                 let sjcl_qty = 0;
                 let qtcl_qty = 0;
+                let ex_qty1 = 0;
                 camount = 0;
                 for (const np of posData) {
                     sgfh_qty = ZhCalc.add(sgfh_qty, np.sgfh_qty);
                     sjcl_qty = ZhCalc.add(sjcl_qty, np.sjcl_qty);
                     qtcl_qty = ZhCalc.add(qtcl_qty, np.qtcl_qty);
+                    ex_qty1 = ZhCalc.add(ex_qty1, np.ex_qty1);
                     const cInfo = _.find(changeList, { gcl_id: np.lid, mx_id: np.id });
                     camount = cInfo ? ZhCalc.add(camount, ZhCalc.round(cInfo.camount, findDecimal(node.unit))) : camount;
                 }
@@ -318,12 +320,17 @@ $(document).ready(() => {
                     node.sgfh_qty = sgfh_qty;
                     node.sjcl_qty = sjcl_qty;
                     node.qtcl_qty = qtcl_qty;
+                    node.ex_qty1 = ex_qty1;
                     node.quantity = ZhCalc.sum([node.sgfh_qty, node.sjcl_qty, node.qtcl_qty]);
                     node.sgfh_tp = ZhCalc.mul(sgfh_qty, node.unit_price, decimal.tp) || 0;
                     node.sjcl_tp = ZhCalc.mul(sjcl_qty, node.unit_price, decimal.tp) || 0;
                     node.qtcl_tp = ZhCalc.mul(qtcl_qty, node.unit_price, decimal.tp) || 0;
                     node.total_price = ZhCalc.mul(node.quantity, node.unit_price, decimal.tp) || 0;
                 }
+                if (!_.isEqual(node.ex_qty1, ex_qty1)) {
+                    node.ex_qty1 = ex_qty1;
+                    node.ex_tp1 = ZhCalc.mul(node.ex_qty1, node.unit_price, decimal.tp) || 0;
+                }
             }
             node.camount = camount;
             node.ca_tp = ZhCalc.mul(camount, node.unit_price, decimal.tp) || 0;
@@ -909,7 +916,8 @@ $(document).ready(() => {
                 if (isTz) {
                     if (col.field === 'sgfh_qty' || col.field === 'sgfh_tp' ||
                         col.field === 'sjcl_qty' || col.field === 'sjcl_tp' ||
-                        col.field === 'qtcl_qty' || col.field === 'qtcl_tp') {
+                        col.field === 'qtcl_qty' || col.field === 'qtcl_tp' ||
+                        col.field === 'ex_qty1' || col.field === 'ex_tp1') {
                         if (!node.children || node.children.length ===0) {
                             const lPos = pos.getLedgerPos(node.id);
                             if (lPos && lPos.length > 0) {
@@ -1063,7 +1071,8 @@ $(document).ready(() => {
                         if (colSetting.field === 'sgfh_qty' || colSetting.field === 'sgfh_tp' ||
                             colSetting.field === 'sjcl_qty' || colSetting.field === 'sjcl_tp' ||
                             colSetting.field === 'qtcl_qty' || colSetting.field === 'qtcl_tp' ||
-                            colSetting.field === 'camount' || colSetting.field === 'ca_tp') {
+                            colSetting.field === 'camount' || colSetting.field === 'ca_tp' ||
+                            colSetting.field === 'ex_qty1' || colSetting.field === 'ex_tp1') {
                             if (isTz) {
                                 toastMessageUniq(hint.posQty);
                                 continue;
@@ -1236,7 +1245,8 @@ $(document).ready(() => {
                             if (colSetting.field === 'sgfh_qty' || colSetting.field === 'sgfh_tp' ||
                                 colSetting.field === 'sjcl_qty' || colSetting.field === 'sjcl_tp' ||
                                 colSetting.field === 'qtcl_qty' || colSetting.field === 'qtcl_tp' ||
-                                colSetting.field === 'camount' || colSetting.field === 'ca_tp') {
+                                colSetting.field === 'camount' || colSetting.field === 'ca_tp' ||
+                                colSetting.field === 'ex_qty1' || colSetting.field === 'ex_tp1') {
                                 toastMessageUniq(hint.posQty);
                                 continue;
                             }
@@ -1497,6 +1507,8 @@ $(document).ready(() => {
                     case 'qtcl_tp':
                     case 'deal_qty':
                     case 'deal_tp':
+                    case 'ex_qty1':
+                    case 'ex_tp1':
                         info.cancel = (node.children && node.children.length > 0) || node.settle_status === settleStatus.finish;
                         break;
                     case 'dgn_qty1':
@@ -1522,7 +1534,8 @@ $(document).ready(() => {
                         const col = sheet.zh_setting.cols[iCol];
                         if (col.field === 'b_code' || col.field === 'sgfh_qty' || col.field === 'sgfh_tp' ||
                             col.field === 'sjcl_qty' || col.field === 'sjcl_tp' ||
-                            col.field === 'qtcl_qty' || col.field === 'qtcl_tp') {
+                            col.field === 'qtcl_qty' || col.field === 'qtcl_tp' ||
+                            col.field === 'ex_qty1' || col.field === 'ex_tp1') {
                             const lPos = pos.getLedgerPos(node.id);
                             if (lPos && lPos.length > 0) {
                                 toastr.error('不可剪切');

+ 1 - 1
app/public/js/gather_stage.js

@@ -182,7 +182,7 @@ $(document).ready(function () {
                     level: 'level',
                     rootId: -1,
                     keys: ['id', 'tender_id', 'ledger_id'],
-                    calcFields: ['deal_tp', 'sgfh_tp', 'sjcl_tp', 'qtcl_tp', 'total_price', 'contract_tp', 'qc_tp'],
+                    calcFields: ['deal_tp', 'sgfh_tp', 'sjcl_tp', 'qtcl_tp', 'total_price', 'contract_tp', 'qc_tp', 'ex_tp1'],
                     stageId: 'id',
                     updateFields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'],
                 };

+ 25 - 9
app/public/js/ledger.js

@@ -18,10 +18,10 @@ function getTenderId() {
 
 const copyBlockTag = 'zh.calc.copyBlock';
 const invalidFields = {
-    parent: ['sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'deal_qty', 'deal_tp', 'unit_price'],
+    parent: ['sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'deal_qty', 'deal_tp', 'unit_price', 'ex_qty1'],
     gcl: ['dgn_qty1', 'dgn_qty2'],
     posCode: ['b_code'],
-    posCalc: ['sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp'],
+    posCalc: ['sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'ex_tp1'],
     posXmj: ['code'],
 };
 function getExprInfo (field, converse = false) {
@@ -586,7 +586,8 @@ $(document).ready(function() {
                 if (checkTzMeasureType()) {
                     if (col.field === 'sgfh_qty' || col.field === 'sgfh_tp' ||
                         col.field === 'sjcl_qty' || col.field === 'sjcl_tp' ||
-                        col.field === 'qtcl_qty' || col.field === 'qtcl_tp') {
+                        col.field === 'qtcl_qty' || col.field === 'qtcl_tp' ||
+                        col.field === 'ex_qty1' || col.field === 'ex_tp1') {
                         if (!node.children || node.children.length ===0) {
                             const lPos = pos.getLedgerPos(node.id);
                             if (lPos && lPos.length > 0) {
@@ -683,7 +684,8 @@ $(document).ready(function() {
                                 }
                                 if (colSetting.field === 'sgfh_qty' || colSetting.field === 'sgfh_tp' ||
                                     colSetting.field === 'sjcl_qty' || colSetting.field === 'sjcl_tp' ||
-                                    colSetting.field === 'qtcl_qty' || colSetting.field === 'qtcl_tp') {
+                                    colSetting.field === 'qtcl_qty' || colSetting.field === 'qtcl_tp' ||
+                                    colSetting.field === 'ex_qty1' || colSetting.field === 'ex_tp1') {
                                     if (!bHint) {
                                         toastr.warning('清单含有计量单元,数量金额根据计量单元汇总计算所得,不可编辑');
                                         bHint = true;
@@ -861,7 +863,8 @@ $(document).ready(function() {
                             const col = sheet.zh_setting.cols[iCol];
                             if (col.field === 'b_code' || col.field === 'sgfh_qty' || col.field === 'sgfh_tp' ||
                                 col.field === 'sjcl_qty' || col.field === 'sjcl_tp' ||
-                                col.field === 'qtcl_qty' || col.field === 'qtcl_tp') {
+                                col.field === 'qtcl_qty' || col.field === 'qtcl_tp' ||
+                                col.field === 'ex_qty1' || col.field === 'ex_tp1' ) {
                                 const lPos = pos.getLedgerPos(node.id);
                                 if (lPos && lPos.length > 0) {
                                     if (!bHint) {
@@ -970,7 +973,8 @@ $(document).ready(function() {
                         const col = sheet.zh_setting.cols[iCol];
                         if (col.field === 'b_code' || col.field === 'sgfh_qty' || col.field === 'sgfh_tp' ||
                             col.field === 'sjcl_qty' || col.field === 'sjcl_tp' ||
-                            col.field === 'qtcl_qty' || col.field === 'qtcl_tp') {
+                            col.field === 'qtcl_qty' || col.field === 'qtcl_tp' ||
+                            col.field === 'ex_qty1' || col.field === 'ex_tp1' ) {
                             const lPos = pos.getLedgerPos(node.id);
                             if (lPos && lPos.length > 0) {
                                 toastr.error('不可剪切');
@@ -1030,6 +1034,8 @@ $(document).ready(function() {
                 case 'qtcl_tp':
                 case 'deal_qty':
                 case 'deal_tp':
+                case 'ex_qty1':
+                case 'ex_tp1':
                     info.cancel = node.children && node.children.length > 0;
                     break;
                 case 'dgn_qty1':
@@ -1228,7 +1234,8 @@ $(document).ready(function() {
             if (checkTzMeasureType()) {
                 if (field === 'sgfh_qty' || field === 'sgfh_tp' ||
                     field === 'sjcl_qty' || field === 'sjcl_tp' ||
-                    field === 'qtcl_qty' || field === 'qtcl_tp') {
+                    field === 'qtcl_qty' || field === 'qtcl_tp' ||
+                    field === 'ex_qty1' || field === 'ex_tp1') {
                     if (!select.children || select.children.length === 0) {
                         const lPos = pos.getLedgerPos(select.id);
                         if (lPos && lPos.length > 0) {
@@ -4561,7 +4568,7 @@ $(document).ready(function() {
     //     XLSXObj.exportXlsxSheet(setting, data, "台账分解.xlsx");
     // });
     $('#exportLedger').click(function () {
-        const data = [];
+        const data = [], groupData = [];
         const setting = {
             cols: [
                 {title: '项目节编号', colSpan: '1', rowSpan: '1', field: 'code', hAlign: 0, width: 100, formatter: '@'},
@@ -4589,7 +4596,16 @@ $(document).ready(function() {
         const hasCl = ledgerSpreadSetting.cols.find(x => { return x.field === 'sjcl_qty'});
         const qtyF = hasCl ? 'quantity' : 'sgfh_qty';
         const tpF = hasCl ? 'total_price' : 'sgfh_tp';
+        ledgerTree.recursiveExe(function(node) {
+            if (node.children && node.children.length > 0) {
+                node._export_group = _.sum(node.children.map(x => { return x._export_group; })) + node.children.length;
+            } else {
+                const posRange = pos.getLedgerPos(node.id);
+                node._export_group = posRange ? posRange.length : 0;
+            }
+        });
         for (const node of ledgerTree.nodes) {
+            if (node._export_group) groupData.push({ code: node.code, b_code: node.b_code, start: data.length + 1, count: node._export_group });
             data.push({
                 code: node.code, b_code: node.b_code, name: node.name, unit: node.unit,
                 unit_price: node.unit_price, quantity: node[qtyF], total_price: node[tpF],
@@ -4608,7 +4624,7 @@ $(document).ready(function() {
             }
         }
 
-        SpreadExcelObj.exportSimpleXlsxSheet(setting, data, "台账分解.xlsx");
+        SpreadExcelObj.exportSimpleXlsxSheet(setting, data, "台账分解.xlsx", groupData);
     });
     $('#sync-ledger').click(function () {
         postData(syncLedgerUrl, {}, function (result) {

+ 13 - 0
app/public/js/path_tree.js

@@ -1036,6 +1036,18 @@ const createNewPathTree = function (type, setting) {
             }
             return false;
         }
+        recursiveExe(fun) {
+            if (!fun) return;
+
+            const _recursive = function(children) {
+                if (!children || children.length === 0) return;
+                for (const c of children) {
+                    _recursive(c.children);
+                    fun(c);
+                }
+            };
+            _recursive(this.children);
+        }
     }
 
     class MeasureTree extends BaseTree {
@@ -1347,6 +1359,7 @@ const createNewPathTree = function (type, setting) {
             d.sjcl_tp = ZhCalc.mul(d.sjcl_qty, d.unit_price, this.decimal.tp);
             d.qtcl_tp = ZhCalc.mul(d.qtcl_qty, d.unit_price, this.decimal.tp);
             d.total_price = ZhCalc.mul(d.quantity, d.unit_price, this.decimal.tp);
+            d.ex_tp1 = ZhCalc.mul(d.ex_qty1, d.unit_price, this.decimal.tp);
             return true;
         }
         loadDatas(datas) {

+ 9 - 1
app/public/js/shares/export_excel.js

@@ -75,12 +75,20 @@ const SpreadExcelObj = (function() {
         SpreadJsObj.endMassOperation(sheet);
     };
 
-    const exportSimpleXlsxSheet = function (setting, data, file) {
+    const exportXlsxSheetGroup = function(sheet, setting, group) {
+        if (!group) return;
+        for (const g of group) {
+            sheet.rowOutlines.group(g.start + (setting.headRows || 0), g.count);
+        }
+    };
+
+    const exportSimpleXlsxSheet = function (setting, data, file, group) {
         const div = _createHideSpread();
 
         const spread = SpreadJsObj.createNewSpread(div, true);
         const sheet = spread.getActiveSheet();
         exportSimpleXlsxSheetData(sheet, setting, data);
+        exportXlsxSheetGroup(sheet, setting, group);
 
         const excelIo = new GC.Spread.Excel.IO();
         const sJson = JSON.stringify(spread.toJSON());

+ 13 - 7
app/public/js/stage.js

@@ -303,10 +303,10 @@ $(document).ready(() => {
         markExpandSubKey: window.location.pathname.split('/')[2],
     };
     // 台账树结构计算相关设置
-    stageTreeSetting.updateFields = ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'qc_minus_qty', 'postil', 'used', 'contract_expr'];
+    stageTreeSetting.updateFields = ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'qc_minus_qty', 'postil', 'used', 'contract_expr', 'ex_stage_qty1', 'ex_stage_tp1'];
     stageTreeSetting.calcFields = ['deal_tp', 'total_price', 'contract_tp', 'qc_tp', 'gather_tp', 'contract_pc_tp', 'qc_pc_tp', 'pc_tp',
         'pre_contract_tp', 'pre_qc_tp', 'pre_gather_tp', 'end_contract_tp', 'end_qc_tp', 'end_gather_tp', 'end_correct_tp',
-        'final_1_tp', 'end_final_1_tp', 'due_qc_tp', 'due_final_tp'];
+        'final_1_tp', 'end_final_1_tp', 'due_qc_tp', 'due_final_tp', 'ex_stage_tp1', 'end_ex_stage_tp1'];
     stageTreeSetting.calcFun = function (node) {
         if (!node.children || node.children.length === 0) {
             node.pre_gather_qty = ZhCalc.add(node.pre_contract_qty, node.pre_qc_qty);
@@ -320,6 +320,7 @@ $(document).ready(() => {
             node.deal_final_1_qty = ZhCalc.add(node.end_qc_minus_qty, node.deal_qty);
             node.end_final_1_qty = ZhCalc.add(node.end_qc_qty, node.final_1_qty);
             node.due_final_qty = ZhCalc.add(node.quantity, node.due_qc_qty);
+            node.end_ex_stage_qty1 = ZhCalc.add(node.ex_stage_qty1, node.pre_ex_stage_qty1);
         }
         node.pre_gather_tp = ZhCalc.add(node.pre_contract_tp, node.pre_qc_tp);
         node.gather_tp = ZhCalc.sum([node.contract_tp, node.qc_tp, node.pc_tp]);
@@ -329,6 +330,7 @@ $(document).ready(() => {
         node.end_final_tp = ZhCalc.add(node.end_qc_tp, node.total_price);
         node.end_final_1_tp = ZhCalc.add(node.end_qc_tp, node.final_1_tp);
         node.due_final_tp = ZhCalc.add(node.quantity, node.due_qc_tp);
+        node.end_ex_stage_tp1 = ZhCalc.add(node.ex_stage_tp1, node.pre_ex_stage_tp1);
         if (!node.children || node.children.length === 0) {
             if (node.end_contract_qty) {
                 node.end_correct_tp = ZhCalc.add(node.end_qc_tp, ZhCalc.mul(node.end_contract_qty, node.unit_price, tenderInfo.decimal.tp));
@@ -346,7 +348,7 @@ $(document).ready(() => {
     // 初始化 计量单元 数据结构
     const stagePosSetting = {
         id: 'id', ledgerId: 'lid',
-        updateFields: ['contract_qty', 'qc_qty', 'qc_minus_qty', 'postil', 'contract_expr'],
+        updateFields: ['contract_qty', 'qc_qty', 'qc_minus_qty', 'postil', 'contract_expr', 'ex_stage_qty1'],
     };
     stagePosSetting.calcFun = function (pos) {
         pos.pre_gather_qty = ZhCalc.add(pos.pre_contract_qty, pos.pre_qc_qty);
@@ -363,6 +365,7 @@ $(document).ready(() => {
         pos.final_1_qty = ZhCalc.add(pos.end_qc_minus_qty, pos.quantity);
         pos.deal_final_1_qty = ZhCalc.add(pos.end_qc_minus_qty, pos.deal_qty);
         pos.end_final_1_qty = ZhCalc.add(pos.end_qc_qty, pos.final_1_qty);
+        pos.end_ex_stage_qty1 = ZhCalc.add(pos.pre_ex_stage_qty1, pos.ex_stage_qty_1)
     };
     const stagePos = new StagePosData(stagePosSetting);
 
@@ -1142,7 +1145,7 @@ $(document).ready(() => {
                                 mainData[colSetting.field] = null;
                                 filterMain = false;
                             } else {
-                                data[colSetting.field] = null;
+                                data[colSetting.field] = colSetting.type === 'Number' ? 0 : '';
                                 const exprInfo = getExprInfo(colSetting.field);
                                 if (exprInfo) {
                                     data[exprInfo.expr] = '';
@@ -1177,7 +1180,7 @@ $(document).ready(() => {
             if (info.sheet.zh_setting) {
                 const setting = info.sheet.zh_setting;
                 const range = info.cellRange;
-                const validField = ['contract_qty', 'contract_tp', 'qc_qty', 'qc_minus_qty', 'postil'].concat(['memo', 'ex_memo1', 'ex_memo2', 'ex_memo3'], setting.dgnUpFields);
+                const validField = ['contract_qty', 'contract_tp', 'qc_qty', 'qc_minus_qty', 'postil', 'ex_stage_qty1', 'ex_stage_tp1'].concat(['memo', 'ex_memo1', 'ex_memo2', 'ex_memo3'], setting.dgnUpFields);
                 for (let iCol = range.col; iCol < range.col + range.colCount; iCol++) {
                     const col = info.sheet.zh_setting.cols[iCol];
                     if ((validField.indexOf(col.field) === -1)) {
@@ -1352,6 +1355,9 @@ $(document).ready(() => {
                 case 'qc_minus_qty':
                     info.cancel = node.is_tp || node.settle_status === settleStatus.finish;
                     break;
+                case 'ex_stage_qty1':
+                    info.cancel = node.is_tp;
+                    break;
                 case 'contract_tp':
                     info.cancel = !node.is_tp || node.settle_status === settleStatus.finish;
                     break;
@@ -1403,7 +1409,7 @@ $(document).ready(() => {
                         info.sheet.endEdit(true);
                     }
 
-                    if (!checkZero(node.contract_qty) || !checkZero(node.contract_tp)) {
+                    if (!checkZero(node.contract_qty) || !checkZero(node.contract_tp) || !checkZero(node.ex_stage_qty1) || !checkZero(node.ex_stage_tp1)) {
                         $.msgBox({
                             id: 'calc-type',
                             title: '提示',
@@ -2199,7 +2205,7 @@ $(document).ready(() => {
             if (info.sheet.zh_setting) {
                 const sortData = info.sheet.zh_data;
                 const range = info.cellRange;
-                const validField = ['contract_qty', 'contract_expr', 'postil', 'real_qty', 'ex_memo1', 'ex_memo2', 'ex_memo3'];
+                const validField = ['contract_qty', 'contract_expr', 'postil', 'real_qty', 'ex_memo1', 'ex_memo2', 'ex_memo3', 'ex_stage_qty1'];
                 if (!checkTzMeasureType()) {
                     validField.push('name', 'sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'position', 'drawing_code');
                 }

+ 1 - 0
app/public/js/stage_gather.js

@@ -402,6 +402,7 @@ $(document).ready(function () {
                         contract_qty: xmj.contract_qty, qc_qty: xmj.qc_qty, gather_qty: xmj.gather_qty,
                         end_contract_qty: xmj.end_contract_qty, end_qc_qty: xmj.end_qc_qty,
                         end_gather_qty: xmj.end_gather_qty, end_gather_percent: xmj.end_gather_percent,
+                        qc_minus_qty: xmj.qc_minus_qty, end_qc_minus_qty: xmj.end_qc_minus_qty,
                         dwgc: xmj.dwgc, fbgc: xmj.fbgc, fxgc: xmj.fxgc,
                         jldy: xmj.jldy, bwmx: xmj.bwmx, drawing_code: xmj.drawing_code,
                         end_final_1_percent: xmj.end_final_1_percent,

+ 28 - 23
app/service/change_ledger.js

@@ -22,10 +22,10 @@ const keyFields = {
 };
 // 以下字段仅可通过树结构操作改变,不可直接通过update方式从接口提交,发现时过滤
 const readOnlyFields = ['id', 'tender_id', 'ledger_id', 'ledger_pid', 'order', 'level', 'full_path', 'is_leaf'];
-const calcFields = ['unit_price', 'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'deal_qty', 'deal_tp', 'dgn_qty1', 'dgn_qty2'];
+const calcFields = ['unit_price', 'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'deal_qty', 'deal_tp', 'dgn_qty1', 'dgn_qty2', 'ex_qty1', 'ex_tp1'];
 const upFields = ['unit_price'];
-const qtyFields = ['sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'quantity', 'deal_qty'];
-const tpFields = ['sgfh_tp', 'sjcl_tp', 'qtcl_tp', 'total_price', 'deal_tp'];
+const qtyFields = ['sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'quantity', 'deal_qty', 'ex_qty1'];
+const tpFields = ['sgfh_tp', 'sjcl_tp', 'qtcl_tp', 'total_price', 'deal_tp', 'ex_tp1'];
 const rootId = -1;
 const keyPre = 'tender_node_maxId:';
 const measureType = require('../const/tender').measureType;
@@ -712,17 +712,13 @@ module.exports = app => {
                     await this.transaction.update(this.tableName, {
                         id: selectData.id,
                         is_leaf: false,
-                        unit_price: null,
-                        sgfh_qty: null,
-                        sgfh_tp: null,
-                        sjcl_qty: null,
-                        sjcl_tp: null,
-                        qtcl_qty: null,
-                        qtcl_tp: null,
-                        quantity: null,
-                        total_price: null,
-                        deal_qty: null,
-                        deal_tp: null,
+                        unit_price: 0,
+                        sgfh_qty: 0, sgfh_tp: 0,
+                        sjcl_qty: 0, sjcl_tp: 0,
+                        qtcl_qty: 0, qtcl_tp: 0,
+                        quantity: 0, total_price: 0,
+                        deal_qty: 0, deal_tp: 0,
+                        ex_qty1: 0, ex_tp1: 0,
                     });
                 }
                 const order = lastChild ? lastChild.order : 0;
@@ -1263,9 +1259,11 @@ module.exports = app => {
                             this._calcExpr(newPos, 'qtcl_qty', pos.qtcl_expr, pos.qtcl_qty, precision);
                             newPos.quantity = this.ctx.helper.add(newPos.sgfh_qty,
                                 this.ctx.helper.add(newPos.sjcl_qty, newPos.qtcl_qty));
+                            newPos.ex_qty1 = this.ctx.helper.round(pos.ex_qty1, precision.value);
                             newBills.sgfh_qty = this.ctx.helper.add(newBills.sgfh_qty, newPos.sgfh_qty);
                             newBills.sjcl_qty = this.ctx.helper.add(newBills.sjcl_qty, newPos.sjcl_qty);
                             newBills.qtcl_qty = this.ctx.helper.add(newBills.qtcl_qty, newPos.qtcl_qty);
+                            newBills.ex_qty1 = this.ctx.helper.add(newBills.ex_qty1, newPos.ex_qty1);
                             if (defaultData) this.ctx.helper._.assignIn(newPos, defaultData);
                             pastePosData.push(newPos);
                         }
@@ -1273,6 +1271,7 @@ module.exports = app => {
                         this._calcExpr(newBills, 'sgfh_qty', newBills.sgfh_expr, d.sgfh_qty, precision);
                         this._calcExpr(newBills, 'sjcl_qty', newBills.sjcl_expr, d.sjcl_qty, precision);
                         this._calcExpr(newBills, 'qtcl_qty', newBills.qtcl_expr, d.qtcl_qty, precision);
+                        newBills.ex_qty1 = this.ctx.helper.round(d.ex_qty1, precision.value);
                     }
                     newBills.quantity = this.ctx.helper.add(newBills.sgfh_qty,
                         this.ctx.helper.add(newBills.sjcl_qty, newBills.qtcl_qty));
@@ -1281,6 +1280,7 @@ module.exports = app => {
                     newBills.qtcl_tp = this.ctx.helper.mul(newBills.sjcl_qty, newBills.unit_price, tpDecimal);
                     newBills.total_price = this.ctx.helper.mul(newBills.quantity, newBills.unit_price, tpDecimal);
                     newBills.deal_tp = this.ctx.helper.mul(newBills.deal_qty, newBills.unit_price, tpDecimal);
+                    newBills.ex_tp1 = this.ctx.helper.mul(newBills.ex_qty1, newBills.unit_price, tpDecimal);
                     if (defaultData) this.ctx.helper._.assignIn(newBills, defaultData);
                     pbd.push(newBills);
                 }
@@ -1385,8 +1385,8 @@ module.exports = app => {
                     await this.transaction.update(this.tableName,
                         {
                             is_leaf: false,
-                            sgfh_qty: null, sgfh_tp: null, qtcl_qty: null, qtcl_tp: null, sjcl_qty: null, sjcl_tp: null,
-                            quantity: null, unit_price: null, total_price: null, deal_qty: null, deal_tp: null
+                            sgfh_qty: 0, sgfh_tp: 0, qtcl_qty: 0, qtcl_tp: 0, sjcl_qty: 0, sjcl_tp: 0,
+                            quantity: 0, unit_price: 0, total_price: 0, deal_qty: 0, deal_tp: 0, ex_qty1: 0, ex_tp1: 0,
                         },
                         { where: {tender_id: tenderId, ledger_id: selectData.ledger_id} });
                 } else if (!selectData.ccid && children.length === 0) {
@@ -1671,6 +1671,7 @@ module.exports = app => {
                         if (row.sjcl_qty === undefined) { row.sjcl_qty = updateNode.sjcl_qty; }
                         if (row.qtcl_qty === undefined) { row.qtcl_qty = updateNode.qtcl_qty; }
                         if (row.deal_qty === undefined) { row.deal_qty = updateNode.deal_qty; }
+                        if (row.ex_qty1 === undefined) { row.ex_qty1 = updateNode.ex_qty1; }
                     }
 
                     // 项目节、工程量清单相关
@@ -1693,34 +1694,38 @@ module.exports = app => {
                         if (row.unit_price === undefined) calcData.unit_price = updateNode.unit_price;
                         // 计算
                         if (row.sgfh_qty !== undefined || row.sjcl_qty !== undefined || row.qtcl_qty !== undefined ||
-                            row.deal_qty !== undefined || row.unit_price) {
+                            row.deal_qty !== undefined || row.ex_qty1 !== undefined || row.unit_price) {
                             if (row.sgfh_qty === undefined) calcData.sgfh_qty = updateNode.sgfh_qty;
                             if (row.sjcl_qty === undefined) calcData.sjcl_qty = updateNode.sjcl_qty;
                             if (row.qtcl_qty === undefined) calcData.qtcl_qty = updateNode.qtcl_qty;
                             if (row.deal_qty === undefined) calcData.deal_qty = updateNode.deal_qty;
+                            if (row.ex_qty1 === undefined) calcData.ex_qty1 = updateNode.ex_qty1;
                             calcData.quantity = helper.sum([calcData.sgfh_qty, calcData.sjcl_qty, calcData.qtcl_qty]);
                             calcData.sgfh_tp = helper.mul(calcData.sgfh_qty, calcData.unit_price, info.decimal.tp);
                             calcData.sjcl_tp = helper.mul(calcData.sjcl_qty, calcData.unit_price, info.decimal.tp);
                             calcData.qtcl_tp = helper.mul(calcData.qtcl_qty, calcData.unit_price, info.decimal.tp);
                             calcData.total_price = helper.mul(calcData.quantity, calcData.unit_price, info.decimal.tp);
                             calcData.deal_tp = helper.mul(calcData.deal_qty, calcData.unit_price, info.decimal.tp);
-                        } else if (row.sgfh_tp !== undefined || row.sjcl_tp !== undefined || row.qtcl_tp !== undefined || row.deal_tp !== undefined) {
-                            calcData.sgfh_qty = null;
-                            calcData.sjcl_qty = null;
-                            calcData.qtcl_qty = null;
-                            calcData.quantity = null;
-                            calcData.deal_qty = null;
+                            calcData.ex_tp1 = helper.mul(calcData.ex_qty1, calcData.unit_price, info.decimal.tp);
+                        } else if (row.sgfh_tp !== undefined || row.sjcl_tp !== undefined || row.qtcl_tp !== undefined || row.deal_tp !== undefined || row.ex_qty1 !== undefined) {
+                            calcData.sgfh_qty = 0;
+                            calcData.sjcl_qty = 0;
+                            calcData.qtcl_qty = 0;
+                            calcData.quantity = 0;
+                            calcData.deal_qty = 0;
                             calcData.sgfh_tp = helper.round(row.sgfh_tp !== undefined ? calcData.row.sgfh_tp : updateNode.sgfh_tp, info.decimal.tp);
                             calcData.sjcl_tp = helper.round(row.sgfh_tp !== undefined ? calcData.row.sjcl_tp : updateNode.sjcl_tp, info.decimal.tp);
                             calcData.qtcl_tp = helper.round(row.sgfh_tp !== undefined ? calcData.row.qtcl_tp : updateNode.qtcl_tp, info.decimal.tp);
                             calcData.total_price = helper.sum([calcData.sgfh_tp, calcData.sjcl_tp, calcData.qtcl_tp]);
                             calcData.deal_tp = helper.round(row.deal_tp !== undefined ? calcData.row.deal_tp : updateNode.deal_tp, info.decimal.tp);
+                            calcData.ex_tp1 = helper.round(row.ex_tp1 !== undefined ? calcData.row.ex_tp1 : updateNode.ex_tp1, info.decimal.tp);
                         } else if (row.unit_price !== undefined) {
                             calcData.sgfh_tp = helper.mul(calcData.sgfh_qty, calcData.unit_price, info.decimal.tp);
                             calcData.sjcl_tp = helper.mul(calcData.sjcl_qty, calcData.unit_price, info.decimal.tp);
                             calcData.qtcl_tp = helper.mul(calcData.qtcl_qty, calcData.unit_price, info.decimal.tp);
                             calcData.total_price = helper.mul(calcData.quantity, calcData.unit_price, info.decimal.tp);
                             calcData.deal_tp = helper.mul(calcData.deal_qty, calcData.unit_price, info.decimal.tp);
+                            calcData.ex_tp1 = helper.mul(calcData.ex_qty1, calcData.unit_price, info.decimal.tp);
                         }
                         updateData = this._filterUpdateInvalidField(updateNode.id, calcData);
                     } else {

+ 10 - 9
app/service/ledger.js

@@ -22,10 +22,10 @@ const keyFields = {
 };
 // 以下字段仅可通过树结构操作改变,不可直接通过update方式从接口提交,发现时过滤
 const readOnlyFields = ['id', 'tender_id', 'ledger_id', 'ledger_pid', 'order', 'level', 'full_path', 'is_leaf'];
-const calcFields = ['unit_price', 'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'deal_qty', 'deal_tp', 'dgn_qty1', 'dgn_qty2'];
+const calcFields = ['unit_price', 'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'deal_qty', 'deal_tp', 'dgn_qty1', 'dgn_qty2', 'ex_qty1', 'ex_tp1'];
 const upFields = ['unit_price'];
-const qtyFields = ['sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'quantity', 'deal_qty'];
-const tpFields = ['sgfh_tp', 'sjcl_tp', 'qtcl_tp', 'total_price', 'deal_tp'];
+const qtyFields = ['sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'quantity', 'deal_qty', 'ex_qty1'];
+const tpFields = ['sgfh_tp', 'sjcl_tp', 'qtcl_tp', 'total_price', 'deal_tp', 'ex_tp1'];
 const rootId = -1;
 const keyPre = 'tender_node_maxId:';
 const measureType = require('../const/tender').measureType;
@@ -553,12 +553,13 @@ module.exports = app => {
                     await this.transaction.update(this.tableName, {
                         id: selectData.id,
                         is_leaf: false,
-                        unit_price: null,
-                        sgfh_qty: null, sgfh_tp: null,
-                        sjcl_qty: null, sjcl_tp: null,
-                        qtcl_qty: null, qtcl_tp: null,
-                        quantity: null, total_price: null,
-                        deal_qty: null, deal_tp: null,
+                        unit_price: 0,
+                        sgfh_qty: 0, sgfh_tp: 0,
+                        sjcl_qty: 0, sjcl_tp: 0,
+                        qtcl_qty: 0, qtcl_tp: 0,
+                        quantity: 0, total_price: 0,
+                        deal_qty: 0, deal_tp: 0,
+                        ex_qty1: 0, ex_tp1: 0,
                     });
                 }
                 await this.transaction.insert(this.tableName, insertBillsData);

+ 6 - 6
app/service/ledger_revise.js

@@ -114,12 +114,12 @@ module.exports = app => {
             const sql = 'Insert Into ' + this.ctx.service.reviseBills.tableName +
                 '  (id, code, b_code, name, unit, source, remark, ledger_id, ledger_pid, level, `order`, full_path, is_leaf,' +
                 '     quantity, total_price, unit_price, drawing_code, memo, features, dgn_qty1, dgn_qty2, deal_qty, deal_tp,' +
-                '     sgfh_qty, sgfh_tp, sjcl_qty, sjcl_tp, qtcl_qty, qtcl_tp, node_type, crid, ccid, tender_id,' +
+                '     sgfh_qty, sgfh_tp, sjcl_qty, sjcl_tp, qtcl_qty, qtcl_tp, ex_qty1, ex_tp1, node_type, crid, ccid, tender_id,' +
                 '     sgfh_expr, sjcl_expr, qtcl_expr, check_calc,' +
                 '     ex_memo1, ex_memo2, ex_memo3)' +
                 '  Select id, code, b_code, name, unit, source, remark, ledger_id, ledger_pid, level, `order`, full_path, is_leaf,' +
                 '      quantity, total_price, unit_price, drawing_code, memo, features, dgn_qty1, dgn_qty2, deal_qty, deal_tp,' +
-                '      sgfh_qty, sgfh_tp, sjcl_qty, sjcl_tp, qtcl_qty, qtcl_tp, node_type, crid, ccid, tender_id,' +
+                '      sgfh_qty, sgfh_tp, sjcl_qty, sjcl_tp, qtcl_qty, qtcl_tp, ex_qty1, ex_tp1, node_type, crid, ccid, tender_id,' +
                 '      sgfh_expr, sjcl_expr, qtcl_expr, 0,' +
                 '      ex_memo1, ex_memo2, ex_memo3' +
                 '  From ' + this.ctx.service.ledger.tableName +
@@ -131,12 +131,12 @@ module.exports = app => {
         async _initRevisePos(transaction, tid) {
             const sql = 'Insert Into ' + this.ctx.service.revisePos.tableName +
                 '  (id, tid, lid, name, drawing_code, quantity, add_stage, add_stage_order, add_times, add_user,' +
-                '     sgfh_qty, sjcl_qty, qtcl_qty, crid, ccid, in_time, porder, position,' +
-                '     sgfh_expr, sjcl_expr, qtcl_expr, real_qty,' +
+                '     sgfh_qty, sjcl_qty, qtcl_qty, ex_qty1, crid, ccid, in_time, porder, position,' +
+                '     sgfh_expr, sjcl_expr, qtcl_expr, real_qty, ex_qty1,' +
                 '     ex_memo1, ex_memo2, ex_memo3)' +
                 '  Select id, tid, lid, name, drawing_code, quantity, add_stage, add_stage_order, add_times, add_user,' +
-                '     sgfh_qty, sjcl_qty, qtcl_qty, crid, ccid, in_time, porder, position,' +
-                '     sgfh_expr, sjcl_expr, qtcl_expr, real_qty,' +
+                '     sgfh_qty, sjcl_qty, qtcl_qty, ex_qty1, crid, ccid, in_time, porder, position,' +
+                '     sgfh_expr, sjcl_expr, qtcl_expr, real_qty, ex_qty1' +
                 '     ex_memo1, ex_memo2, ex_memo3' +
                 '  From ' + this.ctx.service.pos.tableName +
                 '  Where `tid` = ?';

+ 7 - 5
app/service/revise_bills.js

@@ -120,11 +120,13 @@ module.exports = app => {
                     await this.transaction.update(this.tableName, {
                         id: select.id,
                         is_leaf: false,
-                        unit_price: null,
-                        quantity: null,
-                        total_price: null,
-                        deal_qty: null,
-                        deal_tp: null,
+                        unit_price: 0,
+                        quantity: 0, total_price: 0,
+                        deal_qty: 0, deal_tp: 0,
+                        sgfh_qty: 0, sgfh_tp: 0,
+                        sjcl_qty: 0, sjcl_tp: 0,
+                        qtcl_qty: 0, qtcl_tp: 0,
+                        ex_qty1: 0, ex_tp1: 0,
                     });
                 }
                 // 数据库创建新增节点数据

+ 25 - 7
app/service/stage_bills.js

@@ -190,8 +190,13 @@ module.exports = app => {
                 data.negative_qc_qty = this.round(data.negative_qc_qty, precision.value);
                 data.negative_qc_tp = this.ctx.helper.mul(data.negative_qc_qty, ledgerData.unit_price, info.decimal.tp);
             }
-            if (ledgerData.is_tp && data.contract_tp !== undefined) {
-                data.contract_tp = this.ctx.helper.round(data.contract_tp, info.decimal.tp);
+            if (data.ex_stage_qty1 !== undefined) {
+                data.ex_stage_qty1 = this.round(data.ex_stage_qty1, precision.value);
+                data.ex_stage_tp1 = this.ctx.helper.mul(data.ex_stage_qty1, ledgerData.unit_price, info.decimal.tp);
+            }
+            if (ledgerData.is_tp) {
+                if (data.contract_tp !== undefined) data.contract_tp = this.ctx.helper.round(data.contract_tp, info.decimal.tp);
+                if (data.ex_stage_tp1 !== undefined) data.ex_stage_tp1 = this.ctx.helper.round(data.ex_stage_tp1, info.decimal.tp);
             }
         }
 
@@ -214,6 +219,8 @@ module.exports = app => {
                 d.positive_qc_qty = orgData.positive_qc_qty;
                 d.negative_qc_qty = orgData.negative_qc_qty;
                 d.postil = orgData.postil;
+                d.ex_stage_qty1 = orgData.ex_stage_qty1;
+                d.ex_stage_tp1 = orgData.ex_stage_tp1;
             }
             const precision = this.ctx.helper.findPrecision(this.ctx.tender.info.precision, ledgerData.unit);
 
@@ -237,11 +244,16 @@ module.exports = app => {
             if (insertData.qc_minus_qty !== undefined) {
                 d.qc_minus_qty = insertData.qc_minus_qty ? this.round(insertData.qc_minus_qty, precision.value) : 0;
             }
+            if (insertData.ex_stage_qty1 !== undefined) {
+                d.ex_stage_qty1 = this.round(insertData.ex_stage_qty1, precision.value);
+                d.ex_stage_tp1 = this.ctx.helper.mul(d.ex_stage_qty1, ledgerData.unit_price, info.decimal.tp);
+            }
             if (insertData.postil) {
                 d.postil = insertData.postil;
             }
-            if (ledgerData.is_tp && insertData.contract_tp !== undefined) {
-                d.contract_tp = this.ctx.helper.round(insertData.contract_tp, info.decimal.tp);
+            if (ledgerData.is_tp) {
+                if (insertData.contract_tp !== undefined) d.contract_tp = this.ctx.helper.round(insertData.contract_tp, info.decimal.tp);
+                if (insertData.ex_stage_tp1 !== undefined) d.ex_stage_tp1 = this.ctx.helper.round(insertData.ex_stage_tp1, info.decimal.tp);
             }
             await transaction.insert(this.tableName, d);
         }
@@ -287,7 +299,9 @@ module.exports = app => {
         async updateStageBillsQty(transaction, ledgerBills, stageBills, data) {
             if (stageBills) {
                 if ((data.contract_qty === undefined || stageBills.contract_qty !== data.contract_qty) ||
-                    (data.qc_qty === undefined || stageBills.qc_qty !== data.qc_qty)) {
+                    (data.qc_qty === undefined || stageBills.qc_qty !== data.qc_qty) ||
+                    (data.ex_stage_qty1 === undefined || stageBills.ex_stage_qty1 !== data.ex_stage_qty1)
+                ) {
                     if (stageBills.times === this.ctx.stage.curTimes && stageBills.order === this.ctx.stage.curOrder) {
                         data.id = stageBills.id;
                         data.said = this.ctx.session.sessionUser.accountId;
@@ -338,8 +352,12 @@ module.exports = app => {
                 posGather.negative_qc_qty = this.round(posGather.negative_qc_qty, precision.value);
                 posGather.negative_qc_tp = this.ctx.helper.mul(posGather.negative_qc_qty, ledgerBills.unit_price, info.decimal.tp);
             }
+            if (posGather.ex_stage_qty1 !== undefined) {
+                posGather.ex_stage_qty1 = this.round(posGather.ex_stage_qty1, precision.value);
+                posGather.ex_stage_tp1 = this.ctx.helper.mul(posGather.ex_stage_qty1, ledgerBills.unit_price, info.decimal.tp);
+            }
             if (stageBills) {
-                if (stageBills.contract_qty === posGather.contract_qty && stageBills.qc_qty === posGather.qc_qty && stageBills.qc_minus_qty === posGather.qc_minus_qty) {
+                if (stageBills.contract_qty === posGather.contract_qty && stageBills.qc_qty === posGather.qc_qty && stageBills.qc_minus_qty === posGather.qc_minus_qty && stageBills.ex_stage_qty1 === posGather.ex_stage_qty1) {
                     return;
                 }
                 if (stageBills.times === this.ctx.stage.curTimes && stageBills.order === this.ctx.stage.curOrder) {
@@ -357,7 +375,7 @@ module.exports = app => {
         async updateStageBillsCalcType(data) {
             const stageBills = await this.getLastestStageData2(this.ctx.tender.id, this.ctx.stage.id, data.id);
             const le = await this.ctx.service.ledgerExtra.getDataById(data.id);
-            const updateData = { contract_qty: null, contract_tp: null };
+            const updateData = { contract_qty: 0, contract_tp: 0, ex_stage_qty1: 0, ex_stage_tp1: 0 };
 
             const transaction = await this.db.beginTransaction();
             try {

+ 3 - 0
app/service/stage_bills_final.js

@@ -102,6 +102,9 @@ module.exports = app => {
                     c.negative_qc_tp = this.ctx.helper.add(c.negative_qc_tp, p.negative_qc_tp);
                     c.used = p.used || !this.ctx.helper.checkZero(c.contract_qty) || !this.ctx.helper.checkZero(c.qc_qty)
                         || !this.ctx.helper.checkZero(c.contract_tp) || ! this.ctx.helper.checkZero(c.qc_minus_qty);
+
+                    c.ex_stage_qty1 = this.ctx.helper.add(c.ex_stage_qty1, p.ex_stage_qty1);
+                    c.ex_stage_tp1 = this.ctx.helper.add(c.ex_stage_tp1, p.ex_stage_tp1);
                     pre.splice(pre.indexOf(p), 1);
                 } else {
                     c.used = !this.ctx.helper.checkZero(c.contract_qty) || !this.ctx.helper.checkZero(c.qc_qty)

+ 26 - 55
app/service/stage_pos.js

@@ -23,7 +23,7 @@ module.exports = app => {
             super(ctx);
             this.depart = ctx.app.config.table_depart.heavy;
             this.tableName = 'stage_pos';
-            this.qtyFields = ['contract_qty', 'qc_qty', 'qc_minus_qty', 'positive_qc_qty', 'negative_qc_qty']
+            this.qtyFields = ['contract_qty', 'qc_qty', 'qc_minus_qty', 'positive_qc_qty', 'negative_qc_qty', 'ex_stage_qty1']
         }
 
         _getPosFilterSql(where, asTable = '') {
@@ -46,49 +46,6 @@ module.exports = app => {
             return whereSql;
         }
 
-        /**
-         * 查询期计量最后审核人数据
-         * @param {Number} tid - 标段id
-         * @param {Number} sid - 期id
-         * @param {Number|Array} pid - 部位明细id(可以为空)
-         * @returns {Promise<*>}
-         */
-        // async getLastestStageData(tid, sid, where) {
-        //     const filterSql = this._getPosFilterSql(where);
-        //     const sql = 'SELECT Pos.id, Pos.tid, Pos.sid, Pos.lid, Pos.pid, Pos.contract_qty, Pos.qc_qty, Pos.postil, Pos.times, Pos.order, Pos.contract_expr FROM ' +
-        //         '  (SELECT * FROM ' + this.tableName + ' WHERE tid = ? And sid = ?) As Pos ' +
-        //         '  INNER JOIN ( ' +
-        //         '    SELECT MAX(`times` * ' + timesLen + ' + `order`) As `flow`, `tid`, `sid`, `pid` From ' + this.tableName +
-        //         '      WHERE `tid` = ? And sid = ?' + filterSql +
-        //         '      GROUP BY `pid`' +
-        //         '  ) As MaxFilter ' +
-        //         '  ON (Pos.times * ' + timesLen + ' + Pos.order) = MaxFilter.flow And Pos.pid = MaxFilter.pid And Pos.sid = MaxFilter.sid';
-        //     const sqlParam = [tid, sid, tid, sid];
-        //     return await this.db.query(sql, sqlParam);
-        // }
-        /**
-         * 查询 某期 某轮审批 某审核人数据
-         * @param {Number} tid - 标段id
-         * @param {Number} sid - 期id
-         * @param {Number} times - 期第几轮审批
-         * @param {Number} order - 审核人顺序
-         * @param {Number|Array|Null} pid - 部位明细id - 为空则查询全部
-         * @returns {Promise<*>}
-         */
-        // async getAuditorStageData(tid, sid, times, order, where) {
-        //     const filterSql = this._getPosFilterSql(where);
-        //     const sql = 'SELECT Pos.id, Pos.tid, Pos.sid, Pos.pid, Pos.lid, Pos.contract_qty, Pos.qc_qty, Pos.postil, Pos.times, Pos.order, Pos.contract_expr FROM ' +
-        //         '  (SELECT * FROM '+ this.tableName + ' WHERE tid = ? And sid = ?) As Pos ' +
-        //         '  INNER JOIN ( ' +
-        //         '    SELECT MAX(`times` * ' + timesLen + ' + `order`) As `flow`, `pid`, `sid` From ' + this.tableName +
-        //         '      WHERE (`times` < ? OR (`times` = ? AND `order` <= ?)) And tid = ? And sid = ?' + filterSql +
-        //         '      GROUP BY `pid`' +
-        //         '  ) As MaxFilter ' +
-        //         '  ON (Pos.times * ' + timesLen + ' + Pos.order) = MaxFilter.flow And Pos.pid = MaxFilter.pid And Pos.sid = MaxFilter.sid';
-        //     const sqlParam = [tid, sid, times, times, order, tid, sid];
-        //     return await this.db.query(sql, sqlParam);
-        // }
-
         _filterLastestData(stagePos) {
             const stagePosIndex = {};
             for (const sp of stagePos) {
@@ -108,7 +65,7 @@ module.exports = app => {
         }
         async getLastestStageData2(tid, sid, where) {
             const filterSql = this._getPosFilterSql(where);
-            const sql = 'SELECT id, tid, sid, pid, lid, contract_qty, qc_qty, qc_minus_qty, positive_qc_qty, negative_qc_qty, postil, `times`, `order`, `contract_expr`' +
+            const sql = 'SELECT id, tid, sid, pid, lid, contract_qty, qc_qty, qc_minus_qty, positive_qc_qty, negative_qc_qty, postil, `times`, `order`, `contract_expr`, ex_stage_qty1' +
                 '  FROM ' + this.departTableName(tid) +
                 '  WHERE tid = ? And sid = ? ' + filterSql;
             const sqlParam = [tid, sid];
@@ -117,7 +74,7 @@ module.exports = app => {
         }
         async getAuditorStageData2(tid, sid, times, order, where) {
             const filterSql = this._getPosFilterSql(where);
-            const sql = 'SELECT id, tid, sid, pid, lid, contract_qty, qc_qty, qc_minus_qty, positive_qc_qty, negative_qc_qty, postil, `times`, `order`, `contract_expr`' +
+            const sql = 'SELECT id, tid, sid, pid, lid, contract_qty, qc_qty, qc_minus_qty, positive_qc_qty, negative_qc_qty, postil, `times`, `order`, `contract_expr`, ex_stage_qty1' +
                 '  FROM ' + this.departTableName(tid) +
                 '  WHERE tid = ? And sid = ? And (`times` < ? OR (`times` = ? AND `order` <= ?)) ' + filterSql;
             const sqlParam = [tid, sid, times, times, order];
@@ -172,7 +129,9 @@ module.exports = app => {
             const datas = data instanceof Array ? data : [data], calcStageBills = [];
 
             if (datas[0].sgfh_qty !== undefined || datas[0].sjcl_qty !== undefined || datas[0].qtcl_qty !== undefined
-                || datas[0].contract_qty !== undefined || datas[0].qc_qty !== undefined || datas[0].real_qty !== undefined) {
+                || datas[0].contract_qty !== undefined || datas[0].qc_qty !== undefined || datas[0].real_qty !== undefined
+                || datas[0].ex_qty1 !== undefined || datas[0].ex_stage_qty1 !== undefined
+            ) {
                 bills = await this.ctx.service.ledger.getDataById(datas[0].lid);
                 precision = this.ctx.helper.findPrecision(this.ctx.tender.info.precision, bills.unit);
                 result.ledger.push(bills.id);
@@ -186,8 +145,10 @@ module.exports = app => {
                     add_times: this.ctx.stage.curTimes,
                     add_user: this.ctx.session.sessionUser.accountId,
                 };
-                if (d.sgfh_qty !== undefined || d.sjcl_qty !== undefined || d.qtcl_qty !== undefined ||
-                    d.sgfh_expr !== undefined || d.sjcl_expr !== undefined || d.qtcl_expr !== undefined) {
+                if (d.sgfh_qty !== undefined || d.sjcl_qty !== undefined || d.qtcl_qty !== undefined
+                    || d.sgfh_expr !== undefined || d.sjcl_expr !== undefined || d.qtcl_expr !== undefined
+                    || d.ex_qty1 !== undefined
+                ) {
                     if (d.sgfh_qty!== undefined) p.sgfh_qty = this.round(d.sgfh_qty, precision.value);
                     if (d.sjcl_qty!== undefined) p.sjcl_qty = this.round(d.sjcl_qty, precision.value);
                     if (d.qtcl_qty!== undefined) p.qtcl_qty = this.round(d.qtcl_qty, precision.value);
@@ -195,12 +156,13 @@ module.exports = app => {
                     if (d.sjcl_expr !== undefined) p.sjcl_expr = d.sjcl_expr;
                     if (d.qtcl_expr !== undefined) p.qtcl_expr = d.qtcl_expr;
                     p.quantity = this.ctx.helper.sum([p.sgfh_qty, p.sjcl_qty, p.qtcl_qty]);
+                    if (d.ex_qty1!== undefined) p.ex_qty1 = this.round(d.ex_qty1, precision.value);
                 }
                 if (d.real_qty!== undefined) p.real_qty = this.round(d.real_qty, precision.value);
                 insertPos.push(p);
                 result.pos.push(p.id);
 
-                if (d.contract_qty!== undefined || d.qc_qty!== undefined || d.postil!== undefined || data.contract_expr !== undefined) {
+                if (d.contract_qty!== undefined || d.qc_qty!== undefined || d.postil!== undefined || data.contract_expr !== undefined || d.ex_stage_qty1 !== undefined) {
                     result.stageUpdate = true;
                     const ps = {
                         pid: p.id,
@@ -214,8 +176,9 @@ module.exports = app => {
                     if (d.contract_qty !== undefined) ps.contract_qty = this.round(d.contract_qty, precision.value);
                     if (d.contract_expr !== undefined) ps.contract_expr = d.contract_expr;
                     if (d.postil!== undefined) ps.postil = d.postil;
+                    if (d.ex_stage_qty1 !== undefined) ps.ex_stage_qty1 = this.round(d.ex_stage_qty1, precision.value);
                     insertPosStage.push(ps);
-                    if (d.contract_qty && calcStageBills.indexOf(ps.lid) === -1) {
+                    if ((d.contract_qty || d.ex_stage_qty1) && calcStageBills.indexOf(ps.lid) === -1) {
                         calcStageBills.push(ps.lid);
                     }
                 }
@@ -254,7 +217,9 @@ module.exports = app => {
                 {pid: this._.map(datas, 'pid')});
 
             if (datas[0].sgfh_qty !== undefined || datas[0].qtcl_qty !== undefined || datas[0].sjcl_qty !== undefined
-                || datas[0].contract_qty !== undefined || datas[0].qc_qty !== undefined || datas[0].real_qty !== undefined) {
+                || datas[0].contract_qty !== undefined || datas[0].qc_qty !== undefined || datas[0].real_qty !== undefined
+                || datas[0].ex_qty1 !== undefined || datas[0].ex_stage_qty1 !== undefined
+            ) {
                 bills = await this.ctx.service.ledger.getDataById(datas[0].lid);
                 precision = this.ctx.helper.findPrecision(this.ctx.tender.info.precision, bills.unit);
                 result.ledger.push(bills.id);
@@ -263,7 +228,7 @@ module.exports = app => {
             for (const d of datas) {
                 if (d.name !== undefined || d.drawing_code !== undefined || d.position !== undefined
                     || d.sgfh_qty !== undefined || d.qtcl_qty !== undefined || d.sjcl_qty !== undefined
-                    || d.real_qty !== undefined
+                    || d.real_qty !== undefined || d.ex_qty1 !== undefined
                     || d.ex_memo1 !== undefined || d.ex_memo2 !== undefined || d.ex_memo3 !== undefined
                 ) {
                     const op = this._.find(orgPos, {id: d.pid});
@@ -275,7 +240,7 @@ module.exports = app => {
                     const p = {id: op.id};
                     if (d.name !== undefined) p.name = d.name;
                     if (d.position !== undefined) p.position = d.position;
-                    if (d.sgfh_qty !== undefined || d.qtcl_qty !== undefined || d.sjcl_qty !== undefined) {
+                    if (d.sgfh_qty !== undefined || d.qtcl_qty !== undefined || d.sjcl_qty !== undefined || d.ex_qty1 !== undefined) {
                         p.sgfh_qty = d.sgfh_qty !== undefined ? this.ctx.helper.round(d.sgfh_qty, precision.value) : op.sgfh_qty;
                         p.sjcl_qty = d.sjcl_qty !== undefined ? this.ctx.helper.round(d.sjcl_qty, precision.value) : op.sjcl_qty;
                         p.qtcl_qty = d.qtcl_qty !== undefined ? this.ctx.helper.round(d.qtcl_qty, precision.value) : op.qtcl_qty;
@@ -283,6 +248,7 @@ module.exports = app => {
                         if (d.sjcl_expr !== undefined) p.sjcl_expr = d.sjcl_expr;
                         if (d.qtcl_expr !== undefined) p.qtcl_expr = d.qtcl_expr;
                         p.quantity = this.ctx.helper.sum([p.sgfh_qty, p.sjcl_qty, p.qtcl_qty]);
+                        p.ex_qty1 = d.ex_qty1 !== undefined ? this.ctx.helper.round(d.ex_qty1, precision.value) : op.ex_qty1;
                         if (!updateBills) updateBills = {id: bills.id};
                     }
                     if (d.drawing_code !== undefined) p.drawing_code = d.drawing_code;
@@ -293,7 +259,7 @@ module.exports = app => {
                     updatePos.push(p);
                 }
 
-                if (d.contract_qty !== undefined || d.qc_qty !== undefined || d.postil !== undefined) {
+                if (d.contract_qty !== undefined || d.qc_qty !== undefined || d.postil !== undefined || d.ex_stage_qty1 !== undefined) {
                     const osp = this._.find(orgStagePos, function (p) { return p.pid === d.pid; });
                     if (osp && osp.times === this.ctx.stage.curTimes && osp.order === this.ctx.stage.curOrder) {
                         const sp = { id: osp.id, said: this.ctx.session.sessionUser.accountId };
@@ -307,6 +273,7 @@ module.exports = app => {
                         if (d.postil !== undefined) {
                             sp.postil = d.postil;
                         }
+                        if (d.ex_stage_qty1 !== undefined) sp.ex_stage_qty1 = this.ctx.helper.round(d.ex_stage_qty1, precision.value);
                         updatePosStage.push(sp);
                     } else {
                         const sp = {
@@ -329,6 +296,9 @@ module.exports = app => {
                         if (d.postil || osp) {
                             sp.postil = d.postil === undefined && osp ? osp.postil : d.postil;
                         }
+                        if (d.ex_stage_qty1 || osp) {
+                            sp.ex_stage_qty1 = d.ex_stage_qty1 === undefined && osp ? osp.ex_stage_qty1 : d.ex_stage_qty1;
+                        }
                         sp.qc_minus_qty = osp ? osp.qc_minus_qty : 0;
                         sp.positive_qc_qty = osp ? osp.positive_qc_qty : 0;
                         sp.negative_qc_qty = osp ? osp.negative_qc_qty : 0;
@@ -594,6 +564,7 @@ module.exports = app => {
                     qc_minus_qty: noValue ? qty : (orgPos ? orgPos.qc_minus_qty : 0),
                     positive_qc_qty: !noValue ? positiveQty : (orgPos ? orgPos.positive_qc_qty : 0),
                     negative_qc_qty: !noValue ? negativeQty : (orgPos ? orgPos.negative_qc_qty : 0),
+                    ex_stage_qty1: orgPos ? orgPos.ex_stage_qty1 : 0,
                 });
             }
             await this.ctx.service.stageBills.calc(this.ctx.tender.id, this.ctx.stage.id, pos.lid, transaction);

+ 1 - 0
app/service/stage_pos_final.js

@@ -77,6 +77,7 @@ module.exports = app => {
                     c.positive_qc_qty = this.ctx.helper.add(c.positive_qc_qty, p.positive_qc_qty);
                     c.negative_qc_qty = this.ctx.helper.add(c.negative_qc_qty, p.negative_qc_qty);
                     c.used = p.used || !this.ctx.helper.checkZero(c.contract_qty) || !this.ctx.helper.checkZero(c.qc_qty) || !this.ctx.helper.checkZero(c.qc_minus_qty);
+                    c.ex_stage_qty1 = this.ctx.helper.add(c.ex_stage_qty1, p.ex_stage_qty1);
                     pre.splice(pre.indexOf(p), 1);
                 } else {
                     c.used = !this.ctx.helper.checkZero(c.contract_qty) || !this.ctx.helper.checkZero(c.qc_qty) || !this.ctx.helper.checkZero(c.qc_minus_qty);

+ 13 - 10
app/service/tender_info.js

@@ -171,7 +171,7 @@ module.exports = app => {
 
             if (changeUnits.length > 0 && billsService && posService) {
                 const bills = await billsService.getAllDataByCondition({
-                    columns: ['id', 'unit', 'unit_price', 'sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'deal_qty'],
+                    columns: ['id', 'unit', 'unit_price', 'sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'deal_qty', 'ex_qty1'],
                     where: { tender_id: tenderId, unit: changeUnits, is_leaf: true },
                 });
                 const pos = changeUnits.length > 0 ? await posService.getPosDataByUnits(tenderId, changeUnits) : [];
@@ -180,25 +180,24 @@ module.exports = app => {
                     const precision = this.ctx.helper.findPrecision(newPrecision, b.unit);
                     const bPos = this._.filter(pos, { lid: b.id });
                     if (bPos.length > 0) {
-                        let sgfh_qty = 0,
-                            sjcl_qty = 0,
-                            qtcl_qty = 0,
-                            quantity = 0;
+                        let sgfh_qty = 0, sjcl_qty = 0, qtcl_qty = 0, quantity = 0, ex_qty1 = 0;
                         for (const p of bPos) {
-                            this.ctx.helper.checkFieldPrecision(p, ['sgfh_qty', 'sjcl_qty', 'qtcl_qty'], precision.value);
+                            this.ctx.helper.checkFieldPrecision(p, ['sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'ex_qty1'], precision.value);
                             p.quantity = this.ctx.helper.add(this.ctx.helper.add(p.sgfh_qty, p.sjcl_qty), p.qtcl_qty);
                             sgfh_qty = this.ctx.helper.add(sgfh_qty, p.sgfh_qty);
                             sjcl_qty = this.ctx.helper.add(sjcl_qty, p.sjcl_qty);
                             qtcl_qty = this.ctx.helper.add(qtcl_qty, p.qtcl_qty);
                             quantity = this.ctx.helper.add(quantity, p.quantity);
+                            ex_qty1 = this.ctx.helper.add(quantity, p.ex_qty1);
                         }
                         b.sgfh_qty = sgfh_qty;
                         b.sjcl_qty = sjcl_qty;
                         b.qtcl_qty = qtcl_qty;
                         b.quantity = quantity;
+                        b.ex_qty1 = ex_qty1;
                         // this.ctx.helper.checkFieldPrecision(b, ['deal_qty'], precision.value);
                     } else {
-                        this.ctx.helper.checkFieldPrecision(b, ['sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'deal_qty'], precision.value);
+                        this.ctx.helper.checkFieldPrecision(b, ['sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'deal_qty', 'ex_qty1'], precision.value);
                     }
                     b.quantity = this.ctx.helper.add(this.ctx.helper.add(b.sgfh_qty, b.sjcl_qty), b.qtcl_qty);
                     b.sgfh_tp = this.ctx.helper.mul(b.sgfh_qty, b.unit_price, decimal.tp);
@@ -206,6 +205,7 @@ module.exports = app => {
                     b.qtcl_tp = this.ctx.helper.mul(b.qtcl_qty, b.unit_price, decimal.tp);
                     b.deal_tp = this.ctx.helper.mul(b.deal_qty, b.unit_price, decimal.tp);
                     b.total_price = this.ctx.helper.mul(b.quantity, b.unit_price, decimal.tp);
+                    b.ex_tp1 = this.ctx.helper.mul(b.ex_qty1, b.unit_price, decimal.tp);
                 }
 
                 const transaction = await this.db.beginTransaction();
@@ -232,7 +232,7 @@ module.exports = app => {
             const calcUp = newDecimal.up < oldDecimal.up, calcTp = newDecimal.tp !== oldDecimal.tp;
             if (calcUp || calcTp) {
                 const bills = await billsService.getAllDataByCondition({
-                    columns: ['id', 'unit_price', 'sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'deal_qty', 'quantity'],
+                    columns: ['id', 'unit_price', 'sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'deal_qty', 'quantity', 'ex_qty1'],
                     where: { tender_id: tenderId, is_leaf: true },
                 });
                 for (const b of bills) {
@@ -243,6 +243,7 @@ module.exports = app => {
                     cb.qtcl_tp = this.ctx.helper.mul(b.qtcl_qty, cb.unit_price, newDecimal.tp);
                     cb.deal_tp = this.ctx.helper.mul(b.deal_qty, cb.unit_price, newDecimal.tp);
                     cb.total_price = this.ctx.helper.mul(b.quantity, cb.unit_price, newDecimal.tp);
+                    cb.ex_tp1 = this.ctx.helper.mul(b.ex_qty1, cb.unit_price, newDecimal.tp);
                     changeBills.push(cb);
                 }
             }
@@ -265,11 +266,12 @@ module.exports = app => {
                     if (!b) continue;
                     const contract_tp = this.ctx.helper.mul(b.unit_price, sb.contract_qty, newDecimal.tp);
                     const qc_tp = this.ctx.helper.mul(b.unit_price, sb.qc_qty, newDecimal.tp);
-                    if (contract_tp == sb.contract_tp && qc_tp === sb.qc_tp) continue;
+                    const ex_stage_tp1 = this.ctx.helper.mul(b.unit_price, sb.ex_stage_qty1, newDecimal.tp);
+                    if (contract_tp == sb.contract_tp && qc_tp === sb.qc_tp && ex_stage_tp1 === sb.ex_stage_tp1) continue;
 
                     if (sb.times === stage.times && sb.order === 0) {
                         updateStageBills.push({
-                            id: sb.id, contract_tp, qc_tp
+                            id: sb.id, contract_tp, qc_tp, ex_stage_tp1,
                         });
                     } else {
                         insertStageBills.push({
@@ -277,6 +279,7 @@ module.exports = app => {
                             times: stage.times, order: 0,
                             contract_qty: sb.contract_qty, contract_expr: sb.contract_expr, contract_tp,
                             qc_qty: sb.qc_qty, qc_tp,
+                            ex_stage_qty1: sb.ex_stage_qty1, ex_stage_tp1,
                             postil: sb.postil,
                         });
                     }

Разница между файлами не показана из-за своего большого размера
+ 2016 - 0
sql/update.sql