Selaa lähdekoodia

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

zhongzewei 6 vuotta sitten
vanhempi
commit
748355b86b

+ 14 - 1
modules/glj/models/unit_price_model.js

@@ -128,13 +128,26 @@ class UnitPriceModel extends BaseModel {
         }
 
         if (unitPriceData&&unitPriceData.length>0&&operation!='add') {// 如果原始编码能找到,但不存在一样的编号,名称,单位.型号等,更改code和添加新增标记,新增的时候除外。新增的情况下能到这一步说明有存在编码一致但其它属性不一致的情况,所以不用更改编码
-            insertData.code = data.original_code+"-"+unitPriceData.length;
+            //insertData.code = data.original_code+"-"+unitPriceData.length;
+            insertData.code = data.original_code+"-"+this.getLastNumber(data.original_code,unitPriceData);
             insertData.is_add=1;
         }
         let addPriceResult = await this.add(insertData);
         return [addPriceResult, true];
     }
+     getLastNumber(original_code,unitPriceData){
+        let codeArray = _.map(unitPriceData,'code');
+        let last = 1;
+        while (true){
+            if(_.includes(codeArray,original_code+"-"+last)){
+                last +=1
+            }else {
+                break;
+            }
+        }
+        return last;
 
+     }
     /**
      * 新增记录
      *

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

@@ -209,7 +209,7 @@ async function markUpdateProject(data,type) {
     if(type=="unitFile"){//更改了单价文件
         query['property.unitPriceFile.id'] = data.unitFileID;//unitPriceFile
     }
-    let projects =await projectsModel.find(query);
+    let projects = await projectsModel.find(query);
     for(let p of projects){
         if(p.ID!=data.projectID){//当前项目不用更新
             tasks.push(generateMarkTask(type,p.ID));

+ 1 - 1
modules/reports/rpt_component/jpc_bill_tab.js

@@ -114,7 +114,7 @@ JpcBillTabSrv.prototype.createNew = function(){
                 for (let i = 0; i < tab_fields.length; i++) {
                     let tab_field = tab_fields[i];
                     let data_field = null, map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
-                    if (me.disp_fields_idx.length > i && me.disp_fields_idx[i] !== JV.BLANK_FIELD_INDEX) {
+                    if (me.disp_fields_idx.length > i && me.disp_fields_idx[i] !== JV.BLANK_FIELD_INDEX && (typeof me.disp_fields_idx[i] !== 'object')) {
                         data_field = data_details[me.disp_fields_idx[i]];
                     } else {
                         if (map_data_field) {

+ 1 - 0
public/web/gljUtil.js

@@ -334,6 +334,7 @@ let gljUtil = {
         PROFIT: 7,                                  // 利润
         GENERAL_RISK_FEE: 8                         // 一般风险费
     },
+    extraType:[6,7,8],//一些其它的工料机类型
     notEditType : [202,203,204,301,304,4],
     gljKeyArray : ['code','name','specs','unit','type'],
     rationType : {

+ 24 - 0
public/web/sheet/sheet_common.js

@@ -181,6 +181,10 @@ var sheetCommonObj = {
             if(setting.header[col].cellType === "selectButton"){
                 this.setSelectButton(row,col,sheet,setting.header[col]);
             }
+            if(setting.header[col].cellType === "replaceButton"){
+                this.setReplaceButton(row,col,sheet,setting.header[col]);
+            }
+
             if(setting.header[col].cellType === "tipsCell"){
                 this.setTipsCell(row,col,sheet,setting.header[col]);
             }
@@ -425,6 +429,26 @@ var sheetCommonObj = {
         };
         sheet.setCellType(row, col,getSelectButton(header.headerWidth),GC.Spread.Sheets.SheetArea.viewport);
     },
+    setReplaceButton(row,col,sheet){
+        let replaceButton = function(){
+
+        };
+        replaceButton.prototype = new GC.Spread.Sheets.CellTypes.Button();
+        replaceButton.prototype.paint = function (ctx, value, x, y, w, h, style, options){
+            GC.Spread.Sheets.CellTypes.Button.prototype.paint.apply(this,arguments);
+            if(value){
+                ctx.save();
+                ctx.fillStyle = "white";
+                let fh = options.fontInfo&&options.fontInfo.fontSize?options.fontInfo.fontSize:h-6;
+                ctx.fillText(value,x+(w+ctx.measureText(value).width)/2,y+(h+fh)/2-2);
+                ctx.restore();
+            }
+        };
+        let cellType = new replaceButton();
+        cellType.buttonBackColor("#07A0FF");
+        sheet.setCellType(row, col,cellType,GC.Spread.Sheets.SheetArea.viewport);
+    },
+
     setTipsCell(row,col,sheet,header){
         let TipCellType = function () {};
         TipCellType.prototype = new GC.Spread.Sheets.CellTypes.Text();

+ 3 - 4
public/web/socket/connection.js

@@ -7,15 +7,14 @@ socketObject={
       // 连接socket服务器
       var hostName = window.location.hostname;
       let me = this;
-      let port = window.location.protocol ==='http:'?3300:3301
+      let port = window.location.protocol ==='http:'?3300:3301;
       socket = io(window.location.protocol+'//'+hostName+':'+port);
       socket.on('connect', function () {
           me.roomInfo={
               feeRate:me.getFeeRateRoomID(),
               unitFile:me.getUnitFileRoomID()
-          }
-          socket.emit('join', {name:'feeRate',value:me.getFeeRateRoomID()});
-          socket.emit('join', {name:'unitFile',value:me.getUnitFileRoomID()});
+          };
+          socket.emit('join', me.roomInfo);
           console.log('连接成功');
       });
 

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

@@ -508,9 +508,9 @@ var TREE_SHEET_HELPER = {
                 $editor.css("height", cellRect.height);
                 $editor.attr("gcUIElement", "gcEditingInput");//padding:0  //value="${context.sheet.getValue(context.row,context.col)}"
                 $editor.html(` <div class="input-group input-group-sm">
-                                <input type="text" id="esInput" class="form-control" aria-label="Text input with dropdown button" autocomplete="off"   style="background-color:${cellStyle.backColor}">
+                                <input type="text" id="esInput" class="form-control" aria-label="Text input with dropdown button" autocomplete="off"   style=" background-color:${cellStyle.backColor}">
                                 <div class="">                           
-                                    <div class="triangle-border_dropdown tb-border_dropdown" id="esBtn" style="left: ${cellRect.width - 15+"px"}"></div>
+                                    <div class="triangle-border_dropdown tb-border_dropdown" id="esBtn" style="z-index:10; left: ${cellRect.width - 15+"px"};top:${cellRect.height/2-2+"px"}"></div>
                                 </div>
                             </div>
                 `);
@@ -521,15 +521,16 @@ var TREE_SHEET_HELPER = {
 
             TreeNodeCellType.prototype.updateEditor = function (editorContext, cellStyle, cellRect, context) {
                 let me = this;
-                $(editorContext).append(`<div><ul class="es-list" style="display: block;background-color:${cellStyle.backColor}"></ul></div>`);//<li class="" data-value="" style=""> <br></li>
+                $(editorContext).append(`<div><ul class="es-list" style="display: block;"></ul></div>`);//<li class="" data-value="" style=""> <br></li> //background-color:${cellStyle.backColor}
                 $('#esInput').val(context.sheet.getValue(context.row,context.col));
                 $('#esInput').select();
                 projectObj.project.Ration.getNearRations(initNode.data,function(rations){
                     if(rations.length > 0){
                         let li_html = "";
                         for(let r of rations){
-                            if(r.code==initNode.data.code) continue; //排除自已
-                            li_html += `<li class="es_li" data-value="${r.code}" >${r.code} ${r.name} ${r.unit}</li>`;//定额编码+空格+定额名称+空格+定额单位。
+                            let selfstyle = ""
+                            if(r.code==initNode.data.code) selfstyle="es-list-selected" //continue; //改为不排除,标记本身
+                            li_html += `<li class="es_li ${selfstyle}" data-value="${r.code}" >${r.code} ${r.name} ${r.unit}</li>`;//定额编码+空格+定额名称+空格+定额单位。
                         }
                         $(".es-list").html(li_html);
                         $(".es-list").css("min-width",cellRect.width);
@@ -541,6 +542,13 @@ var TREE_SHEET_HELPER = {
                         $(".es-list").hide();
                         context.sheet.endEdit();
                     })
+                    $(".es-list").children(".es_li").hover(function(){
+                        $(this).css("background-color",cellStyle.backColor);
+                    },function(){
+                        $(this).css("background-color","");
+                    });
+
+
                     $("#esBtn").bind('click',function(e){
                         $(".es-list").toggle();
                     });

+ 2 - 2
server.js

@@ -45,9 +45,9 @@ app.use(session({
     cookie: {maxAge: 3600 * 24 * 1000},
     resave: false,
     rolling: true,
-    saveUninitialized: true
+    saveUninitialized: true,
     //*
-    ,store: new DBStore({
+    store: new DBStore({
         url: config.getSessionURL(process.env.NODE_ENV)
     })
     //*/

+ 7 - 5
socket.js

@@ -15,11 +15,11 @@ socketIO.on('connection', function(socket) {
     console.log("new connection");
     // 加入房间
     socket.on('join', function(data) {
-        roomInfo[data.name] = data.value;
-        socket.join(data.value);
+        for(let key in data){
+            roomInfo[key] = data[key];
+            socket.join(data[key]);
+        }
     });
-
-
     // 数据更改通知
     socket.on('unitFileChangeNotify', function(data) {
         console.log(roomInfo);
@@ -36,5 +36,7 @@ socketIO.on('connection', function(socket) {
         socket.join(data.newRoom);
         roomInfo[data.name]=data.newRoom;
     });
-
+    socket.on('disconnect', function () {
+        console.log("client disconnect =========="+JSON.stringify(roomInfo));
+    });
 });

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

@@ -32,7 +32,8 @@ let demoPrjId = - 1;
 // let demoRptId = 361; //封1
 // let demoRptId = 279; //表04
 // let demoRptId = 261; //封3
-let demoRptId = 400; //09
+// let demoRptId = 400; //09
+let demoRptId = 530; //封2
 // let demoRptId = 386; //04
 // let demoRptId = 389; //10
 // let demoRptId = 280; //11-1 暂列金
@@ -47,7 +48,7 @@ let userId_HaiZhu = "5b5a66c4a3c23e000dccdd77"; //海珠user id
 // demoPrjId = 720; //QA: DW3
 //demoPrjId = 1626; //QA:
 // demoPrjId = 2260; //QA:
-demoPrjId = 3834; //QA:
+demoPrjId = 4529; //QA:
 //*/
 let userId_Dft = userId_HaiZhu;
 // let userId_Dft = "5a025c4c15074d134c2b9689";

+ 14 - 1
web/building_saas/css/custom.css

@@ -231,9 +231,14 @@ legend.legend{
     border:none;
 }
 
-.es-list>li:hover{
+/*.es-list>li:hover{
+    background: lightgrey;
+}*/
+
+.es-list-selected{
     background: lightgrey;
 }
+
 .es-list>li{
     font-size:13px;
 }
@@ -248,4 +253,12 @@ legend.legend{
     font-size:13px;
     color: black;
 }
+.ration_glj_spread{
+    width: 70%;
+    float: left;
+}
 
+.item_spread{
+    width: 30%;
+    float: left;
+}

+ 2 - 2
web/building_saas/main/html/main.html

@@ -164,8 +164,8 @@
                               <!-- Tab panes -->
                               <div class="tab-content" id="tabCon">
                                   <div class="tab-pane active" id="subItems" role="tabpanel">
-                                      <div class="main-data-bottom ovf-hidden" id="subSpread" style="display: none" tabindex="0">
-                                      </div>
+                                      <div class="main-data-bottom ovf-hidden" id="subSpread" style="display: none" tabindex="0"></div>
+                                      <div class="main-data-bottom ovf-hidden item_spread" id="replaceM" style="display: none" ></div>
                                       <div class="main-data-bottom ovf-hidden" id="tabZMHS" style="display: none">
                                           <div class=" main-data-bottom ovf-hidden" style="width: 50%; float: left; margin: 0; padding:0;" id="coeSpread"></div>
                                           <div class=" main-data-bottom ovf-hidden" style="width: 50%; float: left; margin: 0; padding:0;" id="assSpread"></div>

+ 92 - 10
web/building_saas/main/js/controllers/material_controller.js

@@ -31,7 +31,6 @@ let MaterialController = {
             }
         });
     },
-
     startReplace:function (nodes,result) {//其实应该是批量修改工料机属性,与替换工料机不同
         let me = this,updateData = [];
         for(let n of nodes){
@@ -41,6 +40,10 @@ let MaterialController = {
                 if(r_list.length > 0) updateData.push(...r_list);
             }
         }
+        me.postReplace(updateData);
+    },
+    postReplace:function (updateData) {
+        let me = this;
         if(updateData.length == 0) return;
         $.bootstrapLoading.start();
         CommonAjax.post("/material/replace",updateData,function(result){
@@ -48,7 +51,6 @@ let MaterialController = {
             me.updateCacheAfterReplace(result)
         })
     },
-
     updateCacheAfterReplace:function (result){
         let nodes = [];
         for(let data of result){
@@ -72,7 +74,6 @@ let MaterialController = {
             ration_glj_model.refreshTreeNodeIfNeeded(glj);//刷新造价书上的树节点(如果需要)
         }
     },
-
     eachNode:function (node,item) {
         let replaceDatas =[];
         if(item && item.bills.rule){
@@ -83,7 +84,6 @@ let MaterialController = {
         }
         return replaceDatas;
     },
-
     getReplaceData:function (billsItemID,materialMap,replace_property) {
         let list = [];
         let replace_glj_list = this.findMatchRationGLJ(billsItemID,materialMap);//取出需要替换的工料机和对替换的材料内容
@@ -93,8 +93,6 @@ let MaterialController = {
         }
         return list;
     },
-
-
     getDoc:function (glj,material,replace_property) {//取定额工料机中需要修改的内容
         let doc = {},keyList = ['name','specs','type','unit'];
         for(let key of keyList){
@@ -106,8 +104,6 @@ let MaterialController = {
         return doc;
 
     },
-
-
     findMatchRationGLJ:function (billsItemID,materialMap) {//查找清单下匹配的需要替换的定额工料机
         let replaceList=[];
         for(let g of projectObj.project.ration_glj.datas){
@@ -136,7 +132,6 @@ let MaterialController = {
             callback(null);
         }
     },
-
     getKeyString:function (itemText,matchStr) {//截取关键数据
         itemText = itemText.replace(/:/g, ":");//中文字符转换为英文字符
         itemText = itemText.replace(matchStr,"@$@");//用特殊符号取代关键字,方便截取
@@ -149,6 +144,93 @@ let MaterialController = {
     },
     trim:function (str) {
         return str.replace(/(^\s*)|(\s*$)/g, "");
+    },
+    //--------------2018-10-08新加替换表格-----------------
+    setting:{
+        header:[
+            {headerName: "项目特征", headerWidth: 120, dataCode: "character", dataType: "String"},
+            {headerName: "内容", headerWidth: 240, dataCode: "context", dataType: "String"},
+            {headerName: "名称", headerWidth: 50, dataCode: "name", dataType: "String",hAlign: "center",cellType:"replaceButton"},
+            {headerName: "规格", headerWidth: 50, dataCode: "specs", dataType: "String",hAlign: "center",cellType:"replaceButton"},
+        ],
+        view: {
+            lockColumns: [0,1,2,3],
+            rowHeaderWidth:25
+        }
+    },
+    spread:null,
+    sheet:null,
+    datas:[],
+    showReplaceDiv:function (node) {
+        $("#subSpread").addClass("ration_glj_spread");
+        $("#replaceM").show();
+        if(node) this.showReplaceSpread(node);//如果不是只刷新页面
+        refreshSubSpread();
+    },
+    hideReplaceDiv:function(){
+        $("#subSpread").removeClass("ration_glj_spread");
+        $("#replaceM").hide();
+        refreshSubSpread();
+    },
+    showReplaceSpread:function(node){
+        this.initSpread();
+        this.showData(node);
+    },
+    initSpread:function () {
+        if(!this.spread){
+            this.spread = SheetDataHelper.createNewSpread($("#replaceM")[0]);
+            this.initSheet();
+        }else {
+            this.spread.refresh();
+        }
+    },
+    initSheet:function(){
+        this.sheet = this.spread .getSheet(0);
+        sheetCommonObj.initSheet( this.sheet, this.setting);
+        this.spread.bind(GC.Spread.Sheets.Events.ButtonClicked, this.onReplaceButtonClick);
+        this.sheet.name('materialReplace');
+    },
+    showData:function(node){
+        this.datas = [];
+        let selected = node?node:projectObj.project.mainTree.selected;
+        let parent = selected.parent;
+        if(selected&&parent){
+            this.getItems(parent.data.itemCharacterText);
+        }
+        sheetCommonObj.showData(this.sheet, this.setting,this.datas);
+        this.sheet.setRowCount(this.datas.length);
+    },
+    getItems:function(characterText){
+        if(!characterText) return;
+        let strArray =  characterText.split(/\n/);
+        for(let tem of strArray){
+            tem = tem.replace(/:/g, ":");//中文字符转换为英文字符
+            if(tem.indexOf(":") != -1){//有:号才提取
+                let proArr = tem.split(":");
+                //如果内容为空的话也不提取
+                let context = this.trim(proArr[1]);
+                if(context!="") this.datas.push({character:proArr[0],context:context,name:"换",specs:"换"})
+            }
+        }
+    },
+    onReplaceButtonClick:function(e, args){
+        let me = MaterialController;
+        let sheet = args.sheet, row = args.row, col = args.col;
+        let dataCode = me.setting.header[col].dataCode, item = me.datas[row], doc = {};
+        if(dataCode && item){
+            doc[dataCode] = item.context;
+            me.replaceByClick(doc);
+        }
+    },
+    replaceByClick:function (tem) {
+        let ration_glj = gljOprObj.getSelectedRationGlj();
+        let doc = {};
+        if(ration_glj && !ration_glj.isMixRatio){//有选中并且不是组成物
+            if(gljOprObj.isExtraType(ration_glj.type)) return; //如果是“企业管理费”“利润”“一般风险费”类型,不能替换
+            for(let key in tem){//检查属性是否做了改变,如果没有改变不用提交替换
+                if(ration_glj[key] != tem[key]) doc[key] = tem[key]
+            }
+            if(!_.isEmpty(doc)) this.postReplace([{glj:ration_glj,doc:doc}]);
+        }
     }
-
 };

+ 0 - 1
web/building_saas/main/js/models/main_consts.js

@@ -367,4 +367,3 @@ const materialComboMap = [
     {text:materialType[materialTypeMap.SN],value:materialTypeMap.SN},
     {text:materialType[materialTypeMap.SZ],value:materialTypeMap.SZ}
 ];
-

+ 29 - 11
web/building_saas/main/js/views/glj_view.js

@@ -403,25 +403,28 @@ var gljOprObj = {
         return;
     },
     rationGLJEditCheck:function (args) {//true 可以编辑,false 不能编辑
-        var me = gljOprObj;
-        var header = me.setting.header;
+        let me = gljOprObj,header = me.setting.header;
+        let dataCode = header[args.col] && header[args.col].dataCode?header[args.col].dataCode:null,recode = me.sheetData[args.row];
         if(me.sheet.getTag(args.row,args.col)=="locked") return false;//如果是双击树节点编号里设置了锁定标记,不能编辑
         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'//允许修改组成物市单价,其它的不可以
+        if(recode != undefined){
+            if(recode.isMixRatio){//对于组成物列
+               return dataCode == 'marketPrice'//允许修改组成物市单价,其它的不可以
             }else {
-                if (header[args.col] && header[args.col].dataCode == 'marketPrice') {
+                if (dataCode && dataCode == 'marketPrice') {
                     return !me.marketPriceReadOnly({data:me.sheetData[args.row]});
                 }
-                if (header[args.col] && header[args.col].dataCode == 'basePrice') {
-                    var isAdd = me.sheetData[args.row].isAdd;
+                if (dataCode && dataCode == 'basePrice') {
+                    var isAdd = recode.isAdd;
                     if(isAdd==1){//是新增但没有组成物时允许修改定额价
-                        return !me.marketPriceReadOnly({data:me.sheetData[args.row]});//如果有组成物,不可修改
+                        return !me.marketPriceReadOnly({data:recode});//如果有组成物,不可修改
                     } else {
                         return false;
                     }
                 }
+                if(me.isExtraType(recode.type)&&(dataCode == 'name'||dataCode == 'specs'||dataCode == 'unit')){//人材机窗口中的“企业管理费”“利润”“一般风险费”的名称、规格、单位改为只读。
+                    return false;
+                }
                 return true;
             }
         }else {
@@ -510,13 +513,17 @@ var gljOprObj = {
                 if(node.data.type==rationType.gljRation){
                     if($('#linkGLJ').hasClass('active'))  this.showMixRatio(node);
                 }else {
-                    if($('#linkGLJ').hasClass('active')) this.showRationGLJData(node);
+                    if($('#linkGLJ').hasClass('active')){
+                        this.showRationGLJData(node);
+                        MaterialController.showReplaceDiv(node);
+                    }
                     if($('#linkAZZJF').hasClass('active')) installationFeeObj.showRationInstallationData(node);
                 }
                 isShow = true;
             }
             if(node.sourceType == ModuleNames.ration_glj){
                 if($('#linkGLJ').hasClass('active')) this.showMixRatio(node);
+                MaterialController.hideReplaceDiv();
                 isShow = true;
             }
             if($('#linkGCLMX').hasClass('active')) this.showQuantityDetailData(node);
@@ -526,6 +533,7 @@ var gljOprObj = {
         }
         if (!isShow) {
             this.clearSheetData();
+            MaterialController.hideReplaceDiv();
         }
         //子目换算
         zmhs_obj.showZMHSData(node);
@@ -595,6 +603,13 @@ var gljOprObj = {
         this.sheetInitSelection({row: this.sheet.getActiveRowIndex(), col: this.sheet.getActiveColumnIndex()});
 
     },
+    getSelectedRationGlj:function () {
+        let selected = this.sheet.getSelections()[0];
+        let ration_glj = this.sheetData[selected.row];
+        return ration_glj;
+    },
+
+
     getUnitPriceCodeMap : function () {//取单价文件中,编码前缀一样的映射表
         let codeMap = {};
         let priceMap = projectObj.project.projectGLJ.datas.unitPriceMap;
@@ -644,7 +659,7 @@ var gljOprObj = {
             if( codeMap[preCode]) options = codeMap[preCode];
             if(options.length>0) _.remove(options,{'value':gljOprObj.getIndex(recode, gljKeyArray)})//去掉本身
         }
-        return options;
+        return _.sortBy(options,'text');
     },
     filterGljByRation: function (ration, datas) {
         var gljList = [];
@@ -1375,6 +1390,9 @@ var gljOprObj = {
         gljOprObj.gljCurTypeId = ID;
         gljOprObj.filterLibGLJSheetData();
         gljOprObj.showLibGLJSheetData();
+    },
+    isExtraType:function (type) {
+        return _.includes(gljUtil.extraType,type)
     }
 }
 

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

@@ -64,20 +64,21 @@ let subObj = {
 
 $("#linkGLJ").click(function(){
     $("#subItems").children().hide();//控制显示subSpread,隐藏特征及内容spread
+    //show
+    MaterialController.showReplaceDiv();
     $("#subSpread").show();
     pageCCOprObj.active = false;
     subSpread.options.allowUserDragFill = false;
     refreshSubSpread();
     subSpread.setActiveSheetIndex(0);
     gljOprObj.activeTab='#linkGLJ';
-    // for test
-    //subSpread.getActiveSheet().setValue(0, 0, "工料机");
 });
 
 
 
 $("#linkAZZJF").click(function(){
     $("#subItems").children().hide();
+    MaterialController.hideReplaceDiv();
     $("#subSpread").show();
     pageCCOprObj.active = false;
     refreshSubSpread();
@@ -87,6 +88,7 @@ $("#linkAZZJF").click(function(){
 
 $("#linkGCLMX").click(function(){
     $("#subItems").children().hide();
+    MaterialController.hideReplaceDiv();
     $("#subSpread").show();
     subSpread.options.allowUserDragFill = true;
     pageCCOprObj.active = false;
@@ -97,6 +99,7 @@ $("#linkGCLMX").click(function(){
 
 $("#linkJSCX").click(function(){        // 计算程序
     $("#subItems").children().hide();
+    MaterialController.hideReplaceDiv();
     $("#subSpread").show();
     pageCCOprObj.active = false;
     refreshSubSpread();
@@ -468,7 +471,8 @@ function refreshSubSpread(){
         characterOprObj.workBook.refresh();
     }
     else{
-        subSpread?subSpread.refresh():'';
+        if(subSpread) subSpread.refresh();
+        if(MaterialController.spread) MaterialController.spread.refresh();
     }
 }