瀏覽代碼

Merge remote-tracking branch 'remotes/origin/dev' into uat

MaiXinRong 4 年之前
父節點
當前提交
058645152d

文件差異過大導致無法顯示
+ 0 - 1
app/public/js/CalcEval.js


文件差異過大導致無法顯示
+ 1 - 0
app/public/js/calc/calcEval.min.js


+ 7 - 5
app/public/js/material_list.js

@@ -849,8 +849,10 @@ $(document).ready(() => {
                         const [valid, msg] = this._checkExprValid(expr);
                         if (!valid) return [valid, msg];
                         data.expr = expr;
-                        const ce = new CalcEval();
-                        data.quantity = ce.eval(expr);
+                        data.quantity = ZhCalc.calcExpr.calcExprStrRpn(expr);
+                        // const ce = new CalcEvalMin();
+                        // data.quantity = ce.eval(expr);
+                        // console.log(data.quantity);
                     }
                 } else {
                     data.quantity = 0;
@@ -1041,7 +1043,7 @@ $(document).ready(() => {
         select: '#right-spr',
         callback: function () {
             ledgerSpread.refresh();
-            leafXmjSpread.refresh();
+            // leafXmjSpread.refresh();
             materialSpread.refresh();
             const width = (($('#right-view').width()/$('#right-view').parent('div').width())*100).toFixed();
             setLocalCache('material_list_' + materialID, width);
@@ -1069,7 +1071,7 @@ $(document).ready(() => {
             showSideTools(tab.hasClass('active'));
         }
         ledgerSpread.refresh();
-        leafXmjSpread.refresh();
+        // leafXmjSpread.refresh();
         materialSpread.refresh();
     });
     // 根据浏览器记录展开收起
@@ -1082,7 +1084,7 @@ $(document).ready(() => {
         $('#right-view').width(getLocalCache('material_list_' + materialID) + '%');
         showSideTools(tab.hasClass('active'));
         ledgerSpread.refresh();
-        leafXmjSpread.refresh();
+        // leafXmjSpread.refresh();
         materialSpread.refresh();
     }
 });

+ 152 - 1
app/public/js/zh_calc.js

@@ -122,5 +122,156 @@ const ZhCalc = (function () {
         return value ? new Decimal(value).toDecimalPlaces(decimal).toNumber() : null;
     }
 
-    return {add, sub, mul, div, round, isNonZero: zhBaseCalc.isNonZero}
+    const ExprCalc = {
+        /**
+         * 判断value是否是四则运算符
+         * @param {String} value - 判断字符串
+         * @return {Boolean}
+         */
+        isOperator(value) {
+            const operatorString = "+-*/()";
+            return operatorString.indexOf(value) > -1;
+        },
+        /**
+         * Rpn解析栈
+         * @param exp
+         * @returns {Array}
+         */
+        parse2Rpn(exp) {
+            const getPriority = function (value){
+                switch(value){
+                    case '+':
+                    case '-':
+                        return 1;
+                    case '*':
+                    case '/':
+                        return 2;
+                    default:
+                        return 0;
+                }
+            };
+            const priority = function (o1, o2){
+                return getPriority(o1) <= getPriority(o2);
+            };
+
+            const inputStack = [];
+            const outputStack = [];
+            const outputQueue = [];
+
+            for (let i = 0, len = exp.length; i < len; i++) {
+                const cur = exp[i];
+                if (cur !== ' ' ) {
+                    inputStack.push(cur);
+                }
+            }
+            let num = '', isNumPre = false, isOperatorPre = false;
+            while(inputStack.length > 0){
+                const cur = inputStack.shift();
+                if (this.isOperator(cur) && !(cur === '-' && !isNumPre)) {
+                    if (isNumPre) {
+                        outputQueue.push(parseFloat(num));
+                        num = '';
+                    }
+                    if (cur === '(') {
+                        outputStack.push(cur);
+                    } else if (cur === ')') {
+                        let po = outputStack.pop();
+                        while (po !== '(' && outputStack.length > 0) {
+                            outputQueue.push(po);
+                            po = outputStack.pop();
+                        }
+                        if (po !== '(') {
+                            throw "error: unmatched ()";
+                        }
+                    } else {
+                        while(priority(cur, outputStack[outputStack.length - 1]) && outputStack.length > 0){
+                            outputQueue.push(outputStack.pop());
+                        }
+                        outputStack.push(cur);
+                    }
+                    isNumPre = false;
+                    isOperatorPre = true;
+                } else {
+                    num = num + cur;
+                    isNumPre = true;
+                    isOperatorPre = false;
+                    if (inputStack.length === 0) {
+                        outputQueue.push(parseFloat(num));
+                    }
+                }
+            }
+            if (outputStack.length > 0) {
+                if (outputStack[outputStack.length - 1] === ')' || outputStack[outputStack.length - 1] === '(') {
+                    throw "error: unmatched ()";
+                }
+                while (outputStack.length > 0) {
+                    outputQueue.push(outputStack.pop());
+                }
+            }
+            return outputQueue;
+        },
+        /**
+         * 计算Rpn解析栈
+         * @param rpnQueue
+         * @returns {*}
+         */
+        evalRpn(rpnQueue) {
+            const getResult = function (num1, num2, opera) {
+                switch (opera) {
+                    case '+':
+                        return add(num1, num1);
+                    case '-':
+                        return sub(num1, num2);
+                    case '*':
+                        return mul(num1, num2, 10);
+                    case '/':
+                        return div(num1, num2, 10);
+                    default:
+                        throw '参数错误';
+                }
+            };
+            const outputStack = [];
+            while(rpnQueue.length > 0){
+                const cur = rpnQueue.shift();
+
+                if (!this.isOperator(cur)) {
+                    outputStack.push(cur);
+                } else {
+                    if (outputStack.length < 2) {
+                        throw "unvalid stack length";
+                    }
+                    const sec = outputStack.pop();
+                    const fir = outputStack.pop();
+
+                    outputStack.push(getResult(fir, sec, cur));
+                }
+            }
+
+            if (outputStack.length !== 1) {
+                throw "unvalid expression";
+            } else {
+                return outputStack[0];
+            }
+        },
+        /**
+         * 解析四则运算字符串并计算
+         * @param {String} expr
+         * @returns
+         */
+        calcExprStrRpn(expr) {
+            try {
+                if (!isNaN(Number(expr))) {
+                    return Number(expr);
+                } else {
+                    const rpnArr = this.parse2Rpn(expr);
+                    const result = this.evalRpn(rpnArr);
+                    return result === Infinity ? null : result;
+                }
+            } catch (err) {
+                return null;
+            }
+        },
+    };
+
+    return {add, sub, mul, div, round, isNonZero: zhBaseCalc.isNonZero, calcExpr: ExprCalc}
 })();

+ 1 - 1
app/view/layout/layout.ejs

@@ -6,7 +6,7 @@
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <title><%= ctx.menu.name === undefined ? '主页' : ctx.menu.name %>-计量支付</title>
     <link rel="stylesheet" href="/public/css/bootstrap/bootstrap.min.css">
-    <link rel="stylesheet" href="/public/css/main.css">
+    <link rel="stylesheet" href="/public/css/main.css?<%- ctx.app.config.version %>">
     <% if (ctx.request.host.indexOf('jlqa') !== -1 || ctx.request.host.indexOf('jluat') !== -1 || ctx.request.host === '127.0.0.1:7002') { %>
     <link rel="stylesheet" href="/public/css/qa_side.css">
     <% } %>

+ 16 - 13
app/view/material/list.ejs

@@ -24,9 +24,20 @@
         <div class="c-header p-0">
         </div>
         <div class="row w-100 sub-content">
-            <div id="left-view" class="c-body" style="width: 70%">
+            <div class="col-12 c-body">
                 <!--上部分-->
-                <div class="sjs-height-1" id="ledger-spread">
+                <div class="sjs-height-1 row w-100 sub-content">
+                    <div class="c-body" id="left-view" style="width: 70%">
+                        <div class="sjs-height-1" id="ledger-spread"></div>
+                    </div>
+                    <div class="c-body" id="right-view" style="width: 30%">
+                        <div class="resize-x" id="right-spr" r-Type="width" div1="#left-view" div2="#right-view" title="调整大小" a-type="percent"><!--调整左右高度条--></div>
+                        <div class="tab-content">
+                            <div class="tab-pane active" id="material-spread-div" style="position: relative">
+                                <div class="sjs-height-1" id="material-spread"></div>
+                            </div>
+                        </div>
+                    </div>
                 </div>
                 <!--下部分-->
                 <div class="bcontent-wrap">
@@ -36,9 +47,9 @@
                                 <a class="nav-link active" data-toggle="tab" href="#xmujie" role="tab">清单明细</a>
                             </li>
                             <!--<li class="ml-auto">-->
-                                <!--<% if (!material.readOnly) { %>-->
-                                <!--<button class="btn btn-sm btn-primary" id="user_all_material">应用调差工料至其他清单明细</button>-->
-                                <!--<% } %>-->
+                            <!--<% if (!material.readOnly) { %>-->
+                            <!--<button class="btn btn-sm btn-primary" id="user_all_material">应用调差工料至其他清单明细</button>-->
+                            <!--<% } %>-->
                             <!--</li>-->
                         </ul>
                     </div>
@@ -46,14 +57,6 @@
                     </div>
                 </div>
             </div>
-            <div class="c-body" id="right-view" style="width: 30%;">
-                <div class="resize-x" id="right-spr" r-Type="width" div1="#left-view" div2="#right-view" title="调整大小" a-type="percent"><!--调整左右高度条--></div>
-                <div class="tab-content">
-                    <div class="tab-pane active" id="material-spread-div" style="position: relative">
-                        <div class="sjs-height-6" id="material-spread"></div>
-                    </div>
-                </div>
-            </div>
         </div>
         <div class="side-menu">
             <!--右侧菜单-->

+ 6 - 0
build_min.js

@@ -41,3 +41,9 @@ for (const nm of JsFiles.needMin) {
 const needMinFileName = __dirname + '/app/public/js/web/global.' + version + '.min.js';
 fs.writeFileSync(needMinFileName, Uglyfy.minify(needMinCode, { mangle: true }).code);
 
+const needVersionCss = ['/public/css/main'];
+for (const nvc of needVersionCss) {
+    fs.copyFileSync(nvc + '.css', nvc + '.' + version + '.css');
+}
+
+

+ 0 - 1
config/config.default.js

@@ -133,7 +133,6 @@ module.exports = appInfo => {
     config.min = true;
 
     const file = path.join(__dirname, 'version');
-    console.log(file);
 
     if (fs.existsSync(file)) {
         const versionStr = fs.readFileSync(file, 'utf8');

+ 3 - 2
config/web.js

@@ -552,7 +552,9 @@ const JsFiles = {
                 mergeFile: 'material_exponent',
             },
             list: {
-                files: ['/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/decimal.min.js', '/public/js/toastr.min.js'],
+                files: ['/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/decimal.min.js',
+                    // '/public/js/calc/calcEval.min.js'
+                ],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
                     '/public/js/div_resizer.js',
@@ -560,7 +562,6 @@ const JsFiles = {
                     '/public/js/zh_calc.js',
                     '/public/js/path_tree.js',
                     '/public/js/gcl_gather.js',
-                    '/public/js/CalcEval.js', // 计算表达式使用
                     '/public/js/material_list.js',
                     '/public/js/shares/cs_tools.js',
                     '/public/js/material_audit.js',