Ver código fonte

Merge branch 'master' into olym

caiaolin 8 anos atrás
pai
commit
f9f99f9f58
28 arquivos alterados com 1212 adições e 406 exclusões
  1. 12 0
      modules/bills_lib/controllers/bills_lib_controllers.js
  2. 157 12
      modules/bills_lib/models/bills_lib_interfaces.js
  3. 5 0
      modules/bills_lib/routes/bills_lib_routes.js
  4. 13 2
      modules/ration_repository/controllers/ration_controller.js
  5. 0 1
      modules/ration_repository/controllers/repository_glj_controller.js
  6. 1 0
      modules/ration_repository/models/glj_repository.js
  7. 147 13
      modules/ration_repository/models/ration_item.js
  8. 1 0
      modules/ration_repository/routes/ration_rep_routes.js
  9. 2 2
      modules/reports/routes/report_router.js
  10. 3 3
      modules/reports/routes/rpt_tpl_router.js
  11. 4 4
      modules/reports/rpt_component/jpc_ex.js
  12. 1 1
      modules/reports/rpt_component/jpc_flow_tab.js
  13. 176 115
      modules/reports/util/rpt_excel_util.js
  14. 4 2
      public/web/sheet/sheet_common.js
  15. 22 9
      web/maintain/bills_lib/html/neirong.html
  16. 184 48
      web/maintain/bills_lib/html/qingdan.html
  17. 22 7
      web/maintain/bills_lib/html/tezheng.html
  18. 24 0
      web/maintain/bills_lib/scripts/bills_lib_ajax.js
  19. 1 1
      web/maintain/bills_lib/scripts/bills_lib_setting.js
  20. 237 109
      web/maintain/bills_lib/scripts/db_controller.js
  21. 6 10
      web/maintain/bills_lib/scripts/set_sheets.js
  22. 0 8
      web/maintain/ration_repository/dinge.html
  23. 1 1
      web/maintain/ration_repository/gongliao.html
  24. 0 2
      web/maintain/ration_repository/js/ration.js
  25. 0 4
      web/maintain/ration_repository/js/ration_glj.js
  26. 173 45
      web/maintain/ration_repository/js/repository_glj.js
  27. 15 6
      web/maintain/report/js/jpc_output.js
  28. 1 1
      web/users/views/tool/index.html

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

@@ -112,6 +112,18 @@ module.exports = {
             callback(req, res, err, message, null);
         });
     },
+    removeTotal: function (req, res) {
+        let data = JSON.parse(req.body.data);
+        billsLibDao.removeTotal(data, function (err, message) {
+            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){

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

@@ -362,11 +362,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 +393,6 @@ billsLibDao.prototype.upLevel = function(data, callback){
     }
     async.parallel(functions, function(err){
         if(err){
-            console.log(`errfinal`);
             callback(1, 'Error');
         }
         else{
@@ -486,13 +483,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;
-            console.log(id);
-            console.log(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);
@@ -502,7 +496,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){
@@ -514,7 +507,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);
@@ -525,11 +517,9 @@ billsLibDao.prototype.updatePNId= function(upData, callback){
             }
         }, function(err){
             if(err){
-                console.log(`err`);
                 callback(1, 'Error');
             }
             else {
-                console.log(`noerr`);
                 callback(0, '');
             }
         });
@@ -602,6 +592,162 @@ billsLibDao.prototype.updateBills = function(ubillsData, callback){
     }
 }
 
+billsLibDao.prototype.removeTotal = function (data, callback) {
+    let billsLibId = data.billsLibId, billsIds = data.billsIds,
+        delIds = data.delIds, field = data.field, functions = [], delArr = [];
+    if(billsIds.length > 0){
+        billsIds.forEach(function (updateId) {
+            delIds.forEach(function (delId) {
+                delArr.push({updateID: updateId, delId: delId});
+            });
+        });
+    }
+    let parallelFucs = {
+        delJobs: function () {
+            return function (cb) {
+                async.each(delIds, function (delJobId, ecb) {
+                    JobContent.update({billsLibId: billsLibId, id: delJobId, deleted: false}, {$set: {deleted: true}}, function (err, result) {
+                        if(err){
+                            ecb(err);
+                        }
+                        else {
+                            ecb(null);
+                        }
+                    });
+                }, function (err) {
+                    if(err){
+                        cb(err);
+                    }
+                    else{
+                        cb(null);
+                    }
+                });
+            };
+        },
+        delJobsArr: function () {
+            return function (cb) {
+                async.each(delArr, function (delObj, ecb) {
+                    Bills.update({billsLibId: billsLibId, ID: delObj.updateId, deleted: false}, {$pull: {jobs: {id: delObj.delId}}}, function (err) {
+                        if(err){
+                            ecb(err);
+                        }else{
+                            ecb(null);
+                        }
+                    });
+                }, function (err) {
+                    if(err){
+                        cb(err);
+                    }
+                    else{
+                        cb(null);
+                    }
+                })
+            };
+        },
+        delItems: function () {
+            return function (cb) {
+                async.each(delIds, function (delItemId, ecb) {
+                    ItemCharacter.update({billsLibId: billsLibId, id: delItemId, deleted: false}, {$set: {deleted: true}}, function (err) {
+                        if(err){
+                            ecb(err);
+                        }
+                        else{
+                            ecb(null);
+                        }
+                    }, function (err) {
+                        if(err){
+                            cb(err);
+                        }
+                        else{
+                            cb(null);
+                        }
+                    });
+                });
+            }
+        },
+        delItemsArr: function () {
+            return function (cb) {
+                async.each(delArr, function (delObj, ecb) {
+                    Bills.update({billsLibId: billsLibId, ID: delObj.updateId, deleted:false}, {$pull: {items: {id: delObj.delId}}}, function(err){
+                        if(err){
+                            ecb(err);
+                        }
+                        else{
+                            ecb(null);
+                        }
+                    });
+                }, function (err) {
+                    if(err){
+                        cb(err);
+                    }
+                    else{
+                        cb(null);
+                    }
+                });
+            }
+        }
+    };
+    if(field === 'jobs'){
+        functions.push(parallelFucs.delJobs());
+        functions.push(parallelFucs.delJobsArr());
+    }
+    else{
+        functions.push(parallelFucs.delItems());
+        functions.push(parallelFucs.delItemsArr());
+    }
+    async.parallel(functions, function (err) {
+        if(err){
+            callback(1, 'Error');
+        }
+        else{
+            callback(0, '');
+        }
+    });
+};
+
+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;
@@ -609,7 +755,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){

+ 5 - 0
modules/bills_lib/routes/bills_lib_routes.js

@@ -26,6 +26,7 @@ module.exports =function (app) {
     billsRouter.post('/getABillsLib', billsController.getABillsLib);
     billsRouter.post("/getStdBillsLib", billsController.getStdBillsLib);
     billsRouter.post("/createStdBillsLib", billsController.createStdBillsLib);
+
     billsRouter.post("/upMove", billsController.upMove);
     billsRouter.post("/downMove", billsController.downMove);
     billsRouter.post("/deleteStdBillsLib", billsController.deleteStdBillsLib);
@@ -39,10 +40,13 @@ module.exports =function (app) {
     billsRouter.post("/downLevel", billsController.downLevel);
     billsRouter.post("/updateBills", billsController.updateBills);
     billsRouter.post("/updateBillsArr", billsController.updateBillsArr);
+    billsRouter.post("/removeTotal", billsController.removeTotal);
+    billsRouter.post("/updateSerialNo", billsController.updateSerialNo);
     billsRouter.post("/pasteBills", billsController.pasteBills);
     billsRouter.post('/updateRecharge', billsController.updateRecharge);
     billsRouter.post('/pasteRel', billsController.pasteRel);
     billsRouter.post("/deleteBills", billsController.deleteBills);
+
     billsRouter.post("/getJobContent", billsController.getJobContent);
     billsRouter.post("/createJobContent", billsController.createJobContent);
     billsRouter.post("/updateJobContent", billsController.updateJobContent);
@@ -50,6 +54,7 @@ module.exports =function (app) {
     billsRouter.post("/pasteJobs", billsController.pasteJobs);
     billsRouter.post("/edCreateJob", billsController.edCreateJob);
     billsRouter.post("/edUpdateJob", billsController.edUpdateJob);
+
     billsRouter.post("/getItemCharacter", billsController.getItemCharacter);
     billsRouter.post("/createItemCharacter", billsController.createItemCharacter);
     billsRouter.post("/updateItemCharacter", billsController.updateItemCharacter);

+ 13 - 2
modules/ration_repository/controllers/ration_controller.js

@@ -46,12 +46,23 @@ module.exports = {
     },
     updateRationBasePrc: function (req, res) {
         let data = JSON.parse(req.body.data);
-        rationItem.updateRationBasePrc(data, function (err, message, rst) {
+        rationItem.updateRationBasePrc(data, function (err, message) {
             if(err){
                 callback(req, res, err, message, null);
             }
             else{
-                callback(req, res, err, message, rst);
+                callback(req, res, err, message, null);
+            }
+        })
+    },
+    getRationGljIds: function (req, res) {
+        let data = JSON.parse(req.body.data);
+        rationItem.getRationGljIds(data, function (err, message, ids) {
+            if(err){
+                callback(req, res, err, message, null);
+            }
+            else{
+                callback(req, res, err, message, ids);
             }
         })
     }

+ 0 - 1
modules/ration_repository/controllers/repository_glj_controller.js

@@ -89,5 +89,4 @@ module.exports ={
             }
         });
     }
-
 }

+ 1 - 0
modules/ration_repository/models/glj_repository.js

@@ -35,6 +35,7 @@ var gljTypeModel = db.model("std_ration_lib_glj_type",gljClassSchema, "std_ratio
 var gljItemModel = db.model("std_ration_lib_glj_list",gljSchema, "std_ration_lib_glj_list");
 var repositoryMap = require('./repository_map');
 var counter = require('../../../public/counter/counter');
+let rationItemDao = require('./ration_item');
 
 var gljItemDAO = function(){};
 gljItemDAO.prototype.getGljTypes = function(rationLibId, callback){

+ 147 - 13
modules/ration_repository/models/ration_item.js

@@ -44,7 +44,7 @@ var rationItemSchema = mongoose.Schema({
 });
 var rationItemModel = db.model("std_ration_lib_ration_items",rationItemSchema, "std_ration_lib_ration_items")
 var counter = require('../../../public/counter/counter');
-
+let gljDao = require('./glj_repository');
 var rationItemDAO = function(){};
 
 rationItemDAO.prototype.getRationItemsBySection = function(sectionId,callback){
@@ -179,28 +179,162 @@ rationItemDAO.prototype.updateRationItems = function(rationLibId, sectionId, ite
         callback(err, results);
     });
 };
+//ration round func
+function round(v,e){
+    var t=1;
+    for(;e>0;t*=10,e--);
+    for(;e<0;t/=10,e++);
+    return Math.round(v*t)/t;
+}
 
 rationItemDAO.prototype.updateRationBasePrc = function (data, callback) {
-    let gljId = data.gljId, basePrice = data.basePrice;
-    rationItemModel.find({'rationGljList.gljId': gljId}, function (err, reslut) {
+    let adjGljId = data.gljId, adjBasePrice = data.basePrice, adjGljType = data.gljType;
+    async.waterfall([
+        function (cb) {
+            rationItemModel.find({'rationGljList.gljId': adjGljId}, function (err, result) {
+                if(err){
+                    cb(err);
+                }
+                else{
+                    cb(null, result);
+                }
+            });
+        },
+        function (result, cb) {
+            async.each(result, function (rationItem, ecb) {
+                let rationGljList = rationItem.rationGljList,
+                    gljIds = [];
+                rationGljList.forEach(function (rationGlj) {
+                    gljIds.push(rationGlj.gljId);
+                });
+                gljDao.getGljItems(gljIds, function(err, gljItems){
+                    if(err){
+                        ecb(err);
+                    }
+                    else{
+                        let gljArr = [];
+                        for(let i=0; i<gljItems.length; i++){
+                            let gljParentType = -1;
+                            if(gljItems[i].ID === adjGljId){
+                                gljItems[i].gljType = adjGljType;
+                            }
+                            if(gljItems[i].gljType <= 3){
+                                gljParentType = gljItems[i].gljType;
+                            }
+                            if(gljItems[i].gljType > 200 && gljItems[i].gljType < 300){
+                                gljParentType = 2;
+                            }
+                            if(gljItems[i].gljType > 300 && gljItems[i].gljType < 400){
+                                gljParentType = 3;
+                            }
+                            if(gljItems[i].ID === adjGljId){
+                                gljArr.push({gljId: gljItems[i].ID, basePrice: adjBasePrice, gljParentType: gljParentType});
+                            }
+                            else {
+                                gljArr.push({gljId: gljItems[i].ID, basePrice: gljItems[i].basePrice, gljParentType: gljParentType});
+                            }
+                        }
+                        gljArr.forEach(function (gljItem) {
+                            rationGljList.forEach(function (rationGlj) {
+                                if(gljItem.gljId === rationGlj.gljId){
+                                    gljItem.consumeAmt = rationGlj.consumeAmt;
+                                }
+                            })
+                        });
+                        //recalculate the price of ration
+                        let labourPrc = [], materialPrc = [], machinePrc = [], singlePrc, updatePrc = {labourPrice: 0, materialPrice: 0, machinePrice: 0, basePrice: 0};
+                        gljArr.forEach(function (gljItem) {
+                            if(gljItem.gljParentType !== -1){
+                                singlePrc = round(gljItem.basePrice * gljItem.consumeAmt, 3);
+                                if(gljItem.gljParentType === 1){
+                                    labourPrc.push(singlePrc);
+                                }
+                                else if(gljItem.gljParentType ===2){
+                                    materialPrc.push(singlePrc);
+                                }
+                                else{
+                                    machinePrc.push(singlePrc);
+                                }
+                            }
+                        });
+                        if(labourPrc.length > 0){
+                            let sumLaP = 0;
+                            for(let i=0; i<labourPrc.length; i++){
+                                sumLaP += labourPrc[i];
+                            }
+                            updatePrc.labourPrice = round(sumLaP, 2);
+                        }
+                        if(materialPrc.length > 0){
+                            let sumMtP = 0;
+                            for(let i= 0; i<materialPrc.length; i++){
+                                sumMtP += materialPrc[i];
+                            }
+                            updatePrc.materialPrice = round(sumMtP, 2);
+                        }
+                        if(machinePrc.length > 0){
+                            let sumMaP = 0;
+                            for(let i =0; i< machinePrc.length; i++){
+                                sumMaP += machinePrc[i];
+                            }
+                            updatePrc.machinePrice = round(sumMaP, 2);
+                        }
+                        updatePrc.basePrice = updatePrc.labourPrice + updatePrc.materialPrice + updatePrc.machinePrice;
+                        //updateDataBase
+                        rationItemModel.update({ID: rationItem.ID}, {$set: {labourPrice: updatePrc.labourPrice, materialPrice: updatePrc.materialPrice,
+                            machinePrice: updatePrc.machinePrice, basePrice: updatePrc.basePrice}},
+                            function (err, result) {
+                                if(err){
+                                    ecb(err);
+                                }
+                                else {
+                                    ecb(null);
+                                }
+                            });
+                    }
+                });
+            }, function(err){
+                if(err){
+                    cb(err);
+                }
+                else {
+                    cb(null);
+                }
+            });
+        }
+    ], function (err) {
         if(err){
+            callback(err, 'Error');
+        }
+        else{
+            callback(null, '');
+        }
+    });
+};
 
+rationItemDAO.prototype.getRationGljIds = function (data, callback) {
+    let repId = data.repId;
+    rationItemModel.find({rationRepId: repId}, function (err, result) {
+        if(err){
+            callback(err, 'Error', null);
         }
         else{
-            async.each(reslut, function (rationItem, cb) {
-                let rationBasePrc = rationItem.basePrice,
-                    gljList = rationItem.gljList, gljPrcObj;
-                for(let i=0; i< gljList.length; i++){
-                    if(gljList[i].gljId === gljId){
-                        gljPrcObj = gljList[i];
-                        break;
-                    }
+            let rstIds = [], newRst = [];
+            result.forEach(function (data) {
+                if(data.rationGljList.length >0){
+                    data.rationGljList.forEach(function (gljObj) {
+                        rstIds.push(gljObj.gljId);
+                    })
                 }
-
             });
+            for(let i= 0; i< rstIds.length; i++){
+                if(newRst.indexOf(rstIds[i]) === -1){
+                    newRst.push(rstIds[i]);
+                }
+            }
+            callback(null, '', newRst);
         }
     });
-};
+}
 
 module.exports = new rationItemDAO()
 

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

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

+ 2 - 2
modules/reports/routes/report_router.js

@@ -8,13 +8,13 @@ let reportController = require('./../controllers/rpt_controller');
 
 module.exports =function (app) {
     app.get('/report',  function(req, res) {
-        if (!req.session.userAccount) {
+        if (!req.session.managerData.username) {
             res.redirect('/login');
         }
         else {
             res.render('maintain/report/rpt_test.html',
                 {userAccount: req.session.userAccount,
-                    userID: req.session.userID});
+                    userID: req.session.managerData.userID});
         }
     });
     rptRouter.post('/getReport', reportController.getReportAllPages);

+ 3 - 3
modules/reports/routes/rpt_tpl_router.js

@@ -5,13 +5,13 @@ let reportCfgController = require('./../controllers/rpt_cfg_controller');
 
 module.exports = function (app) {
     app.get('/rpt_tpl',  function(req, res) {
-        if (!req.session.userAccount) {
+        if (!req.session.managerData.username) {
             res.redirect('/login');
         }
         else {
             res.render('maintain/report/rpt_tpl_main.html',
-                {userAccount: req.session.userAccount,
-                    userID: req.session.userID});
+                {userAccount: req.session.managerData.username,
+                    userID: req.session.managerData.userID});
         }
     });
 

+ 4 - 4
modules/reports/rpt_component/jpc_ex.js

@@ -167,10 +167,10 @@ JpcExSrv.prototype.createNew = function(){
                 }
                 if (bands[JV.BAND_PROP_MERGE_BAND]) {
                     let mergedBand = {}, band = bands[JV.BAND_PROP_MERGE_BAND];
-                    mergedBand[JV.PROP_LEFT] = band[JV.PROP_LEFT].toFixed(0);
-                    mergedBand[JV.PROP_RIGHT] = band[JV.PROP_RIGHT].toFixed(0);
-                    mergedBand[JV.PROP_TOP] = band[JV.PROP_TOP].toFixed(0);
-                    mergedBand[JV.PROP_BOTTOM] = band[JV.PROP_BOTTOM].toFixed(0);
+                    mergedBand[JV.PROP_LEFT] = parseInt(band[JV.PROP_LEFT].toFixed(0));
+                    mergedBand[JV.PROP_RIGHT] = parseInt(band[JV.PROP_RIGHT].toFixed(0));
+                    mergedBand[JV.PROP_TOP] = parseInt(band[JV.PROP_TOP].toFixed(0));
+                    mergedBand[JV.PROP_BOTTOM] = parseInt(band[JV.PROP_BOTTOM].toFixed(0));
                     mergedBand[JV.BAND_PROP_STYLE] = band[JV.BAND_PROP_STYLE];
                     rst[JV.BAND_PROP_MERGE_BAND] = mergedBand;
                 }

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

@@ -118,7 +118,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         for (let pi = 0; pi < me.multiCols; pi++) {
             let actualPage = (page - 1) * me.multiCols + pi + 1;
             //2.1 Content-Tab
-            tabRstLst.push(me.outputContent(rptTpl, dataObj, actualPage, bands, unitFactor, controls, pi));
+            tabRstLst.push(me.outputContent(rptTpl, dataObj, actualPage, bands, unitFactor, controls, pi, $CURRENT_RPT));
             //2.2 Column tab
             tabRstLst.push(me.outputColumn(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, controls, pi));
             //2.3 Sum Seg

+ 176 - 115
modules/reports/util/rpt_excel_util.js

@@ -79,7 +79,7 @@ function writeApp(sheets, isSinglePage) {
 }
 function writeCore() {
     let rst = [];
-    p_fillZero = function(val){
+    let p_fillZero = function(val){
         let rst = val;
         if (val < 10) {
             rst = '0' + val;
@@ -168,7 +168,7 @@ function writeStyles(stylesObj){
     rst.push('<fills count="2"><fill><patternFill patternType="none" /></fill><fill><patternFill patternType="gray125" /></fill></fills>');
     //3. push borders
     rst.push('<borders count="' + stylesObj.borders.length + '">')
-    private_setBorder = function(border, borderDirection) {
+    let private_setBorder = function(border, borderDirection) {
         if (border[borderDirection][JV.PROP_LINE_WEIGHT] == 0) {
             rst.push('<' + borderDirection.toLowerCase() + '/>');
         } else {
@@ -196,14 +196,60 @@ function writeStyles(stylesObj){
     for (let i = 0; i < stylesObj.cellXfs.length; i++) {
         let excelStyle = stylesObj.cellXfs[i];
         rst.push('<xf numFmtId="0" fontId="' + excelStyle.fontId + '" fillId="0" borderId="' + excelStyle.borderId + '" xfId="0">');
-        let alignStr = '<alignment horizontal="' + excelStyle[JV.CONTROL_PROPS[2]] + '" vertical="' + excelStyle[JV.CONTROL_PROPS[3]] + '"';
+        //pageData[JV.NODE_FONT_COLLECTION] excelStyle.fontId
+        let alignStr = "<alignment";
+        let textRotation = 0;
+        let newHorizontal = excelStyle[JV.CONTROL_PROPS[2]];
+        let newVertical = excelStyle[JV.CONTROL_PROPS[3]];
+        if (parseInt(excelStyle.fontAngle) !== 0) {
+            let tmpH = newHorizontal, tmpV = newVertical;
+            if (excelStyle.fontAngle > 0) {
+                textRotation = 180;
+                if (newHorizontal === "left") {
+                    tmpV = 'top';
+                } else if (newHorizontal === "right") {
+                    tmpV = 'bottom';
+                } else {
+                    tmpV = 'center';
+                }
+                if (newVertical === "top") {
+                    tmpH = 'right';
+                } else if (newVertical === "bottom") {
+                    tmpH = 'left';
+                } else {
+                    tmpH = 'center';
+                }
+            } else {
+                textRotation = 90;
+                if (newHorizontal === "left") {
+                    tmpV = 'bottom';
+                } else if (newHorizontal === "right") {
+                    tmpV = 'top';
+                } else {
+                    tmpV = 'center';
+                }
+                if (newVertical === "top") {
+                    tmpH = 'left';
+                } else if (newVertical === "bottom") {
+                    tmpH = 'right';
+                } else {
+                    tmpH = 'center';
+                }
+            }
+            newHorizontal = tmpH;
+            newVertical = tmpV;
+        }
+        alignStr += ' horizontal="' + newHorizontal + '" vertical="' + newVertical + '"';
         if (strUtil.convertStrToBoolean(excelStyle[JV.CONTROL_PROPS[1]])) {
-            alignStr = alignStr + ' shrinkToFit="1"';
+            alignStr += ' shrinkToFit="1"';
         }
         if (strUtil.convertStrToBoolean(excelStyle[JV.CONTROL_PROPS[4]])) {
-            alignStr = alignStr + ' wrapText="1"';
+            alignStr += ' wrapText="1"';
+        }
+        if (textRotation !== 0) {
+            alignStr += ' textRotation="' + textRotation + '"';
         }
-        alignStr = alignStr + '/>';
+        alignStr += '/>';
         rst.push(alignStr);
         rst.push('</xf>');
     }
@@ -234,7 +280,7 @@ function writeSharedString(sharedStrList){
 }
 function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage){
     let rst = [];
-    private_pushDftFont = function(){
+    let private_pushDftFont = function(){
         let font = {};
         if (!(stylesObj.fonts)) {
             stylesObj.fonts = [];
@@ -245,7 +291,34 @@ function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage
         font.colorIdx = "8";
         stylesObj.fonts.push(font);
     };
+    let private_buildFirstDftStyle = function () {
+        stylesObj.cellXfs = [];
+        stylesObj.borders = [];
+        let fontId = 0;
+        let borderId = 0;
+        let border = {};
+        border[JV.PROP_LEFT] = {};
+        border[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT] = 0;
+        border[JV.PROP_RIGHT] = {};
+        border[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT] = 0;
+        border[JV.PROP_TOP] = {};
+        border[JV.PROP_TOP][JV.PROP_LINE_WEIGHT] = 0;
+        border[JV.PROP_BOTTOM] = {};
+        border[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT] = 0;
+        stylesObj.borders.push(border);
+
+        let cellControl = pageData[JV.NODE_CONTROL_COLLECTION].Default;
+        let sheetControl = {};
+        sheetControl.fontId = fontId;
+        sheetControl.borderId = borderId;
+        sheetControl.fontAngle = 0;
+        for (let i = 0; i < JV.CONTROL_PROPS.length; i++) {
+            sheetControl[JV.CONTROL_PROPS[i]] = cellControl[JV.CONTROL_PROPS[i]];
+        }
+        stylesObj.cellXfs.push(sheetControl);
+    }
     private_pushDftFont();
+    private_buildFirstDftStyle();
     if (isSinglePage) {
         rst.push(writeSheet(pageData, null, paperSize, sharedStrList, stylesObj));
     } else {
@@ -258,9 +331,9 @@ function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage
 function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
     let rst = [], xPos = [], yPos = [], yMultiPos = [], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     let cacheBorderCell = {};
-    private_pre_analyze_pos = function(){
+    let private_pre_analyze_pos = function(){
         let cell, pos;
-        self_analyze_sheet_pos = function (theShtData, theXPos, theYPos) {
+        let self_analyze_sheet_pos = function (theShtData, theXPos, theYPos) {
             theShtData.cells.sort(function(cell1, cell2) {
                 let rst = 0;
                 if (cell1[JV.PROP_AREA][JV.PROP_TOP] > cell2[JV.PROP_AREA][JV.PROP_TOP]) {
@@ -308,13 +381,13 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
             yPos = yMultiPos[0];
         }
     };
-    private_array_sort = function(i1, i2){
+    let private_array_sort = function(i1, i2){
         let rst = 0;
         if (i1 > i2) {rst = 1} else
         if (i1 < i2) rst = -1;
         return rst;
     };
-    private_getCellIdxStr = function(idx){
+    let private_getCellIdxStr = function(idx){
         let rst = 'A';
         if (idx < 26) {
             rst = headerStr[idx];
@@ -327,7 +400,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         }
         return rst;
     };
-    private_getSharedStrIdx = function(val) {
+    let private_getSharedStrIdx = function(val) {
         let rst = sharedStrList.indexOf(val);
         if (rst < 0) {
             sharedStrList.push(val);
@@ -335,7 +408,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         }
         return rst;
     };
-    private_getFontId = function(cell) {
+    let private_getFontId = function(cell) {
         let rst = 0, hasFont = false;
         if (!(stylesObj.fonts)) {
             stylesObj.fonts = [];
@@ -366,7 +439,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         }
         return rst;
     };
-    private_checkBorder = function(cell, border, sheetBorder) {
+    let private_checkBorder = function(cell, border, sheetBorder) {
         let rst = true, borderLineWidths = [], sheetBorderLineWidths = [];
         borderLineWidths.push(border[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT]);
         borderLineWidths.push(border[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT]);
@@ -400,15 +473,18 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         }
         return rst;
     };
-    private_chkAndGetMergeLine = function(cell, sheetBorder, borderStr) {
-        let rst = sheetBorder[borderStr][JV.PROP_LINE_WEIGHT], mergeBorder = pageData[JV.BAND_PROP_MERGE_BAND];
+    let private_chkAndGetMergeLine = function(cell, sheetBorder, borderStr) {
+        let rst = 0, mergeBorder = pageData[JV.BAND_PROP_MERGE_BAND];
+        if (sheetBorder[borderStr] && sheetBorder[borderStr][JV.PROP_LINE_WEIGHT] != undefined) {
+            rst = sheetBorder[borderStr][JV.PROP_LINE_WEIGHT];
+        }
         if (cell[JV.PROP_AREA][borderStr] == mergeBorder[borderStr]) {
             let destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBorder[JV.PROP_STYLE][JV.PROP_ID]];
             rst = destStyle[borderStr][JV.PROP_LINE_WEIGHT];
         }
         return parseInt(rst);
     };
-    private_getIniBorder = function() {
+    let private_getIniBorder = function() {
         let rst = {};
         rst[JV.PROP_LEFT] = {};
         rst[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT] = 0;
@@ -420,40 +496,32 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         rst[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT] = 0;
         return rst;
     };
-    private_getBorderId = function(cell) {
+    let private_getBorderId = function(cell) {
         let rst = 0, hasBorder = false;
         if (!(stylesObj.borders)) {
             stylesObj.borders = [];
         }
         let sheetBorder = pageData[JV.NODE_STYLE_COLLECTION][cell.style];
+        let mergedBorder = private_getIniBorder();
+        mergedBorder[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_LEFT);
+        mergedBorder[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_RIGHT);
+        mergedBorder[JV.PROP_TOP][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_TOP);
+        mergedBorder[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_BOTTOM);
         for (let i = 0; i < stylesObj.borders.length; i++) {
             let border = stylesObj.borders[i];
-            if (private_checkBorder(cell, border, sheetBorder)) {
+            if (private_checkBorder(cell, border, mergedBorder)) {
                 hasBorder = true;
                 rst = i;
                 break;
             }
         }
         if (!hasBorder) {
-            let border = private_getIniBorder();
-            if (sheetBorder && sheetBorder[JV.PROP_LEFT]) {
-                border[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_LEFT);
-            }
-            if (sheetBorder && sheetBorder[JV.PROP_RIGHT]) {
-                border[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_RIGHT);
-            }
-            if (sheetBorder && sheetBorder[JV.PROP_TOP]) {
-                border[JV.PROP_TOP][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_TOP);
-            }
-            if (sheetBorder && sheetBorder[JV.PROP_BOTTOM]) {
-                border[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_BOTTOM);
-            }
-            stylesObj.borders.push(border);
+            stylesObj.borders.push(mergedBorder);
             rst = stylesObj.borders.length - 1;
         }
         return rst;
     };
-    private_checkControl = function(cellControl, sheetControl) {
+    let private_checkControl = function(cellControl, sheetControl) {
         let rst = true;
         for (let i = 0; i < JV.CONTROL_PROPS.length; i++) {
             if (cellControl[JV.CONTROL_PROPS[i]] != sheetControl[JV.CONTROL_PROPS[i]]) {
@@ -463,10 +531,11 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         }
         return rst;
     };
-    private_getStyleId = function(cell) {
+    let private_getStyleId = function(cell) {
         let rst = 1, hasStyle = false;
         if (!(stylesObj.cellXfs)) stylesObj.cellXfs = [];
         let fontId = private_getFontId(cell);
+        let fontAngle = parseInt(pageData.font_collection[cell.font].FontAngle);
         let borderId = private_getBorderId(cell);
         let cellControl = pageData[JV.NODE_CONTROL_COLLECTION][cell[JV.PROP_CONTROL]];
         for (let i = 0; i < stylesObj.cellXfs.length; i++) {
@@ -483,6 +552,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
             let sheetControl = {};
             sheetControl.fontId = fontId;
             sheetControl.borderId = borderId;
+            sheetControl.fontAngle = fontAngle;
             for (let i = 0; i < JV.CONTROL_PROPS.length; i++) {
                 sheetControl[JV.CONTROL_PROPS[i]] = cellControl[JV.CONTROL_PROPS[i]];
             }
@@ -491,7 +561,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         }
         return rst;
     };
-    private_setCols = function(){
+    let private_setCols = function(){
         //remark: 1 excel width = 2.117 mm
         rst.push('<cols>');
         let w = 0;
@@ -502,11 +572,11 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         }
         rst.push('</cols>');
     };
-    private_setMergedCells = function() {
+    let private_setMergedCells = function() {
         let cell, idxR, idxL, idxT, idxB, cnt = 0;
         rst.push('<mergeCells count="?">');
         let startIdx = rst.length - 1;
-        self_setMergedCells = function (theData, theYPos, offsetY) {
+        let self_setMergedCells = function (theData, theYPos, offsetY) {
             for (let i = 0; i < theData.cells.length; i++) {
                 cell = theData.cells[i];
                 idxR = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_RIGHT]);
@@ -527,13 +597,13 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
                 let shtItemData = pageData.items[i];
                 let tmpPos = yMultiPos[i];
                 self_setMergedCells(shtItemData, tmpPos, osY);
-                osY += tmpPos.length;
+                osY += tmpPos.length - 2;
             }
         }
         rst[startIdx] = '<mergeCells count="' + cnt + '">';
         rst.push('</mergeCells>');
     };
-    private_chkIfNeedCacheCell = function(cell){
+    let private_chkIfNeedCacheCell = function(cell){
         let rst = false;
         if (cell[JV.PROP_AREA][JV.PROP_LEFT] === pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_LEFT] ||
             cell[JV.PROP_AREA][JV.PROP_RIGHT] === pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_RIGHT] ||
@@ -548,9 +618,9 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         }
         return rst;
     };
-    private_cacheMergeBandBorderIdxs = function() {
+    let private_cacheMergeBandBorderIdxs = function() {
         let cell, idxR, idxL, idxT, idxB;
-        self_cachMergeIdxs = function (theData, theYPos, offsetY) {
+        let self_cachMergeIdxs = function (theData, theYPos, offsetY) {
             for (let i = 0; i < theData.cells.length; i++) {
                 cell = theData.cells[i];
                 idxR = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_RIGHT]);
@@ -576,91 +646,84 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
                 let shtItemData = pageData.items[i];
                 let tmpPos = yMultiPos[i];
                 self_cachMergeIdxs(shtItemData, tmpPos, osY);
-                osY += tmpPos.length;
+                osY += tmpPos.length - 2;
             }
         }
     };
-    private_getMergedCellStyleId = function(preStyleId, colIdxStr) {
-        let rst = preStyleId;
-        if (cacheBorderCell[colIdxStr]) {
-            rst = private_getStyleId(cacheBorderCell[colIdxStr]);
-        }
-        return rst;
-    };
-    private_setSheetData = function(){
+    let private_setSheetData = function(){
         //remark: 1 excel height = 0.3612 mm
         rst.push('<sheetData>');
-        let spanX = xPos.length - 2, cellIdx = 0, h = 0,
-            hasMoreCols = true, nextColIdx = -1,
-            nextRowIdx = 0
+        let spanX = xPos.length - 2, cellIdx = 0, h = 0
             ;
-        self_setData = function (theShtData, theYPos, offsetY) {
+        let self_setDataEx = function (theShtData, theYPos, offsetY) {
+            let rows = [];
+            //1. build full set of blank rows/cells
             for (let i = 1; i < theYPos.length - 1; i++) {
+                let rowObj = {};
                 h = (theYPos[i+1] - theYPos[i]) / DPI * 25.4 / 0.3612;
                 h = Math.round(h * 1000) / 1000;
-                rst.push('<row r="' + (i + offsetY) + '" spans="1:' + spanX + '" ht="' + h + '" customHeight="1">');
-                let colIdxStr = '';
-                hasMoreCols = true;
-                while (nextRowIdx < i) {
-                    if (cellIdx >= theShtData.cells.length || nextRowIdx > i) {
-                        break;
-                    } else {
-                        cellIdx++;
-                        nextRowIdx = theYPos.indexOf(theShtData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
-                    }
+                rowObj.height = h;
+                rowObj.r = i + offsetY;
+                rowObj.items = [];
+                rows.push(rowObj);
+                for (let j = 1; j < xPos.length - 1; j++) {
+                    let colIdxStr = private_getCellIdxStr(j - 1);
+                    let cellObj = {};
+                    cellObj.r = colIdxStr + (i + offsetY);
+                    cellObj.s = 0;
+                    cellObj.isBlank = true;
+                    rows[i - 1].items.push(cellObj);
                 }
-                if (nextRowIdx > i) {
-                    hasMoreCols = false;
+            }
+            //2. then fill up the cell style-ids and values
+            let rowIdx1 = 0, colIdx1 = 0, rowIdx2 = 0, colIdx2 = 0, colIdxStr = '';
+            for (let cIdx = 0; cIdx < theShtData.cells.length; cIdx++) {
+                let styleIdx = private_getStyleId(theShtData.cells[cIdx]);
+                //colIdxStr = private_getCellIdxStr(j - 1);
+                rowIdx1 = theYPos.indexOf(theShtData.cells[cIdx][JV.PROP_AREA][JV.PROP_TOP]);
+                colIdx1 = xPos.indexOf(theShtData.cells[cIdx][JV.PROP_AREA][JV.PROP_LEFT]);
+                let cellObj = rows[rowIdx1 - 1].items[colIdx1 - 1];
+                cellObj.s = styleIdx;
+                cellObj.isBlank = false;
+                if (!(strUtil.isEmptyString(theShtData.cells[cIdx][JV.PROP_VALUE]))) {
+                    let valIdx = private_getSharedStrIdx(theShtData.cells[cIdx][JV.PROP_VALUE]);
+                    cellObj.v = valIdx;
                 }
-                nextColIdx = xPos.indexOf(theShtData.cells[cellIdx][JV.PROP_AREA][JV.PROP_LEFT]);
-                let preStyleIdx = 1;
-                for (let j = 1; j < xPos.length - 1; j++) {
-                    colIdxStr = private_getCellIdxStr(j - 1);
-                    if (hasMoreCols) {
-                        if (nextColIdx == j) {
-                            let styleIdx = private_getStyleId(theShtData.cells[cellIdx]);
-                            preStyleIdx = styleIdx;
-                            if (strUtil.isEmptyString(theShtData.cells[cellIdx][JV.PROP_VALUE])) {
-                                rst.push('<c r="' + colIdxStr + (i + offsetY) + '" s="' + styleIdx + '"/>');
-                                //should setup the right style instead!
-                            } else {
-                                let valIdx = private_getSharedStrIdx(theShtData.cells[cellIdx][JV.PROP_VALUE]);
-                                rst.push('<c r="' + colIdxStr + (i + offsetY) + '" s="' + styleIdx + '" t="s">');
-                                rst.push('<v>' + valIdx + '</v>');
-                                rst.push('</c>');
-                            }
-                            cellIdx++;
-                            if (cellIdx < theShtData.cells.length) {
-                                nextRowIdx = theYPos.indexOf(theShtData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
-                                if (nextRowIdx > i) {
-                                    hasMoreCols = false;
-                                } else {
-                                    nextColIdx = xPos.indexOf(theShtData.cells[cellIdx][JV.PROP_AREA][JV.PROP_LEFT]);
-                                }
-                            } else {
-                                hasMoreCols = false;
-                            }
-                        } else if (nextColIdx < 0) {
-                            //impossible!
-                            console.log('has abnormal case!');
-                            hasMoreCols = false;
-                        } else {
-                            //rst.push('<c r="' + colIdxStr + (i + offsetY) + '" s="' + preStyleIdx + '"/>');
-                            rst.push('<c r="' + colIdxStr + (i + offsetY) + '" s="' + private_getMergedCellStyleId(preStyleIdx, colIdxStr + i + offsetY) + '"/>');
+                rowIdx2 = theYPos.indexOf(theShtData.cells[cIdx][JV.PROP_AREA][JV.PROP_BOTTOM]);
+                colIdx2 = xPos.indexOf(theShtData.cells[cIdx][JV.PROP_AREA][JV.PROP_RIGHT]);
+                if ((rowIdx2 - rowIdx1 > 1) || (colIdx2 - colIdx1 > 1)) {
+                    for (let i = 0; i < rowIdx2 - rowIdx1; i++) {
+                        for (let j = 0; j < colIdx2 - colIdx1; j++) {
+                            if (i === 0 && j === 0) continue;
+                            cellObj = rows[rowIdx1 - 1 + i].items[colIdx1 - 1 + j];
+                            cellObj.s = styleIdx;
+                            cellObj.isBlank = true;
                         }
+                    }
+                }
+            }
+            //3. then fill up rst
+            for (let i = 0; i < rows.length; i++) {
+                rst.push('<row r="' + (i + 1 + offsetY) + '" spans="1:' + spanX + '" ht="' + rows[i].height + '" customHeight="1">');
+                for (let j = 0; j < rows[i].items.length; j++) {
+                    let cellObj = rows[i].items[j];
+                    if (cellObj.v === undefined) {
+                        rst.push('<c r="' + cellObj.r + '" s="' + cellObj.s + '"/>');
                     } else {
-                        //rst.push('<c r="' + colIdxStr + (i + offsetY) + '" s="' + preStyleIdx + '"/>');
-                        rst.push('<c r="' + colIdxStr + (i + offsetY) + '" s="' + private_getMergedCellStyleId(preStyleIdx, colIdxStr + i + offsetY) + '"/>');
+                        rst.push('<c r="' + cellObj.r + '" s="' + cellObj.s + '" t="s">');
+                        rst.push('<v>' + cellObj.v + '</v>');
+                        rst.push('</c>');
                     }
                 }
                 rst.push('</row>');
             }
-        }
+            //4. maybe need to dispose the memory
+            //...
+        };
         private_cacheMergeBandBorderIdxs();
         if (sheetData) {
             //current sheet data
-            nextRowIdx = yPos.indexOf(sheetData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
-            self_setData(sheetData, yPos, 0);
+            self_setDataEx(sheetData, yPos, 0);
         } else {
             //total data in one sheet
             let cnt = 0;
@@ -668,9 +731,8 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
                 let shtItemData = pageData.items[i];
                 let tmpPos = yMultiPos[i];
                 cellIdx = 0;
-                nextRowIdx = tmpPos.indexOf(shtItemData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
-                self_setData(shtItemData, tmpPos, cnt);
-                cnt += tmpPos.length;
+                self_setDataEx(shtItemData, tmpPos, cnt);
+                cnt += tmpPos.length - 2;
             }
         }
         rst.push('</sheetData>');
@@ -712,12 +774,11 @@ module.exports = {
         let isSinglePage = rptOptions.singlePage;
         let sheets = [];
         if (isSinglePage) {
-            //
+            sheets.push({sheetName: '全部页'});
         } else {
-            //
-        }
-        for (let i = 0; i < pageData.items.length; i++) {
-            sheets.push({sheetName: '第' + (i + 1) + '页'});
+            for (let i = 0; i < pageData.items.length; i++) {
+                sheets.push({sheetName: '第' + (i + 1) + '页'});
+            }
         }
         //1.
         let file = '[Content_Types].xml';

+ 4 - 2
public/web/sheet/sheet_common.js

@@ -157,7 +157,9 @@ var sheetCommonObj = {
                 items.forEach(function(item){
                     if(sheet.getValue(row, col) === item.text){
                         rst[setting.header[col].dataCode] = item.value;
-                        rst.shortName = repositoryGljObj.distTypeTree.distTypes[repositoryGljObj.distTypeTree.prefix + item.value].data.shortName;
+                        if(repositoryGljObj){
+                            rst.shortName = repositoryGljObj.distTypeTree.distTypes[repositoryGljObj.distTypeTree.prefix + item.value].data.shortName;
+                        }
                     }
                 });
             }
@@ -238,7 +240,7 @@ var sheetCommonObj = {
         var rst = true;
         if (rObj) {
             for (var i = 0; i < setting.header.length; i++) {
-                if (rObj[setting.header[i]]) {
+                if (rObj[setting.header[i].dataCode]) {
                     rst = false;
                     break;
                 }

+ 22 - 9
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>
@@ -196,7 +217,7 @@
             buildAllJobs(spreadAllJobs, totalJobsSetting);
         });
         function buildAllJobs(spreadAllJobs, setting){
-            setSheet.initSheet(spreadAllJobs, setting, false);
+            setSheet.initSheet(spreadAllJobs, setting, true);
             myKey.downKey(spreadAllJobs);
             myKey.enterKey(spreadAllJobs);
             TREE_SHEET_HELPER.loadSheetHeader(setting, spreadAllJobs.getActiveSheet());
@@ -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">

+ 184 - 48
web/maintain/bills_lib/html/qingdan.html

@@ -43,22 +43,22 @@
                   <div class="collapse navbar-collapse" id="navbarNav">
                       <ul class="navbar-nav">
                           <li class="nav-item">
-                              <a class="nav-link text-primary" id="insert" href="javascript: void(0);"><i class="fa fa-share" aria-hidden="true"></i>插入</a>
+                              <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" 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" id="upLevel"  href="javascript: void(0);"><i class="fa fa-arrow-left" aria-hidden="true"></i>升级</a>
+                              <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>
                           </li>
                           <li class="nav-item">
-                              <a class="nav-link text-primary" id="downLevel" href="javascript: void(0);"><i class="fa fa-arrow-right" aria-hidden="true"></i>降级</a>
+                              <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" 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" 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. -->
@@ -265,43 +279,53 @@
         let btnDownMove = $('#downMove');
         dbController.editData(controller);
         btnInsert.click(function(){
-            if(!btnInsert.attr('focusOnBills')){
+            if(btnInsert.attr('doing') === 'false' && btnInsert.attr('fcsOnBills') === 'true'){
                 dbController.insert(controller, btnInsert);
                 tools.clearData(jobsSpread.getActiveSheet());
                 tools.clearData(itemsSpread.getActiveSheet());
             }
         });
         btnDelete.click(function(){
-            if(!btnDelete.attr('focusOnBills')){
+            if(btnDelete.attr('doing') === 'false' && btnDelete.attr('fcsOnBills') === 'true'){
                 dbController.delete(controller, btnDelete, totalJobs, totalItems);
             }
-            //controller.delete();
         });
         btnUpLevel.click(function(){
-            if(!btnUpLevel.attr('focusOnBills')){
+            if(btnUpLevel.attr('doing') === 'false' && btnUpLevel.attr('fcsOnBills') === 'true'){
                 dbController.upLevel(controller, btnUpLevel);
             }
-            //controller.upLevel();
         });
         btnDownLevel.click(function(){
-            if(!btnDownLevel.attr('focusOnBills')){
+            if(btnDownLevel.attr('doing') === 'false' && btnDownLevel.attr('fcsOnBills') === 'true'){
                 dbController.downLevel(controller, btnDownLevel);
             }
-            //controller.downLevel();
         });
         btnUpMove.click(function(){
-            if(!btnUpMove.attr('focusOnBills')){
+            if(btnUpMove.attr('doing') === 'false' && btnUpMove.attr('fcsOnBills') === 'true'){
                 dbController.upMove(controller, btnUpMove);
             }
-            if(btnUpMove.attr('focusOnJobs')){
+            //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());
+                }
             }
-            //controller.upMove();
         });
         btnDownMove.click(function(){
-            if(!btnDownMove.attr('focusOnBills')){
+            if(btnDownMove.attr('doing') === 'false' && btnDownMove.attr('fcsOnBills') === 'true'){
                 dbController.downMove(controller, btnDownMove);
             }
-            //controller.downMove();
+            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());
+                }
+            }
         });
     }
 
@@ -326,6 +350,8 @@
         bindPasteBills(controller, billsSpread.getActiveSheet(), setting);
         //补注内容改变
         rechargeChange(controller);
+        //焦点控制
+        switchFcs(controller, controller.sheet, jobsSheet, itemsSheet);
         //jobs
         jobOperation(controller, jobsSheet, function(totalJobs){
             //------关联表粘贴复制
@@ -339,6 +365,126 @@
         });
     }
 
+    function switchFcs(controller, billsSheet, 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) {
+            //if(billsSheet.options.isProtected = true){
+                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) {
+           // if(jobsSheet.options.isProtected){
+               /* itemsSheet.clearSelection();
+                itemsSheet.options.isProtected = true;
+                jobsSheet.options.isProtected = false;
+                let activeRow = jobsSheet.getActiveRowIndex();
+                let activeCol = jobsSheet.getActiveColumnIndex();
+                jobsSheet.setActiveCell(activeRow === 0 ? 1: 0, 0);
+                jobsSheet.setActiveCell(activeRow, activeCol);*/
+
+                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];
+                }
+                if(tools.canUpMove(selected, controller.tree.selected.jobs)){
+                    tools.btnAction(btnUpMove);
+                    btnUpMove.attr('canMove', 'true');
+                }
+                else{
+                    tools.btnClose(btnUpMove);
+                    btnUpMove.attr('canMove', 'false');
+                }
+                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) {
+            //if(itemsSheet.options.isProtected){
+              /*  jobsSheet.clearSelection();
+                jobsSheet.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){
         if(controller.tree.items.length > 0){
             let length = controller.tree.items.length;
@@ -358,12 +504,14 @@
                 tools.btnAction($('#insert'), 'focusOnBills');
                 if (show) {
                     //btn.show();
-                    btn.css("opacity", "");
-                    btn.removeClass("disabled");
+                    tools.btnAction(btn, 'doing');
+                    /*btn.css("opacity", "");
+                    btn.removeClass("disabled");*/
                 } else {
                     //btn.hide();
-                    btn.css("opacity", "0.2");
-                    btn.addClass("disabled");
+                    /*btn.css("opacity", "0.2");
+                    btn.addClass("disabled");*/
+                    tools.btnClose(btn, 'doing');
                 }
             };
             showButton(tree.selected && tree.selected.canUpLevel(), $('#upLevel'));
@@ -384,13 +532,6 @@
     }
 
     function jobOperation(controller, jobsSheet, callback){
-        //add
-        /*jobsSheet.bind(GC.Spread.Sheets.Events.CellClick, function (sender, args) {
-            controller.setTreeSelected(null);
-            tools.btnClose($('#insert'), 'focusOnBills');
-            tools.btnAction($('#upMove'), 'focusOnJobs');
-        });*/
-        //add
         mainAjax.getMaxNumber(billsLibId, 'jobs', function(result){
             if(result.length === 0){
                 maxJobsNumber = 0;
@@ -413,12 +554,6 @@
     }
 
     function itemOperation(controller, itemsSheet, callback){
-        //add
-        /*itemsSheet.bind(GC.Spread.Sheets.Events.CellClick, function(sender, args){
-            controller.setTreeSelected(null);
-            tools.btnClose($('#insert'), 'focusOnBills');
-        });*/
-        //add
         mainAjax.getMaxNumber(billsLibId, 'items', function(result){
             if(result.length === 0){
                 maxItemsNumber = 0;
@@ -460,8 +595,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){
@@ -471,6 +606,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){
@@ -480,10 +616,6 @@
                     sheetItemsDatas = tools.getsheetDatas(sheet, 'items');
                 }
             }
-            else {
-                tools.clearData(sheet);
-                $('#exampleTextarea').val('');
-            }
         });
     }
 
@@ -532,7 +664,8 @@
     function bindPasteRel(sheet, controller, totalJobs, setting){
         sheetDatas = tools.getsheetDatas(sheet, 'jobs');
         sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, function(sender, args){
-            sheet.setColumnCount(2, GC.Spread.Sheets.SheetArea.viewport);
+          //  sheet.setColumnCount(2, GC.Spread.Sheets.SheetArea.viewport);
+           // sheet.setColumnCount(2, GC.Spread.Sheets.SheetArea.colHeader);
             if(controller.tree.selected){
                 let orgRow = args.cellRange.row, orgCol = args.cellRange.col, rowCount = args.cellRange.rowCount, colCount = args.cellRange.colCount;
                 let maxRow = orgRow + rowCount - 1, maxCol = orgCol + colCount -1;
@@ -587,7 +720,8 @@
     function bindPasteItemsRel(sheet, controller, totalItems, setting){
         sheetItemsDatas = tools.getsheetDatas(sheet, 'items');
         sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, function(sender, args){
-            sheet.setColumnCount(2, GC.Spread.Sheets.SheetArea.viewport);
+            //sheet.setColumnCount(2, GC.Spread.Sheets.SheetArea.viewport);
+           // sheet.setColumnCount(2, GC.Spread.Sheets.SheetArea.colHeader);
             if(controller.tree.selected){
                 let orgRow = args.cellRange.row, orgCol = args.cellRange.col, rowCount = args.cellRange.rowCount, colCount = args.cellRange.colCount;
                 let maxRow = orgRow + rowCount - 1, maxCol = orgCol + colCount -1;
@@ -644,16 +778,18 @@
 
 
     function buildJobs(jobsSpread, setting){
-        setSheet.initSheet(jobsSpread, setting, false);
+        setSheet.initSheet(jobsSpread, setting, true);
        // setSheet.setMaxRowCount(jobsSpread.getActiveSheet(), 10);
+        //jobsSpread.getActiveSheet().clearSelection();
         myKey.downKey(jobsSpread);
         myKey.enterKey(jobsSpread);
         TREE_SHEET_HELPER.loadSheetHeader(jobsSetting, jobsSpread.getActiveSheet());
     }
 
     function buildItems(itemsSpread, setting){
-        setSheet.initSheet(itemsSpread, setting, false);
+        setSheet.initSheet(itemsSpread, setting, true);
        // setSheet.setMaxRowCount(itemsSpread.getActiveSheet(), 10);
+       // itemsSpread.getActiveSheet().clearSelection();
         myKey.downKey(itemsSpread);
         myKey.enterKey(itemsSpread);
         TREE_SHEET_HELPER.loadSheetHeader(itemsSetting, itemsSpread.getActiveSheet());

+ 22 - 7
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>
@@ -203,7 +224,7 @@
             buildEigenvalue(spreadVal, eigenValueSetting);
   		});
         function buildAllItems(spread, setting){
-            setSheet.initSheet(spread, setting, false);
+            setSheet.initSheet(spread, setting, true);
             myKey.downKey(spread);
             myKey.enterKey(spread);
             TREE_SHEET_HELPER.loadSheetHeader(setting, spread.getActiveSheet());
@@ -371,11 +392,7 @@
                         }
                     }
                 }
-                console.log(`pasteDatas`);
-                console.log(pasteDatas);
                 let uniqDatas = tools.uniqObjArr(pasteDatas);
-                console.log(`uniqDatas`);
-                console.log(uniqDatas);
                 for(let i=0; i< uniqDatas.length; i++){
                     let crossedData;
                     let flag = true;
@@ -403,8 +420,6 @@
                 let encapDatas = tools.encapValues(sheet, totalItems, uncrossedDatas, crossedDatas);
                 if(encapDatas.updateDatas.length > 0 || encapDatas.createDatas.length > 0){
                     itemsAjax.pasteValues(encapDatas, function(datas){
-                        console.log(datas);
-                        console.log(`enterCb`);
                         pasteController.pasteValueFront(sheet, totalItems, datas);
                     });
                 }

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

@@ -273,6 +273,30 @@ var billsAjax = {
             }
         });
     },
+    removeTotal: function (billsLibId, billsIds, delIds, field) {
+        $.ajax({
+            type: 'post',
+            url: 'stdBillsEditor/removeTotal',
+            data: {data: JSON.stringify({billsLibId: billsLibId, billsIds: billsIds, delIds: delIds, field: field})},
+            dataType: 'json',
+            success: function(result){
+
+            }
+        })
+    },
+    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',

+ 1 - 1
web/maintain/bills_lib/scripts/bills_lib_setting.js

@@ -74,7 +74,7 @@ var billsLibSetting = {
     ],
     headRows: 1,
     headRowHeight: [47],
-    emptyRows: 3,
+    emptyRows: 0,
     treeCol: 0
 };
 

+ 237 - 109
web/maintain/bills_lib/scripts/db_controller.js

@@ -3,7 +3,8 @@
  */
 var dbController = {
     insert: function(controller, btn){
-        tools.btnClose(btn, 'focusOnBills');
+        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, 'focusOnBills');
+                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, 'focusOnBills');
+                     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, 'focusOnBills');
+                    tools.btnAction(btn);
+                    btn.attr('doing', 'false');
                 });
             }
         }
     },
 
     upLevel: function(controller, btn){
-        tools.btnClose(btn, 'focusOnBills');
+        tools.btnClose(btn);
+        btn.attr('doing', 'true');
         var node = controller.tree.selected;
         var ids = [];
         var updateData = [];
@@ -94,9 +99,10 @@ var dbController = {
                 }
                 billsAjax.upLevel(billsLibId, updateData, function(){
                     console.log(`enter upL`);
+                    tools.btnAction(btn);
+                    btn.attr('doing', 'false');
                     controller.upLevel();
                     sheetBillsDatas = tools.getsheetDatas(controller.sheet, 'bills', controller);
-                    tools.btnAction(btn, 'focusOnBills');
                 });
                 //rechargeController.createRecharge(controller.tree.selected);
             }
@@ -104,7 +110,8 @@ var dbController = {
     },
 
     downLevel: function(controller, btn){
-        tools.btnClose(btn, 'focusOnBills');
+        tools.btnClose(btn);
+        btn.attr('doing', 'true');
         var node = controller.tree.selected;
         var updateData = [];
         if(node){
@@ -131,9 +138,10 @@ var dbController = {
                     updateData.push(updateC);
                 }
                 billsAjax.downLevel(billsLibId, updateData, function(){
+                    tools.btnAction(btn);
+                    btn.attr('doing', 'false');
                     controller.downLevel();
                     sheetBillsDatas = tools.getsheetDatas(controller.sheet, 'bills', controller);
-                    tools.btnAction(btn, 'focusOnBills');
                 });
                 //rechargeController.createRecharge(controller.tree.selected);
             }
@@ -141,7 +149,9 @@ var dbController = {
     },
 
     delete: function(controller, btn, totalJobs, totalItems){
-        tools.btnClose(btn, 'focusOnBills');
+        tools.btnClose(btn);
+        btn.attr('doing', 'true');
+        console.log(`beforeNodeId :${controller.tree.selected.getID()}`);
         var node = controller.tree.selected;
         if(node){
             var deleteIds = [];
@@ -159,6 +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);
+                btn.attr('doing', 'false');
                 controller.delete();
                 //to solve refresh after deleted
                 let jobsSheet = jobsSpread.getActiveSheet();
@@ -187,14 +199,14 @@ var dbController = {
                 sheetDatas = tools.getsheetDatas(jobsSheet, 'jobs');
                 sheetItemsDatas = tools.getsheetDatas(itemsSheet, 'items');
                 sheetBillsDatas = tools.getsheetDatas(controller.sheet, 'bills', controller);
-                tools.btnAction(btn, 'focusOnBills');
                 //to solve refresh after deleted
             });
         }
     },
 
     upMove: function(controller, btn){
-        tools.btnClose(btn, 'focusOnBills');
+        tools.btnClose(btn);
+        btn.attr('doing', 'true');
         var node = controller.tree.selected;
         var updateData = [];
         if(node){
@@ -217,16 +229,18 @@ var dbController = {
                     updateData.push(updateC);
                 }
                 billsAjax.upMove(billsLibId, updateData, function(){
+                    tools.btnAction(btn);
+                    btn.attr('doing', 'false');
                     controller.upMove();
                     sheetBillsDatas = tools.getsheetDatas(controller.sheet, 'bills', controller);
-                    tools.btnAction(btn, 'focusOnBills');
                 });
             }
         }
     },
 
     downMove: function(controller, btn){
-        tools.btnClose(btn, 'focusOnBills');
+        tools.btnClose(btn);
+        btn.attr('doing', 'true');
         var node = controller.tree.selected;
         var updateData = [];
         if(node){
@@ -252,9 +266,10 @@ var dbController = {
                     updateData.push(updateC);
                 }
                 billsAjax.downMove(billsLibId, updateData);
+                tools.btnAction(btn);
+                btn.attr('doing', 'false');
                 controller.downMove();
                 sheetBillsDatas = tools.getsheetDatas(controller.sheet, 'bills', controller);
-                tools.btnAction(btn, 'focusOnBills');
             }
         }
     },
@@ -269,7 +284,6 @@ var dbController = {
                         field = col.data.field;
                         node.data[field] = args.editingText;
                         sheetBillsDatas.datasIdx['rowIdx'+ args.row][field] = args.editingText;
-                        console.log(sheetBillsDatas);
                     }
                 });
                 billsAjax.updateBills(billsLibId, updateId, field, args.editingText);
@@ -313,16 +327,6 @@ var createObj = {
             if(nodes){
                 nodes.forEach(function(node){
                     node.jobs = new Array();
-                    /*node.data.jobs.forEach(function(jobId){
-                        if(me.jobs[me.prefix + jobId]){
-                            node.jobs.push(me.jobs[me.prefix + jobId]);
-                            me.jobs[me.prefix + jobId].count ++;
-                        }
-                        else {
-                            node.data.jobs.splice(node.data.jobs.indexOf(jobId), 1);
-                        }
-                    });*/
-                    //update
                     node.data.jobs.forEach(function(obj){
                         if(me.jobs[me.prefix + obj.id]){
                             node.jobs.push({job: me.jobs[me.prefix + obj.id], serialNo: obj.serialNo});
@@ -380,15 +384,6 @@ var createObj = {
             if(nodes){
                 nodes.forEach(function(node){
                     node.items = new Array();
-                    /*node.data.items.forEach(function(itemID){
-                        if(me.items[me.prefix + itemID]){
-                            node.items.push(me.items[me.prefix + itemID]);
-                            me.items[me.prefix + itemID].count ++;
-                        }
-                        else {
-                            node.data.items.splice(node.data.items.indexOf(itemID), 1);
-                        }
-                    });*/
                     node.data.items.forEach(function(obj){
                         if(me.items[me.prefix + obj.id]){
                             node.items.push({item: me.items[me.prefix + obj.id], serialNo: obj.serialNo});
@@ -418,15 +413,52 @@ var createObj = {
 };
 
 var tools = {
-    btnClose: function (btn, attr) {
+    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;
+    },
+    canDownMove: function (selected, arr) {
+        return selected && arr.indexOf(selected) < arr.length -1 && arr.indexOf(selected) !== -1 ? true: false;
+    },
+    btnClose: function (btn) {
         btn.css("opacity", "0.2");
         btn.addClass("disabled");
-        btn.attr(attr, true);
+        //btn.attr(attr, 'true');
     },
-    btnAction: function (btn, attr) {
+    btnAction: function (btn) {
         btn.css("opacity", "");
         btn.removeClass("disabled");
-        btn.removeAttr(attr);
+        //btn.attr(attr, 'false');
     },
     isExist: function (totalArr, field, newData, orgData){
         var isExist = false;
@@ -678,8 +710,11 @@ var tools = {
     },
     //update--
     orderReshowData: function(sheet, arr, setting, classify, isResort){
+        sheet.setColumnCount(2, GC.Spread.Sheets.SheetArea.viewport);
+        sheet.setColumnCount(2, GC.Spread.Sheets.SheetArea.colHeader);
         tools.clearData(sheet);
         if(arr.length > 0){
+            sheet.suspendPaint();
             setSheet.setMaxRowCount(sheet, arr);
             if(isResort){
                 tools.resortSerialNo(arr);
@@ -696,15 +731,19 @@ var tools = {
                     }
                 });
             }
+            sheet.resumePaint();
         }
     },
 
     reshowData: function(sheet, arr, setting, isResort){
+        sheet.setColumnCount(2, GC.Spread.Sheets.SheetArea.viewport);
+        sheet.setColumnCount(2, GC.Spread.Sheets.SheetArea.colHeader);
         tools.clearData(sheet);
         if(isResort){
             tools.resort(arr, 'code', false);
         }
         if(arr.length > 0){
+            sheet.suspendPaint();
             var length = arr.length;
             for(var i=0; i<length; i++){
                 setting.cols.forEach(function(col, colIdx){
@@ -717,11 +756,14 @@ var tools = {
                     }
                 });
             }
+            sheet.resumePaint();
         }
     },
 
     reshowValue: function(sheet, arr, setting, isResort){
         tools.clearData(sheet);
+        sheet.setColumnCount(2, GC.Spread.Sheets.SheetArea.viewport);
+        sheet.setColumnCount(2, GC.Spread.Sheets.SheetArea.colHeader);
         if(isResort){
             //tools.resort(arr, 'code', true);
             function myCompareCode(a, b){
@@ -732,6 +774,7 @@ var tools = {
             arr.sort(myCompareCode);
         }
         if(arr.length > 0){
+            sheet.suspendPaint();
             var length = arr.length;
             for(var i=0; i<length; i++){
                 setting.cols.forEach(function(col, colIdx){
@@ -744,6 +787,7 @@ var tools = {
                     }
                 });
             }
+            sheet.resumePaint();
         }
     },
 
@@ -1102,7 +1146,9 @@ var tools = {
             }
             if(rebuildArr.length > 0){
                 rebuildArr.sort(myCompareCode);
-                maxJobsNumber = maxJobsNumber + 1 > rebuildArr[0].code ? maxJobsNumber  : rebuildArr[0].code;
+                if(rebuildArr[0].code){
+                    maxJobsNumber = maxJobsNumber + 1 > rebuildArr[0].code ? maxJobsNumber  : rebuildArr[0].code;
+                }
                 rebuildArr.forEach(function(data){
                     if(data.type !== 'CreateT' && data.field === 'content' ){
                         maxJobsNumber++;
@@ -1171,7 +1217,11 @@ var tools = {
             //rebuildArr.sort(myCompare);
             if(rebuildArr.length > 0){
                 rebuildArr.sort(myCompareCode);
-                maxItemsNumber = maxItemsNumber + 1 > rebuildArr[0].code ? maxItemsNumber  : rebuildArr[0].code;
+                if(rebuildArr[0].code){
+                    maxItemsNumber = maxItemsNumber + 1 > rebuildArr[0].code ? maxItemsNumber  : rebuildArr[0].code;
+                    console.log(`maxJobs`);
+                    console.log(maxItemsNumber);
+                }
                 rebuildArr.forEach(function(data){
                     if(data.type !== 'CreateT' && data.field === 'content' ){
                         maxItemsNumber ++;
@@ -1241,10 +1291,10 @@ var tools = {
                 return valB- valA;
             }
             rebuildArr.sort(myCompareCode);
-            console.log(`rebuildArr`);
-            console.log(rebuildArr);
             let newCode = valueController.getCode(totalItems, selectedId);
-            newCode = newCode > rebuildArr[0].code ? newCode : rebuildArr[0].code + 1;
+            if(rebuildArr[0].code){
+                newCode = newCode > rebuildArr[0].code ? newCode : rebuildArr[0].code + 1;
+            }
             for(let i=0; i< rebuildArr.length; i++){
                 rebuildArr[i].itemId = selectedId;
                 if(rebuildArr[i].type !== 'CreateT' && rebuildArr[i].field === 'value'){
@@ -1456,8 +1506,8 @@ let pasteController = {
                     });
                 }
                 if(datas[i].type === CreateT){
-                    maxJobsNumber++;
-                    maxJobsNumber = maxJobsNumber >= datas[i].code ? maxJobsNumber : datas[i].code;
+                    //maxJobsNumber++;
+                   // maxJobsNumber = maxJobsNumber >= datas[i].code ? maxJobsNumber : datas[i].code;
                     newJobData = {id: datas[i].newJobId, content: datas[i].content, code: datas[i].code};
                     newJob = createObj.newJob(newJobData);
                     totalJobs.jobsArr.push(newJob);
@@ -1468,8 +1518,8 @@ let pasteController = {
                     totalJobs.jobsArr.push(newJob);
                 }
                 if(datas[i].type !== 'CreateT' && datas[i].field === 'code'){
-                    maxJobsNumber++;
-                    maxJobsNumber = maxJobsNumber >= datas[i].data  ? maxJobsNumber : datas[i].data;
+                  //  maxJobsNumber++;
+                   // maxJobsNumber = maxJobsNumber >= datas[i].data  ? maxJobsNumber : datas[i].data;
                     newJobData = {id: datas[i].newJobId, content: '', code: datas[i].data};
                     newJob = createObj.newJob(newJobData);
                     totalJobs.jobsArr.push(newJob);
@@ -1480,7 +1530,6 @@ let pasteController = {
         tools.reshowData(sheet, totalJobs.jobsArr, totalJobsSetting, true);
     },
     pasteItemsFront: function(sheet, totalItems, datas){
-        console.log(`enterFront`);
         const Update = 'Update', CreateT = 'CreateT';
         if(datas.length > 0){
             for(let i=0; i<datas.length; i++){
@@ -1493,8 +1542,8 @@ let pasteController = {
                     });
                 }
                 if(datas[i].type === CreateT){
-                    maxItemsNumber++;
-                    maxItemsNumber = maxItemsNumber >= datas[i].code ? maxItemsNumber : datas[i].code;
+                    //maxItemsNumber++;
+                    //maxItemsNumber = maxItemsNumber >= datas[i].code ? maxItemsNumber : datas[i].code;
                     newItemData = {id: datas[i].newItemId, content: datas[i].content, code: datas[i].code};
                     newItem = createObj.newItem(newItemData);
                     totalItems.itemsArr.push(newItem);
@@ -1507,8 +1556,8 @@ let pasteController = {
                     totalItems.items[totalItems.prefix + datas[i].newItemId] = newItem;
                 }
                 if(datas[i].type !== 'CreateT' && datas[i].field === 'code'){
-                    maxItemsNumber++;
-                    maxItemsNumber = maxItemsNumber >= datas[i].data  ? maxItemsNumber : datas[i].data;
+                    //maxItemsNumber++;
+                    //maxItemsNumber = maxItemsNumber >= datas[i].data  ? maxItemsNumber : datas[i].data;
                     newItemData = {id: datas[i].newItemId, content: '', code: datas[i].data};
                     newItem = createObj.newItem(newItemData);
                     totalItems.itemsArr.push(newItem);
@@ -1605,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 {
@@ -1625,9 +1675,7 @@ var jobsController = {
             maxJobsNumber++;
             //update--
             let serialNo = tools.getSerialNo(controller.tree.selected.jobs);
-            console.log(`serialNo: ${serialNo}`);
             //--
-            console.log(`billsLibId: ${billsLibId} billsId: ${controller.tree.selected.getID()} content: ${newData} code: ${maxJobsNumber}`);
             jobsAjax.edCreateJob(billsLibId, controller.tree.selected.getID(), newData, maxJobsNumber, serialNo, function(newJobId){
                 var newJobData, newJob;
                 newJobData = {id: newJobId, content: newData, code: maxJobsNumber};
@@ -1636,12 +1684,11 @@ var jobsController = {
                 totalJobs.jobs[totalJobs.prefix + newJobId] = newJob;
                 totalJobs.jobsArr.push(newJob);
                 controller.tree.selected.jobs.push({job: newJob, serialNo: serialNo});//update--
-                //tools.reshowData(sheet, controller.tree.selected.jobs, setting, true);//update--
                 tools.orderReshowData(sheet, controller.tree.selected.jobs, setting, 'job', true)//update--
             });
         }
         else {
-            sheet.getCell(args.row, args.col).value('');
+            tools.alertOpr(args, sheet, '该编号不存在,请重新输入!', controller.tree.selected.jobs, 'job');
         }
     },
 
@@ -1675,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){
@@ -1714,17 +1759,72 @@ 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');
             }
-        }
+        });
     },
+    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');
+            }
+        });
+    }
 
 };
 
@@ -1758,13 +1858,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 {
@@ -1791,13 +1885,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');
         }
     },
 
@@ -1861,16 +1949,64 @@ 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');
             }
-        }
+        });
     },
+    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');
+            }
+        });
+    }
 
 };
 
@@ -2016,15 +2152,10 @@ 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);
             }
         });
     },
@@ -2038,7 +2169,8 @@ var totalJobsController = {
                 newJobData = {id: newJobId, content: newData, code: code};
                 newJob = createObj.newJob(newJobData);
                 totalJobs.jobsArr.push(newJob);
-                tools.reSetCell(sheet, args.row, 0, code, newJobId);
+                //tools.reSetCell(sheet, args.row, 0, code, newJobId);
+                tools.reshowData(sheet, totalJobs.jobsArr, totalJobsSetting, true);
                 setSheet.setMaxRowCount(sheet, totalJobs.jobsArr);
             });
         }
@@ -2050,23 +2182,24 @@ var totalJobsController = {
                     newJobData = {id: newJobId, content: '', code: newData};
                     newJob = createObj.newJob(newJobData);
                     totalJobs.jobsArr.push(newJob);
-                    tools.reSetCell(sheet, args.row, 0, null, newJobId);
+                    //tools.reSetCell(sheet, args.row, 0, null, newJobId);
+                    tools.reshowData(sheet, totalJobs.jobsArr, totalJobsSetting, true);
                     setSheet.setMaxRowCount(sheet, totalJobs.jobsArr);
                 });
             }
             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){
+    updateJob: function(totalJobs, id, field, newData, args){
         if(field === 'code' && typeof newData !== 'number'){
-            //编号只能为数字
+            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;
@@ -2097,12 +2230,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);
             }
         });
     },
@@ -2117,7 +2245,8 @@ var totalItemsController = {
                 newItem = createObj.newItem(newItemData);
                 totalItems.itemsArr.push(newItem);
                 totalItems.items[totalItems.prefix + newItemId] = newItem;
-                tools.reSetCell(sheet, args.row, 0, code, newItemId);
+                //tools.reSetCell(sheet, args.row, 0, code, newItemId);
+                tools.reshowData(sheet, totalItems.itemsArr, totalItemsSetting, true);
                 setSheet.setMaxRowCount(sheet, totalItems.itemsArr);
             });
         }
@@ -2130,21 +2259,20 @@ var totalItemsController = {
                     newItem = createObj.newItem(newItemData);
                     totalItems.itemsArr.push(newItem);
                     totalItems.items[totalItems.prefix + newItemId] = newItem;
-                    tools.reSetCell(sheet, args.row, 0, null, newItemId);
+                    //tools.reSetCell(sheet, args.row, 0, null, newItemId);
+                    tools.reshowData(sheet, totalItems.itemsArr, totalItemsSetting, true);
                     setSheet.setMaxRowCount(sheet, totalItems.itemsArr);
                 });
             }
             else {
-                //编号只能为数字
-                sheet.getCell(args.row, args.col).value("");
+                tools.alertTotalOpr(args, '编号只能为数字,请重新输入!', totalItems.itemsArr);
             }
         }
     },
 
-    updateItem: function(totalItems, id, field, newData){
+    updateItem: function(totalItems, id, field, newData, args){
         if(field === 'code' && typeof newData !== 'number'){
-            //编号只能为数字
-            sheet.getCell(args.row, args.col).value('');
+            tools.alertTotalOpr(args, '编号只能为数字,请重新输入!', totalItems.itemsArr);
         }
         else {
             totalItems.itemsArr.forEach(function(item){

+ 6 - 10
web/maintain/bills_lib/scripts/set_sheets.js

@@ -64,11 +64,10 @@ var myKey = {
             var rowCount = sheet.getRowCount();
             if(idxRow+1 == rowCount){
                 sheet.addRows(rowCount, 1);
-                sheet.setRowHeight(rowCount, 30);
                 sheet.getRange(rowCount, -1, 1, -1).vAlign(GC.Spread.Sheets.VerticalAlign.center);
                 sheet.getRange(rowCount, -1, 1, -1).hAlign(GC.Spread.Sheets.HorizontalAlign.left);
                 sheet.getRange(rowCount, -1, 1, -1).textIndent(0.5);
-                sheet.getRange(rowCount, -1, 1, -1).font("14px Arial");
+                sheet.getRange(rowCount, -1, 1, -1).font("Arial");
             }
         });
         spread.commandManager().setShortcutKey("myEnter", GC.Spread.Commands.Key.enter, false, false, false, false);
@@ -82,11 +81,10 @@ var myKey = {
             if(idxRow+1 == rowCount){
                 sheet.suspendPaint();
                 sheet.addRows(rowCount, 1);
-                sheet.setRowHeight(rowCount, 30);
                 sheet.getRange(rowCount, -1, 1, -1).vAlign(GC.Spread.Sheets.VerticalAlign.center);
                 sheet.getRange(rowCount, -1, 1, -1).hAlign(GC.Spread.Sheets.HorizontalAlign.left);
                 sheet.getRange(rowCount, -1, 1, -1).textIndent(0.5);
-                sheet.getRange(rowCount, -1, 1, -1).font("14px Arial");
+                sheet.getRange(rowCount, -1, 1, -1).font("Arial");
                 sheet.resumePaint();
             }
         });
@@ -177,10 +175,9 @@ var myKey = {
                         return valB- valA;
                     }
                     totalJobs.jobsArr.sort(myCompareCode);
-                    maxJobsNumber = totalJobs.jobsArr[0].data.code;
+                    maxJobsNumber = totalJobs.jobsArr.length > 0 ? totalJobs.jobsArr[0].data.code : 0;
                     tools.reshowData(sheet, totalJobs.jobsArr, setting, true);
-                    jobsAjax.deleteJobContent(billsLibId, ids);
-                    billsAjax.updateBillsArr(billsLibId, billsIds, ids, null, 'deleteAll', 'jobs');
+                    billsAjax.removeTotal(billsLibId, billsIds, ids, 'jobs');
                 }
                 spread.resumeEvent();
             });
@@ -204,10 +201,9 @@ var myKey = {
                         return valB- valA;
                     }
                     totalItems.itemsArr.sort(myCompareCode);
-                    maxItemsNumber = totalItems.itemsArr[0].data.code;
+                    maxItemsNumber = totalItems.itemsArr.length > 0 ? totalItems.itemsArr[0].code : 0;
                     tools.reshowData(sheet, totalItems.itemsArr, setting, true);
-                    itemsAjax.deleteItemCharacter(billsLibId, ids);
-                    billsAjax.updateBillsArr(billsLibId, billsIds, ids, null, 'deleteAll', 'items');
+                    billsAjax.removeTotal(billsLibId, billsIds, ids, 'items');
                     //reshowVal
                     if(totalItems.itemsArr.length > 0){
                         selectedId = totalItems.itemsArr[0].data.id;

+ 0 - 8
web/maintain/ration_repository/dinge.html

@@ -501,14 +501,6 @@
                 }
             };
             $(document).ready(function(){
-                /*function round(v,e){
-                    var t=1;
-                    for(;e>0;t*=10,e--);
-                    for(;e<0;t/=10,e++);
-                    return Math.round(v*t)/t;
-                }
-                let a = 10.003, b = 20;
-                console.log(a+b);*/
                 pageOprObj.initPage();
                 rationOprObj.buildSheet($("#rationItemsSheet")[0]);
                 sheetCommonObj.shieldAllCells(rationOprObj.workBook.getSheet(0), rationOprObj.setting);

+ 1 - 1
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>

+ 0 - 2
web/maintain/ration_repository/js/ration.js

@@ -61,8 +61,6 @@ var rationOprObj = {
 
         if(!(args.sheetArea === GC.Spread.Sheets.SheetArea.colHeader || args.sheetArea === GC.Spread.Sheets.SheetArea.corner)){
             var cacheSection = me.getCache();
-            console.log(`cache`);
-            console.log(cacheSection);
             if (cacheSection && args.row < cacheSection.length) {
                 rationGLJOprObj.getGljItems(cacheSection[args.row]);
                 rationCoeOprObj.getCoeItems(cacheSection[args.row]);

+ 0 - 4
web/maintain/ration_repository/js/ration_glj.js

@@ -281,10 +281,6 @@ var rationGLJOprObj = {
             me.currentRationItem.machinePrice = price.machinePrice;
             me.currentRationItem.basePrice = price.rationBasePrc;
             updateArr.push(me.currentRationItem);
-            console.log(`me.cache`);
-            console.log(me.cache['_GLJ_' + me.currentRationItem.ID]);
-            console.log(`updateArr`);
-            console.log(updateArr);
             rationOprObj.mixUpdateRequest(updateArr, [], []);
         }
     },

+ 173 - 45
web/maintain/ration_repository/js/repository_glj.js

@@ -21,6 +21,7 @@ var pageOprObj = {
             $("#rationname")[0].outerHTML = html;
             me.rationLibName = rationLibName;
             repositoryGljObj.buildSheet(container);
+            repositoryGljObj.getRationGljIds(rationLibId);
             repositoryGljObj.getGljDistType(function () {
                 repositoryGljObj.currentRepositoryId = parseInt(rationLibId);
                 repositoryGljObj.getGljTree(rationLibId);
@@ -204,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 {
@@ -232,7 +239,14 @@ var pageOprObj = {
                          me.workBook.getSheet(0).options.isProtected = false;
                          me.addGljObj = null;
                          for(let col=0; col<me.setting.header.length; col++){
-                             me.workBook.getSheet(0).getCell(me.editingRowIdx, col).value('');
+                             let field = me.setting.header[col].dataCode;
+                             if(field === 'gljType'){
+                                 me.workBook.getSheet(0).getCell(me.editingRowIdx, col).value(
+                                     me.distTypeTree.distTypes[me.distTypeTree.prefix + me.currentEditingGlj[field]].data.fullName);
+                             }
+                             else{
+                                 me.workBook.getSheet(0).getCell(me.editingRowIdx, col).value(me.currentEditingGlj[me.setting.header[col].dataCode]);
+                             }
                          }
                          me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, 0);
                      });
@@ -260,19 +274,23 @@ var pageOprObj = {
         var me = repositoryGljObj, rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row, me),
             updateArr = [], addArr = [];
         me.editingRowIdx = args.row;
+        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]){
-                    updateArr.push(rObj);
-                    break;
+                    me.addGljObj = rObj;
+                    if(rObj[me.setting.header[0].dataCode] && rObj[me.setting.header[1].dataCode] && rObj[me.setting.header[5].dataCode]){
+                        updateArr.push(rObj);
+                        break;
+                    }
                 }
             }
-            //update basePrice of ration when editting basePrice of glj
             if(me.currentEditingGlj.basePrice !== rObj.basePrice){
-                let gljTypeParent = me.distTypeTree.distTypes[me.distTypeTree.prefix + me.currentEditingGlj.gljType],
-                    gljType = -1;
+                //update basePrice of ration when editting basePrice of glj
+                let gljType = -1;
+                let gljTypeParent = me.distTypeTree.distTypes[me.distTypeTree.prefix + me.currentEditingGlj.gljType].parent;
                 if(gljTypeParent && gljTypeParent.data.ID <=3){
                     gljType = gljTypeParent.data.ID;
                 }
@@ -281,13 +299,18 @@ var pageOprObj = {
                 }
                 let gljBasePrcObj = {gljId: me.currentEditingGlj.ID, gljType: gljType, basePrice: rObj.basePrice};
                 if(gljBasePrcObj.gljType !== -1){
-                    //me.updateRationBasePrcRq(gljBasePrcObj);
+                    me.updateRationBasePrcRq(gljBasePrcObj);
                 }
             }
+            //update basePrice of ration when editting gljType of glj
+            if(me.currentEditingGlj.gljType !== rObj.gljType){
+               let gljTypeObj = {gljId: me.currentEditingGlj.ID, gljType: rObj.gljType, basePrice: rObj.basePrice};
+                me.updateRationBasePrcRq(gljTypeObj);
+            }
         } 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){
@@ -298,41 +321,130 @@ var pageOprObj = {
         if(me.gljCurTypeId !== 1){
             rObj.gljClass = me.gljCurTypeId;
         }
-        me.currentEditingGlj = null;
         if(updateArr.length >0 || addArr.length >0){
-           me.mixUpdateRequest(updateArr, addArr, []);
-        }
-    },
-    onRangeChanged: function(sender, args) {
-        if (args.action == GC.Spread.Sheets.RangeChangedAction.clear) {
-            var me = repositoryGljObj, updateArr = [], removeArr = [];
-            var cacheSection = me.currentCache;
-            if (cacheSection) {
-                for (var i = 0; i < args.rowCount; i++) {
-                    var hasUpdate = false, rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row + i),
-                        isEmpty = sheetCommonObj.chkIfEmpty(rObj, me.setting);
-                    for (var j = 0; j < cacheSection.length; j++) {
-                        if (cacheSection[j][me.setting.header[0].dataCode] == rObj[me.setting.header[0].dataCode]) {
-                            rObj["ID"] = cacheSection[j]["ID"];
-                            hasUpdate = true;
-                            break;
-                        }
-                    }
-                    if (hasUpdate) {
-                        if (isEmpty) {
-                            removeArr.push(rObj["ID"]);
-                        } else updateArr.push(rObj);
-                    } else if (isEmpty) {
-                        if (args.row + i < cacheSection.length) {
-                            rObj["ID"] = cacheSection[args.row + i]["ID"];
-                            removeArr.push(rObj["ID"]);
-                        }
-                    }
-                }
-                me.mixUpdateRequest(updateArr, [], removeArr);
-            }
+            me.currentEditingGlj = null;
+            me.mixUpdateRequest(updateArr, addArr, []);
         }
     },
+     onRangeChanged: function(sender, args) {
+         if (args.action == GC.Spread.Sheets.RangeChangedAction.clear) {
+             var me = repositoryGljObj, updateArr = [], removeArr = [], cancelArr = [], isMisCode = true;
+             var cacheSection = me.currentCache;
+             if (cacheSection) {
+                 for (var i = 0; i < args.rowCount; i++) {
+                     var hasUpdate = false, rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row + i),
+                         isEmpty = sheetCommonObj.chkIfEmpty(rObj, me.setting);
+                     if(isEmpty){
+                         if(args.row + i < cacheSection.length){
+                             rObj.ID = cacheSection[args.row + i].ID
+                             removeArr.push(rObj.ID);
+                         }
+                     }
+                     else {
+                         if(!rObj.code){
+                             cancelArr.push(args.row + i);
+                         }
+                         else if(!rObj.gljType){
+                             isMisCode = false;
+                             cancelArr.push(args.row + i);
+                         }
+                         else{
+                             rObj.gljClass = me.gljCurTypeId;
+                             updateArr.push(rObj);
+                         }
+                     }
+                 }
+                 //reshow datas
+                 function resetDatas(args, repositoryGljObj, cancelArr){
+                     args.sheet.options.isProtected = false;
+                     args.sheet.suspendPaint();
+                     for(let i =0; i <cancelArr.length; i++){
+                         for(let col =args.col; col< repositoryGljObj.setting.header.length; col++){
+                             let value = repositoryGljObj.setting.header[col].dataCode === 'gljType' ?
+                                 repositoryGljObj.distTypeTree.distTypes[repositoryGljObj.distTypeTree.prefix + cacheSection[cancelArr[i]].gljType].data.fullName :
+                                 cacheSection[cancelArr[i]][repositoryGljObj.setting.header[col].dataCode];
+                             args.sheet.setValue(args.row + i, col, value);
+                         }
+                     }
+                     args.sheet.resumePaint();
+                     args.sheet.setActiveCell(args.row, 0);
+                 }
+                 if(cancelArr.length > 0){
+                     let text = isMisCode === true ? "编号不可为空,编辑失败!": "类型不可为空,编辑失败!"
+                     $('#alertText').text(text);
+                     $('#codeAlertBtn').click();
+                     args.sheet.options.isProtected = true;
+                     $('#codAleConfBtn').click(function () {
+                         resetDatas(args, me, cancelArr);
+                     });
+                     $('#codAleClose').click(function () {
+                         resetDatas(args, me, cancelArr);
+                     });
+                 }
+                 let refGljIds = [], refGljCodes = [], alertText;
+                 if(removeArr.length > 0){
+                     for(let i =0; i <removeArr.length; i++){
+                         if(me.rationGljIds.indexOf(removeArr[i]) !== -1){
+                             refGljIds.push(removeArr[i]);
+                             removeArr.splice(i--, 1);
+                         }
+                     }
+                     for(let i =0; i< me.currentCache.length; i++){
+                         for(let j=0; j< refGljIds.length; j++){
+                             if(me.currentCache[i].ID === refGljIds[j]){
+                                 refGljCodes.push(me.currentCache[i].code);
+                             }
+                         }
+                     }
+                 }
+                 if(refGljIds.length > 0){
+                     if(refGljCodes.length > 3){
+                         alertText = "编号:" + refGljCodes[0]+" " + refGljCodes[1] + " " + refGljCodes[2] + "...等工料机已有定额引用,删除失败!";
+                     }
+                     else {
+                         let alertCode = " ";
+                         for(let i=0; i< refGljCodes.length; i++){
+                             alertCode += refGljCodes[i] + " ";
+                         }
+                         alertText = "编号:" + alertCode + "工料机已有定额引用,删除失败!"
+                     }
+                     $('#alertText').text(alertText);
+                     $('#codeAlertBtn').click();
+                     args.sheet.options.isProtected = true;
+                     $('#codAleConfBtn').click(function () {
+                         if(removeArr.length > 0){
+                             me.mixUpdateRequest(updateArr, [], removeArr);
+                         }
+                         else{
+                             let resetArr = [];
+                             for(let i=0; i<args.rowCount; i++){
+                                 resetArr.push(args.row + i);
+                             }
+                             resetDatas(args, me, resetArr);
+                         }
+                     });
+                     $('#codAleClose').click(function () {
+                         if(removeArr.length > 0){
+                             me.mixUpdateRequest(updateArr, [], removeArr);
+                         }
+                         else{
+                             let resetArr = [];
+                             for(let i=0; i<args.rowCount; i++){
+                                 resetArr.push(args.row + i);
+                             }
+                             resetDatas(args, me, resetArr);
+                         }
+                     });
+                 }
+                 else if(refGljIds.length === 0 && removeArr.length > 0){
+                     me.mixUpdateRequest(updateArr, [], removeArr);
+                 }
+                 if(updateArr.length > 0){
+                     me.mixUpdateRequest(updateArr, [], removeArr);
+                 }
+             }
+         }
+     },
     onClipboardPasting: function(sender, args) {
         var me = repositoryGljObj;
         if (args.cellRange.colCount != me.setting.header.length || me.gljCurTypeId < 0 || me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]) {
@@ -363,17 +475,33 @@ var pageOprObj = {
             me.mixUpdateRequest(updateArr, addArr, []);
         }
     },
-    updateRationBasePrcRq: function (gljBasePrcObj) {
+    updateRationBasePrcRq: function (gljObj) {
         $.ajax({
             type: 'post',
             url: 'api/updateRationBasePrc',
-            data:{data: JSON.stringify({gljId: gljBasePrcObj.gljId, basePrice: gljBasePrcObj.basePrice})},
+            data:{data: JSON.stringify({gljId: gljObj.gljId, basePrice: gljObj.basePrice, gljType: gljObj.gljType})},
             dataType: 'json',
             success: function (result) {
-
+                if(result.error){
+                    alert("计算定额基价失败");
+                }
             }
         });
     },
+    getRationGljIds: function (repId) {
+        let me = repositoryGljObj;
+        $.ajax({
+            type: 'post',
+            url: 'api/getRationGljIds',
+            data: {data: JSON.stringify({repId: repId})},
+            dataType: 'json',
+            success: function(result){
+                if(!result.error){
+                    me.rationGljIds = result.data;
+                }
+            }
+        });
+     },
     mixUpdateRequest: function(updateArr, addArr, removeIds) {
         var me = repositoryGljObj;
         $.ajax({
@@ -388,12 +516,11 @@ var pageOprObj = {
                     alert(result.message);
                     me.getRationItems(me.currentRepositoryId);
                 } else {
+                    console.log(`enterSc`);
                     me.updateCache(addArr, updateArr, removeIds, result);
                     me.sortGlj();
                     me.currentCache = me.getCache();
                     me.showGljItems(me.gljList, me.gljCurTypeId);
-                    console.log(`me.cC`);
-                    console.log(me.currentCache);
                 }
             },
             error:function(err){
@@ -464,6 +591,7 @@ var gljTypeTreeOprObj = {
         me.gljCurTypeId = treeNode.ID;
         me.currentCache = me.getCache();
         me.showGljItems(me.gljList, gljTypeId);
+        console.log(me.gljCurTypeId);
         if (me.parentNodeIds["_pNodeId_" + treeNode.ID]) {
             sheetCommonObj.lockCodeCells(me.workBook.getSheet(0), me.gljList.length);
             //sheetCommonObj.shieldAllCells(me.workBook.getSheet(0), me.setting);

+ 15 - 6
web/maintain/report/js/jpc_output.js

@@ -130,11 +130,11 @@ let JpcCanvasOutput = {
                 }
             }
         }
-        function private_drawLine(cell, ctx, style, styleBorderDest, startP, destP, mergedBand, styles) {
+        function private_drawLine(cell, ctx, style, styleBorderDest, startP, destP, mergedBand, styles, isNeedMergeBand) {
             ctx.beginPath();
             var destStyle = style;
             if (mergedBand) {
-                if (mergedBand[styleBorderDest] == cell[JV.PROP_AREA][styleBorderDest]) {
+                if (isNeedMergeBand && mergedBand[styleBorderDest] == cell[JV.PROP_AREA][styleBorderDest]) {
                     destStyle = styles[mergedBand[JV.PROP_STYLE][JV.PROP_ID]];
                 }
             }
@@ -146,15 +146,24 @@ let JpcCanvasOutput = {
             }
             ctx.stroke();
         }
+        function private_chkIfInMergedBand(mergedBand, cell) {
+            let rst = false;
+            if (mergedBand && cell) {
+                rst = mergedBand[JV.PROP_TOP] <= cell[JV.PROP_AREA][JV.PROP_TOP] && mergedBand[JV.PROP_BOTTOM] >= cell[JV.PROP_AREA][JV.PROP_BOTTOM] &&
+                      mergedBand[JV.PROP_LEFT] <= cell[JV.PROP_AREA][JV.PROP_LEFT] && mergedBand[JV.PROP_RIGHT] >= cell[JV.PROP_AREA][JV.PROP_RIGHT];
+            }
+            return rst;
+        }
         function private_drawCell(cell, fonts, styles, controls, mergedBand) {
             ctx.save();
             ctx.translate(0.5,0.5);
             var style = styles[cell[JV.PROP_STYLE]];
             if (style) {
-                private_drawLine(cell, ctx, style, JV.PROP_TOP, [JV.PROP_LEFT, JV.PROP_TOP],[JV.PROP_RIGHT, JV.PROP_TOP], mergedBand, styles);
-                private_drawLine(cell, ctx, style, JV.PROP_RIGHT, [JV.PROP_RIGHT, JV.PROP_TOP],[JV.PROP_RIGHT, JV.PROP_BOTTOM], mergedBand, styles);
-                private_drawLine(cell, ctx, style, JV.PROP_BOTTOM, [JV.PROP_RIGHT, JV.PROP_BOTTOM],[JV.PROP_LEFT, JV.PROP_BOTTOM], mergedBand, styles);
-                private_drawLine(cell, ctx, style, JV.PROP_LEFT, [JV.PROP_LEFT, JV.PROP_BOTTOM],[JV.PROP_LEFT, JV.PROP_TOP], mergedBand, styles);
+                let isNeedMergeBand = private_chkIfInMergedBand(mergedBand, cell);
+                private_drawLine(cell, ctx, style, JV.PROP_TOP, [JV.PROP_LEFT, JV.PROP_TOP],[JV.PROP_RIGHT, JV.PROP_TOP], mergedBand, styles, isNeedMergeBand);
+                private_drawLine(cell, ctx, style, JV.PROP_RIGHT, [JV.PROP_RIGHT, JV.PROP_TOP],[JV.PROP_RIGHT, JV.PROP_BOTTOM], mergedBand, styles, isNeedMergeBand);
+                private_drawLine(cell, ctx, style, JV.PROP_BOTTOM, [JV.PROP_RIGHT, JV.PROP_BOTTOM],[JV.PROP_LEFT, JV.PROP_BOTTOM], mergedBand, styles, isNeedMergeBand);
+                private_drawLine(cell, ctx, style, JV.PROP_LEFT, [JV.PROP_LEFT, JV.PROP_BOTTOM],[JV.PROP_LEFT, JV.PROP_TOP], mergedBand, styles, isNeedMergeBand);
             }
             private_drawCellText(cell, fonts, controls);
             ctx.restore();

+ 1 - 1
web/users/views/tool/index.html

@@ -21,7 +21,7 @@
             <div class="col-xs-6 mb-30 ">
                 <div class="c-body">
                     <h2>报表模板
-                        <a href="#" class="btn btn-primary pull-right">进入</a></h2>
+                        <a href="/rpt_tpl" class="btn btn-primary pull-right">进入</a></h2>
                 </div>
             </div>
         </div>