Prechádzať zdrojové kódy

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

TonyKang 7 rokov pred
rodič
commit
4ff0684223
36 zmenil súbory, kde vykonal 1860 pridanie a 238 odobranie
  1. 6 0
      config/menu.js
  2. 6 0
      modules/bills_lib/controllers/bills_lib_controllers.js
  3. 59 0
      modules/bills_lib/controllers/bills_permissionController.js
  4. 39 0
      modules/bills_lib/controllers/items_permissionController.js
  5. 33 0
      modules/bills_lib/controllers/jobs_permissionController.js
  6. 33 0
      modules/bills_lib/controllers/stdBillsLib_permissionController.js
  7. 24 0
      modules/bills_lib/controllers/views_permissionController.js
  8. 47 12
      modules/bills_lib/models/bills_lib_interfaces.js
  9. 4 0
      modules/bills_lib/models/bills_lib_schemas.js
  10. 54 54
      modules/bills_lib/routes/bills_lib_routes.js
  11. 2 1
      modules/common/helper/mongoose_helper.js
  12. 11 0
      modules/ration_repository/controllers/ration_controller.js
  13. 17 1
      modules/ration_repository/models/ration_item.js
  14. 1 1
      modules/ration_repository/models/repository_map.js
  15. 1 0
      modules/ration_repository/routes/ration_rep_routes.js
  16. 184 0
      modules/users/controllers/version_controller.js
  17. 26 0
      modules/users/models/schemas/version.js
  18. 158 0
      modules/users/models/version_model.js
  19. 22 0
      modules/users/routes/version_route.js
  20. 1 0
      public/web/sheet/sheet_common.js
  21. 0 1
      web/maintain/bills_lib/html/main.html
  22. 21 8
      web/maintain/bills_lib/html/neirong.html
  23. 166 44
      web/maintain/bills_lib/html/qingdan.html
  24. 21 0
      web/maintain/bills_lib/html/tezheng.html
  25. 13 0
      web/maintain/bills_lib/scripts/bills_lib_ajax.js
  26. 228 76
      web/maintain/bills_lib/scripts/db_controller.js
  27. 1 0
      web/maintain/bills_lib/scripts/set_sheets.js
  28. 52 1
      web/maintain/ration_repository/dinge.html
  29. 2 2
      web/maintain/ration_repository/gongliao.html
  30. 214 19
      web/maintain/ration_repository/js/ration.js
  31. 34 6
      web/maintain/ration_repository/js/ration_glj.js
  32. 9 8
      web/maintain/ration_repository/js/repository_glj.js
  33. 3 2
      web/users/css/style.css
  34. 213 0
      web/users/js/version.js
  35. 55 2
      web/users/views/layout/layout.html
  36. 100 0
      web/users/views/version/index.html

+ 6 - 0
config/menu.js

@@ -48,6 +48,12 @@ let menuData = {
             }
         }
     },
+    'version': {
+        title: '版本管理',
+        url: '/version',
+        name: 'version',
+        iconClass: 'glyphicon glyphicon-tag'
+    },
     'tool': {
         title: '工具',
         url: '/tool',

+ 6 - 0
modules/bills_lib/controllers/bills_lib_controllers.js

@@ -118,6 +118,12 @@ module.exports = {
             callback(req, res, err, message, null);
         })
     },
+    updateSerialNo: function (req, res) {
+        let data = JSON.parse(req.body.data);
+        billsLibDao.updateSerialNo(data, function (err, message) {
+            callback(req, res, err, message, null);
+        });
+    },
     updateBillsArr: function(req, res){
         let data = JSON.parse(req.body.data);
         billsLibDao.updateBillsArr(data, function(err, message){

+ 59 - 0
modules/bills_lib/controllers/bills_permissionController.js

@@ -0,0 +1,59 @@
+/**标准清单操作相关
+ * Created by Zhong on 2017/8/2.
+ */
+let billsController = require("./bills_lib_controllers");
+import baseController from "../../common/base/base_controller";
+
+class billsPermContr extends baseController{
+    getCurrentUniqId(req, res){
+        billsController.getCurrentUniqId(req, res);
+    }
+    getBills(req, res){
+        billsController.getBills(req, res);
+    }
+    createBills(req, res){
+        billsController.createBills(req, res);
+    }
+    updatePNId(req, res){
+        billsController.updatePNId(req, res);
+    }
+    upMove(req, res){
+        billsController.upMove(req, res);
+    }
+    downMove(req, res){
+        billsController.downMove(req, res);
+    }
+    upLevel(req, res){
+        billsController.upLevel(req, res);
+    }
+    downLevel(req, res){
+        billsController.downLevel(req, res);
+    }
+    updateBills(req, res){
+        billsController.updateBills(req, res);
+    }
+    updateBillsArr(req, res){
+        billsController.updateBillsArr(req, res);
+    }
+    removeTotal(req, res){
+        billsController.removeTotal(req, res);
+    }
+    updateSerialNo(req, res){
+        billsController.updateSerialNo(req, res);
+    }
+    pasteBills(req, res){
+        billsController.pasteBills(req, res);
+    }
+    updateRecharge(req, res){
+        billsController.updateRecharge(req, res);
+    }
+    pasteRel(req, res){
+        billsController.pasteRel(req, res);
+    }
+    deleteBills(req, res){
+        billsController.deleteBills(req, res);
+    }
+
+}
+
+export default billsPermContr;

+ 39 - 0
modules/bills_lib/controllers/items_permissionController.js

@@ -0,0 +1,39 @@
+/**
+ * Created by Zhong on 2017/8/2.
+ */
+
+let billsController = require("./bills_lib_controllers");
+import baseController from "../../common/base/base_controller";
+
+class itemsPermContr extends baseController{
+
+    getItemCharacter(req, res){
+        billsController.getItemCharacter(req, res);
+    }
+    createItemCharacter(req, res){
+        billsController.createItemCharacter(req, res);
+    }
+    updateItemCharacter(req, res){
+        billsController.updateItemCharacter(req, res);
+    }
+    updateValue(req, res){
+        billsController.updateValue(req, res);
+    }
+    deleteItemCharacter(req, res){
+        billsController.deleteItemCharacter(req, res);
+    }
+    pasteItems(req, res){
+        billsController.pasteItems(req, res);
+    }
+    pasteValues(req, res){
+        billsController.pasteValues(req, res);
+    }
+    edCreateItem(req, res){
+        billsController.edCreateItem(req, res);
+    }
+    edUpdateItem(req, res){
+        billsController.edUpdateItem(req, res);
+    }
+}
+
+export default itemsPermContr;

+ 33 - 0
modules/bills_lib/controllers/jobs_permissionController.js

@@ -0,0 +1,33 @@
+/**
+ * Created by Zhong on 2017/8/2.
+ */
+
+let billsController = require("./bills_lib_controllers");
+import baseController from "../../common/base/base_controller";
+
+class jobsPermContr extends baseController{
+
+    getJobContent(req, res){
+        billsController.getJobContent(req, res);
+    }
+    createJobContent(req, res){
+        billsController.createJobContent(req, res);
+    }
+    updateJobContent(req, res){
+        billsController.updateJobContent(req, res);
+    }
+    deleteJobContent(req, res){
+        billsController.deleteJobContent(req, res);
+    }
+    pasteJobs(req, res){
+        billsController.pasteJobs(req, res);
+    }
+    edCreateJob(req, res){
+        billsController.edCreateJob(req, res);
+    }
+    edUpdateJob(req, res){
+        billsController.edUpdateJob(req, res);
+    }
+}
+
+export default jobsPermContr;

+ 33 - 0
modules/bills_lib/controllers/stdBillsLib_permissionController.js

@@ -0,0 +1,33 @@
+/**清单编辑器清单库操作相关
+ * Created by Zhong on 2017/8/2.
+ */
+let billsController = require("./bills_lib_controllers");
+import baseController from "../../common/base/base_controller";
+
+class billsLibPermContr extends baseController{
+    getMaxNumber(req, res){
+        billsController.getMaxNumber(req, res);
+    }
+    getABillsLib(req, res){
+        billsController.getABillsLib(req, res);
+    }
+    getStdBillsLib(req, res){
+        billsController.getStdBillsLib(req, res);
+    }
+    createStdBillsLib(req, res){
+        billsController.createStdBillsLib(req, res);
+    }
+    deleteStdBillsLib(req, res){
+        billsController.deleteStdBillsLib(req, res);
+    }
+    renameStdBillsLib(req, res){
+        billsController.renameStdBillsLib(req, res);
+    }
+    getStdBillsLibName(req, res){
+        billsController.getStdBillsLibName(req, res);
+    }
+
+}
+
+export default billsLibPermContr;
+

+ 24 - 0
modules/bills_lib/controllers/views_permissionController.js

@@ -0,0 +1,24 @@
+/**
+ * 清单编辑器页面权限管理和session校验
+ * Created by Zhong on 2017/8/2.
+ */
+import baseController from "../../common/base/base_controller";
+
+class viewsPermContr extends baseController{
+    redirectStdBillsMain(req, res){
+        res.render("maintain/bills_lib/html/main.html",
+            {userAccount: req.session.managerData.username,
+                userID: req.session.managerData.userID});
+    }
+    redirectStdBills(req, res){
+        res.render("maintain/bills_lib/html/qingdan.html");
+    }
+    redirectStdJobs(req, res){
+        res.render('maintain/bills_lib/html/neirong.html');
+    }
+    redirectStdItems(req, res){
+        res.render('maintain/bills_lib/html/tezheng.html');
+    }
+}
+
+export default viewsPermContr;

+ 47 - 12
modules/bills_lib/models/bills_lib_interfaces.js

@@ -51,8 +51,8 @@ billsLibDao.prototype.getABillsLib = function(data, callback){
 
 
 billsLibDao.prototype.getStdBillsLib = function(data, callback){
-    let userId = data.userId;
-    StdBillsLib.find({userId: userId, deleted: false}, "-_id", function(err, data){
+   // let userId = data.userId;
+    StdBillsLib.find({deleted: false}, "-_id", function(err, data){
         if(err){
             callback(1, "Error", null);
         }
@@ -74,6 +74,7 @@ billsLibDao.prototype.createStdBillsLib = function(clibData, callback){
             billsLibId: billsLibId,
             billsLibName: billsLibName,
             createDate: createDate,
+            localeType: -1,
             deleted: false
         };
         StdBillsLib.create(newStdBillsLib, function(err){
@@ -362,11 +363,9 @@ billsLibDao.prototype.upLevel = function(data, callback){
             };
         },
         preSiblingNode: function(data){
-            console.log(`billsLIbId: ${billsLibId} ID: ${data.ID} NextS: ${data.NextSiblingID}`);
             return function (cb) {
                 Bills.update({billsLibId: billsLibId, ID: data.ID, deleted: false}, {$set: {NextSiblingID: data.NextSiblingID}}, function (err) {
                     if(err){
-                        console.log(`err4`);
                         cb(err);
                     }
                     else {
@@ -395,7 +394,6 @@ billsLibDao.prototype.upLevel = function(data, callback){
     }
     async.parallel(functions, function(err){
         if(err){
-            console.log(`errfinal`);
             callback(1, 'Error');
         }
         else{
@@ -486,11 +484,10 @@ billsLibDao.prototype.updatePNId= function(upData, callback){
                 eachDatas.push({id: updateDatas[i].ID, data: updateDatas[i]});
             }
         }
-        console.log(eachDatas.length);
+
         async.each(eachDatas, function(eachObj, cb){
             let id = eachObj.id, data = eachObj.data;
             if(data.ParentID && data.NextSiblingID){
-                console.log(`enter 1 ${id}`);
                 Bills.update({billsLibId: billsLibId, ID: id, deleted: false}, {$set: {ParentID: data.ParentID, NextSiblingID: data.NextSiblingID}}, function(err){
                     if(err){
                         cb(err);
@@ -500,7 +497,6 @@ billsLibDao.prototype.updatePNId= function(upData, callback){
                 });
             }
             else if(data.ParentID && !data.NextSiblingID){
-                console.log(`enter 2 ${id}`);
                 Bills.update({billsLibId: billsLibId, ID: id, deleted: false}, {$set: {ParentID: data.ParentID}}, function(err){
                     if(err){
                         if(err){
@@ -512,7 +508,6 @@ billsLibDao.prototype.updatePNId= function(upData, callback){
                 });
             }
             else if(!data.ParentID && data.NextSiblingID){
-                console.log(`enter 3 ${id}`);
                 Bills.update({billsLibId: billsLibId, ID: id, deleted: false}, {$set: {NextSiblingID: data.NextSiblingID}}, function(err){
                     if(err){
                         cb(err);
@@ -523,11 +518,9 @@ billsLibDao.prototype.updatePNId= function(upData, callback){
             }
         }, function(err){
             if(err){
-                console.log(`err`);
                 callback(1, 'Error');
             }
             else {
-                console.log(`noerr`);
                 callback(0, '');
             }
         });
@@ -713,6 +706,49 @@ billsLibDao.prototype.removeTotal = function (data, callback) {
     });
 };
 
+billsLibDao.prototype.updateSerialNo = function (data, callback) {
+    let billsLibId = data.billsLibId, billsId = data.billsId,
+        updateArr = data.updateArr, field = data.field;
+    if(field === 'jobs'){
+        async.each(updateArr, function (updateObj, cb) {
+            Bills.update({billsLibId: billsLibId, ID: billsId, deleted: false, 'jobs.id': updateObj.id}, {$set: {'jobs.$.serialNo': updateObj.serialNo}}, function (err) {
+                if(err){
+                    cb(err);
+                }
+                else{
+                    cb(null);
+                }
+            });
+        }, function (err) {
+            if(err){
+                callback(1, 'Error');
+            }
+            else{
+                callback(0, '');
+            }
+        });
+    }
+    else{
+        async.each(updateArr, function (updateObj, cb) {
+            Bills.update({billsLibId: billsLibId, ID: billsId, deleted: false, 'items.id': updateObj.id}, {$set: {'items.$.serialNo': updateObj.serialNo}}, function (err) {
+                if(err){
+                    cb(err);
+                }
+                else{
+                    cb(null);
+                }
+            });
+        }, function (err) {
+            if(err){
+                callback(1, 'Error');
+            }
+            else{
+                callback(0, '');
+            }
+        });
+    }
+};
+
 billsLibDao.prototype.updateBillsArr = function(updateData, callback){
     let billsLibId = updateData.billsLibId;
     let updateId = updateData.updateId;
@@ -720,7 +756,6 @@ billsLibDao.prototype.updateBillsArr = function(updateData, callback){
     let newId = updateData.newId;
     let classify = updateData.classify;
     let type = updateData.type;
-    let success = true;
     if(classify === 'jobs'){
         if(orgId && newId && type === 'update'){
             Bills.update({billsLibId: billsLibId, ID: updateId, deleted: false, 'jobs.id': orgId}, {$set: {'jobs.$.id': newId}}, function(err){

+ 4 - 0
modules/bills_lib/models/bills_lib_schemas.js

@@ -2,9 +2,13 @@ let mongoose = require('mongoose');
 
 let stdBillsLibSchema =mongoose.Schema({
     userId: String,
+    creator: String,
+    lastOperator: String,
     billsLibId: Number,
     billsLibName: String,
+    lastOperateDate: Date,
     createDate: Date,
+    localeType: Number,
     deleted: Boolean
 },
     {versionKey: false}

+ 54 - 54
modules/bills_lib/routes/bills_lib_routes.js

@@ -2,67 +2,67 @@
  * Created by vian on 2017/3/17.
  */
 let express = require("express");
-let billsController = require("./../controllers/bills_lib_controllers");
 let billsRouter =express.Router();
+import ViewsPermContr from "../controllers/views_permissionController";
+import BillsLibPermContr from "../controllers/stdBillsLib_permissionController";
+import BillsPermContr from "../controllers/bills_permissionController";
+import JobsPermContr from "../controllers/jobs_permissionController";
+import ItemsPermContr from "../controllers/items_permissionController";
+let viewsContr = new ViewsPermContr();
+let billsLibContr = new BillsLibPermContr();
+let billsContr = new BillsPermContr();
+let jobsContr = new JobsPermContr();
+let itemsContr = new ItemsPermContr();
 
-module.exports =function (app) {
 
-    app.get("/stdBillsmain", function(req, res){
-        res.render("maintain/bills_lib/html/main.html",
-            {userAccount: req.session.managerData.username,
-                userID: req.session.managerData.userID});
-    });
-    app.get("/stdBills", function(req, res){
-        res.render("maintain/bills_lib/html/qingdan.html");
-    });
-    app.get('/stdJobs', function(req, res){
-        res.render('maintain/bills_lib/html/neirong.html');
-    });
-    app.get('/stdItems', function(req, res){
-        res.render('maintain/bills_lib/html/tezheng.html');
-    });
+module.exports =function (app) {
+    app.get("/stdBillsmain", viewsContr.auth, viewsContr.init, viewsContr.redirectStdBillsMain);
+     app.get("/stdBills", viewsContr.auth, viewsContr.init, viewsContr.redirectStdBills);
+     app.get('/stdJobs', viewsContr.auth, viewsContr.init, viewsContr.redirectStdJobs);
+     app.get('/stdItems', viewsContr.auth, viewsContr.init, viewsContr.redirectStdItems);
 
-    billsRouter.post('/getMaxNumber', billsController.getMaxNumber);
-    billsRouter.post('/getABillsLib', billsController.getABillsLib);
-    billsRouter.post("/getStdBillsLib", billsController.getStdBillsLib);
-    billsRouter.post("/createStdBillsLib", billsController.createStdBillsLib);
+     billsRouter.post('/getMaxNumber', billsLibContr.auth, billsLibContr.init, billsLibContr.getMaxNumber);
+     billsRouter.post('/getABillsLib', billsLibContr.auth, billsLibContr.init, billsLibContr.getABillsLib);
+     billsRouter.post("/getStdBillsLib", billsLibContr.auth, billsLibContr.init, billsLibContr.getStdBillsLib);
+     billsRouter.post("/createStdBillsLib", billsLibContr.auth, billsLibContr.init, billsLibContr.createStdBillsLib);
+    billsRouter.post("/deleteStdBillsLib", billsLibContr.auth, billsLibContr.init, billsLibContr.deleteStdBillsLib);
+    billsRouter.post("/renameStdBillsLib", billsLibContr.auth, billsLibContr.init, billsLibContr.renameStdBillsLib);
+    billsRouter.post("/getStdBillsLibName", billsLibContr.auth, billsLibContr.init, billsLibContr.getStdBillsLibName);
 
-    billsRouter.post("/upMove", billsController.upMove);
-    billsRouter.post("/downMove", billsController.downMove);
-    billsRouter.post("/deleteStdBillsLib", billsController.deleteStdBillsLib);
-    billsRouter.post("/renameStdBillsLib", billsController.renameStdBillsLib);
-    billsRouter.post("/getStdBillsLibName", billsController.getStdBillsLibName);
-    billsRouter.post("/getCurrentUniqId", billsController.getCurrentUniqId);
-    billsRouter.post("/getBills", billsController.getBills);
-    billsRouter.post("/createBills", billsController.createBills);
-    billsRouter.post("/updatePNId", billsController.updatePNId);
-    billsRouter.post("/upLevel", billsController.upLevel);
-    billsRouter.post("/downLevel", billsController.downLevel);
-    billsRouter.post("/updateBills", billsController.updateBills);
-    billsRouter.post("/updateBillsArr", billsController.updateBillsArr);
-    billsRouter.post("/removeTotal", billsController.removeTotal);
-    billsRouter.post("/pasteBills", billsController.pasteBills);
-    billsRouter.post('/updateRecharge', billsController.updateRecharge);
-    billsRouter.post('/pasteRel', billsController.pasteRel);
-    billsRouter.post("/deleteBills", billsController.deleteBills);
+    billsRouter.post("/upMove", billsContr.auth, billsContr.init, billsContr.upMove);
+    billsRouter.post("/downMove", billsContr.auth, billsContr.init, billsContr.downMove);
+     billsRouter.post("/getCurrentUniqId", billsContr.auth, billsContr.init, billsContr.getCurrentUniqId);
+     billsRouter.post("/getBills", billsContr.auth, billsContr.init, billsContr.getBills);
+     billsRouter.post("/createBills", billsContr.auth, billsContr.init, billsContr.createBills);
+     billsRouter.post("/updatePNId", billsContr.auth, billsContr.init, billsContr.updatePNId);
+     billsRouter.post("/upLevel", billsContr.auth, billsContr.init, billsContr.upLevel);
+     billsRouter.post("/downLevel", billsContr.auth, billsContr.init, billsContr.downLevel);
+     billsRouter.post("/updateBills", billsContr.auth, billsContr.init, billsContr.updateBills);
+     billsRouter.post("/updateBillsArr", billsContr.auth, billsContr.init, billsContr.updateBillsArr);
+     billsRouter.post("/removeTotal", billsContr.auth, billsContr.init, billsContr.removeTotal);
+     billsRouter.post("/updateSerialNo", billsContr.auth, billsContr.init, billsContr.updateSerialNo);
+     billsRouter.post("/pasteBills", billsContr.auth, billsContr.init, billsContr.pasteBills);
+     billsRouter.post('/updateRecharge', billsContr.auth, billsContr.init, billsContr.updateRecharge);
+     billsRouter.post('/pasteRel', billsContr.auth, billsContr.init, billsContr.pasteRel);
+     billsRouter.post("/deleteBills", billsContr.auth, billsContr.init, billsContr.deleteBills);
 
-    billsRouter.post("/getJobContent", billsController.getJobContent);
-    billsRouter.post("/createJobContent", billsController.createJobContent);
-    billsRouter.post("/updateJobContent", billsController.updateJobContent);
-    billsRouter.post("/deleteJobContent", billsController.deleteJobContent);
-    billsRouter.post("/pasteJobs", billsController.pasteJobs);
-    billsRouter.post("/edCreateJob", billsController.edCreateJob);
-    billsRouter.post("/edUpdateJob", billsController.edUpdateJob);
+     billsRouter.post("/getJobContent", jobsContr.auth, jobsContr.init, jobsContr.getJobContent);
+     billsRouter.post("/createJobContent", jobsContr.auth, jobsContr.init, jobsContr.createJobContent);
+     billsRouter.post("/updateJobContent", jobsContr.auth, jobsContr.init, jobsContr.updateJobContent);
+     billsRouter.post("/deleteJobContent", jobsContr.auth, jobsContr.init, jobsContr.deleteJobContent);
+     billsRouter.post("/pasteJobs", jobsContr.auth, jobsContr.init, jobsContr.pasteJobs);
+     billsRouter.post("/edCreateJob", jobsContr.auth, jobsContr.init, jobsContr.edCreateJob);
+     billsRouter.post("/edUpdateJob", jobsContr.auth, jobsContr.init, jobsContr.edUpdateJob);
 
-    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);
-    billsRouter.post("/pasteItems", billsController.pasteItems);
-    billsRouter.post("/pasteValues", billsController.pasteValues);
-    billsRouter.post("/edCreateItem", billsController.edCreateItem);
-    billsRouter.post("/edUpdateItem", billsController.edUpdateItem);
+     billsRouter.post("/getItemCharacter", itemsContr.auth, itemsContr.init, itemsContr.getItemCharacter);
+     billsRouter.post("/createItemCharacter", itemsContr.auth, itemsContr.init, itemsContr.createItemCharacter);
+     billsRouter.post("/updateItemCharacter", itemsContr.auth, itemsContr.init, itemsContr.updateItemCharacter);
+     billsRouter.post("/updateValue", itemsContr.auth, itemsContr.init, itemsContr.updateValue);
+     billsRouter.post("/deleteItemCharacter", itemsContr.auth, itemsContr.init, itemsContr.deleteItemCharacter);
+     billsRouter.post("/pasteItems", itemsContr.auth, itemsContr.init, itemsContr.pasteItems);
+     billsRouter.post("/pasteValues", itemsContr.auth, itemsContr.init, itemsContr.pasteValues);
+     billsRouter.post("/edCreateItem", itemsContr.auth, itemsContr.init, itemsContr.edCreateItem);
+     billsRouter.post("/edUpdateItem", itemsContr.auth, itemsContr.init, itemsContr.edUpdateItem);
 
     app.use("/stdBillsEditor", billsRouter);
 

+ 2 - 1
modules/common/helper/mongoose_helper.js

@@ -32,6 +32,7 @@ class MongooseHelper {
     findOne(conditions, fields = null) {
         let self = this;
         return new Promise(function (resolve, reject) {
+            conditions = self._convertId(conditions);
             self.model.findOne(conditions, fields, function (error, data) {
                 if (error) {
                     reject(null);
@@ -54,7 +55,7 @@ class MongooseHelper {
         let self = this;
         let limit = 0;
         let skip = 0;
-        if (Object.keys(option).length > 0) {
+        if (option !== null && Object.keys(option).length > 0) {
             limit = option.pageSize !== undefined ? option.pageSize : limit;
             skip = option.offset !== undefined ? option.offset : skip;
         }

+ 11 - 0
modules/ration_repository/controllers/ration_controller.js

@@ -65,5 +65,16 @@ module.exports = {
                 callback(req, res, err, message, ids);
             }
         })
+    },
+    getRationsCodes: function (req, res) {
+        let data = JSON.parse(req.body.data);
+        rationItem.getRationsCodes(data, function (err, message, codes) {
+            if(err){
+                callback(req, res, err, message, null);
+            }
+            else{
+                callback(req, res, err, message, codes);
+            }
+        })
     }
 }

+ 17 - 1
modules/ration_repository/models/ration_item.js

@@ -334,7 +334,23 @@ rationItemDAO.prototype.getRationGljIds = function (data, callback) {
             callback(null, '', newRst);
         }
     });
-}
+};
+
+rationItemDAO.prototype.getRationsCodes = function (data, callback) {
+    let repId = data.repId;
+    rationItemModel.find({rationRepId: repId}, function (err, result) {
+        if(err){
+            callback(err, 'Error', null);
+        }
+        else{
+            let rstCodes = [];
+            result.forEach(function (rationItem) {
+                rstCodes.push(rationItem.code);
+            });
+            callback(null, 'get all rationCodes success', rstCodes);
+        }
+    })
+};
 
 module.exports = new rationItemDAO()
 

+ 1 - 1
modules/ration_repository/models/repository_map.js

@@ -11,7 +11,7 @@ var RepositoryMapSchema = new Schema({
     "ID": Number,
     "dispName" : String,
     "appType" : String, //如:"建筑" / "公路"
-    "localeType": String, //如 各个省份 / 部颁
+    "localeType": Number, //如 各个省份 / 部颁
     "descr" : String,
     "deleted": Boolean
 });

+ 1 - 0
modules/ration_repository/routes/ration_rep_routes.js

@@ -61,6 +61,7 @@ module.exports =  function (app) {
     apiRouter.post("/mixUpdateRationItems",rationController.mixUpdateRationItems);
     apiRouter.post("/updateRationBasePrc",rationController.updateRationBasePrc);
     apiRouter.post("/getRationGljIds",rationController.getRationGljIds);
+    apiRouter.post("/getRationsCodes",rationController.getRationsCodes);
 
     apiRouter.post("/createNewGljTypeNode",repositoryGljController.createNewGljTypeNode);
     apiRouter.post("/updateGljNodes",repositoryGljController.updateGljNodes);

+ 184 - 0
modules/users/controllers/version_controller.js

@@ -0,0 +1,184 @@
+/**
+ * 版本控制控制器
+ *
+ * @author CaiAoLin
+ * @date 2017/7/28
+ * @version
+ */
+import BaseController from "../../common/base/base_controller";
+import VersionModel from "../models/version_model";
+
+class VersionController extends BaseController {
+
+    /**
+     * 版本控制页面
+     *
+     * @param {object} request
+     * @param {object} response
+     * @return {void}
+     */
+    async index(request, response) {
+        let id = request.query.id;
+
+        let versionList = [];
+        // @todo 后续从库中获取
+        let province = [
+            {id: 1, name: '重庆省'},
+            {id: 2, name: '广东省'},
+        ];
+
+        let billList = {
+            1: [
+                {id: '1', name: '重庆2017标准清单'},
+                {id: '2', name: '重庆2015标准清单'}
+            ],
+            2: [
+                {id: '3', name: '广东2017标准清单'},
+                {id: '4', name: '广东2015标准清单'},
+            ]
+        };
+
+        let rationList = {
+            1: [
+                {id: '1', name: '重庆2017定额'},
+                {id: '2', name: '重庆2015定额'}
+            ],
+            2: [
+                {id: '3', name: '广东2017定额'},
+                {id: '4', name: '广东2015定额'}
+            ]
+        };
+        let selectedVersion = {};
+        try {
+            let versionModel = new VersionModel();
+            versionList = await versionModel.getVersionList();
+
+            if (versionList.length <= 0) {
+                throw '没有数据';
+            }
+            // 循环查找数据
+            for (let tmp of versionList) {
+                if (tmp._id.toString() === id) {
+                    selectedVersion = tmp;
+                    break;
+                }
+            }
+
+            selectedVersion = Object.keys(selectedVersion).length <= 0 ? versionList[0] : selectedVersion;
+
+        } catch (error) {
+            console.log(error);
+        }
+
+        let renderData = {
+            id: id,
+            versionList: versionList,
+            selectedVersion: selectedVersion,
+            billList: JSON.stringify(billList),
+            rationList: JSON.stringify(rationList),
+            province: JSON.stringify(province),
+            layout: 'users/views/layout/layout'
+        };
+
+        response.render('users/views/version/index', renderData);
+    }
+
+    /**
+     * 新增版本操作
+     *
+     * @param {object} request
+     * @param {object} response
+     * @return {void}
+     */
+    async add(request, response) {
+        let name = request.body.name;
+        let standardBillId = request.body.standard_bill_id;
+        let standardBill = request.body.standard_bill;
+        let rationLibId = request.body.ration_lib_id;
+        let rationLib = request.body.ration_lib;
+
+        let responseData = {
+            err: 0,
+            msg: ''
+        };
+        try {
+            let insertData = {
+                name: name,
+                standard_bill: [{id: standardBillId, name: standardBill}],
+                ration_lib: [{id: rationLibId, name: rationLib}]
+            };
+
+            let versionModel = new VersionModel();
+            let result = await versionModel.add(insertData);
+
+            if (!result) {
+                throw '新增版本失败';
+            }
+        } catch (error) {
+            console.log(error);
+            responseData.err = 1;
+            responseData.msg = error;
+        }
+
+        response.json(responseData);
+    }
+
+    /**
+     * 新增标准清单/定额库
+     *
+     * @param {object} request
+     * @param {object} response
+     * @return {void}
+     */
+    async addLib(request, response) {
+        let responseData = {
+            err: 0,
+            msg: ''
+        };
+        try {
+            let versionModel = new VersionModel();
+            let addResult = await versionModel.addLib(request.body);
+            if (!addResult) {
+                throw '新增失败';
+            }
+        } catch (error) {
+            responseData.err = 1;
+            responseData.msg = error;
+        }
+
+        response.json(responseData);
+    }
+
+    /**
+     * 删除对应的标准清单/定额库
+     *
+     * @param {object} request
+     * @param {object} response
+     * @return {void}
+     */
+    async deleteLib(request, response) {
+        let id = request.body.id;
+        let model = request.body.model;
+        let deleteId = request.body.delete_id;
+        let responseData = {
+            err: 0,
+            msg: ''
+        };
+        try {
+            let versionModel = new VersionModel();
+            let result = await versionModel.deleteLib(id, deleteId, model);
+
+            if (!result) {
+                throw '删除失败';
+            }
+        } catch (error) {
+            responseData.err = 1;
+            responseData.msg = error;
+        }
+
+        response.json(responseData);
+    }
+
+}
+
+export default VersionController;

+ 26 - 0
modules/users/models/schemas/version.js

@@ -0,0 +1,26 @@
+/**
+ * 版本管理数据模型
+ *
+ * @author CaiAoLin
+ * @date 2017/7/28
+ * @version
+ */
+import mongoose from "mongoose";
+
+let Schema = mongoose.Schema;
+let collectionName = 'version';
+let modelSchema = {
+    // 自增id
+    id: {
+        type: Number,
+        index: true
+    },
+    // 名称
+    name: String,
+    // 标准清单
+    standard_bill: Schema.Types.Mixed,
+    // 定额库
+    ration_lib: Schema.Types.Mixed
+};
+let model = mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));
+export {model as default, collectionName as collectionName};

+ 158 - 0
modules/users/models/version_model.js

@@ -0,0 +1,158 @@
+/**
+ * 版本管理业务逻辑模型
+ *
+ * @author CaiAoLin
+ * @date 2017/7/28
+ * @version
+ */
+import BaseModel from "../../common/base/base_model";
+import VersionSchema from "./schemas/version";
+
+class VersionModel extends BaseModel {
+
+    /**
+     * 构造函数
+     *
+     * @return {void}
+     */
+    constructor() {
+        let parent = super();
+        parent.model = VersionSchema;
+        parent.init();
+    }
+
+    /**
+     * 获取版本列表
+     *
+     * @return {Promise}
+     */
+    async getVersionList() {
+        let versionData = await this.findDataByCondition({name: {$ne: ''}}, null, false);
+
+        return versionData === null ? [] : versionData;
+    }
+
+    /**
+     * 设置场景
+     *
+     * @param {string} scene
+     * @return {void}
+     */
+    setScene(scene = '') {
+        switch (scene) {
+            // 新增
+            case 'add':
+                this.model.schema.path('name').required(true);
+                this.model.schema.path('standard_bill').required(true);
+                this.model.schema.path('ration_lib').required(true);
+                break;
+        }
+    }
+
+    /**
+     * 新增版本
+     *
+     * @param {Object} data
+     * @return {Promise}
+     */
+    async add(data) {
+        let result = false;
+        if (Object.keys(data).length <= 0) {
+            return result;
+        }
+
+        result = this.db.create(data);
+        return result;
+    }
+
+    /**
+     * 新增标准清单/定额库
+     *
+     * @param {Object} postData
+     * @return {Promise}
+     */
+    async addLib(postData) {
+        if (postData.id === undefined || postData.model === undefined) {
+            throw '参数错误';
+        }
+        let model = postData.model;
+        let id = postData.id;
+        let standardBillId = postData.standard_bill_id;
+        let standardBill = postData.standard_bill;
+        let rationLibId = postData.ration_lib_id;
+        let rationLib = postData.ration_lib;
+
+        switch (model) {
+            case 'bill':
+                if (standardBillId === undefined || standardBill === undefined) {
+                    throw '参数错误';
+                }
+                break;
+            case 'ration':
+                if (rationLibId === undefined || rationLib === undefined) {
+                    throw '参数错误';
+                }
+                break;
+        }
+
+        let versionData = await this.findDataByCondition({_id: id});
+        if (versionData === null || versionData.standard_bill === undefined) {
+            throw '没有找到对应的数据';
+        }
+
+        let updateData = {};
+        let field = model === 'bill' ? 'standard_bill' : 'ration_lib';
+        let tmpData = {
+            id: model === 'bill' ? standardBillId : rationLibId,
+            name: model === 'bill' ? standardBill : rationLib
+        };
+        versionData[field].push(tmpData);
+        updateData[field] = versionData[field];
+
+        let result = await this.db.update({_id: id}, updateData);
+
+        return result.ok === undefined ? false : result.ok;
+    }
+
+    /**
+     * 删除对应的标准清单库/定额库
+     *
+     * @param {Number} id
+     * @param {Number} libId
+     * @param {String} model
+     * @return {Promise}
+     */
+    async deleteLib(id, libId, model) {
+        let versionData = await this.findDataByCondition({_id: id});
+        if (versionData === null || versionData.standard_bill === undefined) {
+            throw '没有找到对应的数据';
+        }
+
+        let field = model === 'bill' ? 'standard_bill' : 'ration_lib';
+        if (versionData[field].length <= 0) {
+            throw '没有对应的库数据';
+        }
+
+        let own = false;
+        for (let index in versionData[field]) {
+            if (versionData[field][index].id === libId) {
+                versionData[field].splice(index, 1);
+                own = true;
+                break;
+            }
+        }
+
+        if (!own) {
+            throw '没有对应的库数据';
+        }
+        let updateData = {};
+        updateData[field] = versionData[field];
+        let result = await this.db.update({_id: id}, updateData);
+
+        return result.ok === undefined ? false : result.ok;
+    }
+
+
+}
+
+export default VersionModel;

+ 22 - 0
modules/users/routes/version_route.js

@@ -0,0 +1,22 @@
+/**
+ * 版本管理路由
+ *
+ * @author CaiAoLin
+ * @date 2017/7/28
+ * @version
+ */
+import Express from "express";
+import VersionController from "../controllers/version_controller";
+
+const router = Express.Router();
+const versionController = new VersionController();
+
+module.exports =function (app) {
+    // action定义区域
+    router.get('/', versionController.auth, versionController.init, versionController.index);
+    router.post('/add', versionController.auth, versionController.init, versionController.add);
+    router.post('/addLib', versionController.auth, versionController.init, versionController.addLib);
+    router.post('/deleteLib', versionController.auth, versionController.init, versionController.deleteLib);
+
+    app.use("/version", router);
+};

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

@@ -33,6 +33,7 @@ var sheetCommonObj = {
         var spreadBook = new GC.Spread.Sheets.Workbook(container, { sheetCount: 1 });
         spreadBook.options.tabStripVisible = false;
         spreadBook.options.showHorizontalScrollbar = false;
+        spreadBook.options.scrollbarMaxAlign = true;
         var spreadNS = GC.Spread.Sheets;
         var sheet = spreadBook.getSheet(0);
         sheet.suspendPaint();

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

@@ -130,7 +130,6 @@
 </script>
 <script>
     let userId = '<%= userID %>';
-    console.log(`userID: ${userId}`);
     //let userAccount = '<%= userAccount %>';
     mainAjax.getStdBillsLib(userId);
     $(document).ready(function(){

+ 21 - 8
web/maintain/bills_lib/html/neirong.html

@@ -164,6 +164,27 @@
             </div>
         </div>
     </div>
+    <!--弹出提示窗口-->
+    <button id="alertBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#alertDiv" style="display: none"></button>
+    <div class="modal fade" id="alertDiv" data-backdrop="static" style="display: none;" aria-hidden="true">
+        <input type="hidden"  value="123">
+        <div class="modal-dialog" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h5 class="modal-title">警告</h5>
+                    <button type="button" id="alertCls" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">×</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <h5 class="text-danger" id="alertTxt">编号不存在,请重新输入!</h5>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-danger" id="alertCof" data-dismiss="modal">确认</button>
+                </div>
+            </div>
+        </div>
+    </div>
     <!-- JS. -->
     <script src="/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
     <script>GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
@@ -287,13 +308,7 @@
                         crossedDatas.push(crossedData);
                     }
                 }
-                console.log(`uncD`);
-                console.log(uncrossedDatas);
-                console.log(`cD`);
-                console.log(crossedDatas);
                 let encapDatas = tools.encapTotalJobsDatas(sheet, totalJobs, uncrossedDatas, crossedDatas);
-                console.log(`encapD`);
-                console.log(encapDatas);
                 if(encapDatas.updateDatas.length > 0 || encapDatas.createDatas.length >0){
                     jobsAjax.pasteJobs(encapDatas, function(datas){
                         pasteController.pasteJobsFront(sheet, totalJobs,datas);
@@ -304,8 +319,6 @@
                 }
             });
         }
-
-
   	</SCRIPT>
 </body>
 <script type="text/javascript">

+ 166 - 44
web/maintain/bills_lib/html/qingdan.html

@@ -46,7 +46,7 @@
                               <a class="nav-link text-primary" doing="false" fcsOnBills="true" id="insert" href="javascript: void(0);"><i class="fa fa-share" aria-hidden="true"></i>插入</a>
                           </li>
                           <li class="nav-item">
-                              <a class="nav-link text-primary" doin="false" fcsOnBills="true" id ="delete" href="javascript:void (0)"><i class="fa fa-remove" aria-hidden="true"></i>删除</a>
+                              <a class="nav-link text-primary" doing="false" fcsOnBills="true" id ="delete" href="javascript:void (0)"><i class="fa fa-remove" aria-hidden="true"></i>删除</a>
                           </li>
                           <li class="nav-item">
                               <a class="nav-link text-primary" doing="false" fcsOnBills="true" id="upLevel"  href="javascript: void(0);"><i class="fa fa-arrow-left" aria-hidden="true"></i>升级</a>
@@ -55,10 +55,10 @@
                               <a class="nav-link text-primary" doing="false" fcsOnBills="true" id="downLevel" href="javascript: void(0);"><i class="fa fa-arrow-right" aria-hidden="true"></i>降级</a>
                           </li>
                           <li class="nav-item">
-                              <a class="nav-link text-primary" doing="false" fcsOnBills="true" id="upMove" href="javascript: void(0);"><i class="fa fa-arrow-up" aria-hidden="true"></i>上移</a>
+                              <a class="nav-link text-primary" doing="false" fcsOnBills="true" canMove="false" id="upMove" href="javascript: void(0);"><i class="fa fa-arrow-up" aria-hidden="true"></i>上移</a>
                           </li>
                           <li class="nav-item">
-                              <a class="nav-link text-primary" doing="false" fcsOnBills="true" id="downMove" href="javascript: void(0);"><i class="fa fa-arrow-down" aria-hidden="true"></i>下移</a>
+                              <a class="nav-link text-primary" doing="false" fcsOnBills="true" canMove="false" id="downMove" href="javascript: void(0);"><i class="fa fa-arrow-down" aria-hidden="true"></i>下移</a>
                           </li>
                       </ul>
                   </div>
@@ -203,10 +203,24 @@
         </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>
+    <button id="alertBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#alertDiv" style="display: none"></button>
+    <div class="modal fade" id="alertDiv" data-backdrop="static" style="display: none;" aria-hidden="true">
+        <input type="hidden"  value="123">
+        <div class="modal-dialog" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h5 class="modal-title">警告</h5>
+                    <button type="button" id="alertCls" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">×</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <h5 class="text-danger" id="alertTxt">编号不存在,请重新输入!</h5>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-danger" id="alertCof" data-dismiss="modal">确认</button>
+                </div>
+            </div>
         </div>
     </div>
     <!-- JS. -->
@@ -290,17 +304,35 @@
             if(btnUpMove.attr('doing') === 'false' && btnUpMove.attr('fcsOnBills') === 'true'){
                 dbController.upMove(controller, btnUpMove);
             }
+            //refSheet
+            else if(btnUpMove.attr('doing') === 'false' && btnUpMove.attr('fcsOnBills') === 'false' && btnUpMove.attr('canMove') === 'true'){
+                if(controller.tree.selected.field === 'job'){
+                    jobsController.upMove(controller, jobsSpread.getActiveSheet());
+                }
+                else if(controller.tree.selected.field === 'item'){
+                    itemsController.upMove(controller, itemsSpread.getActiveSheet());
+                }
+            }
         });
         btnDownMove.click(function(){
             if(btnDownMove.attr('doing') === 'false' && btnDownMove.attr('fcsOnBills') === 'true'){
                 dbController.downMove(controller, btnDownMove);
             }
+            else if(btnDownMove.attr('doing') === 'false' && btnDownMove.attr('fcsOnBills') === 'false' && btnDownMove.attr('canMove') === 'true'){
+                if(controller.tree.selected.field === 'job'){
+                    jobsController.downMove(controller, jobsSpread.getActiveSheet());
+                }
+                else if(controller.tree.selected.field === 'item'){
+                    itemsController.downMove(controller, itemsSpread.getActiveSheet());
+                }
+            }
         });
     }
 
 
     function showBillsSheet(datas, jobsSheet, itemsSheet, setting) {
         let billsSpread = new GC.Spread.Sheets.Workbook($('#spreadBills')[0], {sheetCount: 1});
+        billsSpread.focus(true);
         setSheet.initSheet(billsSpread, setting, true);
         myKey.delKey(billsSpread);
         billsTree.loadDatas(datas);
@@ -320,7 +352,7 @@
         //补注内容改变
         rechargeChange(controller);
         //焦点控制
-        switchFcs(controller, controller.sheet, jobsSheet, itemsSheet);
+        switchFcs(controller, controller.sheet, billsSpread, jobsSheet, itemsSheet);
         //jobs
         jobOperation(controller, jobsSheet, function(totalJobs){
             //------关联表粘贴复制
@@ -334,42 +366,135 @@
         });
     }
 
-    function switchFcs(controller, billsSheet, jobsSheet, itemsSheet){
+    function switchFcs(controller, billsSheet, billsSpread, jobsSheet, itemsSheet){
+        let btnInsert = $('#insert');
+        let btnDelete = $('#delete');
+        let btnUpMove = $('#upMove');
+        let btnDownMove = $('#downMove');
+        let btnUpLevel = $('#upLevel');
+        let btnDownLevel = $('#downLevel');
+       // billsSheet.clearSelection();
+       // billsSheet.options.isProtected = true;
+       // controller.setTreeSelected(null);
         billsSheet.bind(GC.Spread.Sheets.Events.CellClick, function (sender, args) {
-            $('#insert').attr('fcsOnBills', 'true');
-            $('#delete').attr('fcsOnBills', 'true');
-            $('#upLevel').attr('fcsOnBills', 'true');
-            $('#downLevel').attr('fcsOnBills', 'true');
-            jobsSheet.clearSelection();
-            itemsSheet.clearSelection();
+           // if(billsSheet.options.isProtected){
+                jobsSheet.clearSelection();
+                itemsSheet.clearSelection();
+                billsSpread.focus(true);
+                jobsSheet.options.isProtected = true;
+                itemsSheet.options.isProtected = true;
+                billsSheet.options.isProtected = false;
+
+                btnInsert.attr('fcsOnBills', 'true');
+                btnDelete.attr('fcsOnBills', 'true');
+                btnUpLevel.attr('fcsOnBills', 'true');
+                btnDownLevel.attr('fcsOnBills', 'true');
+                btnUpMove.attr('fcsOnBills', 'true');
+                btnDownMove.attr('fcsOnBills', 'true');
+          //  }
+               // jobsSheet.clearSelection();
+               // itemsSheet.clearSelection();
+                //billsSheet.options.isProtected = false;
+               /* jobsSheet.options.isProtected = true;
+                itemsSheet.options.isProtected = true;
+                let activeRow = billsSheet.getActiveRowIndex();
+                let activeCol = billsSheet.getActiveColumnIndex();
+                billsSheet.setActiveCell(activeRow === 0 ? 1: 0, 0);
+                billsSheet.setActiveCell(activeRow, activeCol);*/
+               // controller.setTreeSelected(controller.tree.findNode(billsSheet.getTag(activeRow, activeCol)));
+          //  }
         });
         jobsSheet.bind(GC.Spread.Sheets.Events.CellClick, function (sender, args) {
-            $('#insert').attr('fcsOnBills', 'false');
-            $('#delete').attr('fcsOnBills', 'false');
-            $('#upLevel').attr('fcsOnBills', 'false');
-            $('#downLevel').attr('fcsOnBills', 'false');
-            let selected;
-            if(controller.tree.selected){
-                 selected = controller.tree.selected.jobs[args.row];
-            }
-            if(tools.canUpMove(selected, controller.tree.selected.jobs)){
-            }
-            itemsSheet.clearSelection();
-            itemsSheet.options.isProtected = true;
-            jobsSheet.options.isProtected = false;
+           // if(jobsSheet.options.isProtected){
+                itemsSheet.clearSelection();
+                jobsSpread.focus(true);
+                itemsSheet.options.isProtected = true;
+                billsSheet.options.isProtected = true;
+                jobsSheet.options.isProtected = false;
+                controller.tree.selected.args = args;
+                controller.tree.selected.field = 'job';
+                tools.btnClose(btnInsert);
+                tools.btnClose(btnDelete);
+                tools.btnClose(btnUpLevel);
+                tools.btnClose(btnDownLevel);
+                btnInsert.attr('fcsOnBills', 'false');
+                btnDelete.attr('fcsOnBills', 'false');
+                btnUpLevel.attr('fcsOnBills', 'false');
+                btnDownLevel.attr('fcsOnBills', 'false');
+                btnUpMove.attr('fcsOnBills', 'false');
+                btnDownMove.attr('fcsOnBills', 'false');
+                let selected;
+                if(controller.tree.selected){
+                    selected = controller.tree.selected.jobs[args.row];
+                    console.log(`selected`);
+                    console.log(selected);
+                }
+                if(tools.canUpMove(selected, controller.tree.selected.jobs)){
+                    tools.btnAction(btnUpMove);
+                    btnUpMove.attr('canMove', 'true');
+                    console.log(`canup`);
+                }
+                else{
+                    tools.btnClose(btnUpMove);
+                    btnUpMove.attr('canMove', 'false');
+                    console.log(`nocan`);
+                }
+                if(tools.canDownMove(selected, controller.tree.selected.jobs)){
+                    tools.btnAction(btnDownMove);
+                    btnDownMove.attr('canMove', 'true');
+                }
+                else{
+                    tools.btnClose(btnDownMove);
+                    btnDownMove.attr('canMove', 'false');
+                }
+            //}
         });
         itemsSheet.bind(GC.Spread.Sheets.Events.CellClick, function (sender, args) {
-            $('#insert').attr('fcsOnBills', 'false');
-            $('#delete').attr('fcsOnBills', 'false');
-            $('#upLevel').attr('fcsOnBills', 'false');
-            $('#downLevel').attr('fcsOnBills', 'false');
-            if(controller.tree.selected){
-                let selected = controller.tree.selected.items[args.row];
-            }
-            jobsSheet.clearSelection();
-            jobsSheet.options.isProtected = true;
-            itemsSheet.options.isProtected = false;
-        })
+           // if(itemsSheet.options.isProtected){
+                jobsSheet.clearSelection();
+                itemsSpread.focus(true);
+                jobsSheet.options.isProtected = true;
+                billsSheet.options.isProtected = true;
+                itemsSheet.options.isProtected = false;
+                /*let activeRow = itemsSheet.getActiveRowIndex();
+                let activeCol = itemsSheet.getActiveColumnIndex();
+                itemsSheet.setActiveCell(activeRow === 0 ? 1: 0, 0);
+                itemsSheet.setActiveCell(activeRow, activeCol);*/
+
+                controller.tree.selected.args = args;
+                controller.tree.selected.field = 'item';
+                tools.btnClose(btnInsert);
+                tools.btnClose(btnDelete);
+                tools.btnClose(btnUpLevel);
+                tools.btnClose(btnDownLevel);
+                btnInsert.attr('fcsOnBills', 'false');
+                btnDelete.attr('fcsOnBills', 'false');
+                btnUpLevel.attr('fcsOnBills', 'false');
+                btnDownLevel.attr('fcsOnBills', 'false');
+                btnUpMove.attr('fcsOnBills', 'false');
+                btnDownMove.attr('fcsOnBills', 'false');
+                let selected;
+                if(controller.tree.selected){
+                    selected = controller.tree.selected.items[args.row];
+                }
+                if(tools.canUpMove(selected, controller.tree.selected.items)){
+                    tools.btnAction(btnUpMove);
+                    btnUpMove.attr('canMove', 'true');
+                }
+                else{
+                    tools.btnClose(btnUpMove);
+                    btnUpMove.attr('canMove', 'false');
+                }
+                if(tools.canDownMove(selected, controller.tree.selected.items)){
+                    tools.btnAction(btnDownMove);
+                    btnDownMove.attr('canMove', 'true');
+                }
+                else{
+                    tools.btnClose(btnDownMove);
+                    btnDownMove.attr('canMove', 'false');
+                }
+            //}
+        });
     };
 
     function setTagID(controller, setting){
@@ -482,8 +607,8 @@
             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'){
+                    tools.clearData(sheet);
                     let jobs = controller.tree.selected.jobs;
                     setSheet.setMaxRowCount(sheet, jobs);
                     if(jobs.length > 0){
@@ -493,6 +618,7 @@
                     sheetDatas = tools.getsheetDatas(sheet, 'jobs');
                 }
                 if(field === 'items'){
+                    tools.clearData(sheet);
                     let items = controller.tree.selected.items;
                     setSheet.setMaxRowCount(sheet, items);
                     if(items.length > 0){
@@ -502,10 +628,6 @@
                     sheetItemsDatas = tools.getsheetDatas(sheet, 'items');
                 }
             }
-            else {
-                tools.clearData(sheet);
-                $('#exampleTextarea').val('');
-            }
         });
     }
 

+ 21 - 0
web/maintain/bills_lib/html/tezheng.html

@@ -165,6 +165,27 @@
             </div>
         </div>
     </div>
+    <!--弹出提示窗口-->
+    <button id="alertBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#alertDiv" style="display: none"></button>
+    <div class="modal fade" id="alertDiv" data-backdrop="static" style="display: none;" aria-hidden="true">
+        <input type="hidden"  value="123">
+        <div class="modal-dialog" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h5 class="modal-title">警告</h5>
+                    <button type="button" id="alertCls" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">×</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <h5 class="text-danger" id="alertTxt">编号不存在,请重新输入!</h5>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-danger" id="alertCof" data-dismiss="modal">确认</button>
+                </div>
+            </div>
+        </div>
+    </div>
     <!-- JS. -->
     <script src="/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
     <script>GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>

+ 13 - 0
web/maintain/bills_lib/scripts/bills_lib_ajax.js

@@ -284,6 +284,19 @@ var billsAjax = {
             }
         })
     },
+    updateSerialNo: function (billsLibId, billsId, updateArr, field, callback) {
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/updateSerialNo',
+            data: {data: JSON.stringify({billsLibId: billsLibId, billsId: billsId, updateArr: updateArr, field: field})},
+            dataType: 'json',
+            success: function (result) {
+                if(!result.error && callback){
+                    callback();
+                }
+            }
+        });
+    },
     updateBillsArr: function(billsLibId, updateId, orgId, newId, type, classify, callback){
         $.ajax({
             type: 'post',

+ 228 - 76
web/maintain/bills_lib/scripts/db_controller.js

@@ -3,7 +3,8 @@
  */
 var dbController = {
     insert: function(controller, btn){
-        tools.btnClose(btn, 'doing');
+        tools.btnClose(btn);
+        btn.attr('doing', 'true');
         if(controller.tree.items.length === 0){
             controller.tree.maxNodeID(0);
             let newNodeId = controller.tree.newNodeID();
@@ -12,7 +13,8 @@ var dbController = {
                 controller.tree.selected.jobs = new Array();
                 controller.tree.selected.items = new Array();
                 controller.sheet.setTag(controller.tree.selected.serialNo(), 0, newNodeId);
-                tools.btnAction(btn, 'doing');
+                tools.btnAction(btn);
+                btn.attr('doing', 'false');
             });
         }
         else {
@@ -27,7 +29,8 @@ var dbController = {
                     controller.tree.selected.items = new Array();
                     controller.sheet.setTag(controller.tree.selected.serialNo(), 0, newNodeId);
                     sheetBillsDatas = tools.getsheetDatas(controller.sheet, 'bills', controller);
-                     tools.btnAction(btn, 'doing');
+                     tools.btnAction(btn);
+                    btn.attr('doing', 'false');
                 });
             }
             else {
@@ -41,14 +44,16 @@ var dbController = {
                     controller.tree.selected.items = new Array();
                     controller.sheet.setTag(controller.tree.selected.serialNo(), 0, newNodeId);
                     sheetBillsDatas = tools.getsheetDatas(controller.sheet, 'bills', controller);
-                    tools.btnAction(btn, 'doing');
+                    tools.btnAction(btn);
+                    btn.attr('doing', 'false');
                 });
             }
         }
     },
 
     upLevel: function(controller, btn){
-        tools.btnClose(btn, 'doing');
+        tools.btnClose(btn);
+        btn.attr('doing', 'true');
         var node = controller.tree.selected;
         var ids = [];
         var updateData = [];
@@ -94,7 +99,8 @@ var dbController = {
                 }
                 billsAjax.upLevel(billsLibId, updateData, function(){
                     console.log(`enter upL`);
-                    tools.btnAction(btn, 'doing');
+                    tools.btnAction(btn);
+                    btn.attr('doing', 'false');
                     controller.upLevel();
                     sheetBillsDatas = tools.getsheetDatas(controller.sheet, 'bills', controller);
                 });
@@ -104,7 +110,8 @@ var dbController = {
     },
 
     downLevel: function(controller, btn){
-        tools.btnClose(btn, 'doing');
+        tools.btnClose(btn);
+        btn.attr('doing', 'true');
         var node = controller.tree.selected;
         var updateData = [];
         if(node){
@@ -131,7 +138,8 @@ var dbController = {
                     updateData.push(updateC);
                 }
                 billsAjax.downLevel(billsLibId, updateData, function(){
-                    tools.btnAction(btn, 'doing');
+                    tools.btnAction(btn);
+                    btn.attr('doing', 'false');
                     controller.downLevel();
                     sheetBillsDatas = tools.getsheetDatas(controller.sheet, 'bills', controller);
                 });
@@ -141,7 +149,9 @@ var dbController = {
     },
 
     delete: function(controller, btn, totalJobs, totalItems){
-        tools.btnClose(btn, 'doing');
+        tools.btnClose(btn);
+        btn.attr('doing', 'true');
+        console.log(`beforeNodeId :${controller.tree.selected.getID()}`);
         var node = controller.tree.selected;
         if(node){
             var deleteIds = [];
@@ -159,7 +169,8 @@ var dbController = {
             getDeleteIds(node);
             let updateNode = node.preSibling ? {ID: node.preSibling.getID(), NextSiblingID: node.getNextSiblingID()} : null;
             billsAjax.deleteBills(billsLibId, deleteIds, updateNode, function(){
-                tools.btnAction(btn, 'doing');
+                tools.btnAction(btn);
+                btn.attr('doing', 'false');
                 controller.delete();
                 //to solve refresh after deleted
                 let jobsSheet = jobsSpread.getActiveSheet();
@@ -194,7 +205,8 @@ var dbController = {
     },
 
     upMove: function(controller, btn){
-        tools.btnClose(btn, 'doing');
+        tools.btnClose(btn);
+        btn.attr('doing', 'true');
         var node = controller.tree.selected;
         var updateData = [];
         if(node){
@@ -217,7 +229,8 @@ var dbController = {
                     updateData.push(updateC);
                 }
                 billsAjax.upMove(billsLibId, updateData, function(){
-                    tools.btnAction(btn, 'doing');
+                    tools.btnAction(btn);
+                    btn.attr('doing', 'false');
                     controller.upMove();
                     sheetBillsDatas = tools.getsheetDatas(controller.sheet, 'bills', controller);
                 });
@@ -226,7 +239,8 @@ var dbController = {
     },
 
     downMove: function(controller, btn){
-        tools.btnClose(btn, 'doing');
+        tools.btnClose(btn);
+        btn.attr('doing', 'true');
         var node = controller.tree.selected;
         var updateData = [];
         if(node){
@@ -252,7 +266,8 @@ var dbController = {
                     updateData.push(updateC);
                 }
                 billsAjax.downMove(billsLibId, updateData);
-                tools.btnAction(btn, 'doing');
+                tools.btnAction(btn);
+                btn.attr('doing', 'false');
                 controller.downMove();
                 sheetBillsDatas = tools.getsheetDatas(controller.sheet, 'bills', controller);
             }
@@ -398,6 +413,36 @@ var createObj = {
 };
 
 var tools = {
+    alertOpr: function(args, sheet, txt, arr, field){
+        $('#alertTxt').text(txt);
+        $('#alertBtn').click();
+        sheet.options.isProtected = true;
+        let dataCode = args.col === 0 ? 'code' : 'content';
+        let orgCode =  args.row < arr.length ? arr[args.row][field].data[dataCode] : '';
+        $('#alertCls').click(function () {
+            sheet.options.isProtected = false;
+            sheet.getCell(args.row, args.col).value(orgCode);
+        });
+        $('#alertCof').click(function () {
+            sheet.options.isProtected = false;
+            sheet.getCell(args.row, args.col).value(orgCode);
+        });
+    },
+    alertTotalOpr: function (args, txt, arr) {
+        $('#alertTxt').text(txt);
+        $('#alertBtn').click();
+        args.sheet.options.isProtected = true;
+        let dataCode =  args.col === 0 ? 'code' : 'content';
+        let orgCode =  args.row < arr.length ? arr[args.row].data[dataCode] : '';
+        $('#alertCls').click(function () {
+            args.sheet.options.isProtected = false;
+            args.sheet.getCell(args.row, args.col).value(orgCode);
+        });
+        $('#alertCof').click(function () {
+            args.sheet.options.isProtected = false;
+            args.sheet.getCell(args.row, args.col).value(orgCode);
+        });
+    },
     //ref sheet up&down Move
     canUpMove: function (selected, arr) {
         return selected && arr.indexOf(selected) > 0 && arr.indexOf(selected) !== -1 ? true: false;
@@ -1101,17 +1146,11 @@ var tools = {
             }
             if(rebuildArr.length > 0){
                 rebuildArr.sort(myCompareCode);
-                console.log(`rebuiArr`);
-                console.log(rebuildArr);
                 if(rebuildArr[0].code){
                     maxJobsNumber = maxJobsNumber + 1 > rebuildArr[0].code ? maxJobsNumber  : rebuildArr[0].code;
-                    console.log(`maxJobs`);
-                    console.log(maxJobsNumber);
                 }
                 rebuildArr.forEach(function(data){
                     if(data.type !== 'CreateT' && data.field === 'content' ){
-                        console.log(`!CT&&Content`);
-                        console.log(data);
                         maxJobsNumber++;
                         let code = maxJobsNumber;
                         data.code = code;
@@ -1615,12 +1654,13 @@ var jobsController = {
                 }
                 //处理重复
                 if(isRepeat){
-                    if(id && newData){
-                        sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).value(orgJobData);
-                    }
-                    else {
-                        sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).value('');
-                    }
+                    ///if(id && newData){
+                       tools.alertOpr(args, sheet, '该工作内容已存在!', controller.tree.selected.jobs, 'job');
+                  //  }
+                  //  else {
+                        //sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).value('');
+                      //  tools.alertOpr(sheet, controller.tree.selected.jobs, 'jobs');
+                   // }
                 }
             }
             else {
@@ -1648,7 +1688,7 @@ var jobsController = {
             });
         }
         else {
-            sheet.getCell(args.row, args.col).value('');
+            tools.alertOpr(args, sheet, '该编号不存在,请重新输入!', controller.tree.selected.jobs, 'job');
         }
     },
 
@@ -1682,10 +1722,8 @@ var jobsController = {
                     let index = tools.getIndex(controller.tree.selected.jobs, id, 'job');//update-- getIndex
                     job.count++;
                     controller.tree.selected.jobs.splice(index, 1);
-                    //controller.tree.selected.jobs.splice(index, 0, job);//update--
                     controller.tree.selected.jobs.splice(index, 0, {job: job, serialNo: serialNo});//update--
                     billsAjax.updateBillsArr(billsLibId, controller.tree.selected.getID(), id, job.data.id, 'update', 'jobs');
-                    //tools.reshowData(sheet, controller.tree.selected.jobs, setting, true);//update--
                     tools.orderReshowData(sheet, controller.tree.selected.jobs, setting, 'job', true);
                 }
                 if(field === 'content' && job.data[field] === newData){
@@ -1721,17 +1759,88 @@ var jobsController = {
                 });
             }
             else {
-                //todo: 提示窗口
+               tools.alertOpr(args, sheet, '该编号不存在,请重新输入!', controller.tree.selected.jobs, 'job');
+              /*  //todo: 提示窗口
+                console.log(`enter`);
+                console.log(typeof newData);
                 if(typeof newData === 'number'){
+                    console.log(`orgJobData: ${orgJobData}`);
                     sheet.getCell(args.row, args.col).value(orgJobData);
                 }
                 else {
                   //编号只能是数字
                     sheet.getCell(args.row, args.col).value('');
-                }
+                }*/
+            }
+        }
+    },
+    upMove: function (controller, sheet) {
+        let updateSelArr = [];
+        $('#upMove').attr('doing', 'true');
+        tools.btnClose($('#upMove'));
+        let args = controller.tree.selected.args,
+            thisJob = controller.tree.selected.jobs[args.row],
+            preJob = controller.tree.selected.jobs[args.row - 1],
+            tempSerialNo;
+        //switch serialNo
+        tempSerialNo = thisJob.serialNo;
+        thisJob.serialNo = preJob.serialNo;
+        preJob.serialNo = tempSerialNo;
+        updateSelArr.push({id: thisJob.job.data.id, serialNo: thisJob.serialNo});
+        updateSelArr.push({id: preJob.job.data.id, serialNo: preJob.serialNo});
+        billsAjax.updateSerialNo(billsLibId, controller.tree.selected.getID(), updateSelArr, 'jobs', function () {
+            tools.orderReshowData(sheet, controller.tree.selected.jobs, jobsSetting, 'job', true);
+            sheet.setActiveCell(args.row -1, args.col);
+            controller.tree.selected.args.row = args.row - 1;
+            $('#upMove').attr('doing', 'false');
+            if(tools.canUpMove(controller.tree.selected.jobs[controller.tree.selected.args.row], controller.tree.selected.jobs)){
+                $('#upMove').attr('canMove', 'true');
+                tools.btnAction($('#upMove'));
+            }
+            else{
+                $('#upMove').attr('canMove', 'false');
+            }
+            if(tools.canDownMove(controller.tree.selected.jobs[controller.tree.selected.args.row], controller.tree.selected.jobs)){
+                $('#downMove').attr('canMove', true);
+                tools.btnAction($('#downMove'));
+            }
+            else{
+                $('#downMove').attr('canMove', 'false');
+                tools.btnClose($('#downMove'));
             }
-        }
+        });
     },
+    downMove: function (controller, sheet) {
+        let updateSelArr = [];
+        $('#downMove').attr('doing', 'true');
+        tools.btnClose($('#downMove'));
+        let tempSerialNo = controller.tree.selected.jobs[controller.tree.selected.args.row].serialNo;
+        controller.tree.selected.jobs[controller.tree.selected.args.row].serialNo = controller.tree.selected.jobs[controller.tree.selected.args.row + 1].serialNo;
+        controller.tree.selected.jobs[controller.tree.selected.args.row + 1].serialNo = tempSerialNo;
+        updateSelArr.push({id: controller.tree.selected.jobs[controller.tree.selected.args.row].job.data.id, serialNo: controller.tree.selected.jobs[controller.tree.selected.args.row].serialNo});
+        updateSelArr.push({id: controller.tree.selected.jobs[controller.tree.selected.args.row + 1].job.data.id, serialNo: controller.tree.selected.jobs[controller.tree.selected.args.row + 1].serialNo});
+        billsAjax.updateSerialNo(billsLibId, controller.tree.selected.getID(), updateSelArr, 'jobs', function () {
+            tools.orderReshowData(sheet, controller.tree.selected.jobs, jobsSetting, 'job', true);
+            sheet.setActiveCell(controller.tree.selected.args.row + 1, controller.tree.selected.args.col);
+            controller.tree.selected.args.row = controller.tree.selected.args.row + 1;
+            $('#downMove').attr('doing', 'false');
+            if(tools.canDownMove(controller.tree.selected.jobs[controller.tree.selected.args.row], controller.tree.selected.jobs)){
+                $('#downMove').attr('canMove', 'true');
+                tools.btnAction($('#downMove'));
+            }
+            else{
+                $('#downMove').attr('canMove', 'false');
+            }
+            if(tools.canUpMove(controller.tree.selected.jobs[controller.tree.selected.args.row], controller.tree.selected.jobs)){
+                $('#upMove').attr('canMove', 'true');
+                tools.btnAction($('#upMove'));
+            }
+            else{
+                $('#upMove').attr('canMove', 'false');
+                tools.btnClose($('#upMove'));
+            }
+        });
+    }
 
 };
 
@@ -1765,13 +1874,7 @@ var itemsController = {
                 }
                 //处理重复
                 if(isRepeat){
-                    //todo:redirect focus
-                    if(id && newData){
-                        sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).value(orgItemData);
-                    }
-                    else {
-                        sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).value('');
-                    }
+                    tools.alertOpr(args, sheet, '该项目特征已存在!', controller.tree.selected.items, 'item');
                 }
             }
             else {
@@ -1798,13 +1901,7 @@ var itemsController = {
             });
         }
         else {
-            if(typeof newData === 'number'){
-                sheet.getCell(args.row, args.col).value('');
-            }
-            else {
-                //编号只能为数字
-                sheet.getCell(args.row, args.col).value('');
-            }
+            tools.alertOpr(args, sheet, '该编号不存在,请重新输入!', controller.tree.selected.items, 'item');
         }
     },
 
@@ -1868,16 +1965,80 @@ var itemsController = {
                 });
             }
             else {
-                if(typeof newData === 'number'){
+                tools.alertOpr(args, sheet, '该编号不存在,请重新输入!', controller.tree.selected.items, 'item');
+            }
+              /*  if(typeof newData === 'number'){
                     sheet.getCell(args.row, args.col).value(orgItemData);
                 }
                 else {
                     //编号只能为数字
                     sheet.getCell(args.row, args.col).value('');
                 }
+            }*/
+        }
+    },
+    upMove: function (controller, sheet) {
+        let updateSelArr = [];
+        $('#upMove').attr('doing', 'true');
+        tools.btnClose($('#upMove'));
+        let tempSerialNo = controller.tree.selected.items[controller.tree.selected.args.row].serialNo;
+        controller.tree.selected.items[controller.tree.selected.args.row].serialNo = controller.tree.selected.items[controller.tree.selected.args.row -1].serialNo;
+        controller.tree.selected.items[controller.tree.selected.args.row -1].serialNo = tempSerialNo;
+        updateSelArr.push({id: controller.tree.selected.items[controller.tree.selected.args.row].item.data.id, serialNo: controller.tree.selected.items[controller.tree.selected.args.row].serialNo});
+        updateSelArr.push({id: controller.tree.selected.items[controller.tree.selected.args.row -1].item.data.id, serialNo: controller.tree.selected.items[controller.tree.selected.args.row -1].serialNo});
+        billsAjax.updateSerialNo(billsLibId, controller.tree.selected.getID(), updateSelArr, 'items', function () {
+            tools.orderReshowData(sheet, controller.tree.selected.items, itemsSetting, 'item', true);
+            sheet.setActiveCell(controller.tree.selected.args.row -1, controller.tree.selected.args.col);
+            controller.tree.selected.args.row = controller.tree.selected.args.row -1;
+            $('#upMove').attr('doing', 'false');
+            if(tools.canUpMove(controller.tree.selected.items[controller.tree.selected.args.row], controller.tree.selected.items)){
+                $('#upMove').attr('canMove', 'true');
+                tools.btnAction($('#upMove'));
+            }
+            else{
+                $('#upMove').attr('canMove', 'false');
+            }
+            if(tools.canDownMove(controller.tree.selected.items[controller.tree.selected.args.row], controller.tree.selected.items)){
+                $('#downMove').attr('canMove', 'true');
+                tools.btnAction($('#downMove'));
+            }
+            else{
+                $('#downMove').attr('canMove', 'false');
+                tools.btnClose($('#downMove'));
             }
-        }
+        });
     },
+    downMove: function (controller, sheet) {
+        let updateSelArr = [];
+        $('#downMove').attr('doing', 'true');
+        tools.btnClose($('#downMove'));
+        let tempSerialNo = controller.tree.selected.items[controller.tree.selected.args.row].serialNo;
+        controller.tree.selected.items[controller.tree.selected.args.row].serialNo = controller.tree.selected.items[controller.tree.selected.args.row + 1].serialNo;
+        controller.tree.selected.items[controller.tree.selected.args.row + 1].serialNo = tempSerialNo;
+        updateSelArr.push({id: controller.tree.selected.items[controller.tree.selected.args.row].item.data.id, serialNo: controller.tree.selected.items[controller.tree.selected.args.row].serialNo});
+        updateSelArr.push({id: controller.tree.selected.items[controller.tree.selected.args.row + 1].item.data.id, serialNo: controller.tree.selected.items[controller.tree.selected.args.row +1].serialNo});
+        billsAjax.updateSerialNo(billsLibId, controller.tree.selected.getID(), updateSelArr, 'items', function () {
+            tools.orderReshowData(sheet, controller.tree.selected.items, itemsSetting, 'item', true);
+            sheet.setActiveCell(controller.tree.selected.args.row +1, controller.tree.selected.args.col);
+            controller.tree.selected.args.row = controller.tree.selected.args.row +1;
+            $('#downMove').attr('doing', 'false');
+            if(tools.canDownMove(controller.tree.selected.items[controller.tree.selected.args.row], controller.tree.selected.items)){
+                $('#downMove').attr('canMove', 'true');
+                tools.btnAction($('#downMove'));
+            }
+            else{
+                $('#downMove').attr('canMove', 'false');
+            }
+            if(tools.canUpMove(controller.tree.selected.items[controlle.tree.selected.args.row], controller.tree.selected.items)){
+                $('#upMove').attr('canMove', 'true');
+                tools.btnAction($('#upMove'));
+            }
+            else{
+                $('#upMove').attr('canMove', 'false');
+                tools.btnClose($('#upMove'));
+            }
+        });
+    }
 
 };
 
@@ -2023,23 +2184,16 @@ var totalJobsController = {
                 totalJobsController.createJob(sheet, totalJobs, field, newData, args);
             }
             else if(tagId && !isRepeat && newData !== orgJobData){//update
-                    totalJobsController.updateJob(totalJobs, tagId, field, newData);
+                    totalJobsController.updateJob(totalJobs, tagId, field, newData, args);
             }
             if(isRepeat){
-                if(tagId && newData){
-                    sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).value(orgJobData);
-                }
-                else {
-                    sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).value('');
-                }
+                tools.alertTotalOpr(args, '该工作内容已存在!', totalJobs.jobsArr);
             }
         });
     },
 
     createJob: function(sheet, totalJobs, field, newData, args){
         if(field === 'content'){
-            console.log(`editMaJ`);
-            console.log(maxJobsNumber);
             maxJobsNumber++;
             let code = maxJobsNumber;
             jobsAjax.createJobContent(billsLibId, newData, code, function(newJobId){
@@ -2053,7 +2207,9 @@ var totalJobsController = {
             });
         }
         else {
-            if(typeof newData === 'number'){
+            let parseNum = parseInt(newData);
+            //if(typeof newData === 'number'){
+            if(!isNaN(parseNum)){
                 maxJobsNumber = maxJobsNumber >= newData ? maxJobsNumber : newData;
                 jobsAjax.createJobContent(billsLibId, '', newData, function(newJobId){
                     let newJobData, newJob;
@@ -2067,22 +2223,24 @@ var totalJobsController = {
             }
             else {
                 //编号只能为数字!
-                sheet.getCell(args.row, args.col).value("");
+                tools.alertTotalOpr(args, '编号只能为数字,请重新输入!', totalJobs.jobsArr);
+               // sheet.getCell(args.row, args.col).value("");
             }
         }
     },
 
-    updateJob: function(totalJobs, id, field, newData){
-        if(field === 'code' && typeof newData !== 'number'){
-            //编号只能为数字
+    updateJob: function(totalJobs, id, field, newData, args){
+       // if(field === 'code' && typeof newData !== 'number'){
+        if(field === 'code' && isNaN(parseInt(newData))){
+            tools.alertTotalOpr(args, '编号只能为数字,请重新输入!', totalJobs.jobsArr);
         }
         else {
-            console.log(`enterupdate id: ${id}`);
             totalJobs.jobsArr.forEach(function(job){
                 if(job.data.id === id){
                     job.data[field] = newData;
                 }
             });
+            tools.reshowData(args.sheet, totalJobs.jobsArr, totalJobsSetting, true);
             jobsAjax.updateJobContent(billsLibId, id, field, newData);
         }
     }
@@ -2108,12 +2266,7 @@ var totalItemsController = {
                     totalItemsController.updateItem(totalItems, tagId, field, newData);
             }
             if(isRepeat){
-                if(tagId && newData){
-                    sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).value(orgItemData);
-                }
-                else {
-                    sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).value('');
-                }
+                tools.alertTotalOpr(args, '该项目特征已存在!', totalItems.itemsArr);
             }
         });
     },
@@ -2134,7 +2287,7 @@ var totalItemsController = {
             });
         }
         else {
-            if(typeof newData === 'number'){
+            if(!isNaN(parseInt(newData))){
                 maxItemsNumber = maxItemsNumber >= newData ? maxItemsNumber : newData;
                 itemsAjax.createItemCharacter(billsLibId, '', newData, function(newItemId){
                     var newItemData, newItem;
@@ -2148,16 +2301,14 @@ var totalItemsController = {
                 });
             }
             else {
-                //编号只能为数字
-                sheet.getCell(args.row, args.col).value("");
+                tools.alertTotalOpr(args, '编号只能为数字,请重新输入!', totalItems.itemsArr);
             }
         }
     },
 
-    updateItem: function(totalItems, id, field, newData){
-        if(field === 'code' && typeof newData !== 'number'){
-            //编号只能为数字
-            sheet.getCell(args.row, args.col).value('');
+    updateItem: function(totalItems, id, field, newData, args){
+        if(field === 'code' && isNaN(parseInt(newData))){
+            tools.alertTotalOpr(args, '编号只能为数字,请重新输入!', totalItems.itemsArr);
         }
         else {
             totalItems.itemsArr.forEach(function(item){
@@ -2165,6 +2316,7 @@ var totalItemsController = {
                     item.data[field] = newData;
                 }
             });
+            tools.reshowData(args.sheet, totalItems.itemsArr, totalItemsSetting, true);
             itemsAjax.updateItemCharacter(billsLibId, id, field, newData);
         }
     }

+ 1 - 0
web/maintain/bills_lib/scripts/set_sheets.js

@@ -11,6 +11,7 @@ var setSheet = {
         spread.options.scrollbarMaxAlign = true;
         spread.options.allowCopyPasteExcelStyle = false;
         spread.options.allowExtendPasteRange = isExtendPaste? true : false;
+        spread.getActiveSheet().options.allowCellOverflow = false;
         sheet.showRowOutline(false);
        // sheet.defaults.rowHeight = 30;
         setting.cols.forEach(function(col, colIdx){

+ 52 - 1
web/maintain/ration_repository/dinge.html

@@ -10,6 +10,7 @@
    <!-- <link rel="stylesheet" href="/lib/css/bootstrap/themes.css">-->
     <link rel="stylesheet" href="/web/maintain/ration_repository/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
+    <link rel="stylesheet" href="/lib/jquery-contextmenu/jquery.contextMenu.css">
     <!--zTree-->
   	<link rel="stylesheet" href="/lib/ztree/css/zTreeStyle.css" type="text/css">
     <link rel="stylesheet" href="/lib/spreadjs/sheets/css/gc.spread.sheets.excel2013lightGray.10.0.1.css" type="text/css">
@@ -438,11 +439,61 @@
                 </div>
             </div>
         </div>
-
+        <!--弹出警告窗-->
+        <button id="rationAlertBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#rationAlert" style="display: none"></button>
+        <div class="modal fade" id="rationAlert" data-backdrop="static" style="display: none;" aria-hidden="true">
+            <input type="hidden" id="gdid" value="123">
+            <div class="modal-dialog" role="document">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h5 class="modal-title">取消确认</h5>
+                        <button type="button" id="rationAlertCls" class="close" data-dismiss="modal" aria-label="Close">
+                            <span aria-hidden="true">×</span>
+                        </button>
+                    </div>
+                    <div class="modal-body">
+                        <h5 class="text-danger" id="alertRationTxt">编号不可为空!是否取消操作?</h5>
+                    </div>
+                    <div class="modal-footer">
+                        <button type="button" class="btn btn-secondary" id="rationAlertCac" data-dismiss="modal">取消</button>
+                        <a href="javascript: void(0);" id="rationAlertCof" class="btn btn-danger" data-dismiss="modal">确认</a>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <button id="alertModalBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#alertModal" style="display: none"></button>
+        <div class="modal fade" id="alertModal" data-backdrop="static" style="display: none;" aria-hidden="true">
+            <input type="hidden" id="codedid" value="123">
+            <div class="modal-dialog" role="document">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h5 class="modal-title">警告</h5>
+                        <button type="button" id="alertModalCls" class="close" data-dismiss="modal" aria-label="Close">
+                            <span aria-hidden="true">×</span>
+                        </button>
+                    </div>
+                    <div class="modal-body">
+                        <h5 class="text-danger" id="alertText">输入的编号已存在,请重新输入!</h5>
+                    </div>
+                    <div class="modal-footer">
+                        <button type="button" class="btn btn-danger" id="alertModalCof" data-dismiss="modal">确认</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <!--contextMenu-->
+        <div class="contextMenu" id="myMenu">
+            <ul>
+                <li id="insert">添加</li>
+                <li id="delete">删除</li>
+            </ul>
+        </div>
         <!-- JS. -->
         <script src = "/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
         <script>GC.Spread.Sheets.LicenseKey = "559432293813965#A0y3iTOzEDOzkjMyMDN9UTNiojIklkI1pjIEJCLi4TPB9mM5AFNTd4cvZ7SaJUVy3CWKtWYXx4VVhjMpp7dYNGdx2ia9sEVlZGOTh7NRlTUwkWR9wEV4gmbjBDZ4ElR8N7cGdHVvEWVBtCOwIGW0ZmeYVWVr3mI0IyUiwCMzETN8kzNzYTM0IicfJye&Qf35VfiEzRwEkI0IyQiwiIwEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsIyNyMzM5ADI5ADNwcTMwIjI0ICdyNkIsIibj9SbvNmL4N7bjRnch56ciojIz5GRiwiI8+Y9sWY9QmZ0Jyp96uL9v6L0wap9biY9qiq95q197Wr9g+89iojIh94Wiqi";</script>
         <script src="/lib/jquery/jquery.min.js"></script>
+        <script src="/lib/jquery-contextmenu/jquery.contextMenu.min.js"></script>
+        <script src="/lib/jquery-contextmenu/jquery.ui.position.js"></script>
         <script src="/lib/tether/tether.min.js"></script>
         <script src="/lib/bootstrap/bootstrap.min.js"></script>
         <script type="text/javascript" src="/web/maintain/ration_repository/js/global.js"></script>

+ 2 - 2
web/maintain/ration_repository/gongliao.html

@@ -180,7 +180,7 @@
                     </button>
                 </div>
                 <div class="modal-body">
-                    <h5 class="text-danger">编号和类型不可为空!是否取消操作?</h5>
+                    <h5 class="text-danger" id="alertGljTxt">编号和类型不可为空!是否取消操作?</h5>
                 </div>
                 <div class="modal-footer">
                     <button type="button" class="btn btn-secondary" id="aleCanceBtn" data-dismiss="modal">取消</button>
@@ -189,7 +189,7 @@
             </div>
         </div>
     </div>
-    <div class="modal fade" id="codeAlert" data-backdrop="static" style="display: none;" aria-hidden="true">
+    <div class="modal" id="codeAlert" data-backdrop="static" style="display: none;" aria-hidden="true">
         <input type="hidden" id="codedid" value="123">
         <div class="modal-dialog" role="document">
             <div class="modal-content">

+ 214 - 19
web/maintain/ration_repository/js/ration.js

@@ -15,6 +15,7 @@ var rationOprObj = {
     currentRations: {},
     currentEditingRation: null,
     currentSectionId: -1,
+    rationsCodes: [],
     setting: {
         header:[
             {headerName:"编码",headerWidth:120,dataCode:"code", dataType: "String", formatter: "@"},
@@ -33,25 +34,33 @@ var rationOprObj = {
             ],
             lockedCells:[
                 {row:-1,col:3,rowCount:-1, colCount:1}
+            ],
+            lockColumns: [
+                3, 4, 5, 6
             ]
         }
     },
     buildSheet: function(container) {
+        let rationRepId = getQueryString("repository");
         var me = rationOprObj;
         me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30);
+        me.workBook.options.showHorizontalScrollbar = true;
+        me.getRationsCodes(rationRepId);
+        me.rationDelOpr();
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
+        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EnterCell, me.onEnterCell);
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditStarting, me.onCellEditStart);
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditEnded, me.onCellEditEnd);
-        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.RangeChanged, me.onRangeChanged);
+        //me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.RangeChanged, me.onRangeChanged);
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.CellClick, me.onCellClick);
     },
+
     onCellClick: function(sender, args) {
         var me = rationOprObj,
             sheetGLJ = rationGLJOprObj.sheet, settingGLJ = rationGLJOprObj.setting,
             sheetCoe = rationCoeOprObj.sheet, settingCoe = rationCoeOprObj.setting,
             sheetAss = rationAssistOprObj.sheet, settingAss = rationAssistOprObj.setting;
-
         sheetCommonObj.cleanSheet(sheetGLJ, settingGLJ, -1);
         sheetCommonObj.shieldAllCells(sheetGLJ);
         sheetCommonObj.cleanSheet(sheetCoe, settingCoe, -1);
@@ -116,7 +125,66 @@ var rationOprObj = {
         }
         return cacheSection;
     },
+    rationDelOpr: function () {
+        console.log(`rebuildDelete`);
+        let me = rationOprObj;
+        me.workBook.commandManager().register('rationDelete', function () {
+            let rationSheet = me.workBook.getActiveSheet();
+            let sels = rationSheet.getSelections(), updateArr = [], removeArr = [], lockCols = me.setting.view.lockColumns;
+            let cacheSection = me.getCache();
+            if(sels.length > 0){
+                for(let sel = 0; sel < sels.length; sel++){
+                    if(sels[sel].colCount === me.setting.header.length){
+                        if(cacheSection){
+                            for(let i = 0; i < sels[sel].rowCount; i++){
+                                if(sels[sel].row + i < cacheSection.length){
+                                    removeArr.push(cacheSection[sels[sel].row + i].ID);
+                                    me.rationsCodes.splice(me.rationsCodes.indexOf(cacheSection[sels[sel].row + i].code), 1);
+                                    console.log(`me.rationsCodes`);
+                                    console.log(me.rationsCodes);
+                                }
+                            }
+                        }
+                    }
+                    else{
+                        if(sels[sel].col === 0){
+                            $('#alertText').text("编号不能为空,修改失败!");
+                            $('#alertModalBtn').click();
+                            rationSheet.options.isProtected = true;
+                            $('#alertModalCls').click(function () {
+                                rationSheet.options.isProtected = false;
+                            });
+                            $('#alertModalCof').click(function () {
+                                rationSheet.options.isProtected = false;
+                            })
+                        }
+                        else if(sels[sel].col !== 0 && !(sels[sel].col === 3 && sels.col + sels[sel].colCount -1 === 6)){
+                            if(cacheSection){
+                                for(let i =0; i < sels[sel].rowCount; i++){
+                                    if(sels[sel].row + i < cacheSection.length){
+                                        for(let col = sels[sel].col; col <= sels[sel].col + sels[sel].colCount - 1; col++){
+                                            if(lockCols.indexOf(col) === -1){
+                                                cacheSection[sels[sel].row + i][me.setting.header[col].dataCode] = '';
+                                            }
+                                        }
+                                    }
+                                    updateArr.push(cacheSection[sels[sel].row + i]);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            if(updateArr.length > 0 || removeArr.length > 0){
+                me.mixUpdateRequest(updateArr, [], removeArr);
+            }
+
+        });
+        me.workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
+        me.workBook.commandManager().setShortcutKey('rationDelete', GC.Spread.Commands.Key.del, false, false, false, false);
+    },
     onRangeChanged: function(sender, args) {
+        console.log(`sdad`);
         if (args.action == GC.Spread.Sheets.RangeChangedAction.clear) {
             var me = rationOprObj, updateArr = [], removeArr = [];
             var cacheSection = me.getCache();
@@ -132,6 +200,16 @@ var rationOprObj = {
                             break;
                         }
                     }
+                    if(isEmpty){
+                        if(args.row + i < cacheSection.length){
+                            rObj.ID = cacheSection[args.row + i].ID;
+                            removeArr.push(rObj.ID);
+                        }
+                    }
+                    else{
+
+                    }
+
                     if (hasUpdate) {
                         if (isEmpty) {
                             removeArr.push(rObj);
@@ -143,18 +221,56 @@ var rationOprObj = {
                         }
                     }
                 }
-                me.mixUpdateRequest(updateArr, [], removeArr);
+              //  me.mixUpdateRequest(updateArr, [], removeArr);
                 //removeRationItems
             }
         }
     },
+    onEnterCell: function (sender, args) {
+        let me = rationOprObj;
+        me.cellRowIdx = args.row;
+        let isHasData = false;
+        if(me.addRationItem){
+            for(let i=0; i<me.setting.header.length; i++){
+                if(me.addRationItem[me.setting.header[i].dataCode]){
+                    isHasData = true;
+                    break;
+                }
+            }
+        }
+        if(isHasData){
+            if(me.editingRowIdx !== me.cellRowIdx) {
+                let focusToCol = !me.addRationItem.code ? 0 : -1;
+             //   else {
+                if(focusToCol !== -1){
+                    $('#rationAlertBtn').click();
+                    me.workBook.getSheet(0).options.isProtected = true;
+                    $('#rationAlertCac').click(function () {
+                        me.workBook.getSheet(0).options.isProtected = false;
+                        me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
+                    });
+                    $('#rationAlertCls').click(function () {
+                        me.workBook.getSheet(0).options.isProtected = false;
+                        me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
+                    });
+                    $('#rationAlertCof').click(function () {
+                        me.workBook.getSheet(0).options.isProtected = false;
+                        me.addRationItem = null;
+                        for(let col=0; col<me.setting.header.length; col++){
+                            me.workBook.getSheet(0).getCell(me.editingRowIdx, col).value(me.currentEditingRation[me.setting.header[col].dataCode]);
+                        }
+                        me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, 0);
+                    });
+                }
+               // }
+            }
+        }
+    },
     onCellEditStart: function(sender, args) {
         var me = rationOprObj;
         //var rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row);
         var rObj = sheetCommonObj.combineRationRowData(me.workBook.getSheet(0), me.setting, args.row);
         me.currentEditingRation = rObj;
-        console.log(`currentEditingRation`);
-        console.log(me.currentEditingRation);
         var cacheSection = me.getCache();
         if (cacheSection) {
             for (var j = 0; j < cacheSection.length; j++) {
@@ -169,32 +285,73 @@ var rationOprObj = {
         //var me = rationOprObj, rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row),
         var me = rationOprObj, rObj = sheetCommonObj.combineRationRowData(me.workBook.getSheet(0), me.setting, args.row),
             updateArr = [], addArr = [];
-        console.log(`editEnd`);
-        console.log(rObj);
+        let dataCode = me.setting.header[args.col].dataCode;
+        me.editingRowIdx = args.row;
         if (me.currentEditingRation["ID"]) {
             rObj["ID"] = me.currentEditingRation["ID"];
-            updateArr.push(rObj);
-        } else {
+            //updateArr.push(rObj);
+            for(let col =0; col< me.setting.header.length; col++){
+                if(me.currentEditingRation[me.setting.header[col].dataCode] !== rObj[me.setting.header[col].dataCode]){
+                    me.addRationItem = rObj;
+                    if(rObj[me.setting.header[0].dataCode]){
+                        updateArr.push(rObj);
+                        break;
+                    }
+                }
+            }
+        } else if(!me.currentEditingRation["ID"]) {
             if (!sheetCommonObj.chkIfEmpty(rObj, me.setting)) {
-                addArr.push(rObj);
+                //addArr.push(rObj);
+                me.addRationItem = rObj;
+                if(rObj.code){
+                    if(me.rationsCodes.indexOf(rObj.code) === -1){
+                        addArr.push(rObj);
+                        me.rationsCodes.push(rObj.code);
+                        me.addRationItem = null;
+                    }
+                    else{
+                        $('#alertModalBtn').click();
+                        me.workBook.getSheet(0).options.isProtected = true;
+                        $('#alertModalCls').click(function () {
+                            me.workBook.getSheet(0).options.isProtected = false;
+                            me.addRationItem.code = '';
+                            me.workBook.getSheet(0).setValue(args.row, args.col, '');
+                            me.workBook.getSheet(0).setActiveCell(args.row, args.col);
+                        });
+                        $('#alertModalCof').click(function () {
+                            me.workBook.getSheet(0).options.isProtected = false;
+                            me.addRationItem.code = '';
+                            me.workBook.getSheet(0).setValue(args.row, args.col, '');
+                            me.workBook.getSheet(0).setActiveCell(args.row, args.col);
+                        });
+                    }
+                }
             }
         }
-        me.currentEditingRation = null;
         if (updateArr.length > 0 || addArr.length > 0) {
+            me.currentEditingRation = null;
             me.mixUpdateRequest(updateArr, addArr, []);
         }
     },
     onClipboardPasting: function(sender, args) {
         var me = rationOprObj;
-        if (args.cellRange.colCount != me.setting.header.length) {
+        console.log(`args`);
+        console.log(args);
+      /*  if (args.cellRange.colCount != me.setting.header.length) {
             args.cancel = true;
-        }
+        }*/
     },
     onClipboardPasted: function(e, info) {
+        console.log(`info`);
+        console.log(info);
         var me = rationOprObj;
         var cacheSection = me.getCache();
+        console.log(`cache`);
+        console.log(cacheSection);
         var updateArr = [], addArr = [];
         var items = sheetCommonObj.analyzePasteData(me.setting, info);
+        console.log(`items`);
+        console.log(items);
         for (var i = 0; i < items.length; i++) {
             if (cacheSection) {
                 var hasCacheItem = false;
@@ -205,19 +362,39 @@ var rationOprObj = {
                         break;
                     }
                 }
-                if (!hasCacheItem) {
+                if (!hasCacheItem && info.cellRange.col === 0) {
                     addArr.push(items[i]);
-                } else {
+                } else if(hasCacheItem){
                     updateArr.push(items[i]);
                 }
             } else {
-                addArr.push(items[i])
+                //add
+                if(info.cellRange.col === 0){
+                    addArr.push(items[i])
+                }
             }
         };
+        console.log(`updateArr`);
+        console.log(updateArr);
+        console.log(addArr);
         if (updateArr.length > 0 || addArr.length > 0) {
-            me.mixUpdateRequest(updateArr, addArr, []);
+            //me.mixUpdateRequest(updateArr, addArr, []);
         }
     },
+    getRationsCodes: function (repId) {
+        let me = rationOprObj;
+        $.ajax({
+            type: 'post',
+            url: 'api/getRationsCodes',
+            data: {data: JSON.stringify({repId: repId})},
+            dataType: 'json',
+            success: function (result) {
+                if(!result.error){
+                    me.rationsCodes = result.data;
+                }
+            }
+        })
+    },
     mixUpdateRequest: function(updateArr, addArr, removeIds) {
         var me = rationOprObj;
         $.ajax({
@@ -252,9 +429,10 @@ var rationOprObj = {
             me.currentSectionId = sectionID;
             if (me.currentRations["_SEC_ID_" + sectionID]) {
                 me.showRationItems(sectionID);
-                sheetCommonObj.unShieldAllCells(me.workBook.getSheet(0));
+                ///sheetCommonObj.unShieldAllCells(me.workBook.getSheet(0));
                 sheetCommonObj.lockCells(rationGLJOprObj.sheet, rationGLJOprObj.setting);
                 sheetCommonObj.lockCells(rationCoeOprObj.sheet, rationCoeOprObj.setting);
+                sheetCommonObj.lockCells(me.workBook.getSheet(0), rationOprObj.setting);
                 sheetCommonObj.unShieldAllCells(rationAssistOprObj.sheet);
             } else {
                 $.ajax({
@@ -267,8 +445,10 @@ var rationOprObj = {
                     success:function(result){
                         if (result) {
                             me.currentRations["_SEC_ID_" + sectionID] = result.data;
+                            me.sortByCode(me.currentRations["_SEC_ID_" + sectionID]);
                             me.showRationItems(sectionID);
-                            sheetCommonObj.unShieldAllCells(me.workBook.getSheet(0));
+                            //sheetCommonObj.unShieldAllCells(me.workBook.getSheet(0));
+                            sheetCommonObj.lockCells(me.workBook.getSheet(0), rationOprObj.setting);
                             sheetCommonObj.lockCells(rationGLJOprObj.sheet, rationGLJOprObj.setting);
                             sheetCommonObj.lockCells(rationCoeOprObj.sheet, rationCoeOprObj.setting);
                             sheetCommonObj.unShieldAllCells(rationAssistOprObj.sheet);
@@ -298,5 +478,20 @@ var rationOprObj = {
                 sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
             }
         }
+    },
+    sortByCode: function(arr){
+        function compare(){
+            return function (a, b) {
+                let rst = 0;
+                if (a.code > b.code) {
+                    rst = 1;
+                }
+                else if (a.code < b.code) {
+                    rst = -1;
+                }
+                return rst;
+            }
+        }
+        arr.sort(compare());
     }
 }

+ 34 - 6
web/maintain/ration_repository/js/ration_glj.js

@@ -79,6 +79,7 @@ var rationGLJOprObj = {
         var me = this;
         me.sheet = sheet;
         me.getGljDistType(function () {
+            me.onContextmenuOpr();
             sheetCommonObj.initSheet(me.sheet, me.setting, 30);
             me.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
             me.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
@@ -133,8 +134,25 @@ var rationGLJOprObj = {
             if (args.row < cacheArr.length) {
                 var editGlj = cacheArr[args.row];
                 if (editGlj["consumeAmt"] != args.editingText) {
-                    editGlj["consumeAmt"] = args.editingText;
-                    me.updateRationItem();
+                    let parseNum = parseFloat(args.editingText);
+                    if(isNaN(parseFloat(args.editingText))){
+                        $('#alertModalBtn').click();
+                        $('#alertText').text("定额消耗只能输入数值!");
+                        args.sheet.options.isProtected = true;
+                        $('#alertModalCls').click(function () {
+                            args.sheet.options.isProtected = false;
+                            args.sheet.setValue(args.row, args.col, editGlj['consumeAmt']);
+                        });
+                        $('#alertModalCof').click(function () {
+                            args.sheet.options.isProtected = false;
+                            args.sheet.setValue(args.row, args.col, editGlj['consumeAmt']);
+                        })
+                    }
+                    else{
+                        args.sheet.setValue(args.row, args.col, parseNum);
+                        editGlj["consumeAmt"] = parseNum;
+                        me.updateRationItem();
+                    }
                 }
             }
         } else {
@@ -160,6 +178,20 @@ var rationGLJOprObj = {
             }
         }
     },
+    onContextmenuOpr: function () {
+        $.contextMenu({
+            selector: '#rdSpread',
+            callback: function(key, options) {
+                var m = "clicked: " + key;
+                window.console && console.log(m) || alert(m);
+            },
+            items: {
+                "insert": {name: "插入", callback: function (key, opt) {
+                }},
+                "delete": {name: "删除"}
+            }
+        });
+    },
 
     addGljItems: function(codes, repId) {
         var me = this;
@@ -266,10 +298,6 @@ var rationGLJOprObj = {
         }
         return rst;
     },
-    getRationUpPrice: function () {
-
-    },
-
     updateRationItem: function() {
         var me = this, updateArr = [];
         if (me.currentRationItem) {

+ 9 - 8
web/maintain/ration_repository/js/repository_glj.js

@@ -205,9 +205,15 @@ var pageOprObj = {
                  let focusToCol;
                  function getFocusToCol (me){
                      if(!me.addGljObj[me.setting.header[0].dataCode]){
+                         $('#alertGljTxt').text('编号不能为空,是否取消增加工料机?');
                          return 0;
                      }
+                     else if(!me.addGljObj[me.setting.header[1].dataCode]){
+                         $('#alertGljTxt').text('名称不能为空,是否取消增加工料机?');
+                         return 1;
+                     }
                     else if(!me.addGljObj[me.setting.header[5].dataCode]){
+                         $('#alertGljTxt').text('类型不能为空,是否取消增加工料机?');
                          return 5;
                      }
                      else {
@@ -249,11 +255,9 @@ var pageOprObj = {
          }
      },
     onCellEditStart: function(sender, args) {
-        console.log(`enterEditStart`);
         var me = repositoryGljObj;
         var rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row);
         me.currentEditingGlj = rObj;
-        console.log(me.currentEditingGlj);
         me.orgCode = me.workBook.getSheet(0).getValue(args.row, 0);
         var cacheSection = me.gljList;
         if (cacheSection) {
@@ -269,18 +273,15 @@ var pageOprObj = {
     onCellEditEnd: function(sender, args) {
         var me = repositoryGljObj, rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row, me),
             updateArr = [], addArr = [];
-        console.log(`me.currentE`);
-        console.log(me.currentEditingGlj);
         me.editingRowIdx = args.row;
-        console.log(`editEnd_obj`);
-        console.log(rObj);
+        rObj.basePrice = rObj.basePrice ? rObj.basePrice : 0;
         if (me.currentEditingGlj["ID"]) {
             rObj["ID"] = me.currentEditingGlj["ID"];
             rObj.gljClass = me.currentEditingGlj.gljClass;
             for(let col =0; col< me.setting.header.length; col++){
                 if(me.currentEditingGlj[me.setting.header[col].dataCode] !== rObj[me.setting.header[col].dataCode]){
                     me.addGljObj = rObj;
-                    if(rObj[me.setting.header[0].dataCode] && rObj[me.setting.header[5].dataCode]){
+                    if(rObj[me.setting.header[0].dataCode] && rObj[me.setting.header[1].dataCode] && rObj[me.setting.header[5].dataCode]){
                         updateArr.push(rObj);
                         break;
                     }
@@ -309,7 +310,7 @@ var pageOprObj = {
         } else {
             me.addGljObj = rObj;
             let isCanSav = true;
-                if(!rObj[me.setting.header[0].dataCode] || !rObj[me.setting.header[5].dataCode]){
+                if(!rObj[me.setting.header[0].dataCode] || !rObj[me.setting.header[1].dataCode] || !rObj[me.setting.header[5].dataCode]){
                     isCanSav = false;
                 }
             if(isCanSav){

+ 3 - 2
web/users/css/style.css

@@ -126,7 +126,8 @@ body{
   padding-left:124px
 }
 .panel-title>.title-bar{
-  padding-left: 20px
+  padding-left: 20px;
+  padding-right: 20px
 }
 .panel-title>.title-bar>h2,.panel-title>.title-main>h2{
   font-size: 16px;
@@ -293,4 +294,4 @@ body{
 }
 .mb-30 {
   margin-bottom:30px
-}
+}

+ 213 - 0
web/users/js/version.js

@@ -0,0 +1,213 @@
+/**
+ * 版本管理相关js
+ *
+ * @author CaiAoLin
+ * @date 2017/7/28
+ * @version
+ */
+$(document).ready(function() {
+    let isAdding = false;
+    let model = '';
+
+    // 初始化数据
+    initVersion();
+
+    // 新增版本
+    $("#add-version").click(function() {
+        try {
+            let [name, standardBill, rationLib, standardBillString, rationLibString] = getAndValidData(model);
+            let id = $("#version-id").val();
+
+            let postData = {};
+            let url = '/version/add';
+            switch (model) {
+                case 'all':
+                    postData = {model: model, name: name, standard_bill_id: standardBill, ration_lib_id: rationLib,
+                        standard_bill: standardBillString, ration_lib: rationLibString};
+                    break;
+                case 'bill':
+                    url = '/version/addLib';
+                    postData = {model: model, standard_bill_id: standardBill, standard_bill: standardBillString, id: id};
+                    break;
+                case 'ration':
+                    url = '/version/addLib';
+                    postData = {model: model, ration_lib_id: rationLib, ration_lib: rationLibString, id: id};
+                    break;
+            }
+            $.ajax({
+                url: url,
+                type: 'post',
+                data: postData,
+                error: function() {
+                    isAdding = false;
+                },
+                beforeSend: function() {
+                    isAdding = true;
+                },
+                success: function(response) {
+                    isAdding = false;
+                    if (response.err === 0) {
+                        window.location.reload();
+                    } else {
+                        let msg = response.msg === undefined ? '未知错误' : response.msg;
+                        alert(msg);
+                    }
+                }
+            });
+
+        } catch (error) {
+            alert(error);
+        }
+    });
+
+    // 选择省份后读取数据
+    $("select[name='standard_bill_province'],select[name='ration_lib_province']").change(function() {
+        let name = $(this).attr('name');
+
+        let billListData = billList === undefined ? [] : JSON.parse(billList);
+        let rationLibData = rationList === undefined ? [] : JSON.parse(rationList);
+        if (billListData.length <= 0 || rationLibData.length <= 0) {
+            return false;
+        }
+        let sourceData = name === 'standard_bill_province' ? billListData : rationLibData;
+        let selectedId = $(this).val();
+        if (sourceData[selectedId] === undefined) {
+            return false;
+        }
+        let defaultString = name === 'standard_bill_province' ? '请选择标准清单' : '请选择定额库';
+        let html = '<option value="">' + defaultString + '</option>';
+        for(let tmp of sourceData[selectedId]) {
+            let tmpHtml = '<option value="' + tmp.id + '">' + tmp.name + '</option>';
+            html += tmpHtml;
+        }
+
+        // 渲染
+        let targetSelector = name === 'standard_bill_province' ? $("select[name='standard_bill']") : $("select[name='ration_lib']");
+        targetSelector.children('option').remove();
+        targetSelector.html(html);
+    });
+
+    // 添加
+    $(".add-version").click(function() {
+        model = $(this).data('model');
+        switch (model) {
+            case 'all':
+                $("#name-area").show();
+                $("#bill-area").show();
+                $("#ration-area").show();
+                $("#add-version-title").text('添加新版本');
+                break;
+            case 'bill':
+                $("#name-area").hide();
+                $("#bill-area").show();
+                $("#ration-area").hide();
+                $("#add-version-title").text('添加标准清单');
+                break;
+            case 'ration':
+                $("#name-area").hide();
+                $("#bill-area").hide();
+                $("#ration-area").show();
+                $("#add-version-title").text('添加定额库');
+                break;
+        }
+
+        $("#addversion").modal('show');
+    });
+
+    // 移除操作
+    let isDeleting = false;
+    $(".remove-version").click(function() {
+        let model = $(this).data('model');
+        let id = $("#version-id").val();
+        let deleteId = $(this).data('id');
+        deleteId = parseInt(deleteId);
+
+        if (model === undefined || model === '' || isNaN(deleteId)) {
+            return false;
+        }
+        if (isDeleting) {
+            return false;
+        }
+
+        $.ajax({
+            url: '/version/deleteLib',
+            type: 'post',
+            data: {id: id, model: model, delete_id: deleteId},
+            error: function() {
+                isDeleting = false;
+            },
+            beforeSend: function() {
+                isDeleting = true;
+            },
+            success: function(response) {
+                isDeleting = false;
+                if (response.err === 0) {
+                    window.location.reload();
+                } else {
+                    let msg = response.msg === undefined ? '未知错误' : response.msg;
+                    alert(msg);
+                }
+            }
+        });
+
+    });
+
+});
+
+/**
+ * 初始化
+ *
+ * @return {void|boolean}
+ */
+function initVersion() {
+    if (province === undefined) {
+        alert('初始化失败!');
+        return false;
+    }
+
+    province = JSON.parse(province);
+    if (province.length <= 0) {
+        alert('省份数据加载失败!');
+        return false;
+    }
+
+    let billProvinceElement = $("select[name='standard_bill_province']");
+    let rationProvinceElement = $("select[name='ration_lib_province']");
+    let html = '';
+    for (let tmp of province) {
+        let tmpHtml = '<option value="' + tmp.id + '">' + tmp.name + '</option>';
+        html += tmpHtml;
+    }
+
+    billProvinceElement.children('option').first().after(html);
+    rationProvinceElement.children('option').first().after(html);
+}
+
+/**
+ * 校验数据
+ *
+ * @param {String} model
+ * @return {Array}
+ */
+function getAndValidData(model) {
+    let name = $("input[name='version_name']").val();
+    let standardBill = $("select[name='standard_bill']").val();
+    let rationLib = $("select[name='ration_lib']").val();
+
+    if (name === '' && model === 'all') {
+        throw '版本名字不能为空';
+    }
+
+    if ((model === 'all' || model === 'bill') && (standardBill === '' || standardBill === undefined)) {
+        throw '请选择标准清单库';
+    }
+
+    if ((model === 'all' || model === 'ration') && (rationLib === '' || rationLib === undefined)) {
+        throw '请选择定额库';
+    }
+
+    let standardBillString = $("select[name='standard_bill']").children("option:selected").text();
+    let rationLibString = $("select[name='ration_lib']").children("option:selected").text();
+
+    return [name, standardBill, rationLib, standardBillString, rationLibString];
+}

+ 55 - 2
web/users/views/layout/layout.html

@@ -55,12 +55,12 @@
         <%- body %>
     </div>
 </div>
-<div class="modal fade" id="edit-account" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
+<div class="modal fade" id="edit-account" tabindex="-1" role="dialog">
     <div class="modal-dialog" role="document">
         <div class="modal-content">
             <div class="modal-header">
                 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-                <h4 class="modal-title" id="myModalLabel">编辑账号</h4>
+                <h4 class="modal-title">编辑账号</h4>
             </div>
             <div class="modal-body">
                 <div class="form-group">
@@ -98,4 +98,57 @@
         </div>
     </div>
 </div>
+
+<!-- 弹窗新增版本 -->
+<div class="modal fade" id="addversion" tabindex="-1" role="dialog">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title" id="add-version-title">添加新版本</h4>
+            </div>
+            <div class="modal-body">
+                <div class="form-group" id="name-area">
+                    <label>版本名称</label>
+                    <input class="form-control" placeholder="" name="version_name">
+                </div>
+                <div class="form-group" id="bill-area">
+                    <label>标准清单</label>
+                    <div class="row">
+                        <div class="col-xs-4">
+                            <select class="form-control" name="standard_bill_province">
+                                <option value="">请选择省份</option>
+                            </select>
+                        </div>
+                        <div class="col-xs-8">
+                            <select class="form-control" name="standard_bill">
+                                <option value="">请选择标准清单</option>
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group" id="ration-area">
+                    <label>定额库</label>
+                    <div class="row">
+                        <div class="col-xs-4">
+                            <select class="form-control" name="ration_lib_province">
+                                <option value="">请选择省份</option>
+                            </select>
+                        </div>
+                        <div class="col-xs-8">
+                            <select class="form-control" name="ration_lib">
+                                <option value="">请选择定额库</option>
+                            </select>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
+                <button type="button" class="btn btn-primary" id="add-version">确定添加</button>
+            </div>
+        </div>
+    </div>
+</div>
+
 </body>

+ 100 - 0
web/users/views/version/index.html

@@ -0,0 +1,100 @@
+<div class="panel-sidebar">
+	<div class="panel-title">
+		<div class="title-bar">
+			<h2><a class="pull-right add-version" title="添加新版本" href="javascript:void(0)" data-model="all"><span class="glyphicon glyphicon-plus"></span></a>版本管理</h2>
+		</div>
+	</div>
+	<div class="scrollbar-auto">
+		<div class="nav-box">
+			<ul class="nav-list list-unstyled" id="version-select">
+				<% versionList.forEach(function (version){ %>
+				<li <% if(selectedVersion._id === version._id) { %>class="active"<% } %>><a href="/version?id=<%= version._id %>"><span><%= version.name %></span></a></li>
+				<% }) %>
+			</ul>
+		</div>
+	</div>
+</div>
+<div class="panel-content">
+	<% if(Object.keys(selectedVersion).length > 0) { %>
+	<div class="panel-title">
+		<div class="title-main">
+			<h2><%= selectedVersion.name %><a href="" class="btn btn-primary btn-sm pull-right">确定修改</a></h2>
+		</div>
+	</div>
+	<div class="content-wrap container-fluid">
+		<div class="c-body row">
+			<div class="col-md-4">
+				<div class="form-group">
+					<label>标准清单</label>
+					<div id="bill-list">
+						<% selectedVersion.standard_bill.forEach(function (bill){ %>
+						<p class="form-control-static"><a class="pull-right text-danger remove-version" data-model="bill" data-id="<%= bill.id %>" title="移除"><span class="glyphicon glyphicon-remove"></span></a><%= bill.name %></p>
+						<% }) %>
+					</div>
+					<a class="btn btn-link btn-sm add-version" href="javascript:void(0)" data-model="bill">添加</a>
+				</div>
+				<div class="form-group">
+					<label>定额库</label>
+					<div id="ration-list">
+						<% selectedVersion.ration_lib.forEach(function (ration){ %>
+						<p class="form-control-static"><a class="pull-right text-danger remove-version" data-model="ration" title="移除" data-id="<%= ration.id %>"><span class="glyphicon glyphicon-remove"></span></a><%= ration.name %></p>
+						<% }) %>
+					</div>
+					<a href="#" class="btn btn-link btn-sm add-version" data-model="ration">添加</a>
+				</div>
+				<input type="hidden" name="version-id" value="<%= selectedVersion._id %>" id="version-id">
+			</div>
+			<!--<div class="col-md-4">-->
+				<!--<div class="form-group">-->
+					<!--<label >文本选项</label>-->
+					<!--<input type="text" class="form-control" placeholder="输入内容">-->
+				<!--</div>-->
+				<!--<div class="form-group">-->
+					<!--<label >数字选项</label>-->
+					<!--<input type="number" class="form-control" placeholder="输入内容">-->
+				<!--</div>-->
+				<!--<div class="form-group">-->
+					<!--<label >下拉选项</label>-->
+					<!--<select class="form-control"><option>选择1</option><option>选择2</option></select>-->
+				<!--</div>-->
+			<!--</div>-->
+			<!--<div class="col-md-4">-->
+				<!--<div class="form-group">-->
+					<!--<label >多选</label>-->
+					<!--<div>-->
+						<!--<label class="checkbox-inline">-->
+							<!--<input type="checkbox" id="inlineCheckbox1" value="option1"> 1-->
+						<!--</label>-->
+						<!--<label class="checkbox-inline">-->
+							<!--<input type="checkbox" id="inlineCheckbox2" value="option2"> 2-->
+						<!--</label>-->
+						<!--<label class="checkbox-inline">-->
+							<!--<input type="checkbox" id="inlineCheckbox3" value="option3"> 3-->
+						<!--</label>-->
+					<!--</div>-->
+				<!--</div>-->
+				<!--<div class="form-group">-->
+					<!--<label >单选</label>-->
+					<!--<div>-->
+						<!--<label class="radio-inline">-->
+							<!--<input type="radio" name="inlineRadioOptions" id="inlineRadio1" value="option1"> 1-->
+						<!--</label>-->
+						<!--<label class="radio-inline">-->
+							<!--<input type="radio" name="inlineRadioOptions" id="inlineRadio2" value="option2"> 2-->
+						<!--</label>-->
+						<!--<label class="radio-inline">-->
+							<!--<input type="radio" name="inlineRadioOptions" id="inlineRadio3" value="option3"> 3-->
+						<!--</label>-->
+					<!--</div>-->
+				<!--</div>-->
+			<!--</div>-->
+		</div>
+	</div>
+	<% } %>
+</div>
+<script type="text/javascript">
+	let province = '<%- province %>';
+	let billList = '<%- billList %>';
+	let rationList = '<%- rationList %>';
+</script>
+<script type="text/javascript" src="/web/users/js/version.js"></script>