stage_rela.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Mai
  6. * @date
  7. * @version
  8. */
  9. const auditConst = require('../const/audit').stage;
  10. const changeConst = require('../const/change');
  11. module.exports = app => {
  12. class StageRela 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_rela';
  22. }
  23. _analysisStageRela(data) {
  24. const datas = data instanceof Array ? data : [data];
  25. for (const d of datas) {
  26. d.cache_tp = d.cache_tp ? JSON.parse(d.cache_tp) : {};
  27. d.cache_org_tp = d.cache_org_tp ? JSON.parse(d.cache_org_tp) : {};
  28. }
  29. }
  30. async getStageRela(sid) {
  31. const result = await this.getAllDataByCondition({
  32. where: { sid },
  33. orders: [['add_time', 'asc']],
  34. });
  35. this._analysisStageRela(result);
  36. return result;
  37. }
  38. async getHistoryStageRela(tid, sorder) {
  39. const sql = 'SELECT * FROM ' + this.tableName + ' WHERE tid = ? And sorder < ? ORDER BY add_time desc';
  40. const result = await this.db.query(sql, [tid, sorder]);
  41. this._analysisStageRela(result);
  42. return result;
  43. }
  44. async getPreRelaStage(tid, sorder, rela_tid) {
  45. const sql = 'SELECT * FROM ' + this.tableName + ' WHERE tid = ? AND rela_tid = ? And sorder < ? ORDER BY sorder';
  46. return await this.db.queryOne(sql, [tid, rela_tid, sorder]);
  47. }
  48. async _getCacheOrgTp(stage) {
  49. const bg = await this.ctx.service.stageChange.getQualityTotalPrice(stage);
  50. const gcl100 = await this.ctx.service.stageBills.getSumTotalPriceGcl(stage, '^[^0-9]*1[0-9]{2}(-|$)');
  51. return {
  52. contract_tp: stage.contract_tp, qc_tp: stage.qc_tp,
  53. gather_tp: this.ctx.helper.add(stage.contract_tp, stage.qc_tp),
  54. gather_tp_100: this.ctx.helper.add(gcl100.contract_tp, gcl100.qc_tp),
  55. bg_common: bg.common, bg_more: bg.more, bg_great: bg.great,
  56. };
  57. }
  58. async _calculateRelaStage(stage, preRelaStage) {
  59. const result = {}, helper = this.ctx.helper, stageBills = [];
  60. const ledger = await this.ctx.service.ledger.getData(stage.tid);
  61. const curBillsData = await this.ctx.service.stageBills.getLastestStageData(stage.tid, stage.id);
  62. helper.assignRelaData(ledger, [
  63. { data: curBillsData, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'postil'], prefix: '', relaId: 'lid' },
  64. ]);
  65. const dealBills = await this.ctx.service.dealBills.getAllDataByCondition({ where: { tender_id: this.ctx.stage.tid } });
  66. const gcl = {}, gcl100 = {}, gcl100reg = /^[^0-9]*1[0-9]{2}(-|$)/;
  67. for (const t of ledger) {
  68. const db = dealBills.find(x => {
  69. return x.code === t.b_code && x.name === t.name && x.unit === t.unit;
  70. });
  71. t.unit_price = db ? db.unit_price : 0;
  72. if (t.contract_qty) t.contract_tp = helper.mul(t.unit_price, t.contract_qty, this.ctx.tender.info.decimal.tp);
  73. if (t.qc_qty) t.qc_tp = helper.mul(t.unit_price, t.qc_qty, this.ctx.tender.info.decimal.tp);
  74. gcl.contract_tp = helper.add(gcl.contract_tp, t.contract_tp);
  75. gcl.qc_tp = helper.add(gcl.qc_tp, t.qc_tp);
  76. if (gcl100reg.test(t.b_code)) {
  77. gcl100.contract_tp = helper.add(gcl100.contract_tp, t.contract_tp);
  78. gcl100.qc_tp = helper.add(gcl100.qc_tp, t.qc_tp);
  79. }
  80. if (t.contract_qty || t.contract_tp || t.qc_qty || t.qc_tp) {
  81. stageBills.push({
  82. tid: this.ctx.tender.id, sid: this.ctx.stage.id, sorder: this.ctx.stage.order,
  83. rela_tid: stage.tid, rela_sid: stage.id, rela_sorder: stage.order,
  84. lid: t.id, unit_price: t.unit_price,
  85. contract_qty: t.contract_qty, contract_tp: t.contract_tp, contract_expr: t.contract_expr,
  86. qc_qty: t.qc_qty, qc_tp: t.qc_tp,
  87. postil: t.postil,
  88. });
  89. }
  90. }
  91. result.contract_tp = gcl.contract_tp;
  92. result.qc_tp = gcl.qc_tp;
  93. result.gather_tp = helper.add(gcl.contract_tp, gcl.qc_tp);
  94. result.gather_tp_100 = helper.add(gcl100.contract_tp, gcl100.qc_tp);
  95. const sql = 'SELECT sc.*, c.quality, cb.code, cb.name, cb.unit FROM ' + this.ctx.service.stageChange.tableName + ' sc' +
  96. ' LEFT JOIN ' + this.ctx.service.change.tableName + ' c ON sc.cid = c.cid' +
  97. ' LEFT JOIN ' + this.ctx.service.changeAuditList.tableName + ' cb ON sc.cbid = cb.id' +
  98. ' WHERE sid = ?';
  99. const data = await this.db.query(sql, [stage.id]);
  100. const bqData = [];
  101. for (const d of data) {
  102. if (!d.qty) continue;
  103. let bd = bqData.find(x => { return x.lid === d.lid && x.quality === d.quality; });
  104. if (!bd) {
  105. const bills = dealBills.find(x => {
  106. return x.code === d.code && x.name === d.name && x.unit === d.unit;
  107. });
  108. if (!bills) continue;
  109. bd = { lid: d.lid, quality: d.quality, unit_price: bills.unit_price };
  110. bqData.push(bd);
  111. }
  112. const tp = this.ctx.helper.mul(d.qty, bd.unit_price, tender.info.decimal.tp);
  113. bd.tp = this.ctx.helper.add(bd.tp, tp);
  114. }
  115. result.bg_common = helper.sum(helper._.map(bqData.filter(x => {return x.quality === changeConst.quality.common.value; }), 'tp'));
  116. result.bg_more = helper.sum(helper._.map(bqData.filter(x => {return x.quality === changeConst.quality.more.value; }), 'tp'));
  117. result.bg_great = helper.sum(helper._.map(bqData.filter(x => {return x.quality === changeConst.quality.great.value; }), 'tp'));
  118. const stageBillsFinal = [];
  119. const preStageBills = preRelaStage
  120. ? this.ctx.service.stageRelaBillsFinal.getAllDataByCondition({ where: { sid: preRelaStage.sid, rela_tid: preRelaStage.rela_tid } })
  121. : [];
  122. for (const b of stageBills) {
  123. const p = preStageBills.find(x => { return x.lid === b.lid });
  124. stageBillsFinal.push({
  125. tid: this.ctx.tender.id, sid: this.ctx.stage.id, sorder: this.ctx.stage.order,
  126. rela_tid: stage.tid, rela_sid: stage.id, rela_sorder: stage.order,
  127. lid: b.lid,
  128. contract_qty: p ? helper.add(p.contract_qty, b.contract_qty) : b.contract_qty,
  129. contract_tp: p ? helper.add(p.contract_tp, b.contract_tp) : b.contract_tp,
  130. qc_qty: p ? helper.add(p.qc_qty, b.qc_qty) : b.qc_qty,
  131. qc_tp: p ? helper.add(p.qc_tp, b.qc_tp) : b.qc_tp,
  132. });
  133. if (p) preStageBills.splice(preStageBills.indexOf(p), 1);
  134. }
  135. for (const p of preStageBills) {
  136. stageBillsFinal.push({
  137. tid: this.ctx.tender.id, sid: this.ctx.stage.id, sorder: this.ctx.stage.order,
  138. rela_tid: stage.tid, rela_sid: stage.id, rela_sorder: stage.order,
  139. lid: b.lid,
  140. contract_qty: p.contract_qty, contract_tp: p.contract_tp,
  141. qc_qty: p.qc_qty, qc_tp: p.qc_tp,
  142. });
  143. }
  144. return [result, stageBills, stageBillsFinal];
  145. }
  146. async calculateRelaStage(relaStage) {
  147. const preRelaStage = await this.getPreRelaStage(this.ctx.tender.id, this.ctx.stage.order, relaStage.tid);
  148. const cache_org_tp = await this._getCacheOrgTp(relaStage);
  149. const [cache_tp, stageBills, stageBillsFinal] = await this._calculateRelaStage(relaStage, preRelaStage);
  150. return { cache_tp, cache_org_tp, stageBills, stageBillsFinal }
  151. }
  152. async addStageRela(relaStage) {
  153. const addTime = new Date();
  154. const tender = await this.ctx.service.tender.getDataById(relaStage.tid);
  155. if (!tender) throw '关联标段不存在';
  156. const conn = await this.db.beginTransaction();
  157. try {
  158. const result = await this.calculateRelaStage(relaStage);
  159. const data = {
  160. tid: this.ctx.tender.id,
  161. sid: this.ctx.stage.id, sorder: this.ctx.stage.order,
  162. rela_tid: relaStage.tid, rela_sid: relaStage.id, rela_sorder: relaStage.order, rela_tname: tender.name,
  163. add_time: addTime, update_time: addTime,
  164. cache_tp: JSON.stringify(result.cache_tp), cache_org_tp: JSON.stringify(result.cache_org_tp),
  165. };
  166. await conn.insert(this.tableName, data);
  167. if (result.stageBills.length > 0) await conn.insert(this.ctx.service.stageRelaBills.tableName, result.stageBills);
  168. if (result.stageBillsFinal.length > 0) await conn.insert(this.ctx.service.stageRelaBillsFinal.tableName, result.stageBillsFinal);
  169. await conn.update(this.ctx.service.stage.tableName, { id: this.ctx.stage.id, check_calc: 1 });
  170. await conn.commit();
  171. } catch (err) {
  172. await conn.rollback();
  173. throw err;
  174. }
  175. }
  176. async deleteStageRela(id) {
  177. const rela = await this.getDataById(id);
  178. if (!rela) throw '关联标段不存在';
  179. const conn = await this.db.beginTransaction();
  180. try {
  181. await conn.delete(this.tableName, { id: rela.id });
  182. await conn.delete(this.ctx.service.stageRelaBills.tableName, {sid: rela.sid, rela_tid: rela.rela_tid});
  183. await conn.delete(this.ctx.service.stageRelaBillsFinal.tableName, {sid: rela.sid, rela_tid: rela.rela_tid});
  184. await conn.update(this.ctx.service.stage.tableName, { id: this.ctx.stage.id, check_calc: 1 });
  185. await conn.commit();
  186. } catch (err) {
  187. await conn.rollback();
  188. throw err;
  189. }
  190. }
  191. async updateStageRela(id) {
  192. const rela = await this.getDataById(id);
  193. const relaStage = await this.ctx.service.stage.getDataById(rela.rela_sid);
  194. const conn = await this.db.beginTransaction();
  195. try {
  196. const result = await this.calculateRelaStage(relaStage);
  197. await conn.update(this.tableName, {
  198. id: rela.id, update_time: new Date(),
  199. cache_tp: JSON.stringify(result.cache_tp), cache_org_tp: JSON.stringify(result.cache_org_tp)
  200. });
  201. await conn.delete(this.ctx.service.stageRelaBills.tableName, {sid: rela.sid, rela_tid: rela.rela_tid});
  202. if (result.stageBills.length > 0) await conn.insert(this.ctx.service.stageRelaBills.tableName, result.stageBills);
  203. await conn.delete(this.ctx.service.stageRelaBillsFinal.tableName, {sid: rela.sid, rela_tid: rela.rela_tid});
  204. if (result.stageBillsFinal.length > 0) await conn.insert(this.ctx.service.stageRelaBillsFinal.tableName, result.stageBillsFinal);
  205. await conn.update(this.ctx.service.stage.tableName, { id: this.ctx.stage.id, check_calc: 1 });
  206. await conn.commit();
  207. } catch (err) {
  208. await conn.rollback();
  209. throw err;
  210. }
  211. }
  212. async getSumCacheTp (sid) {
  213. const result = {};
  214. const relas = await this.getAllDataByCondition({ where: { sid } });
  215. if (relas.length === 0) return result;
  216. this._analysisStageRela(relas);
  217. for (const r of relas) {
  218. result.contract_tp = this.ctx.helper.add(result.contract_tp, r.cache_tp.contract_tp);
  219. result.qc_tp = this.ctx.helper.add(result.qc_tp, r.cache_tp.qc_tp);
  220. result.gather_tp = this.ctx.helper.add(result.gather_tp, r.cache_tp.gather_tp);
  221. result.gather_tp_100 = this.ctx.helper.add(result.gather_tp_100, r.cache_tp.gather_tp_100);
  222. result.bg_common = this.ctx.helper.add(result.bg_common, r.cache_tp.bg_common);
  223. result.bg_more = this.ctx.helper.add(result.bg_more, r.cache_tp.bg_more);
  224. result.bg_great = this.ctx.helper.add(result.bg_more, r.cache_tp.bg_more);
  225. }
  226. return result;
  227. }
  228. }
  229. return StageRela;
  230. };