|
@@ -22,11 +22,22 @@ $(function () {
|
|
|
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) {
|
|
|
+ if (sm.stage_gcl_used === 1) {
|
|
|
+ node[sm.yearmonth + '_plan_gcl'] = ZhCalc.round(ZhCalc.div(node[sm.yearmonth + '_plan_tp'], node.dgn_price), 3);
|
|
|
+ node[sm.yearmonth + '_sj_gcl'] = ZhCalc.round(ZhCalc.div(node[sm.yearmonth + '_sj_tp'], node.dgn_price), 3);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
//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'},
|
|
@@ -34,7 +45,7 @@ $(function () {
|
|
|
{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},
|
|
|
+ {title: '|金额(元)', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 70, type: 'Number', readOnly: true},
|
|
|
];
|
|
|
|
|
|
const ledgerSpreadSetting = {
|
|
@@ -46,33 +57,40 @@ $(function () {
|
|
|
font: '12px 微软雅黑',
|
|
|
// readOnly: true,
|
|
|
localCache: {
|
|
|
- key: 'ledger-bills',
|
|
|
+ key: 'ledger-gcl',
|
|
|
colWidth: true,
|
|
|
}
|
|
|
};
|
|
|
const monthsCols = [];
|
|
|
+ const calcCols = ['total_price'];
|
|
|
if(scheduleMonth.length > 0) {
|
|
|
for (const sm of scheduleMonth) {
|
|
|
if (sm.stage_gcl_used === 1) {
|
|
|
const yearmonth = sm.yearmonth.split('-')[0] + '年' + parseInt(sm.yearmonth.split('-')[1]) + '月';
|
|
|
const cols = {title: yearmonth + '|计划工程量', colSpan: '4|1', rowSpan: '1|1', field: sm.yearmonth+'_plan_gcl', hAlign: 2, width: 90, type: 'Number', readOnly: true};
|
|
|
- const cols2 = {title: '|计划金额(万元)', colSpan: '|1', rowSpan: '|1', field: sm.yearmonth+'_plan_tp', hAlign: 2, width: 90, type: 'Number', readOnly: true};
|
|
|
+ const cols2 = {title: '|计划金额(元)', colSpan: '|1', rowSpan: '|1', field: sm.yearmonth+'_plan_tp', hAlign: 2, width: 90, type: 'Number', readOnly: true};
|
|
|
const cols3 = {title: '|计量工程量', colSpan: '|1', rowSpan: '|1', field: sm.yearmonth+'_sj_gcl', hAlign: 2, width: 90, type: 'Number', readOnly: 'readOnly.gcl'};
|
|
|
- const cols4 = {title: '|计量金额(万元)', colSpan: '|1', rowSpan: '|1', field: sm.yearmonth+'_sj_tp', hAlign: 2, width: 90, type: 'Number', readOnly : true};
|
|
|
+ const cols4 = {title: '|计量金额(元)', colSpan: '|1', rowSpan: '|1', field: sm.yearmonth+'_sj_tp', hAlign: 2, width: 90, type: 'Number', readOnly : true};
|
|
|
monthsCols.push(cols);
|
|
|
monthsCols.push(cols2);
|
|
|
monthsCols.push(cols3);
|
|
|
monthsCols.push(cols4);
|
|
|
+ // calcCols.push(sm.yearmonth + '_plan_gcl');
|
|
|
+ calcCols.push(sm.yearmonth + '_plan_tp');
|
|
|
+ // calcCols.push(sm.yearmonth + '_sj_gcl');
|
|
|
+ calcCols.push(sm.yearmonth + '_sj_tp');
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ treeSetting.calcFields = calcCols;
|
|
|
+ const ledgerTree = createNewPathTree('filter', treeSetting);
|
|
|
const spreadHeaderCols = static_cols.concat(monthsCols);
|
|
|
ledgerSpreadSetting.cols = spreadHeaderCols;
|
|
|
|
|
|
const ledgerCol = {
|
|
|
readOnly: {
|
|
|
gcl: function (data) {
|
|
|
- return !data.is_leaf;
|
|
|
+ return !(data.is_leaf && !revising);
|
|
|
},
|
|
|
},
|
|
|
};
|
|
@@ -82,6 +100,8 @@ $(function () {
|
|
|
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 = [];
|
|
@@ -133,6 +153,7 @@ $(function () {
|
|
|
}
|
|
|
console.log(ledgerTree);
|
|
|
ledgerTree.sortTreeNode(true);
|
|
|
+ treeCalc.calculateAll(ledgerTree);
|
|
|
// console.log(ledgerTree);
|
|
|
SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), SpreadJsObj.DataType.Tree, ledgerTree);
|
|
|
}, null, true);
|
|
@@ -187,11 +208,33 @@ $(function () {
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
+ reCalcHuizong: function(row, yearmonth, orgValue, validText) {
|
|
|
+ // 下方汇总sjs实时更新计量数据
|
|
|
+ // 先判断当前修改月份与汇总sjs月份是否一致或更大,获取修改的对应台账行
|
|
|
+ const huizongSelect = SpreadJsObj.getRowObject(huizongSpread.getActiveSheet(), row);
|
|
|
+ if (yearmonth.split('-')[0] === curScheduleMonth.yearmonth.split('-')[0]) {
|
|
|
+ console.log(huizongSelect, row);
|
|
|
+ huizongSelect.year_sj_gcl = huizongSelect.year_sj_gcl ? ZhCalc.add(ZhCalc.sub(huizongSelect.year_sj_gcl, orgValue), validText) : validText;
|
|
|
+ huizongSelect.year_sj_tp = huizongSelect.dgn_price && huizongSelect.dgn_price !== 0 ? ZhCalc.round(ZhCalc.mul(huizongSelect.year_sj_gcl, huizongSelect.dgn_price), 0) : 0;
|
|
|
+ }
|
|
|
+ if (yearmonth === curScheduleMonth.yearmonth) {
|
|
|
+ // 判断是否同年同月,是则修改本年,截至本月,本月计量数据,否则只修改截至本月计量数据
|
|
|
+ huizongSelect.sj_gcl = validText;
|
|
|
+ huizongSelect.sj_tp = huizongSelect.dgn_price && huizongSelect.dgn_price !== 0 ? ZhCalc.round(ZhCalc.mul(huizongSelect.sj_gcl, huizongSelect.dgn_price), 0) : 0;
|
|
|
+ }
|
|
|
+ if (yearmonth <= curScheduleMonth.yearmonth) {
|
|
|
+ huizongSelect.end_sj_gcl = huizongSelect.end_sj_gcl ? ZhCalc.add(ZhCalc.sub(huizongSelect.end_sj_gcl, orgValue), validText) : validText;
|
|
|
+ huizongSelect.end_sj_tp = huizongSelect.dgn_price && huizongSelect.dgn_price !== 0 ? ZhCalc.round(ZhCalc.mul(huizongSelect.end_sj_gcl, huizongSelect.dgn_price), 0) : 0;
|
|
|
+ }
|
|
|
+ const nodes = treeCalc.calculateParent(huizongSpread.getActiveSheet().zh_tree, huizongSelect);
|
|
|
+ const refreshNode = huizongTree.loadPostData({update: nodes});
|
|
|
+ huizongObj.refreshTree(huizongSpread.getActiveSheet(), refreshNode);
|
|
|
+ },
|
|
|
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);
|
|
|
+ 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);
|
|
@@ -204,14 +247,15 @@ $(function () {
|
|
|
}
|
|
|
const yearmonth = col.field.split('_')[0];
|
|
|
// 判断输入位数,提示
|
|
|
- const reg = new RegExp('^([-]?)\\d+(\\.\\d{0,'+ parseInt(tenderInfo.decimal.up) +'})?$');
|
|
|
+ const reg = new RegExp('^([-]?)\\d+$');
|
|
|
if (validText !== null && (!reg.test(validText))) {
|
|
|
- toastr.error('输入工程量小数位数不能大于' + tenderInfo.decimal.up + '位');
|
|
|
- SpreadJsObj.reLoadRowData(info.sheet, info.row);
|
|
|
- return;
|
|
|
+ // toastr.error('输入工程量小数位数不能大于3位');
|
|
|
+ // SpreadJsObj.reLoadRowData(info.sheet, info.row);
|
|
|
+ // return;
|
|
|
+ validText = ZhCalc.round(validText, 3);
|
|
|
}
|
|
|
const sj_gcl = validText;
|
|
|
- const sj_tp = select.dgn_price && select.dgn_price !== 0 ? ZhCalc.round(ZhCalc.mul(validText, select.dgn_price), tenderInfo.decimal.tp) : 0;
|
|
|
+ const sj_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,
|
|
@@ -222,66 +266,136 @@ $(function () {
|
|
|
console.log(updateData);
|
|
|
postData(window.location.pathname + '/save', {type: 'ledger_edit', postData: updateData}, function (result) {
|
|
|
select[yearmonth + '_sj_tp'] = sj_tp;
|
|
|
- SpreadJsObj.reLoadRowData(info.sheet, info.row);
|
|
|
+ const nodes = treeCalc.calculateParent(info.sheet.zh_tree, select);
|
|
|
+ const refreshNode = ledgerTree.loadPostData({update: nodes});
|
|
|
+ ledgerSpreadObj.refreshTree(info.sheet, refreshNode);
|
|
|
+ ledgerSpreadObj.reCalcHuizong(info.row, yearmonth, orgValue, validText);
|
|
|
},function () {
|
|
|
select[col.field] = orgValue;
|
|
|
- SpreadJsObj.reLoadRowData(info.sheet, info.row);
|
|
|
+ const nodes = treeCalc.calculateParent(info.sheet.zh_tree, select);
|
|
|
+ const refreshNode = ledgerTree.loadPostData({update: nodes});
|
|
|
+ ledgerSpreadObj.refreshTree(info.sheet, refreshNode);
|
|
|
})
|
|
|
}
|
|
|
},
|
|
|
deletePress: function (sheet) {
|
|
|
- return;
|
|
|
+ if (!sheet.zh_setting) return;
|
|
|
+ if (sheet.zh_setting && sheet.zh_tree) {
|
|
|
+ const sel = sheet.getSelections()[0], datas = [], filterNodes = [], huizongNodes = [];
|
|
|
+ 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];
|
|
|
+ if(col.readOnly === true || !node.is_leaf) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ const updateData = {
|
|
|
+ lid: node.ledger_id,
|
|
|
+ yearmonth,
|
|
|
+ sj_gcl: null,
|
|
|
+ sj_tp: null,
|
|
|
+ };
|
|
|
+ datas.push(updateData);
|
|
|
+ huizongNodes.push({row: iRow, yearmonth, orgValue, nowValue: null});
|
|
|
+ node[yearmonth+'_sj_gcl'] = null;
|
|
|
+ node[yearmonth+'_sj_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);
|
|
|
+ const refreshNode = ledgerTree.loadPostData({update: nodes});
|
|
|
+ ledgerSpreadObj.refreshTree(sheet, refreshNode);
|
|
|
+ }
|
|
|
+ for (const hz of huizongNodes) {
|
|
|
+ ledgerSpreadObj.reCalcHuizong(hz.row, hz.yearmonth, hz.orgValue, hz.nowValue);
|
|
|
+ }
|
|
|
+ SpreadJsObj.reLoadSheetData(sheet);
|
|
|
+ }, function () {
|
|
|
+ SpreadJsObj.reLoadSheetData(sheet);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
},
|
|
|
clipboardPasted(e, info) {
|
|
|
const hint = {
|
|
|
cellError: {type: 'error', msg: '粘贴内容超出了表格范围'},
|
|
|
numberExpr: {type: 'error', msg: '不能粘贴其它非数字类型字符'},
|
|
|
};
|
|
|
- const range = info.cellRange;
|
|
|
- if (range.rowCount > 1 || range.colCount > 1) {
|
|
|
- toastMessageUniq(hint.cellError);
|
|
|
- SpreadJsObj.reLoadSheetHeader(ledgerSpread.getActiveSheet());
|
|
|
- SpreadJsObj.reLoadSheetData(ledgerSpread.getActiveSheet());
|
|
|
- return;
|
|
|
- }
|
|
|
- const select = SpreadJsObj.getSelectObject(info.sheet);
|
|
|
- const col = info.sheet.zh_setting.cols[range.col];
|
|
|
- const validText = is_numeric(info.pasteData.text) ? parseFloat(info.pasteData.text) : (info.pasteData.text ? trimInvalidChar(info.pasteData.text) : 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.cellRange.row, info.cellRange.rowCount);
|
|
|
- return;
|
|
|
+ const tree = info.sheet.zh_tree;
|
|
|
+ if (!tree) { return; }
|
|
|
+ const sortData = info.sheet.zh_tree.nodes;
|
|
|
+ const datas = [], filterNodes = [], huizongNodes = [];
|
|
|
+
|
|
|
+ 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 reg = new RegExp('^([-]?)\\d+$');
|
|
|
+ if (validText !== null && (!reg.test(validText))) {
|
|
|
+ validText = ZhCalc.round(validText, 3);
|
|
|
+ }
|
|
|
+ const sj_gcl = validText;
|
|
|
+ const sj_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,
|
|
|
+ sj_gcl,
|
|
|
+ sj_tp,
|
|
|
+ };
|
|
|
+ datas.push(updateData);
|
|
|
+ huizongNodes.push({row: info.cellRange.row + iRow, yearmonth, orgValue, nowValue: validText});
|
|
|
+ node[yearmonth+'_sj_gcl'] = sj_gcl;
|
|
|
+ node[yearmonth+'_sj_tp'] = sj_tp;
|
|
|
+ bPaste = true;
|
|
|
+ }
|
|
|
+ if (bPaste) {
|
|
|
+ filterNodes.push(node);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- const yearmonth = col.field.split('_')[0];
|
|
|
- // 判断输入位数,提示
|
|
|
- const reg = new RegExp('^([-]?)\\d+(\\.\\d{0,'+ parseInt(tenderInfo.decimal.up) +'})?$');
|
|
|
- if (validText !== null && (!reg.test(validText))) {
|
|
|
- toastr.error('粘贴的工程量小数位数不能大于' + tenderInfo.decimal.up + '位');
|
|
|
+ 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);
|
|
|
+ const refreshNode = ledgerTree.loadPostData({update: nodes});
|
|
|
+ ledgerSpreadObj.refreshTree(info.sheet, refreshNode);
|
|
|
+ }
|
|
|
+ for (const hz of huizongNodes) {
|
|
|
+ ledgerSpreadObj.reCalcHuizong(hz.row, hz.yearmonth, hz.orgValue, hz.nowValue);
|
|
|
+ }
|
|
|
+ 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);
|
|
|
- return;
|
|
|
}
|
|
|
- const sj_gcl = validText;
|
|
|
- const sj_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,
|
|
|
- sj_gcl,
|
|
|
- sj_tp,
|
|
|
- };
|
|
|
- console.log(updateData);
|
|
|
- postData(window.location.pathname + '/save', {type: 'ledger_edit', postData: updateData}, function (result) {
|
|
|
- select[yearmonth + '_sj_tp'] = sj_tp;
|
|
|
- SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount);
|
|
|
- },function () {
|
|
|
- select[col.field] = orgValue;
|
|
|
- SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount);
|
|
|
- })
|
|
|
},
|
|
|
};
|
|
|
|
|
@@ -289,6 +403,205 @@ $(function () {
|
|
|
SpreadJsObj.addDeleteBind(ledgerSpread, ledgerSpreadObj.deletePress);
|
|
|
ledgerSpread.bind(spreadNS.Events.ClipboardPasted, ledgerSpreadObj.clipboardPasted);
|
|
|
|
|
|
+
|
|
|
+ // 下方金额模式的sjs
|
|
|
+ const huizongSpread = SpreadJsObj.createNewSpread($('#huizong-spread')[0]);
|
|
|
+ const huizongTreeSetting = {
|
|
|
+ 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) {
|
|
|
+ node.end_plan_gcl = ZhCalc.round(ZhCalc.div(node.end_plan_tp, node.dgn_price), 3);
|
|
|
+ node.year_plan_gcl = ZhCalc.round(ZhCalc.div(node.year_plan_tp, node.dgn_price), 3);
|
|
|
+ node.plan_gcl = ZhCalc.round(ZhCalc.div(node.plan_tp, node.dgn_price), 3);
|
|
|
+ node.next_plan_gcl = ZhCalc.round(ZhCalc.div(node.next_plan_tp, node.dgn_price), 3);
|
|
|
+ node.end_sj_gcl = ZhCalc.round(ZhCalc.div(node.end_sj_tp, node.dgn_price), 3);
|
|
|
+ node.year_sj_gcl = ZhCalc.round(ZhCalc.div(node.year_sj_tp, node.dgn_price), 3);
|
|
|
+ node.sj_gcl = ZhCalc.round(ZhCalc.div(node.sj_tp, node.dgn_price), 3);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ calcFields: ['plan_tp', 'next_plan_tp', 'end_plan_tp', 'year_plan_tp', 'total_price', 'end_sj_tp', 'year_sj_tp', 'sj_tp'],
|
|
|
+ };
|
|
|
+
|
|
|
+ const huizong_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},
|
|
|
+ {title: '自开工至本月计划完成|工程量', colSpan: '2|1', rowSpan: '1|1', field: 'end_plan_gcl', hAlign: 2, width: 70, type: 'Number', readOnly: true},
|
|
|
+ {title: '|金额(元)', colSpan: '|1', rowSpan: '|1', field: 'end_plan_tp', hAlign: 2, width: 70, type: 'Number', readOnly: true},
|
|
|
+ {title: '截止本月完成计量|工程量', colSpan: '2|1', rowSpan: '1|1', field: 'end_sj_gcl', hAlign: 2, width: 70, type: 'Number', readOnly: true},
|
|
|
+ {title: '|金额(元)', colSpan: '|1', rowSpan: '|1', field: 'end_sj_tp', hAlign: 2, width: 70, type: 'Number', readOnly: true},
|
|
|
+ {title: '本年计划完成|工程量', colSpan: '2|1', rowSpan: '1|1', field: 'year_plan_gcl', hAlign: 2, width: 70, type: 'Number', readOnly: true},
|
|
|
+ {title: '|金额(元)', colSpan: '|1', rowSpan: '|1', field: 'year_plan_tp', hAlign: 2, width: 70, type: 'Number', readOnly: true},
|
|
|
+ {title: '本年累计完成|工程量', colSpan: '2|1', rowSpan: '1|1', field: 'year_sj_gcl', hAlign: 2, width: 70, type: 'Number', readOnly: true},
|
|
|
+ {title: '|金额(元)', colSpan: '|1', rowSpan: '|1', field: 'year_sj_tp', hAlign: 2, width: 70, type: 'Number', readOnly: true},
|
|
|
+ {title: '本月计划完成|工程量', colSpan: '2|1', rowSpan: '1|1', field: 'plan_gcl', hAlign: 2, width: 70, type: 'Number', readOnly: true},
|
|
|
+ {title: '|金额(元)', colSpan: '|1', rowSpan: '|1', field: 'plan_tp', hAlign: 2, width: 70, type: 'Number', readOnly: true},
|
|
|
+ {title: '本月计量完成|工程量', colSpan: '2|1', rowSpan: '1|1', field: 'sj_gcl', hAlign: 2, width: 70, type: 'Number', readOnly: true},
|
|
|
+ {title: '|金额(元)', colSpan: '|1', rowSpan: '|1', field: 'sj_tp', hAlign: 2, width: 70, type: 'Number', readOnly: true},
|
|
|
+ {title: '下月计划|工程量', colSpan: '2|1', rowSpan: '1|1', field: 'next_plan_gcl', hAlign: 2, width: 70, type: 'Number', readOnly: true},
|
|
|
+ {title: '|金额(元)', colSpan: '|1', rowSpan: '|1', field: 'next_plan_tp', hAlign: 2, width: 70, type: 'Number', readOnly: true},
|
|
|
+ ];
|
|
|
+
|
|
|
+ const huizongSpreadSetting = {
|
|
|
+ emptyRows: 0,
|
|
|
+ headRows: 2,
|
|
|
+ headRowHeight: [25, 25],
|
|
|
+ defaultRowHeight: 21,
|
|
|
+ headerFont: '12px 微软雅黑',
|
|
|
+ font: '12px 微软雅黑',
|
|
|
+ // readOnly: true,
|
|
|
+ localCache: {
|
|
|
+ key: 'ledger-huizong',
|
|
|
+ colWidth: true,
|
|
|
+ }
|
|
|
+ };
|
|
|
+ huizongSpreadSetting.cols = huizong_static_cols;
|
|
|
+
|
|
|
+ sjsSettingObj.setFxTreeStyle(huizongSpreadSetting, sjsSettingObj.FxTreeStyle.jz);
|
|
|
+ if (thousandth) sjsSettingObj.setTpThousandthFormat(huizongSpreadSetting);
|
|
|
+ SpreadJsObj.initSheet(huizongSpread.getActiveSheet(), huizongSpreadSetting);
|
|
|
+ SpreadJsObj.selChangedRefreshBackColor(huizongSpread.getActiveSheet());
|
|
|
+ huizongSpread.getActiveSheet().frozenColumnCount(6);
|
|
|
+ huizongSpread.getActiveSheet().options.frozenlineColor = '#93b5e4';
|
|
|
+
|
|
|
+ let huizongTree = '';
|
|
|
+
|
|
|
+ const huizongObj = {
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ setSjs: function (order) {
|
|
|
+ postData('/tender/' + getTenderId() + '/schedule/stage/gcl/' + order + '/load', {}, function (data) {
|
|
|
+ const calcList = ['total_price'];
|
|
|
+ const showList = ['plan_gcl', 'plan_tp', 'next_plan_gcl', 'next_plan_tp', 'end_plan_gcl', 'end_plan_tp', 'year_plan_gcl', 'year_plan_tp',
|
|
|
+ 'sj_gcl', 'sj_tp', 'year_sj_gcl', 'year_sj_tp', 'end_sj_gcl', 'end_sj_tp',
|
|
|
+ 'ledger_id', 'ledger_pid', 'order', 'level', 'tender_id', 'full_path',
|
|
|
+ 'code', 'name', 'unit', 'dgn_qty1', 'dgn_qty2', 'dgn_price', 'quantity', 'total_price'];
|
|
|
+ const baseLedgerTreeSetting = {
|
|
|
+ id: 'ledger_id',
|
|
|
+ pid: 'ledger_pid',
|
|
|
+ order: 'order',
|
|
|
+ level: 'level',
|
|
|
+ rootId: -1,
|
|
|
+ fullPath: 'full_path',
|
|
|
+ calcFields: calcList,
|
|
|
+ };
|
|
|
+ // baseLedgerTreeSetting.updateFields = ['year_sj_qty', 'year_gather_tp', 'contract_qty', 'end_gather_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'postil', 'used', 'contract_expr'];
|
|
|
+ baseLedgerTreeSetting.calcFun = function (node) {
|
|
|
+ node.dgn_price = ZhCalc.round(ZhCalc.div(node.total_price, node.dgn_qty1), 2);
|
|
|
+ };
|
|
|
+ const baseLedgerTree = createNewPathTree('base', baseLedgerTreeSetting);
|
|
|
+ console.log(data.slmList);
|
|
|
+ const newLedgerList = setGclMonthToLedger(data.ledgerData, data.slmList, data.nextSlmList, data.endSlmList, data.yearSlmList);
|
|
|
+ baseLedgerTree.loadDatas(newLedgerList);
|
|
|
+ treeCalc.calculateAll(baseLedgerTree);
|
|
|
+ huizongTree = createNewPathTree('filter', huizongTreeSetting);
|
|
|
+ for (const d of baseLedgerTree.nodes) {
|
|
|
+ if (!d.b_code) {
|
|
|
+ const one = _.find(selectedLedgerList, function (item) {
|
|
|
+ return item === d.ledger_id;
|
|
|
+ });
|
|
|
+ if (one) {
|
|
|
+ huizongTree.addData(d, showList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ huizongTree.sortTreeNode(true);
|
|
|
+ treeCalc.calculateAll(huizongTree);
|
|
|
+ console.log(huizongTree);
|
|
|
+ SpreadJsObj.loadSheetData(huizongSpread.getActiveSheet(), SpreadJsObj.DataType.Tree, huizongTree);
|
|
|
+ // huizongSpread.refresh();
|
|
|
+ }, null, true);
|
|
|
+ },
|
|
|
+ dropDownHtml: function (order) {
|
|
|
+ let html = '';
|
|
|
+ for (const ss of gclScheduleMonth) {
|
|
|
+ if (ss.id !== order) {
|
|
|
+ html += '<a class="dropdown-item change-tp" data-order="'+ ss.id +'" href="javascript:void(0);">'+ ss.yearmonth.split('-')[0] + '年' + parseInt(ss.yearmonth.split('-')[1]) +'月</a>';
|
|
|
+ } else {
|
|
|
+ $('#stageDropdownMenuButton').text(ss.yearmonth.split('-')[0] + '年' + parseInt(ss.yearmonth.split('-')[1]) +'月');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $('#stageDropdownMenu').html(html);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ if (curScheduleMonth && curScheduleMonth.id) {
|
|
|
+ let order = parseInt(localStorage.getItem('tender_' + getTenderId() + '_schedule_tp_sjs') ? localStorage.getItem('tender_' + getTenderId() + '_schedule_tp_sjs') : curScheduleMonth.id);
|
|
|
+ const ssinfo = _.find(gclScheduleMonth, { id: order });
|
|
|
+ if (!ssinfo) {
|
|
|
+ order = curScheduleMonth.id;
|
|
|
+ } else {
|
|
|
+ curScheduleMonth = ssinfo;
|
|
|
+ }
|
|
|
+ huizongObj.dropDownHtml(order);
|
|
|
+ huizongObj.setSjs(order);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 汇总切换
|
|
|
+ $('body').on('click', '.change-tp', function () {
|
|
|
+ const order = parseInt($(this).data('order'));
|
|
|
+ huizongObj.dropDownHtml(order);
|
|
|
+ huizongObj.setSjs(order);
|
|
|
+ localStorage.setItem('tender_' + getTenderId() + '_schedule_tp_sjs', order);
|
|
|
+ curScheduleMonth = _.find(gclScheduleMonth, { id: order });
|
|
|
+ });
|
|
|
+
|
|
|
// 月份添加
|
|
|
$('#add-month').click(function () {
|
|
|
const id = parseInt($('#month-select').val());
|
|
@@ -298,6 +611,7 @@ $(function () {
|
|
|
}
|
|
|
const _self = $(this);
|
|
|
postData(window.location.pathname + '/save', {type: 'add_stage', postData: { id: id }}, function (result) {
|
|
|
+ localStorage.setItem('tender_' + getTenderId() + '_schedule_tp_sjs', id);
|
|
|
_self.addClass('disabled').attr('disabled', true);
|
|
|
toastr.success('创建成功');
|
|
|
setTimeout(function () {
|
|
@@ -332,6 +646,7 @@ $(function () {
|
|
|
}
|
|
|
const _self = $(this);
|
|
|
postData(window.location.pathname + '/save', {type: 'del_stage', postData: selectedMonth}, function (result) {
|
|
|
+ localStorage.removeItem('tender_' + getTenderId() + '_schedule_tp_sjs');
|
|
|
_self.addClass('disabled').attr('disabled', true);
|
|
|
toastr.success('删除成功');
|
|
|
setTimeout(function () {
|
|
@@ -354,8 +669,9 @@ $(function () {
|
|
|
$('.panel-title').removeClass('fluid');
|
|
|
$('#sub-menu').addClass('panel-sidebar');
|
|
|
}
|
|
|
- ledgerSpread.refresh();
|
|
|
autoFlashHeight();
|
|
|
+ ledgerSpread.refresh();
|
|
|
+ huizongSpread.refresh();
|
|
|
}
|
|
|
});
|
|
|
|
|
@@ -364,8 +680,9 @@ $(function () {
|
|
|
callback: function () {
|
|
|
ledgerSpread.refresh();
|
|
|
let bcontent = $(".bcontent-wrap") ? $(".bcontent-wrap").height() : 0;
|
|
|
- $(".tab-content").height(bcontent-30);
|
|
|
- // posSpread.refresh();
|
|
|
+ $(".sp-wrap").height(bcontent-30);
|
|
|
+ huizongSpread.refresh();
|
|
|
+ window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
|
|
|
}
|
|
|
});
|
|
|
});
|
|
@@ -396,6 +713,51 @@ function setMonthToLedger(ledgerList, slm) {
|
|
|
}
|
|
|
return ledgerList;
|
|
|
}
|
|
|
+function setGclMonthToLedger(ledgerList, slm, nextSlm, endSlm, yearSlm) {
|
|
|
+ if (slm.length > 0) {
|
|
|
+ for(const s of slm) {
|
|
|
+ const index = _.findIndex(ledgerList, { 'ledger_id': s.lid });
|
|
|
+ if (index && index !== -1) {
|
|
|
+ ledgerList[index].plan_tp = s.plan_tp;
|
|
|
+ ledgerList[index].plan_gcl = s.plan_gcl;
|
|
|
+ ledgerList[index].sj_tp = s.sj_tp;
|
|
|
+ ledgerList[index].sj_gcl = s.sj_gcl;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (nextSlm.length > 0) {
|
|
|
+ for (const ns of nextSlm) {
|
|
|
+ const index = _.findIndex(ledgerList, {'ledger_id': ns.lid});
|
|
|
+ if (index && index !== -1) {
|
|
|
+ ledgerList[index].next_plan_tp = ns.plan_tp;
|
|
|
+ ledgerList[index].next_plan_gcl = ns.plan_gcl;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (endSlm.length > 0) {
|
|
|
+ for (const es of endSlm) {
|
|
|
+ const index = _.findIndex(ledgerList, {'ledger_id': es.lid});
|
|
|
+ if (index && index !== -1) {
|
|
|
+ ledgerList[index].end_plan_tp = es.plan_tp;
|
|
|
+ ledgerList[index].end_plan_gcl = es.plan_gcl;
|
|
|
+ ledgerList[index].end_sj_tp = es.sj_tp;
|
|
|
+ ledgerList[index].end_sj_gcl = es.sj_gcl;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (yearSlm.length > 0) {
|
|
|
+ for (const ys of yearSlm) {
|
|
|
+ const index = _.findIndex(ledgerList, {'ledger_id': ys.lid});
|
|
|
+ if (index && index !== -1) {
|
|
|
+ ledgerList[index].year_plan_tp = ys.plan_tp;
|
|
|
+ ledgerList[index].year_plan_gcl = ys.plan_gcl;
|
|
|
+ ledgerList[index].year_sj_tp = ys.sj_tp;
|
|
|
+ ledgerList[index].year_sj_gcl = ys.sj_gcl;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ledgerList;
|
|
|
+}
|
|
|
const is_numeric = (value) => {
|
|
|
if (typeof(value) === 'object') {
|
|
|
return false;
|