|
@@ -1,8 +1,13 @@
|
|
|
+
|
|
|
+let budgetSummaryTreeSetting;
|
|
|
/* 建设其他费表格相关 */
|
|
|
const budgetSummaryObj = (() => {
|
|
|
|
|
|
const { isEmptyVal, isDef, isNumber } = window.commonUtil;
|
|
|
- const { fixedFlag, BudgetArea } = window.commonConstants;
|
|
|
+ const { fixedFlag, BudgetArea, BudgetType } = window.commonConstants;
|
|
|
+
|
|
|
+
|
|
|
+ let curBudgetType = BudgetType.BUILDING;
|
|
|
|
|
|
// 原始数据
|
|
|
let rawData = [];
|
|
@@ -67,7 +72,19 @@ const budgetSummaryObj = (() => {
|
|
|
return '';
|
|
|
},
|
|
|
'feesIndex.common.unitFee': (node) => {
|
|
|
- return _.get(node, 'data.feesIndex.common.unitFee', '') || '';
|
|
|
+ if (node && node.data.area === BudgetArea.CONSTRUCTION_FEE) {
|
|
|
+ // 实时计算显示单价
|
|
|
+ const totalFee = _.get(node, 'data.feesIndex.common.totalFee', 0);
|
|
|
+ const quantity = node.data.quantity || 0;
|
|
|
+ if (!totalFee || !quantity) {
|
|
|
+ return '';
|
|
|
+ }
|
|
|
+ return scMathUtil.roundForObj(totalFee / quantity, 2); // 小数位数写死2位置
|
|
|
+ }
|
|
|
+ if (node && node.data.area === BudgetArea.CONSTRUCTION_OTHER_FEE) {
|
|
|
+ return _.get(node, 'data.feesIndex.common.unitFee', '') || '';
|
|
|
+ }
|
|
|
+ return '';
|
|
|
},
|
|
|
'feesIndex.common.totalFee': (node) => {
|
|
|
return _.get(node, 'data.feesIndex.common.totalFee', '') || '';
|
|
@@ -139,6 +156,7 @@ const budgetSummaryObj = (() => {
|
|
|
// 验证不通过,恢复
|
|
|
if (!isValid) {
|
|
|
refreshData(sheet, changedCells);
|
|
|
+ return;
|
|
|
}
|
|
|
}
|
|
|
let needCalc = false;
|
|
@@ -186,14 +204,14 @@ const budgetSummaryObj = (() => {
|
|
|
data.calcBaseValue = node.data.calcBaseValue;
|
|
|
data.tenderCalcBaseValue = node.data.tenderCalcBaseValue;
|
|
|
}
|
|
|
- if (['quantity', 'feesIndex.common.unitFee', 'calcBase', 'feeRate'].includes(field)) {
|
|
|
+ if (['quantity', 'feesIndex.common.unitFee', 'calcBase', 'feeRate'].includes(field) && node.data.area !== BudgetArea.CONSTRUCTION_FEE) {
|
|
|
needCalc = true;
|
|
|
}
|
|
|
});
|
|
|
- calcNodes = calcNodes ? calcNodes : nodes;
|
|
|
+ calcNodes = calcNodes ? calcNodes : needCalc ? nodes : [];
|
|
|
// 重算节点
|
|
|
const dataArr = [];
|
|
|
- if ((needCalc && nodes.length) || (calcNodes && calcNodes.length)) {
|
|
|
+ if (calcNodes && calcNodes.length) {
|
|
|
const changedNodes = projectObj.project.calcProgram.calcNodes(calcNodes, false, tree);
|
|
|
for (const node of changedNodes) {
|
|
|
nodes.push(node);
|
|
@@ -231,7 +249,9 @@ const budgetSummaryObj = (() => {
|
|
|
fees.push({ fieldName: 'other', totalFee: commonFeeItem && commonFeeItem.totalFee || 0 });
|
|
|
}
|
|
|
}
|
|
|
- bulkData.push({ type: 'update', data: { ID, ...data } });
|
|
|
+ const actualID = node.data.area === BudgetArea.CONSTRUCTION_FEE ? node.data.orgProjectID : ID;
|
|
|
+ const updateType = node.data.area === BudgetArea.CONSTRUCTION_FEE ? 'updateProject' : 'update';
|
|
|
+ bulkData.push({ type: updateType, data: { ...data, ID: actualID } });
|
|
|
});
|
|
|
await bulkOperation(bulkData);
|
|
|
Object
|
|
@@ -344,16 +364,22 @@ const budgetSummaryObj = (() => {
|
|
|
// 单元格锁定判断
|
|
|
const lockFactory = {
|
|
|
code(node) {
|
|
|
- return !!(node && node.getFlag());
|
|
|
+ return !!(node && (node.getFlag() || node.data.area === BudgetArea.CONSTRUCTION_FEE));
|
|
|
},
|
|
|
name(node) {
|
|
|
- return !!(node && node.getFlag());
|
|
|
+ return !!(node && (node.getFlag() || node.data.area === BudgetArea.CONSTRUCTION_FEE));
|
|
|
+ },
|
|
|
+ 'feesIndex.common.unitFee'(node) {
|
|
|
+ return !!(node && (node.data.area === BudgetArea.CONSTRUCTION_FEE));
|
|
|
},
|
|
|
calcBase(node) {
|
|
|
- return !!(node && node.children.length);
|
|
|
+ return !!(node && (node.children.length || node.data.area === BudgetArea.CONSTRUCTION_FEE));
|
|
|
},
|
|
|
feeRate(node) {
|
|
|
- return !!(node && node.children.length);
|
|
|
+ return !!(node && (node.children.length || node.data.area === BudgetArea.CONSTRUCTION_FEE));
|
|
|
+ },
|
|
|
+ remark(node) {
|
|
|
+ return !!(node && node.data.area === BudgetArea.CONSTRUCTION_FEE);
|
|
|
}
|
|
|
};
|
|
|
const lockData = (sheet, nodes, isMass = true) => {
|
|
@@ -363,13 +389,26 @@ const budgetSummaryObj = (() => {
|
|
|
return 0;
|
|
|
}
|
|
|
// 工程费用区域,只读
|
|
|
- const constructionFeeNode = nodes.find(node => node.getFlag() === fixedFlag.CONSTRUCTION_FEE);
|
|
|
+ /* const constructionFeeNode = nodes.find(node => node.getFlag() === fixedFlag.CONSTRUCTION_FEE);
|
|
|
if (!constructionFeeNode) {
|
|
|
return 0;
|
|
|
}
|
|
|
const endIndex = constructionFeeNode.posterityCount() + 1;
|
|
|
sheet.getRange(0, 0, endIndex, budgetSummaryTreeSetting.cols.length, GC.Spread.Sheets.SheetArea.viewport).locked(true);
|
|
|
- return endIndex;
|
|
|
+ // 除第一行,章编号 节编号可编辑
|
|
|
+ if (curBudgetType === BudgetType.RAIL) {
|
|
|
+ const chapterCodeCol = budgetSummaryTreeSetting.cols.findIndex(item => item.data.field === 'chapterCode');
|
|
|
+ const sectionCodeCol = budgetSummaryTreeSetting.cols.findIndex(item => item.data.field === 'sectionCode');
|
|
|
+ for (let row = 1; row < endIndex; row++) {
|
|
|
+ if (chapterCodeCol > -1) {
|
|
|
+ sheet.getCell(row, chapterCodeCol).locked(false);
|
|
|
+ }
|
|
|
+ if (sectionCodeCol > -1) {
|
|
|
+ sheet.getCell(row, sectionCodeCol).locked(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return endIndex; */
|
|
|
}
|
|
|
if (isMass) {
|
|
|
TREE_SHEET_HELPER.massOperationSheet(sheet, () => {
|
|
@@ -450,7 +489,7 @@ const budgetSummaryObj = (() => {
|
|
|
setUnitCombo(sheet, data);
|
|
|
TREE_SHEET_HELPER.massOperationSheet(sheet, () => {
|
|
|
const startRow = lockData(sheet, tree.items, false);
|
|
|
- setCells(sheet, startRow, tree.items);
|
|
|
+ setCells(sheet, 0, tree.items);
|
|
|
// 表格格式化
|
|
|
budgetSummaryTreeSetting.cols.forEach((item, index) => {
|
|
|
sheet.setFormatter(-1, index, item.formatter || '@', GC.Spread.Sheets.SheetArea.viewport);
|
|
@@ -689,7 +728,9 @@ const budgetSummaryObj = (() => {
|
|
|
$.bootstrapLoading.start();
|
|
|
// 得先计算费用汇总(概算汇总计算基于费用汇总算出来的总金额)
|
|
|
await projectObj.project.calcProgram.getGatherFeeData();
|
|
|
- const { treeData, costGrowthRate, growthPeriod } = await ajaxPost('/bills/initialBudgetSummary', { constructionID });
|
|
|
+ const { budgetType, treeData, costGrowthRate, growthPeriod } = await ajaxPost('/bills/initialBudgetSummary', { constructionID });
|
|
|
+ budgetSummaryTreeSetting = budgetType === BudgetType.BUILDING ? budgetInstallationSetting : budgetRailSetting;
|
|
|
+ curBudgetType = budgetType;
|
|
|
calcSetting.costGrowthRate = costGrowthRate;
|
|
|
calcSetting.growthPeriod = growthPeriod;
|
|
|
$('#costGrowthRate').val(costGrowthRate);
|