/** * 进度台账相关js * * @author Ellisran * @date 2020/11/6 * @version */ function getTenderId() { return window.location.pathname.split('/')[2]; } $(function () { autoFlashHeight(); if(schedule && !schedule.mode && !revising && !schedule.revising) { $('#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', calcFun: function (node) { node.dgn_price = ZhCalc.round(ZhCalc.div(node.total_price, node.dgn_qty1), 2); if (node.children && node.children.length > 0) { for (const sm of scheduleMonth) { node[sm.yearmonth+'_gcl'] = ZhCalc.round(ZhCalc.div(node[sm.yearmonth+'_tp'], node.dgn_price), 3); } } } //treeCacheKey: 'ledger_bills_fold' + '_' + getTenderId(), // markFoldKey: 'bills-fold', // markFoldSubKey: window.location.pathname.split('/')[2], }; 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-plan', colWidth: true, } }; const monthsCols = []; const calcCols = ['total_price']; if(scheduleMonth.length > 0) { for (const sm of scheduleMonth) { const readOnly = sm.stage_gcl_used !== 0 || sm.stage_tp_used !== 0; 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); // calcCols.push(sm.yearmonth+'_gcl'); calcCols.push(sm.yearmonth+'_tp'); } } treeSetting.calcFields = calcCols; const ledgerTree = createNewPathTree('filter', treeSetting); 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 && !revising); }, gcl: function (data) { let flag = data.is_leaf; if (data.is_leaf) { flag = schedule && schedule.mode === mode.gcl; } return !(flag && !revising); }, }, }; sjsSettingObj.setFxTreeStyle(ledgerSpreadSetting, sjsSettingObj.FxTreeStyle.jz); if (thousandth) sjsSettingObj.setTpThousandthFormat(ledgerSpreadSetting); SpreadJsObj.initSpreadSettingEvents(ledgerSpreadSetting, ledgerCol); SpreadJsObj.initSheet(ledgerSpread.getActiveSheet(), ledgerSpreadSetting); SpreadJsObj.selChangedRefreshBackColor(ledgerSpread.getActiveSheet()); ledgerSpread.getActiveSheet().frozenColumnCount(6); ledgerSpread.getActiveSheet().options.frozenlineColor = '#93b5e4'; 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 calcList = ['total_price']; 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'); // calcList.push(m + '_tp'); // calcList.push(m + '_gcl'); } const baseLedgerTree = createNewPathTree('base', { id: 'ledger_id', pid: 'ledger_pid', order: 'order', level: 'level', rootId: -1, fullPath: 'full_path', calcFields: calcList, calcFun: function (node) { node.dgn_price = ZhCalc.round(ZhCalc.div(node.total_price, node.dgn_qty1), 2); } }); const newLedgerList = setMonthToLedger(data.bills, data.slm); baseLedgerTree.loadDatas(newLedgerList); treeCalc.calculateAll(baseLedgerTree); 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); } } } ledgerTree.sortTreeNode(true); treeCalc.calculateAll(ledgerTree); 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]; let 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+$'); if (validText !== null && (!reg.test(validText))) { // toastr.error('输入金额请为整数'); // SpreadJsObj.reLoadRowData(info.sheet, info.row); // return; validText = ZhCalc.round(validText, 0); } plan_gcl = select.dgn_price && select.dgn_price !== 0 ? ZhCalc.round(ZhCalc.div(validText, select.dgn_price), 3) : 0; plan_tp = validText; } else { const reg = new RegExp('^([-]?)\\d+$'); if (validText !== null && (!reg.test(validText))) { // toastr.error('输入工程量小数位数不能大于3位'); // SpreadJsObj.reLoadRowData(info.sheet, info.row); // return; validText = ZhCalc.round(validText, 3); } plan_gcl = validText; plan_tp = select.dgn_price && select.dgn_price !== 0 ? ZhCalc.round(ZhCalc.mul(validText, select.dgn_price), 0) : 0; } select[col.field] = validText; const updateData = { lid: select.ledger_id, yearmonth, plan_gcl, plan_tp, }; 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; } const nodes = treeCalc.calculateParent(info.sheet.zh_tree, select, 1); console.log(nodes, select); const refreshNode = ledgerTree.loadPostData({update: nodes}); console.log(refreshNode); ledgerSpreadObj.refreshTree(info.sheet, refreshNode); },function () { select[col.field] = orgValue; const nodes = treeCalc.calculateParent(info.sheet.zh_tree, select, 1); const refreshNode = ledgerTree.loadPostData({update: nodes}); ledgerSpreadObj.refreshTree(info.sheet, refreshNode); }) } }, deletePress: function (sheet) { if (!sheet.zh_setting) return; if (sheet.zh_setting && sheet.zh_tree) { const sel = sheet.getSelections()[0], datas = [], filterNodes = []; if (!sel) return; for (let iRow = sel.row; iRow < sel.row + sel.rowCount; iRow++) { let bDel = false; const node = sheet.zh_tree.nodes[iRow]; for (let iCol = sel.col; iCol < sel.col + sel.colCount; iCol++) { const col = sheet.zh_setting.cols[iCol]; const orgValue = node[col.field]; if (!orgValue) { continue; } const yearmonth = col.field.split('_')[0]; const modes = col.field.split('_')[1]; if(col.readOnly === true || !node.is_leaf || mode[modes] !== schedule.mode) { continue; } const updateData = { lid: node.ledger_id, yearmonth, plan_gcl: null, plan_tp: null, }; datas.push(updateData); node[yearmonth+'_gcl'] = null; node[yearmonth+'_tp'] = null; bDel = true; } if (bDel) filterNodes.push(node); } if (datas.length > 0) { postData(window.location.pathname + '/save', {type: 'ledger_paste', postData: datas}, function (result) { for (const uul of filterNodes) { const nodes = treeCalc.calculateParent(sheet.zh_tree, uul, 1); const refreshNode = ledgerTree.loadPostData({update: nodes}); ledgerSpreadObj.refreshTree(sheet, refreshNode); } SpreadJsObj.reLoadSheetData(sheet); }, function () { SpreadJsObj.reLoadSheetData(sheet); }); } } }, clipboardPasted(e, info) { const hint = { cellError: {type: 'error', msg: '粘贴内容超出了表格范围'}, numberExpr: {type: 'error', msg: '不能粘贴其它非数字类型字符'}, }; const tree = info.sheet.zh_tree; if (!tree) { return; } const sortData = info.sheet.zh_tree.nodes; const datas = [], filterNodes = []; for (let iRow = 0; iRow < info.cellRange.rowCount; iRow ++) { let bPaste = false; const curRow = info.cellRange.row + iRow; const node = sortData[curRow]; if (node) { for (let iCol = 0; iCol < info.cellRange.colCount; iCol++) { const curCol = info.cellRange.col + iCol; const colSetting = info.sheet.zh_setting.cols[curCol]; let validText = is_numeric(info.sheet.getText(curRow, curCol)) ? parseFloat(info.sheet.getText(curRow, curCol)) : (info.sheet.getText(curRow, curCol) ? trimInvalidChar(info.sheet.getText(curRow, curCol)) : null); const orgValue = node[colSetting.field]; if (orgValue == validText || ((!orgValue || orgValue === '') && (validText === ''))) { continue; } if (isNaN(validText)) { toastMessageUniq(hint.numberExpr); continue; } const yearmonth = colSetting.field.split('_')[0]; const mode = colSetting.field.split('_')[1]; let plan_gcl = 0; let plan_tp = 0; // 判断输入位数,提示 if (mode === 'tp') { const reg = new RegExp('^([-]?)\\d+$'); if (validText !== null && (!reg.test(validText))) { validText = ZhCalc.round(validText, 0); } plan_gcl = node.dgn_price && node.dgn_price !== 0 ? ZhCalc.round(ZhCalc.div(validText, node.dgn_price), 3) : 0; plan_tp = validText; } else { const reg = new RegExp('^([-]?)\\d+$'); if (validText !== null && (!reg.test(validText))) { validText = ZhCalc.round(validText, 3); } plan_gcl = validText; plan_tp = node.dgn_price && node.dgn_price !== 0 ? ZhCalc.round(ZhCalc.mul(validText, node.dgn_price), 0) : 0; } const updateData = { lid: node.ledger_id, yearmonth, plan_gcl, plan_tp, }; datas.push(updateData); node[yearmonth+'_gcl'] = plan_gcl; node[yearmonth+'_tp'] = plan_tp; bPaste = true; } if (bPaste) { filterNodes.push(node); } } } if (datas.length > 0) { postData(window.location.pathname + '/save', {type: 'ledger_paste', postData: datas}, function (result) { for (const uul of filterNodes) { const nodes = treeCalc.calculateParent(info.sheet.zh_tree, uul, 1); const refreshNode = ledgerTree.loadPostData({update: nodes}); ledgerSpreadObj.refreshTree(info.sheet, refreshNode); } SpreadJsObj.reLoadSheetData(info.sheet); }, function () { SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount); }); } else { SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount); } }, }; ledgerSpread.bind(spreadNS.Events.EditEnded, ledgerSpreadObj.editEnded); SpreadJsObj.addDeleteBind(ledgerSpread, ledgerSpreadObj.deletePress); ledgerSpread.bind(spreadNS.Events.ClipboardPasted, ledgerSpreadObj.clipboardPasted); // 进度计算方式选择 $('.mode-select').on('click', function () { const _self = $(this); const this_mode = _self.data('mode'); // 重新计算所有未使用的月份数据 const under_ledger = _.filter(ledgerTree.nodes, { is_leaf: true}); const update_nodes = []; const newMonthList = _.map(_.filter(scheduleMonth, function (item) { return item.stage_gcl_used === 0 && item.stage_tp_used === 0; }), 'yearmonth'); for (const ul of under_ledger) { for (const m of newMonthList) { if (ul[m+'_tp'] || ul[m+'_gcl']) { update_nodes.push(ul); break; } } } const update_under_ledger = []; if(update_nodes.length > 0) { for (const un of update_nodes) { if (this_mode === mode.gcl) { for (const m of newMonthList) { if(un[m+'_tp']) { un[m+'_tp'] = un.dgn_price && un.dgn_price !== 0 ? ZhCalc.round(ZhCalc.mul(un[m+'_gcl'], un.dgn_price), 0) : 0; update_under_ledger.push({lid: un.ledger_id, yearmonth: m, plan_tp: un[m+'_tp'], plan_gcl: un[m+'_gcl']}); } } } else { for (const m of newMonthList) { if(un[m+'_gcl']) { un[m+'_gcl'] = un.dgn_price && un.dgn_price !== 0 ? ZhCalc.round(ZhCalc.div(un[m+'_tp'], un.dgn_price), 3) : 0; update_under_ledger.push({lid: un.ledger_id, yearmonth: m, plan_tp: un[m+'_tp'], plan_gcl: un[m+'_gcl']}); } } } } } postData(window.location.pathname + '/save', {type: 'mode', postData: {mode: this_mode, update_under_ledger}}, function (result) { _self.addClass('disabled').attr('disabled', true); _self.text('当前'); _self.parents('.col-6').siblings('.col-6').find('button').removeClass('disabled').removeAttr('disabled'); _self.parents('.col-6').siblings('.col-6').find('button').text('选择'); $('#mode-tips').show(); $('#mode-cancel').show(); $('#mode').modal('hide'); schedule.mode = this_mode; if (update_nodes.length > 0) { for (const uul of update_nodes) { const nodes = treeCalc.calculateParent(ledgerSpread.getActiveSheet().zh_tree, uul, 1); const refreshNode = ledgerTree.loadPostData({update: nodes}); ledgerSpreadObj.refreshTree(ledgerSpread.getActiveSheet(), refreshNode); } } 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 }); if (one) { hadmonth.push(m); } } if (hadmonth.length > 0) { let html = ''; for (const hm of hadmonth) { html += `