zhongzewei 7 rokov pred
rodič
commit
dd1e14af79

+ 8 - 2
modules/std_glj_lib/controllers/gljController.js

@@ -23,8 +23,8 @@ class GljController extends BaseController{
         }
     }
     getGljTree(req,res){
-        let gljLibId = req.body.gljLibId;
-        gljDao.getGljTypes(gljLibId,function(err,data){
+        let data = JSON.parse(req.body.data);
+        gljDao.getGljTypes(data.gljLibId, function(err,data){
             callback(req,res,err, 'Get Tree', data)
         });
     }
@@ -72,6 +72,12 @@ class GljController extends BaseController{
             callback(req,res, err, results)
         });
     }
+    updateNodes(req, res){
+        let data = JSON.parse(req.body.data);
+        gljDao.updateNodes(data.updateData, data.lastOpr, function (err, data) {
+            callback(req, res, err, '', data);
+        });
+    }
     getGljItems(req, res) {
         let repId = req.body.repositoryId,
             gljType = req.body.type,

+ 56 - 6
modules/std_glj_lib/models/gljModel.js

@@ -9,13 +9,13 @@ import async from "async";
 
 class GljDao  extends OprDao{
     getGljTypes (gljLibId, callback){
-        gljClassModel.find({"repositoryId": gljLibId, "$or": [{"isDeleted": null}, {"isDeleted": false} ]},function(err,data){
+        gljClassModel.find({"repositoryId": gljLibId, "$or": [{"isDeleted": null}, {"isDeleted": false}, {deleted: false} ]},function(err,data){
             if(data.length) {
-                callback(false,data);
+                callback(0, data);
             }
             else  if(err) callback("获取工料机类型错误!",false)
             else {
-                gljClassTemplateModel.find({'$or': [{isDeleted: null}, {isDeleted: false}]}, function (err, datas) {
+                gljClassTemplateModel.find({'$or': [{isDeleted: null}, {isDeleted: false}, {deleted: false}]}, function (err, datas) {
                     if(err){
                         callback("获取工料机类型错误!", false);
                     }
@@ -38,7 +38,7 @@ class GljDao  extends OprDao{
                             });
                         }, function (err) {
                             if(err) callback("新增工料机类型错误!", false);
-                            else callback(false, rst);
+                            else callback(0, rst);
                         });
                     }
                 });
@@ -316,7 +316,57 @@ class GljDao  extends OprDao{
 
     }
 
-    updateNodes (repId, lastOpr, nodes, callback) {
+    updateNodes (updateData, lastOpr, callback) {
+        let functions = [];
+        for (let i = 0, len = updateData.length; i < len; i++) {
+            functions.push((function(doc) {
+                return function(cb) {
+                    if(doc.updateType === 'update'){
+                        gljClassModel.update({repositoryId: doc.updateData.repositoryId, ID: doc.updateData.ID}, doc.updateData, function (err) {
+                            if(err){
+                                cb(err);
+                            }
+                            else {
+                                cb(null);
+                            }
+                        });
+                    }
+                    else if(doc.updateType === 'new'){
+                        gljClassModel.create(doc.updateData, function (err) {
+                            if(err){
+                                cb(err);
+                            }
+                            else {
+                                cb(null);
+                            }
+                        });
+                    }
+                };
+            })(updateData[i]));
+        }
+        if(updateData.length > 0){
+            functions.push((function () {
+                return function (cb) {
+                    GljDao.updateOprArr({ID: updateData[0].updateData.rationRepId}, lastOpr, moment(Date.now()).format('YYYY-MM-DD HH:mm:ss'), function (err) {
+                        if(err){
+                            cb(err);
+                        }
+                        else{
+                            cb(null);
+                        }
+                    })
+                }
+            })());
+        }
+        async.parallel(functions, function(err, results) {
+            if(!err){
+                err = 0;
+            }
+            callback(err, results);
+        });
+    }
+
+  /*  updateNodes (repId, lastOpr, nodes, callback) {
         var functions = [];
         for (var i=0; i < nodes.length; i++) {
             functions.push((function(doc) {
@@ -340,7 +390,7 @@ class GljDao  extends OprDao{
         async.parallel(functions, function(err, results) {
             callback(err, results);
         });
-    }
+    }*/
     removeNodes (repId, lastOpr, nodeIds, preNodeId, preNodeNextId, callback){
         var functions = [];
         if (preNodeId != -1) {

+ 1 - 0
modules/std_glj_lib/routes/routes.js

@@ -29,6 +29,7 @@ module.exports = function (app) {
     router.post("/createNewGljTypeNode",gljController.auth, gljController.init, gljController.createNewGljTypeNode);
     router.post("/updateGljNodes",gljController.auth, gljController.init, gljController.updateGljNodes);
     router.post("/deleteGljNodes",gljController.auth, gljController.init, gljController.deleteGljNodes);
+    router.post("/updateNodes",gljController.auth, gljController.init, gljController.updateNodes);
     router.post("/getGljDistType",gljController.auth, gljController.init, gljController.getGljDistType);
     router.post("/getGljTree",gljController.auth, gljController.init, gljController.getGljTree);
     router.post("/getGljItems",gljController.auth, gljController.init, gljController.getGljItems);

+ 17 - 104
web/maintain/std_glj_lib/html/gongliao.html

@@ -38,116 +38,24 @@
             <div class="container-fluid">
                 <div class="row">
                     <!--org 3:7:2-->
-                  <div class="main-side col-lg-3 p-0" style="width: 100%; height: 100%; overflow-y: auto">
-                        <ul id="repositoryTree" class="ztree"></ul>
+                  <div class="main-side col-lg-3 p-0" style="width: 100%; height: 100%; overflow: hidden">
+                      <div class="tab-bar">
+                          <a href="javascript:void(0);" id="tree_Insert" class="btn btn-sm" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="插入"><i class="fa fa-plus" aria-hidden="true"></i></a>
+                          <a href="javascript:void(0);" id="tree_remove" class="btn btn-sm" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>
+                          <a href="javascript:void(0);" id="tree_upLevel" class="btn btn-sm " data-toggle="tooltip" data-placement="bottom" title="" data-original-title="升级"><i class="fa fa-arrow-left" aria-hidden="true"></i></a>
+                          <a href="javascript:void(0);" id="tree_downLevel" class="btn btn-sm " data-toggle="tooltip" data-placement="bottom" title="" data-original-title="降级"><i class="fa fa-arrow-right" aria-hidden="true"></i></a>
+                          <a href="javascript:void(0);" id="tree_downMove" class="btn btn-sm" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
+                          <a href="javascript:void(0);" id="tree_upMove" class="btn btn-sm" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
+                      </div>
+                      <div class="tab-content" id="gljClassSpread" style="overflow: hidden">
+                      </div>
+                        <!--<ul id="repositoryTree" class="ztree"></ul>-->
                   </div>
                   <div class="main-content col-lg-6 p-0">
                     <div id="GLJListSheet" class="main-data">
-                      <!--<table class="table table-sm table-bordered m-0">
-                      <thead>
-                        <tr>
-                          <th></th>
-                          <th>编码</th>
-                          <th>名称</th>
-                          <th>规格型号</th>
-                          <th>计量单位</th>
-                          <th>单价</th>
-                          <th>类型</th>
-                        </tr>
-                      </thead>
-                      <tbody>
-                        <tr>
-                          <td>1</td>
-                          <td>00010201</td>
-                          <td>土石方综合工日</td>
-                          <td></td>
-                          <td>工日</td>
-                          <td>22.00</td>
-                          <td>人工</td>
-                        </tr>
-                        <tr>
-                          <td>2</td>
-                          <td>03010101</td>
-                          <td>钢材</td>
-                          <td></td>
-                          <td>t</td>
-                          <td>2600.00</td>
-                          <td>材料</td>
-                        </tr>
-                        <tr>
-                          <td>3</td>
-                          <td>36290101</td>
-                          <td>水</td>
-                          <td></td>
-                          <td>m3</td>
-                          <td>2600.00</td>
-                          <td>材料</td>
-                        </tr>
-                        <tr>
-                          <td>4</td>
-                          <td></td>
-                          <td></td>
-                          <td></td>
-                          <td></td>
-                          <td></td>
-                          <td></td>
-                        </tr>
-                        <tr>
-                          <td>5</td>
-                          <td></td>
-                          <td></td>
-                          <td></td>
-                          <td></td>
-                          <td></td>
-                          <td></td>
-                        </tr>
-                        <tr>
-                          <td>6</td>
-                          <td></td>
-                          <td></td>
-                          <td></td>
-                          <td></td>
-                          <td></td>
-                          <td></td>
-                        </tr>
-                      </tbody>
-                    </table>-->
                     </div>
                   </div>
                     <div id="gljComponentSheet" class="main-side col-lg-3 p-0">
-                     <!-- <table class="table table-sm table-bordered m-0">
-                        <thead>
-                          <tr><th></th><th>编码</th><th>名称</th><th>计量单位</th><th>单价</th><th>消耗量</th></tr>
-                        </thead>
-                        <tbody>
-                          <tr><td>1</td><td></td><td></td><td></td><td></td><td></td></tr>
-                          <tr><td>2</td><td></td><td></td><td></td><td></td><td></td></tr>
-                          <tr><td>3</td><td></td><td></td><td></td><td></td><td></td></tr>
-                          <tr><td>4</td><td></td><td></td><td></td><td></td><td></td></tr>
-                        </tbody>
-                      </table>
-                      <table class="table table-sm table-bordered m-0">
-                        <thead>
-                          <tr><th></th><th>编码</th><th>名称</th><th>计量单位</th><th>单价</th><th>消耗量</th></tr>
-                        </thead>
-                        <tbody>
-                          <tr><td>1</td><td>01010101</td><td>水泥32.5</td><td>kg</td><td>0.25</td><td>243.000</td></tr>
-                          <tr><td>2</td><td></td><td></td><td></td><td></td><td></td></tr>
-                          <tr><td>3</td><td></td><td></td><td></td><td></td><td></td></tr>
-                          <tr><td>4</td><td></td><td></td><td></td><td></td><td></td></tr>
-                        </tbody>
-                      </table>
-                      <table class="table table-sm table-bordered m-0">
-                        <thead>
-                          <tr><th></th><th>编码</th><th>名称</th><th>计量单位</th><th>单价</th><th>消耗量</th></tr>
-                        </thead>
-                        <tbody>
-                          <tr><td>1</td><td>xxx</td><td>机上人工</td><td>工日</td><td>28.00</td><td>2.540</td></tr>
-                          <tr><td>2</td><td></td><td></td><td></td><td></td><td></td></tr>
-                          <tr><td>3</td><td></td><td></td><td></td><td></td><td></td></tr>
-                          <tr><td>4</td><td></td><td></td><td></td><td></td><td></td></tr>
-                        </tbody>
-                      </table>-->
                     </div>
                 </div>
             </div>
@@ -248,7 +156,12 @@
     <script type="text/javascript" src="/public/web/scMathUtil.js"></script>
     <script type="text/javascript" src="/public/web/treeDataHelper.js"></script>
     <script type="text/javascript" src="/public/web/QueryParam.js"></script>
+    <script type="text/javascript" src="/public/web/common_ajax.js"></script>
+    <script type="text/javascript" src="/public/web/id_tree.js"></script>
+    <script type="text/javascript" src="/public/web/tree_sheet/tree_sheet_controller.js"></script>
+    <script type="text/javascript" src="/public/web/tree_sheet/tree_sheet_helper.js"></script>
     <script type="text/javascript" src="/web/maintain/std_glj_lib/js/glj.js"></script>
+    <script type="text/javascript" src="/web/maintain/std_glj_lib/js/gljClassTree.js"></script>
     <script type="text/javascript" src="/web/maintain/std_glj_lib/js/gljComponent.js"></script>
     <script type="text/javascript" src="/web/maintain/std_glj_lib/js/components.js"></script>
     <script type="text/javascript" src="/public/web/ztree_common.js"></script>

+ 27 - 8
web/maintain/std_glj_lib/js/glj.js

@@ -21,9 +21,12 @@ let pageOprObj = {
             //repositoryGljObj.getRationGljIds(gljLibId);
             repositoryGljObj.getGljDistType(function () {
                 repositoryGljObj.currentRepositoryId = parseInt(gljLibId);
-                repositoryGljObj.getGljTree(gljLibId, function () {
+              /*  repositoryGljObj.getGljTree(gljLibId, function () {
                     repositoryGljObj.getGljItems(gljLibId);
-                });
+                });*/
+                repositoryGljObj.getGljItems(gljLibId, function () {
+                    gljClassTreeObj.getGljClassTree(gljLibId);
+                })
             });
         });
     }
@@ -154,7 +157,7 @@ let repositoryGljObj = {
             }
         })
     },
-    getGljItems: function(repId) {
+    getGljItems: function(repId, callback) {
         let me = this;
         $.ajax({
             type:"POST",
@@ -169,11 +172,8 @@ let repositoryGljObj = {
                     me.workBook.getSheet(0).setRowCount(result.data.length);
                     me.sortGlj();
                     me.currentGlj = me.gljList.length > 0 ? me.gljList[0] : null;//初始
-                    let rootNode = me.treeObj.getNodes()[0];
-                    if(rootNode && rootNode.isParent && rootNode.isFirstNode){
-                        componentOprObj.rootNode = rootNode;
-                        me.treeObj.selectNode(rootNode);
-                        gljTypeTreeOprObj.onClick(null, 'repositoryTree', rootNode);
+                    if(callback){
+                        callback();
                     }
                 }
             },
@@ -1099,6 +1099,25 @@ let repositoryGljObj = {
             }
         }
     },
+    updateParentNodeIds: function (nodes, caller) {
+        let private_build_parentNodeIds = function(pNodeId, nodesArr){
+            let rst = [];
+            for (let i = 0; i < nodesArr.length; i++) {
+                if (nodesArr[i].children.length > 0) {
+                    rst = rst.concat(private_build_parentNodeIds(nodesArr[i].data.ID, nodesArr[i].children));
+                } else {
+                    rst.push(nodesArr[i].data.ID);
+                }
+            }
+            if (pNodeId && rst.length > 0) {
+                caller.parentNodeIds["_pNodeId_" + pNodeId] = rst;
+            }
+            return rst;
+        };
+        if (caller.parentNodeIds) {
+            private_build_parentNodeIds(null, nodes);
+        }
+    },
     sortGlj: function() {
         let me = this;
         me.gljList.sort(function(a, b){

+ 501 - 0
web/maintain/std_glj_lib/js/gljClassTree.js

@@ -0,0 +1,501 @@
+/**
+ * Created by Zhong on 2018/1/16.
+ */
+let gljClassTreeObj = {
+    cache: null,//ref to tree.items
+    tree: null,
+    controller: null,
+    workBook: null,
+    sheet: null,
+    updateType: {new: 'new', update: 'update'},
+    insertBtn: $('#tree_Insert'),
+    removeBtn: $('#tree_remove'),
+    upLevelBtn: $('#tree_upLevel'),
+    downLevelBtn: $('#tree_downLevel'),
+    downMoveBtn: $('#tree_downMove'),
+    upMoveBtn: $('#tree_upMove'),
+    setting: {
+        sheet: {
+            cols:[
+                {
+                    head: {
+                        titleNames: ['名称'],
+                        spanCols: [1],
+                        spanRows: [2],
+                        vAlign: [1, 1],
+                        hAlign: [1, 1],
+                        font: 'Arial'
+                    },
+                    data: {
+                        field: 'Name',
+                        vAlign: 1,
+                        hAlign: 0,
+                        font: 'Arial'
+                    },
+                    width: 400
+                }
+            ],
+            headRows: 1,
+            headRowHeight: [47],
+            emptyRows: 0,
+            treeCol: 0
+        },
+        tree: {
+            id: 'ID',
+            pid: 'ParentID',
+            nid: 'NextSiblingID',
+            rootId: -1
+        },
+        options: {
+            tabStripVisible:  false,
+            allowCopyPasteExcelStyle : false,
+            allowExtendPasteRange: false,
+            allowUserDragDrop : false,
+            allowUserDragFill: false,
+            scrollbarMaxAlign : true
+        }
+    },
+
+    isDef: function (v) {
+        return v !== undefined && v !== null;
+    },
+    isFunc: function (v) {
+        return this.isDef(v) && typeof v === 'function';
+    },
+    //sheet things
+    setOptions: function (workbook, opts) {
+        for(let opt in opts){
+            workbook.options[opt] = opts[opt];
+        }
+    },
+
+    renderFunc: function (sheet, func) {
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        if(this.isFunc(func)){
+            func();
+        }
+        sheet.resumePaint();
+        sheet.resumeEvent();
+    },
+
+    buildSheet: function () {
+        if(!this.isDef(this.workBook)){
+            this.workBook = new GC.Spread.Sheets.Workbook($('#gljClassSpread')[0], {sheetCount: 1});
+            this.sheet = this.workBook.getActiveSheet();
+            this.setOptions(this.workBook, this.setting.options);
+            this.sheet.options.clipBoardOptions = GC.Spread.Sheets.ClipboardPasteOptions.values;
+            this.bindEvents(this.sheet);
+        }
+    },
+
+    bindEvents: function (sheet) {
+        let me = gljClassTreeObj;
+        const Events = GC.Spread.Sheets.Events;
+        sheet.bind(Events.SelectionChanged, me.onSelectionChanged);
+        sheet.bind(Events.EditEnded, me.onEditEnded);
+        sheet.bind(Events.ClipboardPasted, me.onClipboardPasted);
+    },
+
+    onSelectionChanged: function (sender, info) {
+        let me = gljClassTreeObj;
+        if(info.oldSelections.length === 0 && info.newSelections.length > 0 || info.oldSelections[0].row !== info.newSelections[0].row){
+            let row = info.newSelections[0].row;
+            let node = me.cache[row];
+            me.initSelection(node);
+        }
+        else {
+            me.refreshBtn(null);
+        }
+    },
+
+    onEditEnded: function (sender, args) {
+        let me = gljClassTreeObj;
+        let postData = [];
+        let v = me.isDef(args.editingText) ? args.editingText.toString().trim() : '';
+        let node = me.cache[args.row];
+        if(me.isDef(node) && node.data.Name !== v){
+            let updateObj = me.getUpdateObj(me.updateType.update, node.getID(), null, null, v, null);
+            postData.push(updateObj);
+            //ajax
+            //update
+            me.gljClassTreeAjax(postData, function (rstData) {
+                node.data.Name = v;
+            }, function () {
+                args.sheet.setValue(args.row, args.col, node.data.Name ? node.data.Name : '');
+            });
+        }
+    },
+
+    onClipboardPasted: function (sender, info) {
+        let me = gljClassTreeObj;
+        let items = sheetCommonObj.analyzePasteData({header: [{dataCode: 'Name'}]}, info);
+        let postData = [];
+        let frontData = [];
+        for(let i = 0, len = items.length; i < len; i++){
+            let row = info.cellRange.row + i;
+            let node = me.cache[row];
+            if(me.isDef(node) && me.isDef(items[i].Name) && node.data.Name !== items[i].Name){
+                let updateObj = me.getUpdateObj(me.updateType.update, node.getID(), null, null, items[i].Name, null);
+                postData.push(updateObj);
+                frontData.push({row: row, Name: items[i].Name});
+                node.data.Name = items[i].Name;
+            }
+        }
+        if(postData.length > 0){
+            //ajax
+            me.gljClassTreeAjax(postData, function (rstData) {
+                for(let i = 0, len = frontData.length; i < len; i++){
+                    let node = me.cache[frontData[i]['row']];
+                    if(me.isDef(node)){
+                        node.data.Name = frontData[i]['Name'];
+                    }
+                }
+            }, function () {
+                for(let i = 0, len = frontData.length; i < len; i++){
+                    let node = me.cache[frontData[i]['row']];
+                    me.sheet.setValue(frontData[i]['row'], 0, me.isDef(node) ? node.data.Name : '');
+                }
+            });
+        }
+    },
+
+    getGljClassTree: function (gljLibId, callback) {
+        let me = gljClassTreeObj;
+        let re = repositoryGljObj;
+        let url = 'api/getGljTree';
+        let postData = {gljLibId: gljLibId};
+        let sucFunc = function (rstData) {
+            zTreeHelper.createTree(rstData, componentSetting, "componentTree", componentOprObj);
+            let rootNode = componentOprObj.treeObj.getNodes()[0];
+            if(rootNode && rootNode.isParent && rootNode.isFirstNode){
+                componentOprObj.rootNode = rootNode;
+            }
+            if (rstData && rstData.length > 0) {
+                me.gljCurTypeId = rstData[0].ID;
+            }
+            //init
+            me.buildSheet();
+            me.initTree(rstData);
+            me.cache = me.tree.items;
+            re.updateParentNodeIds(me.cache, re);
+            me.bindBtn();
+            me.initController(me.tree, me.sheet, me.setting.sheet);
+            me.controller.showTreeData();
+            me.sheet.setFormatter(-1, 0, '@');
+            me.initSelection(me.tree.selected);
+            if(callback){
+                callback();
+            }
+        };
+        let errFunc = function () {
+
+        };
+        CommonAjax.post(url, postData, sucFunc, errFunc);
+    },
+
+    initTree: function (datas) {
+        this.tree = idTree.createNew(this.setting.tree);
+        this.tree.loadDatas(datas);
+        this.tree.selected = this.tree.items.length > 0 ? this.tree.items[0] : null;
+    },
+
+    initController: function (tree, sheet, setting) {
+        this.controller = TREE_SHEET_CONTROLLER.createNew(tree, sheet, setting);
+    },
+
+    refreshBtn: function (selected) {
+        let me = this;
+        me.insertBtn.removeClass('disabled');
+        me.removeBtn.removeClass('disabled');
+        me.upLevelBtn.removeClass('disabled');
+        me.downLevelBtn.removeClass('disabled');
+        me.downMoveBtn.removeClass('disabled');
+        me.upMoveBtn.removeClass('disabled');
+        if(!me.isDef(selected)){
+            me.removeBtn.addClass('disabled');
+            me.upLevelBtn.addClass('disabled');
+            me.downLevelBtn.addClass('disabled');
+            me.downMoveBtn.addClass('disabled');
+            me.upMoveBtn.addClass('disabled');
+        }
+        else {
+            if(!me.isDef(selected.preSibling)){
+                me.downLevelBtn.addClass('disabled');
+                me.upMoveBtn.addClass('disabled');
+            }
+            if(!me.isDef(selected.nextSibling)){
+                me.downMoveBtn.addClass('disabled');
+            }
+            if(!me.isDef(selected.parent)){
+                me.upLevelBtn.addClass('disabled');
+            }
+        }
+    },
+
+    bindBtn: function () {
+        let me = this;
+        me.insertBtn.click(function () {
+            me.insert();
+        });
+        me.removeBtn.click(function () {
+            me.remove(me.tree.selected);
+        });
+        me.upLevelBtn.click(function () {
+            me.upLevel(me.tree.selected);
+        });
+        me.downLevelBtn.click(function () {
+            me.downLevel(me.tree.selected);
+        });
+        me.downMoveBtn.click(function () {
+            me.downMove(me.tree.selected);
+        });
+        me.upMoveBtn.click(function () {
+            me.upMove(me.tree.selected);
+        });
+    },
+
+    insert: function () {
+        let me = this;
+        let re = repositoryGljObj;
+        me.insertBtn.addClass('disabled');
+        let postData = [];
+        let newID = me.tree.newNodeID();
+        if(!me.isDef(newID)){
+            return;
+        }
+        let selected = me.tree.selected;
+        let insertObj = me.getUpdateObj(me.updateType.new, newID, -1, -1, '', null);
+        if(me.isDef(selected)) {
+            let updateObj = me.getUpdateObj(me.updateType.update, selected.getID(), newID, null, null, null);
+            postData.push(updateObj);
+            insertObj.updateData.ParentID = selected.getParentID();
+            if(me.isDef(selected.nextSibling)){
+                insertObj.updateData.NextSiblingID = selected.getNextSiblingID();
+            }
+        }
+        postData.push(insertObj);
+        if(postData.length > 0){
+            //ajax
+            me.gljClassTreeAjax(postData, function (rstData) {
+                me.controller.insert();
+                me.refreshBtn(me.tree.selected);
+                //fresh tools
+                me.initTools(me.tree.selected);
+                re.updateParentNodeIds(me.cache, re);
+            });
+        }
+    },
+    remove: function (selected) {
+        let me = this;
+        let re = repositoryGljObj;
+        me.removeBtn.addClass('disabled');
+        let postData = [], IDs = [];
+        if(!selected){
+            return;
+        }
+        getDelIds(selected);
+        function getDelIds(node){
+            if(me.isDef(node)){
+                IDs.push(node.getID());
+                if(node.children.length > 0){
+                    for(let i = 0, len = node.children.length; i < len; i++){
+                        getDelIds(node.children[i]);
+                    }
+                }
+            }
+        }
+        if(me.isDef(selected.preSibling)){
+            let updateObj = me.getUpdateObj(me.updateType.update, selected.preSibling.getID(), selected.getNextSiblingID(), null, null, null);
+            postData.push(updateObj);
+        }
+        if(IDs.length > 0){
+            for(let i = 0, len = IDs.length; i < len; i++){
+                let delObj = me.getUpdateObj(me.updateType.update, IDs[i], null, null, null, true);
+                postData.push(delObj);
+            }
+        }
+        if(postData.length > 0){
+            //ajax
+            me.gljClassTreeAjax(postData, function (rstData) {
+                me.controller.delete();
+                me.refreshBtn(me.tree.selected);
+                me.initTools(me.tree.selected);
+                re.updateParentNodeIds(me.cache, re);
+            });
+        }
+    },
+    upLevel: function (selected) {
+        let me = this;
+        let re = repositoryGljObj;
+        me.upLevelBtn.addClass('disabled');
+        let postData = [];
+        if(!me.isDef(selected)){
+            return;
+        }
+        if(!me.isDef(selected.parent)){
+            return;
+        }
+        if(me.isDef(selected.preSibling)){
+            let updateObj = me.getUpdateObj(me.updateType.update, selected.preSibling.getID(), -1, null, null, null);
+            postData.push(updateObj);
+        }
+        let updateObj = me.getUpdateObj(me.updateType.update, selected.getID(), selected.parent.getNextSiblingID(), selected.parent.getParentID(), null, null);
+        postData.push(updateObj);
+        let updateParent = me.getUpdateObj(me.updateType.update, selected.getParentID(), selected.getID(), null, null, null);
+        postData.push(updateParent);
+        let nextIDs = [];
+        getNext(selected);
+        function getNext(node){
+            if(me.isDef(node.nextSibling)){
+                nextIDs.push(node.getNextSiblingID());
+                getNext(node.nextSibling);
+            }
+        }
+        for(let i = 0, len = nextIDs.length; i < len; i++){
+            postData.push(me.getUpdateObj(me.updateType.update, nextIDs[i], null, selected.getID(), null, null));
+        }
+        if(postData.length > 0){
+            //ajax
+            me.gljClassTreeAjax(postData, function (rstData) {
+                me.controller.upLevel();
+                me.refreshBtn(me.tree.selected);
+                re.updateParentNodeIds(me.cache, re);
+            });
+        }
+
+    },
+    downLevel: function (selected) {
+        let me = this;
+        let re = repositoryGljObj;
+        me.downLevelBtn.addClass('disabled');
+        let postData = [];
+        if(!me.isDef(selected)){
+            return;
+        }
+        if(!me.isDef(selected.preSibling)){
+            return;
+        }
+        let updatePre = me.getUpdateObj(me.updateType.update, selected.preSibling.getID(), selected.getNextSiblingID(), null, null, null);
+        postData.push(updatePre);
+        if(selected.preSibling.children.length > 0){
+            let updateObj = me.getUpdateObj(me.updateType.update, selected.preSibling.children[selected.preSibling.children.length - 1].getID(), selected.getID(), null, null, null);
+            postData.push(updateObj);
+        }
+        let updateObj = me.getUpdateObj(me.updateType.update, selected.getID(), -1, selected.preSibling.getID(), null, null);
+        postData.push(updateObj);
+        if(postData.length > 0){
+            //ajax
+            me.gljClassTreeAjax(postData, function (rstData) {
+                me.controller.downLevel();
+                me.refreshBtn(me.tree.selected);
+                re.updateParentNodeIds(me.cache, re);
+            });
+        }
+    },
+    upMove: function (selected) {
+        let me = this;
+        me.upMoveBtn.addClass('disabled');
+        let postData = [];
+        if(!me.isDef(selected)){
+            return;
+        }
+        if(!me.isDef(selected.preSibling)){
+            return;
+        }
+        let updateObj = me.getUpdateObj(me.updateType.update, selected.getID(), selected.preSibling.getID(), null, null, null);
+        postData.push(updateObj);
+        let updatePre = me.getUpdateObj(me.updateType.update, selected.preSibling.getID(), selected.getNextSiblingID(), null, null, null);
+        postData.push(updatePre);
+        if(me.isDef(selected.preSibling.preSibling)){
+            let updatePrepre = me.getUpdateObj(me.updateType.update, selected.preSibling.preSibling.getID(), selected.getID(), null, null, null);
+            postData.push(updatePrepre);
+        }
+        if(postData.length > 0){
+            //ajax
+            me.gljClassTreeAjax(postData, function (rstData) {
+                me.controller.upMove();
+                me.refreshBtn(me.tree.selected);
+            });
+        }
+    },
+    downMove: function (selected) {
+        let me = this;
+        me.downMoveBtn.addClass('disabled');
+        let postData = [];
+        if(!me.isDef(selected)){
+            return;
+        }
+        if(!me.isDef(selected.nextSibling)){
+            return;
+        }
+        if(me.isDef(selected.preSibling)){
+            let updatePre = me.getUpdateObj(me.updateType.update, selected.preSibling.getID(), selected.getNextSiblingID(), null, null, null);
+            postData.push(updatePre);
+        }
+        let updateObj = me.getUpdateObj(me.updateType.update, selected.getID(), selected.nextSibling.getNextSiblingID(), null, null, null);
+        postData.push(updateObj);
+        let updateNext = me.getUpdateObj(me.updateType.update, selected.getNextSiblingID(), selected.getID(), null, null, null);
+        postData.push(updateNext);
+        if(postData.length > 0){
+            //ajax
+            me.gljClassTreeAjax(postData, function (rstData) {
+                me.controller.downMove();
+                me.refreshBtn(me.tree.selected);
+            });
+        }
+    },
+    getUpdateObj: function (updateType, id, nid, pid, name, deleted) {
+        let updateObj = Object.create(null);
+        updateObj.updateType = '';
+        updateObj.updateData = Object.create(null);
+        updateObj.updateData.repositoryId = pageOprObj.gljLibId;
+        if(this.isDef(updateType)){
+            updateObj.updateType = updateType;
+        }
+        if(this.isDef(id)){
+            updateObj.updateData.ID = id;
+        }
+        if(this.isDef(nid)){
+            updateObj.updateData.NextSiblingID = nid;
+        }
+        if(this.isDef(pid)){
+            updateObj.updateData.ParentID = pid;
+        }
+        if(this.isDef(name)){
+            updateObj.updateData.Name = name;
+        }
+        if(this.isDef(deleted)){
+            updateObj.updateData.deleted = true;
+        }
+        return updateObj;
+    },
+    gljClassTreeAjax: function (postData, scFunc, errFunc) {
+        CommonAjax.post('api/updateNodes', {updateData: postData, lastOpr: userAccount}, scFunc, errFunc);
+    },
+    //模仿默认点击
+    initSelection: function (node) {
+        let me = this,
+            re = repositoryGljObj,
+            that = gljComponentOprObj;
+        if(!re.isDef(node)){
+            return;
+        }
+        me.refreshBtn(node);
+
+        let gljTypeId = node.data.ID;
+        re.gljCurTypeId = node.data.ID;
+        re.addGljObj = null;
+        sheetCommonObj.cleanSheet(that.workBook.getSheet(0), that.setting, 10);
+        if (re.parentNodeIds["_pNodeId_" + gljTypeId]) {
+            re.currentOprParent = 1;
+            re.currentCache = re.getParentCache(re.parentNodeIds["_pNodeId_" + gljTypeId]);
+            re.workBook.getSheet(0).setRowCount(re.currentCache.length);
+        } else {
+            re.currentOprParent = 0;
+            re.currentCache = re.getCache();
+        }
+        re.showGljItems(re.currentCache, gljTypeId);
+        me.workBook.focus(true);
+    }
+}

+ 9 - 3
web/maintain/std_glj_lib/js/gljComponent.js

@@ -371,11 +371,13 @@ let gljComponentOprObj = {
         let gljCache = that.gljList;
         if(info.cellRange.col === 0){
             for(let i = 0; i < items.length; i++){
+                let existCode = false;
                 for(let j = 0; j < gljCache.length; j++){
                     if(items[i].code === gljCache[j].code){
+                        existCode = true;
                         if((materialComponent.indexOf(that.currentGlj.gljType) !== -1 && gljCache[j].gljType === 201)
                             || (that.currentGlj.gljType === 301 && machineComponent.indexOf(gljCache[j].gljType) !== -1 )
-                            || (that.currentGlj.gljType === 4 && gljCache[i].gljType === 4 && that.currentGlj.ID !== gljCache[i].ID)){
+                            || (that.currentGlj.gljType === 4 && gljCache[j].gljType === 4 && that.currentGlj.ID !== gljCache[i].ID)){
                             //是否与原有组成物不同
                             let isExist = false;
                             for(let k = 0; k < component.length; k++){
@@ -417,10 +419,14 @@ let gljComponentOprObj = {
                         }
 
                     }
-                    else{
+                  /*  else{
                         me.workBook.getSheet(0).setValue(info.cellRange.row + i, info.cellRange.col,
                             typeof that.currentComponent[info.cellRange.row + i] !== 'undefined'? that.currentComponent[info.cellRange.row + i].code : '');
-                    }
+                    }*/
+                }
+                if(!existCode){
+                    me.workBook.getSheet(0).setValue(info.cellRange.row + i, info.cellRange.col,
+                        typeof that.currentComponent[info.cellRange.row + i] !== 'undefined'? that.currentComponent[info.cellRange.row + i].code : '');
                 }
             }
             if(isChange){

+ 13 - 12
web/maintain/std_glj_lib/js/global.js

@@ -11,15 +11,16 @@ function autoFlashHeight(){
     $(".form-list").height($(window).height()-headerHeight-50 );
     $(".main-data-top").height($(window).height()-headerHeight-toolsBar-bottomContentHeight-2);
     $(".main-data").height($(window).height()-headerHeight);
+    $(".main-side .tab-content").height($(window).height()-headerHeight-38);
 };
 $(window).resize(autoFlashHeight);
 /*全局自适应高度结束*/
 $(function(){
-/*侧滑*/
-$(".open-sidebar").click(function(){
-    $(".slide-sidebar").animate({width:"800"}).addClass("open");
-});
-$("body").click(function(event){
+    /*侧滑*/
+    $(".open-sidebar").click(function(){
+        $(".slide-sidebar").animate({width:"800"}).addClass("open");
+    });
+    $("body").click(function(event){
         var e = event || window.event; //浏览器兼容性
         if(!$(event.target).is('a')) {
             var elem = event.target || e.srcElement;
@@ -33,10 +34,10 @@ $("body").click(function(event){
         }
 
     });
-/*侧滑*/
-/*工具提示*/
-$('*[data-toggle=tooltip]').mouseover(function() {
- $(this).tooltip('show');
-  });
-/*工具提示*/
-});
+    /*侧滑*/
+    /*工具提示*/
+    $('*[data-toggle=tooltip]').mouseover(function() {
+        $(this).tooltip('show');
+    });
+    /*工具提示*/
+});