Przeglądaj źródła

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

Conflicts:
	web/building_saas/main/js/views/project_view.js
chenshilong 6 lat temu
rodzic
commit
5351997216
79 zmienionych plików z 954 dodań i 488 usunięć
  1. 1 1
      config/config.js
  2. 2 1
      config/gulpConfig.js
  3. 0 2
      modules/common/base/base_controller.js
  4. 4 4
      modules/complementary_ration_lib/models/compleRationModel.js
  5. 3 4
      modules/main/controllers/bills_controller.js
  6. 39 2
      modules/main/facade/ration_facade.js
  7. 7 6
      modules/options/models/optionTypes.js
  8. 0 34
      modules/options/models/optionsModel.js
  9. 10 1
      modules/pm/controllers/pm_controller.js
  10. 25 2
      modules/pm/facade/pm_facade.js
  11. 1 0
      modules/ration_glj/facade/ration_glj_facade.js
  12. 2 3
      modules/reports/controllers/rpt_controller.js
  13. 9 1
      modules/reports/facade/rpt_tpl_data_facade.js
  14. 22 0
      modules/reports/rpt_component/jpc_rte.js
  15. 12 2
      modules/reports/util/rpt_excel_util.js
  16. 53 0
      modules/reports/util/rpt_tmp_file_sweep.js
  17. 6 1
      modules/users/models/user_model.js
  18. 13 5
      public/web/common_ajax.js
  19. 14 2
      public/web/sheet/sheet_common.js
  20. 4 3
      public/web/sheet/sheet_data_helper.js
  21. 5 3
      public/web/tree_sheet/tree_sheet_helper.js
  22. 5 33
      server.js
  23. 2 2
      socketdockerfile
  24. 9 2
      test/unit/reports/test_rpt_test_template.js
  25. 1 0
      web/building_saas/complementary_glj_lib/js/components.js
  26. 1 0
      web/building_saas/complementary_glj_lib/js/glj.js
  27. 1 0
      web/building_saas/complementary_glj_lib/js/gljClassTree.js
  28. 1 0
      web/building_saas/complementary_glj_lib/js/gljComponent.js
  29. 1 0
      web/building_saas/complementary_ration_lib/html/dinge.html
  30. 2 0
      web/building_saas/complementary_ration_lib/js/coe.js
  31. 1 0
      web/building_saas/complementary_ration_lib/js/gljSelect.js
  32. 3 0
      web/building_saas/complementary_ration_lib/js/installation.js
  33. 0 1
      web/building_saas/complementary_ration_lib/js/main.js
  34. 1 0
      web/building_saas/complementary_ration_lib/js/ration.js
  35. 1 0
      web/building_saas/complementary_ration_lib/js/repository_glj.js
  36. 1 0
      web/building_saas/complementary_ration_lib/js/section_tree.js
  37. 17 5
      web/building_saas/css/main.css
  38. 6 6
      web/building_saas/fee_rates/fee_rate.js
  39. 6 4
      web/building_saas/glj/js/composition_spread.js
  40. 2 2
      web/building_saas/glj/js/project_glj_spread.js
  41. 59 31
      web/building_saas/main/html/main.html
  42. 1 4
      web/building_saas/main/js/controllers/block_controller.js
  43. 6 0
      web/building_saas/main/js/models/bills.js
  44. 4 4
      web/building_saas/main/js/models/project_glj.js
  45. 4 2
      web/building_saas/main/js/models/ration.js
  46. 55 0
      web/building_saas/main/js/models/ration_glj.js
  47. 7 6
      web/building_saas/main/js/views/calc_base_view.js
  48. 2 0
      web/building_saas/main/js/views/calc_program_manage.js
  49. 35 21
      web/building_saas/main/js/views/character_content_view.js
  50. 7 4
      web/building_saas/main/js/views/fee_rate_view.js
  51. 14 13
      web/building_saas/main/js/views/glj_col.js
  52. 155 78
      web/building_saas/main/js/views/glj_view.js
  53. 10 5
      web/building_saas/main/js/views/installation_fee_view.js
  54. 8 9
      web/building_saas/main/js/views/main_tree_col.js
  55. 18 63
      web/building_saas/main/js/views/options_view.js
  56. 7 5
      web/building_saas/main/js/views/project_glj_view.js
  57. 4 3
      web/building_saas/main/js/views/project_info.js
  58. 2 1
      web/building_saas/main/js/views/project_property_basicInfo.js
  59. 1 0
      web/building_saas/main/js/views/project_property_bills_quantity_decimal.js
  60. 1 0
      web/building_saas/main/js/views/project_property_indicativeInfo.js
  61. 2 1
      web/building_saas/main/js/views/project_property_projFeature.js
  62. 60 31
      web/building_saas/main/js/views/project_view.js
  63. 1 1
      web/building_saas/main/js/views/quantity_edit_view.js
  64. 5 0
      web/building_saas/main/js/views/std_billsGuidance_lib.js
  65. 6 1
      web/building_saas/main/js/views/std_bills_lib.js
  66. 9 0
      web/building_saas/main/js/views/std_ration_lib.js
  67. 1 0
      web/building_saas/main/js/views/sub_fee_rate_views.js
  68. 11 2
      web/building_saas/main/js/views/sub_view.js
  69. 1 0
      web/building_saas/main/js/views/tender_price_view.js
  70. 3 0
      web/building_saas/main/js/views/zmhs_view.js
  71. 10 10
      web/building_saas/pm/html/project-management.html
  72. 23 0
      web/building_saas/pm/js/pm_gc.js
  73. 38 7
      web/building_saas/pm/js/pm_newMain.js
  74. 23 0
      web/building_saas/pm/js/pm_share.js
  75. 1 1
      web/building_saas/report/html/rpt_content_format.html
  76. 4 10
      web/building_saas/report/html/rpt_main.html
  77. 1 1
      web/building_saas/report/html/rpt_margins.html
  78. 62 42
      web/common/html/header.html
  79. BIN
      web/dest/css/logo.png

Plik diff jest za duży
+ 1 - 1
config/config.js


+ 2 - 1
config/gulpConfig.js

@@ -7,8 +7,8 @@ module.exports = {
     common_jspaths:[
     common_jspaths:[
         'lib/jquery/jquery-3.2.1.min.js',
         'lib/jquery/jquery-3.2.1.min.js',
         'lib/popper/popper.min.js',
         'lib/popper/popper.min.js',
-        'lib/jquery-ui/jquery-0i.min.js',
         'lib/bootstrap/bootstrap.min.js',
         'lib/bootstrap/bootstrap.min.js',
+        'lib/jquery-ui/jquery-0i.min.js',
         'web/building_saas/js/*.js',
         'web/building_saas/js/*.js',
         'public/web/scMathUtil.js',
         'public/web/scMathUtil.js',
         'public/web/gljUtil.js',
         'public/web/gljUtil.js',
@@ -36,6 +36,7 @@ module.exports = {
         'public/web/id_tree.js',
         'public/web/id_tree.js',
         'public/web/tree_sheet/tree_sheet_helper.js',
         'public/web/tree_sheet/tree_sheet_helper.js',
         'public/web/sheet/sheet_data_helper.js',
         'public/web/sheet/sheet_data_helper.js',
+        'public/web/sheet/sheet_common.js',
         'public/web/common_ajax.js',
         'public/web/common_ajax.js',
         'lib/JSExpressionEval_src/Date.js',
         'lib/JSExpressionEval_src/Date.js',
         'web/building_saas/pm/js/**/*.js',
         'web/building_saas/pm/js/**/*.js',

+ 0 - 2
modules/common/base/base_controller.js

@@ -60,8 +60,6 @@ class BaseController {
         // 获取当前用户消息数量
         // 获取当前用户消息数量
         let userMessageModel = new UserMessageModel();
         let userMessageModel = new UserMessageModel();
         // 消息处理
         // 消息处理
-        console.log(`sessionUser`);
-        console.log(sessionUser);
         await userMessageModel.initMessage(sessionUser.id);
         await userMessageModel.initMessage(sessionUser.id);
         // 获取未读数据
         // 获取未读数据
         let messageUnreadCount = await userMessageModel.count({user_id: sessionUser.id, is_read: 0, is_delete: 0});
         let messageUnreadCount = await userMessageModel.count({user_id: sessionUser.id, is_read: 0, is_delete: 0});

+ 4 - 4
modules/complementary_ration_lib/models/compleRationModel.js

@@ -176,12 +176,12 @@ class CompleRatoinDao {
                     }
                     }
                 }
                 }
                 hintsArr.push(`基价 元 ${ration.basePrice}`);
                 hintsArr.push(`基价 元 ${ration.basePrice}`);
-                hintsArr.push(`工作内容:`);
-                if(ration.jobContent){
+                if(ration.jobContent && ration.jobContent.toString().trim() !== ''){
+                    hintsArr.push(`工作内容:`);
                     hintsArr = hintsArr.concat(ration.jobContent.split('\n'));
                     hintsArr = hintsArr.concat(ration.jobContent.split('\n'));
                 }
                 }
-                hintsArr.push(`附注:`);
-                if(ration.annotation){
+                if(ration.annotation && ration.annotation.toString().trim() !== ''){
+                    hintsArr.push(`附注:`);
                     hintsArr = hintsArr.concat(ration.annotation.split('\n'));
                     hintsArr = hintsArr.concat(ration.annotation.split('\n'));
                 }
                 }
                 ration._doc.hint = hintsArr.join('<br>');
                 ration._doc.hint = hintsArr.join('<br>');

+ 3 - 4
modules/main/controllers/bills_controller.js

@@ -418,7 +418,6 @@ function getColMapping(sheetData){
         if(headRow[c]){
         if(headRow[c]){
             headRow[c] = headRow[c].toString().replace(/\s/g, '');
             headRow[c] = headRow[c].toString().replace(/\s/g, '');
             //重复的,只取第一个
             //重复的,只取第一个
-            console.log(headRow[c]);
             if(headRow[c] === '序号' && colMapping.serialNo === undefined){
             if(headRow[c] === '序号' && colMapping.serialNo === undefined){
                 colMapping.serialNo = c;
                 colMapping.serialNo = c;
             }
             }
@@ -548,8 +547,8 @@ function parseToBillData(validData, colMapping, fixedBill, projectID, stdData){
     function isExtend(preData, rData){
     function isExtend(preData, rData){
         let serialNo = removeESC(rData[colMapping.serialNo]);
         let serialNo = removeESC(rData[colMapping.serialNo]);
         let code = removeESC(rData[colMapping.code]);
         let code = removeESC(rData[colMapping.code]);
-        let name = rData[colMapping.name];
-        let itemCharacterText = rData[colMapping.itemCharacterText];
+        let name = removeESC(rData[colMapping.name]);
+        let itemCharacterText = removeESC(rData[colMapping.itemCharacterText]);
         return isDef(preData) && (isRoot(preData) || isLeaf(preData)) && !isDef(serialNo) && !isDef(code) && (isDef(name) || isDef(itemCharacterText));
         return isDef(preData) && (isRoot(preData) || isLeaf(preData)) && !isDef(serialNo) && !isDef(code) && (isDef(name) || isDef(itemCharacterText));
     }
     }
     function getBillType(rData, flag){
     function getBillType(rData, flag){
@@ -624,8 +623,8 @@ function parseToBillData(validData, colMapping, fixedBill, projectID, stdData){
         }
         }
         if(isExtend(preData, rData)){
         if(isExtend(preData, rData)){
             let preBill = billIdx[preID];
             let preBill = billIdx[preID];
-            //合并续数据
             if(preBill){
             if(preBill){
+                //合并续数据
                 preBill.code += rData[colMapping.code] ? rData[colMapping.code] : '';
                 preBill.code += rData[colMapping.code] ? rData[colMapping.code] : '';
                 preBill.name += rData[colMapping.name] ? rData[colMapping.name] : '';
                 preBill.name += rData[colMapping.name] ? rData[colMapping.name] : '';
                 preBill.itemCharacterText += rData[colMapping.itemCharacterText] ? rData[colMapping.itemCharacterText] : '';
                 preBill.itemCharacterText += rData[colMapping.itemCharacterText] ? rData[colMapping.itemCharacterText] : '';

+ 39 - 2
modules/main/facade/ration_facade.js

@@ -133,8 +133,11 @@ async function replaceRations(userID,data) {
 }
 }
 
 
 async function replaceRation(nodeInfo,stdRation,firstLibID,projectID,calQuantity) {
 async function replaceRation(nodeInfo,stdRation,firstLibID,projectID,calQuantity) {
-    if(stdRation){
-        await deleRationSubRecode(projectID,nodeInfo.ID);
+    if(nodeInfo.newCode == null||nodeInfo.newCode ==""){//说明是删除编号,则要变成一条空定额
+        await deleRationSubRecode(projectID,nodeInfo.ID);//删除定额下挂的各种数据,如定额工料机等
+        return await setEmptyRation(projectID,nodeInfo.ID);
+    }else if(stdRation){
+        await deleRationSubRecode(projectID,nodeInfo.ID);//删除定额下挂的各种数据,如定额工料机等
         let newRation = await updateRation(stdRation,firstLibID,nodeInfo.ID,nodeInfo.billsItemID,projectID,calQuantity);//生成并插入新的定额
         let newRation = await updateRation(stdRation,firstLibID,nodeInfo.ID,nodeInfo.billsItemID,projectID,calQuantity);//生成并插入新的定额
         return await addRationSubList(stdRation,newRation,nodeInfo.needInstall);
         return await addRationSubList(stdRation,newRation,nodeInfo.needInstall);
     }else {
     }else {
@@ -375,6 +378,40 @@ async function  updateRation(std,firstLibID,rationID,billsItemID,projectID,calQu
     return newRation;
     return newRation;
 }
 }
 
 
+async function setEmptyRation(projectID,rationID){
+    let ration ={};
+    ration.code = "";
+    ration.name = "";
+    ration.caption = "";
+    ration.unit = "";
+    ration.libID = null;
+    ration.content = "";
+    ration.adjustState = '';
+    ration.isFromDetail=0;
+    ration.isSubcontract=false;
+    ration.fees=[];
+    ration.comments = "";
+    ration.ruleText = "";
+    ration.quantity="";
+    ration.contain="";
+    ration.quantityEXP="";
+    ration.from = 'std';
+    //定额前缀 none:0, complementary:1, borrow: 2
+    ration.prefix = '';
+    ration.rationAssList = [];
+    ration.marketUnitFee ="";
+    ration.marketTotalFee ="";
+    ration.maskName = "";
+    ration.targetTotalFee ='';
+    ration.targetUnitFee = "";
+    ration.deleteInfo = null;
+    ration.quantityCoe = {};
+    ration.rationQuantityCoe="";
+    ration.tenderQuantity = "";
+    let newRation = await ration_model.model.findOneAndUpdate({ID:rationID,projectID:projectID},{"$set":ration},{new: true});//;
+    return {ration:newRation,ration_gljs:[],ration_coes:[],ration_installs:[]};
+}
+
 function createRationAss(std) {
 function createRationAss(std) {
     let  rationAssList = [];//生成辅助定额
     let  rationAssList = [];//生成辅助定额
     if(std.hasOwnProperty('rationAssList')&&std.rationAssList.length>0){
     if(std.hasOwnProperty('rationAssList')&&std.rationAssList.length>0){

+ 7 - 6
modules/options/models/optionTypes.js

@@ -15,11 +15,11 @@ const optionSetting = {
         DEFAULT: {
         DEFAULT: {
             backColor: 'White',
             backColor: 'White',
             foreColor: 'Black',
             foreColor: 'Black',
-            stringFont: '15px Arial',
-            numFont: '13px Arial'
+            stringFont: '0.9rem Arial',
+            numFont: '0.9rem Arial'
         },
         },
         SELECTED: {
         SELECTED: {
-            backColor: '#dddddd',
+            backColor: '#FFFACD',
             foreColor: 'default',
             foreColor: 'default',
             stringFont: 'default',
             stringFont: 'default',
             numFont: 'default'
             numFont: 'default'
@@ -27,8 +27,8 @@ const optionSetting = {
         DXFY: {
         DXFY: {
             backColor: 'default',
             backColor: 'default',
             foreColor: 'default',
             foreColor: 'default',
-            stringFont: 'bold 15px Arial',
-            numFont: 'bold 13px Arial'
+            stringFont: 'bold 0.9rem Arial',
+            numFont: 'bold 0.9rem Arial'
         },
         },
         FB: {
         FB: {
             backColor: '#C4CAFB',
             backColor: '#C4CAFB',
@@ -60,8 +60,9 @@ const optionSetting = {
             stringFont: 'default',
             stringFont: 'default',
             numFont: 'default'
             numFont: 'default'
         },
         },
+        //含有计算基数的节点
         CBBILL: {
         CBBILL: {
-            backColor: '#E5F3F2',
+            backColor: '#DFE8F9',
             foreColor: 'default',
             foreColor: 'default',
             stringFont: 'default',
             stringFont: 'default',
             numFont: 'default'
             numFont: 'default'

+ 0 - 34
modules/options/models/optionsModel.js

@@ -28,38 +28,4 @@ class OptionsDao {
     }
     }
 }
 }
 
 
-
-
-
-/*class OptionsDao {
-    async getOptions(user_id, compilation_id){
-        let rst = await optionsModel.find({user_id: user_id, compilation_id: compilation_id});
-        rst = rst.length > 0 && typeof rst[0].options !== 'undefined' ? rst[0].options : null;
-        return rst;
-    }
-
-    async getOptionsByType(user_id, compilation_id, optsType){
-        let rst = await optionsModel.find({user_id: user_id, compilation_id: compilation_id});
-        if(rst.length > 0){
-            let opts = rst[0].options;
-            for(let i = 0, len = opts.length; i < len; i++){
-                if(opts[i].type === optsType){
-                    return opts[i];
-                }
-            }
-        }
-        return null;
-    }
-
-    async saveOptions(user_id, compilation_id, opsType, opts){
-        let optionsData = await optionsModel.find({user_id: user_id, compilation_id: compilation_id});
-        if(optionsData.length === 0){
-            await optionsModel.create({user_id: user_id, compilation_id: compilation_id, options: [{type: opsType, opts: opts}]});
-        }
-        await optionsModel.update({user_id: user_id, compilation_id: compilation_id, 'options.type': opsType}, {$set: {'options.$.opts': opts}});
-        let rst = await optionsModel.find({user_id: user_id, compilation_id: compilation_id});
-        return rst;
-    }
-}*/
-
 export default OptionsDao;
 export default OptionsDao;

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

@@ -21,6 +21,7 @@ let asyncTool = require('async');
 let pm_facade = require('../facade/pm_facade');
 let pm_facade = require('../facade/pm_facade');
 const userModel = mongoose.model('user');
 const userModel = mongoose.model('user');
 let config = require("../../../config/config.js");
 let config = require("../../../config/config.js");
+const optionModel = mongoose.model('options');
 
 
 //统一回调函数
 //统一回调函数
 let callback = function(req, res, err, message, data){
 let callback = function(req, res, err, message, data){
@@ -116,6 +117,11 @@ module.exports = {
             functions.push(updateFunc(projectModel, {ID: datas.projectID}, datas.properties));
             functions.push(updateFunc(projectModel, {ID: datas.projectID}, datas.properties));
         };
         };
 
 
+        //选项
+        if(datas.options && datas.options.updateData){
+            functions.push(updateFunc(optionModel, {user_id: req.session.sessionUser.id, compilation_id: req.session.sessionCompilation._id}, {'options.GENERALOPTS': datas.options.updateData}));
+        }
+
         // 人工系数
         // 人工系数
         if (datas.labourCoes&&datas.labourCoes.updateData){
         if (datas.labourCoes&&datas.labourCoes.updateData){
             functions.push(updateLC());
             functions.push(updateLC());
@@ -186,6 +192,9 @@ module.exports = {
                 if(basicInfo !== null){
                 if(basicInfo !== null){
                     projInfo.property.basicInformation = basicInfo;
                     projInfo.property.basicInformation = basicInfo;
                 }
                 }
+                //获取单位工程完整目录结构
+                let fullPath = await pm_facade.getFullPath(projectID);
+                projInfo.fullPath = fullPath;
                 callback(req, res, err, message, projInfo);
                 callback(req, res, err, message, projInfo);
             } else {
             } else {
                 callback(req, res, err, message, null);
                 callback(req, res, err, message, null);
@@ -208,7 +217,7 @@ module.exports = {
     index: async function(request, response) {
     index: async function(request, response) {
         // 获取编办信息
         // 获取编办信息
         let sessionCompilation = request.session.sessionCompilation;
         let sessionCompilation = request.session.sessionCompilation;
-        if (sessionCompilation === undefined) {
+        if (sessionCompilation === undefined ||sessionCompilation ===null) {
             return response.redirect('/logout');
             return response.redirect('/logout');
         }
         }
         let compilationModel = new CompilationModel();
         let compilationModel = new CompilationModel();

+ 25 - 2
modules/pm/facade/pm_facade.js

@@ -33,13 +33,15 @@ const projectType = {
     project: 'Project',
     project: 'Project',
     engineering: 'Engineering',
     engineering: 'Engineering',
 };
 };
+const notDeleted = [{deleteInfo: null}, {'deleteInfo.deleted': false}];
 
 
 
 
 module.exports={
 module.exports={
     moveProject:moveProject,
     moveProject:moveProject,
     copyProject:copyProject,
     copyProject:copyProject,
     getSummaryInfo: getSummaryInfo,
     getSummaryInfo: getSummaryInfo,
-    getConstructionProject: getConstructionProject
+    getConstructionProject: getConstructionProject,
+    getFullPath: getFullPath
 };
 };
 
 
 async function copyProject(userID, compilationID,data) {
 async function copyProject(userID, compilationID,data) {
@@ -607,7 +609,6 @@ async function getSummaryInfo(projectIDs){
 //根据项目ID获取所属建设项目
 //根据项目ID获取所属建设项目
 //@param {Number}projectID @return {Object}
 //@param {Number}projectID @return {Object}
 async function getConstructionProject(projectID){
 async function getConstructionProject(projectID){
-    const notDeleted = [{deleteInfo: null}, {'deleteInfo.deleted': false}];
     function returnProject(project){
     function returnProject(project){
         if(!project || project.projType === projectType.folder){
         if(!project || project.projType === projectType.folder){
             return null;
             return null;
@@ -629,4 +630,26 @@ async function getConstructionProject(projectID){
     let grandParent = await projectModel.findOne({ID: parent.ParentID, $or: notDeleted});
     let grandParent = await projectModel.findOne({ID: parent.ParentID, $or: notDeleted});
     returnV = returnProject(grandParent);
     returnV = returnProject(grandParent);
     return returnV !== undefined ? returnV : null;
     return returnV !== undefined ? returnV : null;
+}
+
+//获取单位工程完整目录结构
+//@param {Number}projectID @return {Arry}
+async function getFullPath(projectID) {
+    let fullPath = [];
+    let project = await projectModel.findOne({ID: projectID, $or: notDeleted}, '-_id ParentID name');
+    if(project){
+        fullPath.push(project.name);
+        await getParent(project.ParentID);
+    }
+    fullPath = fullPath.reverse();
+    return fullPath.join('\\');
+    async function getParent(ParentID) {
+        if(ParentID != -1){
+            let parent = await projectModel.findOne({ID: ParentID, $or: notDeleted}, '-_id ParentID name');
+            if(parent){
+                fullPath.push(parent.name);
+                await getParent(parent.ParentID);
+            }
+        }
+    }
 }
 }

+ 1 - 0
modules/ration_glj/facade/ration_glj_facade.js

@@ -628,6 +628,7 @@ async function replaceGLJ(data) {
     let result = await projectGljModel.addList(getGLJSearchInfo(data));
     let result = await projectGljModel.addList(getGLJSearchInfo(data));
     let typeString = result.type+'';
     let typeString = result.type+'';
     data.projectGLJID = result.id;
     data.projectGLJID = result.id;
+
     let updateResult = await ration_glj.findOneAndUpdate({ID: data.ID, projectID: data.projectID}, data);//更新定额工料机
     let updateResult = await ration_glj.findOneAndUpdate({ID: data.ID, projectID: data.projectID}, data);//更新定额工料机
     //组装回传数据
     //组装回传数据
     data.marketPrice = result.unit_price.market_price;
     data.marketPrice = result.unit_price.market_price;

+ 2 - 3
modules/reports/controllers/rpt_controller.js

@@ -225,7 +225,7 @@ function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, custo
                     let printCom = JpcEx.createNew();
                     let printCom = JpcEx.createNew();
                     if (pageSize) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
                     if (pageSize) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
                     //console.log("orientation: " + (orientation === 'null'));
                     //console.log("orientation: " + (orientation === 'null'));
-                    if (orientation !== null && orientation !== 'null') rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = orientation;
+                    if (orientation && (orientation !== 'null')) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = orientation;
                     let defProperties = rptUtil.getReportDefaultCache();
                     let defProperties = rptUtil.getReportDefaultCache();
                     if (customizeCfg) setupCustomizeCfg(customizeCfg, rptTpl, defProperties);
                     if (customizeCfg) setupCustomizeCfg(customizeCfg, rptTpl, defProperties);
                     let dftOption = option||JV.PAGING_OPTION_NORMAL;
                     let dftOption = option||JV.PAGING_OPTION_NORMAL;
@@ -374,8 +374,7 @@ module.exports = {
                     getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, dftOption, function (err, pageRst) {
                     getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, dftOption, function (err, pageRst) {
                         if(err){
                         if(err){
                             cb(err);
                             cb(err);
-                        }
-                        else{
+                        } else {
                             rpt_xl_util.exportExcel(pageRst, pageSize, rpt_name, isOneSheet, null, null, function(uuidName){
                             rpt_xl_util.exportExcel(pageRst, pageSize, rpt_name, isOneSheet, null, null, function(uuidName){
                                 let fileRst = {uuid: uuidName, reportName: rpt_name};
                                 let fileRst = {uuid: uuidName, reportName: rpt_name};
                                 cb(err, fileRst);
                                 cb(err, fileRst);

+ 9 - 1
modules/reports/facade/rpt_tpl_data_facade.js

@@ -14,6 +14,7 @@ module.exports = {
 
 
 function prepareProjectData(userId, prjId, filter, callback) {
 function prepareProjectData(userId, prjId, filter, callback) {
     let rawDataObj = null;
     let rawDataObj = null;
+    let basicInformation = prjMdl.project.getBasicInfo(prjId);
     prjMdl.project.getUserProject(userId, prjId, function(err, msg, rst){
     prjMdl.project.getUserProject(userId, prjId, function(err, msg, rst){
         if (!err) {
         if (!err) {
             rawDataObj = {};
             rawDataObj = {};
@@ -21,7 +22,14 @@ function prepareProjectData(userId, prjId, filter, callback) {
             projectDataMdl.getFilterData(prjId, filter, function (results) {
             projectDataMdl.getFilterData(prjId, filter, function (results) {
                 if (results) {
                 if (results) {
                     rawDataObj.prjData = results;
                     rawDataObj.prjData = results;
-                    callback(false, 'Succeeded!', rawDataObj);
+                    basicInformation.then(function(basicRst) {
+                        if (basicRst !== null && basicRst !== undefined) {
+                            let doc = (rawDataObj.prj._doc)?rawDataObj.prj._doc:rawDataObj.prj;
+                            doc.property.basicInformation = basicRst;
+                        }
+                        callback(false, 'Succeeded!', rawDataObj);
+                    });
+                    // callback(false, 'Succeeded!', rawDataObj);
                 } else {
                 } else {
                     callback(true, 'No data were found!', null);
                     callback(true, 'No data were found!', null);
                 }
                 }

+ 22 - 0
modules/reports/rpt_component/jpc_rte.js

@@ -92,6 +92,28 @@ let JE = {
             }
             }
         }
         }
         return rst;
         return rst;
+    },
+    removeFieldValue: function (field, dataObj, valIdx) {
+        if (field.DataNodeName === "NA") {
+            if (field[JV.PROP_AD_HOC_DATA].length > valIdx && valIdx >= 0) {
+                field[JV.PROP_AD_HOC_DATA].splice(valIdx, 1);
+            }
+        } else {
+            if (dataObj[field.DataNodeName][field.DataSeq].length > valIdx && valIdx >= 0) {
+                dataObj[field.DataNodeName][field.DataSeq].splice(valIdx, 1);
+            }
+        }
+    },
+    insertFieldValue: function (field, dataObj, valIdx, newValue) {
+        if (field.DataNodeName === "NA") {
+            if (field[JV.PROP_AD_HOC_DATA].length > valIdx && valIdx >= 0) {
+                field[JV.PROP_AD_HOC_DATA].splice(valIdx, 0, newValue);
+            }
+        } else {
+            if (dataObj[field.DataNodeName][field.DataSeq].length > valIdx && valIdx >= 0) {
+                dataObj[field.DataNodeName][field.DataSeq].splice(valIdx, 0, newValue);
+            }
+        }
     }
     }
 };
 };
 
 

+ 12 - 2
modules/reports/util/rpt_excel_util.js

@@ -346,7 +346,8 @@ function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage
     return rst;
     return rst;
 }
 }
 function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, appointedMergeBand){
 function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, appointedMergeBand){
-    let rst = [], xPos = [], yPos = [], yMultiPos = [], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+    let rst = [], xPos = [], yPos = [], yMultiPos = [], currentMergeBorder = null,
+        headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     let currentPageMergePos = null; //在 JV.PAGING_OPTION_INFINITY 场合应用
     let currentPageMergePos = null; //在 JV.PAGING_OPTION_INFINITY 场合应用
     let private_pre_analyze_pos = function(){
     let private_pre_analyze_pos = function(){
         let cell, pos;
         let cell, pos;
@@ -508,7 +509,8 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, ap
     };
     };
     let private_chkAndGetMergeLine = function(cell, sheetBorder, borderStr, needFurtherChk) {
     let private_chkAndGetMergeLine = function(cell, sheetBorder, borderStr, needFurtherChk) {
         let rst = 0,
         let rst = 0,
-            mergeBorder = (sheetData)?sheetData[JV.PROP_PAGE_MERGE_BORDER]:pageData[JV.BAND_PROP_MERGE_BAND],
+            // mergeBorder = (sheetData)?sheetData[JV.PROP_PAGE_MERGE_BORDER]:pageData[JV.BAND_PROP_MERGE_BAND],
+            mergeBorder = currentMergeBorder,
             mergeBand = pageData[JV.BAND_PROP_MERGE_BAND]
             mergeBand = pageData[JV.BAND_PROP_MERGE_BAND]
         ;
         ;
         if (appointedMergeBand !== null) {
         if (appointedMergeBand !== null) {
@@ -758,6 +760,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, ap
         if (sheetData) {
         if (sheetData) {
             //current sheet data
             //current sheet data
             currentPageMergePos = sheetData[JV.PAGE_SPECIAL_MERGE_POS];
             currentPageMergePos = sheetData[JV.PAGE_SPECIAL_MERGE_POS];
+            currentMergeBorder = sheetData[JV.PROP_PAGE_MERGE_BORDER];
             self_setDataEx(sheetData, yPos, 0);
             self_setDataEx(sheetData, yPos, 0);
         } else {
         } else {
             //total data in one sheet
             //total data in one sheet
@@ -765,6 +768,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, ap
             for (let i = 0; i < pageData.items.length; i++) {
             for (let i = 0; i < pageData.items.length; i++) {
                 let shtItemData = pageData.items[i];
                 let shtItemData = pageData.items[i];
                 currentPageMergePos = shtItemData[JV.PAGE_SPECIAL_MERGE_POS];
                 currentPageMergePos = shtItemData[JV.PAGE_SPECIAL_MERGE_POS];
+                currentMergeBorder = shtItemData[JV.PROP_PAGE_MERGE_BORDER];
                 let tmpPos = yMultiPos[i];
                 let tmpPos = yMultiPos[i];
                 cellIdx = 0;
                 cellIdx = 0;
                 self_setDataEx(shtItemData, tmpPos, cnt);
                 self_setDataEx(shtItemData, tmpPos, cnt);
@@ -939,6 +943,7 @@ module.exports = {
                 let offsetY = 0;
                 let offsetY = 0;
                 let mergeBand = {};
                 let mergeBand = {};
                 custMergeBands.push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND]);
                 custMergeBands.push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND]);
+                //备注:不同的报表有可能有不同的边框,如封面表就是无边框的
                 mergeBand[JV.PROP_LEFT] = [];
                 mergeBand[JV.PROP_LEFT] = [];
                 mergeBand[JV.PROP_RIGHT] = [];
                 mergeBand[JV.PROP_RIGHT] = [];
                 mergeBand[JV.PROP_TOP] = [];
                 mergeBand[JV.PROP_TOP] = [];
@@ -955,6 +960,11 @@ module.exports = {
                         mergeBand[JV.PROP_TOP].push(pos);
                         mergeBand[JV.PROP_TOP].push(pos);
                         pos = pageDataArray[i].items[j][JV.PAGE_SPECIAL_MERGE_POS][JV.PROP_BOTTOM][0] + offsetY;
                         pos = pageDataArray[i].items[j][JV.PAGE_SPECIAL_MERGE_POS][JV.PROP_BOTTOM][0] + offsetY;
                         mergeBand[JV.PROP_BOTTOM].push(pos);
                         mergeBand[JV.PROP_BOTTOM].push(pos);
+                    } else if (pageDataArray[i].items[j][JV.PROP_PAGE_MERGE_BORDER]) {
+                        let pos = pageDataArray[i].items[j][JV.PROP_PAGE_MERGE_BORDER][JV.PROP_TOP] + offsetY;
+                        mergeBand[JV.PROP_TOP].push(pos);
+                        pos = pageDataArray[i].items[j][JV.PROP_PAGE_MERGE_BORDER][JV.PROP_BOTTOM] + offsetY;
+                        mergeBand[JV.PROP_BOTTOM].push(pos);
                     } else {
                     } else {
                         mergeBand[JV.PROP_TOP].push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND][JV.PROP_TOP] + offsetY);
                         mergeBand[JV.PROP_TOP].push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND][JV.PROP_TOP] + offsetY);
                         mergeBand[JV.PROP_BOTTOM].push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND][JV.PROP_BOTTOM] + offsetY);
                         mergeBand[JV.PROP_BOTTOM].push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND][JV.PROP_BOTTOM] + offsetY);

+ 53 - 0
modules/reports/util/rpt_tmp_file_sweep.js

@@ -0,0 +1,53 @@
+/**
+ * Created by Tony on 2018/7/27.
+ */
+
+let fs = require('fs');
+let cron = require('node-schedule');
+let remove_file_types = [".xlsx", ".pdf", ".jsp"];
+function chkIsRemoveType(file) {
+    let rst = false;
+    for (let fType of remove_file_types) {
+        if (file.indexOf(fType) === (file.length - fType.length)) {
+            rst = true;
+            break;
+        }
+    }
+    return rst;
+}
+let jobObj = {
+    createJob: function (rule, rootPath) {
+        let localRule = rule;
+        if (!localRule) {
+            // setup schedule rule
+            localRule = new cron.RecurrenceRule();
+            // 3:15AM, everyday
+            localRule.dayOfWeek = [1,2,3,4,5,6,0];
+            localRule.hour = 3;
+            localRule.minute = 15;
+        }
+        cron.scheduleJob(localRule, function(){
+            let path = rootPath;
+            fs.exists(path, function (exists) {
+                if (exists) {
+                    fs.readdir(path, function (err, files) {
+                        let currentTime = (new Date()).valueOf();
+                        let timeGap = currentTime - (1000 * 60 * 60 * 24 * 0.5); //half day before
+                        files.forEach(function(file,index){
+                            if (chkIsRemoveType(file)) {
+                                let curPath = path + "/" + file;
+                                fs.stat(curPath,function(err,data){
+                                    if (timeGap > data.mtime) {
+                                        fs.unlink(curPath);
+                                    }
+                                });
+                            }
+                        });
+                    })
+                }
+            })
+        });
+    }
+};
+
+export default jobObj;

+ 6 - 1
modules/users/models/user_model.js

@@ -91,9 +91,9 @@ class UserModel extends BaseModel {
         let userDataFromDb2 = await this.findDataBySsoId(userData.ssoId);
         let userDataFromDb2 = await this.findDataBySsoId(userData.ssoId);
         let userDataFromDb = await this.findDataByName(userData.username);  //后面新增的账号可淘汰这方法,当前使用是为了兼容旧的账号
         let userDataFromDb = await this.findDataByName(userData.username);  //后面新增的账号可淘汰这方法,当前使用是为了兼容旧的账号
         let result = false;
         let result = false;
-
         if (userDataFromDb === null && userDataFromDb2 === null) {
         if (userDataFromDb === null && userDataFromDb2 === null) {
             // 不存在用户则入库
             // 不存在用户则入库
+            this.setScene();//恢复场景,用户有可能公司real_name等信息为空,不能设置为必填
             result = await this.addUser(userData);
             result = await this.addUser(userData);
             userDataFromDb = result;
             userDataFromDb = result;
         } else {
         } else {
@@ -130,6 +130,11 @@ class UserModel extends BaseModel {
                 this.model.schema.path('province').required(true);
                 this.model.schema.path('province').required(true);
                 this.model.schema.path('version').required(true);
                 this.model.schema.path('version').required(true);
                 break;
                 break;
+            case '':
+                this.model.schema.path('real_name').required(false);
+                this.model.schema.path('company').required(false);
+                this.model.schema.path('province').required(false);
+                this.model.schema.path('version').required(false);
         }
         }
     }
     }
 
 

+ 13 - 5
public/web/common_ajax.js

@@ -27,7 +27,7 @@ var CommonAjax = {
                 }
                 }
             },
             },
             error: function(jqXHR, textStatus, errorThrown){
             error: function(jqXHR, textStatus, errorThrown){
-                alert('url: ' + url +' error ' + textStatus + " " + errorThrown);
+                ajaxErrorInfo(jqXHR, textStatus, errorThrown);
                 if (errorCallback) {
                 if (errorCallback) {
                     errorCallback();
                     errorCallback();
                 }
                 }
@@ -55,7 +55,7 @@ var CommonAjax = {
                 }
                 }
             },
             },
             error: function(jqXHR, textStatus, errorThrown){
             error: function(jqXHR, textStatus, errorThrown){
-                alert('error ' + textStatus + " " + errorThrown);
+                ajaxErrorInfo(jqXHR, textStatus, errorThrown);
                 if (errorCallback) {
                 if (errorCallback) {
                     errorCallback();
                     errorCallback();
                 }
                 }
@@ -84,7 +84,7 @@ var CommonAjax = {
                 }
                 }
             },
             },
             error: function(jqXHR, textStatus, errorThrown){
             error: function(jqXHR, textStatus, errorThrown){
-                alert('url: ' + url +' error ' + textStatus + " " + errorThrown);
+                ajaxErrorInfo(jqXHR, textStatus, errorThrown);
                 if (exceptionCallback) {
                 if (exceptionCallback) {
                     exceptionCallback();
                     exceptionCallback();
                 }
                 }
@@ -97,8 +97,8 @@ var CommonAjax = {
             type: 'post',
             type: 'post',
             data: data,
             data: data,
             dataType: 'json',
             dataType: 'json',
-            error: function() {
-                alert('数据传输有误!');
+            error: function(jqXHR, textStatus, errorThrown) {
+                ajaxErrorInfo(jqXHR, textStatus, errorThrown);
                 if (errorCallback) {
                 if (errorCallback) {
                     errorCallback();
                     errorCallback();
                 }
                 }
@@ -143,4 +143,12 @@ function getTopWindow() {
         p = p.parent;
         p = p.parent;
     }
     }
     return p;
     return p;
+}
+
+function ajaxErrorInfo(jqXHR, textStatus, errorThrown) {
+    if(textStatus == 'timeout'){
+        alert('网络连接超时,请刷新您的网页。');
+    }else {
+        alert('url: ' + url +' error ' + textStatus + " " + errorThrown);
+    }
 }
 }

+ 14 - 2
public/web/sheet/sheet_common.js

@@ -23,7 +23,7 @@ var sheetCommonObj = {
         var spreadNS = GC.Spread.Sheets;
         var spreadNS = GC.Spread.Sheets;
         sheet.suspendPaint();
         sheet.suspendPaint();
         sheet.suspendEvent();
         sheet.suspendEvent();
-
+        if(setting.frozenCols)  sheet.frozenColumnCount(setting.frozenCols);//冻结列
         sheet.setRowCount(1, spreadNS.SheetArea.colHeader);
         sheet.setRowCount(1, spreadNS.SheetArea.colHeader);
         sheet.setColumnCount(setting.header.length, spreadNS.SheetArea.viewport);
         sheet.setColumnCount(setting.header.length, spreadNS.SheetArea.viewport);
 
 
@@ -638,6 +638,18 @@ var sheetCommonObj = {
         });
         });
         workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.esc, false, false, false, false);
         workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.esc, false, false, false, false);
         workBook.commandManager().setShortcutKey('myEsc', GC.Spread.Commands.Key.esc, false, false, false, false);
         workBook.commandManager().setShortcutKey('myEsc', GC.Spread.Commands.Key.esc, false, false, false, false);
-    }
+    },
+    //设置默认样式
+    spreadDefaultStyle: function (workBook) {
+        let defaultStyle = new GC.Spread.Sheets.Style();
+        defaultStyle.font = '0.9rem Calibri';
+        let sheetCount = workBook.getSheetCount();
+        for(let i = 0; i < sheetCount; i++){
+            let sheet = workBook.getSheet(i);
+            sheet.setDefaultStyle(defaultStyle, GC.Spread.Sheets.SheetArea.viewport);
+            sheet.setDefaultStyle(defaultStyle, GC.Spread.Sheets.SheetArea.colHeader);
+            sheet.setDefaultStyle(defaultStyle, GC.Spread.Sheets.SheetArea.rowHeader);
+        }
+    },
 
 
 }
 }

+ 4 - 3
public/web/sheet/sheet_data_helper.js

@@ -87,7 +87,8 @@ var SheetDataHelper = {
                     for (i = 0; i < col.head.spanCols.length; i++) {
                     for (i = 0; i < col.head.spanCols.length; i++) {
                         if (col.head.spanCols[i] !== 0) {
                         if (col.head.spanCols[i] !== 0) {
                             cell = sheet.getCell(iRow, index, GC.Spread.Sheets.SheetArea.colHeader);
                             cell = sheet.getCell(iRow, index, GC.Spread.Sheets.SheetArea.colHeader);
-                            cell.value(col.head.titleNames[i]).font(col.head.font).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]).wordWrap(true);
+                            cell.value(col.head.titleNames[i]).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]).wordWrap(true);
+                            //cell.value(col.head.titleNames[i]).font(col.head.font).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]).wordWrap(true);
                         }
                         }
                         if (col.head.spanCols[i] > 1 || col.head.spanRows[i] > 1) {
                         if (col.head.spanCols[i] > 1 || col.head.spanRows[i] > 1) {
                             sheet.addSpan(iRow, index, col.head.spanRows[i], col.head.spanCols[i], GC.Spread.Sheets.SheetArea.colHeader);
                             sheet.addSpan(iRow, index, col.head.spanRows[i], col.head.spanCols[i], GC.Spread.Sheets.SheetArea.colHeader);
@@ -115,7 +116,7 @@ var SheetDataHelper = {
         var style = new GC.Spread.Sheets.Style();
         var style = new GC.Spread.Sheets.Style();
         style.locked = setting.readOnly;
         style.locked = setting.readOnly;
         style.name = setting.id;
         style.name = setting.id;
-        style.font = setting.data.font;
+        //style.font = setting.data.font;
         style.hAlign = setting.data.hAlign;
         style.hAlign = setting.data.hAlign;
         style.vAlign = setting.data.vAlign;
         style.vAlign = setting.data.vAlign;
         style.wordWrap = setting.data.wordWrap;
         style.wordWrap = setting.data.wordWrap;
@@ -159,7 +160,7 @@ var SheetDataHelper = {
                         $(div).css("position", "absolute")
                         $(div).css("position", "absolute")
                             .css("border", "1px #C0C0C0 solid")
                             .css("border", "1px #C0C0C0 solid")
                             .css("box-shadow", "1px 2px 5px rgba(0,0,0,0.4)")
                             .css("box-shadow", "1px 2px 5px rgba(0,0,0,0.4)")
-                            .css("font", "9pt Arial")
+                           // .css("font", "9pt Arial")
                             .css("background", "white")
                             .css("background", "white")
                             .css("padding", 5)
                             .css("padding", 5)
                             .attr("id", 'autoTip');
                             .attr("id", 'autoTip');

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

@@ -40,7 +40,7 @@ var TREE_SHEET_HELPER = {
         var style = new GC.Spread.Sheets.Style();
         var style = new GC.Spread.Sheets.Style();
         //style.locked = setting.readOnly ? true : false;
         //style.locked = setting.readOnly ? true : false;
         style.name = setting.id;
         style.name = setting.id;
-        style.font = setting.data.font;
+        //style.font = setting.data.font;
         style.hAlign = setting.data.hAlign;
         style.hAlign = setting.data.hAlign;
         style.vAlign = setting.data.vAlign;
         style.vAlign = setting.data.vAlign;
         style.wordWrap = setting.data.wordWrap;
         style.wordWrap = setting.data.wordWrap;
@@ -64,7 +64,8 @@ var TREE_SHEET_HELPER = {
                 for (i = 0; i < col.head.spanCols.length; i++) {
                 for (i = 0; i < col.head.spanCols.length; i++) {
                     if (col.head.spanCols[i] !== 0) {
                     if (col.head.spanCols[i] !== 0) {
                         cell = sheet.getCell(iRow, index, GC.Spread.Sheets.SheetArea.colHeader);
                         cell = sheet.getCell(iRow, index, GC.Spread.Sheets.SheetArea.colHeader);
-                        cell.value(col.head.titleNames[i]).font(col.head.font).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]).wordWrap(true);
+                        //cell.value(col.head.titleNames[i]).font(col.head.font).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]).wordWrap(true);
+                        cell.value(col.head.titleNames[i]).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]).wordWrap(true);
                     }
                     }
                     if (col.head.spanCols[i] > 1 || col.head.spanRows[i] > 1) {
                     if (col.head.spanCols[i] > 1 || col.head.spanRows[i] > 1) {
                         sheet.addSpan(iRow, index, col.head.spanRows[i], col.head.spanCols[i], GC.Spread.Sheets.SheetArea.colHeader);
                         sheet.addSpan(iRow, index, col.head.spanRows[i], col.head.spanCols[i], GC.Spread.Sheets.SheetArea.colHeader);
@@ -119,10 +120,11 @@ var TREE_SHEET_HELPER = {
             }
             }
             setting.cols.forEach(function (colSetting, iCol) {
             setting.cols.forEach(function (colSetting, iCol) {
                 var cell = sheet.getCell(iRow, iCol, GC.Spread.Sheets.SheetArea.viewport);
                 var cell = sheet.getCell(iRow, iCol, GC.Spread.Sheets.SheetArea.viewport);
-                if(typeof projectObj !== 'undefined'){
+   /* if(typeof projectObj !== 'undefined'){ 7/28  取消黑体显示
                     let boldFontStyle = projectObj.getBoldFontStyle(node, colSetting);
                     let boldFontStyle = projectObj.getBoldFontStyle(node, colSetting);
                     sheet.setStyle(iRow, iCol, boldFontStyle);
                     sheet.setStyle(iRow, iCol, boldFontStyle);
                 }
                 }
+                }*/
 
 
                 // var getFieldText = function () {
                 // var getFieldText = function () {
                 //     var fields = colSetting.data.field.split('.');
                 //     var fields = colSetting.data.field.split('.');

+ 5 - 33
server.js

@@ -13,7 +13,7 @@ let DBStore = require('connect-mongo')(session);
 let fs = require('fs');
 let fs = require('fs');
 
 
 let URL = require('url');
 let URL = require('url');
-let cron = require('node-schedule');
+import rptCronJob from "./modules/reports/util/rpt_tmp_file_sweep";
 
 
 dbm.connect(process.env.NODE_ENV);
 dbm.connect(process.env.NODE_ENV);
 //这里现在只引入了定额工料机里的models,当其它模块的models修改后使用:./modules/**/models/*.js引入所有的模块
 //这里现在只引入了定额工料机里的models,当其它模块的models修改后使用:./modules/**/models/*.js引入所有的模块
@@ -103,13 +103,9 @@ app.use(function(err, req, res, next) {
     res.status(500).send('500 Error');
     res.status(500).send('500 Error');
 });
 });
 
 
-//设置Date Format函数
+//设置外增的Date对象Format函数
 fs.readFile(__dirname + '/public/web/date_util.js', 'utf8', 'r', function (err, data) {
 fs.readFile(__dirname + '/public/web/date_util.js', 'utf8', 'r', function (err, data) {
     eval(data);
     eval(data);
-    // let dt = new Date();
-    // console.log(dt.Format('yyyy-M-dd'));
-    // console.log(dt.Format('yyyy 年 M 月 dd 日'));
-    // console.log(dt.Format('yyyy 年 M 月 20 日'));
 });
 });
 
 
 app.listen(6060, function(){
 app.listen(6060, function(){
@@ -117,30 +113,6 @@ app.listen(6060, function(){
 });
 });
 
 
 //设置schedule job
 //设置schedule job
-let rule = new cron.RecurrenceRule();
-//1. 每天凌晨3点一刻,删除临时文件
-rule.dayOfWeek = [1,2,3,4,5,6,0];
-rule.hour = 3;
-rule.minute = 15;
-cron.scheduleJob(rule, function(){
-    let path = __dirname + "/tmp";
-    fs.exists(path, function (exists) {
-        if (exists) {
-            fs.readdir(path, function (err, files) {
-                let currentTime = (new Date()).valueOf();
-                let timeGap = currentTime - (1000 * 60 * 60 * 24 * 0.5);
-                files.forEach(function(file,index){
-                    if (file.indexOf(".xlsx") === (file.length - 5) ||
-                        file.indexOf(".pdf") === (file.length - 4)) {
-                        let curPath = path + "/" + file;
-                        fs.stat(curPath,function(err,data){
-                            if (timeGap > data.mtime) {
-                                fs.unlink(curPath);
-                            }
-                        });
-                    }
-                });
-            })
-        }
-    })
-});
+//1. 报表临时文件
+rptCronJob.createJob(null, __dirname + "/tmp");
+//2. 其他(待补充)...

+ 2 - 2
socketdockerfile

@@ -1,8 +1,8 @@
-FROM costbase:latest
+FROM costbase:2.0
 
 
 WORKDIR /home/ConstructionCost
 WORKDIR /home/ConstructionCost
 
 
-RUN git pull http://192.168.1.12:3000/SmartCost/ConstructionCost master
+COPY . /home/ConstructionCost
 
 
 RUN cnpm install 
 RUN cnpm install 
 
 

+ 9 - 2
test/unit/reports/test_rpt_test_template.js

@@ -32,6 +32,7 @@ let demoPrjId = - 1;
 // let demoRptId = 361; //封1
 // let demoRptId = 361; //封1
 // let demoRptId = 279; //表04
 // let demoRptId = 279; //表04
 let demoRptId = 261; //封3
 let demoRptId = 261; //封3
+// let demoRptId = 2260; //测试基本信息
 let pagesize = "A4";
 let pagesize = "A4";
 //288: 11-2表(新)
 //288: 11-2表(新)
 //279: 04
 //279: 04
@@ -40,9 +41,11 @@ let pagesize = "A4";
 let userId_Leng = "5acac1e885bf55000bd055ba"; //小冷User Id2
 let userId_Leng = "5acac1e885bf55000bd055ba"; //小冷User Id2
 // demoPrjId = 720; //QA: DW3
 // demoPrjId = 720; //QA: DW3
 //demoPrjId = 1626; //QA:
 //demoPrjId = 1626; //QA:
-demoPrjId = 2260; //QA:
+// demoPrjId = 2260; //QA:
+demoPrjId = 3532; //QA:
 //*/
 //*/
 let userId_Dft = userId_Leng;
 let userId_Dft = userId_Leng;
+// let userId_Dft = "5a025c4c15074d134c2b9689";
 /*/
 /*/
  let userId_Dft = "595328da1934dc327cad08eb";
  let userId_Dft = "595328da1934dc327cad08eb";
  //*/
  //*/
@@ -51,6 +54,7 @@ let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade"
 let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
 let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
 
 
 import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
 import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
+import rpt_xl_util from "../../../modules/reports/util/rpt_excel_util";
 
 
 let fs = require('fs');
 let fs = require('fs');
 //设置Date Format函数
 //设置Date Format函数
@@ -82,7 +86,10 @@ test('测试 - 测试模板啦: ', function (t) {
                     let maxPages = printCom.totalPages;
                     let maxPages = printCom.totalPages;
                     let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
                     let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
                     if (pageRst) {
                     if (pageRst) {
-                        fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_测试模板.jsp");
+                        // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_测试模板.jsp");
+                        // rpt_xl_util.exportExcel(pageRst, pagesize, "local_test_rpt_excel", true, null, null, function(uuidName){
+                        //     console.log("excel uuid: " + uuidName);
+                        // });
                     } else {
                     } else {
                         console.log("oh! no pages were created!");
                         console.log("oh! no pages were created!");
                     }
                     }

+ 1 - 0
web/building_saas/complementary_glj_lib/js/components.js

@@ -25,6 +25,7 @@ let componentOprObj = {
     buildSheet: function (container) {
     buildSheet: function (container) {
         let me = componentOprObj;
         let me = componentOprObj;
         me.workBook = sheetOpr.buildSheet(container, me.setting, 30);
         me.workBook = sheetOpr.buildSheet(container, me.setting, 30);
+        sheetCommonObj.spreadDefaultStyle(me.workBook);
         me.workBook.getSheet(0).setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
         me.workBook.getSheet(0).setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
         me.workBook.getSheet(0).setFormatter(-1, 1, "@", GC.Spread.Sheets.SheetArea.viewport);
         me.workBook.getSheet(0).setFormatter(-1, 1, "@", GC.Spread.Sheets.SheetArea.viewport);
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditStarting, me.onCellEditStart);
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditStarting, me.onCellEditStart);

+ 1 - 0
web/building_saas/complementary_glj_lib/js/glj.js

@@ -204,6 +204,7 @@ let repositoryGljObj = {
     buildSheet: function(container) {
     buildSheet: function(container) {
         let me = repositoryGljObj;
         let me = repositoryGljObj;
         me.workBook = sheetOpr.buildSheet(container, me.setting, 30);
         me.workBook = sheetOpr.buildSheet(container, me.setting, 30);
+        sheetCommonObj.spreadDefaultStyle(me.workBook);
         me.repositoryGljDelOpr();
         me.repositoryGljDelOpr();
         me.bindEnterKey();
         me.bindEnterKey();
         me.setUnitCombo(me.workBook.getActiveSheet(), me.setting.header);
         me.setUnitCombo(me.workBook.getActiveSheet(), me.setting.header);

+ 1 - 0
web/building_saas/complementary_glj_lib/js/gljClassTree.js

@@ -76,6 +76,7 @@ let gljClassTreeObj = {
     buildSheet: function () {
     buildSheet: function () {
         if(!this.isDef(this.workBook)){
         if(!this.isDef(this.workBook)){
             this.workBook = new GC.Spread.Sheets.Workbook($('#gljClassSpread')[0], {sheetCount: 1});
             this.workBook = new GC.Spread.Sheets.Workbook($('#gljClassSpread')[0], {sheetCount: 1});
+            sheetCommonObj.spreadDefaultStyle(this.workBook);
             this.sheet = this.workBook.getActiveSheet();
             this.sheet = this.workBook.getActiveSheet();
             this.setOptions(this.workBook, this.setting.options);
             this.setOptions(this.workBook, this.setting.options);
             this.sheet.options.clipBoardOptions = GC.Spread.Sheets.ClipboardPasteOptions.values;
             this.sheet.options.clipBoardOptions = GC.Spread.Sheets.ClipboardPasteOptions.values;

+ 1 - 0
web/building_saas/complementary_glj_lib/js/gljComponent.js

@@ -21,6 +21,7 @@ let gljComponentOprObj = {
     buildSheet: function(container) {
     buildSheet: function(container) {
         let me = gljComponentOprObj;
         let me = gljComponentOprObj;
         me.workBook = sheetOpr.buildSheet(container, me.setting, 30);
         me.workBook = sheetOpr.buildSheet(container, me.setting, 30);
+        sheetCommonObj.spreadDefaultStyle(me.workBook);
         me.workBook.getSheet(0).setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
         me.workBook.getSheet(0).setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
         me.workBook.getSheet(0).setFormatter(-1, 0, "@", GC.Spread.Sheets.SheetArea.viewport);
         me.workBook.getSheet(0).setFormatter(-1, 0, "@", GC.Spread.Sheets.SheetArea.viewport);
         sheetOpr.cleanData(me.workBook.getSheet(0), me.setting, -1);
         sheetOpr.cleanData(me.workBook.getSheet(0), me.setting, -1);

+ 1 - 0
web/building_saas/complementary_ration_lib/html/dinge.html

@@ -547,6 +547,7 @@
 
 
         // tabPanel 下有多个Spread时,相互之间不能正确显示。改成一个Spread下多个Sheet。
         // tabPanel 下有多个Spread时,相互之间不能正确显示。改成一个Spread下多个Sheet。
         var rdSpread = sheetCommonObj.createSpread($("#rdSpread")[0], 4);
         var rdSpread = sheetCommonObj.createSpread($("#rdSpread")[0], 4);
+        sheetCommonObj.spreadDefaultStyle(rdSpread);
         rationGLJOprObj.buildSheet(rdSpread.getSheet(0));
         rationGLJOprObj.buildSheet(rdSpread.getSheet(0));
 
 
         rationAssistOprObj.buildSheet(rdSpread.getSheet(1));
         rationAssistOprObj.buildSheet(rdSpread.getSheet(1));

+ 2 - 0
web/building_saas/complementary_ration_lib/js/coe.js

@@ -77,6 +77,7 @@ let coeOprObj = {
     buildSheet: function (container) {
     buildSheet: function (container) {
         let me = coeOprObj;
         let me = coeOprObj;
         me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30);
         me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30);
+        sheetCommonObj.spreadDefaultStyle(me.workBook);
         me.workSheet = me.workBook.getSheet(0);
         me.workSheet = me.workBook.getSheet(0);
         me.workSheet.options.isProtected = true;
         me.workSheet.options.isProtected = true;
         me.workSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, me.onSelectionChanged);
         me.workSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, me.onSelectionChanged);
@@ -155,6 +156,7 @@ let gljAdjOprObj = {
     buildSheet: function (container) {
     buildSheet: function (container) {
         let me = gljAdjOprObj;
         let me = gljAdjOprObj;
         me.workBook = sheetCommonObj.buildSheet(container, me.setting, 3);
         me.workBook = sheetCommonObj.buildSheet(container, me.setting, 3);
+        sheetCommonObj.spreadDefaultStyle(me.workBook);
         me.workSheet = me.workBook.getSheet(0);
         me.workSheet = me.workBook.getSheet(0);
         me.workSheet.options.isProtected = true;
         me.workSheet.options.isProtected = true;
         me.workSheet.clearSelection();
         me.workSheet.clearSelection();

+ 1 - 0
web/building_saas/complementary_ration_lib/js/gljSelect.js

@@ -78,6 +78,7 @@ let gljSelOprObj = {
     buildSheet: function (container) {
     buildSheet: function (container) {
         let me = gljSelOprObj;
         let me = gljSelOprObj;
         me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30);
         me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30);
+        sheetCommonObj.spreadDefaultStyle(me.workBook);
         me.workBook.getSheet(0).setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
         me.workBook.getSheet(0).setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
         me.workBook.getSheet(0).setFormatter(-1, 1, "@", GC.Spread.Sheets.SheetArea.viewport);
         me.workBook.getSheet(0).setFormatter(-1, 1, "@", GC.Spread.Sheets.SheetArea.viewport);
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditStarting, me.onCellEditStart);
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditStarting, me.onCellEditStart);

+ 3 - 0
web/building_saas/complementary_ration_lib/js/installation.js

@@ -40,6 +40,7 @@ let feeItemObj = {
         let me = this, se = sectionObj, fr = feeRuleObj;
         let me = this, se = sectionObj, fr = feeRuleObj;
         if(!this.isDef(this.workBook)){
         if(!this.isDef(this.workBook)){
             this.workBook = sheetCommonObj.buildSheet($('#feeItemSpread')[0], this.setting, 10);
             this.workBook = sheetCommonObj.buildSheet($('#feeItemSpread')[0], this.setting, 10);
+            sheetCommonObj.spreadDefaultStyle(this.workBook);
             this.sheet = this.workBook.getActiveSheet();
             this.sheet = this.workBook.getActiveSheet();
             this.setOptions(this.workBook, this.setting.options);
             this.setOptions(this.workBook, this.setting.options);
             this.bindEvents(this.sheet);
             this.bindEvents(this.sheet);
@@ -155,6 +156,7 @@ let sectionObj = {
     buildSheet: function () {
     buildSheet: function () {
         if(!this.isDef(this.workBook)){
         if(!this.isDef(this.workBook)){
             this.workBook = sheetCommonObj.buildSheet($('#instSectionSpread')[0], this.setting, 10);
             this.workBook = sheetCommonObj.buildSheet($('#instSectionSpread')[0], this.setting, 10);
+            sheetCommonObj.spreadDefaultStyle(this.workBook);
             this.sheet = this.workBook.getActiveSheet();
             this.sheet = this.workBook.getActiveSheet();
             this.setOptions(this.workBook, this.setting.options);
             this.setOptions(this.workBook, this.setting.options);
             this.sheet.options.clipBoardOptions = GC.Spread.Sheets.ClipboardPasteOptions.values;
             this.sheet.options.clipBoardOptions = GC.Spread.Sheets.ClipboardPasteOptions.values;
@@ -265,6 +267,7 @@ let feeRuleObj = {
     buildSheet: function () {
     buildSheet: function () {
         if(!this.isDef(this.workBook)){
         if(!this.isDef(this.workBook)){
             this.workBook = sheetCommonObj.buildSheet($('#instFeeRuleSpread')[0], this.setting, 10);
             this.workBook = sheetCommonObj.buildSheet($('#instFeeRuleSpread')[0], this.setting, 10);
+            sheetCommonObj.spreadDefaultStyle(this.workBook);
             this.sheet = this.workBook.getActiveSheet();
             this.sheet = this.workBook.getActiveSheet();
             this.buildHeader();
             this.buildHeader();
             this.setOptions(this.workBook, this.setting.options);
             this.setOptions(this.workBook, this.setting.options);

+ 0 - 1
web/building_saas/complementary_ration_lib/js/main.js

@@ -14,7 +14,6 @@ let compleRationMain = {
                         "<tr id='tempId'>" +
                         "<tr id='tempId'>" +
                         "<td><a href='javascript:void(0);'>"+libName+"</a></td></tr>"
                         "<td><a href='javascript:void(0);'>"+libName+"</a></td></tr>"
                     );
                     );
-                    var newHref = "/complementaryRation/ration?repository="+id;
                     $("#tempId td:first a").click(function () {
                     $("#tempId td:first a").click(function () {
                         $('#comple-ration').modal('hide');
                         $('#comple-ration').modal('hide');
                         setTimeout(function () {
                         setTimeout(function () {

+ 1 - 0
web/building_saas/complementary_ration_lib/js/ration.js

@@ -41,6 +41,7 @@ let rationOprObj = {
         let rationRepId = getQueryString("repository");
         let rationRepId = getQueryString("repository");
         let me = rationOprObj;
         let me = rationOprObj;
         me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30);
         me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30);
+        sheetCommonObj.spreadDefaultStyle(me.workBook);
         sheetCommonObj.bindEscKey(me.workBook, [{sheet: me.workBook.getSheet(0), editStarting: me.onCellEditStart, editEnded: me.onCellEditEnd}]);
         sheetCommonObj.bindEscKey(me.workBook, [{sheet: me.workBook.getSheet(0), editStarting: me.onCellEditStart, editEnded: me.onCellEditEnd}]);
         me.getRationsCodes(rationRepId);
         me.getRationsCodes(rationRepId);
         me.onContextmenuOpr();
         me.onContextmenuOpr();

+ 1 - 0
web/building_saas/complementary_ration_lib/js/repository_glj.js

@@ -148,6 +148,7 @@ repositoryGljObj = {
     buildSheet: function(container) {
     buildSheet: function(container) {
         var me = repositoryGljObj;
         var me = repositoryGljObj;
         me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30, me);
         me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30, me);
+        sheetCommonObj.spreadDefaultStyle(me.workBook);
         me.workBook.getSheet(0).options.isProtected = true;
         me.workBook.getSheet(0).options.isProtected = true;
         /* me.repositoryGljDelOpr();
         /* me.repositoryGljDelOpr();
          me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
          me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);

+ 1 - 0
web/building_saas/complementary_ration_lib/js/section_tree.js

@@ -143,6 +143,7 @@ let sectionTreeObj = {
     buildSheet: function () {
     buildSheet: function () {
         if(!this.isDef(this.workBook)){
         if(!this.isDef(this.workBook)){
             this.workBook = new GC.Spread.Sheets.Workbook($('#sectionSpread')[0], {sheetCount: 1});
             this.workBook = new GC.Spread.Sheets.Workbook($('#sectionSpread')[0], {sheetCount: 1});
+            sheetCommonObj.spreadDefaultStyle(this.workBook);
             sheetCommonObj.bindEscKey(this.workBook, [{sheet: this.workBook.getSheet(0), editStarting: this.onEditStarting, editEnded: this.onEditEnded}]);
             sheetCommonObj.bindEscKey(this.workBook, [{sheet: this.workBook.getSheet(0), editStarting: this.onEditStarting, editEnded: this.onEditEnded}]);
             this.sheet = this.workBook.getSheet(0);
             this.sheet = this.workBook.getSheet(0);
             this.bindEvents(this.sheet);
             this.bindEvents(this.sheet);

+ 17 - 5
web/building_saas/css/main.css

@@ -1,3 +1,4 @@
+
 /*building SAAS 0.1*/
 /*building SAAS 0.1*/
 /*bootstrap 初始化*/
 /*bootstrap 初始化*/
 body {
 body {
@@ -13,6 +14,12 @@ body {
 .btn-link:focus, .btn-link:hover{
 .btn-link:focus, .btn-link:hover{
     text-decoration: none
     text-decoration: none
 }
 }
+.dropdown-menu {
+    padding:.2rem 0;
+}
+.dropdown-item:focus, .dropdown-item:hover{
+    background-color: #f7f7f9
+}
 /*自定义css*/
 /*自定义css*/
 .header {
 .header {
     border-bottom: 1px solid #ccc
     border-bottom: 1px solid #ccc
@@ -23,7 +30,7 @@ body {
     margin-right: 1rem;
     margin-right: 1rem;
     font-size: 1rem;
     font-size: 1rem;
     height:38px;
     height:38px;
-    background:url("/web/building_saas/css/logo.png") no-repeat 0 0;
+    background:url(logo.png) no-repeat 0 0;
     padding-left:40px;
     padding-left:40px;
 }
 }
 .header-logo div.v-title{
 .header-logo div.v-title{
@@ -50,7 +57,7 @@ body {
     position: absolute;
     position: absolute;
     text-align: center;
     text-align: center;
     z-index: 999;
     z-index: 999;
-    padding: 30px 0 0 2px
+    padding: 2px 0 0 2px
 }
 }
 .main-nav .nav a {
 .main-nav .nav a {
     display: block;
     display: block;
@@ -78,7 +85,9 @@ body {
     background:#f7f7f9
     background:#f7f7f9
 }
 }
 .poj-cate {
 .poj-cate {
-    width:58px
+    width:58px;
+    margin-right:-1px;
+    margin-top:2px;
 }
 }
 .poj-cate .nav-pills .nav-link{
 .poj-cate .nav-pills .nav-link{
     border-radius: 0;
     border-radius: 0;
@@ -94,10 +103,13 @@ body {
 }
 }
 .pm-side{
 .pm-side{
     position: fixed;
     position: fixed;
-    left:0
+    left:0;
+    height:100%;
+    border-right:1px solid #ccc;
+    background: #f7f7f9
 }
 }
 .pm-content{
 .pm-content{
-    padding-left:45px
+    padding-left:58px
 }
 }
 .content {
 .content {
     border-left: 1px solid #ccc;
     border-left: 1px solid #ccc;

+ 6 - 6
web/building_saas/fee_rates/fee_rate.js

@@ -33,8 +33,8 @@ function loadProjectFeeRates(fileID) {
                 createSpreadView(true);
                 createSpreadView(true);
             }
             }
         },
         },
-        error: function (result) {
-            alert('内部程序错误!');
+        error: function (jqXHR, textStatus, errorThrown) {
+            ajaxErrorInfo(jqXHR, textStatus, errorThrown);
         }
         }
     });
     });
 }
 }
@@ -55,8 +55,8 @@ function loadStdFeeRateLibNames(region) {
                 $("#inlineFormCustomSelect").get(0).selectedIndex = 0;
                 $("#inlineFormCustomSelect").get(0).selectedIndex = 0;
             }
             }
         },
         },
-        error: function (result) {
-            alert('内部程序错误!');
+        error: function (jqXHR, textStatus, errorThrown) {
+            ajaxErrorInfo(jqXHR, textStatus, errorThrown);
         }
         }
     });
     });
 }
 }
@@ -72,8 +72,8 @@ function loadLibFeeRates(libID) {
                 createSpreadView(false);
                 createSpreadView(false);
             }
             }
         },
         },
-        error: function (result) {
-            alert('内部程序错误!');
+        error: function (jqXHR, textStatus, errorThrown) {
+            ajaxErrorInfo(jqXHR, textStatus, errorThrown);
         }
         }
     });
     });
 }
 }

+ 6 - 4
web/building_saas/glj/js/composition_spread.js

@@ -124,7 +124,8 @@ CompositionSpread.prototype.getRatioData = function(projectGLJid) {
         url: '/glj/get-ratio',
         url: '/glj/get-ratio',
         type: 'post',
         type: 'post',
         data: {id: projectGLJid, project_id: scUrlUtil.GetQueryString('project')},
         data: {id: projectGLJid, project_id: scUrlUtil.GetQueryString('project')},
-        error: function() {
+        error: function(jqXHR, textStatus, errorThrown) {
+            ajaxErrorInfo(jqXHR, textStatus, errorThrown);
             self.sheetObj.setData(null);
             self.sheetObj.setData(null);
         },
         },
         beforeSend: function() {
         beforeSend: function() {
@@ -213,8 +214,8 @@ CompositionSpread.prototype.updateConsumption = function(info, callback) {
         type: 'post',
         type: 'post',
         data: {id: id, field: 'mix_ratio.' + field, value: value, market_price: parentMarketPrice, base_price: parentBasePrice},
         data: {id: id, field: 'mix_ratio.' + field, value: value, market_price: parentMarketPrice, base_price: parentBasePrice},
         dataType: 'json',
         dataType: 'json',
-        error: function() {
-            alert('数据传输有误!');
+        error: function(jqXHR, textStatus, errorThrown) {
+            ajaxErrorInfo(jqXHR, textStatus, errorThrown);
             self.isChanging = false;
             self.isChanging = false;
             activeSheet.setValue(row, column, info.oldValue);
             activeSheet.setValue(row, column, info.oldValue);
         },
         },
@@ -308,7 +309,8 @@ CompositionSpread.prototype.deleteComposition = function (id, row, callback) {
         type: 'post',
         type: 'post',
         data: {id: id},
         data: {id: id},
         dataType: 'json',
         dataType: 'json',
-        error: function() {
+        error: function(jqXHR, textStatus, errorThrown) {
+            ajaxErrorInfo(jqXHR, textStatus, errorThrown);
             isDeleting = false;
             isDeleting = false;
             alert('服务器繁忙');
             alert('服务器繁忙');
         },
         },

+ 2 - 2
web/building_saas/glj/js/project_glj_spread.js

@@ -244,8 +244,8 @@ ProjectGLJSpread.prototype.postUpdate=function (id,field,value,info,extend,callb
         type: 'post',
         type: 'post',
         data: {id: id, field: field, value: value, extend: extend},
         data: {id: id, field: field, value: value, extend: extend},
         dataType: 'json',
         dataType: 'json',
-        error: function() {
-            alert('数据传输有误!');
+        error: function(jqXHR, textStatus, errorThrown) {
+            ajaxErrorInfo(jqXHR, textStatus, errorThrown);
             isChanging = false;
             isChanging = false;
         },
         },
         beforeSend: function() {
         beforeSend: function() {

+ 59 - 31
web/building_saas/main/html/main.html

@@ -38,7 +38,7 @@
                 <button type="button" class="close" aria-label="Close" onclick="$('#notify').hide();">
                 <button type="button" class="close" aria-label="Close" onclick="$('#notify').hide();">
                   <span aria-hidden="true">&times;</span>
                   <span aria-hidden="true">&times;</span>
                 </button>
                 </button>
-                <strong id="message"></strong>
+                <strong id="message"></strong>-
             </div>
             </div>
         </div>
         </div>
         <%include ../../../common/html/header.html %>
         <%include ../../../common/html/header.html %>
@@ -63,32 +63,40 @@
                     <!--<a href="javascript:void(0)" class="btn btn-sm" title="复制" ><i class="fa fa-files-o" aria-hidden="true"></i></a>
                     <!--<a href="javascript:void(0)" class="btn btn-sm" title="复制" ><i class="fa fa-files-o" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)" class="btn btn-sm" title="剪切"><i class="fa fa-scissors" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)" class="btn btn-sm" title="剪切"><i class="fa fa-scissors" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)" class="btn btn-sm" title="粘贴"><i class="fa fa-clipboard" aria-hidden="true"></i></a>-->
                     <a href="javascript:void(0)" class="btn btn-sm" title="粘贴"><i class="fa fa-clipboard" aria-hidden="true"></i></a>-->
+                    <a class="btn btn-sm" href="javascript:void(0);" aria-expanded="false" data-toggle="modal" data-target="#poj-set" title="项目属性"><i class="fa fa-cog" data-placement="bottom"></i></a>
+                    <span class="btn btn-sm">
+                        <a class="dropdown-toggle" id="uploadDropDown" href="#" data-toggle="dropdown" title="导入"><i class="fa  fa-cloud-upload" data-placement="bottom"></i></a>
+                        <div class="dropdown-menu">
+                            <a id="uploadLj" class="dropdown-item" href="#import" data-toggle="modal" data-target="#import">导入09表Excel清单</a>
+                            <a id="uploadGld" class="dropdown-item" href="#import" data-toggle="modal" data-target="#import">导入广联达算量Excel清单</a>
+                        </div>
+                    </span>
                     <a href="javascript:void(0)" class="btn btn-sm" id="insertRation" title="插入定额"><i class="fa fa-sign-in" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)" class="btn btn-sm" id="insertRation" title="插入定额"><i class="fa fa-sign-in" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)" class="btn btn-sm" id="delete" title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)" class="btn btn-sm" id="delete" title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)" class="btn btn-sm" id="upLevel" title="升级"><i class="fa fa-arrow-left" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)" class="btn btn-sm" id="upLevel" title="升级"><i class="fa fa-arrow-left" aria-hidden="true"></i></a>
-                    <a href="javascript:void(0)" class="btn btn-sm" id="downLevel" title="降级"><i class="fa fa-arrow-right" aria-hidden="true"></i></a>
+                    <a href="javascript:void(0)"  class="btn btn-sm" id="downLevel" title="降级"><i class="fa fa-arrow-right" aria-hidden="true"></i></a>
                       <a href="javascript:void(0)" class="btn btn-sm" id="upMove" title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
                       <a href="javascript:void(0)" class="btn btn-sm" id="upMove" title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
                       <a href="javascript:void(0)" class="btn btn-sm" id="downMove" title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
                       <a href="javascript:void(0)" class="btn btn-sm" id="downMove" title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
-                    <span>
-                      <a href="" data-toggle="dropdown"><span data-toggle="tooltip" data-placement="bottom" title="">显示至...</span></a>
+                    <span class="btn btn-sm">
+                      <a href="" data-toggle="dropdown" title="显示至..."><span  data-placement="bottom"><i class="fa fa-list-ol"></i></span></a>
                       <div class="dropdown-menu dropdown-menu-left" style="min-width: 6.5rem">
                       <div class="dropdown-menu dropdown-menu-left" style="min-width: 6.5rem">
-                      <a class="dropdown-item" href="javascript:void(0);" style="padding: 0rem 1.5rem" id="displayDXFY">大项费用</a>
-                      <a class="dropdown-item" href="javascript:void(0);" style="padding: 0rem 1.5rem" id="displayFB1">一级分部</a>
-                      <a class="dropdown-item" href="javascript:void(0);" style="padding: 0rem 1.5rem" id="displayFB2">二级分部</a>
-                      <a class="dropdown-item" href="javascript:void(0);" style="padding: 0rem 1.5rem" id="displayFB3">三级分部</a>
-                      <a class="dropdown-item" href="javascript:void(0);" style="padding: 0rem 1.5rem" id="displayFB4">四级分部</a>
-                      <a class="dropdown-item" href="javascript:void(0);" style="padding: 0rem 1.5rem" id="displayFX">分项</a>
-                      <a class="dropdown-item" href="javascript:void(0);" style="padding: 0rem 1.5rem" id="displayZM">子目</a>
-                      <a class="dropdown-item" href="javascript:void(0);" style="padding: 0rem 1.5rem" id="displayZD">最底层</a>
+                      <a class="dropdown-item" href="javascript:void(0);" id="displayDXFY">大项费用</a>
+                      <a class="dropdown-item" href="javascript:void(0);"  id="displayFB1">一级分部</a>
+                      <a class="dropdown-item" href="javascript:void(0);" id="displayFB2">二级分部</a>
+                      <a class="dropdown-item" href="javascript:void(0);" id="displayFB3">三级分部</a>
+                      <a class="dropdown-item" href="javascript:void(0);"  id="displayFB4">四级分部</a>
+                      <a class="dropdown-item" href="javascript:void(0);"  id="displayFX">分项</a>
+                      <a class="dropdown-item" href="javascript:void(0);" id="displayZM">子目</a>
+                      <a class="dropdown-item" href="javascript:void(0);"  id="displayZD">最底层</a>
                     </div>
                     </div>
                     </span>
                     </span>
-                      <a href="javascript:void(0)" class="btn btn-sm" id = 'ZLFB_btn'><i class="fa fa-sign-in " aria-hidden="true"></i><span data-toggle="tooltip" data-placement="bottom" title=""> 整理分部</span></a>
+                      <a href="javascript:void(0);" id="ZLFB_btn" class="btn btn-sm" data-placement="bottom" title="整理分部"><i class="fa fa-retweet" aria-hidden="true"></i></a>
                       <% if (projectData.property.lockBills == true) { %>
                       <% if (projectData.property.lockBills == true) { %>
-                      <a href="javascript:void(0)" class="btn btn-sm" name="lockBills"  title=""> <i class="fa fa-unlock-alt" aria-hidden="true"></i> 解锁清单</a>
+                      <a href="javascript:void(0)"  class="btn btn-sm" name="lockBills" title="解锁清单"> <i class="fa fa-unlock-alt" aria-hidden="true"></i></a>
                       <% } else { %>
                       <% } else { %>
-                      <a href="javascript:void(0)" class="btn btn-sm" name="lockBills"  title=""> <i class="fa fa-lock" aria-hidden="true"></i> 锁定清单</a>
+                      <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>
+                      <a id="switchTznr" href="javascript:void(0);"  class="btn btn-sm"  data-placement="bottom" title="显示特征"><i class="fa fa-eye" aria-hidden="true"></i></a>
                   </div>
                   </div>
                   <div class="side-tabs">
                   <div class="side-tabs">
                       <ul class="nav nav-tabs" role="tablist">
                       <ul class="nav nav-tabs" role="tablist">
@@ -182,6 +190,15 @@
                                           <div class="col-4" style="width: 33%; float: left; margin: 0; padding:0;">
                                           <div class="col-4" style="width: 33%; float: left; margin: 0; padding:0;">
                                               <div class="main-data-bottom" id="add-rule" style="display: none;">
                                               <div class="main-data-bottom" id="add-rule" style="display: none;">
                                                   <div class="container-fluid my-2">
                                                   <div class="container-fluid my-2">
+                                                      <p style="text-align: center">
+                                                          <% if (projectData.property.lockBills == true) { %>
+                                                          <button class="btn btn-primary btn-sm disabled" type="button" id="use-to-current">应用到选中清单</button>
+                                                          <button class="btn btn-primary btn-sm disabled" type="button" id="use-to-all">应用到所有清单</button>
+                                                          <% } else { %>
+                                                          <button class="btn btn-primary btn-sm" type="button" id="use-to-current">应用到选中清单</button>
+                                                          <button class="btn btn-primary btn-sm" type="button" id="use-to-all">应用到所有清单</button>
+                                                          <% } %>
+                                                      </p>
                                                       <div class="mb-1 row">
                                                       <div class="mb-1 row">
                                                           <label class="col-5 px-0 col-form-label text-right">添加位置:</label>
                                                           <label class="col-5 px-0 col-form-label text-right">添加位置:</label>
                                                           <div class="col-7">
                                                           <div class="col-7">
@@ -245,15 +262,6 @@
                                                               </select>
                                                               </select>
                                                           </div>
                                                           </div>
                                                       </div>
                                                       </div>
-                                                      <p style="text-align: center">
-                                                          <% if (projectData.property.lockBills == true) { %>
-                                                          <button class="btn btn-primary btn-sm disabled" type="button" id="use-to-current">应用到选中清单</button>
-                                                          <button class="btn btn-primary btn-sm disabled" type="button" id="use-to-all">应用到所有清单</button>
-                                                          <% } else { %>
-                                                          <button class="btn btn-primary btn-sm" type="button" id="use-to-current">应用到选中清单</button>
-                                                          <button class="btn btn-primary btn-sm" type="button" id="use-to-all">应用到所有清单</button>
-                                                          <% } %>
-                                                      </p>
                                                   </div>
                                                   </div>
                                               </div>
                                               </div>
                                           </div>
                                           </div>
@@ -487,6 +495,7 @@
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-decimal" role="tab" id="tab_poj-settings-decimal">小数位数</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-decimal" role="tab" id="tab_poj-settings-decimal">小数位数</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-6" role="tab" id="tab_poj-settings-6">人工单价调整</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-6" role="tab" id="tab_poj-settings-6">人工单价调整</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#display-setting" role="tab" id="tab_display_setting">呈现选项</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#display-setting" role="tab" id="tab_display_setting">呈现选项</a></li>
+                                <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#system-setting" role="tab" id="tab_system_setting">系统选项</a></li>
                             </ul>
                             </ul>
                         </div>
                         </div>
                         <div class="col-9">
                         <div class="col-9">
@@ -629,7 +638,7 @@
                                                     </div>
                                                     </div>
                                                 </div>
                                                 </div>
                                             </div>
                                             </div>
-                                            <h5 class="mt-3">工料机</h5>
+                                            <h5 class="mt-3">人材机</h5>
                                             <div class="row m-0">
                                             <div class="row m-0">
                                                 <div class="col-sm-3">
                                                 <div class="col-sm-3">
                                                     <div class="input-group input-group-sm mb-2">
                                                     <div class="input-group input-group-sm mb-2">
@@ -711,6 +720,25 @@
                                         <div><a style="margin-left: 5px;" class="btn btn-sm" id="recColSetting" href="javascript:void(0);">恢复默认列设置</a></div>
                                         <div><a style="margin-left: 5px;" class="btn btn-sm" id="recColSetting" href="javascript:void(0);">恢复默认列设置</a></div>
                                     </div>
                                     </div>
                                 </div>
                                 </div>
+                                <!--系统选项-->
+                                <div class="tab-pane fade" id="system-setting" role="tabpanel">
+                                    <div class="modal-auto-height">
+                                        <fieldset class="form-group">
+                                            <div class="form-check">
+                                                <label class="form-check-label">
+                                                    <input class="form-check-input" name="opts-general-radios" id="generalOpts1" value="opt1" type="checkbox">
+                                                    自动根据清单工程量填写定额工程量
+                                                </label>
+                                            </div>
+                                            <div class="form-check">
+                                                <label class="form-check-label">
+                                                    <input class="form-check-input" name="opts-general-radios" id="generalOpts2" value="opt2"  type="checkbox">
+                                                    自动根据定额单位转换定额工程量
+                                                </label>
+                                            </div>
+                                        </fieldset>
+                                    </div>
+                                </div>
                             </div>
                             </div>
                         </div>
                         </div>
                     </div>
                     </div>
@@ -742,7 +770,7 @@
                         <div class="col-9">
                         <div class="col-9">
                             <div class="tab-content">
                             <div class="tab-content">
                                 <!--常规选项-->
                                 <!--常规选项-->
-                                <div class="tab-pane fade show active" id="opts-general" role="tabpanel">
+                                <!--<div class="tab-pane fade show active" id="opts-general" role="tabpanel">
                                     <div class="modal-auto-height">
                                     <div class="modal-auto-height">
                                         <fieldset class="form-group">
                                         <fieldset class="form-group">
                                             <div class="form-check">
                                             <div class="form-check">
@@ -759,7 +787,7 @@
                                             </div>
                                             </div>
                                         </fieldset>
                                         </fieldset>
                                     </div>
                                     </div>
-                                </div>
+                                </div>-->
                             </div>
                             </div>
                         </div>
                         </div>
                     </div>
                     </div>
@@ -815,8 +843,8 @@
                     </button>
                     </button>
                     <input type="hidden" id="actionType">
                     <input type="hidden" id="actionType">
                 </div>
                 </div>
-                <div class="modal-body">
-                        <div style="width: 33%; float: left;">
+                <div class="modal-body" style="padding-left: 0; padding-right: 3px; margin-left: 0;">
+                        <div style="width: 20%; float: left;">
                             <div  class="modal-auto-height" id="componentTreeDiv" style=" height: 415px; overflow: hidden;">
                             <div  class="modal-auto-height" id="componentTreeDiv" style=" height: 415px; overflow: hidden;">
                                 <!--<div class="print-list">-->
                                 <!--<div class="print-list">-->
                                 <div style="width: 100%; height: 100%; overflow: auto">
                                 <div style="width: 100%; height: 100%; overflow: auto">
@@ -825,7 +853,7 @@
                                 <!--</div>-->
                                 <!--</div>-->
                             </div>
                             </div>
                         </div>
                         </div>
-                        <div style="width:67%; padding-left: 8px; float: left;">
+                        <div style="width:80%; padding-left: 3px; float: left;">
                             <div class="row">
                             <div class="row">
                                 <div class="col-12" id="gljRadios">
                                 <div class="col-12" id="gljRadios">
                                     <div class="row">
                                     <div class="row">

+ 1 - 4
web/building_saas/main/js/controllers/block_controller.js

@@ -607,10 +607,7 @@ let BlockController = {
         return selected.sourceType == projectObj.project.Bills.getSourceType() && selected.data.type == billType.FB;
         return selected.sourceType == projectObj.project.Bills.getSourceType() && selected.data.type == billType.FB;
     },
     },
     isFXorBX:function (selected) {//是分项或者补项
     isFXorBX:function (selected) {//是分项或者补项
-        if(selected.sourceType == projectObj.project.Bills.getSourceType()){
-            return   selected.data.type == billType.FX || selected.data.type == billType.BX;
-        }
-        return false;
+        return projectObj.project.Bills.isFXorBX(selected);
     },
     },
     blockIsFXorBX: function (type) {
     blockIsFXorBX: function (type) {
         return type == blockType.FX||type == blockType.BX;
         return type == blockType.FX||type == blockType.BX;

+ 6 - 0
web/building_saas/main/js/models/bills.js

@@ -506,6 +506,12 @@ var Bills = {
                 return false;
                 return false;
             }
             }
         };
         };
+        bills.prototype.isFXorBX=function (node) {//是分项或者补项
+            if(node.sourceType == projectObj.project.Bills.getSourceType()){
+                return   node.data.type == billType.FX || node.data.type == billType.BX;
+            }
+            return false;
+        };
         bills.prototype.nodeFlagCheck = function (node,fixedFlag) {//判断节点类型
         bills.prototype.nodeFlagCheck = function (node,fixedFlag) {//判断节点类型
             let flagCheck = function (checkNode) {
             let flagCheck = function (checkNode) {
                 if(isFlag(checkNode.data)&&checkNode.data.flagsIndex.fixed.flag==fixedFlag){
                 if(isFlag(checkNode.data)&&checkNode.data.flagsIndex.fixed.flag==fixedFlag){

+ 4 - 4
web/building_saas/main/js/models/project_glj.js

@@ -692,8 +692,8 @@ ProjectGLJ.prototype.refreshTreeNodePriceIfNeed = function (data) {
     if ((data.unit_price.type == gljType.MAIN_MATERIAL || data.unit_price.type == gljType.EQUIPMENT) && projectInfoObj.projectInfo.property.displaySetting.disPlayMainMaterial == true) {
     if ((data.unit_price.type == gljType.MAIN_MATERIAL || data.unit_price.type == gljType.EQUIPMENT) && projectInfoObj.projectInfo.property.displaySetting.disPlayMainMaterial == true) {
         var nodes = _.filter(projectObj.project.mainTree.items, function (tem) {
         var nodes = _.filter(projectObj.project.mainTree.items, function (tem) {
             if (tem.sourceType == ModuleNames.ration_glj && tem.data.projectGLJID == data.id) {
             if (tem.sourceType == ModuleNames.ration_glj && tem.data.projectGLJID == data.id) {
-                tem.data.marketUnitFee = data.unit_price.market_price;
-                tem.data.marketPrice = data.unit_price.market_price;
+                tem.data.marketUnitFee = this.getMarketPrice(data);//data.unit_price.market_price;
+                tem.data.marketPrice = this.getMarketPrice(data);//data.unit_price.market_price;
                 return true;
                 return true;
             }
             }
         })
         })
@@ -751,8 +751,8 @@ ProjectGLJ.prototype.getImpactRationNodes = function (gljs) {
 ProjectGLJ.prototype.refreshRationGLJPrice = function (glj) {
 ProjectGLJ.prototype.refreshRationGLJPrice = function (glj) {
     for (let ration_glj of gljOprObj.sheetData) {
     for (let ration_glj of gljOprObj.sheetData) {
         if (ration_glj.projectGLJID == glj.id) {
         if (ration_glj.projectGLJID == glj.id) {
-            ration_glj.basePrice = glj.unit_price.base_price;
-            ration_glj.marketPrice = glj.unit_price.market_price;
+            ration_glj.basePrice = this.getBasePrice(glj);
+            ration_glj.marketPrice = this.getMarketPrice(glj);
             ration_glj.adjustPrice = this.getAdjustPrice(glj);
             ration_glj.adjustPrice = this.getAdjustPrice(glj);
         }
         }
     }
     }

+ 4 - 2
web/building_saas/main/js/models/ration.js

@@ -399,8 +399,10 @@ var Ration = {
                     needInstall = project.Bills.isFBFX(r.node);
                     needInstall = project.Bills.isFBFX(r.node);
                 }
                 }
                 r.value===null||r.value===undefined?"":r.value = r.value.replace(/[\s\r\n]/g, "");//去掉空格回车换行等字符
                 r.value===null||r.value===undefined?"":r.value = r.value.replace(/[\s\r\n]/g, "");//去掉空格回车换行等字符
-                nodeInfo.push({ID:r.node.data.ID,billsItemID:r.node.data.billsItemID,newCode:r.value,needInstall:needInstall});
-                refershNodes.push(r.node);
+                if(r.value != r.node.data.code){
+                    nodeInfo.push({ID:r.node.data.ID,billsItemID:r.node.data.billsItemID,newCode:r.value,needInstall:needInstall});
+                    refershNodes.push(r.node);
+                }
             }
             }
             let calQuantity = optionsOprObj.getOption(optionsOprObj.optionsTypes.GENERALOPTS, 'rationQuanACToBillsQuan');
             let calQuantity = optionsOprObj.getOption(optionsOprObj.optionsTypes.GENERALOPTS, 'rationQuanACToBillsQuan');
             $.bootstrapLoading.start();
             $.bootstrapLoading.start();

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

@@ -641,6 +641,61 @@ var ration_glj = {
                 $.bootstrapLoading.end();
                 $.bootstrapLoading.end();
             });
             });
         };
         };
+
+        ration_glj.prototype.updateRationGLJByChangeCode = function (recode, updateField, newval) {
+            let me = this;
+            let priceMap = projectObj.project.projectGLJ.datas.unitPriceMap;
+            let priceObj = priceMap[newval];
+            if(priceObj){
+                if (recode.createType===undefined || recode.createType == 'normal') {// createTypel 默认是normal 只有是定额下带的工料机才需把类型改成替换,其它的保持不变
+                    recode.rcode = recode.code;
+                    recode.createType = 'replace';
+                }
+                recode.code = priceObj.code;
+                recode.name = priceObj.name;
+                recode.type = priceObj.type;
+                recode.unit = priceObj.unit;
+                recode.shortName = priceObj.short_name;
+                recode.specs = priceObj.specs;
+                recode.GLJID=priceObj.glj_id;
+                recode.original_code =  priceObj.original_code;
+                recode.basePrice = priceObj.base_price;
+                recode.marketPrice = priceObj.market_price;
+            }
+            $.bootstrapLoading.start();
+            CommonAjax.post("/rationGlj/replaceGLJ", recode, function (result) {
+                if (result) {
+                    //result.adjustState;
+                    var glj_list = me.datas;
+                    var data = result.data;
+                    var list_index = _.findIndex(glj_list, {'ID': data.ID});
+                    let rationNode = projectObj.project.mainTree.findNode(data.rationID);
+                    var nodes =  [rationNode];
+                    glj_list[list_index] = data;
+                    project.projectGLJ.loadData(function () {//加载完项目工料机再计算
+                        gljOprObj.refreshView();
+                        if (project.ration_glj.needShowToTree(data)) {//当替换的是主材或设备时,刷新对应的树节点
+                            var node = project.ration_glj.findGLJNodeByID(data.ID);
+                            if (node) {
+                                project.ration_glj.transferToNodeData(data);
+                                node.source = data;
+                                node.data = data;
+                            }
+                            node ? nodes.push(node) : "";
+                        }
+                        rationNode.data.adjustState = result.adjustState;
+                        projectObj.mainController.refreshTreeNode(nodes);
+                        project.calcProgram.calcAndSave(rationNode);
+                        $.bootstrapLoading.end();
+                    });
+                }
+            }, function () {
+                $.bootstrapLoading.end();
+            });
+
+
+        };
+
         ration_glj.prototype.replaceGLJ = function (selectCode, oldData, callback) {
         ration_glj.prototype.replaceGLJ = function (selectCode, oldData, callback) {
             var allGLJ = gljOprObj.AllRecode;
             var allGLJ = gljOprObj.AllRecode;
             var glj = _.find(allGLJ, function (item) {
             var glj = _.find(allGLJ, function (item) {

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

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

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

@@ -49,7 +49,9 @@ let calcProgramManage = {
             me.detailSpread = null;
             me.detailSpread = null;
         };
         };
         me.mainSpread = sheetCommonObj.buildSheet($('#mainSpread')[0], me.mainSetting, me.datas.length);
         me.mainSpread = sheetCommonObj.buildSheet($('#mainSpread')[0], me.mainSetting, me.datas.length);
+        sheetCommonObj.spreadDefaultStyle(me.mainSpread);
         me.detailSpread = sheetCommonObj.buildSheet($('#detailSpread')[0], me.detailSetting, me.datas[0].calcItems.length);
         me.detailSpread = sheetCommonObj.buildSheet($('#detailSpread')[0], me.detailSetting, me.datas[0].calcItems.length);
+        sheetCommonObj.spreadDefaultStyle(me.detailSpread);
         let arr = projectObj.project.calcProgram.compiledFeeTypeNames.slice();
         let arr = projectObj.project.calcProgram.compiledFeeTypeNames.slice();
         // arr.splice(arr.findIndex(function (e){return e == '暂估费'}), 1);
         // arr.splice(arr.findIndex(function (e){return e == '暂估费'}), 1);
         let fieldName = new GC.Spread.Sheets.CellTypes.ComboBox();
         let fieldName = new GC.Spread.Sheets.CellTypes.ComboBox();

+ 35 - 21
web/building_saas/main/js/views/character_content_view.js

@@ -27,7 +27,7 @@ let contentOprObj = {
         const EVENTS = GC.Spread.Sheets.Events;
         const EVENTS = GC.Spread.Sheets.Events;
         workBook.bind(EVENTS.ButtonClicked, me.onButtonClicked);
         workBook.bind(EVENTS.ButtonClicked, me.onButtonClicked);
         sheet.bind(EVENTS.EditStarting, me.onEditStart);
         sheet.bind(EVENTS.EditStarting, me.onEditStart);
-        sheet.bind(EVENTS.EditEnded, me.onEditEnded);
+        sheet.bind(EVENTS.ValueChanged, me.onValueChanged);
         sheet.bind(EVENTS.ClipboardPasting, me.onClipboardPasting);
         sheet.bind(EVENTS.ClipboardPasting, me.onClipboardPasting);
         sheet.bind(EVENTS.ClipboardPasted, me.onClipboardPasted);
         sheet.bind(EVENTS.ClipboardPasted, me.onClipboardPasted);
         sheet.bind(EVENTS.SelectionChanged, me.onSelectionChanged);
         sheet.bind(EVENTS.SelectionChanged, me.onSelectionChanged);
@@ -145,10 +145,12 @@ let contentOprObj = {
         me.workBook.focus();
         me.workBook.focus();
     },
     },
     //更新
     //更新
-    updateContent: function (job, newContent) {
+    updateContent: function (job, newContent, save = true) {
         let me = contentOprObj;
         let me = contentOprObj;
         job.content = newContent;
         job.content = newContent;
-        me.save();
+        if(save){
+            me.save();
+        }
     },
     },
     //新增
     //新增
     insertContent: function (sheet, idx, content) {
     insertContent: function (sheet, idx, content) {
@@ -172,15 +174,16 @@ let contentOprObj = {
             return;
             return;
         }
         }
     },
     },
-    onEditEnded: function (sender, args) {
+    onValueChanged: function (sender, args) {
         let me = contentOprObj;
         let me = contentOprObj;
         if(me.setting.header[args.col].dataCode === 'isChecked'){
         if(me.setting.header[args.col].dataCode === 'isChecked'){
             return;
             return;
         }
         }
-        args.editingText = args.editingText ? args.editingText : '';
+        args.newValue = args.newValue ?  args.newValue : '';
         //更新
         //更新
-        if(args.row < me.currentCache.length ){
-            me.updateContent(me.currentCache[args.row], args.editingText);
+        if(args.row < me.currentCache.length){
+            let job = me.currentCache[args.row];
+            me.updateContent(job, args.newValue);
         }
         }
 
 
     },
     },
@@ -236,13 +239,18 @@ let contentOprObj = {
     onClipboardPasted: function (sender, args) {
     onClipboardPasted: function (sender, args) {
         let me = contentOprObj;
         let me = contentOprObj;
         let items = sheetCommonObj.analyzePasteData(me.setting, args);
         let items = sheetCommonObj.analyzePasteData(me.setting, args);
+        let toSave = false;
         for(let i = 0, len = items.length; i < len; i++){
         for(let i = 0, len = items.length; i < len; i++){
             let rowIdx = args.cellRange.row + i;
             let rowIdx = args.cellRange.row + i;
             //更新
             //更新
             if(rowIdx < me.currentCache.length){
             if(rowIdx < me.currentCache.length){
-                me.updateContent(me.currentCache[rowIdx], items[i].content);
+                toSave = true;
+                me.updateContent(me.currentCache[rowIdx], items[i].content, false);
             }
             }
         }
         }
+        if(toSave){
+            me.save();
+        }
     },
     },
     onSelectionChanged: function (sender, args) {
     onSelectionChanged: function (sender, args) {
         let me = contentOprObj;
         let me = contentOprObj;
@@ -411,7 +419,7 @@ let characterOprObj = {
         const EVENTS = GC.Spread.Sheets.Events;
         const EVENTS = GC.Spread.Sheets.Events;
         workBook.bind(EVENTS.ButtonClicked, me.onButtonClicked);
         workBook.bind(EVENTS.ButtonClicked, me.onButtonClicked);
         sheet.bind(EVENTS.EnterCell, me.onEnterCell);
         sheet.bind(EVENTS.EnterCell, me.onEnterCell);
-        sheet.bind(EVENTS.EditEnded, me.onEditEnded);
+        sheet.bind(EVENTS.ValueChanged, me.onValueChanged);
         sheet.bind(EVENTS.EditStarting, me.onEditStart);
         sheet.bind(EVENTS.EditStarting, me.onEditStart);
         sheet.bind(EVENTS.ClipboardPasting, me.onClipboardPasting);
         sheet.bind(EVENTS.ClipboardPasting, me.onClipboardPasting);
         sheet.bind(EVENTS.ClipboardPasted, me.onClipboardPasted);
         sheet.bind(EVENTS.ClipboardPasted, me.onClipboardPasted);
@@ -604,7 +612,7 @@ let characterOprObj = {
         let newValue = {value: value, isSelected: true};
         let newValue = {value: value, isSelected: true};
         item.eigenvalue.push(newValue);
         item.eigenvalue.push(newValue);
     },
     },
-    updateCharacter: function (item, character, value) {
+    updateCharacter: function (item, character, value, save = true) {
         let me = characterOprObj;
         let me = characterOprObj;
         if(character !== undefined && character !== null){
         if(character !== undefined && character !== null){
             item.character = character;
             item.character = character;
@@ -634,7 +642,9 @@ let characterOprObj = {
                 me.unsetSelected(item);
                 me.unsetSelected(item);
             }
             }
         }
         }
-        me.save();
+        if(save){
+            me.save();
+        }
     },
     },
     insertCharacter: function (sheet, idx, character) {
     insertCharacter: function (sheet, idx, character) {
         let me = characterOprObj;
         let me = characterOprObj;
@@ -663,18 +673,17 @@ let characterOprObj = {
     onEnterCell: function (sender, args) {
     onEnterCell: function (sender, args) {
         args.sheet.repaint();
         args.sheet.repaint();
     },
     },
-    onEditEnded: function (sender, args) {
-        let me = characterOprObj, characterTxt;
-        let preObj = me.currentCache.length > 0 ?  me.currentCache[me.currentCache.length - 1] : null;
-        args.editingText = args.editingText ? args.editingText : '';
+    onValueChanged: function (sender, args) {
+        let me = characterOprObj;
+        args.newValue = args.newValue ? args.newValue : '';
         //更新
         //更新
         if(args.row < me.currentCache.length){
         if(args.row < me.currentCache.length){
             let thisCha = me.currentCache[args.row];
             let thisCha = me.currentCache[args.row];
             if(args.col === 0){//特征
             if(args.col === 0){//特征
-                me.updateCharacter(thisCha, args.editingText, null);
+                me.updateCharacter(thisCha, args.newValue, null);
             }
             }
             else if(args.col === 1){//特征值
             else if(args.col === 1){//特征值
-                me.updateCharacter(thisCha, null, args.editingText);
+                me.updateCharacter(thisCha, null, args.newValue);
             }
             }
         }
         }
     },
     },
@@ -689,13 +698,18 @@ let characterOprObj = {
     onClipboardPasted: function (sender, args) {
     onClipboardPasted: function (sender, args) {
         let me = characterOprObj;
         let me = characterOprObj;
         let items = sheetCommonObj.analyzePasteData(me.setting, args);
         let items = sheetCommonObj.analyzePasteData(me.setting, args);
+        let toSave = false;
         for(let i = 0, len = items.length; i < len; i++){
         for(let i = 0, len = items.length; i < len; i++){
             //更新
             //更新
             let rowIdx = args.cellRange.row + i;
             let rowIdx = args.cellRange.row + i;
             if(me.currentCache.length > rowIdx){
             if(me.currentCache.length > rowIdx){
-               me.updateCharacter(me.currentCache[rowIdx], items[i].character, items[i].eigenvalue);
+                toSave = true;
+               me.updateCharacter(me.currentCache[rowIdx], items[i].character, items[i].eigenvalue, false);
             }
             }
         }
         }
+        if(toSave){
+            me.save();
+        }
     },
     },
     onRangeChanged: function (sender, args) {
     onRangeChanged: function (sender, args) {
         let me = characterOprObj;
         let me = characterOprObj;
@@ -1061,9 +1075,9 @@ let pageCCOprObj = {
     refreshView: function(node, refreshData) {
     refreshView: function(node, refreshData) {
         // 更新清单行特征列或内容列
         // 更新清单行特征列或内容列
         let updateCol = [
         let updateCol = [
-            { name: 'itemCharacterText', col: 4 },
-            { name: 'jobContentText', col: 5 },
-            { name: 'name', col: 2 }
+            { name: 'itemCharacterText', col: colSettingObj.getColByField('itemCharacterText')},
+            { name: 'jobContentText', col: colSettingObj.getColByField('jobContentText')},
+            { name: 'name', col: colSettingObj.getColByField('name')}
         ];
         ];
         if (updateCol === '') {
         if (updateCol === '') {
             return;
             return;

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

@@ -130,6 +130,7 @@ var feeRateObject={
     createSheet:function(){
     createSheet:function(){
         var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
         var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
         feeRateObject.feeRateSpreads=sheetCommonObj.buildSheet($('#fee_rate_sheet')[0], feeRateObject.sheetSetting,feeRateFile.rates.length);
         feeRateObject.feeRateSpreads=sheetCommonObj.buildSheet($('#fee_rate_sheet')[0], feeRateObject.sheetSetting,feeRateFile.rates.length);
+        sheetCommonObj.spreadDefaultStyle(feeRateObject.feeRateSpreads);
         feeRateObject.feeRateSheet = feeRateObject.feeRateSpreads.getSheet(0);
         feeRateObject.feeRateSheet = feeRateObject.feeRateSpreads.getSheet(0);
         feeRateObject.feeRateSheet.selectionUnit(1)//0 cell,1 row,2 col;
         feeRateObject.feeRateSheet.selectionUnit(1)//0 cell,1 row,2 col;
         feeRateObject.feeRateSheet.options.isProtected = true;
         feeRateObject.feeRateSheet.options.isProtected = true;
@@ -227,6 +228,7 @@ var feeRateObject={
 
 
         sheet.setSelection(rowIdx, -1, 1, -1);
         sheet.setSelection(rowIdx, -1, 1, -1);
         sheet.showRow(rowIdx, GC.Spread.Sheets.VerticalPosition.center);
         sheet.showRow(rowIdx, GC.Spread.Sheets.VerticalPosition.center);
+        feeRateObject.onCellClick({type: 'CellClick'}, {row:rowIdx});
     },
     },
     getTreeNodeCellType:function () {
     getTreeNodeCellType:function () {
         var ns = GC.Spread.Sheets;
         var ns = GC.Spread.Sheets;
@@ -341,7 +343,7 @@ var feeRateObject={
             if(me.editingCell==null){
             if(me.editingCell==null){
                 var showSelectBtn = true;
                 var showSelectBtn = true;
                 if(hitinfo.sheet.name()!='calc_detail'){
                 if(hitinfo.sheet.name()!='calc_detail'){
-                    showSelectBtn=me.ifFeeRateEdit();
+                    showSelectBtn=me.ifFeeRateEdit(hitinfo.row);
                 }
                 }
                 if(showSelectBtn){
                 if(showSelectBtn){
                     me.editingCell={
                     me.editingCell={
@@ -357,7 +359,7 @@ var feeRateObject={
                 var imageHeight = hitinfo.cellRect.height-2*imageMagin;
                 var imageHeight = hitinfo.cellRect.height-2*imageMagin;
                 var imageWidth = hitinfo.cellRect.width*2/7;
                 var imageWidth = hitinfo.cellRect.width*2/7;
                 if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
                 if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
-                    if(!projectReadOnly){
+                    if(!projectReadOnly && me.ifFeeRateEdit(hitinfo.row)){
                         me.showSelectModal(hitinfo);
                         me.showSelectModal(hitinfo);
                     }
                     }
                 }
                 }
@@ -404,8 +406,8 @@ var feeRateObject={
         }
         }
         return children.length+sum;
         return children.length+sum;
     },
     },
-    ifFeeRateEdit:function () {
-        var selected = projectObj.project.mainTree.selected;
+    ifFeeRateEdit:function (row) {
+        var selected = projectObj.project.mainTree.items[row];
         return selected&&MainTreeCol.readOnly.forFeeRate(selected)?false:true;
         return selected&&MainTreeCol.readOnly.forFeeRate(selected)?false:true;
     },
     },
     createSpreadView:function () {
     createSpreadView:function () {
@@ -430,6 +432,7 @@ var feeRateObject={
     initFeeRateSpread:function (rowCount) {
     initFeeRateSpread:function (rowCount) {
         //初始化费用项表格
         //初始化费用项表格
         this.mainFeeRateSpread = sheetCommonObj.buildSheet($('#divFee')[0], this.mainFeeRateSetting,rowCount);
         this.mainFeeRateSpread = sheetCommonObj.buildSheet($('#divFee')[0], this.mainFeeRateSetting,rowCount);
+        sheetCommonObj.spreadDefaultStyle(this.mainFeeRateSpread);
         this.mainFeeRateSpread.options.scrollbarMaxAlign = true;
         this.mainFeeRateSpread.options.scrollbarMaxAlign = true;
         this.mainFeeRateSheet = this.mainFeeRateSpread.getSheet(0);
         this.mainFeeRateSheet = this.mainFeeRateSpread.getSheet(0);
         if(!projectReadOnly){
         if(!projectReadOnly){

+ 14 - 13
web/building_saas/main/js/views/glj_col.js

@@ -5,8 +5,8 @@ let gljCol = {
     ration_glj_setting: {
     ration_glj_setting: {
         header: [
         header: [
             {headerName: "编码", headerWidth: 100, dataCode: "code", dataType: "String", formatter: "@"},
             {headerName: "编码", headerWidth: 100, dataCode: "code", dataType: "String", formatter: "@"},
-            {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String",cellType:'tipsCell'},
-            {headerName: "规格型号", headerWidth: 90, dataCode: "specs", dataType: "String", hAlign: "left",cellType:'tipsCell'},
+            {headerName: "名称", headerWidth: 240, dataCode: "name", dataType: "String",cellType:'tipsCell'},
+            {headerName: "规格型号", headerWidth: 190, dataCode: "specs", dataType: "String", hAlign: "left",cellType:'tipsCell'},
             {headerName: "单位", headerWidth: 45, dataCode: "unit", dataType: "String", hAlign: "center"},
             {headerName: "单位", headerWidth: 45, dataCode: "unit", dataType: "String", hAlign: "center"},
             {headerName: "市场价", headerWidth: 80, dataCode: "marketPrice", dataType: "Number", hAlign: "right"},//, decimalField: "glj.unitPrice"
             {headerName: "市场价", headerWidth: 80, dataCode: "marketPrice", dataType: "Number", hAlign: "right"},//, decimalField: "glj.unitPrice"
             {headerName: "调整价", headerWidth: 80, dataCode: "adjustPrice", dataType: "Number", hAlign: "right"},//, decimalField: "glj.unitPrice"1
             {headerName: "调整价", headerWidth: 80, dataCode: "adjustPrice", dataType: "Number", hAlign: "right"},//, decimalField: "glj.unitPrice"1
@@ -18,7 +18,7 @@ let gljCol = {
             {headerName: "暂估", headerWidth: 45, dataCode: "isEstimate", dataType: "String", hAlign: "center", vAlign: "center", cellType: "checkBox"}
             {headerName: "暂估", headerWidth: 45, dataCode: "isEstimate", dataType: "String", hAlign: "center", vAlign: "center", cellType: "checkBox"}
         ],
         ],
         view: {
         view: {
-            lockColumns: [0, 5, 7, 9, 10, 11]
+            lockColumns: [ 5, 7, 9, 10, 11]
         },
         },
         // 工料机类型是混凝土、砂浆、配合比、机械台班时,价格不可编辑。
         // 工料机类型是混凝土、砂浆、配合比、机械台班时,价格不可编辑。
         editedTyep:[GLJTypeConst.MAIN_MATERIAL,GLJTypeConst.EQUIPMENT]//主材设备
         editedTyep:[GLJTypeConst.MAIN_MATERIAL,GLJTypeConst.EQUIPMENT]//主材设备
@@ -26,8 +26,8 @@ let gljCol = {
     project_glj_setting:{
     project_glj_setting:{
         header: [
         header: [
             {headerName: "编码", headerWidth: 80, dataCode: "code", dataType: "String"},
             {headerName: "编码", headerWidth: 80, dataCode: "code", dataType: "String"},
-            {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String"},
-            {headerName: "规格型号", headerWidth: 120, dataCode: "specs", hAlign: "left", dataType: "String"},
+            {headerName: "名称", headerWidth: 240, dataCode: "name", dataType: "String",cellType:'tipsCell'},
+            {headerName: "规格型号", headerWidth: 190, dataCode: "specs", hAlign: "left", dataType: "String",cellType:'tipsCell'},
             {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
             {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
             {headerName: "类型", headerWidth: 45, dataCode: "short_name", hAlign: "center", dataType: "String"},
             {headerName: "类型", headerWidth: 45, dataCode: "short_name", hAlign: "center", dataType: "String"},
             {headerName: "市场价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:"glj.unitPrice"
             {headerName: "市场价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:"glj.unitPrice"
@@ -36,18 +36,19 @@ let gljCol = {
             {headerName: "总消耗量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
             {headerName: "总消耗量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
             {headerName: "暂估", headerWidth: 45, dataCode: "is_evaluate", hAlign: "center", dataType: "String",cellType:'checkBox'},
             {headerName: "暂估", headerWidth: 45, dataCode: "is_evaluate", hAlign: "center", dataType: "String",cellType:'checkBox'},
             {headerName: "主要\n材料", headerWidth: 45, dataCode: "is_main_material", hAlign: "center", dataType: "String",cellType:'checkBox'},
             {headerName: "主要\n材料", headerWidth: 45, 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",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"},
-            {headerName: "送达地点", headerWidth: 100, dataCode: "delivery_address", hAlign: "left", dataType: "String"},
+            {headerName: "供货方式", headerWidth: 70, dataCode: "supply", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:supplyComboMap},
+            {headerName: "甲供数量", headerWidth: 90, dataCode: "supply_quantity", hAlign: "right", dataType: "Number",validator:"number",decimalField:'glj.quantity'},
+            {headerName: "三材类别", headerWidth: 70, dataCode: "materialType", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:materialComboMap},
+            {headerName: "三材系数", headerWidth: 70, dataCode: "materialCoe", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:'material'
+            {headerName: "交货方式", headerWidth: 70, dataCode: "delivery", hAlign: "left", dataType: "String"},
+            {headerName: "送达地点", headerWidth: 70, dataCode: "delivery_address", hAlign: "left", dataType: "String"},
             {headerName: "不调价", headerWidth: 55, dataCode: "is_adjust_price", dataType: "String",cellType: "checkBox"},
             {headerName: "不调价", headerWidth: 55, dataCode: "is_adjust_price", dataType: "String",cellType: "checkBox"},
             {headerName: "备注", headerWidth: 100, dataCode: "remark", hAlign: "left", dataType: "String"}
             {headerName: "备注", headerWidth: 100, dataCode: "remark", hAlign: "left", dataType: "String"}
         ],
         ],
-            view: {
+        view: {
             lockColumns: [0,1,2,3,4,6,8]
             lockColumns: [0,1,2,3,4,6,8]
-        }
+        },
+        frozenCols:4
     },
     },
     mixRatio_Setting:{
     mixRatio_Setting:{
         header:[
         header:[

+ 155 - 78
web/building_saas/main/js/views/glj_view.js

@@ -82,12 +82,12 @@ var gljOprObj = {
         header: [
         header: [
             {headerName: "选择", headerWidth: 40, dataCode: "select", hAlign: "center", vAlign: "center", cellType: "checkBox"},
             {headerName: "选择", headerWidth: 40, dataCode: "select", hAlign: "center", vAlign: "center", cellType: "checkBox"},
             {headerName: "编码", headerWidth: 80, dataCode: "code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
             {headerName: "编码", headerWidth: 80, dataCode: "code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
-            {headerName: "名称", headerWidth: 120, dataCode: "name", dataType: "String", hAlign: "left", vAlign: "center"},
-            {headerName: "规格型号", headerWidth: 80, dataCode: "specs", dataType: "String", hAlign: "center", vAlign: "center"},
+            {headerName: "名称", headerWidth: 240, dataCode: "name", dataType: "String", hAlign: "left", vAlign: "center"},
+            {headerName: "规格型号", headerWidth: 190, dataCode: "specs", dataType: "String", hAlign: "left", vAlign: "center"},
             {headerName: "单位", headerWidth: 40, dataCode: "unit", dataType: "String", hAlign: "center", vAlign: "center"},
             {headerName: "单位", headerWidth: 40, dataCode: "unit", dataType: "String", hAlign: "center", vAlign: "center"},
-            {headerName: "单价", headerWidth: 80, dataCode: "basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
-            {headerName: "类型", headerWidth: 80, dataCode: "gljType", dataType: "String", hAlign: "center", vAlign: "center"},
-            {headerName: "是否新增", headerWidth: 80, dataCode: "isComplementary", dataType: "String", hAlign: "center", vAlign: "center", cellType: "checkBox"}
+            {headerName: "单价", headerWidth: 55, dataCode: "basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
+            {headerName: "类型", headerWidth: 60, dataCode: "gljType", dataType: "String", hAlign: "center", vAlign: "center"},
+            {headerName: "新增", headerWidth: 40, dataCode: "isComplementary", dataType: "String", hAlign: "center", vAlign: "center", cellType: "checkBox"}
         ],
         ],
         view: {
         view: {
             lockColumns: [0, 1, 2, 3, 4, 5, 6]
             lockColumns: [0, 1, 2, 3, 4, 5, 6]
@@ -100,20 +100,15 @@ var gljOprObj = {
         sheetCommonObj.initSheet(me.sheet, me.setting, 30);
         sheetCommonObj.initSheet(me.sheet, me.setting, 30);
         sheet.name('ration_glj');
         sheet.name('ration_glj');
         me.bindSheetEvent(sheet);
         me.bindSheetEvent(sheet);
-        sheet.bind(GC.Spread.Sheets.Events.CellClick, me.onCellClick);
         sheet.bind(GC.Spread.Sheets.Events.CellDoubleClick, me.onCellDoubleClick);
         sheet.bind(GC.Spread.Sheets.Events.CellDoubleClick, me.onCellDoubleClick);
         sheet.bind(GC.Spread.Sheets.Events.ClipboardChanged, me.onClipboardChanged);
         sheet.bind(GC.Spread.Sheets.Events.ClipboardChanged, me.onClipboardChanged);
         subSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, me.onButtonClick);
         subSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, me.onButtonClick);
-        sheet.bind(GC.Spread.Sheets.Events.EditStarting, function (sender, args) {
-            if (args.row>=me.sheetData.length){
-                args.cancel = true;
-            }else if (me.sheetData[args.row].isMixRatio) {
-                args.cancel = true;
-            }
-        });
         if(!projectReadOnly){
         if(!projectReadOnly){
             gljContextMenu.loadGLJSpreadContextMenu();
             gljContextMenu.loadGLJSpreadContextMenu();
         }
         }
+        sheet.bind(GC.Spread.Sheets.Events.SelectionChanged,function (sender,args) {
+            args.sheet.repaint();
+        });
     },
     },
     initDetailSheet: function (sheet) {
     initDetailSheet: function (sheet) {
         var me = this;
         var me = this;
@@ -122,15 +117,6 @@ var gljOprObj = {
         // me.detailSheet.selectionUnit(0);//0 cell,1 row,2 col;
         // me.detailSheet.selectionUnit(0);//0 cell,1 row,2 col;
         sheet.name('quantity_detail');
         sheet.name('quantity_detail');
         me.bindSheetEvent(sheet);
         me.bindSheetEvent(sheet);
-        sheet.bind(GC.Spread.Sheets.Events.EditStarting, function (sender, args) {
-            if(me.detailSheetReadonly()){
-                args.cancel = true;
-            }else {
-                if(args.sheet.getValue(args.row,args.col)==null){//这里是为了解决当单元格里的值是null的时候,在单元格里输入数据,按键盘箭头移动光标的时候,会直接结束编辑,跳到另外的单元格。
-                    args.sheet.setValue(args.row,args.col,"");
-                }
-            }
-        });
     },
     },
     detailSheetReadonly:function () {
     detailSheetReadonly:function () {
         let selected = projectObj.project.mainTree.selected;
         let selected = projectObj.project.mainTree.selected;
@@ -183,6 +169,19 @@ var gljOprObj = {
         if(selected){
         if(selected){
             if(me.isInstallationNode(selected)==true){
             if(me.isInstallationNode(selected)==true){
                 args.cancel = true;
                 args.cancel = true;
+            }else {
+                if(args.sheetName == 'quantity_detail'){//工程量明细表
+                    if(me.detailSheetReadonly()){
+                        args.cancel = true;
+                    }else {
+                        if(args.sheet.getValue(args.row,args.col)==null){//这里是为了解决当单元格里的值是null的时候,在单元格里输入数据,按键盘箭头移动光标的时候,会直接结束编辑,跳到另外的单元格。
+                            args.sheet.setValue(args.row,args.col,"");
+                        }
+                    }
+                }
+                if(args.sheetName == 'ration_glj'){//定额工料机表
+                    if(!me.rationGLJEditCheck(args)) args.cancel = true;
+                }
             }
             }
         }else {
         }else {
             args.cancel = true;
             args.cancel = true;
@@ -233,6 +232,32 @@ var gljOprObj = {
         }
         }
         me.updateRationGLJ(args);
         me.updateRationGLJ(args);
     },
     },
+    onSelectionChanged: function (sender, args) {
+        let me = gljOprObj;
+        me.initSelection(args.newSelections.length > 0 ? {row: args.newSelections[0].row} : {row: 0});
+    },
+    getSelStyle: function (selected) {
+        let style = new GC.Spread.Sheets.Style();
+        style.borderLeft = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
+        style.borderTop = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
+        style.borderRight = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
+        style.borderBottom = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
+        let colorOpts = optionsOprObj.getOption(optionsOprObj.optionsTypes.COLOROPTS);
+        let selectedColor = colorOpts.SELECTED.backColor,
+            recColor = 'White';
+        style.backColor = selected ? selectedColor : recColor;
+        return style;
+    },
+    initSelection: function (sel) {
+        let me = gljOprObj;
+        if(sel){
+            me.gljLibSheet.setStyle(sel.row, -1, me.getSelStyle(true));
+        }
+        if(me.preSelection){
+            me.gljLibSheet.setStyle(me.preSelection.row, -1, me.getSelStyle(false));
+        }
+        me.preSelection = sel;
+    },
     onButtonClick: function (sender, args) {
     onButtonClick: function (sender, args) {
         if(args.sheet.isEditing()){
         if(args.sheet.isEditing()){
             args.sheet.endEdit();
             args.sheet.endEdit();
@@ -281,14 +306,6 @@ var gljOprObj = {
             installationFeeObj.onRationInstallValueChange(sender,args);
             installationFeeObj.onRationInstallValueChange(sender,args);
         }
         }
     },
     },
-    onCellClick: function (sender, args) {
-        console.log('cellClick');
-        var me = gljOprObj;
-        if (args.row >= me.sheetData.length) {
-            return;
-        }
-        me.editChecking(args);
-    },
     onCellDoubleClick:function (sender, args) {
     onCellDoubleClick:function (sender, args) {
         var me = gljOprObj;
         var me = gljOprObj;
         var header = me.setting.header;
         var header = me.setting.header;
@@ -314,39 +331,32 @@ var gljOprObj = {
         sheetCommonObj.copyTextToClipboard(cDatas);
         sheetCommonObj.copyTextToClipboard(cDatas);
         return;
         return;
     },
     },
-    editChecking: function (args) {
+    rationGLJEditCheck:function (args) {//true 可以编辑,false 不能编辑
         var me = gljOprObj;
         var me = gljOprObj;
         var header = me.setting.header;
         var header = me.setting.header;
-        var disable = null;
-        if (me.sheetData[args.row] != undefined) {
-            if (me.sheetData[args.row].isMixRatio) {
-                disable = true;
+        if (_.includes(me.setting.view.lockColumns, args.col))  return false;//如果是锁定的列,不能编辑
+        if(me.sheetData[args.row] != undefined){
+            if(me.sheetData[args.row].isMixRatio){//对于组成物列
+               return header[args.col].dataCode == 'marketPrice'//允许修改组成物市单价,其它的不可以
             }else {
             }else {
                 if (header[args.col] && header[args.col].dataCode == 'marketPrice') {
                 if (header[args.col] && header[args.col].dataCode == 'marketPrice') {
-                    if(me.marketPriceReadOnly({data:me.sheetData[args.row]})){
-                        disable = true;
-                    }else {
-                        disable = false;
-                    }
+                    return !me.marketPriceReadOnly({data:me.sheetData[args.row]});
                 }
                 }
                 if (header[args.col] && header[args.col].dataCode == 'basePrice') {
                 if (header[args.col] && header[args.col].dataCode == 'basePrice') {
                     var isAdd = me.sheetData[args.row].isAdd;
                     var isAdd = me.sheetData[args.row].isAdd;
                     if(isAdd==1){//是新增但没有组成物时允许修改定额价
                     if(isAdd==1){//是新增但没有组成物时允许修改定额价
-                        if(me.marketPriceReadOnly({data:me.sheetData[args.row]})){//如果有组成物,不可修改
-                            disable = true;
-                        }else {
-                            disable = false;
-                        }
+                        return !me.marketPriceReadOnly({data:me.sheetData[args.row]});//如果有组成物,不可修改
                     } else {
                     } else {
-                        disable = true;
+                        return false;
                     }
                     }
                 }
                 }
+                return true;
             }
             }
+        }else {
+            return false
         }
         }
-        if (disable != null) {
-            me.sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).locked(disable);
-        }
-    },
+    }
+    ,
     hasComposition:function (ration_glj,isRationType) {//判断是否有组成物,有则返回true   现在主材类型的工料机也有可能有组成物。
     hasComposition:function (ration_glj,isRationType) {//判断是否有组成物,有则返回true   现在主材类型的工料机也有可能有组成物。
         let type = isRationType==true? ration_glj.subType:ration_glj.type;
         let type = isRationType==true? ration_glj.subType:ration_glj.type;
         if(notEditType.indexOf(type)!=-1||type==gljType.MAIN_MATERIAL){
         if(notEditType.indexOf(type)!=-1||type==gljType.MAIN_MATERIAL){
@@ -504,36 +514,49 @@ var gljOprObj = {
         let selected = this.sheet.getSelections();
         let selected = this.sheet.getSelections();
         this.combineWithProjectGlj(this.sheetData);
         this.combineWithProjectGlj(this.sheetData);
         this.sheet.setRowCount(0);
         this.sheet.setRowCount(0);
-        //console.log(+new Date())
-        //this.sheet.getRange(0,-1,this.sheet.getRowCount(),-1).visible(true); //这个方法导致加载缓慢
         this.sheetData = sortRationGLJ(this.sheetData);
         this.sheetData = sortRationGLJ(this.sheetData);
         this.sumQuantity();//计算总消耗量
         this.sumQuantity();//计算总消耗量
         this.addMixRatioToShow();//显示组成物信息
         this.addMixRatioToShow();//显示组成物信息
-        this.initRationTree(init);
+        this.initRationTree(init,this.getUnitPriceCodeMap());
         sheetCommonObj.showData(this.sheet, this.setting, this.sheetData);
         sheetCommonObj.showData(this.sheet, this.setting, this.sheetData);
         if(selected){//定位光标到之前的位置
         if(selected){//定位光标到之前的位置
             this.sheet.setSelection(selected[0].row,selected[0].col,selected[0].rowCount,selected[0].colCount);
             this.sheet.setSelection(selected[0].row,selected[0].col,selected[0].rowCount,selected[0].colCount);
         }
         }
     },
     },
-    initRationTree: function (init) {
-        this.sheet.getRange(-1, 0, -1, 1).cellType(this.getTreeNodeCellType(this.sheetData));
+    getUnitPriceCodeMap : function () {//取单价文件中,编码前缀一样的映射表
+        let codeMap = {};
+        let priceMap = projectObj.project.projectGLJ.datas.unitPriceMap;
+        if(priceMap){
+            for(let connectKey in priceMap){
+                let code = priceMap[connectKey].code;
+                if(code){
+                   let preCode = code.split("-")[0];
+                   if(codeMap[preCode]) {
+                       codeMap[preCode].push({text:code,value:connectKey});
+                   }else {
+                       codeMap[preCode]=[{text:code,value:connectKey}];
+                   }
+                }
+            }
+        }
+        return codeMap;
+    },
+
+    initRationTree: function (init,codeMap) {
+        this.sheet.suspendPaint();
+        this.sheet.suspendEvent();
+        this.sheet.setRowCount(this.sheetData.length >30?this.sheetData.length:30);
         for (var i = 0; i < this.sheetData.length; i++) {
         for (var i = 0; i < this.sheetData.length; i++) {
+            this.sheet.setCellType(i, 0,this.getTreeNodeCellType(this.sheetData,i,codeMap),GC.Spread.Sheets.SheetArea.viewport);
             if (this.sheetData[i].hasOwnProperty('subList')) {
             if (this.sheetData[i].hasOwnProperty('subList')) {
-               /* var collapsed = false;
-                if (init) {
-                    this.sheetData[i].collapsed = true;
-                    collapsed = true;
-                } else {
-                    collapsed = this.sheetData[i].collapsed == undefined ? true : this.sheetData[i].collapsed;
-                }*/
                 var collapsed = this.sheetData[i].collapsed == undefined ? true : this.sheetData[i].collapsed;
                 var collapsed = this.sheetData[i].collapsed == undefined ? true : this.sheetData[i].collapsed;
                 if (collapsed == true) {
                 if (collapsed == true) {
                     this.sheet.getRange(i + 1, -1, this.sheetData[i].subList.length, -1).visible(false);
                     this.sheet.getRange(i + 1, -1, this.sheetData[i].subList.length, -1).visible(false);
                 }
                 }
-                //this.sheet.getRange(i+1, -1, this.sheetData[i].subList.length, -1).visible(!collapsed);// this.sheet.getRange(i+1, -1, this.sheetData[i].subList.length, -1).locked(true);
-                //这个方法导致加载缓慢
             }
             }
         }
         }
+        this.sheet.resumeEvent();
+        this.sheet.resumePaint();
     },
     },
     filterGljByRation: function (ration, datas) {
     filterGljByRation: function (ration, datas) {
         var gljList = [];
         var gljList = [];
@@ -733,6 +756,10 @@ var gljOprObj = {
         var updateField = me.setting.header[args.col].dataCode;
         var updateField = me.setting.header[args.col].dataCode;
         var recode = me.sheetData[args.row];
         var recode = me.sheetData[args.row];
         var newval;
         var newval;
+        if(!me.rationGLJEditCheck(args)){
+            recode? me.sheet.getCell(args.row, args.col).value(recode[updateField]): me.sheet.getCell(args.row, args.col).value(null);
+            return;
+        }
         if (updateField == 'marketPrice' || updateField == 'customQuantity' || updateField == 'basePrice') {
         if (updateField == 'marketPrice' || updateField == 'customQuantity' || updateField == 'basePrice') {
             if (args.editingText == null) {
             if (args.editingText == null) {
                 updateField == 'marketPrice' ? newval = 0 : newval = "";
                 updateField == 'marketPrice' ? newval = 0 : newval = "";
@@ -752,6 +779,12 @@ var gljOprObj = {
                     return;
                     return;
                 }
                 }
             }
             }
+            if(updateField == 'code'){
+                if (!gljUtil.isDef(args.editingText)||args.editingText==''||args.editingText.indexOf('|-|') === -1||this.isRationGLJExit(args.editingText)) {//说明是选中自已,或者是已存在的工料机
+                    me.sheet.getCell(args.row, args.col).value(recode[updateField]);
+                    return;
+                }
+            }
             newval = args.editingText == null ? "" : args.editingText;
             newval = args.editingText == null ? "" : args.editingText;
         }
         }
         if (newval === recode[updateField]) {//如果值完全相等,则不需要更新
         if (newval === recode[updateField]) {//如果值完全相等,则不需要更新
@@ -759,10 +792,23 @@ var gljOprObj = {
         }
         }
         if (updateField == 'marketPrice' || updateField == 'basePrice') {
         if (updateField == 'marketPrice' || updateField == 'basePrice') {
             projectObj.project.projectGLJ.updatePriceFromRG(recode, updateField, newval);
             projectObj.project.projectGLJ.updatePriceFromRG(recode, updateField, newval);
+        }else if(updateField == 'code'){//替换单价文件中已经有的工料机
+            projectObj.project.ration_glj.updateRationGLJByChangeCode(recode, updateField, newval);
         } else {
         } else {
             projectObj.project.ration_glj.updateRationGLJByEdit(recode, updateField, newval);
             projectObj.project.ration_glj.updateRationGLJByEdit(recode, updateField, newval);
         }
         }
     },
     },
+    isRationGLJExit:function (connectKey) {
+        for(let rg of gljOprObj.sheetData){
+            if(rg.isMixRatio == true){
+                continue;
+            }
+            if(gljOprObj.getIndex(rg, gljKeyArray) == connectKey){//存在一样的工料机
+                return true;
+            }
+        }
+       return false;
+    },
     updateRationTypeGLJ: function (value, node, fieldName,editingText) {
     updateRationTypeGLJ: function (value, node, fieldName,editingText) {
         let newval;
         let newval;
         let updatePrice = false;
         let updatePrice = false;
@@ -965,9 +1011,12 @@ var gljOprObj = {
         var project = projectObj.project;
         var project = projectObj.project;
         gljOprObj.GLJSelection = _.filter(gljOprObj.GLJSelection, function (n) {
         gljOprObj.GLJSelection = _.filter(gljOprObj.GLJSelection, function (n) {
             var rg = _.find(gljOprObj.sheetData, function (item) {
             var rg = _.find(gljOprObj.sheetData, function (item) {
+                if(item.isMixRatio == true){
+                    return false;
+                }
                 var i_key = gljOprObj.getIndex(item, gljKeyArray);
                 var i_key = gljOprObj.getIndex(item, gljKeyArray);
                 return n == i_key
                 return n == i_key
-            })
+            });
             return rg ? false : true;
             return rg ? false : true;
         })
         })
         if (gljOprObj.GLJSelection.length > 0 && selected && selected.sourceType == ModuleNames.ration) {
         if (gljOprObj.GLJSelection.length > 0 && selected && selected.sourceType == ModuleNames.ration) {
@@ -1121,7 +1170,7 @@ var gljOprObj = {
         }
         }
         return node;
         return node;
     },
     },
-    getTreeNodeCellType: function (data) {
+    getTreeNodeCellType: function (data,index,codeMap) {
         var ns = GC.Spread.Sheets;
         var ns = GC.Spread.Sheets;
         var rectW = 10;
         var rectW = 10;
         var rectH = 10;
         var rectH = 10;
@@ -1183,7 +1232,11 @@ var gljOprObj = {
             return offset;
             return offset;
         }
         }
 
 
-        TreeNodeCellType.prototype = new ns.CellTypes.Text();
+        if(isDef(index) && data[index] && data[index].isMixRatio !==true){
+            TreeNodeCellType.prototype =  sheetCommonObj.getDynamicCombo();
+        }else {
+            TreeNodeCellType.prototype =  new ns.CellTypes.Text();
+        }
         TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
         TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
             if (value != null) {
             if (value != null) {
                 var offset = margin + rectW + 6;
                 var offset = margin + rectW + 6;
@@ -1203,17 +1256,21 @@ var gljOprObj = {
                 GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
                 GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
             }
             }
         };
         };
-        // override getHitInfo to allow cell type get mouse messages
         TreeNodeCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
         TreeNodeCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
-            return {
-                x: x,
-                y: y,
-                row: context.row,
-                col: context.col,
-                cellStyle: cellStyle,
-                cellRect: cellRect,
-                sheetArea: context.sheetArea
-            };
+            if(x < cellRect.x+cellRect.width -15){
+                return {
+                    x: x,
+                    y: y,
+                    row: context.row,
+                    col: context.col,
+                    cellStyle: cellStyle,
+                    cellRect: cellRect,
+                    sheetArea: context.sheetArea
+                };
+            }else {
+                return GC.Spread.Sheets.CellTypes.ComboBox.prototype.getHitInfo.apply(this, arguments);
+            }
+
         };
         };
         TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
         TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
             var recode = data[hitinfo.row];
             var recode = data[hitinfo.row];
@@ -1227,10 +1284,26 @@ var gljOprObj = {
                     hitinfo.sheet.getRange(hitinfo.row + 1, -1, recode.subList.length, -1).visible(!collapsed);
                     hitinfo.sheet.getRange(hitinfo.row + 1, -1, recode.subList.length, -1).visible(!collapsed);
                     hitinfo.sheet.invalidateLayout();
                     hitinfo.sheet.invalidateLayout();
                     hitinfo.sheet.repaint();
                     hitinfo.sheet.repaint();
+                    return;
                 }
                 }
             }
             }
+            GC.Spread.Sheets.CellTypes.ComboBox.prototype.processMouseDown.apply(this, arguments);
+           // GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
         };
         };
-        return new TreeNodeCellType()
+        let cellType = new TreeNodeCellType();
+        let options = [];
+        if(isDef(index) && data[index] && data[index].isMixRatio !==true){
+            let code = data[index].code;
+            if(code) {
+                let preCode = code.split("-")[0];
+                if( codeMap[preCode]) options = codeMap[preCode];
+                if(options.length>0) _.remove(options,{'value':gljOprObj.getIndex(data[index], gljKeyArray)})//去掉本身
+
+            }
+            cellType.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value);
+            cellType.itemHeight(options.length).items(options);
+        }
+        return cellType;
     },
     },
     marketPriceReadOnly: function (node) {
     marketPriceReadOnly: function (node) {
         let hasCom = false;
         let hasCom = false;
@@ -1258,8 +1331,11 @@ $(function () {
     $('#glj_tree_div').on('shown.bs.modal', function (e) {
     $('#glj_tree_div').on('shown.bs.modal', function (e) {
         if (gljOprObj.gljLibSpresd == undefined) {
         if (gljOprObj.gljLibSpresd == undefined) {
             gljOprObj.gljLibSpresd = sheetCommonObj.buildSheet($('#gljLibSheet')[0], gljOprObj.gljLibSheetSetting, gljOprObj.stdGLJ.length + gljOprObj.complementaryGLJs.length);
             gljOprObj.gljLibSpresd = sheetCommonObj.buildSheet($('#gljLibSheet')[0], gljOprObj.gljLibSheetSetting, gljOprObj.stdGLJ.length + gljOprObj.complementaryGLJs.length);
+            sheetCommonObj.spreadDefaultStyle(gljOprObj.gljLibSpresd);
             gljOprObj.gljLibSpresd.bind(GC.Spread.Sheets.Events.ButtonClicked, gljOprObj.onButtonClick);
             gljOprObj.gljLibSpresd.bind(GC.Spread.Sheets.Events.ButtonClicked, gljOprObj.onButtonClick);
             gljOprObj.gljLibSheet = gljOprObj.gljLibSpresd.getSheet(0);
             gljOprObj.gljLibSheet = gljOprObj.gljLibSpresd.getSheet(0);
+            gljOprObj.gljLibSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, gljOprObj.onSelectionChanged);
+            gljOprObj.gljLibSheet.setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
             gljOprObj.gljLibSheet.options.isProtected = true;
             gljOprObj.gljLibSheet.options.isProtected = true;
             gljOprObj.gljLibSheet.name('glj_lib');
             gljOprObj.gljLibSheet.name('glj_lib');
         }
         }
@@ -1299,6 +1375,7 @@ $(function () {
             let index = _.findIndex(gljOprObj.gljLibSheetData, {code: selected.code});
             let index = _.findIndex(gljOprObj.gljLibSheetData, {code: selected.code});
             gljOprObj.gljLibSheet.showRow(index, GC.Spread.Sheets.VerticalPosition.center);
             gljOprObj.gljLibSheet.showRow(index, GC.Spread.Sheets.VerticalPosition.center);
             gljOprObj.gljLibSheet.setActiveCell(index, 0);
             gljOprObj.gljLibSheet.setActiveCell(index, 0);
+            gljOprObj.initSelection({row: index});
             gljOprObj.gljLibSpresd.focus(true);
             gljOprObj.gljLibSpresd.focus(true);
         }
         }
         else gljOprObj.showLibGLJSheetData();
         else gljOprObj.showLibGLJSheetData();

+ 10 - 5
web/building_saas/main/js/views/installation_fee_view.js

@@ -63,11 +63,11 @@ let installationFeeObj={
             {headerName: "费用规则", headerWidth: 220, dataCode: "rule", hAlign: "left", dataType: "String",getText:'forRule'},
             {headerName: "费用规则", headerWidth: 220, dataCode: "rule", hAlign: "left", dataType: "String",getText:'forRule'},
             {headerName: "编码", headerWidth: 70, dataCode: "code", hAlign: "left", dataType: "String"},
             {headerName: "编码", headerWidth: 70, dataCode: "code", hAlign: "left", dataType: "String"},
             {headerName: "基数", headerWidth: 80, dataCode: "base", hAlign: "left", dataType: "String",cellType:'comboBox',options:installSectionBase},
             {headerName: "基数", headerWidth: 80, dataCode: "base", hAlign: "left", dataType: "String",cellType:'comboBox',options:installSectionBase},
-            {headerName: "费率(%)", headerWidth: 70, dataCode: "feeRate", hAlign: "right", dataType: "String"},
-            {headerName: "人工(%)", headerWidth: 70, dataCode: "labour", hAlign: "right", dataType: "String"},
-            {headerName: "材料(%)", headerWidth: 70, dataCode: "material", hAlign: "right", dataType: "String"},
-            {headerName: "机械(%)", headerWidth: 70, dataCode: "machine", hAlign: "right", dataType: "String"},
-            {headerName: "记取位置", headerWidth: 200, dataCode: "position", hAlign: "left", dataType: "String",cellType:'selectButton'}
+            {headerName: "费率(%)", headerWidth: 75, dataCode: "feeRate", hAlign: "right", dataType: "String"},
+            {headerName: "人工(%)", headerWidth: 75, dataCode: "labour", hAlign: "right", dataType: "String"},
+            {headerName: "材料(%)", headerWidth: 75, dataCode: "material", hAlign: "right", dataType: "String"},
+            {headerName: "机械(%)", headerWidth: 75, dataCode: "machine", hAlign: "right", dataType: "String"},
+            {headerName: "记取位置", headerWidth: 180, dataCode: "position", hAlign: "left", dataType: "String",cellType:'selectButton'}
         ],
         ],
         view: {
         view: {
             lockColumns: [0, 2]
             lockColumns: [0, 2]
@@ -234,6 +234,7 @@ let installationFeeObj={
     initInstallationFeeSpread:function(){
     initInstallationFeeSpread:function(){
         //初始化费用项表格
         //初始化费用项表格
       this.feeItemSpread = SheetDataHelper.createNewSpread($("#feeItemSheet")[0]);
       this.feeItemSpread = SheetDataHelper.createNewSpread($("#feeItemSheet")[0]);
+      sheetCommonObj.spreadDefaultStyle(this.feeItemSpread);
       this.feeItemSheet = this.feeItemSpread.getSheet(0);
       this.feeItemSheet = this.feeItemSpread.getSheet(0);
       this.initSheet(this.feeItemSheet,this.feeItemSetting);
       this.initSheet(this.feeItemSheet,this.feeItemSetting);
       this.feeItemSheet.name('feeItemSheet');
       this.feeItemSheet.name('feeItemSheet');
@@ -244,6 +245,7 @@ let installationFeeObj={
 
 
       //初始化章节项表格
       //初始化章节项表格
        this.feeDetailSpread = SheetDataHelper.createNewSpread($("#feeDetailSheet")[0]);
        this.feeDetailSpread = SheetDataHelper.createNewSpread($("#feeDetailSheet")[0]);
+       sheetCommonObj.spreadDefaultStyle(this.feeDetailSpread);
        this.feeDetailSheet = this.feeDetailSpread.getSheet(0);
        this.feeDetailSheet = this.feeDetailSpread.getSheet(0);
        this.initSheet(this.feeDetailSheet,this.feeDetailSetting);
        this.initSheet(this.feeDetailSheet,this.feeDetailSetting);
        this.feeDetailSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onFeeDetailSelectionChange);
        this.feeDetailSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onFeeDetailSelectionChange);
@@ -567,6 +569,7 @@ let installationFeeObj={
     },
     },
     initPositionSpread:function () {
     initPositionSpread:function () {
         this.positionSpread = SheetDataHelper.createNewSpread($('#positionSpread')[0]);
         this.positionSpread = SheetDataHelper.createNewSpread($('#positionSpread')[0]);
+        sheetCommonObj.spreadDefaultStyle(this.positionSpread);
         this.selectionTree = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1, autoUpdate: false});
         this.selectionTree = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1, autoUpdate: false});
         this.selectionTreeController = TREE_SHEET_CONTROLLER.createNew(this.selectionTree, this.positionSpread.getActiveSheet(), this.positionSetting);
         this.selectionTreeController = TREE_SHEET_CONTROLLER.createNew(this.selectionTree, this.positionSpread.getActiveSheet(), this.positionSetting);
         this.positionSheet = this.positionSpread.getActiveSheet();
         this.positionSheet = this.positionSpread.getActiveSheet();
@@ -574,6 +577,7 @@ let installationFeeObj={
     },
     },
     initMoreFeeRuleSpread:function () {
     initMoreFeeRuleSpread:function () {
         this.moreFeeRuleSpread = SheetDataHelper.createNewSpread($("#moreFeeRuleSpread")[0]);
         this.moreFeeRuleSpread = SheetDataHelper.createNewSpread($("#moreFeeRuleSpread")[0]);
+        sheetCommonObj.spreadDefaultStyle(this.moreFeeRuleSpread);
         this.moreFeeRuleSheet = this.moreFeeRuleSpread.getSheet(0);
         this.moreFeeRuleSheet = this.moreFeeRuleSpread.getSheet(0);
         this.initSheet(this.moreFeeRuleSheet,this.moreFeeRuleSetting);
         this.initSheet(this.moreFeeRuleSheet,this.moreFeeRuleSetting);
         this.moreFeeRuleSheet.bind(GC.Spread.Sheets.Events.CellDoubleClick, this.onFeeRuleDoubleClick);
         this.moreFeeRuleSheet.bind(GC.Spread.Sheets.Events.CellDoubleClick, this.onFeeRuleDoubleClick);
@@ -583,6 +587,7 @@ let installationFeeObj={
     initModifyFeeRuleSpread:function () {
     initModifyFeeRuleSpread:function () {
         let me = this;
         let me = this;
         me.modifyFeeRuleSpread = SheetDataHelper.createNewSpread($("#modifyFeeRuleSpread")[0]);
         me.modifyFeeRuleSpread = SheetDataHelper.createNewSpread($("#modifyFeeRuleSpread")[0]);
+        sheetCommonObj.spreadDefaultStyle(me.modifyFeeRuleSpread);
         me.modifyFeeRuleSheet = me.modifyFeeRuleSpread.getSheet(0);
         me.modifyFeeRuleSheet = me.modifyFeeRuleSpread.getSheet(0);
         me.initSheet(me.modifyFeeRuleSheet, me.modifyFeeRuleSetting);
         me.initSheet(me.modifyFeeRuleSheet, me.modifyFeeRuleSetting);
         this.modifyFeeRuleSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, this.onPositionButtonClick);
         this.modifyFeeRuleSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, this.onPositionButtonClick);

+ 8 - 9
web/building_saas/main/js/views/main_tree_col.js

@@ -394,14 +394,15 @@ let colSettingObj = {
         sheet.getRange(-1, 0, -1, 1).cellType(this.checkBox).hAlign(GC.Spread.Sheets.HorizontalAlign.center);
         sheet.getRange(-1, 0, -1, 1).cellType(this.checkBox).hAlign(GC.Spread.Sheets.HorizontalAlign.center);
         sheet.getCell(0, 0, GC.Spread.Sheets.SheetArea.colHeader).value('显示');
         sheet.getCell(0, 0, GC.Spread.Sheets.SheetArea.colHeader).value('显示');
         sheet.setColumnWidth(0, 100);
         sheet.setColumnWidth(0, 100);
-        sheet.setColumnWidth(0, 150, GC.Spread.Sheets.SheetArea.rowHeader);
+        sheet.setColumnWidth(0, 240, GC.Spread.Sheets.SheetArea.rowHeader);
 
 
         setting.cols.forEach(function (col, index) {
         setting.cols.forEach(function (col, index) {
             let i, iCol = 0, cell;
             let i, iCol = 0, cell;
             for (i = 0; i < col.head.spanCols.length; i++) {
             for (i = 0; i < col.head.spanCols.length; i++) {
                 if (col.head.spanCols[i] !== 0) {
                 if (col.head.spanCols[i] !== 0) {
                     cell = sheet.getCell(index, iCol, GC.Spread.Sheets.SheetArea.rowHeader);
                     cell = sheet.getCell(index, iCol, GC.Spread.Sheets.SheetArea.rowHeader);
-                    cell.value(col.head.titleNames[i]).font(col.head.font).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]);
+                    cell.value(col.head.titleNames[i]).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]);
+                    //cell.value(col.head.titleNames[i]).font(col.head.font).hAlign(col.head.hAlign[i]).vAlign(col.head.vAlign[i]);
                 }
                 }
                 if (col.head.spanCols[i] > 1 || col.head.spanRows[i] > 1) {
                 if (col.head.spanCols[i] > 1 || col.head.spanRows[i] > 1) {
                     sheet.addSpan(index, iCol, col.head.spanRows[i], col.head.spanCols[i], GC.Spread.Sheets.SheetArea.rowHeader);
                     sheet.addSpan(index, iCol, col.head.spanRows[i], col.head.spanCols[i], GC.Spread.Sheets.SheetArea.rowHeader);
@@ -419,6 +420,7 @@ let colSettingObj = {
     },
     },
     initSettingSpread: function () {
     initSettingSpread: function () {
         this.settingSpread = SheetDataHelper.createNewSpread($('#col_setting_spread')[0], {sheetCount: 1});
         this.settingSpread = SheetDataHelper.createNewSpread($('#col_setting_spread')[0], {sheetCount: 1});
+        sheetCommonObj.spreadDefaultStyle(this.settingSpread);
         this.settingSpread.options.showScrollTip = GC.Spread.Sheets.ShowScrollTip.vertical;
         this.settingSpread.options.showScrollTip = GC.Spread.Sheets.ShowScrollTip.vertical;
         this.settingSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, function (sender, args) {
         this.settingSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, function (sender, args) {
             if(args.sheet.isEditing()){
             if(args.sheet.isEditing()){
@@ -516,14 +518,12 @@ function switchTznrHtml(show) {
         return;
         return;
     }
     }
     if(show){
     if(show){
-        let newHmtl = $('#switchTznr').html().replace('隐藏', '显示');
-        $('#switchTznr').html(newHmtl);
+        $('#switchTznr').prop('title', '显示特征');
         $('#switchTznr').find('i').removeClass('fa-eye-slash');
         $('#switchTznr').find('i').removeClass('fa-eye-slash');
         $('#switchTznr').find('i').addClass('fa-eye');
         $('#switchTznr').find('i').addClass('fa-eye');
     }
     }
     else {
     else {
-        let newHmtl = $('#switchTznr').html().replace('显示', '隐藏');
-        $('#switchTznr').html(newHmtl);
+        $('#switchTznr').prop('title', '隐藏特征');
         $('#switchTznr').find('i').removeClass('fa-eye');
         $('#switchTznr').find('i').removeClass('fa-eye');
         $('#switchTznr').find('i').addClass('fa-eye-slash');
         $('#switchTznr').find('i').addClass('fa-eye-slash');
     }
     }
@@ -531,17 +531,16 @@ function switchTznrHtml(show) {
 
 
 $('#switchTznr').click(function () {
 $('#switchTznr').click(function () {
     let me = colSettingObj;
     let me = colSettingObj;
-    let cur = $(this).text();
+    let cur = $(this).prop('title');
+    //$("[data-toggle='tooltip']").tooltip('hide');
     if(cur.includes('显示特征')){
     if(cur.includes('显示特征')){
         switchTznrHtml(false);
         switchTznrHtml(false);
         me.setVisible('itemCharacterText', true);
         me.setVisible('itemCharacterText', true);
-        //me.setVisible('jobContentText', true);
         me.updateColSetting(true);
         me.updateColSetting(true);
     }
     }
     else {
     else {
         switchTznrHtml(true);
         switchTznrHtml(true);
         me.setVisible('itemCharacterText', false);
         me.setVisible('itemCharacterText', false);
-        //me.setVisible('jobContentText', false);
         me.updateColSetting(true);
         me.updateColSetting(true);
     }
     }
 });
 });

+ 18 - 63
web/building_saas/main/js/views/options_view.js

@@ -13,7 +13,7 @@ let optionsOprObj = {
             let gOpts = me.options[me.optionsTypes.GENERALOPTS];
             let gOpts = me.options[me.optionsTypes.GENERALOPTS];
             if(isDef(gOpts)){
             if(isDef(gOpts)){
                 for(let attr in gOpts){
                 for(let attr in gOpts){
-                    me[attr][0].checked = gOpts[attr];
+                    me[attr].prop('checked', gOpts[attr]);
                 }
                 }
             }
             }
         });
         });
@@ -44,78 +44,33 @@ let optionsOprObj = {
                     ? true
                     ? true
                 : null;
                 : null;
         }
         }
+    },
+    needToSaveGeneralOpts: function () {
+        let v1 = this.rationQuanACToBillsQuan.prop('checked');
+        let v2 = this.rationQuanACToRationUnit.prop('checked');
+        let orgV1 = this.getOption(this.optionsTypes.GENERALOPTS, 'rationQuanACToBillsQuan');
+        let orgV2 = this.getOption(this.optionsTypes.GENERALOPTS, 'rationQuanACToRationUnit');
+        return v1 !== orgV1 || v2 !== orgV2;
     }
     }
 };
 };
 
 
 optionsOprObj.getOptions();
 optionsOprObj.getOptions();
-optionsOprObj.rationQuanACToBillsQuan.click(function () {
-    let value = this.checked;
-    optionsOprObj.updateOptions(optionsOprObj.options, {type: optionsOprObj.optionsTypes.GENERALOPTS, opt: 'rationQuanACToBillsQuan', value: value});
-    optionsOprObj.saveOptions(optionsOprObj.optionsTypes.GENERALOPTS, optionsOprObj.getOptsByType(optionsOprObj.options, optionsOprObj.optionsTypes.GENERALOPTS));
-});
-optionsOprObj.rationQuanACToRationUnit.click(function () {
-    let value = this.checked;
-    optionsOprObj.updateOptions(optionsOprObj.options, {type: optionsOprObj.optionsTypes.GENERALOPTS, opt: 'rationQuanACToRationUnit', value: value});
-    optionsOprObj.saveOptions(optionsOprObj.optionsTypes.GENERALOPTS, optionsOprObj.getOptsByType(optionsOprObj.options, optionsOprObj.optionsTypes.GENERALOPTS));
-});
-
 
 
+$('#poj-set').on('shown.bs.modal', function () {
+    let orgV1 = optionsOprObj.getOption(optionsOprObj.optionsTypes.GENERALOPTS, 'rationQuanACToBillsQuan');
+    let orgV2 = optionsOprObj.getOption(optionsOprObj.optionsTypes.GENERALOPTS, 'rationQuanACToRationUnit');
+    optionsOprObj.rationQuanACToBillsQuan.prop('checked', orgV1);
+    optionsOprObj.rationQuanACToRationUnit.prop('checked', orgV2);
 
 
-/*let optionsOprObj = {
-    options: null,
-    optionsTypes: {GENERALOPTS: 'GENERALOPTS'},
-    rationQuanACToBillsQuan: $('#generalOpts1'),
-    rationQuanACToRationUnit: $('#generalOpts2'),
-    getOptions: function () {
-        let me = this;
-        CommonAjax.post('/options/getOptions', [], function (rstData) {
-            me.options = rstData;
-            for(let i = 0, len = me.options.length; i < len; i++){
-                let optsType = me.options[i].type,
-                    opts = me.options[i].opts;
-                if(optsType === me.optionsTypes.GENERALOPTS){
-                    for(let attr in opts){
-                        me[attr][0].checked = opts[attr];
-                    }
-                }
-            }
-        });
-    },
-    saveOptions: function (optsType, opts) {
-        CommonAjax.post('/options/saveOptions', {optsType: optsType, opts: opts});
-    },
-    //更新optionsOprObj对象options数据
-    updateOptions: function (options, updateObj) {
-        for(let i = 0, len = options.length; i < len; i++){
-            if(options[i].type === updateObj.type){
-                options[i].opts[updateObj.opt] = updateObj.value;
-                break;
-            }
-        }
-    },
-    getOptsByType: function (options, type) {
-        let rst = null;
-        for(let i = 0, len = options.length; i < len; i++){
-            if(options[i].type === type){
-                rst = options[i].opts;
-            }
-        }
-        return rst;
-    },
-    getOption: function (type, optionName) {
-        let opts = this.getOptsByType(this.options, type);
-        return opts[optionName];
-    }
-};
-
-optionsOprObj.getOptions();
-optionsOprObj.rationQuanACToBillsQuan.click(function () {
-    let value = this.checked;
+});
+//选项移到了项目属性的系统选项中
+/*optionsOprObj.rationQuanACToBillsQuan.click(function () {
+    let value = optionsOprObj.rationQuanACToBillsQuan.checked;
     optionsOprObj.updateOptions(optionsOprObj.options, {type: optionsOprObj.optionsTypes.GENERALOPTS, opt: 'rationQuanACToBillsQuan', value: value});
     optionsOprObj.updateOptions(optionsOprObj.options, {type: optionsOprObj.optionsTypes.GENERALOPTS, opt: 'rationQuanACToBillsQuan', value: value});
     optionsOprObj.saveOptions(optionsOprObj.optionsTypes.GENERALOPTS, optionsOprObj.getOptsByType(optionsOprObj.options, optionsOprObj.optionsTypes.GENERALOPTS));
     optionsOprObj.saveOptions(optionsOprObj.optionsTypes.GENERALOPTS, optionsOprObj.getOptsByType(optionsOprObj.options, optionsOprObj.optionsTypes.GENERALOPTS));
 });
 });
 optionsOprObj.rationQuanACToRationUnit.click(function () {
 optionsOprObj.rationQuanACToRationUnit.click(function () {
-    let value = this.checked;
+    let value = optionsOprObj.rationQuanACToRationUnit.checked;
     optionsOprObj.updateOptions(optionsOprObj.options, {type: optionsOprObj.optionsTypes.GENERALOPTS, opt: 'rationQuanACToRationUnit', value: value});
     optionsOprObj.updateOptions(optionsOprObj.options, {type: optionsOprObj.optionsTypes.GENERALOPTS, opt: 'rationQuanACToRationUnit', value: value});
     optionsOprObj.saveOptions(optionsOprObj.optionsTypes.GENERALOPTS, optionsOprObj.getOptsByType(optionsOprObj.options, optionsOprObj.optionsTypes.GENERALOPTS));
     optionsOprObj.saveOptions(optionsOprObj.optionsTypes.GENERALOPTS, optionsOprObj.getOptsByType(optionsOprObj.options, optionsOprObj.optionsTypes.GENERALOPTS));
 });*/
 });*/

+ 7 - 5
web/building_saas/main/js/views/project_glj_view.js

@@ -24,15 +24,15 @@ projectGljObject={
     materialSetting:{
     materialSetting:{
         header:[
         header:[
             {headerName: "编码", headerWidth: 200, dataCode: "code", dataType: "String"},
             {headerName: "编码", headerWidth: 200, dataCode: "code", dataType: "String"},
-            {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String"},
-            {headerName: "规格型号", headerWidth: 120, dataCode: "specs", hAlign: "left", dataType: "String"},
+            {headerName: "名称", headerWidth: 240, dataCode: "name", dataType: "String"},
+            {headerName: "规格型号", headerWidth: 190, dataCode: "specs", hAlign: "left", dataType: "String"},
             {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
             {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
             {headerName: "定额价", headerWidth: 70, dataCode: "basePrice", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:'glj.unitPrice'
             {headerName: "定额价", headerWidth: 70, dataCode: "basePrice", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:'glj.unitPrice'
             {headerName: "市场价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:"glj.unitPrice"
             {headerName: "市场价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:"glj.unitPrice"
-            {headerName: "总消耗量", headerWidth: 100, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
-            {headerName: "三材系数", headerWidth: 100, dataCode: "materialCoe", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:'material'
+            {headerName: "总消耗量", headerWidth: 70, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
+            {headerName: "三材系数", headerWidth: 70, dataCode: "materialCoe", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:'material'
             {headerName: "三材量", headerWidth: 100, dataCode: "materialQuantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
             {headerName: "三材量", headerWidth: 100, dataCode: "materialQuantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
-            {headerName: "三材类别", headerWidth: 80, dataCode: "materialType", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:materialComboMap}
+            {headerName: "三材类别", headerWidth: 70, dataCode: "materialType", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:materialComboMap}
         ],
         ],
         view: {
         view: {
             lockColumns: [0,1,2,3,6,8]
             lockColumns: [0,1,2,3,6,8]
@@ -46,6 +46,7 @@ projectGljObject={
     initProjectGljSpread:function () {
     initProjectGljSpread:function () {
         if(!this.projectGljSpread){
         if(!this.projectGljSpread){
             this.projectGljSpread = SheetDataHelper.createNewSpread($("#project_glj_sheet")[0],2);
             this.projectGljSpread = SheetDataHelper.createNewSpread($("#project_glj_sheet")[0],2);
+            sheetCommonObj.spreadDefaultStyle(this.projectGljSpread);
         }
         }
         this.projectGljSpread.bind(GC.Spread.Sheets.Events.RangeChanged, this.onProjectGljRangeChange);
         this.projectGljSpread.bind(GC.Spread.Sheets.Events.RangeChanged, this.onProjectGljRangeChange);
         this.initProjectGljSheet();
         this.initProjectGljSheet();
@@ -80,6 +81,7 @@ projectGljObject={
     },
     },
     initMixRatioSpread:function () {
     initMixRatioSpread:function () {
         this.mixRatioSpread = SheetDataHelper.createNewSpread($("#mix_ratio_sheet")[0]);
         this.mixRatioSpread = SheetDataHelper.createNewSpread($("#mix_ratio_sheet")[0]);
+        sheetCommonObj.spreadDefaultStyle(this.mixRatioSpread);
         this.mixRatioSheet = this.mixRatioSpread .getSheet(0);
         this.mixRatioSheet = this.mixRatioSpread .getSheet(0);
         this.initSheet(this.mixRatioSheet,this.mixRatioSetting);
         this.initSheet(this.mixRatioSheet,this.mixRatioSetting);
         this.mixRatioSheet.name('mixRatioSheet');
         this.mixRatioSheet.name('mixRatioSheet');

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

@@ -21,7 +21,9 @@ var projectInfoObj = {
                 }
                 }
             }
             }
              */
              */
-            fullPath.push('<span class="text-truncate" data-toggle="tooltip" data-placement="bottom" title="' + proj.name + '"><i class="fa fa-sticky-note-o"></i> ' + proj.name + '</span>');
+            let newHtml = `<span><i class="fa fa-sticky-note-o"></i></span>
+                <span class="" data-placement="bottom" title="${proj.fullPath}"> <span class="text-truncate float-right">&nbsp;${proj.name}</span></span>`
+            fullPath.push(newHtml);
 
 
         }
         }
         return fullPath.join('');
         return fullPath.join('');
@@ -39,10 +41,9 @@ var projectInfoObj = {
                 setDecimal(decimalObj, data.property.decimal);
                 setDecimal(decimalObj, data.property.decimal);
                 billsQuanDecimal.datas = data.property.billsQuantityDecimal || [billsDecimalView.angleDecimal];
                 billsQuanDecimal.datas = data.property.billsQuantityDecimal || [billsDecimalView.angleDecimal];
                 basicInfoView.orgDatas = data.property.basicInformation ? basicInfoView.toViewDatas(data.property.basicInformation) : [];
                 basicInfoView.orgDatas = data.property.basicInformation ? basicInfoView.toViewDatas(data.property.basicInformation) : [];
-                console.log(data.property.basicInformation);
-                console.log(basicInfoView.orgDatas);
                 projFeatureView.orgDatas = data.property.projectFeature ? projFeatureView.toViewDatas(data.property.projectFeature) : [];
                 projFeatureView.orgDatas = data.property.projectFeature ? projFeatureView.toViewDatas(data.property.projectFeature) : [];
                 $('#fullpath').html(that.getFullPathHtml(that.projectInfo));
                 $('#fullpath').html(that.getFullPathHtml(that.projectInfo));
+                //$("[data-toggle='tooltip']").tooltip();
             }
             }
         });
         });
     }
     }

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

@@ -8,7 +8,7 @@ let basicInfoView = {
     setting:{
     setting:{
         header: [
         header: [
             {name: '属性', dataCode: 'dispName', width: 200, vAlign: 'center', hAlign: 'left'},
             {name: '属性', dataCode: 'dispName', width: 200, vAlign: 'center', hAlign: 'left'},
-            {name: '值', dataCode: 'value', width: 120, vAlign: 'center', hAlign: 'left'}
+            {name: '值', dataCode: 'value', width: 300, vAlign: 'center', hAlign: 'left'}
         ],
         ],
         options: {
         options: {
             allowContextMenu: false,
             allowContextMenu: false,
@@ -78,6 +78,7 @@ let basicInfoView = {
     buildSheet: function () {
     buildSheet: function () {
         if(!this.workBook){
         if(!this.workBook){
             this.workBook = new GC.Spread.Sheets.Workbook($('#basicInfoSpread')[0], {sheetCount: 1});
             this.workBook = new GC.Spread.Sheets.Workbook($('#basicInfoSpread')[0], {sheetCount: 1});
+            sheetCommonObj.spreadDefaultStyle(this.workBook);
             sheetCommonObj.bindEscKey(this.workBook, [{sheet: this.workBook.getSheet(0), editStarting: this.onEditStarting, editEnded: this.onEditEnded}]);
             sheetCommonObj.bindEscKey(this.workBook, [{sheet: this.workBook.getSheet(0), editStarting: this.onEditStarting, editEnded: this.onEditEnded}]);
             this.setOptions(this.workBook, this.setting.options);
             this.setOptions(this.workBook, this.setting.options);
             this.buildHeader(this.workBook.getActiveSheet(), this.setting.header);
             this.buildHeader(this.workBook.getActiveSheet(), this.setting.header);

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

@@ -85,6 +85,7 @@ let billsDecimalView = {
     buildSheet: function () {
     buildSheet: function () {
         if(!this.workBook){
         if(!this.workBook){
             this.workBook = new GC.Spread.Sheets.Workbook($('#billsQuanDecimal')[0], {sheetCount: 1});
             this.workBook = new GC.Spread.Sheets.Workbook($('#billsQuanDecimal')[0], {sheetCount: 1});
+            sheetCommonObj.spreadDefaultStyle(this.workBook);
             this.setOptions(this.workBook, this.setting.options);
             this.setOptions(this.workBook, this.setting.options);
             this.buildHeader(this.workBook.getActiveSheet(), this.setting.header);
             this.buildHeader(this.workBook.getActiveSheet(), this.setting.header);
             this.bindEvent(this.workBook);
             this.bindEvent(this.workBook);

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

@@ -53,6 +53,7 @@ let indicativeInfoObj = {
     buildSheet: function () {
     buildSheet: function () {
         if(!this.workBook){
         if(!this.workBook){
             this.workBook = new GC.Spread.Sheets.Workbook($('#indicativeInfoSpread')[0], {sheetCount: 1});
             this.workBook = new GC.Spread.Sheets.Workbook($('#indicativeInfoSpread')[0], {sheetCount: 1});
+            sheetCommonObj.spreadDefaultStyle(this.workBook);
             this.setOptions(this.workBook, this.setting.options);
             this.setOptions(this.workBook, this.setting.options);
             this.workBook.getSheet(0).options.isProtected = true;
             this.workBook.getSheet(0).options.isProtected = true;
             this.buildHeader(this.workBook.getActiveSheet(), this.setting.header);
             this.buildHeader(this.workBook.getActiveSheet(), this.setting.header);

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

@@ -9,7 +9,7 @@ let projFeatureView = {
     setting:{
     setting:{
         header: [
         header: [
             {name: '属性', dataCode: 'dispName', width: 200, vAlign: 'center', hAlign: 'left'},
             {name: '属性', dataCode: 'dispName', width: 200, vAlign: 'center', hAlign: 'left'},
-            {name: '值', dataCode: 'value', width: 120, vAlign: 'center', hAlign: 'center'}
+            {name: '值', dataCode: 'value', width: 300, vAlign: 'center', hAlign: 'left'}
         ],
         ],
         options: {
         options: {
             allowContextMenu: false,
             allowContextMenu: false,
@@ -81,6 +81,7 @@ let projFeatureView = {
     buildSheet: function () {
     buildSheet: function () {
         if(!this.workBook){
         if(!this.workBook){
             this.workBook = new GC.Spread.Sheets.Workbook($('#projFeatureSpread')[0], {sheetCount: 1});
             this.workBook = new GC.Spread.Sheets.Workbook($('#projFeatureSpread')[0], {sheetCount: 1});
+            sheetCommonObj.spreadDefaultStyle(this.workBook);
             sheetCommonObj.bindEscKey(this.workBook, [{sheet: this.workBook.getSheet(0), editStarting: this.onEditStarting, editEnded: this.onEditEnded}]);
             sheetCommonObj.bindEscKey(this.workBook, [{sheet: this.workBook.getSheet(0), editStarting: this.onEditStarting, editEnded: this.onEditEnded}]);
             this.setOptions(this.workBook, this.setting.options);
             this.setOptions(this.workBook, this.setting.options);
             this.buildHeader(this.workBook.getActiveSheet(), this.setting.header);
             this.buildHeader(this.workBook.getActiveSheet(), this.setting.header);

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

@@ -524,9 +524,9 @@ var projectObj = {
         let node = project.mainTree.items[info.row];
         let node = project.mainTree.items[info.row];
         let fieldName = projectObj.mainController.setting.cols[info.col].data.field;
         let fieldName = projectObj.mainController.setting.cols[info.col].data.field;
         let value = info.sheet.getValue(info.row, info.col);
         let value = info.sheet.getValue(info.row, info.col);
-        if(fieldName === 'code' && node && calcTools.isRationItem(node) && isDef(node.data.code)){
+        if(fieldName === 'code' && node && calcTools.isRationItem(node) && isDef(node.data.code)&&isDef(value)){
             if (isDef(node.data.prefix) && node.data.prefix !== rationPrefix.none){
             if (isDef(node.data.prefix) && node.data.prefix !== rationPrefix.none){
-                value = value.replace(new RegExp(node.data.prefix), '');
+                 value = value.replace(new RegExp(node.data.prefix), '');
             };
             };
             value = value.replace(new RegExp(rationPrefix.replace), '');
             value = value.replace(new RegExp(rationPrefix.replace), '');
             info.sheet.setValue(info.row, info.col, value);
             info.sheet.setValue(info.row, info.col, value);
@@ -545,6 +545,22 @@ var projectObj = {
                 return;
                 return;
             }
             }
         }
         }
+        if(fieldName == 'code' && node){
+            projectObj.showBillOrRationLib(node)
+        }
+
+    },
+    showBillOrRationLib(node){
+        let BILLS = projectObj.project.Bills;
+        if(node.sourceType == ModuleNames.bills){//当清单是“分部分项工程”、“措施项目工程”时,要展开清单规则节点
+            if(BILLS.isFXorBX(node)||(node.data.type == billType.BILL && BILLS.isMeasure(node))){//是分项或补项,是清单并且属于措施项目节点
+                if(!$("#qd").is(":visible"))  $('#stdBillsTab').click();
+            }
+        }
+        if(node.sourceType == ModuleNames.ration){ //在定额编码中双击,如果右侧定额库没有展开,则自动展开。
+            if(!$("#de").is(":visible"))  $('#stdRationTab').click();
+        }
+
     },
     },
     onColumnWidthChanged: function (sender, info) {         // CSL,2018.07.25
     onColumnWidthChanged: function (sender, info) {         // CSL,2018.07.25
         if (info.colList.includes(4) || info.colList.includes(5)){
         if (info.colList.includes(4) || info.colList.includes(5)){
@@ -713,7 +729,7 @@ var projectObj = {
                 let node = project.mainTree.items[changedCell.row];
                 let node = project.mainTree.items[changedCell.row];
                 let colSetting = setting.cols[changedCell.col];
                 let colSetting = setting.cols[changedCell.col];
                 let value = projectObj.checkSpreadEditingText(changedCell.text, colSetting)
                 let value = projectObj.checkSpreadEditingText(changedCell.text, colSetting)
-                if(colSetting.data.field=='code' && value != '' && node.sourceType == project.Ration.getSourceType()&&node.data.type==rationType.ration){//如果是更新定额的编码
+                if(colSetting.data.field=='code' && node.sourceType == project.Ration.getSourceType()&&node.data.type==rationType.ration){//如果是更新定额的编码
                     updateRationCodes.push({'node':node,value:value});
                     updateRationCodes.push({'node':node,value:value});
                 }else {
                 }else {
                     projectObj.updateCellValue(node, value, colSetting,changedCell.text);
                     projectObj.updateCellValue(node, value, colSetting,changedCell.text);
@@ -730,6 +746,7 @@ var projectObj = {
     checkMainSpread: function () {
     checkMainSpread: function () {
         if (!this.mainSpread) {
         if (!this.mainSpread) {
             this.mainSpread = SheetDataHelper.createNewSpread($('#billsSpread')[0]);
             this.mainSpread = SheetDataHelper.createNewSpread($('#billsSpread')[0]);
+            sheetCommonObj.spreadDefaultStyle(this.mainSpread);
             this.mainSpread.getActiveSheet().selectionPolicy(GC.Spread.Sheets.SelectionPolicy.muliRange);
             this.mainSpread.getActiveSheet().selectionPolicy(GC.Spread.Sheets.SelectionPolicy.muliRange);
             this.mainSpread.getActiveSheet().name('mainSheet');
             this.mainSpread.getActiveSheet().name('mainSheet');
             this.mainSpread.getActiveSheet().options.isProtected = true;
             this.mainSpread.getActiveSheet().options.isProtected = true;
@@ -750,10 +767,10 @@ var projectObj = {
             let mTime = +new Date();
             let mTime = +new Date();
             console.log(`get data时间——${mTime - startTime}`);
             console.log(`get data时间——${mTime - startTime}`);
             //快速列设置
             //快速列设置
-            if(!colSettingObj.getVisible('itemCharacterText') && !colSettingObj.getVisible('jobContentText')){
+            if(!colSettingObj.getVisible('itemCharacterText')){
                 switchTznrHtml(true);
                 switchTznrHtml(true);
             }
             }
-            if(colSettingObj.getVisible('itemCharacterText') && colSettingObj.getVisible('jobContentText')){
+            if(colSettingObj.getVisible('itemCharacterText')){
                 switchTznrHtml(false);
                 switchTznrHtml(false);
             }
             }
             if (!err) {
             if (!err) {
@@ -990,7 +1007,7 @@ var projectObj = {
                             newCol = codeCol;
                             newCol = codeCol;
                         }
                         }
                         sheet.setActiveCell(newRow, newCol);
                         sheet.setActiveCell(newRow, newCol);
-                    });
+                    }, true);
                 }
                 }
                 //如果其后有定额空行,焦点跳动至定额空行的编码单元格
                 //如果其后有定额空行,焦点跳动至定额空行的编码单元格
                 else if(nextSibling && !(isDef(nextSibling.data.code) && nextSibling.data.code.toString().trim() !== '')) {
                 else if(nextSibling && !(isDef(nextSibling.data.code) && nextSibling.data.code.toString().trim() !== '')) {
@@ -1364,6 +1381,7 @@ var projectObj = {
         const sheet = this.mainSpread.getActiveSheet();
         const sheet = this.mainSpread.getActiveSheet();
         sheet.setSelection(row, col, 1, 1);
         sheet.setSelection(row, col, 1, 1);
         this.mainController.setTreeSelected(this.mainController.tree.items[row]);//触发树节点选中事件
         this.mainController.setTreeSelected(this.mainController.tree.items[row]);//触发树节点选中事件
+        sheet.showRow(row, GC.Spread.Sheets.VerticalPosition.center);
     },
     },
     // 选中区域合计数字
     // 选中区域合计数字
     amountAreaNumber: function(e, info) {
     amountAreaNumber: function(e, info) {
@@ -1562,7 +1580,6 @@ var projectObj = {
         node.changed = true;
         node.changed = true;
         projectObj.project.calcProgram.calcAndSave(node);
         projectObj.project.calcProgram.calcAndSave(node);
     },
     },
-
     //根据节点获取行style(颜色、字体加粗)
     //根据节点获取行style(颜色、字体加粗)
     getNodeColorStyle: function (sheet, node, tree) {
     getNodeColorStyle: function (sheet, node, tree) {
         let colorSetting = optionsOprObj.getOption(optionsOprObj.optionsTypes.COLOROPTS);
         let colorSetting = optionsOprObj.getOption(optionsOprObj.optionsTypes.COLOROPTS);
@@ -1655,6 +1672,10 @@ var projectObj = {
         if(node === tree.selected){
         if(node === tree.selected){
              style.backColor = colorSetting[mapping.SELECTED]['backColor'];
              style.backColor = colorSetting[mapping.SELECTED]['backColor'];
         }
         }
+        //大项费用加粗(数字与中文字符大小不一问题由字体造成,暂时不考虑分别设置大小)
+       /* if(node.sourceType === this.project.Bills.getSourceType() && node.data.type === billType.DXFY){
+            style.font = 'bold 0.9rem Arial';
+        }*/
         style.borderLeft = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
         style.borderLeft = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
         style.borderTop = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
         style.borderTop = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
         style.borderRight = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
         style.borderRight = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
@@ -1681,13 +1702,13 @@ var projectObj = {
             'programID',
             'programID',
             'ruleText'
             'ruleText'
         ];
         ];
-
-        if(stringFields.indexOf(colSetting.data.field) > 0){
-            style.font = 'bold 15px Arial';
+        style.font = 'bold 0.9rem Arial';
+        /*if(stringFields.indexOf(colSetting.data.field) > 0){
+            style.font = 'bold 0.9rem Arial';
         }
         }
         else {
         else {
             style.font = 'bold 13px Arial';
             style.font = 'bold 13px Arial';
-        }
+        }*/
         return style;
         return style;
     },
     },
    //设置节点style
    //设置节点style
@@ -1705,10 +1726,10 @@ var projectObj = {
     loadLockBillsButton:function () {
     loadLockBillsButton:function () {
         if(projectInfoObj.projectInfo.property.lockBills == true){
         if(projectInfoObj.projectInfo.property.lockBills == true){
             $("a[name='lockBills']").prop("title","解锁清单");
             $("a[name='lockBills']").prop("title","解锁清单");
-            $("a[name='lockBills']").html('<i class="fa fa-unlock-alt" aria-hidden="true"></i> 解锁清单');
+            $("a[name='lockBills']").html('<i class="fa fa-unlock-alt" aria-hidden="true"></i>');
         }else {
         }else {
             $("a[name='lockBills']").prop("title","锁定清单");
             $("a[name='lockBills']").prop("title","锁定清单");
-            $("a[name='lockBills']").html('<i class="fa fa-lock" aria-hidden="true"></i> 锁定清单');
+            $("a[name='lockBills']").html('<i class="fa fa-lock" aria-hidden="true"></i>');
         }
         }
     },
     },
     editContent:function (node,fieldID) {//右键编辑工程内容、服务内容、签证及索赔依据
     editContent:function (node,fieldID) {//右键编辑工程内容、服务内容、签证及索赔依据
@@ -1826,7 +1847,7 @@ $('#downMove').click(function () {
         };
         };
     }
     }
 });
 });
-$("a[name='lockBills']").click(function () {//
+$("a[name='lockBills']").click(function () {//点击锁定/解锁清单
     let lockBills = projectInfoObj.projectInfo.property.lockBills;
     let lockBills = projectInfoObj.projectInfo.property.lockBills;
     lockBills = !lockBills;
     lockBills = !lockBills;
     projectObj.project.updateLockBills(lockBills,function () {
     projectObj.project.updateLockBills(lockBills,function () {
@@ -1839,21 +1860,13 @@ $("a[name='lockBills']").click(function () {//
         if(!projectReadOnly){
         if(!projectReadOnly){
             pageCCOprObj.refreshRuleTools(lockBills);
             pageCCOprObj.refreshRuleTools(lockBills);
         }
         }
+        //$("[data-toggle='tooltip']").tooltip('hide'); bs 与 jqueryUI冲突
     });
     });
 });
 });
 $('#ZLFB_btn').click(function () {
 $('#ZLFB_btn').click(function () {
     zlfb_object.getSectionInfo();
     zlfb_object.getSectionInfo();
 });
 });
 
 
-//工料机库
-$('#compleGljLib').click(function () {
-    let newTab = window.open('about:blank');
-    let newHref = '/complementaryGlj';
-    CommonAjax.get(newHref, [], function () {
-        newTab.location.href = newHref;
-    });
-});
-
 //显示至..
 //显示至..
 let displayLevel = function(nodes, depth, type){
 let displayLevel = function(nodes, depth, type){
     let refreshNodes = [];
     let refreshNodes = [];
@@ -1992,6 +2005,7 @@ $('#property_ok').click(function () {
         projectID = project.ID(),
         projectID = project.ID(),
 
 
         properties = {},
         properties = {},
+        options = {},
         labourCoes = {},
         labourCoes = {},
         rations = [],
         rations = [],
         bills = [],
         bills = [],
@@ -2000,6 +2014,7 @@ $('#property_ok').click(function () {
             projectID: projectID,
             projectID: projectID,
             updateType: 'update',
             updateType: 'update',
             properties: properties,
             properties: properties,
+            options: options,
             labourCoes: labourCoes,
             labourCoes: labourCoes,
             rations: rations,
             rations: rations,
             bills: bills
             bills: bills
@@ -2059,6 +2074,15 @@ $('#property_ok').click(function () {
     if(colSettingObj.dataChanged()){
     if(colSettingObj.dataChanged()){
         colSettingObj.updateColSetting();
         colSettingObj.updateColSetting();
     }
     }
+    //系统选项
+    if(optionsOprObj.needToSaveGeneralOpts()){
+        let v1 = optionsOprObj.rationQuanACToBillsQuan.prop('checked'),
+            v2 = optionsOprObj.rationQuanACToRationUnit.prop('checked');
+        options.updateData = {
+            rationQuanACToBillsQuan: v1,
+            rationQuanACToRationUnit: v2
+        };
+    }
 
 
     if(calcOptions.updateChecking(properties)){
     if(calcOptions.updateChecking(properties)){
         reCalcRations = true;
         reCalcRations = true;
@@ -2093,7 +2117,7 @@ $('#property_ok').click(function () {
 /*    console.log(mixDatas);
 /*    console.log(mixDatas);
     return; */
     return; */
     function hasMixData() {
     function hasMixData() {
-        return Object.keys(mixDatas.properties).length > 0 ||
+        return Object.keys(mixDatas.properties).length > 0 || mixDatas.options.updateData ||
             mixDatas.labourCoes.updateData || mixDatas.rations.length > 0 || mixDatas.bills.length > 0;
             mixDatas.labourCoes.updateData || mixDatas.rations.length > 0 || mixDatas.bills.length > 0;
     }
     }
 
 
@@ -2127,6 +2151,12 @@ $('#property_ok').click(function () {
                 if(mixDatas.properties.hasOwnProperty('property.projectFeature')){
                 if(mixDatas.properties.hasOwnProperty('property.projectFeature')){
                     projFeatureView.orgDatas = projFeatureView.toViewDatas(mixDatas.properties['property.projectFeature']);
                     projFeatureView.orgDatas = projFeatureView.toViewDatas(mixDatas.properties['property.projectFeature']);
                 }
                 }
+                if(mixDatas.options && mixDatas.options.updateData){
+                    let v1 = mixDatas.options.updateData['rationQuanACToBillsQuan'],
+                        v2 = mixDatas.options.updateData['rationQuanACToRationUnit'];
+                    optionsOprObj.updateOptions(optionsOprObj.options, {type: optionsOprObj.optionsTypes.GENERALOPTS, opt: 'rationQuanACToBillsQuan', value: v1});
+                    optionsOprObj.updateOptions(optionsOprObj.options, {type: optionsOprObj.optionsTypes.GENERALOPTS, opt: 'rationQuanACToRationUnit', value: v2});
+                }
             }
             }
         });
         });
     }
     }
@@ -2386,6 +2416,7 @@ $('#customFile').change(function () {
         $('#uploadAlert').hide();
         $('#uploadAlert').hide();
         //读取各个表及表名
         //读取各个表及表名
         $.bootstrapLoading.start();
         $.bootstrapLoading.start();
+        $('#loadingPage').css('z-index', '2000');
         let fileReader = new FileReader();
         let fileReader = new FileReader();
         fileReader.onload = function(ev) {
         fileReader.onload = function(ev) {
             try {
             try {
@@ -2441,6 +2472,8 @@ $('#uploadConfirm').click(function () {
         let matchBillLibId = projectInfoObj.projectInfo.engineeringInfo.bill_lib.length > 0 ? projectInfoObj.projectInfo.engineeringInfo.bill_lib[0].id : null;
         let matchBillLibId = projectInfoObj.projectInfo.engineeringInfo.bill_lib.length > 0 ? projectInfoObj.projectInfo.engineeringInfo.bill_lib[0].id : null;
         formData.append('billsLibId', matchBillLibId);
         formData.append('billsLibId', matchBillLibId);
         let uploadS = +new Date();
         let uploadS = +new Date();
+        $.bootstrapLoading.start();
+        $('#loadingPage').css('z-index', '2000');
         $.ajax({
         $.ajax({
             url: '/bills/upload',
             url: '/bills/upload',
             type: 'POST',
             type: 'POST',
@@ -2448,9 +2481,6 @@ $('#uploadConfirm').click(function () {
             cache: false,
             cache: false,
             contentType: false,
             contentType: false,
             processData: false,
             processData: false,
-            beforeSend: function() {
-                $.bootstrapLoading.start();
-            },
             success: function(response){
             success: function(response){
                 if (response.err === 0) {
                 if (response.err === 0) {
                     const message = response.msg !== undefined ? response.msg : '';
                     const message = response.msg !== undefined ? response.msg : '';
@@ -2473,8 +2503,8 @@ $('#uploadConfirm').click(function () {
                 }
                 }
                 $(me).removeClass('disabled');
                 $(me).removeClass('disabled');
             },
             },
-            error: function(){
-                alert("与服务器通信发生错误");
+            error: function(jqXHR){
+                alert(`与服务器通信发生错误${jqXHR.status} ${jqXHR.statusText}`);
                 $.bootstrapLoading.end();
                 $.bootstrapLoading.end();
                 $(me).removeClass('disabled');
                 $(me).removeClass('disabled');
             }
             }
@@ -2648,6 +2678,7 @@ function disableTools(){
     $('#downMove').remove();
     $('#downMove').remove();
     $('#ZLFB_btn').remove();
     $('#ZLFB_btn').remove();
     $('#switchTznr').remove();
     $('#switchTznr').remove();
+    $('#uploadDropDown').remove();
     $('a[name="lockBills"]').remove();
     $('a[name="lockBills"]').remove();
     //关于计算
     //关于计算
     $('#poj-settings-4').find('input').prop('disabled', 'disabled');
     $('#poj-settings-4').find('input').prop('disabled', 'disabled');
@@ -2699,7 +2730,6 @@ function disableTools(){
 function disableSpread(spread){
 function disableSpread(spread){
     spread.unbind(GC.Spread.Sheets.Events.ButtonClicked);
     spread.unbind(GC.Spread.Sheets.Events.ButtonClicked);
     let sheetCount = spread.getSheetCount();
     let sheetCount = spread.getSheetCount();
-    console.log(sheetCount);
     for(let i = 0; i < sheetCount; i++){
     for(let i = 0; i < sheetCount; i++){
         let sheet = spread.getSheet(i);
         let sheet = spread.getSheet(i);
         sheet.unbind(GC.Spread.Sheets.Events.ButtonClicked);
         sheet.unbind(GC.Spread.Sheets.Events.ButtonClicked);
@@ -2711,7 +2741,6 @@ function disableSpread(spread){
         sheet.unbind(GC.Spread.Sheets.Events.CellDoubleClick);
         sheet.unbind(GC.Spread.Sheets.Events.CellDoubleClick);
         sheet.unbind(GC.Spread.Sheets.Events.CellClick);
         sheet.unbind(GC.Spread.Sheets.Events.CellClick);
         sheet.unbind(GC.Spread.Sheets.Events.ValueChanged);
         sheet.unbind(GC.Spread.Sheets.Events.ValueChanged);
-        console.log(sheet.name());
         sheet.suspendPaint();
         sheet.suspendPaint();
         sheet.suspendEvent();
         sheet.suspendEvent();
         sheet.options.isProtected = true;
         sheet.options.isProtected = true;

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

@@ -171,7 +171,7 @@ let quantityEditObj = {
     showSelectModal:function (hitinfo) {
     showSelectModal:function (hitinfo) {
         //锁定的清单不显示
         //锁定的清单不显示
         let project = projectObj.project;
         let project = projectObj.project;
-        if(project.isBillsLocked() && project.withinBillsLocked(project.mainTree.selected)){
+        if(project.mainTree.selected.sourceType == ModuleNames.bills && project.isBillsLocked() && project.withinBillsLocked(project.mainTree.selected)){
             return;
             return;
         }
         }
         this.initModalContent();
         this.initModalContent();

+ 5 - 0
web/building_saas/main/js/views/std_billsGuidance_lib.js

@@ -331,6 +331,7 @@ const billsGuidance = (function () {
     function buildSheet(module) {
     function buildSheet(module) {
         if(!module.workBook){
         if(!module.workBook){
             module.workBook = new GC.Spread.Sheets.Workbook(module.dom[0], {sheetCount: 1});
             module.workBook = new GC.Spread.Sheets.Workbook(module.dom[0], {sheetCount: 1});
+            sheetCommonObj.spreadDefaultStyle(module.workBook);
             let sheet = module.workBook.getActiveSheet();
             let sheet = module.workBook.getActiveSheet();
             if(module === bills){
             if(module === bills){
                 //默认初始可控制焦点在清单表中
                 //默认初始可控制焦点在清单表中
@@ -468,6 +469,7 @@ const billsGuidance = (function () {
     //@param {Number}libID @return {void}
     //@param {Number}libID @return {void}
     function libInitSel(libID){
     function libInitSel(libID){
         //获取清单
         //获取清单
+        $.bootstrapLoading.start();
         CommonAjax.post('/billsGuidance/api/getLibWithBills', {libID: libID}, function(rstData){
         CommonAjax.post('/billsGuidance/api/getLibWithBills', {libID: libID}, function(rstData){
             //获取清单库中的工作内容和项目特征
             //获取清单库中的工作内容和项目特征
             initJobAndCharacter(rstData.guidanceLib.billsLibId);
             initJobAndCharacter(rstData.guidanceLib.billsLibId);
@@ -479,6 +481,9 @@ const billsGuidance = (function () {
             setTagForHint(bills.tree.items);
             setTagForHint(bills.tree.items);
             //默认初始节点
             //默认初始节点
             billsInitSel(0);
             billsInitSel(0);
+            $.bootstrapLoading.end();
+        }, function () {
+            $.bootstrapLoading.end();
         });
         });
     }
     }
     //初始化清单指引库
     //初始化清单指引库

+ 6 - 1
web/building_saas/main/js/views/std_bills_lib.js

@@ -14,6 +14,7 @@ var billsLibObj = {
     checkBillsSpread: function () {
     checkBillsSpread: function () {
         if (!this.stdBillsSpread) {
         if (!this.stdBillsSpread) {
             this.stdBillsSpread = SheetDataHelper.createNewSpread($('#stdBillsSpread')[0]);
             this.stdBillsSpread = SheetDataHelper.createNewSpread($('#stdBillsSpread')[0]);
+            sheetCommonObj.spreadDefaultStyle(this.stdBillsSpread);
             this.stdBillsSpread.getSheet(0).name('stdBillsLib_bills');
             this.stdBillsSpread.getSheet(0).name('stdBillsLib_bills');
             // 刷新setting中记录的spread的位置
             // 刷新setting中记录的spread的位置
             this.refreshSettingForHint();
             this.refreshSettingForHint();
@@ -27,9 +28,11 @@ var billsLibObj = {
     checkBillsRelaSpread: function () {
     checkBillsRelaSpread: function () {
         if (!this.stdBillsJobSpread) {
         if (!this.stdBillsJobSpread) {
             this.stdBillsJobSpread = SheetDataHelper.createNewSpread($('#stdBillsJobs')[0]);
             this.stdBillsJobSpread = SheetDataHelper.createNewSpread($('#stdBillsJobs')[0]);
+            sheetCommonObj.spreadDefaultStyle(this.stdBillsJobSpread);
         }
         }
         if (!this.stdBillsFeatureSpread) {
         if (!this.stdBillsFeatureSpread) {
             this.stdBillsFeatureSpread = SheetDataHelper.createNewSpread($('#stdBillsFeatures')[0]);
             this.stdBillsFeatureSpread = SheetDataHelper.createNewSpread($('#stdBillsFeatures')[0]);
+            sheetCommonObj.spreadDefaultStyle(this.stdBillsFeatureSpread);
         }
         }
     },
     },
     refreshBillsRelaSpread: function () {
     refreshBillsRelaSpread: function () {
@@ -197,7 +200,7 @@ var billsLibObj = {
                 showBillsRemark(node);
                 showBillsRemark(node);
             }
             }
         };
         };
-
+        $.bootstrapLoading.start();
         CommonAjax.post('/stdBillsEditor/getJobContent', {userId: userID, billsLibId: stdBillsLibID}, function (datas) {
         CommonAjax.post('/stdBillsEditor/getJobContent', {userId: userID, billsLibId: stdBillsLibID}, function (datas) {
             stdBillsJobData = datas;
             stdBillsJobData = datas;
         }, function () {
         }, function () {
@@ -250,8 +253,10 @@ var billsLibObj = {
                     args.sheet.repaint();
                     args.sheet.repaint();
                 }
                 }
             });
             });
+            $.bootstrapLoading.end();
         }, function () {
         }, function () {
             that.stdBillsSpread.unbind(GC.Spread.Sheets.Events.CellDoubleClick);
             that.stdBillsSpread.unbind(GC.Spread.Sheets.Events.CellDoubleClick);
+            $.bootstrapLoading.end();
         });
         });
 
 
         $('#stdBillsSearch>span>button').click(function () {
         $('#stdBillsSearch>span>button').click(function () {

+ 9 - 0
web/building_saas/main/js/views/std_ration_lib.js

@@ -14,11 +14,13 @@ var rationLibObj = {
     checkSpread: function () {
     checkSpread: function () {
         if (!this.rationChapterSpread) {
         if (!this.rationChapterSpread) {
             this.rationChapterSpread = SheetDataHelper.createNewSpread($('#stdRationChapter')[0]);
             this.rationChapterSpread = SheetDataHelper.createNewSpread($('#stdRationChapter')[0]);
+            sheetCommonObj.spreadDefaultStyle(this.rationChapterSpread);
             this.rationChapterSpread.getSheet(0).name('stdRationLib_chapter');
             this.rationChapterSpread.getSheet(0).name('stdRationLib_chapter');
             this.rationChapterSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, this.onChapterSpreadCellDoubleClick);
             this.rationChapterSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, this.onChapterSpreadCellDoubleClick);
         }
         }
         if (!this.sectionRationsSpread) {
         if (!this.sectionRationsSpread) {
             this.sectionRationsSpread = SheetDataHelper.createNewSpread($('#stdSectionRations')[0]);
             this.sectionRationsSpread = SheetDataHelper.createNewSpread($('#stdSectionRations')[0]);
+            sheetCommonObj.spreadDefaultStyle(this.sectionRationsSpread);
 
 
             this.sectionRationsSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, this.onRationSpreadCellDoubleClick);
             this.sectionRationsSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, this.onRationSpreadCellDoubleClick);
             this.refreshSettingForHint();
             this.refreshSettingForHint();
@@ -51,6 +53,7 @@ var rationLibObj = {
         }
         }
     },
     },
     loadStdRation: function (rationLibID) {
     loadStdRation: function (rationLibID) {
+        $.bootstrapLoading.start();
         var that = this;
         var that = this;
         var showRationChapterTree = function (datas) {
         var showRationChapterTree = function (datas) {
             var rationChapterTree = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1, autoUpdate: false});
             var rationChapterTree = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1, autoUpdate: false});
@@ -84,8 +87,10 @@ var rationLibObj = {
 
 
         CommonAjax.post('/complementaryRation/api/getRationTree', {userId: userID, rationRepId: rationLibID}, function (datas) {
         CommonAjax.post('/complementaryRation/api/getRationTree', {userId: userID, rationRepId: rationLibID}, function (datas) {
             showRationChapterTree(datas);
             showRationChapterTree(datas);
+            $.bootstrapLoading.end();
         }, function () {
         }, function () {
             showRationChapterTree([]);
             showRationChapterTree([]);
+            $.bootstrapLoading.end();
         });
         });
     },
     },
     //双击隐藏显示
     //双击隐藏显示
@@ -121,6 +126,10 @@ var rationLibObj = {
     },
     },
     loadSectionRations: function (sectionID) {
     loadSectionRations: function (sectionID) {
         var showDatas = function (datas, setting) {
         var showDatas = function (datas, setting) {
+            let rationSheet = rationLibObj.sectionRationsSpread.getActiveSheet();
+            TREE_SHEET_HELPER.massOperationSheet(rationSheet, function () {
+                rationSheet.setColumnWidth(0, 25, GC.Spread.Sheets.SheetArea.rowHeader);
+            });
             SheetDataHelper.loadSheetHeader(setting, rationLibObj.sectionRationsSpread.getActiveSheet());
             SheetDataHelper.loadSheetHeader(setting, rationLibObj.sectionRationsSpread.getActiveSheet());
             SheetDataHelper.loadSheetData(setting, rationLibObj.sectionRationsSpread.getActiveSheet(), datas);
             SheetDataHelper.loadSheetData(setting, rationLibObj.sectionRationsSpread.getActiveSheet(), datas);
             rationLibObj.setTagForHint(datas);
             rationLibObj.setTagForHint(datas);

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

@@ -84,6 +84,7 @@ var subRateObject={
     initSubRateSpread:function (item) {
     initSubRateSpread:function (item) {
         if(this.subRateSpread == null){
         if(this.subRateSpread == null){
             this.subRateSpread = SheetDataHelper.createNewSpread($("#subRate")[0]);
             this.subRateSpread = SheetDataHelper.createNewSpread($("#subRate")[0]);
+            sheetCommonObj.spreadDefaultStyle(this.subRateSpread);
             this.subRateSheet = this.subRateSpread.getSheet(0);
             this.subRateSheet = this.subRateSpread.getSheet(0);
             sheetCommonObj.initSheet(this.subRateSheet, this.subRateSetting, 30);
             sheetCommonObj.initSheet(this.subRateSheet, this.subRateSetting, 30);
             this.subRateSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, this.onSubRateSelectChanged);
             this.subRateSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, this.onSubRateSelectChanged);

+ 11 - 2
web/building_saas/main/js/views/sub_view.js

@@ -11,12 +11,15 @@ let subSpread = null;
 let subObj = {
 let subObj = {
     initSubSpread:function () {
     initSubSpread:function () {
         contentOprObj.buildSheet($("#jobSpread")[0]);
         contentOprObj.buildSheet($("#jobSpread")[0]);
-        sheetCommonObj.bindEscKey(contentOprObj.workBook, [{sheet: contentOprObj.workBook.getSheet(0), editStarting: contentOprObj.onEditStart, editEnded: contentOprObj.onEditEnded}]);
+        //sheetCommonObj.bindEscKey(contentOprObj.workBook, [{sheet: contentOprObj.workBook.getSheet(0), editStarting: contentOprObj.onEditStart, editEnded: contentOprObj.onEditEnded}]);
+        sheetCommonObj.spreadDefaultStyle(contentOprObj.workBook);
         characterOprObj.buildSheet($("#itemSpread")[0]);
         characterOprObj.buildSheet($("#itemSpread")[0]);
-        sheetCommonObj.bindEscKey(characterOprObj.workBook, [{sheet: characterOprObj.workBook.getSheet(0), editStarting: characterOprObj.onEditStart, editEnded: characterOprObj.onEditEnded}]);
+        //sheetCommonObj.bindEscKey(characterOprObj.workBook, [{sheet: characterOprObj.workBook.getSheet(0), editStarting: characterOprObj.onEditStart, editEnded: characterOprObj.onEditEnded}]);
+        sheetCommonObj.spreadDefaultStyle(characterOprObj.workBook);
         $("#tzjnrCon").hide();
         $("#tzjnrCon").hide();
         $("#subSpread").show();
         $("#subSpread").show();
         subSpread = sheetCommonObj.createSpread($("#subSpread")[0], 4);
         subSpread = sheetCommonObj.createSpread($("#subSpread")[0], 4);
+        sheetCommonObj.spreadDefaultStyle(subSpread);
         subSpread.options.allowUserDragDrop = false;
         subSpread.options.allowUserDragDrop = false;
         subSpread.options.allowUserDragFill = false;
         subSpread.options.allowUserDragFill = false;
         subSpread.getSheet(2).name('JSCX');
         subSpread.getSheet(2).name('JSCX');
@@ -185,6 +188,9 @@ function updateBillsOprRation() {
 // 应用到选中清单
 // 应用到选中清单
 let isSaving = false;
 let isSaving = false;
 $("#use-to-current").click(function() {
 $("#use-to-current").click(function() {
+    if($(this).hasClass('disabled')){
+        return false;
+    }
     if(projectReadOnly){
     if(projectReadOnly){
         return false;
         return false;
     }
     }
@@ -221,6 +227,9 @@ function addRuleUseToBills(setting, nodes) {
 }
 }
 // 应用到所有的清单
 // 应用到所有的清单
 $("#use-to-all").click(function() {
 $("#use-to-all").click(function() {
+    if($(this).hasClass('disabled')){
+        return false;
+    }
     if(projectReadOnly){
     if(projectReadOnly){
         return false;
         return false;
     }
     }

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

@@ -42,6 +42,7 @@ let tender_obj={
     initTenderSpread:function () {
     initTenderSpread:function () {
         if(!this.tenderSpread){
         if(!this.tenderSpread){
             this.tenderSpread = SheetDataHelper.createNewSpread($("#tenderSpread")[0]);
             this.tenderSpread = SheetDataHelper.createNewSpread($("#tenderSpread")[0]);
+            sheetCommonObj.spreadDefaultStyle(this.tenderSpread);
         }
         }
         this.tenderSheet = this.tenderSpread.getSheet(0);
         this.tenderSheet = this.tenderSpread.getSheet(0);
         this.tenderTree = cacheTree.createNew(this);
         this.tenderTree = cacheTree.createNew(this);

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

@@ -31,7 +31,10 @@ let zmhs_obj = {
     },
     },
     initSpread:function () {
     initSpread:function () {
         this.coeSpread = SheetDataHelper.createNewSpread($("#coeSpread")[0]);
         this.coeSpread = SheetDataHelper.createNewSpread($("#coeSpread")[0]);
+        sheetCommonObj.spreadDefaultStyle(this.coeSpread);
         this.assSpread = SheetDataHelper.createNewSpread($("#assSpread")[0]);
         this.assSpread = SheetDataHelper.createNewSpread($("#assSpread")[0]);
+        sheetCommonObj.spreadDefaultStyle(this.assSpread);
+
         this.coeSheet = this.coeSpread.getSheet(0);
         this.coeSheet = this.coeSpread.getSheet(0);
         sheetCommonObj.initSheet(this.coeSheet, this.coeSetting, 30);
         sheetCommonObj.initSheet(this.coeSheet, this.coeSetting, 30);
         this.coeSheet.name('ration_coe');
         this.coeSheet.name('ration_coe');

+ 10 - 10
web/building_saas/pm/html/project-management.html

@@ -49,7 +49,7 @@
     <%include ../../../common/html/header.html %>
     <%include ../../../common/html/header.html %>
 </div>
 </div>
     <div class="main">
     <div class="main">
-        <div class="poj-manage container-fluid">
+        <div class="poj-manage container-fluid p-0">
             <div class="pm-side">
             <div class="pm-side">
                 <div class="poj-cate">
                 <div class="poj-cate">
                     <div class="dropdown">
                     <div class="dropdown">
@@ -62,24 +62,23 @@
                             </div>
                             </div>
                         </div>
                         </div>
                     </div>
                     </div>
-                    <ul class="nav nav-pills flex-column">
-                        <li class="nav-item" title="全部">
-                            <a class="nav-link active" href="#pm_all" role="tab" id="tab_pm_all" data-toggle="tab" title="全部"><i class="fa fa-bars"></i></a>
+                    <ul class="nav nav-pills flex-column" id="sideTab">
+                        <li class="nav-item" data-original-title="全部" data-placement="right" data-toggle="tooltip">
+                            <a class="nav-link active" href="#pm_all" role="tab" id="tab_pm_all" data-toggle="tab"><i class="fa fa-bars"></i></a>
                         </li>
                         </li>
-                        <li class="nav-item" title="最近使用">
-                            <!-- data-toggle="tooltip" data-placement="right" data-original-title="最近使用"-->
+                        <li class="nav-item" data-original-title="最近使用" data-placement="right" data-toggle="tooltip">
                             <a class="nav-link" href="javascript:void(0);"><i class="fa fa-bookmark"></i></a>
                             <a class="nav-link" href="javascript:void(0);"><i class="fa fa-bookmark"></i></a>
                         </li>
                         </li>
-                        <li class="nav-item" title="分享">
+                        <li class="nav-item" data-original-title="分享" data-placement="right" data-toggle="tooltip">
                             <a class="nav-link" href="#pm_share" id="tab_pm_share" data-toggle="tab"><i class="fa fa-share-alt"></i></a>
                             <a class="nav-link" href="#pm_share" id="tab_pm_share" data-toggle="tab"><i class="fa fa-share-alt"></i></a>
                         </li>
                         </li>
-                        <li class="nav-item" title="协同工作">
+                        <li class="nav-item" data-original-title="协同工作" data-placement="right" data-toggle="tooltip">
                             <a class="nav-link" href="javascript:void(0);"><i class="fa fa-users"></i></a>
                             <a class="nav-link" href="javascript:void(0);"><i class="fa fa-users"></i></a>
                         </li>
                         </li>
-                        <li class="nav-item" title="归档">
+                        <li class="nav-item" data-original-title="归档" data-placement="right" data-toggle="tooltip">
                             <a class="nav-link" href="javascript:void(0);"><i class="fa fa-book"></i></a>
                             <a class="nav-link" href="javascript:void(0);"><i class="fa fa-book"></i></a>
                         </li>
                         </li>
-                        <li class="nav-item" title="回收站">
+                        <li class="nav-item" data-original-title="回收站" data-placement="right" data-toggle="tooltip">
                             <a class="nav-link" href="#pm_gc" id="tab_pm_gc" data-toggle="tab"><i class="fa fa-trash"></i></a>
                             <a class="nav-link" href="#pm_gc" id="tab_pm_gc" data-toggle="tab"><i class="fa fa-trash"></i></a>
                         </li>
                         </li>
                     </ul>
                     </ul>
@@ -541,6 +540,7 @@
 <script src="/public/web/id_tree.js"></script>
 <script src="/public/web/id_tree.js"></script>
 <script src="/public/web/tree_sheet/tree_sheet_helper.js"></script>
 <script src="/public/web/tree_sheet/tree_sheet_helper.js"></script>
 <script src="/public/web/sheet/sheet_data_helper.js"></script>
 <script src="/public/web/sheet/sheet_data_helper.js"></script>
+<script src="/public/web/sheet/sheet_common.js"></script>
 <script type="text/javascript" src="/public/web/common_ajax.js"></script>
 <script type="text/javascript" src="/public/web/common_ajax.js"></script>
 <script src="/lib/JSExpressionEval_src/Date.js"></script>
 <script src="/lib/JSExpressionEval_src/Date.js"></script>
 <script src="/web/building_saas/pm/js/pm_ajax.js"></script>
 <script src="/web/building_saas/pm/js/pm_ajax.js"></script>

+ 23 - 0
web/building_saas/pm/js/pm_gc.js

@@ -88,6 +88,7 @@ const gcTreeObj = {
     buildSheet: function () {
     buildSheet: function () {
         if(!this.workBook){
         if(!this.workBook){
             this.workBook = new GC.Spread.Sheets.Workbook($('#gcSpread')[0], {sheetCount: 1});
             this.workBook = new GC.Spread.Sheets.Workbook($('#gcSpread')[0], {sheetCount: 1});
+            sheetCommonObj.spreadDefaultStyle(this.workBook);
             this.setOptions(this.workBook, this.setting.options);
             this.setOptions(this.workBook, this.setting.options);
             this.buildHeader(this.workBook.getActiveSheet(), this.setting.header);
             this.buildHeader(this.workBook.getActiveSheet(), this.setting.header);
             this.bindEvent(this.workBook);
             this.bindEvent(this.workBook);
@@ -343,6 +344,28 @@ const gcTreeObj = {
                 hitinfo.sheet.repaint();
                 hitinfo.sheet.repaint();
             }
             }
         };
         };
+        TreeNodeCellType.prototype.processMouseEnter = function (hitinfo) {
+            let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
+            let value = hitinfo.sheet.getValue(hitinfo.row, hitinfo.col);
+            let tag = hitinfo.sheet.getTag(hitinfo.row, hitinfo.col);
+            let acStyle = hitinfo.sheet.getActualStyle(hitinfo.row, hitinfo.col),
+                zoom = hitinfo.sheet.zoom();
+            let node = tree.items[hitinfo.row];
+            let nodeIndent = node ? (node.depth() + 1) * indent +  node.depth() * levelIndent + imgWidth + 3 : 0;
+            let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, {sheet: hitinfo.sheet, row: hitinfo.row, col: hitinfo.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport});
+            let cellWidth = hitinfo.sheet.getCell(-1, hitinfo.col).width();
+            if(textLength > cellWidth - nodeIndent){
+                TREE_SHEET_HELPER.showTipsDiv(text,{pos: {}},hitinfo);
+            }
+        };
+        TreeNodeCellType.prototype.processMouseLeave = function (hitinfo) {
+            TREE_SHEET_HELPER.tipDiv = 'hide';
+            if (TREE_SHEET_HELPER._toolTipElement) {
+                $(TREE_SHEET_HELPER._toolTipElement).hide();
+                TREE_SHEET_HELPER._toolTipElement = null;
+            };
+            TREE_SHEET_HELPER.tipDivCheck();//延时检查:当tips正在show的时候,就调用了hide方法,会导致tips一直存在,所以设置一个超时处理
+        }
         return new TreeNodeCellType();
         return new TreeNodeCellType();
     },
     },
     getBaseCell: function () {
     getBaseCell: function () {

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

@@ -5,6 +5,7 @@
  * @date 2017/8/22
  * @date 2017/8/22
  * @version
  * @version
  */
  */
+//todo: 全部、分享、回收站树统一
 let Tree = null;//
 let Tree = null;//
 let movetoZTree = null;
 let movetoZTree = null;
 let copytoZTree = null;
 let copytoZTree = null;
@@ -50,13 +51,13 @@ const projTreeObj = {
         //0.48 0.13 0.15 0.15 0.09
         //0.48 0.13 0.15 0.15 0.09
         header: [
         header: [
             {name: '工程列表', dataCode: 'name', width: 300, vAlign: 'center', hAlign: 'left'},
             {name: '工程列表', dataCode: 'name', width: 300, vAlign: 'center', hAlign: 'left'},
-            {name: '工程造价', dataCode: 'engineeringCost', width: 120, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
-            {name: '分部分项合计', dataCode: 'subEngineering', width: 120, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
-            {name: '措施项目合计', dataCode: 'measure', width: 120, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
-            {name: '其他项目合计', dataCode: 'other', width: 120, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
-            {name: '安全文明施工费', dataCode: 'safetyConstruction', width: 120, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
-            {name: '规费', dataCode: 'charge', width: 120, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
-            {name: '税金', dataCode: 'tax', width: 120, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
+            {name: '工程造价', dataCode: 'engineeringCost', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
+            {name: '分部分项合计', dataCode: 'subEngineering', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
+            {name: '措施项目合计', dataCode: 'measure', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
+            {name: '其他项目合计', dataCode: 'other', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
+           /* {name: '安全文明施工费', dataCode: 'safetyConstruction', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
+            {name: '规费', dataCode: 'charge', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
+            {name: '税金', dataCode: 'tax', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},*/
             {name: '占造价比例(%)', dataCode: 'rate', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
             {name: '占造价比例(%)', dataCode: 'rate', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
             {name: '建筑面积', dataCode: 'buildingArea', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
             {name: '建筑面积', dataCode: 'buildingArea', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
             {name: '单方造价', dataCode: 'perCost', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
             {name: '单方造价', dataCode: 'perCost', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
@@ -623,6 +624,7 @@ const projTreeObj = {
         }
         }
     },
     },
     getTreeNodeCell: function (tree) {
     getTreeNodeCell: function (tree) {
+        let me = projTreeObj;
         let indent = 20;
         let indent = 20;
         let levelIndent = -5;
         let levelIndent = -5;
         let halfBoxLength = 5;
         let halfBoxLength = 5;
@@ -853,6 +855,29 @@ const projTreeObj = {
             }
             }
             return false;
             return false;
         };
         };
+        TreeNodeCellType.prototype.processMouseEnter = function (hitinfo) {
+            let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
+            let value = hitinfo.sheet.getValue(hitinfo.row, hitinfo.col);
+            let tag = hitinfo.sheet.getTag(hitinfo.row, hitinfo.col);
+            let acStyle = hitinfo.sheet.getActualStyle(hitinfo.row, hitinfo.col),
+                zoom = hitinfo.sheet.zoom();
+            let node = me.tree.items[hitinfo.row];
+            let nodeIndent = node ? (node.depth() + 1) * indent +  node.depth() * levelIndent + imgWidth + 3 : 0;
+            let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, {sheet: hitinfo.sheet, row: hitinfo.row, col: hitinfo.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport});
+            let cellWidth = hitinfo.sheet.getCell(-1, hitinfo.col).width();
+            if(textLength > cellWidth - nodeIndent){
+                TREE_SHEET_HELPER.showTipsDiv(text,{pos: {}},hitinfo);
+            }
+        };
+        TreeNodeCellType.prototype.processMouseLeave = function (hitinfo) {
+            let me = this;
+            TREE_SHEET_HELPER.tipDiv = 'hide';
+            if (TREE_SHEET_HELPER._toolTipElement) {
+                $(TREE_SHEET_HELPER._toolTipElement).hide();
+                TREE_SHEET_HELPER._toolTipElement = null;
+            };
+            TREE_SHEET_HELPER.tipDivCheck();//延时检查:当tips正在show的时候,就调用了hide方法,会导致tips一直存在,所以设置一个超时处理
+        }
         return new TreeNodeCellType();
         return new TreeNodeCellType();
     },
     },
     setCellValue: function (cell, node,sheet) {
     setCellValue: function (cell, node,sheet) {
@@ -1061,6 +1086,10 @@ const projTreeObj = {
 };
 };
 
 
 $(document).ready(function() {
 $(document).ready(function() {
+    $('#sideTab').find('li').click(function () {
+       //消除tooltip
+        $('[data-toggle="tooltip"]').tooltip('hide');
+    });
     //列宽随着屏幕改变
     //列宽随着屏幕改变
     $(window).resize(function () {
     $(window).resize(function () {
         //autoPmWdith(projTreeObj.workBook, projTreeObj.setting.header);
         //autoPmWdith(projTreeObj.workBook, projTreeObj.setting.header);
@@ -1597,6 +1626,8 @@ function init() {
             projTreeObj.tree = pmTree.createNew(projTreeObj.setting, datas);
             projTreeObj.tree = pmTree.createNew(projTreeObj.setting, datas);
             projTreeObj.tree.selected = projTreeObj.tree.items[0];
             projTreeObj.tree.selected = projTreeObj.tree.items[0];
             projTreeObj.workBook = projTreeObj.buildSheet(projTreeObj.workBook,'projSpread',projTreeObj.setting);
             projTreeObj.workBook = projTreeObj.buildSheet(projTreeObj.workBook,'projSpread',projTreeObj.setting);
+            projTreeObj.workBook.getSheet(0).frozenColumnCount(2);
+            sheetCommonObj.spreadDefaultStyle(projTreeObj.workBook);
             projTreeObj.sumEngineeringCost();
             projTreeObj.sumEngineeringCost();
             projTreeObj.showTreeData(projTreeObj.tree.items, projTreeObj.setting.header, projTreeObj.workBook.getActiveSheet());
             projTreeObj.showTreeData(projTreeObj.tree.items, projTreeObj.setting.header, projTreeObj.workBook.getActiveSheet());
             //初始选择
             //初始选择

+ 23 - 0
web/building_saas/pm/js/pm_share.js

@@ -132,6 +132,7 @@ const pmShare = (function () {
     //
     //
     function buildSheet(){
     function buildSheet(){
         spreadObj.workBook = new GC.Spread.Sheets.Workbook(spreadDom[0], {sheetCount: 1});
         spreadObj.workBook = new GC.Spread.Sheets.Workbook(spreadDom[0], {sheetCount: 1});
+        sheetCommonObj.spreadDefaultStyle(spreadObj.workBook);
         spreadObj.sheet = spreadObj.workBook.getActiveSheet();
         spreadObj.sheet = spreadObj.workBook.getActiveSheet();
         setSpreadOptions(spreadObj.workBook, spreadOpts);
         setSpreadOptions(spreadObj.workBook, spreadOpts);
         bindEvent(spreadObj.workBook, spreadEvents);
         bindEvent(spreadObj.workBook, spreadEvents);
@@ -349,6 +350,28 @@ const pmShare = (function () {
             }
             }
             return false;
             return false;
         };
         };
+        TreeNodeCellType.prototype.processMouseEnter = function (hitinfo) {
+            let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
+            let value = hitinfo.sheet.getValue(hitinfo.row, hitinfo.col);
+            let tag = hitinfo.sheet.getTag(hitinfo.row, hitinfo.col);
+            let acStyle = hitinfo.sheet.getActualStyle(hitinfo.row, hitinfo.col),
+                zoom = hitinfo.sheet.zoom();
+            let node = tree.items[hitinfo.row];
+            let nodeIndent = node ? (node.depth() + 1) * indent +  node.depth() * levelIndent + imgWidth + 3 : 0;
+            let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, {sheet: hitinfo.sheet, row: hitinfo.row, col: hitinfo.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport});
+            let cellWidth = hitinfo.sheet.getCell(-1, hitinfo.col).width();
+            if(textLength > cellWidth - nodeIndent){
+                TREE_SHEET_HELPER.showTipsDiv(text,{pos: {}},hitinfo);
+            }
+        };
+        TreeNodeCellType.prototype.processMouseLeave = function (hitinfo) {
+            TREE_SHEET_HELPER.tipDiv = 'hide';
+            if (TREE_SHEET_HELPER._toolTipElement) {
+                $(TREE_SHEET_HELPER._toolTipElement).hide();
+                TREE_SHEET_HELPER._toolTipElement = null;
+            };
+            TREE_SHEET_HELPER.tipDivCheck();//延时检查:当tips正在show的时候,就调用了hide方法,会导致tips一直存在,所以设置一个超时处理
+        }
         return new TreeNodeCellType();
         return new TreeNodeCellType();
     }
     }
     //
     //

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

@@ -39,8 +39,8 @@
             <div class="modal-footer">
             <div class="modal-footer">
                 <button type="button" class="btn btn-link float-left" onclick="rptControlObj.restoreCustCFG()">恢复默认值</button>
                 <button type="button" class="btn btn-link float-left" onclick="rptControlObj.restoreCustCFG()">恢复默认值</button>
                 <button type="button" class="btn btn-link float-left" onclick="rptControlObj.saveCustCfg()">存为默认值</button>
                 <button type="button" class="btn btn-link float-left" onclick="rptControlObj.saveCustCfg()">存为默认值</button>
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
                 <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="rptControlObj.confirmCfgChange()">确定</button>
                 <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="rptControlObj.confirmCfgChange()">确定</button>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
             </div>
             </div>
         </div>
         </div>
     </div>
     </div>

+ 4 - 10
web/building_saas/report/html/rpt_main.html

@@ -4,7 +4,9 @@
         <div class="col-lg-2 p-0">
         <div class="col-lg-2 p-0">
             <div class="print-list">
             <div class="print-list">
                 <div class="list-tools d-flex justify-content-center">
                 <div class="list-tools d-flex justify-content-center">
-                    <button class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#editForm"><i class="fa fa-cog"></i> 管理报表</button>
+                    <!--
+                        <button class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#editForm"><i class="fa fa-cog"></i> 管理报表</button>
+                    -->
                 </div>
                 </div>
                 <div class="form-list">
                 <div class="form-list">
                     <ul id="rptTplTree" class="ztree"></ul>
                     <ul id="rptTplTree" class="ztree"></ul>
@@ -19,11 +21,6 @@
                             <button class="btn btn-outline-primary btn-sm" type="button" onclick="rptPrintHelper.preview()">
                             <button class="btn btn-outline-primary btn-sm" type="button" onclick="rptPrintHelper.preview()">
                                 <i class="fa fa-print"></i><br>打印<span class="badge badge-secondary">0</span>
                                 <i class="fa fa-print"></i><br>打印<span class="badge badge-secondary">0</span>
                             </button>
                             </button>
-                            <!--
-                            <button class="btn btn-outline-primary btn-sm" type="button"  href="#export" data-toggle="modal" data-target="#export">
-                                <i class="fa fa-share-square-o"></i><br>导出
-                            </button>
-                            -->
                         </div>
                         </div>
                     </div>
                     </div>
                     <div class="panel">
                     <div class="panel">
@@ -63,10 +60,7 @@
                         <div class="panel-body">
                         <div class="panel-body">
                             <div class="btn-group" role="group" aria-label="Button group with nested dropdown">
                             <div class="btn-group" role="group" aria-label="Button group with nested dropdown">
                                 <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#paper_margins"><i class="fa fa-file-o"></i> 页边距</button>
                                 <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#paper_margins"><i class="fa fa-file-o"></i> 页边距</button>
-                                <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#content_format"><i class="fa fa-file-text-o"></i> 页面</button>
-                                <!--
-                                <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#format"><i class="fa fa-bold"></i> 格式</button>
-                                -->
+                                <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#content_format"><i class="fa fa-bold"></i> 页面</button>
                             </div>
                             </div>
                         </div>
                         </div>
                         <div class="panel-foot text-muted">
                         <div class="panel-foot text-muted">

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

@@ -29,8 +29,8 @@
             </div>
             </div>
             <div class="modal-footer">
             <div class="modal-footer">
                 <button type="button" class="btn btn-link float-left" data-dismiss="modal" onclick="rptControlObj.saveCustCfg()">存为默认值</button>
                 <button type="button" class="btn btn-link float-left" data-dismiss="modal" onclick="rptControlObj.saveCustCfg()">存为默认值</button>
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
                 <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="rptControlObj.confirmCfgChange()">确定</button>
                 <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="rptControlObj.confirmCfgChange()">确定</button>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
             </div>
             </div>
         </div>
         </div>
     </div>
     </div>

+ 62 - 42
web/common/html/header.html

@@ -3,10 +3,10 @@
         <div class="v-title">纵横云计价</div>
         <div class="v-title">纵横云计价</div>
         <div class="p-title"><%= versionName %></div>
         <div class="p-title"><%= versionName %></div>
     </a>
     </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>
-        </li>
+    <div  class="navbar-text navbar-crumb px-1" id="fullpath">
+
+    </div>
+<!--    <ul class="nav navbar-nav">
         <li class="nav-item dropdown">
         <li class="nav-item dropdown">
             <a class="nav-link dropdown-toggle" href="javascript:void(0);" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa  fa-cloud-upload"></i> 导入</a>
             <a class="nav-link dropdown-toggle" href="javascript:void(0);" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa  fa-cloud-upload"></i> 导入</a>
             <div class="dropdown-menu">
             <div class="dropdown-menu">
@@ -14,49 +14,69 @@
                 <a id="uploadGld" class="dropdown-item" href="#import" data-toggle="modal" data-target="#import">导入广联达算量Excel清单</a>
                 <a id="uploadGld" class="dropdown-item" href="#import" data-toggle="modal" data-target="#import">导入广联达算量Excel清单</a>
             </div>
             </div>
         </li>
         </li>
-        <li class="nav-item dropdown">
-            <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-wrench"></i> 工具</a>
-            <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 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>
-        <li class="nav-item dropdown">
-            <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-question-circle-o"></i> 帮助</a>
-            <div class="dropdown-menu">
-                <a class="dropdown-item" href="#">帮助</a>
-                <a class="dropdown-item" href="#">升级说明</a>
-                <a class="dropdown-item" href="#">重庆市2008定额说明</a>
-                <a class="dropdown-item" href="#">纵横官网</a>
-                <a class="dropdown-item" href="#">动画教程</a>
-                <a class="dropdown-item" href="#">联系客服</a>
-                <a class="dropdown-item" href="#">关于</a>
-            </div>
-        </li>
-    </ul>
-    <div class="navbar-text navbar-crumb p-0" id="fullpath">
-        <% if (action !== 'index' || controller !== 'pm') {%>
-        <!--<span class="text-truncate"><a href="/pm">项目管理</a></span>-->
-        <% } %>
-    </div>
+    </ul>-->
     <div id="testDisplay" style="color:#ff7e0e;">&nbsp;&nbsp;</div>
     <div id="testDisplay" style="color:#ff7e0e;">&nbsp;&nbsp;</div>
     <div class="ml-auto navbar-text p-0">
     <div class="ml-auto navbar-text p-0">
-        <div class="dropdown d-inline-block navbar-nav">
-            <button class="btn btn-link btn-sm dropdown-toggle" type="button" data-toggle="dropdown"><%= sessionUser.real_name === '' ? sessionUser.mobile : sessionUser.real_name %></button>
-            <div class="dropdown-menu dropdown-menu-right">
-                <a class="dropdown-item" href="/user/info" target="_blank">账号资料</a>
-                <a class="dropdown-item" href="user-buy.html" target="_blank">产品购买</a>
-                <a class="dropdown-item" href="/user/preferences" target="_blank">登录设置</a>
+        <ul class="nav navbar-nav">
+            <li class="nav-item dropdown">
+                <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown"><%= sessionUser.real_name === '' ? sessionUser.mobile : sessionUser.real_name %></a>
+                <div class="dropdown-menu dropdown-menu-right">
+                    <a class="dropdown-item" href="/user/info" target="_blank">账号资料</a>
+                    <a class="dropdown-item" href="user-buy.html" target="_blank">产品购买</a>
+                    <a class="dropdown-item" href="/user/preferences" target="_blank">登录设置</a>
+                    <div class="dropdown-divider"></div>
+                    <a class="dropdown-item" href="/logout">退出登录</a>
+                </div>
+            </li>
+            <% if (action === 'index' && controller === 'main') {%>
+            <li class="nav-item dropdown">
+                <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-wrench"></i> 工具</a>
+                <div class="dropdown-menu dropdown-menu-right">
+                    <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="/complementaryGlj" target="_">人材机库编辑器</a>
+                </div>
+            </li>
+            <% } %>
+            <li class="nav-item dropdown">
+                <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-question-circle-o"></i> 帮助</a>
+                <div class="dropdown-menu dropdown-menu-right">
+                    <a class="dropdown-item" href="#">帮助</a>
+                    <a class="dropdown-item" href="#">升级说明</a>
+                    <a class="dropdown-item" href="#">重庆市2008定额说明</a>
+                    <a class="dropdown-item" href="#">纵横官网</a>
+                    <a class="dropdown-item" href="#">动画教程</a>
+                    <a class="dropdown-item" href="#">联系客服</a>
+                    <a class="dropdown-item" href="#">关于</a>
+                </div>
+            </li>
+            <li class="nav-item">
+                <a class="nav-link <% if (unreadCount > 0) { %>new-msg<% } %>" id="notify-info" data-toggle="modal" data-target="#msg" href="javacript:void(0);">
+                    <i class="fa fa-envelope-o" aria-hidden="true"></i>&nbsp;<span id="unread-num"><%= unreadCount %></span>
+                </a>
+            </li>
+        </ul>
+    </div>
+</nav>
+<!--弹出补充定额库-->
+<div class="modal fade" id="comple-ration" data-backdrop="static">
+    <div class="modal-dialog modal-lg" 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-auto-height">
+                <table class="table table-hover table-bordered">
+                    <thead><tr><th>定额库名称</th></tr></thead>
+                    <tbody id="comple_ration_table">
+                    </tbody>
+                </table>
             </div>
             </div>
         </div>
         </div>
-        <a class="btn btn-link btn-sm <% if (unreadCount > 0) { %>new-msg<% } %>" id="notify-info" data-toggle="modal" data-target="#msg" href="javacript:void(0);">
-            <i class="fa fa-envelope-o" aria-hidden="true"></i>&nbsp;<span id="unread-num"><%= unreadCount %></span>
-        </a>
-        <a class="btn btn-link btn-sm" href="/logout">注销</a>
     </div>
     </div>
-</nav>
+</div>
 <!--弹出消息-->
 <!--弹出消息-->
 <div class="modal fade" id="msg" data-backdrop="static">
 <div class="modal fade" id="msg" data-backdrop="static">
     <div class="modal-dialog modal-lg" role="document">
     <div class="modal-dialog modal-lg" role="document">

BIN
web/dest/css/logo.png