|  | @@ -32,15 +32,16 @@ $(function () {
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  |      const ledgerTree = createNewPathTree('base', treeSetting);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    const static_cols = [
 | 
	
		
			
				|  |  | +        {title: '编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 145, formatter: '@', readOnly: true, cellType: 'tree'},
 | 
	
		
			
				|  |  | +        {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 185, formatter: '@', readOnly: true},
 | 
	
		
			
				|  |  | +        {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 50, formatter: '@', readOnly: true},
 | 
	
		
			
				|  |  | +        {title: '经济指标', colSpan: '1', rowSpan: '2', field: 'dgn_price', hAlign: 2, width: 60, type: 'Number', readOnly: true},
 | 
	
		
			
				|  |  | +        {title: '总设计|工程量', colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 70, type: 'Number', readOnly: true},
 | 
	
		
			
				|  |  | +        {title: '|金额(万元)', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 70, type: 'Number', readOnly: true},
 | 
	
		
			
				|  |  | +    ];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      const ledgerSpreadSetting = {
 | 
	
		
			
				|  |  | -        cols: [
 | 
	
		
			
				|  |  | -            {title: '编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 145, formatter: '@', readOnly: true, cellType: 'tree'},
 | 
	
		
			
				|  |  | -            {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 185, formatter: '@', readOnly: true},
 | 
	
		
			
				|  |  | -            {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 50, formatter: '@', readOnly: true},
 | 
	
		
			
				|  |  | -            {title: '经济指标', colSpan: '1', rowSpan: '2', field: 'dgn_price', hAlign: 2, width: 60, type: 'Number', readOnly: true},
 | 
	
		
			
				|  |  | -            {title: '总设计|工程量', colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 70, type: 'Number', readOnly: true},
 | 
	
		
			
				|  |  | -            {title: '|金额(万元)', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 70, type: 'Number', readOnly: true},
 | 
	
		
			
				|  |  | -        ],
 | 
	
		
			
				|  |  |          emptyRows: 0,
 | 
	
		
			
				|  |  |          headRows: 2,
 | 
	
		
			
				|  |  |          headRowHeight: [25, 25],
 | 
	
	
		
			
				|  | @@ -53,22 +54,54 @@ $(function () {
 | 
	
		
			
				|  |  |              colWidth: true,
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  | +    const monthsCols = [];
 | 
	
		
			
				|  |  | +    if(scheduleMonth.length > 0) {
 | 
	
		
			
				|  |  | +        for (const sm of scheduleMonth) {
 | 
	
		
			
				|  |  | +            const yearmonth = sm.yearmonth.split('-')[0] + '年' + parseInt(sm.yearmonth.split('-')[1]) + '月';
 | 
	
		
			
				|  |  | +            const cols = {title: yearmonth + '|计划工程量', colSpan: '2|1', rowSpan: '1|1', field: sm.yearmonth+'_gcl', hAlign: 2, width: 90, type: 'Number', readOnly: 'readOnly.gcl'};
 | 
	
		
			
				|  |  | +            const cols2 = {title: '|计划金额(万元)', colSpan: '|1', rowSpan: '|1', field: sm.yearmonth+'_tp', hAlign: 2, width: 90, type: 'Number', readOnly: 'readOnly.tp'};
 | 
	
		
			
				|  |  | +            monthsCols.push(cols);
 | 
	
		
			
				|  |  | +            monthsCols.push(cols2);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    const spreadHeaderCols = static_cols.concat(monthsCols);
 | 
	
		
			
				|  |  | +    ledgerSpreadSetting.cols = spreadHeaderCols;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const ledgerCol = {
 | 
	
		
			
				|  |  | +        readOnly: {
 | 
	
		
			
				|  |  | +            tp: function (data) {
 | 
	
		
			
				|  |  | +                let flag = data.is_leaf;
 | 
	
		
			
				|  |  | +                if (data.is_leaf) {
 | 
	
		
			
				|  |  | +                    flag = schedule && schedule.mode === mode.tp;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                return !flag;
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            gcl: function (data) {
 | 
	
		
			
				|  |  | +                let flag = data.is_leaf;
 | 
	
		
			
				|  |  | +                if (data.is_leaf) {
 | 
	
		
			
				|  |  | +                    flag = schedule && schedule.mode === mode.gcl;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                return !flag;
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      sjsSettingObj.setFxTreeStyle(ledgerSpreadSetting, sjsSettingObj.FxTreeStyle.jz);
 | 
	
		
			
				|  |  |      if (thousandth) sjsSettingObj.setTpThousandthFormat(ledgerSpreadSetting);
 | 
	
		
			
				|  |  | +    SpreadJsObj.initSpreadSettingEvents(ledgerSpreadSetting, ledgerCol);
 | 
	
		
			
				|  |  |      SpreadJsObj.initSheet(ledgerSpread.getActiveSheet(), ledgerSpreadSetting);
 | 
	
		
			
				|  |  |      SpreadJsObj.selChangedRefreshBackColor(ledgerSpread.getActiveSheet());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      postData('/tender/' + getTenderId() + '/schedule/ledger/load', {}, function (data) {
 | 
	
		
			
				|  |  | -        console.log(data, selectedLedgerList);
 | 
	
		
			
				|  |  | -        const treeData = [];
 | 
	
		
			
				|  |  | +        let treeData = [];
 | 
	
		
			
				|  |  |          for(const sl of selectedLedgerList) {
 | 
	
		
			
				|  |  |              const one = _.find(data, { 'ledger_id' : sl });
 | 
	
		
			
				|  |  |              treeData.push(one);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +        treeData = setLeafData(treeData);
 | 
	
		
			
				|  |  |          ledgerTree.loadDatas(treeData);
 | 
	
		
			
				|  |  |          treeCalc.calculateAll(ledgerTree);
 | 
	
		
			
				|  |  | -        // console.log(ledgerTree);
 | 
	
		
			
				|  |  | +        console.log(ledgerTree);
 | 
	
		
			
				|  |  |          SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), SpreadJsObj.DataType.Tree, ledgerTree);
 | 
	
		
			
				|  |  |      }, null, true);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -132,6 +165,113 @@ $(function () {
 | 
	
		
			
				|  |  |              $('#mode-tips').show();
 | 
	
		
			
				|  |  |              $('#mode-cancel').show();
 | 
	
		
			
				|  |  |              $('#mode').modal('hide');
 | 
	
		
			
				|  |  | +            schedule.mode = _self.data('mode');
 | 
	
		
			
				|  |  | +            SpreadJsObj.reLoadSheetData(ledgerSpread.getActiveSheet());
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 月份添加
 | 
	
		
			
				|  |  | +    $('#add-month').click(function () {
 | 
	
		
			
				|  |  | +        const range = $('#month-range').val();
 | 
	
		
			
				|  |  | +        if(range === '') {
 | 
	
		
			
				|  |  | +            toastr.error('请选择计划周期时间');
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        const addMonthList = [];
 | 
	
		
			
				|  |  | +        const cycle = range.split(' ~ ');
 | 
	
		
			
				|  |  | +        if(cycle.length === 1) {
 | 
	
		
			
				|  |  | +            addMonthList.push(cycle[0]);
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            // 多个月份
 | 
	
		
			
				|  |  | +            const back_year = parseInt(cycle[1].split('-')[0]);
 | 
	
		
			
				|  |  | +            const back_month = parseInt(cycle[1].split('-')[1]);
 | 
	
		
			
				|  |  | +            const front_year = parseInt(cycle[0].split('-')[0]);
 | 
	
		
			
				|  |  | +            const front_month = parseInt(cycle[0].split('-')[1]);
 | 
	
		
			
				|  |  | +            if(back_year > front_year) {
 | 
	
		
			
				|  |  | +                const num = getDistanceMonth(cycle[0], cycle[1]);
 | 
	
		
			
				|  |  | +                let j = 1;
 | 
	
		
			
				|  |  | +                for (let i = 0; i <= num; i++) {
 | 
	
		
			
				|  |  | +                    if(front_month + i > 12*j) {
 | 
	
		
			
				|  |  | +                        j = j + 1;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    const m = (front_month + i)%12 === 0 ? 12 : (front_month + i)%12;
 | 
	
		
			
				|  |  | +                    addMonthList.push((front_year + (j-1)) + '-' + (m < 10 ? '0' + m : m));
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            } else if (back_year === front_year) {
 | 
	
		
			
				|  |  | +                // 小于1年并没有跨年
 | 
	
		
			
				|  |  | +                for (let i = front_month; i <= back_month; i++) {
 | 
	
		
			
				|  |  | +                    addMonthList.push(back_year + '-' + (i < 10 ? '0' + i : i));
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // 判断是否已添加本月份
 | 
	
		
			
				|  |  | +        if (addMonthList.length > 0) {
 | 
	
		
			
				|  |  | +            const hadmonth = [];
 | 
	
		
			
				|  |  | +            for (const m of addMonthList) {
 | 
	
		
			
				|  |  | +                const one = _.find(scheduleMonth, { yearmonth: m });
 | 
	
		
			
				|  |  | +                console.log(one, m);
 | 
	
		
			
				|  |  | +                if (one) {
 | 
	
		
			
				|  |  | +                    hadmonth.push(m);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (hadmonth.length > 0) {
 | 
	
		
			
				|  |  | +                let html = '';
 | 
	
		
			
				|  |  | +                for (const hm of hadmonth) {
 | 
	
		
			
				|  |  | +                    html += `<div class="alert alert-danger">${hm} 已创建</div>`;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                $('#add-month-error-list').html(html);
 | 
	
		
			
				|  |  | +                $('#add-month-error-list').show();
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            toastr.error('请选择计划周期时间');
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        $('#add-month-error-list').html('');
 | 
	
		
			
				|  |  | +        $('#add-month-error-list').hide();
 | 
	
		
			
				|  |  | +        const _self = $(this);
 | 
	
		
			
				|  |  | +        postData(window.location.pathname + '/save', {type: 'addmonth', postData: addMonthList}, function (result) {
 | 
	
		
			
				|  |  | +            _self.addClass('disabled').attr('disabled', true);
 | 
	
		
			
				|  |  | +            toastr.success('新增成功');
 | 
	
		
			
				|  |  | +            setTimeout(function () {
 | 
	
		
			
				|  |  | +                window.location.reload();
 | 
	
		
			
				|  |  | +            }, 500)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    $('#month-table input[type="checkbox"]').click(function () {
 | 
	
		
			
				|  |  | +        const selectedMonth = [];
 | 
	
		
			
				|  |  | +        $('#month-table input:checkbox:checked').each(function () {
 | 
	
		
			
				|  |  | +            selectedMonth.push('「' + $(this).parents('td').siblings('td').text() + '」');
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        if(selectedMonth.length > 0) {
 | 
	
		
			
				|  |  | +            $('#del-month-list').text(selectedMonth.join(''));
 | 
	
		
			
				|  |  | +            $('#del-month-list').parent().show();
 | 
	
		
			
				|  |  | +            $('#del-month').removeAttr('disabled');
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            $('#del-month-list').parent().hide();
 | 
	
		
			
				|  |  | +            $('#del-month').attr('disabled', true);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    $('#del-month').click(function () {
 | 
	
		
			
				|  |  | +        const selectedMonth = [];
 | 
	
		
			
				|  |  | +        $('#month-table input:checkbox:checked').each(function () {
 | 
	
		
			
				|  |  | +            selectedMonth.push($(this).parents('td').siblings().text());
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        if (selectedMonth.length === 0) {
 | 
	
		
			
				|  |  | +            toastr.error('请选择删除的计划周期');
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        const _self = $(this);
 | 
	
		
			
				|  |  | +        postData(window.location.pathname + '/save', {type: 'delmonth', postData: selectedMonth}, function (result) {
 | 
	
		
			
				|  |  | +            _self.addClass('disabled').attr('disabled', true);
 | 
	
		
			
				|  |  | +            toastr.success('删除成功');
 | 
	
		
			
				|  |  | +            setTimeout(function () {
 | 
	
		
			
				|  |  | +                window.location.reload();
 | 
	
		
			
				|  |  | +            }, 500)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          })
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -153,3 +293,33 @@ $(function () {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |  });
 | 
	
		
			
				|  |  | +// 月份间隔
 | 
	
		
			
				|  |  | +function getDistanceMonth(startTime,endTime){
 | 
	
		
			
				|  |  | +    startTime = new Date(startTime);
 | 
	
		
			
				|  |  | +    endTime = new Date(endTime);
 | 
	
		
			
				|  |  | +    var dateToMonth = 0;
 | 
	
		
			
				|  |  | +    var startDate=startTime.getDate() + startTime.getHours()/24 + startTime.getMinutes()/24/60;
 | 
	
		
			
				|  |  | +    var endDate=endTime.getDate()  +endTime.getHours()/24 + endTime.getMinutes()/24/60;
 | 
	
		
			
				|  |  | +    if(endDate >= startDate){
 | 
	
		
			
				|  |  | +        dateToMonth = 0;
 | 
	
		
			
				|  |  | +    }else{
 | 
	
		
			
				|  |  | +        dateToMonth = -1;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    let yearToMonth = (endTime.getYear() - startTime.getYear()) * 12;
 | 
	
		
			
				|  |  | +    let monthToMonth = endTime.getMonth() - startTime.getMonth();
 | 
	
		
			
				|  |  | +    return yearToMonth + monthToMonth + dateToMonth;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +function setLeafData(tree) {
 | 
	
		
			
				|  |  | +    const newtree = [];
 | 
	
		
			
				|  |  | +    for (const t of tree) {
 | 
	
		
			
				|  |  | +        const child = _.find(tree, { 'ledger_pid': t.ledger_id });
 | 
	
		
			
				|  |  | +        if (!child && !t.is_leaf) {
 | 
	
		
			
				|  |  | +            t.is_leaf = true;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        for(const m of scheduleMonth) {
 | 
	
		
			
				|  |  | +            t[m.yearmonth] = m.sj_gcl !== null || m.sj_tp !== null;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        newtree.push(t);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    return newtree;
 | 
	
		
			
				|  |  | +}
 |