Explorar el Código

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

TonyKang hace 7 años
padre
commit
a5564936d1
Se han modificado 43 ficheros con 618 adiciones y 136 borrados
  1. 5 1
      modules/all_models/user.js
  2. 8 1
      modules/main/routes/main_route.js
  3. 8 1
      modules/pm/controllers/pm_controller.js
  4. 22 1
      modules/pm/facade/pm_facade.js
  5. 6 2
      modules/pm/models/project_model.js
  6. 2 1
      modules/users/controllers/boot_controller.js
  7. 6 4
      modules/users/models/compilation_model.js
  8. 2 2
      modules/users/models/engineering_lib_model.js
  9. 6 3
      public/web/gljUtil.js
  10. 8 4
      public/web/tree_sheet/tree_sheet_helper.js
  11. BIN
      web/building_saas/css/logo.png
  12. 21 15
      web/building_saas/css/main.css
  13. 4 0
      web/building_saas/main/html/main.html
  14. 5 0
      web/building_saas/main/js/controllers/block_controller.js
  15. 5 5
      web/building_saas/main/js/models/calc_base.js
  16. 23 13
      web/building_saas/main/js/models/calc_program.js
  17. 3 0
      web/building_saas/main/js/models/ration_glj.js
  18. 13 6
      web/building_saas/main/js/views/calc_base_view.js
  19. 14 2
      web/building_saas/main/js/views/calc_program_manage.js
  20. 1 1
      web/building_saas/main/js/views/calc_program_view.js
  21. 15 6
      web/building_saas/main/js/views/character_content_view.js
  22. 11 3
      web/building_saas/main/js/views/fee_rate_view.js
  23. 1 1
      web/building_saas/main/js/views/glj_col.js
  24. 12 1
      web/building_saas/main/js/views/glj_view.js
  25. 102 19
      web/building_saas/main/js/views/main_tree_col.js
  26. 23 2
      web/building_saas/main/js/views/project_glj_view.js
  27. 4 1
      web/building_saas/main/js/views/project_info.js
  28. 3 0
      web/building_saas/main/js/views/project_property_basicInfo.js
  29. 3 0
      web/building_saas/main/js/views/project_property_bills_quantity_decimal.js
  30. 4 0
      web/building_saas/main/js/views/project_property_indicativeInfo.js
  31. 8 2
      web/building_saas/main/js/views/project_property_labour_coe_view.js
  32. 3 0
      web/building_saas/main/js/views/project_property_projFeature.js
  33. 122 4
      web/building_saas/main/js/views/project_view.js
  34. 3 0
      web/building_saas/main/js/views/side_tools.js
  35. 1 1
      web/building_saas/main/js/views/std_billsGuidance_lib.js
  36. 6 0
      web/building_saas/main/js/views/sub_fee_rate_views.js
  37. 78 22
      web/building_saas/main/js/views/sub_view.js
  38. 3 1
      web/building_saas/main/js/views/tender_price_view.js
  39. 3 0
      web/building_saas/main/js/views/zmhs_view.js
  40. 4 4
      web/building_saas/pm/html/project-management-Recycle.html
  41. 2 0
      web/building_saas/pm/js/pm_newMain.js
  42. 39 5
      web/building_saas/pm/js/pm_share.js
  43. 6 2
      web/common/html/header.html

+ 5 - 1
modules/all_models/user.js

@@ -55,6 +55,10 @@ let schema = {
         type: Number,
         default: -1
     },
-    create_time: Number
+    create_time: Number,
+    user_type:{
+        type:String,
+        default:'normal'//  normal : 普通用户,test:测试用户
+    }
 };
 mongoose.model(collectionName, new Schema(schema, {versionKey: false}));

+ 8 - 1
modules/main/routes/main_route.js

@@ -15,12 +15,19 @@ module.exports =function (app) {
                 // 获取项目信息
                 const projectId = req.query.project;
                 const projectData = await projectModel.project.getProject(projectId);
+                //分享的项目,只读
+                let projectReadOnly = false;
+                if(req.session.sessionUser.id !== projectData.userID){
+                    projectData._doc.readOnly = true;
+                    projectReadOnly = true;
+                }
                 res.render('building_saas/main/html/main.html',
                     {
                         userAccount: req.session.userAccount,
                         userID: req.session.sessionUser.id,
                         projectData: projectData,
-                        versionName: req.session.sessionCompilation.name + '免费版'
+                        versionName: req.session.sessionCompilation.name + '免费版',
+                        projectReadOnly: projectReadOnly
                     });
             } else {
                 res.redirect('/pm');

+ 8 - 1
modules/pm/controllers/pm_controller.js

@@ -3,6 +3,7 @@
  */
 import UnitPriceFileModel from "../../glj/models/unit_price_file_model";
 import moment from 'moment';
+import CompilationModel from "../../users/models/compilation_model";
 let mongoose = require('mongoose');
 let ProjectsData = require('../models/project_model').project;
 let labourCoe = require('../../main/facade/labour_coe_facade');
@@ -44,7 +45,8 @@ module.exports = {
              * result._doc.userID(Number): MongoDB
              * userId(String): Session.userID
              */
-            if (result._doc.userID == userId && result._doc.projType === projType.tender) {
+            //result._doc.userID == userId &&
+            if (result._doc.projType === projType.tender) {
                 callback(true);
             } else {
                 callback(false);
@@ -184,6 +186,11 @@ module.exports = {
         if (sessionCompilation === undefined) {
             return response.redirect('/logout');
         }
+        let compilationModel = new CompilationModel();
+        //更新编办信息
+        let compilationData = await compilationModel.getCompilationById(sessionCompilation._id);
+        request.session.sessionCompilation = compilationData;
+        sessionCompilation = request.session.sessionCompilation;
 
         // 清单计价
         let billValuation = sessionCompilation.bill_valuation !== undefined ?

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

@@ -35,13 +35,22 @@ module.exports={
 async function copyProject(userID, compilationID,data) {
     let projectMap = data.projectMap;
     let originalID = projectMap['copy'].document.ID;
-    let originalProperty = _.cloneDeep(projectMap['copy'].document.property);
     let newProjectID = await getCounterID("projects");
     let newFeeName = null,newUnitName = null;
     let calcProgramFileID = uuidV1();//新的计算程序文件ID
     let labourCoeFileID = uuidV1();//新的人工调整系数文件ID
     let feeRateFileID = uuidV1();//新的费率文件ID
     let unitPriceFileID = await getCounterID("unit_price_file");//新的单价文件ID
+    let originalProject = await projectModel.findOne({'ID':originalID});//查找最新的那项目信息,前端缓存的数据有可能不是最新的
+    if(!originalProject){
+        throw new Error('没有找到对应的项目,复制失败!');
+    }
+    let property = originalProject.property;
+    if(projectMap['copy'].document.property){//更新项目属性信息
+        setProperty(property,projectMap['copy'].document.property);
+    }
+    let originalProperty = _.cloneDeep(property);
+    projectMap['copy'].document.property = property;
     logger.info("复制项目: 旧项目ID: "+originalID+ " ------- 新项目ID: "+newProjectID);
     //费率文件、单价文件重名检查
     let feeRate =  await feeRateFileModel.findOne({rootProjectID:originalProperty.rootProjectID,name:originalProperty.feeFile.name,deleteInfo:null});
@@ -427,3 +436,15 @@ async function insertMany(datas,model) {
     await model.insertMany(datas);
 
 }
+
+function setProperty(Obj,updateData) {
+    for(let ukey in updateData){
+        if(_.isObject(updateData[ukey]) && _.isObject(Obj[ukey])){
+            setProperty(Obj[ukey],updateData[ukey]);
+        }else {
+            Obj[ukey] = updateData[ukey];
+        }
+    }
+
+
+}

+ 6 - 2
modules/pm/models/project_model.js

@@ -71,10 +71,14 @@ ProjectsDAO.prototype.getUserProjects = async function (userId, compilation, cal
 };
 
 ProjectsDAO.prototype.getUserProject = function (userId, ProjId, callback) {
-    Projects.findOne({userID: userId, ID: ProjId}, '-_id', function (err, template) {
+    Projects.findOne({$or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], ID: ProjId}, '-_id', function (err, template) {
         if (err) {
             callback(1, '找不到标段数据', null);
         } else {
+            //打开分享的项目,只读
+            if(template && userId !== template.userID){
+                template._doc.readOnly = true;
+            }
             callback(0, '', template);
         }
     });
@@ -396,7 +400,7 @@ ProjectsDAO.prototype.getProject = function (key, callback) {
             }
         });
     } else {
-        return Projects.findOne({'ID': key}).exec();
+        return Projects.findOne({$or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], 'ID': key}).exec();
     }
 };
 

+ 2 - 1
modules/users/controllers/boot_controller.js

@@ -43,7 +43,8 @@ class BootController extends BaseController {
             provinceList: userModel.province,
             companyTypeList: userModel.companyType,
             companyScaleList: userModel.companyScale,
-            compilation: request.params.compilation
+            compilation: request.params.compilation,
+            versionName: request.session.sessionCompilation.name + '免费版'
         };
         response.render('users/html/login-infoinput', renderData);
     }

+ 6 - 4
modules/users/models/compilation_model.js

@@ -48,21 +48,23 @@ class CompilationModel extends BaseModel {
         }
 
         if (compilationData.bill_valuation.length > 0) {
+            let enableValuation = [];
             for (let index in compilationData.bill_valuation) {
                 if (compilationData.bill_valuation[index].enable) {
-                    continue;
+                    enableValuation.push(compilationData.bill_valuation[index]);
                 }
-                delete compilationData.bill_valuation[index];
             }
+            compilationData.bill_valuation = enableValuation;
         }
 
         if (compilationData.ration_valuation.length > 0) {
+            let enableValuation = [];
             for (let index in compilationData.ration_valuation) {
                 if (compilationData.ration_valuation[index].enable) {
-                    continue;
+                    enableValuation.push(compilationData.bill_valuation[index]);
                 }
-                delete compilationData.ration_valuation[index];
             }
+            compilationData.ration_valuation = enableValuation;
         }
 
         return compilationData;

+ 2 - 2
modules/users/models/engineering_lib_model.js

@@ -47,8 +47,7 @@ class EngineeringLibModel extends BaseModel {
                 engineeringLibIdList.push(engineering.engineering_id);
             }
         }
-        // console.log(data);
-        // console.log(engineeringTemp);
+
 
         // 查找对应的id数据
         let condition = {_id: {"$in": engineeringLibIdList}};
@@ -74,6 +73,7 @@ class EngineeringLibModel extends BaseModel {
 
         // 替换计价规则数据
         let valuationData = JSON.parse(JSON.stringify(data));
+
         for(let valuation of valuationData) {
             if (valuation === null) {
                 continue;

+ 6 - 3
public/web/gljUtil.js

@@ -198,7 +198,8 @@ let gljUtil = {
                 });
                 if(tem){
                     let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);
-                    p+=scMathUtil.roundForObj(priceData.marketPrice* priceCoe * scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
+                    let temP = scMathUtil.roundForObj(priceData.marketPrice* priceCoe * scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
+                    p = scMathUtil.roundForObj(temP + p,process_decimal);
                 }
             }
             return scMathUtil.roundForObj(p,price_decimal);
@@ -223,7 +224,8 @@ let gljUtil = {
                 });
                 if(tem){
                     let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);
-                    p+=scMathUtil.roundForObj(priceData.basePrice*scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
+                    let temP = scMathUtil.roundForObj(priceData.basePrice*scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
+                    p = scMathUtil.roundForObj(temP + p,process_decimal);
                 }
             }
             return scMathUtil.roundForObj(p,price_decimal);
@@ -253,7 +255,8 @@ let gljUtil = {
                 })
                 if(tem){
                     let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);
-                    p+=scMathUtil.roundForObj(priceData.adjustPrice*scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
+                    let temP = scMathUtil.roundForObj(priceData.adjustPrice*scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
+                    p = scMathUtil.roundForObj(temP + p,process_decimal);
                 }
             }
             return scMathUtil.roundForObj(p,decimal);

+ 8 - 4
public/web/tree_sheet/tree_sheet_helper.js

@@ -167,13 +167,17 @@ var TREE_SHEET_HELPER = {
                 if(colSetting.editChecking&&colSetting.editChecking(node)){
                     cell.locked(true);
                 }else if (colSetting.readOnly) {
-                    if (Object.prototype.toString.apply(colSetting.readOnly) === "[object Function]") {
-                        cell.locked(colSetting.readOnly(node));
-                    } else {
+                    if(typeof projectReadOnly !== 'undefined' && projectReadOnly){
                         cell.locked(true);
+                    }else {
+                        if (Object.prototype.toString.apply(colSetting.readOnly) === "[object Function]") {
+                            cell.locked(colSetting.readOnly(node));
+                        } else {
+                            cell.locked(true);
+                        }
                     }
                 } else {
-                    cell.locked(false);
+                    cell.locked(typeof projectReadOnly !== 'undefined' && projectReadOnly ? true : false);
                 }
             });
             if(setting.setAutoFitRow){

BIN
web/building_saas/css/logo.png


+ 21 - 15
web/building_saas/css/main.css

@@ -15,20 +15,26 @@ body {
 }
 /*自定义css*/
 .header {
-    background: #e1e1e1
+    border-bottom: 1px solid #ccc
 }
 .header .header-logo {
     background: #ff6501;
-    color: #fff;
     float: left;
     margin-right: 1rem;
     font-size: 1rem;
-    line-height:38px;
-    height:38px
+    height:38px;
+    background:url("/web/building_saas/css/logo.png") no-repeat 0 0;
+    padding-left:40px;
+}
+.header-logo div.v-title{
+    font-size:12px;
+    color:#aeaeae;
+    line-height: 12px;
+    margin-top:3px;
 }
-.header .header-logo sup{
-    font-size:10px;
-    top:-1.2em
+.header-logo div.p-title{
+    font-size:14px;
+    color:#ff6501;
 }
 .top-msg{
     position: fixed;
@@ -44,7 +50,7 @@ body {
     position: absolute;
     text-align: center;
     z-index: 999;
-    padding: 2px 0 0 2px
+    padding: 30px 0 0 2px
 }
 .main-nav .nav a {
     display: block;
@@ -99,12 +105,12 @@ body {
     background: #fff
 }
 .toolsbar,.toolsbar-f {
+    background: #f7f7f9;
     border-bottom: 1px solid #ccc
 }
 .tools-btn {
     height: 30px;
-    line-height: 30px;
-    background:#fff
+    line-height: 30px
 }
 .toolsbar .tools-btn.btn:hover,.toolsbar-f .tools-btn.btn:hover {
     background: #f7f7f9;
@@ -294,12 +300,13 @@ body {
 }
 .print-toolsbar .panel {
     display:inline-block;
-    vertical-align:top;
-    background:#f7f7f9
+    vertical-align:top
 }
 .print-toolsbar .panel .panel-foot{
     text-align: center;
-    font-size: 12px
+    font-size: 12px;
+    padding-bottom:3px;
+    background:#F2F2F2
 }
 .print-list {
     border-right:1px solid #ccc
@@ -313,7 +320,6 @@ body {
     border-bottom:1px solid #f2f2f2
 }
 .pageContainer {
-    background: #ededed;
     text-align: center
 }
 .pageContainer .page{
@@ -343,7 +349,7 @@ body {
     border-bottom:1px solid #ddd
 }
 .navbar-crumb span{
-    max-width: 200px
+    width: 200px
 }
 .dropdown-item{
     color:#007bff

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

@@ -25,6 +25,9 @@
         let lockBills = '<%- projectData.property.lockBills %>';
         let userAccount = '<%- userAccount %>';
         let userID = '<%- userID %>';
+        let projectReadOnly = JSON.parse('<%- projectReadOnly %>');
+        console.log(`projectReadOnly`);
+        console.log(projectReadOnly);
     </script>
 </head>
 
@@ -85,6 +88,7 @@
                       <% } else { %>
                       <a href="javascript:void(0)" class="btn btn-sm" name="lockBills"  title=""> <i class="fa fa-lock" aria-hidden="true"></i> 锁定清单</a>
                       <% } %>
+                      <a id="switchTznr" href="javascript:void(0);" class="btn btn-sm" data-toggle="tooltip" data-placement="bottom"><i class="fa fa-eye" aria-hidden="true"></i> 显示特征内容</a>
                   </div>
                   <div class="side-tabs">
                       <ul class="nav nav-tabs" role="tablist">

+ 5 - 0
web/building_saas/main/js/controllers/block_controller.js

@@ -10,6 +10,11 @@ let BlockController = {
         if(selected.sourceType == ModuleNames.ration && selected.data.type == rationType.install){
             return true;
         }
+        if(projectObj.project.Bills.hasFlags(selected)){//所有固定清单项不能复制
+            return true;
+        }
+        //
+
         return false;
     },
     pasteBtnDisable:function (selected) {

+ 5 - 5
web/building_saas/main/js/models/calc_base.js

@@ -865,9 +865,9 @@ let baseFigureTemplate = {
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return cbTools.isDef(bill.feesIndex.estimate) && cbTools.isDef(bill.feesIndex.estimate[totalFeeType]) ? bill.feesIndex.estimate[totalFeeType] : 0;
     },
-    'ZGCLFFGLJ': function () {//暂估材料费(从工料机汇总表汇总)
+   /* 'ZGCLFFGLJ': function () {//暂估材料费(从工料机汇总表汇总)
         return 0;
-    },
+    },*/
     'FBF': function (tender) {//分包费
         const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
         let rst = 0;
@@ -948,11 +948,11 @@ let baseFigureTemplate = {
                 }
                 //量人 type 2, subType 1
                 else if(ration.type === rationType.volumePrice && ration.subType === volumePriceMaps['量人']){
-                    rst = parseFloat(rst + ration[quantityType]).toDecimal(decimalObj.glj.quantity);
+                    rst = parseFloat(rst + parseFloat(ration[quantityType])).toDecimal(decimalObj.glj.quantity);
                 }
                 //定额类型的人工工料机,type 3, subType 1
                 else if(ration.type === rationType.gljRation && ration.subType === gljType.LABOUR){
-                    rst = parseFloat(rst + ration[quantityType]).toDecimal(decimalObj.glj.quantity);
+                    rst = parseFloat(rst + parseFloat(ration[quantityType])).toDecimal(decimalObj.glj.quantity);
                 }
             }
         }
@@ -1032,7 +1032,7 @@ let baseFigureMap = {
     '甲定主材费': {base: 'JDZCF', class: 'RCJ'},
     '甲定设备费': {base: 'JDSBF', class: 'RCJ'},
     '暂估材料费(从子目汇总)': {base: 'ZGCLFFZM', class: 'RCJ'},
-    '暂估材料费(从工料机汇总表汇总)': {base: 'ZGCLFFGLJ', class: 'RCJ'},
+    /*'暂估材料费(从工料机汇总表汇总)': {base: 'ZGCLFFGLJ', class: 'RCJ'},*/
     '分包费': {base: 'FBF', class: 'FBF'},
     '分包定额基价人工费': {base: 'FBDEJJRGF', class: 'FBF'},
     '分包定额基价材料费': {base: 'FBDEJJCLF', class: 'FBF'},

+ 23 - 13
web/building_saas/main/js/models/calc_program.js

@@ -244,6 +244,12 @@ let calcTools = {
             treeNode.changed = true;
         };
     },
+    hasAdjustPrice: function(){      // 编办是否有材料的调整价发文
+        if (projectObj.project.projSetting.glj_col && projectObj.project.projSetting.glj_col.showAdjustPrice == true)
+            return true
+        else
+            return false;
+    },
     // 参数fieldName值: 'common.totalFee'、'equipment.unitFee'
     getFee: function (treeNode, fieldName) {
         if (!treeNode) return 0;
@@ -261,11 +267,13 @@ let calcTools = {
         let price = 0, temp = 0, temp2 = 0;
         for (let glj of treeNode.data.gljList) {
             if (gljTypes.indexOf(glj.type) >= 0) {
-                calcTools.calcGLJTenderPrice(glj);
-                calcTools.calcGLJTenderQty(treeNode, glj);
+                if (isTender){
+                    calcTools.calcGLJTenderPrice(glj);
+                    calcTools.calcGLJTenderQty(treeNode, glj);
+                };
                 let qty = isTender ? me.uiGLJQty(glj["tenderQuantity"]) : me.uiGLJQty(glj["quantity"]);
                 let mprice = isTender ? me.uiGLJPrice(glj["tenderPrice"]) : me.uiGLJPrice(glj["marketPrice"]);
-                let aprice = me.uiGLJPrice(glj["adjustPrice"]);
+                let aprice = calcTools.hasAdjustPrice() ? me.uiGLJPrice(glj["adjustPrice"]) : me.uiGLJPrice(glj["basePrice"]);
 
                 if (priceType == priceTypes.ptDiffPrice){
                     if (aprice != mprice){
@@ -284,7 +292,8 @@ let calcTools = {
         };
 
         if (priceType == priceTypes.ptDiffPrice){
-            result = (temp.toDecimal(decimalObj.ration.unitPrice) - temp2.toDecimal(decimalObj.ration.unitPrice)).toDecimal(decimalObj.ration.unitPrice);
+            // result = (temp.toDecimal(decimalObj.ration.unitPrice) - temp2.toDecimal(decimalObj.ration.unitPrice)).toDecimal(decimalObj.ration.unitPrice);
+            result = (temp - temp2).toDecimal(decimalObj.ration.unitPrice);
         }
         else{
             result = result.toDecimal(decimalObj.ration.unitPrice);
@@ -493,7 +502,7 @@ let calcTools = {
                 (treeNode.data.subType === gljType.MAIN_MATERIAL && baseName === calcBaseNames.ZCFJC) ||
                 (treeNode.data.subType === gljType.EQUIPMENT && baseName === calcBaseNames.SBFJC))
         ) {
-            let aprice = me.uiGLJPrice(treeNode.data.adjustPrice);
+            let aprice = me.uiGLJPrice(treeNode.data.basePrice);   // 量价虚拟的工料机不可能有发文,这里直接取定额价。
             let mprice = me.uiGLJPrice(treeNode.data.marketUnitFee);
             result = (mprice - aprice).toDecimal(decimalObj.ration.unitPrice);
         }
@@ -709,14 +718,15 @@ let calcTools = {
         glj.tenderQuantity = (glj.quantity * qCoe).toDecimal(decimalObj.glj.quantity);
     },
     calcGLJTenderPrice: function (glj) {
-        // let pCoe = 1;
-        // if (projectObj.project.property.tenderSetting && projectObj.project.property.tenderSetting.gljPriceTenderCoe)
-        //     pCoe = projectObj.project.property.tenderSetting.gljPriceTenderCoe;
-        // if (compositionTypes.indexOf(glj.type) >= 0)
-        //
-        // else
-        //     glj.tenderPrice = (glj.marketPrice * pCoe).toDecimal(decimalObj.glj.unitPrice);
-        glj.tenderPrice = projectObj.project.projectGLJ.getTenderMarketPrice(projectObj.project.projectGLJ.getDataByID(glj.projectGLJID));
+        if (!glj.projectGLJID){   // 量价定额虚拟出来的工料机,没有projectGLJID,在项目工料机中查不到。
+            let pCoe = 1;
+            if (projectObj.project.property.tenderSetting && projectObj.project.property.tenderSetting.gljPriceTenderCoe)
+                pCoe = projectObj.project.property.tenderSetting.gljPriceTenderCoe;
+            glj.tenderPrice = (glj.marketPrice * pCoe).toDecimal(decimalObj.glj.unitPrice);
+        }else{
+            let projGLJ = projectObj.project.projectGLJ.getDataByID(glj.projectGLJID);
+            glj.tenderPrice = projectObj.project.projectGLJ.getTenderMarketPrice(projGLJ);
+        };
     },
     // 界面显示的工料机价格,包括定额价、市场价等。参数 price 传入一个普通的价格数值即可。
     uiGLJPrice: function (price){

+ 3 - 0
web/building_saas/main/js/models/ration_glj.js

@@ -85,6 +85,9 @@ var ration_glj = {
                     let glj = JSON.parse(JSON.stringify(ration));
                     glj.type = glj.subType;
                     glj.totalQuantity = parseFloatPlus(ration.quantity);
+                    glj.markertPrice = glj.marketUnitFee;
+                    glj.basePrice = glj.marketUnitFee;
+                    glj.adjustPrice = glj.marketUnitFee;
                     result.push(glj);
                 }
                 else{

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

@@ -130,9 +130,14 @@ let calcBaseView = {
     isDef: function (v) {
         return v !== undefined && v !== null;
     },
-    ifEdit: function () {
-        var selected = projectObj.project.mainTree.selected;
-        return MainTreeCol.readOnly.forCalcBase(selected)?false:true;
+    ifEdit: function (type) {
+        if (type == 'ration'){
+            return true;
+        }
+        else{
+            var selected = projectObj.project.mainTree.selected;
+            return MainTreeCol.readOnly.forCalcBase(selected)?false:true;
+        }
     },
     bindClassBtn: function () {
         let me = this;
@@ -338,7 +343,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){
+            if(calcBaseView.editingCell && !projectReadOnly && calcBaseView.ifEdit(type)){
                 if(calcBaseView.editingCell.row==options.row&&calcBaseView.editingCell.col==options.col){
                     var image = document.getElementById('f_btn'),imageMagin = 3;
                     var imageHeight = h-2*imageMagin;
@@ -374,7 +379,7 @@ let calcBaseView = {
             if(me.editingCell==null){
                 var showSelectBtn = true;
                 if(hitinfo.sheet.name()!='calc_detail'){
-                    showSelectBtn=me.ifEdit();
+                    showSelectBtn=me.ifEdit(type);
                 }
                 if(showSelectBtn){
                     me.editingCell={
@@ -390,7 +395,9 @@ let calcBaseView = {
                 var imageHeight = hitinfo.cellRect.height-2*imageMagin;
                 var imageWidth = hitinfo.cellRect.width*2/7;
                 if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
-                    calcBaseView.initCalctor(type);
+                    if(!projectReadOnly && me.ifEdit(type)){
+                        calcBaseView.initCalctor(type);
+                    }
                 }
             }
         };

+ 14 - 2
web/building_saas/main/js/views/calc_program_manage.js

@@ -71,8 +71,20 @@ let calcProgramManage = {
         dSheet.getRange(-1, _.findIndex(me.detailSetting.header, {'dataCode': 'dispExprUser'}), -1, 1).cellType(calcBaseView.getCalcBaseCellType('ration'));
         sheetCommonObj.showData(dSheet, me.detailSetting, me.datas[0].calcItems);
 
-        me.loadMainContextMenu();
-        me.loadDetailContextMenu();
+        if(!projectReadOnly){
+            me.loadMainContextMenu();
+            me.loadDetailContextMenu();
+        }
+        else {
+            if(me.mainSetting.view.lockColumns){
+                me.mainSetting.view.lockColumns = null;
+            }
+            if(me.detailSetting.view.lockColumns){
+                me.detailSetting.view.lockColumns = null;
+            }
+            disableSpread(me.mainSpread);
+            disableSpread(me.detailSpread);
+        }
     },
     onMainEnterCell: function(sender, args) {
         var me = calcProgramManage;

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

@@ -16,7 +16,7 @@ let calcProgramObj = {
             {headerName: "费率", headerWidth: CP_Col_Width.feeRate, dataCode: "feeRate", dataType: "Number"},
             {headerName: "单价", headerWidth: CP_Col_Width.unitFee, dataCode: "unitFee", dataType: "Number"},
             {headerName: "合价", headerWidth: CP_Col_Width.totalFee, dataCode: "totalFee", dataType: "Number"},
-            {headerName:"费用类别", headerWidth:CP_Col_Width.displayFieldName, dataCode:"displayFieldName", dataType: "String", hAlign: "center"},
+            {headerName: "费用类别", headerWidth:CP_Col_Width.displayFieldName, dataCode:"displayFieldName", dataType: "String", hAlign: "center"},
             {headerName: "基数说明", headerWidth: CP_Col_Width.statement, dataCode: "statement", dataType: "String"},
             {headerName: "备注", headerWidth: CP_Col_Width.memo, dataCode: "memo", dataType: "String"}
         ],

+ 15 - 6
web/building_saas/main/js/views/character_content_view.js

@@ -17,7 +17,9 @@ let contentOprObj = {
         me.workBook.options.allowUserDragDrop = false;
         me.workBook.getSheet(0).setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
         me.workBook.options.allowCopyPasteExcelStyle = false;
-        me.onContextmenuOpr();//右键菜单
+        if(!projectReadOnly){
+            me.onContextmenuOpr();//右键菜单
+        }
         me.bindEvents(me.workBook);
     },
     bindEvents: function (workBook) {
@@ -399,7 +401,9 @@ let characterOprObj = {
         me.workBook.options.allowUserDragDrop = false;
         me.workBook.getSheet(0).setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
         me.workBook.options.allowCopyPasteExcelStyle = false;
-        me.onContextmenuOpr();
+        if(!projectReadOnly){
+            me.onContextmenuOpr();
+        }
         me.bindEvents(me.workBook);
     },
     bindEvents: function (workBook) {
@@ -917,7 +921,9 @@ let pageCCOprObj = {
     },
     //设置特征及内容currentCache
     setCacheAndShow: function (node) {
-        this.refreshRuleTools(projectObj.project.isBillsLocked());
+        if(!projectReadOnly){
+            this.refreshRuleTools(projectObj.project.isBillsLocked());
+        }
         if(node && node.sourceType === projectObj.project.Bills.getSourceType()){
             let theCont = contentOprObj, theCha = characterOprObj;
             node.data.jobContent = node && typeof node.data.jobContent !== 'undefined' ? node.data.jobContent : [];
@@ -1097,14 +1103,14 @@ let pageCCOprObj = {
         for (const index in updateData) {
             saveObj.push({field: index, value: updateData[index]});
         }
-        saveObj.push({field: 'addRule', value: setting});
+        //saveObj.push({field: 'addRule', value: setting});
         saveObj.push({field: 'jobContent', value: node.data.jobContent});
         saveObj.push({field: 'itemCharacter', value: node.data.itemCharacter});
         // 更新到数据库
         pageCCOprObj.updateBill(findSet, saveObj, function(response) {
             self.refreshView(node, updateData);
             // 更新项目属性的配置
-            projectObj.project.property.addRule = setting;
+            //projectObj.project.property.addRule = setting;
             // 更新节点数据
             node.data.name = updateData.name;
             node.data.itemCharacterText = updateData.itemCharacterText;
@@ -1200,9 +1206,12 @@ let pageCCOprObj = {
             let characterArray = [];
             let count = 1;
             for (const tmp of itemCharacter) {
-                if (tmp.eigenvalue === undefined || tmp.eigenvalue.length <= 0 || !tmp.isChecked) {
+                if (!tmp.isChecked) {
                     continue;
                 }
+                if(tmp.eigenvalue === undefined || tmp.eigenvalue.length <= 0){
+                    tmp.eigenvalue = [];
+                }
                 // 获取选中的特征值
                 let selectedEigen = '';
                 for (const eigen of tmp.eigenvalue) {

+ 11 - 3
web/building_saas/main/js/views/fee_rate_view.js

@@ -265,7 +265,7 @@ var feeRateObject={
                // ctx.fillText(value,x+3+ctx.measureText(value).width,y+h-3);
              GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
            // }
-            if(feeRateObject.editingCell){
+            if(feeRateObject.editingCell && !projectReadOnly){
                 if(feeRateObject.editingCell.row==options.row&&feeRateObject.editingCell.col==options.col){
                     var image = document.getElementById('f_btn'),imageMagin = 3;
                     var imageHeight = h-2*imageMagin;
@@ -317,7 +317,9 @@ var feeRateObject={
                 var imageHeight = hitinfo.cellRect.height-2*imageMagin;
                 var imageWidth = hitinfo.cellRect.width*2/7;
                 if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
-                    me.showSelectModal(hitinfo);
+                    if(!projectReadOnly){
+                        me.showSelectModal(hitinfo);
+                    }
                 }
             }
         };
@@ -390,7 +392,9 @@ var feeRateObject={
         this.mainFeeRateSpread = sheetCommonObj.buildSheet($('#divFee')[0], this.mainFeeRateSetting,rowCount);
         this.mainFeeRateSpread.options.scrollbarMaxAlign = true;
         this.mainFeeRateSheet = this.mainFeeRateSpread.getSheet(0);
-        sheetCommonObj.lockCells(this.mainFeeRateSheet , this.mainFeeRateSetting);
+        if(!projectReadOnly){
+            sheetCommonObj.lockCells(this.mainFeeRateSheet , this.mainFeeRateSetting);
+        }
         this.mainFeeRateSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onMainFeeRateSheetValueChange);
         this.mainFeeRateSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, this.onMainFeeRateSelectChanged);
         this.mainFeeRateSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onMainFeeRateRangeChanged);
@@ -402,6 +406,10 @@ var feeRateObject={
         });
         this.mainFeeRateSheet.name('mainFeeRateSheet');
         disableRightMenu("divFee",this.mainFeeRateSpread,this.rightClickCallback);
+        //打开他人分享的项目、只读
+        if(projectReadOnly){
+            disableSpread(this.mainFeeRateSpread);
+        }
     },
     rightClickCallback:function (row) {
         let me = feeRateObject;

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

@@ -39,7 +39,7 @@ let gljCol = {
             {headerName: "是否暂估", headerWidth: 60, dataCode: "is_evaluate", hAlign: "center", dataType: "String",cellType:'checkBox'},
             {headerName: "主要材料", headerWidth: 60, dataCode: "is_main_material", hAlign: "center", dataType: "String",cellType:'checkBox'},
             {headerName: "供货方式", headerWidth: 80, dataCode: "supply", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:supplyComboMap},
-            {headerName: "甲供数量", headerWidth: 100, dataCode: "supply_quantity", hAlign: "right", dataType: "Number",validator:"number"},
+            {headerName: "甲供数量", headerWidth: 100, dataCode: "supply_quantity", hAlign: "right", dataType: "Number",validator:"number",decimalField:'glj.quantity'},
             {headerName: "三材类别", headerWidth: 80, dataCode: "materialType", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:materialComboMap},
             {headerName: "三材系数", headerWidth: 100, dataCode: "materialCoe", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:'material'
             {headerName: "交货方式", headerWidth: 90, dataCode: "delivery", hAlign: "left", dataType: "String"},

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

@@ -111,7 +111,9 @@ var gljOprObj = {
                 args.cancel = true;
             }
         });
-        gljContextMenu.loadGLJSpreadContextMenu();
+        if(!projectReadOnly){
+            gljContextMenu.loadGLJSpreadContextMenu();
+        }
     },
     initDetailSheet: function (sheet) {
         var me = this;
@@ -132,11 +134,16 @@ var gljOprObj = {
     },
     detailSheetReadonly:function () {
         let selected = projectObj.project.mainTree.selected;
+        let Bills =  projectObj.project.Bills;
         if(selected) {
             //清单锁定时只读
             if(selected.sourceType == ModuleNames.bills && projectObj.project.isBillsLocked() && projectObj.project.withinBillsLocked(selected)){
                 return true;
             }
+            //大项费用、分部节点层次时,工程量明细只读。
+            if(indicativeInfoObj.isDXFY(selected) || indicativeInfoObj.isFB(selected)){
+                return true;
+            }
             //是主材或者是设备时只读
             if(selected.sourceType == ModuleNames.ration_glj){
                 return true;
@@ -275,6 +282,7 @@ var gljOprObj = {
         }
     },
     onCellClick: function (sender, args) {
+        console.log('cellClick');
         var me = gljOprObj;
         if (args.row >= me.sheetData.length) {
             return;
@@ -404,6 +412,9 @@ var gljOprObj = {
     },
     showDataIfRationSelect: function (node,selectedNodeId) {
         var isShow = false;
+        if(projectReadOnly && this.setting.view.lockColumns){
+            this.setting.view.lockColumns = null;
+        }
         if(selectedNodeId){
             this.selectedNodeId = selectedNodeId;
         }

+ 102 - 19
web/building_saas/main/js/views/main_tree_col.js

@@ -424,31 +424,115 @@ let colSettingObj = {
         }
         return false;
     },
-    updateColSetting: function () {
-        let sheet = this.settingSpread.getActiveSheet();
-         let mainSheet = projectObj.mainSpread.getActiveSheet();
-         for (let iRow = 0; iRow < sheet.getRowCount(); iRow++) {
-         projectObj.project.projSetting.main_tree_col.cols[iRow].visible = sheet.getValue(iRow, 0);
-         projectObj.project.projSetting.mainGridSetting.cols[iRow].visible = sheet.getValue(iRow, 0);
-         }
-         SheetDataHelper.massOperationSheet(mainSheet, function () {
-         SheetDataHelper.refreshColumnVisible(projectObj.project.projSetting.mainGridSetting, mainSheet);
-         //左右滚动条到最左边
-         mainSheet.showColumn(projectObj.project.projSetting.mainGridSetting.frozenCols, GC.Spread.Sheets.HorizontalPosition.left);
-         });
-         //refresh nodes to autoFitRow
-         projectObj.mainController.refreshTreeNode(projectObj.project.mainTree.roots, true);
-         projectObj.project.pushNow('editColSetting', projectObj.project.projSetting.moduleName, {
-         projectID: projectObj.project.ID(),
-         main_tree_col: projectObj.project.projSetting.main_tree_col
-         });
+    updateColSetting: function (skipSetValue = false) {
+        let mainSheet = projectObj.mainSpread.getActiveSheet();
+        if(!skipSetValue){
+            let sheet = this.settingSpread.getActiveSheet();
+            for (let iRow = 0; iRow < sheet.getRowCount(); iRow++) {
+                projectObj.project.projSetting.main_tree_col.cols[iRow].visible = sheet.getValue(iRow, 0);
+                projectObj.project.projSetting.mainGridSetting.cols[iRow].visible = sheet.getValue(iRow, 0);
+            }
+        }
+        SheetDataHelper.massOperationSheet(mainSheet, function () {
+            SheetDataHelper.refreshColumnVisible(projectObj.project.projSetting.mainGridSetting, mainSheet);
+            //左右滚动条到最左边
+            mainSheet.showColumn(projectObj.project.projSetting.mainGridSetting.frozenCols, GC.Spread.Sheets.HorizontalPosition.left);
+        });
+        //refresh nodes to autoFitRow
+        projectObj.mainController.refreshTreeNode(projectObj.project.mainTree.roots, true);
+        if(!skipSetValue){
+            //列设置将项目特征和工作内容都取消打钩后,更新快速列设置
+            if(!this.getVisible('itemCharacterText') && !this.getVisible('jobContentText')){
+                switchTznrHtml(true);
+            }
+            if(this.getVisible('itemCharacterText') && this.getVisible('jobContentText')){
+                switchTznrHtml(false);
+            }
+        }
+        projectObj.project.pushNow('editColSetting', projectObj.project.projSetting.moduleName, {
+            projectID: projectObj.project.ID(),
+            main_tree_col: projectObj.project.projSetting.main_tree_col
+        });
+    },
+    setVisible: function (field, visible) {
+        let mainTreeCols = projectObj.project.projSetting.main_tree_col.cols;
+        for(let colSetting of mainTreeCols){
+            if(colSetting.data.field === field){
+                colSetting.visible = visible;
+                break;
+            }
+        }
+        let mainGridCols = projectObj.project.projSetting.mainGridSetting.cols;
+        for(let colSetting of mainGridCols){
+            if(colSetting.data.field === field){
+                colSetting.visible = visible;
+                break;
+            }
+        }
+    },
+    getVisible: function(field){
+        let cols = projectObj.project.projSetting.main_tree_col.cols;
+        for(let colSetting of cols){
+            if(colSetting.data.field === field){
+                return colSetting.visible;
+            }
+        }
+        return false;
     }
+
 };
 
+function switchTznrHtml(show) {
+    if(projectReadOnly){
+        return;
+    }
+    if(show){
+        let newHmtl = $('#switchTznr').html().replace('隐藏', '显示');
+        $('#switchTznr').html(newHmtl);
+        $('#switchTznr').find('i').removeClass('fa-eye-slash');
+        $('#switchTznr').find('i').addClass('fa-eye');
+    }
+    else {
+        let newHmtl = $('#switchTznr').html().replace('显示', '隐藏');
+        $('#switchTznr').html(newHmtl);
+        $('#switchTznr').find('i').removeClass('fa-eye');
+        $('#switchTznr').find('i').addClass('fa-eye-slash');
+    }
+}
+
+$('#switchTznr').click(function () {
+    let me = colSettingObj;
+    let cur = $(this).text();
+    if(cur.includes('显示特征内容')){
+        switchTznrHtml(false);
+        me.setVisible('itemCharacterText', true);
+        me.setVisible('jobContentText', true);
+        me.updateColSetting(true);
+    }
+    else {
+        switchTznrHtml(true);
+        me.setVisible('itemCharacterText', false);
+        me.setVisible('jobContentText', false);
+        me.updateColSetting(true);
+    }
+});
+
 $('#poj-set').on('shown.bs.modal', function (e) {
     if (!colSettingObj.settingSpread) {
         colSettingObj.initSettingSpread();
+        if(projectReadOnly){
+            disableSpread(colSettingObj.settingSpread);
+        }
     }
+    if($('#tab_display_setting').hasClass('active')){
+        let sheet = colSettingObj.settingSpread.getActiveSheet();
+        SheetDataHelper.massOperationSheet(sheet, function () {
+            for(let row = 0; row < sheet.getRowCount(); row++){
+                let orgData = projectObj.project.projSetting.main_tree_col.cols[row].visible;
+                sheet.setValue(row, 0, orgData);
+            }
+        });
+    }  
 });
 
 $('#poj-set').on('hidden.bs.modal', function (e) {
@@ -464,7 +548,6 @@ $('#poj-set').on('hidden.bs.modal', function (e) {
     }
 });
 
-
 $('#tab_display_setting').on('shown.bs.tab', function () {
     if(colSettingObj.settingSpread){
         colSettingObj.settingSpread.refresh();

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

@@ -51,6 +51,14 @@ projectGljObject={
         this.initProjectGljSheet();
         this.initMaterialTreeSheet();
         disableRightMenu("project_glj_sheet",this.projectGljSpread,this.rightClickCallback);
+        //打开别人分享的项目,只读
+        if(projectReadOnly){
+            //锁定逻辑走disabledSpread里的
+            if(this.projectGljSetting.view.lockColumns){
+                this.projectGljSetting.view.lockColumns = null;
+            }
+            disableSpread(this.projectGljSpread);
+        }
     },
     initProjectGljSheet:function () {
         this.projectGljSheet = this.projectGljSpread .getSheet(0);
@@ -63,7 +71,9 @@ projectGljObject={
         let me = projectGljObject;
         if(me.mixRatioSpread==null){
             me.initMixRatioSpread();
-            me.initRightClick();
+            if(!projectReadOnly){
+                me.initRightClick();
+            }
         }
     },
     initMixRatioSpread:function () {
@@ -72,6 +82,12 @@ projectGljObject={
         this.initSheet(this.mixRatioSheet,this.mixRatioSetting);
         this.mixRatioSheet.name('mixRatioSheet');
         this.mixRatioSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onMixRatioRangeChange);
+        if(projectReadOnly){
+            if(this.mixRatioSetting.view.lockColumns){
+                this.mixRatioSetting.view.lockColumns = null;
+            }
+            disableSpread(this.mixRatioSpread);
+        }
     },
     initMaterialTreeSheet:function () {
         this.materialTreeSheet = this.projectGljSpread.getSheet(1);
@@ -82,6 +98,11 @@ projectGljObject={
         this.materialTreeSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onProjectGljEditStarting);
         this.materialTreeSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onProjectGLJValueChange);
         this.materialTreeSheet.name('materialTreeSheet');
+        if(projectReadOnly && this.materialSetting.view.lockColumns){
+            if(this.materialSetting.view.lockColumns){
+                this.materialSetting.view.lockColumns = null;
+            }
+        }
     },
     createMaterialTreeSheetSetting:function () {
         return sheetCommonObj.transferToTreeSetting(this.materialSetting,this.materialTreeSetting);
@@ -380,7 +401,7 @@ projectGljObject={
             if(recode[c.dataCode] == c.value){
                 continue;
             }
-            me.getUpdateData(recode.id,c.value,c.dataCode,c.quantity,updateMap);
+            me.getUpdateData(recode.id,c.value,c.dataCode,recode.quantity,updateMap);
         }
         if(_.isEmpty(updateMap)){
             callback?callback():'';

+ 4 - 1
web/building_saas/main/js/views/project_info.js

@@ -31,13 +31,16 @@ var projectInfoObj = {
         CommonAjax.post('/pm/api/getProject', {"user_id": userID, "proj_id": scUrlUtil.GetQueryString('project')}, function (data) {
             if (data) {
                 that.projectInfo = data;
+                if(!data.engineeringInfo.billsGuidance_lib || data.engineeringInfo.billsGuidance_lib.length === 0){
+                    $('#stdBillsGuidanceTab').addClass('disabled');
+                }
+
                 //init decimal
                 setDecimal(decimalObj, data.property.decimal);
                 billsQuanDecimal.datas = data.property.billsQuantityDecimal || [billsDecimalView.angleDecimal];
                 basicInfoView.orgDatas = data.property.basicInformation ? basicInfoView.toViewDatas(data.property.basicInformation) : [];
                 projFeatureView.orgDatas = data.property.projectFeature ? projFeatureView.toViewDatas(data.property.projectFeature) : [];
                 $('#fullpath').html(that.getFullPathHtml(that.projectInfo));
-
             }
         });
     }

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

@@ -443,6 +443,9 @@ $(document).ready(function () {
         basicInfoView.initDatas(basicInfoView.orgDatas);
         basicInfoView.buildSheet();
         basicInfoView.showData(basicInfoView.datas);
+        if(projectReadOnly){
+            disableSpread(basicInfoView.workBook);
+        }
     });
 
     $('#poj-set').on('hidden.bs.modal', function (e) {

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

@@ -351,6 +351,9 @@ $(document).ready(function () {
         }
         billsDecimalView.buildSheet();
         billsDecimalView.showData(billsDecimalView.cache);
+        if(projectReadOnly){
+            disableSpread(billsDecimalView.workBook);
+        }
     });
 
     $('#poj-set').on('hidden.bs.modal', function (e) {

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

@@ -81,6 +81,10 @@ let indicativeInfoObj = {
     isBills: function (node) {
         return node && node.sourceType === projectObj.project.Bills.getSourceType();
     },
+    //是分部节点
+    isFB:function (node) {
+        return this.isBills(node) && node.data.type === billType.FB;
+    },
     //是大项费用
     isDXFY: function (node) {
         return this.isBills(node) && node.data.type === billType.DXFY;

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

@@ -50,6 +50,9 @@ let labourCoeView = {
         sheet.bind(GC.Spread.Sheets.Events.CellChanged, me.onCellChanged);
         sheet.resumeEvent();
         sheet.resumePaint();
+        if(projectReadOnly){
+            disableSpread(me.spread);
+        }
     },
     loadCrossData(datas){          // 交叉表:树结构转换二维表显示,行列转换
         let me = this;
@@ -70,8 +73,11 @@ let labourCoeView = {
         me.sheet.setColumnCount(libArr.length + 1, GC.Spread.Sheets.SheetArea.viewport);    // 还多一列行名称
         me.sheet.setRowCount(row, GC.Spread.Sheets.SheetArea.viewport);
         me.sheet.setText(0, 0, "定额工种", GC.Spread.Sheets.SheetArea.colHeader);
-        me.sheet.options.isProtected = true;
-        me.sheet.getRange(-1, 1, -1, libArr.length + 1, GC.Spread.Sheets.SheetArea.viewport).locked(false);
+        //项目只读的话,单元格锁定在disableSpread控制
+        if(!projectReadOnly){
+            me.sheet.options.isProtected = true;
+            me.sheet.getRange(-1, 1, -1, libArr.length + 1, GC.Spread.Sheets.SheetArea.viewport).locked(false);
+        }
 
         // 列名称
         for (let c = 0; c <= libArr.length - 1; c++) {

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

@@ -401,6 +401,9 @@ $(document).ready(function () {
         projFeatureView.initDatas(projFeatureView.orgDatas);
         projFeatureView.buildSheet();
         projFeatureView.showData(projFeatureView.datas);
+        if(projectReadOnly){
+            disableSpread(projFeatureView.workBook);
+        }
     });
 
     $('#poj-set').on('hidden.bs.modal', function (e) {

+ 122 - 4
web/building_saas/main/js/views/project_view.js

@@ -584,6 +584,7 @@ var projectObj = {
             this.mainSpread = SheetDataHelper.createNewSpread($('#billsSpread')[0]);
             this.mainSpread.getActiveSheet().selectionPolicy(GC.Spread.Sheets.SelectionPolicy.muliRange);
             this.mainSpread.getActiveSheet().name('mainSheet');
+            this.mainSpread.getActiveSheet().options.isProtected = true;
         }
     },
     refreshMainSpread: function () {
@@ -600,6 +601,13 @@ var projectObj = {
         this.project.loadDatas(function (err) {
             let mTime = +new Date();
             console.log(`get data时间——${mTime - startTime}`);
+            //快速列设置
+            if(!colSettingObj.getVisible('itemCharacterText') && !colSettingObj.getVisible('jobContentText')){
+                switchTznrHtml(true);
+            }
+            if(colSettingObj.getVisible('itemCharacterText') && colSettingObj.getVisible('jobContentText')){
+                switchTznrHtml(false);
+            }
             if (!err) {
                 that.project.projectGLJ.calcQuantity(true);//计算分部分项和技术措施项目消耗量;
                 gljCol.initGljCol(that.project.projSetting.glj_col?that.project.projSetting.glj_col.showAdjustPrice:false);
@@ -683,7 +691,9 @@ var projectObj = {
                 that.mainSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, that.onCellDoubleClick);
 
                 //let loadOtherStartTime = +new Date();
-                that.loadMainSpreadContextMenu();
+                if(!projectReadOnly){
+                    that.loadMainSpreadContextMenu();
+                }
                 that.loadFocusLocation();
                 socketObject.connect();//连接socket服务器
                 let endTime = +new Date();
@@ -697,6 +707,9 @@ var projectObj = {
                 //定位到会话中的选项
                 let mainTabFocus = sessionStorage.getItem('mainTab') ? sessionStorage.getItem('mainTab') : '#tab_zaojiashu';
                 $(`${mainTabFocus}`).click();
+                if(projectReadOnly){
+                    disableSpread(that.mainSpread);
+                }
                 $.bootstrapLoading.end();
             }
             else {
@@ -932,7 +945,15 @@ var projectObj = {
                     disabled: function () {
                         let selection = projectObj.mainSpread.getActiveSheet().getSelections()[0];
                         let firstNode = projectObj.project.mainTree.items[selection.row];//当多选的情况,用mainTree.selected判断不正确,要用第一个选中的节点
-                        return BlockController.copyBtnDisable(firstNode);
+                        for(let i = 0;i< selection.rowCount;i++){ //多选的时候判断所有与第一个节点同级的节点
+                            let temNode = projectObj.project.mainTree.items[selection.row + i];
+                            if(firstNode.getParentID() == temNode.getParentID()){
+                                if(BlockController.copyBtnDisable(temNode) == true){
+                                    return true;
+                                }
+                            }
+                        }
+                        return false;
                     },
                     callback: function () {
                         $.bootstrapLoading.start();
@@ -1501,7 +1522,9 @@ $("a[name='lockBills']").click(function () {//
         controller.refreshTreeNode(nodes);
         projectObj.mainController.setTreeSelected(selected);//触发树节点选中事件
         projectObj.loadLockBillsButton();
-        pageCCOprObj.refreshRuleTools(lockBills);
+        if(!projectReadOnly){
+            pageCCOprObj.refreshRuleTools(lockBills);
+        }
     });
 });
 $('#ZLFB_btn').click(function () {
@@ -1616,6 +1639,9 @@ $('#poj-set').on('show.bs.modal', function () {
         setCalcFlag($('#billsPrice'), leafBillGetFeeType.billsPrice, ft);
         setCalcFlag($('#zangu_common'), zanguCalcType.common, zg);
         setCalcFlag($('#zangu_gatherMaterial'), zanguCalcType.gatherMaterial, zg);
+
+        let showAdjustPrice = projectObj.project.projSetting.glj_col?projectObj.project.projSetting.glj_col.showAdjustPrice:false;
+        showAdjustPrice === true ? $("#tab_poj-settings-6").show():$("#tab_poj-settings-6").hide();
         projDisplayView.init();
         calcOptions.init();
     }
@@ -2142,4 +2168,96 @@ $(function () {
             spread?spread.focus():'';
         }
     }
-});
+    //项目为只读
+    if(projectReadOnly){
+        disableTools();
+    }
+});
+
+//项目只读,处理不可操作的工具栏
+function disableTools(){
+    //造价书按钮
+    $('#delete').remove();
+    $('#upLevel').remove();
+    $('#downLevel').remove();
+    $('#upMove').remove();
+    $('#downMove').remove();
+    $('#ZLFB_btn').remove();
+    $('#switchTznr').remove();
+    $('a[name="lockBills"]').remove();
+    //关于计算
+    $('#poj-settings-4').find('input').prop('disabled', 'disabled');
+    //小数位数
+    $('#poj-settings-decimal').find('input').prop('disabled', 'disabled');
+    //人工单价调整
+    $('#std_labour_coe_files').prop('disabled', 'disabled');
+    //呈现选项
+    $('#display-setting').find('input').prop('disabled', 'disabled');
+    //项目属性确定
+    $('#property_ok').addClass('disabled');
+    //特征及内容
+    $('#add-rule').find('select').prop('disabled', 'disabled');
+    $('#use-to-current').addClass('disabled');
+    $('#use-to-all').addClass('disabled');
+    $('.bottom-tools').remove();
+    //导入
+    $('#uploadConfirm').addClass('disabled');
+    //选项
+    $('#generalOpts1').prop('disabled', 'disabled');
+    $('#generalOpts2').prop('disabled', 'disabled');
+    //补充库编辑器
+    $('#compleRationLib').addClass('disabled');
+    $('#compleGljLib').addClass('disabled')
+    //库
+    $('#stdBillsGuidanceTab').addClass('disabled');
+    $('#stdBillsTab').addClass('disabled');
+    $('#stdRationTab').addClass('disabled');
+    //人材机汇总,选择其他、另存使用
+    $('a[data-target="#change-unitFile"]').remove();
+    $('a[data-target="#unitFile-save-as"]').remove();
+    //费率,选择其他、另存使用、重选标准、统一设置相同参数
+    $('a[data-target="#change-lv"]').remove();
+    $('a[data-target="#copy-lv"]').remove();
+    $('#standardSelect').prop('disabled', 'disabled');
+    $('#cascadeSet').prop('disabled', 'disabled');
+    //计算程序标准
+    $('#calcProgramFileSelect').prop('disabled', 'disabled');
+    //调价
+    $('#calcPriceOption').prop('disabled', 'disabled');
+    $('#gljPriceTenderCoe').prop('disabled', 'disabled');
+    $('#tenderGLJQuantity').prop('disabled', 'disabled');
+    $('#tenderRationQuantity').prop('disabled', 'disabled');
+    $('#tenderPrice').prop('disabled', 'disabled');
+    $('#cleanTender').prop('disabled', 'disabled');
+}
+//项目只读,表格只读
+function disableSpread(spread){
+    spread.unbind(GC.Spread.Sheets.Events.ButtonClicked);
+    let sheetCount = spread.getSheetCount();
+    console.log(sheetCount);
+    for(let i = 0; i < sheetCount; i++){
+        let sheet = spread.getSheet(i);
+        sheet.unbind(GC.Spread.Sheets.Events.ButtonClicked);
+        sheet.unbind(GC.Spread.Sheets.Events.EditStarting);
+        sheet.unbind(GC.Spread.Sheets.Events.EditEnded);
+        sheet.unbind(GC.Spread.Sheets.Events.RangeChanged);
+        sheet.unbind(GC.Spread.Sheets.Events.ClipboardChanging);
+        sheet.unbind(GC.Spread.Sheets.Events.ClipboardChanged);
+        sheet.unbind(GC.Spread.Sheets.Events.CellDoubleClick);
+        sheet.unbind(GC.Spread.Sheets.Events.CellClick);
+        sheet.unbind(GC.Spread.Sheets.Events.ValueChanged);
+        console.log(sheet.name());
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        sheet.options.isProtected = true;
+        let rowCount = sheet.getRowCount();
+        let colCount = sheet.getColumnCount();
+        for(let row = 0; row < rowCount; row++){
+            for(let col = 0; col < colCount; col++){
+                sheet.getCell(row, col).locked(true);
+            }
+        }
+        sheet.resumePaint();
+        sheet.resumeEvent();
+    }
+}

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

@@ -112,6 +112,9 @@ var sideToolsObj = {
 
 $('.side-tabs ul li a').bind('click', function () {
     var tab = $(this), tabPanel = $(tab.attr('relaPanel'));
+    if(tab.hasClass('disabled')){
+        return;
+    }
     if (!tab.hasClass('active')) {
         $('.side-tabs ul li a').removeClass('active');
         tab.addClass('active');

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

@@ -526,7 +526,7 @@ const billsGuidance = (function () {
     function bindBtn(){
         //打开清单指引库
         $('#stdBillsGuidanceTab').click(function () {
-            if(libSel.children().length === 0){
+            if(libSel.children().length === 0 && !projectReadOnly){
                 initLibs(projectInfoObj.projectInfo.engineeringInfo.billsGuidance_lib);
             }
         });

+ 6 - 0
web/building_saas/main/js/views/sub_fee_rate_views.js

@@ -95,6 +95,12 @@ var subRateObject={
         subRateObject.valueMap=projectObj.project.FeeRate.getValueMap(item);
         subRateObject.showSubRateData();
         disableRightMenu("subRate",this.subRateSpread);
+        if(projectReadOnly){
+            if(this.subRateSetting.view.lockColumns){
+                this.subRateSetting.view.lockColumns = null;
+            }
+            disableSpread(this.subRateSpread);
+        }
     },
     showSubRateData:function () {
         this.subRateSheet.setRowCount(0);

+ 78 - 22
web/building_saas/main/js/views/sub_view.js

@@ -9,35 +9,43 @@
 
 let subSpread = null;
 let subObj = {
-  initSubSpread:function () {
-      contentOprObj.buildSheet($("#jobSpread")[0]);
-      characterOprObj.buildSheet($("#itemSpread")[0]);
-      $("#tzjnrCon").hide();
-      $("#subSpread").show();
-      subSpread = sheetCommonObj.createSpread($("#subSpread")[0], 4);
-      subSpread.options.allowUserDragDrop = false;
-      subSpread.options.allowUserDragFill = false;
-      subSpread.getSheet(2).name('JSCX');
-
-      pageCCOprObj.active = false;
-
-       // 工料机
-      gljOprObj.initSheet(subSpread.getSheet(0));
+    initSubSpread:function () {
+        contentOprObj.buildSheet($("#jobSpread")[0]);
+        characterOprObj.buildSheet($("#itemSpread")[0]);
+        $("#tzjnrCon").hide();
+        $("#subSpread").show();
+        subSpread = sheetCommonObj.createSpread($("#subSpread")[0], 4);
+        subSpread.options.allowUserDragDrop = false;
+        subSpread.options.allowUserDragFill = false;
+        subSpread.getSheet(2).name('JSCX');
+
+        pageCCOprObj.active = false;
+
+        // 工料机
+        gljOprObj.initSheet(subSpread.getSheet(0));
         //sheetCommonObj.shieldAllCells(subSpread.getSheet(0), gljOprObj.setting);
-      SheetDataHelper.protectdSheet(subSpread.getSheet(0));
+        SheetDataHelper.protectdSheet(subSpread.getSheet(0));
         // assistOprObj.initSheet(subSpread.getSheet(1));
         // sheetCommonObj.shieldAllCells(subSpread.getSheet(1), assistOprObj.setting);
 
+        if(!projectReadOnly){
+            gljContextMenu.loadGLJSpreadContextMenu();
+        }
 
         //工程量明细
-      gljOprObj.initDetailSheet(subSpread.getSheet(1));
-      SheetDataHelper.protectdSheet(subSpread.getSheet(1));
+        gljOprObj.initDetailSheet(subSpread.getSheet(1));
+        SheetDataHelper.protectdSheet(subSpread.getSheet(1));
 
         //安装增加费
-      installationFeeObj.initRationInstallSheet(subSpread.getSheet(3));
-      SheetDataHelper.protectdSheet(subSpread.getSheet(3));
-      gljContextMenu.loadGLJSpreadContextMenu();
-  }
+        installationFeeObj.initRationInstallSheet(subSpread.getSheet(3));
+        SheetDataHelper.protectdSheet(subSpread.getSheet(3));
+
+        if(projectReadOnly){
+            disableSpread(subSpread);
+            disableSpread(contentOprObj.workBook);
+            disableSpread(characterOprObj.workBook);
+        }
+    }
 };
 
 
@@ -126,6 +134,9 @@ $("#linkTZJNR").click(function () {
 // 应用到选中清单
 let isSaving = false;
 $("#use-to-current").click(function() {
+    if(projectReadOnly){
+        return false;
+    }
     if (isSaving) {
         return false;
     }
@@ -152,6 +163,9 @@ $("#use-to-current").click(function() {
 });
 // 应用到所有的清单
 $("#use-to-all").click(function() {
+    if(projectReadOnly){
+        return false;
+    }
     let treeNode = projectObj.mainController.tree;
     const setting = getAddRuleSetting();
     if (treeNode.items === undefined || treeNode.items.length <= 0) {
@@ -167,6 +181,26 @@ $("#use-to-all").click(function() {
     }
 });
 
+function saveAddRule(){
+    let setting = getAddRuleSetting();
+    let toUpdate = false;
+    if(!projectObj.project.property.addRule){
+        toUpdate = true;
+    }
+    else {
+        for(let attr in setting){
+            if(setting[attr] !== projectObj.project.property.addRule[attr]){
+                toUpdate = true;
+                break;
+            }
+        }
+    }
+    if(toUpdate){
+        projectObj.project.property.addRule = setting;
+        projectObj.project.saveProperty('addRule', setting);
+    }
+}
+
 // 添加位置选择
 $("#add-position").change(function() {
     const selected = $(this).children(":selected").val();
@@ -191,6 +225,7 @@ $("#add-position").change(function() {
             addContentEle.val(1);
             break;
     }
+    saveAddRule();
 });
 // 添加内容选择
 $("#add-content").change(function() {
@@ -231,6 +266,17 @@ $("#add-content").change(function() {
             childDisplayFormatEle.attr('disabled', 'disabled');
             break;
     }
+    saveAddRule();
+});
+
+//显示格式
+$('#display-format').change(function () {
+    saveAddRule();
+});
+
+//特征生成方式
+$('#character-format').change(function () {
+    saveAddRule();
 });
 
 // 子目生成方式选择事件
@@ -246,6 +292,12 @@ $("#child-display-format").change(function() {
         serialTypeEle.val(1);
         serialTypeEle.removeAttr('disabled');
     }
+    saveAddRule();
+});
+
+//序号格式
+$('#serial-type').change(function () {
+    saveAddRule();
 });
 
 /**
@@ -303,6 +355,10 @@ function setRule(setting) {
     $("#child-display-format").change();
 
     $("#serial-type").val(setting.serialType);
+
+    if(projectReadOnly){
+        disableTools();
+    }
 }
 
 function activeSubSheetIs(idx){
@@ -392,4 +448,4 @@ $('#linkGCLMX').on('shown.bs.tab', function () {
 
 $('#linkAZZJF').on('shown.bs.tab', function () {
     gljOprObj.showDataIfRationSelect(projectObj.project.mainTree.selected, '111111');
-});
+});

+ 3 - 1
web/building_saas/main/js/views/tender_price_view.js

@@ -388,7 +388,9 @@ let tender_obj={
         $('#calcPriceOption').val(calcPriceOption);
         $('#gljPriceTenderCoe').val(gljPriceTenderCoe);
         if(calcPriceOption == 'coeBase'){
-            $('#tenderPrice').removeAttr("disabled");
+            if(!projectReadOnly){
+                $('#tenderPrice').removeAttr("disabled");
+            }
             $('#tenderGLJQuantity').attr("disabled",true);
             $('#tenderRationQuantity').attr("disabled",true);
         }else {

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

@@ -46,6 +46,9 @@ let zmhs_obj = {
         this.assSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onAssRangeChanged);
         this.assSheet.name('ration_ass');
         SheetDataHelper.protectdSheet(this.coeSheet);
+        if(projectReadOnly){
+            disableSpread(zmhs_obj.coeSpread);
+        }
     },
     showCoeData:function (node) {
         let selected = node?node:projectObj.project.mainTree.selected;

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

@@ -25,8 +25,8 @@
                 <p> 点“确定”按钮,确认从回收站中恢复。</p>
             </div>
             <div class="modal-footer">
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
                 <a href="javascript:void(0);" class="btn btn-primary" data-dismiss="modal" id="rePojBtn">确定</a>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
             </div>
         </div>
     </div>
@@ -44,8 +44,8 @@
             <div class="modal-body">
             </div>
             <div class="modal-footer">
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
                 <a href="javascript:void(0);" class="btn btn-primary" data-dismiss="modal" id="delPojBtn">确定</a>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
             </div>
         </div>
     </div>
@@ -70,8 +70,8 @@
                 </table>
             </div>
             <div class="modal-footer">
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
                 <a href="javascript:void(0);" class="btn btn-primary" id="reFileBtn" data-dismiss="modal">确定</a>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
             </div>
         </div>
     </div>
@@ -96,8 +96,8 @@
                 </table>
             </div>
             <div class="modal-footer">
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
                 <a href="javascript:void(0);" class="btn btn-primary" id="delFileBtn" data-dismiss="modal">确定</a>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
             </div>
         </div>
     </div>

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

@@ -250,6 +250,7 @@ const projTreeObj = {
                             alert(error);
                             return false;
                         }
+                        //更新选中项目缓存
                         $('#copy-to-dialog').modal('show');
                     }
                 },
@@ -1368,6 +1369,7 @@ $(document).ready(function() {
         let projectData = _.cloneDeep(originalNode.data);
         projectData['ParentID'] = parent.id();
         projectData['NextSiblingID'] = nextID;
+        projectData['property'] ={};
         projectData['property']['rootProjectID'] = parent.pid();
         projectData['shareInfo'] = [];
         let rename = projTreeObj.projectNameChecking(parent,originalNode,"复制");//重名检查

+ 39 - 5
web/building_saas/pm/js/pm_share.js

@@ -300,11 +300,28 @@ const pmShare = (function () {
         TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
             let offset = -1;
             let node = tree.items[hitinfo.row];
-            tree.selected = node;
             let centerX = hitinfo.cellRect.x + offset + node.depth() * indent + node.depth() * levelIndent + indent / 2;
-            let centerY = (hitinfo.cellRect.y + offset + (hitinfo.cellRect.y + offset + hitinfo.cellRect.height)) / 2;;
+            let centerY = (hitinfo.cellRect.y + offset + (hitinfo.cellRect.y + offset + hitinfo.cellRect.height)) / 2;
+            let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
+            let value = hitinfo.sheet.getValue(hitinfo.row, hitinfo.col);
+            let acStyle = hitinfo.sheet.getActualStyle(hitinfo.row, hitinfo.col),
+                zoom = hitinfo.sheet.zoom();
+            let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, {sheet: hitinfo.sheet, row: hitinfo.row, col: hitinfo.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport});
+            //(图标+名字)区域
+            function withingClickArea(){
+                return hitinfo.x > centerX + halfBoxLength && hitinfo.x < centerX + halfBoxLength + imgWidth + indent/2+3 + textLength;
+            }
+            //点击单位工程
+            if(node.data.projType === projectType.tender && withingClickArea()){
+                let newTab = window.open('about:blank');
+                BeforeOpenProject(node.data.ID, {'fullFolder': GetFullFolder(node.parent)}, function () {
+                    let mainUrl = `/main?project=${node.data.ID}`;
+                    CommonAjax.get(mainUrl, [], function () {
+                        newTab.location.href = mainUrl;
+                    });
+                });
+            }
             if (!node || node.children.length === 0) { return; }
-
             if (hitinfo.x > centerX - halfBoxLength && hitinfo.x < centerX + halfBoxLength && hitinfo.y > centerY - halfBoxLength && hitinfo.y < centerY + halfBoxLength) {
                 node.setExpanded(!node.expanded);
                 TREE_SHEET_HELPER.massOperationSheet(hitinfo.sheet, function () {
@@ -318,6 +335,20 @@ const pmShare = (function () {
                 hitinfo.sheet.repaint();
             }
         };
+        TreeNodeCellType.prototype.processMouseMove = function (hitInfo) {
+            let sheet = hitInfo.sheet;
+            let div = sheet.getParent().getHost();
+            let canvasId = div.id + "vp_vp";
+            let canvas = $(`#${canvasId}`)[0];
+            //改变鼠标图案
+            if (sheet && hitInfo.isReservedLocation) {
+                canvas.style.cursor='pointer';
+                return true;
+            }else{
+                canvas.style.cursor='default';
+            }
+            return false;
+        };
         return new TreeNodeCellType();
     }
     //
@@ -639,7 +670,7 @@ const pmShare = (function () {
         }
         let copyMap = {copy: null, update: null};
         let newName = `${selected.data.name} (${selected.data.userInfo.name}共享)`;
-        //获取单项工程的最末单位工程
+        //获取单项工程的单位工程
         let tenderQuery = {$or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], userID: userID, ParentID: engID};
         CommonAjax.post('/pm/api/getProjectsByQuery', {user_id: userID, query: tenderQuery, options: '-_id -property'}, function (rstData) {
             let updateTender = null;
@@ -669,7 +700,7 @@ const pmShare = (function () {
                 createDateTime: selected.data.createDateTime,
                 fileVer: selected.data.fileVer ? selected.data.fileVer : '',
                 projType: selected.data.projType,
-                property: selected.data.property,
+                property: {},
                 recentDateTime: selected.data.recentDateTime,
                 fullFolder: selected.data.fullFolder
             };
@@ -690,6 +721,9 @@ const pmShare = (function () {
     function eventListener(){
         //tab
         $('#tab_pm_share').on('shown.bs.tab', function () {
+            //侧滑隐藏
+            $('.slide-sidebar').removeClass('open');
+            $('.slide-sidebar').css('width', '0');
             projTreeObj.tree = null;
             if(projTreeObj.workBook){
                 projTreeObj.workBook.destroy();

+ 6 - 2
web/common/html/header.html

@@ -1,5 +1,9 @@
 <nav class="navbar navbar-expand-lg p-0 d-flex">
-    <a class="header-logo px-2" href="/pm" style="text-decoration: none;">纵横云计价<sup><%= versionName %></sup></a>
+    <div class="header-logo">
+        <div class="v-title">纵横云计价</div>
+        <div class="p-title"><%= versionName %></div>
+    </div>
+    <!--<a class="header-logo px-2" href="/pm" style="text-decoration: none;">纵横云计价<sup><%= versionName %></sup></a>-->
     <ul class="nav navbar-nav px-1" id="header-menu" style="display: none;">
         <li class="nav-item">
             <a class="nav-link" href="#" aria-expanded="false" data-toggle="modal" data-target="#poj-set"><i class="fa fa-cube"></i> 项目属性</a>
@@ -12,7 +16,7 @@
             <div class="dropdown-menu">
                 <!--<a class="dropdown-item" href="/complementaryRation/main">定额库编辑器</a>-->
                 <a class="dropdown-item" href="javascript:void(0);" aria-expanded="false" data-toggle="modal" data-target="#opts-set"><i class="fa fa-sliders"></i> 选项</a>
-                <a class="dropdown-item" href="javascript:void(0);" data-toggle="modal" data-target="#comple-ration">定额库编辑器</a>
+                <a id="compleRationLib" class="dropdown-item" href="javascript:void(0);" data-toggle="modal" data-target="#comple-ration">定额库编辑器</a>
                 <a id="compleGljLib" class="dropdown-item" href="javascript:void(0);">人材机库编辑器</a>
             </div>
         </li>