浏览代码

Merge branch 'dev' of http://192.168.1.41:3000/maixinrong/Calculation into dev

TonyKang 3 年之前
父节点
当前提交
050888faba

+ 2 - 2
app/controller/change_controller.js

@@ -332,7 +332,7 @@ module.exports = app => {
                     auditList,
                     changeList,
                     tpUnit: change.tp_decimal ? change.tp_decimal : ctx.tender.info.decimal.tp,
-                    upUnit: ctx.tender.info.decimal.up,
+                    upUnit: change.up_decimal ? change.up_decimal : ctx.tender.info.decimal.up,
                     authMobile: auth_mobile,
                     shenpiConst,
                 };
@@ -598,7 +598,7 @@ module.exports = app => {
                     whiteList,
                     auditList,
                     tpUnit: change.tp_decimal ? change.tp_decimal : ctx.tender.info.decimal.tp,
-                    upUnit: ctx.tender.info.decimal.up,
+                    upUnit: change.up_decimal ? change.up_decimal : ctx.tender.info.decimal.up,
                     authMobile: auth_mobile,
                     shenpiConst,
                     jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.change.information),

+ 25 - 14
app/controller/ledger_controller.js

@@ -90,23 +90,11 @@ module.exports = app => {
                     }
                 }
             }
-            function setColFormat(cols, field, formatter) {
-                const col = _.find(cols, function(c) {
-                    return c.field === field;
-                });
-                col.formatter = formatter;
-            }
-            // const tpFormatter = this.ctx.helper.getNumberFormatter(this.ctx.tender.info.decimal.tp);
-            // const upFormatter = this.ctx.helper.getNumberFormatter(this.ctx.tender.info.decimal.up);
             const tender = this.ctx.tender;
             const setting = tender.data.measure_type === measureType.tz.value
                 ? (tender.info.display.ledger.clQty ? spreadConst.withCl : spreadConst.withoutCl)
                 : (tender.info.display.ledger.clQty ? spreadConst.withClGcl : spreadConst.withoutClGcl);
             const ledger = JSON.parse(JSON.stringify(setting.ledger));
-            // setColFormat(ledger.cols, 'unit_price', upFormatter);
-            // setColFormat(ledger.cols, 'dgn_price', upFormatter);
-            // setColFormat(ledger.cols, 'total_price', tpFormatter);
-            // setColFormat(ledger.cols, 'deal_tp', tpFormatter);
             const pos = setting.pos ? JSON.parse(JSON.stringify(setting.pos)) : spreadConst.blank;
 
             if (this._ledgerReadOnly(tender.data)) {
@@ -123,6 +111,26 @@ module.exports = app => {
             return [ledger, pos];
         }
 
+        _getLedgerColumn(sjsRela) {
+            const tender = this.ctx.tender;
+            const ledgerColumn = [
+                'id', 'tender_id', 'ledger_id', 'ledger_pid', 'level', 'order', 'full_path', 'is_leaf',
+                'code', 'b_code', 'name', 'unit', 'unit_price',
+                'sgfh_qty', 'sgfh_expr', 'sgfh_tp', 'memo', 'drawing_code'];
+            if (tender.data.measureType === measureType.gcl.value) 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', 'quantity', 'total_price');
+            const posColumn = ['id', 'tid', 'lid', 'name', 'position', 'porder', 'sjcl_qty', 'sjcl_expr', 'add_stage_order'];
+            if (tender.info.display.ledger.clQty) posColumn.push('sjcl_qty', 'qtcl_qty', 'sjcl_expr', 'qtcl_expr', 'quantity');
+            for (const field of sjsRela.ledgerCol) {
+                if (field.show) {
+                    ledgerColumn.push(field.field);
+                    posColumn.push(field.field);
+                }
+            }
+            return [ledgerColumn, posColumn];
+        }
+
         /**
          * 台账分解页面 (Get)
          *
@@ -473,15 +481,18 @@ module.exports = app => {
          */
         async loadExplodeData(ctx) {
             try {
+                const sjsRela = await this.ctx.service.project.getSjsRela(ctx.session.sessionProject.id);
+                const [ledgerColumn, posColumn] = this._getLedgerColumn(sjsRela);
                 const ledgerData = ctx.tender.ledgerReadOnly && ctx.tender.his
                     ? await ctx.helper.loadLedgerDataFromOss(ctx.tender.his.bills_file)
-                    : await ctx.service.ledger.getData(ctx.tender.id);
+                    : await ctx.service.ledger.getAllDataByCondition({ columns: ledgerColumn, where: { tender_id: ctx.tender.id } });
                 const posData = this.ctx.tender.data.measure_type === measureType.tz.value
                     ? (ctx.tender.ledgerReadOnly && ctx.tender.his
                         ? await ctx.helper.loadLedgerDataFromOss(ctx.tender.his.pos_file)
-                        : await ctx.service.pos.getPosData({tid: ctx.tender.id}))
+                        : await ctx.service.pos.getPosData({tid: ctx.tender.id}, posColumn))
                     : [];
                 const ledgerTags = await this.ctx.service.ledgerTag.getDatas(ctx.tender.id);
+                //ctx.body = { err: 0, msg: '', data: { bills: this.ctx.helper.hpackArr(ledgerData), pos: this.ctx.helper.hpackArr(posData), tags: ledgerTags }, hpack: ['bills', 'pos'] };
                 ctx.body = { err: 0, msg: '', data: { bills: ledgerData, pos: posData, tags: ledgerTags } };
             } catch (err) {
                 this.log(err);

+ 0 - 1
app/controller/material_controller.js

@@ -560,7 +560,6 @@ module.exports = app => {
                 }
                 const newDecimalUp = parseInt(data.up);
                 const newDecimalTp = parseInt(data.tp);
-                console.log(newDecimalUp, newDecimalTp);
                 if (ctx.app._.isNaN(newDecimalUp) || newDecimalUp > 6 || newDecimalUp < 0) {
                     throw '单价小数位数设置不能大于6或小于0';
                 }

+ 48 - 8
app/controller/stage_controller.js

@@ -233,10 +233,37 @@ module.exports = app => {
             return surplus;
         }
 
-        async _getStageLedgerData(ctx) {
+        _getLedgerColumn(sjsRela) {
+            const tender = this.ctx.tender;
+            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', 'memo', 'drawing_code'];
+            if (this.ctx.session.sessionProject.gxby) ledgerColumn.push('gxby_status', 'gxby_url', 'gxby_limit');
+            if (this.ctx.session.sessionProject.dagl) ledgerColumn.push('dagl_status', 'dagl_url', 'dagl_limit');
+            if (tender.data.measureType === measureType.gcl.value) ledgerColumn.push('deal_qty', 'deal_tp', 'sjcl_qty', 'sjcl_expr', 'sjcl_tp');
+            if (tender.info.display.ledger.dgnQty) ledgerColumn.push('dgn_qty1', 'dgn_qty2');
+            const posColumn = ['id', 'tid', 'lid', 'name', 'position', 'porder', 'quantity'];
+            if (tender.info.display.stage.realComplete) posColumn.push('real_qty');
+            if (this.ctx.session.sessionProject.gxby) posColumn.push('gxby_status', 'gxby_url', 'gxby_limit');
+            if (this.ctx.session.sessionProject.dagl) posColumn.push('dagl_status', 'dagl_url', 'dagl_limit');
+            if (tender.data.measureType === measureType.gcl.value) ledgerColumn.push('sjcl_qty', 'sjcl_expr');
+            for (const field of sjsRela.ledgerCol) {
+                if (field.show) {
+                    ledgerColumn.push(field.field);
+                    posColumn.push(field.field);
+                }
+            }
+            return [ledgerColumn, posColumn];
+        }
+
+        async _getStageLedgerData(ctx, ledgerColumn) {
+            // const ledgerData = ctx.stage.ledgerHis
+            //     ? await ctx.helper.loadLedgerDataFromOss(ctx.stage.ledgerHis.bills_file)
+            //     : await ctx.service.ledger.getAllDataByCondition({ where: { tender_id: ctx.tender.id } });
             const ledgerData = ctx.stage.ledgerHis
                 ? await ctx.helper.loadLedgerDataFromOss(ctx.stage.ledgerHis.bills_file)
-                : await ctx.service.ledger.getData(ctx.tender.id);
+                : await ctx.service.ledger.getAllDataByCondition({ columns: ledgerColumn, where: { tender_id: ctx.tender.id } });
             const dgnData = await ctx.service.stageBillsDgn.getDgnData(ctx.tender.id);
             for (const d of dgnData) {
                 const l = ctx.app._.find(ledgerData, { id: d.id });
@@ -266,10 +293,11 @@ module.exports = app => {
             ]);
             return ledgerData;
         }
-        async _getStagePosData(ctx) {
+        async _getStagePosData(ctx, posColumn) {
             let curStageData,
                 preStageData;
-            const posData = await ctx.service.pos.getPosDataWithAddStageOrder({ tid: ctx.tender.id });
+            // const posData = await ctx.service.pos.getAllDataByCondition({ where: { tid: ctx.tender.id } });
+            const posData = await ctx.service.pos.getAllDataByCondition({ columns: posColumn, where: { tid: ctx.tender.id } });
             // 根据当前人,或指定对象查询数据
             // console.time('cur');
             if (ctx.stage.readOnly) {
@@ -313,21 +341,33 @@ module.exports = app => {
                 return await ctx.service.stageChange.getAuditorAllStageData(ctx.tender.id, ctx.stage.id, ctx.stage.curTimes, ctx.stage.curOrder);
             }
             return await ctx.service.stageChange.getLastestAllStageData(ctx.tender.id, ctx.stage.id);
-
         }
 
         async getStageData(ctx) {
             try {
                 const data = JSON.parse(ctx.request.body.data);
                 const filter = data.filter.split(';');
-                const responseData = { err: 0, msg: '', data: {} };
+                const responseData = { err: 0, msg: '', data: {}, hpack: [] };
+                const hpack = true;
+                const sjsRela = await this.ctx.service.project.getSjsRela(ctx.session.sessionProject.id);
+                const [ledgerColumn, posColumn] = this._getLedgerColumn(sjsRela);
                 for (const f of filter) {
                     switch (f) {
                         case 'ledger':
-                            responseData.data.ledgerData = await this._getStageLedgerData(ctx);
+                            if (hpack) {
+                                responseData.hpack.push('ledgerData');
+                                responseData.data.ledgerData = this.ctx.helper.hpackArr(await this._getStageLedgerData(ctx, ledgerColumn));
+                            } else {
+                                responseData.data.ledgerData = await this._getStageLedgerData(ctx, ledgerColumn);
+                            }
                             break;
                         case 'pos':
-                            responseData.data.posData = await this._getStagePosData(ctx);
+                            if (hpack) {
+                                responseData.hpack.push('posData');
+                                responseData.data.posData = this.ctx.helper.hpackArr(await this._getStagePosData(ctx, posColumn));
+                            } else {
+                                responseData.data.posData = await this._getStagePosData(ctx, posColumn);
+                            }
                             break;
                         case 'detail':
                             responseData.data.detailData = await this._getStageDetailData(ctx);

+ 20 - 3
app/extend/helper.js

@@ -473,7 +473,6 @@ module.exports = {
             return this.mul(this.div(num, 100, 0), 100) + '';
         }
         return '10000';
-
     },
 
     /**
@@ -748,7 +747,7 @@ module.exports = {
      * @return {*}
      */
     round(value, decimal) {
-        return value ? new Decimal(value).toDecimalPlaces(decimal).toNumber() : 0;
+        return value ? new Decimal(value.toString()).toDecimalPlaces(decimal).toNumber() : 0;
     },
     /**
      * 汇总
@@ -1316,7 +1315,7 @@ module.exports = {
 
     calcExpr(expr) {
         const validExpr = expr.replace('=', '').replace('%', '/100');
-        return math.eval(validExpr);
+        return parseFloat(math.eval(validExpr));
     },
 
     /**
@@ -1479,4 +1478,22 @@ module.exports = {
         const result = JSON.parse(File.content);
         return result;
     },
+
+    hpackArr(data) {
+        const keyIndex = {}, key = [];
+        const result = [];
+        for (const d of data) {
+            const r = [];
+            for (const prop in d) {
+                if (keyIndex[prop] === undefined) {
+                    key.push(prop);
+                    keyIndex[prop] = key.indexOf(prop);
+                }
+                r[keyIndex[prop]] = d[prop];
+            }
+            result.push(r);
+        }
+        if (result.length > 0) result.unshift(key);
+        return result;
+    }
 };

+ 1 - 1
app/lib/material_calc.js

@@ -52,7 +52,7 @@ class MaterialCalculate {
                     formula = formula.replace(p, v);
                 }
             }
-            const value = math.eval(formula);
+            const value = parseFloat(math.eval(formula));
             return value;
         } catch (err) {
             return 0;

+ 2 - 3
app/lib/rpt_data_analysis.js

@@ -157,7 +157,7 @@ const rdaUtils = {
                         expr = expr.replace(m.match, m.value[f] ? m.value[f] : 0);
                     }
                     try {
-                        c[f] = ctx.helper.round(math.eval(expr), 6);
+                        c[f] = ctx.helper.round(parseFloat(math.eval(expr)), 6);
                     } catch (err) {
                     }
                 }
@@ -556,7 +556,7 @@ const gatherChapter = {
                         expr = expr.replace(m.match, m.value[f] ? m.value[f] : 0);
                     }
                     try {
-                        c[f] = ctx.helper.round(math.eval(expr), 6);
+                        c[f] = ctx.helper.round(parseFloat(math.eval(expr), 6));
                     } catch (err) {
                     }
                 }
@@ -662,7 +662,6 @@ const gatherChapter = {
             return (x.visible !== undefined && x.visible !== null) ? x.visible : true;
 
         });
-        console.log(data[fieldsKey[0].table]);
     },
 };
 const join = {

+ 26 - 0
app/public/js/global.js

@@ -243,6 +243,11 @@ const postData = function (url, data, successCallback, errorCallBack, showWaitin
         },
         success: function(result){
             if (result.err === 0) {
+                if (result.hpack) {
+                    result.hpack.forEach(x => {
+                        result.data[x] = hpackArrBack(result.data[x]);
+                    });
+                }
                 if (successCallback) {
                     successCallback(result.data);
                 }
@@ -1107,3 +1112,24 @@ function transFormToChinese(num) {
     if (noWan.toString().length < 4) noWan = "0" + noWan;
     return overWan ? getWan(overWan) + "万" + getWan(noWan) : getWan(num);
 }
+
+function hpackArrBack(data) {
+    if (data.length === 0) return data;
+    if (data.length === 1) throw '数据错误';
+    const result = [];
+    //const keyIndex = {};
+    // data[0].forEach((x, i) => {
+    //     keyIndex[x] = i;
+    // });
+    const key = data[0];
+    data.forEach((d, i) => {
+        if (i === 0) return;
+        const obj = {};
+        d.forEach((v, j) => {
+            if (v === undefined) return;
+            obj[key[j]] = v;
+        });
+        result.push(obj);
+    });
+    return result;
+}

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

@@ -337,7 +337,7 @@ const createNewPathTree = function (type, setting) {
             });
             for (const data of datas) {
                 const keyName = itemsPre + data[this.setting.id];
-                if (this.items[keyName]) throw '数据错误';
+                if (this.items[keyName]) continue;
 
                 const item = JSON.parse(JSON.stringify(data));
                 item.children = [];

+ 1 - 7
app/public/js/revise_compare.js

@@ -94,14 +94,8 @@ $(document).ready(() => {
                     sameId.org_parent = parent;
                 }
                 return sameId;
-            } else {
-                const siblings = parent ? parent.children : tree.children;
-                return siblings.find(function (x) {
-                    return node.b_code
-                        ? x.b_code === node.b_code && x.name === node.name && x.unit === node.unit && x.unit_price === node.unit_price
-                        : x.code === node.code && x.name === node.name;
-                });
             }
+            return null;
         },
         loadInfo1: function (node, sourceNode, source) {
             for (const f of billsCompareField) {

+ 1 - 1
app/router.js

@@ -602,7 +602,7 @@ module.exports = app => {
 
     // 书签
     app.post('/tender/:id/ledger/tag', sessionAuth, tenderCheck, uncheckTenderCheck, 'tenderController.billsTag');
-    app.post('/tender/:id/revise/info/tag', sessionAuth, tenderCheck, uncheckTenderCheck, reviseCheck, 'tenderController.billsTag');
+    app.post('/tender/:id/revise/:rid/info/tag', sessionAuth, tenderCheck, uncheckTenderCheck, reviseCheck, 'tenderController.billsTag');
     app.post('/tender/:id/measure/stage/:order/tag', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'tenderController.billsTag');
 
     // 总分包

+ 7 - 2
app/service/change.js

@@ -105,7 +105,8 @@ module.exports = app => {
                     in_time: new Date(),
                     code,
                     name,
-                    tp_decimal: this.ctx.tender.info.decimal.tp,
+                    // tp_decimal: this.ctx.tender.info.decimal.tp,
+                    // up_decimal: this.ctx.tender.info.decimal.up,
                 };
                 const operate = await this.transaction.insert(this.tableName, change);
 
@@ -626,7 +627,7 @@ module.exports = app => {
                     charge: postData.charge,
                     w_code: postData.w_code,
                     total_price,
-                    tp_decimal: this.ctx.tender.info.decimal.tp,
+                    // tp_decimal: this.ctx.tender.info.decimal.tp,
                 };
                 const options = {
                     where: {
@@ -634,6 +635,8 @@ module.exports = app => {
                     },
                 };
                 if (change_status) {
+                    cArray.tp_decimal = this.ctx.tender.info.decimal.tp;
+                    cArray.up_decimal = this.ctx.tender.info.decimal.up;
                     cArray.status = audit.flow.status.checking;
                     cArray.cin_time = Date.parse(new Date()) / 1000;
                 }
@@ -936,6 +939,7 @@ module.exports = app => {
                     cin_time: Date.parse(new Date()) / 1000,
                     total_price,
                     tp_decimal: null,
+                    up_decimal: null,
                 };
                 const options = {
                     where: {
@@ -1413,6 +1417,7 @@ module.exports = app => {
                     cin_time: Date.parse(new Date()) / 1000,
                     // total_price,
                     tp_decimal: null,
+                    up_decimal: null,
                     is_revise: 1,
                 };
                 const options = {

+ 1 - 0
app/service/change_audit.js

@@ -612,6 +612,7 @@ module.exports = app => {
                 const updateData = {
                     total_price,
                     tp_decimal: this.ctx.tender.info.decimal.tp,
+                    up_decimal: this.ctx.tender.info.decimal.up,
                     status: auditConst.status.checking,
                 };
                 await transaction.update(this.ctx.service.change.tableName, updateData, options);

+ 2 - 2
app/service/pos.js

@@ -23,11 +23,11 @@ module.exports = app => {
             this.tableName = 'pos';
         }
 
-        async getPosData(condition) {
+        async getPosData(condition, column) {
             if (!condition.tid) throw '查询计量单元缺少必要信息';
             return await this.db.select(this.departTableName(condition.tid), {
                 where: condition,
-                columns: ['id', 'tid', 'lid', 'name', 'quantity', 'position', 'drawing_code', 'sgfh_qty', 'sjcl_qty',
+                columns: column || ['id', 'tid', 'lid', 'name', 'quantity', 'position', 'drawing_code', 'sgfh_qty', 'sjcl_qty',
                     'qtcl_qty', 'in_time', 'porder', 'add_stage', 'sgfh_expr', 'sjcl_expr', 'qtcl_expr', 'real_qty',
                     'dagl_status', 'dagl_url', 'gxby_status', 'gxby_url', 'gxby_limit', 'dagl_limit',
                     'ex_memo1', 'ex_memo2', 'ex_memo3'],

+ 3 - 10
app/service/report_memory.js

@@ -1003,16 +1003,9 @@ module.exports = app => {
                 } else {
                     const material = this.ctx.helper._.find(materials, {order: material_order});
                     if (!material) return [];
-                    const sql = 'SELECT m.id, m.tid, m.mid, m.t_type, m.code, m.name, m.unit, m.spec, m.m_type,' +
-                        '    m.basic_price, m.basic_times, m.remark, m.in_time, m.m_tax, m.m_tax_tp, m.tax_pre_tp,' +
-                        '    mh.quantity, mh.expr, mh.msg_tp, mh.msg_times, mh.msg_spread, mh.m_up_risk, mh.m_down_risk, mh.m_spread' +
-                        '  FROM ' + this.ctx.service.materialBills.tableName + ' m' +
-                        '  LEFT JOIN ' + this.ctx.service.materialBillsHistory.tableName + ' mh' +
-                        '  ON m.id = mh.mb_id' +
-                        '  WHERE mh.mid = ?';
-                    const sqlParam = [material.id];
-                    result = await this.ctx.app.mysql.query(sql, sqlParam);
-                    console.log(result);
+                    result = await this.ctx.service.materialBillsHistory.getAllDataByCondition({
+                        where: { tid: tender_id, mid: material.id }
+                    });
                 }
                 this._completeMaterialGl(result);
                 return result;

+ 2 - 2
db_script/ledger_his.js

@@ -20,7 +20,7 @@ console.log = function() {
 };
 
 const audit = require('../app/const/audit');
-const measureType = require('../app/const/message_type');
+const measureType = require('../app/const/tender').measureType;
 
 const mysql = require('mysql');
 const oss = require('ali-oss');
@@ -112,7 +112,7 @@ const doCompleteTender = async function(t) {
             if (r.bills_file) {
                 r.his_id = await saveReviseLedgerHis(t, r);
                 if (r.valid) his_id = r.his_id;
-                await querySql('Update zh_ledger_revise Set his_id = ? Where id = ?', [his_id, r.id]);
+                await querySql('Update zh_ledger_revise Set his_id = ? Where id = ?', [r.his_id, r.id]);
             } else {
                 if (r.status !== 1) withoutHisRevise.push(r);
             }

+ 63 - 0
package-lock.json

@@ -8464,6 +8464,51 @@
             "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
             "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg=="
         },
+        "hpack.js": {
+            "version": "2.1.6",
+            "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+            "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+            "requires": {
+                "inherits": "^2.0.1",
+                "obuf": "^1.0.0",
+                "readable-stream": "^2.0.1",
+                "wbuf": "^1.1.0"
+            },
+            "dependencies": {
+                "isarray": {
+                    "version": "1.0.0",
+                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+                    "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+                },
+                "process-nextick-args": {
+                    "version": "2.0.1",
+                    "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+                    "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+                },
+                "readable-stream": {
+                    "version": "2.3.7",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+                    "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.3",
+                        "isarray": "~1.0.0",
+                        "process-nextick-args": "~2.0.0",
+                        "safe-buffer": "~5.1.1",
+                        "string_decoder": "~1.1.1",
+                        "util-deprecate": "~1.0.1"
+                    }
+                },
+                "string_decoder": {
+                    "version": "1.1.1",
+                    "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+                    "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+                    "requires": {
+                        "safe-buffer": "~5.1.0"
+                    }
+                }
+            }
+        },
         "http-assert": {
             "version": "1.3.0",
             "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.3.0.tgz",
@@ -10390,6 +10435,11 @@
             "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
             "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
         },
+        "minimalistic-assert": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+            "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+        },
         "minimatch": {
             "version": "3.0.4",
             "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
@@ -12179,6 +12229,11 @@
                 }
             }
         },
+        "obuf": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+            "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
+        },
         "on-finished": {
             "version": "2.3.0",
             "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@@ -15305,6 +15360,14 @@
             "integrity": "sha1-jz5DKM9jsVQMDWfhsneDhviXWyY=",
             "dev": true
         },
+        "wbuf": {
+            "version": "1.7.3",
+            "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+            "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+            "requires": {
+                "minimalistic-assert": "^1.0.0"
+            }
+        },
         "webstorm-disable-index": {
             "version": "1.2.0",
             "resolved": "https://registry.npmjs.org/webstorm-disable-index/-/webstorm-disable-index-1.2.0.tgz",

+ 1 - 0
package.json

@@ -25,6 +25,7 @@
         "egg-wechat-all": "^0.1.4",
         "gt3-sdk": "^2.0.0",
         "gulp": "^4.0.0",
+        "hpack.js": "^2.1.6",
         "js-xlsx": "^0.8.22",
         "jsonwebtoken": "^8.5.1",
         "jszip": "^3.1.3",

+ 2 - 0
sql/update.sql

@@ -323,3 +323,5 @@ UPDATE `zh_ledger_revise` SET pos_file = replace(pos_file, '/revise', 'revise')
 ALTER TABLE `zh_material_checklist` CHANGE `unit_price` `unit_price` DECIMAL(30,8) NULL DEFAULT NULL COMMENT '单价';
 ALTER TABLE `zh_material_checklist` CHANGE `quantity` `quantity` DECIMAL(30,8) NULL DEFAULT NULL COMMENT '数量(工程量)';
 ALTER TABLE `zh_material_checklist` CHANGE `total_price` `total_price` DECIMAL(30,8) NULL DEFAULT NULL COMMENT '金额';
+
+ALTER TABLE `zh_change` ADD `up_decimal` TINYINT(2) NULL DEFAULT NULL COMMENT '数量小数位数' AFTER `tp_decimal`;