瀏覽代碼

Merge branch '1.0.0_online' of http://192.168.1.12:3000/SmartCost/ConstructionCost into 1.0.0_online

TonyKang 6 年之前
父節點
當前提交
9a7b036f1f

+ 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',

+ 36 - 5
modules/fee_rates/facade/fee_rates_facade.js

@@ -33,7 +33,8 @@ module.exports={
     updateFeeRates:updateFeeRates,
     updateRates:update_rates,
     feeRateFileSaveAs:feeRateFileSaveAs,
-    getFeeRateByID:getFeeRateByID
+    getFeeRateByID:getFeeRateByID,
+    changeFeeRateFile:changeFeeRateFile
 };
 let operationMap={
     'ut_create':create_fee_rate,
@@ -401,7 +402,7 @@ async function updateFeeRates(datas){//批量更新费率
 async function changeFeeRateFileFromCurrent(jdata){
     let data = JSON.parse(jdata);
     let newFeeRateFile=data.newFeeRateFile;
-    let result = await  projectsModel.findOneAndUpdate({ID:data.projectID},{'property.feeFile':newFeeRateFile});
+    await changeFeeRateFile(data,newFeeRateFile,0);
     let feeRateData = await feeRateFileModel.findOne({'ID':newFeeRateFile.id});
     if(feeRateData!==null){
         let feeRate = await feeRateModel.findOne({ID:feeRateData.feeRateID});
@@ -412,10 +413,40 @@ async function changeFeeRateFileFromCurrent(jdata){
     return feeRateData;
 }
 
+async function changeFeeRateFile(projectData,feeRateFile,type,userID) {
+    let temFile=null,newFeeRateFile = {};
+    if(type == 0){//从本建设项目中替换,直接赋值
+        temFile =  feeRateFile
+    }else if(type == 1) {//从其它建设项目中复制
+        let oldFeeRateFile = await feeRateFileModel.findOne({'ID':feeRateFile.id});
+        let feeRate = await feeRateModel.findOne({ID:oldFeeRateFile.feeRateID});
+        let newFeeRate={};
+        newFeeRate.ID=uuidV1();
+        newFeeRate.rates =feeRate.rates;
+        newFeeRateFile.ID = uuidV1();
+        newFeeRateFile.name = feeRateFile.name;
+        newFeeRateFile.userID = userID;
+        newFeeRateFile.libName = oldFeeRateFile.libName;
+        newFeeRateFile.libID=oldFeeRateFile.libID;
+        newFeeRateFile.rootProjectID = projectData.rootProjectID;
+        newFeeRateFile.feeRateID =newFeeRate.ID;
+        await feeRateModel.create(newFeeRate);
+        await feeRateFileModel.create(newFeeRateFile);
+        temFile={
+            id:newFeeRateFile.ID,
+            name:feeRateFile.name
+        }
+        newFeeRateFile.rates=newFeeRate.rates;//构建返回数据
+    }
+    await  projectsModel.findOneAndUpdate({ID:projectData.projectID},{'property.feeFile':temFile});
+    return newFeeRateFile
+}
+
+
 async function changeFeeRateFileFromOthers(jdata) {
     let data = JSON.parse(jdata);
-    console.log(data);
-    let feeRateFile = await feeRateFileModel.findOne({'ID':data.feeRateFileID});
+    let newFeeRateFile = await changeFeeRateFile(data,{id:data.feeRateFileID,name:data.name},1,data.userID);
+   /* let feeRateFile = await feeRateFileModel.findOne({'ID':data.feeRateFileID});
     let feeRate = await feeRateModel.findOne({ID:feeRateFile.feeRateID});
     let newFeeRate={};
     newFeeRate.ID=uuidV1();
@@ -435,7 +466,7 @@ async function changeFeeRateFileFromOthers(jdata) {
         name:data.name
     }
     await projectsModel.findOneAndUpdate({ID:data.projectID},{'property.feeFile':feeFile});
-    newFeeRateFile.rates=newFeeRate.rates;
+    newFeeRateFile.rates=newFeeRate.rates;*/
     newFeeRateFile.usageProjects=await getUsageProjects(newFeeRateFile.ID);
     return newFeeRateFile;
 }

+ 34 - 2
modules/main/facade/block_lib_facade.js

@@ -42,7 +42,39 @@ async function getLibNamesAndFirstLib(data) {
 
 
 async function copyTemplateLib(userID, userName, compilationID) {
-    let template = await getLib({libID: '00000000'});
+    // let template = await getLib({libID: '00000000'});
+    let template = {
+        libID: "00000000",
+        libName: "模板",
+        datas: [
+            {
+                "ID": "00000001",
+                "ParentID": "-1",
+                "NextSiblingID": "00000002",
+                "type": 1,
+                "nodeName": "分类1"
+            },
+            {
+                "ID": "00000002",
+                "ParentID": "-1",
+                "NextSiblingID": "00000003",
+                "type": 1,
+                "nodeName": "分类2"
+            },
+            {
+                "ID": "00000003",
+                "ParentID": "-1",
+                "NextSiblingID": "-1",
+                "type": 1,
+                "nodeName": "分类3"
+            }
+        ],
+        share: {
+            "shareName": "共享",
+            "shareTo": []
+        }
+    };
+
     let newLib = {
         userID: userID,
         compilationID: compilationID,
@@ -53,7 +85,7 @@ async function copyTemplateLib(userID, userName, compilationID) {
     };
     newLib.share.shareName = `共享-${newLib.libName}`;
     await blModel.create(newLib);
-    console.log(JSON.stringify(newLib));
+    // console.log(JSON.stringify(newLib));
     return newLib;
 };
 

+ 10 - 10
modules/main/facade/project_facade.js

@@ -24,7 +24,8 @@ module.exports = {
     updateNodes:updateNodes,
     calcInstallationFee:calcInstallationFee,
     saveProperty: saveProperty,
-    getDefaultColSetting: getDefaultColSetting
+    getDefaultColSetting: getDefaultColSetting,
+    markProjectsToChange:markProjectsToChange
 };
 
 async function calcInstallationFee(data) {
@@ -214,9 +215,7 @@ async function updateNodes(datas){
 
 //data = {feeRateID:111111,projectID:1245}; type = feeRate
 async function markUpdateProject(data,type) {
-    let tasks=[];
     let query = {deleteInfo:null};
-    let result = null;
     if(type=="feeRate"){//更改了费率
         query['property.feeFile.id'] = data.feeRateID;
     }
@@ -224,15 +223,16 @@ async function markUpdateProject(data,type) {
         query['property.unitPriceFile.id'] = data.unitFileID;//unitPriceFile
     }
     let projects = await projectsModel.find(query);
+    return await markProjectsToChange(projects,type,data.projectID);
+}
+
+async function markProjectsToChange(projects,type,extProjectID){
+    let tasks=[];
     for(let p of projects){
-        if(p.ID!=data.projectID){//当前项目不用更新
-            tasks.push(generateMarkTask(type,p.ID));
-        }
-    }
-    if(tasks.length>0){
-        result = await projectsModel.bulkWrite(tasks);
+        if(extProjectID && p.ID===extProjectID) continue;//排除当前项目
+        tasks.push(generateMarkTask(type,p.ID));
     }
-    return result;
+    return tasks.length>0 ? await projectsModel.bulkWrite(tasks):null;
 }
 
 async function removeProjectMark(projectID) {

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

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

+ 23 - 1
modules/pm/facade/pm_facade.js

@@ -4,6 +4,7 @@
 let mongoose = require('mongoose');
 let _ = require("lodash");
 let feeRate_facade = require('../../fee_rates/facade/fee_rates_facade');
+let project_facade = require('../../main/facade/project_facade');
 let logger = require("../../../logs/log_helper").logger;
 const uuidV1 = require('uuid/v1');
 let projectModel = mongoose.model('projects');
@@ -23,6 +24,7 @@ let rationGLJModel = mongoose.model('ration_glj');
 let rationCoeModel = mongoose.model('ration_coe');
 let rationInstallationModel = mongoose.model('ration_installation');
 let quantityDetailModel = mongoose.model('quantity_detail');
+let rationTemplateModel = mongoose.model('ration_template');
 let userModel = mongoose.model('user');
 let compleGljSectionModel = mongoose.model('complementary_glj_section');
 let compleGljSectionTModel = mongoose.model('complementary_glj_section_templates');
@@ -59,6 +61,7 @@ module.exports={
     isShare: isShare,
     getShareInfo: getShareInfo,
     prepareInitialData: prepareInitialData,
+    changeFile:changeFile
 };
 
 //拷贝例题项目
@@ -205,7 +208,8 @@ async function copyProject(userID, compilationID,data,newProjectID = null) {
         copyRationSubList(originalID,newProjectID,billMap.uuidMaping,rationMap.uuidMaping,projectGLJMap.IDMap,rationGLJModel),
         copyRationSubList(originalID,newProjectID,billMap.uuidMaping,rationMap.uuidMaping,projectGLJMap.IDMap,rationCoeModel),
         copyRationSubList(originalID,newProjectID,billMap.uuidMaping,rationMap.uuidMaping,projectGLJMap.IDMap,quantityDetailModel),
-        copyRationSubList(originalID,newProjectID,billMap.uuidMaping,rationMap.uuidMaping,projectGLJMap.IDMap,rationInstallationModel)
+        copyRationSubList(originalID,newProjectID,billMap.uuidMaping,rationMap.uuidMaping,projectGLJMap.IDMap,rationInstallationModel),
+        copyRationSubList(originalID,newProjectID,billMap.uuidMaping,rationMap.uuidMaping,projectGLJMap.IDMap,rationTemplateModel)
     ];
     if(originalProperty.calcProgramFile){
         copyTasks.push(commonCopy(newProjectID,originalProperty.calcProgramFile.ID,calcProgramFileID,calcProgramsModel));
@@ -293,6 +297,7 @@ async function copyRations(newProjectID,billsIDMap,rationMap,projectGLJIDMap) {
         if(doc.billsItemID){
             doc.billsItemID = billsIDMap[doc.billsItemID]?billsIDMap[doc.billsItemID]:-1;
         }
+        if(doc.referenceRationID) doc.referenceRationID = uuidMaping[doc.referenceRationID]?uuidMaping[doc.referenceRationID]:undefined;
         //绑定定类型的工料机 项目工料机ID
         doc.type==3&&doc.projectGLJID&&projectGLJIDMap[doc.projectGLJID]?doc.projectGLJID = projectGLJIDMap[doc.projectGLJID]:'';
     }
@@ -961,3 +966,20 @@ async function copyCompleGljSection(userId, compilationId) {
         await compleGljSectionModel.insertMany(insertDatas);
     }
 }
+
+async function changeFile(datas,userID,fileID,name,from,type){//from 费率或单价文件,type从单前建设项目还是从其它建设项目中复制
+    let projectIDs = [],newFile = {id:fileID,name:name};//计录从其它项目中复制的文件,选中多个的时候只需复制一次
+    let projectUpdateType = from == "feeRateFile"?"feeRate":"unitFile";
+    if(from == "feeRateFile"){
+        for(let d of datas){
+            let tem_file = await feeRate_facade.changeFeeRateFile(d, newFile,type,userID);
+            if(type == 1 && tem_file){//从建设项目复制时,只有第一次需要复制,剩下的就相当于使用同个建设项目的情况了
+                newFile = {id:tem_file.ID,name:tem_file.name};
+                type = 0;
+            }
+            projectIDs.push({ID:d.projectID})
+        }
+    }
+    await project_facade.markProjectsToChange(projectIDs,projectUpdateType)//项目标记为待刷新状态
+
+}

+ 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);
 };

+ 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();

+ 1 - 1
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>

+ 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 - 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],

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

@@ -97,7 +97,7 @@ let subObj = {
         let totalWidth = $('#subItems').width();
         //人材机和项目特征文本比例
         const openWidth = 30;//打开项目特征工具条
-        const tab_tem = (305+openWidth+10+30)/totalWidth;//tab显示框默认宽度:305(表格宽度) + 30(工具条宽度)+10(resize div 宽度)+30(序号列宽度)
+        const tab_tem = (305+openWidth+10)/totalWidth;//tab显示框默认宽度:305(表格宽度) + 30(工具条宽度)+10(resize div 宽度)
         let textVisible = $('#replaceText').is(':visible'),
             //默认比例
             textPercent = tab_tem * 100 + '%',//'15%',

+ 5 - 2
web/building_saas/main/js/views/zmhs_view.js

@@ -34,6 +34,7 @@ let zmhs_obj = {
                 }
             }
         },
+        emptyRowHeader: true,
         autoFit:true,
         fitRow:['name','content']
     },
@@ -48,7 +49,8 @@ let zmhs_obj = {
         view: {
             lockColumns:["coeType"],
             rowHeaderWidth:25
-        }
+        },
+        emptyRowHeader: true
     },
     assSpread:null,
     assSheet:null,
@@ -62,7 +64,8 @@ let zmhs_obj = {
         view: {
             lockColumns: [0, 1],
             rowHeaderWidth:25
-        }
+        },
+        emptyRowHeader: true
     },
     initSpread:function () {
         this.initCoeSpread();

+ 1 - 95
web/building_saas/pm/html/project-management.html

@@ -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>
 
@@ -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>

+ 27 - 7
web/building_saas/pm/js/pm_newMain.js

@@ -1226,18 +1226,38 @@ const projTreeObj = {
             }
         }
     },
-    confirmFileChange : function(){
-        let selectProjects =[];
+    confirmFileChange :async function(){
+        let selectProjects =[],fileID=null,from = $("#mr_from").val(),name='';
         for(let i of this.replaceTree.items){
-            if(i.data.selected === 1) selectProjects.push(i)
+            if(i.data.selected === 1) selectProjects.push({projectID:i.data.ID,rootProjectID:i.data['property']['rootProjectID']})
         }
-        console.log(selectProjects);
         if(selectProjects.length > 0){
-
+            let type = parseInt($("input[name='select_from']:checked").val());//0 从当前建设项目,1从其它建设项目中复制
+            if(type == 0){
+                fileID = $("#currentOptions").val();
+                name = $("#currentOptions").find("option:selected").text()
+            }else {
+                fileID = $("#otherFileOptions").val();
+                name = $("#otherFileOptions").find("option:selected").text()
+            }
+            if(fileID == null || fileID == undefined|| fileID ==""){
+                alert("请选择替换文件")
+            }
+            await projTreeObj.postChangeFile({projects:selectProjects,fileID:fileID,name:name,type:type,from:from});
         }
-
-
     },
+    postChangeFile:async function(data){
+        data.user_id = userID;
+        $.bootstrapLoading.start();
+        let result = await ajaxPost("/pm/api/changeFile",data);
+        $.bootstrapLoading.end();
+        projTreeObj.refreshWhenFileDateChange(data.projects[0].projectID);
+        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);