measure_bills.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. 'use strict';
  2. /**
  3. * 中间计量--计量清单 数据模型
  4. *
  5. * @author Mai
  6. * @date 2018/6/27
  7. * @version
  8. */
  9. module.exports = app => {
  10. class MeasureBills extends app.BaseService {
  11. /**
  12. * 构造函数
  13. *
  14. * @param {Object} ctx - egg全局变量
  15. * @return {void}
  16. */
  17. constructor(ctx) {
  18. super(ctx);
  19. this.tableName = 'measure_bills';
  20. }
  21. /**
  22. * 查询中间计量下清单信息
  23. *
  24. * @param {Number} tenderId - 标段id
  25. * @param {uuid} mid - 中间计量id
  26. * @return {Promise<*>}
  27. */
  28. async getBillsDetail(tenderId, mid) {
  29. const sql = 'SELECT MB.`tender_id`, MB.`mid`, MB.`bid`, L.`code`, L.`name`, L.`full_path` ' +
  30. 'FROM ?? AS L, ?? AS MB ' +
  31. 'WHERE L.`tender_id` = ? and MB.`tender_id` = ? and MB.`mid` = ? ' +
  32. ' and MB.`bid` = L.`ledger_id`';
  33. const sqlParam = [this.ctx.service.ledger.tableName, this.tableName, tenderId, tenderId, mid];
  34. return await this.db.query(sql, sqlParam);
  35. }
  36. /**
  37. *
  38. * @param tenderId
  39. * @param mid
  40. * @param ids
  41. * @return {Promise<*>}
  42. * @private
  43. */
  44. async _getUnionBillsData(tenderId, mid, ids) {
  45. const sql = 'SELECT L.*, MB.`deal_quantity`, MB.`deal_totalprice`, MB.`qc_quantity`, MB.`qc_totalprice` ' +
  46. 'FROM ?? AS L, ?? AS MB ' +
  47. 'WHERE L.`tender_id` = ? and L.`ledger_id` IN (' + ids.join(',') + ') and MB.`tender_id` = ? and MB.`mid` = ?' +
  48. ' and MB.`bid` = L.`ledger_id` ' +
  49. 'UNION ' +
  50. 'SELECT L.*, Null, Null, Null, Null ' +
  51. 'FROM ?? AS L ' +
  52. 'WHERE L.`tender_id` = ? and L.`ledger_id` IN (' + ids.join(',') + ') and L.`is_leaf` = false';
  53. const sqlParam = [this.ctx.service.ledger.tableName, this.tableName, tenderId, tenderId, mid,
  54. this.ctx.service.ledger.tableName, tenderId];
  55. return await this.db.query(sql, sqlParam);
  56. }
  57. /**
  58. * 查询中间计量下清单(含父项)
  59. * @param {Number} tenderId - 标段id
  60. * @param {uuid} mid - 中间计量id
  61. * @return {Promise<Array>}
  62. */
  63. async getBillsDetailWithParent(tenderId, mid) {
  64. const bills = await this.getBillsDetail(tenderId, mid);
  65. if (bills.length > 0) {
  66. let ids = [];
  67. for (const b of bills) {
  68. ids = ids.concat(b.full_path.split('.'));
  69. }
  70. return await this._getUnionBillsData(tenderId, mid, ids);
  71. // return await this.ctx.service.ledger.getDataByNodeIds(tenderId, ids);
  72. }
  73. return [];
  74. }
  75. /**
  76. * 查询中间计量下,某一条清单信息
  77. * @param {Number} tenderId - 标段id
  78. * @param {uuid} mid - 计量id
  79. * @param {Number} bid - 清单id
  80. * @return {Promise<*>}
  81. */
  82. async getBillsData(tenderId, mid, bid) {
  83. const sql = 'SELECT MB.`tender_id`, MB.`mid`, MB.`bid`, L.`code`, L.`name`, L.`full_path` ' +
  84. 'FROM ?? AS L, ?? AS MB ' +
  85. 'WHERE L.`tender_id` = ? and MB.`tender_id` = ? and MB.`mid` = ? and MB.bid = ?' +
  86. ' and MB.`bid` = L.`ledger_id`';
  87. const sqlParam = [this.ctx.service.ledger.tableName, this.tableName, tenderId, tenderId, mid, bid];
  88. return await this.db.queryOne(sql, sqlParam);
  89. }
  90. /**
  91. * 查询中间计量下,某一条清单信息(含父项)
  92. * @param {Number} tenderId - 标段id
  93. * @param {uuid} mid - 计量id
  94. * @param {Number} bid - 清单id
  95. * @return {Promise<*>}
  96. */
  97. async getBillsDataWithParent(tenderId, mid, bid) {
  98. const bills = await this.getBillsData(tenderId, mid, bid);
  99. const ids = bills.full_path.split('.');
  100. return await this._getUnionBillsData(tenderId, mid, ids);
  101. // return await this.ctx.service.ledger.getDataByNodeIds(tenderId, bills.full_path.split('.'));
  102. }
  103. /**
  104. * 新增计量清单
  105. * @param {Number} tenderId - 标段id
  106. * @param {uuid} mid - 计量id
  107. * @param {Number} bid - 清单id
  108. * @return {Promise<void>}
  109. */
  110. async addBills(tenderId, mid, bid) {
  111. const result = await this.db.insert(this.tableName, {
  112. tender_id: tenderId,
  113. mid,
  114. bid,
  115. in_time: new Date(),
  116. in_user: this.ctx.session.sessionUser.accountId,
  117. });
  118. }
  119. /**
  120. * 移除计量清单
  121. * @param {Number} tenderId - 标段id
  122. * @param {uuid} mid - 计量id
  123. * @param {Number} bid - 清单id
  124. * @return {Promise<void>}
  125. */
  126. async removeBills(tenderId, mid, bid) {
  127. await this.db.delete(this.tableName, {
  128. tender_id: tenderId,
  129. mid,
  130. bid,
  131. });
  132. }
  133. /**
  134. * 更新计量清单并计算
  135. * @param {Number} tenderId - 标段id
  136. * @param {uuid} mid - 计量id
  137. * @param {Number} bid - 清单id
  138. * @param {Object} data - 更新数据
  139. * @return {Promise<*>}
  140. */
  141. async updateBills(tenderId, mid, bid, data) {
  142. const bills = await this.ctx.service.ledger.getDataByNodeId(tenderId, bid);
  143. if (data.deal_quantity) {
  144. data.deal_totalprice = data.deal_quantity * bills.unit_price;
  145. } else if (data.qc_quantity) {
  146. data.qc_totalprice = data.qc_quantity * bills.unit_price;
  147. } else {
  148. throw '计量清单数据有误';
  149. }
  150. const result = await this.update(data, {
  151. tender_id: tenderId,
  152. mid,
  153. bid,
  154. });
  155. if (result) {
  156. data.ledger_id = bid;
  157. return data;
  158. }
  159. throw '更新数据失败';
  160. }
  161. }
  162. return MeasureBills;
  163. };