| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518 | /** * 进度台账相关js * * @author Ellisran * @date 2020/11/6 * @version */function getTenderId() {    return window.location.pathname.split('/')[2];}$(function () {    autoFlashHeight();    if(schedule && !schedule.mode) {        $('#mode').modal('show');    }    // 初始化台账    const ledgerSpread = SpreadJsObj.createNewSpread($('#ledger-spread')[0]);    const treeSetting = {        id: 'ledger_id',        pid: 'ledger_pid',        order: 'order',        level: 'level',        rootId: -1,        fullPath: 'full_path',        //treeCacheKey: 'ledger_bills_fold' + '_' + getTenderId(),        // markFoldKey: 'bills-fold',        // markFoldSubKey: window.location.pathname.split('/')[2],    };    const ledgerTree = createNewPathTree('filter', 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 = {        emptyRows: 0,        headRows: 2,        headRowHeight: [25, 25],        defaultRowHeight: 21,        headerFont: '12px 微软雅黑',        font: '12px 微软雅黑',        // readOnly: true,        localCache: {            key: 'ledger-bills',            colWidth: true,        }    };    const monthsCols = [];    if(scheduleMonth.length > 0) {        for (const sm of scheduleMonth) {            const readOnly = sm.sj_gcl !== null || sm.sj_tp !== null;            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 ? readOnly : 'readOnly.gcl'};            const cols2 = {title: '|计划金额(万元)', colSpan: '|1', rowSpan: '|1', field: sm.yearmonth+'_tp', hAlign: 2, width: 90, type: 'Number', readOnly: readOnly ? 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) {        // let treeData = [];        // for(const sl of selectedLedgerList) {        //     const one = _.find(data, { 'ledger_id' : sl });        //     treeData.push(one);        // }        // treeData = setLeafData(treeData);        // console.log(treeData);        // let treeData = data;        const baseLedgerTree = createNewPathTree('base', {            id: 'ledger_id',            pid: 'ledger_pid',            order: 'order',            level: 'level',            rootId: -1,            fullPath: 'full_path',            calcFields: ['total_price'],            calcFun: function (node) {                node.dgn_price = ZhCalc.round(ZhCalc.div(node.total_price, node.dgn_qty1), 2);            }        });        const newLedgerList = setMonthToLedger(data.bills, data.slm);        console.log(newLedgerList);        baseLedgerTree.loadDatas(newLedgerList);        treeCalc.calculateAll(baseLedgerTree);        const showList = ['ledger_id', 'ledger_pid', 'order', 'level', 'tender_id', 'full_path',            'code', 'name', 'unit', 'dgn_qty1', 'dgn_qty2', 'dgn_price', 'quantity', 'total_price'];        for (const m of monthList) {            showList.push(m + '_tp');            showList.push(m + '_gcl');        }        for (const d of baseLedgerTree.nodes) {            if (!d.b_code) {                const one = _.find(selectedLedgerList, function (item) {                    return item === d.ledger_id;                });                if(one) {                    ledgerTree.addData(d, showList);                }            }        }        console.log(ledgerTree);        ledgerTree.sortTreeNode(true);        // console.log(ledgerTree);        SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), SpreadJsObj.DataType.Tree, ledgerTree);    }, null, true);    const ledgerSpreadObj = {        refreshTree: function (sheet, data) {            SpreadJsObj.massOperationSheet(sheet, function () {                const tree = sheet.zh_tree;                // 处理删除                if (data.delete) {                    data.delete.sort(function (x, y) {                        return y.deleteIndex - x.deleteIndex;                    });                    for (const d of data.delete) {                        sheet.deleteRows(d.deleteIndex, 1);                    }                }                // 处理新增                if (data.create) {                    const newNodes = data.create;                    if (newNodes) {                        newNodes.sort(function (a, b) {                            return a.index - b.index;                        });                        for (const node of newNodes) {                            sheet.addRows(node.index, 1);                            SpreadJsObj.reLoadRowData(sheet, tree.nodes.indexOf(node), 1);                        }                    }                }                // 处理更新                if (data.update) {                    const rows = [];                    for (const u of data.update) {                        rows.push(tree.nodes.indexOf(u));                    }                    SpreadJsObj.reLoadRowsData(sheet, rows);                }                // 处理展开                if (data.expand) {                    const expanded = [];                    for (const e of data.expand) {                        if (expanded.indexOf(e) === -1) {                            const posterity = tree.getPosterity(e);                            for (const p of posterity) {                                sheet.setRowVisible(tree.nodes.indexOf(p), p.visible);                                expanded.push(p);                            }                        }                    }                }            });        },        editEnded: function (e, info) {            if (info.sheet.zh_setting) {                const select = SpreadJsObj.getSelectObject(info.sheet);                const col = info.sheet.zh_setting.cols[info.col];                const validText = is_numeric(info.editingText) ? parseFloat(info.editingText) : (info.editingText ? trimInvalidChar(info.editingText) : null);                const orgValue = select[col.field];                if (orgValue == validText || ((!orgValue || orgValue === '') && (validText === ''))) {                    SpreadJsObj.reLoadRowData(info.sheet, info.row);                    return;                }                if (isNaN(validText)) {                    toastr.error('不能输入其它非数字类型字符');                    SpreadJsObj.reLoadRowData(info.sheet, info.row);                    return;                }                const yearmonth = col.field.split('_')[0];                const mode = col.field.split('_')[1];                let plan_gcl = 0;                let plan_tp = 0;                // 判断输入位数,提示                if (mode === 'tp') {                    const reg = new RegExp('^([-]?)\\d+(\\.\\d{0,'+ parseInt(tenderInfo.decimal.tp) +'})?$');                    if (validText !== null && (!reg.test(validText))) {                        toastr.error('输入金额小数位数不能大于' + tenderInfo.decimal.tp + '位');                        SpreadJsObj.reLoadRowData(info.sheet, info.row);                        return;                    }                    plan_gcl = select.dgn_price && select.dgn_price !== 0 ? ZhCalc.round(ZhCalc.div(validText, select.dgn_price), tenderInfo.decimal.up) : 0;                    plan_tp = validText;                } else {                    const reg = new RegExp('^([-]?)\\d+(\\.\\d{0,'+ parseInt(tenderInfo.decimal.up) +'})?$');                    if (validText !== null && (!reg.test(validText))) {                        toastr.error('输入工程量小数位数不能大于' + tenderInfo.decimal.up + '位');                        SpreadJsObj.reLoadRowData(info.sheet, info.row);                        return;                    }                    plan_gcl = validText;                    plan_tp = select.dgn_price && select.dgn_price !== 0 ? ZhCalc.round(ZhCalc.mul(validText, select.dgn_price), tenderInfo.decimal.tp) : 0;                }                select[col.field] = validText;                const updateData = {                    lid: select.ledger_id,                    yearmonth,                    plan_gcl,                    plan_tp,                };                console.log(updateData);                postData(window.location.pathname + '/save', {type: 'ledger_edit', postData: updateData}, function (result) {                    if (mode === 'tp') {                        select[yearmonth + '_gcl'] = plan_gcl;                    } else {                        select[yearmonth + '_tp'] = plan_tp;                    }                    SpreadJsObj.reLoadRowData(info.sheet, info.row);                },function () {                    select[col.field] = orgValue;                    SpreadJsObj.reLoadRowData(info.sheet, info.row);                })            }        },        deletePress: function (sheet) {            return;        },        clipboardPasted(e, info) {            const hint = {                cellError: {type: 'error', msg: '粘贴内容超出了表格范围'},                numberExpr: {type: 'error', msg: '不能粘贴其它非数字类型字符'},                numberCan: {type: 'error', msg: '请粘贴大于0并且小于3位小数的浮点数'},            };            const range = info.cellRange;            const sortData = info.sheet.zh_data || [];            if (info.cellRange.row + info.cellRange.rowCount > sortData.length) {                toastMessageUniq(hint.cellError);                SpreadJsObj.reLoadSheetHeader(materialMonthSpread.getActiveSheet());                SpreadJsObj.reLoadSheetData(materialMonthSpread.getActiveSheet());                return;            }            if (sortData.length > 0 && range.col + range.colCount > 4 + months.length) {                toastMessageUniq(hint.cellError);                SpreadJsObj.reLoadSheetHeader(materialMonthSpread.getActiveSheet());                SpreadJsObj.reLoadSheetData(materialMonthSpread.getActiveSheet());                return;            }            const data = [];            for (let iRow = 0; iRow < range.rowCount; iRow++) {                let bPaste = true;                const curRow = range.row + iRow;                const materialMonthData = sortData[curRow];                const hintRow = range.rowCount > 1 ? curRow : '';                let sameCol = 0;                for (let iCol = 0; iCol < range.colCount; iCol++) {                    const curCol = range.col + iCol;                    const colSetting = info.sheet.zh_setting.cols[curCol];                    if (!colSetting) continue;                    let validText = info.sheet.getText(curRow, curCol);                    validText = is_numeric(validText) ? parseFloat(validText) : (validText ? trimInvalidChar(validText) : null);                    const orgValue = sortData[curRow][colSetting.field];                    if (orgValue == validText || ((!orgValue || orgValue === '') && (validText === ''))) {                        sameCol++;                        if (range.colCount === sameCol)  {                            bPaste = false;                        }                        continue;                    }                    const num = parseFloat(validText);                    if (isNaN(validText)) {                        toastMessageUniq(getPasteHint(hint.numberExpr, hintRow));                        bPaste = false;                        continue;                    }                    if (validText !== null && (num < 0 || !/^\d+(\.\d{1,3})?$/.test(num))) {                        toastMessageUniq(getPasteHint(hint.numberCan, hintRow));                        bPaste = false;                        continue;                    }                    materialMonthData[colSetting.field] = validText;                    sortData[curRow][colSetting.field] = validText;                }                if (bPaste) {                    data.push(materialMonthData);                } else {                    SpreadJsObj.reLoadRowData(info.sheet, curRow);                }            }            if (data.length === 0) {                SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount);                return;            }            // // 更新至服务器            // postData(window.location.pathname + '/month/save', { type:'paste', updateData: data }, function (result) {            //     SpreadJsObj.reLoadSheetData(materialMonthSpread.getActiveSheet());            //     materialBillsData = result.materialBillsData;            //     SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData);            //     m_tp = result.m_tp;            //     resetTpTable();            // }, function () {            //     SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount);            //     return;            // });        },    };    ledgerSpread.bind(spreadNS.Events.EditEnded, ledgerSpreadObj.editEnded);    SpreadJsObj.addDeleteBind(ledgerSpread, ledgerSpreadObj.deletePress);    // 进度计算方式选择    $('.mode-select').on('click', function () {        const _self = $(this);        postData(window.location.pathname + '/save', {type: 'mode', postData: $(this).data('mode')}, function (result) {            _self.addClass('disabled').attr('disabled', true);            _self.parents('.col-6').siblings('.col-6').find('button').removeClass('disabled').removeAttr('disabled');            $('#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)        })    });    $.subMenu({        menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',        toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',        key: 'menu.1.0.0',        miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',        callback: function (info) {            if (info.mini) {                $('.panel-title').addClass('fluid');                $('#sub-menu').removeClass('panel-sidebar');            } else {                $('.panel-title').removeClass('fluid');                $('#sub-menu').addClass('panel-sidebar');            }            ledgerSpread.refresh();            autoFlashHeight();        }    });});// 月份间隔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;        }        newtree.push(t);    }    return newtree;}function setMonthToLedger(ledgerList, slm) {    if (slm.length > 0) {        for(const s of slm) {            const index = _.findIndex(ledgerList, { 'ledger_id': s.lid });            if (index && index !== -1) {                ledgerList[index][s.yearmonth + '_tp'] = s.plan_tp;                ledgerList[index][s.yearmonth + '_gcl'] = s.plan_gcl;            }        }    }    return ledgerList;}const is_numeric = (value) => {    if (typeof(value) === 'object') {        return false;    } else {        return !Number.isNaN(Number(value)) && value.toString().trim() !== '';    }};
 |