Bläddra i källkod

三材设备相关功能

zhangweicheng 7 år sedan
förälder
incheckning
cc556dcb8d

+ 26 - 0
public/web/common_ajax.js

@@ -118,3 +118,29 @@ var CommonAjax = {
         });
     }
 };
+
+/**
+ * 设置全局的AJAX请求默认选项
+ * 主要设置了AJAX请求遇到Session过期的情况
+ */
+$.ajaxSetup({
+    complete: function (data) {
+        if (data.responseJSON&&data.responseJSON.ret_code && data.responseJSON.ret_code == 99) {
+            alert(data.responseJSON.ret_msg);
+            var top = getTopWindow();
+            setTimeout('top.location.href = "/login";', 300);
+        }
+    }
+});
+
+/**
+ * 在页面中任何嵌套层次的窗口中获取顶层窗口
+ * @return 当前页面的顶层窗口对象
+ */
+function getTopWindow() {
+    var p = window;
+    while (p != p.parent) {
+        p = p.parent;
+    }
+    return p;
+}

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

@@ -427,6 +427,9 @@ var TREE_SHEET_HELPER = {
                 if (colSetting.showHint) {
                     sheet.getRange(-1, iCol, -1, 1).cellType(new TipCellType());
                 }
+                if(colSetting.formatter){
+                    sheet.setFormatter(-1, iCol, colSetting.formatter, GC.Spread.Sheets.SheetArea.viewport);
+                }
             });
             sheet.getRange(-1, setting.treeCol, -1, 1).cellType(new TreeNodeCellType());
             TREE_SHEET_HELPER.refreshTreeNodeData(setting, sheet, tree.roots, true);

+ 8 - 1
server.js

@@ -63,7 +63,14 @@ app.use(function (req, res, next) {
             // 判断session
             let sessionUser = req.session.sessionUser;
             if (!sessionUser) {
-                throw 'session error';
+                //处理 ajax 请求 session 过期问题
+                if (req.headers["x-requested-with"] != null
+                    && req.headers["x-requested-with"] == "XMLHttpRequest"
+                    && req.url != "/login") {
+                    return res.json({ret_code: 99, ret_msg: '登录信息失效,请您重新登录'});
+                }else {
+                    throw 'session error';
+                }
             }
             res.locals.sessionUser = sessionUser;
         } catch (error) {

+ 11 - 0
web/building_saas/js/global.js

@@ -95,3 +95,14 @@ function removeLocalCache(key) {
     }
     return storage.removeItem(key);
 }
+
+function getFormatter(decimal) {
+    var pre = "0.";
+    if (decimal <= 0) {
+        return "0";
+    }
+    for (let i = 0; i < decimal; i++) {
+        pre += "0"
+    }
+    return pre;
+}

+ 0 - 2
web/building_saas/main/js/models/composition.js

@@ -140,7 +140,6 @@ Composition.prototype.updateConsumptionInCache = function (pid,recode,updateData
 
 
 Composition.prototype.updateConsumption = function (updateData,recode,pid,callback){
-    console.log(updateData);
     let me = this;
     $.bootstrapLoading.start();
     CommonAjax.specialPost( '/glj/update',updateData,function (result) {
@@ -151,5 +150,4 @@ Composition.prototype.updateConsumption = function (updateData,recode,pid,callba
         }
         $.bootstrapLoading.end();
     })
-
 };

+ 0 - 10
web/building_saas/main/js/views/glj_view.js

@@ -1877,16 +1877,6 @@ function getDecimal(fieldID, node) {
     }
 }
 
-function getFormatter(decimal) {
-    var pre = "0.";
-    if (decimal <= 0) {
-        return "0";
-    }
-    for (i = 0; i < decimal; i++) {
-        pre += "0"
-    }
-    return pre;
-}
 
 function sortRationGLJ(list) {
     list = _.sortByAll(list, [function (item) {

+ 79 - 60
web/building_saas/main/js/views/project_glj_view.js

@@ -85,6 +85,7 @@ projectGljObject={
         if(!this.projectGljSpread){
             this.projectGljSpread = SheetDataHelper.createNewSpread($("#project_glj_sheet")[0],2);
         }
+        this.projectGljSpread.bind(GC.Spread.Sheets.Events.RangeChanged, this.onProjectGljRangeChange);
         this.initProjectGljSheet();
         this.initMaterialTreeSheet();
     },
@@ -93,7 +94,6 @@ projectGljObject={
         this.initSheet(this.projectGljSheet,this.projectGljSetting);
         this.projectGljSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onProjectGljSelectionChange);
         this.projectGljSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onProjectGljEditStarting);
-        this.projectGljSpread.bind(GC.Spread.Sheets.Events.RangeChanged, this.onProjectGljRangeChange);
         this.projectGljSheet.name('projectGljSheet');
     },
     initMixRatio:function () {
@@ -102,7 +102,6 @@ projectGljObject={
             me.initMixRatioSpread();
             me.initRightClick();
         }
-        me.showMixRatioData();
     },
     initMixRatioSpread:function () {
         this.mixRatioSpread = SheetDataHelper.createNewSpread($("#mix_ratio_sheet")[0]);
@@ -116,7 +115,8 @@ projectGljObject={
         this.materialTree = cacheTree.createNew(this);
         this.materialTreeController = TREE_SHEET_CONTROLLER.createNew(this.materialTree, this.materialTreeSheet, this.materialTreeSetting);
         this.materialTreeController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, this.onSelectionChange);
-        this.materialTreeSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onMaterialTreeEditStarting);
+        this.materialTreeSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onProjectGljEditStarting);
+        this.materialTreeSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onProjectGLJValueChange);
         this.materialTreeSheet.name('materialTreeSheet');
     },
     createMaterialTreeSheetSetting:function () {
@@ -127,7 +127,6 @@ projectGljObject={
             this.materialTreeSetting.cols[l].readOnly = true;
         }
         return this.materialTreeSetting;
-
         function getSettingCol(header) {
             let aMap ={left:0,center:1,right:2};
             let hAlign = header.hAlign?aMap[header.hAlign]:0;
@@ -151,10 +150,18 @@ projectGljObject={
             if(header.cellType){
                 col.data.cellType = getCellType(header);
             }
+            if(header.decimalField){//设置formatter
+                let decimal = getDecimal(header.decimalField);
+                col.formatter = getFormatter(decimal);
+            }
+            col.readOnly = function (node) {
+                if(node.data.ParentID == -1 || node.data.id == 'GJ'){//三材类别项不能编辑)
+                    return true;
+                }
+                return false;
+            };
             return col;
         }
-
-        
         function getCellType(header) {
             return function () {
                 if(header.cellType === "checkBox"){
@@ -190,6 +197,7 @@ projectGljObject={
     showMixRatioData:function () {
         let me = this,gljId = null,gljType = null;
         let sheet = me.projectGljSpread.getActiveSheet();
+        let oldSel = me.mixRatioSheet.getSelections()[0];
         if(sheet.name() == 'projectGljSheet'){//projectGljSheet/materialSheet 工料机汇总和三材汇总表
             let sel = me.projectGljSheet.getSelections()[0];
             let srow = sel.row == -1?0:sel.row;
@@ -218,6 +226,7 @@ projectGljObject={
             me.mixRatioSheet.setRowCount(0);
             sheetCommonObj.showData(me.mixRatioSheet, me.mixRatioSetting,me.mixRatioData);
             me.mixRatioSheet.setRowCount(me.mixRatioData.length);
+            me.mixRatioSheet.setSelection(oldSel.row==-1?0:oldSel.row,oldSel.col,oldSel.rowCount,oldSel.colCount);
         })
     },
     getMixRatioSheetData:function (glj) {
@@ -246,9 +255,17 @@ projectGljObject={
     },
     projectGljEditChecking:function (row,col) {//return false表示不能编辑
         let me = projectGljObject;
-        let data = me.projectGljSheetData[row];
-        let dataCode = me.projectGljSetting.header[col].dataCode;
-        let lockColumns = me.projectGljSetting.view.lockColumns;
+        let data = null, setting=null;
+        let sheet = me.projectGljSpread.getActiveSheet();
+        if(sheet.name() ==  'projectGljSheet'){
+            data = me.projectGljSheetData[row];
+            setting = me.projectGljSetting;
+        }else if(sheet.name() ==  'materialTreeSheet'){
+            data = me.materialTree.selected.data;
+            setting = me.materialSetting;
+        }
+        let dataCode = setting.header[col].dataCode;
+        let lockColumns = setting.view.lockColumns;
 
         if(lockColumns.indexOf(col)!= -1){
             return false;
@@ -277,19 +294,12 @@ projectGljObject={
         me.showMixRatioData();
         me.materialTreeSheet.repaint();
     },
-    onMaterialTreeEditStarting:function (sender, args) {
-        let me = projectGljObject;
-        let selected = me.materialTree.selected;
-        if(selected && (selected.data.ParentID == -1 || selected.data.id == 'GJ')){//三材类别项不能编辑
-            args.cancel = true;
-        }
-
-    },
     onProjectGljSelectionChange:function (sender, args) {
         let me = projectGljObject;
         let newSel = args.newSelections[0];
         let oldSel = args.oldSelections?args.oldSelections[0]:{};
         if(newSel.row != oldSel.row){
+            me.mixRatioSheet.getSelections()[0].row = -1;
             me.showMixRatioData();
         }
         me.projectGljSheet.repaint();
@@ -318,8 +328,8 @@ projectGljObject={
             }
         }
         if(canChange == false){//恢复原来的值
-            me.showProjectGljData();
-        }else {
+            info.sheetName =="materialTreeSheet"?me.showMaterialTreeData():me.showProjectGljData();
+        }else if(info.sheetName =="projectGljSheet"){
              me.batchUpdatePrice(changeInfo);
         }
     },
@@ -351,18 +361,27 @@ projectGljObject={
     showMaterialTreeData:function () {
         this.projectGljSpread.setActiveSheetIndex(1);
         let sel = this.materialTreeSheet.getSelections()[0];
-        let selNode = this.materialTree.selected;
         let gljList = projectObj.project.projectGLJ.datas.gljList;
         gljList = _.sortByAll(gljList, [ 'code']);
         this.createMaterialTree(gljList);
         this.materialTreeController.showTreeData();
         this.materialTreeSheet.setSelection(sel.row==-1?0:sel.row,sel.col,sel.rowCount,sel.colCount);
-        this.materialTreeController.setTreeSelected(selNode);
+        this.materialTreeController.setTreeSelected(this.materialTree.items[sel.row==-1?0:sel.row]);
+    },
+    refreshDataSheet:function () {
+        let me = projectGljObject;
+        if(me.displayType == filterType.SCHZ){//三材汇总树节点
+            me.showMaterialTreeData();
+        }else {
+            me.showProjectGljData();
+            me.showMixRatioData();
+        }
     },
+
     createMaterialTree:function (gljList) {
         let me = projectGljObject;
         let q_decimal = getDecimal("glj.quantity");
-        let GC = {id:'GC',name:materialType[materialTypeMap.GC],code:'GC',unit:'t',ParentID:-1,NextSiblingID:'MC'};//000001
+        let GC = {id:'GC',name:materialType[materialTypeMap.GC],code:'GC',unit:'t',ParentID:-1,NextSiblingID:'MC'};
         let GJ = {id:'GJ',name:materialType[materialTypeMap.GJ],code:'GJ',unit:'t',ParentID:'GC',NextSiblingID:-1};
         let MC = {id:'MC',name:materialType[materialTypeMap.MC],code:'MC',unit:'t',ParentID:-1,NextSiblingID:'SN'};
         let SN = {id:'SN',name:materialType[materialTypeMap.SN],code:'SN',unit:'m3',ParentID:-1,NextSiblingID:'SZ'};
@@ -503,11 +522,7 @@ projectGljObject={
             bgColour:'white'
         };
         gljOprObj.setGLJPrice(data,glj);
-
-
         data.is_main_material = glj.is_main_material == 1?1:0;
-
-
         //供货方式为完全甲供时设置甲供数量为总消耗量
         if (data.supply == 2) {
             data.supply_quantity = glj.quantity;
@@ -545,8 +560,6 @@ projectGljObject={
             me.showMixRatioData();
         }
         //me.projectGljSheetData[row] = me.getSheetDataByGLJ(glj);
-
-
     },
     initSheet: function (sheet,setting) {
         var me = this;
@@ -567,6 +580,7 @@ projectGljObject={
         let dataCode = me.mixRatioSetting.header[col].dataCode;
         let recode = me.mixRatioData[row];
         let value = info.newValue;
+        let parentSheet =  me.projectGljSpread.getActiveSheet();//三材汇总表和工料机汇总表
         if (!me.checkData(col,me.mixRatioSetting,value)) {
             alert('输入的数据类型不对,请重新输入!');
             me.mixRatioSheet.setValue(row, col, info.oldValue);
@@ -575,16 +589,27 @@ projectGljObject={
         value = scMathUtil.roundToString(value,getDecimal("glj.quantity"));
         let [parentMarketPrice, parentBasePrice] = me.getCompositionSumPrice('modify', row, value);
         let updateData ={id: recode.mix_ratio_id, field: 'mix_ratio.' + dataCode, value: value, market_price: parentMarketPrice, base_price: parentBasePrice};
-        let prow= projectGljObject.projectGljSheet.getActiveRowIndex();//取父机械或组成物的下标
-        let prowData = projectGljObject.projectGljSheetData[prow];
+        let prow = parentSheet.getActiveRowIndex();//取父机械或组成物的下标
+        let prowData = parentSheet.name() == 'projectGljSheet'?me.projectGljSheetData[prow]:me.materialTree.items[prow].data;
         composition.updateConsumption(updateData,recode,prowData.id,function (sid) {
-            me.refreshProjectGljRowByID(sid);
+           /* if(parentSheet.name() == 'projectGljSheet'){ 之前是单行刷新,父工料机与组成物对应的工料机分开刷,发现这样比整个刷新慢所以先整个刷新,当以后数据量大的时候再测试
+                me.refreshProjectGljRowByID(sid);
+            }*/
             me.refreshParentData(prow,prowData.id,sid);
         });
     },
     refreshParentData:function (row,pid,sid) {
         let me = this;
-        me.refreshProjectGljRow(row);
+        let sheet = me.projectGljSpread.getActiveSheet();
+        let parantData = null;
+        if(sheet.name() == 'projectGljSheet'){
+            me.showProjectGljData();// me.refreshProjectGljRow(row)  这里原来是分开刷新的,现在整个统一刷新,先留着
+            parantData = me.projectGljSheetData[row];
+        }else {
+            me.showMaterialTreeData();
+            parantData = me.materialTree.items[row].data;
+        }
+
         // 更新组成物缓存
         projectObj.project.composition.loadData();
         //先查找使用了父项目工料机的定额工料机
@@ -601,7 +626,7 @@ projectGljObject={
         for(let r of rations){
             let r_node = projectObj.project.mainTree.getNodeByID(r.ID);
             if(r_node){
-                r_node.data.marketUnitFee =  projectGljObject.projectGljSheetData[row].marketPrice;//parentMarketPrice;//这里用显示的价格
+                r_node.data.marketUnitFee =  parantData.marketPrice;//parentMarketPrice;//这里用显示的价格
                 updateNodes.push(r_node);
             }
         }
@@ -620,8 +645,9 @@ projectGljObject={
         let me = this, deleteRecode = me.mixRatioData[row];
         let consumption = deleteRecode.consumption;
         let [parentMarketPrice, parentBasePrice] = me.getCompositionSumPrice('delete', row);
-        let prow= projectGljObject.projectGljSheet.getActiveRowIndex();//取父机械或组成物的下标
-        let prowData = projectGljObject.projectGljSheetData[prow];
+        let parentSheet =  me.projectGljSpread.getActiveSheet();//三材汇总表和工料机汇总表
+        let prow= parentSheet.getActiveRowIndex();//取父机械或组成物的下标
+        let prowData = parentSheet.name() == 'projectGljSheet'?me.projectGljSheetData[prow]:me.materialTree.items[prow].data;
         let updateData = {id: deleteRecode.mix_ratio_id, field: 'mix_ratio.consumption' , value: 0, market_price: parentMarketPrice, base_price: parentBasePrice};
         projectObj.project.composition.deleteComposition(updateData,deleteRecode,prowData.id,function () {
             me.refreshParentData(prow,prowData.id);
@@ -651,25 +677,30 @@ projectGljObject={
     onProjectGLJValueChange:function (e,info) {//me.projectGljSetting
         let projectGLJ = projectObj.project.projectGLJ;
         let me = projectGljObject,row = info.row, col = info.col;
-        let dataCode = me.projectGljSetting.header[col].dataCode;
-        let recode = me.projectGljSheetData[row];
+        let setting = info.sheetName =="materialTreeSheet"?me.materialSetting:me.projectGljSetting;
+        let dataCode = setting.header[col].dataCode;
+        let recode = info.sheetName =="materialTreeSheet"?me.materialTree.selected.data:me.projectGljSheetData[row];
         let value = info.newValue;
-        if(info.newValue == undefined ){
+        if(info.newValue === undefined ){
             return;
         }
-        if (!me.checkData(col,me.projectGljSetting,value)) {
+        if (!me.checkData(col,setting,value)) {
             setTimeout(function () {//为了不与click事件冲突
                 alert('输入的数据类型不对,请重新输入!');
             },200);
-            me.refreshProjectGljRow(row);
+            info.sheetName =="materialTreeSheet"?me.materialTreeController.refreshTreeNode([me.materialTree.selected]):me.refreshProjectGljRow(row);
             return ;
         }
         let callback=function (impactList) {
             info.sheet.suspendPaint();
             info.sheet.suspendEvent();
-            me.refreshProjectGljRow(row);
-            for(let g of impactList){
-                me.refreshProjectGljRowByID(g.id,row);
+            if(info.sheetName =="materialTreeSheet"){
+                me.showMaterialTreeData();
+            }else {
+                me.refreshProjectGljRow(row);
+                for(let g of impactList){
+                    me.refreshProjectGljRowByID(g.id,row);
+                }
             }
             info.sheet.resumeEvent();
             info.sheet.resumePaint();
@@ -764,7 +795,7 @@ projectGljObject={
     },
     changeFileCallback:function(){
         projectGljObject.unitPriceFileInit();
-        projectGljObject.showProjectGljData();
+        projectGljObject.refreshDataSheet();
         gljOprObj.refreshView();
         projectObj.project.calcProgram.calcAllNodesAndSave();
         if(socketObject.roomInfo){
@@ -790,7 +821,6 @@ projectGljObject={
     }
 };
 
-
 $(function () {
     let pojGljResizeEles = {};
     pojGljResizeEles.id = '#project-glj-main';
@@ -812,13 +842,10 @@ $(function () {
             me.initProjectGljSpread();
         }
         me.unitPriceFileInit();
-        //projectObj.project.projectGLJ.calcQuantity(); 在工程量有更新的地方调用
-        if(me.displayType == filterType.SCHZ){//三材汇总树节点
-            me.showMaterialTreeData();
-        }else {
-            me.showProjectGljData();
-        }
         me.initMixRatio();
+        //projectObj.project.projectGLJ.calcQuantity(); 在工程量有更新的地方调用
+        me.refreshDataSheet();
+
         loadSize(pojGljResizeEles, 'height', function () {
             me.projectGljSpread.refresh();
             me.mixRatioSpread?me.mixRatioSpread.refresh():'';
@@ -923,8 +950,6 @@ $(function () {
             $(".option.copy").show();
         }
     });
-
-
     $("#unitFile-save-as").on('shown.bs.modal', function () {
         // 获取当前建设项数据
         $("#save-as-name").val(projectGljObject.usedUnitPriceInfo.name + '副本');
@@ -960,14 +985,8 @@ $(function () {
     $("#filterType").on("click","ul li a",function(){
         let me = projectGljObject;
         me.displayType = filterType[this.id];
-        if(me.displayType == filterType.SCHZ){//三材汇总树节点
-            me.showMaterialTreeData();
-        }else {
-            me.showProjectGljData();
-            me.showMixRatioData();
-        }
+        me.refreshDataSheet();
     });
-
 });
 
 

+ 11 - 7
web/building_saas/main/js/views/project_view.js

@@ -659,17 +659,22 @@ var projectObj = {
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.beforeTreeSelectedChange, that.beforeMainTreeSelectedChange);
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, that.treeSelectedChanged);
 
-                that.mainSpread.getActiveSheet().startEdit();
-                that.mainSpread.getActiveSheet().endEdit();
+                setTimeout(function () {
+                    that.mainSpread.getActiveSheet().startEdit();//这两句需要挺多时间,而又需要在editend 事件前触发,而这些又不影响计算,所以这里用异步的方法
+                    that.mainSpread.getActiveSheet().endEdit();
+
+                    that.mainSpread.bind(GC.Spread.Sheets.Events.EditEnded, that.mainSpreadEditEnded);
+                },100);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.SelectionChanged, that.amountAreaNumber);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.LeaveCell, that.mainSpreadLeaveCell);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.EnterCell, that.mainSpreadEnterCell);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.EditStarting, that.mainSpreadEditStarting);
-                that.mainSpread.bind(GC.Spread.Sheets.Events.EditEnded, that.mainSpreadEditEnded);
+
                 that.mainSpread.bind(GC.Spread.Sheets.Events.RangeChanged, that.mainSpreadRangeChanged);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.ClipboardChanged, that.msClipboardChanged);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, that.onButtonClick);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, that.onCellDoubleClick);
+
                 //let loadOtherStartTime = +new Date();
                 that.loadMainSpreadContextMenu();
                 that.loadFocusLocation();
@@ -728,7 +733,7 @@ var projectObj = {
                             }
                             if(isFlag(selected.data)&&selected.data.flagsIndex.fixed.flag==fixedFlag.SUB_ENGINERRING){//焦点行是分部分项工程
                                 if(selected.children.length>0){
-                                   return selected.children[0].data.type==billType.FX;//焦点行是分部分项工程,且子项是分项
+                                   return selected.children[0].data.type==billType.FX ||selected.children[0].data.type==billType.BX;//焦点行是分部分项工程,且子项是分项或补项
                                 }else {
                                     return false
                                 }
@@ -1667,16 +1672,15 @@ $('#delete_row').on('shown.bs.modal', function (e) {
 
     function selectionChecking() {
         let selection = projectObj.mainSpread.getActiveSheet().getSelections()[0];
-        let mainTreeMap = {};
+        let mainTreeMap = {}, nodes = [];
         for(let i =0;i<selection.rowCount;i++){
             let tem_node = controller.tree.items[selection.row+i];
             if(i==0){//第一个直接添加;
                 mainTreeMap[tem_node.getID()] = tem_node;
             }else {
-                project.Bills.setNodeToMap(tem_node,mainTreeMap);
+                project.Bills.setNodeToMapAndArray(tem_node,mainTreeMap,nodes);
             }
         }
-        let nodes = changeMapToArray(mainTreeMap);
         if(nodes.length==1){
             return true
         }