Bläddra i källkod

Merge branch 'master' into olym

olym 7 år sedan
förälder
incheckning
4b1fefd332
50 ändrade filer med 3234 tillägg och 1469 borttagningar
  1. 1 0
      modules/bills_lib/models/bills_lib_schemas.js
  2. 5 0
      modules/ration_repository/controllers/coe_controller.js
  3. 8 0
      modules/ration_repository/controllers/ration_controller.js
  4. 9 1
      modules/ration_repository/controllers/ration_section_tree_controller.js
  5. 12 1
      modules/ration_repository/models/coe.js
  6. 22 0
      modules/ration_repository/models/ration_item.js
  7. 12 0
      modules/ration_repository/models/ration_section_tree.js
  8. 4 1
      modules/ration_repository/models/schemas.js
  9. 3 0
      modules/ration_repository/routes/ration_rep_routes.js
  10. 83 30
      modules/reports/controllers/rpt_tpl_controller.js
  11. 11 6
      modules/reports/facade/rpt_tpl_tree_node_facade.js
  12. 1 0
      modules/reports/models/tpl_tree_node.js
  13. 3 0
      modules/reports/routes/rpt_tpl_router.js
  14. 9 7
      modules/reports/rpt_component/jpc_flow_tab.js
  15. 4 2
      modules/reports/rpt_component/jpc_function.js
  16. 10 0
      modules/reports/rpt_component/jpc_rte.js
  17. 1 0
      modules/std_glj_lib/models/schemas.js
  18. 2 2
      operation.js
  19. 10 0
      public/web/rpt_value_define.js
  20. 72 142
      public/web/sheet/sheet_common.js
  21. 22 18
      test/unit/reports/rpt_tpl_tree_test.js
  22. 7 1
      web/maintain/bills_lib/html/qingdan.html
  23. 19 2
      web/maintain/bills_lib/scripts/bills_lib_setting.js
  24. 28 38
      web/maintain/bills_lib/scripts/db_controller.js
  25. 81 8
      web/maintain/ration_repository/dinge.html
  26. 1 0
      web/maintain/ration_repository/fuzhu.html
  27. 1 0
      web/maintain/ration_repository/gongliao.html
  28. 120 25
      web/maintain/ration_repository/js/coe.js
  29. 172 191
      web/maintain/ration_repository/js/ration.js
  30. 97 18
      web/maintain/ration_repository/js/ration_assist.js
  31. 72 51
      web/maintain/ration_repository/js/ration_coe.js
  32. 115 110
      web/maintain/ration_repository/js/ration_glj.js
  33. 15 140
      web/maintain/ration_repository/js/repository_glj.js
  34. 472 62
      web/maintain/ration_repository/js/section_tree.js
  35. 202 0
      web/maintain/ration_repository/js/sheetsOpr.js
  36. 147 0
      web/maintain/report/js/cfg_const.js
  37. 34 0
      web/maintain/report/js/rpt_tpl_band.js
  38. 205 0
      web/maintain/report/js/rpt_tpl_data_map.js
  39. 94 1
      web/maintain/report/js/rpt_tpl_field_map.js
  40. 2 0
      web/maintain/report/js/rpt_tpl_helper.js
  41. 169 337
      web/maintain/report/js/rpt_tpl_main.js
  42. 30 15
      web/maintain/report/rpt_tpl_main.html
  43. 92 3
      web/maintain/std_glj_lib/html/gongliao.html
  44. 200 0
      web/maintain/std_glj_lib/js/components.js
  45. 196 171
      web/maintain/std_glj_lib/js/glj.js
  46. 92 12
      web/maintain/std_glj_lib/js/gljComponent.js
  47. 85 71
      web/maintain/std_glj_lib/js/main.js
  48. 178 0
      web/maintain/std_glj_lib/js/sheetsOpr.js
  49. 3 2
      web/users/js/col_setting.js
  50. 1 1
      web/users/js/template.js

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

@@ -44,6 +44,7 @@ let billsSchema = mongoose.Schema({
     name: String,
     unit: String,
     ruleText: String,
+    engineering: Number,   //工程专业,对应计算程序工程ID
     Expression: String,
     jobs: [],
     items: [],

+ 5 - 0
modules/ration_repository/controllers/coe_controller.js

@@ -27,6 +27,11 @@ class CoeListController extends BaseController{
             callback(req, res, err, 'Get coe', data);
         });
     }
+    getCoeItemsByNos(req,res){
+        coeList.getCoeItemsByNos(JSON.parse(req.body.data), function(err,data){
+            callback(req, res, err, 'Get coe', data);
+        });
+    }
 }
 
 export default CoeListController;

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

@@ -88,6 +88,14 @@ class RationController extends BaseController{
             callback(req, res, err, '', null);
         });
     }
+    updateAnnotation(req, res){
+        let repId = req.body.repId,
+            updateArr = JSON.parse(req.body.updateArr),
+            lastOpr = req.body.lastOpr;
+        rationItem.updateAnnotation(lastOpr, repId, updateArr, function (err) {
+            callback(req, res, err, '', null);
+        });
+    }
 }
 
 export default RationController;

+ 9 - 1
modules/ration_repository/controllers/ration_section_tree_controller.js

@@ -77,7 +77,15 @@ class RationChapterTreeController extends BaseController{
         rationChapterTreeData.updateSituation(lastOpr, repId, nodeId, situation, function (err) {
             callback(req, res, err, '', null);
         });
-
+    }
+    updateAnnoSituation(req, res){
+        let repId = req.body.repId,
+            nodeId = req.body.nodeId,
+            situation = req.body.situation,
+            lastOpr = req.body.lastOpr;
+        rationChapterTreeData.updateAnnoSituation(lastOpr, repId, nodeId, situation, function (err) {
+            callback(req, res, err, '', null);
+        });
     }
 }
 

+ 12 - 1
modules/ration_repository/models/coe.js

@@ -25,7 +25,18 @@ coeListDAO.prototype.getCoeItemsByIDs = function (data, callback) {
     coeListModel.find({
             "libID": data.libID,
             "ID": {"$in":data.coeIDs}
-        }, ["libID","ID","name","content","-_id"],
+        }, ["libID","ID","serialNo","name","content","-_id"],
+        function (err, doc) {
+            if (err) callback("批量获取系数明细错误!", null)
+            else callback(null, doc);
+        })
+};
+
+coeListDAO.prototype.getCoeItemsByNos = function (data, callback) {
+    coeListModel.find({
+            "libID": data.libID,
+            "serialNo": {"$in":data.coeNos}
+        }, ["libID","ID","serialNo","name","content","-_id"],
         function (err, doc) {
             if (err) callback("批量获取系数明细错误!", null)
             else callback(null, doc);

+ 22 - 0
modules/ration_repository/models/ration_item.js

@@ -403,5 +403,27 @@ rationItemDAO.prototype.updateJobContent = function (lastOpr, repId, updateArr,
     });
 }
 
+rationItemDAO.prototype.updateAnnotation = function (lastOpr, repId, updateArr, callback) {
+    rationRepositoryDao.updateOprArr({ID: repId}, lastOpr, moment(Date.now()).format('YYYY-MM-DD HH:mm:ss'), function (err) {
+        async.each(updateArr, function (obj, cb) {
+            rationItemModel.update({rationRepId: repId, code: obj.code}, {$set: {annotation: obj.annotation}}, function (err) {
+                if(err){
+                    cb(err);
+                }
+                else{
+                    cb(null);
+                }
+            })
+        }, function (err) {
+            if(err){
+                callback(err);
+            }
+            else{
+                callback(null);
+            }
+        });
+    });
+}
+
 module.exports = new rationItemDAO()
 

+ 12 - 0
modules/ration_repository/models/ration_section_tree.js

@@ -139,6 +139,18 @@ rationChapterTreeDAO.prototype.updateSituation = function (lastOpr, repId, nodeI
         }
     });
 };
+rationChapterTreeDAO.prototype.updateAnnoSituation = function (lastOpr, repId, nodeId, situation, callback) {
+    rationChapterTreeModel.update({rationRepId: repId, ID: nodeId}, {$set: {annotationSituation: situation}}, function (err, result) {
+        if(err){
+            callback(err);
+        }
+        else{
+            rationRepositoryDao.updateOprArr({ID: repId}, lastOpr, moment(Date.now()).format('YYYY-MM-DD HH:mm:ss'), function (err) {
+                callback(null);
+            });
+        }
+    });
+};
 
 rationChapterTreeDAO.prototype.updateNodes = function(repId, lastOpr, nodes,callback){
     var functions = [];

+ 4 - 1
modules/ration_repository/models/schemas.js

@@ -19,6 +19,7 @@ let coeSchema = new Schema({
 let coeListSchema = new Schema({
     libID: Number,                      // 所属定额定ID
     ID: Number,                         // 系数ID(流水号ID)
+    serialNo: Number,                  //编号
     name: String,                       // 名称
     content: String,                    // 说明
     coes: [coeSchema]
@@ -56,7 +57,8 @@ let rationChapterTreeSchema = new Schema({
     name: String,
     explanation: String,//说明
     ruleText: String,//计算规则
-    jobContentSituation: String,//工作内容适用情况,ALL适用本项全部定额,PARTIAL适用本项部分定额
+    jobContentSituation: String,//工作内容适用情况,ALL适用本项全部定额,PARTIAL适用本项部分定额,NONE无
+    annotationSituation: String,//附注的适用情况,ALL适用本项全部定额,PARTIAL适用本项部分定额,NONE无
     isDeleted: Boolean
 });
 
@@ -95,6 +97,7 @@ var rationItemSchema = new Schema({
     caption: String,
     feeType: Number,
     jobContent: String,
+    annotation: String,
     rationGljList: [rationGljItemSchema],
     rationCoeList: Array,
     rationAssList: [rationAssItemSchema],

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

@@ -42,6 +42,7 @@ module.exports =  function (app) {
     apiRouter.post("/updateExplanation",rationChapterTreeController.auth, rationChapterTreeController.init, rationChapterTreeController.updateExplanation);
     apiRouter.post("/updateRuleText",rationChapterTreeController.auth, rationChapterTreeController.init, rationChapterTreeController.updateRuleText);
     apiRouter.post("/updateSituation",rationChapterTreeController.auth, rationChapterTreeController.init, rationChapterTreeController.updateSituation);
+    apiRouter.post("/updateAnnoSituation",rationChapterTreeController.auth, rationChapterTreeController.init, rationChapterTreeController.updateAnnoSituation);
 
     apiRouter.post("/getRationItems",rationController.auth, rationController.init, rationController.getRationItemsBySection);
     apiRouter.post("/mixUpdateRationItems",rationController.auth, rationController.init, rationController.mixUpdateRationItems);
@@ -49,6 +50,7 @@ module.exports =  function (app) {
     apiRouter.post("/getRationGljIds",rationController.auth, rationController.init, rationController.getRationGljIds);
     apiRouter.post("/getRationsCodes",rationController.auth, rationController.init, rationController.getRationsCodes);
     apiRouter.post("/updateJobContent",rationController.auth, rationController.init, rationController.updateJobContent);
+    apiRouter.post("/updateAnnotation",rationController.auth, rationController.init, rationController.updateAnnotation);
 
     apiRouter.post("/createNewGljTypeNode",repositoryGljController.auth, repositoryGljController.init, repositoryGljController.createNewGljTypeNode);
     apiRouter.post("/updateGljNodes",repositoryGljController.auth, repositoryGljController.init, repositoryGljController.updateGljNodes);
@@ -63,6 +65,7 @@ module.exports =  function (app) {
     apiRouter.post("/getCoeList",coeListController.auth, coeListController.init, coeListController.getCoeList);
     apiRouter.post("/saveCoeList",coeListController.auth, coeListController.init, coeListController.saveCoeList);
     apiRouter.post("/getCoeItemsByIDs",coeListController.auth, coeListController.init, coeListController.getCoeItemsByIDs);
+    apiRouter.post("/getCoeItemsByNos",coeListController.auth, coeListController.init, coeListController.getCoeItemsByNos);
 
     apiRouter.post('/getRationItem',searchController.auth, searchController.init, searchController.getRationItem);
     apiRouter.post('/findRation', searchController.auth, searchController.init, searchController.findRation);

+ 83 - 30
modules/reports/controllers/rpt_tpl_controller.js

@@ -60,29 +60,29 @@ let mExport = {
             }
         });
     },
-    getRptTplTree_org: function(req, res) {
-        let params = JSON.parse(req.body.params),
-            grpType = params.grpType,
-            userId = params.userId,
-            tplType = params.tplType;
-        let filter = {"grpType": grpType, "$or": [{"isDeleted": null}, {"isDeleted": false} ]};
-        if (userId) {
-            filter.userId = userId;
-        }
-        if ((tplType && tplType !== rptTplDef.TplType.ALL)) {
-            filter.tplType = tplType;
-        }
-        TreeNodeModel.find(filter, '-_id', function(err, data){
-            if (err) {
-                callback(req,res, true,"", null);
-            } else {
-                callback(req,res,false,"", data);
-            }
-        });
-        // let obj = test_glj_type_util.getStdGljTypeCacheObj();
-        // console.log(obj.toArray());
-        // console.log(obj.getItemById(1));
-    },
+    // getRptTplTree_org: function(req, res) {
+    //     let params = JSON.parse(req.body.params),
+    //         grpType = params.grpType,
+    //         userId = params.userId,
+    //         tplType = params.tplType;
+    //     let filter = {"grpType": grpType, "$or": [{"isDeleted": null}, {"isDeleted": false} ]};
+    //     if (userId) {
+    //         filter.userId = userId;
+    //     }
+    //     if ((tplType && tplType !== rptTplDef.TplType.ALL)) {
+    //         filter.tplType = tplType;
+    //     }
+    //     TreeNodeModel.find(filter, '-_id', function(err, data){
+    //         if (err) {
+    //             callback(req,res, true,"", null);
+    //         } else {
+    //             callback(req,res,false,"", data);
+    //         }
+    //     });
+    //     // let obj = test_glj_type_util.getStdGljTypeCacheObj();
+    //     // console.log(obj.toArray());
+    //     // console.log(obj.getItemById(1));
+    // },
     updateTreeNodes: function(req, res) {
         let params = JSON.parse(req.body.params),
             nodes = params.nodes;
@@ -148,6 +148,41 @@ let mExport = {
             }
         })
     },
+    updateTopNodeName: function (req, res) {
+        let params = JSON.parse(req.body.params),
+            compilationId = params.compilationId, engineerId = params.engineerId, userId = params.userId,
+            nodeName = params.nodeName
+        ;
+        let filter = {"compilationId": compilationId, "engineerId": engineerId, "userId": userId, "$or": [{"isDeleted": null}, {"isDeleted": false}]};
+        let updateStatement = {"$set": {"name": nodeName}};
+        rttFacade.updateTreeInDetail(filter, updateStatement).then(function (rst) {
+            if (rst) {
+                //success
+                callback(req,res, false, "", rst);
+            } else {
+                //failed
+                callback(req,res, true, "更新失败!", null);
+            }
+        });
+    },
+    updateSubLevelOneNode: function (req, res) {
+        let params = JSON.parse(req.body.params),
+            compilationId = params.compilationId, engineerId = params.engineerId, userId = params.userId,
+            subNode = params.subNode
+        ;
+        let filter = {"compilationId": compilationId, "engineerId": engineerId, "userId": userId, "items.ID": subNode.ID, "$or": [{"isDeleted": null}, {"isDeleted": false}]};
+        let updateStatement = {$set: {"items.$": subNode}};
+        rttFacade.updateTreeInDetail(filter, updateStatement).then(function (rst) {
+            if (rst) {
+                //success
+                callback(req,res, false, "", rst);
+            } else {
+                //failed
+                callback(req,res, true, "更新失败!", null);
+            }
+        });
+    },
+
     removeTreeRootNode: function (req, res) {
         let params = JSON.parse(req.body.params),
             compilationId = params.compilationId,
@@ -201,29 +236,47 @@ let mExport = {
     //         });
     //     });
     // },
+    getNewNodeID: function(req, res) {
+        let params = JSON.parse(req.body.params),
+            scope = params.scope;
+        counter.counterDAO.getIDAfterCount(counter.moduleName.report, scope, function(err, result){
+            callback(req,res, false, "", result.value.sequence_value);
+        });
+    },
     createDftRptTpl: function(req, res) {
         let params = JSON.parse(req.body.params),
             treeNodeId = params.treeNodeId,
-            //grpChars = stringUtil.getPinYinFullChars(params.grpChars),
-            rptDftTplId = params.rptDftTplId;
+            rptDftTplId = params.rptDftTplId,
+            rptName = params.rptName,
+            grpKey = params.grpKey,
+            compilationId = params.compilationId,
+            engineerId = params.engineerId,
+            userId = params.userId,
+            subNode = params.subNode
+        ;
         let filter = {"ID": rptDftTplId};
         RptTplModel.findOne(filter, '-_id').exec().then(function(dftTplRst) {
             if (dftTplRst) {
                 let _doc = dftTplRst["_doc"];
                 _doc["ID"] = treeNodeId;
-                _doc["GROUP_KEY"] = "";
+                _doc["GROUP_KEY"] = grpKey;
                 _doc["ID_KEY"] = "";
+                _doc[JV.NODE_MAIN_INFO][JV.NODE_MAIN_INFO_RPT_NAME] = rptName;
                 let rptTpl = new RptTplModel(_doc);
                 rptTpl.save(function (err, actTplRst) {
                     if (err) {
                         callback(req,res, "报表模板创建错误", "", null);
                     } else {
                         //TreeNodeModel.update();
-                        TreeNodeModel.update({ID: treeNodeId}, {"refId": treeNodeId}, function(err, rst){
-                            if (err) {
-                                callback(req,res, "报表模板创建错误", "", null);
-                            } else {
+                        let filter = {"compilationId": compilationId, "engineerId": engineerId, "userId": userId, "items.ID": subNode.ID, "$or": [{"isDeleted": null}, {"isDeleted": false}]};
+                        let updateStatement = {$set: {"items.$": subNode}};
+                        rttFacade.updateTreeInDetail(filter, updateStatement).then(function (rst) {
+                            if (rst) {
+                                //success
                                 callback(req,res, false, "", actTplRst);
+                            } else {
+                                //failed
+                                callback(req,res, true, "更新失败!", null);
                             }
                         });
                     }

+ 11 - 6
modules/reports/facade/rpt_tpl_tree_node_facade.js

@@ -33,6 +33,10 @@ async function updateTree(compilationId, engineerId, userId, doc) {
     return await rpt_tpl_tree_mdl.update(filter, doc);
 }
 
+async function updateTreeInDetail(filter, updateStatement) {
+    return await rpt_tpl_tree_mdl.update(filter, updateStatement);
+}
+
 async function removeTree(compilationId, engineerId, userId, cb) {
     let filter = {"compilationId": compilationId, "engineerId": engineerId, "userId": userId, "$or": [{"isDeleted": null}, {"isDeleted": false}]};
     return await rpt_tpl_tree_mdl.findAndModify(filter, [], { $set: { "isDeleted": true } }, {'new':true}, cb);
@@ -66,12 +70,13 @@ async function findTplTreeByOid(objectId) {
 
 
 let expObj = {
-    createNewTree:  createNewTree,
-    updateTree:     updateTree,
-    removeTree:     removeTree,
-    removeTreePhycically: removeTreePhycically,
-    findTplTree:    findTplTree,
-    findTplTreeByOid: findTplTreeByOid
+    createNewTree:          createNewTree,
+    updateTree:             updateTree,
+    updateTreeInDetail:     updateTreeInDetail,
+    removeTree:             removeTree,
+    removeTreePhycically:   removeTreePhycically,
+    findTplTree:            findTplTree,
+    findTplTreeByOid:       findTplTreeByOid
 };
 
 export {expObj as default};

+ 1 - 0
modules/reports/models/tpl_tree_node.js

@@ -20,6 +20,7 @@ let TreeNodeSchema = new Schema({
 
 let TplNodeSchema = new Schema({
     nodeType: Number,   //节点类型:树节点(枝) 或 模板节点(叶)
+    ID: Number,         //template节点ID,只有在nodeType是模板节点有效
     refId: Number,      //引用报表模板id (引用 collection: rpt_templates)
     name: String,       //显示名称
     items: []           //子节点

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

@@ -17,8 +17,11 @@ module.exports = function (app) {
 
     rptTplRouter.post('/createTreeRootNode', reportTplController.createTreeRootNode);
     rptTplRouter.post('/updateTreeRootNode', reportTplController.updateTreeRootNode);
+    rptTplRouter.post('/updateTopNodeName', reportTplController.updateTopNodeName);
+    rptTplRouter.post('/updateSubLevelOneNode', reportTplController.updateSubLevelOneNode);
     rptTplRouter.post('/removeTreeRootNode', reportTplController.removeTreeRootNode);
     rptTplRouter.post('/getRptTplTree', reportTplController.getRptTplTree);
+    rptTplRouter.post('/getNewNodeID', reportTplController.getNewNodeID);
     rptTplRouter.post('/updateRptTplNodes', reportTplController.updateTreeNodes);
     rptTplRouter.post('/deleteRptTplNodes', reportTplController.deleteRptTplNodes);
     rptTplRouter.post('/createDftRptTpl', reportTplController.createDftRptTpl);

+ 9 - 7
modules/reports/rpt_component/jpc_flow_tab.js

@@ -148,14 +148,15 @@ JpcFlowTabSrv.prototype.createNew = function(){
             let actH = JpcFlowTabHelper.getActualContentAreaHeight(bands, rptTpl, me.segments, page);
             let offsetY = actH - (flowContentBand.Bottom - flowContentBand.Top);
             JpcBandHelper.resetBandPos(rptTpl[JV.NODE_BAND_COLLECTION], bands, flowContentBand, 0, offsetY);
-
+            // 2.1 Content-Tab
             tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls, 0, $CURRENT_RPT));
             // 2.2 Column tab
             tabRstLst.push(me.outputColumn(rptTpl, dataObj, page, segIdx, bands, unitFactor, controls, 0));
             // 2.3 Sum Seg
             tabRstLst.push(me.outputSegSum(rptTpl, dataObj, page, segIdx, bands, unitFactor, controls));
             // 2.4 Sum Page
-            // 2.5 Discrete
+            // 2.5 Group
+            // 2.6 Discrete
             tabRstLst.push(JpcDiscreteHelper.outputDiscreteInfo(rptTpl[FLOW_NODE_STR][JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, 1, 0, $CURRENT_RPT));
             //3. reset merge band position
             if (bands[JV.BAND_PROP_MERGE_BAND] && adHocMergePos) {
@@ -180,14 +181,15 @@ JpcFlowTabSrv.prototype.createNew = function(){
             //2. start to output detail-part
             for (let pi = 0; pi < me.multiCols; pi++) {
                 let actualPage = (page - 1) * me.multiCols + pi + 1;
-                //2.1 Content-Tab
+                // 2.1 Content-Tab
                 tabRstLst.push(me.outputContent(rptTpl, dataObj, actualPage, bands, unitFactor, controls, pi, $CURRENT_RPT));
-                //2.2 Column tab
+                // 2.2 Column tab
                 tabRstLst.push(me.outputColumn(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, controls, pi));
-                //2.3 Sum Seg
+                // 2.3 Sum Seg
                 tabRstLst.push(me.outputSegSum(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, controls));
-                //2.4 Sum Page
-                //2.5 Discrete
+                // 2.4 Sum Page
+                // 2.5 Group
+                // 2.6 Discrete
                 if (pi === 0) {
                     tabRstLst.push(JpcDiscreteHelper.outputDiscreteInfo(rptTpl[FLOW_NODE_STR][JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[actualPage - 1], segIdx, 1, pi, $CURRENT_RPT));
                 }

+ 4 - 2
modules/reports/rpt_component/jpc_function.js

@@ -6,8 +6,10 @@ let JpcFunc = {
         if (rptTpl[JV.NODE_FORMULAS]) {
             for (let i = 0; i < rptTpl[JV.NODE_FORMULAS].length; i++) {
                 let item = {};
-                item[JV.PROP_RUN_TYPE] = rptTpl[JV.NODE_FORMULAS][i][JV.PROP_RUN_TYPE];
-                item[JV.PROP_EXPRESSION] = rptTpl[JV.NODE_FORMULAS][i][JV.PROP_EXPRESSION];
+                let propArr = Object.getOwnPropertyNames(rptTpl[JV.NODE_FORMULAS][i]);
+                for (let key of propArr) {
+                    item[key] = rptTpl[JV.NODE_FORMULAS][i][key];
+                }
                 rst.push(item);
             }
         }

+ 10 - 0
modules/reports/rpt_component/jpc_rte.js

@@ -45,6 +45,16 @@ let JE = {
             rst = $CURRENT_RPT.totalPages;
         }
         return rst;
+    },
+    setFieldValue: function (field, newValue, dataObj, valIdx) {
+        if (!(field.DataNodeName)) {
+            //that means this is a self-defined discrete field!
+            field.DataNodeName = JV.DATA_DISCRETE_DATA;
+            let len = dataObj[JV.DATA_DISCRETE_DATA];
+            field.DataSeq = len;
+            dataObj[JV.DATA_DISCRETE_DATA].push([]);
+        }
+        dataObj[field.DataNodeName][field.DataSeq][valIdx] = newValue;
     }
 }
 

+ 1 - 0
modules/std_glj_lib/models/schemas.js

@@ -56,6 +56,7 @@ let gljSchema = new Schema({
     gljClass: Number,
     gljType: Number,
     shortName: String,
+    adjCoe: Number, //调整系数
     component: [gjlComponentSchema]
 },{versionKey: false});
 

+ 2 - 2
operation.js

@@ -43,8 +43,8 @@ app.set('view options', {
 app.use(partials());
 
 let bodyParser = require('body-parser');
-app.use(bodyParser.urlencoded({extended: true}));
-app.use(bodyParser.json());
+app.use(bodyParser.urlencoded({limit: '3mb', extended: true}));
+app.use(bodyParser.json({limit: '3mb'}));
 
 app.use(session({
     name: 'usersSession',

+ 10 - 0
public/web/rpt_value_define.js

@@ -31,12 +31,20 @@ const JV = {
     NODE_FLOW_COLUMN : "流水式表_列",
     NODE_FLOW_CONTENT : "流水式表_数据",
     PROP_MULTI_COLUMN: "多列显示数量",
+    PROP_FLOW_EX_DISPLAY_MODE: "流水拓展显示模式",
+    DISPLAY_MODE_INDEPENDENT: "单独模式",
+    DISPLAY_MODE_FOLLOW: "紧随模式",
+
 
     NODE_MAIN_INFO: "主信息",
     NODE_MAIN_INFO_RPT_NAME: "报表名称",
     NODE_PAGE_INFO: "打印页面_信息",
     NODE_PAGE_SIZE: "纸张宽高",
     NODE_MARGINS: "页边距",
+    NODE_RPT_BIZ_TYPE: "报表业务类型",
+    NODE_BIZ_TYPE_AUDI: "审核类型",
+    NODE_BIZ_TYPE_SUM: "汇总类型",
+    NODE_BIZ_TYPE_DETAIL: "明细类型",
 
     NODE_FONT_COLLECTION: "font_collection",
     NODE_STYLE_COLLECTION: "style_collection",
@@ -49,6 +57,7 @@ const JV = {
     PROP_BAND_NAME: "BandName",
     PROP_BAND_NORMAL_ONLY: "normalOnly",
     PROP_BAND_EX_ONLY: "exOnly",
+    PROP_BAND_EX_JOIN_AFTER: "isJoinAfter",
 
     PROP_UNITS: "单位",
     PROP_PAGE_SIZE: "页规格",
@@ -79,6 +88,7 @@ const JV = {
     PROP_SUM_FIELDS: "sum_field_s",
     PROP_TEXTS: "text_s",
     PROP_TEXT: "text",
+    PROP_PARAMS: "param_s",
     PROP_FIELD_ID: "FieldID",
     PROP_PARAM_ID: "ParamID",
     PROP_PREFIX: "Prefix",

+ 72 - 142
public/web/sheet/sheet_common.js

@@ -111,21 +111,13 @@ var sheetCommonObj = {
             area.vAlign(GC.Spread.Sheets.VerticalAlign.center);
         }
     },
-    showData: function(sheet, setting, data, distTypeTree) {
+    showData: function(sheet, setting, data) {
         var me = this, ch = GC.Spread.Sheets.SheetArea.viewport;
         sheet.suspendPaint();
         sheet.suspendEvent();
-        if(typeof setting.owner !== 'undefined' && setting.owner === 'gljComponent'){
-            sheet.setRowCount(data.length + 5);
-        }
-        else{
-            sheet.setRowCount(typeof repositoryGljObj !== 'undefined' && repositoryGljObj.currentOprParent === 1 ? data.length : data.length + 10);
-        }
-        if(data.length === 0){
-            for(let i = 0; i < sheet.getRowCount(); i++){
-                sheet.getCell(i, 4, GC.Spread.Sheets.SheetArea.viewport).locked(false);
-            }
-        }
+        //sheet.addRows(row, 1);
+
+        sheet.clear(0, 0, sheet.getRowCount(), sheet.getColumnCount(), GC.Spread.Sheets.SheetArea.viewport, GC.Spread.Sheets.StorageType.data);
         for (var col = 0; col < setting.header.length; col++) {
             var hAlign = "left", vAlign = "center";
             if (setting.header[col].hAlign) {
@@ -141,30 +133,30 @@ var sheetCommonObj = {
                 //sheet.setStyle(row,col,style,GC.Spread.Sheets.SheetArea.viewport);
                 sheet.setFormatter(-1, col, setting.header[col].formatter, GC.Spread.Sheets.SheetArea.viewport);
             }
+            if(setting.header[col].cellType === "checkBox"||setting.header[col].cellType === "button"){//clear and reset
+                var me = this, header = GC.Spread.Sheets.SheetArea.colHeader;
+                sheet.deleteColumns(col,1);
+                sheet.addColumns(col, 1);
+                sheet.setValue(0, col, setting.header[col].headerName, header);
+                sheet.setColumnWidth(col, setting.header[col].headerWidth?setting.header[col].headerWidth:100);
+            }
             for (var row = 0; row < data.length; row++) {
                 //var cell = sheet.getCell(row, col, GC.Spread.Sheets.SheetArea.viewport);
-                if(setting.header[col].dataCode === 'gljType' && data[row].gljType){
-                    if(typeof repositoryGljObj !== 'undefined' && typeof repositoryGljObj.allowComponent !== 'undefined' && repositoryGljObj.allowComponent.indexOf(data[row].gljType) !== -1){
-                        sheet.getCell(row, 4, GC.Spread.Sheets.SheetArea.viewport).locked(true);
-                    }
-                    else if(typeof repositoryGljObj !== 'undefined' && typeof repositoryGljObj.allowComponent !== 'undefined' && repositoryGljObj.allowComponent.indexOf(data[row].gljType) === -1){
-                        sheet.getCell(row, 4, GC.Spread.Sheets.SheetArea.viewport).locked(false);
+                var val = data[row][setting.header[col].dataCode];
+                if(val&&setting.header[col].dataType === "Number"){
+                    if(setting.header[col].hasOwnProperty('tofix')){
+                        val =parseFloat(val).toFixed(setting.header[col].tofix);
+                    }else {
+                        val =parseFloat(val).toFixed(2);
                     }
-                    let distTypeVal =  distTypeTree.distTypes[distTypeTree.prefix + data[row].gljType].data.fullName;
-                    sheet.setValue(row, col, distTypeVal, ch);
                 }
-                else {
-                    sheet.setValue(row, col, data[row][setting.header[col].dataCode], ch);
-                    sheet.setTag(row, 0, data[row].ID, ch);
-                    if(typeof setting.owner !== 'undefined' && setting.owner !== 'gljComponent'){
-                        sheet.getCell(row, 0, GC.Spread.Sheets.SheetArea.viewport).locked(true);
-                    }
+                if(val!=null&&setting.header[col].cellType === "checkBox"){
+                    this.setCheckBoxCell(row,col,sheet,val)
                 }
-            }
-            for(let i = data.length; i < sheet.getRowCount(); i++){
-                sheet.getCell(i, 4, GC.Spread.Sheets.SheetArea.viewport).locked(false);
+                sheet.setValue(row, col, val, ch);
             }
         }
+        this.lockCells(sheet,setting);
         sheet.resumeEvent();
         sheet.resumePaint();
         //me.shieldAllCells(sheet);
@@ -195,67 +187,7 @@ var sheetCommonObj = {
         }
         return rst;
     },
-    combineRowData: function(sheet, setting, row, repositoryGljObj) {
-        let me = this;
-        var rst = {};
-        let comboBoxCellType = sheet.getCellType(row, 5);
-        let items = comboBoxCellType.items();
-        for (var col = 0; col < setting.header.length; col++) {
-            if(setting.header[col].dataCode === 'gljType'){
-                items.forEach(function(item){
-                    if(sheet.getValue(row, col) === item.text){
-                        rst[setting.header[col].dataCode] = item.value;
-                        if(repositoryGljObj){
-                            rst.shortName = repositoryGljObj.distTypeTree.distTypes[repositoryGljObj.distTypeTree.prefix + item.value].data.shortName;
-                        }
-                    }
-                });
-            }
-           else if (setting.header[col].dataCode === 'code'){
-                if(repositoryGljObj){
-                    let gljList = repositoryGljObj.gljList,
-                        orgCode = repositoryGljObj.orgCode,
-                        isExist = false;
-                        for(let i=0; i< gljList.length; i++){
-                            if(gljList[i].code === sheet.getValue(row, col) && sheet.getValue(row, col)!== orgCode){
-                                me.lockAllCells(sheet);
-                                $('#alertText').text("输入的编号已存在,请重新输入!");
-                                $('#codeAlertBtn').click();
-                                $('#codAleConfBtn').click(function () {
-                                   // me.reLockSomeCodes(sheet, 0, repositoryGljObj.currentCache.length);
-                                    me.unLockAllCells(sheet);
-                                    me.reLockSomeCodes(sheet, 0, repositoryGljObj.currentCache.length);
-                                    sheet.setValue(row, 0, orgCode);
-                                    sheet.getCell(row, 0).formatter("@");
-                                    sheet.setActiveCell(row, 0);
-                                });
-                                $('#codAleClose').click(function () {
-                                    //me.reLockSomeCodes(sheet, 0, repositoryGljObj.currentCache.length);
-                                    me.unLockAllCells(sheet);
-                                    me.reLockSomeCodes(sheet, 0, repositoryGljObj.currentCache.length);
-                                    sheet.setValue(row, 0, orgCode);
-                                    sheet.getCell(row, 0).formatter("@");
-                                    sheet.setActiveCell(row, 0);
-                                });
-                                // sheet.setValue(row, col, orgCode);
-                                isExist = true
-                            }
-                        }
-                    if(!isExist){
-                        rst[setting.header[col].dataCode] = sheet.getValue(row, col);
-                    }
-                }
-                else{
-                    rst[setting.header[col].dataCode] = sheet.getValue(row, col);
-                }
-            }
-            else{
-                rst[setting.header[col].dataCode] = sheet.getValue(row, col);
-            }
-        }
-        return rst;
-    },
-    combineRationRowData: function(sheet, setting, row) {
+    combineRowData: function(sheet, setting, row) {
         var rst = {};
         for (var col = 0; col < setting.header.length; col++) {
             rst[setting.header[col].dataCode] = sheet.getValue(row, col);
@@ -268,26 +200,6 @@ var sheetCommonObj = {
     unShieldAllCells: function(sheet) {
         sheet.options.isProtected = false;
     },
-    reLockSomeCodes: function (sheet, beginRow, endRow) {
-        sheet.suspendPaint();
-        sheet.suspendEvent();
-        let defaultStyle = new GC.Spread.Sheets.Style();
-        defaultStyle.locked = false;
-        sheet.setDefaultStyle(defaultStyle, GC.Spread.Sheets.SheetArea.viewport);
-        let unLockStyle = new GC.Spread.Sheets.Style();
-        unLockStyle.locked = false;
-        let lockStyle = new GC.Spread.Sheets.Style();
-        lockStyle.locked = true;
-        for(let row = beginRow; row < endRow; row++){
-            sheet.setStyle(row, 0, lockStyle);
-        }
-        for(let row = endRow; row < sheet.getRowCount(); row++){
-            sheet.setStyle(row, 0, unLockStyle);
-        }
-        sheet.options.isProtected = true;
-        sheet.resumePaint();
-        sheet.resumeEvent();
-    },
     unLockAllCells: function (sheet) {
         sheet.suspendPaint();
         sheet.suspendEvent();
@@ -312,38 +224,6 @@ var sheetCommonObj = {
         sheet.resumePaint();
         sheet.resumeEvent();
     },
-    lockSomeCodes: function (sheet, beginRow, endRow) {
-        let defaultStyle = new GC.Spread.Sheets.Style();
-        defaultStyle.locked = false;
-        sheet.setDefaultStyle(defaultStyle, GC.Spread.Sheets.SheetArea.viewport);
-        let style = new  GC.Spread.Sheets.Style();
-        style.locked = true;
-        sheet.suspendPaint();
-        sheet.suspendEvent();
-        for(let i = beginRow; i < endRow; i++){
-            sheet.setStyle(i, 0, style);
-        }
-        sheet.options.isProtected = true;
-        sheet.resumePaint();
-        sheet.resumeEvent();
-    },
-    lockCodeCells: function (sheet, rowCount) {
-        sheet.suspendPaint();
-        sheet.suspendEvent();
-        let sheetRowCount = sheet.getRowCount();
-        let defaultStyle = new GC.Spread.Sheets.Style();
-        defaultStyle.locked = false;
-        sheet.setDefaultStyle(defaultStyle, GC.Spread.Sheets.SheetArea.viewport);
-        let style = new GC.Spread.Sheets.Style();
-        style.locked = true;
-        sheet.setStyle(-1, 0, style);
-        for(let i =rowCount; i<sheetRowCount; i++){
-            sheet.setStyle(i, -1, style);
-        }
-        sheet.options.isProtected = true;
-        sheet.resumePaint();
-        sheet.resumeEvent();
-    },
     lockCells: function(sheet, setting){
         sheet.suspendPaint();
         sheet.suspendEvent();
@@ -377,5 +257,55 @@ var sheetCommonObj = {
             }
         }
         return rst;
+    },
+    //add by zhong 2017-10-10
+    //动态下拉框
+    getDynamicCombo: function () {
+        let ComboCellForActiveCell = function () { };
+        ComboCellForActiveCell.prototype = new GC.Spread.Sheets.CellTypes.ComboBox();
+        ComboCellForActiveCell.prototype.paintValue = function (ctx, value, x, y, w, h, style, options) {
+            let sheet = options.sheet;
+            if (options.row === sheet.getActiveRowIndex() && options.col === sheet.getActiveColumnIndex()) {
+                GC.Spread.Sheets.CellTypes.ComboBox.prototype.paintValue.apply(this, arguments);
+
+            } else {
+                GC.Spread.Sheets.CellTypes.Base.prototype.paintValue.apply(this, arguments);
+            }
+        };
+        ComboCellForActiveCell.prototype.getHitInfo = function (x, y, cellStyle, cellRect, options) {
+            let sheet = options.sheet;
+            if (options.row === sheet.getActiveRowIndex() && options.col === sheet.getActiveColumnIndex()) {
+                return GC.Spread.Sheets.CellTypes.ComboBox.prototype.getHitInfo.apply(this, arguments);
+
+            } else {
+                return GC.Spread.Sheets.CellTypes.Base.prototype.getHitInfo.apply(this, arguments);
+            }
+        };
+        return new ComboCellForActiveCell();
+    },
+    setDynamicCombo: function (sheet, beginRow, col, rowCount, items, itemsHeight, itemsType) {
+        let me = this;
+        sheet.suspendPaint();
+        let combo = me.getDynamicCombo();
+        for(let i = 0, len = rowCount; i < len; i++){
+            if(itemsHeight) combo.itemHeight(itemsHeight);
+            if(itemsType === 'value') combo.items(items).editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value);
+            else if(itemsType === 'text') combo.items(items).editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.text);
+            else combo.items(items);
+            sheet.getCell(beginRow + i, col).cellType(combo);
+        }
+        sheet.resumePaint();
+    },
+    setStaticCombo: function (sheet, beginRow, col, rowCount, items, itemsHeight, itemsType) {
+        sheet.suspendPaint();
+        let combo = new GC.Spread.Sheets.CellTypes.ComboBox();
+        for(let i = 0, len = rowCount; i < len; i++){
+            if(itemsHeight) combo.itemHeight(itemsHeight);
+            if(itemsType === 'value') combo.items(items).editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value);
+            else if(itemsType === 'text') combo.items(items).editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.text);
+            else combo.items(items);
+            sheet.getCell(beginRow + i, col).cellType(combo);
+        }
+        sheet.resumePaint();
     }
 }

+ 22 - 18
test/unit/reports/rpt_tpl_tree_test.js

@@ -7,31 +7,35 @@ let config = require("../../../config/config.js");
 //config.setupDb(process.env.NODE_ENV);
 config.setupDb('qa');
 import dbm from "../../../config/db/db_manager";
-import mdl from "../../../modules/reports/models/tpl_tree_node";
+//import mdl from "../../../modules/reports/models/tpl_tree_node";
 import rttFacade from "../../../modules/reports/facade/rpt_tpl_tree_node_facade";
+import counter from "../../../public/counter/counter";
 
 dbm.connect();
 
 /*
 test('测试 - 创建dummy报表树: ', function (t) {
-    let tprTplTree = {};
-    tprTplTree.compilationId = "598d239605cdd825682925d1";
-    tprTplTree.engineerId = 1;
-    tprTplTree.userId = -100;
-    tprTplTree.properties = [{"isZhaoBiao": false}, {"isBills": true}];
-    tprTplTree.name = "重庆市建筑工程";
-    tprTplTree.released = true;
-    tprTplTree.isDeleted = false;
-    tprTplTree.items = [];
+    counter.counterDAO.getIDAfterCount(counter.moduleName.report, 2, function(err, result){
+        //result.value.sequence_value
+        let tprTplTree = {};
+        tprTplTree.compilationId = "598d239605cdd825682925d1";
+        tprTplTree.engineerId = 1;
+        tprTplTree.userId = -100;
+        tprTplTree.properties = [{"isZhaoBiao": false}, {"isBills": true}];
+        tprTplTree.name = "重庆市建筑工程";
+        tprTplTree.released = true;
+        tprTplTree.isDeleted = false;
+        tprTplTree.items = [];
 
-    tprTplTree.items.push( {nodeType: 2, refId: -1, name: "【封-1】招标工程量清单", items: null} );
-    tprTplTree.items.push( {nodeType: 2, refId: -1, name: "【表-09】分部分项工程/施工技术措施项目清单计价表", items: null} );
+        tprTplTree.items.push( {nodeType: 2, ID: result.value.sequence_value - 1, refId: -1, name: "【封-1】招标工程量清单", items: null} );
+        tprTplTree.items.push( {nodeType: 2, ID: result.value.sequence_value, refId: -1, name: "【表-09】分部分项工程/施工技术措施项目清单计价表", items: null} );
 
-    let results = rttFacade.createNewTree(tprTplTree);
-    results.then(function(rst) {
-        console.log(rst);
-        t.pass('just pass!');
-        t.end();
+        let results = rttFacade.createNewTree(tprTplTree);
+        results.then(function(rst) {
+            console.log(rst);
+            t.pass('just pass!');
+            t.end();
+        });
     });
 });
  //*/
@@ -60,7 +64,7 @@ test('测试 - 创建dummy报表树2: ', function (t) {
 });
 //*/
 
-//*
+/*
 test('测试 - 更新 dummy报表树2: ', function (t) {
     let tprTplTree = {};
     tprTplTree.compilationId = "598d239605cdd825682925d1";

+ 7 - 1
web/maintain/bills_lib/html/qingdan.html

@@ -351,6 +351,7 @@
         billsTree.loadDatas(datas);
         let controller = TREE_SHEET_CONTROLLER.createNew(billsTree.tree, billsSpread.getActiveSheet(), setting);
         controller.showTreeData();
+        sheetBillsDatas = tools.getsheetDatas(controller.sheet, 'bills', controller);
         setSheet.formatter(billsSpread.getActiveSheet());
         //setTagId
         setTagID(controller, setting);
@@ -581,6 +582,9 @@
             if(recharge){
                 $('#exampleTextarea').val(recharge);
             }
+            else{
+                $('#exampleTextarea').val('');
+            }
         }
     }
 
@@ -628,6 +632,7 @@
             let maxRow = orgRow + rowCount - 1, maxCol = orgCol + colCount -1;
             let markRow = orgRow, colLen = sheet.getColumnCount(GC.Spread.Sheets.SheetArea.viewport);
             let validDatas = tools.getValidDatas(sheet, setting, args);
+            sheet.suspendPaint();
             for(let i =orgRow, j=0; i<= maxRow; i++, j++){
                 let id = sheet.getTag(i, 0);
                 if(id && j< validDatas.length){
@@ -653,11 +658,13 @@
                     sheet.setValue(i, 1, sheetBillsDatas.datasIdx['rowIdx'+ i].name);
                     sheet.setValue(i, 2, sheetBillsDatas.datasIdx['rowIdx'+ i].unit);
                     sheet.setValue(i, 3, sheetBillsDatas.datasIdx['rowIdx'+ i].ruleText);
+                    sheet.setValue(i, 4, sheetBillsDatas.datasIdx['rowIdx'+ i].engineering);
                 }
                 else {
                     sheet.clear(i, 0, 1, sheet.getColumnCount(), GC.Spread.Sheets.SheetArea.viewport,GC.Spread.Sheets.StorageType.data);
                 }
             }
+            sheet.resumePaint();
             billsAjax.pasteBills(userAccount, billsLibId, validDatas);
             setSheet.setMaxRowCount(sheet, sheetBillsDatas);
         });
@@ -765,7 +772,6 @@
                     });
                     if(flag){
                         serialNoUn ++;
-                        console.log(serialNoUn);
                         uncrossedDatas.push({data: uniqPasteArr[j], serialNo: serialNoUn});
                     }
                     else {

+ 19 - 2
web/maintain/bills_lib/scripts/bills_lib_setting.js

@@ -35,7 +35,7 @@ var billsLibSetting = {
                 hAlign: 0,
                 font: 'Arial'
             },
-            width: 300
+            width: 240
         },
         {
             head: {
@@ -52,7 +52,7 @@ var billsLibSetting = {
                 hAlign: 0,
                 font: 'Arial'
             },
-            width: 160
+            width: 140
         },
         {
             head: {
@@ -70,6 +70,23 @@ var billsLibSetting = {
                 font: 'Arial'
             },
             width: 420
+        },
+        {
+            head: {
+                titleNames: ['工程专业'],
+                spanCols: [1],
+                spanRows: [2],
+                vAlign: [1, 1],
+                hAlign: [1, 1],
+                font: ' Arial'
+            },
+            data: {
+                field: 'engineering',
+                vAlign: 1,
+                hAlign: 1,
+                font: 'Arial'
+            },
+            width: 80
         }
     ],
     headRows: 1,

+ 28 - 38
web/maintain/bills_lib/scripts/db_controller.js

@@ -2,6 +2,7 @@
  * Created by vian on 2017/4/12.
  */
 var dbController = {
+    currentEditData: null,
     insert: function(controller, btn){
         tools.btnClose(btn);
         btn.attr('doing', 'true');
@@ -274,19 +275,24 @@ var dbController = {
     },
 
     editData: function(controller){
+        controller.sheet.bind(GC.Spread.Sheets.Events.EditStarting, function (sender, args) {
+            dbController.currentEditData = args.sheet.getValue(args.row, args.col);
+        });
         controller.sheet.bind(GC.Spread.Sheets.Events.EditEnded, function(sender, args){
             var node = controller.tree.selected, updateId, field;
             if(node){
                 updateId = node.getID();
-                billsLibSetting.cols.forEach(function(col, idx){
-                    if(args.col === idx){
-                        field = col.data.field;
-                        node.data[field] = args.editingText;
-                        sheetBillsDatas.datasIdx['rowIdx'+ args.row][field] = args.editingText;
+                field = billsLibSetting.cols[args.col].data.field;
+                if(field === 'engineering'){
+                    if(isNaN(args.editingText) || args.editingText % 1 !== 0){
+                        args.sheet.setValue(args.row, args.col, dbController.currentEditData ? dbController.currentEditData : '');
+                        alert('工程专业只能输入整数!');
+                        return;
                     }
-                });
+                }
+                node.data[field] = args.editingText;
+                sheetBillsDatas.datasIdx['rowIdx'+ args.row][field] = args.editingText;
                 billsAjax.updateBills(userAccount, billsLibId, updateId, field, args.editingText);
-                //sheetBillsDatas = tools.getsheetDatas(controller.sheet, 'bills', controller);
             }
             else {
                 args.sheet.getCell(args.row, args.col, GC.Spread.Sheets.SheetArea.viewport).value('');
@@ -569,7 +575,6 @@ var tools = {
 
     getValidDatas: function(sheet, setting, args){
         let validDatas = [];
-        const colLen = 4;
         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;
         for(let i =orgRow; i<=maxRow; i++){
@@ -577,45 +582,30 @@ var tools = {
             for(let j= orgCol; j<=maxCol; j++){
                 let value = sheet.getValue(i, j);
                 if(value){
-                    setting.cols.forEach(function(col, colIdx){
+                  /*  setting.cols.forEach(function(col, colIdx){
                         if(colIdx === j){
                             validData[col.data.field] = value;
                         }
-                    });
+                    });*/
+                    if(setting.cols[j].data.field === 'engineering'){
+                        if(!isNaN(value) && value % 1 === 0){
+                            validData[setting.cols[j].data.field] = value;
+                        }
+                    }
+                    else {
+                        validData[setting.cols[j].data.field] = value;
+                    }
                 }
             }
             if(!tools.isEmptyObj(validData)){
                 validDatas.push(validData);
             }
         }
-
-
-
-        //---------------------------------------
-        /*for(let i=orgRow; i<= maxRow; i++){
-            if(tools.getValidRow(sheet, i)){
-                console.log(`validRow: ${i}`);
-                let validData = {code: '', name: '', unit: '', ruleText: ''};
-                for(var j=orgCol; j<=maxCol; j++){
-                    let field;
-                    setting.cols.forEach(function(col, colIdx){
-                        if(colIdx === j){
-                            field = col.data.field;
-                            if(sheet.getValue(i, j)){
-                                validData[field] = sheet.getValue(i, j);
-                            }
-                        }
-                    });
-                    //validData[field] = sheet.getValue(i, j);
-                }
-                validDatas.push(validData);
-            }
-        }*/
         return validDatas;
     },
 
     getValidRow: function(sheet, rowIdx){
-        const colCount = 4;
+        const colCount = 5;
         let isValid = false;
         for(let i=0; i< colCount; i++){
             if(sheet.getValue(rowIdx, i, GC.Spread.Sheets.SheetArea.viewport)){
@@ -1659,7 +1649,7 @@ var jobsController = {
                     field = col.data.field;
                 }
             });
-            if (controller.tree.selected && newData !== me.currentEditData) {
+            if (controller.tree.selected && newData != me.currentEditData) {
                 var isExist = tools.isExist(totalJobs.jobsArr, field, newData);
                 var isRepeat = tools.isRepeat(controller.tree.selected.jobs, field ,newData, 'reference', 'job');
                 //create
@@ -1874,7 +1864,7 @@ var itemsController = {
                     field = col.data.field;
                 }
             });
-            if (controller.tree.selected && newData !== me.currentEditData) {
+            if (controller.tree.selected && newData != me.currentEditData) {
                 var isExist = tools.isExist(totalItems.itemsArr, field, newData);
                 var isRepeat = tools.isRepeat(controller.tree.selected.items, field ,newData, 'reference', 'item');
                 //create
@@ -2194,7 +2184,7 @@ var totalJobsController = {
                     field = col.data.field;
                 }
             });
-            if(newData !== me.currentEditData){
+            if(newData != me.currentEditData){
                 isRepeat = tools.isRepeat(totalJobs.jobsArr, field, newData, 'reference', null);
                 if(!tagId && !isRepeat && newData){//create
                     totalJobsController.createJob(sheet, totalJobs, field, newData, args);
@@ -2282,7 +2272,7 @@ var totalItemsController = {
                     field = col.data.field;
                 }
             });
-            if(newData !== me.currentEditData){
+            if(newData != me.currentEditData){
                 isRepeat = tools.isRepeat(totalItems.itemsArr, field, newData, 'reference', null);
                 if(!tagId && !isRepeat && newData){//create
                     totalItemsController.createItem(sheet, totalItems, field, newData, args);

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

@@ -69,6 +69,9 @@
                           <li class="nav-item">
                               <a class="nav-link" data-toggle="tab" href="#tgz" role="tab">工作内容</a>
                           </li>
+                          <li class="nav-item">
+                              <a class="nav-link" data-toggle="tab" href="#tfz" role="tab">附注</a>
+                          </li>
                       </ul>
                       <div class="tab-content">
                           <!--定额-->
@@ -132,9 +135,23 @@
                                       </tr>
                                   </table>
                                   <table class="table table-sm table-bordered m-0" id="tablePartial">
-                              </table>
+                                  </table>
+                              </div>
+                          </div>
+                          <!--附注-->
+                          <div class="tab-pane" id="tfz" role="tabpanel">
+                              <div class="main-data">
+                                  <div class="form-check m-2"><label class="form-check-label"><input type="radio" class="form-check-input" name="fzRadios" value="ALL" disabled=""> 适合本项所有定额</label>&nbsp;&nbsp;<label class="form-check-label"><input type="radio" class="form-check-input" name="fzRadios" value="PARTIAL" disabled> 适合本项部分定额</label></div>
+                                  <!-- <p class="m-2">适合本项所有定额</p> -->
+                                  <table class="table table-sm table-bordered m-0" id="fzTableAll">
+                                      <tr>
+                                          <td><textarea class="form-control" rows="30" id="fzTxtareaAll"></textarea></td>
+                                      </tr>
+                                  </table>
+                                  <table class="table table-sm table-bordered m-0" id="fzTablePartial">
+                                  </table>
+                              </div>
                           </div>
-                      </div>
                   </div>
                 </div>
             </div>
@@ -314,6 +331,61 @@
                 </div>
             </div>
         </div>
+        <!--弹出附注-->
+        <div class="modal fade" id="fzEditBianmaQ" data-backdrop="static" style="display: none;" aria-hidden="true">
+            <div class="modal-dialog" role="document">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h5 class="modal-title">修改编码</h5>
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                            <span aria-hidden="true">×</span>
+                        </button>
+                    </div>
+                    <div class="modal-body">
+                        <form>
+                            <div class="form-group">
+                                <label>编码</label>
+                                <div class="form-control">
+                                    <div class="row code" id="fzUpdateCon">
+                                    </div>
+                                </div>
+                            </div>
+                        </form>
+                    </div>
+                    <div class="modal-footer">
+                        <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                        <a href="javascript: void(0);" class="btn btn-primary" data-dismiss="modal" id="fzUpdateConBtn">确定</a>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="modal fade" id="fzEditBianma" data-backdrop="static" style="display: none;" aria-hidden="true">
+            <div class="modal-dialog" role="document">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h5 class="modal-title">勾选编码</h5>
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                            <span aria-hidden="true">×</span>
+                        </button>
+                    </div>
+                    <div class="modal-body">
+                        <form>
+                            <div class="form-group">
+                                <label>编码</label>
+                                <div class="form-control">
+                                    <div class="row code" id="fzAddCon">
+                                    </div>
+                                </div>
+                            </div>
+                        </form>
+                    </div>
+                    <div class="modal-footer">
+                        <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                        <a href="javascript: void(0);" class="btn btn-primary" data-dismiss="modal" id="fzAddConBtn">确定</a>
+                    </div>
+                </div>
+            </div>
+        </div>
         <!--弹出警告窗-->
         <button id="rationAlertBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#rationAlert" style="display: none"></button>
         <div class="modal fade" id="rationAlert" data-backdrop="static" style="display: none;" aria-hidden="true">
@@ -327,7 +399,7 @@
                         </button>
                     </div>
                     <div class="modal-body">
-                        <h5 class="text-danger" id="alertRationTxt">编号不可为空!是否取消操作?</h5>
+                        <h5 class="text-danger" id="alertRationTxt">编码不可为空,继续新增定额?</h5>
                     </div>
                     <div class="modal-footer">
                         <button type="button" class="btn btn-secondary" id="rationAlertCac" data-dismiss="modal">取消</button>
@@ -372,6 +444,7 @@
         <script type="text/javascript" src="/web/maintain/ration_repository/js/section_tree.js"></script>
         <script type="text/javascript" src="/public/web/ztree_common.js"></script>
         <script type="text/javascript" src="/public/web/sheet/sheet_common.js"></script>
+        <script type="text/javascript" src="/web/maintain/ration_repository/js/sheetsOpr.js"></script>
         <script type="text/javascript" src="/web/maintain/ration_repository/js/rationUnits.js"></script>
         <script type="text/javascript" src="/web/maintain/ration_repository/js/ration.js"></script>
         <script type="text/javascript" src="/web/maintain/ration_repository/js/ration_glj.js"></script>
@@ -434,18 +507,18 @@
             $(document).ready(function(){
                 pageOprObj.initPage();
                 rationOprObj.buildSheet($("#rationItemsSheet")[0]);
-                sheetCommonObj.shieldAllCells(rationOprObj.workBook.getSheet(0), rationOprObj.setting);
+               // sheetCommonObj.shieldAllCells(rationOprObj.workBook.getSheet(0), rationOprObj.setting);
 
                // tabPanel 下有多个Spread时,相互之间不能正确显示。改成一个Spread下多个Sheet。
                 var rdSpread = sheetCommonObj.createSpread($("#rdSpread")[0], 3);
                 rationGLJOprObj.buildSheet(rdSpread.getSheet(0));
-                sheetCommonObj.shieldAllCells(rdSpread.getSheet(0), rationGLJOprObj.setting);
+               // sheetCommonObj.shieldAllCells(rdSpread.getSheet(0), rationGLJOprObj.setting);
 
                 rationAssistOprObj.buildSheet(rdSpread.getSheet(1));
-                sheetCommonObj.shieldAllCells(rdSpread.getSheet(1), rationAssistOprObj.setting);
+             //   sheetCommonObj.shieldAllCells(rdSpread.getSheet(1), rationAssistOprObj.setting);
 
                 rationCoeOprObj.buildSheet(rdSpread.getSheet(2));
-                sheetCommonObj.shieldAllCells(rdSpread.getSheet(2), rationCoeOprObj.setting);
+              //  sheetCommonObj.shieldAllCells(rdSpread.getSheet(2), rationCoeOprObj.setting);
 
                 $("#linkGLJ").click(function(){
                     rationGLJOprObj.bindRationGljDelOpr();
@@ -453,7 +526,7 @@
                 });
 
                 $("#linkFZDE").click(function(){
-                    rationGLJOprObj.unBindDel();
+                    rationAssistOprObj.bindRationAssDel();
                     rdSpread.setActiveSheetIndex(1);
                 });
 

+ 1 - 0
web/maintain/ration_repository/fuzhu.html

@@ -89,6 +89,7 @@
     <script src="/public/common_util.js"></script>
     <script src="/public/debug.js"></script>
     <script type="text/javascript" src="/public/web/sheet/sheet_common.js"></script>
+    <script type="text/javascript" src="/web/maintain/ration_repository/js/sheetsOpr.js"></script>
     <script type="text/javascript" src="/public/web/storageUtil.js"></script>
     <script type="text/javascript" src="/web/maintain/ration_repository/js/coe.js"></script>
     <script type="text/javascript">

+ 1 - 0
web/maintain/ration_repository/gongliao.html

@@ -227,6 +227,7 @@
     <script type="text/javascript" src="/web/maintain/ration_repository/js/repository_glj.js"></script>
     <script type="text/javascript" src="/public/web/ztree_common.js"></script>
     <script type="text/javascript" src="/public/web/sheet/sheet_common.js"></script>
+    <script type="text/javascript" src="/web/maintain/ration_repository/js/sheetsOpr.js"></script>
     <script type="text/javascript" src="/public/web/storageUtil.js"></script>
     <script type="text/javascript">
         let userAccount = '<%=userAccount %>';

+ 120 - 25
web/maintain/ration_repository/js/coe.js

@@ -70,10 +70,10 @@ let coeOprObj = {
     workSheet: null,
     currentCoeList: [],
     currentCoe: null,
-    //currentMaxNo: null,
+    currentMaxNo: null,
     setting: {
         header: [
-            {headerName:"编号", headerWidth:60, dataCode:"ID", dataType: "String", hAlign: "center", vAlign: "center", readOnly: true},
+            {headerName:"编号", headerWidth:60, dataCode:"serialNo", dataType: "String", hAlign: "center", vAlign: "center", readOnly: false},
             {headerName:"名称", headerWidth:280, dataCode:"name", dataType: "String", hAlign: "left", vAlign: "center", readOnly: false},
             {headerName:"内容", headerWidth:250, dataCode:"content", dataType: "String", hAlign: "left", vAlign: "center", readOnly: false},
         ]
@@ -110,26 +110,64 @@ let coeOprObj = {
     onEditEnded: function (sender, args) {
         let me = coeOprObj, addArr = [], updateArr = [], dataCode = me.setting.header[args.col].dataCode;
         if(args.editingText && args.editingText.toString().trim().length > 0){
+            let inputT = args.editingText.toString().trim();
             //update
             if(args.row < me.currentCoeList.length){
                 let updateObj = me.currentCoeList[args.row];
-                if(updateObj[dataCode] !== args.editingText.toString().trim()){
-                    updateObj[dataCode] = args.editingText;
-                    updateArr.push(updateObj);
-                    me.save([], updateArr, [], true);
+                if(updateObj[dataCode] != inputT){
+                    if(dataCode === 'serialNo'){
+                        if(me.isInt(inputT) && !me.hasTisNo(me.currentCoeList, inputT)){
+                            me.currentMaxNo = me.currentMaxNo >= inputT ? me.currentMaxNo : inputT;
+                            updateObj[dataCode] = inputT;
+                            updateArr.push(updateObj);
+                            me.save([], updateArr, [], true);
+                        }
+                        else if(!me.isInt(inputT)){
+                            args.sheet.setValue(args.row, args.col, updateObj[dataCode] + '');
+                            alert('编号只能为整数!');
+                        }
+                        else if(me.hasTisNo(me.currentCoeList, inputT)){
+                            args.sheet.setValue(args.row, args.col, updateObj[dataCode] + '');
+                            alert('该编号已存在!');
+                        }
+                    }
+                    else {
+                        updateObj[dataCode] = inputT;
+                        updateArr.push(updateObj);
+                        me.save([], updateArr, [], true);
+                    }
                 }
             }
             //insert
             else{
                 let newCoe = {};
-                //me.currentMaxNo ++;
                 newCoe.libID = pageObj.libID;
-                //newCoe.serialNo = me.currentMaxNo;
-                newCoe[dataCode] = args.editingText;
-                addArr.push(newCoe);
-                me.save(addArr, [], [], true, function (result) {
-                    me.updateCurrentCoeList(result);
-                });
+                if(dataCode === 'serialNo'){
+                    if(me.isInt(inputT) && !me.hasTisNo(me.currentCoeList, inputT)){
+                        me.currentMaxNo = me.currentMaxNo >= inputT ? me.currentMaxNo : inputT;
+                        newCoe[dataCode] = inputT;
+                        addArr.push(newCoe);
+                        me.save(addArr, [], [], true, function (result) {
+                            me.updateCurrentCoeList(result);
+                        });
+                    }
+                    else if(!me.isInt(inputT)){
+                        args.sheet.setValue(args.row, args.col, '');
+                        alert('编号只能为整数!');
+                    }
+                    else if(me.hasTisNo(me.currentCoeList, inputT)){
+                        args.sheet.setValue(args.row, args.col, '');
+                        alert('该编号已存在!');
+                    }
+                }
+                else{
+                    newCoe.serialNo = ++me.currentMaxNo;
+                    newCoe[dataCode] = inputT;
+                    addArr.push(newCoe);
+                    me.save(addArr, [], [], true, function (result) {
+                        me.updateCurrentCoeList(result);
+                    });
+                }
             }
         }
     },
@@ -142,26 +180,40 @@ let coeOprObj = {
     onClipboardPasted: function (sender, info) {
         let me = coeOprObj, addArr = [], updateArr = [];
         let items = sheetCommonObj.analyzePasteData(me.setting, info);
-        for(let i = 0, len = items.length; i < len; i++){
+        let uniqItems = me.makeUniqItems(items);
+        for(let i = 0, len = uniqItems.length; i < len; i++){
             let row = i + info.cellRange.row;
             //update
             if(row < me.currentCoeList.length){
                 let updateObj = me.currentCoeList[row];
-                for(let attr in items[i]){
-                    updateObj[attr] = items[i][attr];
+                for(let attr in uniqItems[i]){
+                    if(attr === 'serialNo'){
+                        if(me.isInt(uniqItems[i][attr]) && !me.hasTisNo(me.currentCoeList, uniqItems[i][attr])){
+                            me.currentMaxNo = me.currentMaxNo >= uniqItems[i][attr] ? me.currentMaxNo : uniqItems[i][attr];
+                            updateObj[attr] = uniqItems[i][attr];
+                        }
+                    }
+                    else {
+                        updateObj[attr] = uniqItems[i][attr];
+                    }
                 }
                 updateArr.push(updateObj);
             }
             //insert
             else {
-                //items[i].serialNo = ++ me.currentMaxNo;
-                items[i].libID = pageObj.libID;
-                addArr.push(items[i]);
+                if(typeof uniqItems[i].serialNo !== 'undefined' && uniqItems[i] && me.isInt(uniqItems[i].serialNo) && !me.hasTisNo(me.currentCoeList, uniqItems[i].serialNo)){
+                    me.currentMaxNo = me.currentMaxNo >= uniqItems[i].serialNo ? me.currentMaxNo : uniqItems[i].serialNo;
+                }
+                else {
+                    uniqItems[i].serialNo = ++me.currentMaxNo;
+                }
+                uniqItems[i].libID = pageObj.libID;
+                addArr.push(uniqItems[i]);
             }
         }
         if(addArr.length > 0 || updateArr.length > 0){
             me.save(addArr, updateArr, [], true, function (result) {
-                me.updateCurrentCoeList(result)
+                me.updateCurrentCoeList(result);
             });
         }
     },
@@ -197,16 +249,57 @@ let coeOprObj = {
         workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
         workBook.commandManager().setShortcutKey('coeListDel', GC.Spread.Commands.Key.del, false, false, false, false);
     },
+    //粘贴的数据,编号唯一化,去除编号重复的项
+    makeUniqItems: function (items) {
+        let rst = [];
+        for(let i = 0, len = items.length; i < len; i++){
+            if(typeof items[i].serialNo !== 'undefined' && items[i].serialNo){
+                if(rst.length === 0){
+                    rst.push(items[i]);
+                }
+                else{
+                    let isExist = false;
+                    for(let j = 0, jLen = rst.length; j < jLen; j++){
+                        if(items[i].serialNo === rst[j].serialNo){
+                            isExist = true;
+                            break;
+                        }
+                    }
+                    if(!isExist){
+                        rst.push(items[i]);
+                    }
+                }
+            }
+            else {
+                rst.push(items[i]);
+            }
+        }
+        return rst;
+    },
+    isInt: function (num) {
+        return !isNaN(num) && num % 1 === 0;
+    },
+    hasTisNo: function (coeList, newSerialNo) {
+        let rst = false;
+        for(let i = 0, len = coeList.length; i < len; i++){
+            if(coeList[i].serialNo == newSerialNo){
+                rst = true;
+                break;
+            }
+        }
+        return rst;
+    },
     updateCurrentCoeList: function (newCoeList) {
         let me = coeOprObj;
-        me.currentCoeList = me.currentCoeList.concat(newCoeList);
-        me.sortCoeList(me.currentCoeList);
+        if(newCoeList){
+            me.currentCoeList = me.currentCoeList.concat(newCoeList);
+        }
     },
     sortCoeList: function (coeList) {
         coeList.sort(function (a, b) {
             let rst = 0;
-            if(a.ID > b.ID) rst = 1;
-            else if(a.ID < b.ID) rst = -1;
+            if(a.serialNo > b.serialNo) rst = 1;
+            else if(a.serialNo < b.serialNo) rst = -1;
             return rst;
         });
     },
@@ -222,7 +315,7 @@ let coeOprObj = {
                 if(!result.error){
                     me.currentCoeList = result.data;
                     me.sortCoeList(me.currentCoeList);
-                    //me.currentMaxNo =  me.currentCoeList.length > 0 ? me.currentCoeList[me.currentCoeList.length - 1].serialNo : 0;
+                    me.currentMaxNo =  me.currentCoeList.length > 0 ? me.currentCoeList[me.currentCoeList.length - 1].serialNo : 0;
                     pageObj.showData(me.workSheet, me.setting, me.currentCoeList);
                     me.workSheet.clearSelection();
                 }
@@ -256,6 +349,8 @@ let coeOprObj = {
                         callback(result.data);
                     }
                     if(refresh){
+                        me.sortCoeList(me.currentCoeList);
+                        me.currentMaxNo = me.currentCoeList.length > 0 ? me.currentCoeList[me.currentCoeList.length - 1].serialNo : 0;
                         pageObj.showData(me.workSheet, me.setting, me.currentCoeList);
                     }
                 }

+ 172 - 191
web/maintain/ration_repository/js/ration.js

@@ -9,19 +9,17 @@ $("#gongliao").click(function(){
 $("#fuzhu").click(function(){
     $(this).attr('href', "/rationRepository/coeList" + "?repository=" + getQueryString("repository"))
 });
-
-var rationOprObj = {
+let rationOprObj = {
     workBook: null,
     currentRations: {},
     currentEditingRation: null,
     currentSectionId: -1,
-    activeCell: null,
     rationsCodes: [],
     setting: {
         header:[
             {headerName:"编码",headerWidth:120,dataCode:"code", dataType: "String", formatter: "@"},
             {headerName:"名称",headerWidth:280,dataCode:"name", dataType: "String"},
-            {headerName:"单位",headerWidth:120,dataCode:"unit", dataType: "String", hAlign: "center"},
+            {headerName:"计量单位",headerWidth:120,dataCode:"unit", dataType: "String", hAlign: "center"},
             {headerName:"人工费",headerWidth:120,dataCode:"labourPrice", dataType: "Number", formatter: "0.00", hAlign: "right"},
             {headerName:"材料费",headerWidth:120,dataCode:"materialPrice", dataType: "Number", formatter: "0.00",  hAlign: "right"},
             {headerName:"机械费",headerWidth:120,dataCode:"machinePrice", dataType: "Number", formatter: "0.00", hAlign: "right"},
@@ -43,7 +41,7 @@ var rationOprObj = {
     },
     buildSheet: function(container) {
         let rationRepId = getQueryString("repository");
-        var me = rationOprObj;
+        let me = rationOprObj;
         let gljLibID = storageUtil.getSessionCache("gljLib", "repositoryID_" + rationRepId);
         if(!gljLibID || typeof gljLibID === 'undefined' || gljLibID == -1){
             alert("没有引用工料机库!");
@@ -57,42 +55,40 @@ var rationOprObj = {
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EnterCell, me.onEnterCell);
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditStarting, me.onCellEditStart);
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditEnded, me.onCellEditEnd);
-        //me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.RangeChanged, me.onRangeChanged);
-        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.CellClick, me.onCellClick);
+        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.SelectionChanged, me.onSelectionChanged);
     },
-
-    onCellClick: function(sender, args) {
-        var me = rationOprObj,
-            sheetGLJ = rationGLJOprObj.sheet, settingGLJ = rationGLJOprObj.setting,
-            sheetCoe = rationCoeOprObj.sheet, settingCoe = rationCoeOprObj.setting,
-            sheetAss = rationAssistOprObj.sheet, settingAss = rationAssistOprObj.setting;
-        me.activeCell = {row: args.row, col: args.col};
-        sheetCommonObj.cleanSheet(sheetGLJ, settingGLJ, -1);
-        sheetCommonObj.shieldAllCells(sheetGLJ);
-        sheetCommonObj.cleanSheet(sheetCoe, settingCoe, -1);
-        sheetCommonObj.shieldAllCells(sheetCoe);
-        sheetCommonObj.cleanSheet(sheetAss, settingAss, -1);
-        sheetCommonObj.shieldAllCells(sheetAss);
-        if(!(args.sheetArea === GC.Spread.Sheets.SheetArea.colHeader || args.sheetArea === GC.Spread.Sheets.SheetArea.corner)){
-            var cacheSection = me.getCache();
-            if (cacheSection && args.row < cacheSection.length) {
-                rationGLJOprObj.getGljItems(cacheSection[args.row], function () {
+    onSelectionChanged: function (sender, info) {
+        if(info.oldSelections.length === 0 && info.newSelections.length > 0 || info.oldSelections[0].row !== info.newSelections[0].row){
+            let row = info.newSelections[0].row;
+            let me = rationOprObj,
+                sheetGLJ = rationGLJOprObj.sheet, settingGLJ = rationGLJOprObj.setting,
+                sheetCoe = rationCoeOprObj.sheet, settingCoe = rationCoeOprObj.setting,
+                sheetAss = rationAssistOprObj.sheet, settingAss = rationAssistOprObj.setting;
+            sheetCommonObj.cleanSheet(sheetGLJ, settingGLJ, -1);
+            sheetCommonObj.cleanSheet(sheetCoe, settingCoe, -1);
+            sheetCommonObj.cleanSheet(sheetAss, settingAss, -1);
+            let cacheSection = me.getCache();
+            if (cacheSection && row < cacheSection.length) {
+                rationGLJOprObj.getGljItems(cacheSection[row], function () {
                     me.workBook.focus(true);
                 });
-                rationCoeOprObj.getCoeItems(cacheSection[args.row], function () {
+                rationCoeOprObj.getCoeItems(cacheSection[row], function () {
                     me.workBook.focus(true);
                 });
-                rationAssistOprObj.getAssItems(cacheSection[args.row]);
+                rationAssistOprObj.getAssItems(cacheSection[row]);
             }
             else {
                 rationGLJOprObj.currentRationItem = null;
             }
-        };
-        me.workBook.focus(true);
+            me.workBook.focus(true);
+        }
     },
 
+    isInt: function (num) {
+        return !isNaN(num) && num % 1 === 0;
+    },
     getCache: function() {
-        var me = this, rst = me.currentRations["_SEC_ID_" + me.currentSectionId];
+        let me = this, rst = me.currentRations["_SEC_ID_" + me.currentSectionId];
         if (!(rst)) {
             me.currentRations["_SEC_ID_" + me.currentSectionId] = [];
             rst = me.currentRations["_SEC_ID_" + me.currentSectionId];
@@ -100,30 +96,32 @@ var rationOprObj = {
         return rst;
     },
     updateCache: function(addArr, updateArr, removeIds, result) {
-        var me = this, cacheSection = me.getCache();
+        let me = this, cacheSection = me.getCache();
         if (addArr.length > 0) {
             me.currentRations["_SEC_ID_" + me.currentSectionId] = cacheSection.concat(addArr);
             cacheSection = me.currentRations["_SEC_ID_" + me.currentSectionId];
         }
-        for (var i = removeIds.length - 1; i >= 0; i--) {
-            for (var j = cacheSection.length - 1; j >= 0 ; j--) {
+        for (let i = removeIds.length - 1; i >= 0; i--) {
+            for (let j = cacheSection.length - 1; j >= 0 ; j--) {
                 if (cacheSection[j]["ID"] == removeIds[i]) {
                     cacheSection.splice(j,1);
                 }
             }
         }
         if (result && result.data.ops && result.data.ops.length > 0) {
-            for (var i = 0; i < result.data.ops.length; i++) {
-                for (var j = 0; j < cacheSection.length; j++) {
+            for (let i = 0; i < result.data.ops.length; i++) {
+                for (let j = 0; j < cacheSection.length; j++) {
                     if (cacheSection[j][me.setting.header[0].dataCode] == result.data.ops[i][me.setting.header[0].dataCode]) {
                         cacheSection[j]["ID"] = result.data.ops[i]["ID"];
                         cacheSection[j]["rationGljList"] = result.data.ops[i]["rationGljList"];
+                        cacheSection[j]["rationCoeList"] = result.data.ops[i]["rationCoeList"];
+                        cacheSection[j]["rationAssList"] = result.data.ops[i]["rationAssList"];
                     }
                 }
             }
         }
-        for (var i = 0; i < updateArr.length; i++) {
-            for (var j = 0; j < cacheSection.length; j++) {
+        for (let i = 0; i < updateArr.length; i++) {
+            for (let j = 0; j < cacheSection.length; j++) {
                 if (updateArr[i]["ID"] && cacheSection[j]["ID"]) {
                     if (cacheSection[j]["ID"] == updateArr[i]["ID"]) {
                         cacheSection[j] = updateArr[i];
@@ -159,12 +157,9 @@ var rationOprObj = {
                         if(sels[sel].col === 0){
                             $('#alertText').text("编号不能为空,修改失败!");
                             $('#alertModalBtn').click();
-                            rationSheet.options.isProtected = true;
                             $('#alertModalCls').click(function () {
-                                rationSheet.options.isProtected = false;
                             });
                             $('#alertModalCof').click(function () {
-                                rationSheet.options.isProtected = false;
                             })
                         }
                         else if(sels[sel].col !== 0 && !(sels[sel].col === 3 && sels.col + sels[sel].colCount -1 === 6)){
@@ -188,6 +183,7 @@ var rationOprObj = {
             }
             if(updateArr.length > 0 || removeArr.length > 0){
                 me.mixUpdate = 1;
+                me.mixDel = removeArr.length > 0 ? 1 : 0;
                 me.mixUpdateRequest(updateArr, [], removeArr);
             }
 
@@ -195,50 +191,9 @@ var rationOprObj = {
         me.workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
         me.workBook.commandManager().setShortcutKey('rationDelete', GC.Spread.Commands.Key.del, false, false, false, false);
     },
-    onRangeChanged: function(sender, args) {
-        if (args.action == GC.Spread.Sheets.RangeChangedAction.clear) {
-            var me = rationOprObj, updateArr = [], removeArr = [];
-            var cacheSection = me.getCache();
-            if (cacheSection) {
-                for (var i = 0; i < args.rowCount; i++) {
-                    //var hasUpdate = false, rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row + i),
-                    var hasUpdate = false, rObj = sheetCommonObj.combineRationRowData(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(isEmpty){
-                        if(args.row + i < cacheSection.length){
-                            rObj.ID = cacheSection[args.row + i].ID;
-                            removeArr.push(rObj.ID);
-                        }
-                    }
-                    else{
-
-                    }
-
-                    if (hasUpdate) {
-                        if (isEmpty) {
-                            removeArr.push(rObj);
-                        } 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);
-                //removeRationItems
-            }
-        }
-    },
     onEnterCell: function (sender, args) {
         let me = rationOprObj;
+        args.sheet.repaint();
         me.cellRowIdx = args.row;
         let isHasData = false;
         if(me.addRationItem){
@@ -252,54 +207,54 @@ var rationOprObj = {
         if(isHasData){
             if(me.editingRowIdx !== me.cellRowIdx) {
                 let focusToCol = !me.addRationItem.code ? 0 : -1;
-             //   else {
                 if(focusToCol !== -1){
                     $('#rationAlertBtn').click();
-                    me.workBook.getSheet(0).options.isProtected = true;
                     $('#rationAlertCac').click(function () {
-                        me.workBook.getSheet(0).options.isProtected = false;
-                        //me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
+                        me.addRationItem = null;
+                        for(let col=0; col<me.setting.header.length; col++){
+                            me.workBook.getSheet(0).getCell(me.editingRowIdx, col).value('');
+                        }
                     });
                     $('#rationAlertCls').click(function () {
-                        me.workBook.getSheet(0).options.isProtected = false;
-                       // me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
+                        me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
                     });
                     $('#rationAlertCof').click(function () {
-                        me.workBook.getSheet(0).options.isProtected = false;
-                        me.addRationItem = null;
-                        for(let col=0; col<me.setting.header.length; col++){
-                            me.workBook.getSheet(0).getCell(me.editingRowIdx, col).value(me.currentEditingRation[me.setting.header[col].dataCode]);
-                        }
-                        //me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, 0);
+                        me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
                     });
                 }
-               // }
             }
         }
     },
     onCellEditStart: function(sender, args) {
-        var me = rationOprObj;
-        //var rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row);
-        var rObj = sheetCommonObj.combineRationRowData(me.workBook.getSheet(0), me.setting, args.row);
-        me.currentEditingRation = rObj;
-        var cacheSection = me.getCache();
-        if (cacheSection) {
-            for (var j = 0; j < cacheSection.length; j++) {
-                if (cacheSection[j][me.setting.header[0].dataCode] == rObj[me.setting.header[0].dataCode]) {
-                    rObj["ID"] = cacheSection[j]["ID"];
-                    break;
+        let me = rationOprObj;
+        if(!me.canRations || me.setting.view.lockColumns.indexOf(args.col) !== -1){
+            args.cancel = true;
+        }
+        else{
+            let rObj = sheetsOprObj.combineRationRowData(me.workBook.getSheet(0), me.setting, args.row);
+            me.currentEditingRation = rObj;
+            let cacheSection = me.getCache();
+            if (cacheSection) {
+                for (let j = 0; j < cacheSection.length; j++) {
+                    if (cacheSection[j][me.setting.header[0].dataCode] == rObj[me.setting.header[0].dataCode]) {
+                        rObj["ID"] = cacheSection[j]["ID"];
+                        break;
+                    }
                 }
             }
         }
     },
     onCellEditEnd: function(sender, args) {
-        //var me = rationOprObj, rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row),
-        var me = rationOprObj, rObj = sheetCommonObj.combineRationRowData(me.workBook.getSheet(0), me.setting, args.row),
+        let me = rationOprObj, rObj = sheetsOprObj.combineRationRowData(me.workBook.getSheet(0), me.setting, args.row),
             updateArr = [], addArr = [];
         let dataCode = me.setting.header[args.col].dataCode;
         me.editingRowIdx = args.row;
         if (me.currentEditingRation["ID"]) {
-            rObj["ID"] = me.currentEditingRation["ID"];
+            if((!args.editingText || args.editingText.toString().trim().length === 0) && args.col === 0){
+                args.sheet.setValue(args.row, args.col, me.currentEditingRation[dataCode] + '');
+            }
+            else {
+                rObj["ID"] = me.currentEditingRation["ID"];
                 if(me.currentEditingRation[dataCode] !== rObj[dataCode]){
                     me.addRationItem = rObj;
                     if(dataCode === 'code'){
@@ -314,10 +269,20 @@ var rationOprObj = {
 
                         }
                     }
+                    else if(dataCode === 'feeType'){//取费专业控制为整数
+                        if(me.isInt(rObj[dataCode])){
+                            updateArr.push(rObj);
+                        }
+                        else {
+                            rObj[dataCode] = '';
+                            args.sheet.setValue(args.row, args.col, typeof me.currentEditingRation[dataCode] !== 'undefined' && me.currentEditingRation[dataCode] ? me.currentEditingRation[dataCode] : '');
+                        }
+                    }
                     else{
                         updateArr.push(rObj);
                     }
                 }
+            }
         }
         else if(!me.currentEditingRation["ID"]) {
             if (!sheetCommonObj.chkIfEmpty(rObj, me.setting)) {
@@ -329,6 +294,9 @@ var rationOprObj = {
                         if(jobContentOprObj && jobContentOprObj.currentSituation === jobContentOprObj.situations.ALL){
                             rObj.jobContent = jobContentOprObj.currentJobContent ? jobContentOprObj.currentJobContent : '';
                         }
+                        if(annotationOprObj && annotationOprObj.currentSituation === annotationOprObj.situations.ALL){
+                            rObj.annotation = annotationOprObj.currentAnnotation ? annotationOprObj.currentAnnotation : '';
+                        }
                         me.setInitPrc(rObj);
                         addArr.push(rObj);
                         me.rationsCodes.push(rObj.code);
@@ -338,22 +306,6 @@ var rationOprObj = {
                         alert('编码已存在!');
                         me.workBook.getSheet(0).setValue(args.row, args.col, '');
                     }
-                    /*else if(!rObj.code && rObj.code === ''){
-                        $('#alertModalBtn').click();
-                        me.workBook.getSheet(0).options.isProtected = true;
-                        $('#alertModalCls').click(function () {
-                            me.workBook.getSheet(0).options.isProtected = false;
-                            me.addRationItem.code = '';
-                            me.workBook.getSheet(0).setValue(args.row, args.col, '');
-                            me.workBook.getSheet(0).setActiveCell(args.row, args.col);
-                        });
-                        $('#alertModalCof').click(function () {
-                            me.workBook.getSheet(0).options.isProtected = false;
-                            me.addRationItem.code = '';
-                            me.workBook.getSheet(0).setValue(args.row, args.col, '');
-                            me.workBook.getSheet(0).setActiveCell(args.row, args.col);
-                        });
-                    }*/
                 }
                 else if(rObj.code && rObj.code.toString.trim().length === 0){
                     me.workBook.getSheet(0).setValue(args.row, args.col, '');
@@ -366,36 +318,46 @@ var rationOprObj = {
             me.mixUpdateRequest(updateArr, addArr, []);
         }
     },
+    canPasted: function (beginCol, maxCol) {
+        let rst = false;
+        if(maxCol < 3 || beginCol > 6){
+            rst = true;
+        }
+        return rst;
+    },
     onClipboardPasting: function(sender, args) {
-        var me = rationOprObj;
-      /*  if (args.cellRange.colCount != me.setting.header.length) {
+        let me = rationOprObj;
+        let maxCol = args.cellRange.col + args.cellRange.colCount -1;
+        if(!me.canRations || !me.canPasted(args.cellRange.col, maxCol) || maxCol > me.setting.header.length - 1){
             args.cancel = true;
-        }*/
+        }
     },
+    //todo: overwrite?
     onClipboardPasted: function(e, info) {
-        var me = rationOprObj;
-        var cacheSection = me.getCache();
-        var updateArr = [], addArr = [];
-        var items = sheetCommonObj.analyzePasteData(me.setting, info);
-        let failPasteArr = [];
-        for (var i = 0, rowIdx =info.cellRange.row; i < items.length; i++, rowIdx++) {
+        let me = rationOprObj;
+        let cacheSection = me.getCache();
+        let updateArr = [], addArr = [];
+        let items = sheetCommonObj.analyzePasteData(me.setting, info);
+        for (let i = 0; i < items.length; i++) {
+            let rowIdx = info.cellRange.row + i;
             if (cacheSection) {
                 if(!me.isValidUnit(items[i], rationUnits)){//无效单位
-                    items[i].unit = typeof cacheSection[rowIdx].unit !== 'undefined' && !cacheSection[rowIdx] ? cacheSection[rowIdx].unit : '';
+                    items[i].unit = rowIdx < cacheSection.length  && typeof cacheSection[rowIdx].unit !== 'undefined' ? cacheSection[rowIdx].unit : '';
                 }
-                //var hasCacheItem = false;
                 if(!cacheSection[rowIdx] && info.cellRange.col === 0 ){
                     if(me.rationsCodes.indexOf(items[i].code) === -1){
                         //jobConten
                         if(jobContentOprObj && jobContentOprObj.currentSituation === jobContentOprObj.situations.ALL){
                             items[i].jobContent = jobContentOprObj.currentJobContent ? jobContentOprObj.currentJobContent : '';
                         }
+                        if(annotationOprObj && annotationOprObj.currentSituation === annotationOprObj.situations.ALL){
+                            items[i].annotation = annotationOprObj.currentAnnotation ? annotationOprObj.currentAnnotation : '';
+                        }
                         me.setInitPrc(items[i]);
                         addArr.push(items[i]);
                         me.rationsCodes.push(items[i].code);
                     }
                     else{
-                        failPasteArr.push(items[i].code);
                         me.workBook.getSheet(0).setValue(rowIdx, 0, '');
                     }
                 }
@@ -405,6 +367,10 @@ var rationOprObj = {
                             items[i][me.setting.header[col].dataCode] = cacheSection[rowIdx][me.setting.header[col].dataCode];
                         }
                     }
+                    if(items[i].feeType && !me.isInt(items[i].feeType)){
+                        items[i].feeType = '';
+                        me.workBook.getSheet(0).setValue(rowIdx, 8, '');
+                    }
                     if(info.cellRange.col === 0){
                         if(me.rationsCodes.indexOf(items[i].code) === -1){
                             items[i].ID = cacheSection[rowIdx].ID;
@@ -432,22 +398,22 @@ var rationOprObj = {
                             if(jobContentOprObj && jobContentOprObj.currentSituation === jobContentOprObj.situations.ALL){
                                 items[i].jobContent = jobContentOprObj.currentJobContent ? jobContentOprObj.currentJobContent : '';
                             }
+                            if(annotationOprObj && annotationOprObj.currentSituation === annotationOprObj.situations.ALL){
+                                items[i].annotation = annotationOprObj.currentAnnotation ? annotationOprObj.currentAnnotation : '';
+                            }
                             me.setInitPrc(items[i]);
                             addArr.push(items[i]);
                         }
-                        else{
-                            failPasteArr.push(items[i]);
-                        }
                 }
             }
         };
-       /* if(failPasteArr.length > 0 && !(updateArr.length > 0 || addArr.length > 0)){
-            me.showRationItems(me.currentSectionId);
-        }*/
          if (updateArr.length > 0 || addArr.length > 0) {
              me.mixUpdate = 1;
             me.mixUpdateRequest(updateArr, addArr, []);
         }
+        else{
+             me.getRationItems(me.currentSectionId);
+         }
     },
     setInitPrc: function (obj) {
         obj.labourPrice = 0;
@@ -476,38 +442,54 @@ var rationOprObj = {
             }
         })
     },
-    mixUpdateRequest: function(updateArr, addArr, removeIds) {
-        var me = rationOprObj;
-        sheetCommonObj.setLockCol(me.workBook.getSheet(0), 0, true);
+    mixUpdateRequest: function(updateArr, addArr, removeIds, callback) {
+        let me = rationOprObj;
         $.ajax({
             type:"POST",
             url:"api/mixUpdateRationItems",
             data:{"rationLibId": getQueryString("repository"), "lastOpr": userAccount, "sectionID": me.currentSectionId, "updateItems": JSON.stringify(updateArr), "addItems": JSON.stringify(addArr), "removeIds": JSON.stringify(removeIds)},
             dataType:"json",
             cache:false,
-            timeout:5000,
+            timeout:20000,
             success:function(result){
                 if (result.error) {
-                    alert(`error`);
+                    alert('error');
                     me.getRationItems(me.currentSectionId);
                 } else {
-                    var cacheSection = me.updateCache(addArr, updateArr, removeIds, result);
+                    let cacheSection = me.updateCache(addArr, updateArr, removeIds, result);
                     cacheSection.sort(function(a, b){
-                        var rst = 0;
+                        let rst = 0;
                         if (a.code > b.code) rst = 1
                         else if (a.code < b.code) rst = -1;
                         return rst;
                     });
                     //jobContent
-                    if(jobContentOprObj && jobContentOprObj.currentSituation === jobContentOprObj.situations.PARTIAL){
+                    if(jobContentOprObj ){
                         jobContentOprObj.currentRationItems = cacheSection;
-                        jobContentOprObj.buildTablePartial(jobContentOprObj.tablePartial, jobContentOprObj.getGroup(cacheSection));
+                        jobContentOprObj.setRadiosDisabled(cacheSection.length > 0 ? false : true, jobContentOprObj.radios);
+                        if(cacheSection.length === 0){
+                            jobContentOprObj.updateSituation(pageOprObj.rationLibId, me.currentSectionId, 'NONE');
+                        }
+                        jobContentOprObj.setRadiosChecked(jobContentOprObj.currentSituation, jobContentOprObj.radios);
+                        if(jobContentOprObj.currentSituation === jobContentOprObj.situations.PARTIAL){
+                            jobContentOprObj.buildTablePartial(jobContentOprObj.tablePartial, jobContentOprObj.getGroup(cacheSection));
+                        }
+                    }
+                    if(annotationOprObj ){
+                        annotationOprObj.setRadiosDisabled(cacheSection.length > 0 ? false : true, annotationOprObj.radios);
+                        if(cacheSection.length === 0){
+                            annotationOprObj.updateAnnoSituation(pageOprObj.rationLibId, me.currentSectionId, 'NONE');
+                        }
+                        annotationOprObj.setRadiosChecked(annotationOprObj.currentSituation, annotationOprObj.radios);
+                        if(annotationOprObj.currentSituation === annotationOprObj.situations.PARTIAL){
+                            annotationOprObj.buildTablePartial(annotationOprObj.fzTablePartial, annotationOprObj.getGroup(cacheSection));
+                        }
                     }
                     me.showRationItems(me.currentSectionId);
                     me.mixUpdate = 0;
-                   // me.workBook.getSheet(0).setActiveCell(me.activeCell.row, me.activeCell.col);
+                    me.mixDel = 0;
                 }
-                sheetCommonObj.setLockCol(me.workBook.getSheet(0), 0, false);
+                if(callback) callback();
             },
             error:function(){
             }
@@ -515,20 +497,16 @@ var rationOprObj = {
     },
     getRationItems: function(sectionID){
         if (sectionID != -1) {
-            var me = rationOprObj;
+            let me = rationOprObj;
             me.mixUpdate = 0;
             me.currentSectionId = sectionID;
             if (me.currentRations["_SEC_ID_" + sectionID]) {
                 //jobContent--
                 jobContentOprObj.currentRationItems = me.currentRations["_SEC_ID_" + sectionID];
                 jobContentOprObj.rationJobContentOpr(me.currentRations["_SEC_ID_" + sectionID]);
-                //jobContent--
+                //annotation
+                annotationOprObj.rationAnnotationOpr(me.currentRations["_SEC_ID_" + sectionID]);
                 me.showRationItems(sectionID);
-                ///sheetCommonObj.unShieldAllCells(me.workBook.getSheet(0));
-                sheetCommonObj.lockCells(rationGLJOprObj.sheet, rationGLJOprObj.setting);
-                sheetCommonObj.lockCells(rationCoeOprObj.sheet, rationCoeOprObj.setting);
-                sheetCommonObj.lockCells(me.workBook.getSheet(0), rationOprObj.setting);
-                sheetCommonObj.unShieldAllCells(rationAssistOprObj.sheet);
             } else {
                 $.ajax({
                     type:"POST",
@@ -536,7 +514,7 @@ var rationOprObj = {
                     data:{"sectionID": sectionID},
                     dataType:"json",
                     cache:false,
-                    timeout:1000,
+                    timeout:10000,
                     success:function(result){
                         if (result) {
                             me.currentRations["_SEC_ID_" + sectionID] = result.data;
@@ -544,18 +522,9 @@ var rationOprObj = {
                             //job--
                             jobContentOprObj.currentRationItems = me.currentRations["_SEC_ID_" + sectionID];
                             jobContentOprObj.rationJobContentOpr(me.currentRations["_SEC_ID_" + sectionID]);
-                            //job--
+                            //annotation
+                            annotationOprObj.rationAnnotationOpr(me.currentRations["_SEC_ID_" + sectionID]);
                             me.showRationItems(sectionID);
-                            //sheetCommonObj.unShieldAllCells(me.workBook.getSheet(0));
-                            sheetCommonObj.lockCells(me.workBook.getSheet(0), rationOprObj.setting);
-                            sheetCommonObj.lockCells(rationGLJOprObj.sheet, rationGLJOprObj.setting);
-                            sheetCommonObj.lockCells(rationCoeOprObj.sheet, rationCoeOprObj.setting);
-                            sheetCommonObj.unShieldAllCells(rationAssistOprObj.sheet);
-                        } else {
-                            sheetCommonObj.shieldAllCells(me.workBook.getSheet(0));
-                            sheetCommonObj.shieldAllCells(rationGLJOprObj.sheet);
-                            sheetCommonObj.shieldAllCells(rationCoeOprObj.sheet);
-                            sheetCommonObj.shieldAllCells(rationAssistOprObj.sheet);
                         }
                     },
                     error:function(err){
@@ -565,37 +534,49 @@ var rationOprObj = {
             }
         }
     },
-    setCombo: function (sheet, items) {
-        sheet.suspendPaint();
-        for(let i = 0, len = sheet.getRowCount(); i < len; i++){
-            let combo = new GC.Spread.Sheets.CellTypes.ComboBox();
-            combo.items(items);
-            combo.itemHeight(10);
-            sheet.getCell(i, 2).cellType(combo);
-        }
-        sheet.resumePaint();
-    },
     showRationItems: function(sectionID){
-        var me = rationOprObj;
+        let me = rationOprObj,
+            sheetGLJ = rationGLJOprObj.sheet, settingGLJ = rationGLJOprObj.setting,
+            sheetCoe = rationCoeOprObj.sheet, settingCoe = rationCoeOprObj.setting,
+            sheetAss = rationAssistOprObj.sheet, settingAss = rationAssistOprObj.setting;
         if (me.workBook) {
             if (me.currentRations && me.currentRations["_SEC_ID_" + sectionID] && me.currentRations["_SEC_ID_" + sectionID].length > 0) {
-                var cacheSection = me.currentRations["_SEC_ID_" + sectionID];
-                //sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
+                let cacheSection = me.currentRations["_SEC_ID_" + sectionID];
                 sheetCommonObj.cleanData(me.workBook.getSheet(0), me.setting, -1);
-                sheetCommonObj.showData(me.workBook.getSheet(0), me.setting, cacheSection);
-                sheetCommonObj.setLockCol(me.workBook.getSheet(0), 4, true);
+                sheetsOprObj.showData(me.workBook.getSheet(0), me.setting, cacheSection);
                 //combo
-                me.setCombo(me.workBook.getActiveSheet(), rationUnits);
-                if(me.mixUpdate === 1){
-                    rationGLJOprObj.getGljItems(cacheSection[cacheSection.length - 1], function () {
-                        me.workBook.focus(true);
-                    });
+                sheetCommonObj.setStaticCombo(me.workBook.getActiveSheet(), 0, 2, cacheSection.length, rationUnits, 10, false);
+                sheetCommonObj.setDynamicCombo(me.workBook.getActiveSheet(), cacheSection.length, 2, me.workBook.getActiveSheet().getRowCount() - cacheSection.length, rationUnits, 10, false);
+                if(me.mixDel === 1){
+                    let row = me.workBook.getSheet(0).getSelections()[0].row;
+                    if (cacheSection && row < cacheSection.length) {
+                        sheetCommonObj.cleanData(sheetGLJ, settingGLJ, -1);
+                        sheetCommonObj.cleanData(sheetCoe, settingCoe, -1);
+                        sheetCommonObj.cleanData(sheetAss, settingAss, -1);
+                        rationGLJOprObj.getGljItems(cacheSection[row]);
+                        rationCoeOprObj.getCoeItems(cacheSection[row]);
+                        rationAssistOprObj.getAssItems(cacheSection[row]);
+                    }
+                    else {
+                        rationGLJOprObj.currentRationItem = null;
+                        sheetCommonObj.cleanData(sheetGLJ, settingGLJ, -1);
+                        sheetCommonObj.cleanData(sheetCoe, settingCoe, -1);
+                        sheetCommonObj.cleanData(sheetAss, settingAss, -1);
+                        sheetCommonObj.setDynamicCombo(sheetAss, 0, 5, sheetAss.getRowCount(), rationAssistOprObj.setting.comboItems, false, false);
+                    }
                 }
 
             } else {
+                sheetCommonObj.setDynamicCombo(sheetAss, 0, 5, sheetAss.getRowCount(), rationAssistOprObj.setting.comboItems, false, false);
+                sheetCommonObj.setDynamicCombo(me.workBook.getActiveSheet(), 0, 2, me.workBook.getActiveSheet().getRowCount(), rationUnits, 10, false);
                 //清除ration数据及工料机数据
+                rationGLJOprObj.currentRationItem = null;
                 sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
+                sheetCommonObj.cleanSheet(sheetGLJ, settingGLJ, -1);
+                sheetCommonObj.cleanSheet(sheetCoe, settingCoe, -1);
+                sheetCommonObj.cleanSheet(sheetAss, settingAss, -1);
             }
+            me.workBook.focus(true);
         }
     },
     sortByCode: function(arr){

+ 97 - 18
web/maintain/ration_repository/js/ration_assist.js

@@ -11,12 +11,13 @@ var rationAssistOprObj = {
             {headerName:"辅助定额号",headerWidth:120,dataCode:"assistCode", dataType: "String", hAlign: "center"},
             {headerName:"标准值",headerWidth:100,dataCode:"stdValue", dataType: "String", hAlign: "right"},
             {headerName:"步距",headerWidth:100,dataCode:"stepValue", dataType: "String", hAlign: "right"},
-            {headerName:"精度",headerWidth:80,dataCode:"decimal", dataType: "Number", hAlign: "right"},
+            {headerName:"精度",headerWidth:80,dataCode:"decimal",  dataType: "String", hAlign: "right"},
             {headerName:"进位方式",headerWidth:100,dataCode:"carryBit", dataType: "String", hAlign: "center"},
             {headerName:"最小值",headerWidth:100,dataCode:"minValue", dataType: "String", hAlign: "right"},
             {headerName:"最大值",headerWidth:100,dataCode:"maxValue", dataType: "String", hAlign: "right"}
         ],
-        view:{}
+        view:{},
+        comboItems: ["四舍五入", "进一"]
     },
 
     buildSheet: function(sheet) {
@@ -27,18 +28,28 @@ var rationAssistOprObj = {
 
         sheetCommonObj.initSheet(me.sheet, me.setting, 30);
 
-        var carryBit = new GC.Spread.Sheets.CellTypes.ComboBox();
-        carryBit.items(["四舍五入","进一"]);
-        me.sheet.getRange(-1, 5, -1, 1).cellType(carryBit);
-
         me.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
         me.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
+        me.sheet.bind(GC.Spread.Sheets.Events.EditStarting, me.onEditStarting);
         me.sheet.bind(GC.Spread.Sheets.Events.EditEnded, me.onEditEnded);
-        me.sheet.bind(GC.Spread.Sheets.Events.RangeChanged, me.onRangeChanged);
+        me.sheet.bind(GC.Spread.Sheets.Events.EnterCell, me.onEnterCell);
+    },
+
+    onEnterCell: function (sender, args) {
+        let me = rationAssistOprObj;
+        args.sheet.repaint();
+        let cellType = args.sheet.getCellType(args.row, 5);
+        if(cellType.typeName !== 'undefined' && cellType.typeName === '1'){
+            sheetCommonObj.setStaticCombo(args.sheet, 0, 5, 0, me.setting.comboItems, false);
+            sheetCommonObj.setDynamicCombo(args.sheet, 0, 5, me.sheet.getRowCount(), me.setting.comboItems, false, false);
+        }
     },
 
     onClipboardPasting: function(sender, args) {
-        var me = rationAssistOprObj;
+        let me = rationAssistOprObj;
+        let rationSection = rationOprObj.getCache();
+        let rationRow = rationOprObj.workBook.getSheet(0).getSelections()[0].row;
+        me.ration = rationRow < rationSection.length ? rationSection[rationRow] : null;
         if (!me.ration) {
             args.cancel = true;
         }
@@ -56,28 +67,60 @@ var rationAssistOprObj = {
             me.ration.rationAssList = assList;
         };
 
-        rationOprObj.mixUpdateRequest([me.ration], [], []);
-        sheetCommonObj.cleanSheet(me.sheet, me.setting, -1);
+        rationOprObj.mixUpdateRequest([me.ration], [], [], function () {
+            me.sheet.getParent().focus(true);
+        });
+        sheetCommonObj.cleanData(me.sheet, me.setting, -1);
+        sheetCommonObj.setStaticCombo(me.sheet, 0, 5, me.ration.rationAssList.length, me.setting.comboItems, false, false);
+        sheetCommonObj.setDynamicCombo(me.sheet, me.ration.rationAssList.length, 5, me.sheet.getRowCount() - me.ration.rationAssList.length, me.setting.comboItems, false, false);
         sheetCommonObj.showData(me.sheet, me.setting, me.ration.rationAssList);
     },
 
+    onEditStarting: function (sender, args) {
+        let me = rationAssistOprObj;
+        let rationSection = rationOprObj.getCache();
+        let rationRow = rationOprObj.workBook.getSheet(0).getSelections()[0].row;
+        me.ration = rationRow < rationSection.length ? rationSection[rationRow] : null;
+        if(!me.ration){
+            args.cancel = true;
+        }
+    },
+
     onEditEnded: function(sender, args){
         var me = rationAssistOprObj;
         if (!me.ration) {return;};
+        if(typeof me.ration.rationAssList === 'undefined'){
+            me.ration.rationAssList = [];
+        }
         var assList = me.ration.rationAssList;
-        //var assObj = sheetCommonObj.combineRowData(me.sheet, me.setting, args.row);
-        var assObj = sheetCommonObj.combineRationRowData(me.sheet, me.setting, args.row);
+        var assObj = sheetsOprObj.combineRationRowData(me.sheet, me.setting, args.row);
+        let dataCode = me.setting.header[args.col].dataCode;
+        if((args.col === 2 || args.col === 3 || args.col === 6 || args.col === 7)
+            && args.editingText && args.editingText.toString().trim().length > 0 && isNaN(args.editingText)){
+            args.sheet.setValue(args.row, args.col, args.row < assList.length ? assList[args.row][dataCode] : '');
+            alert(me.setting.header[args.col].headerName + '只能为数值!');
+            return;
+        }
+        else if(args.col === 4 && args.editingText && (args.editingText.toString().trim().length === 0 ||
+                isNaN(args.editingText) || args.editingText % 1 !== 0)){
+            args.sheet.setValue(args.row, args.col, args.row < assList.length ? assList[args.row][dataCode] : 0);
+            alert(me.setting.header[args.col].headerName + '只能为整数!');
+            return;
+        }
         // 新增
-        if ((assList == undefined) || (assList && args.row >= assList.length)) {
+        if (args.row >= assList.length) {
             if (assObj.decimal == undefined || assObj.decimal == null){assObj.decimal = '0';};
             if (assObj.carryBit == undefined || assObj.carryBit == null){assObj.carryBit = '四舍五入';};
             assList.push(assObj);
         }
         // 修改
         else{ assList[args.row] = assObj; };
-
-        rationOprObj.mixUpdateRequest([me.ration], [], []);
-        sheetCommonObj.cleanSheet(me.sheet, me.setting, -1);
+        rationOprObj.mixUpdateRequest([me.ration], [], [], function () {
+            me.sheet.getParent().focus(true);
+        });
+        sheetCommonObj.cleanData(me.sheet, me.setting, -1);
+        sheetCommonObj.setStaticCombo(me.sheet, 0, 5, assList.length, me.setting.comboItems, false, false);
+        sheetCommonObj.setDynamicCombo(me.sheet, assList.length, 5, me.sheet.getRowCount() - assList.length, me.setting.comboItems, false, false);
         sheetCommonObj.showData(me.sheet, me.setting, assList);
     },
 
@@ -99,6 +142,35 @@ var rationAssistOprObj = {
             sheetCommonObj.showData(me.sheet, me.setting, assList);
         };
     },
+    bindRationAssDel: function () {
+        let me = rationAssistOprObj;
+        let workBook = me.sheet.getParent();
+        workBook.commandManager().register('rationAssDel', function () {
+            let sels = me.sheet.getSelections(), isUpdate = false;
+            if(me.ration){
+                let curCahe = me.ration.rationAssList;
+                for(let i = 0, len = sels.length; i < len; i ++ ){
+                    if(sels[i].colCount === me.setting.header.length){
+                        if(sels[i].row < curCahe.length){
+                            isUpdate = true;
+                            curCahe.splice(sels[i].row, sels[i].rowCount);
+                        }
+                    }
+                }
+                if(isUpdate){
+                    rationOprObj.mixUpdateRequest([me.ration], [], [], function () {
+                        workBook.focus(true);
+                    });
+                    sheetCommonObj.cleanData(me.sheet, me.setting, -1);
+                    sheetCommonObj.setStaticCombo(me.sheet, 0, 5, curCahe.length, me.setting.comboItems, false);
+                    sheetCommonObj.setDynamicCombo(me.sheet, curCahe.length, 5, me.sheet.getRowCount() - curCahe.length, me.setting.comboItems, false);
+                    sheetCommonObj.showData(me.sheet, me.setting, curCahe);
+                }
+            }
+        });
+        workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
+        workBook.commandManager().setShortcutKey('rationAssDel', GC.Spread.Commands.Key.del, false, false, false, false);
+    },
 
     getAssItems: function(ration) {
         var me = this;
@@ -108,8 +180,15 @@ var rationAssistOprObj = {
         sheetCommonObj.unShieldAllCells(me.sheet);
 
         if (ration == undefined || ration.rationAssList == undefined ||
-            ration.rationAssList.length == 0){return;};
-
+            ration.rationAssList.length == 0){
+            sheetCommonObj.setStaticCombo(me.sheet, 0, 5, 0, me.setting.comboItems, false);
+            sheetCommonObj.setDynamicCombo(me.sheet, 0, 5, me.sheet.getRowCount(), me.setting.comboItems, false, false);
+            return;
+        }
+        else {
+            sheetCommonObj.setStaticCombo(me.sheet, 0, 5, ration.rationAssList.length, me.setting.comboItems, false);
+            sheetCommonObj.setDynamicCombo(me.sheet, ration.rationAssList.length, 5, me.sheet.getRowCount() - ration.rationAssList.length, me.setting.comboItems, false, false);
+        }
         sheetCommonObj.showData(me.sheet, me.setting, ration.rationAssList);
     }
 }

+ 72 - 51
web/maintain/ration_repository/js/ration_coe.js

@@ -10,9 +10,9 @@ var rationCoeOprObj = {
     cache: {},
     setting: {
         header:[
-            {headerName:"编码",headerWidth:120,dataCode:"ID", dataType: "Number", hAlign: 'left'},
-            {headerName:"名称",headerWidth:400,dataCode:"name", dataType: "String"},
-            {headerName:"内容",headerWidth:300,dataCode:"content", dataType: "String"}
+            {headerName:"编号",headerWidth:120,dataCode:"serialNo", dataType: "Number", hAlign: 'left'},
+            {headerName:"名称",headerWidth:400,dataCode:"name", dataType: "String", hAlign: 'left'},
+            {headerName:"内容",headerWidth:300,dataCode:"content", dataType: "String", hAlign: 'left'}
         ],
         view:{
             comboBox:[],
@@ -28,12 +28,16 @@ var rationCoeOprObj = {
         sheetCommonObj.initSheet(me.sheet, me.setting, 30);
         me.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
         me.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
+        me.sheet.bind(GC.Spread.Sheets.Events.EditStarting, me.onEditStarting);
         me.sheet.bind(GC.Spread.Sheets.Events.EditEnded, me.onEditEnded);
        // me.sheet.bind(GC.Spread.Sheets.Events.RangeChanged, me.onRangeChanged);
     },
 
     onClipboardPasting: function(sender, args) {
         var me = rationCoeOprObj;
+        let rationSection = rationOprObj.getCache();
+        let rationRow = rationOprObj.workBook.getSheet(0).getSelections()[0].row;
+        me.curRation = rationRow < rationSection.length ? rationSection[rationRow] : null;
         if (args.cellRange.colCount != 1 || args.cellRange.col != 0 || !(me.curRation)) {
             args.cancel = true;
         }
@@ -45,45 +49,47 @@ var rationCoeOprObj = {
             // 修改第一列(编号)
             if (info.cellRange.col == 0) {
                 me.tempDelArr = [];
-                var coeIDs = [];
-                var items = sheetCommonObj.analyzePasteData({header:[{dataCode: "ID"}] }, info);
+                var coeNos = [];
+                var items = sheetCommonObj.analyzePasteData({header:[{dataCode: "serialNo"}] }, info);
                 let curCache = typeof me.cache["_Coe_" + me.curRation.ID] !== 'undefined' ? me.cache["_Coe_" + me.curRation.ID] : [];
                 let isRefresh = false;
                 for(let i = 0, len = items.length; i < len; i++){
-                    let row = i + info.cellRange.row;
-                    //update
-                    if(row < curCache.length){
-                        let isExist = false;
-                        for(let j = 0, jLen = curCache.length; j < jLen; j++){
-                            if(items[i].ID === curCache[j].ID && j !== row){
-                                isExist = true;
-                                break;
+                    if(!isNaN(items[i].serialNo)){
+                        let row = i + info.cellRange.row;
+                        //update
+                        if(row < curCache.length){
+                            let isExist = false;
+                            for(let j = 0, jLen = curCache.length; j < jLen; j++){
+                                if(items[i].serialNo === curCache[j].serialNo && j !== row){
+                                    isExist = true;
+                                    break;
+                                }
+                            }
+                            if(!isExist){
+                                me.tempDelArr.push({org: curCache[row], newNo: items[i].serialNo});
+                                coeNos.push(items[i].serialNo);
+                            }
+                            else{
+                                isRefresh = true;
                             }
-                        }
-                        if(!isExist){
-                            me.tempDelArr.push({org: curCache[row], newID: items[i].ID});
-                            coeIDs.push(items[i].ID);
                         }
                         else{
-                            isRefresh = true;
+                            coeNos.push(items[i].serialNo);
                         }
                     }
-                    else{
-                        coeIDs.push(items[i].ID);
-                    }
                 }
                 //delete in front
                 if(me.tempDelArr.length > 0){
                    for(let i = 0, len = me.tempDelArr.length; i < len; i++){
                        for(let j = 0; j < curCache.length; j++){
-                           if(me.tempDelArr[i].org.ID === curCache[j].ID){
+                           if(me.tempDelArr[i].org.serialNo === curCache[j].serialNo){
                                curCache.splice(j, 1);
                                break;
                            }
                        }
                    }
                 }
-                me.addCoeItems(coeIDs);
+                me.addCoeItems(coeNos);
                 if(isRefresh){
                     me.showCoeItems(me.curRation.ID);
                 }
@@ -92,23 +98,32 @@ var rationCoeOprObj = {
             }
         }
     },
+    onEditStarting: function (sender, args) {
+        let me = rationCoeOprObj;
+        let rationSection = rationOprObj.getCache();
+        let rationRow = rationOprObj.workBook.getSheet(0).getSelections()[0].row;
+        me.curRation = rationRow < rationSection.length ? rationSection[rationRow] : null;
+        if(!me.curRation || args.col !== 0){
+            args.cancel = true;
+        }
 
+    },
     onEditEnded: function(sender, args){
         var me = rationCoeOprObj;
         if (args.col == 0 && args.editingText && args.editingText.toString().trim().length > 0 && !isNaN(args.editingText)) {   // 编号列
             let curCahe = typeof me.cache["_Coe_" + me.curRation.ID] !== 'undefined' ? me.cache["_Coe_" + me.curRation.ID] : [];
             me.tempDelArr = [];
             //update
-            if(args.row < curCahe.length && args.editingText != curCahe[args.row].ID){
+            if(args.row < curCahe.length && args.editingText != curCahe[args.row].serialNo){
                 let isExist = false;
                 for(let i = 0, len = curCahe.length; i < len; i++){
-                    if(args.editingText == curCahe[i].ID){
+                    if(args.editingText == curCahe[i].serialNo){
                         isExist = true;
                         break;
                     }
                 }
                 if(!isExist){
-                    me.tempDelArr.push({org: curCahe[args.row], newID: args.editingText});
+                    me.tempDelArr.push({org: curCahe[args.row], newNo: args.editingText});
                     curCahe.splice(args.row, 1);
                     me.addCoeItems([args.editingText]);
                 }
@@ -122,6 +137,7 @@ var rationCoeOprObj = {
             }
         }
         else{
+            sheetCommonObj.cleanData(me.sheet, me.setting, -1);
             me.showCoeItems(me.curRation.ID);
         }
     },
@@ -141,7 +157,9 @@ var rationCoeOprObj = {
                 }
             }
             if(isUpdate){
-                me.updateCurRation();
+                me.updateCurRation(function () {
+                    me.sheet.getParent().focus(true);
+                });
                 sheetCommonObj.cleanData(me.sheet, me.setting, -1);
                 me.showCoeItems(me.curRation.ID);
             }
@@ -154,7 +172,7 @@ var rationCoeOprObj = {
         for(let i = 0, len = tempDelArr.length; i < len; i++){
             let isExist = false;
             for(let j = 0, jLen = newArr.length; j < jLen; j++){
-                if(tempDelArr[i].newID == newArr[j].ID){
+                if(tempDelArr[i].newNo == newArr[j].serialNo){
                     isExist = true;
                     break;
                 }
@@ -165,37 +183,37 @@ var rationCoeOprObj = {
         }
         return rst;
     },
-    addCoeItems: function(coeIDs) {
+    addCoeItems: function(coeNos) {
         var me = this;
         sheetCommonObj.cleanData(me.sheet, me.setting, -1);
 
         var curCache = me.cache["_Coe_" + me.curRation.ID];
         var temp = [];
         if (curCache) {
-            for (var i = 0; i < coeIDs.length; i++) {
+            for (var i = 0; i < coeNos.length; i++) {
                 var isExist = false;
                 for (let obj of curCache) {
-                    if (obj.ID == coeIDs[i]) {
+                    if (obj.serialNo == coeNos[i]) {
                         isExist = true;
                         break;
                     };
                 };
                 if (!isExist) {
-                    temp.push(coeIDs[i]);
+                    temp.push(coeNos[i]);
                 };
             };
         }else{
-            for (let obj of coeIDs){temp.push(obj)};
+            for (let obj of coeNos){temp.push(obj)};
         };
 
         if(temp.length == 0){
             me.showCoeItems(me.curRation.ID);
-            sheetCommonObj.lockCells(me.sheet, me.setting);
+            //sheetCommonObj.lockCells(me.sheet, me.setting);
         }else{
             $.ajax({
                 type:"POST",
-                url:"api/getCoeItemsByIDs",
-                data: {"data": JSON.stringify({"libID": me.libID, "coeIDs": temp})},
+                url:"api/getCoeItemsByNos",
+                data: {"data": JSON.stringify({"libID": me.libID, "coeNos": temp})},
                 dataType:"json",
                 cache:false,
                 timeout:5000,
@@ -213,10 +231,12 @@ var rationCoeOprObj = {
                             curCache = curCache.concat(recoveryArr);
                         }
                         me.cache["_Coe_" + me.curRation.ID] = curCache;
-                        me.updateCurRation();
+                        me.updateCurRation(function () {
+                            me.sheet.getParent().focus(true);
+                        });
                         me.showCoeItems(me.curRation.ID);
                     };
-                    sheetCommonObj.lockCells(me.sheet, me.setting);
+                    //sheetCommonObj.lockCells(me.sheet, me.setting);
                 },
                 error:function(err){
                     alert(err);
@@ -229,16 +249,15 @@ var rationCoeOprObj = {
         var me = this;
         me.curRation = ration;
 
-        if (ration == undefined || ration.rationCoeList == undefined ||
-            ration.rationCoeList.length == 0){return;};
+        /*if (ration == undefined || ration.rationCoeList == undefined ||
+            ration.rationCoeList.length == 0){return;};*/
 
         var coeList = ration.rationCoeList;
         var curCache = me.cache["_Coe_" + ration.ID];
-
-        if (curCache && curCache.length > 0) {
+        if (curCache) {
             me.showCoeItems(ration.ID);
-            sheetCommonObj.lockCells(me.sheet, me.setting);
-        } else {
+            //sheetCommonObj.lockCells(me.sheet, me.setting);
+        } else if(!curCache && typeof coeList !== 'undefined' && coeList.length > 0) {
             var data = {"libID": me.libID, "coeIDs": coeList};
             $.ajax({
                 type:"POST",
@@ -259,8 +278,8 @@ var rationCoeOprObj = {
 
                         me.showCoeItems(ration.ID);
                     }
-                    sheetCommonObj.lockCells(me.sheet, me.setting);
-                    callback();
+                    //sheetCommonObj.lockCells(me.sheet, me.setting);
+                    if(callback) callback();
                 },
                 error:function(err){
                     alert(err);
@@ -275,15 +294,15 @@ var rationCoeOprObj = {
         if (curCache) {
             curCache.sort(function(a, b) {
                 var rst = 0;
-                if (a.ID > b.ID) rst = 1
-                else if (a.ID < b.ID) rst = -1;
+                if (a.serialNo > b.serialNo) rst = 1
+                else if (a.serialNo < b.serialNo) rst = -1;
                 return rst;
             });
-            sheetCommonObj.showData(me.sheet, me.setting, curCache);
+            sheetsOprObj.showData(me.sheet, me.setting, curCache);
         }
     },
 
-    updateCurRation: function() {
+    updateCurRation: function(callback) {
         var me = this, updateArr = [];
         if (me.curRation) {
             var rst = [];
@@ -294,7 +313,9 @@ var rationCoeOprObj = {
                 };
                 me.curRation.rationCoeList = rst;
                 updateArr.push(me.curRation);
-                rationOprObj.mixUpdateRequest(updateArr, [], []);
+                rationOprObj.mixUpdateRequest(updateArr, [], [], function () {
+                    if(callback) callback();
+                });
             };
         };
     }

+ 115 - 110
web/maintain/ration_repository/js/ration_glj.js

@@ -12,7 +12,7 @@ var rationGLJOprObj = {
         header:[
             {headerName:"编码",headerWidth:120,dataCode:"code", dataType: "String", formatter: "@"},
             {headerName:"名称",headerWidth:400,dataCode:"name", dataType: "String"},
-            {headerName:"规格",headerWidth:120,dataCode:"specs", dataType: "String"},
+            {headerName:"规格型号",headerWidth:120,dataCode:"specs", dataType: "String"},
             {headerName:"单位",headerWidth:160,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
             {headerName:"基价单价",headerWidth:160, dataCode:"basePrice", dataType: "Number", formatter:"0.00",  precision: 2},
             {headerName:"定额消耗",headerWidth:160, dataCode:"consumeAmt", dataType: "Number", formatter: "0.000", precision: 3},
@@ -83,30 +83,21 @@ var rationGLJOprObj = {
             me.bindRationGljDelOpr();
             me.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
             me.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
+            me.sheet.bind(GC.Spread.Sheets.Events.EditStarting, me.onEditStarting);
             me.sheet.bind(GC.Spread.Sheets.Events.EditEnded, me.onCellEditEnd);
-            //me.sheet.bind(GC.Spread.Sheets.Events.RangeChanged, me.onRangeChanged);
         });
     },
-    unBindDel: function () {
-        let me = rationGLJOprObj, spreadBook = me.sheet.getParent();
-        spreadBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
-        spreadBook.commandManager().setShortcutKey('clear', GC.Spread.Commands.Key.del, false, false, false, false);
-    },
     bindRationGljDelOpr: function () {
         let me = rationGLJOprObj, spreadBook = me.sheet.getParent();
         spreadBook.commandManager().register('rationGljDelete', function () {
-            let sels = me.sheet.getSelections(), updateArr = [], removeArr = [], lockCols = me.setting.view.lockColumns;
+            let sels = me.sheet.getSelections(), lockCols = me.setting.view.lockColumns;
             let cacheSection = me.cache["_GLJ_" + me.currentRationItem.ID], isUpdate = false;
             if(sels.length > 0){
                 for(let sel = 0; sel < sels.length; sel++){
                     if(sels[sel].colCount === me.setting.header.length){
-                        if(cacheSection){
-                            for(let i = 0; i < sels[sel].rowCount; i++){
-                                if(sels[sel].row + i < cacheSection.length){
-                                    isUpdate = true;
-                                    cacheSection.splice(sels[sel].row + i, 1);
-                                }
-                            }
+                        if(cacheSection && sels[sel].row < cacheSection.length){
+                            isUpdate = true;
+                            cacheSection.splice(sels[sel].row, sels[sel].rowCount);
                         }
                     }
                     else{
@@ -129,39 +120,24 @@ var rationGLJOprObj = {
                 }
             }
             if(isUpdate){
-                me.updateRationItem();
-                sheetCommonObj.cleanSheet(me.sheet, me.setting, -1);
+                me.updateRationItem(function () {
+                    me.sheet.getParent().focus(true);
+                });
+                sheetCommonObj.cleanData(me.sheet, me.setting, -1);
                 me.showGljItems(me.currentRationItem.ID);
             }
-           /* if(updateArr.length > 0 || removeArr.length > 0){
-                me.mixUpdateRequest(updateArr, [], removeArr);
-            }*/
-
         });
         spreadBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
         spreadBook.commandManager().setShortcutKey('rationGljDelete', GC.Spread.Commands.Key.del, false, false, false, false);
     },
-    onRangeChanged: function(sender, args) {
-        if (args.action == GC.Spread.Sheets.RangeChangedAction.clear) {
-            var me = rationGLJOprObj, updateArr = [], removeArr = [];
-            if (args.col == 0) {
-                if (me.cache["_GLJ_" + me.currentRationItem.ID]) {
-                    var cacheArr = me.cache["_GLJ_" + me.currentRationItem.ID];
-                    for (var i = args.rowCount - 1; i >= 0; i--) {
-                        if (args.row + i < cacheArr.length) {
-                            cacheArr.splice(args.row + i, 1);
-                        }
-                    }
-                    me.updateRationItem();
-                    sheetCommonObj.cleanSheet(me.sheet, me.setting, -1);
-                    me.showGljItems(me.currentRationItem.ID);
-                }
-            }
-
-        }
-    },
     onClipboardPasting: function(sender, args) {
         var me = rationGLJOprObj;
+        let rationSection = rationOprObj.getCache();
+        let rationRow = rationOprObj.workBook.getSheet(0).getSelections()[0].row;
+        me.currentRationItem = rationRow < rationSection.length ? rationSection[rationRow] : null;
+        if(me.currentRationItem && typeof me.cache["_GLJ_" + me.currentRationItem.ID] === 'undefined'){
+            me.cache["_GLJ_" + me.currentRationItem.ID] = [];
+        }
         if (!(args.cellRange.col === 0 || args.cellRange.col === 5) || !(me.currentRationItem)) {
             args.cancel = true;
         }
@@ -179,7 +155,7 @@ var rationGLJOprObj = {
                     for (var i = 0; i < tmpCodes.length; i++) {
                         let rowIdx = info.cellRange.row + i;
                         if(rowIdx < cacheArr.length){//更新
-                            me.tempCacheArr.push(cacheArr[rowIdx]);
+                            me.tempCacheArr.push({org: cacheArr[rowIdx], newCode: tmpCodes[i].code});
                             cacheArr.splice(rowIdx--, 1);
                         }
                         codes.push(tmpCodes[i].code);
@@ -195,7 +171,9 @@ var rationGLJOprObj = {
                             let roundCons = me.round(tempConsumes[i].consumeAmt, 3);
                             me.cache["_GLJ_" + me.currentRationItem.ID][info.cellRange.row + i].consumeAmt = roundCons;
                         }
-                        me.updateRationItem();
+                        me.updateRationItem(function () {
+                            me.sheet.getParent().focus(true);
+                        });
                         if(info.cellRange.row + info.cellRange.rowCount -1 >= me.cache["_GLJ_" + me.currentRationItem.ID].length -1){
                             me.sheet.suspendPaint();
                             for(let rowIdx = me.cache["_GLJ_" + me.currentRationItem.ID].length; rowIdx <= info.cellRange.row + info.cellRange.rowCount -1; rowIdx++){
@@ -215,6 +193,23 @@ var rationGLJOprObj = {
             }
         }
     },
+    onEditStarting: function (sender, args) {
+        let me = rationGLJOprObj;
+        let rationSection = rationOprObj.getCache();
+        let rationRow = rationOprObj.workBook.getSheet(0).getSelections()[0].row;
+        me.currentRationItem = rationRow < rationSection.length ? rationSection[rationRow] : null;
+        if(me.currentRationItem && typeof me.cache["_GLJ_" + me.currentRationItem.ID] === 'undefined'){
+            me.cache["_GLJ_" + me.currentRationItem.ID] = [];
+        }
+        if(!me.currentRationItem){
+            args.cancel = true;
+        }
+        else {
+            if(args.col !== 0 && args.col !== 5 || args.col === 5 && args.row >= me.cache["_GLJ_" + me.currentRationItem.ID].length){
+                args.cancel = true;
+            }
+        }
+    },
     onCellEditEnd: function(sender, args){
         var me = rationGLJOprObj;
         if(me.currentRationItem) {
@@ -228,13 +223,10 @@ var rationGLJOprObj = {
                         if (isNaN(parseFloat(args.editingText))) {
                             $('#alertModalBtn').click();
                             $('#alertText').text("定额消耗只能输入数值!");
-                            args.sheet.options.isProtected = true;
                             $('#alertModalCls').click(function () {
-                                args.sheet.options.isProtected = false;
                                 args.sheet.setValue(args.row, args.col, editGlj['consumeAmt']);
                             });
                             $('#alertModalCof').click(function () {
-                                args.sheet.options.isProtected = false;
                                 args.sheet.setValue(args.row, args.col, editGlj['consumeAmt']);
                             })
                         }
@@ -242,7 +234,9 @@ var rationGLJOprObj = {
                             args.sheet.setValue(args.row, args.col, parseNum);
                             let roundNum = me.round(parseNum, 3);
                             editGlj["consumeAmt"] = roundNum;
-                            me.updateRationItem();
+                            me.updateRationItem(function () {
+                                me.sheet.getParent().focus(true);
+                            });
                         }
                     }
                 }
@@ -261,7 +255,7 @@ var rationGLJOprObj = {
                     }
                     else {
                         if (args.row < cacheArr.length && args.editingText !== cacheArr[args.row].code) {//更新
-                            me.tempCacheArr.push(cacheArr[args.row]);
+                            me.tempCacheArr.push({org: cacheArr[args.row], newCode: args.editingText.toString().trim()});
                             cacheArr.splice(args.row, 1);
                             let rationRepId = storageUtil.getSessionCache("RationGrp", "repositoryID");
                             let gljLibID = storageUtil.getSessionCache("gljLib", "repositoryID_" + rationRepId);
@@ -280,6 +274,9 @@ var rationGLJOprObj = {
                         }
                     }
                 }
+                else {
+                    args.sheet.setValue(args.row, args.col, args.row < cacheArr.length ? cacheArr[args.row].code : '');
+                }
             }
         }
         else {
@@ -310,12 +307,12 @@ var rationGLJOprObj = {
                         callback: function(key, options) {
                         },
                         items: {
-                            /*"insert": {name: "插入", callback: function (key, opt) {
-                            }},*/
                             "delete": {name: "删除", icon: 'fa-remove', disabled: delDis, callback: function (key, opt) {
                                 cacheSection.splice(target.row, 1);
-                                me.updateRationItem();
-                                sheetCommonObj.cleanSheet(me.sheet, me.setting, -1);
+                                me.updateRationItem(function () {
+                                    me.sheet.getParent().focus(true);
+                                });
+                                sheetCommonObj.cleanData(me.sheet, me.setting, -1);
                                 me.showGljItems(me.currentRationItem.ID);
                             }}
                         }
@@ -327,10 +324,24 @@ var rationGLJOprObj = {
             }
         });
     },
-
+    getRecoveryArr: function (tempDelArr, newArr) {//获得更新的code不存在,恢复删除的被更新数据
+        let rst = [];
+        for(let i = 0, len = tempDelArr.length; i < len; i++){
+            let isExist = false;
+            for(let j = 0, jLen = newArr.length; j < jLen; j++){
+                if(tempDelArr[i].newCode == newArr[j].code){
+                    isExist = true;
+                    break;
+                }
+            }
+            if(!isExist){
+                rst.push(tempDelArr[i].org);
+            }
+        }
+        return rst;
+    },
     addGljItems: function(codes, repId, args) {
         var me = this;
-        sheetCommonObj.setLockCol(me.sheet, 0, true);
         $.ajax({
             type:"POST",
             url:"api/getGljItemsByCodes",
@@ -339,10 +350,8 @@ var rationGLJOprObj = {
             cache:false,
             timeout:5000,
             success:function(result){
-                //sheetCommonObj.cleanSheet(me.sheet, me.setting, -1);
                 if (result) {
                     if(result.data.length > 0){
-                        //sheetCommonObj.cleanSheet(me.sheet, me.setting, -1);
                         sheetCommonObj.cleanData(me.sheet, me.setting, -1);
                         var rstArr = [], dummyR = {gljId: 0, consumeAmt:0}, newAddArr = [];
                         for (var i = 0; i < result.data.length; i++) {
@@ -364,6 +373,10 @@ var rationGLJOprObj = {
                                 }
                             }
                             me.cache["_GLJ_" + me.currentRationItem.ID] = cacheArr.concat(newAddArr);
+                            let recoveryArr = me.getRecoveryArr(me.tempCacheArr, result.data);
+                            if(recoveryArr.length > 0){
+                                me.cache["_GLJ_" + me.currentRationItem.ID] = me.cache["_GLJ_" + me.currentRationItem.ID].concat(recoveryArr);
+                            }
                             me.cache["_GLJ_" + me.currentRationItem.ID].sort(function(a, b) {
                                 var rst = 0;
                                 if (a.code > b.code) rst = 1
@@ -373,12 +386,17 @@ var rationGLJOprObj = {
                         }
                         me.showGljItems(me.currentRationItem.ID);
                         if (newAddArr.length > 0) {
-                            me.updateRationItem();
+                            me.updateRationItem(function () {
+                                me.sheet.getParent().focus(true);
+                            });
                         }
                     }
                     else{
                         let cacheArr = me.cache["_GLJ_" + me.currentRationItem.ID]?  me.cache["_GLJ_" + me.currentRationItem.ID] : [];
-                        me.cache["_GLJ_" + me.currentRationItem.ID] = cacheArr.concat(me.tempCacheArr);
+                        let recoveryArr = me.getRecoveryArr(me.tempCacheArr, []);
+                        if(recoveryArr.length > 0){
+                            me.cache["_GLJ_" + me.currentRationItem.ID] = cacheArr.concat(recoveryArr);
+                        }
                         //更新的工料机不存在
                         me.cache["_GLJ_" + me.currentRationItem.ID].sort(function(a, b) {
                             var rst = 0;
@@ -388,19 +406,14 @@ var rationGLJOprObj = {
                         });
                         $('#alertModalBtn').click();
                         $('#alertText').text("工料机"+ codes + "不存在,请查找你所需要的工料机,或新增工料机");
-                        me.sheet.options.isProtected = true;
                         $('#alertModalCls').click(function () {
-                            sheetCommonObj.lockCells(me.sheet, me.setting);
                             me.showGljItems(me.currentRationItem.ID);
                         });
                         $('#alertModalCof').click(function () {
-                            sheetCommonObj.lockCells(me.sheet, me.setting);
                             me.showGljItems(me.currentRationItem.ID);
                         })
                     }
                 }
-                sheetCommonObj.lockCells(me.sheet, me.setting);
-                sheetCommonObj.setLockCol(me.sheet, 0, false);
             },
             error:function(err){
                 alert(err);
@@ -460,7 +473,7 @@ var rationGLJOprObj = {
         }
         return rst;
     },
-    updateRationItem: function() {
+    updateRationItem: function(callback) {
         var me = this, updateArr = [];
         if (me.currentRationItem) {
             me.currentRationItem.rationGljList = me.buildRationItemGlj();
@@ -471,7 +484,9 @@ var rationGLJOprObj = {
             me.currentRationItem.machinePrice = price.machinePrice;
             me.currentRationItem.basePrice = price.rationBasePrc;
             updateArr.push(me.currentRationItem);
-            rationOprObj.mixUpdateRequest(updateArr, [], []);
+            rationOprObj.mixUpdateRequest(updateArr, [], [], function () {
+                if(callback) callback();
+            });
         }
     },
 
@@ -503,69 +518,59 @@ var rationGLJOprObj = {
         me.currentRationItem = rationItem;
         if (me.cache["_GLJ_" + rationID]) {
             me.showGljItems(rationID);
-            sheetCommonObj.lockCells(me.sheet, me.setting);
         } else {
             var gljIds = [];
             for (var i = 0; i < rationGljList.length; i++) {
                 gljIds.push(rationGljList[i].gljId);
             }
-            $.ajax({
-                type:"POST",
-                url:"api/getGljItemsByIds",
-                data:{"gljIds": JSON.stringify(gljIds)},
-                dataType:"json",
-                cache:false,
-                timeout:5000,
-                success:function(result){
-                    sheetCommonObj.cleanSheet(me.sheet, me.setting, -1);
-                    if (result) {
-                        var cacheArr = [];
-                        for (var i = 0; i < result.data.length; i++) {
-                            for (var j = 0; j < rationGljList.length; j++) {
-                                if (rationGljList[j].gljId == result.data[i].ID) {
-                                    cacheArr.push(me.createRationGljDisplayItem(rationGljList[j], result.data[i]));
-                                    break;
+                $.ajax({
+                    type:"POST",
+                    url:"api/getGljItemsByIds",
+                    data:{"gljIds": JSON.stringify(gljIds)},
+                    dataType:"json",
+                    cache:false,
+                    timeout:5000,
+                    success:function(result){
+                        sheetCommonObj.cleanSheet(me.sheet, me.setting, -1);
+                        if (result) {
+                            var cacheArr = [];
+                            for (var i = 0; i < result.data.length; i++) {
+                                for (var j = 0; j < rationGljList.length; j++) {
+                                    if (rationGljList[j].gljId == result.data[i].ID) {
+                                        cacheArr.push(me.createRationGljDisplayItem(rationGljList[j], result.data[i]));
+                                        break;
+                                    }
                                 }
                             }
-                        }
-                        function compare(){
-                            return function (a, b) {
-                                let rst = 0;
-                                if (a.code > b.code) {
-                                    rst = 1;
-                                }
-                                else if (a.code < b.code) {
-                                    rst = -1;
+                            function compare(){
+                                return function (a, b) {
+                                    let rst = 0;
+                                    if (a.code > b.code) {
+                                        rst = 1;
+                                    }
+                                    else if (a.code < b.code) {
+                                        rst = -1;
+                                    }
+                                    return rst;
                                 }
-                                return rst;
                             }
+                            cacheArr.sort(compare());
+                            me.cache["_GLJ_" + rationID] = cacheArr;
+                            me.showGljItems(rationID);
                         }
-                        cacheArr.sort(compare());
-                        me.cache["_GLJ_" + rationID] = cacheArr;
-                        me.showGljItems(rationID);
+                        if(callback) callback();
+                    },
+                    error:function(err){
+                        alert(err);
                     }
-                    sheetCommonObj.lockCells(me.sheet, me.setting);
-                    callback();
-                },
-                error:function(err){
-                    alert(err);
-                }
-            })
+                })
         }
     },
     showGljItems: function(rationID) {
         var me = this;
         if (me.cache["_GLJ_" + rationID]) {
             sheetCommonObj.cleanData(me.sheet, me.setting, -1);
-            sheetCommonObj.showData(me.sheet, me.setting, me.cache["_GLJ_" + rationID], me.distTypeTree);
-            //lock
-            me.sheet.suspendPaint();
-            me.sheet.suspendEvent();
-            for(let i = 0, len = me.sheet.getRowCount(); i < len; i++){
-                me.sheet.getCell(i, 4).locked(true);
-            }
-            me.sheet.resumePaint();
-            me.sheet.resumeEvent();
+            sheetsOprObj.showData(me.sheet, me.setting, me.cache["_GLJ_" + rationID], me.distTypeTree);
         }
     }
 }

+ 15 - 140
web/maintain/ration_repository/js/repository_glj.js

@@ -51,7 +51,7 @@ repositoryGljObj = {
         header:[
             {headerName:"编码",headerWidth:120,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
             {headerName:"名称",headerWidth:260,dataCode:"name", dataType: "String", hAlign: "left", vAlign: "center"},
-            {headerName:"规格",headerWidth:260,dataCode:"specs", dataType: "String", hAlign: "left", vAlign: "center"},
+            {headerName:"规格型号",headerWidth:260,dataCode:"specs", dataType: "String", hAlign: "left", vAlign: "center"},
             {headerName:"单位",headerWidth:120,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
             {headerName:"基价单价",headerWidth:120,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
             {headerName:"类型",headerWidth:120,dataCode:"gljType", dataType: "String", hAlign: "center", vAlign: "center"}
@@ -91,17 +91,11 @@ repositoryGljObj = {
             }
         });
         distTypeTree.distTypesArr.forEach(function (distTypeObj) {
-            /*if(distTypeObj.children.length === 0 && distTypeObj.data.fullName !== '普通机械' &&distTypeObj.data.fullName !== '机械组成物'
-             && distTypeObj.data.fullName !== '机上人工'){
-             distTypeTree.comboDatas.push({text: distTypeObj.data.fullName, value: distTypeObj.data.ID});
-             }*/
             if(distTypeObj.data.fullName !== '材料'){
                 distTypeTree.comboDatas.push({text: distTypeObj.data.fullName, value: distTypeObj.data.ID});
             }
         });
-        //me.distTypeTree = distTypeTree;
         return distTypeTree;
-        //return distTypeTree.comboDatas;
     },
     getGljDistType: function (callback) {
         let me = this;
@@ -112,9 +106,9 @@ repositoryGljObj = {
             success: function (result) {
                 if(!result.error && callback){
                     me.distTypeTree = me.getComboData(result.data);
-                    let combo = new GC.Spread.Sheets.CellTypes.ComboBox();
-                    combo.items(me.distTypeTree.comboDatas).editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.text);
-                    me.workBook.getSheet(0).getCell(-1, 5, GC.Spread.Sheets.SheetArea.viewport).cellType(combo).value(me.distTypeTree.comboDatas[0].text);
+                    /*let combo = new GC.Spread.Sheets.CellTypes.ComboBox();
+                    combo.items(me.distTypeTree.comboDatas).editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.text);*/
+                    me.workBook.getSheet(0).getCell(-1, 5, GC.Spread.Sheets.SheetArea.viewport).value(me.distTypeTree.comboDatas[0].text);
                     callback();
                 }
             }
@@ -186,7 +180,7 @@ repositoryGljObj = {
                 }
             }
             sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
-            sheetCommonObj.showData(me.workBook.getSheet(0), me.setting, cacheSection, me.distTypeTree);
+            sheetsOprObj.showData(me.workBook.getSheet(0), me.setting, cacheSection, me.distTypeTree);
 
             cacheSection = null;
         }
@@ -247,19 +241,19 @@ repositoryGljObj = {
                     $('#aleCanceBtn').click(function () {
                         // me.workBook.getSheet(0).options.isProtected = false;
                         sheetCommonObj.unLockAllCells(args.sheet);
-                        sheetCommonObj.reLockSomeCodes(args.sheet, 0, repositoryGljObj.currentCache.length);
+                        sheetsOprObj.reLockSomeCodes(args.sheet, 0, repositoryGljObj.currentCache.length);
                         me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
                     });
                     $('#gljAleClose').click(function () {
                         // me.workBook.getSheet(0).options.isProtected = false;
                         sheetCommonObj.unLockAllCells(args.sheet);
-                        sheetCommonObj.reLockSomeCodes(args.sheet, 0, repositoryGljObj.currentCache.length);
+                        sheetsOprObj.reLockSomeCodes(args.sheet, 0, repositoryGljObj.currentCache.length);
                         me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
                     });
                     $('#aleConfBtn').click(function () {
                         // me.workBook.getSheet(0).options.isProtected = false;
                         sheetCommonObj.unLockAllCells(args.sheet);
-                        sheetCommonObj.reLockSomeCodes(args.sheet, 0, repositoryGljObj.currentCache.length);
+                        sheetsOprObj.reLockSomeCodes(args.sheet, 0, repositoryGljObj.currentCache.length);
                         me.addGljObj = null;
                         for(let col=0; col<me.setting.header.length; col++){
                             let field = me.setting.header[col].dataCode;
@@ -279,7 +273,7 @@ repositoryGljObj = {
     },
     onCellEditStart: function(sender, args) {
         var me = repositoryGljObj;
-        var rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row);
+        var rObj = sheetsOprObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row);
         me.currentEditingGlj = rObj;
         me.orgCode = me.workBook.getSheet(0).getValue(args.row, 0);
         var cacheSection = me.gljList;
@@ -294,7 +288,7 @@ repositoryGljObj = {
         }
     },
     onCellEditEnd: function(sender, args) {
-        var me = repositoryGljObj, rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row, me),
+        var me = repositoryGljObj, rObj = sheetsOprObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row, me),
             updateArr = [], addArr = [], updateBasePrcArr = [];
         me.editingRowIdx = args.row;
         rObj.basePrice = rObj.basePrice ? rObj.basePrice : 0;
@@ -404,10 +398,10 @@ repositoryGljObj = {
                                 $('#codeAlertBtn').click();
                                 sheet.options.isProtected = true;
                                 $('#codAleConfBtn').click(function () {
-                                    sheetCommonObj.lockSomeCodes(sheet, 0, cacheSection.length);
+                                    sheetsOprObj.lockSomeCodes(sheet, 0, cacheSection.length);
                                 });
                                 $('#codAleClose').click(function () {
-                                    sheetCommonObj.lockSomeCodes(sheet, 0, cacheSection.length);
+                                    sheetsOprObj.lockSomeCodes(sheet, 0, cacheSection.length);
                                 });
                             }
                         }
@@ -442,13 +436,13 @@ repositoryGljObj = {
                     $('#codeAlertBtn').click();
                     sheet.options.isProtected = true;
                     $('#codAleConfBtn').click(function () {
-                        sheetCommonObj.lockSomeCodes(sheet, 0, cacheSection.length);
+                        sheetsOprObj.lockSomeCodes(sheet, 0, cacheSection.length);
                         if(removeArr.length > 0){
                             me.mixUpdateRequest(updateArr, [], removeArr);
                         }
                     });
                     $('#codAleClose').click(function () {
-                        sheetCommonObj.lockSomeCodes(sheet, 0, cacheSection.length);
+                        sheetsOprObj.lockSomeCodes(sheet, 0, cacheSection.length);
                         me.mixUpdateRequest(updateArr, [], removeArr);
                     });
                 }
@@ -465,125 +459,6 @@ repositoryGljObj = {
         me.workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
         me.workBook.commandManager().setShortcutKey('repositoryGljDel', GC.Spread.Commands.Key.del, false, false, false, false);
     },
-    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++) {
-                    let 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);
-                }
-            }
-        }
-    },
     validUpdateObj: function (pasteObj, rowIdx) {
         let rst = {}, backUpObj = {},
             me = repositoryGljObj,
@@ -842,7 +717,7 @@ repositoryGljObj = {
                     else{
                         me.currentCache = me.getCache();
                         //sheetCommonObj.unLockAllCells(me.workBook.getSheet(0));
-                        sheetCommonObj.reLockSomeCodes(me.workBook.getSheet(0), 0, me.currentCache.length);
+                        sheetsOprObj.reLockSomeCodes(me.workBook.getSheet(0), 0, me.currentCache.length);
                         //sheetCommonObj.lockSomeCodes(me.workBook.getSheet(0), 0, me.currentCache.length);
                     }
                     me.showGljItems(me.gljList, me.gljCurTypeId);

+ 472 - 62
web/maintain/ration_repository/js/section_tree.js

@@ -19,19 +19,12 @@ var pageOprObj = {
             jobContentOprObj.radiosChange(jobContentOprObj.radios, jobContentOprObj.tableAll, jobContentOprObj.tablePartial);
             $('#addConBtn').click(jobContentOprObj.bindAddConBtn());
             $('#updateConBtn').click(jobContentOprObj.bindUpdateConBtn());
-            $('#txtareaAll').bind('change', function () {
-                let met = this;
-                let jobContent = $(met).val();
-                $(met).attr('disabled', true);
-                let updateCodes = [];
-                for(let i = 0, len = jobContentOprObj.currentRationItems.length; i < len; i++){
-                    updateCodes.push(jobContentOprObj.currentRationItems[i].code);
-                }
-                jobContentOprObj.updateJobContent(me.rationLibId, jobContentOprObj.getUpdateArr(updateCodes, jobContent), function () {
-                    $(met).attr('disabled', false);
-                    jobContentOprObj.currentJobContent = jobContent;
-                })
-            });
+            jobContentOprObj.bindAllEvents($('#txtareaAll'));
+            //fz
+            annotationOprObj.radiosChange(annotationOprObj.radios, annotationOprObj.fzTableAll, annotationOprObj.fzTablePartial);
+            $('#fzAddConBtn').click(annotationOprObj.bindAddConBtn());
+            $('#fzUpdateConBtn').click(annotationOprObj.bindUpdateConBtn());
+            annotationOprObj.bindAllEvents($('#fzTxtareaAll'));
         }
     }
 }
@@ -347,20 +340,30 @@ var zTreeOprObj = {
         explanatoryOprObj.setAttribute(explanatoryOprObj.currentTreeNode ? explanatoryOprObj.currentTreeNode : treeNode, treeNode, treeNode.explanation, treeNode.ruleText);
         explanatoryOprObj.clickUpdate($('#explanationShow'), $('#ruleTextShow'));
         explanatoryOprObj.showText($('#explanationShow'), $('#ruleTextShow'), treeNode.explanation, treeNode.ruleText);
+        //job
         jobContentOprObj.currentSituation = typeof treeNode.jobContentSituation !== 'undefined'? treeNode.jobContentSituation : jobContentOprObj.situations.NONE;
+        jobContentOprObj.setAttribute(jobContentOprObj.currentTreeNode ? jobContentOprObj.currentTreeNode : treeNode, treeNode);
+        jobContentOprObj.clickUpdate($('#txtareaAll'));
+        //fz
+        annotationOprObj.currentSituation = typeof treeNode.annotationSituation !== 'undefined'? treeNode.annotationSituation : annotationOprObj.situations.NONE;
+        annotationOprObj.clickUpdate($('#fzTxtareaAll'));
         var sectionID = treeNode.ID;
         if (!(treeNode.items) || treeNode.items.length == 0) {
-            jobContentOprObj.setRadiosDisabled(false, jobContentOprObj.radios);
+            rationOprObj.canRations = true;
             rationOprObj.workBook.getSheet(0).clearSelection();
             rationOprObj.getRationItems(sectionID);
         } else {
+            rationOprObj.canRations = false;
+            rationOprObj.currentSectionId = sectionID;
+            rationOprObj.workBook.getSheet(0).setRowCount(30);
+            sheetCommonObj.setDynamicCombo(rationOprObj.workBook.getSheet(0), 0, 2, rationOprObj.workBook.getSheet(0).getRowCount(), rationUnits, 10, false);
             jobContentOprObj.setRadiosDisabled(true, jobContentOprObj.radios);
             jobContentOprObj.hideTable($('#tableAll'), $('#tablePartial'));
+            annotationOprObj.setRadiosDisabled(true, annotationOprObj.radios);
+            annotationOprObj.hideTable($('#fzTableAll'), $('#fzTablePartial'));
             sheetCommonObj.cleanSheet(rationOprObj.workBook.getSheet(0), rationOprObj.setting, -1);
-            sheetCommonObj.shieldAllCells(rationOprObj.workBook.getSheet(0));
         }
         sheetCommonObj.cleanSheet(rationGLJOprObj.sheet, rationGLJOprObj.setting, -1);
-        sheetCommonObj.shieldAllCells(rationGLJOprObj.sheet);
         rationGLJOprObj.sheet.getParent().focus(false);
     }
 };
@@ -459,8 +462,10 @@ let explanatoryOprObj = {
 
 //工作内容
 let jobContentOprObj = {
-    situations: {ALL: 'ALL', PARTIAL: 'PARTIAL', NONE: 'NONE'},//所有ALL(包括未定义本项工作内容)、部分PARTIA,不可用NONE(非章节树最底层节点时)
+    situations: {ALL: 'ALL', PARTIAL: 'PARTIAL', NONE: 'NONE'},//所有ALL(包括未定义本项工作内容)、部分PARTIA,不可用NONE(无定额时)
     currentSituation: null,//本项适用情况
+    currentTreeNode: null,
+    preTreeNode: null,
     radios: $("input[name = 'optionsRadios']"),
     tableAll: $('#tableAll'),
     tablePartial: $('#tablePartial'),
@@ -469,21 +474,32 @@ let jobContentOprObj = {
     currentRationItems: null,
     addCon: $('#addCon'),//勾选编码模态框
     updateCon: $('#updateCon'),//编辑编码模态框
-    //获取本项适用情况
-    getSituation: function (rationItems) {
-        let me = this;
-        let rst = me.situations.ALL;
-        if(rationItems.length > 1){
-            for(let i = 0, len = rationItems.length; i < len; i++){
-                for(let j = i + 1, len = rationItems.length; j < len; j++){
-                    if(typeof rationItems[i].jobContent !== 'undefined' && rationItems[i].jobContent !== rationItems[j].jobContent){
-                        rst = me.situations.PARTIAL;
-                        break;
-                    }
+    setAttribute: function (preNode, currentNode) {
+        let me = jobContentOprObj;
+        me.preTreeNode = preNode;
+        me.currentTreeNode = currentNode;
+    },
+    clickUpdate: function (txtarea) {//解决编辑完后在未失去焦点的时候直接定额章节树
+        let me = jobContentOprObj;
+        if(txtarea.is(':focus')){
+            let jobContent = txtarea.val();
+            if(jobContent !== me.currentJobContent){
+                me.preTreeNode.jobContent = jobContent;
+                me.unbindEvents(txtarea);
+                txtarea.blur();
+                let updateCodes = [];
+                for(let i = 0, len = me.currentRationItems.length; i < len; i++){
+                    updateCodes.push(me.currentRationItems[i].code);
+                    me.currentRationItems[i].jobContent = jobContent;
                 }
+                me.updateJobContent(pageOprObj.rationLibId, me.getUpdateArr(updateCodes, jobContent), function () {
+                    me.bindAllEvents(txtarea);
+                })
+            }
+            else {
+                txtarea.blur();
             }
         }
-        return rst;
     },
     getGroup: function (rationItems) {
         let rst = [];//rst = [{jobContent: String, items: Array}]
@@ -584,21 +600,6 @@ let jobContentOprObj = {
         let me = jobContentOprObj;
         me.buildEditableCodesCon(me.currentRationItems, me.updateCon, me.getUpdateCodes(obj));
     },
-    //更新显示的编码table
-    updateCodesTable: function (table, codes) {
-        let me = jobContentOprObj;
-        table.empty();
-        table.append("<a href data-toggle='modal' data-target='#editBianmaQ' class='m-0'>编辑编码</a>");
-        table.children().bind('click', function (){
-            me.currentOprTr = table.parent();
-            me.currentJobContent = $(me.currentOprTr.children()[2]).children().val();
-            me.onclickFuncEdit($(this));
-        });
-        for(let i = 0, len = codes.length; i < len; i++){
-            let $p = $("<p class='m-0'>" + codes[i] + "</p>");
-            table.append($p[0]);
-        }
-    },
     //获取编码td中的编码
     getUpdateCodes: function (jq) {
         let rst = [];
@@ -691,7 +692,7 @@ let jobContentOprObj = {
             radios[0].checked = true;
             radios[1].checked = false;
             $('#txtareaAll').val(me.currentRationItems.length > 0 ? me.currentRationItems[0].jobContent : '');
-            me.currentJobContent = me.currentRationItems[0].jobContent;
+            me.currentJobContent = me.currentRationItems.length > 0 ? me.currentRationItems[0].jobContent : '';
             me.tableAll.show();
             me.tablePartial.hide();
         }
@@ -746,21 +747,6 @@ let jobContentOprObj = {
             });
         });
     },
-    sortRationItems: function (rationItems, field) {
-        rationItems.sort(function (a, b) {
-            let rst = 0;
-            if(a[field] > b[field]){
-                rst = 1;
-            }
-            else if (a[field] < b[field]){
-                rst = -1;
-            }
-            return rst;
-        });
-    },
-    addCodeNode: function (container, codeNode) {
-        container.append(codeNode);
-    },
     setTextareaHeight: function (textarea, nodesCount) {
         const perHeight = 21.6;
         textarea.height(nodesCount * 21.6);
@@ -777,12 +763,30 @@ let jobContentOprObj = {
             });
         });
     },
-    unbindEvetns: function (txtarea) {
+    bindAllEvents: function (txtarea) {
+        let me = jobContentOprObj;
+        txtarea.bind('change', function () {
+            let met = this;
+            let jobContent = $(met).val();
+            $(met).attr('disabled', true);
+            let updateCodes = [];
+            for(let i = 0, len = me.currentRationItems.length; i < len; i++){
+                updateCodes.push(me.currentRationItems[i].code);
+                me.currentRationItems[i].jobContent = jobContent;
+            }
+            me.currentJobContent = jobContent;
+            me.updateJobContent(pageOprObj.rationLibId, me.getUpdateArr(updateCodes, jobContent), function () {
+                $(met).attr('disabled', false);
+            });
+        });
+    },
+    unbindEvents: function (txtarea) {
         txtarea.unbind();
     },
     //定额工作内容相关操作
     rationJobContentOpr: function (rationItems) {
         let me = jobContentOprObj;
+        me.setRadiosDisabled(me.currentRationItems.length > 0 ? false : true, me.radios);
         me.setRadiosChecked(me.currentSituation, me.radios);
         me.buildTablePartial(me.tablePartial, me.getGroup(rationItems));
     },
@@ -844,7 +848,7 @@ let jobContentOprObj = {
             dataType: 'json',
             success: function (result) {
                 if(!result.error){
-                    me.updateRationItem(me.currentRationItems, updateArr);
+                    me.updateRationItem(jobContentOprObj.currentRationItems, updateArr);
                     callback();
                 }
             }
@@ -859,9 +863,415 @@ let jobContentOprObj = {
             dataType: 'json',
             success: function (result) {
                 if(!result.error){
+                    if(callback){
+                        callback();
+                    }
+                }
+            }
+        })
+    }
+};
+
+let annotationOprObj = {
+    situations: {ALL: 'ALL', PARTIAL: 'PARTIAL', NONE: 'NONE'},
+    currentSituation: null,//本项适用情况
+    radios: $("input[name = 'fzRadios']"),
+    fzTableAll: $('#fzTableAll'),
+    fzTablePartial: $('#fzTablePartial'),
+    currentOprTr: null,
+    currentAnnotation: null,
+    addCon: $('#fzAddCon'),//勾选编码模态框
+    updateCon: $('#fzUpdateCon'),//编辑编码模态框
+    clickUpdate: function (txtarea) {//解决编辑完后在未失去焦点的时候直接定额章节树
+        let me = annotationOprObj;
+        if(txtarea.is(':focus')){
+            let annotation = txtarea.val();
+            if(annotation !== me.currentAnnotation){
+                jobContentOprObj.preTreeNode.annotation = annotation;
+                me.unbindEvents(txtarea);
+                txtarea.blur();
+                let updateCodes = [];
+                for(let i = 0, len = jobContentOprObj.currentRationItems.length; i < len; i++){
+                    updateCodes.push(jobContentOprObj.currentRationItems[i].code);
+                    jobContentOprObj.currentRationItems[i].annotation = annotation;
+                }
+                me.updateAnnotation(pageOprObj.rationLibId, me.getUpdateArr(updateCodes, annotation), function () {
+                    me.bindAllEvents(txtarea);
+                });
+            }
+            else {
+                txtarea.blur();
+            }
+        }
+    },
+    getGroup: function (rationItems) {
+        let rst = [];//rst = [{jobContent: String, items: Array}]
+        for(let i = 0, len = rationItems.length; i < len; i++){
+            if(typeof rationItems[i].annotation !== 'undefined' && rationItems[i].annotation.toString().trim().length > 0){
+                let isExist = false;
+                for(let j = 0, jLen = rst.length; j < jLen; j++){
+                    if(rst[j].annotation === rationItems[i].annotation){
+                        isExist = true;
+                        rst[j].items.push(rationItems[i].code);
+                        break;
+                    }
+                }
+                if(!isExist){
+                    rst.push({annotation: rationItems[i].annotation, items: [rationItems[i].code]});
+                }
+            }
+        }
+        return rst;
+    },
+    hideTable: function (tableAll, tablePartial) {
+        if(tableAll){
+            tableAll.hide();
+        }
+        if(tablePartial){
+            tablePartial.hide();
+        }
+    },
+    //建table
+    buildTablePartial: function (table, group) {
+        let me = annotationOprObj;
+        table.empty();
+        let $thead = $("<thead><tr><th></th><th>编码</th><th>附注</th>/tr></thead>");
+        let $tbody = $("<tbody></tbody>");
+        let count = 1;
+        for(let i = 0, len = group.length; i < len; i++){
+            let $newTr = me.getNewTr($tbody, group[i].items, group[i].annotation);
+            $tbody.append($newTr);
+            count++;
+        }
+        let $trEnd = $("<tr><td>"+ count +"</td><td><a href data-toggle='modal' data-target='#fzEditBianma' class='m-0'>点击勾选编码</a></td><td><textarea class='form-control'></textarea></td></tr>");//勾选行
+        $($trEnd.children().children()[0]).bind('click', function () {
+            me.onclickFuncAdd($(this));
+            me.currentOprTr = $trEnd;
+            me.currentAnnotation = $(me.currentOprTr.children()[2]).children().val();
+        });
+        $tbody.append($trEnd);
+        table.append($thead);
+        table.append($tbody);
+    },
+    //新增一行tr
+    getNewTr: function (tbody, codes, jobContent) {
+        let me = annotationOprObj;
+        let count = tbody.children().length > 0 ? tbody.children().length : 1;
+        let $textTd = $("<td></td>");
+        let $textarea = $("<textarea class='form-control'></textarea>");
+        $textarea.val(jobContent);
+        $textTd.append($textarea);
+        let $tr = $("<tr><td>" + count + "</td><td><a href data-toggle='modal' data-target='#fzEditBianmaQ' class='m-0'>编辑编码</a></td></tr>");
+        $tr.children().children().bind('click', function () {
+            me.currentOprTr = $tr;
+            me.currentAnnotation = $(me.currentOprTr.children()[2]).children().val();
+            me.onclickFuncEdit($(this));
+        });
+        //文本变化;
+        $textarea.bind('change', function () {
+            let codes = me.getUpdateCodes($($(this).parent().parent().children()[1]).children());
+            let annotation = $(this).val();
+            me.updateAnnotation(pageOprObj.rationLibId, me.getUpdateArr(codes, annotation), function () {
+                if(annotation.trim().length === 0){
+                    me.buildTablePartial(me.fzTablePartial, me.getGroup(jobContentOprObj.currentRationItems));
+                }
+            });
+        });
+        $tr.append($textTd);
+        for(let i = 0, len = codes.length; i < len; i ++){
+            let $p = $("<p class='m-0'>" + codes[i] + "</p>");
+            $tr.children()[1].append($p[0]);
+        }
+        me.setTextareaHeight($textarea, codes.length + 1);
+        return $tr[0];
+    },
+    onclickFuncAdd: function (obj) {
+        let me = annotationOprObj;
+        let txtarea = $(obj.parent().parent().children().children()[1]);
+        let annotation = txtarea.val();
+        if(annotation.trim().length > 0){
+            let codesObj = me.getAddCodes(jobContentOprObj.currentRationItems);
+            me.buildCheckCodesCon(me.addCon, codesObj.checkedCodes, codesObj.disabledCodes)
+            obj.attr('data-target', '#fzEditBianma');
+        }
+        else{
+            obj.attr('data-target', '');
+            alert("附注不能为空!");
+        }
+    },
+    onclickFuncEdit: function (obj) {
+        let me = annotationOprObj;
+        me.buildEditableCodesCon(jobContentOprObj.currentRationItems, me.updateCon, me.getUpdateCodes(obj));
+    },
+    //获取编码td中的编码
+    getUpdateCodes: function (jq) {
+        let rst = [];
+        let nodes = jq.parent().children();
+        for(let i = 1, len = nodes.length; i < len; i++){
+            rst.push(nodes[i].textContent);
+        }
+        return rst;
+    },
+    //建一个编码checkbox Div
+    buildCodeOption: function (code, attr) {
+        let $div = $("<div class='col'><label class='form-check-label'><input class='form-check-input' type='checkbox' value= "+ code +"> "+ code +"</label></div>");
+        let $checkBox = $div.children().children();
+        if(attr){
+            $checkBox.attr(attr, true);
+        }
+        return $div;
+    },
+    //建修改编码弹窗
+    buildEditableCodesCon: function (rationItems, container, codes) {
+        let me = annotationOprObj;
+        let codeDivs = [];
+        container.empty();
+        for(let i = 0, len = codes.length; i < len; i++){
+            codeDivs.push({code: codes[i], attr: 'checked'});
+        }
+        for(let i = 0, len = rationItems.length; i < len; i++){
+            if(codes.indexOf(rationItems[i].code) === -1){
+                if(typeof rationItems[i].annotation !== 'undefined' && rationItems[i].annotation.toString().trim().length > 0){
+                    codeDivs.push({code: rationItems[i].code, attr: 'disabled'});
+                }
+                else{
+                    codeDivs.push({code: rationItems[i].code, attr: ''});
+                }
+            }
+        }
+        //排序
+        codeDivs.sort(function (a, b) {
+            let rst = 0;
+            if(a.code > b.code) rst = 1;
+            else if(a.code < b.code) rst = -1;
+            return rst;
+        });
+        for(let i = 0, len = codeDivs.length; i < len; i++){
+            container.append(me.buildCodeOption(codeDivs[i].code, codeDivs[i].attr));
+        }
+    },
+    //建勾选编码弹窗
+    buildCheckCodesCon: function (container, checkedCodes, disabledCodes) {
+        let me = annotationOprObj;
+        container.empty();
+        for(let i = 0, len = checkedCodes.length; i < len; i++){
+            let $codeDiv = me.buildCodeOption(checkedCodes[i], 'checked');
+            container.append($codeDiv);
+        }
+        for(let i = 0, len = disabledCodes.length; i < len; i++){
+            let $codeDiv = me.buildCodeOption(disabledCodes[i], 'disabled');
+            container.append($codeDiv);
+        }
+    },
+    getAddCodes: function (rationItems) {
+        let me = annotationOprObj;
+        let rst = {checkedCodes: [], disabledCodes: []};
+        for(let i = 0, len = rationItems.length; i < len; i++){
+            if(typeof rationItems[i].annotation !== 'undefined' && rationItems[i].annotation.toString().trim().length > 0){
+                rst.disabledCodes.push(rationItems[i].code);
+            }
+            else{
+                rst.checkedCodes.push(rationItems[i].code);
+            }
+        }
+        return rst;
+    },
+    //获取选择后的编码窗口的编码及状态
+    getCodesAfterS: function (checkNodes) {
+        let rst = {checked: [], unchecked: []};
+        for(let i = 0, len = checkNodes.length; i < len; i++){
+            if(checkNodes[i].checked){
+                rst.checked.push(checkNodes[i].value);
+            }
+            else if(!checkNodes[i].checked && !checkNodes[i].disabled){
+                rst.unchecked.push(checkNodes[i].value);
+            }
+        }
+        return rst;
+    },
+    setRadiosChecked: function (situation, radios) {
+        let me = annotationOprObj;
+        if(situation === me.situations.ALL){
+            radios[0].checked = true;
+            radios[1].checked = false;
+            $('#fzTxtareaAll').val(jobContentOprObj.currentRationItems.length > 0 ? jobContentOprObj.currentRationItems[0].annotation : '');
+            me.currentAnnotation = jobContentOprObj.currentRationItems.length > 0 ? jobContentOprObj.currentRationItems[0].annotation : '';
+            me.fzTableAll.show();
+            me.fzTablePartial.hide();
+        }
+        else if(situation === me.situations.PARTIAL){
+            radios[0].checked = false;
+            radios[1].checked = true;
+            me.fzTableAll.hide();
+            me.fzTablePartial.show();
+        }
+        else if(situation === me.situations.NONE){
+            radios[0].checked = false;
+            radios[1].checked = false;
+            me.fzTableAll.hide();
+            me.fzTablePartial.hide();
+        }
+    },
+    //radios是否可用,只有在定额章节树的底层节点才可用
+    setRadiosDisabled: function (val, radios) {
+        let me =annotationOprObj;
+        if(val){
+            radios[0].checked = false;
+            radios[1].checked = false;
+            me.currentSituation = me.situations.NONE;
+        }
+        radios.attr('disabled', val);
+    },
+    radiosChange: function (radios, tableAll, tablePartial) {
+        let me = annotationOprObj;
+        radios.change(function () {
+            let val = $("input[name = 'fzRadios']:checked").val();
+            let selectedNode = zTreeOprObj.treeObj.getSelectedNodes()[0];
+            me.updateAnnoSituation(pageOprObj.rationLibId, selectedNode.ID, val, function () {
+                selectedNode.annotationSituation = val;
+                me.currentSituation = val;
+                if(val === me.situations.ALL){
+                    let updateCodes = [];
+                    for(let i = 0, len = jobContentOprObj.currentRationItems.length; i < len; i++){
+                        updateCodes.push(jobContentOprObj.currentRationItems[i].code);
+                    }
+                    me.updateAnnotation(pageOprObj.rationLibId, me.getUpdateArr(updateCodes, ''), function () {
+                        me.currentAnnotation = '';
+                        $('#fzTxtareaAll').val('');
+                        tableAll.show();
+                        tablePartial.hide();
+                    });
+                }
+                else{
+                    me.buildTablePartial(me.fzTablePartial, me.getGroup(jobContentOprObj.currentRationItems));
+                    tableAll.hide();
+                    tablePartial.show();
+                }
+            });
+        });
+    },
+    setTextareaHeight: function (textarea, nodesCount) {
+        const perHeight = 21.6;
+        textarea.height(nodesCount * 21.6);
+    },
+    bindEvents: function (txtarea) {
+        let me = annotationOprObj;
+        txtarea.bind('change', function () {
+            let annotation = txtarea.val();
+            let jqNodes = txtarea.parent().parent().children()[1].children;
+            let updateCodes = me.getUpdateCodes(jqNodes);
+            txtarea.attr('disabled', true);
+            me.updateAnnotation(pageOprObj.rationLibId, me.getUpdateArr(updateCodes, annotation), function () {
+                txtarea.attr('disabled', false);
+            });
+        });
+    },
+    bindAllEvents: function (txtarea) {
+        let me = annotationOprObj;
+        txtarea.bind('change', function () {
+            let met = this;
+            let annotation = $(met).val();
+            $(met).attr('disabled', true);
+            let updateCodes = [];
+            for(let i = 0, len = jobContentOprObj.currentRationItems.length; i < len; i++){
+                updateCodes.push(jobContentOprObj.currentRationItems[i].code);
+                jobContentOprObj.currentRationItems[i].annotation = annotation;
+            }
+            me.currentAnnotation = annotation;
+            me.updateAnnotation(pageOprObj.rationLibId, me.getUpdateArr(updateCodes, annotation), function () {
+                $(met).attr('disabled', false);
+            });
+        });
+    },
+    unbindEvents: function (txtarea) {
+        txtarea.unbind();
+    },
+    //定额工作内容相关操作
+    rationAnnotationOpr: function (rationItems) {
+        let me = annotationOprObj;
+        me.setRadiosDisabled(rationItems.length > 0 ? false : true, me.radios);
+        me.setRadiosChecked(me.currentSituation, me.radios);
+        me.buildTablePartial(me.fzTablePartial, me.getGroup(rationItems));
+    },
+    getUpdateArr: function (updateCodes, annotation) {
+        let rst = [];
+        for(let i = 0, len = updateCodes.length; i < len; i++){
+            rst.push({code: updateCodes[i], annotation: annotation});
+        }
+        return rst;
+    },
+    bindAddConBtn: function () {
+        let me = annotationOprObj;
+        return function () {
+            let codesObj = me.getCodesAfterS(me.addCon.children().children().children());
+            let $tbody = $('#fzTablePartial tbody');
+            let lastEle = $tbody[0].lastElementChild;
+            let txtare = lastEle.lastElementChild.children[0];
+            if(me.currentAnnotation.trim().length > 0){//工作内容不为空才可添加编码
+                let updateArr = me.getUpdateArr(codesObj.checked, me.currentAnnotation);
+                me.updateAnnotation(pageOprObj.rationLibId, updateArr, function () {
+                    me.buildTablePartial(me.fzTablePartial, me.getGroup(jobContentOprObj.currentRationItems));
+                    $(txtare).val('');
+                });
+            }
+            else{
+                alert("附注不能为空!");
+            }
+        }
+    },
+    bindUpdateConBtn: function () {
+        let me = annotationOprObj;
+        return function () {
+            let codesObj = me.getCodesAfterS(me.updateCon.children().children().children());
+            let updateC = me.getUpdateArr(codesObj.checked, me.currentAnnotation),
+                updateUnC = me.getUpdateArr(codesObj.unchecked, ''),
+                updateArr = updateC.concat(updateUnC);
+            me.updateAnnotation(pageOprObj.rationLibId, updateArr, function () {
+                me.buildTablePartial(me.fzTablePartial, me.getGroup(jobContentOprObj.currentRationItems));
+            });
+        }
+    },
+    //更新缓存的定额
+    updateRationItem: function (rationItems, updateArr) {
+        for(let i = 0, len = rationItems.length; i < len; i++){
+            for(let j = 0, jLen = updateArr.length; j < jLen; j++){
+                if(rationItems[i].code === updateArr[j].code){
+                    rationItems[i].annotation = updateArr[j].annotation;
+                    break;
+                }
+            }
+        }
+    },
+    updateAnnotation: function (repId, updateArr, callback){
+        let me = annotationOprObj;
+        $.ajax({
+            type: 'post',
+            url: 'api/updateAnnotation',
+            data: {lastOpr: userAccount, repId: repId, updateArr: JSON.stringify(updateArr)},
+            dataType: 'json',
+            success: function (result) {
+                if(!result.error){
+                    me.updateRationItem(jobContentOprObj.currentRationItems, updateArr);
                     callback();
                 }
             }
+        });
+    },
+    updateAnnoSituation: function (repId, nodeId, situation, callback) {
+        let me = annotationOprObj;
+        $.ajax({
+            type: 'post',
+            url: 'api/updateAnnoSituation',
+            data: {lastOpr: userAccount, repId: repId, nodeId: nodeId, situation: situation},
+            dataType: 'json',
+            success: function (result) {
+                if(!result.error){
+                    if(callback){
+                        callback();
+                    }
+                }
+            }
         })
     }
+
 };

+ 202 - 0
web/maintain/ration_repository/js/sheetsOpr.js

@@ -0,0 +1,202 @@
+/**
+ * Created by Zhong on 2017/9/29.
+ */
+let sheetsOprObj = {
+    setAreaAlign: function(area, hAlign, vAlign){
+        if (!(hAlign) || hAlign === "left") {
+            area.hAlign(GC.Spread.Sheets.HorizontalAlign.left);
+        } else if (hAlign === "right") {
+            area.hAlign(GC.Spread.Sheets.HorizontalAlign.right);
+        } else if (hAlign === "center") {
+            area.hAlign(GC.Spread.Sheets.HorizontalAlign.center);
+        } else {
+            area.hAlign(GC.Spread.Sheets.HorizontalAlign.left);
+        }
+        if (!(vAlign) || vAlign === "center") {
+            area.vAlign(GC.Spread.Sheets.VerticalAlign.center);
+        } else if (vAlign === "top") {
+            area.vAlign(GC.Spread.Sheets.VerticalAlign.top);
+        } else if (vAlign === "bottom") {
+            area.vAlign(GC.Spread.Sheets.VerticalAlign.bottom);
+        } else {
+            area.vAlign(GC.Spread.Sheets.VerticalAlign.center);
+        }
+    },
+    showData: function(sheet, setting, data, distTypeTree) {
+        var me = this, ch = GC.Spread.Sheets.SheetArea.viewport;
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        if(typeof setting.owner !== 'undefined' && setting.owner === 'gljComponent'){
+            sheet.setRowCount(data.length + 5);
+        }
+        else{
+            sheet.setRowCount(typeof repositoryGljObj !== 'undefined' && repositoryGljObj.currentOprParent === 1 ? data.length : data.length + 10);
+        }
+        /*if(data.length === 0){
+            for(let i = 0; i < sheet.getRowCount(); i++){
+                sheet.getCell(i, 4, GC.Spread.Sheets.SheetArea.viewport).locked(false);
+            }
+        }*/
+        for (var col = 0; col < setting.header.length; col++) {
+            var hAlign = "left", vAlign = "center";
+            if (setting.header[col].hAlign) {
+                hAlign = setting.header[col].hAlign;
+            } else if (setting.header[col].dataType !== "String"){
+                hAlign = "right";
+            }
+            vAlign = setting.header[col].vAlign?setting.header[col].vAlign:vAlign;
+            me.setAreaAlign(sheet.getRange(-1, col, -1, 1), hAlign, vAlign);
+            if (setting.header[col].formatter) {
+                //var style = new GC.Spread.Sheets.Style();
+                //style.formatter = setting.header[col].formatter;
+                //sheet.setStyle(row,col,style,GC.Spread.Sheets.SheetArea.viewport);
+                sheet.setFormatter(-1, col, setting.header[col].formatter, GC.Spread.Sheets.SheetArea.viewport);
+            }
+            for (var row = 0; row < data.length; row++) {
+                //var cell = sheet.getCell(row, col, GC.Spread.Sheets.SheetArea.viewport);
+                if(setting.header[col].dataCode === 'gljType' && data[row].gljType){
+                   /* if(typeof repositoryGljObj !== 'undefined' && typeof repositoryGljObj.allowComponent !== 'undefined' && repositoryGljObj.allowComponent.indexOf(data[row].gljType) !== -1){
+                        sheet.getCell(row, 4, GC.Spread.Sheets.SheetArea.viewport).locked(true);
+                    }
+                    else if(typeof repositoryGljObj !== 'undefined' && typeof repositoryGljObj.allowComponent !== 'undefined' && repositoryGljObj.allowComponent.indexOf(data[row].gljType) === -1){
+                        sheet.getCell(row, 4, GC.Spread.Sheets.SheetArea.viewport).locked(false);
+                    }*/
+                    let distTypeVal =  distTypeTree.distTypes[distTypeTree.prefix + data[row].gljType].data.fullName;
+                    sheet.setValue(row, col, distTypeVal, ch);
+                }
+                else {
+                    sheet.setValue(row, col, data[row][setting.header[col].dataCode], ch);
+                    sheet.setTag(row, 0, data[row].ID, ch);
+                    /*if(typeof setting.owner !== 'undefined' && setting.owner !== 'gljComponent'){
+                        sheet.getCell(row, 0, GC.Spread.Sheets.SheetArea.viewport).locked(true);
+                    }*/
+                }
+            }
+          /*  for(let i = data.length; i < sheet.getRowCount(); i++){
+                sheet.getCell(i, 4, GC.Spread.Sheets.SheetArea.viewport).locked(false);
+            }*/
+        }
+        sheet.resumeEvent();
+        sheet.resumePaint();
+        //me.shieldAllCells(sheet);
+    },
+    combineRowData: function(sheet, setting, row, repositoryGljObj) {
+        let me = this;
+        var rst = {};
+        let comboBoxCellType = sheet.getCellType(row, 5);
+        let items = comboBoxCellType.items();
+        for (var col = 0; col < setting.header.length; col++) {
+            if(setting.header[col].dataCode === 'gljType'){
+                items.forEach(function(item){
+                    if(sheet.getValue(row, col) === item.text){
+                        rst[setting.header[col].dataCode] = item.value;
+                        if(repositoryGljObj){
+                            rst.shortName = repositoryGljObj.distTypeTree.distTypes[repositoryGljObj.distTypeTree.prefix + item.value].data.shortName;
+                        }
+                    }
+                });
+            }
+            else if (setting.header[col].dataCode === 'code'){
+                if(repositoryGljObj){
+                    let gljList = repositoryGljObj.gljList,
+                        orgCode = repositoryGljObj.orgCode,
+                        isExist = false;
+                    for(let i=0; i< gljList.length; i++){
+                        if(gljList[i].code === sheet.getValue(row, col) && sheet.getValue(row, col)!== orgCode){
+                           // sheetCommonObj.lockAllCells(sheet);
+                            $('#alertText').text("输入的编号已存在,请重新输入!");
+                            $('#codeAlertBtn').click();
+                            $('#codAleConfBtn').click(function () {
+                                // me.reLockSomeCodes(sheet, 0, repositoryGljObj.currentCache.length);
+                               // sheetCommonObj.unLockAllCells(sheet);
+                                //me.reLockSomeCodes(sheet, 0, repositoryGljObj.currentCache.length);
+                                sheet.setValue(row, 0, orgCode);
+                                sheet.getCell(row, 0).formatter("@");
+                                sheet.setActiveCell(row, 0);
+                            });
+                            $('#codAleClose').click(function () {
+                                //me.reLockSomeCodes(sheet, 0, repositoryGljObj.currentCache.length);
+                                //sheetCommonObj.unLockAllCells(sheet);
+                                //me.reLockSomeCodes(sheet, 0, repositoryGljObj.currentCache.length);
+                                sheet.setValue(row, 0, orgCode);
+                                sheet.getCell(row, 0).formatter("@");
+                                sheet.setActiveCell(row, 0);
+                            });
+                            // sheet.setValue(row, col, orgCode);
+                            isExist = true
+                        }
+                    }
+                    if(!isExist){
+                        rst[setting.header[col].dataCode] = sheet.getValue(row, col);
+                    }
+                }
+                else{
+                    rst[setting.header[col].dataCode] = sheet.getValue(row, col);
+                }
+            }
+            else{
+                rst[setting.header[col].dataCode] = sheet.getValue(row, col);
+            }
+        }
+        return rst;
+    },
+    combineRationRowData: function(sheet, setting, row) {
+        var rst = {};
+        for (var col = 0; col < setting.header.length; col++) {
+            rst[setting.header[col].dataCode] = sheet.getValue(row, col);
+        }
+        return rst;
+    },
+    reLockSomeCodes: function (sheet, beginRow, endRow) {
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        let defaultStyle = new GC.Spread.Sheets.Style();
+        defaultStyle.locked = false;
+        sheet.setDefaultStyle(defaultStyle, GC.Spread.Sheets.SheetArea.viewport);
+        let unLockStyle = new GC.Spread.Sheets.Style();
+        unLockStyle.locked = false;
+        let lockStyle = new GC.Spread.Sheets.Style();
+        lockStyle.locked = true;
+        for(let row = beginRow; row < endRow; row++){
+            sheet.setStyle(row, 0, lockStyle);
+        }
+        for(let row = endRow; row < sheet.getRowCount(); row++){
+            sheet.setStyle(row, 0, unLockStyle);
+        }
+        sheet.options.isProtected = true;
+        sheet.resumePaint();
+        sheet.resumeEvent();
+    },
+    lockSomeCodes: function (sheet, beginRow, endRow) {
+        let defaultStyle = new GC.Spread.Sheets.Style();
+        defaultStyle.locked = false;
+        sheet.setDefaultStyle(defaultStyle, GC.Spread.Sheets.SheetArea.viewport);
+        let style = new  GC.Spread.Sheets.Style();
+        style.locked = true;
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        for(let i = beginRow; i < endRow; i++){
+            sheet.setStyle(i, 0, style);
+        }
+        sheet.options.isProtected = true;
+        sheet.resumePaint();
+        sheet.resumeEvent();
+    },
+    lockCodeCells: function (sheet, rowCount) {
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        let sheetRowCount = sheet.getRowCount();
+        let defaultStyle = new GC.Spread.Sheets.Style();
+        defaultStyle.locked = false;
+        sheet.setDefaultStyle(defaultStyle, GC.Spread.Sheets.SheetArea.viewport);
+        let style = new GC.Spread.Sheets.Style();
+        style.locked = true;
+        sheet.setStyle(-1, 0, style);
+        for(let i =rowCount; i<sheetRowCount; i++){
+            sheet.setStyle(i, -1, style);
+        }
+        sheet.options.isProtected = true;
+        sheet.resumePaint();
+        sheet.resumeEvent();
+    }
+};

+ 147 - 0
web/maintain/report/js/cfg_const.js

@@ -115,6 +115,72 @@ let bandSetting = {
     }
 };
 
+let bandSetting2 = {
+    view: {
+        showIcon: true,
+        expandSpeed: "",
+        selectedMulti: false
+    },
+    edit: {
+        enable: true,
+        editNameSelectAll: false,
+        showRemoveBtn: false,
+        showRenameBtn: false
+    },
+    data: {
+        keep: {
+            parent:true,
+            leaf:true
+        },
+        key: {
+            children: 'items',
+            name: "Name"
+        },
+        simpleData: {
+            enable: true
+        }
+    },
+    callback:{
+        onClick: dataInfoMapTreeOprObj.onBandClick(),
+        beforeDrag: function() {return false;}
+    }
+};
+
+let selectedFieldMapSetting = {
+    view: {
+        showIcon: true,
+        expandSpeed: "",
+        selectedMulti: false
+    },
+    edit: {
+        enable: true,
+        editNameSelectAll: false,
+        showRemoveBtn: false,
+        showRenameBtn: false,
+        drag: {
+            isCopy: true,
+            isMove: false
+        }
+    },
+    data: {
+        keep: {
+            parent:true,
+            leaf:true
+        },
+        key: {
+            children: 'items',
+            name: "Name"
+        },
+        simpleData: {
+            enable: true
+        }
+    },
+    callback:{
+        beforeDrag: dataInfoMapTreeOprObj.onBeforeDrag,
+        beforeDrop: dataInfoMapTreeOprObj.onBeforeDrop
+    }
+};
+
 let fieldMapSetting = {
     view: {
         showIcon: true,
@@ -156,6 +222,44 @@ let fieldMapSetting = {
     }
 };
 
+let rptDataInfoSetting = {
+    view: {
+        showIcon: true,
+        expandSpeed: "",
+        selectedMulti: false
+    },
+    edit: {
+        enable: true,
+        editNameSelectAll: true,
+        showRemoveBtn: true,
+        showRenameBtn: false,
+        removeTitle: "删除",
+        drag: {
+            isCopy: false,
+            isMove: true
+        }
+    },
+    data: {
+        keep: {
+            parent:true,
+            leaf:true
+        },
+        key: {
+            children: 'items',
+            name: "Name"
+        },
+        simpleData: {
+            enable: true
+        }
+    },
+    callback:{
+        onClick: dataInfoMapTreeOprObj.onClick,
+        beforeRemove: dataInfoMapTreeOprObj.onBeforeRemove,
+        onRemove: dataInfoMapTreeOprObj.onRemove
+        //,beforeDrop: dataInfoMapTreeOprObj.onBeforeDrop
+    }
+};
+
 let selectableFieldSetting = {
     view: {
         showIcon: true,
@@ -195,6 +299,49 @@ let selectableFieldSetting = {
     }
 };
 
+let discreteFieldParamSetting = {
+    view: {
+        showIcon: true,
+        expandSpeed: "",
+        selectedMulti: false,
+        addHoverDom: discreteFieldParamTreeOprObj.addHoverDom,
+        removeHoverDom: discreteFieldParamTreeOprObj.removeHoverDom
+    },
+    edit: {
+        enable: true,
+        editNameSelectAll: false,
+        showRemoveBtn: true,
+        showRenameBtn: true,
+        removeTitle: "删除",
+        renameTitle: "更改名称",
+        drag: {
+            isCopy: true,
+            isMove: false
+        }
+    },
+    data: {
+        keep: {
+            parent:true,
+            leaf:true
+        },
+        key: {
+            children: 'items',
+            name: "Name"
+        },
+        simpleData: {
+            enable: true
+        }
+    },
+    callback:{
+        beforeRename: discreteFieldParamTreeOprObj.beforeRename,
+        beforeRemove: discreteFieldParamTreeOprObj.onBeforeRemove,
+        onRemove: discreteFieldParamTreeOprObj.onRemove,
+        onRename: discreteFieldParamTreeOprObj.onRename,
+        beforeDrag: discreteFieldParamTreeOprObj.onBeforeDrag,
+        beforeDrop: discreteFieldParamTreeOprObj.onBeforeDrop
+    }
+};
+
 const engineering = {
     // 建筑工程
     ARCHITECTURE: 1,

+ 34 - 0
web/maintain/report/js/rpt_tpl_band.js

@@ -13,6 +13,40 @@ let bandTreeOprObj = {
         me.treeObj = $.fn.zTree.init($("#band_tree_reversed"), bandSetting, bandList);
         me.treeObj.expandAll(true);
     },
+    copyBandList: function (isAllParent) {
+        let me = this, rst = null;
+        if (me.treeObj) {
+            rst = [];
+            let nodes = me.treeObj.getNodes();
+            let private_copy_nodes = function (parentNode, item) {
+                item[JV.PROP_ID] = parentNode[JV.PROP_ID];
+                item[JV.BAND_PROP_NAME] = parentNode[JV.BAND_PROP_NAME];
+                item[JV.BAND_PROP_STYLE] = parentNode[JV.BAND_PROP_STYLE];
+                item[JV.BAND_PROP_CONTROL] = parentNode[JV.BAND_PROP_CONTROL];
+                if (parentNode[JV.BAND_PROP_HEIGHT]) item[JV.BAND_PROP_HEIGHT] = parentNode[JV.BAND_PROP_HEIGHT];
+                if (parentNode[JV.BAND_PROP_WIDTH]) item[JV.BAND_PROP_WIDTH] = parentNode[JV.BAND_PROP_WIDTH];
+                item[JV.BAND_PROP_DISPLAY_TYPE] = parentNode[JV.BAND_PROP_DISPLAY_TYPE];
+                item[JV.BAND_PROP_ALIGNMENT] = parentNode[JV.BAND_PROP_ALIGNMENT];
+                item[JV.BAND_PROP_MERGE_BORDER] = parentNode[JV.BAND_PROP_MERGE_BORDER];
+                if (isAllParent) item.isParent = true;
+                if (parentNode[JV.BAND_PROP_SUB_BANDS]) {
+                    item.items = [];
+                    for (let subNode of parentNode[JV.BAND_PROP_SUB_BANDS]) {
+                        let subItem = {};
+                        private_copy_nodes(subNode, subItem);
+                        item.items.push(subItem);
+                    }
+                }
+            }
+            for (let node of nodes) {
+                let item = {};
+                if (isAllParent) item.isParent = true;
+                private_copy_nodes(node, item);
+                rst.push(item);
+            }
+        }
+        return rst;
+    },
     buildTreeData: function(bandList){
         let rst = [], startIdx = 1;
         //zTreeHelper.createTree(result, setting, "rptTplTree", me);

+ 205 - 0
web/maintain/report/js/rpt_tpl_data_map.js

@@ -0,0 +1,205 @@
+/**
+ * Created by Tony on 2017/10/5.
+ */
+'use strict'
+
+let dataInfoMapTreeOprObj = {
+    treeObj : null,
+    currentNode: null,
+    dataTypeDef: ['string', 'int32', 'int64', 'double', 'currency', 'date', 'image'],
+    iniTree: function(rptTpl) {
+        var me = this;
+        let fieldMapList = me.buildTreeData(rptTpl);
+        me.treeObj = $.fn.zTree.init($("#tpl_data_info_reversed"), rptDataInfoSetting, fieldMapList);
+        me.treeObj.expandAll(true);
+    },
+    iniDataMap: function () {
+        let me = this, bandList = bandTreeOprObj.copyBandList(true);
+        if (bandList) {
+            let bandTree = $.fn.zTree.init($("#band_tree2_reversed"), bandSetting2, bandList);
+            bandTree.expandAll(true);
+        }
+        let selectedFieldList = fieldMapTreeOprObj.copySelectedFieldList();
+        let selectedFieldTree = $.fn.zTree.init($("#tpl_data_selected_field_map_reversed"), selectedFieldMapSetting, selectedFieldList);
+        selectedFieldTree.expandAll(true);
+    },
+    buildTreeData: function (rptTpl) {
+        let me = this, rst = null;
+
+        $("#dispRowHeight")[0].style.display = "";
+        $("#dispColWidth")[0].style.display = "";
+        if (rptTpl[JV.NODE_FLOW_INFO]) {
+            //
+        } else if (rptTpl[JV.NODE_CROSS_INFO]) {
+            //
+        } else if (rptTpl[JV.NODE_BILL_INFO]) {
+            rst = me.buildBillData(rptTpl);
+            $("#dispRowHeight")[0].style.display = "none";
+            $("#dispColWidth")[0].style.display = "none";
+        }
+
+        return rst;
+    },
+    buildBillData: function(rptTpl) {
+        let me = this, rst = [];
+        let rootFieldNode = {Name: JV.NODE_BILL_CONTENT, type: "bill_data", isParent: true};
+        let discreteNode = {Name: JV.NODE_DISCRETE_INFO};
+        rst.push(rootFieldNode);
+        rst.push(discreteNode);
+        me.private_build_bill_data(rootFieldNode, rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT]);
+        me.private_build_bill_discrete_data(discreteNode, rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO]);
+
+        return rst;
+    },
+
+    private_build_bill_data: function (rootFieldNode, billData) {
+        let me = this, bandName = billData[JV.PROP_BAND_NAME];
+        if (rootFieldNode) {
+            rootFieldNode.items = [];
+            for (let fieldItem of billData[JV.PROP_BILL_FIELDS]) {
+                rootFieldNode.items.push(me.private_build_field_node(bandName, fieldItem));
+            }
+        }
+    },
+    private_build_bill_discrete_data: function (discreteNode, discreteData) {
+        let me = this;
+        if (discreteNode) {
+            discreteNode.items = [];
+            let fieldItem = {Name: "Fields", items:[], isParent: true};
+            let paramItem = {Name: "Params", items:[], isParent: true};
+            let textItem = {Name: "Texts", items:[], isParent: true};
+            discreteNode.items.push(fieldItem);
+            discreteNode.items.push(paramItem);
+            discreteNode.items.push(textItem);
+            for (let bandItem of discreteData) {
+                let bandName = bandItem[JV.PROP_BAND_NAME];
+                if (bandItem[JV.PROP_DISCRETE_FIELDS]) {
+                    for (let dtlItem of bandItem[JV.PROP_DISCRETE_FIELDS]) {
+                        fieldItem.items.push(me.private_build_field_node(bandName, dtlItem));
+                    }
+                }
+                if (bandItem[JV.PROP_PARAMS]) {
+                    for (let dtlItem of bandItem[JV.PROP_PARAMS]) {
+                        paramItem.items.push(me.private_build_param_node(bandName, dtlItem));
+                    }
+                }
+
+                if (bandItem[JV.PROP_TEXTS]) {
+                    for (let dtlItem of bandItem[JV.PROP_TEXTS]) {
+                        textItem.items.push(me.private_build_text_node(bandName, dtlItem));
+                    }
+                }
+                if (bandItem[JV.PROP_TEXT]) {
+                    textItem.items.push(me.private_build_text_node(bandName, bandItem[JV.PROP_TEXT]));
+                }
+            }
+        }
+    },
+    private_build_field_node: function (bandName, fieldData) {
+        let me = this, rst = null;
+        if (fieldData) {
+            rst = {};
+            rst[JV.PROP_BAND_NAME] = bandName;
+            rst[JV.PROP_FIELD_ID] = fieldData[JV.PROP_FIELD_ID];
+            rst[JV.TAB_FIELD_PROP_SORT] = fieldData[JV.TAB_FIELD_PROP_SORT];
+            rst[JV.PROP_FONT] = fieldData[JV.PROP_FONT];
+            rst[JV.PROP_CONTROL] = fieldData[JV.PROP_CONTROL];
+            rst[JV.PROP_STYLE] = fieldData[JV.PROP_STYLE];
+            rst[JV.PROP_PREFIX] = fieldData[JV.PROP_PREFIX];
+            rst[JV.PROP_SUFFIX] = fieldData[JV.PROP_SUFFIX];
+            rst[JV.PROP_AREA] = {};
+            me.private_copy_area(fieldData[JV.PROP_AREA], rst[JV.PROP_AREA]);
+        }
+        return rst;
+    },
+    private_copy_area: function (orgArea, destArea) {
+        destArea[JV.PROP_LEFT] = orgArea[[JV.PROP_LEFT]];
+        destArea[JV.PROP_RIGHT] = orgArea[[JV.PROP_RIGHT]];
+        destArea[JV.PROP_TOP] = orgArea[[JV.PROP_TOP]];
+        destArea[JV.PROP_BOTTOM] = orgArea[[JV.PROP_BOTTOM]];
+        destArea[JV.PROP_H_CALCULATION] = orgArea[[JV.PROP_H_CALCULATION]];
+        destArea[JV.PROP_V_CALCULATION] = orgArea[[JV.PROP_V_CALCULATION]];
+    },
+    private_build_param_node: function (bandName, param) {
+        let me = this, rst = null;
+        if (param) {
+            rst = {};
+            rst[JV.PROP_BAND_NAME] = bandName;
+            rst[JV.PROP_PARAM_ID] = param[JV.PROP_PARAM_ID];
+            rst[JV.PROP_FONT] = param[JV.PROP_FONT];
+            rst[JV.PROP_CONTROL] = param[JV.PROP_CONTROL];
+            rst[JV.PROP_STYLE] = param[JV.PROP_STYLE];
+            rst[JV.PROP_PREFIX] = param[JV.PROP_PREFIX];
+            rst[JV.PROP_SUFFIX] = param[JV.PROP_SUFFIX];
+            rst[JV.PROP_AREA] = {};
+            me.private_copy_area(param[JV.PROP_AREA], rst[JV.PROP_AREA]);
+        }
+        return rst;
+    },
+
+    private_build_text_node: function (bandName, text) {
+        //
+    },
+
+    onClick: function (event,treeId,treeNode) {
+        //
+    },
+    onBandClick: function (event,treeId,treeNode) {
+        //
+    },
+    onBeforeRemove: function(treeId, treeNode){
+        let rst = true;
+        if (treeNode.isParent) {
+            rst = false;
+        } else {
+            //
+        }
+        return rst;
+    },
+    beforeRename: function(treeId, treeNode, newName, isCancel) {
+        //
+    },
+    onBeforeDrag: function (treeId, treeNodes) {
+        let rst = true;
+        for (let node of treeNodes) {
+            if (node.level === 0) {
+                rst = false;
+                break;
+            }
+        }
+        return rst;
+    },
+    onBeforeDrop: function(treeId, treeNodes, targetNode, moveType){
+        let rst = false;
+        if (targetNode.tId && targetNode.tId.indexOf("tpl_data_info_reversed") >= 0 && (!(targetNode.isParent && moveType !== 'inner')) ) {
+            if (targetNode.level === 0) {
+                if (targetNode.Name !== "离散信息" && moveType === 'inner') {
+                    rst = true;
+                }
+            } else {
+                let parentNode = targetNode.getParentNode();
+                if (parentNode.Name === "离散信息") {
+                    if (targetNode.Name === "Fields") {
+                        rst = true;
+                    }
+                } else if (parentNode.Name === "Fields") {
+                    rst = true;
+                }
+            }
+        }
+        return rst;
+    },
+    onRemove: function () {
+        //
+    },
+    onRename: function () {
+        //
+    },
+    extractFieldMaps: function (rptTpl) {
+        //
+    },
+    createMapFieldByNode: function (node) {
+        //
+    }
+};
+

+ 94 - 1
web/maintain/report/js/rpt_tpl_field_map.js

@@ -33,6 +33,21 @@ let fieldMapTreeOprObj = {
 
         return rst;
     },
+    copySelectedFieldList: function () {
+        let me = this, rst = [];
+        let nodes = me.treeObj.getNodes();
+        for (let node of nodes) {
+            let item = {Name: node.Name, items: [], isParent: true};
+            if (node.items) {
+                for (let subNode of node.items) {
+                    let subItem = me.createMapFieldByNode(subNode);
+                    item.items.push(subItem);
+                }
+            }
+            rst.push(item)
+        }
+        return rst;
+    },
     onClick: function (event,treeId,treeNode) {
         let me = fieldMapTreeOprObj;
         me.currentNode = treeNode;
@@ -165,4 +180,82 @@ let selectableFiledTreeOprObj = {
             if (btn) btn.bind("click", function(){alert("diy Button for " + treeNode.name);});
         }
     }
-}
+};
+
+let discreteFieldParamTreeOprObj = {
+    treeObj : null,
+    currentNode: null,
+    iniTree: function(rptTpl) {
+        var me = this;
+        let fieldMapList = me.buildTreeData(rptTpl);
+        me.treeObj = $.fn.zTree.init($("#tpl_discrete_fields_params_reversed"), discreteFieldParamSetting, fieldMapList);
+        me.treeObj.expandAll(true);
+    },
+    buildTreeData: function(rptTpl){
+        let rst = [];
+        let disFieldNode = {Name: JV.NODE_NO_MAPPING_FIELDS, items: [], isParent: true};
+        let disParamNode = {Name: JV.NODE_DISCRETE_PARAMS, items: [], isParent: true};
+        rst.push(disFieldNode);
+        rst.push(disParamNode);
+        //rptTpl[JV.NODE_NO_MAPPING_FIELDS]
+        //rptTpl[JV.NODE_DISCRETE_PARAMS]
+        return rst;
+    },
+    addHoverDom: function(treeId, treeNode) {
+        let me = discreteFieldParamTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
+        if (treeNode.level > 0 || $("#addBtn_"+treeNode.tId).length > 0) return;
+        let addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子节点' onfocus='this.blur();'></span>";
+        sObj.after(addStr);
+        let btn = $("#addBtn_"+treeNode.tId);
+        if (btn) btn.bind("click", function(){
+            //
+        });
+    },
+    removeHoverDom: function(treeId, treeNode) {
+        $("#addBtn_"+treeNode.tId).unbind().remove();
+    },
+    onBeforeRemove: function(treeId, treeNode){
+        let rst = true;
+        if (treeNode.isParent) {
+            rst = false;
+        }
+        return rst;
+    },
+    beforeRename: function(treeId, treeNode, newName, isCancel) {
+        let rst = true;
+        if (treeNode.isParent && !isCancel) {
+            rst = false;
+        }
+        return rst;
+    },
+    onBeforeDrag: function (treeId, treeNodes) {
+        //
+    },
+    onBeforeDrop: function(treeId, treeNodes, targetNode, moveType){
+        // let rst = false;
+        // if (targetNode.tId && targetNode.tId.indexOf("tpl_data_info_reversed") >= 0 && (!(targetNode.isParent && moveType !== 'inner')) ) {
+        //     if (targetNode.level === 0) {
+        //         if (targetNode.Name !== "离散信息" && moveType === 'inner') {
+        //             rst = true;
+        //         }
+        //     } else {
+        //         let parentNode = targetNode.getParentNode();
+        //         if (parentNode.Name === "离散信息") {
+        //             if (targetNode.Name === "Fields") {
+        //                 rst = true;
+        //             }
+        //         } else if (parentNode.Name === "Fields") {
+        //             rst = true;
+        //         }
+        //     }
+        // }
+        // return rst;
+    },
+    onRemove: function () {
+        //
+    },
+    onRename: function () {
+        //
+    }
+
+};

+ 2 - 0
web/maintain/report/js/rpt_tpl_helper.js

@@ -63,6 +63,8 @@ let tplHelper = {
             //3. 指标映射
             fieldMapTreeOprObj.iniTree(rptTpl);
             //4. 指标摆放
+            dataInfoMapTreeOprObj.iniTree(rptTpl);
+            discreteFieldParamTreeOprObj.iniTree(rptTpl);
             //5. 计算式
         }
     },

+ 169 - 337
web/maintain/report/js/rpt_tpl_main.js

@@ -4,7 +4,6 @@ let rptTplObj = {
     iniPage: function() {
         zTreeOprObj.iniEngineerIdList();
         zTreeOprObj.getCompilationList();
-        // zTreeOprObj.getReportTemplateTree(RT.GrpType.CONSTRUCT);
         bandTreeOprObj.getReportTplCfg();
         selectableFiledTreeOprObj.iniTree();
         preview_util.drawBorder($("#tplCanvas")[0]);
@@ -52,59 +51,47 @@ let zTreeOprObj = {
         }
         me.treeObj.refresh();
     },
-    updateNodes: function(nodes){
-        if (nodes && nodes.length > 0) {
-            let me = this;
-            for (let i = 0; i < nodes.length; i++) {
-                if (nodes[i].__v != null) node.__v = nodes[i].__v + 1
-                else nodes[i].__v = 0;
-            }
-            let params = {};
-            params.nodes = nodes;
-            CommonAjax.postEx("report_tpl_api/updateRptTplNodes", params, 5000, true, null, null, null);
-        }
-    },
-    removeTreeRootNode: function(rawNode, isSync, callback, failCallback) {
+    removeTreeRootNode: function(rawNode, isAsync, callback, failCallback) {
         let params = {};
         params.compilationId = rawNode.compilationId;
         params.engineerId = rawNode.engineerId;
         params.userId = rawNode.userId;
         params.isPhysically = true;
-        CommonAjax.postEx("report_tpl_api/removeTreeRootNode", params, 5000, isSync, callback, failCallback, null);
+        CommonAjax.postEx("report_tpl_api/removeTreeRootNode", params, 5000, isAsync, callback, failCallback, null);
     },
-    updateTreeRootNode: function(rawNode, isSync, callback, failCallback) {
+    updateTreeRootNode: function(rawNode, isAsync, callback, failCallback) {
         let params = {};
         params.doc = rawNode;
-        CommonAjax.postEx("report_tpl_api/updateTreeRootNode", params, 5000, isSync, callback, failCallback, null);
+        CommonAjax.postEx("report_tpl_api/updateTreeRootNode", params, 5000, isAsync, callback, failCallback, null);
+    },
+    updateTopNodeName: function (topNode, isAsync, callback, failCallback) {
+        let params = {};
+        params.compilationId = topNode.compilationId;
+        params.engineerId = topNode.engineerId;
+        params.userId = topNode.userId;
+        params.nodeName = topNode.name;
+        CommonAjax.postEx("report_tpl_api/updateTopNodeName", params, 5000, isAsync, callback, failCallback, null);
+    },
+    updateSubNode: function (topNode, subNode, isAsync, callback, failCallback) {
+        let params = {};
+        params.compilationId = topNode.compilationId;
+        params.engineerId = topNode.engineerId;
+        params.userId = topNode.userId;
+        params.subNode = subNode;
+        CommonAjax.postEx("report_tpl_api/updateSubLevelOneNode", params, 5000, isAsync, callback, failCallback, null);
     },
     createIniNode: function() {
         let rst = {
             nodeType: RT.NodeType.TEMPLATE,
             refId: -1,
             name: "",
+            ID: -1,
             items: null
         };
         return rst;
     },
     buildRootNodeDoc: function(topNode, excludeNode) {
         let me = this, rst = null;
-        let private_build_items = function (items) {
-            let itemRst = null;
-            if (items && items.length > 0) {
-                itemRst = [];
-                for (let item of items) {
-                    if (item !== excludeNode) {
-                        let ir = {};
-                        ir.nodeType = item.nodeType;
-                        ir.refId = item.refId;
-                        ir.name = item.name;
-                        ir.items = private_build_items(item.items);
-                        itemRst.push(ir);
-                    }
-                }
-            }
-            return itemRst;
-        }
         if (topNode) {
             rst = {
                 compilationId: topNode.compilationId,
@@ -113,27 +100,45 @@ let zTreeOprObj = {
                 properties: topNode.properties,
                 released: topNode.released,
                 isDeleted: topNode.isDeleted,
-                items: private_build_items(topNode.items),
+                items: me.private_build_items(topNode.items, excludeNode),
                 name: topNode.name
             };
         }
         return rst;
     },
-    createNodeFromZTreeNode: function(treeNode) {
-        let rst = {};
-        rst.ID = treeNode.ID;
-        rst.ParentID = treeNode.ParentID;
-        rst.NextSiblingID = treeNode.NextSiblingID;
-        rst.grpType = treeNode.grpType;
-        rst.nodeType = treeNode.nodeType;
-        rst.tplType = treeNode.tplType;
-        rst.userId = treeNode.userId;
-        rst.refId = treeNode.refId;
-        rst.name = treeNode.name;
+    buildSubRootNodeDoc: function(subNode) {
+        let me = this, rst = null;
+        if (subNode) {
+            rst = {
+                nodeType: subNode.nodeType,
+                refId: subNode.refId,
+                ID: subNode.ID,
+                items: me.private_build_items(subNode.items, null),
+                name: subNode.name
+            };
+        }
         return rst;
     },
 
-    //*
+    private_build_items: function (items, excludeNode) {
+        let me = this, itemRst = null;
+        if (items && items.length > 0) {
+            itemRst = [];
+            for (let item of items) {
+                if (item !== excludeNode) {
+                    let ir = {};
+                    ir.nodeType = item.nodeType;
+                    ir.refId = item.refId;
+                    ir.name = item.name;
+                    ir.ID = item.ID;
+                    ir.items = me.private_build_items(item.items);
+                    itemRst.push(ir);
+                }
+            }
+        }
+        return itemRst;
+    },
+
     addHoverDom: function(treeId, treeNode) {
         let me = zTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
         if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length > 0 || treeNode.nodeType == RT.NodeType.TEMPLATE) return;
@@ -141,35 +146,36 @@ let zTreeOprObj = {
         sObj.after(addStr);
         let btn = $("#addBtn_"+treeNode.tId);
         if (btn) btn.bind("click", function(){
-            let rawNode = me.createIniNode();
-            rawNode.nodeType = RT.NodeType.NODE;
-            rawNode.name = "新增子节点";
-            let newNodes = [], isSilent = false;
-            newNodes.push(rawNode);
-            if (me.treeObj) {
-                let insertIdx = -1;
-                if (treeNode.items.length > 0) {
-                    for (let i = treeNode.items.length - 1; i >= 0; i--) {
-                        if (treeNode.items[i].nodeType === RT.NodeType.NODE) {
-                            insertIdx = i + 1;
-                            break;
-                        } else {
-                            insertIdx = i;
+            me.getNewNodeID(1, function (newNodeID) {
+                let rawNode = me.createIniNode();
+                rawNode.nodeType = RT.NodeType.NODE;
+                rawNode.name = "新增子节点";
+                rawNode.ID = newNodeID;
+                let newNodes = [], isSilent = false;
+                newNodes.push(rawNode);
+                if (me.treeObj) {
+                    let insertIdx = -1;
+                    if (treeNode.items && treeNode.items.length > 0) {
+                        for (let i = treeNode.items.length - 1; i >= 0; i--) {
+                            if (treeNode.items[i].nodeType === RT.NodeType.NODE) {
+                                insertIdx = i + 1;
+                                break;
+                            } else {
+                                insertIdx = i;
+                            }
                         }
                     }
+                    me.treeObj.addNodes(treeNode, insertIdx, newNodes, isSilent);
+                    let tn = me.getTopNodeByCurrentNode(treeNode);
+                    let newTopNode = me.buildRootNodeDoc(tn);
+                    me.updateTreeRootNode(newTopNode, true, function(rst){
+                        if (!(rst)) {
+                            alert("新增节点失败!");
+                        }
+                        me.refreshNodes();
+                    }, null);
                 }
-                me.treeObj.addNodes(treeNode, insertIdx, newNodes, isSilent);
-                let tn = me.getTopNodeByCurrentNode(treeNode);
-                let newTopNode = me.buildRootNodeDoc(tn);
-                me.updateTreeRootNode(newTopNode, true, function(rst){
-                    if (rst) {
-                        //
-                    } else {
-                        alert("新增节点失败!");
-                    }
-                    me.refreshNodes();
-                }, null);
-            }
+            });
         });
     },
     removeHoverDom: function(treeId, treeNode) {
@@ -240,26 +246,29 @@ let zTreeOprObj = {
     addTplNode: function (){
         let me = this;
         if (me.currentNode && me.currentNode.nodeType === RT.NodeType.NODE || me.currentNode.level === 0) {
-            let rawNode = me.createIniNode();
-            rawNode.nodeType = RT.NodeType.TEMPLATE;
-            rawNode.name = "新增报表模板";
-            let newNodes = [], isSilent = false;
-            newNodes.push(rawNode);
-            if (me.treeObj) {
+            me.getNewNodeID(1, function (newNodeID) {
+                let rawNode = me.createIniNode();
+                rawNode.nodeType = RT.NodeType.TEMPLATE;
+                rawNode.name = "新增报表模板";
+                rawNode.ID = newNodeID;
+                let newNodes = [], isSilent = false;
+                newNodes.push(rawNode);
                 me.treeObj.addNodes(me.currentNode, -1, newNodes, isSilent);
-                let rawNode = me.buildRootNodeDoc(me.currentNode);
-                me.updateTreeRootNode(rawNode, true, function(rst){
-                    if (rst) {
-                        //
-                    } else {
-                        //
+                let topNode = me.buildRootNodeDoc(me.currentNode);
+                me.updateTreeRootNode(topNode, true, function(rst){
+                    if (!(rst)) {
+                        alert("新增空白模板失败!");
                     }
                     me.refreshNodes();
                 }, null);
-
-            }
+            });
         }
     },
+    getNewNodeID: function (scope, callback) {
+        let params = {};
+        params.scope = scope;
+        CommonAjax.postEx("report_tpl_api/getNewNodeID", params, 5000, true, callback, null, null);
+    },
     addRootNode: function() {
         let me = this, rawNode = me.createIniRootNode();
         if (!me.chkIfDupRootNode(rawNode)) {
@@ -329,12 +338,19 @@ let zTreeOprObj = {
     onRemove: function(e, treeId, treeNode){
         let me = zTreeOprObj, topPNode = me.getTopNodeByCurrentNode(treeNode);
         let rawNode = me.buildRootNodeDoc(topPNode, treeNode);
-        if (treeNode.level === 0) rawNode.isDeleted = true;
-        me.removeTreeRootNode(rawNode, true, function(rst){
-            if (!(rst)) {
-                alert("删除请求失败!");
-            }
-        });
+        if (treeNode.level === 0) {
+            me.removeTreeRootNode(rawNode, true, function(rst){
+                if (!(rst)) {
+                    alert("删除请求失败!");
+                }
+            });
+        } else {
+            me.updateTreeRootNode(rawNode, true, function(rst){
+                if (!(rst)) {
+                    alert("删除请求失败!");
+                }
+            });
+        }
         me.refreshNodes();
     },
     beforeRename: function(treeId, treeNode, newName, isCancel) {
@@ -345,242 +361,55 @@ let zTreeOprObj = {
     },
     onRename : function(e, treeId, treeNode, isCancel) {
         if (!isCancel) {
-            let me = zTreeOprObj, topPNode = me.getTopNodeByCurrentNode(treeNode);
-            let rawNode = me.buildRootNodeDoc(topPNode);
-            me.updateTreeRootNode(rawNode, true, function(rst){
-                if (rst) {
-                    //
-                } else {
-                    alert('修改名称请求失败!');
-                }
-            });
-        }
-    },
-    /*/
-    addHoverDom: function(treeId, treeNode) {
-        let me = zTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
-        if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length > 0 || treeNode.nodeType == RT.NodeType.TEMPLATE) return;
-        let addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子节点' onfocus='this.blur();'></span>";
-        sObj.after(addStr);
-        let btn = $("#addBtn_"+treeNode.tId);
-        if (btn) btn.bind("click", function(){
-            let rawNode = me.createIniRootNode(), lastNodeId = -1, insertIdx = -1, lastNode = null;
-            rawNode.ParentID = treeNode.ID;
-            rawNode.name = "新增子节点";
-            if (treeNode.items.length > 0) {
-                for (let i = treeNode.items.length - 1; i >= 0; i--) {
-                    if (treeNode.items[i].nodeType == RT.NodeType.NODE) {
-                        lastNodeId = treeNode.items[i].ID;
-                        lastNode = treeNode.items[i];
-                        rawNode.NextSiblingID = treeNode.items[i].NextSiblingID;
-                        insertIdx = i + 1;
-                        break;
-                    } else {
-                        rawNode.NextSiblingID = treeNode.items[i].ID;
-                        insertIdx = i;
+            let me = zTreeOprObj;
+            if (treeNode.level === 0) {
+                me.updateTopNodeName(treeNode, true, function(rst){
+                    if (!(rst)) {
+                        alert('修改名称请求失败!');
                     }
-                }
-            }
-            zTreeOprObj.addNewNode(rawNode, lastNodeId, function(rst){
-                let newNodes = [], isSilent = false;
-                if (lastNode) {
-                    lastNode.NextSiblingID = rst.ID;
-                }
-                rawNode.ID = rst.ID;
-                rawNode.NextSiblingID = rst.NextSiblingID;
-                rawNode.isParent = true;
-                rawNode.items = [];
-                newNodes.push(rawNode);
-                treeNode.isParent = true;
-                if (me.treeObj) {
-                    me.treeObj.addNodes(treeNode, insertIdx, newNodes, isSilent);
-                } else {
-                    me.treeObj = $.fn.zTree.init($("#rptTplTree"), setting, newNodes);
-                }
-            }, null);
-        });
-    },
-    removeHoverDom: function(treeId, treeNode) {
-        $("#addBtn_"+treeNode.tId).unbind().remove();
-    },
-
-    addNewNode: function(rawNode, lastNodeId, callback, failCallback) {
-        let params = {};
-        params.lastNodeId = lastNodeId;
-        params.rawNodeData = rawNode;
-        CommonAjax.postEx("report_tpl_api/createTplTreeNode", params, 5000, true, callback, failCallback, null);
-    },
-    moveUpNode: function() {
-        let me = this, nodes = [];
-        if (me.currentNode && me.currentNode.getPreNode()) {
-            let preNode = me.currentNode.getPreNode(), pre_preNode = preNode.getPreNode();
-            me.treeObj.moveNode(preNode, me.currentNode, "prev", true);
-            //then update the db
-            if (pre_preNode) {
-                pre_preNode.NextSiblingID = me.currentNode.ID;
-                nodes.push(me.createNodeFromZTreeNode(pre_preNode));
-            }
-            preNode.NextSiblingID = me.currentNode.NextSiblingID;
-            me.currentNode.NextSiblingID = preNode.ID;
-            nodes.push(me.createNodeFromZTreeNode(me.currentNode));
-            nodes.push(me.createNodeFromZTreeNode(preNode));
-            me.updateNodes(nodes);
-        }
-    },
-    moveDownNode: function() {
-        let me = this, nodes = [];
-        if (me.currentNode && me.currentNode.getNextNode()) {
-            let preNode = me.currentNode.getPreNode(), nextNode = me.currentNode.getNextNode();
-            me.treeObj.moveNode(nextNode, me.currentNode, "next", true);
-            //then update the db
-            if (preNode) {
-                preNode.NextSiblingID = nextNode.ID;
-                nodes.push(me.createNodeFromZTreeNode(preNode));
+                }, null);
+            } else {
+                let subTopNode = me.getSubTopNodeByCurrentNode(treeNode);
+                let topPNode = subTopNode.getParentNode();
+                let rawNode = me.buildSubRootNodeDoc(subTopNode);
+                me.updateSubNode(topPNode, rawNode, true, function(rst){
+                    if (!(rst)) {
+                        alert('修改名称请求失败!');
+                    }
+                });
             }
-            me.currentNode.NextSiblingID = nextNode.NextSiblingID;
-            nextNode.NextSiblingID = me.currentNode.ID;
-            nodes.push(me.createNodeFromZTreeNode(me.currentNode));
-            nodes.push(me.createNodeFromZTreeNode(nextNode));
-            me.updateNodes(nodes);
         }
     },
-    getReportTemplateTree: function(grpType) {
+
+    createNewTpl: function () {
         let me = zTreeOprObj, params = {};
-        params.grpType = grpType;
-        params.userId = (userAccount ===  'admin')?('-100'):userID;
-        params.tplType = RT.TplType.ALL;
-        CommonAjax.postEx("report_tpl_api/getRptTplTree", params, 20000, true, function(result){
-                zTreeHelper.createTree(result, setting, "rptTplTree", me);
-                me.refreshNodes();
-            }, null, null
-        );
-    },
-    addTplNode: function (){
-        let me = this;
-        if (me.currentNode && me.currentNode.nodeType === RT.NodeType.NODE) {
-            let rawNode = me.createIniRootNode(), lastNodeId = -1, lastNode = null;
-            rawNode.nodeType = RT.NodeType.TEMPLATE;
-            rawNode.ParentID = me.currentNode.ID;
-            rawNode.name = "新增报表模板";
-            if (me.treeObj) {
-                let nodes = me.currentNode.items;
-                if (nodes.length > 0) {
-                    lastNodeId = nodes[nodes.length - 1].ID;
-                    lastNode = nodes[nodes.length - 1];
-                }
-                me.addNewNode(rawNode, lastNodeId, function(rst){
-                    let newNodes = [], isSilent = false;
-                    if (lastNode) {
-                        lastNode.NextSiblingID = rst.ID;
-                    }
-                    rawNode.ID = rst.ID;
-                    rawNode.isParent = false;
-                    rawNode.items = [];
-                    newNodes.push(rawNode);
-                    if (me.treeObj) {
-                        me.treeObj.addNodes(me.currentNode, -1, newNodes, isSilent);
+        if (me.currentNode && me.currentNode.nodeType === RT.NodeType.TEMPLATE) {
+            params.treeNodeId = me.currentNode.ID;
+            let rptTypeId = common_rpt_type_ids.flow;
+            if ($("#crossTypeOpt")[0].checked) rptTypeId = common_rpt_type_ids.cross;
+            if ($("#billTypeOpt")[0].checked) rptTypeId = common_rpt_type_ids.bill;
+            params.rptDftTplId = rptTypeId;
+            params.rptName = me.currentNode.name;
+            params.grpKey = me.getFolderText(me.currentNode, "_");
+            me.currentNode.refId = me.currentNode.ID;
+            let subTopNode = me.getSubTopNodeByCurrentNode(me.currentNode);
+            let topPNode = me.getTopNodeByCurrentNode(subTopNode);
+            let rawNode = me.buildSubRootNodeDoc(subTopNode);
+            params.compilationId = topPNode.compilationId;
+            params.engineerId = topPNode.engineerId;
+            params.userId = topPNode.userId;
+            params.subNode = rawNode;
+            CommonAjax.postEx("report_tpl_api/createDftRptTpl", params, 10000, true, function(result){
+                    if (result) {
+                        me.currentNode.rptTpl = result;
+                        me.chkAndRreshRefTpl();
                     } else {
-                        me.treeObj = $.fn.zTree.init($("#rptTplTree"), setting, newNodes);
+                        alert('update error!');
                     }
-                }, null);
-            }
-        }
-    },
-
-    addRootNode: function() {
-        let me = this, rawNode = me.createIniRootNode(), lastNodeId = -1, lastNode = null;
-        if (me.treeObj) {
-            let rootNodes = me.treeObj.getNodes();
-            if (rootNodes.length > 0) {
-                lastNodeId = rootNodes[rootNodes.length - 1].ID;
-                lastNode = rootNodes[rootNodes.length - 1];
-            }
-            me.addNewNode(rawNode, lastNodeId, function(rst){
-                let newNodes = [], isSilent = false;
-                if (lastNode) {
-                    lastNode.NextSiblingID = rst.ID;
-                }
-                rawNode.ID = rst.ID;
-                rawNode.isParent = true;
-                rawNode.items = [];
-                newNodes.push(rawNode);
-                if (me.treeObj) {
-                    me.treeObj.addNodes(null, -1, newNodes, isSilent);
-                } else {
-                    me.treeObj = $.fn.zTree.init($("#rptTplTree"), setting, newNodes);
-                }
-            }, null);
-        }
-    },
-
-    createIniRootNode: function() {
-        let rst = {
-            ID: -1,
-            ParentID: -1,
-            NextSiblingID: -1,
-            grpType: RT.GrpType.CONSTRUCT,
-            nodeType: RT.NodeType.NODE,
-            tplType: RT.TplType.ALL,
-            userId: (userAccount ===  'admin')?('-100'):userID,
-            refId: -1,
-            name: '新增节点'
-        };
-        return rst;
-    },
-
-    onBeforeRemove: function(treeId, treeNode){
-        let nodeIds = [], preNode = treeNode.getPreNode(), preNodeId = -1, canRemove = false, params = {};
-        if (preNode) {
-            preNodeId = preNode.ID;
-        }
-        let private_fetchAllSubItems = function(pItem){
-            nodeIds.push(pItem.ID);
-            if (pItem.items && pItem.items.length > 0) {
-                for (let i = 0; i < pItem.items.length; i++) {
-                    private_fetchAllSubItems(pItem.items[i]);
-                }
-            }
-        };
-        nodeIds.push(treeNode.ID);
-        for (let i = 0; i < treeNode.items.length; i++) {
-            private_fetchAllSubItems(treeNode.items[i]);
-        }
-        params.nodeIds = nodeIds;
-        params.preNodeId = preNodeId;
-        params.preNodeNextId = treeNode.NextSiblingID;
-        CommonAjax.postEx("report_tpl_api/deleteRptTplNodes", params, 5000, false, function(data){
-            canRemove = true;
-        }, null, null);
-        return canRemove;
-    },
-    onRemove: function(e, treeId, treeNode){
-        let me = zTreeOprObj, pNode = me.treeObj.getNodeByTId(treeNode.parentTId);
-        if (pNode && pNode.items && pNode.items.length === 0) {
-            if (pNode.nodeType === RT.NodeType.NODE) pNode.isParent = true
-            else pNode.isParent = false;
-            me.treeObj.refresh();
-        }
-    },
-    beforeRename: function(treeId, treeNode, newName, isCancel) {
-        if (newName.length === 0) {
-            return false;
-        }
-        return true;
-    },
-    onRename : function(e, treeId, treeNode, isCancel) {
-        let me = zTreeOprObj, nodes = [];
-        nodes.push(me.createNodeFromZTreeNode(treeNode));
-        me.updateNodes(nodes);
-        if (treeNode.nodeType === RT.NodeType.TEMPLATE && treeNode.refId >= 0) {
-            if (treeNode.rptTpl !== null) {
-                treeNode.rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MAIN_INFO_RPT_NAME] = treeNode.name;
-                $("#rptTplName")[0].value = treeNode.rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MAIN_INFO_RPT_NAME];
-            } else {
-                me.onClick(e, treeId, treeNode);
-            }
+                }, null, null
+            );
         }
     },
-    //*/
     onClick: function(event,treeId,treeNode) {
         let me = zTreeOprObj;
         me.currentNode = treeNode;
@@ -588,11 +417,7 @@ let zTreeOprObj = {
         if (treeNode.nodeType === RT.NodeType.NODE) {
             $("#rpt_tpl_display_label")[0].innerText = "...";
         } else if (treeNode.nodeType === RT.NodeType.TEMPLATE) {
-            let showText = treeNode.name, parentNode = treeNode.getParentNode();
-            while (parentNode !== null) {
-                showText = parentNode.name + ' > ' + showText;
-                parentNode = parentNode.getParentNode();
-            }
+            let showText = me.getFolderText(me.currentNode, " > ");
             $("#rpt_tpl_display_label")[0].innerText = showText;
             if (treeNode.refId < 0) {
                 //创建新报表模板
@@ -603,19 +428,17 @@ let zTreeOprObj = {
             }
         }
     },
-    createNewTpl: function () {
-        let me = zTreeOprObj, params = {};
-        if (me.currentNode && me.currentNode.nodeType === RT.NodeType.TEMPLATE) {
-            params.treeNodeId = me.currentNode.ID;
-            let rptTypeId = common_rpt_type_ids.flow;
-            if ($("#crossTypeOpt")[0].checked) rptTypeId = common_rpt_type_ids.cross;
-            if ($("#billTypeOpt")[0].checked) rptTypeId = common_rpt_type_ids.bill;
-            params.rptDftTplId = rptTypeId;
-            CommonAjax.postEx("report_tpl_api/createDftRptTpl", params, 20000, true, function(result){
-                    me.currentNode.rptTpl = result;
-                }, null, null
-            );
+    getFolderText: function (treeNode, separator) {
+        let rst = "";
+        if (treeNode) {
+            rst = treeNode.name;
+            let parentNode = treeNode.getParentNode();
+            while (parentNode !== null) {
+                rst = parentNode.name + separator + rst;
+                parentNode = parentNode.getParentNode();
+            }
         }
+        return rst;
     },
     chkAndRreshRefTpl: function() {
         let me = zTreeOprObj, params = {};
@@ -665,5 +488,14 @@ let zTreeOprObj = {
             pNode = pNode.getParentNode();
         }
         return topPNode;
+    },
+    getSubTopNodeByCurrentNode: function (currentNode) {
+        let startNode = currentNode, resultPNode = null, pNode = startNode.getParentNode();
+        while (pNode !== null) {
+            resultPNode = startNode;
+            startNode = pNode;
+            pNode = startNode.getParentNode();
+        }
+        return resultPNode;
     }
 };

+ 30 - 15
web/maintain/report/rpt_tpl_main.html

@@ -77,7 +77,7 @@
                                                 <a class="nav-link p-1" data-toggle="tab" href="#rpttplfieldmap" role="tab">指标映射</a>
                                             </li>
                                             <li class="nav-item">
-                                                <a class="nav-link p-1" data-toggle="tab" href="#rpttplfieldlocation" role="tab">指标摆放</a>
+                                                <a class="nav-link p-1" data-toggle="tab" href="#rpttplfieldlocation" role="tab" onclick="dataInfoMapTreeOprObj.iniDataMap();">指标摆放</a>
                                             </li>
                                             <li class="nav-item">
                                                 <a class="nav-link p-1" data-toggle="tab" href="#rpttplformula" role="tab">计算式</a>
@@ -230,29 +230,43 @@
                                             <div class="tab-pane" id="rpttplfieldlocation" role="tabpanel">
                                                 <div class="main-data">
                                                     <div class="p-3">
-                                                        <div class="ztree-warp">
-                                                            ztree 保留空间
-                                                        </div>
-                                                        <div class="form-group">
-                                                            <label>所属Band</label>
-                                                            <select class="form-control"><option> </option></select>
+                                                        <div class="row">
+                                                            <div class="form-group col-md-6">
+                                                                <div class="ztree-warp">
+                                                                    <ul id="tpl_data_info_reversed" class="ztree"></ul>
+                                                                </div>
+                                                            </div>
+                                                            <div class="form-group col-md-6">
+                                                                <div class="ztree-warp">
+                                                                    <ul id="band_tree2_reversed" class="ztree"></ul>
+                                                                </div>
+                                                            </div>
                                                         </div>
-                                                        <div class="form-group">
+                                                        <div class="form-group" id="dispRowHeight">
                                                             <label>显示行高度</label>
                                                             <select class="form-control"><option> </option></select>
                                                             <small class="form-text text-muted">用于 流水行/交叉行</small>
                                                         </div>
-                                                        <div class="form-group">
+                                                        <div class="form-group" id="dispColWidth">
                                                             <label>显示列宽度</label>
                                                             <select class="form-control"><option> </option></select>
                                                             <small class="form-text text-muted">用于 交叉列</small>
                                                         </div>
-                                                        <div class="ztree-warp">
-                                                            ztree 保留空间
-                                                        </div>
-                                                        <div class="form-group">
-                                                            <label>映射指标</label>
-                                                            <select class="form-control"><option> </option></select>
+                                                        <div class="row">
+                                                            <div class="form-group col-md-6">
+                                                                <div class="ztree-warp">
+                                                                    <label>离散独立指标/参数</label>
+                                                                    <ul id="tpl_discrete_fields_params_reversed" class="ztree"></ul>
+                                                                </div>
+                                                            </div>
+                                                            <div class="form-group col-md-6">
+                                                                <div class="form-group">
+                                                                    <label>已选映射指标</label>
+                                                                    <div class="ztree-warp">
+                                                                        <ul id="tpl_data_selected_field_map_reversed" class="ztree"></ul>
+                                                                    </div>
+                                                                </div>
+                                                            </div>
                                                         </div>
                                                     </div>
                                                 </div>
@@ -337,6 +351,7 @@
     <script src="/web/maintain/report/js/rpt_tpl_field_cfg.js"></script>
     <script src="/web/maintain/report/js/rpt_tpl_calculation.js"></script>
     <script src="/web/maintain/report/js/rpt_tpl_helper.js"></script>
+    <script src="/web/maintain/report/js/rpt_tpl_data_map.js"></script>
     <script src="/web/maintain/report/js/cfg_const.js"></script>
     <script src="/web/maintain/report/js/rpt_tpl_preview_util.js"></script>
     <!-- zTree -->

+ 92 - 3
web/maintain/std_glj_lib/html/gongliao.html

@@ -10,8 +10,10 @@
     <link rel="stylesheet" href="/web/maintain/std_glj_lib/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
     <link rel="stylesheet" href="/lib/spreadjs/sheets/css/gc.spread.sheets.excel2013lightGray.10.0.1.css" type="text/css">
+    <link rel="stylesheet" href="/lib/jquery-contextmenu/jquery.contextMenu.css" type="text/css">
     <style type="text/css">
         .ztree li span.button.add{margin-right:2px;background-position:-144px 0;vertical-align:top;*vertical-align:middle}
+        .modal-lg{max-width: 1000px}
     </style>
     <!--zTree-->
   	<link rel="stylesheet" href="/lib/ztree/css/zTreeStyle.css" type="text/css">
@@ -150,7 +152,43 @@
             </div>
         </div>
     </div>
-
+    <!--弹出组成物-->
+    <button id="componentBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#component" style="display: none"></button>
+    <div class="modal fade" id="component" data-backdrop="static">
+        <div class="modal-dialog modal-lg" role="document" id="modalCon">
+            <div class="modal-content" >
+                <div class="modal-header">
+                    <h5 class="modal-title">选择组成物</h5>
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <div class="row">
+                        <div class="col-4">
+                            <div  class="modal-auto-height" id="componentTreeDiv" style="overflow: hidden">
+                                <!--<div class="print-list">-->
+                                <div style="width: 100%; height: 100%; overflow: auto">
+                                    <ul id="componentTree" class="ztree"></ul>
+                                </div>
+                                <!--</div>-->
+                            </div>
+                        </div>
+                        <div class="col-8">
+                            <div class="row">
+                                <div class="modal-auto-height col-12" style="overflow: hidden" id="componentSheet">
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" id="componentsCacnel" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                    <a href="javascript:void(0);" id="componentsConf" class="btn btn-primary">确定</a>
+                </div>
+            </div>
+        </div>
+    </div>
     <button id="gljAlertBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#gljAlert" style="display: none"></button>
     <button id="codeAlertBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#codeAlert" style="display: none"></button>
     <div class="modal fade" id="gljAlert" data-backdrop="static" style="display: none;" aria-hidden="true">
@@ -195,6 +233,8 @@
 
     <!-- JS. -->
     <script src="/lib/jquery/jquery.min.js"></script>
+    <script src="/lib/jquery-contextmenu/jquery.contextMenu.min.js"></script>
+    <script src="/lib/jquery-contextmenu/jquery.ui.position.js"></script>
     <script src="/lib/tether/tether.min.js"></script>
     <script src="/lib/bootstrap/bootstrap.min.js"></script>
     <script src="/web/maintain/std_glj_lib/js/global.js"></script>
@@ -208,8 +248,10 @@
     <script type="text/javascript" src="/public/web/QueryParam.js"></script>
     <script type="text/javascript" src="/web/maintain/std_glj_lib/js/glj.js"></script>
     <script type="text/javascript" src="/web/maintain/std_glj_lib/js/gljComponent.js"></script>
+    <script type="text/javascript" src="/web/maintain/std_glj_lib/js/components.js"></script>
     <script type="text/javascript" src="/public/web/ztree_common.js"></script>
     <script type="text/javascript" src="/public/web/sheet/sheet_common.js"></script>
+    <script type="text/javascript" src="/web/maintain/std_glj_lib/js/sheetsOpr.js"></script>
     <script type="text/javascript" src="/public/web/storageUtil.js"></script>
     <SCRIPT type="text/javascript">
         let userAccount = '<%=userAccount %>';
@@ -252,9 +294,56 @@
                 onClick: gljTypeTreeOprObj.onClick
             }
         };
+        //组成物弹出窗口组成物分类树
+        let componentSetting = {
+            view: {
+                //addHoverDom: gljTypeTreeOprObj.addHoverDom,
+                //removeHoverDom: gljTypeTreeOprObj.removeHoverDom,
+                expandSpeed: "",
+                selectedMulti: false
+            },
+            edit: {
+                enable: false,
+                editNameSelectAll: true,
+                showRemoveBtn: true,
+                showRenameBtn: true,
+                removeTitle: "删除节点",
+                renameTitle: "更改名称"
+            },
+            data: {
+                keep: {
+                    parent:true,
+                    leaf:true
+                },
+                key: {
+                    children: "items",
+                    name: "Name"
+                },
+                simpleData: {
+                    enable: false,
+                    idKey: "ID",
+                    pIdKey: "ParentID",
+                    rootPId: -1
+                }
+            },
+            callback:{
+                onClick: componentTypeTreeOprObj.onClick
+            }
+        };
         $(document).ready(function(){
-            pageOprObj.initPage($("#GLJListSheet")[0], $('#gljComponentSheet')[0]);
-            //repositoryGljObj.buildSheet($("#GLJListSheet")[0]);
+            //解决spreadjs sheet初始化没高度宽度
+            $('#modalCon').width($(window).width()*0.5);
+            $('#componentTreeDiv').height($(window).height() - 300);
+            $("#componentSheet").height($("#componentTreeDiv").height()-21.6);
+            $("#componentSheet").width($('#modalCon').width() * 0.63);
+            pageOprObj.initPage($("#GLJListSheet")[0], $('#gljComponentSheet')[0], $('#componentSheet')[0]);
+        });
+        //组成物弹出窗大小设置
+        $(window).resize(function () {
+            $('#modalCon').width($(window).width()*0.5);
+            $('#componentTreeDiv').height($(window).height() - 300);
+            $("#componentSheet").height($("#componentTreeDiv").height()-21.6);
+            $("#componentSheet").width($('#modalCon').width()* 0.63);
         });
   	</SCRIPT>
 </body>

+ 200 - 0
web/maintain/std_glj_lib/js/components.js

@@ -0,0 +1,200 @@
+/**
+ * Created by Zhong on 2017/10/16.
+ */
+/*
+ 弹出组成物窗口 组成物表
+ * */
+let componentOprObj = {
+    treeObj:null,
+    rootNode: null,//分类树根节点
+    workBook: null,
+    selectedList: [],//选中的组成物
+    setting: {
+        owner: "components",
+        header: [
+            {headerName:"选择", headerWidth: 40, dataCode: "select", hAlign: "center", vAlign: "center"},
+            {headerName:"编码",headerWidth:80,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
+            {headerName:"名称",headerWidth:120,dataCode:"name", dataType: "String", hAlign: "left", vAlign: "center"},
+            {headerName:"规格型号",headerWidth:80,dataCode:"specs", dataType: "String", hAlign: "center", vAlign: "center"},
+            {headerName:"单位",headerWidth:80,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
+            {headerName:"单价",headerWidth:80,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
+            {headerName:"类型",headerWidth:80,dataCode:"gljType", dataType: "String",  hAlign: "center", vAlign: "center"}
+        ]
+    },
+    buildSheet: function (container) {
+        let me = componentOprObj;
+        me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30);
+        me.workBook.getSheet(0).setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
+        me.workBook.getSheet(0).setFormatter(-1, 1, "@", GC.Spread.Sheets.SheetArea.viewport);
+        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditStarting, me.onCellEditStart);
+        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
+        me.workBook.bind(GC.Spread.Sheets.Events.ButtonClicked, me.onButtonClicked);//复选框点击事件
+        me.workBook.getSheet(0).getRange(-1, 0, -1, 1).cellType(new GC.Spread.Sheets.CellTypes.CheckBox());
+        me.componentsBtnOpr($('#componentsConf'));
+    },
+    onClipboardPasting: function (sender, args) {
+        args.cancel = true;
+    },
+    onCellEditStart: function (sender, args) {
+        args.cancel = true;
+    },
+    onButtonClicked: function (sender, args) {
+        let me = componentOprObj, re = repositoryGljObj;
+        let val = args.sheet.getValue(args.row, args.col);
+        let thisComponent = me.currentCache[args.row];
+        thisComponent.isChecked = val;
+        if(args.sheet.isEditing()){
+            args.sheet.endEdit(true);
+        }
+        else{
+            //维护选中组成物列表
+            if(val === true){
+                let isExist = false;
+                for(let i = 0, len = me.selectedList.length; i < len; i++){
+                    if(me.selectedList[i].ID === thisComponent.ID){
+                        isExist = true;
+                        break;
+                    }
+                }
+                if(!isExist){
+                    me.selectedList.push(thisComponent);
+                }
+            }
+            else if(val === false){
+                for(let i = 0, len = me.selectedList.length; i < len; i++){
+                    if(me.selectedList[i].ID === thisComponent.ID){
+                        me.selectedList.splice(i, 1);
+                        break;
+                    }
+                }
+            }
+        }
+    },
+    setShowGljList: function (gljList, clearChecked) {
+        //初始为所有工料机,机械类型可添加机械组成物、机上人工,混凝土,砂浆、配合比可添加普通材料
+        let machineArr = [302, 303];
+        let materialArr = [202, 203, 204];//混凝土、砂浆、配合比, 201普通材料
+        let that = repositoryGljObj, me = componentOprObj;
+        for(let i = 0; i < gljList.length; i++){
+            if(that.currentGlj.gljType === 301 && machineArr.indexOf(gljList[i].gljType) !== -1 ||
+                materialArr.indexOf(that.currentGlj.gljType) !== -1 && gljList[i].gljType === 201){
+                let isExist = false;
+                for(let j = 0; j < that.currentComponent.length; j++){
+                    if(that.currentComponent[j].ID === gljList[i].ID){
+                        isExist = true;
+                        break;
+                    }
+                }
+                if(!isExist){
+                    if(clearChecked){
+                        gljList[i].isChecked = false;
+                    }
+                }
+                else {
+                    gljList[i].isChecked = true;
+                }
+                me.showGljList.push(gljList[i]);
+            }
+        }
+    },
+    //初始默认radio
+    initRadio: function () {
+        let that = repositoryGljObj, me = componentOprObj;
+        //初始化组成物列表
+        me.selectedList = [].concat(that.currentComponent);
+        //初始为所有工料机,机械类型可添加机械组成物,混凝土,砂浆、配合比可添加普通材料
+        me.showGljList = [];
+        me.setShowGljList(that.gljList, true);
+        that.sortGlj(me.showGljList);
+
+    },
+    getParentCache: function (nodes) {
+        let me = componentOprObj, rst = [];
+        for(let i = 0; i < me.showGljList.length; i++){
+            if(nodes.indexOf(me.showGljList[i].gljClass) !== -1){
+                rst.push(me.showGljList[i]);
+            }
+        }
+        rst.sort(function (a, b) {
+            let rst = 0;
+            if(a.code > b.code) rst = 1;
+            else if(a.code < b.code)rst = -1;
+            return rst;
+        });
+        return rst;
+    },
+    getCache: function() {
+        let me = componentOprObj, rst = [];
+        for (let i = 0; i < me.showGljList.length; i++) {
+            if (me.showGljList[i].gljClass == me.gljCurTypeId) {
+                rst.push(me.showGljList[i]);
+            }
+        }
+        return rst;
+    },
+    showGljItems: function(data, type) {
+        let me = componentOprObj, re = repositoryGljObj;
+        if (me.workBook) {
+            let cacheSection = [];
+            let pArr = re.parentNodeIds["_pNodeId_" + type];
+            for (let i = 0; i < data.length; i++) {
+                if (pArr && pArr.indexOf(data[i].gljClass) >= 0) {
+                    cacheSection.push(data[i]);
+                } else if (type == data[i].gljClass) {
+                    cacheSection.push(data[i]);
+                }
+            }
+            sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
+            sheetsOprObj.showData(me.workBook.getSheet(0), me.setting, cacheSection, re.distTypeTree);
+            me.workBook.getSheet(0).setRowCount(cacheSection.length);
+            cacheSection = null;
+        }
+    },
+    //组成物窗口按钮操作
+    componentsBtnOpr: function (conf) {//确定、取消、关闭按钮
+        let me = componentOprObj, that = gljComponentOprObj, re = repositoryGljObj;
+        conf.click(function () {
+            //添加选择添加的组成物
+            let updateArr = [];
+            let newComponent = [];
+            for(let i = 0, len = me.selectedList.length; i < len; i++){
+                let isExist = false;
+                for(let j = 0, jLen = re.currentGlj.component.length; j < jLen; j++){
+                    if(me.selectedList[i].ID === re.currentGlj.component[j].ID){
+                        newComponent.push({ID: me.selectedList[i].ID, consumeAmt: re.currentGlj.component[j].consumeAmt});
+                        isExist = true;
+                        break;
+                    }
+                }
+                if(!isExist){
+                    newComponent.push({ID: me.selectedList[i].ID, consumeAmt: 0});
+                }
+            }
+            re.currentGlj.component = newComponent;
+            let gljBasePrc = that.reCalGljBasePrc(re.getCurrentComponent(re.currentGlj.component));
+            if(gljBasePrc !== re.currentGlj.basePrice){
+                re.currentGlj.basePrice = gljBasePrc;
+                re.reshowGljBasePrc(re.currentGlj);
+            }
+            updateArr.push(re.currentGlj);
+            that.updateComponent(updateArr);
+            $('#componentsCacnel').click();
+        });
+    }
+};
+
+let componentTypeTreeOprObj = {
+    onClick: function(event,treeId,treeNode) {
+        let me = componentOprObj, re = repositoryGljObj, that = gljComponentOprObj, gljTypeId = treeNode.ID;
+        if(me.gljCurTypeId !== treeNode.ID){
+            me.gljCurTypeId = treeNode.ID;
+            if (re.parentNodeIds["_pNodeId_" + treeNode.ID]) {
+                me.currentOprParent = 1;
+                me.currentCache = me.getParentCache(re.parentNodeIds["_pNodeId_" + treeNode.ID]);
+            } else {
+                me.currentCache = me.getCache();
+            }
+        }
+        me.showGljItems(me.showGljList, gljTypeId);
+    }
+}

+ 196 - 171
web/maintain/std_glj_lib/js/glj.js

@@ -4,12 +4,13 @@
 let pageOprObj = {
     gljLibName : null,
     gljLibId: null,
-    initPage : function(container, containerComponent) {
+    initPage : function(container, containerComponent, containerC) {
         let me = this, gljLibId = getQueryString("gljLibId");//获取定额库参数
         me.gljLibId = gljLibId;
         repositoryGljObj.getGljLib(gljLibId, function () {
             repositoryGljObj.buildSheet(container);
             gljComponentOprObj.buildSheet(containerComponent);
+            componentOprObj.buildSheet(containerC);
             //获得定额库中引用此工料机库中的,所有被定额所套的工料机的ID
             //repositoryGljObj.getRationGljIds(gljLibId);
             repositoryGljObj.getGljDistType(function () {
@@ -17,7 +18,6 @@ let pageOprObj = {
                 repositoryGljObj.getGljTree(gljLibId, function () {
                     repositoryGljObj.getGljItems(gljLibId);
                 });
-                sheetCommonObj.shieldAllCells(repositoryGljObj.workBook.getSheet(0), repositoryGljObj.setting);
             });
         });
     }
@@ -38,10 +38,11 @@ let repositoryGljObj = {
         header:[
             {headerName:"编码",headerWidth:120,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
             {headerName:"名称",headerWidth:260,dataCode:"name", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
-            {headerName:"规格型号",headerWidth:260,dataCode:"specs", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
-            {headerName:"计量单位",headerWidth:120,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
+            {headerName:"规格型号",headerWidth:220,dataCode:"specs", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
+            {headerName:"单位",headerWidth:120,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
             {headerName:"基价单价",headerWidth:120,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
-            {headerName:"类型",headerWidth:120,dataCode:"gljType", dataType: "String", hAlign: "center", vAlign: "center"}
+            {headerName:"类型",headerWidth:120,dataCode:"gljType", dataType: "String", hAlign: "center", vAlign: "center"},
+            {headerName:"调整系数",headerWidth:80,dataCode:"adjCoe", dataType: "Number", hAlign: "center", vAlign: "center"},
         ],
         view:{
             comboBox:[
@@ -78,10 +79,6 @@ let repositoryGljObj = {
             }
         });
         distTypeTree.distTypesArr.forEach(function (distTypeObj) {
-           /* if(distTypeObj.children.length === 0 && distTypeObj.data.fullName !== '普通机械' &&distTypeObj.data.fullName !== '机械组成物'
-                && distTypeObj.data.fullName !== '机上人工'){
-                distTypeTree.comboDatas.push({text: distTypeObj.data.fullName, value: distTypeObj.data.ID});
-            }*/
             if(distTypeObj.data.fullName !== '材料' && distTypeObj.data.fullName !== '机械'){
                 distTypeTree.comboDatas.push({text: distTypeObj.data.fullName, value: distTypeObj.data.ID});
             }
@@ -98,9 +95,6 @@ let repositoryGljObj = {
                 if(!result.error && callback){
                     me.distTypeTree = me.getComboData(result.data);
                     console.log(me.distTypeTree);
-                    let combo = new GC.Spread.Sheets.CellTypes.ComboBox();
-                    combo.items(me.distTypeTree.comboDatas).editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.text);
-                    me.workBook.getSheet(0).getCell(-1, 5, GC.Spread.Sheets.SheetArea.viewport).cellType(combo).value(me.distTypeTree.comboDatas[0].text);
                     callback();
                 }
             }
@@ -139,6 +133,7 @@ let repositoryGljObj = {
             success:function(result,textStatus,status){
                 if(status.status == 200) {
                     zTreeHelper.createTree(result.data, gljSetting, "repositoryTree", me);
+                    zTreeHelper.createTree(result.data, componentSetting, "componentTree", componentOprObj);
                     if (result.data && result.data.length > 0) {
                         me.gljCurTypeId = result.data[0].ID;
                     } else {
@@ -167,8 +162,10 @@ let repositoryGljObj = {
                     me.gljList = result.data;
                     me.workBook.getSheet(0).setRowCount(result.data.length);
                     me.sortGlj();
+                    me.currentGlj = me.gljList.length > 0 ? me.gljList[0] : null;//初始
                     let rootNode = me.treeObj.getNodes()[0];
                     if(rootNode && rootNode.isParent && rootNode.isFirstNode){
+                        componentOprObj.rootNode = rootNode;
                         me.treeObj.selectNode(rootNode);
                         gljTypeTreeOprObj.onClick(null, 'repositoryTree', rootNode);
                     }
@@ -191,10 +188,10 @@ let repositoryGljObj = {
                     cacheSection.push(data[i]);
                 }
             }
-            //sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
             sheetCommonObj.cleanData(me.workBook.getSheet(0), me.setting, -1);
-            sheetCommonObj.showData(me.workBook.getSheet(0), me.setting, cacheSection, me.distTypeTree);
-
+            sheetsOprObj.showData(me.workBook.getSheet(0), me.setting, cacheSection, me.distTypeTree);
+            sheetCommonObj.setStaticCombo(me.workBook.getActiveSheet(), 0, 5, cacheSection.length, me.distTypeTree.comboDatas, false, 'text');
+            sheetCommonObj.setDynamicCombo(me.workBook.getActiveSheet(), cacheSection.length, 5, me.workBook.getActiveSheet().getRowCount() - cacheSection.length, me.distTypeTree.comboDatas, false, 'text');
             cacheSection = null;
         }
     },
@@ -287,26 +284,19 @@ let repositoryGljObj = {
         //混凝土202、砂浆203、配合比204、机械3
         if(info.oldSelections.length === 0 && info.newSelections.length > 0 || info.oldSelections[0].row !== info.newSelections[0].row){
             let row = info.newSelections[0].row;
-            sheetCommonObj.lockCells(that.workBook.getSheet(0), that.setting);
-            that.workBook.getSheet(0).getRange(-1, 0 , -1, 1, GC.Spread.Sheets.SheetArea.viewport).locked(true);
-            that.workBook.getSheet(0).getRange(-1, 4 , -1, 1, GC.Spread.Sheets.SheetArea.viewport).locked(true);
-            //that.workBook.getSheet(0).options.isProtected = true;
             sheetCommonObj.cleanSheet(that.workBook.getSheet(0), that.setting, -1);
             me.workBook.focus(true);
             me.currentComponent = [];
+            that.workBook.getSheet(0).setRowCount(5);
             if(row < me.currentCache.length){
                 //标记当前工料机
                 me.currentGlj = me.currentCache[row];
                 if(me.allowComponent.indexOf(me.currentCache[row].gljType) !== -1){
-                    that.workBook.getSheet(0).getRange(-1, 0 , -1, 1, GC.Spread.Sheets.SheetArea.viewport).locked(false);
-                    that.workBook.getSheet(0).getRange(-1, 4 , -1, 1, GC.Spread.Sheets.SheetArea.viewport).locked(false);
-                    //that.workBook.getSheet(0).options.isProtected = false;
-                    //sheetCommonObj.lockCells(that.workBook.getSheet(0), that.setting);
                     //展示数据
                     if(me.currentGlj.component.length > 0){
                         me.currentComponent = me.getCurrentComponent(me.currentGlj.component);
                         if(me.currentComponent.length > 0){
-                            sheetCommonObj.showData(that.workBook.getSheet(0), that.setting, me.currentComponent);
+                            sheetsOprObj.showData(that.workBook.getSheet(0), that.setting, me.currentComponent);
                         }
                     }
                 }
@@ -318,6 +308,7 @@ let repositoryGljObj = {
     },
     onEnterCell: function (sender, args) {
         let me = repositoryGljObj;
+        args.sheet.repaint();
         me.cellRowIdx = args.row;
         let isHasData = false;
         if(me.addGljObj){
@@ -334,15 +325,15 @@ let repositoryGljObj = {
                 let focusToCol;
                 function getFocusToCol (me){
                     if(!me.addGljObj[me.setting.header[0].dataCode]){
-                        $('#alertGljTxt').text('编号不能为空,是否取消增加工料机?');
+                        $('#alertGljTxt').text('编号不能为空,继续增加工料机?');
                         return 0;
                     }
                     else if(!me.addGljObj[me.setting.header[1].dataCode]){
-                        $('#alertGljTxt').text('名称不能为空,是否取消增加工料机?');
+                        $('#alertGljTxt').text('名称不能为空,继续增加工料机?');
                         return 1;
                     }
                     else if(!me.addGljObj[me.setting.header[5].dataCode]){
-                        $('#alertGljTxt').text('类型不能为空,是否取消增加工料机?');
+                        $('#alertGljTxt').text('类型不能为空,继续增加工料机?');
                         return 5;
                     }
                     else {
@@ -355,37 +346,19 @@ let repositoryGljObj = {
                 }
                 else {
                     $('#gljAlertBtn').click();
-                    //me.workBook.getSheet(0).options.isProtected = true;
-                    sheetCommonObj.lockAllCells(args.sheet);
-                    $('#aleCanceBtn').click(function () {
-                        // me.workBook.getSheet(0).options.isProtected = false;
-                        sheetCommonObj.unLockAllCells(args.sheet);
-                        sheetCommonObj.reLockSomeCodes(args.sheet, 0, repositoryGljObj.currentCache.length);
+                    $('#aleConfBtn').click(function () {
                         me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
                     });
                     $('#gljAleClose').click(function () {
-                        // me.workBook.getSheet(0).options.isProtected = false;
-                        sheetCommonObj.unLockAllCells(args.sheet);
-                        sheetCommonObj.reLockSomeCodes(args.sheet, 0, repositoryGljObj.currentCache.length);
                         me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
                     });
-                    $('#aleConfBtn').click(function () {
-                        // me.workBook.getSheet(0).options.isProtected = false;
-                        sheetCommonObj.unLockAllCells(args.sheet);
-                        sheetCommonObj.reLockSomeCodes(args.sheet, 0, repositoryGljObj.currentCache.length);
+                    $('#aleCanceBtn').click(function () {
                         me.addGljObj = null;
                         for(let col=0; col<me.setting.header.length; col++){
-                            let field = me.setting.header[col].dataCode;
-                            if(field === 'gljType'){
-                                me.workBook.getSheet(0).getCell(me.editingRowIdx, col).value(
-                                    typeof me.currentEditingGlj[field] !== 'undefined'?
-                                        me.distTypeTree.distTypes[me.distTypeTree.prefix + me.currentEditingGlj[field]].data.fullName
-                                        : '');
-                            }
-                            else{
+                            if(col === 0){
                                 me.workBook.getSheet(0).getCell(me.editingRowIdx, 0).formatter("@");
-                                me.workBook.getSheet(0).getCell(me.editingRowIdx, col).value(me.currentEditingGlj[me.setting.header[col].dataCode]);
                             }
+                            me.workBook.getSheet(0).getCell(me.editingRowIdx, col).value('');
                         }
                         me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, 0);
                     });
@@ -395,28 +368,32 @@ let repositoryGljObj = {
     },
     onCellEditStart: function(sender, args) {
         let me = repositoryGljObj;
-        let rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row);
+        let rObj = sheetsOprObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row);
         me.currentEditingGlj = rObj;
         me.orgCode = me.workBook.getSheet(0).getValue(args.row, 0);
-        let cacheSection = me.gljList;
-        if (cacheSection) {
-            for (let j = 0; j < cacheSection.length; j++) {
-                if (cacheSection[j][me.setting.header[0].dataCode] && cacheSection[j][me.setting.header[0].dataCode] == rObj[me.setting.header[0].dataCode]) {
-                    rObj["ID"] = cacheSection[j]["ID"];
-                    rObj.gljClass = cacheSection[j].gljClass;
-                    break;
-                }
+        if(args.row < me.currentCache.length){
+            me.currentGlj = me.currentCache[args.row];
+            if(args.col === 0 || (args.col === 4 && me.allowComponent.indexOf(me.currentGlj.gljType) !== -1)
+                || (args.col === 6 && me.currentGlj.gljType !== 1 && me.currentGlj.gljType !== 303)){
+                args.cancel = true;
+            }
+            else {
+                rObj.ID = me.currentGlj.ID;
+                rObj.gljClass = me.currentGlj.gljClass;
             }
         }
+        else {
+            me.currentGlj = null;
+        }
     },
     onCellEditEnd: function(sender, args) {
         let me = repositoryGljObj, that = gljComponentOprObj,
-            rObj = sheetCommonObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row, me),
+            rObj = sheetsOprObj.combineRowData(me.workBook.getSheet(0), me.setting, args.row, me),
             updateArr = [], addArr = [], updateBasePrcArr = [];
         me.editingRowIdx = args.row;
         rObj.basePrice = rObj.basePrice ? rObj.basePrice : 0;
         //更新
-        if (me.currentEditingGlj["ID"]) {
+        if (me.currentEditingGlj["ID"] && me.currentGlj) {
             rObj["ID"] = me.currentEditingGlj["ID"];
             rObj.gljClass = me.currentEditingGlj.gljClass;
                 if(me.currentEditingGlj[me.setting.header[args.col].dataCode] !== rObj[me.setting.header[args.col].dataCode]){
@@ -429,6 +406,10 @@ let repositoryGljObj = {
                             if(me.allowComponent.indexOf(rObj.gljType) !== -1){
                                 rObj.basePrice = 0;
                             }
+                            //调整系数,工料机类型为人工和机上人工时,可输入整数
+                            if((me.currentEditingGlj.gljType === 1 || me.currentEditingGlj.gljType === 303) && !(rObj.gljType === 1 || rObj.gljType === 303)){
+                                rObj.adjCoe = null;
+                            }
                             if(me.componentGljType.indexOf(me.currentEditingGlj.gljType) !== -1 &&
                                 !(me.currentEditingGlj.gljType === 302 && rObj.gljType === 303) && !(me.currentEditingGlj.gljType === 303 && rObj.gljType === 302)){//修改了原本是组成物的工料机
                                //寻找所有引用了此组成物的工料机,并从组成物中删去此工料机,并重算单价
@@ -442,6 +423,15 @@ let repositoryGljObj = {
                                     }
                                 }
                             }
+                            sheetCommonObj.cleanData(that.workBook.getSheet(0), that.setting, 5);
+                        }
+                        else if(rObj.adjCoe !== me.currentEditingGlj.adjCoe){//修改调整系数,整数控制
+                            if(isNaN(rObj.adjCoe) || rObj.adjCoe % 1 !== 0){
+                                args.sheet.setValue(args.row, args.col, me.currentEditingGlj.adjCoe ? me.currentEditingGlj.adjCoe : '');
+                                alert('调整系数只能输入整数!');
+                                return;
+                            }
+
                         }
                         else if(rObj.basePrice !== me.currentEditingGlj.basePrice){//修改了单价,可修改单价的必为可成为组成物的
                             //寻找所有引用了此组成物的工料机,并从组成物中删去此工料机,并重算单价
@@ -524,7 +514,6 @@ let repositoryGljObj = {
         }
         if(updateArr.length >0 || addArr.length >0){
             me.currentEditingGlj = null;
-            //me.workBook.getSheet(0).setValue(11, 5, "人工");
             me.mixUpdateRequest(updateArr, addArr, []);
         }
     },
@@ -598,12 +587,9 @@ let repositoryGljObj = {
                                 }
                                 $('#alertText').text(text + "不可为空!");
                                 $('#codeAlertBtn').click();
-                                sheet.options.isProtected = true;
                                 $('#codAleConfBtn').click(function () {
-                                    sheetCommonObj.lockSomeCodes(sheet, 0, cacheSection.length);
                                 });
                                 $('#codAleClose').click(function () {
-                                    sheetCommonObj.lockSomeCodes(sheet, 0, cacheSection.length);
                                 });
                             }
                         }
@@ -671,7 +657,13 @@ let repositoryGljObj = {
                 if(pasteObj.gljType === me.distTypeTree.comboDatas[i].text){
                     isExsit = true;
                     reCalBasePrc = true;
-                    //
+                    //调整系数
+                    if(me.distTypeTree.comboDatas[i].value !== 1 && me.distTypeTree.comboDatas[i].value !== 303){
+                        tempObj.adjCoe = null;
+                    }
+                    else if((me.distTypeTree.comboDatas[i].value === 1 || me.distTypeTree.comboDatas[i].value === 303) && typeof pasteObj.adjCoe !== 'undefined' && !isNaN(pasteObj.adjCoe) && pasteObj.adjCoe % 1 === 0) {
+                        tempObj.adjCoe = pasteObj.adjCoe;
+                    }
                     if(me.componentGljType.indexOf(tempObj.gljType) !== -1 &&
                         !(tempObj.gljType === 302 && pasteObj.gljType === 303) && !(tempObj.gljType === 303 && pasteObj.gljType === 302)){//修改了原本是组成物的工料机
                         //寻找所有引用了此组成物的工料机,并从组成物中删去此工料机,并重算单价
@@ -685,15 +677,26 @@ let repositoryGljObj = {
                             }
                         }
                     }
-                    tempObj.gljType = me.distTypeTree.comboDatas[i].value;
-                    tempObj.shortName = me.distTypeTree.distTypes[me.distTypeTree.prefix + tempObj.gljType].data.shortName;
+                    tempObj.component = tempObj.gljType === me.distTypeTree.comboDatas[i].value ? tempObj.component : [];
                     if(me.allowComponent.indexOf(tempObj.gljType) !== -1){
-                        tempObj.basePrice = 0;
+                        tempObj.basePrice = tempObj.gljType === me.distTypeTree.comboDatas[i].value ? tempObj.basePrice : 0;
                     }
+                    tempObj.gljType = me.distTypeTree.comboDatas[i].value;
+                    tempObj.shortName = me.distTypeTree.distTypes[me.distTypeTree.prefix + tempObj.gljType].data.shortName;
                     break;
                 }
             }
-            if(!isExsit) isValid = false;
+            if(!isExsit) {
+                isValid = false;
+            }
+        }
+        if(typeof pasteObj.adjCoe !== 'undefined' && typeof pasteObj.gljType === 'undefined'){
+            if(tempObj.gljType && (tempObj.gljType === 1 || tempObj.gljType === 303) && typeof pasteObj.adjCoe !== 'undefined' && !isNaN(pasteObj.adjCoe) && pasteObj.adjCoe % 1 === 0) {
+                tempObj.adjCoe = pasteObj.adjCoe;
+            }
+            else {
+                isValid = false;
+            }
         }
         if(typeof pasteObj.basePrice !== 'undefined'){
             pasteObj.basePrice = !isNaN(parseFloat(pasteObj.basePrice)) && (pasteObj.basePrice && typeof pasteObj.basePrice !== 'undefined') ? that.round(parseFloat(pasteObj.basePrice), 2) :
@@ -756,131 +759,161 @@ let repositoryGljObj = {
                 }
             }
         }
+        if(pasteObj.adjCoe && typeof pasteObj.adjCoe !== 'undefined'){
+            if(isNaN(pasteObj.adjCoe) || pasteObj.adjCoe % 1 !== 0){
+                return false;
+            }
+        }
         pasteObj.basePrice = !isNaN(parseFloat(pasteObj.basePrice)) && (pasteObj.basePrice && typeof pasteObj.basePrice !== 'undefined') ? parseFloat(pasteObj.basePrice) : 0;
         pasteObj.gljClass = me.gljCurTypeId;
         return true;
     },
-    onClipboardPasting: function(sender, args) {
+    canPasted: function (info) {
+        let rst = true;
         let me = repositoryGljObj;
-        if (me.gljCurTypeId < 0 ) {
-            args.cancel = true;
+        if(me.gljCurTypeId < 0){
+            return false;
         }
-        let maxCol = args.cellRange.col + args.cellRange.colCount - 1;
+        if(info.cellRange.col + info.cellRange.colCount - 1 > me.setting.header.length - 1){
+            return false;
+        }
+        if(info.cellRange.row < me.currentCache.length){
+            if(info.cellRange.col === 0){
+                return false;
+            }
+            else if(info.cellRange.col <= 4 && info.cellRange.col + info.cellRange.colCount - 1 >= 4){
+                for(let i = 0, len = info.cellRange.rowCount; i < len; i++){
+                    let row = i + info.cellRange.row;
+                    if(row < me.currentCache.length){
+                        if(me.allowComponent.indexOf(me.currentCache[row].gljType) !== -1){
+                            rst = false;
+                        }
+                    }
+                    else {
+                        break;
+                    }
+                }
+            }
+        }
+        return rst;
+    },
+    onClipboardPasting: function(sender, args) {
+        let me = repositoryGljObj;
         //复制的列数超过正确的列数,不可复制
-        if(maxCol >= me.setting.header.length){
+        if(!me.canPasted(args)){
             args.cancel = true;
         }
     },
     onClipboardPasted: function(e, info) {
         let me = repositoryGljObj;
-            let updateArr = [], addArr = [];
-            let items = sheetCommonObj.analyzePasteData(me.setting, info);
-            let beginRow = info.cellRange.row, endRow = info.cellRange.row + info.cellRange.rowCount - 1,
-                maxRow = me.currentCache.length - 1,
-                updateBasePrcArr = [] ,
-                updateCount, resumeArr = [];
-            if(endRow <= maxRow){
-                //updateItems = items;
-                for(let i = 0; i < items.length; i++){
-                    let updateObj = me.validUpdateObj(items[i], info.cellRange.row + i);
-                    if(updateObj && typeof updateObj.updateGlj !== 'undefined'){
-                        //updateArr = updateObj.updateGlj;
-                        updateArr = updateArr.concat(updateObj.updateGlj);
-                        if(typeof updateObj.updateBasePrc !== 'undefined'){
-                            //updateBasePrcArr = updateObj.updateBasePrc;
-                            updateBasePrcArr = updateBasePrcArr.concat(updateObj.updateBasePrc);
-                        }
+        let updateArr = [], addArr = [];
+        let items = sheetCommonObj.analyzePasteData(me.setting, info);
+        let beginRow = info.cellRange.row, endRow = info.cellRange.row + info.cellRange.rowCount - 1,
+            maxRow = me.currentCache.length - 1,
+            updateBasePrcArr = [] ,
+            updateCount, resumeArr = [];
+        if(endRow <= maxRow){
+            //updateItems = items;
+            for(let i = 0; i < items.length; i++){
+                let updateObj = me.validUpdateObj(items[i], info.cellRange.row + i);
+                if(updateObj && typeof updateObj.updateGlj !== 'undefined' && updateObj.updateGlj.length > 0){
+                    //updateArr = updateObj.updateGlj;
+                    updateArr = updateArr.concat(updateObj.updateGlj);
+                    if(typeof updateObj.updateBasePrc !== 'undefined'){
+                        //updateBasePrcArr = updateObj.updateBasePrc;
+                        updateBasePrcArr = updateBasePrcArr.concat(updateObj.updateBasePrc);
                     }
-                    else{
-                        resumeArr.push(info.cellRange.row + i);
+                }
+                else{
+                    resumeArr.push(info.cellRange.row + i);
+                }
+            }
+        }
+        else if(beginRow <= maxRow && endRow > maxRow){
+            updateCount = maxRow - beginRow + 1;
+            for(let i = 0; i < updateCount; i++){
+                let updateObj = me.validUpdateObj(items[i], info.cellRange.row + i);
+                if(updateObj && typeof updateObj.updateGlj !== 'undefined'){
+                    updateArr = updateArr.concat(updateObj.updateGlj);
+                    if(typeof updateObj.updateBasePrc !== 'undefined'){
+                        updateBasePrcArr = updateBasePrcArr.concat(updateObj.updateBasePrc);
                     }
                 }
+                else{
+                    resumeArr.push(info.cellRange.row + i);
+                }
             }
-            else if(beginRow <= maxRow && endRow > maxRow){
-                updateCount = maxRow - beginRow + 1;
-                for(let i = 0; i < updateCount; i++){
-                    let updateObj = me.validUpdateObj(items[i], info.cellRange.row + i);
-                    if(updateObj && typeof updateObj.updateGlj !== 'undefined'){
-                        updateArr = updateArr.concat(updateObj.updateGlj);
-                        if(typeof updateObj.updateBasePrc !== 'undefined'){
-                            updateBasePrcArr = updateBasePrcArr.concat(updateObj.updateBasePrc);
+            if(info.cellRange.colCount === me.setting.header.length){
+                for(let i = updateCount ; i < items.length; i++){
+                    if(me.isValidObj(items[i])){
+                        items[i].component = [];
+                        //类型为混凝土、砂浆、配合比、机械时,基价只能组成物计算
+                        if(me.allowComponent.indexOf(items[i].gljType) !== -1){
+                            items[i].basePrice = 0;
                         }
+                        addArr.push(items[i]);
                     }
                     else{
                         resumeArr.push(info.cellRange.row + i);
                     }
                 }
-                if(info.cellRange.colCount === me.setting.header.length){
-                    for(let i = updateCount ; i < items.length; i++){
-                        if(me.isValidObj(items[i])){
-                            items[i].component = [];
-                            //类型为混凝土、砂浆、配合比、机械时,基价只能组成物计算
-                            if(me.allowComponent.indexOf(items[i].gljType) !== -1){
-                                items[i].basePrice = 0;
-                            }
-                            addArr.push(items[i]);
-                        }
-                        else{
-                            resumeArr.push(info.cellRange.row + i);
+            }
+            else{
+                for(let i = updateCount ; i < items.length; i++){
+                    resumeArr.push(info.cellRange.row + i);
+                }
+            }
+        }
+        else{
+            if(info.cellRange.colCount === me.setting.header.length - 1 && info.cellRange.col + info.cellRange.colCount - 1 >= 5){
+                for(let i = 0; i < items.length; i++){
+                    if(me.isValidObj(items[i])){
+                        items[i].component = [];
+                        if(me.allowComponent.indexOf(items[i].gljType) !== -1){
+                            items[i].basePrice = 0;
                         }
+                        addArr.push(items[i]);
                     }
-                }
-                else{
-                    for(let i = updateCount ; i < items.length; i++){
+                    else{
                         resumeArr.push(info.cellRange.row + i);
                     }
                 }
             }
             else{
-                if(info.cellRange.colCount === me.setting.header.length){
-                    for(let i = 0; i < items.length; i++){
-                        if(me.isValidObj(items[i])){
-                            items[i].component = [];
-                            if(me.allowComponent.indexOf(items[i].gljType) !== -1){
-                                items[i].basePrice = 0;
-                            }
-                            addArr.push(items[i]);
+                for(let i = 0; i < items.length; i++){
+                    resumeArr.push(info.cellRange.row + i);
+                }
+            }
+        }
+        //repaint
+        if(resumeArr.length > 0){
+            info.sheet.suspendPaint();
+            for(let i = 0; i < resumeArr.length ; i++){
+                if(resumeArr[i] < me.currentCache.length){
+                    for(let col = 0; col < me.setting.header.length; col++){
+                        if(me.setting.header[col].dataCode === 'gljType'){
+                            let gljType = me.currentCache[resumeArr[i]][me.setting.header[col].dataCode];
+                            info.sheet.setValue(resumeArr[i], col, me.distTypeTree.distTypes["gljType" + gljType].data.fullName);
                         }
                         else{
-                            resumeArr.push(info.cellRange.row + i);
+                            info.sheet.setValue(resumeArr[i], col, me.currentCache[resumeArr[i]][me.setting.header[col].dataCode]);
                         }
                     }
                 }
                 else{
-                    for(let i = 0; i < items.length; i++){
-                        resumeArr.push(info.cellRange.row + i);
+                    for(let col = 0; col < me.setting.header.length; col++){
+                        info.sheet.setValue(resumeArr[i], col, '');
                     }
                 }
             }
-            //repaint
-            if(resumeArr.length > 0){
-                info.sheet.suspendPaint();
-                for(let i = 0; i < resumeArr.length ; i++){
-                    if(resumeArr[i] < me.currentCache.length){
-                        for(let col = 0; col < me.setting.header.length; col++){
-                            if(me.setting.header[col].dataCode === 'gljType'){
-                                let gljType = me.currentCache[resumeArr[i]][me.setting.header[col].dataCode];
-                                info.sheet.setValue(resumeArr[i], col, me.distTypeTree.distTypes["gljType" + gljType].data.fullName);
-                            }
-                            else{
-                                info.sheet.setValue(resumeArr[i], col, me.currentCache[resumeArr[i]][me.setting.header[col].dataCode]);
-                            }
-                        }
-                    }
-                    else{
-                        for(let col = 0; col < me.setting.header.length; col++){
-                            info.sheet.setValue(resumeArr[i], col, '');
-                        }
-                    }
-                }
-                info.sheet.resumePaint();
-            }
-            if (updateArr.length > 0 || addArr.length > 0) {
-                me.mixUpdateRequest(updateArr, addArr, []);
-            }
-            if(updateBasePrcArr.length > 0 && me.rationLibs.length > 0){
-                me.updateRationBasePrcRq(updateBasePrcArr);
-            }
+            info.sheet.resumePaint();
+        }
+        if (updateArr.length > 0 || addArr.length > 0) {
+            me.mixUpdateRequest(updateArr, addArr, []);
+        }
+        if(updateBasePrcArr.length > 0 && me.rationLibs.length > 0){
+            me.updateRationBasePrcRq(updateBasePrcArr);
+        }
     },
     updateRationBasePrcRq: function (basePrcArr) {
         $.ajax({
@@ -921,7 +954,6 @@ let repositoryGljObj = {
             success:function(result){
                 if (result.error) {
                     alert(result.message);
-                    me.getRationItems(me.currentRepositoryId);
                 } else {
                     me.updateCache(addArr, updateArr, removeIds, result);
                     me.sortGlj();
@@ -930,14 +962,18 @@ let repositoryGljObj = {
                     }
                     else{
                         me.currentCache = me.getCache();
-                        //sheetCommonObj.unLockAllCells(me.workBook.getSheet(0));
-                        sheetCommonObj.reLockSomeCodes(me.workBook.getSheet(0), 0, me.currentCache.length);
-                        //sheetCommonObj.lockSomeCodes(me.workBook.getSheet(0), 0, me.currentCache.length);
                     }
                     me.showGljItems(me.gljList, me.gljCurTypeId);
+                    //getCurrentGlj
+                    let row = me.workBook.getSheet(0).getSelections()[0].row;
+                    me.currentGlj = row < me.currentCache.length ? me.currentCache[row] : null;
+                    me.currentComponent = me.currentGlj ?  me.getCurrentComponent(me.currentGlj.component) : [];
+                    sheetCommonObj.cleanData(gljComponentOprObj.workBook.getSheet(0), gljComponentOprObj.setting, -1);
+                    sheetsOprObj.showData(gljComponentOprObj.workBook.getSheet(0), gljComponentOprObj.setting, me.currentComponent);
                 }
             },
             error:function(err){
+                console.log(err);
                 alert("保存失败");
             }
         })
@@ -1020,25 +1056,14 @@ let gljTypeTreeOprObj = {
             gljTypeId = treeNode.ID;
         me.gljCurTypeId = treeNode.ID;
         me.addGljObj = null;
-        //me.currentCache = me.getCache();
         sheetCommonObj.cleanSheet(that.workBook.getSheet(0), that.setting, 5);
-        that.workBook.getSheet(0).getRange(-1, 0 , -1, 1, GC.Spread.Sheets.SheetArea.viewport).locked(true);
-        that.workBook.getSheet(0).getRange(-1, 4 , -1, 1, GC.Spread.Sheets.SheetArea.viewport).locked(true);
-        //that.workBook.getSheet(0).options.isProtected = true;
         if (me.parentNodeIds["_pNodeId_" + treeNode.ID]) {
             me.currentOprParent = 1;
             me.currentCache = me.getParentCache(me.parentNodeIds["_pNodeId_" + treeNode.ID]);
-            sheetCommonObj.lockCodeCells(me.workBook.getSheet(0), me.currentCache.length);
             me.workBook.getSheet(0).setRowCount(me.currentCache.length);
-            //sheetCommonObj.shieldAllCells(me.workBook.getSheet(0), me.setting);
         } else {
             me.currentOprParent = 0;
             me.currentCache = me.getCache();
-            //sheetCommonObj.unShieldAllCells(me.workBook.getSheet(0));
-            /*sheetCommonObj.unLockAllCells(me.workBook.getSheet(0));
-             sheetCommonObj.lockSomeCodes(me.workBook.getSheet(0), 0, me.currentCache.length);*/
-            sheetCommonObj.unLockAllCells(me.workBook.getSheet(0));
-            sheetCommonObj.reLockSomeCodes(me.workBook.getSheet(0), 0, me.currentCache.length);
         }
         me.showGljItems(me.gljList, gljTypeId);
     },

+ 92 - 12
web/maintain/std_glj_lib/js/gljComponent.js

@@ -9,12 +9,12 @@ let gljComponentOprObj = {
         header:[
             {headerName:"编码",headerWidth:50,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
             {headerName:"名称",headerWidth:60,dataCode:"name", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"},
-            {headerName:"计量单位",headerWidth:60,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
+            {headerName:"单位",headerWidth:60,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"},
             {headerName:"单价",headerWidth:50,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"},
             {headerName:"消耗量",headerWidth:55,dataCode:"consumeAmt", dataType: "Number", formatter: "0.000", hAlign: "right", vAlign: "center"}
         ],
         view: {
-            lockedCells:[1, 2, 3]
+            lockedCols:[1, 2, 3]
         }
     },
     buildSheet: function(container) {
@@ -22,20 +22,14 @@ let gljComponentOprObj = {
         me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30, me);
         me.workBook.getSheet(0).setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader);
         me.workBook.getSheet(0).setFormatter(-1, 0, "@", GC.Spread.Sheets.SheetArea.viewport);
-        me.workBook.getSheet(0).options.isProtected = true;
         sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
 
         me.gljComponentDelOpr();
+        me.onContextmenuOpr();
         me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
         me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditStarting, me.onCellEditStart);
         me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditEnded, me.onCellEditEnd);
-       /* me.repositoryGljDelOpr();
-        me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
-        me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
-        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditStarting, me.onCellEditStart);
-        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditEnded, me.onCellEditEnd);
-        me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EnterCell, me.onEnterCell);*/
     },
     getRowData: function (sheet, row, setting) {
         let rst = {};
@@ -135,10 +129,96 @@ let gljComponentOprObj = {
         me.workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
         me.workBook.commandManager().setShortcutKey('gljComponentDel', GC.Spread.Commands.Key.del, false, false, false, false);
     },
+    onContextmenuOpr: function () {
+        let me = gljComponentOprObj, that = repositoryGljObj, co = componentOprObj;
+        $.contextMenu({
+            selector: '#gljComponentSheet',
+            build: function($triggerElement, e){
+                //控制允许右键菜单在哪个位置出现
+                let sheet = me.workBook.getSheet(0);
+                let offset = $("#gljComponentSheet").offset(),
+                    x = e.pageX - offset.left,
+                    y = e.pageY - offset.top;
+                let target = sheet.hitTest(x, y);
+                if(target.hitTestType === 3 && typeof target.row !== 'undefined' && typeof target.col !== 'undefined'){//在表格内
+                    sheet.setActiveCell(target.row, target.col);
+                    //getCurrentGlj
+                    let thatRow = that.workBook.getSheet(0).getSelections()[0].row;
+                    that.currentGlj = thatRow < that.currentCache.length ? that.currentCache[thatRow] : null;
+                    that.currentComponent = that.currentGlj ?  that.getCurrentComponent(that.currentGlj.component) : [];
+                    //控制按钮是否可用
+                    let insertDis = false,
+                        delDis = false;
+                    if(!(that.currentGlj && that.allowComponent.indexOf(that.currentGlj.gljType) !== -1)){
+                        insertDis = true;
+                    }
+                    if(!that.currentGlj || typeof that.currentComponent === 'undefined' || (typeof that.currentComponent !== 'undefined' && target.row >= that.currentComponent.length)){//右键定位在有组成物的行,删除键才显示可用
+                        delDis = true;
+                    }
+                    return {
+                        callback: function(){},
+                        items: {
+                            "insert": {name: "插入", disabled: insertDis, icon: "fa-sign-in", callback: function (key, opt) {
+                                //默认radio所有工料机
+                                co.initRadio();
+                                co.gljCurTypeId = null;
+                                //默认点击树根节点
+                                if(co.rootNode){
+                                    co.treeObj.selectNode(co.rootNode);
+                                    componentTypeTreeOprObj.onClick(null, 'componentTree', co.rootNode);
+                                }
+                                //弹出窗口
+                                $('#componentBtn').click();
+                            }},
+                            "delete": {name: "删除", disabled: delDis, icon: "fa-remove", callback: function (key, opt) {
+                                //删除
+                                let deleteObj = that.currentComponent[target.row];
+                                let gljComponent = that.currentGlj.component;
+                                let updateArr = [], updateBasePrcArr = [];
+                                //更新当前工料机的组成物列表
+                                for(let i = 0, len = gljComponent.length; i < len; i++){
+                                    if(gljComponent[i].ID === deleteObj.ID){
+                                        gljComponent.splice(i, 1);
+                                        break;
+                                    }
+                                }
+                                //重新计算工料机
+                                let gljBasePrc = me.reCalGljBasePrc(that.getCurrentComponent(gljComponent));
+                                if(gljBasePrc !== that.currentGlj.basePrice){
+                                    that.currentGlj.basePrice = gljBasePrc;
+                                    that.reshowGljBasePrc(that.currentGlj);
+                                    updateBasePrcArr.push({gljId: that.currentGlj.ID, gljType: that.currentGlj.gljType, basePrice: that.currentGlj.basePrice});
+                                }
+                                updateArr.push(that.currentGlj);
+                                me.updateComponent(updateArr);
+                                if(updateBasePrcArr.length > 0 && that.rationLibs.length > 0){
+                                    that.updateRationBasePrcRq(updateBasePrcArr);
+                                }
+                            }}
+                        }
+                    };
+                }
+                else{
+                    return false;
+                }
+            }
+        });
+    },
     onCellEditStart: function(sender, args) {
         let me = gljComponentOprObj, that = repositoryGljObj;
         let rObj = me.getRowData(args.sheet, args.row, me.setting);
         me.currentEditingComponent = rObj;
+        let thatRow = that.workBook.getSheet(0).getSelections()[0].row;
+        if(thatRow < that.currentCache.length){
+            that.currentGlj = that.currentCache[thatRow];
+            if(me.setting.view.lockedCols.indexOf(args.col) !== -1 || that.allowComponent.indexOf(that.currentGlj.gljType) === -1 ||
+                (args.col === 4 && (!that.currentComponent|| args.row >= that.currentComponent.length))){
+                args.cancel = true;
+            }
+        }
+        else {
+            args.cancel = true;
+        }
     },
     onCellEditEnd: function (sender, args) {
         let me = gljComponentOprObj, that = repositoryGljObj, updateBasePrc = [];
@@ -270,7 +350,7 @@ let gljComponentOprObj = {
         let me = gljComponentOprObj;
         let maxCol = info.cellRange.col + info.cellRange.colCount - 1;
         //复制的列数超过正确的列数,不可复制
-        if(maxCol >= me.setting.header.length){
+        if(info.cellRange.col !== 0 && info.cellRange.col !== 4 || info.cellRange.colCount > 1){
             args.cancel = true;
         }
     },
@@ -278,6 +358,7 @@ let gljComponentOprObj = {
         let me = gljComponentOprObj, that = repositoryGljObj, updateArr = [] ,materialComponent = [202, 203, 204], machineComponent = [302, 303],
             component = that.currentGlj.component, newComponent = [], concatComponent = [], isChange = false, updateBasePrc = [];
         let items = sheetCommonObj.analyzePasteData(me.setting, info);
+        console.log(items);
         let gljCache = that.gljList;
         if(info.cellRange.col === 0){
             for(let i = 0; i < items.length; i++){
@@ -398,9 +479,8 @@ let gljComponentOprObj = {
                     if(result.data[0]){
                         that.currentComponent =  that.getCurrentComponent(result.data[0].component);
                         me.workBook.getSheet(0).getSelections()[0]
-                        //sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1);
                         sheetCommonObj.cleanData(me.workBook.getSheet(0), me.setting, -1);
-                        sheetCommonObj.showData(me.workBook.getSheet(0), me.setting, that.currentComponent);
+                        sheetsOprObj.showData(me.workBook.getSheet(0), me.setting, that.currentComponent);
                     }
                 }
             }

+ 85 - 71
web/maintain/std_glj_lib/js/main.js

@@ -3,78 +3,90 @@
  */
 $(function () {
     let dispNameArr;
-    getAllGljLib(function (dispNames, compilationsUsedArr) {
-        dispNameArr = dispNames;
-        //添加
-        $('#addBtn').click(function () {
-            let compilationName = $('#compilationSels option:selected').text();
-            let compilationId = $('#compilationSels option:selected').val();
-            let libName = $('#libNameTxt').val();
-            if(libName.trim().length === 0){
-                alert('名称不可为空!');
-                $('#libNameTxt').val('')
-            }
-            else if(compilationsUsedArr.indexOf(compilationId) !== -1){// compilationsUsedArr;//在该编办下已建库,限制一个编办只能有一个库
-                alert('该编办已被绑定!');
-                $('#libNameTxt').val('')
-            }
-            else if(dispNames.indexOf(libName) !== -1){
-                alert('此工料机库已存在!');
-                $('#libNameTxt').val('')
-            }
-            else if(compilationName.trim().length === 0){
-                alert('编办不可为空!');
-            }
-            else{
-                let newGljLib = {};
-                newGljLib.dispName = libName;
-                newGljLib.compilationId = compilationId;
-                newGljLib.compilationName = compilationName;
-                newGljLib.creator = oprtor;
-                newGljLib.appType = "建筑";
-                $('#libNameTxt').val('');
-                createGljLib(newGljLib, dispNameArr);
-            }
-        });
-        //重命名
-        $("#showArea").on("click", "[data-target = '#edit']", function(){
-            let renameId = $(this).parent().parent().attr("id");
-            let compilationName = $(this).parent().parent().children()[1].textContent;
-            $('#compilationEdit option').text(compilationName);
-            $("#renameA").attr("renameId", renameId);
-        });
-        $("#renameA").click(function(){
-            let newName = $("#renameText").val();
-            let libId = $(this).attr("renameId");
-            let jqSel = "#" + libId + " td:first" + " a";
-            let orgName = $(jqSel).text();
-            if(newName.trim().length === 0){
-                alert("名称不可为空!");
-                $("#renameText").val('');
-            }
-            else if(dispNameArr.indexOf(newName) !== -1){
-                alert("该工料机库已存在!");
-                $("#renameText").val('');
-            }
-           else{
-               renameGljLib({ID: libId, newName: newName, orgName: orgName}, dispNameArr);
-            }
-        });
-        //删除
-        $("#showArea").on("click", "[data-target = '#del']", function(){
-            let deleteId = $(this).parent().parent().attr("id");
-            $("#deleteA").attr("deleteId", deleteId);
-        });
-        $("#deleteA").click(function(){
-            let deleteId = $(this).attr("deleteId");
-            let jqSel = "#" + deleteId + " td:first" + " a";
-            let libName = $(jqSel).text();
-            removeGljLib({libId: deleteId, libName: libName}, dispNameArr);
-        });
+    let compilationsArr;
+    let usedCom;
+    getCompilationList(function (datas) {
+        compilationsArr = datas;
+        getAllGljLib(function (dispNames, compilationsUsedArr) {
+            usedCom = compilationsUsedArr;
+            dispNameArr = dispNames;
+            //添加
+            $('#addBtn').click(function () {
+                let compilationName = $('#compilationSels option:selected').text();
+                let compilationId = $('#compilationSels option:selected').val();
+                let libName = $('#libNameTxt').val();
+                if(libName.trim().length === 0){
+                    alert('名称不可为空!');
+                    $('#libNameTxt').val('')
+                }
+                else if(compilationsUsedArr.indexOf(compilationId) !== -1){// compilationsUsedArr;//在该编办下已建库,限制一个编办只能有一个库
+                    alert('该编办已被绑定!');
+                    $('#libNameTxt').val('')
+                }
+                else if(dispNames.indexOf(libName) !== -1){
+                    alert('此工料机库已存在!');
+                    $('#libNameTxt').val('')
+                }
+                else if(compilationName.trim().length === 0){
+                    alert('编办不可为空!');
+                }
+                else{
+                    let newGljLib = {};
+                    newGljLib.dispName = libName;
+                    newGljLib.compilationId = compilationId;
+                    newGljLib.compilationName = compilationName;
+                    newGljLib.creator = oprtor;
+                    newGljLib.appType = "建筑";
+                    $('#libNameTxt').val('');
+                    createGljLib(newGljLib, dispNameArr, usedCom);
+                }
+            });
+            //重命名
+            $("#showArea").on("click", "[data-target = '#edit']", function(){
+                let renameId = $(this).parent().parent().attr("id");
+                let compilationName = $(this).parent().parent().children()[1].textContent;
+                $('#compilationEdit option').text(compilationName);
+                $("#renameA").attr("renameId", renameId);
+            });
+            $("#renameA").click(function(){
+                let newName = $("#renameText").val();
+                let libId = $(this).attr("renameId");
+                let jqSel = "#" + libId + " td:first" + " a";
+                let orgName = $(jqSel).text();
+                if(newName.trim().length === 0){
+                    alert("名称不可为空!");
+                    $("#renameText").val('');
+                }
+                else if(dispNameArr.indexOf(newName) !== -1){
+                    alert("该工料机库已存在!");
+                    $("#renameText").val('');
+                }
+                else{
+                    renameGljLib({ID: libId, newName: newName, orgName: orgName}, dispNameArr);
+                }
+            });
+            //删除
+            $("#showArea").on("click", "[data-target = '#del']", function(){
+                let deleteId = $(this).parent().parent().attr("id");
+                $("#deleteA").attr("deleteId", deleteId);
+            });
+            $("#deleteA").click(function(){
+                let deleteId = $(this).attr("deleteId");
+                let jqSel = "#" + deleteId + " td:first" + " a";
+                let libName = $(jqSel).text();
+                let compilationName = $("#" + deleteId + " td:eq(1)").text();
+                for(let i = 0, len = compilationsArr.length; i < len; i++){
+                    if(compilationsArr[i].name === compilationName.trim()){
+                        usedCom.splice(usedCom.indexOf(compilationsArr[i]._id), 1);
+                        break;
+                    }
+                }
+                removeGljLib({libId: deleteId, libName: libName}, dispNameArr);
+            });
 
 
+        });
     });
-    getCompilationList();
 });
 
 function getAllGljLib(callback){
@@ -116,7 +128,7 @@ function getAllGljLib(callback){
         }
     });
 }
-function getCompilationList(){
+function getCompilationList(callback){
     $.ajax({
         type: 'post',
         url: 'api/getCompilationList',
@@ -130,10 +142,11 @@ function getCompilationList(){
             }
             $('#compilationSels').on("change", function () {
             });
+            callback(result.data);
         }
     });
 }
-function createGljLib(gljLibObj, dispNamesArr){
+function createGljLib(gljLibObj, dispNamesArr, usedCom){
     $.ajax({
         type: 'post',
         url: 'api/createGljLib',
@@ -146,6 +159,7 @@ function createGljLib(gljLibObj, dispNamesArr){
                 let createDate = result.data.createDate.split(' ')[0];
                 let compilationName = result.data.compilationName;
                 dispNamesArr.push(libName);
+                usedCom.push(gljLibObj.compilationId);
                 $("#showArea").append(
                     "<tr id='tempId'>" +
                     "<td><a href='/stdGljRepository/glj'>"+libName+"</a></td>" +

+ 178 - 0
web/maintain/std_glj_lib/js/sheetsOpr.js

@@ -0,0 +1,178 @@
+/**
+ * Created by Zhong on 2017/9/29.
+ */
+let sheetsOprObj = {
+    setAreaAlign: function(area, hAlign, vAlign){
+        if (!(hAlign) || hAlign === "left") {
+            area.hAlign(GC.Spread.Sheets.HorizontalAlign.left);
+        } else if (hAlign === "right") {
+            area.hAlign(GC.Spread.Sheets.HorizontalAlign.right);
+        } else if (hAlign === "center") {
+            area.hAlign(GC.Spread.Sheets.HorizontalAlign.center);
+        } else {
+            area.hAlign(GC.Spread.Sheets.HorizontalAlign.left);
+        }
+        if (!(vAlign) || vAlign === "center") {
+            area.vAlign(GC.Spread.Sheets.VerticalAlign.center);
+        } else if (vAlign === "top") {
+            area.vAlign(GC.Spread.Sheets.VerticalAlign.top);
+        } else if (vAlign === "bottom") {
+            area.vAlign(GC.Spread.Sheets.VerticalAlign.bottom);
+        } else {
+            area.vAlign(GC.Spread.Sheets.VerticalAlign.center);
+        }
+    },
+    showData: function(sheet, setting, data, distTypeTree) {
+        var me = this, ch = GC.Spread.Sheets.SheetArea.viewport;
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        if(typeof setting.owner !== 'undefined' && setting.owner === 'gljComponent'){
+            sheet.setRowCount(data.length + 5);
+        }
+        else{
+            sheet.setRowCount(typeof repositoryGljObj !== 'undefined' && repositoryGljObj.currentOprParent === 1 ? data.length : data.length + 10);
+        }
+        for (var col = 0; col < setting.header.length; col++) {
+            var hAlign = "left", vAlign = "center";
+            if (setting.header[col].hAlign) {
+                hAlign = setting.header[col].hAlign;
+            } else if (setting.header[col].dataType !== "String"){
+                hAlign = "right";
+            }
+            vAlign = setting.header[col].vAlign?setting.header[col].vAlign:vAlign;
+            me.setAreaAlign(sheet.getRange(-1, col, -1, 1), hAlign, vAlign);
+            if (setting.header[col].formatter) {
+                sheet.setFormatter(-1, col, setting.header[col].formatter, GC.Spread.Sheets.SheetArea.viewport);
+            }
+            for (var row = 0; row < data.length; row++) {
+                //var cell = sheet.getCell(row, col, GC.Spread.Sheets.SheetArea.viewport);
+                if(setting.header[col].dataCode === 'gljType' && data[row].gljType){
+                    let distTypeVal =  distTypeTree.distTypes[distTypeTree.prefix + data[row].gljType].data.fullName;
+                    sheet.setValue(row, col, distTypeVal, ch);
+                }
+                else if(setting.header[col].dataCode === 'select'){
+                    if(data[row].isChecked === true){
+                        sheet.getCell(row, col).value(1);
+                    }
+                }
+                else {
+                    sheet.setValue(row, col, data[row][setting.header[col].dataCode], ch);
+                    sheet.setTag(row, 0, data[row].ID, ch);
+                }
+            }
+        }
+        sheet.resumeEvent();
+        sheet.resumePaint();
+    },
+    combineRowData: function(sheet, setting, row, repositoryGljObj) {
+        let me = this;
+        var rst = {};
+        let comboBoxCellType = sheet.getCellType(row, 5);
+        let items = comboBoxCellType.items();
+        for (var col = 0; col < setting.header.length; col++) {
+            if(setting.header[col].dataCode === 'gljType'){
+                items.forEach(function(item){
+                    if(sheet.getValue(row, col) === item.text){
+                        rst[setting.header[col].dataCode] = item.value;
+                        if(repositoryGljObj){
+                            rst.shortName = repositoryGljObj.distTypeTree.distTypes[repositoryGljObj.distTypeTree.prefix + item.value].data.shortName;
+                        }
+                    }
+                });
+            }
+            else if (setting.header[col].dataCode === 'code'){
+                if(repositoryGljObj){
+                    let gljList = repositoryGljObj.gljList,
+                        orgCode = repositoryGljObj.orgCode,
+                        isExist = false;
+                    for(let i=0; i< gljList.length; i++){
+                        if(gljList[i].code === sheet.getValue(row, col) && sheet.getValue(row, col)!== orgCode){
+                            $('#alertText').text("输入的编号已存在,请重新输入!");
+                            $('#codeAlertBtn').click();
+                            $('#codAleConfBtn').click(function () {
+                                sheet.setValue(row, 0, orgCode);
+                                sheet.getCell(row, 0).formatter("@");
+                                sheet.setActiveCell(row, 0);
+                            });
+                            $('#codAleClose').click(function () {
+                                sheet.setValue(row, 0, orgCode);
+                                sheet.getCell(row, 0).formatter("@");
+                                sheet.setActiveCell(row, 0);
+                            });
+                            isExist = true
+                        }
+                    }
+                    if(!isExist){
+                        rst[setting.header[col].dataCode] = sheet.getValue(row, col);
+                    }
+                }
+                else{
+                    rst[setting.header[col].dataCode] = sheet.getValue(row, col);
+                }
+            }
+            else{
+                rst[setting.header[col].dataCode] = sheet.getValue(row, col);
+            }
+        }
+        return rst;
+    },
+    combineRationRowData: function(sheet, setting, row) {
+        var rst = {};
+        for (var col = 0; col < setting.header.length; col++) {
+            rst[setting.header[col].dataCode] = sheet.getValue(row, col);
+        }
+        return rst;
+    },
+    reLockSomeCodes: function (sheet, beginRow, endRow) {
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        let defaultStyle = new GC.Spread.Sheets.Style();
+        defaultStyle.locked = false;
+        sheet.setDefaultStyle(defaultStyle, GC.Spread.Sheets.SheetArea.viewport);
+        let unLockStyle = new GC.Spread.Sheets.Style();
+        unLockStyle.locked = false;
+        let lockStyle = new GC.Spread.Sheets.Style();
+        lockStyle.locked = true;
+        for(let row = beginRow; row < endRow; row++){
+            sheet.setStyle(row, 0, lockStyle);
+        }
+        for(let row = endRow; row < sheet.getRowCount(); row++){
+            sheet.setStyle(row, 0, unLockStyle);
+        }
+        sheet.options.isProtected = true;
+        sheet.resumePaint();
+        sheet.resumeEvent();
+    },
+    lockSomeCodes: function (sheet, beginRow, endRow) {
+        let defaultStyle = new GC.Spread.Sheets.Style();
+        defaultStyle.locked = false;
+        sheet.setDefaultStyle(defaultStyle, GC.Spread.Sheets.SheetArea.viewport);
+        let style = new  GC.Spread.Sheets.Style();
+        style.locked = true;
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        for(let i = beginRow; i < endRow; i++){
+            sheet.setStyle(i, 0, style);
+        }
+        sheet.options.isProtected = true;
+        sheet.resumePaint();
+        sheet.resumeEvent();
+    },
+    lockCodeCells: function (sheet, rowCount) {
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        let sheetRowCount = sheet.getRowCount();
+        let defaultStyle = new GC.Spread.Sheets.Style();
+        defaultStyle.locked = false;
+        sheet.setDefaultStyle(defaultStyle, GC.Spread.Sheets.SheetArea.viewport);
+        let style = new GC.Spread.Sheets.Style();
+        style.locked = true;
+        sheet.setStyle(-1, 0, style);
+        for(let i =rowCount; i<sheetRowCount; i++){
+            sheet.setStyle(i, -1, style);
+        }
+        sheet.options.isProtected = true;
+        sheet.resumePaint();
+        sheet.resumeEvent();
+    }
+};

+ 3 - 2
web/users/js/col_setting.js

@@ -47,7 +47,8 @@ let ColSettingObj = {
         this.cellType.readOnly.items([true, false,
             'readOnly.bills', 'readOnly.ration', 'readOnly.volumePrice',
             'readOnly.non_bills', 'readOnly.non_ration', 'readOnly.non_volumePrice',
-            'readOnly.billsParent', 'readOnly.forCalcBase'
+            'readOnly.billsParent', 'readOnly.forCalcBase', 'readOnly.forUnitFee',
+            'readOnly.forTotalFee', 'readOnly.leafBillsWithDetail'
         ]);
 
         this.cellType.getText = new GC.Spread.Sheets.CellTypes.ComboBox();
@@ -138,7 +139,7 @@ let ColSettingObj = {
                 // data
                 // field
                 let cell = sheet.getCell(this.colSetting.headRows + this.Rows.data, iCol, GC.Spread.Sheets.SheetArea.viewport);
-                cell.value(col.data.field).font(col.data.font).hAlign(col.head.hAlign).vAlign(col.data.vAlign);
+                cell.value(col.data.field).font(col.data.font).hAlign(col.data.hAlign).vAlign(col.data.vAlign);
                 // getText
                 cell = sheet.getCell(this.colSetting.headRows + this.Rows.getText, iCol, GC.Spread.Sheets.SheetArea.viewport);
                 cell.cellType(this.cellType.getText).value(col.data.getText).hAlign(GC.Spread.Sheets.HorizontalAlign.right);

+ 1 - 1
web/users/js/template.js

@@ -183,7 +183,7 @@ $(document).ready(function () {
         }
     }
 
-    billsTemplateData = billsTemplateData.replace('\n', '\\n');
+    billsTemplateData = billsTemplateData.replace(/\n/g, '\\n');
     let templateData = JSON.parse(billsTemplateData);
     for (let data of templateData) {
         if (data.flags) {