change.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Mai
  6. * @date
  7. * @version
  8. */
  9. const RptMemBase = require('./base');
  10. const bindData = {};
  11. const changeConst = require('../../const/change');
  12. const Ledger = require('../ledger');
  13. class rptMemChange extends RptMemBase {
  14. constructor(ctx) {
  15. super(ctx, bindData);
  16. }
  17. _getChangeConstName(define, value) {
  18. for (const prop in define) {
  19. if (define[prop].value === value) {
  20. return define[prop].name;
  21. }
  22. }
  23. return '';
  24. }
  25. async _anaylisChange(change) {
  26. const self = this;
  27. const types = this.ctx.helper._.map(change.type.split(','), function (t) {
  28. return self._getChangeConstName(changeConst.type, self.ctx.helper._.toInteger(t));
  29. });
  30. change.type = types.join(';');
  31. change.class = this._getChangeConstName(changeConst.class, change.class);
  32. change.quality = this._getChangeConstName(changeConst.quality, change.quality);
  33. change.charge = this._getChangeConstName(changeConst.charge, change.charge);
  34. }
  35. async doCheckChange(changeId) {
  36. if (this.ctx.change) return;
  37. this.ctx.change = await this.ctx.service.change.getDataByCondition({ cid: changeId });
  38. this._anaylisChange(this.ctx.change);
  39. }
  40. async doCheckTender(tenderId) {
  41. if (this.ctx.tender) return;
  42. this.ctx.tender = { id: tenderId };
  43. this.ctx.tender.data = await this.ctx.service.tender.getTender(tenderId);
  44. this.ctx.tender.info = await this.ctx.service.tenderInfo.getTenderInfo(tenderId);
  45. }
  46. async doBeforeLoadReport(params) {
  47. await this.doCheckChange(params.change_id);
  48. await this.doCheckTender(this.ctx.change.tid);
  49. }
  50. async _getChangeBills() {
  51. const decimal = this.ctx.tender.info.decimal;
  52. const changeBills = await this.ctx.service.changeAuditList.getAllDataByCondition({ where: { cid: this.ctx.change.cid} });
  53. for (const d of changeBills) {
  54. d.o_qty = d.oamount;
  55. d.o_tp = this.ctx.helper.mul(d.o_qty, d.unit_price, decimal.tp);
  56. d.o_qty2 = d.oamount2;
  57. d.o_tp2 = this.ctx.helper.mul(d.o_qty2, d.unit_price, decimal.tp);
  58. d.c_qty = d.camount;
  59. d.c_tp = this.ctx.helper.mul(d.c_qty, d.unit_price, decimal.tp);
  60. d.s_qty = d.samount ? parseFloat(d.samount) : 0;
  61. d.s_tp = this.ctx.helper.mul(d.s_qty, d.unit_price, decimal.tp);
  62. d.sp_qty = d.spamount;
  63. d.sp_tp = this.ctx.helper.mul(d.sp_qty, d.unit_price, decimal.tp);
  64. const auditAmount = d.audit_amount ? d.audit_amount.split(',') : [];
  65. const relaChange = this.ctx.helper._.find(this.ctx.change, {cid: d.cid});
  66. for (const [i, aa] of auditAmount.entries()) {
  67. const amountField = 'qty_' + (i+1), tpField = 'tp_' + (i+1);
  68. d[amountField] = aa ? parseFloat(aa) : 0;
  69. d[tpField] = this.ctx.helper.mul(d[amountField], d.unit_price, decimal.tp);
  70. if (relaChange) {
  71. relaChange[tpField] = this.ctx.helper.add(relaChange[tpField], d[tpField]);
  72. }
  73. }
  74. }
  75. return changeBills;
  76. }
  77. _getNewBillsTree(calcFields) {
  78. return new Ledger.billsTree(this.ctx, {
  79. id: 'ledger_id',
  80. pid: 'ledger_pid',
  81. order: 'order',
  82. level: 'level',
  83. rootId: -1,
  84. keys: ['id', 'tender_id', 'ledger_id'],
  85. stageId: 'id',
  86. calcFields: calcFields || ['deal_tp', 'total_price', 'sgfh_tp', 'sjcl_tp', 'qtcl_tp'],
  87. calc: function (node, helper) {
  88. }
  89. });
  90. }
  91. _calcLeafXmjRela(billsTree) {
  92. for (const node of billsTree.nodes) {
  93. if (node.b_code) {
  94. const leafXmj = billsTree.getLeafXmjParent(node);
  95. node.leaf_xmj_id = leafXmj ? leafXmj.id : -1;
  96. }
  97. }
  98. }
  99. async getChangeLedgerBillsData(fields, showLevel) {
  100. try {
  101. const billsData = await this.ctx.service.ledger.getData(this.ctx.tender.id);
  102. const changeBillsData = await this.ctx.service.changeLedger.getAllDataByCondition({ where: { ccid: this.ctx.change.id } });
  103. billsData.push(...changeBillsData);
  104. const billsTree = this._getNewBillsTree();
  105. billsTree.loadDatas(billsData);
  106. billsTree.calculateAll();
  107. if (this._checkFieldsExist(fields, ['leaf_xmj_id'])) {
  108. this._calcLeafXmjRela(billsTree);
  109. }
  110. return showLevel ? billsTree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : billsTree.getDefaultDatas();
  111. } catch(err) {
  112. this.ctx.log(err);
  113. return [];
  114. }
  115. }
  116. async getChangeLedgerPosData() {
  117. try {
  118. const posData = await this.ctx.service.pos.getAllDataByCondition({ where: {tid: this.ctx.tender.id }});
  119. const changePosData = await this.ctx.service.changePos.getAllDataByCondition({ where: { ccid: this.ctx.change.id } });
  120. posData.push(...changePosData);
  121. const pos = new Ledger.pos({
  122. id: 'id', ledgerId: 'lid',
  123. updateFields: ['contract_qty', 'qc_qty', 'postil'],
  124. calc: function (p) {
  125. }
  126. });
  127. pos.loadDatas(posData);
  128. pos.calculateAll();
  129. return pos.getDatas();
  130. } catch (err) {
  131. return [];
  132. }
  133. }
  134. getCommonData(params, tableName, fields, customDefine, customSelect) {
  135. switch (tableName) {
  136. case 'mem_change':
  137. return [this.ctx.change];
  138. case 'mem_change_bills':
  139. return this._getChangeBills();
  140. case 'mem_change_audit':
  141. return this.ctx.service.changeAudit.getListGroupByTimes(this.ctx.change.cid, this.ctx.change.times);
  142. case 'mem_change_att':
  143. return this.ctx.service.changeAtt.getChangeAttachment(this.ctx.change.cid);
  144. case 'mem_project':
  145. return this.ctx.service.project.getDataByCondition({ id: this.ctx.session.sessionProject.id });
  146. case 'mem_tender':
  147. return [this.ctx.tender.data];
  148. case 'mem_tender_info':
  149. return [this.ctx.tender.info];
  150. case 'mem_change_ledger_bills':
  151. return this.getChangeLedgerBillsData(fields);
  152. case 'mem_change_ledger_bills_filter':
  153. return this.getChangeLedgerBillsData(fields, true);
  154. case 'mem_change_ledger_pos':
  155. return this.getChangeLedgerPosData();
  156. default:
  157. return [];
  158. }
  159. }
  160. }
  161. module.exports = rptMemChange;