Преглед изворни кода

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

TonyKang пре 6 година
родитељ
комит
d2c39fbdc1

+ 67 - 0
modules/complementary_glj_lib/models/gljModel.js

@@ -6,9 +6,14 @@ const complementaryGljModel = mongoose.model('complementary_glj_lib');
 const stdGljModel = mongoose.model('std_glj_lib_gljList');
 const gljClassModel = mongoose.model('std_glj_lib_gljClass');
 const compleClassModel = mongoose.model('complementary_glj_section');
+const _ = require('lodash');
 import counter from "../../../public/counter/counter";
 import async from "async";
 import STDGLJLibGLJListModel from "../../common/std/std_glj_lib_glj_list_model";
+const libType = {
+    stdGLJ: 1,
+    complementaryGLJs: 2
+};
 
 class GljDao {
     getGljTypes (gljLibId, callback){
@@ -40,6 +45,68 @@ class GljDao {
             }
         }
     }
+
+    async getQueryByType ({userID, compilationId, gljLibId, type, replace, location, classList, search}) {
+        let model = null,
+            query = {};
+        if (type === libType.stdGLJ) {
+            model = stdGljModel;
+            query.repositoryId = gljLibId;
+        } else {
+            model = complementaryGljModel;
+            query.userId = userID;
+            query.compilationId = compilationId;
+        }
+        // 分类树
+        if (classList.length) {
+            query.gljClass = {$in: classList};
+        }
+        // 定位
+        if (location) {
+            // 替换定位,则先看看能不能找到替换的人材机,能找到的话就能定位要被替换人材机所在分类树
+            const replaceQuery = {...query, ...replace};
+            const replaceData = await model.findOne(replaceQuery);
+            if (replaceData) {
+                query.gljClass = replaceData.gljClass;
+            }
+        }
+        // 替换过滤类型
+        if (replace) {
+            // 人材机类型是“混凝土、砂浆、配合比、商品混凝土、商品砂浆”时,筛选的可替换的人材机类型应是“混凝土、或砂浆、或配合比、或商品混凝土、或商品砂浆”。
+            const materialTypes = [202, 203, 204, 205, 206];
+            query.gljType = materialTypes.includes(replace.gljType) ? {$in: materialTypes} : replace.gljType;
+        }
+        // 搜索关键字
+        if (search) {
+            query.$or = [{code: {'$regex': search, $options: '$i'}}, {name: {'$regex': search, $options: '$i'}}];
+        }
+        return {
+            model,
+            query
+        };
+    }
+
+    async getGLJPaging (condition) {
+        const queryData = await this.getQueryByType(condition);
+        // 定位(替换初始化)
+        // 替换触发的人材机选择界面,只有在初始化时才定位,其他操作下是正常的分页
+        if (condition.location) {
+            // 返回的数据,为编码小于等于替换的编码,再加附加条数
+            const limitQuery = _.cloneDeep(queryData.query);
+            limitQuery.code = {$lte: condition.replace.code};
+            const lteLimit = await queryData.model.count(limitQuery);
+            const additionalLimit = 10;
+            const limit = lteLimit + additionalLimit;
+            // 显示的数据不能太少,否则数据没有占满整个表格区域(实际上数据条目应该超过表格显示区域),让人误以为数据只有那么点,不再滚动触发分页
+            condition.limit = limit > condition.limit ? limit : condition.limit;
+        }
+        const gljs = await queryData.model.find(queryData.query).lean().sort({code: 1}).skip(condition.index).limit(condition.limit);
+        const total = await queryData.model.find(queryData.query).count();
+        return condition.type === libType.stdGLJ
+            ? {stdGLJ: gljs, complementaryGLJs: [], total: total}
+            : {stdGLJ: [], complementaryGLJs: gljs, total: total}
+    }
+
     //获得用户的补充工料机和用户当前所在编办的标准工料机
     async getGljItems (stdGljLibId, userId, compilationId, projection, callback){
         let me = this;

+ 25 - 0
modules/ration_glj/controllers/ration_glj_controller.js

@@ -10,6 +10,7 @@ module.exports={
     createRationGLJ:createRationGLJ,
     testGetQuantify:testGetQuantify,
     getGLJData:getGLJData,
+    getGLJDataPaging: getGLJDataPaging,
     getGLJDataByCodes:getGLJDataByCodes,
     addGLJ:addGLJ,
     replaceGLJ:replaceGLJ,
@@ -56,6 +57,30 @@ async function getGLJDataByCodes(req,res){
     res.json(result);
 }
 
+async function getGLJDataPaging(req, res) {
+    let result={
+        error:0
+    };
+    let data = JSON.parse(req.body.data);
+    try {
+        let gljLibId = await ration_glj_facade.getGLJLibByEngineerID(data.engineerID);
+        let info = {
+            gljLibId,
+            userID: req.session.sessionUser.id,
+            compilationId: req.session.sessionCompilation._id
+        };
+        result.data = await ration_glj_facade.getGLJDataPaging(info, data.condition);
+        if (req.session.sessionCompilation.priceProperties) {
+            result.data.priceProperties = req.session.sessionCompilation.priceProperties
+        }
+        res.json(result);
+    } catch (err) {
+        logger.err(err);
+        result.error=1;
+        result.message = err.message;
+        res.json(result);
+    }
+}
 
 async function getGLJData(req, res) {
     let result={

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

@@ -8,6 +8,7 @@ module.exports = {
     getQuantityByProjectGLJ: getQuantityByProjectGLJ,
     getLibInfo: getLibInfo,
     getGLJData: getGLJData,
+    getGLJDataPaging: getGLJDataPaging,
     getGLJDataByCodes:getGLJDataByCodes,
     addGLJ: addGLJ,
     deleteGLJ:deleteGLJ,
@@ -539,6 +540,18 @@ async function getGLJLibByEngineerID  (engineerID) {
     return gljLibId
 }
 
+async function getGLJDataPaging(info, condition) {
+    let gljDao = new GljDao();
+    let rst = {};
+    // 初始化,需要生成分类树和类型数据
+    if (condition.init) {
+        rst.treeData = await gljDao.getMixedTree(info.gljLibId, info.userID, info.compilationId);
+        rst.distTypeTree = stdgljutil.getStdGljTypeCacheObj().toArray();
+    }
+    let gljData = await gljDao.getGLJPaging({...info, ...condition});
+    Object.assign(rst, gljData);
+    return rst;
+}
 
 function getGLJData(info, callback) {
     let gljDao = new GljDao();

+ 1 - 0
modules/ration_glj/routes/ration_glj_route.js

@@ -9,6 +9,7 @@ module.exports = function (app) {
 
     var rgRouter = express.Router();
     rgRouter.get('/getGLJData/:engineerID', rgController.getGLJData);
+    rgRouter.post('/getGLJDataPaging', rgController.getGLJDataPaging);
     rgRouter.post('/getGLJDataByCodes',rgController.getGLJDataByCodes);
     rgRouter.post('/addGLJ',rgController.addGLJ);
     rgRouter.post('/replaceGLJ',rgController.replaceGLJ);

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

@@ -175,6 +175,48 @@ var sheetCommonObj = {
             }
         }
     },
+    setSheetBySetting: function (sheet, setting) {
+        function setCellType(range, cellType) {
+            let type;
+            if (cellType === 'checkBox') {
+                type = new GC.Spread.Sheets.CellTypes.CheckBox();
+            }
+            range.cellType(type);
+        }
+        setting.header.forEach((item, index) => {
+            const range = sheet.getRange(-1, index, -1, 1);
+            this.setAreaAlign(range, item.hAlign, item.vAlign);
+            if (item.cellType) {
+                console.log(item);
+                setCellType(range, item.cellType);
+            }
+            if (item.formatter) {
+                range.formatter(item.formatter)
+            }
+        });
+    },
+    appendData: function (sheet, index, rowIndex, setting, data) {
+        /*const viewport = GC.Spread.Sheets.SheetArea.viewport;
+        const rowHeader = GC.Spread.Sheets.SheetArea.rowHeader;*/
+        if (!index) {
+            sheet.setRowCount(0);
+        }
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        // 追加空行
+        sheet.addRows(index, data.length);
+        // 显示数据
+        data.forEach((item, rIdx) => {
+            const row = index + rIdx;
+            setting.header.forEach((hItem, cIdx) => {
+                const dataCode = hItem.dataCode;
+                const val = gljUtil.isDef(item[dataCode]) ? item[dataCode] : '';
+                sheet.setValue(row, cIdx, val);
+            });
+        });
+        sheet.resumeEvent();
+        sheet.resumePaint();
+    },
     showData: function(sheet, setting, data,distTypeTree,callback) {
         var me = this, ch = GC.Spread.Sheets.SheetArea.viewport;
         sheet.suspendPaint();

+ 64 - 10
web/building_saas/main/js/models/ration_glj.js

@@ -497,6 +497,60 @@ let ration_glj = {
             }
            return node
         };
+        ration_glj.prototype.getGLJDataPaging = function (condition, cb) {
+            gljOprObj.loadingPagination = true;
+            const property = projectObj.project.projectInfo.property;
+            const engineerID = property.engineering_id;
+            CommonAjax.post('/rationGlj/getGLJDataPaging', {engineerID, condition}, function (data) {
+                gljOprObj.curPageTotal = data.total;
+                data.complementaryGLJs.forEach(glj => {
+                    glj.isComplementary = true;
+                });
+                const gljType = condition.type === gljOprObj.pagingType.stdGLJ
+                    ? 'stdGLJ'
+                    : 'complementaryGLJs';
+                const newData = data[gljType];
+                if (condition.init) {
+                    gljOprObj.treeData = data.treeData;
+                    gljOprObj.distTypeTree = gljOprObj.getComboData(data.distTypeTree);
+                }
+                // 需要重置当前页面数据(点击了分类树、搜索等等)
+                if (condition.reset) {
+                    gljOprObj.stdGLJ = data.stdGLJ;
+                    gljOprObj.complementaryGLJs = data.complementaryGLJs;
+                    gljOprObj.AllRecode = [...gljOprObj.stdGLJ, ...gljOprObj.complementaryGLJs];
+                } else {
+                    gljOprObj[gljType].splice(condition.index, 0, ...newData);
+                    gljOprObj.AllRecode.splice(condition.index, 0, ...newData);
+                }
+                // 根据缓存选中数据,设置人材机是否选中
+                newData.forEach(item => {
+                    const connectKey = gljOprObj.getIndex(item, gljLibKeyArray);
+                    if (gljOprObj.GLJSelection.includes(connectKey)) {
+                        item.select = 1;
+                    }
+                });
+                // 设置人材机类型名称
+                gljOprObj.setTypeName(gljOprObj.distTypeTree.comboDatas, newData);
+                if (data.priceProperties && data.priceProperties.length > 0) {
+                    let tmp = _.find(data.priceProperties, {region: property.region, taxModel: parseInt(property.taxType)});
+                    if (tmp) {
+                        let dataCode = tmp.price.dataCode;
+                        for (let glj of data.stdGLJ) {
+                            if (glj.priceProperty && gljUtil.isDef(glj.priceProperty[dataCode])) {
+                                glj.basePrice = glj.priceProperty[dataCode];
+                            }
+                        }
+                    }
+                }
+                cb(data[gljType]);
+                gljOprObj.loadingPagination = false;
+            }, function () {
+                if ($.bootstrapLoading.isLoading()) {
+                    $.bootstrapLoading.end();
+                }
+            });
+        };
         ration_glj.prototype.getGLJData = function (cb) {
             let property = projectObj.project.projectInfo.property;
             let engineerID = property.engineering_id;
@@ -661,19 +715,19 @@ let ration_glj = {
 
 
         ration_glj.prototype.addGLJByLib = function (GLJSelection, ration, callback) {
-            let me=this,gljList = [];
-            let allGLJ = gljOprObj.AllRecode;
+            const me = this,
+                  gljList = [],
+                  allGLJ = gljOprObj.AllRecode;
             GLJSelection.sort();
-            _.forEach(GLJSelection, function (g) {
-                let glj = _.find(allGLJ, function (item) {
-                    let i_key = gljOprObj.getIndex(item, gljLibKeyArray);
-                    return i_key == g;
-                });
-                let ration_glj = me.getAddDataByStd(glj,ration.ID,ration.billsItemID,ration.projectID);
-                gljList.push(ration_glj);
+            GLJSelection.forEach(selKey => {
+                const glj = allGLJ.find(item => gljOprObj.getIndex(item, gljLibKeyArray) === selKey);
+                if (glj) {
+                    const rationGLJ = me.getAddDataByStd(glj, ration.ID, ration.billsItemID, ration.projectID);
+                    gljList.push(rationGLJ);
+                }
             });
             $.bootstrapLoading.start();
-            CommonAjax.post("/rationGlj/addGLJ", gljList, callback, function () {
+            CommonAjax.post('/rationGlj/addGLJ', gljList, callback, function () {
                 $.bootstrapLoading.end();
             });
         };

+ 167 - 77
web/building_saas/main/js/views/glj_view.js

@@ -14,6 +14,14 @@ var gljOprObj = {
     detailSheet: null,
     detailData: [],
     GLJSelection: [],
+    pagingType: {
+        stdGLJ: 1,
+        complementaryGLJs: 2
+    },
+    // 是否正在分页
+    loadingPagination: false,
+    // 当前筛选条件下总数据数,用于判断是否需要继续分页
+    curPageTotal: 0,
     selectedGLJClass: null,
     parentNodeIds: {},
     preActiveTab: '', //提升焦点变换性能 2019年4月12日
@@ -68,9 +76,10 @@ var gljOprObj = {
                     let me = gljOprObj, gljTypeId = treeNode.ID;
                     if (treeNode.ID) {
                         me.gljCurTypeId = treeNode.ID;
-                        me.filterLibGLJSheetData();
-                        me.showLibGLJSheetData();
-                        gljOprObj.initSelection({row: me.gljLibSheet.getActiveRowIndex()});
+                        /* me.filterLibGLJSheetData();
+                         me.showLibGLJSheetData();*/
+                        me.loadPageData(gljOprObj.gljLibSheet, true, 0);
+                        //gljOprObj.initSelection({row: me.gljLibSheet.getActiveRowIndex()});
                     }
                 } else {
                     if (treeNode.isParent) {
@@ -81,7 +90,6 @@ var gljOprObj = {
                         $('#selected_class').val(treeNode.ID);
                     }
                 }
-
             }
         }
     },
@@ -94,8 +102,8 @@ var gljOprObj = {
             {headerName: "规格型号", headerWidth: 160, dataCode: "specs", dataType: "String", hAlign: "left", vAlign: "center"},
             {headerName: "单位", headerWidth: 40, dataCode: "unit", dataType: "String", hAlign: "center", vAlign: "center"},
             {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"}
+            {headerName: "类型", headerWidth: 60, dataCode: "typeName", dataType: "String", hAlign: "center", vAlign: "center"},
+            {headerName: "新增", headerWidth: 40, dataCode: "isComplementary", dataType: "String", hAlign: "center", vAlign: "center", cellType: "checkBox", readOnly: true}
         ],
         view: {
             lockColumns: [0, 1, 2, 3, 4, 5, 6]
@@ -310,6 +318,29 @@ var gljOprObj = {
         let me = gljOprObj;
         me.initSelection(args.newSelections.length > 0 ? {row: args.newSelections[0].row} : {row: 0});
     },
+    onTopRowChanged: function (sender, args) {
+        const me = gljOprObj;
+        const topRow = args.newTopRow;
+        const bottomRow = args.sheet.getViewportBottomRow(1);
+        const radioType = $("input[name='glj']:checked").val();
+        const curRecord = radioType === 'stdGLJ' ? me.stdGLJ : me.complementaryGLJs;
+        // 当前表显示数据数大于等于当前筛选情况下最大数据数,不获取下一分页
+        if (curRecord.length >= me.curPageTotal ||
+            me.loadingPagination) {
+            return;
+        }
+        if (curRecord.length -1 === bottomRow) {
+            // 获取第curRecord.length行开始的数据
+            me.loadPageData(args.sheet, false, curRecord.length);
+        }
+    },
+    loadPageData: function (sheet, reset, index) {
+        let condition = this.getPagingCondition(false, reset, false, index);
+        projectObj.project.ration_glj.getGLJDataPaging(condition, function (data) {
+            sheetCommonObj.appendData(sheet, condition.index, 0, gljOprObj.gljLibSheetSetting, data);
+            gljOprObj.initSelection({row: gljOprObj.gljLibSheet.getActiveRowIndex()});
+        });
+    },
     getSelStyle: function (selected,settingStyle) {
         let style = new GC.Spread.Sheets.Style();
         if(settingStyle){
@@ -372,6 +403,10 @@ var gljOprObj = {
         }  else if (args.sheetName == 'quantity_detail') {
             projectObj.project.quantity_detail.isSummationUpdate(args, gljOprObj.detailData, newval);
         } else if (args.sheetName == 'glj_lib') {
+            if (gljOprObj.gljLibSheetSetting.header[args.col].readOnly) {
+                args.sheet.getCell(args.row, args.col).value(checkboxValue);
+                return;
+            }
             if(gljOprObj.gljLibSheetSetting.header[args.col].dataCode === 'select'){
                 gljOprObj.setGLJSelection(args, newval);
             }
@@ -978,6 +1013,86 @@ var gljOprObj = {
         sheetCommonObj.showData(this.gljLibSheet, this.gljLibSheetSetting, this.gljLibSheetData, gljOprObj.distTypeTree);
         this.gljLibSheet.setRowCount(this.gljLibSheetData.length);
     },
+    // 根据人材机类型,设置人材机类型显示名称
+    setTypeName: function (distTypeData, data) {
+        data.forEach(item => {
+            let typeData = distTypeData.find(typeItem => typeItem.value === item.gljType);
+            if (typeData) {
+                item.typeName = typeData.text;
+            }
+        });
+    },
+    /*
+    * 获取分页查询所需要的条件数据
+    * @param  {Boolean}init 是否是初始化
+    *         {Boolean}reset 是否重置数据 (点击分类树等)
+    *         {Boolean}location 是否定位(替换初始化)
+    *         {Number}index 分页数据开始索引
+    * @return {Object}
+    * */
+    getPagingCondition: function (init, reset, location, index) {
+        // 初始化情况下的条件
+        let condition = {
+            // 是否重置数据
+            reset,
+            // 是否定位
+            location,
+            // 开始取数据的位置
+            index,
+            // 限制条数
+            limit: 50,
+            // 初始化
+            init: init,
+            // 所在部分(标准、补充)
+            type: this.pagingType.stdGLJ,
+            // 替换数据,替换操作下有数据:编码、名称、规格、单位、类型
+            replace: null,
+            // 所在分类节点
+            classList: [],
+            // 搜索文本
+            search: ''
+        };
+        // 触发入口(添加、替换、批量替换)
+        const actionType = $('#actionType').val();
+        const replaceActions = ['replace', 'm_replace'];
+        // 替换相关
+        if (replaceActions.includes(actionType)) {
+            // 定额人材机界面选中的人材机
+            const selected = gljOprObj.sheetData[gljContextMenu.selectedRow];
+            condition.replace = {
+                code: selected.code,
+                name: selected.name,
+                specs: selected.specs,
+                unit: selected.unit,
+                gljType: selected.type
+            };
+        }
+        if (init) {
+            return condition;
+        }
+        condition.init = false;
+        // 标准、补充的选择
+        if ($('#glj_tree_div').is(':visible')) {
+            let radioType = $("input[name='glj']:checked").val();
+            condition.type = this.pagingType[radioType];
+        }
+        // 选中的分类
+        if (this.treeObj) {
+            let selNode = this.treeObj.getNodeByParam('ID', this.gljCurTypeId);
+            // 不为最顶层节点时,才赋值给withinClass
+            if (selNode && selNode.ParentID !== -1) {
+                const classList = this.parentNodeIds['_pNodeId_' + this.gljCurTypeId];
+                condition.classList = classList ? classList : [this.gljCurTypeId];
+            }
+        }
+        // 搜索文本
+        let searchStr = $('#gljSearchKeyword').val().trim();
+        if(searchStr){
+            condition.search = searchStr;
+        }
+        return condition;
+
+    },
     filterLibGLJSheetData: function () {
         let me = this;
         let val = $("input[name='glj']:checked").val();
@@ -1018,13 +1133,12 @@ var gljOprObj = {
         }
     },
     addGLJsSelection: function (args, newVal) {
-        var con_key = this.getIndex(this.gljLibSheetData[args.row], gljLibKeyArray);
+        const curGLJ = this.AllRecode[args.row];
+        const con_key = this.getIndex(curGLJ, gljLibKeyArray);
         if (newVal == 1) {
             this.GLJSelection.push(con_key);
-            this.gljLibSheetData[args.row].select = 1;
         } else if (newVal == 0) {
             _.pull(this.GLJSelection, con_key);
-            this.gljLibSheetData[args.row].select = 0;
         }
     },
     replaceGLJSelection: function (args, newVal) {
@@ -1034,21 +1148,20 @@ var gljOprObj = {
             args.sheet.getCell(args.row, args.col).value(1);
             return;
         }
-        this.GLJSelection = [me.getIndex(this.gljLibSheetData[args.row], gljLibKeyArray)];
-        this.gljLibSheetData[args.row].select = 1;
-        var oindex = _.findIndex(this.gljLibSheetData, function (item) {
+        const curGLJ = this.AllRecode[args.row];
+        const connectKey = this.getIndex(curGLJ, gljLibKeyArray);
+        this.GLJSelection = [connectKey];
+        var oindex = _.findIndex(this.AllRecode, function (item) {
             var i_key = me.getIndex(item, gljLibKeyArray);
             return oldSelection == i_key;
         });
         if (oindex != -1) {
             args.sheet.getCell(oindex, args.col).value(0);
-            this.gljLibSheetData[oindex].select = 0;
         } else {
             var oldData = _.find(gljOprObj.AllRecode, function (item) {
                 var i_key = me.getIndex(item, gljLibKeyArray);
                 return oldSelection == i_key;
             });
-            oldData ? oldData.select = 0 : "";
         }
     },
     filterLibGLJByType: function () {
@@ -1092,7 +1205,6 @@ var gljOprObj = {
                 distTypeTree.comboDatas.push({text: distTypeObj.data.fullName, value: distTypeObj.data.ID});
             }
         });
-        console.log(distTypeTree);
         return distTypeTree;
     },
     doInsertGLJ: function () {
@@ -1391,8 +1503,8 @@ var gljOprObj = {
         if (!node) node = zTree.getNodeByTId('gljTree_1');
         zTree.selectNode(node);
         gljOprObj.gljCurTypeId = ID;
-        gljOprObj.filterLibGLJSheetData();
-        gljOprObj.showLibGLJSheetData();
+        //--gljOprObj.filterLibGLJSheetData();
+        //--gljOprObj.showLibGLJSheetData();
     },
     isExtraType:function (type) {
         return _.includes(gljUtil.extraType,type)
@@ -1491,7 +1603,14 @@ var gljOprObj = {
     }
 }
 
+// 人材机选择界面的功能进行了适合分页的重构
+// 重构时,只有添加、替换、批量替换的入口。因此只对这三个入口相关的地方进行重构,其他入口的代码没有变更
+// 若以后放开其他入口,需要将其他入口的相应方法进行重构
 $(function () {
+    $('#glj_tree_div').on('hidden.bs.modal', function () {
+        // 清空搜索框
+        $('#gljSearchKeyword').val('');
+    });
     $('#glj_tree_div').on('shown.bs.modal', function (e) {
         if (gljOprObj.gljLibSpresd == undefined) {
             gljOprObj.gljLibSpresd = sheetCommonObj.buildSheet($('#gljLibSheet')[0], gljOprObj.gljLibSheetSetting, gljOprObj.stdGLJ.length + gljOprObj.complementaryGLJs.length);
@@ -1499,53 +1618,50 @@ $(function () {
             gljOprObj.gljLibSpresd.bind(GC.Spread.Sheets.Events.ButtonClicked, gljOprObj.onButtonClick);
             gljOprObj.gljLibSheet = gljOprObj.gljLibSpresd.getSheet(0);
             gljOprObj.gljLibSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, gljOprObj.onSelectionChanged);
+            gljOprObj.gljLibSheet.bind(GC.Spread.Sheets.Events.TopRowChanged, _.debounce(gljOprObj.onTopRowChanged, 100));
             gljOprObj.gljLibSheet.setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
             gljOprObj.gljLibSheet.options.isProtected = true;
             gljOprObj.gljLibSheet.name('glj_lib');
+            sheetCommonObj.setSheetBySetting(gljOprObj.gljLibSheet, gljOprObj.gljLibSheetSetting);
         }
-        gljOprObj.gljLibSheetData = gljOprObj.AllRecode;
-        let gljClass = 0, selectMap = {};
+        let gljClass = 0,
+            selected,
+            connect_key;
         if ($('#actionType').val() == 'add' || $('#actionType').val() == 'insert') {//插入,添加
             gljOprObj.GLJSelection = [];
         } else if($('#actionType').val() =='m_replace' || $('#actionType').val() == 'replace'){//替换、批量替换
-            let selected = gljOprObj.sheetData[gljContextMenu.selectedRow];
-            let connect_key = gljOprObj.getIndex(selected, gljKeyArray);
+            selected = gljOprObj.sheetData[gljContextMenu.selectedRow];
+            connect_key = gljOprObj.getIndex(selected, gljKeyArray);
             gljOprObj.GLJSelection = [connect_key];
-            selectMap[connect_key] = true;
-            gljOprObj.filterLibGLJByType();
-        }else if($('#actionType').val() =='addMix'){//添加组成物
+            // 找到定位的分类树
+            const locatedItem = gljOprObj.AllRecode.find(item => gljOprObj.getIndex(item, gljLibKeyArray) === connect_key);
+            if (locatedItem) {
+                gljClass = locatedItem.gljClass;
+                locatedItem.select = 1;
+            }
+        } else if($('#actionType').val() =='addMix'){//添加组成物
             gljOprObj.GLJSelection = [];
             projectGljObject.filterLibGLJForMixRatio();
-            /*selections = projectGljObject.mixRatioData;  添加组成物的时候先不选中
-            gljOprObj.GLJSelection = [];
-            for(let s of selections){
-                let s_key = gljOprObj.getIndex(s, gljKeyArray);
-                selectMap[s_key] = true;
-                gljOprObj.GLJSelection.push(s_key);
-            }*/
-        }
-        for(let item of gljOprObj.gljLibSheetData){
-            let item_key = gljOprObj.getIndex(item, gljLibKeyArray);
-            if(selectMap[item_key]){
-                item.select = 1 ;
-                gljClass = item.gljClass;
-            }
         }
         //替换,焦点定位至当前选中人材机
-        if($('#actionType').val() =='m_replace' || $('#actionType').val() == 'replace'){
+        if ($('#actionType').val() =='m_replace' || $('#actionType').val() == 'replace') {
             gljOprObj.locateZTree(gljClass);
-            let selected = gljOprObj.sheetData[gljContextMenu.selectedRow];
-            let index = _.findIndex(gljOprObj.gljLibSheetData, {code: selected.code});
+            sheetCommonObj.appendData(gljOprObj.gljLibSheet, 0, 0, gljOprObj.gljLibSheetSetting, gljOprObj.AllRecode);
+            const index = gljOprObj.AllRecode.findIndex(item => gljOprObj.getIndex(item, gljLibKeyArray) === connect_key);
             gljOprObj.gljLibSheet.showRow(index, GC.Spread.Sheets.VerticalPosition.center);
             gljOprObj.gljLibSheet.setActiveCell(index, 0);
             gljOprObj.initSelection({row: index});
             gljOprObj.gljLibSpresd.focus(true);
         } else if ($('#actionType').val() === 'add') {
             gljOprObj.locateZTree(null);
+            sheetCommonObj.appendData(gljOprObj.gljLibSheet, 0, 0, gljOprObj.gljLibSheetSetting, gljOprObj.AllRecode);
             gljOprObj.gljLibSheet.showRow(0, GC.Spread.Sheets.VerticalPosition.top);
             gljOprObj.gljLibSheet.setActiveCell(0, 0);
             gljOprObj.initSelection({row: 0});
-        } else gljOprObj.showLibGLJSheetData();
+        } else {
+            gljOprObj.showLibGLJSheetData();
+        }
+        console.timeEnd('getGLJData');
     });
 
     $('#mreplace_next_div').on('shown.bs.modal', function (e) {
@@ -1553,46 +1669,20 @@ $(function () {
         gljOprObj.showScopeDatas();
     });
 
-
-    $('#glj_tree_div').on('hidden.bs.modal', function () {
-        $('#gljSearchKeyword').val('');
-    });
-
+    // 人材机选择界面标准、补充单选
     $('.glj-radio').change(function () {
-        let val = $("input[name='glj']:checked").val();
-        if (val == 'allGljs') {
-            gljOprObj.gljLibSheetData = gljOprObj.AllRecode;
-            gljOprObj.filterLibGLJSheetData();
-            gljOprObj.showLibGLJSheetData();
+        const val = $("input[name='glj']:checked").val();
+        if (val === 'stdGLJ') {
+            gljOprObj.initClassTree('std', gljOprObj.treeData.std, true);
         } else {
-            if(val === 'stdGLJ') {
-                gljOprObj.initClassTree('std', gljOprObj.treeData.std, true);
-            } else {
-                gljOprObj.initClassTree('comple', gljOprObj.treeData.comple, true);
-            }
-            gljOprObj.initSelection({row: 0});
-            //gljOprObj.gljLibSheetData = gljOprObj[val];
-            /*gljOprObj.filterLibGLJSheetData();
-            gljOprObj.showLibGLJSheetData();*/
-        }
-    });
-/*    //工料机搜索
-    $('#gljSearchKeyword').change(function () {
-        gljOprObj.filterLibGLJSheetData();
-        gljOprObj.showLibGLJSheetData();
-    });
-     $('#gljSearchKeyword').bind('keypress', function (e) {
-        if(e.keyCode === 13){
-            alert('2');
-            $(this).blur();
-            return false;
+            gljOprObj.initClassTree('comple', gljOprObj.treeData.comple, true);
         }
-    });*/
-    $('#gljSearchKeyword').bind('keyup', function (e) {
-        gljOprObj.filterLibGLJSheetData();
-        gljOprObj.showLibGLJSheetData();
         gljOprObj.initSelection({row: 0});
     });
+    // 人材机选择页面搜索框
+    $('#gljSearchKeyword').bind('keyup', _.debounce(function() {
+        gljOprObj.loadPageData(gljOprObj.gljLibSheet, true, 0);
+    }, 500));
 
     $('#glj_selected_conf').click(function () {
         if (gljOprObj.GLJSelection.length < 1) {

+ 15 - 16
web/building_saas/main/js/views/glj_view_contextMenu.js

@@ -375,36 +375,35 @@ var gljContextMenu = {
 
 function getGLJData(actionType) {
     $('#actionType').val(actionType);
+    // 清除选中人材机缓存数据
+    gljOprObj.GLJSelection = [];
     $.bootstrapLoading.start();
-    projectObj.project.ration_glj.getGLJData(function (result) {
-        console.log(+new Date());
-        gljOprObj.treeData =  result.datas.treeData;
-        //zTreeHelper.createTree(result.datas.treeData, gljOprObj.gljTreeSetting, "gljTree", gljOprObj);
+    let location = false;
+    const replaceActions = ['replace', 'm_replace'];
+    if (replaceActions.includes(actionType)) {
+        location = true;
+    }
+    const init = true;
+    const reset = true;
+    const condition = gljOprObj.getPagingCondition(init, reset, location, 0);
+    console.time('getGLJData');
+    projectObj.project.ration_glj.getGLJDataPaging(condition, function (result) {
         gljOprObj.initClassTree('std', gljOprObj.treeData.std);
-        gljOprObj.stdGLJ=result.datas.stdGLJ;
-        gljOprObj.complementaryGLJs=result.datas.complementaryGLJs;
-        for(let compleGlj of gljOprObj.complementaryGLJs){
-            //是否新增
-            compleGlj.isComplementary = true;
-        }
-        gljOprObj.AllRecode=gljOprObj.stdGLJ.concat(gljOprObj.complementaryGLJs);
-        //gljOprObj.AllRecode=gljOprObj.stdGLJ;
-        gljOprObj.distTypeTree=gljOprObj.getComboData(result.datas.distTypeTree);
         $('#modalCon').width($(window).width()*0.5);
         $("input[name='glj']").get(0).checked=true;
         $.bootstrapLoading.end();
         if(actionType == "m_replace"){
             $('#glj_selected_conf').hide();
             $('#replace_next_btn').show();
-        }else {
+        } else {
             $('#glj_selected_conf').show();
             $('#replace_next_btn').hide();
         }
         $("#glj_tree_div").modal({show:true});
         setTimeout(function(){
-            gljOprObj.gljLibSpresd?gljOprObj.gljLibSpresd.refresh():'';
+            gljOprObj.gljLibSpresd ? gljOprObj.gljLibSpresd.refresh() : '';
         }, 200);
-    })
+    });
 }
 
 function showGLJClassTree(record) {