Przeglądaj źródła

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

chenshilong 6 lat temu
rodzic
commit
0897728bc8

+ 1 - 1
config/config.js

@@ -28,7 +28,7 @@ module.exports = {
                 useMongoClient: true
             }
     },
-    pp:{  server: "112.74.42.187",
+    pp:{  server: "172.18.111.231",
         port: "27017",
         options:{
             user:'smartcost',

+ 11 - 0
modules/pm/controllers/pm_controller.js

@@ -646,4 +646,15 @@ module.exports = {
             callback(req, res, 1, err, null);
         }
     },
+    changeFile:async function(req,res){
+        try{
+            let data = JSON.parse(req.body.data);
+            console.log(data);
+           // let summaryInfo = await pm_facade.getSummaryInfo(data.projectIDs);
+            callback(req, res, 0, 'success', []);
+        }
+        catch (err){
+            callback(req, res, 1, err, null);
+        }
+    }
 };

+ 5 - 0
modules/pm/facade/pm_facade.js

@@ -59,6 +59,7 @@ module.exports={
     isShare: isShare,
     getShareInfo: getShareInfo,
     prepareInitialData: prepareInitialData,
+    changeFile:changeFile
 };
 
 //拷贝例题项目
@@ -961,3 +962,7 @@ async function copyCompleGljSection(userId, compilationId) {
         await compleGljSectionModel.insertMany(insertDatas);
     }
 }
+
+async function changeFile(datas,from,type){//from:feeRate或单价文件,type从单前建设项目还是从其它建设项目中复制
+
+}

+ 1 - 0
modules/pm/routes/pm_route.js

@@ -60,6 +60,7 @@ module.exports = function (app) {
     pmRouter.post('/getProjectShareInfo', pmController.projectShareInfo);
     pmRouter.post('/share', pmController.share);
     pmRouter.post('/receiveProjects', pmController.receiveProjects);
+    pmRouter.post('/changeFile', pmController.changeFile);
 
     app.use('/pm/api', pmRouter);
 };

+ 8 - 1
modules/ration_glj/facade/glj_calculate_facade.js

@@ -355,6 +355,7 @@ function getCoeSelectedGLJ(gljList,rcode,code) {
 
 function getCalculateResult(quantify,c,coe,gljList,decimal) {
     let q = quantify;
+    let o_glj = null;
     switch (c.operator){
         case '+' :
             q = q + c.amount;
@@ -369,11 +370,17 @@ function getCalculateResult(quantify,c,coe,gljList,decimal) {
             q = q / c.amount;
             break;
         case '+*' :
-            let o_glj = getCoeSelectedGLJ(gljList,coe.original_code,coe.select_code);
+            o_glj = getCoeSelectedGLJ(gljList,coe.original_code,coe.select_code);
             if(o_glj){
               q = q +  c.amount * scMathUtil.roundForObj(o_glj.quantity,decimal);
             }
             break;
+        case '-*' :
+            o_glj = getCoeSelectedGLJ(gljList,coe.original_code,coe.select_code);
+            if(o_glj){
+                q = q -  c.amount * scMathUtil.roundForObj(o_glj.quantity,decimal);
+            }
+            break;
         case '=' :
              q = c.amount;
             break;

+ 9 - 1
public/web/sheet/sheet_common.js

@@ -33,7 +33,9 @@ var sheetCommonObj = {
         if (setting && setting.view && setting.view.rowHeaderWidth) {
             sheet.setColumnWidth(0, setting.view.rowHeaderWidth, spreadNS.SheetArea.rowHeader);
         };
-
+        if (setting.emptyRowHeader) {
+            sheet.setColumnWidth(0, 1, GC.Spread.Sheets.SheetArea.rowHeader);
+        }
         sheet.options.colHeaderAutoTextIndex = 1;
         sheet.options.colHeaderAutoText = spreadNS.HeaderAutoText.numbers;
         sheet.options.clipBoardOptions = GC.Spread.Sheets.ClipboardPasteOptions.values;
@@ -150,6 +152,12 @@ var sheetCommonObj = {
                 sheet.setStyle(row, -1, setting.getStyle(data[row]));
             }
         }
+        if(setting.emptyRowHeader){
+            let rowCount = sheet.getRowCount();
+            for (let row = 0; row < rowCount; row++) {
+                sheet.setValue(row, 0, '', GC.Spread.Sheets.SheetArea.rowHeader);
+            }
+        }
         this.lockCells(sheet,setting);
         sheet.resumeEvent();
         sheet.resumePaint();

+ 31 - 24
public/web/sheet/sheet_data_helper.js

@@ -173,40 +173,47 @@ var SheetDataHelper = {
             sheet.defaults.rowHeight = setting.defaultRowHeight;
         }
         sheet.setRowCount(datas.length + setting.emptyRows, GC.Spread.Sheets.SheetArea.viewport);
+        let rowCount = sheet.getRowCount();
         setting.cols.forEach(function (colSetting, iCol) {       
             sheet.setStyle(-1, iCol, SheetDataHelper.getSheetCellStyle(colSetting));
             if (colSetting.showHint) {
                 sheet.getRange(-1, iCol, -1, 1).cellType(new TipCellType());
             }
-            datas.forEach(function (data, iRow) {
-                var cell = sheet.getCell(iRow, iCol, GC.Spread.Sheets.SheetArea.viewport);
-                var getFieldText2 = function () {
-                    var fields = colSetting.data.field.split('.'), iField, value = data;
-                    for (iField = 0; iField < fields.length; iField++) {
-                        if (value[fields[iField]]) {
-                            value = value[fields[iField]];
-                        } else {
-                            return '';
+            for (let iRow = 0; iRow < rowCount; iRow++) {
+                let data = datas[iRow];
+                if (setting.emptyRowHeader) {
+                    sheet.setValue(iRow, 0, '', GC.Spread.Sheets.SheetArea.rowHeader);
+                }
+                if (data) {
+                    let cell = sheet.getCell(iRow, iCol, GC.Spread.Sheets.SheetArea.viewport);
+                    let getFieldText2 = function () {
+                        let fields = colSetting.data.field.split('.'), iField, value = data;
+                        for (iField = 0; iField < fields.length; iField++) {
+                            if (value[fields[iField]]) {
+                                value = value[fields[iField]];
+                            } else {
+                                return '';
+                            }
                         }
+                        return value;
+                    };
+                    cell.value(data[colSetting.data.field]);
+                    if (colSetting.data.getText) {
+                        cell.value(colSetting.data.getText(data));
+                    } else {
+                        cell.value(getFieldText2());
                     }
-                    return value;
-                };
-                cell.value(data[colSetting.data.field]);
-                if (colSetting.data.getText) {
-                    cell.value(colSetting.data.getText(data));
-                } else {
-                    cell.value(getFieldText2());
-                }
-                if (colSetting.readOnly) {
-                    if (Object.prototype.toString.apply(colSetting.readOnly) === "[object Function]") {
-                        cell.locked(colSetting.readOnly(node));
+                    if (colSetting.readOnly) {
+                        if (Object.prototype.toString.apply(colSetting.readOnly) === "[object Function]") {
+                            cell.locked(colSetting.readOnly(node));
+                        } else {
+                            cell.locked(true);
+                        }
                     } else {
-                        cell.locked(true);
+                        cell.locked(false);
                     }
-                } else {
-                    cell.locked(false);
                 }
-            });
+            }
         });
 
         sheet.resumeEvent();

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

@@ -187,7 +187,7 @@
                           </div>
                           <div class="resize-y" id="mainVerticalResize"></div>
                           <div class="bottom-content" id="bottom_div">
-                              <ul class="nav nav-tabs" role="tablist">
+                              <ul class="nav nav-tabs" role="tablist" id="bottom_div_ul">
                                   <li class="nav-item" id="QDJL_div">
                                       <a class="nav-link sub-item" id="linkQDJL" data-toggle="tab" href="#subSpread" role="tab">清单精灵</a>
                                   </li>
@@ -230,8 +230,8 @@
                                           <div class="resize-x main-data-bottom ovf-hidden" id="rgResize" style="display: none"></div>
                                           <div class="item_spread main-data-bottom ovf-hidden " id="gljSubDiv" style="width: 99%;">
                                               <div class="tab-content">
-                                                  <div class="tab-pane" id="rnc-xm" >
-                                                      <div class="main-data-bottom ovf-hidden" id="itemCharacterText">
+                                                  <div class="tab-pane" id="rnc-xm" style="margin-top:-2px">
+                                                      <div class="main-data-bottom" id="itemCharacterText" >
                                                           项目特征 内容
                                                       </div>
                                                   </div>
@@ -261,6 +261,7 @@
                                                   <div id="zmhs_toogle">
                                                       <div class="tn-nav d-flex align-items-start flex-column" data-toggle="tooltip" data-placement="left" title="" data-original-title="打开子目换算">
                                                           <span class="mt-3 ml-2 text-primary">子目换算</span>
+                                                          <i class="fa fa-arrow-left mt-auto mb-3 text-primary ml-2"></i>
                                                       </div>
                                                   </div>
                                                   <!--<a  role="tab" class="zmhs-link nav-link">子目换算</a>-->

+ 1 - 1
web/building_saas/main/js/controllers/material_controller.js

@@ -228,7 +228,7 @@ let MaterialController = {
         }*/
         //$('#replaceM').css('margin-top',0);
         //this.toggleItemInit();
-        $("#itemCharacterText").html("<br>"+text);
+        $("#itemCharacterText").html(text);
     },
     //初始化人材机和项目特征文本两个区域的宽度,改变窗口大小时调用此方法,实时刷新
     initItemWidth: function () {

+ 3 - 2
web/building_saas/main/js/views/billsElf.js

@@ -456,7 +456,7 @@ const BillsElf = (function() {
             }
             let height = cellRect.height;
             let options = getOptions(node.data, bills.selected.elf.datas);
-            top = options.length - 2 > 4 ? top - 4 * height : top - (options.length - 2) * height;
+            top = options.length > 6 ? top - 6 * height : top - options.length * height;
             let $editInput = $(`<div style="height: ${height}px; background: ${cellStyle.backColor};overflow: hidden; white-space: nowrap; text-overflow: ellipsis">${node.data.options}</div>`),
                 $optDiv = $(`<div style="position: fixed; width: ${cellRect.width}px; top: ${top}px;background: ${cellStyle.backColor};border: 1px solid; overflow: auto; height: ${options.length > 6 ? height*6+5 : height*options.length+5}px; font-size: 0.9rem;"></div>`);
             for(let opt of options){
@@ -559,7 +559,8 @@ const BillsElf = (function() {
                 $editor.css("background", "white");
                 $editor.css("width", cellRect.width);
                 $editor.attr("gcUIElement", "gcEditingInput");
-                let top = $('.header').height() + $('#zaojiashu').find('.toolsbar').height() + $('#top_div').height();
+                //编辑文本框距离浏览器的top
+                let top = $('.header').height() + $('#zaojiashu').find('.toolsbar').height() + $('#top_div').height() + $('#bottom_div_ul').height() + 1 + $('.resize-y').height();
                 let activeCellTop = $editor.parent().parent().css('top');
                 activeCellTop = parseFloat(activeCellTop.replace('px', ''));
                 let node = bills.selected.elf.tree.items[elfSheet.getActiveRowIndex()];

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

@@ -4,7 +4,7 @@
 let gljCol = {
     ration_glj_setting: {
         header: [
-            {headerName: "编码", headerWidth: 130, dataCode: "code", dataType: "String", formatter: "@"},
+            {headerName: "编码", headerWidth: 110, dataCode: "code", dataType: "String", formatter: "@"},
             {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String",cellType:'tipsCell'},
             {headerName: "规格型号", headerWidth: 120, dataCode: "specs", dataType: "String", hAlign: "left",cellType:'tipsCell'},
             {headerName: "单位", headerWidth: 45, dataCode: "unit", dataType: "String", hAlign: "center"},

+ 2 - 8
web/building_saas/main/js/views/glj_view.js

@@ -359,14 +359,8 @@ var gljOprObj = {
         if(gljOprObj.isInstallationNode(selected)==true){
             return;
         }
-        let newval = 0;
-        if (checkboxValue) {
-            newval = 0;
-            args.sheet.getCell(args.row, args.col).value(newval);
-        } else {
-            newval = 1;
-            args.sheet.getCell(args.row, args.col).value(newval);
-        }
+        let newval = checkboxValue? 0:1;
+        args.sheet.getCell(args.row, args.col).value(newval);
         if (args.sheetName == 'ration_glj') {
             gljOprObj.updateIsEstimate(args,newval);
         }  else if (args.sheetName == 'quantity_detail') {

+ 1 - 0
web/building_saas/main/js/views/project_glj_view.js

@@ -1234,6 +1234,7 @@ $(function () {
             changeUnitPriceId = $("#self-file").val();
             if(!changeUnitPriceId){
                 alert('单价文件不可为空');
+                return;
             }
             submitFileChange(changeUnitPriceId,type);
         } else {

+ 31 - 17
web/building_saas/main/js/views/project_view.js

@@ -18,7 +18,10 @@ var projectObj = {
         let s = `&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${c}${value}`;
         $('#testDisplay').html(s);
     },
+    selectedChangeNowTime: 0,
+    selectedChangeDelayTime: 20,
     treeSelectedChanged: function (node) {
+        let me = this;
         let project = projectObj.project;
         let mainSheet = projectObj.mainController.sheet;
         let init = true;
@@ -34,23 +37,34 @@ var projectObj = {
         mbzm_obj.nodeChanged = init;
         project.mainTree.preSelected = node;
         projectObj.setNodesStyle(projectObj.mainController.sheet, refreshNodes);
-        if($('#linkComments').hasClass('active')){
-            subViewObj.loadComments(node);
-        }
-        let nodeID = node ? node.getID() : null;
-        gljOprObj.mainTreeSelectedChange = gljOprObj.selectedNodeId != nodeID;
-        if(init) subObj.initNavItem(node);
-       /*
-       2018-11-9 在NavItem里设置了默认显示的item,在里执行了click这个操作所以这两个操作不用重复执行了
-       gljOprObj.showDataIfRationSelect(node);
-        if (activeSubSheetIsCalcProgram())
-            calcProgramObj.refreshCalcProgram(node, 3);*/
-
-        //zhong 2017-9-1 特征及内容
-        if(pageCCOprObj.active){
-            pageCCOprObj.mainActiveCell = projectObj.mainSpread.getActiveSheet().getSelections()[0];//mainSpread焦点单元格
-            pageCCOprObj.setCacheAndShow(node);
-        }
+        function delayOpr(callback) {
+            let nowTime = Date.now();
+            me.selectedChangeNowTime = nowTime;
+            setTimeout(function () {
+                if (nowTime - me.selectedChangeNowTime == 0) {
+                    callback();
+                }
+            }, me.selectedChangeDelayTime);
+        }
+        delayOpr(function () {
+            if($('#linkComments').hasClass('active')){
+                subViewObj.loadComments(node);
+            }
+            let nodeID = node ? node.getID() : null;
+            gljOprObj.mainTreeSelectedChange = gljOprObj.selectedNodeId != nodeID;
+            if(init) subObj.initNavItem(node);
+            /*
+             2018-11-9 在NavItem里设置了默认显示的item,在里执行了click这个操作所以这两个操作不用重复执行了
+             gljOprObj.showDataIfRationSelect(node);
+             if (activeSubSheetIsCalcProgram())
+             calcProgramObj.refreshCalcProgram(node, 3);*/
+
+            //zhong 2017-9-1 特征及内容
+            if(pageCCOprObj.active){
+                pageCCOprObj.mainActiveCell = projectObj.mainSpread.getActiveSheet().getSelections()[0];//mainSpread焦点单元格
+                pageCCOprObj.setCacheAndShow(node);
+            }
+        });
     },
     refreshBaseActn: function (tree) {
         let setButtonValid = function (valid, btn) {

+ 1 - 2
web/building_saas/main/js/views/side_tools.js

@@ -195,14 +195,13 @@ var sideToolsObj = {
         adaptiveTzjnrWidth();
         autoFlashHeight();
         subObj.initGljSubTab();
-        //MaterialController.showReplaceDiv();
         pageCCOprObj.resizeWidth();
         billsGuidance.refreshWorkBook();
         billsLibObj.refreshBillsSpread();
-        //BillsElf.setColumnWidthByRate();
         refreshSubSpread();
         billsLibObj.refreshBillsRelaSpread();
         rationLibObj.refreshSpread();//subSpread、jobSpread、itemSpread显示问题
+        zmhs_obj.refresh();
     }
 };
 

+ 7 - 3
web/building_saas/main/js/views/std_billsGuidance_lib.js

@@ -95,7 +95,7 @@ const billsGuidance = (function () {
             {name: '项目名称', dataCode: 'name', width: 190, vAlign: 'center', hAlign: 'left', formatter: '@'},
             {name: '单位', dataCode: 'unit', width: 45, vAlign: 'center', hAlign: 'center', formatter: '@'},
         ],
-        rowHeaderWidth:25,
+        rowHeaderWidth:1,
         events: {
             CellDoubleClick: function (sender, args) {
                 if(!bills.tree){
@@ -334,7 +334,7 @@ const billsGuidance = (function () {
         let fuc = function () {
             sheet.setColumnCount(headers.length);
             sheet.setRowHeight(0, 30, GC.Spread.Sheets.SheetArea.colHeader);
-            sheet.setColumnWidth(0, sheet.getParent() === bills.workBook ? 15 : 25, GC.Spread.Sheets.SheetArea.rowHeader);
+            //sheet.setColumnWidth(0, sheet.getParent() === bills.workBook ? 15 : 25, GC.Spread.Sheets.SheetArea.rowHeader);
             if(sheet.getParent() === elfItem.workBook || sheet.getParent() === guideItem.workBook){
                 sheet.setRowHeight(0, 20, GC.Spread.Sheets.SheetArea.colHeader);
             }
@@ -396,6 +396,7 @@ const billsGuidance = (function () {
             let sheet = module.workBook.getActiveSheet();
             if(module === bills){
                 //默认初始可控制焦点在清单表中
+                sheet.options.rowHeaderVisible = false;
                 module.workBook.focus();
                 sheet.options.isProtected = true;
                 sheet.name('stdBillsGuidance_bills');
@@ -412,7 +413,9 @@ const billsGuidance = (function () {
                 sheet.getRange(-1, 0, -1, 1).locked(true);
                 sheet.getRange(-1, 1, -1, 1).locked(false);
             }
-            if(module.rowHeaderWidth)  sheet.setColumnWidth(0, module.rowHeaderWidth, GC.Spread.Sheets.SheetArea.rowHeader);
+            if(module.rowHeaderWidth) {
+                sheet.setColumnWidth(0, module.rowHeaderWidth, GC.Spread.Sheets.SheetArea.rowHeader);
+            }
             setOptions(module.workBook, options);
             buildHeader(module.workBook.getActiveSheet(), module.headers);
             if(module === elfItem){
@@ -484,6 +487,7 @@ const billsGuidance = (function () {
         }
         module.controller.showTreeData();
         if(module === bills){
+            module.workBook.getSheet(0).options.rowHeaderVisible = true;
             setBillsHint(bills.tree.items, stdBillsJobData, stdBillsFeatureData);
             renderSheetFunc(sheet, function () {
                 for(let i = 0; i < bills.tree.items.length; i++){

+ 8 - 4
web/building_saas/main/js/views/std_ration_lib.js

@@ -20,12 +20,14 @@ var rationLibObj = {
     checkSpread: function () {
         if (!this.rationChapterSpread) {
             this.rationChapterSpread = SheetDataHelper.createNewSpread($('#stdRationChapter')[0]);
+            this.rationChapterSpread.getSheet(0).options.rowHeaderVisible = false;
             sheetCommonObj.spreadDefaultStyle(this.rationChapterSpread);
             this.rationChapterSpread.getSheet(0).name('stdRationLib_chapter');
             this.rationChapterSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, this.onChapterSpreadCellDoubleClick);
         }
         if (!this.sectionRationsSpread) {
             this.sectionRationsSpread = SheetDataHelper.createNewSpread($('#stdSectionRations')[0]);
+            this.sectionRationsSpread.getSheet(0).setColumnWidth(0, 1, GC.Spread.Sheets.SheetArea.rowHeader);
             sheetCommonObj.spreadDefaultStyle(this.sectionRationsSpread);
             if (!projectReadOnly) {
                 this.sectionRationsSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, this.onRationSpreadCellDoubleClick);
@@ -125,7 +127,7 @@ var rationLibObj = {
                 }
             }
             rationChapterTreeController.showTreeData();
-
+            rationLibObj.rationChapterSpread.getSheet(0).options.rowHeaderVisible = true;
             rationChapterTreeController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, function (node) {
                 rationLibObj.loadSectionRations(node && node.children.length === 0 ? node.getID() : null);
             });
@@ -182,9 +184,9 @@ var rationLibObj = {
         let me = this;
         var showDatas = function (datas, setting) {
             let rationSheet = rationLibObj.sectionRationsSpread.getActiveSheet();
-            TREE_SHEET_HELPER.massOperationSheet(rationSheet, function () {
+            /*TREE_SHEET_HELPER.massOperationSheet(rationSheet, function () {
                 rationSheet.setColumnWidth(0, 25, GC.Spread.Sheets.SheetArea.rowHeader);
-            });
+            });*/
             SheetDataHelper.loadSheetHeader(setting, rationLibObj.sectionRationsSpread.getActiveSheet());
             SheetDataHelper.loadSheetData(setting, rationLibObj.sectionRationsSpread.getActiveSheet(), datas);
             rationLibObj.setTagForHint(rationSheet, datas);
@@ -369,7 +371,7 @@ var rationLibObj = {
     },
     rationChapterTreeSetting: {
         "emptyRowHeader": true,
-        "rowHeaderWidth": 15,
+        "rowHeaderWidth": 1,
         "emptyRows":0,
         "headRows":1,
         "headRowHeight":[30],
@@ -396,6 +398,8 @@ var rationLibObj = {
         }]
     },
     sectionRationsSetting: {
+        "emptyRowHeader": true,
+        "rowHeaderWidth": 1,
         "emptyRows":3,
         "headRows":1,
         "headRowHeight":[20],

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

@@ -97,10 +97,11 @@ let subObj = {
         let totalWidth = $('#subItems').width();
         //人材机和项目特征文本比例
         const openWidth = 30;//打开项目特征工具条
+        const tab_tem = (305+openWidth+10+30)/totalWidth;//tab显示框默认宽度:305(表格宽度) + 30(工具条宽度)+10(resize div 宽度)+30(序号列宽度)
         let textVisible = $('#replaceText').is(':visible'),
             //默认比例
-            textPercent = '15%',
-            rcjPercent = '85%';
+            textPercent = tab_tem * 100 + '%',//'15%',
+            rcjPercent = (1 - tab_tem)* 100 + '%';//85
         //文本没显示,则打开工具条固定30px转换百分比
         if (!subObj.showGljSubTab) {
             textPercent = openWidth / totalWidth;
@@ -745,7 +746,8 @@ $('.gljSubTab ul li a').bind('click',function () {
 
 $('.gljSubTab ul li a').on('shown.bs.tab', function () {
     if(this.hash == "#rnc-xm"){
-        MaterialController.showItemCharacterText();
+        //初始化项目特征表格位置,如果以后需要的话,showdata 统一移动至zmhs_obj中
+       //todo
     }else if(this.hash == "#rnc-zm"){
         zmhs_obj.initCoeSpread();
     }else if(this.hash == "#rnc-fz"){

+ 24 - 15
web/building_saas/main/js/views/zmhs_view.js

@@ -10,24 +10,31 @@ let zmhs_obj = {
     coeSetting: {
         header: [
             {headerName: "调整", headerWidth: 35, dataCode: "isAdjust", dataType: "String", cellType: "checkBox"},
-            {headerName: "条件", headerWidth: 250, dataCode: "name", dataType: "String", cellType: "button"},
-            {headerName: "内容", headerWidth: 160, dataCode: "content", dataType: "String", hAlign: "left",getText:'forContent'}
+            {headerName: "条件", headerWidth: 180, dataCode: "name", dataType: "String", cellType: "button",getText:'forName'},
+            {headerName: "内容", headerWidth: 70, dataCode: "content", dataType: "String", hAlign: "left",getText:'forContent'}
         ],
         view: {
             lockColumns:[0,1,2],
             rowHeaderWidth:25
         },
         getText:{
-            forContent:function (item) {
+            forContent:function (item) {//所选人材机,内容和条件互换位置
                if(gljUtil.isDef(item.select_code)&&item.select_code!=""){
-                   let option = _.find(item.option_list,{"value":item.select_code})
-                   return option?option.text:item.select_code;
+                   return item.name;
                }else {
                    return item.content;
                }
-
+            },
+            forName:function (item) {
+                if(gljUtil.isDef(item.select_code)&&item.select_code!=""){
+                    let option = _.find(item.option_list,{"value":item.select_code})
+                    return option?option.text:item.select_code;
+                }else {
+                    return item.name;
+                }
             }
         },
+        emptyRowHeader: true,
         autoFit:true,
         fitRow:['name','content']
     },
@@ -36,13 +43,14 @@ let zmhs_obj = {
     cusSheetData:null,
     cusSetting:{
         header: [
-            {headerName: "类型", headerWidth: 250, dataCode: "coeType", dataType: "String",hAlign: "left"},
-            {headerName: "系数", headerWidth: 160, dataCode: "amount", dataType: "String", hAlign: "right",validator:"number"}
+            {headerName: "类型", headerWidth: 100, dataCode: "coeType", dataType: "String",hAlign: "left"},
+            {headerName: "系数", headerWidth: 80, dataCode: "amount", dataType: "String", hAlign: "right",validator:"number"}
         ],
         view: {
             lockColumns:["coeType"],
             rowHeaderWidth:25
-        }
+        },
+        emptyRowHeader: true
     },
     assSpread:null,
     assSheet:null,
@@ -56,7 +64,8 @@ let zmhs_obj = {
         view: {
             lockColumns: [0, 1],
             rowHeaderWidth:25
-        }
+        },
+        emptyRowHeader: true
     },
     initSpread:function () {
         this.initCoeSpread();
@@ -151,15 +160,14 @@ let zmhs_obj = {
     },
 
     getComboBoxForCodes:function (coe,i) {
-        this.coeSheet.getCell(i, 2, GC.Spread.Sheets.SheetArea.viewport).locked(false);
+        this.coeSheet.getCell(i, 1, GC.Spread.Sheets.SheetArea.viewport).locked(false);
         let options = coe.option_list; //coe.option_codes.split("|");
         let combo = sheetCommonObj.getDynamicCombo(true);
         let buttonRow =  this.coeSheet.getViewportBottomRow(1);
-        console.log(buttonRow);
         combo.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value);
         combo.items(options).maxDropDownItems(buttonRow - i -1 < 3 ?3:buttonRow - i -1 );//itemHeight(options.length).
-        this.coeSheet.setCellType(i, 2, combo, GC.Spread.Sheets.SheetArea.viewport);
-        this.coeSheet.setValue(i, 2, coe.select_code);
+        this.coeSheet.setCellType(i, 1, combo, GC.Spread.Sheets.SheetArea.viewport);
+        this.coeSheet.setValue(i, 1, coe.select_code);
 
     },
     showAssData:function (node) {
@@ -239,6 +247,7 @@ let zmhs_obj = {
         $('#assSpread').is(':visible')&&this.assSpread?this.assSpread.refresh():'';
     },
     showDatas:function () {
+        if($('#itemCharacterText').is(':visible'))MaterialController.showItemCharacterText()
         if($('#coeSpread').is(':visible')) this.showCoeData();
         if($('#cusSpread').is(':visible')) this.showCusData();
         if($('#assSpread').is(':visible')) this.showAssData();
@@ -397,7 +406,7 @@ let zmhs_obj = {
     onCoeValueChange:function (e,args) {
         let fieldID =  zmhs_obj.coeSetting.header[args.col].dataCode;
         let recode = zmhs_obj.coeSheetData[args.row];
-        if(gljUtil.isDef(recode.option_codes)&&recode.option_codes!=""&& fieldID == 'content'){//说明是选择了下拉框
+        if(gljUtil.isDef(recode.option_codes)&&recode.option_codes!=""&& fieldID == 'name'){//说明是选择了下拉框
             projectObj.project.ration_coe.adjustCoeClick(recode, 1,{'select_code':args.newValue});
         }
     },

+ 4 - 98
web/building_saas/pm/html/project-management.html

@@ -636,8 +636,8 @@
                             <div id="replaceSpread" style="height: 100%"></div>
                         </div>
                         <div class="custom-control custom-checkbox">
-                            <input type="checkbox" class="custom-control-input" id="customCheck1">
-                            <label class="custom-control-label" for="customCheck1">自动勾选同专业工程</label>
+                            <input type="checkbox" class="custom-control-input" id="selectSameTypeProject">
+                            <label class="custom-control-label" for="selectSameTypeProject">自动勾选同专业工程</label>
                         </div>
                     </div>
                     <div class="col-6">
@@ -671,7 +671,7 @@
                                 <select class="form-control" id="otherFileOptions">
                                     <option>10.9建筑例题内测单价文件</option><!--建设项目下单价文件-->
                                 </select>
-                                <span class="form-text text-muted">你选择的单价文件将复制一份至新项目,不会影响原建设项目的单价文件。</span>
+                                <span class="form-text text-muted">你选择的文件将复制一份至新项目,不会影响原建设项目的文件。</span>
                             </div>
                         </div>
 
@@ -680,7 +680,7 @@
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                <a href="" class="btn btn-primary mr-3">确定</a>
+                <button type="button" class="btn btn-primary mr-3" data-dismiss="modal" id="changeFileConfirm">确定</button>
             </div>
         </div>
     </div>
@@ -768,99 +768,6 @@
         </div>
     </div>
 </div>
-<!--弹出分享-->
-<!--<div class="modal fade" id="share" data-backdrop="static">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title">分享</h5>
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                    <span aria-hidden="true">&times;</span>
-                </button>
-            </div>
-            <div class="modal-body">
-                <div class="form-group">
-                    <label>分享给...</label>
-                    <input id="sharePhone" class="form-control" placeholder="输入对方手机号" type="text">
-                    <span id="share-info" class="form-text text-danger">账号不存在。</span>
-                </div>
-                <div class="card">
-                    <div class="card-body">
-                        <h4 id="user_name" class="card-title">张三</h4>
-                        <h6 id="user_company" class="card-subtitle mb-2 text-muted">珠海纵横创新软件有限公司</h6>
-                    </div>
-                    <ul class="list-group list-group-flush">
-                        <li id="user_mobile" class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="通行账号手机"><i class="fa fa-tablet"></i> 15812644017</li>
-                        <li id="user_email" class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="通行账号邮箱"><i class="fa fa-envelope-o "></i> 0756-3850891</li>
-                        <li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="">
-                            <div class="form-group my-1">
-                                <p class="m-0">分享后,该用户仅可查阅工程,不具备任何编辑修改功能。</p>
-                            </div>
-                            <div class="form-check mb-2">
-                                <input type="checkbox" class="form-check-input" id="allowCopy">
-                                <label class="form-check-label" for="allowCopy">允许该用户拷贝该工程</label>
-                                &lt;!&ndash;打勾后出现提示&ndash;&gt;
-                                <div id="allowCopyHint" class="form-text text-danger"><i class="fa fa-exclamation-triangle"></i> 该用户可以把你的项目拷贝成为他的数据,请谨慎勾选。 </div>
-                            </div>
-                            <a id="addShareUser" class="btn btn-sm btn-primary" href="javascript:void(0);"><i class="fa fa-plus"></i> 添加</a>
-                        </li>
-                    </ul>
-                </div>
-                <div class="form-group mt-3" id="shareUsers" style="overflow: auto; display: none">
-                    <p>确认分享 <b>文件夹</b> 给</p>
-                    <p><h4><span class="badge badge-light mr-3">张三(15812644017) <a href="" class="text-danger" title="移除分享"><i class="fa fa-remove"></i></a></span>
-                    <span class="badge badge-light mr-3">王五(15812644017) <a href="" class="text-danger" title="移除分享"><i class="fa fa-remove"></i></a></span></h4></p>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <a id="share-confirm" href="javascript:void(0);" class="btn btn-primary">确定分享</a>
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-            </div>
-        </div>
-    </div>
-</div>-->
-<!--弹出分享给交互-->
-<!--<div class="modal fade" id="shareTo" data-backdrop="static">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content" style="width: 750px;">
-            <div class="modal-header">
-                <h5 class="modal-title">分享给...</h5>
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                    <span aria-hidden="true">&times;</span>
-                </button>
-            </div>
-            <div class="modal-body modal-fixed-height">
-                &lt;!&ndash;     <p>勾选需要恢复的文件,点“确定”按钮,确认从回收站中恢复。</p>&ndash;&gt;
-                <table class="table table-hover table-sm mb-5">
-                    <thead>
-                    <tr style="display: block;">
-                        <th width="106px">姓名</th>
-                        <th width="146px">公司</th>
-                        <th width="146px">手机</th>
-                        <th width="156px">邮箱</th>
-                        <th width="70px">允许拷贝</th>
-                        <th width="70px">取消分享</th>
-                    </tr>
-                    </thead>
-                    <tbody id="shareToInfo" style="display:block; height: 300px; overflow: auto;">
-                    <tr>
-                        <td width="106px;">钟泽伟</td>
-                        <td width="146px;">珠海纵横创新软件有限公司</td>
-                        <td width="146px;">13160675110</td>
-                        <td width="156px;">707820685@qq.com</td>
-                        <td width="70px;" style="text-align: center"><input type="checkbox"></td>
-                        <td width="70px;" style="text-align: center"><input type="checkbox"></td>
-                    </tr>
-                    </tbody>
-                </table>
-            </div>
-            <div class="modal-footer">
-                <a href="javascript:void(0);" class="btn btn-primary" id="shareToConfirm" data-dismiss="modal">确定</a>
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-            </div>
-        </div>
-    </div>
-</div>-->
 <!-- JS. -->
 <script src = "/lib/spreadjs/sheets/gc.spread.sheets.all.11.1.2.min.js"></script>
 <script>GC.Spread.Sheets.LicenseKey = '<%- LicenseKey %>';</script>
@@ -901,6 +808,5 @@
     let engineeringList = '<%- engineeringList %>';
     let compilationData = '<%- compilationData %>';
     compilationData = JSON.parse(compilationData.replace(/[\s\r\n]/g, ""));//去掉空格字符
-    document.styleSheets[0].insertRule('body {background-color: red}, 0');
 </script>
 </html>

+ 95 - 9
web/building_saas/pm/js/pm_newMain.js

@@ -455,6 +455,8 @@ const projTreeObj = {
             }
             canCopy == true?$("#copy-to-confirm").removeClass("disabled"):$("#copy-to-confirm").addClass("disabled");
             return;//如果是复制到表,不用做后面的操作
+        }else if(sheet.name() == "replaceSheet"){//如果是替换文件,不用做后面的操作
+            return;
         }
         me.tree.selected = node;
         shareSeleted = node;
@@ -499,6 +501,11 @@ const projTreeObj = {
             $("#mr_from").val(projTreeObj.setting.header[args.col].dataCode);
             $("#project_name").text(projTreeObj.tree.selected.data.name);
             $('#m_replace_file').modal('show');
+        }else if(args.sheet.name() == "replaceSheet"){
+            let cellType = args.sheet.getCellType(args.row, args.col);
+            if(cellType instanceof GC.Spread.Sheets.CellTypes.CheckBox){
+                projTreeObj.onReplaceNodeCheck(sender,args);
+            }
         }
     },
     onDragDropBlock : function (sender,args) {//拖动移动项目位置
@@ -975,7 +982,7 @@ const projTreeObj = {
                 for(let j = 0; j < headers.length; j++){
                     sheet.getRange(-1, j, -1, 1).hAlign(GC.Spread.Sheets.HorizontalAlign[headers[j]['hAlign']]);
                     sheet.getRange(-1, j, -1, 1).vAlign(GC.Spread.Sheets.VerticalAlign[headers[j]['vAlign']]);
-                    if(headers[j].cellType == "checkBox"){
+                    if(headers[j].cellType == "checkBox" && nodes[i].data.canSelect === true){
                         sheet.setCellType(i, j,new GC.Spread.Sheets.CellTypes.CheckBox(),GC.Spread.Sheets.SheetArea.viewport);
                         sheet.getCell(i, j).hAlign(GC.Spread.Sheets.HorizontalAlign.center);
                     }
@@ -1081,7 +1088,6 @@ const projTreeObj = {
         let data ={"project_id":node.data.ID,"rootProjectID":node.data.property.rootProjectID};
         let result = await ajaxPost("/glj/get-project-info",data);
         this.getFileListWithPath(result.other);
-        console.log(result);
         //数据结构不一样,这里做一下转换
         let t_result = {
             currentProject:{
@@ -1091,12 +1097,8 @@ const projTreeObj = {
             others:result.other
         }
         return t_result;
-
-
     },
 
-
-
     getFileListWithPath:function (list) {
         for(let n of list){
             let node = projTreeObj.tree.findNode(n.ID);
@@ -1169,15 +1171,90 @@ const projTreeObj = {
         sheet.options.isProtected = true;
         sheet.name('replaceSheet');
         let datas = [];
-        for(let i of me.tree.items){
-            datas.push(i.data);
+        for(let i of me.tree.items){//要挑出同个建设项目的节点
+            if(me.isReplaceNode(i) == true){
+                let tem = _.cloneDeep(i.data);
+                if(tem.projType == "Tender") tem.canSelect = true;
+                if(i == me.tree.selected) tem.selected = 1;
+                datas.push(tem);
+            }
         }
         me.replaceTree  = pmTree.createNew(projTreeObj.setting, datas);
         me.showTreeData(me.replaceTree.items, me.replaceSetting, sheet);
-
     },
+    isReplaceNode:function (node) {//只加载本建设项目的节点
+        let isReplaceNode = false;
+        let selected = this.tree.selected;
+        let rootProjectID = selected.data.property.rootProjectID;
+        let rootNode = this.tree.findNode(rootProjectID)
+        if(rootNode){
+            let IDMap = this.getAllParentNodeID(selected);
+            isReplaceNode = IDMap[node.data.ID]!==undefined ||node.data.ID == rootProjectID ||  node.data.ParentID == rootProjectID || (node.data.property &&node.data.property.rootProjectID == rootProjectID);
+        }
+        return isReplaceNode
+    },
+    getAllParentNodeID:function (node) {
+       let IDMap = {};
+       getPID(node,IDMap);
+       return IDMap;
+        function getPID(node,map) {
+            if(node.parent && node.data.ParentID != -1){
+                map[node.data.ParentID] = true;
+                getPID(node.parent,map);
+            }
+        }
+    },
+    onReplaceNodeCheck:function(sender,args){
+        let checkboxValue = args.sheet.getCell(args.row, args.col).value();
+        let newval = checkboxValue?0:1;
+        let node = projTreeObj.replaceTree.items[args.row];
+        if(node.data.ID  === projTreeObj.tree.selected.data.ID) return; //如果是项目管理界面选中的节点,不给取消
+        projTreeObj.setReplaceSelection(node,newval,args.row,args.col,args.sheet);
+    },
+    setReplaceSelection:function (node,value,row,col,sheet) {
+        sheet.getCell(row, col).value(value);
+        node.data.selected = value;
+    },
+    selectSameTypeProject:function (value) {
+        let node = this.tree.selected;
+        let engineering_id = node.data.property.engineering_id;
+        for(let i=0 ;i< this.replaceTree.items.length ; i++){
+            let tnode = this.replaceTree.items[i];
+            if(tnode.data.ID == node.data.ID) continue;
+            if(tnode && tnode.data.property && tnode.data.property.engineering_id == engineering_id){
+                this.setReplaceSelection(tnode,value,i,1,this.replaceWorkBook.getActiveSheet());
+            }
+        }
+    },
+    confirmFileChange :async function(){
+        let selectProjects =[],fileID=null,from = $("#mr_from").val();
+        for(let i of this.replaceTree.items){
+            if(i.data.selected === 1) selectProjects.push(i)
+        }
+        if(selectProjects.length > 0){
+            let type = parseInt($("input[name='select_from']:checked").val());//0 从当前建设项目,1从其它建设项目中复制
+            if(type == 0){
+                fileID = $("#currentOptions").val();
+            }else {
+                fileID = $("#otherFileOptions").val();
+            }
+            if(fileID == null || fileID == undefined|| fileID ==""){
+                alert("请选择替换文件")
+            }
+            await projTreeObj.postChangeFile({projects:selectProjects,fileID:fileID,type:type,from:from});
+
 
 
+        }
+    },
+    postChangeFile:async function(data){
+       let result = await ajaxPost("/pm/api/changeFile",data);
+        console.log(result);
+    },
+    checkFileName:async function (fileID,name,type) {
+        let node = this.tree.selected;
+    },
+
     insert: function (data, parent, next) {
         let preNode = this.tree.items[this.preSelection.row];
         let node = this.tree.addNodeData(data, parent, next);
@@ -1738,6 +1815,15 @@ $(document).ready(function() {
         })
 
     });
+    $('#selectSameTypeProject').click(function(){
+        let value = $(this).prop('checked') == true?1:0;
+            projTreeObj.selectSameTypeProject(value);
+    });
+
+    $('#changeFileConfirm').click(function(){
+        projTreeObj.confirmFileChange();
+    });
+
     function changeEngineering(){
         $('#engineering-info').hide();
         initFeeStandardSel();