|  | @@ -203,8 +203,8 @@
 | 
	
		
			
				|  |  |              <div class="modal-body" id="eSignatureBodyDiv">
 | 
	
		
			
				|  |  |              </div>
 | 
	
		
			
				|  |  |              <div class="modal-footer">
 | 
	
		
			
				|  |  | -                <button type="button" id="btn_cross_tender" class="btn btn-sm btn-link float-left" data-dismiss="modal" data-toggle="modal" data-target="#batch-eSignature" id="batch-setupProjSignature" onclick="rptSignatureHelper.resetESignature(zTreeOprObj.currentRptPageRst, 'batch-eSignatureBodyDiv'); buildTendersTree();">批量设置其他标段</button>
 | 
	
		
			
				|  |  |                  <!--
 | 
	
		
			
				|  |  | +                <button type="button" id="btn_cross_tender" class="btn btn-sm btn-link float-left" data-dismiss="modal" data-toggle="modal" data-target="#batch-eSignature" id="batch-setupProjSignature" onclick="rptSignatureHelper.resetESignature(zTreeOprObj.currentRptPageRst, 'batch-eSignatureBodyDiv'); buildTendersTree();">批量设置其他标段</button>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  <button type="button" class="btn btn-sm btn-link float-left" data-toggle="modal" data-target="#batch-eSignature" id="hidden_show_batch_eSignature" style="display:none"></button>
 | 
	
		
			
				|  |  |                  <button type="button" class="btn btn-sm btn-link float-left" data-dismiss="modal" onclick="setTimeout(function(){$('#hidden_show_batch_eSignature').trigger('click');}, 50);">批量设置其他标段</button>
 | 
	
	
		
			
				|  | @@ -225,12 +225,14 @@
 | 
	
		
			
				|  |  |                  </button>
 | 
	
		
			
				|  |  |              </div>
 | 
	
		
			
				|  |  |              <div class="modal-body">
 | 
	
		
			
				|  |  | -                <div class="row">
 | 
	
		
			
				|  |  | -                    <div class="col-6">
 | 
	
		
			
				|  |  | -                        <table class="table table-hover table-bordered" id="batch_tenders_individual">
 | 
	
		
			
				|  |  | -                        </table>
 | 
	
		
			
				|  |  | +                <div class="modal-height-300">
 | 
	
		
			
				|  |  | +                    <div class="row">
 | 
	
		
			
				|  |  | +                        <div class="col-6">
 | 
	
		
			
				|  |  | +                            <table class="table table-hover table-bordered" id="batch_tenders_individual">
 | 
	
		
			
				|  |  | +                            </table>
 | 
	
		
			
				|  |  | +                        </div>
 | 
	
		
			
				|  |  | +                        <div class="col-6" id="batch-eSignatureBodyDiv"></div>
 | 
	
		
			
				|  |  |                      </div>
 | 
	
		
			
				|  |  | -                    <div class="col-6" id="batch-eSignatureBodyDiv"></div>
 | 
	
		
			
				|  |  |                  </div>
 | 
	
		
			
				|  |  |                  <div class="alert alert-warning">批量操作会覆盖已设置好的电子签名,请谨慎操作。</div>
 | 
	
		
			
				|  |  |              </div>
 | 
	
	
		
			
				|  | @@ -523,78 +525,102 @@
 | 
	
		
			
				|  |  |              _createItems(treeCache, 0);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          //2. 建立treeNodes
 | 
	
		
			
				|  |  | +        let hasCat = false;
 | 
	
		
			
				|  |  |          for (const tender of tenders) {
 | 
	
		
			
				|  |  |              if (tender.category && tender.category.length > 0) {
 | 
	
		
			
				|  |  | -                for (const cat of tender.category) {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +                hasCat = true;
 | 
	
		
			
				|  |  | +                break;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          //3. 把标段挂上去
 | 
	
		
			
				|  |  |          let tmpCacheArr = []; //这个临时用来储存相应标段节点挂接信息
 | 
	
		
			
				|  |  |          let _putTender = function (catLv, tender, parentItems) {
 | 
	
		
			
				|  |  | -            if (catLv < tender.category.length && tender.lastStage !== undefined && tender.lastStage !== null) {
 | 
	
		
			
				|  |  | -                let isSorted = false;
 | 
	
		
			
				|  |  | -                for (let sCat of sortedCat) {
 | 
	
		
			
				|  |  | -                    if (sCat.id === tender.category[catLv].cid && sCat.level > 0) {
 | 
	
		
			
				|  |  | -                        isSorted = true;
 | 
	
		
			
				|  |  | -                        break;
 | 
	
		
			
				|  |  | +            if (tender.lastStage !== undefined && tender.lastStage !== null) {
 | 
	
		
			
				|  |  | +                if (hasCat) {
 | 
	
		
			
				|  |  | +                    let isSorted = false;
 | 
	
		
			
				|  |  | +                    for (let sCat of sortedCat) {
 | 
	
		
			
				|  |  | +                        if (sCat.id === tender.category[catLv].cid && sCat.level > 0) {
 | 
	
		
			
				|  |  | +                            isSorted = true;
 | 
	
		
			
				|  |  | +                            break;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                if (isSorted) {
 | 
	
		
			
				|  |  | -                    for (const item of parentItems) {
 | 
	
		
			
				|  |  | -                        if (item.cid === tender.category[catLv].cid && item.id === tender.category[catLv].value) {
 | 
	
		
			
				|  |  | -                            if (item.items.length > 0) {
 | 
	
		
			
				|  |  | -                                //递归循环
 | 
	
		
			
				|  |  | -                                _putTender(catLv + 1, tender, item.items);
 | 
	
		
			
				|  |  | -                            } else {
 | 
	
		
			
				|  |  | -                                //就是这个了
 | 
	
		
			
				|  |  | -                                let tdItem = {
 | 
	
		
			
				|  |  | -                                    name: tender.name,
 | 
	
		
			
				|  |  | -                                    id : -1,
 | 
	
		
			
				|  |  | -                                    cid : -1,
 | 
	
		
			
				|  |  | -                                    tender_id: tender.id,
 | 
	
		
			
				|  |  | -                                    last_stage: tender.lastStage.order,
 | 
	
		
			
				|  |  | -                                    last_stage_id: tender.lastStage.id,
 | 
	
		
			
				|  |  | -                                    report_id: zTreeOprObj.currentNode.refId,
 | 
	
		
			
				|  |  | -                                    signature: '临时',
 | 
	
		
			
				|  |  | -                                    items: [],
 | 
	
		
			
				|  |  | -                                    isParent: false
 | 
	
		
			
				|  |  | -                                }; //标段节点
 | 
	
		
			
				|  |  | -                                //
 | 
	
		
			
				|  |  | -                                tmpCacheArr.push([item, tdItem]);
 | 
	
		
			
				|  |  | +                    if (isSorted) {
 | 
	
		
			
				|  |  | +                        for (const item of parentItems) {
 | 
	
		
			
				|  |  | +                            if (item.cid === tender.category[catLv].cid && item.id === tender.category[catLv].value) {
 | 
	
		
			
				|  |  | +                                if (item.items.length > 0) {
 | 
	
		
			
				|  |  | +                                    //递归循环
 | 
	
		
			
				|  |  | +                                    _putTender(catLv + 1, tender, item.items);
 | 
	
		
			
				|  |  | +                                } else {
 | 
	
		
			
				|  |  | +                                    //就是这个了
 | 
	
		
			
				|  |  | +                                    let tdItem = {
 | 
	
		
			
				|  |  | +                                        name: tender.name,
 | 
	
		
			
				|  |  | +                                        id : -1,
 | 
	
		
			
				|  |  | +                                        cid : -1,
 | 
	
		
			
				|  |  | +                                        tender_id: tender.id,
 | 
	
		
			
				|  |  | +                                        last_stage: tender.lastStage.order,
 | 
	
		
			
				|  |  | +                                        last_stage_id: tender.lastStage.id,
 | 
	
		
			
				|  |  | +                                        report_id: zTreeOprObj.currentNode.refId,
 | 
	
		
			
				|  |  | +                                        signature: '临时',
 | 
	
		
			
				|  |  | +                                        items: [],
 | 
	
		
			
				|  |  | +                                        isParent: false
 | 
	
		
			
				|  |  | +                                    }; //标段节点
 | 
	
		
			
				|  |  | +                                    //
 | 
	
		
			
				|  |  | +                                    tmpCacheArr.push([item, tdItem]);
 | 
	
		
			
				|  |  | +                                }
 | 
	
		
			
				|  |  |                              }
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    // 没有设置category
 | 
	
		
			
				|  |  | +                    let tdItem = {
 | 
	
		
			
				|  |  | +                        name: tender.name,
 | 
	
		
			
				|  |  | +                        id : -1,
 | 
	
		
			
				|  |  | +                        cid : -1,
 | 
	
		
			
				|  |  | +                        tender_id: tender.id,
 | 
	
		
			
				|  |  | +                        last_stage: tender.lastStage.order,
 | 
	
		
			
				|  |  | +                        last_stage_id: tender.lastStage.id,
 | 
	
		
			
				|  |  | +                        report_id: zTreeOprObj.currentNode.refId,
 | 
	
		
			
				|  |  | +                        signature: '临时',
 | 
	
		
			
				|  |  | +                        items: [],
 | 
	
		
			
				|  |  | +                        isParent: false
 | 
	
		
			
				|  |  | +                    }; //标段节点
 | 
	
		
			
				|  |  | +                    //
 | 
	
		
			
				|  |  | +                    tmpCacheArr.push([null, tdItem]);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          for (const tender of tenders) {
 | 
	
		
			
				|  |  |              _putTender(0, tender, treeCache);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        for (const pairItem of tmpCacheArr) {
 | 
	
		
			
				|  |  | -            pairItem[0].items.push(pairItem[1]);
 | 
	
		
			
				|  |  | +        if (hasCat) {
 | 
	
		
			
				|  |  | +            for (const pairItem of tmpCacheArr) {
 | 
	
		
			
				|  |  | +                pairItem[0].items.push(pairItem[1]);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          //4. 剔除空items的项
 | 
	
		
			
				|  |  | -        let _removeEmptyItems = function (parentItem) {
 | 
	
		
			
				|  |  | -            let rst = false;
 | 
	
		
			
				|  |  | -            if (parentItem.items.length === 0) {
 | 
	
		
			
				|  |  | -                if (parentItem.isParent) {
 | 
	
		
			
				|  |  | -                    rst = true;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            } else {
 | 
	
		
			
				|  |  | -                for (let idx = parentItem.items.length - 1; idx >= 0; idx--) {
 | 
	
		
			
				|  |  | -                    if (_removeEmptyItems(parentItem.items[idx])) {
 | 
	
		
			
				|  |  | -                        parentItem.items.splice(idx, 1);
 | 
	
		
			
				|  |  | +        if (hasCat) {
 | 
	
		
			
				|  |  | +            let _removeEmptyItems = function (parentItem) {
 | 
	
		
			
				|  |  | +                let rst = false;
 | 
	
		
			
				|  |  | +                if (parentItem.items.length === 0) {
 | 
	
		
			
				|  |  | +                    if (parentItem.isParent) {
 | 
	
		
			
				|  |  | +                        rst = true;
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    for (let idx = parentItem.items.length - 1; idx >= 0; idx--) {
 | 
	
		
			
				|  |  | +                        if (_removeEmptyItems(parentItem.items[idx])) {
 | 
	
		
			
				|  |  | +                            parentItem.items.splice(idx, 1);
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    rst = parentItem.items.length === 0;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | -                rst = parentItem.items.length === 0;
 | 
	
		
			
				|  |  | +                return rst;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            return rst;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        for (let idx = treeCache.length - 1; idx >= 0; idx--) {
 | 
	
		
			
				|  |  | -            if (_removeEmptyItems(treeCache[idx])) {
 | 
	
		
			
				|  |  | -                treeCache.splice(idx, 1);
 | 
	
		
			
				|  |  | +            for (let idx = treeCache.length - 1; idx >= 0; idx--) {
 | 
	
		
			
				|  |  | +                if (hasCat) {
 | 
	
		
			
				|  |  | +                    if (_removeEmptyItems(treeCache[idx])) {
 | 
	
		
			
				|  |  | +                        treeCache.splice(idx, 1);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          //console.log(treeCache);
 | 
	
	
		
			
				|  | @@ -638,8 +664,15 @@
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  | -        for (let idx = treeCache.length - 1; idx >= 0; idx--) {
 | 
	
		
			
				|  |  | -            _getTenderRelatedInfos(treeCache[idx], params.selectedTenders);
 | 
	
		
			
				|  |  | +        if (hasCat) {
 | 
	
		
			
				|  |  | +            for (let idx = treeCache.length - 1; idx >= 0; idx--) {
 | 
	
		
			
				|  |  | +                _getTenderRelatedInfos(treeCache[idx], params.selectedTenders);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            for (let idx = tmpCacheArr.length - 1; idx >= 0; idx--) {
 | 
	
		
			
				|  |  | +                _getTenderRelatedInfos(tmpCacheArr[idx][1], params.selectedTenders);
 | 
	
		
			
				|  |  | +                treeCache.push(tmpCacheArr[idx][1]);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          $.bootstrapLoading.start();
 | 
	
		
			
				|  |  |          CommonAjax.postXsrfEx("/tender/report_api/getMultiRoleRelationships", params, 30000, true, getCookie('csrfToken'),
 | 
	
	
		
			
				|  | @@ -673,13 +706,14 @@
 | 
	
		
			
				|  |  |      function _buildTenderTree(tbDomId, tendersArr) {
 | 
	
		
			
				|  |  |          let tbDom = $("#" + tbDomId);
 | 
	
		
			
				|  |  |          tbDom.empty();
 | 
	
		
			
				|  |  | -        //tbDom.append('<tr><th>类别</th><th>包含报表</th><th>显示</th></tr>');
 | 
	
		
			
				|  |  | -        tbDom.append('<thead><tr><th>名称</th><th width="50">计量期</th><th width="40">签名</th><th width="40">选择</th></tr></thead>');
 | 
	
		
			
				|  |  | -        tbDom.append('<tbody>');
 | 
	
		
			
				|  |  | +        let domStrs = [];
 | 
	
		
			
				|  |  | +        domStrs.push('<thead><tr><th>名称</th><th width="50">计量期</th><th width="40">签名</th><th width="40">选择</th></tr></thead>');
 | 
	
		
			
				|  |  | +        domStrs.push('<tbody>');
 | 
	
		
			
				|  |  |          const _createRow = function (rowItem, lv) {
 | 
	
		
			
				|  |  |              let tdClassStr = 'in-' + lv;
 | 
	
		
			
				|  |  |              if (rowItem.isParent) {
 | 
	
		
			
				|  |  | -                tbDom.append('<tr><td class="' + tdClassStr + '"><i class="fa fa-folder-o"></i>  ' + rowItem.name + '</td><td></td><td></td><td></td></tr>');
 | 
	
		
			
				|  |  | +                //tbDom.append('<tr><td class="' + tdClassStr + '"><i class="fa fa-folder-o"></i>  ' + rowItem.name + '</td><td></td><td></td><td></td></tr>');
 | 
	
		
			
				|  |  | +                domStrs.push('<tr><td class="' + tdClassStr + '"><i class="fa fa-folder-o"></i>  ' + rowItem.name + '</td><td></td><td></td><td></td></tr>');
 | 
	
		
			
				|  |  |              } else {
 | 
	
		
			
				|  |  |                  let hrefStr = '/tender/' + rowItem.tender_id;
 | 
	
		
			
				|  |  |                  //<a href="biaoduan-panel.html" target="_blank">WWUJ-1</a>
 | 
	
	
		
			
				|  | @@ -692,9 +726,9 @@
 | 
	
		
			
				|  |  |                  //let chgStr = 'changeCrossTender(this, SELECTED_TENDERS,' + rowItem.tender_id + ', ' + rowItem.last_stage_id + ', ' + rowItem.report_id + ')';
 | 
	
		
			
				|  |  |                  if (rowItem.signature !== undefined && rowItem.signature !== null && rowItem.signature !== '') {
 | 
	
		
			
				|  |  |                      let hintStr = '<i class="fa fa-exclamation-circle text-primary" data-container="body" data-toggle="tooltip" data-placement="bottom" data-original-title="' + rowItem.signature + '"></i>';
 | 
	
		
			
				|  |  | -                    tbDom.append('<tr><td class="' + tdClassStr + '"><a href="' + hrefStr + '" target="_blank">' + rowItem.name + '</a></td><td>' + lastStgStr + '</td><td>' + hintStr + '</td><td><input type="checkbox" onclick="changeCrossTender(this, SELECTED_TENDERS, ' + rowItem.tender_id + ', ' + rowItem.last_stage_id + ', ' + rowItem.report_id + ')' + '"></td></tr>');
 | 
	
		
			
				|  |  | +                    domStrs.push('<tr><td class="' + tdClassStr + '"><a href="' + hrefStr + '" target="_blank">' + rowItem.name + '</a></td><td>' + lastStgStr + '</td><td>' + hintStr + '</td><td><input type="checkbox" onclick="changeCrossTender(this, SELECTED_TENDERS, ' + rowItem.tender_id + ', ' + rowItem.last_stage_id + ', ' + rowItem.report_id + ')' + '"></td></tr>');
 | 
	
		
			
				|  |  |                  } else {
 | 
	
		
			
				|  |  | -                    tbDom.append('<tr><td class="' + tdClassStr + '"><a href="' + hrefStr + '" target="_blank">' + rowItem.name + '</a></td><td>' + lastStgStr + '</td><td></td><td><input type="checkbox" onclick="changeCrossTender(this, SELECTED_TENDERS, ' + rowItem.tender_id + ', ' + rowItem.last_stage_id + ', ' + rowItem.report_id + ')' + '"></td></tr>');
 | 
	
		
			
				|  |  | +                    domStrs.push('<tr><td class="' + tdClassStr + '"><a href="' + hrefStr + '" target="_blank">' + rowItem.name + '</a></td><td>' + lastStgStr + '</td><td></td><td><input type="checkbox" onclick="changeCrossTender(this, SELECTED_TENDERS, ' + rowItem.tender_id + ', ' + rowItem.last_stage_id + ', ' + rowItem.report_id + ')' + '"></td></tr>');
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              if (rowItem.items && rowItem.items.length > 0) {
 | 
	
	
		
			
				|  | @@ -707,7 +741,9 @@
 | 
	
		
			
				|  |  |          for (const tItem of tendersArr) {
 | 
	
		
			
				|  |  |              _createRow(tItem, grpLv);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        tbDom.append('</tbody>');
 | 
	
		
			
				|  |  | +        domStrs.push('</tbody>');
 | 
	
		
			
				|  |  | +        tbDom.append(domStrs.join(''));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      function buildCustRptCommon(tbDomId, topTreeNode, checkingArr, isCommonStr) {
 |