|
@@ -107,6 +107,43 @@ $(document).ready(() => {
|
|
|
]);
|
|
|
SpreadJsObj.initSheet(spSheet, posSpreadSetting);
|
|
|
|
|
|
+ // 0: 可结算,1: 合同未完成,2:
|
|
|
+ const settleCheck = {
|
|
|
+ _analysisPos(pos) {
|
|
|
+ pos.undoneDeal = pos.quantity ? !checkZero(ZhCalc.div(pos.end_contract_qty, pos.quantity)) : false;
|
|
|
+ pos.undone = pos.undoneDeal || pos.undoneChange;
|
|
|
+ },
|
|
|
+ _analysisNode(node) {
|
|
|
+ if (node.undoneDeal === undefined) node.undoneDeal = false;
|
|
|
+ if (node.undoneChange === undefined) node.undoneChange = false;
|
|
|
+ if (node.children && node.children.length > 0) {
|
|
|
+ for (const child of node.children) {
|
|
|
+ this._analysisNode(child);
|
|
|
+ if (child.undoneDeal) node.undoneDeal = true;
|
|
|
+ if (child.undoneChange) node.undoneChange = true;
|
|
|
+ }
|
|
|
+ node.undone = !!node.undoneDeal || !!node.undoneChange;
|
|
|
+ } else {
|
|
|
+ const posRange = settlePos.getLedgerPos(node.id);
|
|
|
+ if (posRange && posRange.length > 0) {
|
|
|
+ for (const pos of posRange) {
|
|
|
+ this._analysisPos(pos);
|
|
|
+ if (pos.undoneDeal) node.undoneDeal = true;
|
|
|
+ if (pos.undoneChange) node.undoneChange = true;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ node.undoneDeal = node.end_contract_qty ? !checkZero(ZhCalc.div(node.end_contract_qty, node.quantity)) : false;
|
|
|
+ node.undone = !!node.undoneDeal || !!node.undoneChange;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ init() {
|
|
|
+ for (const node of settleTree.children) {
|
|
|
+ this._analysisNode(node);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
const settleBillsObj = {
|
|
|
loadRelaData: function() {
|
|
|
SpreadJsObj.saveTopAndSelect(slSheet, ckBillsSpread);
|
|
@@ -128,34 +165,77 @@ $(document).ready(() => {
|
|
|
if (col.field !== 'selected') return;
|
|
|
|
|
|
const node = SpreadJsObj.getSelectObject(info.sheet);
|
|
|
- node.selected = !node.selected;
|
|
|
- if (node.children && node.children.length > 0) {
|
|
|
- const posterity = tsObj.tenderSourceTree.getPosterity(node);
|
|
|
+ if (node.undone && !node.selected) {
|
|
|
+ let msg = '选择的节点不可结算';
|
|
|
+ if (node.undoneDeal) msg = msg + ',合同未计量完';
|
|
|
+ if (node.undoneChange) msg = msg + ',变更令未调用完';
|
|
|
+ toastr.warning(msg);
|
|
|
+ SpreadJsObj.reLoadRowData(info.sheet, info.row);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!node.selected) {
|
|
|
+ const parents = settleTree.getAllParents(node);
|
|
|
+ for (const p of parents) {
|
|
|
+ if (p.selected) {
|
|
|
+ toastr.warning(`父项${p.code || ''}以勾选,勿需重复勾选子项`);
|
|
|
+ SpreadJsObj.reLoadRowData(info.sheet, info.row);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const update = {};
|
|
|
+ if (!node.selected) {
|
|
|
+ update.add = [{ lid: node.id }];
|
|
|
+ const posterity = settleTree.getPosterity(node);
|
|
|
for (const p of posterity) {
|
|
|
- p.selected = node.selected;
|
|
|
- if (!p.children || p.children.length === 0){
|
|
|
- if (p.selected) {
|
|
|
- tsObj._addTender(p);
|
|
|
- } else {
|
|
|
- tsObj._removeTender(p);
|
|
|
+ if (p.selected) {
|
|
|
+ if (!update.del) update.del = [];
|
|
|
+ update.del.push({ lid: node.id });
|
|
|
+ }
|
|
|
+ if (!p.children || p.children.length === 0) {
|
|
|
+ const posRange = settlePos.getLedgerPos(p.id);
|
|
|
+ for (const p of posRange) {
|
|
|
+ if (p.selected) {
|
|
|
+ if (!update.del) update.del = [];
|
|
|
+ update.del.push({ pid: p.id });
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- SpreadJsObj.reLoadRowData(info.sheet, info.row, posterity.length + 1);
|
|
|
} else {
|
|
|
- if (node.selected) {
|
|
|
- tsObj._addTender(node);
|
|
|
- } else {
|
|
|
- tsObj._removeTender(node);
|
|
|
- }
|
|
|
- SpreadJsObj.reLoadRowData(info.sheet, info.row, 1);
|
|
|
+ update.del = [{ lid: node.id }];
|
|
|
}
|
|
|
- tsObj.reloadResultData();
|
|
|
+ postData(window.location.pathname + '/update', update, result => {
|
|
|
+ node.selected = !node.selected;
|
|
|
+ if (result.del) {
|
|
|
+ let refreshRow = [], refreshPos = false;
|
|
|
+ for (const d of result.del) {
|
|
|
+ if (d.lid) {
|
|
|
+ const sbi = settleTree.nodes.findIndex(x => { return x.id === d.lid; });
|
|
|
+ settleTree.nodes[sbi].selected = false;
|
|
|
+ refreshRow.push(sbi);
|
|
|
+ } else if (d.pid) {
|
|
|
+ const sp = settlePos.getPos(d.pid);
|
|
|
+ if (sp) {
|
|
|
+ sp.selected = false;
|
|
|
+ if (sp.lid === node.id) refreshPos = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (refreshRow.length > 0) SpreadJsObj.reLoadRowsData(info.sheet, refreshRow);
|
|
|
+ if (refreshPos) settlePosObj.loadCurPosData();
|
|
|
+ }
|
|
|
+ }, () => {
|
|
|
+ SpreadJsObj.reLoadRowData(info.sheet, info.row);
|
|
|
+ });
|
|
|
},
|
|
|
};
|
|
|
- slSpread.bind(spreadNS.Events.ButtonClicked, stageTreeSpreadObj.buttonClicked);
|
|
|
slSpread.bind(spreadNS.Events.SelectionChanged, settleBillsObj.selectionChanged);
|
|
|
slSpread.bind(spreadNS.Events.TopRowChanged, settleBillsObj.topRowChanged);
|
|
|
+ if (!readOnly) {
|
|
|
+ slSpread.bind(spreadNS.Events.ButtonClicked, settleBillsObj.buttonClicked);
|
|
|
+ }
|
|
|
|
|
|
const settlePosObj = {
|
|
|
loadCurPosData: function() {
|
|
@@ -164,14 +244,58 @@ $(document).ready(() => {
|
|
|
spSheet.zh_setting.readOnly = readOnly;
|
|
|
const posRange = settlePos.getLedgerPos(billsNode.id) || [];
|
|
|
SpreadJsObj.loadSheetData(spSheet, SpreadJsObj.DataType.Data, posRange, readOnly);
|
|
|
+ if (posRange.length > 0) SpreadJsObj.locateData(spSheet, posRange[0]);
|
|
|
} else {
|
|
|
spSheet.zh_setting.readOnly = true;
|
|
|
SpreadJsObj.loadSheetData(spSheet, SpreadJsObj.DataType.Data, [], true);
|
|
|
}
|
|
|
- }
|
|
|
+ },
|
|
|
+ buttonClicked: function(e, info) {
|
|
|
+ if (!info.sheet.zh_setting) return;
|
|
|
+
|
|
|
+ const col = info.sheet.zh_setting.cols[info.col];
|
|
|
+ if (col.field !== 'selected') return;
|
|
|
+
|
|
|
+ const node = SpreadJsObj.getSelectObject(info.sheet);
|
|
|
+ if (node.undone && !node.selected) {
|
|
|
+ let msg = '选择的节点不可结算';
|
|
|
+ if (node.undoneDeal) msg = msg + ',合同未计量完';
|
|
|
+ if (node.undoneChange) msg = msg + ',变更令未调用完';
|
|
|
+ toastr.warning(msg);
|
|
|
+ SpreadJsObj.reLoadRowData(info.sheet, info.row);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!node.selected) {
|
|
|
+ const billsNode = settleTree.nodes.find(x => { return x.id === node.lid });
|
|
|
+ const parents = settleTree.getAllParents(billsNode);
|
|
|
+ for (const p of parents) {
|
|
|
+ if (p.selected) {
|
|
|
+ toastr.warning(`所属清单的父项${p.code || ''}以勾选,勿需重复勾选计量单元`);
|
|
|
+ SpreadJsObj.reLoadRowData(info.sheet, info.row);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const update = {};
|
|
|
+ if (!node.selected) {
|
|
|
+ update.add = [{ lid: node.id }];
|
|
|
+ } else {
|
|
|
+ update.del = [{ lid: node.id }];
|
|
|
+ }
|
|
|
+ postData(window.location.pathname + '/update', update, result => {
|
|
|
+ node.selected = !node.selected;
|
|
|
+ SpreadJsObj.reLoadRowData(info.sheet, info.row);
|
|
|
+ }, () => {
|
|
|
+ SpreadJsObj.reLoadRowData(info.sheet, info.row);
|
|
|
+ });
|
|
|
+ },
|
|
|
};
|
|
|
+ if (!readOnly) {
|
|
|
+ spSpread.bind(spreadNS.Events.ButtonClicked, settlePosObj.buttonClicked);
|
|
|
+ }
|
|
|
|
|
|
- postData('load', {filter: 'stageBills;stagePos;settleSelect;tag'}, function(result) {
|
|
|
+ postData('load', {filter: 'stageBills;stagePos;settleSelect;tag;settleChange'}, function(result) {
|
|
|
for (const select of result.settleSelect) {
|
|
|
if (select.pid) {
|
|
|
const sp = result.stagePos.find(x => { return x.id === select.pid });
|
|
@@ -181,10 +305,19 @@ $(document).ready(() => {
|
|
|
if (sb) sb.selected = true;
|
|
|
}
|
|
|
}
|
|
|
+ for (const change of result.settleChange) {
|
|
|
+ const sb = result.stageBills.find(x => { return x.id === change.gcl_id });
|
|
|
+ if (sb) sb.undoneChange = true;
|
|
|
+ if (change.mx_id) {
|
|
|
+ const sp = result.stagePos.find(x => { return x.id === change.mx_id });
|
|
|
+ if (sp) sp.undoneChange = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
settleTree.loadDatas(result.stageBills);
|
|
|
treeCalc.calculateAll(settleTree);
|
|
|
settlePos.loadDatas(result.stagePos);
|
|
|
settlePos.calculateAll();
|
|
|
+ settleCheck.init();
|
|
|
|
|
|
SpreadJsObj.loadSheetData(slSheet, SpreadJsObj.DataType.Tree, settleTree);
|
|
|
SpreadJsObj.loadTopAndSelect(slSpread.getActiveSheet(), ckBillsSpread);
|