Browse Source

定额库工作内容相关

zhongzewei 7 năm trước cách đây
mục cha
commit
c8def9a609

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

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

+ 10 - 0
modules/ration_repository/controllers/ration_section_tree_controller.js

@@ -69,6 +69,16 @@ class RationChapterTreeController extends BaseController{
         });
 
     }
+    updateSituation(req, res){
+        let repId = req.body.repId,
+            nodeId = req.body.nodeId,
+            situation = req.body.situation,
+            lastOpr = req.body.lastOpr;
+        rationChapterTreeData.updateSituation(lastOpr, repId, nodeId, situation, function (err) {
+            callback(req, res, err, '', null);
+        });
+
+    }
 }
 
 export default RationChapterTreeController;

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

@@ -381,5 +381,27 @@ rationItemDAO.prototype.getRationsCodes = function (data, callback) {
     })
 };
 
+rationItemDAO.prototype.updateJobContent = 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: {jobContent: obj.jobContent}}, 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

@@ -127,6 +127,18 @@ rationChapterTreeDAO.prototype.updateRuleText = function (lastOpr, repId, nodeId
         }
     });
 };
+rationChapterTreeDAO.prototype.updateSituation = function (lastOpr, repId, nodeId, situation, callback) {
+    rationChapterTreeModel.update({rationRepId: repId, ID: nodeId}, {$set: {jobContentSituation: 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 = [];

+ 2 - 0
modules/ration_repository/models/schemas.js

@@ -55,6 +55,7 @@ let rationChapterTreeSchema = new Schema({
     name: String,
     explanation: String,//说明
     ruleText: String,//计算规则
+    jobContentSituation: String,//工作内容适用情况,ALL适用本项全部定额,PARTIAL适用本项部分定额
     isDeleted: Boolean
 });
 
@@ -92,6 +93,7 @@ var rationItemSchema = new Schema({
     rationRepId: Number,
     caption: String,
     feeType: Number,
+    jobContent: String,
     rationGljList: [rationGljItemSchema],
     rationCoeList: Array,
     rationAssList: [rationAssItemSchema],

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

@@ -41,12 +41,14 @@ module.exports =  function (app) {
     apiRouter.post("/deleteNodes",rationChapterTreeController.auth, rationChapterTreeController.init, rationChapterTreeController.deleteNodes);
     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("/getRationItems",rationController.auth, rationController.init, rationController.getRationItemsBySection);
     apiRouter.post("/mixUpdateRationItems",rationController.auth, rationController.init, rationController.mixUpdateRationItems);
     apiRouter.post("/updateRationBasePrc",rationController.auth, rationController.init, rationController.updateRationBasePrc);
     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("/createNewGljTypeNode",repositoryGljController.auth, repositoryGljController.init, repositoryGljController.createNewGljTypeNode);
     apiRouter.post("/updateGljNodes",repositoryGljController.auth, repositoryGljController.init, repositoryGljController.updateGljNodes);

+ 10 - 139
web/maintain/ration_repository/dinge.html

@@ -124,81 +124,14 @@
                           <!--工作内容-->
                           <div class="tab-pane" id="tgz" 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="optionsRadios" value="option1" checked=""> 适合本项所有定额</label>&nbsp;&nbsp;<label class="form-check-label"><input type="radio" class="form-check-input" name="optionsRadios" value="option1"> 适合本项部分定额</label></div>
+                                  <div class="form-check m-2"><label class="form-check-label"><input type="radio" class="form-check-input" name="optionsRadios" value="ALL" disabled=""> 适合本项所有定额</label>&nbsp;&nbsp;<label class="form-check-label"><input type="radio" class="form-check-input" name="optionsRadios" value="PARTIAL" disabled> 适合本项部分定额</label></div>
                                   <!-- <p class="m-2">适合本项所有定额</p> -->
-                                  <table class="table table-sm table-bordered m-0">
+                                  <table class="table table-sm table-bordered m-0" id="tableAll">
                                       <tr>
-                                          <td>1.挖土、修理边底。2.挖淤泥、流沙、修理边底。</td>
+                                          <td><textarea class="form-control" rows="30" id="txtareaAll"></textarea></td>
                                       </tr>
                                   </table>
-                                  <div class="form-check m-2"><label class="form-check-label"><input type="radio" class="form-check-input" name="optionsRadios2" value="option1"> 适合本项所有定额</label>&nbsp;&nbsp;<label class="form-check-label"><input type="radio" class="form-check-input" name="optionsRadios2" value="option1" checked=""> 适合本项部分定额</label></div>
-                                  <table class="table table-sm table-bordered m-0">
-                                      <thead>
-                                      <tr>
-                                          <th></th>
-                                          <th>编码</th>
-                                          <th>工作内容</th>
-                                      </tr>
-                                      </thead>
-                                      <tbody>
-                                      <tr>
-                                          <td>1</td>
-                                          <td><a href data-toggle="modal" data-target="#editBianmaQ" class="m-0">编辑编码</a><p class="m-0">AA0017</p><p class="m-0">AA0018</p><p class="m-0">AA0019</p><p class="m-0">AA0020</p><p class="m-0">AA0021</p><p class="m-0">AA0022</p></td>
-                                          <td><p class="m-0">1.松填土:5m内的就地取土,铺平。</p><p class="m-0">2.夯填土方(石渣):5m内的就地取土(石渣)、铺平、夯实、洒水等。</p></td>
-                                      </tr>
-                              <tr>
-                                  <td>2</td>
-                                  <td><a href data-toggle="modal" data-target="#editBianma" class="m-0">点击勾选编码</a></td>
-                                  <td></td>
-                              </tr>
-                              <tr>
-                                  <td>3</td>
-                                  <td></td>
-                                  <td></td>
-                              </tr>
-                              <tr>
-                                  <td>4</td>
-                                  <td></td>
-                                  <td></td>
-                              </tr>
-                              </tbody>
-                              </table>
-                              <div class="form-check m-2"><label class="form-check-label"><input type="radio" class="form-check-input" name="optionsRadios1" value="option1"> 适合本项所有定额</label>&nbsp;&nbsp;<label class="form-check-label"><input type="radio" class="form-check-input" name="optionsRadios1" value="option1" checked=""> 适合本项部分定额</label></div>
-                              <table class="table table-sm table-bordered m-0">
-                                  <thead>
-                                  <tr>
-                                      <th></th>
-                                      <th>编码</th>
-                                      <th>工作内容</th>
-                                  </tr>
-                                  </thead>
-                                  <tbody>
-                                  <tr>
-                                      <td>1</td>
-                                      <td><a href data-toggle="modal" data-target="#editBianma" class="m-0">编辑编码</a><p class="m-0">AA0017</p><p class="m-0">AA0018</p><p class="m-0">AA0019</p></td>
-                                      <td><p class="m-0">1.松填土:5m内的就地取土,铺平。</p><p class="m-0">2.夯填土方(石渣):5m内的就地取土(石渣)、铺平、夯实、洒水等。</p></td>
-                                  </tr>
-                                  <tr>
-                                      <td>2</td>
-                                      <td><a href data-toggle="modal" data-target="#editBianma" class="m-0">编辑编码</a><p class="m-0">AA0020</p><p class="m-0">AA0021</p><p class="m-0">AA0022</p></td>
-                                      <td><p class="m-0">1.松填土:5m内的就地取土,铺平。</p><p class="m-0">2.夯填土方(石渣):5m内的就地取土(石渣)、铺平、夯实、洒水等。</p></td>
-                                  </tr>
-                                  <tr>
-                                      <td>3</td>
-                                      <td><a href data-toggle="modal" data-target="#editBianma" class="m-0">点击勾选编码</a></td>
-                                      <td></td>
-                                  </tr>
-                                  <tr>
-                                      <td>4</td>
-                                      <td></td>
-                                      <td></td>
-                                  </tr>
-                                  <tr>
-                                      <td>5</td>
-                                      <td></td>
-                                      <td></td>
-                                  </tr>
-                                  </tbody>
+                                  <table class="table table-sm table-bordered m-0" id="tablePartial">
                               </table>
                           </div>
                       </div>
@@ -208,6 +141,7 @@
         </div>
     </div>
         <!--弹出添加-->
+        <button id="gznrBtn" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#addNewgznr" style="display: none"></button>
         <div class="modal fade" id="addNewgznr" data-backdrop="static" style="display: none;" aria-hidden="true">
             <div class="modal-dialog" role="document">
                 <div class="modal-content">
@@ -340,38 +274,7 @@
                             <div class="form-group">
                                 <label>编码</label>
                                 <div class="form-control">
-                                    <div class="row code">
-                                        <div class="col">
-                                            <label class="form-check-label">
-                                                <input class="form-check-input" type="checkbox" value="option1" checked> AA0017
-                                            </label>
-                                        </div>
-                                        <div class="col">
-                                            <label class="form-check-label">
-                                                <input class="form-check-input" type="checkbox" value="option1" checked> AA0018
-                                            </label>
-                                        </div>
-                                        <div class="col">
-                                            <label class="form-check-label">
-                                                <input class="form-check-input" type="checkbox" value="option1" checked> AA0019
-                                            </label>
-                                        </div>
-                                        <div class="w-100"></div>
-                                        <div class="col">
-                                            <label class="form-check-label">
-                                                <input class="form-check-input" type="checkbox" value="option1" checked> AA0020
-                                            </label>
-                                        </div>
-                                        <div class="col">
-                                            <label class="form-check-label">
-                                                <input class="form-check-input" type="checkbox" value="option1" checked> AA0021
-                                            </label>
-                                        </div>
-                                        <div class="col">
-                                            <label class="form-check-label">
-                                                <input class="form-check-input" type="checkbox" value="option1" checked> AA0022
-                                            </label>
-                                        </div>
+                                    <div class="row code" id="updateCon">
                                     </div>
                                 </div>
                             </div>
@@ -379,7 +282,7 @@
                     </div>
                     <div class="modal-footer">
                         <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                        <a href="" class="btn btn-primary">确定</a>
+                        <a href="javascript: void(0);" class="btn btn-primary" data-dismiss="modal" id="updateConBtn">确定</a>
                     </div>
                 </div>
             </div>
@@ -388,7 +291,7 @@
             <div class="modal-dialog" role="document">
                 <div class="modal-content">
                     <div class="modal-header">
-                        <h5 class="modal-title">修改编码</h5>
+                        <h5 class="modal-title">勾选编码</h5>
                         <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                             <span aria-hidden="true">×</span>
                         </button>
@@ -398,38 +301,7 @@
                             <div class="form-group">
                                 <label>编码</label>
                                 <div class="form-control">
-                                    <div class="row code">
-                                        <div class="col">
-                                            <label class="form-check-label">
-                                                <input class="form-check-input" type="checkbox" value="option1" checked> AA0017
-                                            </label>
-                                        </div>
-                                        <div class="col">
-                                            <label class="form-check-label">
-                                                <input class="form-check-input" type="checkbox" value="option1" checked> AA0018
-                                            </label>
-                                        </div>
-                                        <div class="col">
-                                            <label class="form-check-label">
-                                                <input class="form-check-input" type="checkbox" value="option1" checked> AA0019
-                                            </label>
-                                        </div>
-                                        <div class="w-100"></div>
-                                        <div class="col">
-                                            <label class="form-check-label">
-                                                <input class="form-check-input" type="checkbox" value="option1" disabled> AA0020
-                                            </label>
-                                        </div>
-                                        <div class="col">
-                                            <label class="form-check-label">
-                                                <input class="form-check-input" type="checkbox" value="option1" disabled> AA0021
-                                            </label>
-                                        </div>
-                                        <div class="col">
-                                            <label class="form-check-label">
-                                                <input class="form-check-input" type="checkbox" value="option1" disabled> AA0022
-                                            </label>
-                                        </div>
+                                    <div class="row code" id="addCon">
                                     </div>
                                 </div>
                             </div>
@@ -437,7 +309,7 @@
                     </div>
                     <div class="modal-footer">
                         <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                        <a href="" class="btn btn-primary">确定</a>
+                        <a href="javascript: void(0);" class="btn btn-primary" data-dismiss="modal" id="addConBtn">确定</a>
                     </div>
                 </div>
             </div>
@@ -586,7 +458,6 @@
                 $("#linkFZTJ").click(function(){
                     rdSpread.setActiveSheetIndex(2);
                 });
-
             });
         </script>
     </div>

+ 27 - 3
web/maintain/ration_repository/js/ration.js

@@ -296,7 +296,6 @@ var rationOprObj = {
             updateArr = [], addArr = [];
         let dataCode = me.setting.header[args.col].dataCode;
         me.editingRowIdx = args.row;
-        console.log(rObj);
         if (me.currentEditingRation["ID"]) {
             rObj["ID"] = me.currentEditingRation["ID"];
                 if(me.currentEditingRation[dataCode] !== rObj[dataCode]){
@@ -324,6 +323,10 @@ var rationOprObj = {
                 me.addRationItem = rObj;
                 if(rObj.code && rObj.code.toString().trim().length > 0){
                     if(me.rationsCodes.indexOf(rObj.code) === -1){
+                        //jobContent
+                        if(jobContentOprObj && jobContentOprObj.currentSituation === jobContentOprObj.situations.ALL){
+                            rObj.jobContent = jobContentOprObj.currentJobContent ? jobContentOprObj.currentJobContent : '';
+                        }
                         addArr.push(rObj);
                         me.rationsCodes.push(rObj.code);
                         me.addRationItem = null;
@@ -376,10 +379,14 @@ var rationOprObj = {
             if (cacheSection) {
                 if(!me.isValidUnit(items[i], rationUnits)){//无效单位
                     items[i].unit = typeof cacheSection[rowIdx].unit !== 'undefined' && !cacheSection[rowIdx] ? 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 : '';
+                        }
                         addArr.push(items[i]);
                         me.rationsCodes.push(items[i].code);
                     }
@@ -412,11 +419,15 @@ var rationOprObj = {
             } else {
                 if(!me.isValidUnit(items[i], rationUnits)){//无效单位
                     items[i].unit = '';
-                };
+                }
                 //add
                 if(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 : '';
+                            }
                             addArr.push(items[i]);
                         }
                         else{
@@ -475,6 +486,11 @@ var rationOprObj = {
                         else if (a.code < b.code) rst = -1;
                         return rst;
                     });
+                    //jobContent
+                    if(jobContentOprObj && jobContentOprObj.currentSituation === jobContentOprObj.situations.PARTIAL){
+                        jobContentOprObj.currentRationItems = cacheSection;
+                        jobContentOprObj.buildTablePartial(jobContentOprObj.tablePartial, jobContentOprObj.getGroup(cacheSection));
+                    }
                     me.showRationItems(me.currentSectionId);
                     me.mixUpdate = 0;
                     me.workBook.getSheet(0).setActiveCell(me.activeCell.row, me.activeCell.col);
@@ -490,6 +506,10 @@ var 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--
                 me.showRationItems(sectionID);
                 ///sheetCommonObj.unShieldAllCells(me.workBook.getSheet(0));
                 sheetCommonObj.lockCells(rationGLJOprObj.sheet, rationGLJOprObj.setting);
@@ -508,6 +528,10 @@ var rationOprObj = {
                         if (result) {
                             me.currentRations["_SEC_ID_" + sectionID] = result.data;
                             me.sortByCode(me.currentRations["_SEC_ID_" + sectionID]);
+                            //job--
+                            jobContentOprObj.currentRationItems = me.currentRations["_SEC_ID_" + sectionID];
+                            jobContentOprObj.rationJobContentOpr(me.currentRations["_SEC_ID_" + sectionID]);
+                            //job--
                             me.showRationItems(sectionID);
                             //sheetCommonObj.unShieldAllCells(me.workBook.getSheet(0));
                             sheetCommonObj.lockCells(me.workBook.getSheet(0), rationOprObj.setting);

+ 430 - 0
web/maintain/ration_repository/js/section_tree.js

@@ -15,6 +15,23 @@ var pageOprObj = {
             me.rationLibName = rationLibName;
             me.rationLibId = rationLibId;
             zTreeOprObj.getRationTree(rationLibId);
+            //job
+            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;
+                })
+            });
         }
     }
 }
@@ -330,10 +347,14 @@ 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);
+        jobContentOprObj.currentSituation = typeof treeNode.jobContentSituation !== 'undefined'? treeNode.jobContentSituation : jobContentOprObj.situations.NONE;
         var sectionID = treeNode.ID;
         if (!(treeNode.items) || treeNode.items.length == 0) {
+            jobContentOprObj.setRadiosDisabled(false, jobContentOprObj.radios);
             rationOprObj.getRationItems(sectionID);
         } else {
+            jobContentOprObj.setRadiosDisabled(true, jobContentOprObj.radios);
+            jobContentOprObj.hideTable($('#tableAll'), $('#tablePartial'));
             sheetCommonObj.cleanSheet(rationOprObj.workBook.getSheet(0), rationOprObj.setting, -1);
             sheetCommonObj.shieldAllCells(rationOprObj.workBook.getSheet(0));
         }
@@ -433,3 +454,412 @@ let explanatoryOprObj = {
         });
     }
 };
+
+//工作内容
+let jobContentOprObj = {
+    situations: {ALL: 'ALL', PARTIAL: 'PARTIAL', NONE: 'NONE'},//所有ALL(包括未定义本项工作内容)、部分PARTIA,不可用NONE(非章节树最底层节点时)
+    currentSituation: null,//本项适用情况
+    radios: $("input[name = 'optionsRadios']"),
+    tableAll: $('#tableAll'),
+    tablePartial: $('#tablePartial'),
+    currentOprTr: null,
+    currentJobContent: null,
+    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;
+                    }
+                }
+            }
+        }
+        return rst;
+    },
+    getGroup: function (rationItems) {
+        let rst = [];//rst = [{jobContent: String, items: Array}]
+        for(let i = 0, len = rationItems.length; i < len; i++){
+            if(typeof rationItems[i].jobContent !== 'undefined' && rationItems[i].jobContent.toString().trim().length > 0){
+                let isExist = false;
+                for(let j = 0, jLen = rst.length; j < jLen; j++){
+                    if(rst[j].jobContent === rationItems[i].jobContent){
+                        isExist = true;
+                        rst[j].items.push(rationItems[i].code);
+                        break;
+                    }
+                }
+                if(!isExist){
+                    rst.push({jobContent: rationItems[i].jobContent, 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 = jobContentOprObj;
+        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].jobContent);
+            $tbody.append($newTr);
+            count++;
+        }
+        let $trEnd = $("<tr><td>"+ count +"</td><td><a href data-toggle='modal' data-target='#editBianma' 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.currentJobContent = $(me.currentOprTr.children()[2]).children().val();
+        });
+        $tbody.append($trEnd);
+        table.append($thead);
+        table.append($tbody);
+    },
+    //新增一行tr
+    getNewTr: function (tbody, codes, jobContent) {
+        let me = jobContentOprObj;
+        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='#editBianmaQ' class='m-0'>编辑编码</a></td></tr>");
+        $tr.children().children().bind('click', function () {
+            me.currentOprTr = $tr;
+            me.currentJobContent = $(me.currentOprTr.children()[2]).children().val();
+            me.onclickFuncEdit($(this));
+        });
+        //文本变化;
+        $textarea.bind('change', function () {
+            let codes = me.getUpdateCodes($($(this).parent().parent().children()[1]).children());
+            let jobContent = $(this).val();
+            me.updateJobContent(pageOprObj.rationLibId, me.getUpdateArr(codes, jobContent), function () {
+                if(jobContent.trim().length === 0){
+                    me.buildTablePartial(me.tablePartial, me.getGroup(me.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 = jobContentOprObj;
+        let txtarea = $(obj.parent().parent().children().children()[1]);
+        let jobContent = txtarea.val();
+        if(jobContent.trim().length > 0){//工作内容不为空才可添加编码
+            let codesObj = me.getAddCodes(me.currentRationItems);
+            me.buildCheckCodesCon(me.addCon, codesObj.checkedCodes, codesObj.disabledCodes)
+            obj.attr('data-target', '#editBianma');
+        }
+        else{
+            obj.attr('data-target', '');
+            alert("工作内容不能为空!");
+        }
+    },
+    onclickFuncEdit: function (obj) {
+        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 = [];
+        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 = jobContentOprObj;
+        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].jobContent !== 'undefined' && rationItems[i].jobContent.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 = jobContentOprObj;
+        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 = jobContentOprObj;
+        let rst = {checkedCodes: [], disabledCodes: []};
+        for(let i = 0, len = rationItems.length; i < len; i++){
+            if(typeof rationItems[i].jobContent !== 'undefined' && rationItems[i].jobContent.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 = jobContentOprObj;
+        if(situation === me.situations.ALL){
+            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.tableAll.show();
+            me.tablePartial.hide();
+        }
+        else if(situation === me.situations.PARTIAL){
+            radios[0].checked = false;
+            radios[1].checked = true;
+            me.tableAll.hide();
+            me.tablePartial.show();
+        }
+        else if(situation === me.situations.NONE){
+            radios[0].checked = false;
+            radios[1].checked = false;
+            me.tableAll.hide();
+            me.tablePartial.hide();
+        }
+    },
+    //radios是否可用,只有在定额章节树的底层节点才可用
+    setRadiosDisabled: function (val, radios) {
+        let me =jobContentOprObj;
+        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 = jobContentOprObj;
+        radios.change(function () {
+            let val = $("input[name = 'optionsRadios']:checked").val();
+            let selectedNode = zTreeOprObj.treeObj.getSelectedNodes()[0];
+            me.updateSituation(pageOprObj.rationLibId, selectedNode.ID, val, function () {
+                selectedNode.jobContentSituation = val;
+                me.currentSituation = val;
+                if(val === me.situations.ALL){
+                    let updateCodes = [];
+                    for(let i = 0, len = me.currentRationItems.length; i < len; i++){
+                        updateCodes.push(me.currentRationItems[i].code);
+                    }
+                    me.updateJobContent(pageOprObj.rationLibId, me.getUpdateArr(updateCodes, ''), function () {
+                        me.currentJobContent = '';
+                        $('#txtareaAll').val('');
+                        tableAll.show();
+                        tablePartial.hide();
+                    });
+                }
+                else{
+                    me.buildTablePartial(me.tablePartial, me.getGroup(me.currentRationItems));
+                    tableAll.hide();
+                    tablePartial.show();
+                }
+            });
+        });
+    },
+    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);
+    },
+    bindEvents: function (txtarea) {
+        let me = jobContentOprObj;
+        txtarea.bind('change', function () {
+            let jobContent = txtarea.val();
+            let jqNodes = txtarea.parent().parent().children()[1].children;
+            let updateCodes = me.getUpdateCodes(jqNodes);
+            txtarea.attr('disabled', true);
+            me.updateJobContent(pageOprObj.rationLibId, me.getUpdateArr(updateCodes, jobContent), function () {
+                txtarea.attr('disabled', false);
+            });
+        });
+    },
+    unbindEvetns: function (txtarea) {
+        txtarea.unbind();
+    },
+    //定额工作内容相关操作
+    rationJobContentOpr: function (rationItems) {
+        let me = jobContentOprObj;
+        me.setRadiosChecked(me.currentSituation, me.radios);
+        me.buildTablePartial(me.tablePartial, me.getGroup(rationItems));
+    },
+    getUpdateArr: function (updateCodes, jobContent) {
+        let rst = [];
+        for(let i = 0, len = updateCodes.length; i < len; i++){
+            rst.push({code: updateCodes[i], jobContent: jobContent});
+        }
+        return rst;
+    },
+    bindAddConBtn: function () {
+        let me = jobContentOprObj;
+        return function () {
+            let codesObj = me.getCodesAfterS(me.addCon.children().children().children());
+            let $tbody = $('#tablePartial tbody');
+            let lastEle = $tbody[0].lastElementChild;
+            let txtare = lastEle.lastElementChild.children[0];
+            if(me.currentJobContent.trim().length > 0){//工作内容不为空才可添加编码
+                let updateArr = me.getUpdateArr(codesObj.checked, me.currentJobContent);
+                me.updateJobContent(pageOprObj.rationLibId, updateArr, function () {
+                    me.buildTablePartial(me.tablePartial, me.getGroup(me.currentRationItems));
+                    $(txtare).val('');
+                });
+            }
+            else{
+                alert("工作内容不能为空!");
+            }
+        }
+    },
+    bindUpdateConBtn: function () {
+        let me = jobContentOprObj;
+        return function () {
+            let codesObj = me.getCodesAfterS(me.updateCon.children().children().children());
+            let updateC = me.getUpdateArr(codesObj.checked, me.currentJobContent),
+                updateUnC = me.getUpdateArr(codesObj.unchecked, ''),
+                updateArr = updateC.concat(updateUnC);
+            me.updateJobContent(pageOprObj.rationLibId, updateArr, function () {
+                me.buildTablePartial(me.tablePartial, me.getGroup(me.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].jobContent = updateArr[j].jobContent;
+                    break;
+                }
+            }
+        }
+    },
+    updateJobContent: function (repId, updateArr, callback){
+        let me = jobContentOprObj;
+        $.ajax({
+            type: 'post',
+            url: 'api/updateJobContent',
+            data: {lastOpr: userAccount, repId: repId, updateArr: JSON.stringify(updateArr)},
+            dataType: 'json',
+            success: function (result) {
+                if(!result.error){
+                    me.updateRationItem(me.currentRationItems, updateArr);
+                    callback();
+                }
+            }
+        });
+    },
+    updateSituation: function (repId, nodeId, situation, callback) {
+        let me = jobContentOprObj;
+        $.ajax({
+            type: 'post',
+            url: 'api/updateSituation',
+            data: {lastOpr: userAccount, repId: repId, nodeId: nodeId, situation: situation},
+            dataType: 'json',
+            success: function (result) {
+                if(!result.error){
+                    callback();
+                }
+            }
+        })
+    }
+};

+ 8 - 3
web/maintain/std_glj_lib/js/main.js

@@ -3,7 +3,7 @@
  */
 $(function () {
     let dispNameArr;
-    getAllGljLib(function (dispNames) {
+    getAllGljLib(function (dispNames, compilationsUsedArr) {
         dispNameArr = dispNames;
         //添加
         $('#addBtn').click(function () {
@@ -14,6 +14,10 @@ $(function () {
                 alert('名称不可为空!');
                 $('#libNameTxt').val('')
             }
+            else if(compilationsUsedArr.indexOf(compilationId) !== -1){// compilationsUsedArr;//在该编办下已建库,限制一个编办只能有一个库
+                alert('该编办已被绑定!');
+                $('#libNameTxt').val('')
+            }
             else if(dispNames.indexOf(libName) !== -1){
                 alert('此工料机库已存在!');
                 $('#libNameTxt').val('')
@@ -80,8 +84,10 @@ function getAllGljLib(callback){
         dataType: 'json',
         success: function (result) {
             let dispNames = [];
+            let compilationsUsedArr = [];
             if(result.data.length > 0){
                 for(let i = 0; i < result.data.length; i++){
+                    compilationsUsedArr.push(result.data[i].compilationId);//已建库的编办
                     let id = result.data[i].ID;
                     let libName = result.data[i].dispName;
                     let createDate = result.data[i].createDate.split(' ')[0];
@@ -106,7 +112,7 @@ function getAllGljLib(callback){
                     $("#tempId").attr("id", id);
                 }
             }
-            callback(dispNames);
+            callback(dispNames, compilationsUsedArr);
         }
     });
 }
@@ -134,7 +140,6 @@ function createGljLib(gljLibObj, dispNamesArr){
         data: {gljLibObj: JSON.stringify(gljLibObj)},
         dataType: 'json',
         success: function (result) {
-            console.log(result);
             if(result.data){
                 let id = result.data.ID;
                 let libName = result.data.dispName;