Sfoglia il codice sorgente

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost

# Conflicts:
#	web/main/html/main.html
#	web/main/js/models/project.js
zhangyin 8 anni fa
parent
commit
5cea751520
43 ha cambiato i file con 3338 aggiunte e 1672 eliminazioni
  1. 45 16
      modules/billsLib/billsLibControllers/billsLibControllers.js
  2. 382 155
      modules/billsLib/billsLibModel/billsLibInterfaces.js
  3. 12 12
      modules/billsLib/billsLibModel/billsLibSchemas.js
  4. 6 24
      modules/billsLib/billsLibRoutes/billsLibRoutes.js
  5. 5 28
      modules/rationRepository/controllers/rationChapterTreeController.js
  6. 33 0
      modules/rationRepository/controllers/rationController.js
  7. 44 0
      modules/rationRepository/models/coeList.js
  8. 58 0
      modules/rationRepository/models/gljRepository.js
  9. 20 47
      modules/rationRepository/models/rationChapterTree.js
  10. 34 0
      modules/rationRepository/models/rationCoe.js
  11. 107 0
      modules/rationRepository/models/rationItem.js
  12. 1 1
      modules/rationRepository/models/repositoryMap.js
  13. 3 2
      modules/rationRepository/routes/rationRepRoutes.js
  14. 1 1
      modules/reports/controllers/rpt_controller.js
  15. 9 9
      modules/reports/rpt_component/JpcEx.js
  16. 1 1
      modules/reports/rpt_component/Jpc_BillTab.js
  17. 2 2
      modules/reports/rpt_component/Jpc_CrossTab.js
  18. 2 2
      modules/reports/rpt_component/Jpc_FlowTab.js
  19. 4 3
      public/counter/counter.js
  20. 4 1
      public/web/idTree.js
  21. 18 1
      server.js
  22. 129 0
      test/unit/idTree/idTreeTest.js
  23. 1 1
      test/unit/reports/testRpt.js
  24. 0 114
      test/unit/stdBillsTree/testMyTree.js
  25. 7 8
      web/billsLib/html/main.html
  26. 54 28
      web/billsLib/html/neirong.html
  27. 200 48
      web/billsLib/html/qingdan.html
  28. 0 19
      web/billsLib/html/test.html
  29. 115 66
      web/billsLib/html/tezheng.html
  30. 179 16
      web/billsLib/scripts/billsLibAjax.js
  31. 131 2
      web/billsLib/scripts/billsLibSetting.js
  32. 1030 31
      web/billsLib/scripts/dbController.js
  33. 198 68
      web/billsLib/scripts/setSheets.js
  34. 1 0
      web/main/html/main.html
  35. 3 4
      web/main/js/models/project.js
  36. 0 172
      web/rationLibEditor/_zSpread.js
  37. 23 541
      web/rationLibEditor/dinge.html
  38. 1 2
      web/rationLibEditor/gongliao.html
  39. 212 0
      web/rationLibEditor/js/chapterTree.js
  40. 0 247
      web/rationLibEditor/js/dinge.js
  41. 173 0
      web/rationLibEditor/js/ration.js
  42. 31 0
      web/rationLibEditor/js/rationGLJ.js
  43. 59 0
      web/rationLibEditor/js/sheetCommon.js

+ 45 - 16
modules/billsLib/billsLibControllers/billsLibControllers.js

@@ -17,15 +17,26 @@ var callback = function(req, res, err, message, data){
 }
 
 module.exports = {
+    getMaxNumber: function(req, res){
+        var data = JSON.parse(req.body.data);
+        billsLibDao.getMaxNumber(data, function(err, message, maxNumber){
+            callback(req, res, err, message, maxNumber);
+        });
+    },
+    getABillsLib: function(req, res){
+        var data = JSON.parse(req.body.data);
+        billsLibDao.getABillsLib(data, function(err, message, data){
+            callback(req, res, err, message, data);
+        });
+    },
     getStdBillsLib: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsLibDao.getStdBillsLib(data.userId, function(err, message, stdBillsLib){
+        billsLibDao.getStdBillsLib(data, function(err, message, stdBillsLib){
             callback(req, res, err, message, stdBillsLib );
         });
     },
     createStdBillsLib: function(req, res){
         var data = JSON.parse(req.body.data);
-        var billsLibName = data.name;
          billsLibDao.createStdBillsLib(data, function(err, message, info){
             callback(req, res, err, message, info);
          });
@@ -72,6 +83,24 @@ module.exports = {
             callback(req, res, err, message, null);
         });
     },
+    updateBillsArr: function(req, res){
+        var data = JSON.parse(req.body.data);
+        billsLibDao.updateBillsArr(data, function(err, message){
+           callback(req, res, err, message, null);
+        });
+    },
+    pasteBills: function(req, res){
+        var data = JSON.parse(req.body.data);
+        billsLibDao.pasteBills(data, function(err, message){
+            callback(req, res, err, message, null);
+        });
+    },
+    updateRecharge: function(req, res){
+      var data = JSON.parse(req.body.data);
+        billsLibDao.updateRecharge(data, function(err, message){
+            callback(req, res, err, message, null);
+        });
+    },
     deleteBills: function(req, res){
         var data = JSON.parse(req.body.data);
         billsLibDao.deleteBills(data, function(err, message){
@@ -84,40 +113,40 @@ module.exports = {
             callback(req, res, err, message, jobs);
         });
     },
-    getSomeJobs: function(req, res){
+    createJobContent: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsLibDao.getSomeJobs(data, function(err, message, jobs){
-           callback(req, res, err, message, jobs);
+        billsLibDao.createJobContent(data, function(err, message, id){
+            callback(req, res, err, message, id);
         });
     },
-    createJobContent: function(req, res){
+    updateJobContent: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsLibDao.createJobContent(data, function(err, message){
-            callback(req, res, err, message, null);
+        billsLibDao.updateJobContent(data, function(err, message, id){
+            callback(req, res, err, message, id);
         });
     },
-    updateJobContent: function(req, res){
+    updateValue: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsLibDao.updateJobContent(data, function(err, message){
+        billsLibDao.updateValue(data, function(err, message){
             callback(req, res, err, message, null);
-        });
+        })
     },
     deleteJobContent: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsLibDao.deleteJobContent(data.jobId, function(err, message){
+        billsLibDao.deleteJobContent(data, function(err, message){
             callback(req, res, err, message, null);
         });
     },
     getItemCharacter: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsLibDao.getItemCharacter(data.billsLibId, function(err, message, items){
+        billsLibDao.getItemCharacter(data, function(err, message, items){
             callback(req, res, err, message, items);
         });
     },
     createItemCharacter: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsLibDao.createItemCharacter(data, function(err, message){
-            callback(req, res, err, message, null);
+        billsLibDao.createItemCharacter(data, function(err, message, id){
+            callback(req, res, err, message, id);
         });
     },
     updateItemCharacter: function(req, res){
@@ -128,7 +157,7 @@ module.exports = {
     },
     deleteItemCharacter: function(req, res){
         var data = JSON.parse(req.body.data);
-        billsLibDao.deleteItemCharacter(data.itemId, function(err, message){
+        billsLibDao.deleteItemCharacter(data, function(err, message){
             callback(req, res, err, message, null);
         });
     }

+ 382 - 155
modules/billsLib/billsLibModel/billsLibInterfaces.js

@@ -11,9 +11,47 @@ var ItemCharacter = model.itemCharacterMod;
 var fieldArr = ["code", "name", "unit", "ruleText", "Expression"];
 
 var billsLibDao = function(){};
+
+billsLibDao.prototype.getMaxNumber = function(gData, callback){
+    var billsLibId = gData.billsLibId;
+    var field = gData.field;
+    if(field === 'jobs'){
+        JobContent.find({billsLibId: billsLibId, deleted: false}).sort({code: -1}).limit(1).exec(function(err, result){
+            if(err){
+                callback(1, 'Error', null);
+            }
+            else {
+                callback(0, '', result);
+            }
+        });
+    }
+    else if(field === 'items'){
+        ItemCharacter.find({billsLibId: billsLibId, deleted: false}).sort({code: -1}).limit(1).exec(function(err, result){
+            if(err){
+                callback(1, 'Error', null);
+            }
+            else {
+                callback(0, '', result);
+            }
+        });
+    }
+};
 //----------StdBillsLib-------------------
-billsLibDao.prototype.getStdBillsLib = function(userId, callback){
-    StdBillsLib.find({}, "-_id", function(err, data){
+billsLibDao.prototype.getABillsLib = function(data, callback){
+    var billsLibId = data.billsLibId;
+    StdBillsLib.find({billsLibId: billsLibId, deleted: false}, function(err, data){
+        if(err){
+            callback(1, 'Error', null);
+        }
+        else {
+            callback(0, '', data);
+        }
+    });
+};
+
+billsLibDao.prototype.getStdBillsLib = function(data, callback){
+    var userId = data.userId;
+    StdBillsLib.find({userId: userId, deleted: false}, "-_id", function(err, data){
         if(err){
             callback(1, "Error", null);
         }
@@ -21,18 +59,21 @@ billsLibDao.prototype.getStdBillsLib = function(userId, callback){
             callback(0, "", data);
         }
     })
-}
+};
 
 billsLibDao.prototype.createStdBillsLib = function(clibData, callback){
-    counter.getIDAfterCount("bills", 1, function(err, result){
+    counter.counterDAO.getIDAfterCount(counter.moduleName.billsLib, 1, function(err, result){
         var billsLibId = result.value.sequence_value;
+        var userId = clibData.userId;
         var billsLibName = clibData.name;
         var createDate = Date.now();
         var newStdBillsLib = {
+            userId: userId,
             billsLibId: billsLibId,
             billsLibName: billsLibName,
-            createDate: createDate
-        }
+            createDate: createDate,
+            deleted: false
+        };
         StdBillsLib.create(newStdBillsLib, function(err){
             if(err){
                 callback(1, "Error", null);
@@ -49,18 +90,18 @@ billsLibDao.prototype.createStdBillsLib = function(clibData, callback){
             }
         });
     });
-}
+};
 
 billsLibDao.prototype.deleteStdBillsLib = function(billsLibId, callback){
-    StdBillsLib.remove({billsLibId: billsLibId}, function(err){
+    StdBillsLib.update({billsLibId: billsLibId}, {$set: {deleted: true}}, function(err){
         if(err){
-            callback(1, "Error");
+            callback(1, 'Error');
         }
         else{
-            callback(0, "");
+            callback(0, '');
         }
     });
-}
+};
 
 billsLibDao.prototype.renameStdBillsLib = function(renameData, callback){
     var billsLibId = renameData.id;
@@ -73,10 +114,10 @@ billsLibDao.prototype.renameStdBillsLib = function(renameData, callback){
             callback(0, "");
         }
     });
-}
+};
 
 billsLibDao.prototype.getStdBillsLibName = function(billsLibId, callback){
-    StdBillsLib.find({billsLibId: billsLibId}, "-_id", function(err,  data){
+    StdBillsLib.find({billsLibId: billsLibId, deleted: false}, "-_id", function(err,  data){
         if(err){
             callback(1, "Error", null);
         }
@@ -87,7 +128,7 @@ billsLibDao.prototype.getStdBillsLibName = function(billsLibId, callback){
 }
 //----------------------------Bills---------------------
 billsLibDao.prototype.getBills = function (billsLibId, callback) {
-    Bills.find({billsLibId: billsLibId}, "-_id",  function(err, billsData){
+    Bills.find({billsLibId: billsLibId, deleted: false}, "-_id",  function(err, billsData){
         if(err){
             callback(1, "Error", null);
         }
@@ -98,66 +139,98 @@ billsLibDao.prototype.getBills = function (billsLibId, callback) {
 }
 
 billsLibDao.prototype.createBills = function(cbillsData, callback){
-        var newId = cbillsData.newId;
-        var pid = cbillsData.ParentID;
-        var nid = cbillsData.NextSiblingID;
-        var billsLibId = cbillsData.billsLibId;
-        var newBills = {
-            ID: newId,
-            ParentID: pid,
-            NextSiblingID: nid,
-            billsLibId: billsLibId,
-            code: '',
-            name: '',
-            unit: '',
-            ruleText: '',
-            Expression: '',
-            recharge:'',
-        };
-        Bills.create(newBills, function(err){
-            if(err){
-                callback(1, "Error");
-            }
-            else{
-                callback(0, "");
-            }
-        });
-}
+    var newId = cbillsData.newId;
+    var pid = cbillsData.ParentID;
+    var nid = cbillsData.NextSiblingID;
+    var billsLibId = cbillsData.billsLibId;
+    var newBills = {
+        ID: newId,
+        ParentID: pid,
+        NextSiblingID: nid,
+        billsLibId: billsLibId,
+        code: '',
+        name: '',
+        unit: '',
+        ruleText: '',
+        Expression: '',
+        recharge:'',
+        deleted: false
+    };
+    Bills.create(newBills, function(err){
+        if(err){
+            callback(1, "Error");
+        }
+        else{
+            callback(0, "");
+        }
+    });
+};
 
-billsLibDao.prototype.updatePNId= function(updateData, callback){
-    var billsLibId = updateData.billsLibId;
-    var updateId = updateData.updateId;
-    var updatepid= updateData.ParentID;
-    var updatenid = updateData.NextSiblingID;
-    if(!updatepid){
-        Bills.update({billsLibId: billsLibId, ID: updateId}, {$set: {NextSiblingID: updatenid}}, function(err){
-            if(err){
-                callback(1, "Error")
-            }
-            else{
-                callback(0, "");
-            }
-        });
-    }
-    else if(!updatenid){
-        Bills.update({billsLibId: billsLibId, ID: updateId}, {$set: {ParentID: updatepid}}, function(err){
-            if(err){
-                callback(1, "Error")
+
+billsLibDao.prototype.updatePNId= function(upData, callback){
+    var billsLibId = upData.billsLibId;
+    var updateDatas = upData.updateData;
+    var success = true;
+    if(updateDatas.length > 0){
+        updateDatas.forEach(function(data){
+            if(data.ID.length >1){
+                data.ID.forEach(function(id){
+                    if(data.ParentID && data.NextSiblingID){
+                        Bills.update({billsLibId: billsLibId, ID: id}, {$set: {ParentID: data.ParentID, NextSiblingID: data.NextSiblingID}}, function(err){
+                            if(err){
+                                callback(1, "Error")
+                                success = false;
+                            }
+                        });
+                    }
+                    else if(data.ParentID && !data.NextSiblingID){
+                        Bills.update({billsLibId: billsLibId, ID: id}, {$set: {ParentID: data.ParentID}}, function(err){
+                            if(err){
+                                callback(1, 'Error');
+                                success = false;
+                            }
+                        });
+                    }
+                    else if(!data.ParentID && data.NextSiblingID){
+                        Bills.update({billsLibId: billsLibId, ID: id}, {$set: {NextSiblingID: data.NextSiblingID}}, function(err){
+                            if(err){
+                                callback(1, 'Error');
+                                success = false;
+                            }
+                        });
+                    }
+                });
             }
-            else{
-                callback(0, "");
+            else {
+                if(data.ParentID && data.NextSiblingID){
+                    Bills.update({billsLibId: billsLibId, ID: data.ID}, {$set: {ParentID: data.ParentID, NextSiblingID: data.NextSiblingID}}, function(err){
+                        if(err){
+                            callback(1, "Error")
+                            success = false;
+                        }
+                    });
+                }
+                else if(data.ParentID && !data.NextSiblingID){
+                    Bills.update({billsLibId: billsLibId, ID: data.ID}, {$set: {ParentID: data.ParentID}}, function(err){
+                        if(err){
+                            callback(1, 'Error');
+                            success = false;
+                        }
+                    });
+                }
+                else if(!data.ParentID && data.NextSiblingID){
+                    Bills.update({billsLibId: billsLibId, ID: data.ID}, {$set: {NextSiblingID: data.NextSiblingID}}, function(err){
+                        if(err){
+                            callback(1, 'Error');
+                            success = false;
+                        }
+                    });
+                }
             }
         });
     }
-    else {
-        Bills.update({billsLibId: billsLibId, ID: updateId}, {$set: {ParentID: updatepid, NextSiblingID: updatenid}}, function(err){
-            if(err){
-                callback(1, "Error")
-            }
-            else{
-                callback(0, "");
-            }
-        });
+    if(success){
+        callback(0, '');
     }
 }
 
@@ -228,45 +301,139 @@ billsLibDao.prototype.updateBills = function(ubillsData, callback){
     }
 }
 
+billsLibDao.prototype.updateBillsArr = function(updateData, callback){
+    var billsLibId = updateData.billsLibId;
+    var updateId = updateData.updateId;
+    var orgId = updateData.orgId;
+    var newId = updateData.newId;
+    var classify = updateData.classify;
+    var type = updateData.type;
+    var success = true;
+    if(classify === 'jobs'){
+        if(orgId && newId && type === 'update'){
+            Bills.update({billsLibId: billsLibId, ID: updateId, jobs: orgId}, {$set: {'jobs.$': newId}}, function(err){
+                if(err){
+                    callback(1, 'Error');
+                }
+                else {
+                    callback(0, '');
+                }
+            });
+        }
+        if(orgId && !newId && type === 'delete'){
+            orgId.forEach(function(oid){
+                Bills.update({billsLibId: billsLibId, ID: updateId}, {$pull: {jobs: oid}}, function(err){
+                    if(err){
+                        callback(1, 'Error');
+                    }
+                });
+            });
+        }
+        //todo: test
+        if(orgId && !newId && type === 'deleteAll'){
+            updateId.forEach(function(uid){
+                orgId.forEach(function(oid){
+                    Bills.update({billsLibId: billsLibId, ID: uid}, {$pull: {jobs: oid}}, function(err){
+                        if(err){
+                            callback(1, 'Error');
+                        }
+                    });
+                });
+            });
+        }
+    }
+    else if(classify === 'items'){
+        if(orgId && newId && type === 'update'){
+            Bills.update({billsLibId: billsLibId, ID: updateId, items: orgId}, {$set: {'items.$': newId}}, function(err){
+                if(err){
+                    callback(1, 'Error');
+                }
+                else {
+                    callback(0, '');
+                }
+            });
+        }
+        if(orgId && !newId && type === 'delete'){
+            orgId.forEach(function(oid){
+                Bills.update({billsLibId: billsLibId, ID: updateId}, {$pull: {items: oid}}, function(err){
+                    if(err){
+                        callback(1, 'Error');
+                    }
+                });
+            });
+        }
+        if(orgId && !newId &&  type === 'deleteAll'){
+            updateId.forEach(function(uid){
+                orgId.forEach(function(oid){
+                    Bills.update({billsLibId: billsLibId, ID: uid}, {$pull: {items: oid}}, function(err){
+                        if(err){
+                            callback(1, 'Error');
+                        }
+                    });
+                });
+            });
+        }
+    }
+};
+
+billsLibDao.prototype.pasteBills = function(pData, callback){
+    var datas = pData.datas;
+    datas.forEach(function(data){
+        Bills.update({billsLibId: data.billsLibId, ID: data.ID}, {$set: {code: data.code, name: data.name, unit: data.unit, ruleText: data.ruleText}}, function(err){
+            if(err){
+                callback(1, 'Error');
+            }
+        });
+    });
+}
+
+billsLibDao.prototype.updateRecharge = function(uData, callback){
+    var billsLibId = uData.billsLibId;
+    var updateIds = uData.updateIds;
+    var data = uData.data;
+    var success = true;
+    updateIds.forEach(function(id){
+        Bills.update({billsLibId: billsLibId, ID: id}, {$set: {recharge: data}}, function(err){
+            if(err){
+                callback(1, 'Error');
+                success = false;
+            }
+        });
+    });
+    if(success){
+        callback(0, '');
+    }
+};
+
 billsLibDao.prototype.deleteBills = function(delData, callback){
     var deleteIds = delData.deleteIds;
     var billsLibId = delData.billsLibId;
+    var success = true;
     if(deleteIds){
-        //deleteIds.forEach(function(deleteId){
-           Bills.remove({billsLibId: billsLibId, ID: {$in: deleteIds}}, function(err){
-               if(err){
-                   callback(1, 'Error');
-               }
-               else {
-                   callback(0, '');
-               }
-           });
-      //  });
+        deleteIds.forEach(function(delId){
+            Bills.update({billsLibId: billsLibId, ID: delId}, {$set: {deleted: true}}, function(err){
+                if(err){
+                    success = false;
+                    callback(1, 'Error');
+                }
+            });
+        });
+        if(success){
+            callback(0, '');
+        }
     }
 }
 
 //--------------JobContent------------------
-billsLibDao.prototype.getJobContent = function(gJobData, callback){
-    var billsLibId = gJobData.billsLibId;
-        JobContent.find({billsLibId: billsLibId}, "-_id", function(err, jobs){
-            if(err){
-                callback(1, "Error", null);
-            }
-            else{
-                callback(0, "", jobs)
-            }
-        });
-}
 
-billsLibDao.prototype.getSomeJobs = function(gJobData, callback){
+billsLibDao.prototype.getJobContent = function(gJobData, callback){
     var billsLibId = gJobData.billsLibId;
-    var ids = gJobData.ids;
-    JobContent.find({billsLibId: billsLibId, id: {$in: ids}}, "-_id", function(err, jobs){
+    JobContent.find({billsLibId: billsLibId, deleted: false}, '-_id').sort({code: 1}).exec(function(err, result){
         if(err){
-            callback(1, "Error", null);
+            callback(1, 'Error', null);
         }
-        else{
-            callback(0, "", jobs)
+        else {
+            callback(0, '', result);
         }
     });
 }
@@ -275,40 +442,32 @@ billsLibDao.prototype.createJobContent = function(cJobData, callback){
     var field = cJobData.field;
     var data = cJobData.data;
     var billsLibId = cJobData.billsLibId;
-    counter.getIDAfterCount("bills", 1, function(err, result){
+    var serialNo = cJobData.serialNo;
+    counter.counterDAO.getIDAfterCount(counter.moduleName.billsLib, 1, function(err, result){
         var id = result.value.sequence_value;
         var newJobContent;
-        if(field == "code"){
             newJobContent = {
                 id: id,
                 billsLibId: billsLibId,
-                code: data,
-                content: ''
-            }
-        }
-        else if(field == "content"){
-            newJobContent = {
-                id: id,
-                billsLibId: billsLibId,
-                code: '',
+                code: serialNo,
                 content: data,
+                deleted: false
             }
-        }
         JobContent.create(newJobContent, function(err){
             if(err){
-                callback(1, "Error");
+                callback(1, "Error", null);
             }
             else{
-                callback(0, "");
+                callback(0, "", id);
             }
         });
     });
 }
 
 billsLibDao.prototype.updateJobContent = function(uJobData, callback){
-    var field = cJobData.field;
-    var updateData = cJobData.data;
-    var updateid = cJobData.updateId;
+    var field = uJobData.field;
+    var updateData = uJobData.data;
+    var updateid = uJobData.updateId;
     if(field == "code"){
         JobContent.update({id: updateid}, {$set: {code: updateData}}, function(err){
             if(err){
@@ -331,26 +490,34 @@ billsLibDao.prototype.updateJobContent = function(uJobData, callback){
     }
 }
 
-billsLibDao.prototype.deleteJobContent = function(jobId, callback){
-    JobContent.remove({id: jobId}, function(err){
-        if(err){
-            callback(1, "Error");
-        }
-        else{
-            callback(0, "");
-        }
+billsLibDao.prototype.deleteJobContent = function(data, callback){
+    var delIds = data.ids;
+    var success = true;
+    delIds.forEach(function(id){
+        /*JobContent.remove({id: id}, function(err){
+            if(err){
+                callback(1, "Error");
+            }
+        });*/
+        JobContent.update({id: id}, {$set: {deleted: true}}, function(err){
+            if(err){
+                success = false;
+                callback(1, 'Error');
+            }
+        });
     });
 }
 
 
 //----------------------ItemCharacter---------------------
-billsLibDao.prototype.getItemCharacter = function(billsLibId, callback){
-    ItemCharacter.find({billsLibId: billsLibId}, "-_id", function(err, items){
+billsLibDao.prototype.getItemCharacter = function(gdata, callback){
+    var billsLibId = gdata.billsLibId;
+    ItemCharacter.find({billsLibId: billsLibId, deleted: false}, '-_id').sort({code: 1}).exec(function(err, result){
         if(err){
-            callback(1, "Error", null);
+            callback(1, 'Error', null);
         }
-        else{
-            callback(0, "", items)
+        else {
+            callback(0, '', result);
         }
     });
 }
@@ -358,30 +525,34 @@ billsLibDao.prototype.getItemCharacter = function(billsLibId, callback){
 billsLibDao.prototype.createItemCharacter = function(cItemData, callback){
     var field = cItemData.field;
     var data = cItemData.data;
-    var id = counter.getIDAfterCount("billsLib", 1);
     var billsLibId = cItemData.billsLibId;
+    var serialNo = cItemData.serialNo;
     var newItemCharacter;
-    if(field == "code"){
-        newItemCharacter = {
-            id: id,
-            billsLibId: billsLibId,
-            code: data
-        }
-    }
-    else if(field == "content"){
-        newItemCharacter = {
-            id: id,
-            billsLibId: billsLibId,
-            content: data
-        }
-    }
+    counter.counterDAO.getIDAfterCount(counter.moduleName.billsLib, 1, function(err, result){
+        var id = result.value.sequence_value;
+            newItemCharacter = {
+                id: id,
+                billsLibId: billsLibId,
+                content: data,
+                code: serialNo,
+                deleted: false
+            }
+        ItemCharacter.create(newItemCharacter, function(err){
+            if(err){
+                callback(1, "Error", null);
+            }
+            else{
+                callback(0, "", id);
+            }
+        });
+    });
 }
 
 billsLibDao.prototype.updateItemCharacter = function(uItemData, callback){
     var field = uItemData.field;
     var updateData = uItemData.data;
-    var id = uItemData.id;
-    if(field == "code"){
+    var id = uItemData.updateId;
+    if(field === "code"){
         ItemCharacter.update({id: id}, {$set: {code: updateData}}, function(err){
             if(err){
                 callback(1, "Error");
@@ -391,8 +562,8 @@ billsLibDao.prototype.updateItemCharacter = function(uItemData, callback){
             }
         });
     }
-    else if(field == "character"){
-        ItemCharacter.update({id: id}, {$set: {character: updateData}}, function(err){
+    else if(field === "content"){
+        ItemCharacter.update({id: id}, {$set: {content: updateData}}, function(err){
             if(err){
                 callback(1, "Error");
             }
@@ -401,21 +572,77 @@ billsLibDao.prototype.updateItemCharacter = function(uItemData, callback){
             }
         });
     }
-}
+};
 
-billsLibDao.prototype.deleteItemCharacter = function(itemId, callback){
-    JobContent.remove({id: itemId}, function(err){
-        if(err){
-            callback(1, "Error");
+billsLibDao.prototype.updateValue = function(uData, callback){
+    var type = uData.type;
+    var updateId = uData.updateId;
+    var data = uData.data;
+    var deleteCodes = uData.deleteCodes;
+    if(type === 'create'){
+        ItemCharacter.update({id: updateId}, {$addToSet: {itemValue: data}}, function(err){
+            if(err){
+                callback(1, 'Error');
+            }
+            else{
+                callback(0, '');
+            }
+        });
+    }
+    else if(type === 'update'){
+        if(data.field === 'code'){
+            ItemCharacter.update({id: updateId,  'itemValue.code': data.code}, {$set: {'itemValue.$.code': data.newData}}, function(err){
+                if(err){
+                    callback(1, 'Error');
+                }
+                else{
+                    callback(0, '');
+                }
+            });
         }
-        else{
-            callback(0, "");
+        else {
+            ItemCharacter.update({id: updateId,  'itemValue.code': data.code}, {$set: {'itemValue.$.value': data.newData}}, function(err){
+                if(err){
+                    callback(1, 'Error');
+                }
+                else{
+                    callback(0, '');
+                }
+            });
         }
+    }
+    //delete
+    else {
+        if(deleteCodes.length > 0){
+            deleteCodes.forEach(function(code){
+                ItemCharacter.update({id: updateId}, {$pull: {itemValue: {code: code}}}, function(err){
+                    if(err){
+                        callback(1, 'Error');
+                    }
+                });
+            });
+        }
+    }
+};
+
+billsLibDao.prototype.deleteItemCharacter = function(data, callback){
+    var delIds = data.ids;
+    var success = true;
+    delIds.forEach(function(id){
+        /*ItemCharacter.remove({id: id}, function(err){
+            if(err){
+                callback(1, "Error");
+            }
+        });*/
+        ItemCharacter.update({id: id}, {$set: {deleted: true}}, function(err){
+            if(err){
+                success = false;
+                callback(1, 'Error');
+            }
+        });
     });
 }
+//
 
-//----------------------itemValue
-
-//-----------------------------
 
 module.exports = new billsLibDao();

+ 12 - 12
modules/billsLib/billsLibModel/billsLibSchemas.js

@@ -1,9 +1,11 @@
 var mongoose = require('mongoose');
 
 var stdBillsLibSchema =mongoose.Schema({
+    userId: Number,
     billsLibId: Number,
     billsLibName: String,
-    createDate: Date
+    createDate: Date,
+    deleted: Boolean
 },
     {versionKey: false}
 );
@@ -20,34 +22,32 @@ var billsSchema = mongoose.Schema({
     jobs: Array,
     items: Array,
     recharge:String,
-    billsLibId: Number
+    billsLibId: Number,
+    deleted: Boolean
 },
     {versionKey: false}
 );
 
 var jobContentSchema = mongoose.Schema({
     id: Number,
-    code: String,
+    code: Number,
     content: String,
-    billsLibId: Number
+    billsLibId: Number,
+    deleted: Boolean
 },
     {versionKey: false}
 );
 
 var itemCharacterSchema = mongoose.Schema({
     id: Number,
-    code: String,
-    character: String,
+    code: Number,
+    content: String,
     itemValue: Array,
-    billsLibId: Number
+    billsLibId: Number,
+    deleted: Boolean
 },
     {versionKey: false}
 );
-/*
-var eigenvalueSchema = mongoose.Schema({
-    eigenvalId: Number,
-    eigenvalContent: String
-});*/
 
 module.exports = {
     stdBillsLibSchema: stdBillsLibSchema,

+ 6 - 24
modules/billsLib/billsLibRoutes/billsLibRoutes.js

@@ -5,29 +5,8 @@ var express = require("express");
 var billsController = require("../billsLibControllers/billsLibControllers");
 var billsRouter =express.Router();
 
-
-
-/*billsRouter.get("/", function(req, res) {
-    console.log("get/ing");
-    res.redirect("/stdBillsEditor/main");
-});*/
-
-/*billsRouter.get("/main", function(req, res){
-    res.render("billsLib/html/main.html");
-});
-
-billsRouter.get("/billsLib", function(req, res){
-    res.render("billsLib/html/qingdan.html");
-});
-
-billsRouter.get("/jobs", function(req, res){
-    res.render("billsLib/html/neirong.html");
-});
-
-billsRouter.get("/items", function(req, res){
-    res.render("billsLib/html/tezheng.html");
-});*/
-
+billsRouter.post('/getMaxNumber', billsController.getMaxNumber);
+billsRouter.post('/getABillsLib', billsController.getABillsLib);
 billsRouter.post("/getStdBillsLib", billsController.getStdBillsLib);
 billsRouter.post("/createStdBillsLib", billsController.createStdBillsLib);
 billsRouter.post("/deleteStdBillsLib", billsController.deleteStdBillsLib);
@@ -37,15 +16,18 @@ billsRouter.post("/getBills", billsController.getBills);
 billsRouter.post("/createBills", billsController.createBills);
 billsRouter.post("/updatePNId", billsController.updatePNId);
 billsRouter.post("/updateBills", billsController.updateBills);
+billsRouter.post("/updateBillsArr", billsController.updateBillsArr);
+billsRouter.post("/pasteBills", billsController.pasteBills);
+billsRouter.post('/updateRecharge', billsController.updateRecharge);
 billsRouter.post("/deleteBills", billsController.deleteBills);
 billsRouter.post("/getJobContent", billsController.getJobContent);
-billsRouter.post('/getSomeJobs', billsController.getSomeJobs);
 billsRouter.post("/createJobContent", billsController.createJobContent);
 billsRouter.post("/updateJobContent", billsController.updateJobContent);
 billsRouter.post("/deleteJobContent", billsController.deleteJobContent);
 billsRouter.post("/getItemCharacter", billsController.getItemCharacter);
 billsRouter.post("/createItemCharacter", billsController.createItemCharacter);
 billsRouter.post("/updateItemCharacter", billsController.updateItemCharacter);
+billsRouter.post("/updateValue", billsController.updateValue);
 billsRouter.post("/deleteItemCharacter", billsController.deleteItemCharacter);
 
 module.exports = billsRouter;

+ 5 - 28
modules/rationRepository/controllers/rationChapterTreeController.js

@@ -12,6 +12,7 @@ var callback = function(req,res,err,data){
     if(err){
         res.status(500)
         res.json({success:false,error:err});
+        //res.json(err);
     }
     else{
         res.status(204);
@@ -22,14 +23,15 @@ module.exports ={
     getRationChapterTree:
         function(req,res){
             var libName = req.body.rationLibName;
-            rationChapterTreeData.getRationChapterTrees(libName,function(err,data){
+            rationChapterTreeData.getRationChapterTree(libName,function(err,data){
                 callback(req,res,err,data)
             })
         },
     createNewNode: function(req, res){
         var libName = req.body.rationLibName;
+        var lastNodeId = req.body.lastNodeId;
         var nodeData = JSON.parse(req.body.rawNodeData);
-        rationChapterTreeData.createNewNode(libName, nodeData, function(err,data){
+        rationChapterTreeData.createNewNode(libName, lastNodeId, nodeData, function(err,data){
             callback(req,res,err,data)
         });
     },
@@ -46,30 +48,5 @@ module.exports ={
         rationChapterTreeData.removeNodes(nodes, preNodeId, preNodeNextId, function(err,results){
             callback(req,res, err, results)
         });
-    },
-    tempRationChapterTreeInsert:
-        function(req,res){
-            var DBName = req.body.rationName;
-            var rationTempTree = JSON.parse(req.body.rationTempTree);
-            rationChapterTreeData.tempRationChapterTreeInsert(DBName,rationTempTree,function(err,data){
-                callback(req,res,err,data)
-            })
-        },
-    sectionUpsert:
-        function(req,res){
-            var LibName = req.body.rationLibName;
-            var section = JSON.parse(req.body.rationSection);
-            rationChapterTreeData.sectionUpsert(LibName,section,function(err,data){
-                callback(req,res,err,data)
-            })
-        },
-    deleteSection:
-        function(req,res){
-            var LibName = req.body.rationLibName;
-            var sectionID = req.body.sectionID;
-            rationChapterTreeData.deleteSection(LibName,sectionID,function(err,data){
-                callback(req,res,err,data)
-            })
-        }
-
+    }
 }

+ 33 - 0
modules/rationRepository/controllers/rationController.js

@@ -0,0 +1,33 @@
+/**
+ * Created by Tony on 2017/5/2.
+ */
+
+var rationItem = require('../models/rationItem');
+var callback = function(req, res, err, message, data){
+    res.json({error: err, message: message, data: data});
+};
+
+module.exports = {
+    getRationItemsBySection: function(req, res){
+        var sectionId = req.body.sectionID;
+        rationItem.getRationItemsBySection(sectionId, function(err, message, rst){
+            if (err) {
+                callback(req, res, err, message, null);
+            } else {
+                callback(req, res, err, message, rst);
+            }
+        });
+    },
+    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){
+            if (err) {
+                callback(req, res, err, message, null);
+            } else {
+                callback(req, res, err, message, rst);
+            }
+        });
+    }
+}

+ 44 - 0
modules/rationRepository/models/coeList.js

@@ -0,0 +1,44 @@
+/**
+ * Created by CSL on 2017/5/3.
+ * 系数表。
+ */
+
+var mongoose = require("mongoose");
+var dbm = require("../../../config/db/db_manager");
+var db = dbm.getCfgConnection("rationRepository")
+
+var gljCoeSchema = mongoose.Schema({
+    coeType: String,                // 系数的作用范围:
+                                    // 0 针对本定额所有工料机。如:定额×0.925
+                                    // 1 人工类。 2 材料类。 3 机械类。
+                                    // 9 针对单个工料机。如:111量0.001
+    gljID: Number,                  // 要调整的工料机ID(当coeType=9时有效)
+    operator: String,               // 运算符(*、+、-、=)
+    amount: String                  // 调整的量
+});
+
+var coeListSchema = mongoose.Schema({
+    libID: Number,                      // 所属定额定ID
+    ID: Number,                         // 系数ID(流水号ID)
+    name: String,                       // 名称
+    content: String,                    // 说明
+    gljCoe: [gljCoeSchema]
+});
+
+var coeListModel = db.model("coeLists",coeListSchema, "coeLists")
+
+var coeListDAO = function(){};
+
+coeListDAO.prototype.getCoe = function (data, callback) {
+    coeListModel.findOne({
+            "libID": data.libID,
+            "ID": data.ID,
+            "$or": [{"isDeleted": null}, {"isDeleted": false}]
+        },
+        function (err, doc) {
+            if (err) callback(true, "获取系数明细错误!", "")
+            else callback(false, "获取系数明细成功", doc);
+        })
+};
+
+module.exports = new coeListDAO();

+ 58 - 0
modules/rationRepository/models/gljRepository.js

@@ -0,0 +1,58 @@
+/**
+ * Created by Tony on 2017/5/4.
+ * 工料机的总库,根据不同定额库分类,参考原gljList表
+ */
+
+var mongoose = require("mongoose");
+var dbm = require("../../../config/db/db_manager");
+var db = dbm.getCfgConnection("rationRepository")
+var async = require("async");
+var Schema = mongoose.Schema;
+
+var gljTypeSchema = mongoose.Schema({
+    repositoryId: Number,
+    ID: Number,
+    ParentID: Number,
+    NextSiblingID: Number,
+    Name: String
+});
+
+var gljSchema = mongoose.Schema({
+    repositoryId: Number,
+    ID:Number,
+    //以下是基于已有access库
+    code: String,
+    name: String,
+    specs: String,
+    unit: String,
+    basePrice: Number,
+    gljType: Number
+});
+var gljTypeModel = db.model("gljType",gljTypeSchema, "gljType");
+var gljItemModel = db.model("gljRepository",gljSchema, "gljRepository");
+var counter = require('../../../public/counter/counter');
+
+var gljItemDAO = function(){};
+gljItemDAO.prototype.getGljTypes = function(repositoryId, callback){
+    gljTypeModel.find({"repositoryId": repositoryId},function(err,data){
+        if(err) callback(true, "获取工料机类型错误!", "")
+        else callback(false,"获取工料机类型", data);
+    })
+};
+
+gljItemDAO.prototype.getGljItemsByRep = function(repositoryId,callback){
+    gljItemModel.find({"repositoryId": repositoryId},function(err,data){
+        if(err) callback(true, "获取工料机错误!", "")
+        else callback(false,"获取工料机", data);
+    })
+};
+
+gljItemDAO.prototype.getGljItem = function(repositoryId, code, callback){
+    gljItemModel.find({"repositoryId": repositoryId, "code": code},function(err,data){
+        if(err) callback(true, "获取工料机错误!", "")
+        else callback(false,"获取工料机", data);
+    })
+};
+
+module.exports = new gljItemDAO();
+

+ 20 - 47
modules/rationRepository/models/rationChapterTree.js

@@ -22,17 +22,21 @@ var counter = require('../../../public/counter/counter');
 
 var rationChapterTreeDAO = function(){};
 
-rationChapterTreeDAO.prototype.getRationChapterTrees = function(repositoryName,callback){
+rationChapterTreeDAO.prototype.getRationChapterTree = function(repositoryName,callback){
     repositoryMap.getRealLibName(repositoryName, function(err, rst){
-        rationChapterTreeModel.find({"rationRepId": rst[0].ID, "$or": [{"isDeleted": null}, {"isDeleted": false} ]},function(err,data){
-            if(data.length) callback(false,data);
-            else  if(err) callback("获取定额树错误!",false)
-            else callback(false,false);
-        })
+        if (err || rst.length == 0) {
+            callback("获取定额库错误!",false)
+        } else {
+            rationChapterTreeModel.find({"rationRepId": rst[0].ID, "$or": [{"isDeleted": null}, {"isDeleted": false} ]},function(err,data){
+                if(data.length) callback(false,data);
+                else  if(err) callback("获取定额树错误!",false)
+                else callback(false,false);
+            })
+        }
     })
 }
 
-rationChapterTreeDAO.prototype.createNewNode = function(repositoryName,nodeData,callback){
+rationChapterTreeDAO.prototype.createNewNode = function(repositoryName, lastNodeId, nodeData,callback){
     var promise = repositoryMap.getRealLibName(repositoryName), libId;
     if (promise) {
         promise.then(function(rst){
@@ -45,7 +49,15 @@ rationChapterTreeDAO.prototype.createNewNode = function(repositoryName,nodeData,
                     if (err) {
                         callback("章节树ID错误!", false);
                     } else {
-                        callback(false, result);
+                        if (lastNodeId > 0) {
+                            rationChapterTreeModel.update({ID: lastNodeId}, {"NextSiblingID": nodeData.ID}, function(err, rst){
+                                if (err) {
+                                    callback("章节树ID错误!", false);
+                                } else {
+                                    callback(false, result);
+                                }
+                            });
+                        } else callback(false, result);
                     }
                 });
             });
@@ -55,15 +67,6 @@ rationChapterTreeDAO.prototype.createNewNode = function(repositoryName,nodeData,
     }
 },
 
-rationChapterTreeDAO.prototype.tempRationChapterTreeInsert = function(repositoryName,rationTempTree,callback){
-    var db = dbm.getCfgConnection(repositoryName)
-    var rationChapterTreeModel = db.model("rationChapterTrees",rationChapterTreeSchema, "rationChapterTrees")
-    rationChapterTreeModel.collection.insert(rationTempTree,function(err,data){
-        if(err) callback("插入定额模板错误",false)
-        else callback(false,"ok")
-    })
-}
-
 rationChapterTreeDAO.prototype.removeNodes = function(nodeIds, preNodeId, preNodeNextId, callback){
     var functions = [];
     if (preNodeId != -1) {
@@ -101,34 +104,4 @@ rationChapterTreeDAO.prototype.updateNodes = function(nodes,callback){
     });
 };
 
-rationChapterTreeDAO.prototype.sectionUpsert = function(repositoryName,section,callback){
-    var db = dbm.getCfgConnection(repositoryName);
-    var rationChapterTreeModel = db.model("rationChapterTrees",rationChapterTreeSchema, "rationChapterTrees");
-    rationChapterTreeModel.find({"sectionId": section.sectionId},function(err,data){
-        if(data.length){
-            rationChapterTreeModel.update({'sectionId':section.sectionId},section,function(err,data){
-                if(err){
-                    callback(" ",false);
-                }else
-                    callback(false,"ok");
-            });
-        }else{
-            var N = new rationChapterTreeModel(section).save(function(err){
-                if(err){
-                    callback(" ",false);
-                }else
-                    callback(false,"success!");
-            })
-        }
-    })
-}
-//待  ration模块完成
-rationChapterTreeDAO.prototype.deleteSection= function(repositoryName,sectionId,callback){
-    var db = dbm.getCfgConnection(repositoryName);
-    var rationChapterTreeModel = db.model("rationItems",rationChapterTreeSchema);
-    rationChapterTreeModel.find({"sectionId": sectionId},[],function(err,data){
-
-    })
-}
-
 module.exports = new rationChapterTreeDAO()

+ 34 - 0
modules/rationRepository/models/rationCoe.js

@@ -0,0 +1,34 @@
+/**
+ * Created by CSL on 2017/5/3.
+ * 定额系数关系表。(即附注条件。系数会被定额公用,如同一个分枝下的兄弟定额。)
+ */
+var mongoose = require("mongoose");
+var dbm = require("../../../config/db/db_manager");
+var db = dbm.getCfgConnection("rationRepository")
+
+var rationCoeSchema = mongoose.Schema({
+    ID:Number,
+    libID: Number,
+    rationID: Number,
+    //rationCode: String,
+    coeIDs: Array
+});
+
+var rationCoeModel = db.model("rationCoes",rationCoeSchema, "rationCoes")
+
+var rationCoeDAO = function(){};
+
+rationCoeDAO.prototype.getRationCoes = function (data, callback) {
+    rationCoeModel.findOne({
+            "libID": data.libID,
+            "rationID": data.rationID,
+            "$or": [{"isDeleted": null}, {"isDeleted": false}]
+        },
+        function (err, doc) {
+            if (err) callback(true, "获取定额调整系数错误!", "")
+            else callback(false, "获取定额调整系数成功", doc);
+        })
+};
+
+module.exports = new rationCoeDAO();
+

+ 107 - 0
modules/rationRepository/models/rationItem.js

@@ -0,0 +1,107 @@
+/**
+ * Created by Tony on 2017/4/28.
+ */
+var mongoose = require("mongoose");
+var dbm = require("../../../config/db/db_manager");
+var db = dbm.getCfgConnection("rationRepository")
+var async = require("async");
+var Schema = mongoose.Schema;
+
+var rationGljItemSchema = mongoose.Schema({
+    gljId: Number,
+    consumeAmt: Number,
+    proportion: Number //配合比,暂时无需使用,默认0
+});
+var rationItemSchema = mongoose.Schema({
+    ID:Number,
+    //以下是基于已有access库
+    code: String,
+    name: String,
+    unit: String,
+    basePrice: Number,
+    sectionId: Number,
+    caption: String,
+    feeType: Number,
+    rationGljList: [rationGljItemSchema]
+});
+var rationItemModel = db.model("rationItems",rationItemSchema, "rationItems")
+var counter = require('../../../public/counter/counter');
+
+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);
+    })
+};
+rationItemDAO.prototype.mixUpdateRationItems = function(sectionId, updateItems, addItems, callback){
+    var me = this;
+    if (!(updateItems) || updateItems.length == 0) {
+        me.addRationItems(sectionId, addItems, callback);
+    } else {
+        me.updateRationItems(sectionId, updateItems, function(err, results){
+            if (err) {
+                callback(true, "保存定额错误!", false);
+            } else {
+                if (addItems && addItems.length > 0) {
+                    me.addRationItems(sectionId, addItems, callback);
+                } else {
+                    callback(false, "保存定额成功!", results);
+                }
+            }
+        });
+    }
+};
+
+rationItemDAO.prototype.getRationItemsByCode = function(code,callback){
+    //
+};
+
+rationItemDAO.prototype.addRationItems = function(sectionId, items,callback){
+    if (items && items.length > 0) {
+        counter.counterDAO.getIDAfterCount(counter.moduleName.rations, items.length, function(err, result){
+            var maxId = result.value.sequence_value;
+            var arr = [];
+            for (var i = 0; i < items.length; i++) {
+                var obj = new rationItemModel(items[i]);
+                obj.ID = (maxId - (items.length - 1) + i);
+                obj.sectionId = sectionId;
+                arr.push(obj);
+            }
+            rationItemModel.collection.insert(arr, null, function(err, docs){
+                if (err) {
+                    callback(true, "保存定额错误!", false);
+                } else {
+                    callback(false, "保存定额成功!", docs);
+                }
+            })
+        });
+    } else {
+        callback(true, "定额数据源错误!", false);
+    }
+};
+
+rationItemDAO.prototype.updateRationItems = function(sectionId, items,callback){
+    var functions = [];
+    for (var i=0; i < items.length; i++) {
+        functions.push((function(doc) {
+            return function(cb) {
+                var filter = {};
+                if (doc.ID) {
+                    filter.ID = doc.ID;
+                } else {
+                    filter.sectionId = sectionId;
+                    filter.code = doc.code;
+                }
+                rationItemModel.update(filter, doc, cb);
+            };
+        })(items[i]));
+    }
+    async.parallel(functions, function(err, results) {
+        callback(err, results);
+    });
+};
+
+module.exports = new rationItemDAO()
+

+ 1 - 1
modules/rationRepository/models/repositoryMap.js

@@ -37,7 +37,7 @@ rationRepositoryDao.prototype.getRealLibName = function(dispName,callback){
             if (err) {
                 callback('Error', null);
             } else {
-                callback(0, data);
+                callback(false, data);
             }
         });
     } else {

+ 3 - 2
modules/rationRepository/routes/rationRepRoutes.js

@@ -7,6 +7,7 @@ var _rootDir = __dirname;
 
 var rationRepositoryController = require("../controllers/rationRepositoryController");
 var rationChapterTreeController = require("../controllers/rationChapterTreeController");
+var rationController = require("../controllers/rationController");
 
 apiRouter.post("/getRationDisplayNames",rationRepositoryController.getDisPlayRationLibs);
 apiRouter.post("/editRationLibs",rationRepositoryController.updateRationRepositoryName);
@@ -19,7 +20,7 @@ apiRouter.post("/createNewNode",rationChapterTreeController.createNewNode);
 apiRouter.post("/updateNodes",rationChapterTreeController.updateNodes);
 apiRouter.post("/deleteNodes",rationChapterTreeController.deleteNodes);
 
-apiRouter.post("/addSection",rationChapterTreeController.sectionUpsert);
-apiRouter.post("/deleteSection",rationChapterTreeController.deleteSection);
+apiRouter.post("/getRationItems",rationController.getRationItemsBySection);
+apiRouter.post("/mixUpdateRationItems",rationController.mixUpdateRationItems);
 
 module.exports = apiRouter;

+ 1 - 1
modules/reports/controllers/rpt_controller.js

@@ -38,7 +38,7 @@ module.exports = {
             }
         }).then(function(tplData){
                 if (tplData) {
-                    var printCom = JpcEx.createNew();
+                    var printCom = JpcEx.createInit();
                     rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
                     var defProperties = rptUtil.getReportDefaultCache();
                     printCom.initialize(rptTpl);

+ 9 - 9
modules/reports/rpt_component/JpcEx.js

@@ -11,7 +11,7 @@ var JpcCommonHelper = require('./helper/Jpc_Helper_Common');
 var JE = require('./Jpc_RTE'); //Important: for self-define function execution purpose
 
 var JpcExSrv = function(){};
-JpcExSrv.prototype.createNew = function(){
+JpcExSrv.prototype.createInit = function(){
     function private_buildDftItems(rptTpl, dftCollection, propArray, nodeName) {
         var rst = {};
         if (dftCollection) {
@@ -85,29 +85,29 @@ JpcExSrv.prototype.createNew = function(){
     JpcResult.initialize = function(rptTpl) {
         var me = this;
         if (rptTpl[JV.NODE_FLOW_INFO]) {
-            me.flowTab = JpcFlowTab.createNew();
+            me.flowTab = JpcFlowTab.createInit();
             me.flowTab.initialize();
         }
         if (rptTpl[JV.NODE_BILL_INFO]) {
-            me.billTab = JpcBillTab.createNew();
+            me.billTab = JpcBillTab.createInit();
             me.billTab.initialize();
         }
         //var dt1 = new Date();
         if (rptTpl[JV.NODE_CROSS_INFO]) {
-            me.crossTab = JpcCrossTab.createNew();
+            me.crossTab = JpcCrossTab.createInit();
             me.crossTab.initialize();
         }
         me.totalPages = 0;
         me.runTimePageData = {};
-        me.fields = JpcField.createNew(rptTpl);
-        me.params = JpcParam.createNew(rptTpl);
-        me.formulas = JpcFunc.createNew(rptTpl);
+        me.fields = JpcField.createInit(rptTpl);
+        me.params = JpcParam.createInit(rptTpl);
+        me.formulas = JpcFunc.createInit(rptTpl);
     };
 
     JpcResult.analyzeData = function(rptTpl, dataObj, defProperties) {
         var me = this;
         //1. data object
-        var dataHelper = JpcData.createNew();
+        var dataHelper = JpcData.createInit();
         dataHelper.analyzeData(rptTpl, dataObj);
         //2. tab object
         //pre-condition: the data should be sorted in SQL/NoSQL level!
@@ -157,7 +157,7 @@ JpcExSrv.prototype.createNew = function(){
             rst[JV.NODE_FONT_COLLECTION] = private_buildDftFonts(rptTpl, (defProperties == null)?null:defProperties.fonts);
             rst[JV.NODE_PAGE_INFO] = JpcCommonHelper.getPageSize(rptTpl);
             rst.items = [];
-            var bands = JpcBand.createNew(rptTpl, defProperties);
+            var bands = JpcBand.createInit(rptTpl, defProperties);
             try {
                 for (var page = startPage; page <= endPage; page++) {
                     me.runTimePageData.currentPage = page;

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

@@ -10,7 +10,7 @@ var JpcCommonOutputHelper = require('./helper/Jpc_Helper_CommonOutput');
 var JpcAreaHelper = require('./helper/Jpc_Helper_Area');
 
 var JpcBillTabSrv = function(){};
-JpcBillTabSrv.prototype.createNew = function(){
+JpcBillTabSrv.prototype.createInit = function(){
     var JpcBillTabResult = {};
     JpcBillTabResult.initialize = function() {
         var me = this;

+ 2 - 2
modules/reports/rpt_component/Jpc_CrossTab.js

@@ -11,7 +11,7 @@ var JpcCommonOutputHelper = require('./helper/Jpc_Helper_CommonOutput');
 var JpcAreaHelper = require('./helper/Jpc_Helper_Area');
 
 var JpcCrossTabSrv = function(){};
-JpcCrossTabSrv.prototype.createNew = function(){
+JpcCrossTabSrv.prototype.createInit = function(){
     function private_addTabValue(tabValuedIdxLst, sortedSequence, segIdx, preRec, nextRec, dispSerialIdxLst, sorted_sum_value_Lst, rst_sum_value_Lst) {
         if (tabValuedIdxLst) {
             var serial1stTier = null;
@@ -232,7 +232,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         var maxRowRec = 1, maxColRec = 1, counterRowRec = 0, counterColRec = 0, pageIdx = 0, segCnt = me.sortedContentSequence.length;
         var pageStatus = [true, true, false, true, false, false, false, false];
         //2. calculate the page info one by one
-        var bands = JpcBand.createNew(rptTpl, defProperties);
+        var bands = JpcBand.createInit(rptTpl, defProperties);
         function private_resetBandArea() {
             JpcBandHelper.setBandArea(bands, rptTpl, pageStatus);
             maxRowRec = JpcCrossTabHelper.getMaxRowsPerPage(bands, rptTpl);

+ 2 - 2
modules/reports/rpt_component/Jpc_FlowTab.js

@@ -11,7 +11,7 @@ var JpcCommonOutputHelper = require('./helper/Jpc_Helper_CommonOutput');
 var JpcAreaHelper = require('./helper/Jpc_Helper_Area');
 
 var JpcFlowTabSrv = function(){};
-JpcFlowTabSrv.prototype.createNew = function(){
+JpcFlowTabSrv.prototype.createInit = function(){
     function private_addPageValue(ValuedIdxLst, sortedSequence, preRec, nextRec,page_seg_map, segIdx, pageIdx) {
         var vIdx = [];
         for (var vi = 0; vi < nextRec; vi++) {
@@ -73,7 +73,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
     JpcFlowTabResult.preSetupPages = function (rptTpl, dataOjb, defProperties) {
         var rst = 0, me = this, counterRowRec = 0, maxRowRec = 1, pageIdx = 0;
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS], null, me.disp_fields_idx);
-        var bands = JpcBand.createNew(rptTpl, defProperties);
+        var bands = JpcBand.createInit(rptTpl, defProperties);
         var pageStatus = [true, true, false, false, false, false, false, false];
         if (rptTpl[JV.NODE_FLOW_INFO][JV.PROP_MULTI_COLUMN]) {
             me.multiCols = 1 * rptTpl[JV.NODE_FLOW_INFO][JV.PROP_MULTI_COLUMN];

+ 4 - 3
public/counter/counter.js

@@ -20,13 +20,14 @@ const COUNTER_MODULE_NAME = {
     project: 'projects',
     user: 'users',
     bills: 'bills',
-    ration: 'ration',
+    rations: 'rations',
     GLJ: 'glj',
     rationMap: 'rationMaps',
     rationTree: 'rationChapterTrees',
     report: 'rptTemplates',
     fee: 'fees',
-    template_bills: 'temp_bills'
+    template_bills: 'temp_bills',
+    billsLib: 'billsLib'
 }
 /*const PROJECT_COUNTER = 'projects', USER_COUNTER = 'users', BILL_COUNTER = 'bills', RATION_COUNTER = 'rations',
     REPORT_COUNTER = 'rptTemplates', FEE_COUNTER = 'fees'*/
@@ -35,7 +36,7 @@ var counterDAO = function(){};
 
 /*
  * callback = function (err, result) {
- *     result.value.sequence_value 为修改后的id
+ *     result.value.sequence_value 为锟睫改猴拷锟絠d
  * }
  */
 counterDAO.prototype.getIDAfterCount = function(moduleName, stepCount, callback) {

+ 4 - 1
public/web/idTree.js

@@ -66,6 +66,7 @@ var idTree = {
                     nodes[i].nextSibling = (i === nodes.length - 1) ? null : nodes[i + 1];
                 }
             },
+            // ��nodes�У���iIndex����������ʼȫ���Ƴ�
             // 在nodes中,从iIndex(包括)开始全部移除
             removeNodes: function (tree, parent, iIndex, count) {
                 var children = parent ? parent.children : tree.roots;
@@ -84,6 +85,7 @@ var idTree = {
                     children.splice(iIndex, children.length - iIndex);
                 }
             },
+            // ��nodes������addNodes, λ�ô�index��ʼ
             // 在parent.children/tree.roots中增加nodes, 位置从index开始
             addNodes: function (tree, parent, nodes, iIndex) {
                 var children = parent ? parent.children : tree.roots;
@@ -137,6 +139,7 @@ var idTree = {
         };
 
         var Node = function (tree, data) {
+            // ���µ����ԣ�����Ԫ�������ֱ���޸�
             // 以下的属性,本单元外均不可直接修改
             this.tree = tree;
             this.data = data;
@@ -337,7 +340,7 @@ var idTree = {
                 if (orgPre.preSibling) {
                     orgPre.preSibling.setNextSibling(this);
                 }
-                orgPre.seNextSibling(this.nextSibling);
+                orgPre.setNextSibling(this.nextSibling);
                 this.preSibling = orgPre.preSibling;
                 orgPre.preSibling = this;
                 this.setNextSibling(orgPre);

+ 18 - 1
server.js

@@ -145,10 +145,24 @@ app.get('/rationRepository/ration', function(req, res) {
             userID: req.session.userID
         });
 });
+app.get('/rationRepository/gongliao', function(req, res) {
+    res.render('rationLibEditor/gongliao.html',
+        {
+            userAccount: req.session.userAccount,
+            userID: req.session.userID
+        });
+});
 app.use("/rationRepository/api",rationRepository_Router);
 
 app.get("/stdBillsmain", function(req, res){
-    res.render("billsLib/html/main.html");
+    if(!req.session.userAccount){
+        res.redirect('/login');
+    }
+    else {
+        res.render("billsLib/html/main.html",
+            {userAccount: req.session.userAccount,
+                userID: req.session.userID});
+    }
 });
 app.get("/stdBills", function(req, res){
     res.render("billsLib/html/qingdan.html");
@@ -156,6 +170,9 @@ app.get("/stdBills", function(req, res){
 app.get('/stdJobs', function(req, res){
     res.render('billsLib/html/neirong.html');
 });
+app.get('/stdItems', function(req, res){
+    res.render('billsLib/html/tezheng.html');
+});
 var billsLibRouter = require("./modules/billsLib/billsLibRoutes/billsLibRoutes");
 app.use("/stdBillsEditor", billsLibRouter);
 //-----------------

+ 129 - 0
test/unit/idTree/idTreeTest.js

@@ -0,0 +1,129 @@
+/**
+ * Created by Mai on 2017/4/1.
+ */
+
+const fs = require('fs');
+var test = require('tape');
+var idTreeUtil = null;
+var idTreeSetting = {
+    id: 'ID',
+    pid: 'ParentID',
+    nid: 'NextSiblingID',
+    rootId: -1,
+    autoUpdate: false
+};
+var testTreeData = null;
+var testTree = null;
+
+var getKeyIDs = function (node) {
+    var data = [];
+    if (node) {
+        data.push(node.getID());
+        data.push(node.getParentID());
+        data.push(node.getNextSiblingID());
+    } else {
+        for (var i = 1; i <= 3; i++) {
+            data.push(-1);
+        }
+    }
+    return data;
+}
+
+test('loading idTree Module: ', function (t) {
+    var idTreeCode = fs.readFileSync(__dirname + '../../../../public/web/idTree.js', 'utf8', 'r');
+    eval(idTreeCode);
+    idTreeUtil = idTree;
+    t.pass('pass for loading idTree Module');
+    t.end();
+});
+
+test('loading Testing Data: ', function (t) {
+    var idTreeDataCode = fs.readFileSync(__dirname + '../../../tmp_data/data_15690.js', 'utf8', 'r');
+    eval(idTreeDataCode);
+    testTreeData = datas;
+    t.pass('pass for loading Testing Data');
+    t.end();
+});
+
+test('idTree loading Testing Data: ', function (t) {
+    t.plan(1);
+    testTree = idTreeUtil.createNew(idTreeSetting);
+    testTree.loadDatas(testTreeData);
+    t.equal(testTree.count(), testTreeData.length);
+    t.end();
+});
+
+test('upMove Node: ', function (t) {
+    t.plan(3);
+    var testNodeID = 13431;
+    var testResult = [[13429, 13427, 13431], [13430, 13427, 13432], [13431, 13427, 13430]];
+    var node = testTree.findNode(testNodeID), pre = node.preSibling, prePre = pre ? pre.preSibling : null;
+    node.upMove();
+    t.deepEqual(getKeyIDs(prePre), testResult[0]);
+    t.deepEqual(getKeyIDs(pre), testResult[1]);
+    t.deepEqual(getKeyIDs(node), testResult[2]);
+    t.end();
+});
+
+test('downMove Node: ', function (t) {
+    t.plan(3);
+    var testNodeID = 13431;
+    var testResult = [[13429, 13427, 13430], [13430, 13427, 13431], [13431, 13427, 13432]];
+    var node = testTree.findNode(testNodeID), pre = node.preSibling, next = node.nextSibling;
+    node.downMove();
+    t.deepEqual(getKeyIDs(pre), testResult[0]);
+    t.deepEqual(getKeyIDs(next), testResult[1]);
+    t.deepEqual(getKeyIDs(node), testResult[2]);
+    t.end();
+});
+
+test('upLevel Node: ', function (t) {
+    t.plan(4);
+    var testNodeID = 13431;
+    var node = testTree.findNode(testNodeID), orgPre = node.preSibling, orgNext = node.nextSibling, orgParent = node.parent;
+    var orgChildrenCount = node.children.length, orgNextSiblingCount = orgParent.children.length - node.siblingIndex() - 1;
+    node.upLevel();
+    t.equal(orgNext.parent, node);
+    t.equal(node.children.length, orgChildrenCount + orgNextSiblingCount);
+    t.equal(orgPre.nextSibling, null);
+    t.equal(orgParent.nextSibling, node);
+    t.end();
+});
+
+test('downLevel Node: ', function (t) {
+    t.plan(4);
+    var testNodeID = 13431;
+    var node = testTree.findNode(testNodeID), orgPre = node.preSibling, orgNext = node.nextSibling, orgParent = node.parent;
+    var newPre = orgPre.lastChild();
+    node.downLevel();
+    t.equal(orgPre.nextSibling, orgNext);
+    t.equal(orgPre.lastChild(), node);
+    t.equal(newPre.nextSibling, node);
+    t.equal(node.nextSibling, null);
+    t.end();
+});
+
+test('insert Node: ', function (t) {
+    t.plan(5);
+    var parent = testTree.findNode(13574), next = testTree.findNode(13598);
+    var orgTreeCount = testTree.count(), orgParentChildrenCount = parent.children.length, orgNextPre = next.preSibling;
+    var newNode = testTree.insert(parent.getID(), next.getID());
+    t.equal(testTree.count(), orgTreeCount + 1);
+    t.equal(parent.children.length, orgParentChildrenCount + 1);
+    t.equal(orgNextPre.nextSibling, newNode);
+    t.equal(newNode.parent, parent);
+    t.equal(newNode.nextSibling, next);
+    t.end();
+});
+
+test('delete Node: ', function (t) {
+    t.plan(3);
+    var testNodeID = 13598;
+    var node = testTree.findNode(testNodeID), orgParent = node.parent, orgPre = node.preSibling, orgNext = node.nextSibling;
+    var orgTreeCount = testTree.count(), orgParentChildrenCount = orgParent.children.length;
+    testTree.delete(node);
+    t.equal(testTree.count(), orgTreeCount - node.posterityCount() - 1);
+    t.equal(orgParent.children.length, orgParentChildrenCount - 1);
+    t.equal(orgPre.nextSibling, orgNext);
+    t.end();
+});

+ 1 - 1
test/unit/reports/testRpt.js

@@ -32,7 +32,7 @@ test('test get report pages function: ', function (t) {
         tplData = rst;
         t.equal(tplData != null, true);
         if (tplData) {
-            var printCom = JpcEx.createNew();
+            var printCom = JpcEx.createInit();
             rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
             var defProperties = rptUtil.getReportDefaultCache();
             printCom.initialize(rptTpl);

+ 0 - 114
test/unit/stdBillsTree/testMyTree.js

@@ -1,114 +0,0 @@
-/**
- * Created by vian on 2017/3/31.
- */
-var test = require("tape");
-test("testMyBillsTree:", function(t){
-    var billsData = [
-        {ID: 2, ParentID: -1, NextSiblingID: 3},
-        {ID: 1, ParentID: -1, NextSiblingID: 2},
-        {ID: 3, ParentID: -1, NextSiblingID: 9},
-        {ID: 4, ParentID: 3, NextSiblingID: 5},
-        {ID: 5, ParentID: 3, NextSiblingID: -1},
-        {ID: 6, ParentID: 4, NextSiblingID: 7},
-        {ID: 7, ParentID: 4, NextSiblingID: -1},
-        {ID: 8, ParentID: 6, NextSiblingID: -1},
-        {ID: 10, ParentID: -1, NextSiblingID: -1},
-        {ID: 9, ParentID: -1, NextSiblingID: 10},
-        {ID: 11, ParentID: 10, NextSiblingID: -1},
-        {ID: 12, ParentID: 11, NextSiblingID: -1},
-        {ID: 13, ParentID: 12, NextSiblingID: -1},
-        {ID: 14, ParentID: 13, NextSiblingID: -1},
-        {ID: 15, ParentID: 14, NextSiblingID: 16},
-        {ID: 16, ParentID: 14, NextSiblingID: 17},
-        {ID: 17, ParentID: 14, NextSiblingID: -1},
-        {ID: 18, ParentID: 17, NextSiblingID: 19},
-        {ID: 19, ParentID: 17, NextSiblingID: -1},
-        {ID: 20, ParentID: 1, NextSiblingID: -1},
-    ]
-
-    function getTop(data, topId){
-        var top = [];
-        for(var i=0; i<data.length; i++){
-            if(data[i].ParentID == -1 ||data[i].ParentID == topId){
-                top.push(data[i]);
-            }
-        }
-        return top;
-    }
-    function sortNodes(nodes){
-        for(var i=0; i<nodes.length; i++){
-            for(var j=i+1; j<nodes.length; j++){
-                var temp;
-                if(nodes[i].NextSiblingID == nodes[j].ID){
-                    temp = nodes[i+1];
-                    nodes[i+1] = nodes[j];
-                    nodes[j] = temp;
-                }
-            }
-            if(nodes[i].NextSiblingID == nodes[0].ID){
-                var topNode = nodes[i];
-                for(var j=nodes.length-2; j>=0; j-- ){
-                    nodes[j+1] = nodes[j];
-                }
-                nodes[0] = topNode;
-            }
-        }
-        return nodes;
-    }
-
-    function getNodeChildren(node, children){
-        for(var i=0; i<billsData.length; i++){
-            if(billsData[i].ParentID == node.ID){
-                children.push(billsData[i].ID);
-                getNodeChildren(billsData[i], children);
-            }
-        }
-        return children;
-    }
-
-    function buildChildren(billsData){
-        var tempTree = [];
-        for(var i=0; i<billsData.length; i++){
-            var children = [];
-            getNodeChildren(billsData[i], children);
-            tempTree.push({"ID": billsData[i].ID, "ParentID": billsData[i].ParentID, "NextSiblingID": billsData[i].NextSiblingID, "children": children});
-        }
-        return tempTree;
-    }
-
-    function getNodes(data ,ids){
-        var idsNodes = [];
-        for(var i =0; i<ids.length; i++){
-            for(var j=0 ; j<data.length; j++){
-                if(ids[i] == data[j].ID){
-                    idsNodes.push({ID: data[j].ID, ParentID: data[j].ParentID, NextSiblingID: data[j].NextSiblingID, children: data[j].children});
-                }
-            }
-        }
-        return idsNodes;
-    }
-
-    function buildTree(treeContainer, billsData, tempTree, topId){
-        var sortTempTree = sortNodes(getTop(tempTree, topId));
-        for(var i=0; i<sortTempTree.length; i++){
-           if(sortTempTree[i].children.length > 0){
-               treeContainer.push({"ID": sortTempTree[i].ID, "ParentID": sortTempTree[i].ParentID, "NextSiblingID": sortTempTree[i].NextSiblingID, "children": sortTempTree[i].children});
-               var childrenTree = getNodes(buildChildren(billsData), sortTempTree[i].children);
-               buildTree(treeContainer, billsData, childrenTree, sortTempTree[i].ID);
-           }
-           else {
-               treeContainer.push({"ID": sortTempTree[i].ID, "ParentID": sortTempTree[i].ParentID, "NextSiblingID": sortTempTree[i].NextSiblingID, "children": sortTempTree[i].children});
-           }
-       }
-        return treeContainer;
-    }
-
-    //console.log("sortNodes:====================");
-    //console.log(sortNodes(getTop(buildChildren(billsData))));
-   // console.log("buildChildren:====================");
-   // console.log(buildChildren(billsData));
-    console.log("buildTree:====================");
-    var billsTree = [];
-    console.log(buildTree(billsTree, billsData, buildChildren(billsData), -1));
-    t.end();
-});

+ 7 - 8
web/billsLib/html/main.html

@@ -6,12 +6,9 @@
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <title>清单规则编辑器</title>
-    <link rel="stylesheet" href="../../css/bootstrap/bootstrap.min.css">
-    <!--<link rel="stylesheet" href="css/bootstrap/themes.css">-->
-    <link rel="stylesheet" href="../../css/main.css">
-    <link rel="stylesheet" href="../../css/font-awesome/font-awesome.min.css">
-    <!--zTree-->
-  	<link rel="stylesheet" href="../../css/ztree/zTreeStyle.css" type="text/css">
+    <link rel="stylesheet" href="web/css/bootstrap/bootstrap.min.css">
+    <link rel="stylesheet" href="web/css/main.css">
+    <link rel="stylesheet" href="web/css/font-awesome/font-awesome.min.css">
 </head>
 
 <body>
@@ -130,15 +127,17 @@
 </body>
 <script type="text/javascript">
     autoFlashHeight();
-    mainAjax.getStdBillsLib(null);
 </script>
 <script>
+    var userId = '<%= userID %>';
+    var userAccount = '<%= userAccount %>';
+    mainAjax.getStdBillsLib(userId);
     $(document).ready(function(){
         //main 增删改
         $("#createA").click(function(){
             var billsLibName = $("#createText").val();
             if(billsLibName){
-                mainAjax.createStdBillsLib(billsLibName);
+                mainAjax.createStdBillsLib(userId, billsLibName);
                 $("#createText").val("");
             }
             else{

+ 54 - 28
web/billsLib/html/neirong.html

@@ -20,7 +20,7 @@
     <div class="header">
         <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 ">
             <span class="header-logo px-2">清单规则编辑器</span>
-            <div class="navbar-text"><a href="main.html">清单规则</a><i class="fa fa-angle-right fa-fw"></i>XXX清单规则</div>
+            <div class="navbar-text"></div>
         </nav>
         <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
 
@@ -32,7 +32,7 @@
                       <a class="nav-link active px-3" href="javascript: void(0);">工作内容</a>
                   </li>
                   <li class="nav-item">
-                      <a class="nav-link px-3" href="tezheng.html">项目特征</a>
+                      <a id="aStdItems" class="nav-link px-3" href="stdItems">项目特征</a>
                   </li>
               </ul>
         </nav>
@@ -173,41 +173,67 @@
     <script src="web/billsLib/scripts/setSheets.js"></script>
     <script src="web/billsLib/scripts/billsLibAjax.js"></script>
     <script src="web/billsLib/scripts/tools.js"></script>
+    <script src="public/web/tree_sheet_helper.js"></script>
+    <script src="web/billsLib/scripts/billsLibSetting.js"></script>
+    <script src="web/billsLib/scripts/dbController.js"></script>
     <SCRIPT type="text/javascript">
-        var billsLibId = getQueryString('billsLibId');
+        var billsLibId = getQueryString("billsLibId");
+        tools.redirect(billsLibId, 'stdBillsmain');
+        var spreadAllJobs = new GC.Spread.Sheets.Workbook($('#spreadAllJobs')[0], {sheetCount: 1});
+        var orgJobData;
+        var maxJobNumer;
         $(document).ready(function(){
             $('#aStdBills').attr('href', function(){
                 return 'stdBills?billsLibId=' + billsLibId;
             });
-            buildAllJobs();
+            $('#aStdItems').attr('href', function(){
+                return 'stdItems?billsLibId=' + billsLibId;
+            });
+            billsAjax.getStdBillsLibName(billsLibId);
+            buildAllJobs(spreadAllJobs, totalJobsSetting);
         });
-        function buildAllJobs(){
-            var spread = new GC.Spread.Sheets.Workbook($("#spreadAllJobs")[0], {sheetCount: 1});
-            var sheet = spread.getSheet(0);
-            var chRowCount = 2;
-            var vpColCount = 2;
-            var vpRowCount = 28;
-            sheet.suspendPaint();
-            sheet.suspendEvent();
-            initSheet(spread, sheet, chRowCount, vpRowCount, vpColCount);
-            setupColHeader(sheet);
-            //initRowHeight(sheet);
-            setCell(sheet);
-            myCommand(spread, sheet);
-            setScrollBar(spread, sheet, vpRowCount);
-            sheet.resumePaint();
-            sheet.resumeEvent();
+        function buildAllJobs(spreadAllJobs, setting){
+            setSheet.initSheet(spreadAllJobs, setting);
+            myKey.downKey(spreadAllJobs);
+            myKey.enterKey(spreadAllJobs);
+            TREE_SHEET_HELPER.loadSheetHeader(setting, spreadAllJobs.getActiveSheet());
+            jobsAjax.getJobContent(billsLibId, function(datas){
+                spreadAllJobs.getActiveSheet().suspendPaint();
+                var len = datas.length;
+                for(var i=0; i<len; i++){
+                    setting.cols.forEach(function(col, colIdx){
+                        spreadAllJobs.getActiveSheet().setTag(i, colIdx, datas[i].id, GC.Spread.Sheets.SheetArea.viewport);
+                        if(datas[i][col.data.field]){
+                            spreadAllJobs.getActiveSheet().getCell(i, colIdx, GC.Spread.Sheets.SheetArea.viewport).value(datas[i][col.data.field]);
+                        }
+                        else {
+                            spreadAllJobs.getActiveSheet().getCell(i, colIdx, GC.Spread.Sheets.SheetArea.viewport).value('');
+                        }
+                    });
+                }
+                spreadAllJobs.getActiveSheet().resumePaint();
+                var totalJobs = createObj.newJobs();
+                totalJobs.loadJobs(null, datas);
+                tools.getBillsIds(function(ids){
+                    myKey.delKey(spreadAllJobs, ids, totalJobs, setting, 'totalJobs');
+                    bindSheet(totalJobs, spreadAllJobs.getActiveSheet(), setting);
+                });
+            });
         }
-        function setupColHeader(sheet){
-            var ch = GC.Spread.Sheets.SheetArea.colHeader;
-            sheet.addSpan(0 ,0, 2, 1, ch);
-            sheet.setValue(0, 0, "编号", ch);
-            sheet.setColumnWidth(0, 200);
-            sheet.addSpan(0 ,1, 2, 1, ch);
-            sheet.setValue(0, 1, "工作内容", ch);
-            sheet.setColumnWidth(1, 850);
+        function bindSheet(totalJobs, sheet, setting){
+            mainAjax.getMaxNumber(billsLibId, 'jobs', function(result){
+                if(result.length === 0){
+                    maxJobsNumber = 0;
+                }
+                else {
+                    maxJobsNumber = result[0].code;
+                }
+                orgJobData = sheet.getCell(0, 0).value();
+                totalJobsController.eiditData(totalJobs, sheet, setting);
+            });
         }
 
+
   	</SCRIPT>
 </body>
 <script type="text/javascript">

+ 200 - 48
web/billsLib/html/qingdan.html

@@ -7,13 +7,10 @@
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <title>清单规则编辑器</title>
     <link rel="stylesheet" href="web/css/bootstrap/bootstrap.min.css">
-    <!--<link rel="stylesheet" href="../../web/css/bootstrap/themes.css">-->
     <link rel="stylesheet" href="web/css/main.css">
     <link rel="stylesheet" href="web/css/font-awesome/font-awesome.min.css">
     <!--spread-->
     <link rel="stylesheet" href="web/css/spreadjs/gc.spread.sheets.excel2013white.10.0.1.css">
-    <!--zTree-->
-    <link rel="stylesheet" href="web/css/ztree/zTreeStyle.css" type="text/css">
 </head>
 
 <body>
@@ -32,7 +29,7 @@
                       <a id="aStdJobs" class="nav-link px-3" href="stdJobs">工作内容</a>
                   </li>
                   <li class="nav-item">
-                      <a class="nav-link px-3" href="tezheng.html">项目特征</a>
+                      <a id="aStdItems" class="nav-link px-3" href="stdItems">项目特征</a>
                   </li>
               </ul>
         </nav>
@@ -67,7 +64,6 @@
                   </div>
                 </nav>
                 <div class="main-data" id="spreadBills">
-                  <!--<div id="spreadBills" style="width: 100%; height: 700px;"></div>-->
                 </div>
             </div>
             <div class="main-side col-lg-5 p-0">
@@ -206,6 +202,13 @@
             </div>
         </div>
     </div>
+    <!--弹出提示窗口-->
+    <div class="modal fade" id="qAlert" style="display: none; margin: 300px auto; width: 300px; height: 200px;">
+        <div id="alertText"></div>
+        <div style="margin: 50px auto">
+            <button id="alertBtn" class="btn btn-warning">确定</button>
+        </div>
+    </div>
     <!-- JS. -->
     <script src="lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
     <script src="lib/jquery/jquery.min.js"></script>
@@ -220,65 +223,104 @@
     <script src="public/web/tree_sheet_helper.js"></script>
     <script src="web/billsLib/scripts/billsLibSetting.js"></script>
     <script src="web/billsLib/scripts/billsLibTree.js"></script>
-    <!--<script src="test/tmp_data/data_15690.js"></script>-->
     <script src="test/tmp_data/bills_grid_setting.js"></script>
     <script src="web/billsLib/scripts/dbController.js"></script>
     <script src="web/billsLib/scripts/tools.js"></script>
 </body>
 <script type="text/javascript">
     autoFlashHeight();
+    var maxJobsNumber;
+    var maxItemsNumber;
+    var orgJobData;
+    var orgItemData;
     var billsTree = billsLibTree.createBillsTree();
     var billsLibId = getQueryString("billsLibId");
+    tools.redirect(billsLibId, 'stdBillsmain');
+    var jobsSpread = new GC.Spread.Sheets.Workbook($("#spreadJobs")[0], {sheetCount: 1});
+    var itemsSpread = new GC.Spread.Sheets.Workbook($("#spreadItems")[0], {sheetCount: 1});
     $(document).ready(function(){
         $("#aStdJobs").attr('href', function(){
             return 'stdJobs?billsLibId=' + billsLibId;
         });
+        $('#aStdItems').attr('href', function(){
+            return 'stdItems?billsLibId=' + billsLibId;
+        });
         billsAjax.getStdBillsLibName(billsLibId);
-        billsAjax.getBills(billsLibId);
-        buildJobs();
-        buildItems();
+        billsAjax.getBills(billsLibId, function(bills){
+            showBillsSheet(bills, jobsSpread.getActiveSheet(), itemsSpread.getActiveSheet(), billsLibSetting)
+        });
+        buildJobs(jobsSpread, jobsSetting);
+        buildItems(itemsSpread, itemsSetting);
     });
-    //test
-    //test
-
 
-    function nodeOpration(controller){
+    function nodeOpration(controller, totalJobs, totalItems){
         dbController.editData(controller, controller.sheet);
         $('#insert').click(function(){
-            //controller.insert();
             dbController.insert(controller);
+            tools.clearData(jobsSpread.getActiveSheet());
+            tools.clearData(itemsSpread.getActiveSheet());
         });
         $('#delete').click(function(){
-            //controller.delete();
-            dbController.delete(controller);
+            dbController.delete(controller, totalJobs, totalItems);
         });
         $('#upLevel').click(function(){
-            //controller.upLevel();
             dbController.upLevel(controller);
         });
         $('#downLevel').click(function(){
-            //controller.downLevel();
            dbController.downLevel(controller);
         });
         $('#upMove').click(function(){
-            //controller.upMove();
             dbController.upMove(controller);
         });
         $('#downMove').click(function(){
-            //controller.downMove();
             dbController.downMove(controller);
         });
     }
 
-    function showBillsSheet(datas){
+
+    function showBillsSheet(datas, jobsSheet, itemsSheet, setting) {
         var billsSpread = new GC.Spread.Sheets.Workbook($('#spreadBills')[0], {sheetCount: 1});
-        initSheet(billsSpread);
+        setSheet.initSheet(billsSpread, setting);
+        myKey.delKey(billsSpread);
         billsTree.loadDatas(datas);
-        var controller = TREE_SHEET_CONTROLLER.createNew(billsTree.tree, billsSpread.getActiveSheet(), billsLibSetting);
+        //粘贴事件
+        bindPasteBills(billsSpread.getActiveSheet(), setting);
+        var controller = TREE_SHEET_CONTROLLER.createNew(billsTree.tree, billsSpread.getActiveSheet(), setting);
         controller.showTreeData();
-        if(!controller.tree.selected && controller.tree.findNode(controller.sheet.getTag(0, 0, GC.Spread.Sheets.SheetArea.viewport))){
+        //setTagId
+        setTagID(controller, setting);
+        if (!controller.tree.selected && controller.tree.findNode(controller.sheet.getTag(0, 0, GC.Spread.Sheets.SheetArea.viewport))) {
             controller.setTreeSelected(controller.tree.findNode(controller.sheet.getTag(0, 0, GC.Spread.Sheets.SheetArea.viewport)));
         }
+        //刷新节点可进行操作的按钮
+        refreshBtn(controller);
+        controller.setTreeSelected(controller.tree.findNode(controller.sheet.getTag(0, 0)));
+        //补注内容改变
+        rechargeChange(controller);
+        //jobs
+        jobOperation(controller, jobsSheet, function(totalJobs){
+            //items
+            itemOperation(controller, itemsSheet, function(totalItems){
+                //节点操作
+                nodeOpration(controller, totalJobs, totalItems);
+            });
+        });
+    }
+
+    function setTagID(controller, setting){
+        if(controller.tree.items.length > 0){
+            var length = controller.tree.items.length;
+            for(var i=0; i<length; i++){
+                setting.cols.forEach(function(col, colIdx){
+                    if(controller.tree.items[i].data.ID){
+                        controller.sheet.setTag(i, colIdx, controller.tree.items[i].data.ID);
+                    }
+                });
+            }
+        }
+    }
+
+    function refreshBtn(controller){
         controller.bind('refreshBaseActn', function (tree) {
             var showButton = function (show, btn) {
                 if (show) {
@@ -293,42 +335,152 @@
             showButton(tree.selected && tree.selected.canDownMove(), $('#downMove'));
             showButton(tree.selected ? true : false, $('#delete'));
         });
-        controller.setTreeSelected(controller.tree.findNode(controller.sheet.getTag(0,0)));
-        nodeOpration(controller);
     }
 
-    function buildJobs(){
-        var jobsSpread = new GC.Spread.Sheets.Workbook($("#spreadJobs")[0], {sheetCount: 1});
-        initSheet(jobsSpread);
-        TREE_SHEET_HELPER.loadSheetHeader(jobsSetting, jobsSpread.getActiveSheet());
+    function rechargeChange(controller){
+        $('#exampleTextarea').bind('change', function(){
+            var newData = $('#exampleTextarea').val();
+            if(controller.tree.selected){
+                rechargeController.updateRechar(controller.tree.selected, newData);
+            }
+        });
+    }
+
+    function jobOperation(controller, jobsSheet, callback){
+        mainAjax.getMaxNumber(billsLibId, 'jobs', function(result){
+            if(result.length === 0){
+                maxJobsNumber = 0;
+            }
+            else {
+                maxJobsNumber = result[0].code;
+            }
+            jobsAjax.getJobContent(billsLibId, function(datas){
+                var totalJobs = createObj.newJobs();
+                totalJobs.loadJobs(controller.tree.items, datas);
+                initData(controller, jobsSheet, jobsSetting, 'jobs');
+                myKey.delKey(jobsSpread, controller, totalJobs, jobsSetting, 'jobs');
+                bindSheet(controller, jobsSheet, 'jobs', jobsSetting);
+                jobsController.editData(controller, jobsSheet, totalJobs, jobsSetting);
+                if (callback){
+                    callback(totalJobs);
+                }
+            });
+        });
     }
 
-    function jobsController(sheet, jobsSetting){
-        jobsAjax.getJobContent(billsLibId, function(jobsArr){
+    function itemOperation(controller, itemsSheet, callback){
+        mainAjax.getMaxNumber(billsLibId, 'items', function(result){
+            if(result.length === 0){
+                maxItemsNumber = 0;
+            }
+            else {
+                maxItemsNumber = result[0].code;
+            }
+            itemsAjax.getItemCharacter(billsLibId, function(datas){
+                var totalItems = createObj.newItems();
+                totalItems.loadItems(controller.tree.items, datas);
+                initData(controller, itemsSheet, itemsSetting, 'items');
+                myKey.delKey(itemsSpread, controller, totalItems, itemsSetting, 'items');
+                bindSheet(controller, itemsSheet, 'items', itemsSetting);
+                itemsController.editData(controller, itemsSheet, totalItems, itemsSetting);
+                if(callback){
+                    callback(totalItems)
+                }
+            });
+        });
+    }
 
-            sheet.bind(GC.Spread.Sheets.Events.EditEnded, function(sender, args){
-                var field, oldData = args.sheet.getValue(args.row, args.col), newData = args.editingText, id = sheet.getTag(args.row, args.col) ;
-                jobsSetting.cols.forEach(function(col, idx){
-                    if(args.col === idx){
-                        field = col.data.field;
+    //初始焦点工作表和项目表绑定数据
+    function initData(controller, sheet, setting, classify){
+        if(controller.tree.selected){
+            var arr = controller.tree.selected[classify];
+            var recharge = controller.tree.selected.data.recharge;
+            if(arr.length > 0){
+                tools.reshowData(sheet, arr, setting, true);
+            }
+            if(recharge){
+                $('#exampleTextarea').val(recharge);
+            }
+        }
+    }
+
+    function bindSheet(controller, sheet, field, setting){
+        controller.sheet.bind(GC.Spread.Sheets.Events.SelectionChanged, function(sender, args){
+            if(controller.tree.selected  && args.oldSelections[0].row !== args.newSelections[0].row|| controller.tree.selected && args.oldSelections[0].row === 0){
+                //rechargeArea
+                $('#exampleTextarea').val(controller.tree.selected.data.recharge);
+                tools.clearData(sheet);
+                if(field === 'jobs'){
+                    var jobs = controller.tree.selected.jobs;
+                    if(jobs.length > 0){
+                        tools.reshowData(sheet, jobs, setting, true);
+                        orgJobData = sheet.getValue(0, 0);
                     }
-                });
-                //create
-                if(!id && !newData){
-                    jobsAjax.createJobContent(billsLibId, field, newData);
                 }
-                //update
-                if(id && newData !== oldData ){
-                    jobsAjax.updateJobContent(id, field, newData);
+                if(field === 'items'){
+                    var items = controller.tree.selected.items;
+                    if(items.length > 0){
+                        tools.reshowData(sheet, items, setting, true);
+                        orgItemData = sheet.getValue(0, 0);
+                    }
                 }
-            });
+            }
+            else {
+                tools.clearData(sheet);
+                $('#exampleTextarea').val('');
+            }
+        });
+    }
+
+    function bindPasteBills(sheet, setting){
+        sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, function(sender, args){
+            var datas = [], field;
+            var orgRow = args.cellRange.row, orgCol = args.cellRange.col, rowCount = args.cellRange.rowCount, colCount = args.cellRange.colCount;
+            var maxRow = orgRow + rowCount - 1, maxCol = orgCol + colCount -1;
+            for(var i=orgRow; i<= maxRow; i++){
+                var id =  sheet.getTag(i, 0, GC.Spread.Sheets.SheetArea.viewport);
+                if(id){
+                    var pasteJson = {billsLibId: billsLibId, ID: id, code: null, name: null, unit: null, ruleText: null};
+                    var colLen = sheet.getColumnCount(GC.Spread.Sheets.SheetArea.viewport);
+                    for(var j=0; j<colLen; j++){
+                        setting.cols.forEach(function(col, colIdx){
+                            if(colIdx === j){
+                                field = col.data.field;
+                            }
+                        });
+                        pasteJson[field] = sheet.getValue(i, j);
+                    }
+                    datas.push(pasteJson);
+                }
+                else {
+                    sheet.clear(i, 0, 1, sheet.getColumnCount(), GC.Spread.Sheets.SheetArea.viewport,GC.Spread.Sheets.StorageType.data);
+                }
+            }
+            billsAjax.pasteBills(datas);
         });
+    }
 
+    function bindPasteRel(sheet, setting){
+        sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, function(sender, args){
+            var orgRow = args.cellRange.row, orgCol = args.cellRange.col, rowCount = args.cellRange.rowCount, colCount = args.cellRange.colCount;
+            var maxRow = orgRow + rowCount - 1, maxCol = orgCol + colCount -1;
+        });
+    }
+
+
+    function buildJobs(jobsSpread, setting){
+        setSheet.initSheet(jobsSpread, setting);
+        setSheet.setMaxRowCount(jobsSpread.getActiveSheet(), 10);
+        myKey.downKey(jobsSpread);
+        myKey.enterKey(jobsSpread);
+        TREE_SHEET_HELPER.loadSheetHeader(jobsSetting, jobsSpread.getActiveSheet());
     }
 
-    function buildItems(){
-        var itemsSpread = new GC.Spread.Sheets.Workbook($("#spreadItems")[0], {sheetCount: 1});
-        initSheet(itemsSpread);
+    function buildItems(itemsSpread, setting){
+        setSheet.initSheet(itemsSpread, setting);
+        setSheet.setMaxRowCount(itemsSpread.getActiveSheet(), 10);
+        myKey.downKey(itemsSpread);
+        myKey.enterKey(itemsSpread);
         TREE_SHEET_HELPER.loadSheetHeader(itemsSetting, itemsSpread.getActiveSheet());
     }
 

+ 0 - 19
web/billsLib/html/test.html

@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>test</title>
-    <script src="../../../lib/jquery/jquery.min.js"></script>
-</head>
-<body>
-    <div id="di">ss</div>
-</body>
-<script>
-    $(document).ready(function(){
-       var test = {a: 1}
-        if(!test.b){
-            alert(1);
-        }
-    });
-</script>
-</html>

+ 115 - 66
web/billsLib/html/tezheng.html

@@ -6,33 +6,33 @@
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
     <title>清单规则编辑器</title>
-    <link rel="stylesheet" href="../../css/bootstrap/bootstrap.min.css">
+    <link rel="stylesheet" href="web/css/bootstrap/bootstrap.min.css">
     <!--<link rel="stylesheet" href="../../web/css/bootstrap/themes.css">-->
-    <link rel="stylesheet" href="../../css/main.css">
-    <link rel="stylesheet" href="../../css/font-awesome/font-awesome.min.css">
+    <link rel="stylesheet" href="web/css/main.css">
+    <link rel="stylesheet" href="web/css/font-awesome/font-awesome.min.css">
     <!--spread-->
-    <link rel="stylesheet" href="../../../web/css/spreadjs/gc.spread.sheets.excel2013white.10.0.1.css">
+    <link rel="stylesheet" href="web/css/spreadjs/gc.spread.sheets.excel2013white.10.0.1.css">
     <!--zTree-->
-    <link rel="stylesheet" href="../../css/ztree/zTreeStyle.css" type="text/css">
+    <link rel="stylesheet" href="web/css/ztree/zTreeStyle.css" type="text/css">
 </head>
 
 <body>
     <div class="header">
         <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 ">
             <span class="header-logo px-2">清单规则编辑器</span>
-            <div class="navbar-text"><a href="main.html">清单规则</a><i class="fa fa-angle-right fa-fw"></i>XXX清单规则</div>
+            <div class="navbar-text"></div>
         </nav>
         <nav class="navbar navbar-toggleable-lg justify-content-between navbar-light p-0">
 
               <ul class="nav nav-tabs" role="tablist">
                   <li class="nav-item">
-                      <a class="nav-link px-3" href="qingdan.html">清单</a>
+                      <a id="aStdBills" class="nav-link px-3" href="stdBills">清单</a>
                   </li>
                   <li class="nav-item">
-                      <a class="nav-link px-3" href="neirong.html">工作内容</a>
+                      <a id="aStdJobs" class="nav-link px-3" href="stdJobs">工作内容</a>
                   </li>
                   <li class="nav-item">
-                      <a class="nav-link active px-3" href="tezheng.html">项目特征</a>
+                      <a class="nav-link active px-3" href="javascript: void(0);">项目特征</a>
                   </li>
               </ul>
         </nav>
@@ -47,7 +47,7 @@
             </div>
             </div>
             <div class="main-side col-lg-5 p-0">
-              <div class="main-data" id="spreadEigenvalue">
+              <div class="main-data" id="spreadEigenvalue" style="width: 95%">
               </div>
             </div>
           </div>
@@ -166,69 +166,118 @@
         </div>
     </div>
     <!-- JS. -->
-    <script src="../../../lib/spreadjs/gc.spread.sheets.all.10.0.1.min.js"></script>
-    <script src="../../../lib/jquery/jquery.min.js"></script>
-    <script src="../../../lib/tether/tether.min.js"></script>
-    <script src="../../../lib/bootstrap/bootstrap.min.js"></script>
-    <script src="..//scripts/global.js"></script>
-    <script src="..//scripts/setSheets.js"></script>
+    <script src="lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
+    <script src="lib/jquery/jquery.min.js"></script>
+    <script src="lib/tether/tether.min.js"></script>
+    <script src="lib/bootstrap/bootstrap.min.js"></script>
+    <script src="web/billsLib/scripts/global.js"></script>
+    <!--<script src="lib/global.js"></script>-->
+    <script src="web/billsLib/scripts/setSheets.js"></script>
+    <script src="web/billsLib/scripts/billsLibAjax.js"></script>
+    <script src="web/billsLib/scripts/tools.js"></script>
+    <script src="public/web/tree_sheet_helper.js"></script>
+    <script src="web/billsLib/scripts/billsLibSetting.js"></script>
+    <script src="web/billsLib/scripts/dbController.js"></script>
     <SCRIPT type="text/javascript">
+        var spread = new GC.Spread.Sheets.Workbook($('#spreadAllItems')[0], {sheetCount: 1});
+        var spreadVal = new GC.Spread.Sheets.Workbook($('#spreadEigenvalue')[0], {sheetCount: 1});
+        var billsLibId = getQueryString('billsLibId');
+        tools.redirect(billsLibId, 'stdBillsmain');
+        var selectedId;
+        var orgValue;
+        var orgItemData;
+        var maxItemsNumber;
   		$(document).ready(function(){
-            buildAllItems();
-            buildEigenvalue();
+            $('#aStdBills').attr('href', function(){
+                return 'stdBills?billsLibId=' + billsLibId;
+            });
+            $('#aStdJobs').attr('href', function(){
+                return 'stdJobs?billsLibId=' + billsLibId;
+            });
+
+            billsAjax.getStdBillsLibName(billsLibId);
+            buildAllItems(spread, totalItemsSetting);
+            buildEigenvalue(spreadVal, eigenValueSetting);
   		});
-        function buildAllItems(){
-            var spread = new GC.Spread.Sheets.Workbook($("#spreadAllItems")[0], {sheetCount: 1});
-            var sheet = spread.getSheet(0);
-            var chRowCount = 2;
-            var vpColCount = 2;
-            var vpRowCount = 28;
-            sheet.suspendPaint();
-            sheet.suspendEvent();
-            initSheet(spread, sheet, chRowCount, vpRowCount, vpColCount);
-            setupItemsColHeader(sheet);
-            //initRowHeight(sheet);
-            setCell(sheet);
-            myCommand(spread, sheet);
-            setScrollBar(spread, sheet, vpRowCount);
-            sheet.resumePaint();
-            sheet.resumeEvent();
+        function buildAllItems(spread, setting){
+            setSheet.initSheet(spread, setting);
+            myKey.downKey(spread);
+            myKey.enterKey(spread);
+            TREE_SHEET_HELPER.loadSheetHeader(setting, spread.getActiveSheet());
+            itemsAjax.getItemCharacter(billsLibId, function(datas){
+                spread.getActiveSheet().suspendPaint();
+                var len = datas.length;
+                for(var i=0; i<len; i++){
+                    if(datas[0].id){
+                        selectedId = datas[0].id;
+                    }
+                    totalItemsSetting.cols.forEach(function(col, colIdx){
+                        spread.getActiveSheet().setTag(i, colIdx, datas[i].id, GC.Spread.Sheets.SheetArea.viewport);
+                        if(datas[i][col.data.field]){
+                            spread.getActiveSheet().getCell(i, colIdx, GC.Spread.Sheets.SheetArea.viewport).value(datas[i][col.data.field]);
+                        }
+                        else {
+                            spread.getActiveSheet().getCell(i, colIdx, GC.Spread.Sheets.SheetArea.viewport).value('');
+                        }
+                    });
+                }
+                //
+                var totalItems = createObj.newItems();
+                totalItems.loadItems(null, datas);
+                initValue(spreadVal.getActiveSheet(), totalItems, eigenValueSetting);
+                tools.getBillsIds(function(ids){
+                    myKey.delKey(spread, ids, totalItems, totalItemsSetting, 'totalItems');
+                    myKey.delKey(spreadVal, null, totalItems, eigenValueSetting, 'itemValue');
+                    bindSheet(totalItems, spread.getActiveSheet(), spreadVal.getActiveSheet(), totalItemsSetting);
+                });
+                //
+                spread.getActiveSheet().resumePaint();
+            });
         }
-        function setupItemsColHeader(sheet){
-            var ch = GC.Spread.Sheets.SheetArea.colHeader;
-            sheet.addSpan(0 ,0, 2, 1, ch);
-            sheet.setValue(0, 0, "编号", ch);
-            sheet.setColumnWidth(0, 200);
-            sheet.addSpan(0 ,1, 2, 1, ch);
-            sheet.setValue(0, 1, "项目特征", ch);
-            sheet.setColumnWidth(1, 850);
+
+        function buildEigenvalue(spread, setting){
+            setSheet.initSheet(spread, setting);
+            setSheet.setMaxRowCount(spread.getActiveSheet(), 10);
+           // setSheet.setEditCol(spread.getActiveSheet(), 1);
+            myKey.downKey(spread);
+            myKey.enterKey(spread);
+            TREE_SHEET_HELPER.loadSheetHeader(setting, spread.getActiveSheet());
         }
 
-        function buildEigenvalue(){
-            var spread = new GC.Spread.Sheets.Workbook($("#spreadEigenvalue")[0], {sheetCount: 1});
-            var sheet = spread.getSheet(0);
-            var chRowCount = 2;
-            var vpColCount = 2;
-            var vpRowCount = 6;
-            sheet.suspendPaint();
-            sheet.suspendEvent();
-            initSheet(spread, sheet, chRowCount, vpRowCount, vpColCount);
-            setupValueColHeader(sheet);
-            //initRowHeight(sheet);
-            setCell(sheet);
-            myCommand(spread, sheet);
-            setScrollBar(spread, sheet, vpRowCount);
-            sheet.resumePaint();
-            sheet.resumeEvent();
+        function bindSheet(totalItems, itemSheet, valueSheet, setting){
+            mainAjax.getMaxNumber(billsLibId, 'items', function(result){
+                if(result.length === 0){
+                    maxItemsNumber = 0;
+                }
+                else {
+                    maxItemsNumber = result[0].code;
+                }
+                orgItemData = itemSheet.getCell(0, 0).value();
+                totalItemsController.eiditData(totalItems, itemSheet, setting);
+            });
+            valueController.editData(totalItems, valueSheet, eigenValueSetting);
+            itemSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, function(sender, args){
+                var itemId = itemSheet.getTag(args.newSelections[0].row, args.newSelections[0].col, GC.Spread.Sheets.SheetArea.viewport);
+                if(itemId && args.oldSelections[0].row !== args.newSelections[0].row|| itemId && args.oldSelections[0].row === 0){
+                    var valueArr = valueController.getValues(totalItems, itemId);
+                    tools.clearData(valueSheet);
+                    selectedId = itemId;
+                    tools.reshowValue(valueSheet, valueArr, eigenValueSetting, true);
+                    orgValue = valueSheet.getValue(0, 0);
+                }
+                else {
+                    tools.clearData(valueSheet);
+                }
+            });
         }
-        function setupValueColHeader(sheet){
-            var ch = GC.Spread.Sheets.SheetArea.colHeader;
-            sheet.addSpan(0 ,0, 2, 1, ch);
-            sheet.setValue(0, 0, "编号", ch);
-            sheet.setColumnWidth(0, 200);
-            sheet.addSpan(0 ,1, 2, 1, ch);
-            sheet.setValue(0, 1, "特征值", ch);
-            sheet.setColumnWidth(1, 550);
+
+        function initValue(sheet, totalItems, setting){
+            if(selectedId){
+                var valueArr = valueController.getValues(totalItems, selectedId);
+                if(valueArr.length > 0){
+                    tools.reshowValue(sheet, valueArr, setting, true);
+                }
+            }
         }
 
   	</SCRIPT>

+ 179 - 16
web/billsLib/scripts/billsLibAjax.js

@@ -2,6 +2,36 @@
  * Created by vian on 2017/3/27.
  */
 var mainAjax = {
+    getMaxNumber: function(billsLibId, field, callback){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/getMaxNumber',
+            data: {data: JSON.stringify({billsLibId: billsLibId, field: field})},
+            dataType: 'json',
+            success: function(result){
+                if(!result.error){
+                    if(callback){
+                        callback(result.data);
+                    }
+                }
+            }
+        });
+    },
+    getABillsLib: function(billsLibId, callback){
+        $.ajax({
+            type: 'post',
+            url: '/stdBillsEditor/getABillsLib',
+            data: {data: JSON.stringify({billsLibId: billsLibId})},
+            dataType: 'json',
+            success: function(result){
+                if(!result.error){
+                    if(callback){
+                        callback(result.data);
+                    }
+                }
+            }
+        });
+    },
     getStdBillsLib: function(userId){
         $.ajax({
             type: "post",
@@ -31,11 +61,11 @@ var mainAjax = {
             }
         });
     },
-    createStdBillsLib: function(billsLibName){
+    createStdBillsLib: function(userId, billsLibName){
         $.ajax({
             type: "POST",
             url: "/stdBillsEditor/createStdBillsLib",
-            data: {data: JSON.stringify({name: billsLibName}) },
+            data: {data: JSON.stringify({userId: userId, name: billsLibName}) },
             dataType: "json",
             success: function(result){
                 if(!result.error){
@@ -99,7 +129,7 @@ var billsAjax = {
             }
         });
     },
-    getBills: function(billsLibId){
+    getBills: function(billsLibId, callback){
         $.ajax({
             type: "post",
             url: "/stdBillsEditor/getBills",
@@ -107,41 +137,58 @@ var billsAjax = {
             dataType: "json",
             success: function(result){
                 if(!result.error){
-                    showBillsSheet(result.data);
+                    if(callback) {
+                        callback(result.data);
+                    }
                 }
             }
         });
     },
-    createBills: function(billsLibId, newId, pid, nid){
+    createBills: function(billsLibId, newId, pid, nid, callback){
         $.ajax({
             type: 'post',
             url: 'stdBillsEditor/createBills',
             data: {data: JSON.stringify({billsLibId: billsLibId, newId: newId, ParentID: pid, NextSiblingID: nid})},
             dataType: 'json',
             success: function(result){
+                if(!result.error){
+                    if(callback){
+                        callback();
+                    }
+                }
             }
         });
     },
-    updatePNId: function(billsLibId, updateId, pid, nid){
+
+    updatePNId: function(billsLibId, updateData, callback){
         $.ajax({
             type: 'post',
             url: 'stdBillsEditor/updatePNId',
-            data: {data: JSON.stringify({billsLibId: billsLibId, updateId: updateId, ParentID: pid, NextSiblingID: nid})},
+            data: {data: JSON.stringify({billsLibId: billsLibId, updateData: updateData})},
             dataType: 'json',
             success: function(result){
-
+                if(!result.error){
+                    if(callback){
+                        callback();
+                    }
+                }
             }
         });
     },
-    deleteBills: function(billsLibId, deleteIds){
+    deleteBills: function(billsLibId, deleteIds, callback){
         $.ajax({
             type: 'post',
             url: 'stdBillsEditor/deleteBills',
             data: {data: JSON.stringify({billsLibId: billsLibId, deleteIds: deleteIds})},
             dataType: 'json',
             success: function(result){
-
+                if(!result.error){
+                    if(callback){
+                        callback();
+                    }
+                }
             }
+
         });
     },
     updateBills: function(billsLibId, updateId, field, data){
@@ -154,6 +201,38 @@ var billsAjax = {
 
             }
         });
+    },
+    updateBillsArr: function(billsLibId, updateId, orgId, newId, type, classify){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/updateBillsArr',
+            data: {data: JSON.stringify({billsLibId: billsLibId, updateId: updateId, orgId: orgId, newId: newId, type: type, classify: classify})},
+            dataType: 'json',
+            success: function(result){
+            }
+        });
+    },
+    pasteBills: function(datas){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/pasteBills',
+            data: {data: JSON.stringify({datas: datas})},
+            dataType: 'json',
+            success: function(result){
+
+            }
+        });
+    },
+    updateRecharge: function(billsLibId, updateIds, data){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/updateRecharge',
+            data: {data: JSON.stringify({billsLibId: billsLibId, updateIds: updateIds, data: data})},
+            dataType: 'json',
+            success: function(result){
+
+            }
+        });
     }
 }
 
@@ -171,25 +250,31 @@ var jobsAjax = {
             }
         });
     },
-    getSomeJobs: function(billsLibId, ids){
+    getSomeJobs: function(billsLibId, ids, callback){
         $.ajax({
             type: 'post',
             url: 'stdBillsEditor/getSomeJobs',
             data: {data: JSON.stringify({billsLibId: billsLibId, ids: ids})},
             dataType: 'json',
             success: function(result){
-
+                if(!result.error && callback){
+                    callback(result.data);
+                }
             }
         });
     },
-    createJobContent: function(billsLibId, field, data){
+    createJobContent: function(billsLibId, field, data, serialNo, callback){
         $.ajax({
             type: 'post',
             url: 'stdBillsEditor/createJobContent',
-            data: {data: JSON.stringify({billsLibId: billsLibId, field: field, data: data})},
+            data: {data: JSON.stringify({billsLibId: billsLibId, field: field, data: data, serialNo: serialNo })},
             dataType: 'json',
             success: function(result){
-
+                if(!result.error){
+                    if(callback){
+                        callback(result.data);
+                    }
+                }
             }
         });
     },
@@ -198,7 +283,18 @@ var jobsAjax = {
             type: 'post',
             url: 'stdBillsEditor/updateJobContent',
             data: {data: JSON.stringify({updateId: id, field: field, data: data })},
-            dataTypea: 'json',
+            dataType: 'json',
+            success: function(result){
+
+            }
+        });
+    },
+    deleteJobContent: function(ids){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/deleteJobContent',
+            data: {data: JSON.stringify({ids: ids})},
+            dataType: 'json',
             success: function(result){
 
             }
@@ -206,3 +302,70 @@ var jobsAjax = {
     }
 }
 
+var itemsAjax = {
+    getItemCharacter: function(billsLibId, callback){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/getItemCharacter',
+            data: {data: JSON.stringify({billsLibId: billsLibId})},
+            dataType: 'json',
+            success: function(result){
+                if(!result.error){
+                    if(callback){
+                        callback(result.data);
+                    }
+                }
+            }
+        });
+    },
+    createItemCharacter: function(billsLibId, field, data, serialNo, callback){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/createItemCharacter',
+            data: {data: JSON.stringify({billsLibId: billsLibId, field: field, data: data, serialNo: serialNo})},
+            dataType: 'json',
+            success: function(result){
+                if(!result.error){
+                    if(callback){
+                        callback(result.data);
+                    }
+                }
+            }
+        });
+    },
+    updateItemCharacter: function(id, field, data){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/updateItemCharacter',
+            data: {data: JSON.stringify({updateId: id, field: field, data: data })},
+            dataType: 'json',
+            success: function(result){
+
+            }
+        });
+    },
+    updateValue: function(id, data, deleteCodes, type){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/updateValue',
+            data: {data: JSON.stringify({updateId: id, data: data, type: type, deleteCodes: deleteCodes})},
+            dataType: 'json',
+            success: function(reslut){
+
+            }
+        });
+    },
+    deleteItemCharacter: function(ids){
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/deleteItemCharacter',
+            data: {data: JSON.stringify({ids: ids})},
+            dataType: 'json',
+            success: function(result){
+
+            }
+        });
+    }
+}
+
+

+ 131 - 2
web/billsLib/scripts/billsLibSetting.js

@@ -142,7 +142,7 @@ var itemsSetting = {
         },
         {
             head: {
-                titleNames: ['项目 特征'],
+                titleNames: ['项目特征'],
                 spanCols: [1],
                 spanRows: [2],
                 vAlign: [1, 1],
@@ -150,7 +150,7 @@ var itemsSetting = {
                 font: '16px Arial'
             },
             data: {
-                field: 'character',
+                field: 'content',
                 vAlign: 1,
                 hAlign: 0,
                 font: '14px Arial'
@@ -162,4 +162,133 @@ var itemsSetting = {
     headRowHeight: [20, 30, 30],
     emptyRows: 3,
     treeCol: 0
+};
+
+var totalJobsSetting = {
+    cols:[
+        {
+            head: {
+                titleNames: ['编号'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: '16px Arial'
+            },
+            data: {
+                field: 'code',
+                vAlign: 1,
+                hAlign: 0,
+                font: '14px Arial'
+            },
+            width: 200
+        },
+        {
+            head: {
+                titleNames: ['工作内容'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: '16px Arial'
+            },
+            data: {
+                field: 'content',
+                vAlign: 1,
+                hAlign: 0,
+                font: '14px Arial'
+            },
+            width: 850
+        },
+    ],
+    headRows: 2,
+    headRowHeight: [20, 30, 30],
+    emptyRows: 3,
+    treeCol: 0
+};
+
+var totalItemsSetting = {
+    cols:[
+        {
+            head: {
+                titleNames: ['编号'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: '16px Arial'
+            },
+            data: {
+                field: 'code',
+                vAlign: 1,
+                hAlign: 0,
+                font: '14px Arial'
+            },
+            width: 200
+        },
+        {
+            head: {
+                titleNames: ['项目特征'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: '16px Arial'
+            },
+            data: {
+                field: 'content',
+                vAlign: 1,
+                hAlign: 0,
+                font: '14px Arial'
+            },
+            width: 850
+        },
+    ],
+    headRows: 2,
+    headRowHeight: [20, 30, 30],
+    emptyRows: 3,
+    treeCol: 0
+};
+
+var eigenValueSetting = {
+    cols:[
+        {
+            head: {
+                titleNames: ['编号'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: '16px Arial'
+            },
+            data: {
+                field: 'code',
+                vAlign: 1,
+                hAlign: 0,
+                font: '14px Arial'
+            },
+            width: 200
+        },
+        {
+            head: {
+                titleNames: ['特征值'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: '16px Arial'
+            },
+            data: {
+                field: 'value',
+                vAlign: 1,
+                hAlign: 0,
+                font: '14px Arial'
+            },
+            width: 480
+        },
+    ],
+    headRows: 2,
+    headRowHeight: [20, 30, 30],
+    emptyRows: 3,
+    treeCol: 0
 }

File diff suppressed because it is too large
+ 1030 - 31
web/billsLib/scripts/dbController.js


+ 198 - 68
web/billsLib/scripts/setSheets.js

@@ -1,51 +1,34 @@
 /**
  * Created by vian on 2017/3/16.
  */
-
-function initSheet(spread){
-    var spreadNS = GC.Spread.Sheets, sheet = spread.getActiveSheet();
-    spread.options.showHorizontalScrollbar = false;
-    spread.options.showVerticalScrollbar =false;
-    spread.options.tabStripVisible = false;
-    spread.options.scrollbarMaxAlign = true;
-    sheet.showRowOutline(false);
-    sheet.defaults.rowHeight = 30;
-}
-
-function initHeader(spread, setting){
-    var sheet = spread.getActiveSheet();
-    sheet.setColumnCount(setting.cols.length);
-    sheet.setRowCount();
-}
-
-function setCell(sheet){
-    var colCount = sheet.getColumnCount();
-    var vp = GC.Spread.Sheets.SheetArea.viewport;
-    var center = GC.Spread.Sheets.VerticalAlign.center;
-    var left =  GC.Spread.Sheets.HorizontalAlign.left;
-    for(var i= 0; i<colCount; i++){
-        sheet.getRange(-1, i, -1, 1, vp).vAlign(center);
-        sheet.getRange(-1, i, -1, 1, vp).hAlign(left);
-        sheet.getRange(-1, i, -1, 1, vp).font("12pt ����");
+var setSheet = {
+    initSheet: function(spread, setting){
+        var spreadNS = GC.Spread.Sheets, sheet = spread.getActiveSheet();
+        sheet.suspendPaint();
+        spread.options.showHorizontalScrollbar = false;
+        spread.options.showVerticalScrollbar =false;
+        spread.options.tabStripVisible = false;
+        spread.options.scrollbarMaxAlign = true;
+        sheet.showRowOutline(false);
+        sheet.defaults.rowHeight = 30;
+        setting.cols.forEach(function(col, colIdx){
+            sheet.getRange(-1,colIdx,-1,1, GC.Spread.Sheets.SheetArea.viewport).hAlign(GC.Spread.Sheets.HorizontalAlign.left);
+            sheet.getRange(-1,colIdx,-1,1, GC.Spread.Sheets.SheetArea.viewport).vAlign(GC.Spread.Sheets.VerticalAlign.center);
+            sheet.getRange(-1,colIdx,-1,1, GC.Spread.Sheets.SheetArea.viewport).textIndent(0.5);
+        });
+        sheet.resumePaint();
+    },
+    setEditCol: function(sheet, colIdx){
+        var style = new GC.Spread.Sheets.Style();
+        style.locked = false;
+        sheet.setStyle(-1, colIdx, style);
+        sheet.options.isProtected = true;
+    },
+    setMaxRowCount: function(sheet, rowCount){
+        sheet.setRowCount(rowCount, GC.Spread.Sheets.SheetArea.viewport);
     }
 }
 
-function setupEvents(spread, sheet){
-    var events = GC.Spread.Sheets.Events;
-    $("#aDelete").click(function(){
-        var rowIdx = sheet.getActiveRowIndex();
-        sheet.deleteRows(rowIdx, 1);
-    });
-
-   sheet.bind(events.EditEnded, function(e, args){
-       var editRow = args.row;
-       var editCol = args.col;
-       var eiditVal = sheet.getValue(editRow, editCol);
-        console.log("EE: row: "+editRow+"  col: "+editCol +"val: "+eiditVal);
-    });
-
-}
-
 function setScrollBar(spread, sheet, initRow){
     var events = GC.Spread.Sheets.Events;
     sheet.bind(events.EnterCell, function(e, data){
@@ -60,32 +43,179 @@ function setScrollBar(spread, sheet, initRow){
     });
 }
 
+var myKey = {
+    enterKey: function(spread){
+        var sheet = spread.getActiveSheet();
+        spread.commandManager().register("myEnter", function(){
+            var idxRow = sheet.getActiveRowIndex();
+            var rowCount = sheet.getRowCount();
+            if(idxRow+1 == rowCount){
+                sheet.addRows(rowCount, 1);
+                sheet.setRowHeight(rowCount, 30);
+                sheet.getRange(rowCount, -1, 1, -1).vAlign(GC.Spread.Sheets.VerticalAlign.center);
+                sheet.getRange(rowCount, -1, 1, -1).hAlign(GC.Spread.Sheets.HorizontalAlign.left);
+                sheet.getRange(rowCount, -1, 1, -1).textIndent(0.5);
+                sheet.getRange(rowCount, -1, 1, -1).font("14px Arial");
+            }
+        });
+        spread.commandManager().setShortcutKey("myEnter", GC.Spread.Commands.Key.enter, false, false, false, false);
+    },
 
-function myCommand(spread, sheet){
-    var keys = GC.Spread.Commands.Key;
-    //enter,���һ�лس����������
-    spread.commandManager().register("myEnter", function(){
-        var idxRow = sheet.getActiveRowIndex();
-        var rowCount = sheet.getRowCount();
-        if(idxRow+1 == rowCount){
-            sheet.addRows(rowCount, 1);
-            sheet.setRowHeight(rowCount, 30);//�����и�
-            sheet.getRange(rowCount, -1, 1, -1).vAlign(GC.Spread.Sheets.VerticalAlign.center);
-            sheet.getRange(rowCount, -1, 1, -1).font("10pt ΢���ź�");
+    downKey: function(spread){
+        var sheet = spread.getActiveSheet();
+        spread.commandManager().register("myDown", function(){
+            var idxRow = sheet.getActiveRowIndex();
+            var rowCount = sheet.getRowCount();
+            if(idxRow+1 == rowCount){
+                sheet.suspendPaint();
+                sheet.addRows(rowCount, 1);
+                sheet.setRowHeight(rowCount, 30);
+                sheet.getRange(rowCount, -1, 1, -1).vAlign(GC.Spread.Sheets.VerticalAlign.center);
+                sheet.getRange(rowCount, -1, 1, -1).hAlign(GC.Spread.Sheets.HorizontalAlign.left);
+                sheet.getRange(rowCount, -1, 1, -1).textIndent(0.5);
+                sheet.getRange(rowCount, -1, 1, -1).font("14px Arial");
+                sheet.resumePaint();
+            }
+        });
+        spread.commandManager().setShortcutKey("myDown", GC.Spread.Commands.Key.down, false, false, false, false);
+    },
+
+
+    delKey: function(spread, controller, totalObj, setting, classify){
+        if(classify === 'jobs' || classify === 'items'){
+            bindRefDel(spread, controller, totalObj, setting, classify);
         }
-    });
-    spread.commandManager().setShortcutKey("myEnter", keys.enter, false, false, false, false);
-    spread.commandManager().register("myDown", function(){
-        var idxRow = sheet.getActiveRowIndex();
-        var rowCount = sheet.getRowCount();
-        if(idxRow+1 == rowCount){
-            sheet.suspendPaint();
-            sheet.addRows(rowCount, 1);
-            sheet.setRowHeight(rowCount, 30);//�����и�
-            sheet.getRange(rowCount, -1, 1, -1).vAlign(GC.Spread.Sheets.VerticalAlign.center);
-            sheet.getRange(rowCount, -1, 1, -1).font("10pt ΢���ź�");
-            sheet.resumePaint();
+        else if(classify === 'totalJobs'){
+            bindTotalJobDel(spread, controller, totalObj, setting);
         }
-    });
-    spread.commandManager().setShortcutKey("myDown", keys.down, false, false, false, false);
-}
+        else if(classify === 'totalItems'){
+            bindTotalItemDel(spread, spreadVal.getActiveSheet(), controller, totalObj, setting);
+        }
+        else if(classify === 'itemValue'){
+            bindValDel(spread, totalObj, setting);
+        }
+        else if(!classify){
+            rejectDel(spread);
+        }
+
+        function bindRefDel(spread, controller, totalObj, setting, classify){
+            var sheet = spread.getActiveSheet();
+            spread.commandManager().register('myDelete', function(){
+                spread.suspendEvent();
+                var ids = tools.delIds(sheet);
+                console.log(ids);
+                tools.deleteELes(controller.tree.selected[classify], ids, function(result){
+                    //deleteFrontData
+                    tools.reshowData(sheet, controller.tree.selected[classify], setting, true);
+                    //deleteDB
+                    billsAjax.updateBillsArr(billsLibId, controller.tree.selected.getID(), ids, null, 'delete', classify);
+                    if(result.length > 0){
+                        if(classify === 'jobs'){
+                            result.forEach(function(id){
+                                if(totalObj.findJob(id)){
+                                    totalObj.jobsArr.splice(totalObj.jobsArr.indexOf(totalObj.findJob(id)), 1);
+                                    delete  totalObj.jobs[totalObj.prefix + id];
+                                }
+                            });
+                            jobsAjax.deleteJobContent(result);
+                        }
+                        else {
+                            result.forEach(function(id){
+                                if(totalObj.findItem(id)){
+                                    totalObj.itemsArr.splice(totalObj.itemsArr.indexOf(totalObj.findItem(id)), 1);
+                                    delete totalObj.items[totalObj.prefix + id];
+                                }
+                            });
+                            itemsAjax.deleteItemCharacter(result);
+                        }
+                    }
+                });
+                spread.resumeEvent();
+            });
+            spread.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
+            spread.commandManager().setShortcutKey('myDelete', GC.Spread.Commands.Key.del, false, false, false, false);
+        }
+
+        function rejectDel(spread){
+            var sheet = spread.getActiveSheet();
+            spread.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
+        }
+
+        function bindTotalJobDel(spread, billsIds, totalJobs, setting){
+            var sheet = spread.getActiveSheet();
+            spread.commandManager().register('myJobDelete', function(){
+                spread.suspendEvent();
+                var ids = tools.delIds(sheet);
+                if(ids.length > 0){
+                    ids.forEach(function(id){
+                        var job = totalJobs.findJob(id);
+                        totalJobs.jobsArr.splice(totalJobs.jobsArr.indexOf(job), 1);
+                    });
+                    tools.reshowData(sheet, totalJobs.jobsArr, setting, true);
+                    jobsAjax.deleteJobContent(ids);
+                    billsAjax.updateBillsArr(billsLibId, billsIds, ids, null, 'deleteAll', 'jobs');
+                }
+                spread.resumeEvent();
+            });
+            spread.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
+            spread.commandManager().setShortcutKey('myJobDelete', GC.Spread.Commands.Key.del, false, false, false, false)
+        }
+
+        function bindTotalItemDel(spread, valSheet, billsIds, totalItems, setting){
+            var sheet = spread.getActiveSheet();
+            spread.commandManager().register('myItemDelete', function(){
+                spread.suspendEvent();
+                var ids = tools.delIds(sheet);
+                if(ids.length > 0){
+                    ids.forEach(function(id){
+                        var item = totalItems.findItem(id);
+                        totalItems.itemsArr.splice(totalItems.itemsArr.indexOf(item), 1);
+                    });
+                    tools.reshowData(sheet, totalItems.itemsArr, setting, true);
+                    itemsAjax.deleteItemCharacter(ids);
+                    billsAjax.updateBillsArr(billsLibId, billsIds, ids, null, 'deleteAll', 'items');
+                    //reshowVal
+                    if(totalItems.itemsArr.length > 0){
+                        selectedId = totalItems.itemsArr[0].data.id;
+                        tools.reshowValue(valSheet, totalItems.itemsArr[0].data.itemValue, eigenValueSetting, true);
+                    }
+                    else {
+                        tools.clearData(valSheet);
+                    }
+                }
+                spread.resumeEvent();
+            });
+            spread.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
+            spread.commandManager().setShortcutKey('myItemDelete', GC.Spread.Commands.Key.del, false, false, false, false)
+        }
+
+        function bindValDel(spread, totalItems, setting){
+            var sheet = spread.getActiveSheet();
+            spread.commandManager().register('valDelete', function(){
+                spread.suspendEvent();
+                var ids = tools.delIds(sheet);
+                //deleteFront
+                var valsArr = valueController.getValues(totalItems, selectedId);
+                ids.forEach(function(id){
+                    valsArr.forEach(function(val){
+                        if(val.code === id){
+                            valsArr.splice(valsArr.indexOf(val), 1);
+                        }
+                    });
+                });
+                tools.reshowValue(sheet, valsArr, setting, true);
+                //deleteDb
+                itemsAjax.updateValue(selectedId, null, ids, 'delete');
+                spread.resumeEvent();
+            });
+            spread.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
+            spread.commandManager().setShortcutKey('valDelete', GC.Spread.Commands.Key.del, false, false, false, false);
+        }
+
+        function reSerialNo(){
+
+        }
+
+    }
+}
+

+ 1 - 0
web/main/html/main.html

@@ -525,6 +525,7 @@
 
     <script type="text/javascript" src="public/web/idTree.js"></script>
     <script type="text/javascript" src="web/main/js/models/cache_tree.js"></script>
+    <script type="text/javascript" src="/test/tmp_data/data_15690.js"></script>
     <!-- Controller -->
     <script type="text/javascript" src="public/web/tree_sheet_controller.js"></script>
     <script type="text/javascript" src="public/web/tree_sheet_helper.js"></script>

+ 3 - 4
web/main/js/models/project.js

@@ -29,16 +29,16 @@ var PROJECT = {
                 }
             });
             me._project.loadMainTree();
-            me.test(result[0].data[0]);
+            //me.test(result[0].data[0]);
             callback(0);
         };
-        tools.test = function(data){
+        /*tools.test = function(data){
             me._project.beginUpdate('修改名称');
             data.name = 'test';
             data['updateType'] = 'ut_update';
             me._project.push(ModuleNames.bills, [data]);
             me._project.endUpdate();
-        };
+        };*/
 
         // 所有通过this访问的属性,都不应在此单元外部进行写入操作
         var project = function () {
@@ -49,7 +49,6 @@ var PROJECT = {
             this.Ration = Ration.createNew(this);
             this.GLJ = GLJ.createNew(this);
 
-
             this.masterField = {ration: 'billsItemID'};
         };
 

+ 0 - 172
web/rationLibEditor/_zSpread.js

@@ -1,172 +0,0 @@
-/**
- * Created by Syusuke on 2017/3/17.
- *
- */
-(function($){
-    var _spSetting = {
-        spType:"",
-        header:[],
-        view:{
-            comboBox:[],
-            lockedCells:[]
-        },
-        private:{
-            spType:"",
-            colCount:0,
-            sectionSelected:null,
-            cellPrimValue:null,
-            cellCurrValue:null
-        }
-    }
-
-    _tools = {
-        isArray:function(arr){
-            return Object.prototype.toString.apply(arr) === "[object Array]"
-        },
-        clone:function(obj){  //���colon����  �������ֱ����ȸ��ƣ����󲻿���
-            if(obj===null) return null;
-            var o = _tools.isArray(obj)?[]:{};
-            for(var i in obj){
-                o[i] = (obj[i] instanceof Date) ? new Date(obj[i].getTime()): (typeof obj[i] === "object"? _tools.clone(obj[i]): obj[i]);
-            }
-            return o;
-        }
-    }
-
-
-    var _initSpread = function(spID,spSetting){
-        spSetting.private.colCount = spSetting.header.length;
-        spSetting.private.spType = spSetting.spType;
-        var spread = new GC.Spread.Sheets.Workbook(spID[0],{sheetCount:1});
-        var ActiveSheet = spread.getActiveSheet();
-        ActiveSheet.setColumnCount(spSetting.header.length, GC.Spread.Sheets.SheetArea.viewport);
-        ActiveSheet.options.isProtected = true;
-        ActiveSheet.getRange(-1, 0, -1 ,100, GC.Spread.Sheets.SheetArea.viewport).locked(false);
-        spread.options.tabStripVisible = false;
-        spread.options.scrollbarMaxAlign = false;
-        for(var i=0;i<spSetting.header.length;i++){
-            ActiveSheet.setValue(0, i, spSetting.header[i].headerName, GC.Spread.Sheets.SheetArea.colHeader);
-            ActiveSheet.setColumnWidth(i,spSetting.header[i].headerWidth, GC.Spread.Sheets.SheetArea.colHeader);
-        }
-        for(var i=0;i<spSetting.view.comboBox.length;i++){
-                var c = spSetting.view.comboBox[i]
-                var cellType = new GC.Spread.Sheets.CellTypes.ComboBox();
-                cellType.items(c.items);
-                ActiveSheet.getRange(c.row,c.col,c.rowCount,c.colCount, GC.Spread.Sheets.SheetArea.viewport).cellType(cellType);
-            }
-        ActiveSheet.getRange(-1, 1, -1 , 100, GC.Spread.Sheets.SheetArea.viewport).locked(true);
-
-        ActiveSheet.bind(GC.Spread.Sheets.Events.EditStarting,function(sender,args){
-            spSetting.private.cellCurrValue = null;
-            spSetting.private.cellPrimValue = ActiveSheet.getValue(args.row,args.col);
-        })
-
-        ActiveSheet.bind(GC.Spread.Sheets.Events.EditEnding,function(sender,args){
-            spSetting.private.cellCurrValue = args.editingText;
-            if(args.col == 0){
-                var a = spSetting.view.lockedCells;
-                var b = [];
-                ActiveSheet.getRange(args.row, 1, 1 , 100, GC.Spread.Sheets.SheetArea.viewport).locked(args.editingText == null);
-                a.forEach(function(x){
-                    b.push(x.col);
-                })
-                b.forEach(function(x){
-                    ActiveSheet.getCell(args.row,x).locked(true);
-                });
-                if(args.editingText == null){
-                    removeAction(spSetting)
-                   for(var i=0;i<spSetting.private.colCount;i++){
-                       ActiveSheet.setValue(args.row,i,null);
-                   }
-                }else{
-                    insertAction(spSetting,function(status){
-                        if(status == 204)
-                            ActiveSheet.setValue(args.row,0,null)
-                        spSetting.private.cellCurrValue = null;
-                        spSetting.private.cellPrimValue = null;
-                    });
-                }
-            }else
-           // var code = ActiveSheet.getValue(args.row,0);
-            {
-                var data = [];
-                for(var i=0;i<spSetting.header.length;i++){
-                    data.push(ActiveSheet.getValue(args.row,i))
-                }
-                data[args.col] = args.editingText
-                updateAction(spSetting,data);
-            }
-        })
-        return spread;
-    }
-    function insertAction(spSetting,callback){
-        var value =JSON.stringify(spSetting.private);
-        $.ajax({
-            type:"POST",
-            url:"http://localhost:6060/rationLibEditor/insert" + spSetting.private.spType,
-            data:{"rationLibName":params.realLibName,"value":value},
-            dataType:"json",
-            cache:false,
-            timeout:50000,
-            success:function(result,textStatus,status){
-                if(status.status == 204){
-                    alert("编号为"+spSetting.private.cellCurrValue+"已存在,不可重复添加!")
-                    callback(status.status)
-                }
-
-                spSetting.private.cellCurrValue = null;
-                spSetting.private.cellPrimValue = null;
-            },
-            error:function(err){
-                alert(err.statusText);
-                spSetting.private.cellCurrValue = null;
-                spSetting.private.cellPrimValue = null;
-            }
-        })
-    }
-    function updateAction(spSetting,data){
-        var value = JSON.stringify(spSetting.private);
-        var datas = JSON.stringify(data);
-        $.ajax({
-            type:"POST",
-            url:"http://localhost:6060/rationLibEditor/update" + spSetting.private.spType,
-            data:{"rationLibName":params.realLibName,"value":value,"data":datas},
-            dataType:"json",
-            cache:false,
-            timeout:50000,
-            success:function(result,textStatus,status){
-                spSetting.private.cellCurrValue = null;
-                spSetting.private.cellPrimValue = null;
-            },
-            error:function(err){
-                alert(err.responseText.error)
-                spSetting.private.cellCurrValue = null;
-                spSetting.private.cellPrimValue = null;
-            }
-        })
-    }
-    function removeAction(spSetting){
-        var value = JSON.stringify(spSetting.private);
-        $.ajax({
-            type:"POST",
-            url:"http://localhost:6060/rationLibEditor/remove" + spSetting.private.spType,
-            data:{"rationLibName":params.realLibName,"value":value},
-            dataType:"json",
-            cache:false,
-            timeout:50000,
-            success:function(result){
-                spSetting.private.cellCurrValue = null;
-                spSetting.private.cellPrimValue = null;
-            },
-            error:function(){
-            }
-        })
-    }
-    $.fn.Spread = {
-        init:function(spID,zSetting){
-            var spSetting = _tools.clone(_spSetting);
-            $.extend(true,spSetting,zSetting);
-            return  _initSpread(spID,spSetting);
-        }
-    }
-}(jQuery))

+ 23 - 541
web/rationLibEditor/dinge.html

@@ -52,7 +52,7 @@
                           <a onclick="zTreeOprObj.addRootNode()" class="btn btn-secondary btn-sm">增加根节点</a>
                       </div>
                     <div class="tab-content">
-                      <ul id="treeDemo" class="ztree"></ul>
+                      <ul id="rationChapterTree" class="ztree"></ul>
                     </div>
                   </div>
                   <div class="main-content col-lg-9 p-0">
@@ -877,39 +877,26 @@
   	<script type="text/javascript" src="/lib/ztree/jquery.ztree.core.js"></script>
   	<script type="text/javascript" src="/lib/ztree/jquery.ztree.excheck.js"></script>
     <script type="text/javascript" src="/lib/ztree/jquery.ztree.exedit.js"></script>
-    <script type="text/javascript" src="/web/rationLibEditor/_zSpread.js"></script>
-    <script type="text/javascript" src="/web/rationLibEditor/js/dinge.js"></script>
+    <script type="text/javascript" src="/web/rationLibEditor/js/chapterTree.js"></script>
+    <script type="text/javascript" src="/web/rationLibEditor/js/sheetCommon.js"></script>
+    <script type="text/javascript" src="/web/rationLibEditor/js/ration.js"></script>
+    <script type="text/javascript" src="/web/rationLibEditor/js/rationGLJ.js"></script>
     <script type="text/javascript" src="/public/web/treeDataHelper.js"></script>
-    <SCRIPT type="text/javascript">
-/*var rationName = getQueryString("rationname");*/
-var treeObj;
-var zNodes =[
-    { id:1, pId:-1,nId:2, name:"第一章 土石方工程",isParent:true, items:[]},
-    { id:2, pId:-1,nId:3, name:"第二章 挡墙、护坡工程",isParent:true,items:[]},
-    { id:3, pId:-1,nId:4, name:"第三章 基础工程",isParent:true,items:[]},
-    { id:4, pId:-1,nId:5, name:"第四章 脚手架工程",isParent:true,items:[]},
-    { id:5, pId:-1,nId:6, name:"第五章 砌筑工程",isParent:true,items:[]},
-    { id:6, pId:-1,nId:7, name:"第六章 混凝土及钢筋混凝土工程",isParent:true,items:[]},
-    { id:7, pId:-1,nId:8, name:"第七章 金属工程",isParent:true,items:[]},
-    { id:8, pId:-1,nId:9, name:"第八章 门窗、木结构",isParent:true,items:[]},
-    { id:9, pId:-1,nId:10, name:"第九章 楼地面工程",isParent:true,items:[]},
-    { id:10, pId:-1,nId:11, name:"第十章 层面工程",isParent:true,items:[]},
-    { id:11, pId:-1,nId:12, name:"第十一章 防腐隔热保温工程",isParent:true,items:[]},
-    { id:12, pId:-1,nId:13, name:"第十二章 装饰工程",isParent:true,items:[]},
-    { id:13, pId:-1,nId:-1, name:"第十三章 其他工程",isParent:true,items:[]},
-];
-var setting = {
+    <script type="text/javascript">
+
+        var setting = {
     view: {
         //	showIcon: showIconForTree,//已存在*/
-        addHoverDom: addHoverDom,
-        removeHoverDom: removeHoverDom,
+        addHoverDom: zTreeOprObj.addHoverDom,
+        removeHoverDom: zTreeOprObj.removeHoverDom,
+        expandSpeed: "",
         selectedMulti: false
     },
     edit: {
         enable: true,
         editNameSelectAll: true,
-        showRemoveBtn: showRemoveBtn,
-        showRenameBtn: showRenameBtn
+        showRemoveBtn: true,
+        showRenameBtn: true
     },
     data: {
         keep: {
@@ -927,528 +914,23 @@ var setting = {
         }
     },
     callback:{
-        //onClick:SectionClick,
-        beforeDrag: beforeDrag,
-        beforeEditName: beforeEditName,
-        //beforeRemove: beforeRemove,
-        beforeRename: beforeRename,
-        //beforeClick:beforeClick,
+        onClick: zTreeOprObj.onClick,
+        beforeDrag: zTreeOprObj.beforeDrag,
+        beforeRename: zTreeOprObj.beforeRename,
         beforeRemove: zTreeOprObj.onBeforeRemove,
-        //onRemove: onRemove,
+        onRemove: zTreeOprObj.onRemove,
         onRename: zTreeOprObj.onRename
     }
-}; //ztree  setting
-var log, className = "dark";
-var properties = {
-}
-//点击树获取定额
-function SectionClick(event,treeId,treeNode){
-    var sectionID = treeNode.id;
-    properties.selectedSection =sectionID
-    getRationItems(sectionID);
-}
-function beforeDrag(treeId, treeNodes) {
-    return false;
-}
-function beforeEditName(treeId, treeNode) {
-    className = (className === "dark" ? "":"dark");
-    var zTree = $.fn.zTree.getZTreeObj("treeDemo");
-    zTree.selectNode(treeNode);
-    zTree.editName(treeNode);
-    return false;
-}
-function beforeClick(treeID,treeNode){
-    return (treeNode.level == 2);
-}
-function beforeRemove(treeId, treeNode) {
-    var zTree = $.fn.zTree.getZTreeObj("treeDemo");
-    zTree.selectNode(treeNode);
-    return true;
-}
-//删除树节点事件
-
-//级联删除章节点
-function caseDeleteTreeNode(arryObj){
-    for(var i=0;i<arryObj.length;i++){
-        {
-            $.ajax({
-                type:"POST",
-                url:"http://localhost:6060/ration/deleteRation",
-                data:{"rationName": rationName,"value":arryObj[i].RationCode},
-                async:false,
-                dataType:"json",
-                cache:false,
-                timeout:1000,
-                success:function(result){
-
-                },
-                error:function(){
-                    alert("nima")
-                }
-            })
-        }
-    }
-}
-//删除树节点ajax函
-function removeSection(id){
-    $.ajax({
-        type:"POST",
-        url:"http://localhost:6060/ration/removeSection",
-        data:{"rationName":rationName,"rationSection":id},
-        dataType:"json",
-        cache:false,
-        timeout:1000,
-        success:function(result){
-        },
-        error:function(){
-        }
-    })
-}
-function beforeRename(treeId, treeNode, newName, isCancel) {
-    className = (className === "dark" ? "":"dark");
-    if (newName.length == 0) {
-        setTimeout(function() {
-            var zTree = $.fn.zTree.getZTreeObj("treeDemo");
-            zTree.cancelEditName();
-            alert("节点名称不能为空.");
-        }, 0);
-        return false;
-    }
-    return true;
-}
-function showRemoveBtn(treeId, treeNode) {
-    return true
-}
-function showRenameBtn(treeId, treeNode) {
-    return true
-}
-function getTime() {
-    var now= new Date(),
-            h=now.getHours(),
-            m=now.getMinutes(),
-            s=now.getSeconds(),
-            ms=now.getMilliseconds();
-    return (h+":"+m+":"+s+ " " +ms);
-}
-
-
-function removeHoverDom(treeId, treeNode) {
-    $("#addBtn_"+treeNode.tId).unbind().remove();
 };
-function selectAll() {
-    var zTree = $.fn.zTree.getZTreeObj("treeDemo");
-    zTree.setting.edit.editNameSelectAll =  $("#selectAll").attr("checked");
-}
-
-
-//新增定额事件
-$("#mkadd").click(function(){
-    var section = treeObj.getSelectedNodes();
-    if(!section.length){
-        alert("请选择需要添加定额的章节!")
-        return;
-    }
-})
-$("#mkaddglj").click(function() {
-    var s = $("#gljparam").val()
-    if (!s) {
-        alert("请选择需要添加工料机的定额!")
-        return;
-    }
-})
-$("#rationAdd").click(function(){
-    var section = treeObj.getSelectedNodes();
-    var rationItem = {};
-    var code,name,danwei,jijia,xsname,qfzy;
-    code = $("#code").val();name = $("#name").val();danwei=$("#danwei").val();jijia = $("#jijia").val();xsname = $("#xsname").val();qfzy=$("#qfzy").val();
-    rationItem.RationCode = code;
-    rationItem.RationName = name;
-    rationItem.Unit = danwei;
-    rationItem.BasePrice = Number(jijia);
-    rationItem.SectionID = section[0].id;
-    rationItem.ContentID = 0;
-    rationItem.Caption = xsname;
-    rationItem.FeeType = Number(qfzy)
-    saveRationItem(rationItem);
-/*    bindRationDelete()
-    bindRationClick();*/
-})
-//保存定额条目Ajax函数
-function saveRationItem(obj){
-    var rationItem = JSON.stringify(obj)
-    $.ajax({
-        type:"POST",
-        url:"http://localhost:6060/rationLibEditor/saveRationItem",
-        data:{"rationName":rationName,"rationItem":rationItem},
-        dataType:"json",
-        cache:false,
-        timeout:1000,
-        success:function(result){
-            getRationItems(properties.selectedSection);
-        },
-        error: function(jqXHR, textStatus, errorThrown){
-          var err = JSON.parse(jqXHR.responseText);
-            alert(err.error);
-        }
-    })
-}
-//获取定额条目Ajax函数
-function getRationItems(sectionID){
-    $("#rationTbody").html("")
-    $.ajax({
-        type:"POST",
-        url:"http://localhost:6060/ration/getRationsBySectionID",
-        data:{"rationName": rationName,"sectionID": sectionID},
-        dataType:"json",
-        cache:false,
-        timeout:1000,
-        success:function(result){
-            if(result){
-                showRationItems(result.data);
-            }
-
-        },
-        error:function(){
-        }
-    })
-}
-//显示定额条目
-function showRationItems(data){
-    //var RationJSONStr = JSON.stringify(data);
-    var spread = $("#rationItemsSheet").data("workbook");
-    spread.fromJSON(data);
-
-}
-//绑定点击定额号
-function bindRationClick(){
-    var tr = $("#rationTbody tr");
-    var td = $("td:eq(1)",tr);
-    td.each(function() {
-        var a;
-        a = $('a', $(this));
-        var str = a.text();
-        a.click(function(){
-            $("#gljparam").val(str);
-            properties.selectedRation = str;
-            getRationGLJItems(str)
-        })
-        })
-}
-//获取定额工料机
-function getRationGLJItems(str){
-    var GLJTags = [];
-    $.ajax({
-        type:"POST",
-        url:"http://localhost:6060/ration/getRationGLJItems",
-        async: false,
-        data:{"rationName": rationName,"rationCode":str},
-        dataType:"json",
-        cache:false,
-        timeout:1000,
-        success:function(result,status){
-            if(result){
-                var rationGLJs = result.data;
-                for(var i=0;i<rationGLJs.length;i++){
-                    var TagItem = {};
-                    TagItem.dexh = rationGLJs[i].Amount;
-                    var gljCode = rationGLJs[i].GLJCode;
-                    $.ajax({
-                        type:"POST",
-                        url:"http://localhost:6060/ration/getGLJItem",
-                        async: false,
-                        data:{"rationName": rationName,"GLJCode":gljCode},
-                        dataType:"json",
-                        cache:false,
-                        timeout:1000,
-                        success:function(result1){
-                            TagItem.GLJ = result1.data[0];
-                            GLJTags[i] = TagItem;
-                        },
-                        error:function(){
-
-                        }
-                    })
-                }
-            }
-
-        },
-        error:function(){
-        }
-    })
-    showRationGLJ(GLJTags)
-
-}
-//为每条定额工料机绑定删除事件
-function bindRationGLJDelete(){
-    $("#rationGLJTbody tr").each(function() {
-        var td7, a1,td1,a2;
-        td7 = $("td:eq(7)", $(this));
-        td1 = $("td:eq(1)", $(this));
-        var str = td1.text();
-        a2 = $("a:eq(1)",td7);
-        a2.click(function(){
-            $("#delType").val("rationGLJ");
-            $("#delParam").val(str);
-        })
-    })
-}
-//为每条定额绑定编辑事件
-function bindRationEdit(){
-    $("#rationTbody tr").each(function() {
-        var td7,td1,a2;
-        td7 = $("td:eq(7)", $(this));
-        td1 = $("td:eq(1)", $(this));
-        var str = td1.text();
-        a2 = $("a:eq(0)",td7);
-        a2.click(function(){
-            properties.Edit = "ration";
-            properties.EditParam =str;
-            $.ajax({
-                type:"POST",
-                url:"http://localhost:6060/ration/getRationByCode",
-                data:{"rationName": rationName,"RationCode":str},
-                dataType:"json",
-                cache:false,
-                timeout:5000,
-                success:function(result){
-                    var ration = result.data[0];
-                    $("#ERcode").val(ration.RationCode).attr("disabled",true);
-                    $("#ERname").val(ration.RationName);
-                    $("#ERdanwei").find("option:selected").text(ration.Unit);
-                    $("#ERjijia").val(ration.BasePrice).attr("disabled",true);
-                    $("#ERxsmc").val(ration.Caption);
-                    $("#ERqfzy").val(ration.FeeType);
-                },
-                error:function(err){
-                }
-            })
-
-        })
-    })
-}
-//绑定定额消耗编辑事件
-function bindRGLJAmountEdit(){
-    $("#rationGLJTbody tr").each(function() {
-        var td5, td1, a2,amount;
-        var value = $("#gljparam").val();
-        td5 = $("td:eq(5)", $(this));
-        td1 = $("td:eq(1)", $(this));
-        var str = td1.text();
-        a2 = $("input", td5);
-
-        a2.blur(function () {
-            if(isNaN(a2.val()))
-            alert("请输入数值!");
-            else
-            $.ajax({
-                type:"POST",
-                url:"http://localhost:6060/ration/editRGLJAmount",
-                dataType:"json",
-                data:{"rationName":rationName,"GLJCode":str,"RationCode":value,"Amount":Number(a2.val())},
-
-                cache:false,
-                timeout:50000,
-                success:function(result){
-                  //  getRationItems(properties.selectedSection);
-                    getRationGLJItems(value);
-                },
-                error:function(iqXHR,textStatus,errorThrown){
-                    alert("error "+textStatus+" "+errorThrown);
-                }
-            })
-        })
-    })
-
-}
-$("#Rbianji").click(function(){//设置定额号不可编辑
-
-    var ERcode,ERname,ERdanwei,ERjijia,ERxsmc,ERqfzy,ration={};
-    ERcode=$("#ERcode").val();
-    ERname=$("#ERname").val();
-    ERdanwei=$("#ERdanwei").val();
-    ERjijia=$("#ERjijia").val();
-    ERxsmc = $("#ERxsmc").val();
-    ERqfzy=$("#ERqfzy").val();
-    ration.RationCode = ERcode;
-    ration.RationName = ERname;
-    ration.Unit = ERdanwei;
-    ration.BasePrice = Number(ERjijia);
-    ration.SectionID = properties.selectedSection;
-    ration.ContentID = 0;
-    ration.Caption = ERxsmc;
-    ration.FeeType =Number(ERqfzy);
-    var rationItem = JSON.stringify(ration);
-    $.ajax({
-        type:"POST",
-        url:"http://localhost:6060/ration/editRationItem",
-        dataType:"json",
-        data:{"rationName":rationName,"RationCode":properties.EditParam,"newRation":rationItem},
-        cache:false,
-        timeout:50000,
-        success:function(result){
-            getRationItems(properties.selectedSection);
-        },
-        error:function(iqXHR,textStatus,errorThrown){
-            alert("error "+textStatus+" "+errorThrown);
-        }
-    })
-})
-//为每条定额绑定删除事件
-function bindRationDelete(){
-    $("#rationTbody tr").each(function() {
-        var td7, a1,td1,a2;
-        td7 = $("td:eq(7)", $(this));
-        td1 = $("td:eq(1)", $(this));
-        var str = td1.text();
-        a2 = $("a:eq(1)",td7);
-        a2.click(function(){
-            $("#delType").val("ration");
-            $("#delParam").val(str);
-        })
-    })
-}
-//删除定额或定额工料机
-$("#shanchu").click(function(){
-    var type = $("#delType").val();
-    var value = $("#delParam").val();
-    switch(type){
-        case "ration":
-        {$.ajax({
-                type:"POST",
-                url:"http://localhost:6060/ration/deleteRation",
-                data:{"rationName": rationName,"type":type,"value":value},
-                async:false,
-                dataType:"json",
-                cache:false,
-                timeout:1000,
-                success:function(result){
-                    getRationItems(properties.selectedSection);
-                    getRationGLJItems(value)
-                },
-                error:function(){
-                    alert("nima")
-                }
-            })
-            break;}
-        case "rationGLJ":
-        { $.ajax({
-                type:"POST",
-                url:"http://localhost:6060/ration/deleteRationGLJ",
-                data:{"rationName": rationName,"type":type,"value":value},
-                async:false,
-                dataType:"json",
-                cache:false,
-                timeout:1000,
-                success:function(result){
-                   var s =  $("#gljparam").val();
-                    getRationGLJItems(s)
-                },
-                error:function(){
-                    alert("nima")
-                }
-            })
-            break;}
-    }
-
-})
-//显示定额工料机条目
-function showRationGLJ(obj){
-    $("#bglj tbody tr").html("");
-    var Baseprice = 0;
-    for(var i=0;i<obj.length;i++){
-        var code,name,danwei,jijia,dexh,leixing;
-        code = obj[i].GLJ.GLJCode;
-        name = obj[i].GLJ.GLJName;
-        danwei = obj[i].GLJ.Unit;
-        jijia = obj[i].GLJ.BasePrice;
-        dexh = obj[i].dexh;
-        Baseprice = Baseprice + Number(jijia)*Number(dexh);
-        leixing =obj[i].GLJ.Type;
-        var $tr = $('<tr><td></td><td></td><td></td><td></td><td></td><td><input></td><td></td><td> <a href="javacript:void(0);" data-toggle="modal" data-target="#del" class="text-danger" title="删除"><i class="fa fa-remove"></i></a></td> </tr>')
-        //<a href="javacript:void(0);" data-toggle="modal" data-target="#editBglj" title="编辑"><i class="fa fa-pencil-square-o"></i></a>
-        var td0,td1,td2,td3,td4,td5,td6,a;
-        td0 = $("td:eq(0)",$tr), td1 = $("td:eq(1)",$tr);td2 = $("td:eq(2)",$tr);td3 = $("td:eq(3)",$tr);td4 = $("td:eq(4)",$tr);td5 = $("td:eq(5)",$tr);a=$("input",td5);td6 = $("td:eq(6)",$tr);
-        td0.text(i); td1.text(code);td2.text(name);td3.text(danwei);td4.text(jijia);a.val(dexh);td6.text(leixing)
-        $tr.appendTo("#bglj tbody");
-    }
-    var s = $("#gljparam").val()
-    $("#rationTbody tr").each(function(){
-        var td = $("td:eq(1)",$(this))
-        var s1 = td.text();
-
-        if ( s  == s1){
-            td.next().next().next().text(Baseprice.toFixed(2));
-            $.ajax({
-                type:"POST",
-                url:"http://localhost:6060/ration/setRationBasePrice",
-                data:{"rationName": rationName,"rationCode":s,"BasePrice":Baseprice.toFixed(2)},
-                dataType:"json",
-                cache:false,
-                timeout:1000,
-                success:function(result){
-
-                },
-                error:function(err){
-
-                }
-            })
-        }
-
-    })
-    bindRGLJAmountEdit();
-    bindRationGLJDelete();
-}
-//添加定额工料机ajax函数
-$("#bt-glj").click(function(){
-    var rationGLJ = {};
-    rationGLJ.RationCode = $("#gljparam").val();
-    rationGLJ.GLJCode = $("#bt-inputCode").val();
-    rationGLJ.Amount =Number($("#gljxh").val());
-    rationGLJ.Type = Number($("#gljlx").val()) ;
-    var rationglj = JSON.stringify(rationGLJ);
-    $.ajax({
-        type:"POST",
-        url:"http://localhost:6060/ration/saveRationGLJ",
-        data:{"rationName": rationName,"rationGLJ":rationglj},
-        dataType:"json",
-        cache:false,
-        timeout:1000,
-        success:function(result){
-           getRationGLJItems($("#gljparam").val())
-        },
-        error:function(err){
-            var error = JSON.parse(err.responseText);
-            alert(error.error);
-        }
-    })
-})
-//输入工料机编号自动获取工料机信息
-$("#bt-inputCode").blur(function(){
-    var gljCode = $("#bt-inputCode").val();
-    $.ajax({
-        type:"POST",
-        url:"http://localhost:6060/ration/getGLJByCode",
-        data:{"rationName": rationName,"gljCode":gljCode},
-        dataType:"json",
-        cache:false,
-        timeout:5000,
-        success:function(result){
-          var glj = result.data[0];
-            $("#gljName").val(glj.GLJName).attr("disabled",true);
-            $("#gljdw").find("option:selected").text(glj.Unit).attr("disabled","disabled");
-            $("#gljdj").val(glj.BasePrice).attr("disabled",true);
-            $("#gljlx").val(glj.Type).attr("disabled","disabled");
-        },
-        error:function(err){
-            var error = JSON.parse(err.responseText);
-            alert(error.error);
-        }
-    })
-})
-  	</SCRIPT>
+  	</script>
 </body>
 <script type="text/javascript">
     autoFlashHeight();
+    $(document).ready(function(){
+        pageOprObj.initParam();
+        rationOprObj.buildSheet($("#rationItemsSheet")[0]);
+        rationGLJOprObj.buildSheet($("#rationGLJSheet")[0]);
+    });
 </script>
 
 </html>

+ 1 - 2
web/rationLibEditor/gongliao.html

@@ -192,11 +192,10 @@
     <script src="/lib/bootstrap/bootstrap.min.js"></script>
     <script src="/lib/global.js"></script>
     <!-- zTree -->
-    <script src = "/lib/spreadjs/gc.spread.sheets.all.10.0.1.min.js"></script>
+    <script src = "/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
   	<script type="text/javascript" src="/lib/ztree/jquery.ztree.core.js"></script>
   	<script type="text/javascript" src="/lib/ztree/jquery.ztree.excheck.js"></script>
     <script type="text/javascript" src="/web/rationLibEditor/js/gongliao.js"></script>
-    <script type="text/javascript" src="/web/rationLibEditor/_zSpread.js"></script>
     <SCRIPT type="text/javascript">
   		<!--
 var setting = {

+ 212 - 0
web/rationLibEditor/js/chapterTree.js

@@ -0,0 +1,212 @@
+/**
+ * Created by Tony on 2017/4/27.
+ */
+
+function getQueryString(key){
+    var reg = new RegExp("(^|&)"+key+"=([^&]*)(&|$)");
+    var result = window.location.search.substr(1).match(reg);
+    return result?decodeURIComponent(result[2]):null;
+}
+
+var pageOprObj = {
+    initParam : function() {
+        var rationLibName = getQueryString("repository");//获取定额库参数
+        if (rationLibName) {
+            params.realLibName = rationLibName;
+            zTreeOprObj.getRationTree();
+        } else{
+            params = JSON.parse(getQueryString("params"));
+            zTreeOprObj.getRationTree();
+        }
+    }
+}
+var zTreeOprObj = {
+    treeObj: null,
+    getRationTree: function(){
+        var me = this;
+        $.ajax({
+            type:"POST",
+            url:"api/getRationTree",
+            data:{"rationLibName": params.realLibName},
+            dataType:"json",
+            cache:false,
+            timeout:20000,
+            success:function(result,textStatus,status){
+                if(status.status == 200) {
+                    me.createRationTree(result.data);
+                }
+            },
+            error:function(err){
+                alert(err.responseJSON.error);
+            }
+        })
+    },
+    createRationTree: function(sourceData){
+        var me = zTreeOprObj, treeArr = tree_Data_Helper.buildTreeNodeDirectly(sourceData);
+        for (var i = 0; i < treeArr.length; i++) {
+            if (treeArr[i].ParentID = -1) {
+                //
+            }
+        }
+        me.treeObj = $.fn.zTree.init($("#rationChapterTree"), setting, treeArr);
+        me.treeObj.expandAll(true);
+    },
+    addRootNode: function() {
+        var me = zTreeOprObj, rawNode = {ParentID: -1, NextSiblingID: -1, name: "新增节点"}, lastNodeId = -1;
+        if (me.treeObj) {
+            var rootNodes = me.treeObj.getNodes();
+            if (rootNodes.length > 0) {
+                lastNodeId = rootNodes[rootNodes.length - 1].ID;
+            }
+        }
+        me.addNewNode(rawNode, lastNodeId, function(err, rst){
+            if (!(err)) {
+                var newNodes = [], isSilent = false;
+                newNodes.push({ rationRepId: rst.data.rationRepId, ID: rst.data.ID, ParentID:-1, NextSiblingID:-1, name:"新增节点",isParent:false, items:[]});
+                if (me.treeObj) {
+                    me.treeObj.addNodes(null, -1, newNodes, isSilent);
+                } else {
+                    me.treeObj = $.fn.zTree.init($("#rationChapterTree"), setting, newNodes);
+                }
+            }
+        });
+    },
+    addNewNode : function(rawNode, lastNodeId, callback){
+        $.ajax({
+            type:"POST",
+            url:"api/createNewNode",
+            data:{"rationLibName":params.realLibName,"lastNodeId": lastNodeId, "rawNodeData": JSON.stringify(rawNode)},
+            dataType:"json",
+            cache:false,
+            timeout:1000,
+            success: function(result,textStatus,status){
+                callback(false, result);
+            },
+            error:function(err){
+                callback(err);
+            }
+        })
+    },
+    beforeRename: function(treeId, treeNode, newName, isCancel) {
+        if (newName.length == 0) {
+            return false;
+        }
+        return true;
+    },
+    onRename : function(e, treeId, treeNode, isCancel) {
+        var nodes = [];
+        nodes.push(treeNode);
+        zTreeOprObj.updateNodes(nodes);
+    },
+    onBeforeRemove: function(treeId, treeNode){
+        var nodeIds = [], preNode = treeNode.getPreNode(), preNodeId = -1;
+        if (preNode) {
+            preNodeId = preNode.ID;
+        }
+        private_fetchAllSubItems = function(pItem){
+            nodeIds.push(pItem.ID);
+            if (pItem.items && pItem.items.length > 0) {
+                for (var i = 0; i < pItem.items.length; i++) {
+                    private_fetchAllSubItems(pItem.items[i]);
+                }
+            }
+        };
+        nodeIds.push(treeNode.ID);
+        for (var i = 0; i < treeNode.items.length; i++) {
+            private_fetchAllSubItems(treeNode.items[i]);
+        }
+        $.ajax({
+            type:"POST",
+            url:"api/deleteNodes",
+            data:{"nodes": JSON.stringify(nodeIds), "preNodeId": preNodeId, "preNodeNextId": treeNode.NextSiblingID},
+            dataType:"json",
+            cache:false,
+            timeout:5000,
+            success:function(result,textStatus,status){
+                var pNode = treeNode.getParentNode();
+                if (pNode && pNode.items && pNode.items.length == 1) {
+                    pNode.isParent = false;
+                }
+            },
+            error:function(){
+            }
+        });
+        return true;
+    },
+    onRemove: function(e, treeId, treeNode){
+        var me = zTreeOprObj, pNode = me.treeObj.getNodeByTId(treeNode.parentTId);
+        if (pNode && pNode.items && pNode.items.length == 0) {
+            pNode.isParent = false;
+            me.treeObj.refresh();
+            //me.treeObj.updateNode(pNode, false); //这方法有后遗症,多次操作后会造成节点新增子节点时,父节点icon显示不正确
+        }
+    },
+    beforeDrag: function(treeId, treeNodes) {
+        return false;
+    },
+    updateNodes: function(nodes){
+        if (nodes && nodes.length > 0) {
+            var reqData = []
+            for (var i = 0; i < nodes.length; i++) {
+                var node = {};
+                node.rationRepId = nodes[i].rationRepId;
+                node.ID = nodes[i].ID;
+                node.ParentID = nodes[i].ParentID;
+                node.NextSiblingID = nodes[i].NextSiblingID;
+                node.name = nodes[i].name;
+                if (nodes[i].__v != null) node.__v = nodes[i].__v + 1
+                else node.__v = 0;
+                reqData.push(node);
+            }
+            $.ajax({
+                type:"POST",
+                url:"api/updateNodes",
+                data:{"nodes": JSON.stringify(reqData)},
+                dataType:"json",
+                cache:false,
+                timeout:5000,
+                success:function(result,textStatus,status){
+                    console.log(status + ' : ' + result);
+                },
+                error:function(){
+                }
+            })
+        }
+    },
+    addHoverDom: function(treeId, treeNode) {
+        var me = zTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
+        //if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0||(treeNode.level==2)) return;
+        if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) return;
+        var addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='add node' onfocus='this.blur();'></span>";
+        sObj.after(addStr);
+        var btn = $("#addBtn_"+treeNode.tId);
+        if (btn) btn.bind("click", function(){
+            var rawNode = {ParentID: treeNode.ID, NextSiblingID: -1, name: "新增子节点"}, lastNodeId = -1;
+            if (treeNode.items.length > 0) {
+                lastNodeId = treeNode.items[treeNode.items.length - 1].ID;
+            }
+            zTreeOprObj.addNewNode(rawNode, lastNodeId, function(err, rst){
+                if (!(err)) {
+                    var newNodes = [], isSilent = false;
+                    newNodes.push({ rationRepId: rst.data.rationRepId, ID: rst.data.ID, ParentID: rst.data.ParentID, NextSiblingID:-1, name:"新增子节点",isParent:false, items:[]});
+                    treeNode.isParent = true;
+                    if (me.treeObj) {
+                        me.treeObj.addNodes(treeNode, -1, newNodes, isSilent);
+                    } else {
+                        me.treeObj = $.fn.zTree.init($("#rationChapterTree"), setting, newNodes);
+                    }
+                }
+            });
+        });
+    },
+    removeHoverDom: function(treeId, treeNode) {
+        $("#addBtn_"+treeNode.tId).unbind().remove();
+    },
+    onClick: function(event,treeId,treeNode) {
+        var sectionID = treeNode.ID;
+        if (!(treeNode.items) || treeNode.items.length == 0) {
+            rationOprObj.getRationItems(sectionID);
+        }
+    }
+
+};

+ 0 - 247
web/rationLibEditor/js/dinge.js

@@ -1,247 +0,0 @@
-/**
- * Created by Syusuke on 2017/3/17.
- */
-function getQueryString(key){
-    var reg = new RegExp("(^|&)"+key+"=([^&]*)(&|$)");
-    var result = window.location.search.substr(1).match(reg);
-    return result?decodeURIComponent(result[2]):null;
-}
-//---------------------------------------------------页面跳转
-var params = {}
-$("#dinge").click(function(){
-    $(this).attr('href', "/rationLibEditor/rationLib" + "?params=" + JSON.stringify(params))
-})
-$("#gongliao").click(function(){
-    $(this).attr('href', "/rationLibEditor/gongliao" + "?params=" + JSON.stringify(params))
-});
-//----------------------------------------------------页面初始化
-$(document).ready(function(){
-    rationOprObj.initParam();
-    mkRationItemSpread();
-});
-
-var rationOprObj = {
-    initParam : function() {
-        var me = this, rationLibName = getQueryString("repository");//获取定额库参数
-        if (rationLibName) {
-            params.realLibName = rationLibName;
-            me.getRationTree();
-        } else{
-            params = JSON.parse(getQueryString("params"));
-            me.getRationTree();
-        }
-    },
-    getRationTree: function(){
-        var me = this;
-        $.ajax({
-            type:"POST",
-            url:"api/getRationTree",
-            data:{"rationLibName": params.realLibName},
-            dataType:"json",
-            cache:false,
-            timeout:20000,
-            success:function(result,textStatus,status){
-                if(status.status == 200) {
-                    me.createRationTree(result.data);
-                }
-            },
-            error:function(err){
-                alert(err.responseText.error)
-            }
-        })
-    },
-    createRationTree: function(sourceData){
-        var treeArr = tree_Data_Helper.buildTreeNodeDirectly(sourceData);
-        treeObj = $.fn.zTree.init($("#treeDemo"), setting, treeArr);
-    }
-}
-
-var zTreeOprObj = {
-    addRootNode: function() {
-        var me = this, rawNode = {ParentID: -1, NextSiblingID: -1, name: "新增节点"};
-        me.addNewNode(rawNode, function(err, rst){
-            if (!(err)) {
-                var newNodes = [], isSilent = false;
-                newNodes.push({ rationRepId: rst.data.rationRepId, ID: rst.data.ID, ParentID:-1, NextSiblingID:-1, name:"新增节点",isParent:true, items:[]});
-                if (treeObj) {
-                    treeObj.addNodes(null, -1, newNodes, isSilent);
-                } else {
-                    treeObj = $.fn.zTree.init($("#treeDemo"), setting, newNodes);
-                }
-            }
-        });
-    },
-    addNewNode : function(rawNode, callback){
-        $.ajax({
-            type:"POST",
-            url:"api/createNewNode",
-            data:{"rationLibName":params.realLibName,"rawNodeData": JSON.stringify(rawNode)},
-            dataType:"json",
-            cache:false,
-            timeout:1000,
-            success: function(result,textStatus,status){
-                callback(false, result);
-            },
-            error:function(err){
-                callback(err);
-            }
-        })
-    },
-    onRename : function(e, treeId, treeNode, isCancel) {
-        var nodes = [];
-        nodes.push(treeNode);
-        zTreeOprObj.updateNodes(nodes);
-    },
-    onBeforeRemove: function(treeId, treeNode){
-        var nodeIds = [], preNode = treeNode.getPreNode(), preNodeId = -1;
-        if (preNode) {
-            preNodeId = preNode.ID;
-        }
-        nodeIds.push(treeNode.ID);
-        for (var i = 0; i < treeNode.items.length; i++) {
-            nodeIds.push(treeNode.items[i].ID);
-        }
-        $.ajax({
-            type:"POST",
-            url:"api/deleteNodes",
-            data:{"nodes": JSON.stringify(nodeIds), "preNodeId": preNodeId, "preNodeNextId": treeNode.NextSiblingID},
-            dataType:"json",
-            cache:false,
-            timeout:5000,
-            success:function(result,textStatus,status){
-                //if(result){
-                //    caseDeleteTreeNode(result.data)
-                //}
-            },
-            error:function(){
-            }
-        });
-        return true;
-    },
-    updateNodes: function(nodes){
-        if (nodes && nodes.length > 0) {
-            var reqData = []
-            for (var i = 0; i < nodes.length; i++) {
-                var node = {};
-                node.rationRepId = nodes[i].rationRepId;
-                node.ID = nodes[i].ID;
-                node.ParentID = nodes[i].ParentID;
-                node.NextSiblingID = nodes[i].NextSiblingID;
-                node.name = nodes[i].name;
-                node.__v = nodes[i].__v + 1;
-                reqData.push(node);
-            }
-            $.ajax({
-                type:"POST",
-                url:"api/updateNodes",
-                data:{"nodes": JSON.stringify(reqData)},
-                dataType:"json",
-                cache:false,
-                timeout:5000,
-                success:function(result,textStatus,status){
-                    console.log(status + ' : ' + result);
-                },
-                error:function(){
-                }
-            })
-        }
-    }
-};
-//--------------------------------------------------------树处理事件
-var newCount = 13;
-//新增树节点
-function addHoverDom(treeId, treeNode) {
-    var sObj = $("#" + treeNode.tId + "_span");
-    if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0||(treeNode.level==2)) return;
-    var addStr = "<span class='button add' id='addBtn_" + treeNode.tId
-        + "' title='add node' onfocus='this.blur();'></span>";
-    sObj.after(addStr);
-    var btn = $("#addBtn_"+treeNode.tId);
-    if (btn) btn.bind("click", function(){
-        var zTree = $.fn.zTree.getZTreeObj("treeDemo");
-        if((treeNode.level==0)){
-            var newNode = zTree.addNodes(treeNode, {id:(++newCount), pId:treeNode.id,nId:-1,isParent:true, name:"请输入章节名称",items:[]});
-
-        }
-        else{
-            var newNode = zTree.addNodes(treeNode, {id:(++newCount), pId:treeNode.id,nId:-1,isParent:false, name:"请输入章节名称"});
-
-        }
-        saveNewSection(newNode[0]);
-        var pnode = newNode[0].getPreNode()
-        if(pnode){
-            pnode.nId = newNode[0].id;
-            saveNewSection(pnode);
-        }
-        return false;
-    });
-};
-
-//保存新增的节点
-function saveNewSection(n){
-    var sec={};
-    sec.sectionId = n.id;
-    sec.parentId = n.pId;
-    sec.nextSiblingId = n.nId;
-    sec.name = n.name;
-    var section = JSON.stringify(sec);
-    $.ajax({
-        type:"POST",
-        url:"api/addSection",
-        data:{"rationLibName":params.realLibName,"rationSection":section},
-        dataType:"json",
-        cache:false,
-        timeout:1000,
-        success:function(result,textStatus,status){
-        },
-        error:function(){
-        }
-    })
-}
-
-//--------------------------------------------------------定额spreadjs
-var spSetting_ration = {
-    spType:"Ration",
-    header:[
-        {headerName:"编码",headerWidth:120,data:"rationCode"},
-        {headerName:"名称",headerWidth:400,data:"rationName"},
-        {headerName:"单位",headerWidth:120,data:"unit"},
-        {headerName:"基价",headerWidth:120,data:"basePrice"},
-        {headerName:"显示名称(以%s表示参数)",headerWidth:450,data:"caption"},
-        {headerName:"取费专业",headerWidth:120,data:"feeType"}
-    ],
-    view:{
-        comboBox:[
-            {row:-1,col:2,rowCount:-1,colCount:1}
-        ],
-        lockedCells:[
-            {row:-1,col:3,rowCount:-1, colCount:1}
-        ]
-    }
-};
-var spSetting_rationGLJ = {
-    spType:"RationGLJ",
-    header:[
-        {headerName:"编码",headerWidth:160},
-        {headerName:"名称",headerWidth:400},
-        {headerName:"单位",headerWidth:160},
-        {headerName:"单位基价",headerWidth:160},
-        {headerName:"定额消耗",headerWidth:160},
-        {headerName:"类型",headerWidth:160},
-        {headerName:"操作",headerWidth:130}
-    ],
-    view:{
-        comboBox:[],
-        lockedCells:[
-            {row:-1,col:1,rowCount:-1, colCount:1},
-            {row:-1,col:2,rowCount:-1, colCount:1},
-            {row:-1,col:3,rowCount:-1, colCount:1},
-            {row:-1,col:5,rowCount:-1, colCount:1},
-            {row:-1,col:6,rowCount:-1, colCount:1}
-        ]
-    }
-};
-function mkRationItemSpread(){
-    var rationSpread =  $.fn.Spread.init($("#rationItemsSheet"),spSetting_ration);
-    var rationGLJSpread =  $.fn.Spread.init($("#rationGLJSheet"),spSetting_rationGLJ);
-}

+ 173 - 0
web/rationLibEditor/js/ration.js

@@ -0,0 +1,173 @@
+/**
+ * Created by Tony on 2017/4/28.
+ */
+var params = {}
+$("#dinge").click(function(){
+    $(this).attr('href', "/rationRepository/ration" + "?params=" + JSON.stringify(params))
+})
+$("#gongliao").click(function(){
+    $(this).attr('href', "/rationRepository/gongliao" + "?params=" + JSON.stringify(params))
+});
+
+var rationOprObj = {
+    workBook: null,
+    currentRations: {},
+    currentSectionId: -1,
+    setting: {
+        header:[
+            {headerName:"编码",headerWidth:120,dataCode:"code"},
+            {headerName:"名称",headerWidth:300,dataCode:"name"},
+            {headerName:"单位",headerWidth:120,dataCode:"unit"},
+            {headerName:"基价",headerWidth:120,dataCode:"basePrice"},
+            {headerName:"显示名称(以%s表示参数)",headerWidth:350,dataCode:"caption"},
+            {headerName:"取费专业",headerWidth:120,dataCode:"feeType"}
+        ],
+        view:{
+            comboBox:[
+                {row:-1,col:2,rowCount:-1,colCount:1}
+            ],
+            lockedCells:[
+                {row:-1,col:3,rowCount:-1, colCount:1}
+            ]
+        }
+    },
+    buildSheet: function(container) {
+        var me = this;
+        me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30);
+        me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
+        me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
+    },
+    onClipboardPasting: function(sender, args) {
+        var me = rationOprObj;
+        if (args.cellRange.colCount != me.setting.header.length) {
+            args.cancel = true;
+        }
+    },
+    onClipboardPasted: function(e, info) {
+        var me = rationOprObj;
+        var cacheSection = me.currentRations["_SEC_ID_" + me.currentSectionId];
+        var updateArr = [], addArr = [];
+        var private_createRationItems = function() {
+            var rst = [], propId = 0, preStrIdx = 0, itemObj = {};
+            for (var i = 0; i < info.pasteData.text.length; i++) {
+                if (info.pasteData.text[i] === "\n") {
+                    propId = 0;
+                    preStrIdx = i + 1;
+                    rst.push(itemObj);
+                    if (i < info.pasteData.text.length - 1) {
+                        itemObj = {};
+                    }
+                } else if (info.pasteData.text[i] === "\t" || info.pasteData.text[i] === "\r") {
+                    itemObj[me.setting.header[propId].dataCode] = info.pasteData.text.slice(preStrIdx, i);
+                    propId++;
+                    preStrIdx = i + 1;
+                    //if the last copied-cell were empty, should check whether the end of text
+                    if (i == info.pasteData.text.length - 1) {
+                        itemObj[me.setting.header[propId].dataCode] = info.pasteData.text.slice(preStrIdx);
+                        rst.push(itemObj);
+                    }
+                } else if (i == info.pasteData.text.length - 1) {
+                    itemObj[me.setting.header[propId].dataCode] = info.pasteData.text.slice(preStrIdx);
+                    rst.push(itemObj);
+                }
+            }
+            return rst;
+        };
+        var items = private_createRationItems();
+        for (var i = 0; i < items.length; i++) {
+            if (cacheSection) {
+                var hasCacheItem = false;
+                for (var j = 0; j < cacheSection.length; j++) {
+                    if (cacheSection[j][me.setting.header[0].dataCode] == items[i][me.setting.header[0].dataCode]) {
+                        hasCacheItem = true;
+                        items[i]["ID"] = cacheSection[j]["ID"];
+                        break;
+                    }
+                }
+                if (!hasCacheItem) {
+                    addArr.push(items[i]);
+                } else {
+                    updateArr.push(items[i]);
+                }
+            } else {
+                addArr.push(items[i])
+            }
+        };
+        if (updateArr.length > 0 || addArr.length > 0) {
+            $.ajax({
+                type:"POST",
+                url:"api/mixUpdateRationItems",
+                data:{"sectionID": me.currentSectionId, "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.currentSectionId);
+                    } else {
+                        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];
+                        }
+                        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];
+                                }
+                            }
+                        }
+                        me.showRationItems(me.currentSectionId);
+                    }
+                },
+                error:function(){
+                }
+            })
+        }
+    },
+    getRationItems: function(sectionID){
+        if (sectionID != -1) {
+            var me = rationOprObj;
+            me.currentSectionId = sectionID;
+            if (me.currentRations["_SEC_ID_" + sectionID]) {
+                me.showRationItems(sectionID);
+            } else {
+                $.ajax({
+                    type:"POST",
+                    url:"api/getRationItems",
+                    data:{"sectionID": sectionID},
+                    dataType:"json",
+                    cache:false,
+                    timeout:1000,
+                    success:function(result){
+                        if (result) {
+                            me.currentRations["_SEC_ID_" + sectionID] = result.data;
+                            me.showRationItems(sectionID);
+                        }
+
+                    },
+                    error:function(err){
+                        alert(err);
+                    }
+                })
+            }
+        }
+    },
+    showRationItems: function(sectionID){
+        var me = rationOprObj;
+        if (me.workBook) {
+            if (me.currentRations && me.currentRations["_SEC_ID_" + sectionID] && me.currentRations["_SEC_ID_" + sectionID].length > 0) {
+                var cacheSection = me.currentRations["_SEC_ID_" + sectionID];
+                sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
+                sheetCommonObj.showData(me.workBook.getSheet(0), me.setting, cacheSection);
+            } else {
+                //清除ration数据及工料机数据
+                sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
+            }
+        }
+    }
+}

+ 31 - 0
web/rationLibEditor/js/rationGLJ.js

@@ -0,0 +1,31 @@
+/**
+ * Created by Tony on 2017/4/28.
+ */
+var rationGLJOprObj = {
+    sheet: null,
+    setting: {
+        header:[
+            {headerName:"编码",headerWidth:160},
+            {headerName:"名称",headerWidth:400},
+            {headerName:"单位",headerWidth:160},
+            {headerName:"单位基价",headerWidth:160},
+            {headerName:"定额消耗",headerWidth:160},
+            {headerName:"类型",headerWidth:160},
+            {headerName:"操作",headerWidth:130}
+        ],
+        view:{
+            comboBox:[],
+            lockedCells:[
+                {row:-1,col:1,rowCount:-1, colCount:1},
+                {row:-1,col:2,rowCount:-1, colCount:1},
+                {row:-1,col:3,rowCount:-1, colCount:1},
+                {row:-1,col:5,rowCount:-1, colCount:1},
+                {row:-1,col:6,rowCount:-1, colCount:1}
+            ]
+        }
+    },
+    buildSheet: function(container) {
+        var me = this;
+        me.sheet = sheetCommonObj.buildSheet(container, me.setting, 30);
+    }
+}

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

@@ -0,0 +1,59 @@
+/**
+ * Created by Tony on 2017/4/28.
+ */
+var sheetCommonObj = {
+    buildSheet: function(container, setting, rowCount) {
+        var me = this;
+        var spreadBook = new GC.Spread.Sheets.Workbook(container, { sheetCount: 1 });
+        spreadBook.options.tabStripVisible = false;
+        spreadBook.options.showHorizontalScrollbar = false;
+        var spreadNS = GC.Spread.Sheets;
+        var sheet = spreadBook.getSheet(0);
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        //Set rowHeader count and columnHeader count.
+        sheet.setRowCount(1, spreadNS.SheetArea.colHeader);
+        sheet.setColumnCount(setting.header.length, spreadNS.SheetArea.viewport);
+        sheet.options.colHeaderAutoTextIndex = 1;
+        sheet.options.colHeaderAutoText = spreadNS.HeaderAutoText.numbers;
+        sheet.showRowOutline(false);
+        //setup column header
+        me.buildHeader(sheet, setting);
+        //setup cells
+        if (rowCount > 0) sheet.setRowCount(rowCount);
+        sheet.resumeEvent();
+        sheet.resumePaint();
+        return spreadBook;
+    },
+    buildHeader: function(sheet, setting){
+        var me = this, ch = GC.Spread.Sheets.SheetArea.colHeader;
+        for (var i = 0; i < setting.header.length; i++) {
+            sheet.setValue(0, i, setting.header[i].headerName, ch);
+            sheet.setColumnWidth(i, setting.header[i].headerWidth?setting.header[i].headerWidth:100);
+        }
+    },
+    cleanSheet: function(sheet, setting, rowCount) {
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        sheet.clear(-1, 0, -1, setting.header.length, GC.Spread.Sheets.SheetArea.viewport, GC.Spread.Sheets.StorageType.data);
+        if (rowCount > 0) sheet.setRowCount(rowCount);
+        sheet.resumeEvent();
+        sheet.resumePaint();
+    },
+    showData: function(sheet, setting, data) {
+        var me = this, ch = GC.Spread.Sheets.SheetArea.viewport;
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        for (var row = 0; row < data.length; row++) {
+            for (var col = 0; col < setting.header.length; col++) {
+                sheet.setValue(row, col, data[row][setting.header[col].dataCode], ch);
+            }
+        }
+        sheet.resumeEvent();
+        sheet.resumePaint();
+        //me.shieldAllCells(sheet);
+    },
+    shieldAllCells: function(sheet) {
+        sheet.options.isProtected = true;
+    }
+}