Kaynağa Gözat

定额/工料机改进用户操作体验(删除、单行数据增加)

TonyKang 8 yıl önce
ebeveyn
işleme
80de5e1a4c

+ 3 - 2
modules/rationRepository/controllers/rationController.js

@@ -21,8 +21,9 @@ module.exports = {
     mixUpdateRationItems: function(req, res){
         var sectionId = req.body.sectionID,
             updateItems = JSON.parse(req.body.updateItems),
-            addItems = JSON.parse(req.body.addItems);
-        rationItem.mixUpdateRationItems(sectionId, updateItems, addItems, function(err, message, rst){
+            addItems = JSON.parse(req.body.addItems),
+            removeIds = JSON.parse(req.body.removeIds);
+        rationItem.mixUpdateRationItems(sectionId, updateItems, addItems, removeIds, function(err, message, rst){
             if (err) {
                 callback(req, res, err, message, null);
             } else {

+ 9 - 21
modules/rationRepository/controllers/repositoryGljController.js

@@ -3,27 +3,14 @@
  */
 var gljRepository = require("../models/gljRepository");
 
-var callback = function(req,res,err,data){
-    if(data){
-        res.status(200)
-        res.json({success:true,data:data});
-    }
-    else
-    if(err){
-        res.status(500)
-        res.json({success:false,error:err});
-        //res.json(err);
-    }
-    else{
-        res.status(204);
-        res.json({success:true,data:null});
-    }
+var callback = function(req,res,err,message, data){
+    res.json({error: err, message: message, data: data});
 }
 module.exports ={
     getGljTree: function(req,res){
         var libName = req.body.rationLibName;
         gljRepository.getGljTypes(libName,function(err,data){
-            callback(req,res,err,data)
+            callback(req,res,err, 'Get Tree', data)
         });
     },
     getGljItems: function(req, res) {
@@ -32,23 +19,24 @@ module.exports ={
             gljCode = req.body.code;
         if (gljCode) {
             gljRepository.getGljItem(repId, gljCode, function(err, data){
-                callback(req,res,err,data)
+                callback(req,res,err,'Get Items', data)
             });
         } else if (gljType) {
             gljRepository.getGljItemByType(repId, gljType, function(err, data){
-                callback(req,res,err,data)
+                callback(req,res,err,'Get Types', data)
             });
         } else {
             gljRepository.getGljItemsByRep(repId, function(err, data){
-                callback(req,res,err,data)
+                callback(req,res,err,'Get Items',data)
             });
         }
     },
     mixUpdateGljItems: function(req, res){
         var repId = req.body.repositoryId,
             updateItems = JSON.parse(req.body.updateItems),
-            addItems = JSON.parse(req.body.addItems);
-        gljRepository.mixUpdateGljItems(repId, updateItems, addItems, function(err, message, rst){
+            addItems = JSON.parse(req.body.addItems),
+            removeIds = JSON.parse(req.body.removeIds);
+        gljRepository.mixUpdateGljItems(repId, updateItems, addItems, removeIds, function(err, message, rst){
             if (err) {
                 callback(req, res, err, message, null);
             } else {

+ 29 - 22
modules/rationRepository/models/gljRepository.js

@@ -26,7 +26,8 @@ var gljSchema = mongoose.Schema({
     specs: String,
     unit: String,
     basePrice: Number,
-    gljType: Number
+    gljType: Number, //这个是UI显示上的详细分类,对应gljTypeSchema
+    gljDistType: String  //人工,材料,机械
 });
 var gljTypeModel = db.model("gljType",gljTypeSchema, "gljType");
 var gljItemModel = db.model("gljRepository",gljSchema, "gljRepository");
@@ -69,33 +70,39 @@ gljItemDAO.prototype.getGljItem = function(repositoryId, code, callback){
     })
 };
 
-gljItemDAO.prototype.mixUpdateGljItems = function(repId, updateItems, addItems, callback) {
+gljItemDAO.prototype.mixUpdateGljItems = function(repId, updateItems, addItems, rIds, callback) {
     var me = this;
-    if (!(updateItems) || updateItems.length == 0) {
+    if (updateItems.length == 0 && rIds.length == 0) {
         me.addGljItems(repId, addItems, callback);
     } else {
-        me.updateGljItems(repId, updateItems, function(err, results){
-            if (err) {
-                callback(true, "保存定额错误!", false);
-            } else {
-                if (addItems && addItems.length > 0) {
-                    me.addGljItems(repId, addItems, callback);
+        me.removeGljItems(rIds, function(err, message, docs) {
+            me.updateGljItems(repId, updateItems, function(err, results){
+                if (err) {
+                    callback(true, "Fail to update", false);
                 } else {
-                    callback(false, "保存定额成功!", results);
+                    if (addItems && addItems.length > 0) {
+                        me.addGljItems(repId, addItems, callback);
+                    } else {
+                        callback(false, "Save successfully", results);
+                    }
                 }
-            }
+            });
         });
     }
 };
 
-gljItemDAO.prototype.removeGljItems = function(removeIds, callback) {
-    //gljItemModel.collection.remove({}, null, function(err, docs){
-    //    if (err) {
-    //        callback(true, "保存定额错误!", false);
-    //    } else {
-    //        callback(false, "保存定额成功!", docs);
-    //    }
-    //})
+gljItemDAO.prototype.removeGljItems = function(rIds, callback) {
+    if (rIds && rIds.length > 0) {
+        gljItemModel.collection.remove({ID: {$in: rIds}}, null, function(err, docs){
+            if (err) {
+                callback(true, "Fail to remove", false);
+            } else {
+                callback(false, "Remove successfully", docs);
+            }
+        })
+    } else {
+        callback(false, "No records were deleted!", null);
+    }
 };
 
 gljItemDAO.prototype.addGljItems = function(repId, items, callback) {
@@ -111,14 +118,14 @@ gljItemDAO.prototype.addGljItems = function(repId, items, callback) {
             }
             gljItemModel.collection.insert(arr, null, function(err, docs){
                 if (err) {
-                    callback(true, "保存定额错误!", false);
+                    callback(true, "Fail to add", false);
                 } else {
-                    callback(false, "保存定额成功!", docs);
+                    callback(false, "Add successfully", docs);
                 }
             })
         });
     } else {
-        callback(true, "定额数据源错误!", false);
+        callback(true, "No source", false);
     }
 };
 

+ 32 - 22
modules/rationRepository/models/rationItem.js

@@ -31,37 +31,47 @@ var rationItemDAO = function(){};
 
 rationItemDAO.prototype.getRationItemsBySection = function(sectionId,callback){
     rationItemModel.find({"sectionId": sectionId, "$or": [{"isDeleted": null}, {"isDeleted": false} ]},function(err,data){
-        if(err) callback(true, "获取定额错误!", "")
-        else callback(false,"获取定额", data);
+        if(err) callback(true, "Fail to get items", "")
+        else callback(false,"Get items successfully", data);
     })
 };
-rationItemDAO.prototype.mixUpdateRationItems = function(sectionId, updateItems, addItems, callback){
+rationItemDAO.prototype.mixUpdateRationItems = function(sectionId, updateItems, addItems, rIds, callback){
     var me = this;
-    if (!(updateItems) || updateItems.length == 0) {
+    if (updateItems.length == 0 && rIds.length == 0) {
         me.addRationItems(sectionId, addItems, callback);
     } else {
-        me.updateRationItems(sectionId, updateItems, function(err, results){
+        me.removeRationItems(rIds, function(err, message, docs) {
             if (err) {
-                callback(true, "保存定额错误!", false);
+                callback(true, "Fail to remove", false);
             } else {
-                if (addItems && addItems.length > 0) {
-                    me.addRationItems(sectionId, addItems, callback);
-                } else {
-                    callback(false, "保存定额成功!", results);
-                }
+                me.updateRationItems(sectionId, updateItems, function(err, results){
+                    if (err) {
+                        callback(true, "Fail to save", false);
+                    } else {
+                        if (addItems && addItems.length > 0) {
+                            me.addRationItems(sectionId, addItems, callback);
+                        } else {
+                            callback(false, "Save successfully", results);
+                        }
+                    }
+                });
             }
-        });
+        })
     }
 };
 
 rationItemDAO.prototype.removeRationItems = function(rIds,callback){
-    rationItemModel.collection.remove({ID: {$in: rIds}}, null, function(err, docs){
-        if (err) {
-            callback(true, "删除定额错误!", false);
-        } else {
-            callback(false, "删除定额成功!", docs);
-        }
-    })
+    if (rIds.length > 0) {
+        rationItemModel.collection.remove({ID: {$in: rIds}}, null, function(err, docs){
+            if (err) {
+                callback(true, "Fail to remove", false);
+            } else {
+                callback(false, "Remove successfully", docs);
+            }
+        })
+    } else {
+        callback(false, "No records were deleted!", null);
+    }
 };
 
 rationItemDAO.prototype.getRationItemsByCode = function(code,callback){
@@ -81,14 +91,14 @@ rationItemDAO.prototype.addRationItems = function(sectionId, items,callback){
             }
             rationItemModel.collection.insert(arr, null, function(err, docs){
                 if (err) {
-                    callback(true, "保存定额错误!", false);
+                    callback(true, "Fail to save", false);
                 } else {
-                    callback(false, "保存定额成功!", docs);
+                    callback(false, "Save successfully", docs);
                 }
             })
         });
     } else {
-        callback(true, "定额数据源错误!", false);
+        callback(true, "Source error!", false);
     }
 };
 

+ 0 - 1
modules/rationRepository/routes/rationRepRoutes.js

@@ -23,7 +23,6 @@ apiRouter.post("/deleteNodes",rationChapterTreeController.deleteNodes);
 
 apiRouter.post("/getRationItems",rationController.getRationItemsBySection);
 apiRouter.post("/mixUpdateRationItems",rationController.mixUpdateRationItems);
-apiRouter.post("/removeRationItems",rationController.removeRationItems);
 
 apiRouter.post("/getGljTree",repositoryGljController.getGljTree);
 apiRouter.post("/getGljItems",repositoryGljController.getGljItems);

+ 71 - 36
web/rationLibEditor/js/ration.js

@@ -38,13 +38,59 @@ var rationOprObj = {
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditEnded, me.onCellEditEnd);
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.RangeChanged, me.onRangeChanged);
     },
+    getCache: function() {
+        var me = this, rst = me.currentRations["_SEC_ID_" + me.currentSectionId];
+        if (!(rst)) {
+            me.currentRations["_SEC_ID_" + me.currentSectionId] = [];
+            rst = me.currentRations["_SEC_ID_" + me.currentSectionId];
+        }
+        return rst;
+    },
+    updateCache: function(addArr, updateArr, removeIds, result) {
+        var me = this, cacheSection = me.getCache();
+        if (addArr.length > 0) {
+            me.currentRations["_SEC_ID_" + me.currentSectionId] = cacheSection.concat(addArr);
+            cacheSection = me.currentRations["_SEC_ID_" + me.currentSectionId];
+        }
+        for (var i = removeIds.length - 1; i >= 0; i--) {
+            for (var j = cacheSection.length - 1; j >= 0 ; j--) {
+                if (cacheSection[j]["ID"] == removeIds[i]) {
+                    cacheSection.splice(j,1);
+                }
+            }
+        }
+        if (result && result.data.ops && result.data.ops.length > 0) {
+            for (var i = 0; i < result.data.ops.length; i++) {
+                for (var j = 0; j < cacheSection.length; j++) {
+                    if (cacheSection[j][me.setting.header[0].dataCode] == result.data.ops[i][me.setting.header[0].dataCode]) {
+                        cacheSection[j]["ID"] = result.data.ops[i]["ID"];
+                    }
+                }
+            }
+        }
+        for (var i = 0; i < updateArr.length; i++) {
+            for (var j = 0; j < cacheSection.length; j++) {
+                if (updateArr[i]["ID"] && cacheSection[j]["ID"]) {
+                    if (cacheSection[j]["ID"] == updateArr[i]["ID"]) {
+                        cacheSection[j] = updateArr[i];
+                    }
+                } else {
+                    if (cacheSection[j][me.setting.header[0].dataCode] == updateArr[i][me.setting.header[0].dataCode]) {
+                        cacheSection[j] = updateArr[i];
+                    }
+                }
+            }
+        }
+        return cacheSection;
+    },
     onRangeChanged: function(sender, args) {
         if (args.action == GC.Spread.Sheets.RangeChangedAction.clear) {
-            var me = rationOprObj, updateArr = [], addArr = [];
-            var cacheSection = me.currentRations["_SEC_ID_" + me.currentSectionId];
+            var me = rationOprObj, updateArr = [], removeArr = [];
+            var cacheSection = me.getCache();
             if (cacheSection) {
                 for (var i = 0; i < args.rowCount; i++) {
-                    var hasUpdate = false, rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row + i);
+                    var hasUpdate = false, rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row + i),
+                        isEmpty = sheetCommonObj.chkIfEmpty(rObj, me.setting);
                     for (var j = 0; j < cacheSection.length; j++) {
                         if (cacheSection[j][me.setting.header[0].dataCode] == rObj[me.setting.header[0].dataCode]) {
                             rObj["ID"] = cacheSection[j]["ID"];
@@ -53,10 +99,17 @@ var rationOprObj = {
                         }
                     }
                     if (hasUpdate) {
-                        updateArr.push(rObj);
+                        if (isEmpty) {
+                            removeArr.push(rObj);
+                        } else updateArr.push(rObj);
+                    } else if (isEmpty) {
+                        if (args.row + i < cacheSection.length) {
+                            rObj["ID"] = cacheSection[args.row + i]["ID"];
+                            removeArr.push(rObj["ID"]);
+                        }
                     }
                 }
-                //me.mixUpdateRequest(updateArr, addArr);
+                me.mixUpdateRequest(updateArr, [], removeArr);
                 //removeRationItems
             }
         }
@@ -65,7 +118,7 @@ var rationOprObj = {
         var me = rationOprObj;
         var rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row);
         me.currentEditingRation = rObj;
-        var cacheSection = me.currentRations["_SEC_ID_" + me.currentSectionId];
+        var cacheSection = me.getCache();
         if (cacheSection) {
             for (var j = 0; j < cacheSection.length; j++) {
                 if (cacheSection[j][me.setting.header[0].dataCode] == rObj[me.setting.header[0].dataCode]) {
@@ -85,7 +138,7 @@ var rationOprObj = {
             addArr.push(rObj);
         }
         me.currentEditingRation = null;
-        me.mixUpdateRequest(updateArr, addArr);
+        me.mixUpdateRequest(updateArr, addArr, []);
     },
     onClipboardPasting: function(sender, args) {
         var me = rationOprObj;
@@ -95,7 +148,7 @@ var rationOprObj = {
     },
     onClipboardPasted: function(e, info) {
         var me = rationOprObj;
-        var cacheSection = me.currentRations["_SEC_ID_" + me.currentSectionId];
+        var cacheSection = me.getCache();
         var updateArr = [], addArr = [];
         var items = sheetCommonObj.analyzePasteData(me.setting, info);
         for (var i = 0; i < items.length; i++) {
@@ -118,15 +171,15 @@ var rationOprObj = {
             }
         };
         if (updateArr.length > 0 || addArr.length > 0) {
-            me.mixUpdateRequest(updateArr, addArr);
+            me.mixUpdateRequest(updateArr, addArr, []);
         }
     },
-    mixUpdateRequest: function(updateArr, addArr) {
+    mixUpdateRequest: function(updateArr, addArr, removeIds) {
         var me = rationOprObj;
         $.ajax({
             type:"POST",
             url:"api/mixUpdateRationItems",
-            data:{"sectionID": me.currentSectionId, "updateItems": JSON.stringify(updateArr), "addItems": JSON.stringify(addArr)},
+            data:{"sectionID": me.currentSectionId, "updateItems": JSON.stringify(updateArr), "addItems": JSON.stringify(addArr), "removeIds": JSON.stringify(removeIds)},
             dataType:"json",
             cache:false,
             timeout:5000,
@@ -135,31 +188,13 @@ var rationOprObj = {
                     alert(err);
                     me.getRationItems(me.currentSectionId);
                 } else {
-                    var cacheSection = me.currentRations["_SEC_ID_" + me.currentSectionId];
-                    if (!(me.currentRations["_SEC_ID_" + me.currentSectionId])) {
-                        me.currentRations["_SEC_ID_" + me.currentSectionId] = [];
-                        cacheSection = me.currentRations["_SEC_ID_" + me.currentSectionId];
-                    }
-                    if (addArr.length > 0) {
-                        me.currentRations["_SEC_ID_" + me.currentSectionId] = cacheSection.concat(addArr);
-                        cacheSection = me.currentRations["_SEC_ID_" + me.currentSectionId];
-                    }
-                    if (result.data.ops && result.data.ops.length > 0) {
-                        for (var i = 0; i < result.data.ops.length; i++) {
-                            for (var j = 0; j < cacheSection.length; j++) {
-                                if (cacheSection[j][me.setting.header[0].dataCode] == result.data.ops[i][me.setting.header[0].dataCode]) {
-                                    cacheSection[j]["ID"] = result.data.ops[i]["ID"];
-                                }
-                            }
-                        }
-                    }
-                    for (var i = 0; i < updateArr.length; i++) {
-                        for (var j = 0; j < cacheSection.length; j++) {
-                            if (cacheSection[j][me.setting.header[0].dataCode] == updateArr[i][me.setting.header[0].dataCode]) {
-                                cacheSection[j] = updateArr[i];
-                            }
-                        }
-                    }
+                    var cacheSection = me.updateCache(addArr, updateArr, removeIds, result);
+                    cacheSection.sort(function(a, b){
+                        var rst = 0;
+                        if (a.code > b.code) rst = 1
+                        else if (a.code < b.code) rst = -1;
+                        return rst;
+                    });
                     me.showRationItems(me.currentSectionId);
                 }
             },

+ 150 - 56
web/rationLibEditor/js/repositoryGLJ.js

@@ -28,15 +28,16 @@ repositoryGljObj = {
     gljAllTypeId: -1,
     gljCurTypeId: -1,
     currentRepositoryId: -1,
+    currentCache: null,
     gljList: [],
     setting: {
         header:[
             {headerName:"编码",headerWidth:120,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
-            {headerName:"名称",headerWidth:400,dataCode:"name", dataType: "String", hAlign: "left", vAlign: "center"},
-            {headerName:"规格",headerWidth:120,dataCode:"specs", dataType: "String", hAlign: "left", vAlign: "center"},
+            {headerName:"名称",headerWidth:260,dataCode:"name", dataType: "String", hAlign: "left", vAlign: "center"},
+            {headerName:"规格",headerWidth:260,dataCode:"specs", dataType: "String", hAlign: "left", vAlign: "center"},
             {headerName:"单位",headerWidth:120,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
             {headerName:"基价单价",headerWidth:120,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
-            {headerName:"类型",headerWidth:120,dataCode:"gljType", dataType: "Number", hAlign: "center", vAlign: "center"}
+            {headerName:"类型",headerWidth:120,dataCode:"gljDistType", dataType: "String", hAlign: "center", vAlign: "center"}
         ],
         view:{
             comboBox:[
@@ -96,8 +97,9 @@ repositoryGljObj = {
             cache:false,
             timeout:5000,
             success:function(result){
-                if(result.success) {
+                if(!result.error) {
                     me.gljList = result.data;
+                    me.sortGlj();
                     me.showGljItems(result.data, me.gljCurTypeId);
                 }
             },
@@ -115,42 +117,80 @@ repositoryGljObj = {
                     cacheSection.push(data[i]);
                 }
             }
-            cacheSection.sort(function(g1, g2) {
-                var rst = 0;
-                if (g1.code > g2.code) rst = 1
-                else if (g1.code < g2.code) rst = -1;
-                return rst;
-            })
             sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
             sheetCommonObj.showData(me.workBook.getSheet(0), me.setting, cacheSection);
+            cacheSection = null;
         }
     },
     buildSheet: function(container) {
         var me = repositoryGljObj;
         me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30);
-        //var instance = new GC.Spread.Common.CultureInfo();
-        //var value; // Type: Object
-        //value = instance.NumberFormat;
-        //console.log(value);
         me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
         me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
-        //me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditStarting, function (sender, args) {
-        //    console.log("Start cell editing.");
-        //});
-        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditEnded, function (sender, args) {
-            console.log("Finish cell editing.");
-            //if (args.col == 0) {
-            //    args.sheet.suspendPaint();
-            //    args.sheet.suspendEvent();
-            //    args.sheet.setValue(args.row, args.col, args.editingText, GC.Spread.Sheets.SheetArea.viewport);
-            //    args.sheet.resumeEvent();
-            //    args.sheet.resumePaint();
-            //}
-        });
+        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditStarting, me.onCellEditStart);
+        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditEnded, me.onCellEditEnd);
+        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.RangeChanged, me.onRangeChanged);
+    },
+    onCellEditStart: function(sender, args) {
+        var me = repositoryGljObj;
+        var rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row);
+        me.currentEditingGlj = rObj;
+        var cacheSection = me.gljList;
+        if (cacheSection) {
+            for (var j = 0; j < cacheSection.length; j++) {
+                if (cacheSection[j][me.setting.header[0].dataCode] == rObj[me.setting.header[0].dataCode]) {
+                    rObj["ID"] = cacheSection[j]["ID"];
+                    break;
+                }
+            }
+        }
+    },
+    onCellEditEnd: function(sender, args) {
+        var me = repositoryGljObj, rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row),
+            updateArr = [], addArr = [];
+        if (me.currentEditingGlj["ID"]) {
+            rObj["ID"] = me.currentEditingGlj["ID"];
+            updateArr.push(rObj);
+        } else {
+            addArr.push(rObj);
+        }
+        rObj.gljType = me.gljCurTypeId;
+        me.currentEditingGlj = null;
+        me.mixUpdateRequest(updateArr, addArr, []);
+    },
+    onRangeChanged: function(sender, args) {
+        if (args.action == GC.Spread.Sheets.RangeChangedAction.clear) {
+            var me = repositoryGljObj, updateArr = [], removeArr = [];
+            var cacheSection = me.currentCache;
+            if (cacheSection) {
+                for (var i = 0; i < args.rowCount; i++) {
+                    var hasUpdate = false, rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row + i),
+                        isEmpty = sheetCommonObj.chkIfEmpty(rObj, me.setting);
+                    for (var j = 0; j < cacheSection.length; j++) {
+                        if (cacheSection[j][me.setting.header[0].dataCode] == rObj[me.setting.header[0].dataCode]) {
+                            rObj["ID"] = cacheSection[j]["ID"];
+                            hasUpdate = true;
+                            break;
+                        }
+                    }
+                    if (hasUpdate) {
+                        if (isEmpty) {
+                            removeArr.push(rObj["ID"]);
+                        } else updateArr.push(rObj);
+                    } else if (isEmpty) {
+                        if (args.row + i < cacheSection.length) {
+                            rObj["ID"] = cacheSection[args.row + i]["ID"];
+                            removeArr.push(rObj["ID"]);
+                        }
+                    }
+                }
+                me.mixUpdateRequest(updateArr, [], removeArr);
+            }
+        }
     },
     onClipboardPasting: function(sender, args) {
         var me = repositoryGljObj;
-        if (args.cellRange.colCount != me.setting.header.length) {
+        if (args.cellRange.colCount != me.setting.header.length || me.gljCurTypeId < 0 || me.gljAllTypeId === me.gljCurTypeId) {
             args.cancel = true;
         }
     },
@@ -168,46 +208,100 @@ repositoryGljObj = {
                 }
             }
             if (!hasCacheItem) {
+                items[i].gljType = me.gljCurTypeId;
                 addArr.push(items[i]);
             } else {
                 updateArr.push(items[i]);
             }
         }
         if (updateArr.length > 0 || addArr.length > 0) {
-            $.ajax({
-                type:"POST",
-                url:"api/mixUpdateGljItems",
-                data:{"repositoryId": me.currentRepositoryId, "updateItems": JSON.stringify(updateArr), "addItems": JSON.stringify(addArr)},
-                dataType:"json",
-                cache:false,
-                timeout:5000,
-                success:function(result){
-                    if (result.err) {
-                        alert(err);
-                        me.getRationItems(me.currentRepositoryId);
-                    } else {
-                        if (addArr.length > 0) {
-                            me.gljList = me.gljList.concat(addArr);
-                        }
-                        for (var i = 0; i < updateArr.length; i++) {
-                            for (var j = 0; j < me.gljList.length; j++) {
-                                if (me.gljList[j][me.setting.header[0].dataCode] == updateArr[i][me.setting.header[0].dataCode]) {
-                                    me.gljList[j] = updateArr[i];
-                                }
-                            }
-                        }
-                        me.showGljItems(me.gljList, me.gljAllTypeId);
+            me.mixUpdateRequest(updateArr, addArr, []);
+        }
+    },
+    mixUpdateRequest: function(updateArr, addArr, removeIds) {
+        var me = repositoryGljObj;
+        $.ajax({
+            type:"POST",
+            url:"api/mixUpdateGljItems",
+            data:{"repositoryId": me.currentRepositoryId, "updateItems": JSON.stringify(updateArr), "addItems": JSON.stringify(addArr), "removeIds": JSON.stringify(removeIds)},
+            dataType:"json",
+            cache:false,
+            timeout:5000,
+            success:function(result){
+                if (result.error) {
+                    alert(result.message);
+                    me.getRationItems(me.currentRepositoryId);
+                } else {
+                    me.updateCache(addArr, updateArr, removeIds, result);
+                    me.sortGlj();
+                    me.currentCache = me.getCache();
+                    me.showGljItems(me.gljList, me.gljCurTypeId);
+                }
+            },
+            error:function(err){
+                alert(err.responseJSON.error);
+            }
+        })
+    },
+    getCache: function() {
+        var me = this, rst = [];
+        for (var i = 0; i < me.gljList.length; i++) {
+            if (me.gljList[i].gljType == me.gljCurTypeId) {
+                rst.push(me.gljList[i]);
+            }
+        }
+        return rst;
+    },
+    updateCache: function(addArr, updateArr, removeIds, result) {
+        var me = this, cacheSection = me.gljList;
+        if (addArr.length > 0) {
+            me.gljList = me.gljList.concat(addArr);
+            cacheSection = me.gljList;
+        }
+        for (var i = removeIds.length - 1; i >= 0; i--) {
+            for (var j = cacheSection.length - 1; j >= 0 ; j--) {
+                if (cacheSection[j]["ID"] == removeIds[i]) {
+                    cacheSection.splice(j,1);
+                }
+            }
+        }
+        if (result && result.data.ops && result.data.ops.length > 0) {
+            for (var i = 0; i < result.data.ops.length; i++) {
+                for (var j = 0; j < cacheSection.length; j++) {
+                    if (cacheSection[j][me.setting.header[0].dataCode] == result.data.ops[i][me.setting.header[0].dataCode]) {
+                        cacheSection[j]["ID"] = result.data.ops[i]["ID"];
                     }
-                },
-                error:function(){
                 }
-            })
+            }
         }
+        for (var i = 0; i < updateArr.length; i++) {
+            for (var j = 0; j < cacheSection.length; j++) {
+                if (updateArr[i]["ID"] && cacheSection[j]["ID"]) {
+                    if (cacheSection[j]["ID"] == updateArr[i]["ID"]) {
+                        cacheSection[j] = updateArr[i];
+                    }
+                } else {
+                    if (cacheSection[j][me.setting.header[0].dataCode] == updateArr[i][me.setting.header[0].dataCode]) {
+                        cacheSection[j] = updateArr[i];
+                    }
+                }
+            }
+        }
+    },
+    sortGlj: function() {
+        var me = this;
+        me.gljList.sort(function(a, b){
+            var rst = 0;
+            if (a.code > b.code) rst = 1
+            else if (a.code < b.code) rst = -1;
+            return rst;
+        });
     },
     onClick: function(event,treeId,treeNode) {
         var me = repositoryGljObj,
             gljTypeId = treeNode.ID;
-        repositoryGljObj.gljCurTypeId = treeNode.ID;
-        repositoryGljObj.showGljItems(repositoryGljObj.gljList, gljTypeId);
+        me.gljCurTypeId = treeNode.ID;
+        me.currentCache = me.getCache();
+        me.showGljItems(me.gljList, gljTypeId);
     }
 }

+ 0 - 12
web/rationLibEditor/js/rightKeyMenu.js

@@ -1,12 +0,0 @@
-/**
- * Created by Tony on 2017/5/9.
- */
-
-var ration_chapter_tree_data = [
-    {
-        text: "增加根节点",
-        func: function() {
-            zTreeOprObj.addRootNode();
-        }
-    }
-]

+ 12 - 0
web/rationLibEditor/js/sheetCommon.js

@@ -126,5 +126,17 @@ var sheetCommonObj = {
     },
     unShieldAllCells: function(sheet) {
         sheet.options.isProtected = false;
+    },
+    chkIfEmpty: function(rObj, setting) {
+        var rst = true;
+        if (rObj) {
+            for (var i = 0; i < setting.header.length; i++) {
+                if (rObj[setting.header[i]]) {
+                    rst = false;
+                    break;
+                }
+            }
+        }
+        return rst;
     }
 }