|
@@ -1,12 +1,9 @@
|
|
|
-
|
|
|
let budgetSummaryTreeSetting;
|
|
|
/* 建设其他费表格相关 */
|
|
|
const budgetSummaryObj = (() => {
|
|
|
-
|
|
|
const { isEmptyVal, isDef, isNumber } = window.commonUtil;
|
|
|
const { fixedFlag, BudgetArea, BudgetType } = window.commonConstants;
|
|
|
|
|
|
-
|
|
|
let curBudgetType = BudgetType.BUILDING;
|
|
|
|
|
|
// 原始数据
|
|
@@ -25,31 +22,62 @@ const budgetSummaryObj = (() => {
|
|
|
|
|
|
// 单位设置下拉框
|
|
|
const setUnitCombo = (sheet, data) => {
|
|
|
- const unitCol = budgetSummaryTreeSetting.cols.findIndex(item => item.data.field === 'unit');
|
|
|
+ const unitCol = budgetSummaryTreeSetting.cols.findIndex((item) => item.data.field === "unit");
|
|
|
if (unitCol >= 0) {
|
|
|
TREE_SHEET_HELPER.massOperationSheet(sheet, () => {
|
|
|
const comboBox = sheetCommonObj.getDynamicCombo();
|
|
|
comboBox
|
|
|
.itemHeight(10)
|
|
|
- .items(['m', 'm2', 'm3', 'km', 't', 'kg', '台班', '工日', '昼夜', '元', '项', '处', '个', '件',
|
|
|
- '根', '组', '系统', '台', '套', '株', '丛', '缸', '支', '只', '块', '座', '对', '份', '樘', '攒', '榀'])
|
|
|
+ .items([
|
|
|
+ "m",
|
|
|
+ "m2",
|
|
|
+ "m3",
|
|
|
+ "km",
|
|
|
+ "t",
|
|
|
+ "kg",
|
|
|
+ "台班",
|
|
|
+ "工日",
|
|
|
+ "昼夜",
|
|
|
+ "元",
|
|
|
+ "项",
|
|
|
+ "处",
|
|
|
+ "个",
|
|
|
+ "件",
|
|
|
+ "根",
|
|
|
+ "组",
|
|
|
+ "系统",
|
|
|
+ "台",
|
|
|
+ "套",
|
|
|
+ "株",
|
|
|
+ "丛",
|
|
|
+ "缸",
|
|
|
+ "支",
|
|
|
+ "只",
|
|
|
+ "块",
|
|
|
+ "座",
|
|
|
+ "对",
|
|
|
+ "份",
|
|
|
+ "樘",
|
|
|
+ "攒",
|
|
|
+ "榀",
|
|
|
+ ])
|
|
|
.editable(true);
|
|
|
data.forEach((item, index) => {
|
|
|
sheet.getCell(index, unitCol).cellType(comboBox);
|
|
|
- })
|
|
|
+ });
|
|
|
});
|
|
|
}
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
const getFieldByCol = (col) => {
|
|
|
const item = budgetSummaryTreeSetting.cols[col];
|
|
|
- return item && item.data && item.data.field || null;
|
|
|
- }
|
|
|
+ return (item && item.data && item.data.field) || null;
|
|
|
+ };
|
|
|
|
|
|
// 单元格值验证器
|
|
|
const validator = {
|
|
|
text() {
|
|
|
- return true
|
|
|
+ return true;
|
|
|
},
|
|
|
number(val) {
|
|
|
return !isDef(val) || isNumber(val);
|
|
@@ -58,10 +86,10 @@ const budgetSummaryObj = (() => {
|
|
|
const getValidator = (col) => {
|
|
|
const item = budgetSummaryTreeSetting.cols[col];
|
|
|
if (!item) {
|
|
|
- return 'text';
|
|
|
+ return "text";
|
|
|
}
|
|
|
- return validator[item.data.type || 'text'];
|
|
|
- }
|
|
|
+ return validator[item.data.type || "text"];
|
|
|
+ };
|
|
|
|
|
|
// 单元格文本转换处理
|
|
|
const textFactory = {
|
|
@@ -69,40 +97,40 @@ const budgetSummaryObj = (() => {
|
|
|
if (node.data.calcBase && node.data.calcBase !== "") {
|
|
|
return cbParser.toFExpr(node.data.calcBase);
|
|
|
}
|
|
|
- return '';
|
|
|
+ return "";
|
|
|
},
|
|
|
- 'feesIndex.common.unitFee': (node) => {
|
|
|
+ "feesIndex.common.unitFee": (node) => {
|
|
|
if (node && node.data.area === BudgetArea.CONSTRUCTION_FEE) {
|
|
|
// 实时计算显示单价
|
|
|
- const totalFee = _.get(node, 'data.feesIndex.common.totalFee', 0);
|
|
|
+ const totalFee = _.get(node, "data.feesIndex.common.totalFee", 0);
|
|
|
const quantity = node.data.quantity || 0;
|
|
|
if (!totalFee || !quantity) {
|
|
|
- return '';
|
|
|
+ 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 _.get(node, "data.feesIndex.common.unitFee", "") || "";
|
|
|
}
|
|
|
- return '';
|
|
|
+ return "";
|
|
|
},
|
|
|
- 'feesIndex.common.totalFee': (node) => {
|
|
|
- return _.get(node, 'data.feesIndex.common.totalFee', '') || '';
|
|
|
+ "feesIndex.common.totalFee": (node) => {
|
|
|
+ return _.get(node, "data.feesIndex.common.totalFee", "") || "";
|
|
|
},
|
|
|
- 'feesIndex.estimation.totalFee': (node) => {
|
|
|
- return _.get(node, 'data.feesIndex.estimation.totalFee', '') || '';
|
|
|
+ "feesIndex.estimation.totalFee": (node) => {
|
|
|
+ return _.get(node, "data.feesIndex.estimation.totalFee", "") || "";
|
|
|
},
|
|
|
- 'feesIndex.building.totalFee': (node) => {
|
|
|
- return _.get(node, 'data.feesIndex.building.totalFee', '') || '';
|
|
|
+ "feesIndex.building.totalFee": (node) => {
|
|
|
+ return _.get(node, "data.feesIndex.building.totalFee", "") || "";
|
|
|
},
|
|
|
- 'feesIndex.installation.totalFee': (node) => {
|
|
|
- return _.get(node, 'data.feesIndex.installation.totalFee', '') || '';
|
|
|
+ "feesIndex.installation.totalFee": (node) => {
|
|
|
+ return _.get(node, "data.feesIndex.installation.totalFee", "") || "";
|
|
|
},
|
|
|
- 'feesIndex.equipment.totalFee': (node) => {
|
|
|
- return _.get(node, 'data.feesIndex.equipment.totalFee', '') || '';
|
|
|
+ "feesIndex.equipment.totalFee": (node) => {
|
|
|
+ return _.get(node, "data.feesIndex.equipment.totalFee", "") || "";
|
|
|
},
|
|
|
- 'feesIndex.other.totalFee': (node) => {
|
|
|
- return _.get(node, 'data.feesIndex.other.totalFee', '') || '';
|
|
|
+ "feesIndex.other.totalFee": (node) => {
|
|
|
+ return _.get(node, "data.feesIndex.other.totalFee", "") || "";
|
|
|
},
|
|
|
};
|
|
|
|
|
@@ -120,11 +148,11 @@ const budgetSummaryObj = (() => {
|
|
|
return;
|
|
|
}
|
|
|
const textFunc = textFactory[field];
|
|
|
- const val = textFunc ? textFunc(node) : node.data[field] || '';
|
|
|
+ const val = textFunc ? textFunc(node) : node.data[field] || "";
|
|
|
sheet.setValue(row, col, val);
|
|
|
});
|
|
|
});
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
// 刷新整个表格
|
|
|
const refreshAll = (sheet) => {
|
|
@@ -132,16 +160,16 @@ const budgetSummaryObj = (() => {
|
|
|
const colCount = budgetSummaryTreeSetting.cols.length;
|
|
|
for (let row = 0; row < tree.items.length; row++) {
|
|
|
for (let col = 0; col < colCount; col++) {
|
|
|
- changedCells.push({ row, col })
|
|
|
+ changedCells.push({ row, col });
|
|
|
}
|
|
|
}
|
|
|
refreshData(sheet, changedCells);
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
// 更新数据
|
|
|
const bulkOperation = async (bulkData) => {
|
|
|
if (bulkData.length) {
|
|
|
- await ajaxPost('/bills/bulkOperation', { bulkData });
|
|
|
+ await ajaxPost("/bills/bulkOperation", { bulkData });
|
|
|
}
|
|
|
};
|
|
|
|
|
@@ -149,9 +177,9 @@ const budgetSummaryObj = (() => {
|
|
|
const calcEstimate = (nodes) => {
|
|
|
const dataArr = [];
|
|
|
const parentIDs = new Set();
|
|
|
- nodes.forEach(node => parentIDs.add(node.data.ParentID));
|
|
|
+ nodes.forEach((node) => parentIDs.add(node.data.ParentID));
|
|
|
const parentNodes = [];
|
|
|
- parentIDs.forEach(parentID => {
|
|
|
+ parentIDs.forEach((parentID) => {
|
|
|
const node = tree.findNode(parentID);
|
|
|
if (!node) {
|
|
|
return;
|
|
@@ -161,18 +189,18 @@ const budgetSummaryObj = (() => {
|
|
|
return;
|
|
|
}
|
|
|
let estimateFee = 0;
|
|
|
- node.children.forEach(child => {
|
|
|
- const childEstimateItem = child.data.fees && child.data.fees.find(item => item.fieldName === 'estimation') || null;
|
|
|
+ node.children.forEach((child) => {
|
|
|
+ const childEstimateItem = (child.data.fees && child.data.fees.find((item) => item.fieldName === "estimation")) || null;
|
|
|
const childEstimateFee = childEstimateItem ? childEstimateItem.totalFee : 0;
|
|
|
estimateFee = scMathUtil.roundForObj(estimateFee + childEstimateFee, decimalObj.bills.totalPrice);
|
|
|
});
|
|
|
- const estimateItem = node.data.fees && node.data.fees.find(item => item.fieldName === 'estimation') || null;
|
|
|
+ const estimateItem = (node.data.fees && node.data.fees.find((item) => item.fieldName === "estimation")) || null;
|
|
|
const orgEstimateFee = estimateItem ? estimateItem.totalFee : 0;
|
|
|
if (orgEstimateFee !== estimateFee) {
|
|
|
if (estimateItem) {
|
|
|
estimateItem.totalFee = estimateFee;
|
|
|
} else {
|
|
|
- node.data.fees.push({ fieldName: 'estimation', totalFee: estimateFee, unitFee: 0 });
|
|
|
+ node.data.fees.push({ fieldName: "estimation", totalFee: estimateFee, unitFee: 0 });
|
|
|
}
|
|
|
dataArr.push({ ID: node.data.ID, fees: node.data.fees });
|
|
|
}
|
|
@@ -207,35 +235,36 @@ const budgetSummaryObj = (() => {
|
|
|
$.bootstrapLoading.start();
|
|
|
const IDMap = {};
|
|
|
const bulkData = [];
|
|
|
+
|
|
|
changedCells.forEach(({ row, col }) => {
|
|
|
const node = tree.items[row];
|
|
|
if (!node) {
|
|
|
return;
|
|
|
}
|
|
|
- if (!nodes.find(n => n.data.ID !== node.data.ID)) {
|
|
|
+ if (!nodes.find((n) => n.data.ID === node.data.ID)) {
|
|
|
nodes.push(node);
|
|
|
}
|
|
|
const field = getFieldByCol(col);
|
|
|
- const value = sheet.getValue(row, col) || '';
|
|
|
- const data = (IDMap[node.data.ID] || (IDMap[node.data.ID] = {}));
|
|
|
- if (['feesIndex.common.unitFee'].includes(field)) {
|
|
|
+ const value = sheet.getValue(row, col) || "";
|
|
|
+ const data = IDMap[node.data.ID] || (IDMap[node.data.ID] = {});
|
|
|
+ if (["feesIndex.common.unitFee"].includes(field)) {
|
|
|
const fees = node.data.fees || [];
|
|
|
- const feeItem = fees.find(item => item.fieldName === 'common');
|
|
|
+ const feeItem = fees.find((item) => item.fieldName === "common");
|
|
|
if (feeItem) {
|
|
|
feeItem.unitFee = value;
|
|
|
} else {
|
|
|
- fees.push({ fieldName: 'common', totalFee: 0, unitFee: +value });
|
|
|
+ fees.push({ fieldName: "common", totalFee: 0, unitFee: +value });
|
|
|
}
|
|
|
data[field] = fees;
|
|
|
node.data[field] = fees;
|
|
|
node.data.feesIndex = getFeeIndex(node.data.fees);
|
|
|
- } else if (field === 'feesIndex.estimation.totalFee') {
|
|
|
+ } else if (field === "feesIndex.estimation.totalFee") {
|
|
|
const fees = node.data.fees || [];
|
|
|
- const feeItem = fees.find(item => item.fieldName === 'estimation');
|
|
|
+ const feeItem = fees.find((item) => item.fieldName === "estimation");
|
|
|
if (feeItem) {
|
|
|
feeItem.totalFee = value;
|
|
|
} else {
|
|
|
- fees.push({ fieldName: 'estimation', totalFee: +value, unitFee: 0 });
|
|
|
+ fees.push({ fieldName: "estimation", totalFee: +value, unitFee: 0 });
|
|
|
}
|
|
|
data.fees = fees;
|
|
|
node.data.fees = fees;
|
|
@@ -245,20 +274,20 @@ const budgetSummaryObj = (() => {
|
|
|
data[field] = value;
|
|
|
node.data[field] = value;
|
|
|
}
|
|
|
- if (field === 'calcBase') {
|
|
|
+ if (field === "calcBase") {
|
|
|
node.data.userCalcBase = value;
|
|
|
projectObj.project.calcBase.calculate(node, null, false);
|
|
|
if (!projectObj.project.calcBase.success) {
|
|
|
throw projectObj.project.calcBase.errMsg;
|
|
|
} else if (isEmptyVal(value)) {
|
|
|
// 删除清单基数,单价要清空
|
|
|
- calcTools.setFieldValue(node, 'feesIndex.common.unitFee', 0);
|
|
|
+ calcTools.setFieldValue(node, "feesIndex.common.unitFee", 0);
|
|
|
}
|
|
|
data.calcBase = node.data.calcBase;
|
|
|
data.calcBaseValue = node.data.calcBaseValue;
|
|
|
data.tenderCalcBaseValue = node.data.tenderCalcBaseValue;
|
|
|
}
|
|
|
- if (['quantity', 'feesIndex.common.unitFee', 'calcBase', 'feeRate'].includes(field) && node.data.area !== BudgetArea.CONSTRUCTION_FEE) {
|
|
|
+ if (["quantity", "feesIndex.common.unitFee", "calcBase", "feeRate"].includes(field) && node.data.area !== BudgetArea.CONSTRUCTION_FEE) {
|
|
|
needCalc = true;
|
|
|
}
|
|
|
});
|
|
@@ -280,8 +309,8 @@ const budgetSummaryObj = (() => {
|
|
|
if (calcEstimateNodes.length) {
|
|
|
dataArr.push(...calcEstimate(calcEstimateNodes));
|
|
|
}
|
|
|
-
|
|
|
- dataArr.forEach(item => {
|
|
|
+
|
|
|
+ dataArr.forEach((item) => {
|
|
|
delete item.projectID;
|
|
|
const data = IDMap[item.ID];
|
|
|
if (data) {
|
|
@@ -291,55 +320,51 @@ const budgetSummaryObj = (() => {
|
|
|
}
|
|
|
});
|
|
|
// 保存节点
|
|
|
- Object
|
|
|
- .entries(IDMap)
|
|
|
- .forEach(([ID, data]) => {
|
|
|
- const node = tree.findNode(ID);
|
|
|
- if (!node) {
|
|
|
- return;
|
|
|
- }
|
|
|
- // 处理被计算程序计算冲掉的估算总额
|
|
|
- const orgData = orgMap[ID];
|
|
|
- const orgEstimationItem = orgData.fees && orgData.fees.find(item => item.fieldName === 'estimation');
|
|
|
- const orgEstimationFee = orgEstimationItem ? orgEstimationItem.totalFee : 0;
|
|
|
- const estimationItem = data.fees && data.fees.find(item => item.fieldName === 'estimation');
|
|
|
- const estimationFee = estimationItem ? estimationItem.totalFee : 0;
|
|
|
- if (orgEstimationFee !== estimationFee) {
|
|
|
- if (!estimationItem && data.fees) {
|
|
|
- data.fees.push({ fieldName: 'estimation', totalFee: orgEstimationFee });
|
|
|
- }
|
|
|
+ Object.entries(IDMap).forEach(([ID, data]) => {
|
|
|
+ const node = tree.findNode(ID);
|
|
|
+ if (!node) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 处理被计算程序计算冲掉的估算总额
|
|
|
+ const orgData = orgMap[ID];
|
|
|
+ const orgEstimationItem = orgData.fees && orgData.fees.find((item) => item.fieldName === "estimation");
|
|
|
+ const orgEstimationFee = orgEstimationItem ? orgEstimationItem.totalFee : 0;
|
|
|
+ const estimationItem = data.fees && data.fees.find((item) => item.fieldName === "estimation");
|
|
|
+ const estimationFee = estimationItem ? estimationItem.totalFee : 0;
|
|
|
+ if (orgEstimationFee !== estimationFee) {
|
|
|
+ if (!estimationItem && data.fees) {
|
|
|
+ data.fees.push({ fieldName: "estimation", totalFee: orgEstimationFee });
|
|
|
}
|
|
|
-
|
|
|
- // 处理其他费用
|
|
|
- if (node.isBelongToFlags([fixedFlag.CONSTRUCTION_OTHER_FEE])) {
|
|
|
- const fees = data.fees || [];
|
|
|
- const commonFeeItem = fees.find(item => item.fieldName === 'common');
|
|
|
- const otherFeeItem = fees.find(item => item.fieldName === 'other');
|
|
|
- if (otherFeeItem) {
|
|
|
- otherFeeItem.totalFee = commonFeeItem && commonFeeItem.totalFee || 0;
|
|
|
- } else {
|
|
|
- fees.push({ fieldName: 'other', totalFee: commonFeeItem && commonFeeItem.totalFee || 0 });
|
|
|
- }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理其他费用
|
|
|
+ if (node.isBelongToFlags([fixedFlag.CONSTRUCTION_OTHER_FEE])) {
|
|
|
+ const fees = data.fees || [];
|
|
|
+ const commonFeeItem = fees.find((item) => item.fieldName === "common");
|
|
|
+ const otherFeeItem = fees.find((item) => item.fieldName === "other");
|
|
|
+ if (otherFeeItem) {
|
|
|
+ otherFeeItem.totalFee = (commonFeeItem && commonFeeItem.totalFee) || 0;
|
|
|
+ } else {
|
|
|
+ fees.push({ fieldName: "other", totalFee: (commonFeeItem && commonFeeItem.totalFee) || 0 });
|
|
|
}
|
|
|
- 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 } });
|
|
|
- });
|
|
|
+ }
|
|
|
+ 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
|
|
|
- .entries(IDMap)
|
|
|
- .forEach(([ID, data]) => {
|
|
|
- const node = tree.findNode(ID);
|
|
|
- if (node) {
|
|
|
- Object.assign(node.data, data);
|
|
|
- node.data.feesIndex = getFeeIndex(node.data.fees);
|
|
|
- orgMap[ID] = _.cloneDeep(node.data);
|
|
|
- }
|
|
|
- });
|
|
|
+ Object.entries(IDMap).forEach(([ID, data]) => {
|
|
|
+ const node = tree.findNode(ID);
|
|
|
+ if (node) {
|
|
|
+ Object.assign(node.data, data);
|
|
|
+ node.data.feesIndex = getFeeIndex(node.data.fees);
|
|
|
+ orgMap[ID] = _.cloneDeep(node.data);
|
|
|
+ }
|
|
|
+ });
|
|
|
refreshAll(sheet);
|
|
|
} catch (err) {
|
|
|
console.log(err);
|
|
|
- nodes.forEach(node => {
|
|
|
+ nodes.forEach((node) => {
|
|
|
const orgItem = orgMap[node.data.ID];
|
|
|
if (orgItem) {
|
|
|
node.data = _.cloneDeep(orgItem);
|
|
@@ -351,11 +376,11 @@ const budgetSummaryObj = (() => {
|
|
|
} finally {
|
|
|
$.bootstrapLoading.end();
|
|
|
}
|
|
|
- }
|
|
|
+ };
|
|
|
// 是否是属于工程费用区域的节点
|
|
|
const isConstructionFeeArea = (node) => {
|
|
|
return node && node.data && node.data.area === BudgetArea.CONSTRUCTION_FEE;
|
|
|
- }
|
|
|
+ };
|
|
|
// 工具栏可操作性
|
|
|
let upLevelDisabled = false;
|
|
|
let downLevelDisabled = false;
|
|
@@ -363,28 +388,33 @@ const budgetSummaryObj = (() => {
|
|
|
let downMoveDisabled = false;
|
|
|
const refreshToolsBar = (node) => {
|
|
|
upLevelDisabled = !node || !node.canUpLevel() || isConstructionFeeArea(node) || (node.nextSibling && node.data.calcBase);
|
|
|
- downLevelDisabled = !node || !node.canDownLevel() || isConstructionFeeArea(node) || isConstructionFeeArea(node.preSibling) || (node.preSibling && node.preSibling.data.calcBase);
|
|
|
+ downLevelDisabled =
|
|
|
+ !node ||
|
|
|
+ !node.canDownLevel() ||
|
|
|
+ isConstructionFeeArea(node) ||
|
|
|
+ isConstructionFeeArea(node.preSibling) ||
|
|
|
+ (node.preSibling && node.preSibling.data.calcBase);
|
|
|
upMoveDisabled = !node || !node.canUpMove() || isConstructionFeeArea(node) || isConstructionFeeArea(node.preSibling);
|
|
|
downMoveDisabled = !node || !node.canDownMove() || isConstructionFeeArea(node) || isConstructionFeeArea(node.nextSibling);
|
|
|
if (upLevelDisabled) {
|
|
|
- $('#budget-upLevel').addClass('disabled');
|
|
|
+ $("#budget-upLevel").addClass("disabled");
|
|
|
} else {
|
|
|
- $('#budget-upLevel').removeClass('disabled');
|
|
|
+ $("#budget-upLevel").removeClass("disabled");
|
|
|
}
|
|
|
if (downLevelDisabled) {
|
|
|
- $('#budget-downLevel').addClass('disabled');
|
|
|
+ $("#budget-downLevel").addClass("disabled");
|
|
|
} else {
|
|
|
- $('#budget-downLevel').removeClass('disabled');
|
|
|
+ $("#budget-downLevel").removeClass("disabled");
|
|
|
}
|
|
|
if (upMoveDisabled) {
|
|
|
- $('#budget-upMove').addClass('disabled');
|
|
|
+ $("#budget-upMove").addClass("disabled");
|
|
|
} else {
|
|
|
- $('#budget-upMove').removeClass('disabled');
|
|
|
+ $("#budget-upMove").removeClass("disabled");
|
|
|
}
|
|
|
if (downMoveDisabled) {
|
|
|
- $('#budget-downMove').addClass('disabled');
|
|
|
+ $("#budget-downMove").addClass("disabled");
|
|
|
} else {
|
|
|
- $('#budget-downMove').removeClass('disabled');
|
|
|
+ $("#budget-downMove").removeClass("disabled");
|
|
|
}
|
|
|
};
|
|
|
// 表格选中相关
|
|
@@ -424,13 +454,13 @@ const budgetSummaryObj = (() => {
|
|
|
},
|
|
|
RangeChanged(sender, args) {
|
|
|
edit(args.sheet, args.changedCells);
|
|
|
- }
|
|
|
- }
|
|
|
+ },
|
|
|
+ };
|
|
|
const bindEvents = (sheet) => {
|
|
|
Object.entries(events).forEach(([ev, evFunc]) => {
|
|
|
sheet.bind(GC.Spread.Sheets.Events[ev], evFunc);
|
|
|
});
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
/* 只读相关 */
|
|
|
// 单元格锁定判断
|
|
@@ -441,21 +471,21 @@ const budgetSummaryObj = (() => {
|
|
|
name(node) {
|
|
|
return !!(node && (node.getFlag() || node.data.area === BudgetArea.CONSTRUCTION_FEE));
|
|
|
},
|
|
|
- 'feesIndex.estimation.totalFee'(node) {
|
|
|
+ "feesIndex.estimation.totalFee"(node) {
|
|
|
return !!(!node || node.children.length);
|
|
|
},
|
|
|
- 'feesIndex.common.unitFee'(node) {
|
|
|
- return !!(node && (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 || node.data.area === BudgetArea.CONSTRUCTION_FEE));
|
|
|
+ return !!(node && (node.children.length || node.data.area === BudgetArea.CONSTRUCTION_FEE));
|
|
|
},
|
|
|
feeRate(node) {
|
|
|
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) => {
|
|
|
const lock = () => {
|
|
@@ -484,7 +514,7 @@ const budgetSummaryObj = (() => {
|
|
|
}
|
|
|
}
|
|
|
return endIndex; */
|
|
|
- }
|
|
|
+ };
|
|
|
if (isMass) {
|
|
|
TREE_SHEET_HELPER.massOperationSheet(sheet, () => {
|
|
|
return lock();
|
|
@@ -492,18 +522,18 @@ const budgetSummaryObj = (() => {
|
|
|
} else {
|
|
|
return lock();
|
|
|
}
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
/* 单元格类型 */
|
|
|
const calcBaseButtonCallback = (hitInfo) => {
|
|
|
- calcBaseView.onCalcBaseButtonClick(hitInfo, 'budget');
|
|
|
+ calcBaseView.onCalcBaseButtonClick(hitInfo, "budget");
|
|
|
};
|
|
|
const cellTypeFactory = {
|
|
|
calcBase(node) {
|
|
|
const locked = lockFactory.calcBase(node);
|
|
|
return sheetCommonObj.getCusButtonCellType(calcBaseButtonCallback, locked);
|
|
|
- }
|
|
|
- }
|
|
|
+ },
|
|
|
+ };
|
|
|
|
|
|
/* 设置可编辑区域节点的只读性和单元格类型 */
|
|
|
const setCells = (sheet, startRow, nodes) => {
|
|
@@ -530,12 +560,12 @@ const budgetSummaryObj = (() => {
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
- }
|
|
|
+ };
|
|
|
/* 初始化表格 */
|
|
|
const initSpread = () => {
|
|
|
if (!spread) {
|
|
|
// spread = sheetCommonObj.createSpread($('#budget-summary-sheet')[0], 1);
|
|
|
- spread = SheetDataHelper.createNewSpread($('#budget-summary-sheet')[0]);
|
|
|
+ spread = SheetDataHelper.createNewSpread($("#budget-summary-sheet")[0]);
|
|
|
sheetCommonObj.spreadDefaultStyle(spread);
|
|
|
// 设置表头
|
|
|
const sheet = spread.getSheet(0);
|
|
@@ -548,14 +578,14 @@ const budgetSummaryObj = (() => {
|
|
|
spread.refresh();
|
|
|
}
|
|
|
return spread;
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
// 初始化树
|
|
|
const initTree = (data, sheet, setting) => {
|
|
|
- tree = idTree.createNew({ id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1, autoUpdate: true });
|
|
|
+ tree = idTree.createNew({ id: "ID", pid: "ParentID", nid: "NextSiblingID", rootId: -1, autoUpdate: true });
|
|
|
const controller = TREE_SHEET_CONTROLLER.createNew(tree, sheet, setting, false, true);
|
|
|
tree.loadDatas(data);
|
|
|
- tree.items.forEach(node => {
|
|
|
+ tree.items.forEach((node) => {
|
|
|
node.source = node;
|
|
|
node.sourceType = ModuleNames.bills;
|
|
|
});
|
|
@@ -567,21 +597,21 @@ const budgetSummaryObj = (() => {
|
|
|
setCells(sheet, 0, tree.items);
|
|
|
// 表格格式化
|
|
|
budgetSummaryTreeSetting.cols.forEach((item, index) => {
|
|
|
- sheet.setFormatter(-1, index, item.formatter || '@', GC.Spread.Sheets.SheetArea.viewport);
|
|
|
+ sheet.setFormatter(-1, index, item.formatter || "@", GC.Spread.Sheets.SheetArea.viewport);
|
|
|
});
|
|
|
});
|
|
|
selectCell(sheet.getActiveRowIndex(), sheet.getActiveColumnIndex());
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
/* 右键菜单 */
|
|
|
// 更新树结构数据
|
|
|
const updateTree = (sheet, updateData) => {
|
|
|
// 更新数据
|
|
|
- updateData.forEach(item => {
|
|
|
- if (item.type === 'new') {
|
|
|
+ updateData.forEach((item) => {
|
|
|
+ if (item.type === "new") {
|
|
|
orgMap[item.data.ID] = _.cloneDeep(item.data);
|
|
|
- rawData.push(item.data)
|
|
|
- } else if (item.type === 'update') {
|
|
|
+ rawData.push(item.data);
|
|
|
+ } else if (item.type === "update") {
|
|
|
if (orgMap[item.data.ID]) {
|
|
|
Object.assign(orgMap[item.data.ID], item.data);
|
|
|
}
|
|
@@ -591,7 +621,7 @@ const budgetSummaryObj = (() => {
|
|
|
}
|
|
|
} else {
|
|
|
delete orgMap[item.data.ID];
|
|
|
- const removeIndex = rawData.findIndex(d => d.ID === item.data.ID);
|
|
|
+ const removeIndex = rawData.findIndex((d) => d.ID === item.data.ID);
|
|
|
if (removeIndex > -1) {
|
|
|
rawData.splice(removeIndex, 1);
|
|
|
}
|
|
@@ -599,7 +629,7 @@ const budgetSummaryObj = (() => {
|
|
|
});
|
|
|
// 重新初始化树
|
|
|
initTree(rawData, sheet, budgetSummaryTreeSetting);
|
|
|
- }
|
|
|
+ };
|
|
|
let loading = false;
|
|
|
// 插入
|
|
|
const insert = async (sheet, selected) => {
|
|
@@ -610,8 +640,8 @@ const budgetSummaryObj = (() => {
|
|
|
loading = true;
|
|
|
$.bootstrapLoading.start();
|
|
|
const updateData = tree.getInsertData(selected.data.ParentID, selected.data.NextSiblingID, uuid.v1());
|
|
|
- const newData = updateData.filter(item => item.type === 'new');
|
|
|
- newData.forEach(item => {
|
|
|
+ const newData = updateData.filter((item) => item.type === "new");
|
|
|
+ newData.forEach((item) => {
|
|
|
item.data.fees = [];
|
|
|
item.data.flags = [];
|
|
|
item.feesIndex = {};
|
|
@@ -628,7 +658,7 @@ const budgetSummaryObj = (() => {
|
|
|
$.bootstrapLoading.end();
|
|
|
loading = false;
|
|
|
}
|
|
|
- }
|
|
|
+ };
|
|
|
// 删除
|
|
|
const remove = async (sheet, selected) => {
|
|
|
try {
|
|
@@ -646,7 +676,7 @@ const budgetSummaryObj = (() => {
|
|
|
$.bootstrapLoading.end();
|
|
|
loading = false;
|
|
|
}
|
|
|
- }
|
|
|
+ };
|
|
|
// 升级
|
|
|
const upLevel = async (selected) => {
|
|
|
if (!spread || !tree) {
|
|
@@ -669,7 +699,7 @@ const budgetSummaryObj = (() => {
|
|
|
$.bootstrapLoading.end();
|
|
|
loading = false;
|
|
|
}
|
|
|
- }
|
|
|
+ };
|
|
|
// 降级
|
|
|
const downLevel = async (selected) => {
|
|
|
if (!spread || !tree) {
|
|
@@ -692,7 +722,7 @@ const budgetSummaryObj = (() => {
|
|
|
$.bootstrapLoading.end();
|
|
|
loading = false;
|
|
|
}
|
|
|
- }
|
|
|
+ };
|
|
|
// 上移
|
|
|
const upMove = async (selected) => {
|
|
|
if (!spread || !tree) {
|
|
@@ -719,7 +749,7 @@ const budgetSummaryObj = (() => {
|
|
|
$.bootstrapLoading.end();
|
|
|
loading = false;
|
|
|
}
|
|
|
- }
|
|
|
+ };
|
|
|
// 下移
|
|
|
const downMove = async (selected) => {
|
|
|
if (!spread || !tree) {
|
|
@@ -746,8 +776,7 @@ const budgetSummaryObj = (() => {
|
|
|
$.bootstrapLoading.end();
|
|
|
loading = false;
|
|
|
}
|
|
|
-
|
|
|
- }
|
|
|
+ };
|
|
|
// 初始化右键菜单
|
|
|
const initContextMenu = () => {
|
|
|
if (!spread) {
|
|
@@ -757,45 +786,45 @@ const budgetSummaryObj = (() => {
|
|
|
let curNode;
|
|
|
const sheet = spread.getSheet(0);
|
|
|
$.contextMenu({
|
|
|
- selector: '#budget-summary-sheet',
|
|
|
+ selector: "#budget-summary-sheet",
|
|
|
build: function ($trigger, e) {
|
|
|
const target = SheetDataHelper.safeRightClickSelection($trigger, e, spread);
|
|
|
curRow = target.row;
|
|
|
- curNode = tree && tree.items[curRow] || null;
|
|
|
+ curNode = (tree && tree.items[curRow]) || null;
|
|
|
selectCell(target.row, target.col, true);
|
|
|
return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
|
|
|
},
|
|
|
items: {
|
|
|
insert: {
|
|
|
- name: '插入行',
|
|
|
- icon: 'fa-sign-in',
|
|
|
+ name: "插入行",
|
|
|
+ icon: "fa-sign-in",
|
|
|
disabled() {
|
|
|
return !curNode || (curNode.data.area === BudgetArea.CONSTRUCTION_FEE && curNode.getFlag() !== fixedFlag.CONSTRUCTION_FEE);
|
|
|
},
|
|
|
callback() {
|
|
|
insert(sheet, curNode);
|
|
|
- }
|
|
|
+ },
|
|
|
},
|
|
|
remove: {
|
|
|
- name: '删除行',
|
|
|
- icon: 'fa-remove',
|
|
|
+ name: "删除行",
|
|
|
+ icon: "fa-remove",
|
|
|
disabled() {
|
|
|
return !curNode || isConstructionFeeArea(curNode) || curNode.getFlag();
|
|
|
},
|
|
|
callback() {
|
|
|
remove(sheet, curNode);
|
|
|
- }
|
|
|
+ },
|
|
|
},
|
|
|
refresh: {
|
|
|
- name: '刷新数据',
|
|
|
- icon: 'fa-refresh',
|
|
|
+ name: "刷新数据",
|
|
|
+ icon: "fa-refresh",
|
|
|
callback() {
|
|
|
init(projectObj.project.property.rootProjectID);
|
|
|
- }
|
|
|
+ },
|
|
|
},
|
|
|
- }
|
|
|
+ },
|
|
|
});
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
// 初始化
|
|
|
const init = async (constructionID) => {
|
|
@@ -803,13 +832,13 @@ const budgetSummaryObj = (() => {
|
|
|
$.bootstrapLoading.start();
|
|
|
// 得先计算费用汇总(概算汇总计算基于费用汇总算出来的总金额)
|
|
|
await projectObj.project.calcProgram.getGatherFeeData();
|
|
|
- const { budgetType, 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);
|
|
|
- $('#growthPeriod').val(growthPeriod);
|
|
|
+ $("#costGrowthRate").val(costGrowthRate);
|
|
|
+ $("#growthPeriod").val(growthPeriod);
|
|
|
rawData = treeData;
|
|
|
rawData.forEach((item) => {
|
|
|
if (item.quantity) {
|
|
@@ -825,7 +854,7 @@ const budgetSummaryObj = (() => {
|
|
|
});
|
|
|
const spread = initSpread();
|
|
|
const sheet = spread.getSheet(0);
|
|
|
- rawData.forEach(item => {
|
|
|
+ rawData.forEach((item) => {
|
|
|
orgMap[item.ID] = _.cloneDeep(item);
|
|
|
});
|
|
|
initTree(rawData, sheet, budgetSummaryTreeSetting);
|
|
@@ -838,47 +867,50 @@ const budgetSummaryObj = (() => {
|
|
|
} finally {
|
|
|
$.bootstrapLoading.end();
|
|
|
}
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
// 点击tab,重新初始化
|
|
|
- $('#tab-budget-summary').click(function () {
|
|
|
- if (!$(this).hasClass('active')) {
|
|
|
+ $("#tab-budget-summary").click(function () {
|
|
|
+ if (!$(this).hasClass("active")) {
|
|
|
init(projectObj.project.property.rootProjectID);
|
|
|
}
|
|
|
});
|
|
|
- $('#budget-upLevel').click(() => {
|
|
|
+ $("#budget-upLevel").click(() => {
|
|
|
upLevel();
|
|
|
});
|
|
|
- $('#budget-downLevel').click(() => {
|
|
|
+ $("#budget-downLevel").click(() => {
|
|
|
downLevel();
|
|
|
});
|
|
|
- $('#budget-upMove').click(() => {
|
|
|
+ $("#budget-upMove").click(() => {
|
|
|
upMove();
|
|
|
});
|
|
|
- $('#budget-downMove').click(() => {
|
|
|
+ $("#budget-downMove").click(() => {
|
|
|
downMove();
|
|
|
});
|
|
|
|
|
|
/* 建设项目设置 */
|
|
|
- $('#openConstructionSet').click(() => {
|
|
|
- $('#constructionSet').modal('show');
|
|
|
+ $("#openConstructionSet").click(() => {
|
|
|
+ $("#constructionSet").modal("show");
|
|
|
});
|
|
|
function isKeyNumber(keyCode) {
|
|
|
// 数字
|
|
|
if (keyCode >= 48 && keyCode <= 57) {
|
|
|
return true;
|
|
|
- } else if (keyCode >= 96 && keyCode <= 105) { //小键盘数字
|
|
|
+ } else if (keyCode >= 96 && keyCode <= 105) {
|
|
|
+ //小键盘数字
|
|
|
return true;
|
|
|
- } else if (keyCode == 8 || keyCode == 46 || keyCode == 37 || keyCode == 39 || keyCode == 108 || keyCode == 110) { // Backspace, del, 左右方向键
|
|
|
+ } else if (keyCode == 8 || keyCode == 46 || keyCode == 37 || keyCode == 39 || keyCode == 108 || keyCode == 110) {
|
|
|
+ // Backspace, del, 左右方向键
|
|
|
return true;
|
|
|
- } else if (keyCode >= 112 && keyCode <= 123) { //F1 -F12
|
|
|
+ } else if (keyCode >= 112 && keyCode <= 123) {
|
|
|
+ //F1 -F12
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
//年造价增涨率
|
|
|
- $('#costGrowthRate').keydown(function (e) {
|
|
|
+ $("#costGrowthRate").keydown(function (e) {
|
|
|
return isKeyNumber(e.keyCode);
|
|
|
});
|
|
|
//计费年限
|
|
@@ -886,34 +918,33 @@ const budgetSummaryObj = (() => {
|
|
|
return isKeyNumber(e.keyCode);
|
|
|
});
|
|
|
// 确认设置
|
|
|
- $('#construction-set-ok').click(async () => {
|
|
|
+ $("#construction-set-ok").click(async () => {
|
|
|
try {
|
|
|
$.bootstrapLoading.start();
|
|
|
- const curCostGrowthRate = $('#costGrowthRate').val();
|
|
|
- const curGrowthPeriod = $('#growthPeriod').val();
|
|
|
+ const curCostGrowthRate = $("#costGrowthRate").val();
|
|
|
+ const curGrowthPeriod = $("#growthPeriod").val();
|
|
|
const bulkData = [
|
|
|
{
|
|
|
- type: 'updateProject',
|
|
|
+ type: "updateProject",
|
|
|
data: {
|
|
|
ID: projectObj.project.property.rootProjectID,
|
|
|
- 'property.costGrowthRate': curCostGrowthRate,
|
|
|
- 'property.growthPeriod': curGrowthPeriod,
|
|
|
- }
|
|
|
- }
|
|
|
+ "property.costGrowthRate": curCostGrowthRate,
|
|
|
+ "property.growthPeriod": curGrowthPeriod,
|
|
|
+ },
|
|
|
+ },
|
|
|
];
|
|
|
await bulkOperation(bulkData);
|
|
|
calcSetting.costGrowthRate = curCostGrowthRate;
|
|
|
calcSetting.growthPeriod = curGrowthPeriod;
|
|
|
} catch (err) {
|
|
|
alert(err);
|
|
|
- $('#costGrowthRate').val(calcSetting.costGrowthRate);
|
|
|
- $('#growthPeriod').val(calcSetting.growthPeriod);
|
|
|
+ $("#costGrowthRate").val(calcSetting.costGrowthRate);
|
|
|
+ $("#growthPeriod").val(calcSetting.growthPeriod);
|
|
|
} finally {
|
|
|
$.bootstrapLoading.end();
|
|
|
}
|
|
|
});
|
|
|
|
|
|
-
|
|
|
// 对外暴露
|
|
|
return {
|
|
|
getTree: () => tree,
|
|
@@ -921,5 +952,4 @@ const budgetSummaryObj = (() => {
|
|
|
calcSetting,
|
|
|
edit,
|
|
|
};
|
|
|
-
|
|
|
})();
|