瀏覽代碼

Merge branch '1.0.0_online' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost into 1.0.0_online

zhangweicheng 6 年之前
父節點
當前提交
dda12845f8

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

@@ -638,7 +638,7 @@
                                                     </div>
                                                 </div>
                                             </div>
-                                            <h5 class="mt-3">工料机</h5>
+                                            <h5 class="mt-3">人材机</h5>
                                             <div class="row m-0">
                                                 <div class="col-sm-3">
                                                     <div class="input-group input-group-sm mb-2">

+ 6 - 4
web/building_saas/main/js/controllers/project_controller.js

@@ -114,6 +114,7 @@ ProjectController = {
             newNode.data = newSource.data;
 
             this.syncDisplayNewNode(sheetController, newNode);
+            return newNode;
         }
         function getSubType(node){
             for(let sub of node.children){
@@ -135,10 +136,10 @@ ProjectController = {
         if (!project || !sheetController) { return null; }
         let selected = project.mainTree.selected;
         if(selected.parent==null&&isFlag(selected.data)&&selected.data.flagsIndex.fixed.flag==fixedFlag.SUB_ENGINERRING){//选中的是分部分项,则插入做为最后一个子项
-            this.addSpecialBill(project, sheetController,selected, null,true,billType.FB);
+            return this.addSpecialBill(project, sheetController,selected, null,true,billType.FB);
         }
         if(selected.parent){
-            this.addSpecialBill(project, sheetController,selected.parent, selected.nextSibling,true,billType.FB);
+            return this.addSpecialBill(project, sheetController,selected.parent, selected.nextSibling,true,billType.FB);
         }
 
     },
@@ -147,11 +148,11 @@ ProjectController = {
         let selected = project.mainTree.selected;
         console.log(selected);
         if(selected.data.type==billType.FB||(selected.parent==null&&isFlag(selected.data)&&selected.data.flagsIndex.fixed.flag==fixedFlag.SUB_ENGINERRING)){//选中的是分部或者是分部分项工程,则插入做为最后一个子项
-            this.addSpecialBill(project, sheetController,selected, null,true,billType.FX);
+            return this.addSpecialBill(project, sheetController,selected, null,true,billType.FX);
         }
         if(selected.parent){
             if(selected.data.type==billType.FX||selected.data.type==billType.BX){
-                this.addSpecialBill(project, sheetController,selected.parent, selected.nextSibling,true,billType.FX);
+                return this.addSpecialBill(project, sheetController,selected.parent, selected.nextSibling,true,billType.FX);
             }
         }
     },
@@ -169,6 +170,7 @@ ProjectController = {
             newNode.sourceType = project.Bills.getSourceType();
             newNode.data = newSource.data;
             this.syncDisplayNewNode(sheetController, newNode);
+            return newNode;
         }
     },
 

+ 28 - 8
web/building_saas/main/js/models/calc_program.js

@@ -112,8 +112,20 @@ let calcTools = {
             treeNode.source.children &&
             treeNode.source.children.length === 0;
     },
-    isbigBill: function(treeNode){
-        return this.isBill(treeNode) && treeNode.data.type == 1;
+    isBill_DXFY: function(treeNode){
+        return this.isBill(treeNode) && treeNode.data.type == billType.DXFY;
+    },
+    isBill_FB: function(treeNode){
+        return this.isBill(treeNode) && treeNode.data.type == billType.FB;
+    },
+    isBill_FX: function(treeNode){
+        return this.isBill(treeNode) && treeNode.data.type == billType.FX;
+    },
+    isBill_BILL: function(treeNode){
+        return this.isBill(treeNode) && treeNode.data.type == billType.BILL;
+    },
+    isBill_BX: function(treeNode){
+        return this.isBill(treeNode) && treeNode.data.type == billType.BX;
     },
     isNullBill: function (treeNode) {
         return this.isLeafBill(treeNode) && (treeNode.children.length === 0) && (!treeNode.data.calcBase);
@@ -137,6 +149,13 @@ let calcTools = {
     isGljRation: function (treeNode) {
         return this.isRationCategory(treeNode) && treeNode.data.type === rationType.gljRation;
     },
+    isSameTypeNode: function (node1, node2) {
+        if (node1.parent && node2.parent && (node1.parent === node2.parent) && (node1.sourceType === node1.sourceType)
+            && (node1.data && node2.data && node1.data.type === node2.data.type)){
+            return true;
+        }
+        return false;
+    },
     isInheritFrom: function (treeNode, flagsArr){
         let cur = treeNode;
         while (cur.parent) {
@@ -279,10 +298,10 @@ let calcTools = {
                 let aprice = calcTools.hasAdjustPrice() ? me.uiGLJPrice(glj["adjustPrice"], glj) : me.uiGLJPrice(glj["basePrice"], glj);
 
                 if (priceType == priceTypes.ptDiffPrice){
-                    if (aprice != mprice){
+                    // if (aprice != mprice){
                         temp = (temp + (qty * mprice).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
                         temp2 = (temp2 + (qty * aprice).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
-                    }
+                    // }
                 }
                 else {
                     if (priceType == priceTypes.ptBasePrice){ price = me.uiGLJPrice(glj["basePrice"], glj);}
@@ -324,12 +343,13 @@ let calcTools = {
                     if (md.type == gljType.MACHINE_LABOUR) {
                         let q = md["consumption"] ? md["consumption"] : 0;
                         let p = md["basePrice"] ? md["basePrice"] : 0;
-                        mdSum = mdSum + (q * p).toDecimal(decimalObj.ration.unitPrice);
-                        mdSum = (mdSum).toDecimal(decimalObj.ration.unitPrice);
+                        mdSum = mdSum + (q * p).toDecimal(decimalObj.glj.unitPriceHasMix);
+                        mdSum = (mdSum).toDecimal(decimalObj.glj.unitPriceHasMix);
                     }
                 }
-                result = result + (gljQ * mdSum).toDecimal(decimalObj.process);
-                result = (result).toDecimal(decimalObj.process);
+                // result = result + (gljQ * mdSum).toDecimal(decimalObj.process);
+                result = result + (gljQ * mdSum).toDecimal(decimalObj.ration.unitPrice);
+                result = (result).toDecimal(decimalObj.ration.unitPrice);
             }
         }
         result = (result).toDecimal(decimalObj.ration.unitPrice);

+ 13 - 6
web/building_saas/main/js/models/ration.js

@@ -553,10 +553,10 @@ var Ration = {
             let selected = project.mainTree.selected, newSource = null, newNode = null,pre=null,br=null;
             let billItemID = null,serialNo=1,nextID=null;
             let needInstall = false;
-            if (selected === null) { return; }
+            if (selected === null) { return null; }
             if (selected.sourceType === project.Bills.getSourceType() && selected.depth() > 0) {
                 if(selected.data.type === billType.FB){
-                    return;
+                    return null;
                 }
                 else if (selected.source.children.length > 0) {
                     alert('当前清单已有清单子项,不能套用定额。');
@@ -576,7 +576,8 @@ var Ration = {
                 pre = selected.source;
             };
             if(billItemID){
-                let newData =  me.getTempRationData(me.getNewRationID(), billItemID, serialNo, rationType);
+                let newID = me.getNewRationID();
+                let newData =  me.getTempRationData(newID, billItemID, serialNo, rationType);
                 let calQuantity =  isEmpty===true?false:optionsOprObj.getOption(optionsOprObj.optionsTypes.GENERALOPTS, 'rationQuanACToBillsQuan');
                 let brUpdate = [];
                 //更新兄弟节点的序列号
@@ -592,6 +593,9 @@ var Ration = {
                     needInstall = project.Bills.isFBFX(billsNode);//在分部分项插入的定额才需要定额安装增加费
                 }
                 $.bootstrapLoading.start();
+                newNode = project.mainTree.insert(billItemID, nextID, newID);
+                newNode.sourceType = project.Ration.getSourceType();
+                newNode.data = newData;
                 CommonAjax.post("/ration/addNewRation",{itemQuery:itemQuery,newData:newData,firstLibID: rationLibObj.getFirstStdRationLibID(),calQuantity:calQuantity,brUpdate:brUpdate,needInstall:needInstall},function (data) {
                     //更新缓存
                     me.datas.push(data.ration);
@@ -601,12 +605,12 @@ var Ration = {
 
                     //插入树节点
                     newSource = data.ration;
-                    newNode = project.mainTree.insert(billItemID, nextID, newSource.ID);
+                    // newNode = project.mainTree.insert(billItemID, nextID, newSource.ID);  上移到post方法外部。批量粘贴时,先插入空行,前端等不了,先生成树结点,效果同清单处理方式。
                     newNode.source = newSource;
-                    newNode.sourceType = project.Ration.getSourceType();
+                    // newNode.sourceType = project.Ration.getSourceType();
                     newNode.data = newSource;
                     project.projectGLJ.loadData(function () {
-                        ProjectController.syncDisplayNewNode(sheetController, newNode);
+                        // ProjectController.syncDisplayNewNode(sheetController, newNode);
                         project.ration_glj.addToMainTree(data.ration_gljs);
                         projectObj.mainController.refreshTreeNode([newNode], false);
                         project.calcProgram.calcAndSave(newNode,function () {
@@ -622,7 +626,10 @@ var Ration = {
                         $.bootstrapLoading.end();
                     });
                 })
+                ProjectController.syncDisplayNewNode(sheetController, newNode);
+                return newNode;
             }
+            else return null;
 
         };
         ration.prototype.deleteSubListOfRation = function(ration){

+ 6 - 6
web/building_saas/main/js/views/calc_base_view.js

@@ -131,13 +131,13 @@ let calcBaseView = {
     isDef: function (v) {
         return v !== undefined && v !== null;
     },
-    ifEdit: function (type) {
+    //processMouseDown触发时间比SelectionChanged早,所以直接取selected是上一个节点的,需要传row取当前选中节点
+    ifEdit: function (type, row) {
         if (type == 'ration'){
             return true;
         }
         else{
-
-            var selected = projectObj.project.mainTree.selected;
+            let selected = projectObj.project.mainTree.items[row];
             return selected && MainTreeCol.readOnly.forCalcBase(selected)?false:true;
         }
     },
@@ -345,7 +345,7 @@ let calcBaseView = {
             // ctx.fillText(value,x+w-3,y+h-3);
             GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
             // }
-            if(calcBaseView.editingCell && !projectReadOnly && calcBaseView.ifEdit(type)){
+            if(calcBaseView.editingCell && !projectReadOnly && calcBaseView.ifEdit(type, options.row)){
                 if(calcBaseView.editingCell.row==options.row&&calcBaseView.editingCell.col==options.col){
                     var image = document.getElementById('f_btn'),imageMagin = 3;
                     var imageHeight = h-2*imageMagin;
@@ -381,7 +381,7 @@ let calcBaseView = {
             if(me.editingCell==null){
                 var showSelectBtn = true;
                 if(hitinfo.sheet.name()!='calc_detail'){
-                    showSelectBtn=me.ifEdit(type);
+                    showSelectBtn=me.ifEdit(type, hitinfo.row);
                 }
                 if(showSelectBtn){
                     me.editingCell={
@@ -397,7 +397,7 @@ let calcBaseView = {
                 var imageHeight = hitinfo.cellRect.height-2*imageMagin;
                 var imageWidth = hitinfo.cellRect.width*2/7;
                 if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
-                    if(!projectReadOnly && me.ifEdit(type)){
+                    if(!projectReadOnly && me.ifEdit(type, hitinfo.row)){
                         calcBaseView.initCalctor(type);
                     }
                 }

+ 5 - 4
web/building_saas/main/js/views/fee_rate_view.js

@@ -228,6 +228,7 @@ var feeRateObject={
 
         sheet.setSelection(rowIdx, -1, 1, -1);
         sheet.showRow(rowIdx, GC.Spread.Sheets.VerticalPosition.center);
+        feeRateObject.onCellClick({type: 'CellClick'}, {row:rowIdx});
     },
     getTreeNodeCellType:function () {
         var ns = GC.Spread.Sheets;
@@ -342,7 +343,7 @@ var feeRateObject={
             if(me.editingCell==null){
                 var showSelectBtn = true;
                 if(hitinfo.sheet.name()!='calc_detail'){
-                    showSelectBtn=me.ifFeeRateEdit();
+                    showSelectBtn=me.ifFeeRateEdit(hitinfo.row);
                 }
                 if(showSelectBtn){
                     me.editingCell={
@@ -358,7 +359,7 @@ var feeRateObject={
                 var imageHeight = hitinfo.cellRect.height-2*imageMagin;
                 var imageWidth = hitinfo.cellRect.width*2/7;
                 if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
-                    if(!projectReadOnly){
+                    if(!projectReadOnly && me.ifFeeRateEdit(hitinfo.row)){
                         me.showSelectModal(hitinfo);
                     }
                 }
@@ -405,8 +406,8 @@ var feeRateObject={
         }
         return children.length+sum;
     },
-    ifFeeRateEdit:function () {
-        var selected = projectObj.project.mainTree.selected;
+    ifFeeRateEdit:function (row) {
+        var selected = projectObj.project.mainTree.items[row];
         return selected&&MainTreeCol.readOnly.forFeeRate(selected)?false:true;
     },
     createSpreadView:function () {

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

@@ -100,7 +100,7 @@ let MainTreeCol = {
             return node.data.subType != 201 && node.data.subType != 4 && node.data.subType != 5
         },
         commonUnitFee: function (node) {
-            return !(calcTools.isLeafBill(node) && !calcTools.isbigBill(node) && !calcTools.isCalcBaseBill(node) && !calcTools.isInheritFrom(node, [fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE]));
+            return !(calcTools.isLeafBill(node) && !calcTools.isBill_DXFY(node) && !calcTools.isCalcBaseBill(node) && !calcTools.isInheritFrom(node, [fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE]));
         },
         //根据节点、父节点类型判断是否可用计算基数
         calcBaseType: function (node) {
@@ -394,7 +394,7 @@ let colSettingObj = {
         sheet.getRange(-1, 0, -1, 1).cellType(this.checkBox).hAlign(GC.Spread.Sheets.HorizontalAlign.center);
         sheet.getCell(0, 0, GC.Spread.Sheets.SheetArea.colHeader).value('显示');
         sheet.setColumnWidth(0, 100);
-        sheet.setColumnWidth(0, 150, GC.Spread.Sheets.SheetArea.rowHeader);
+        sheet.setColumnWidth(0, 240, GC.Spread.Sheets.SheetArea.rowHeader);
 
         setting.cols.forEach(function (col, index) {
             let i, iCol = 0, cell;

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

@@ -8,7 +8,7 @@ let basicInfoView = {
     setting:{
         header: [
             {name: '属性', dataCode: 'dispName', width: 200, vAlign: 'center', hAlign: 'left'},
-            {name: '值', dataCode: 'value', width: 120, vAlign: 'center', hAlign: 'center'}
+            {name: '值', dataCode: 'value', width: 300, vAlign: 'center', hAlign: 'left'}
         ],
         options: {
             allowContextMenu: false,

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

@@ -9,7 +9,7 @@ let projFeatureView = {
     setting:{
         header: [
             {name: '属性', dataCode: 'dispName', width: 200, vAlign: 'center', hAlign: 'left'},
-            {name: '值', dataCode: 'value', width: 120, vAlign: 'center', hAlign: 'center'}
+            {name: '值', dataCode: 'value', width: 300, vAlign: 'center', hAlign: 'left'}
         ],
         options: {
             allowContextMenu: false,

+ 124 - 2
web/building_saas/main/js/views/project_view.js

@@ -580,6 +580,127 @@ var projectObj = {
             }
         }
     },
+    onClipboardPasting: function (sender, info){
+        info.cancel = true;
+
+        let rIdx = info.sheet.getActiveRowIndex();
+        let node = projectObj.project.mainTree.items[rIdx];
+        if (!node.parent){
+            hintBox.infoBox('系统提示','大项费用不允许粘贴!', 1);
+            return false;
+        };
+
+        let colName = projectObj.project.projSetting.main_tree_col.cols[info.cellRange.col].data.field;
+        if (colName == 'code'){
+            function getNodeType(node) {
+                let t = null;
+                if (calcTools.isRationItem(node))
+                    t = 1
+                else if (calcTools.isBill(node)){
+                    if (calcTools.isBill_FB(node))
+                        t = 2
+                    else if (calcTools.isBill_FX(node) || calcTools.isBill_BX(node))
+                        t = 3
+                    else if (calcTools.isBill_BILL(node))
+                        t = 4;
+                };
+                return t;
+            };
+            function getPasteTextArr(info) {
+                let copyText = info.pasteData.text.trim();
+                if (!copyText) return null;
+                let rows = copyText.split('\r\n');
+                let rstArr = [];
+                for (let row of rows) {
+                    row = row.trim();
+                    row = row.split('\t');
+                    rstArr.push(row);
+                }
+                return rstArr;
+            };
+            function getPasteNodes(count, nodeType) {
+                let nodesArr = [];
+                let curNode = null;
+                for (let i = rIdx; i < rIdx + count; i++) {
+                    curNode = projectObj.project.mainTree.items[i];
+                    if (curNode && calcTools.isSameTypeNode(curNode, node)){
+                        nodesArr.push(curNode);
+                    }
+                    else{
+                        curNode = projectObj.project.mainTree.items[i - 1];
+                        break;
+                    }
+                };
+
+                if (nodesArr.length < count){
+                    if (projectObj.project.mainTree.selected != curNode)
+                        projectObj.project.mainTree.selected = curNode;
+
+                    let add = count - nodesArr.length;
+                    for (let i = 0; i < add; i++) {
+                        switch (nodeType) {
+                            case 1:
+                                curNode = projectObj.project.Ration.addNewRation(null,rationType.ration,null,true);
+                                break;
+                            case 2:
+                                curNode = ProjectController.addFB(projectObj.project, projectObj.mainController);
+                                break;
+                            case 3:
+                                curNode = ProjectController.addFX(projectObj.project, projectObj.mainController);
+                                break;
+                            case 4:
+                                curNode = ProjectController.addBills(projectObj.project, projectObj.mainController);
+                                break;
+                        }
+
+                        if (!curNode){
+                            hintBox.infoBox('系统提示','插入新结点出错,粘贴失败!', 1);
+                            return nodesArr;
+                        }
+                        else{
+                            nodesArr.push(curNode);
+                            if (projectObj.project.mainTree.selected != curNode)
+                                projectObj.project.mainTree.selected = curNode;
+                        }
+                    }
+                };
+
+                return nodesArr;
+            };
+            function doPaste(datas, nodes, nodeType) {
+                if (nodeType == 1){  // 批量粘贴定额有严重的异步问题,这里要和清单分开处理
+                    let updateRationCodes = [];
+                    for (let i = 0; i < datas.length; i++) {
+                        let ptNode = nodes[i];
+                        let code = datas[i][0];
+                        updateRationCodes.push({'node':ptNode, value:code});
+                    }
+                    projectObj.project.Ration.updateRationCodes(updateRationCodes);
+                }
+                else {
+                    for (let i = 0; i < datas.length; i++) {
+                        let ptNode = nodes[i];
+                        let code = datas[i][0];
+                        if (!(ptNode.data && ptNode.data.code && ptNode.data.code.sameText(code))){
+                            projectObj.updateCode(ptNode, code);
+                        };
+                    }
+                }
+                projectObj.mainController.refreshTreeNode(nodes);
+            };
+
+            let tagType = getNodeType(node);
+            if (!tagType){
+                hintBox.infoBox('系统提示', '该树结点类型不支持从项目编码列粘贴!', 1);
+                return false;
+            };
+
+            let datas = getPasteTextArr(info);
+            if (!datas) return;
+            let pasteNodes = getPasteNodes(datas.length, tagType);
+            doPaste(datas, pasteNodes, tagType);
+        };
+    },
     mainSpreadEditEnded: function (sender, info) {
         console.log('enterEDEnd');
         let project = projectObj.project;
@@ -745,6 +866,8 @@ var projectObj = {
                 that.mainSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, that.onButtonClick);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, that.onCellDoubleClick);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.ColumnWidthChanged, that.onColumnWidthChanged);
+                that.mainSpread.bind(GC.Spread.Sheets.Events.ClipboardPasting, that.onClipboardPasting);
+
                 //let loadOtherStartTime = +new Date();
                 if(!projectReadOnly){
                     that.loadMainSpreadContextMenu();
@@ -765,8 +888,6 @@ var projectObj = {
                 if(projectReadOnly){
                     disableSpread(that.mainSpread);
                 }
-                let themeName = that.mainSpread.getSheet(0).currentTheme().name();
-                console.log(GC.Spread.Sheets.Themes[themeName]);
                 $.bootstrapLoading.end();
             }
             else {
@@ -1268,6 +1389,7 @@ var projectObj = {
         const sheet = this.mainSpread.getActiveSheet();
         sheet.setSelection(row, col, 1, 1);
         this.mainController.setTreeSelected(this.mainController.tree.items[row]);//触发树节点选中事件
+        sheet.showRow(row, GC.Spread.Sheets.VerticalPosition.center);
     },
     // 选中区域合计数字
     amountAreaNumber: function(e, info) {

+ 1 - 0
web/building_saas/pm/js/pm_newMain.js

@@ -1626,6 +1626,7 @@ function init() {
             projTreeObj.tree = pmTree.createNew(projTreeObj.setting, datas);
             projTreeObj.tree.selected = projTreeObj.tree.items[0];
             projTreeObj.workBook = projTreeObj.buildSheet(projTreeObj.workBook,'projSpread',projTreeObj.setting);
+            projTreeObj.workBook.getSheet(0).frozenColumnCount(2);
             sheetCommonObj.spreadDefaultStyle(projTreeObj.workBook);
             projTreeObj.sumEngineeringCost();
             projTreeObj.showTreeData(projTreeObj.tree.items, projTreeObj.setting.header, projTreeObj.workBook.getActiveSheet());

+ 1 - 1
web/building_saas/report/html/rpt_main.html

@@ -26,8 +26,8 @@
                     <div class="panel">
                         <div class="panel-body">
                             <div class="btn-group" role="group" aria-label="Button group with nested dropdown" id="export_div">
-                                <button type="button" class="btn btn-outline-primary btn-sm" id="show_excel_output_cfg" data-toggle="modal" data-target="#export_excel" style="display:none"></button>
                                 <button type="button" class="btn btn-outline-primary btn-sm" onclick="rptControlObj.checkAndGetExcel()"><i class="fa fa-file-excel-o"></i> Excel <span class="badge badge-secondary">0</span></button>
+                                <button type="button" class="btn btn-outline-primary btn-sm" id="show_excel_output_cfg" data-toggle="modal" data-target="#export_excel" style="display:none"></button>
                                 <button type="button" class="btn btn-outline-primary btn-sm" onclick="rptControlObj.getPDF()"><i class="fa fa-file-pdf-o"></i> PDF <span class="badge badge-secondary">0</span></button>
                             </div>
                         </div>