Browse Source

Merge branch 'master' of http://192.168.1.12:3000/SmartCost/ConstructionCost

TonyKang 7 years ago
parent
commit
39cc4977e9

+ 11 - 5
modules/main/facade/quantity_detail_facade.js

@@ -91,10 +91,14 @@ async function updateRegex(datas) {
     if(datas.doc.regex==null){
         result=0;
         datas.doc.referenceIndexs=[];
-    }else {
-        regex = datas.doc.regex.toUpperCase();
-        let referenceIndexs = datas.doc.referenceIndexs;
-        result = getEvalResult(referenceIndexs,detailList,regex,decimal);
+    }else{
+        if(datas.doc.hasOwnProperty('result')){//如果前端已经计算好了
+            result = datas.doc.result;
+        }else {
+            regex = datas.doc.regex.toUpperCase();
+            let referenceIndexs = datas.doc.referenceIndexs;
+            result = getEvalResult(referenceIndexs,detailList,regex,decimal);
+        }
     }
     detailList[datas.query.index].result =result;
     detailList[datas.query.index].regex=datas.doc.regex;
@@ -248,7 +252,9 @@ async function insertRecodeWithReg (doc) {
         let regex = doc.regex.toUpperCase();
         let referenceIndexs = doc.referenceIndexs;
         let detailList = await getDatailList(doc,returnObjec);
-        doc.result =getEvalResult(referenceIndexs,detailList,regex,decimal);
+        if(!doc.hasOwnProperty('result')){//前端已结计算完了,后端就不用再计算了
+            doc.result =getEvalResult(referenceIndexs,detailList,regex,decimal);
+        }
         let refreshQuantity =false;
         if(doc.refreshQuantity==true){
             refreshQuantity = true;

+ 0 - 2
modules/main/models/bills.js

@@ -172,8 +172,6 @@ class billsModel extends baseModel {
         ration_ids = ration_ids.concat(getIDs(rations));
         //deep delete datas
         let deleteInfo = {deleted: true, deleteDateTime: new Date(), deleteBy: userID};
-        console.log(`bill_ids`);
-        console.log(bill_ids);
         if(bill_ids.length > 0){
             //删除bills
             await me.model.updateMany({ID: {$in: bill_ids}, deleteInfo: null}, {$set: {deleteInfo: deleteInfo}});

+ 7 - 4
public/web/gljUtil.js

@@ -183,6 +183,7 @@ let gljUtil = {
     },
     getMarketPrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil,tenderCoe) {
         let price_decimal = decimalObj.glj.unitPrice;
+        let price_hasM_decimal = decimalObj.glj.unitPriceHasMix?decimalObj.glj.unitPriceHasMix:decimalObj.glj.unitPrice;
         let quantity_decimal = decimalObj.glj.quantity;
         let process_decimal = decimalObj.process;
         let priceCoe = this.isDef(tenderCoe)?tenderCoe:1;
@@ -202,7 +203,7 @@ let gljUtil = {
                     p = scMathUtil.roundForObj(temP + p,process_decimal);
                 }
             }
-            return scMathUtil.roundForObj(p,price_decimal);
+            return scMathUtil.roundForObj(p,price_hasM_decimal);
         }else {
             let tem_decimal = isRadio==true?process_decimal:price_decimal;
             return scMathUtil.roundForObj(parseFloat(glj.unit_price.market_price)*priceCoe,tem_decimal);
@@ -210,6 +211,7 @@ let gljUtil = {
     },
     getBasePrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil) {
         let price_decimal = decimalObj.glj.unitPrice;
+        let price_hasM_decimal = decimalObj.glj.unitPriceHasMix?decimalObj.glj.unitPriceHasMix:decimalObj.glj.unitPrice;
         let quantity_decimal = decimalObj.glj.quantity;
         let process_decimal = decimalObj.process;
         if (this.notEditType.indexOf(glj.unit_price.type)!=-1&&glj.ratio_data.length>0) {//对于混凝土、配合比、砂浆、机械台班等有组成物的材料,价格需根据组成物计算得出。
@@ -228,7 +230,7 @@ let gljUtil = {
                     p = scMathUtil.roundForObj(temP + p,process_decimal);
                 }
             }
-            return scMathUtil.roundForObj(p,price_decimal);
+            return scMathUtil.roundForObj(p,price_hasM_decimal);
         }else {
             let tem_decimal = isRadio==true?process_decimal:price_decimal;
             return scMathUtil.roundForObj(glj.unit_price.base_price,tem_decimal);
@@ -236,6 +238,7 @@ let gljUtil = {
     },
     getAdjustPrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil) {
         let decimal = decimalObj.glj.unitPrice;
+        let price_hasM_decimal = decimalObj.glj.unitPriceHasMix?decimalObj.glj.unitPriceHasMix:decimalObj.glj.unitPrice;
         let quantity_decimal =  decimalObj.glj.quantity;
         let process_decimal = decimalObj.process;
         let  tem_decimal = isRadio==true?process_decimal:decimal;
@@ -259,9 +262,9 @@ let gljUtil = {
                     p = scMathUtil.roundForObj(temP + p,process_decimal);
                 }
             }
-            return scMathUtil.roundForObj(p,decimal);
+            return scMathUtil.roundForObj(p,price_hasM_decimal);
         } else {//对于其他普通材料等,无调整系数,调整价=定额价。
-            return glj.unit_price.base_price
+            return  scMathUtil.roundForObj(glj.unit_price.base_price,tem_decimal)
         }
     },
     calcPriceDiff:function (glj,calcOptions) {

+ 32 - 0
public/web/sheet/sheet_common.js

@@ -537,6 +537,38 @@ var sheetCommonObj = {
                 }
             }
         }
+    },
+    //注册自定义回车键事件
+    bindEnterKey: function (workBook, operation) {
+        workBook.commandManager().register('myEnter', operation);
+        workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.enter, false, false, false, false);
+        workBook.commandManager().setShortcutKey('myEnter', GC.Spread.Commands.Key.enter, false, false, false, false);
+    },
+    //解决esc后触发了编辑结束的保存事件,显示与实际数据不同问题
+    bindEscKey: function (workBook, editStarting = null, editEnded = null) {
+        let sheet = workBook.getActiveSheet();
+        workBook.commandManager().register('myEsc', function () {
+            sheet.unbind(GC.Spread.Sheets.Events.EditStarting);
+            sheet.unbind(GC.Spread.Sheets.Events.EditEnded);
+            let row = sheet.getActiveRowIndex();
+            let col = sheet.getActiveColumnIndex();
+            let orgV = sheet.getValue(row, col);
+            if(!isDef(orgV)){
+                orgV = '';
+            }
+            if(sheet.isEditing()){
+                sheet.endEdit();
+                sheet.setValue(row, col, orgV);
+            }
+            if(editStarting){
+                sheet.bind(GC.Spread.Sheets.Events.EditStarting, editStarting);
+            }
+            if(editEnded){
+                sheet.bind(GC.Spread.Sheets.Events.EditEnded, editEnded);
+            }
+        });
+        workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.esc, false, false, false, false);
+        workBook.commandManager().setShortcutKey('myEsc', GC.Spread.Commands.Key.esc, false, false, false, false);
     }
 
 }

+ 1 - 3
public/web/tree_sheet/tree_sheet_helper.js

@@ -121,9 +121,7 @@ var TREE_SHEET_HELPER = {
                 var cell = sheet.getCell(iRow, iCol, GC.Spread.Sheets.SheetArea.viewport);
                 if(typeof projectObj !== 'undefined'){
                     let boldFontStyle = projectObj.getBoldFontStyle(node, colSetting);
-                    if(boldFontStyle){
-                        sheet.setStyle(iRow, iCol, boldFontStyle);
-                    }
+                    sheet.setStyle(iRow, iCol, boldFontStyle);
                 }
 
                 // var getFieldText = function () {

+ 3 - 3
web/building_saas/complementary_glj_lib/html/tools-gongliaoji.html

@@ -69,9 +69,9 @@
                                 <div class="col-12" id="gljRadios">
                                     <div class="row">
                                         <div class="col-7" style="margin-top: 5px;">
-                                            <input type="radio" class="glj-radio" name="glj" value="allGljs">所有人材机&nbsp;&nbsp;
-                                            <input type="radio" class="glj-radio" name="glj" value="stdGljs">标准人材机&nbsp;&nbsp;
-                                            <input type="radio" class="glj-radio" name="glj" value="complementaryGljs">补充人材机&nbsp;&nbsp;
+                                            <input type="radio" class="glj-radio" name="glj" value="allGljs">所有&nbsp;&nbsp;
+                                            <input type="radio" class="glj-radio" name="glj" value="stdGljs">标准&nbsp;&nbsp;
+                                            <input type="radio" class="glj-radio" name="glj" value="complementaryGljs">补充&nbsp;&nbsp;
                                         </div>
                                         <div class="input-group col-5" style="margin-bottom: 5px;">
                                             <input type="text" class="form-control form-control-sm" placeholder="请输入筛选编码或名称" value="" id="gljSearchKeyword">

+ 32 - 0
web/building_saas/complementary_glj_lib/js/glj.js

@@ -170,10 +170,42 @@ let repositoryGljObj = {
             cacheSection = null;
         }
     },
+    bindEnterKey: function () {
+        let me = this;
+        let sheet = me.workBook.getActiveSheet();
+        me.workBook.commandManager().register("myEnter", function(){
+            let orgRow = sheet.getActiveRowIndex();
+            let orgCol = sheet.getActiveColumnIndex();
+            if(sheet.isEditing()){
+                sheet.endEdit();
+            }
+            let code = sheet.getValue(orgRow, 0);
+            let newRow, newCol;
+            if(!me.currentCache[orgRow] && code !== undefined && code !== null && orgCol !== me.setting.header.length - 1){
+                newRow = orgRow;
+                newCol = orgCol + 1;
+                sheet.setActiveCell(newRow, newCol);
+            }
+            else{
+                newRow = orgRow + 1;
+                newCol = me.currentCache[orgRow + 1] ? orgCol : 0;
+                sheet.setActiveCell(newRow, newCol);
+            }
+            //触发事件
+            //me.onLeaveCell({type: 'LeaveCell'}, {sheet: sheet, sheetName: sheet.name(), cancel: false, row: orgRow, col: orgCol});
+            me.onEnterCell({type: 'EnterCell'}, {sheet: sheet, sheetName: sheet.name(), cancel: false, row: newRow, col: newCol});
+            let newSels = [{row: newRow, rowCount: 1, col: newCol, colCount: 1}];
+            let oldSels = [{row: orgRow, rowCount: 1, col: orgRow, colCount: 1}];
+            me.onSelectionChanged({type: 'SelectionChanged'}, {sheet: sheet, sheetName: sheet.name(), newSelections: newSels, oldSelections: oldSels});
+        });
+        me.workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.enter, false, false, false, false);
+        me.workBook.commandManager().setShortcutKey("myEnter", GC.Spread.Commands.Key.enter, false, false, false, false);
+    },
     buildSheet: function(container) {
         let me = repositoryGljObj;
         me.workBook = sheetOpr.buildSheet(container, me.setting, 30);
         me.repositoryGljDelOpr();
+        me.bindEnterKey();
         me.setUnitCombo(me.workBook.getActiveSheet(), me.setting.header);
         me.workBook.getActiveSheet().bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
         me.workBook.getActiveSheet().bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);

+ 3 - 3
web/building_saas/complementary_ration_lib/html/dinge.html

@@ -482,9 +482,9 @@
                         <div class="col-12" id="gljRadios">
                             <div class="row">
                                 <div class="col-7" style="margin-top: 5px;">
-                                    <input type="radio" class="glj-radio" name="glj" value="allGljs">所有人材机&nbsp;&nbsp;
-                                    <input type="radio" class="glj-radio" name="glj" value="stdGljs">标准人材机&nbsp;&nbsp;
-                                    <input type="radio" class="glj-radio" name="glj" value="complementaryGljs">补充人材机&nbsp;&nbsp;
+                                    <input type="radio" class="glj-radio" name="glj" value="allGljs">所有&nbsp;&nbsp;
+                                    <input type="radio" class="glj-radio" name="glj" value="stdGljs">标准&nbsp;&nbsp;
+                                    <input type="radio" class="glj-radio" name="glj" value="complementaryGljs">补充&nbsp;&nbsp;
                                 </div>
                                 <div class="input-group col-5" style="margin-bottom: 5px;">
                                     <input type="text" class="form-control form-control-sm" placeholder="请输入筛选编码或名称" value="" id="gljSearchKeyword">

+ 2 - 2
web/building_saas/fee_rates/fee_rate.html

@@ -84,7 +84,7 @@
     <div class="modal-dialog" role="document">
         <div class="modal-content">
             <div class="modal-header">
-                <h5 class="modal-title"><span id="set-lv-feeRateName">费率1</span>&nbsp;重选标准</h5>
+                <h5 class="modal-title"><span id="set-lv-feeRateName" style="display: none">费率1 &nbsp;</span>重选标准</h5>
                 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                     <span aria-hidden="true">&times;</span>
                 </button>
@@ -96,7 +96,7 @@
                     <small class="form-text text-danger">重新选择费率标准将重置当前费率文件的所有费率,正在使用当前费率文件的其他单位工程也将受影响。</small>
                 </div>
                 <div class="form-group">
-                    <label>正在使用 <span id="set-use-feeRateName">费率1</span> 的单位工程</label>
+                    <label>正在使用当前费率文件的单位工程有:</label>
                     <ul class="list-unstyled" id="usageProjectList">
 
                     </ul>

+ 3 - 3
web/building_saas/main/html/main.html

@@ -812,9 +812,9 @@
                                 <div class="col-12" id="gljRadios">
                                     <div class="row">
                                         <div class="col-7" style="margin-top: 5px;">
-                                            <input type="radio" class="glj-radio" name="glj" value="allGljs" checked>所有人材机&nbsp;&nbsp;
-                                            <input type="radio" class="glj-radio" name="glj" value="stdGLJ">标准人材机&nbsp;&nbsp;
-                                            <input type="radio" class="glj-radio" name="glj" value="complementaryGLJs">补充人材机&nbsp;&nbsp;
+                                            <input type="radio" class="glj-radio" name="glj" value="allGljs" checked>所有&nbsp;&nbsp;
+                                            <input type="radio" class="glj-radio" name="glj" value="stdGLJ">标准&nbsp;&nbsp;
+                                            <input type="radio" class="glj-radio" name="glj" value="complementaryGLJs">补充&nbsp;&nbsp;
                                         </div>
                                         <div class="input-group col-5" style="margin-bottom: 5px;">
                                             <input type="text" class="form-control form-control-sm" placeholder="请输入筛选编码或名称" value="" id="gljSearchKeyword">

+ 1 - 2
web/building_saas/main/js/controllers/block_controller.js

@@ -524,10 +524,9 @@ let BlockController = {
             if(temData.billsLibId && temData.billsLibId!="" && temData.code.length == 12){//是从清单库来的
                 let value = temData.code.substr(0,9);
                 if (value&&value.length === 9 && /^[\d]+$/.test(value)) {
-                    temData.code = projectObj.project.Bills.newFormatCode(value);
+                    temData.code = me.newFormatCode(value);
                 }
             }
-
             me.datas.push(temData);//为了下一个清单的std code 一样
             return temData;
         }

+ 3 - 3
web/building_saas/main/js/main.js

@@ -38,14 +38,14 @@ $(function () {
         zmhs_obj.refresh();
     });
 
-    /*const projectId = scUrlUtil.GetQueryString('project');
+    const projectId = scUrlUtil.GetQueryString('project');
     // 绑定点击事件
     projectObj.mainSpread.bind(GC.Spread.Sheets.Events.CellClick, function(sender, info) {
         if (info.row !== undefined && projectId !== undefined) {
             setLocalCache('lastRow:' + projectId, info.row);
             setLocalCache('lastCol:' + projectId, info.col);
         }
-    });*/
+    });
 });
 
 function getMainResizeEles() {
@@ -260,4 +260,4 @@ function disableRightMenu(id,spread,rowChangeFunction) {
 function show()
 {
     return "exit"
-};*/
+};*/

+ 31 - 16
web/building_saas/main/js/models/calc_base.js

@@ -239,19 +239,15 @@ let cbTools = {
             //根据基数和行引用获取清单ID
             for(let i = 0, len = bases.length; i < len; i++){
                 //基数是跟清单直接关联的
-                /*if(bases[i]['type'] === 'base' && cbTools.isDef(calcBase.baseFigures[bases[i]['value']])){
-                    //税前工程造价算法用了分部分项、项目措施、其他项目、规费里的底层价格,相当于引用了4条固定清单,特殊处理
+                if(bases[i]['type'] === 'base' && cbTools.isDef(calcBase.baseFigures[bases[i]['value']])){
+                    //税前工程造价算法用了分部分项、项目措施(已排除)、其他项目、规费里的底层价格,相当于引用了4条固定清单,特殊处理
                     if(bases[i]['value'] === '税前工程造价'){
                         let subEngineering = cbTools.findBill(calcBase.fixedFlag.SUB_ENGINERRING),
-                            measure = cbTools.findBill(calcBase.fixedFlag.MEASURE),
                             other = cbTools.findBill(calcBase.fixedFlag.OTHER),
                             charge = cbTools.findBill(calcBase.fixedFlag.CHARGE);
                         if(subEngineering){
                             block.push(subEngineering.ID);
                         }
-                        if(measure){
-                            block.push(measure.ID);
-                        }
                         if(other){
                             block.push(other.ID);
                         }
@@ -262,11 +258,11 @@ let cbTools = {
                     else if(cbTools.isDef(calcBase.baseFigures[bases[i]['value']]['fixedBill'])){
                         block.push(calcBase.baseFigures[bases[i]['value']]['fixedBill']['bill']['ID']);
                     }
-                }*/
-                if(bases[i]['type'] === 'base' && cbTools.isDef(calcBase.baseFigures[bases[i]['value']])
+                }
+               /* if(bases[i]['type'] === 'base' && cbTools.isDef(calcBase.baseFigures[bases[i]['value']])
                     && cbTools.isDef(calcBase.baseFigures[bases[i]['value']]['fixedBill'])){
                     block.push(calcBase.baseFigures[bases[i]['value']]['fixedBill']['bill']['ID']);
-                }
+                }*/
                 else if(bases[i]['type'] === 'id'){
                     let node = cbTools.getNodeByID(bases[i]['value']);
                     if(cbTools.isDef(node)){
@@ -1164,15 +1160,32 @@ let cbAnalyzer = {
         let figureF = cbParser.getFigureF(cbParser.getFigure(exp), cbParser.getUID(cbParser.getFIDArr(exp)));
         for(let i = 0, len = figureF.length; i < len; i++){
             let figure = figureF[i];
-            let bill = null;
+            let billsIDs = [];
             if(figure.type === 'base' && cbTools.isDef(baseFigures[figure.value])){
-                bill = cbTools.isDef(baseFigures[figure.value]['fixedBill']) ? baseFigures[figure.value]['fixedBill']['bill'] : null;
+                if(figure.value === '税前工程造价'){
+                    //税前工程造价算法在措施项目已排除自身,税前工程造价与措施项目无会造成循环的引用关系
+                    let subEngineering = cbTools.findBill(calcBase.fixedFlag.SUB_ENGINERRING),
+                        other = cbTools.findBill(calcBase.fixedFlag.OTHER),
+                        charge = cbTools.findBill(calcBase.fixedFlag.CHARGE);
+                    if(subEngineering){
+                        billsIDs.push(subEngineering.ID);
+                    }
+                    if(other){
+                        billsIDs.push(other.ID);
+                    }
+                    if(charge){
+                        billsIDs.push(charge.ID);
+                    }
+                }
+                else {
+                    billsIDs = cbTools.isDef(baseFigures[figure.value]['fixedBill']) ? [baseFigures[figure.value]['fixedBill']['bill']['ID']] : [];
+                }
             }
             else if(figure.type === 'id'){
                 let node = cbTools.getNodeByID(figure.value);
-                bill = cbTools.isDef(node) ? node.data : null;
+                billsIDs = cbTools.isDef(node) ? [node.data.ID] : [];
             }
-            if(cbTools.isDef(bill) && checkStack(getRefStack([bill.ID]), sIDs)){
+            if(cbTools.isDef(billsIDs) && billsIDs.length > 0 && isCycle(billsIDs)){
                 console.log('循环计算');
                 calcBase.errMsg = '表达式出现循环计算';
                 return true;
@@ -1188,16 +1201,18 @@ let cbAnalyzer = {
             }
             return false;
         }
-        function getRefStack(billIDs){
+        function isCycle(billIDs){
             stack = Array.from(new Set(stack.concat(billIDs)));
             for(let i = 0, len = billIDs.length; i < len; i++){
                 let block = cbTools.getStackBlock(billIDs[i]);
                 if(block.length > 0){
                     stack = Array.from(new Set(stack.concat(block)));
-                    getRefStack(block);
+                    if(checkStack(stack, sIDs)){
+                        return true;
+                    }
+                    return isCycle(block);
                 }
             }
-            return stack;
         }
     },
     //四则运算合法性,控制不允许重复出现运算符,这里再判断一次,控制行引用只能F

+ 18 - 9
web/building_saas/main/js/models/calc_program.js

@@ -272,8 +272,8 @@ let calcTools = {
                     calcTools.calcGLJTenderQty(treeNode, glj);
                 };
                 let qty = isTender ? me.uiGLJQty(glj["tenderQuantity"]) : me.uiGLJQty(glj["quantity"]);
-                let mprice = isTender ? me.uiGLJPrice(glj["tenderPrice"]) : me.uiGLJPrice(glj["marketPrice"]);
-                let aprice = calcTools.hasAdjustPrice() ? me.uiGLJPrice(glj["adjustPrice"]) : me.uiGLJPrice(glj["basePrice"]);
+                let mprice = isTender ? me.uiGLJPrice(glj["tenderPrice"], glj) : me.uiGLJPrice(glj["marketPrice"], glj);
+                let aprice = calcTools.hasAdjustPrice() ? me.uiGLJPrice(glj["adjustPrice"], glj) : me.uiGLJPrice(glj["basePrice"], glj);
 
                 if (priceType == priceTypes.ptDiffPrice){
                     if (aprice != mprice){
@@ -282,7 +282,7 @@ let calcTools = {
                     }
                 }
                 else {
-                    if (priceType == priceTypes.ptBasePrice){ price = me.uiGLJPrice(glj["basePrice"]);}
+                    if (priceType == priceTypes.ptBasePrice){ price = me.uiGLJPrice(glj["basePrice"], glj);}
                     else if (priceType == priceTypes.ptAdjustPrice){price = aprice;}
                     else if (priceType == priceTypes.ptMarketPrice){price = mprice;}
                     temp = (qty * price).toDecimal(decimalObj.process);
@@ -378,7 +378,7 @@ let calcTools = {
 
             let rst = 0;
             for (let obj of GLJObjs){
-                let tp = (me.uiGLJQty(obj.quantity) * me.uiGLJPrice(obj.marketPrice)).toDecimal(decimalObj.bills.totalPrice);
+                let tp = (me.uiGLJQty(obj.quantity) * me.uiGLJPrice(obj.marketPrice, obj)).toDecimal(decimalObj.bills.totalPrice);
                 rst = (rst + tp).toDecimal(decimalObj.bills.totalPrice);
             };
             return rst;
@@ -401,7 +401,7 @@ let calcTools = {
             for (let glj of treeNode.data.gljList) {
                 if (!allMaterialTypes.includes(glj.type)) continue;
                 if (glj.isEstimate){
-                    rst = rst + (me.uiGLJQty(glj.quantity) * me.uiGLJPrice(glj.marketPrice)).toDecimal(decimalObj.process);
+                    rst = rst + (me.uiGLJQty(glj.quantity) * me.uiGLJPrice(glj.marketPrice, glj)).toDecimal(decimalObj.process);
                     rst = rst.toDecimal(decimalObj.process);
                 }
                 else{   // 组成物
@@ -725,14 +725,17 @@ let calcTools = {
                 pCoe = projectObj.project.property.tenderSetting.gljPriceTenderCoe;
             glj.tenderPrice = (glj.marketPrice * pCoe).toDecimal(decimalObj.glj.unitPrice);
         }else{
-            let projGLJ = projectObj.project.projectGLJ.getDataByID(glj.projectGLJID);
+            let projGLJ = calcTools.getProjectGLJ(glj);
             glj.tenderPrice = projectObj.project.projectGLJ.getTenderMarketPrice(projGLJ);
         };
     },
     // 界面显示的工料机价格,包括定额价、市场价等。参数 price 传入一个普通的价格数值即可。
-    uiGLJPrice: function (price){
-        if (price)
-            return parseFloat(price).toDecimal(decimalObj.glj.unitPrice)
+    uiGLJPrice: function (price, glj){
+        if (price){
+            let projGLJ = glj ? calcTools.getProjectGLJ(glj) : null;
+            let d = (projGLJ&&projGLJ.ratio_data.length > 0) ? decimalObj.glj.unitPriceHasMix : decimalObj.glj.unitPrice;
+            return parseFloat(price).toDecimal(d);
+        }
         else return 0;
     },
     // 界面显示的工料机数量。参数 quantity 传入一个普通的数量数值即可。
@@ -780,6 +783,12 @@ let calcTools = {
                 discreteNodes.push(node);
         };
         return discreteNodes;
+    },
+    getProjectGLJ(glj){
+        if (glj.projectGLJID){
+            return projectObj.project.projectGLJ.getDataByID(glj.projectGLJID);
+        }
+        else return null;
     }
 };
 

+ 109 - 19
web/building_saas/main/js/models/quantity_detail.js

@@ -25,6 +25,14 @@ var quantity_detail = {
             this.datas = datas;
         };
 
+        quantity_detail.prototype.getListByID = function (ID,field) {
+             let condition={};
+            condition[field] = ID;
+             let details = _.filter(this.datas, condition);
+            details = _.sortBy(details, 'seq');
+            return details;
+        };
+
         // 提交数据后返回数据处理
         quantity_detail.prototype.doAfterUpdate = function(err, data){
             if(!err){
@@ -82,7 +90,6 @@ var quantity_detail = {
             var showList = _.filter(this.datas,filter_object);
             gljOprObj.detailData=showList;
             gljOprObj.detailData=_.sortBy(gljOprObj.detailData,'seq');
-            console.log(batchCallback);
             if(batchCallback == undefined){
                 this.refreshSheetData();
             }
@@ -131,8 +138,8 @@ var quantity_detail = {
             doc.projectID = selected.data.projectID;
             doc[dataCode]=args.editingText;
             doc.seq=args.row;
-            if(dataCode=='regex'){
-                if(!this.regexChecking(args.editingText)||!this.referenceChecking(args.editingText,args.row,doc)){
+            if(dataCode=='regex'){//  if(this.checkAndCalcResult(args.editingText,args.row,doc) === false){
+                if(this.checkAndCalcResult(args.editingText,args.row,doc) === false){
                     gljOprObj.showQuantityDetailData();
                     return;
                 }
@@ -168,7 +175,7 @@ var quantity_detail = {
                 }else {
                     data.newRecord?me.refreshAfterSave(data.newRecord,batchCallback):me.refreshAfterSave(data,batchCallback);
                     if(batchCallback){
-                        batchCallback(args)
+                        batchCallback(args);
                     }else if(data.node){
                         me.refreshRationOrBillNodes(data.node);
                     }
@@ -183,14 +190,13 @@ var quantity_detail = {
 
 
         quantity_detail.prototype.refreshRationOrBillNodes=function(node){//工程量明细更新后触发定额或清单工程量改变,进行相应的更新
-            var nodes = gljOprObj.refreshTreeNode(node);
-            if(nodes.length>0){//触发计算
-                let newNode = nodes[0];
-                if(newNode.sourceType === project.Bills.getSourceType()){
-                    console.log(newNode.data.quantity);
-                    this.updateBillQuantity(newNode.data.quantity,newNode,newNode.data.quantityEXP);
+            let treeNode = gljOprObj.updateDataNodeProperty(node.ID,node.data);
+            if(treeNode){//触发计算
+                if(treeNode.sourceType === project.Bills.getSourceType()){
+                    console.log(treeNode.data.quantity);
+                    this.updateBillQuantity(treeNode.data.quantity,treeNode,treeNode.data.quantityEXP);
                 }else {//更新定额所使用的值要用还没转换前的
-                    node.data? this.updateRationQuantity(node.data.r_quantity,newNode,newNode.data.quantityEXP):"";
+                    node.data? this.updateRationQuantity(node.data.r_quantity,treeNode,treeNode.data.quantityEXP):"";
                 }
             }
         };
@@ -199,7 +205,7 @@ var quantity_detail = {
             var args = {
                 row:row,
                 editingText:1
-            }
+            };
             if(row < gljOprObj.detailData.length){
                 args.insertRecode = true;
             }
@@ -240,18 +246,22 @@ var quantity_detail = {
         };
 
         quantity_detail.prototype.moveDown = function (row) {
+            let sel =  gljOprObj.detailSheet.getSelections()[0];
             this.swapRow(row);
+            gljOprObj.detailSheet.setSelection(row+1,sel.col,sel.rowCount,sel.colCount);//更改选中行
         };
         quantity_detail.prototype.moveUp = function (row) {
+            let sel =  gljOprObj.detailSheet.getSelections()[0];
             this.swapRow(row-1);
+            gljOprObj.detailSheet.setSelection(row-1,sel.col,sel.rowCount,sel.colCount);//更改选中行
         };
         quantity_detail.prototype.swapRow = function (preRow) {
-            var me = this;
-            var update_task = [];
-            var a_row = gljOprObj.detailData[preRow];//
-            var b_row = gljOprObj.detailData[preRow +1];//
-            var temA = a_row.seq;
-            var temB = b_row.seq;
+            let me = this;
+            let update_task = [];
+            let a_row = gljOprObj.detailData[preRow];//
+            let b_row = gljOprObj.detailData[preRow +1];//
+            let temA = a_row.seq;
+            let temB = b_row.seq;
             a_row.seq = temB;
             update_task.push({query:{ID:a_row.ID,projectID:a_row.projectID},doc:{seq:a_row.seq}});
             b_row.seq = temA;
@@ -274,13 +284,89 @@ var quantity_detail = {
                     regex =  me.replaceAll('b','c',regex);
                     update_task.push({query:{ID:item.ID,projectID:item.projectID},doc:{regex:regex,referenceIndexs:item.referenceIndexs}});
                 }
-            })
+            });
             me.commonUpdate("/quantity_detail/swapRow",update_task);
         };
         quantity_detail.prototype.replaceAll=function(FindText, RepText,str) {
             let regExp = new RegExp(FindText, "g");
             return str.replace(regExp, RepText);
         };
+
+        quantity_detail.prototype.calcResult = function (doc) {//return false 代表输入有误
+            let field = doc.billID?"billID":"rationID";// doc.rationID
+            let detailList = this.getListByID(doc[field],field);
+            let result = this.getEvalResult(doc.referenceIndexs,detailList,doc.regex);
+            if(result === null){
+                return false;
+            }else {
+                doc.result = result;
+                return true;
+            }
+        };
+        quantity_detail.prototype.getEvalResult = function(referenceIndexs,detailList,regex) {
+            try {
+                let decimal = getDecimal("quantity_detail");
+                for(let i of referenceIndexs){
+                    regex = this.replaceReference(i,detailList,regex)
+                }
+                console.log('replace all C reference -----'+regex);
+                regex = this.replaceSqr(regex);
+                console.log('replace all sqar reference -----'+regex);
+                return scMathUtil.roundTo(eval(regex), -decimal);
+            }catch (error){
+                alert('输入的表达式有误,请重新输入!');
+                return null;
+            }
+        };
+        quantity_detail.prototype.replaceReference = function(index,detailList,str) {
+            str=str.toUpperCase();
+            let rstr= detailList[index-1].regex==null?'0':'('+detailList[index-1].regex+')';
+            str=this.replaceAll('C'+index,rstr,str);
+            if(detailList[index-1].referenceIndexs.length>0){
+                for (let i of detailList[index-1].referenceIndexs){
+                    str =this.replaceReference(i,detailList,str);
+                }
+            }
+            return str;
+        };
+
+        quantity_detail.prototype.replaceSqr=function(text) {
+            var squarRegex = /\([^\^]+\)\^\d+/g;
+            var sqararr = text.match(squarRegex);
+
+            var squarRegex2 = /C[0-9]+\^\d+|[0-9]+([.]{1}[0-9]+){0,1}\^\d+/g; //匹配没有括号的
+            var sqararr2=text.match(squarRegex2);
+            if(sqararr){
+                text=this.converSqrByArr(sqararr,text);
+            }
+            if(sqararr2){
+                text=this.converSqrByArr(sqararr2,text);
+            }
+            return text;
+        };
+
+        quantity_detail.prototype.converSqrByArr  = function(sqararr,text) {
+            var temp = text;
+            sqararr.forEach(function (item) {
+                var arr = item.split('\^');
+                var y = parseInt(arr[1]);
+                var x_arr = [];
+                for (var i = 0; i < y; i++) {
+                    x_arr.push(arr[0]);
+                }
+                var temStr = x_arr.join('*');
+                temp = temp.replace(item, temStr);
+            });
+            return temp;
+        };
+
+        quantity_detail.prototype.checkAndCalcResult = function (regex,row,doc) {//return false 表示没有通过检查
+            if(!this.regexChecking(regex)||!this.referenceChecking(regex,row,doc)||!this.calcResult(doc)){
+                return false;
+            }
+            return true;
+        };
+
         quantity_detail.prototype.updateQuantityDetail=function (args,dataCode,recode,selected,batchCallback) {
             var doc ={},me = this;
             var query={
@@ -290,6 +376,10 @@ var quantity_detail = {
             var selected = selected?selected:projectObj.project.mainTree.selected;
             doc[dataCode]=args.editingText;
             if (dataCode == 'regex') {
+                if(this.checkAndCalcResult(args.editingText,args.row,doc) === false){
+                    gljOprObj.showQuantityDetailData();
+                    return;
+                }
                 if(recode.hasOwnProperty('rationID')){
                     query.rationID=recode.rationID;
                 }else {

+ 9 - 9
web/building_saas/main/js/views/glj_col.js

@@ -13,9 +13,9 @@ let gljCol = {
             {headerName: "自定消耗", headerWidth: 80, dataCode: "customQuantity", dataType: "Number", hAlign: "right", decimalField: "glj.quantity"},
             {headerName: "消耗量", headerWidth: 80, dataCode: "quantity", dataType: "Number", hAlign: "right", decimalField: "glj.quantity"},
             {headerName: "总消耗量", headerWidth: 80, dataCode: "totalQuantity", dataType: "Number", hAlign: "right", decimalField: "glj.quantity"},
-            {headerName: "定额价", headerWidth: 80, dataCode: "basePrice", dataType: "Number", hAlign: "right", decimalField: "glj.unitPrice"},
-            {headerName: "调整价", headerWidth: 80, dataCode: "adjustPrice", dataType: "Number", hAlign: "right", decimalField: "glj.unitPrice"},
-            {headerName: "市场价", headerWidth: 80, dataCode: "marketPrice", dataType: "Number", hAlign: "right", decimalField: "glj.unitPrice"},
+            {headerName: "定额价", headerWidth: 80, dataCode: "basePrice", dataType: "Number", hAlign: "right"},//, decimalField: "glj.unitPrice"
+            {headerName: "调整价", headerWidth: 80, dataCode: "adjustPrice", dataType: "Number", hAlign: "right"},//, decimalField: "glj.unitPrice"
+            {headerName: "市场价", headerWidth: 80, dataCode: "marketPrice", dataType: "Number", hAlign: "right"},//, decimalField: "glj.unitPrice"
             {headerName: "暂估", headerWidth: 45, dataCode: "isEstimate", dataType: "String", hAlign: "center", vAlign: "center", cellType: "checkBox"
             }
         ],
@@ -33,9 +33,9 @@ let gljCol = {
             {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
             {headerName: "类型", headerWidth: 45, dataCode: "short_name", hAlign: "center", dataType: "String"},
             {headerName: "总消耗量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
-            {headerName: "定额价", headerWidth: 70, dataCode: "basePrice", hAlign: "right", dataType: "Number",decimalField:'glj.unitPrice',validator:"number"},
-            {headerName: "调整价", headerWidth: 70, dataCode: "adjustPrice", hAlign: "right", dataType: "Number",decimalField:"glj.unitPrice"},
-            {headerName: "市场价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",decimalField:"glj.unitPrice",validator:"number"},
+            {headerName: "定额价", headerWidth: 70, dataCode: "basePrice", hAlign: "right", dataType: "Number",validator:"number"},//decimalField:'glj.unitPrice',
+            {headerName: "调整价", headerWidth: 70, dataCode: "adjustPrice", hAlign: "right", dataType: "Number"},//,decimalField:"glj.unitPrice"
+            {headerName: "市场价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:"glj.unitPrice"
             {headerName: "暂估", headerWidth: 45, dataCode: "is_evaluate", hAlign: "center", dataType: "String",cellType:'checkBox'},
             {headerName: "主要\n材料", headerWidth: 45, dataCode: "is_main_material", hAlign: "center", dataType: "String",cellType:'checkBox'},
             {headerName: "供货方式", headerWidth: 80, dataCode: "supply", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:supplyComboMap},
@@ -58,9 +58,9 @@ let gljCol = {
             {headerName: "规格型号", headerWidth: 120, dataCode: "specs", dataType: "String"},
             {headerName: "单位", headerWidth: 120, dataCode: "unit", hAlign: "center", dataType: "String"},
             {headerName: "类型", headerWidth: 120, dataCode: "short_name", hAlign: "center", dataType: "String"},
-            {headerName: "定额价", headerWidth: 120, dataCode: "basePrice", hAlign: "right", dataType: "Number",decimalField:'glj.unitPrice',validator:"number"},
-            {headerName: "调整价", headerWidth: 120, dataCode: "adjustPrice", hAlign: "right", dataType: "Number",decimalField:"glj.unitPrice"},
-            {headerName: "市场价", headerWidth: 120, dataCode: "marketPrice", hAlign: "right", dataType: "Number",decimalField:"glj.unitPrice",validator:"number"},
+            {headerName: "定额价", headerWidth: 120, dataCode: "basePrice", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:'glj.unitPrice'
+            {headerName: "调整价", headerWidth: 120, dataCode: "adjustPrice", hAlign: "right", dataType: "Number"},//,decimalField:"glj.unitPrice"
+            {headerName: "市场价", headerWidth: 120, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:"glj.unitPrice"
             {headerName: "消耗量", headerWidth: 120, dataCode: "consumption", hAlign: "right", dataType: "Number",decimalField:"glj.quantity",validator:"number"}
         ],
         view: {

+ 12 - 13
web/building_saas/main/js/views/glj_view.js

@@ -705,15 +705,10 @@ var gljOprObj = {
         return temRationGLJs;
     },
     showQuantityDetailData: function (node) {
-        var details = [];
         node = node ? node : projectObj.project.mainTree.selected;
         var quantity_detail = projectObj.project.quantity_detail;
-        if (node.sourceType == ModuleNames.ration) {
-            details = _.filter(quantity_detail.datas, {'rationID': node.data.ID});
-        } else if (node.sourceType == ModuleNames.bills) {
-            details = _.filter(quantity_detail.datas, {'billID': node.data.ID});
-        }
-        details = _.sortBy(details, 'seq');
+        let field = node.sourceType == ModuleNames.ration?'rationID':'billID';
+        let details = quantity_detail.getListByID(node.data.ID,field);
         sheetCommonObj.showData(this.detailSheet, this.detailSetting, details);
         this.detailData = details;
         if (MainTreeCol.readOnly.forQuantifyDetail(node)) {
@@ -1102,13 +1097,8 @@ var gljOprObj = {
             objectArray.push(obj);
         }
         for (let o of objectArray) {
-            var node = _.find(projectObj.project.mainTree.items, function (n) {
-                return n.sourceType == o.type && n.data.ID == o.ID;
-            })
+            let node = this.updateDataNodeProperty(o.ID,o.data);
             if (node) {
-                for (var k in o.data) {
-                    node.data[k] = o.data[k];
-                }
                 nodes.push(node);
             }
         }
@@ -1116,6 +1106,15 @@ var gljOprObj = {
         return nodes;
 
     },
+    updateDataNodeProperty:function(nodeID,data){
+        let node =  projectObj.project.mainTree.findNode(nodeID);
+        if (node) {
+            for (let k in data) {
+                node.data[k] = data[k];
+            }
+        }
+        return node;
+    },
     getTreeNodeCellType: function (data) {
         var ns = GC.Spread.Sheets;
         var rectW = 10;

+ 80 - 42
web/building_saas/main/js/views/glj_view_contextMenu.js

@@ -142,12 +142,15 @@ var gljContextMenu = {
                     name: '插入行',
                     icon: 'fa-sign-in',
                     disabled: function () {
-                        var sheetData = gljOprObj.detailData;
-                        if(gljOprObj.detailSheetReadonly()){
-                            return true
-                        }else {
-                            return  gljContextMenu.selectedRow>sheetData.length;
+                        if(subSpread.getActiveSheet().name()=='quantity_detail'){
+                            var sheetData = gljOprObj.detailData;
+                            if(gljOprObj.detailSheetReadonly()){
+                                return true
+                            }else {
+                                return  gljContextMenu.selectedRow>sheetData.length;
+                            }
                         }
+                       return false
                     },
                     callback: function () {
                         projectObj.project.quantity_detail.insertQuantityDetail(gljContextMenu.selectedRow);
@@ -160,8 +163,11 @@ var gljContextMenu = {
                     name: '删除行',
                     icon: 'fa-remove',
                     disabled: function () {
-                        var sheetData = gljOprObj.detailData;
-                        return gljContextMenu.selectedRow>sheetData.length-1;
+                        if(subSpread.getActiveSheet().name()=='quantity_detail'){
+                            var sheetData = gljOprObj.detailData;
+                            return gljContextMenu.selectedRow>sheetData.length-1;
+                        }
+                       return false
                     },
                     callback:function () {
                         projectObj.project.quantity_detail.deleteQuantityDetail(gljContextMenu.selectedRow);
@@ -174,8 +180,11 @@ var gljContextMenu = {
                     name: '上移',
                     icon: 'fa-arrow-up',
                     disabled: function () {
-                        var sheetData = gljOprObj.detailData;
-                        return gljContextMenu.selectedRow==0||gljContextMenu.selectedRow>sheetData.length-1;
+                        if(subSpread.getActiveSheet().name()=='quantity_detail'){
+                            var sheetData = gljOprObj.detailData;
+                            return gljContextMenu.selectedRow==0||gljContextMenu.selectedRow>sheetData.length-1;
+                        }
+                       return false;
                     },
                     callback: function () {
                         projectObj.project.quantity_detail.moveUp(gljContextMenu.selectedRow);
@@ -188,8 +197,11 @@ var gljContextMenu = {
                     name: '下移',
                     icon: 'fa-arrow-down',
                     disabled: function () {
-                        var sheetData = gljOprObj.detailData;
-                        return gljContextMenu.selectedRow>sheetData.length-2;
+                        if(subSpread.getActiveSheet().name()=='quantity_detail'){
+                            var sheetData = gljOprObj.detailData;
+                            return gljContextMenu.selectedRow>sheetData.length-2;
+                        }
+                      return false;
                     },
                     callback: function () {
                         projectObj.project.quantity_detail.moveDown(gljContextMenu.selectedRow);
@@ -202,10 +214,18 @@ var gljContextMenu = {
                     name: '复制',
                     icon: 'fa-files-o',
                     disabled: function () {
-                        var sheet = subSpread.getActiveSheet();
-                        var sheetData = gljOprObj.detailData;
-                        var value = sheet.getCell(gljContextMenu.selectedRow,gljContextMenu.selectedCol).value();
-                        return gljContextMenu.selectedRow>sheetData.length-1||value==null;
+                        if(subSpread.getActiveSheet().name()=='quantity_detail'){
+                            let sheet = subSpread.getActiveSheet();
+                            let sheetData = gljOprObj.detailData;
+                            let value = sheet.getCell(gljContextMenu.selectedRow,gljContextMenu.selectedCol).value();
+                            if(gljContextMenu.selectedRow>sheetData.length-1||value==null){
+                                return true;
+                            }
+                            if(gljOprObj.detailSetting.header[gljContextMenu.selectedCol].dataCode == 'isSummation'){//累加列恢显
+                                return true;
+                            }
+                        }
+                        return false;
                     },
                     callback: function () {
                         gljContextMenu.clipboard={
@@ -221,8 +241,18 @@ var gljContextMenu = {
                     name: '粘贴',
                     icon: 'fa-clipboard',
                     disabled: function () {
-                        var sheetData = gljOprObj.detailData;
-                        return gljContextMenu.selectedRow>sheetData.length||gljContextMenu.clipboard==null;
+                        if(subSpread.getActiveSheet().name()=='quantity_detail'){
+                            let sheetData = gljOprObj.detailData;
+                            let dataCode = gljOprObj.detailSetting.header[gljContextMenu.selectedCol].dataCode;
+                            if(gljContextMenu.selectedRow>sheetData.length||gljContextMenu.clipboard==null){
+                                return true;
+                            }
+                            //结果列和累加列灰显
+                            if(dataCode == 'result' || dataCode == 'isSummation'){
+                                return true;
+                            }
+                        }
+                        return false;
                     },
                     callback: function () {
                         var sheet = subSpread.getActiveSheet();
@@ -243,13 +273,15 @@ var gljContextMenu = {
                     name: '修改规则',
                     icon: 'fa-sign-in',
                     disabled: function () {//当选中空行或者ruleID为空的情况下,灰显
-                        let sheetData = installationFeeObj.rationInstallData;
-                        if(gljContextMenu.selectedRow>sheetData.length-1){
-                            return true
-                        }
-                        let ri = sheetData[gljContextMenu.selectedRow];
-                        if(!ri.ruleId||ri.ruleId==''){
-                            return true;
+                        if(subSpread.getActiveSheet().name()=='rationInstallSheet'){
+                            let sheetData = installationFeeObj.rationInstallData;
+                            if(gljContextMenu.selectedRow>sheetData.length-1){
+                                return true
+                            }
+                            let ri = sheetData[gljContextMenu.selectedRow];
+                            if(!ri.ruleId||ri.ruleId==''){
+                                return true;
+                            }
                         }
                         return false;
                     },
@@ -264,12 +296,14 @@ var gljContextMenu = {
                     name: '应用到当前分项',
                     icon: 'fa-sign-in',
                     disabled: function () {
-                        let sheetData = installationFeeObj.rationInstallData;
-                        if(gljContextMenu.selectedRow>sheetData.length-1){
-                            return true;
-                        }
-                        if(sheetData[gljContextMenu.selectedRow].unifiedSetting == 1){
-                            return true;
+                        if(subSpread.getActiveSheet().name()=='rationInstallSheet'){
+                            let sheetData = installationFeeObj.rationInstallData;
+                            if(gljContextMenu.selectedRow>sheetData.length-1){
+                                return true;
+                            }
+                            if(sheetData[gljContextMenu.selectedRow].unifiedSetting == 1){
+                                return true;
+                            }
                         }
                         return false;
                     },
@@ -284,12 +318,14 @@ var gljContextMenu = {
                     name: '应用到当前分部',
                     icon: 'fa-sign-in',
                     disabled: function () {
-                        let sheetData = installationFeeObj.rationInstallData;
-                        if(gljContextMenu.selectedRow>sheetData.length-1){
-                            return true;
-                        }
-                        if(sheetData[gljContextMenu.selectedRow].unifiedSetting == 1){
-                            return true;
+                        if(subSpread.getActiveSheet().name()=='rationInstallSheet'){
+                            let sheetData = installationFeeObj.rationInstallData;
+                            if(gljContextMenu.selectedRow>sheetData.length-1){
+                                return true;
+                            }
+                            if(sheetData[gljContextMenu.selectedRow].unifiedSetting == 1){
+                                return true;
+                            }
                         }
                         return false;
                     },
@@ -304,12 +340,14 @@ var gljContextMenu = {
                     name: '应用到当前项目',
                     icon: 'fa-sign-in',
                     disabled: function () {
-                        let sheetData = installationFeeObj.rationInstallData;
-                        if(gljContextMenu.selectedRow>sheetData.length-1){
-                            return true;
-                        }
-                        if(sheetData[gljContextMenu.selectedRow].unifiedSetting == 1){
-                            return true;
+                        if(subSpread.getActiveSheet().name()=='rationInstallSheet'){
+                            let sheetData = installationFeeObj.rationInstallData;
+                            if(gljContextMenu.selectedRow>sheetData.length-1){
+                                return true;
+                            }
+                            if(sheetData[gljContextMenu.selectedRow].unifiedSetting == 1){
+                                return true;
+                            }
                         }
                         return false;
                     },

+ 1 - 1
web/building_saas/main/js/views/installation_fee_view.js

@@ -3,7 +3,7 @@
  */
 let installationFeeObj={
     rationInstallSheet:null,
-    rationInstallData:null,
+    rationInstallData:[],
     rationInstallSetting:{
         header: [
             {headerName: "按统一设置", headerWidth: 80, dataCode: "unifiedSetting", dataType: "String",cellType: "checkBox"},

+ 2 - 2
web/building_saas/main/js/views/project_glj_view.js

@@ -27,8 +27,8 @@ projectGljObject={
             {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String"},
             {headerName: "规格型号", headerWidth: 120, dataCode: "specs", hAlign: "left", dataType: "String"},
             {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
-            {headerName: "定额价", headerWidth: 70, dataCode: "basePrice", hAlign: "right", dataType: "Number",decimalField:'glj.unitPrice',validator:"number"},
-            {headerName: "市场价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",decimalField:"glj.unitPrice",validator:"number"},
+            {headerName: "定额价", headerWidth: 70, dataCode: "basePrice", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:'glj.unitPrice'
+            {headerName: "市场价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:"glj.unitPrice"
             {headerName: "总消耗量", headerWidth: 100, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
             {headerName: "三材系数", headerWidth: 100, dataCode: "materialCoe", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:'material'
             {headerName: "三材量", headerWidth: 100, dataCode: "materialQuantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},

+ 0 - 2
web/building_saas/main/js/views/project_property_decimal_view.js

@@ -140,8 +140,6 @@ function toUpdateDecimal(orgV, newV){
 }
 
 function setDecimal(_digits, data){
-    console.log(_digits);
-    console.log(data)
     if(isDef(data)){
         for(let attr in data){
             _digits[attr] = returnV(data[attr], defaultDecimal['_def'][attr]['data']);

+ 20 - 48
web/building_saas/main/js/views/project_view.js

@@ -277,8 +277,8 @@ var projectObj = {
         let stdMatchCode, formatCode, matchs;
         let searchStdBillsAndUpdate = function (stdCode, formatCode) {
             let orgCode = node.data.code?node.data.code.substr(0, 9):"";
-            if (stdCode === orgCode || projectInfoObj.projectInfo.engineeringInfo.bill_lib.length === 0) {
-                normalUpdate(node,value);
+            if (projectInfoObj.projectInfo.engineeringInfo.bill_lib.length === 0) {
+                normalUpdate(node,value,stdCode === orgCode);
             } else if (projectInfoObj.projectInfo.engineeringInfo.bill_lib.length > 0) {
                 let libId = projectInfoObj.projectInfo.engineeringInfo.bill_lib[0].id;
                 CommonAjax.post('/stdBillsEditor/getStdBillsByCode', {userId: userID, billsLibId: libId, code: stdCode}, function (data) {
@@ -334,23 +334,29 @@ var projectObj = {
                     searchStdBillsAndUpdate(stdMatchCode, value);
                     return;
                 } else {
-                   if (confirm('已存在该编码的清单,是否继续?')) {
+                    hintBox.infoBox("系统提示","已存在该编码的清单,是否继续?",2,function () {
+                        searchStdBillsAndUpdate(stdMatchCode, value);
+                    },function () {
+                        me.mainController.refreshTreeNode([node], false);
+                    },['确定','取消']);
+                    return;
+                   /*if (confirm('已存在该编码的清单,是否继续?')) {
                        // formatCode = project.Bills.newFormatCode(stdMatchCode, node.data.code);
                         searchStdBillsAndUpdate(stdMatchCode, value);
                         return;
                     }else {
                        this.mainController.refreshTreeNode([node], false);
                        return;
-                   }
+                   }*/
                 }
             }
         }
         normalUpdate(node,value);
 
 
-        function normalUpdate(billnode,codeValue) {//在标准库中没有找到清单时改分项为补项再更新
+        function normalUpdate(billnode,codeValue,onNeedCheck) {//在标准库中没有找到清单时改分项为补项再更新
             let toBX = false;
-            if(billnode.data.type == billType.FX){
+            if(onNeedCheck!==true && billnode.data.type == billType.FX){
                 billnode.data.type = billType.BX;
                  toBX = true;
             }
@@ -552,9 +558,9 @@ var projectObj = {
         projectObj.mainSpread.repaint();
     },
     mainSpreadEditEnded: function (sender, info) {
+        console.log('enterEDEnd');
         let project = projectObj.project;
         let node = project.mainTree.items[info.row];
-        console.log( project.withinBillsLocked(node));
         project.withinBillsLocked(node);
         let colSetting = projectObj.mainController.setting.cols[info.col];
         let fieldName = projectObj.mainController.setting.cols[info.col].data.field;
@@ -696,8 +702,9 @@ var projectObj = {
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.beforeTreeSelectedChange, that.beforeMainTreeSelectedChange);
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, that.treeSelectedChanged);
                 if(!projectReadOnly){
-                    that.bindEnterKey(that.mainSpread, 'mainEnterKey', that.mainSpreadEnterKey);
+                    sheetCommonObj.bindEnterKey(that.mainSpread, that.mainSpreadEnterKey);
                 }
+                sheetCommonObj.bindEscKey(that.mainSpread, that.mainSpreadEditStarting, that.mainSpreadEditEnded);
                 setTimeout(function () {
                     that.mainSpread.getActiveSheet().startEdit();//这两句需要挺多时间,而又需要在editend 事件前触发,而这些又不影响计算,所以这里用异步的方法
                     that.mainSpread.getActiveSheet().endEdit();
@@ -735,7 +742,6 @@ var projectObj = {
                 if(projectReadOnly){
                     disableSpread(that.mainSpread);
                 }
-                console.log(decimalObj.decimal());
                 $.bootstrapLoading.end();
             }
             else {
@@ -843,8 +849,6 @@ var projectObj = {
                     newCol = quantityCol;
                 }
             }
-
-
         }
         //设置焦点
         sheet.setActiveCell(newRow, newCol);
@@ -854,40 +858,6 @@ var projectObj = {
         me.mainSpreadEnterCell({type: 'EnterCell'}, {sheet: sheet, sheetName: sheet.name(), cancel: false, row: newRow, col: newCol});
 
     },
-    //注册自定义回车键事件
-    bindEnterKey: function (workBook, registerName, operation) {
-        let me = this;
-        let sheet = workBook.getActiveSheet();
-        workBook.commandManager().register(registerName, operation);
-       /* workBook.commandManager().register(registerName, function(){
-            operation();
-           /!* let orgRow = sheet.getActiveRowIndex();
-            let orgCol = sheet.getActiveColumnIndex();
-            if(sheet.isEditing()){
-                sheet.endEdit();
-            }
-            let code = sheet.getValue(orgRow, 0);
-            let newRow, newCol;
-            if(!me.currentCache[orgRow] && code !== undefined && code !== null && orgCol !== me.setting.header.length - 1){
-                newRow = orgRow;
-                newCol = orgCol + 1;
-                sheet.setActiveCell(newRow, newCol);
-            }
-            else{
-                newRow = orgRow + 1;
-                newCol = me.currentCache[orgRow + 1] ? orgCol : 0;
-                sheet.setActiveCell(newRow, newCol);
-            }*!/
-            //触发事件
-            /!*me.onLeaveCell({type: 'LeaveCell'}, {sheet: sheet, sheetName: sheet.name(), cancel: false, row: orgRow, col: orgCol});
-            me.onEnterCell({type: 'EnterCell'}, {sheet: sheet, sheetName: sheet.name(), cancel: false, row: newRow, col: newCol});
-            let newSels = [{row: newRow, rowCount: 1, col: newCol, colCount: 1}];
-            let oldSels = [{row: orgRow, rowCount: 1, col: orgRow, colCount: 1}];
-            me.onSelectionChanged({type: 'SelectionChanged'}, {sheet: sheet, sheetName: sheet.name(), newSelections: newSels, oldSelections: oldSels});*!/
-        });*/
-        workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.enter, false, false, false, false);
-        workBook.commandManager().setShortcutKey(registerName, GC.Spread.Commands.Key.enter, false, false, false, false);
-    },
     loadMainSpreadContextMenu: function () {
         var project = this.project, spread = this.mainSpread, controller = this.mainController;
         $.contextMenu({
@@ -1525,8 +1495,9 @@ var projectObj = {
     getBoldFontStyle: function (node, colSetting) {
         let style = new GC.Spread.Sheets.Style();
         if(node.sourceType !== this.project.Bills.getSourceType() || node.data.type !== billType.DXFY){
-            return null
+            return null;
         }
+
         //备注暂无字段
         let stringFields = [
             'code',
@@ -2248,12 +2219,10 @@ $('#customFile').change(function () {
     if(file.files.length > 0){
         $('.custom-file-label').text(`${file.files[0].name}`);
         $('#uploadAlert').hide();
-        console.log(file.files);
         //读取各个表及表名
         $.bootstrapLoading.start();
         let fileReader = new FileReader();
         fileReader.onload = function(ev) {
-            console.log('enter');
             try {
                 let data = ev.target.result;
                 // 以二进制流方式读取得到整份excel表格对象
@@ -2306,6 +2275,7 @@ $('#uploadConfirm').click(function () {
         //要去匹配的清单库(第一个)
         let matchBillLibId = projectInfoObj.projectInfo.engineeringInfo.bill_lib.length > 0 ? projectInfoObj.projectInfo.engineeringInfo.bill_lib[0].id : null;
         formData.append('billsLibId', matchBillLibId);
+        let uploadS = +new Date();
         $.ajax({
             url: '/bills/upload',
             type: 'POST',
@@ -2322,6 +2292,8 @@ $('#uploadConfirm').click(function () {
                     if (message !== '') {
                         alert(message);
                     }
+                    let uploadE = +new Date();
+                    console.log(`导入时间:${uploadE-uploadS}`);
                     // 成功则关闭窗体
                     $('#import').modal("hide");
                     //更新前端

+ 4 - 0
web/building_saas/main/js/views/std_bills_lib.js

@@ -147,6 +147,10 @@ var billsLibObj = {
                     if(canAdd === false && $.bootstrapLoading.isLoading()){
                         $.bootstrapLoading.end();
                     }
+                }, function () {
+                    if($.bootstrapLoading.isLoading()){
+                        $.bootstrapLoading.end();
+                    }
                 });
             }
         } else {

+ 3 - 0
web/building_saas/main/js/views/sub_view.js

@@ -244,6 +244,9 @@ $("#add-content").change(function() {
             serialTypeEle.val('');
             serialTypeEle.attr('disabled', 'disabled');
             break;
+        case '':
+            characterFormatEle.attr('disabled', 'disabled');
+            break;
         case '1':
         case '2':
         case '3':

+ 38 - 3
web/building_saas/pm/js/pm_newMain.js

@@ -276,6 +276,38 @@ const projTreeObj = {
                         $('#allowCopyHint').hide();
                     }
                 },
+                "spr3": '--------',
+                "manageFiles": {
+                    name: "管理相关文件",
+                    icon: 'fa-list',
+                    disabled: function () {
+                        let selectedItem = projTreeObj.tree.selected;
+                        return !(selectedItem && selectedItem.data.projType !== projectType.folder);
+                    },
+                    callback: function (key, opt) {
+                        setDataToSideBar();
+                        $(".slide-sidebar").animate({width:"440"}).addClass("open");
+                        setTimeout(function () {
+                            $("body").bind('click', function (event) {
+                                var e = event || window.event; //浏览器兼容性
+                                if (!$(event.target).is('a')) {
+                                    var elem = event.target || e.srcElement;
+                                    while (elem) { //循环判断至跟节点,防止点击的是div子元素
+                                        if (elem.className == "open-sidebar" || elem.className == 'slide-sidebar open') {
+                                            return false;
+                                        }
+                                        if($(elem).attr('id') && $(elem).attr('id') === 'del-wj'){
+                                            return false;
+                                        }
+                                        elem = elem.parentNode;
+                                    }
+                                    $(".slide-sidebar").animate({width: "0"}).removeClass("open")// 关闭处理
+                                    $('body').unbind('click');
+                                }
+                            });
+                        }, 500);
+                    }
+                }
             }
         });
     },
@@ -711,7 +743,7 @@ const projTreeObj = {
             }
             if(hitinfo.sheet.name() != "copyToSheet"){//如果是复制到sheet,不用执行
                 //建设项目,侧滑汇总
-                if(node.data.projType === projectType.project && withingClickArea() && !$('.slide-sidebar').hasClass('open')){
+                /*if(node.data.projType === projectType.project && withingClickArea() && !$('.slide-sidebar').hasClass('open')){
                     setDataToSideBar();
                     $(".slide-sidebar").animate({width:"440"}).addClass("open");
                     setTimeout(function () {
@@ -733,9 +765,9 @@ const projTreeObj = {
                             }
                         });
                     }, 500);
-                }
+                }*/
                 //单项文件,进入造价书界面
-                else if(node.data.projType === projectType.tender && withingClickArea()){
+                 if(node.data.projType === projectType.tender && withingClickArea()){
                     let timeoutTime = 200;
                     if($('.slide-sidebar').hasClass('open')){
                         timeoutTime = 500;
@@ -2694,6 +2726,9 @@ function setDataToSideBar() {
     // 获取当前点击的数据
     let that = projTreeObj;
     let selectedItem = that.tree.selected;
+    while ([projectType.tender, projectType.engineering].includes(selectedItem.data.projType) && selectedItem.parent){
+        selectedItem = selectedItem.parent;
+    }
     let name = selectedItem.data.name;
     let target = selectedItem.data.projType === projectType.project ? '#summary-project' : '#summary-engineering';
     $(".side-content .p-3").hide();