|  | @@ -904,6 +904,7 @@ var projectObj = {
 | 
	
		
			
				|  |  |                  // that.project.initCalcFields();
 | 
	
		
			
				|  |  |                  let str = JSON.stringify(that.project.projSetting.main_tree_col);
 | 
	
		
			
				|  |  |                  that.project.projSetting.mainGridSetting = JSON.parse(str);
 | 
	
		
			
				|  |  | +                console.log(that.project.projSetting.mainGridSetting);
 | 
	
		
			
				|  |  |                  that.project.projSetting.mainGridSetting.frozenCols = 4;
 | 
	
		
			
				|  |  |                  TREE_SHEET_HELPER.initSetting($('#billsSpread')[0], that.project.projSetting.mainGridSetting);
 | 
	
		
			
				|  |  |                  that.project.projSetting.mainGridSetting.setAutoFitRow = MainTreeCol.getEvent("setAutoFitRow");
 | 
	
	
		
			
				|  | @@ -977,9 +978,9 @@ var projectObj = {
 | 
	
		
			
				|  |  |                  that.mainSpread.bind(GC.Spread.Sheets.Events.ColumnWidthChanged, that.onColumnWidthChanged);
 | 
	
		
			
				|  |  |                  that.mainSpread.bind(GC.Spread.Sheets.Events.ClipboardPasting, that.onClipboardPasting);
 | 
	
		
			
				|  |  |                  //let loadOtherStartTime = +new Date();
 | 
	
		
			
				|  |  | -                if(!projectReadOnly){
 | 
	
		
			
				|  |  | +                //if(!projectReadOnly){
 | 
	
		
			
				|  |  |                      that.loadMainSpreadContextMenu();
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +                //}
 | 
	
		
			
				|  |  |                  socketObject.connect();//连接socket服务器
 | 
	
		
			
				|  |  |                  let endTime = +new Date();
 | 
	
		
			
				|  |  |                  console.log(`其它时间——${endTime - endShowTime}`);
 | 
	
	
		
			
				|  | @@ -1169,7 +1170,7 @@ var projectObj = {
 | 
	
		
			
				|  |  |                      name: "插入大项费用",
 | 
	
		
			
				|  |  |                      icon: 'fa-sign-in',
 | 
	
		
			
				|  |  |                      disabled: function () {
 | 
	
		
			
				|  |  | -                        return projectObj.project.isBillsLocked() && project.withinBillsLocked(project.mainTree.selected);
 | 
	
		
			
				|  |  | +                        return projectReadOnly || (projectObj.project.isBillsLocked() && project.withinBillsLocked(project.mainTree.selected));
 | 
	
		
			
				|  |  |                          //return project.mainTree.selected ? project.mainTree.selected.sourceType !== project.Bills.getSourceType() : false;
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                      callback: function (key, opt) {
 | 
	
	
		
			
				|  | @@ -1183,6 +1184,9 @@ var projectObj = {
 | 
	
		
			
				|  |  |                      name: "插入分部",
 | 
	
		
			
				|  |  |                      icon: 'fa-sign-in',
 | 
	
		
			
				|  |  |                      disabled: function () {
 | 
	
		
			
				|  |  | +                        if (projectReadOnly) {
 | 
	
		
			
				|  |  | +                            return true;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                          let selected = project.mainTree.selected;
 | 
	
		
			
				|  |  |                          if(projectObj.project.isBillsLocked()== false&&selected&&selected.sourceType==project.Bills.getSourceType()){
 | 
	
		
			
				|  |  |                              if(selected.data.type==billType.FB){
 | 
	
	
		
			
				|  | @@ -1214,6 +1218,9 @@ var projectObj = {
 | 
	
		
			
				|  |  |                      name: "插入分项",
 | 
	
		
			
				|  |  |                      icon: 'fa-sign-in',
 | 
	
		
			
				|  |  |                      disabled: function () {
 | 
	
		
			
				|  |  | +                        if (projectReadOnly) {
 | 
	
		
			
				|  |  | +                            return true;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                          let selected = project.mainTree.selected;
 | 
	
		
			
				|  |  |                          if(projectObj.project.isBillsLocked()== false&& selected&&selected.sourceType==project.Bills.getSourceType()){
 | 
	
		
			
				|  |  |                              if(selected.data.type==billType.FX||selected.data.type==billType.BX){//焦点行是分项,有效显示
 | 
	
	
		
			
				|  | @@ -1252,6 +1259,9 @@ var projectObj = {
 | 
	
		
			
				|  |  |                      name: "插入清单",
 | 
	
		
			
				|  |  |                      icon: 'fa-sign-in',
 | 
	
		
			
				|  |  |                      disabled: function () {
 | 
	
		
			
				|  |  | +                        if (projectReadOnly) {
 | 
	
		
			
				|  |  | +                            return true;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                          let selected = project.mainTree.selected;
 | 
	
		
			
				|  |  |                          if(!(projectObj.project.isBillsLocked()== true && project.withinBillsLocked(selected)) && selected && selected.sourceType === project.Bills.getSourceType()){
 | 
	
		
			
				|  |  |                              return false
 | 
	
	
		
			
				|  | @@ -1281,6 +1291,9 @@ var projectObj = {
 | 
	
		
			
				|  |  |                      name: "插入定额",
 | 
	
		
			
				|  |  |                      icon: 'fa-sign-in',
 | 
	
		
			
				|  |  |                      disabled: function () {
 | 
	
		
			
				|  |  | +                        if (projectReadOnly) {
 | 
	
		
			
				|  |  | +                            return true;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                          // var selected = project.mainTree.selected;
 | 
	
		
			
				|  |  |                          // return project.Ration.addRationChecking(selected);  // Vincent, 2018-01-02
 | 
	
		
			
				|  |  |                          // 工具栏要加按钮,且不能隐藏。菜单可以隐藏,两者又必须统一,所以启用新规则。怕以后又要改回来,所以保留。 CSL, 2018-01-02
 | 
	
	
		
			
				|  | @@ -1299,6 +1312,9 @@ var projectObj = {
 | 
	
		
			
				|  |  |                      name: "插入量价",//插入量价不需要自动定位到编号列
 | 
	
		
			
				|  |  |                      icon: 'fa-sign-in',
 | 
	
		
			
				|  |  |                      disabled: function () {
 | 
	
		
			
				|  |  | +                        if (projectReadOnly) {
 | 
	
		
			
				|  |  | +                            return true;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                          // var selected = project.mainTree.selected;
 | 
	
		
			
				|  |  |                          // return project.Ration.addRationChecking(selected);  // Vincent, 2018-01-02
 | 
	
		
			
				|  |  |                          return !project.Ration.canAdd(project.mainTree.selected);
 | 
	
	
		
			
				|  | @@ -1351,6 +1367,9 @@ var projectObj = {
 | 
	
		
			
				|  |  |                      name: "插入人材机",
 | 
	
		
			
				|  |  |                      icon: 'fa-sign-in',
 | 
	
		
			
				|  |  |                      disabled: function () {
 | 
	
		
			
				|  |  | +                        if (projectReadOnly) {
 | 
	
		
			
				|  |  | +                            return true;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                          // var selected = project.mainTree.selected;
 | 
	
		
			
				|  |  |                          // return project.Ration.addRationChecking(selected);  // Vincent, 2018-01-02
 | 
	
		
			
				|  |  |                          return !project.Ration.canAdd(project.mainTree.selected);
 | 
	
	
		
			
				|  | @@ -1376,6 +1395,9 @@ var projectObj = {
 | 
	
		
			
				|  |  |                      name: "计取安装费用",
 | 
	
		
			
				|  |  |                      icon: 'fa-sign-in',
 | 
	
		
			
				|  |  |                      disabled: function () {
 | 
	
		
			
				|  |  | +                        if (projectReadOnly) {
 | 
	
		
			
				|  |  | +                            return true;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                          return false;
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                      callback: function (key, opt) {
 | 
	
	
		
			
				|  | @@ -1389,6 +1411,9 @@ var projectObj = {
 | 
	
		
			
				|  |  |                      name: '删除',
 | 
	
		
			
				|  |  |                      icon: 'fa-remove',
 | 
	
		
			
				|  |  |                      disabled: function () {
 | 
	
		
			
				|  |  | +                        if (projectReadOnly) {
 | 
	
		
			
				|  |  | +                            return true;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                          return !ifCanDelete();
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                      callback: function () {
 | 
	
	
		
			
				|  | @@ -1406,6 +1431,11 @@ var projectObj = {
 | 
	
		
			
				|  |  |                      callback: function () {
 | 
	
		
			
				|  |  |                          project.calcProgram.calcAllNodesAndSave();
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  | +                    disabled: function () {
 | 
	
		
			
				|  |  | +                        if (projectReadOnly) {
 | 
	
		
			
				|  |  | +                            return true;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  |                      visible:function(key, opt){//2018-11-15 新需求隐藏右键“造价计算”。
 | 
	
		
			
				|  |  |                          return false;
 | 
	
		
			
				|  |  |                      }
 | 
	
	
		
			
				|  | @@ -1415,6 +1445,9 @@ var projectObj = {
 | 
	
		
			
				|  |  |                      name: '复制整块',
 | 
	
		
			
				|  |  |                      icon: 'fa-copy',
 | 
	
		
			
				|  |  |                      disabled: function () {
 | 
	
		
			
				|  |  | +                        if (projectReadOnly) {
 | 
	
		
			
				|  |  | +                            return true;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                          let selection = projectObj.mainSpread.getActiveSheet().getSelections()[0];
 | 
	
		
			
				|  |  |                          let firstNode = projectObj.project.mainTree.items[selection.row];//当多选的情况,用mainTree.selected判断不正确,要用第一个选中的节点
 | 
	
		
			
				|  |  |                          for(let i = 0;i< selection.rowCount;i++){ //多选的时候判断所有与第一个节点同级的节点
 | 
	
	
		
			
				|  | @@ -1442,6 +1475,9 @@ var projectObj = {
 | 
	
		
			
				|  |  |                      name: '粘贴整块',
 | 
	
		
			
				|  |  |                      icon: 'fa-paste',
 | 
	
		
			
				|  |  |                      disabled: function (){
 | 
	
		
			
				|  |  | +                        if (projectReadOnly) {
 | 
	
		
			
				|  |  | +                            return true;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                          return BlockController.pasteBtnDisable(project.mainTree.selected);
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                      callback: function () {
 | 
	
	
		
			
				|  | @@ -1451,6 +1487,9 @@ var projectObj = {
 | 
	
		
			
				|  |  |                  "editEngineer": {
 | 
	
		
			
				|  |  |                      name: '编辑工程内容',
 | 
	
		
			
				|  |  |                      icon: 'fa-edit',
 | 
	
		
			
				|  |  | +                    disabled: function () {
 | 
	
		
			
				|  |  | +                        return projectReadOnly;
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  |                      visible: function(key, opt){
 | 
	
		
			
				|  |  |                           let  selected = project.mainTree.selected;
 | 
	
		
			
				|  |  |                           return selected.sourceType==ModuleNames.bills&&project.Bills.isEngineerEst(selected);//当焦点行是“专业工程暂估价”时,右键可见并有效。
 | 
	
	
		
			
				|  | @@ -1465,6 +1504,9 @@ var projectObj = {
 | 
	
		
			
				|  |  |                  "editService": {
 | 
	
		
			
				|  |  |                      name: '编辑服务内容',
 | 
	
		
			
				|  |  |                      icon: 'fa-edit',
 | 
	
		
			
				|  |  | +                    disabled: function () {
 | 
	
		
			
				|  |  | +                        return projectReadOnly;
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  |                      visible: function(key, opt){
 | 
	
		
			
				|  |  |                          let  selected = project.mainTree.selected;
 | 
	
		
			
				|  |  |                          return selected.sourceType==ModuleNames.bills&&project.Bills.isTotalService(selected);//当焦点行是“总承包服务费”时,右键可见并有效。
 | 
	
	
		
			
				|  | @@ -1479,6 +1521,9 @@ var projectObj = {
 | 
	
		
			
				|  |  |                  "editAccording": {
 | 
	
		
			
				|  |  |                      name: '编辑签证及索赔依据',
 | 
	
		
			
				|  |  |                      icon: 'fa-edit',
 | 
	
		
			
				|  |  | +                    disabled: function () {
 | 
	
		
			
				|  |  | +                        return projectReadOnly;
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  |                      visible: function(key, opt){
 | 
	
		
			
				|  |  |                          let  selected = project.mainTree.selected;
 | 
	
		
			
				|  |  |                          return selected.sourceType==ModuleNames.bills&&project.Bills.isClaimVisa(selected);//当焦点行是“签证及索赔计价”时,右键可见并有效。
 | 
	
	
		
			
				|  | @@ -1494,6 +1539,9 @@ var projectObj = {
 | 
	
		
			
				|  |  |                      name:'智能材料替换',
 | 
	
		
			
				|  |  |                      icon: 'fa-edit',
 | 
	
		
			
				|  |  |                      disabled:function (key,opt) {
 | 
	
		
			
				|  |  | +                        if (projectReadOnly) {
 | 
	
		
			
				|  |  | +                            return true;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                          let  selected = project.mainTree.selected;
 | 
	
		
			
				|  |  |                          return selected.sourceType==ModuleNames.bills ?!(project.Bills.isFXorBX(selected)||selected.source.children.length ==0):true//是分项、补项或叶子清单才有效;
 | 
	
		
			
				|  |  |                      },
 | 
	
	
		
			
				|  | @@ -1508,14 +1556,14 @@ var projectObj = {
 | 
	
		
			
				|  |  |                      name:'生成组价模板',
 | 
	
		
			
				|  |  |                      icon: 'fa-puzzle-piece',
 | 
	
		
			
				|  |  |                      disabled:function (key,opt) {
 | 
	
		
			
				|  |  | +                        if (projectReadOnly) {
 | 
	
		
			
				|  |  | +                            return true;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                          let selected = project.mainTree.selected;
 | 
	
		
			
				|  |  |                          return selected.sourceType != ModuleNames.bills;
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  | -                    callback:function(){
 | 
	
		
			
				|  |  | -                        if (!$("#kmbk").is(":visible")){
 | 
	
		
			
				|  |  | -                            $('#blockLibTab').click()
 | 
	
		
			
				|  |  | -                        };
 | 
	
		
			
				|  |  | -                        $("#div_createBlocks").modal({show: true});
 | 
	
		
			
				|  |  | +                    callback: function(){
 | 
	
		
			
				|  |  | +                        blockLibObj.checkShow();
 | 
	
		
			
				|  |  |                      },
 | 
	
		
			
				|  |  |                      visible: function(key, opt){
 | 
	
		
			
				|  |  |                          return G_SHOW_BLOCK_LIB;
 | 
	
	
		
			
				|  | @@ -2976,13 +3024,13 @@ $(function () {
 | 
	
		
			
				|  |  |          $('#clone_option_noCover').prop("checked", true);
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    $("#btn_block_createBlocks").click(function () {
 | 
	
		
			
				|  |  | +    $("#btn_block_createBlocks").click(async function () {
 | 
	
		
			
				|  |  |          if ($("#select_block_category")[0].options.length < 1) return;
 | 
	
		
			
				|  |  |          let cID = $("#select_block_category").val();
 | 
	
		
			
				|  |  |          let selected = projectObj.project.mainTree.selected;
 | 
	
		
			
				|  |  |          let cover = $('#ckb_block_exist_cover').prop("checked");
 | 
	
		
			
				|  |  | -        function createBlocks(aNode, categoryID){
 | 
	
		
			
				|  |  | -            function createBlock(node) {
 | 
	
		
			
				|  |  | +        async function createBlocks(aNode, categoryID){
 | 
	
		
			
				|  |  | +            async function createBlock(node) {
 | 
	
		
			
				|  |  |                  if (node.data.name == undefined || node.data.name == '') return;  // 清单名称为空,不生成块模板文件
 | 
	
		
			
				|  |  |                  if (node.children.length == 0) return;
 | 
	
		
			
				|  |  |                  // 封装成伟城的块文件格式,直接调用伟城接口(定额这里的业务太多太庞杂,不要再重做一遍,尽量共用,维护代价小)
 | 
	
	
		
			
				|  | @@ -3005,10 +3053,10 @@ $(function () {
 | 
	
		
			
				|  |  |                      if (cover) blockLibObj.assignData(extN, vBlock_WC);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  else
 | 
	
		
			
				|  |  | -                    blockLibObj.newNode(2, fileName, categoryID, vBlock_WC);
 | 
	
		
			
				|  |  | +                    await blockLibObj.newNode(2, fileName, categoryID, vBlock_WC);
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            function createRecursion(node){
 | 
	
		
			
				|  |  | +            async function createRecursion(node){
 | 
	
		
			
				|  |  |                  if (!node) return;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  if (calcTools.isLeafBill(node)) createBlock(node);
 | 
	
	
		
			
				|  | @@ -3018,12 +3066,12 @@ $(function () {
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              if (calcTools.isLeafBill(aNode))
 | 
	
		
			
				|  |  | -                createBlock(aNode)
 | 
	
		
			
				|  |  | +               await createBlock(aNode)
 | 
	
		
			
				|  |  |              else
 | 
	
		
			
				|  |  | -                createRecursion(aNode.firstChild());
 | 
	
		
			
				|  |  | +               await createRecursion(aNode.firstChild());
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        createBlocks(selected, cID);
 | 
	
		
			
				|  |  | +        await createBlocks(selected, cID);
 | 
	
		
			
				|  |  |          blockLibObj.loadDetailDatas(blockLibObj.mainTree.selected);
 | 
	
		
			
				|  |  |          $("#div_createBlocks").modal("hide");
 | 
	
		
			
				|  |  |      });
 |