stage.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. 'use strict';
  2. /**
  3. * 期计量 数据模型
  4. *
  5. * @author Mai
  6. * @date 2018/8/13
  7. * @version
  8. */
  9. const audit = require('../const/audit');
  10. const payConst = require('../const/deal_pay.js');
  11. module.exports = app => {
  12. class Stage extends app.BaseService {
  13. /**
  14. * 构造函数
  15. *
  16. * @param {Object} ctx - egg全局变量
  17. * @return {void}
  18. */
  19. constructor(ctx) {
  20. super(ctx);
  21. this.tableName = 'stage';
  22. }
  23. /**
  24. * 获取标段下的全部计量期,按倒序
  25. * @param tenderId
  26. * @returns {Promise<void>}
  27. */
  28. async getValidStages(tenderId) {
  29. return await this.db.select(this.tableName, {
  30. where: {tid: tenderId},
  31. orders: [['order', 'desc']],
  32. });
  33. }
  34. /**
  35. *
  36. * @param tenderId - 标段id
  37. * @param date - 计量年月
  38. * @param period - 开始-截止日期
  39. * @returns {Promise<void>}
  40. */
  41. async addStage(tenderId, date, period) {
  42. const stages = await this.getAllDataByCondition({
  43. where: {tid: tenderId},
  44. order: ['order'],
  45. });
  46. if (stages.length > 0 && stages[stages.length - 1].status !== audit.flow.status.checked) {
  47. throw '上一期未审批通过,请等待上一期审批通过后,再新增数据';
  48. };
  49. const order = stages.length + 1;
  50. const newStage = {
  51. sid: this.uuid.v4(),
  52. tid: tenderId,
  53. order: order,
  54. in_time: new Date(),
  55. s_time: date,
  56. period: period,
  57. times: 1,
  58. status: audit.flow.status.uncheck,
  59. user_id: this.ctx.session.sessionUser.accountId,
  60. };
  61. const transaction = await this.db.beginTransaction();
  62. try {
  63. // 新增期记录
  64. const result = await transaction.insert(this.tableName, newStage);
  65. if (result.affectedRows === 1) {
  66. newStage.id = result.insertedId;
  67. } else {
  68. throw '新增期数据失败';
  69. }
  70. // 新增期合同支付数据
  71. const dealResult = await this.ctx.service.stagePay.addInitialStageData(newStage, transaction);
  72. if (!dealResult) {
  73. throw '新增期合同支付数据失败';
  74. }
  75. await transaction.commit();
  76. return newStage;
  77. } catch (err) {
  78. await transaction.rollback();
  79. throw err;
  80. }
  81. }
  82. /**
  83. * 编辑计量期
  84. *
  85. * @param {Number} tenderId - 标段Id
  86. * @param {Number} order - 第N期
  87. * @param {String} date - 计量年月
  88. * @param {String} period - 开始-截止时间
  89. * @returns {Promise<void>}
  90. */
  91. async saveStage(tenderId, order, date, period) {
  92. await this.db.update(this.tableName, {
  93. s_time: date,
  94. period: period,
  95. }, { where: { tid: tenderId, order: order } });
  96. }
  97. /**
  98. * 设置 中间计量 生成规则,并生成数据
  99. * @param {Number} tenderId - 标段id
  100. * @param {Number} order - 期序号
  101. * @param {Number} data - 中间计量生成规则
  102. * @returns {Promise<void>}
  103. */
  104. async buildDetailData(tenderId, order, data) {
  105. const conn = await this.db.beginTransaction();
  106. try {
  107. await conn.update(this.tableName, { im_type: data.im_type, im_pre: data.im_pre }, { where: { tid: tenderId, order: order } });
  108. // to do 生成中间计量数据
  109. await conn.commit();
  110. } catch (err) {
  111. await conn.rollback();
  112. throw err;
  113. }
  114. }
  115. async getStagePayCalcBase() {
  116. const calcBase = JSON.parse(JSON.stringify(payConst.calcBase));
  117. const param = this.ctx.tender.info.deal_param;
  118. for (const cb of calcBase) {
  119. switch (cb.code) {
  120. case 'htj':
  121. cb.value = param.contractPrice;
  122. break;
  123. case 'zlje':
  124. cb.value = param.zanLiePrice;
  125. break;
  126. case 'htjszl':
  127. cb.value = this.app.calc.minus(param.contractPrice, param.zanLiePrice);
  128. break;
  129. case 'kgyfk':
  130. cb.value = param.startAdvance;
  131. break;
  132. case 'clyfk':
  133. cb.value = param.materialAdvance;
  134. break;
  135. case 'bqwc':
  136. const sum = await this.ctx.service.stageBills.getSumTotalPrice(this.ctx.stage);
  137. cb.value = this.app._.add(sum.contract_tp, sum.qc_tp);
  138. break;
  139. case 'ybbqwc':
  140. const sumGcl = await this.ctx.service.stageBills.getSumTotalPriceGcl(this.ctx.stage, '^1[0-9]{2}-');
  141. cb.value = this.app._.add(sumGcl.contract_tp, sumGcl.qc_tp);
  142. break;
  143. default:
  144. cb.value = 0;
  145. }
  146. }
  147. return calcBase;
  148. }
  149. }
  150. return Stage;
  151. };