|
|
@@ -170,9 +170,12 @@ class BillsPosConvert {
|
|
|
const pos = this.bpcPos.getLedgerPos(node.id);
|
|
|
if (pos && pos.length > 0) {
|
|
|
for (const p of pos) {
|
|
|
- const posUnit = xmj.unitTree.addNode({pos_name: p.name,
|
|
|
- b_code: null, name: '', unit: null, unit_price: null,
|
|
|
- gxby_status: p.gxby_status, dagl_status: p.dagl_status, gxby_url: p.gxby_url, dagl_url: p.dagl_url});
|
|
|
+ let posUnit = xmj.unitTree.children.find(x => { return x.pos_name === p.name; });
|
|
|
+ if (!posUnit) {
|
|
|
+ posUnit = xmj.unitTree.addNode({pos_name: p.name,
|
|
|
+ b_code: null, name: '', unit: null, unit_price: null,
|
|
|
+ gxby_status: p.gxby_status, dagl_status: p.dagl_status, gxby_url: p.gxby_url, dagl_url: p.dagl_url}, null, false);
|
|
|
+ }
|
|
|
if (p.drawing_code && posUnit.drawing_code.indexOf(p.drawing_code) < 0)
|
|
|
posUnit.drawing_code.push(p.drawing_code);
|
|
|
if (p.memo) posUnit.memo.push(p.memo);
|
|
|
@@ -205,7 +208,7 @@ class BillsPosConvert {
|
|
|
const unit = xmj.unitTree.addNode({
|
|
|
pos_name: '',
|
|
|
b_code: node.b_code, name: node.name, unit: node.unit, unit_price: node.unit_price, org_price: node.org_price,
|
|
|
- });
|
|
|
+ }, null);
|
|
|
if (node.drawing_code && unit.drawing_code.indexOf(node.drawing_code) < 0)
|
|
|
unit.drawing_code.push(node.drawing_code);
|
|
|
if (node.memo) unit.memo.push(node.memo);
|
|
|
@@ -372,12 +375,56 @@ class BillsPosConvert {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ _mapTreeNode(tree) {
|
|
|
+ const setting = tree.setting;
|
|
|
+ let map = {}, maxLevel = 0;
|
|
|
+ for (const node of tree.nodes) {
|
|
|
+ let levelArr = map[node[setting.level]];
|
|
|
+ if (!levelArr) {
|
|
|
+ levelArr = [];
|
|
|
+ map[node[setting.level]] = levelArr;
|
|
|
+ }
|
|
|
+ if (node[setting.level] > maxLevel) {
|
|
|
+ maxLevel = node[setting.level];
|
|
|
+ }
|
|
|
+ levelArr.push(node);
|
|
|
+ }
|
|
|
+ return [maxLevel, map];
|
|
|
+ }
|
|
|
+ _calculateAndSortNodes() {
|
|
|
+ const self = this;
|
|
|
+ const [maxLevel, levelMap] = this._mapTreeNode(this.resultTree);
|
|
|
+ for (let i = maxLevel; i >= 0; i--) {
|
|
|
+ const levelNodes = levelMap[i];
|
|
|
+ if (!levelNodes || levelNodes.length === 0) continue;
|
|
|
+
|
|
|
+ for (const node of levelNodes) {
|
|
|
+ if (node.unitTree) {
|
|
|
+ node.unitTree.sortTreeNodeCustom(function (a, b) {
|
|
|
+ if (a.b_code && a.b_code !== '') {
|
|
|
+ return b.b_code && b.b_code !== '' ? self.ctx.helper.compareCode(a.b_code, b.b_code) : 1;
|
|
|
+ } else {
|
|
|
+ return b.b_code && b.b_code !== '' ? -1 : a.order - b.order;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ this._calculateNode(node, node.unitTree.children, this.tpFields);
|
|
|
+ } else if (node.children && node.children.length > 0) {
|
|
|
+ this._calculateNode(node, node.children, this.tpFields);
|
|
|
+ } else {
|
|
|
+ this._calculateChild(node);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
_calculateAndSortResult() {
|
|
|
this.resultTree.sortTreeNode();
|
|
|
- this._recursiveCalculateAndSort(this.resultTree.children);
|
|
|
+ console.time('recurCalc');
|
|
|
+ // this._recursiveCalculateAndSort(this.resultTree.children);
|
|
|
+ this._calculateAndSortNodes();
|
|
|
+ console.timeEnd('recurCalc');
|
|
|
}
|
|
|
|
|
|
- _generateCodeByWbsCode(wbsCode) {
|
|
|
+ _generateCodeByWbsCodeWithHis(wbsCode) {
|
|
|
let needUpdate = false;
|
|
|
for (const node of this.resultTree.nodes) {
|
|
|
if (!node.unitTree) continue;
|
|
|
@@ -406,6 +453,22 @@ class BillsPosConvert {
|
|
|
return needUpdate;
|
|
|
}
|
|
|
|
|
|
+ _generateCodeByWbsCode() {
|
|
|
+ let needUpdate = false;
|
|
|
+ for (const node of this.resultTree.nodes) {
|
|
|
+ if (!node.unitTree) continue;
|
|
|
+
|
|
|
+ let index = 1;
|
|
|
+ for (const unit of node.unitTree.nodes) {
|
|
|
+ if (!unit.pos_name || unit.pos_name === '') continue;
|
|
|
+
|
|
|
+ unit.code = node.code + splitChar + index;
|
|
|
+ index ++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return needUpdate;
|
|
|
+ }
|
|
|
+
|
|
|
_getResultData(filterFun) {
|
|
|
const result = this.resultTree.getDefaultDatas(filterFun);
|
|
|
for (const r of result) {
|
|
|
@@ -418,9 +481,13 @@ class BillsPosConvert {
|
|
|
}
|
|
|
// 转换数据
|
|
|
convert(filter) {
|
|
|
+ console.time('convert');
|
|
|
this._recursiveConvertNode(this.bpcTree.children);
|
|
|
+ console.timeEnd('convert');
|
|
|
+ console.time('calc');
|
|
|
this._calculateAndSortResult();
|
|
|
- this._generateCodeByWbsCode([]);
|
|
|
+ console.timeEnd('calc');
|
|
|
+ this._generateCodeByWbsCode();
|
|
|
switch (filter) {
|
|
|
case 'cur':
|
|
|
return this._getResultData(function (node) {
|
|
|
@@ -454,7 +521,7 @@ class BillsPosConvert {
|
|
|
convertByWbsCode(wbsCodeHis) {
|
|
|
this._recursiveConvertNode(this.bpcTree.children);
|
|
|
this._calculateAndSortResult();
|
|
|
- const needUpdate = this._generateCodeByWbsCode(wbsCodeHis);
|
|
|
+ const needUpdate = this._generateCodeByWbsCodeWithHis(wbsCodeHis);
|
|
|
return [this._getResultData(), needUpdate];
|
|
|
}
|
|
|
}
|