tender_cache.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. 'use strict';
  2. /**
  3. * xxx_flow_cur为当前流程,审批通过时为空值
  4. * xxx_flow_pre为上一流程, 未上报时 为空值/上一期终审,pre比cur多一个time值
  5. *
  6. *
  7. * @author Mai
  8. * @date
  9. * @version
  10. */
  11. const auditConst = require('../const/audit.js');
  12. const commonField = ['ledger_status', 'stage_status', 'revise_status', 'stage_count', 'stage_complete_count', 'contract_tp', 'advance_tp', 'change_tp'];
  13. module.exports = app => {
  14. class TenderCache extends app.BaseService {
  15. /**
  16. * 构造函数
  17. *
  18. * @param {Object} ctx - egg全局变量
  19. * @return {void}
  20. */
  21. constructor(ctx) {
  22. super(ctx);
  23. this.tableName = 'tender_cache';
  24. }
  25. _analysisTenderCache(tender, cache, uid) {
  26. commonField.forEach(f => { tender[f] = cache[f]; });
  27. tender.ledger_tp = cache.ledger_tp ? JSON.parse(cache.ledger_tp) : {};
  28. if (!cache.stage_count || (cache.stage_count === 1 && cache.stage_status === auditConst.stage.status.uncheck && cache.stage_flow_cur_uid !== uid)) {
  29. tender.cur_flow = JSON.parse(cache.ledger_flow_cur_info || cache.ledger_flow_pre_info);
  30. tender.cur_flow.title = '台账';
  31. tender.pre_flow = cache.ledger_flow_pre_info ? JSON.parse(cache.ledger_flow_pre_info) : null;
  32. tender.stage_tp = {};
  33. tender.progress = {
  34. title: '台账',
  35. status: auditConst.ledger.tiStatusString[cache.ledger_status],
  36. status_class: auditConst.ledger.tiStatusStringClass[cache.ledger_status],
  37. };
  38. } else if (cache.stage_status !== auditConst.stage.status.uncheck || cache.stage_flow_cur_uid === uid) {
  39. tender.stage_status = cache.stage_status;
  40. tender.stage_count = tender.stage_count;
  41. tender.stage_complete_count = tender.stage_complete_count;
  42. tender.cur_flow = cache.stage_status === auditConst.stage.status.checkNo
  43. ? JSON.parse(cache.stage_flow_pre_info)
  44. : JSON.parse(cache.stage_flow_cur_info || cache.stage_flow_pre_info);
  45. tender.pre_flow = cache.stage_flow_pre_info ? JSON.parse(cache.stage_flow_pre_info) : null;
  46. tender.stage_tp = JSON.parse(cache.stage_flow_cur_tp || cache.stage_flow_pre_tp);
  47. tender.progress = {
  48. title: `第${cache.stage_count}期`,
  49. status: auditConst.stage.tiStatusString[cache.stage_status],
  50. status_class: auditConst.stage.tiStatusStringClass[cache.stage_status],
  51. };
  52. } else {
  53. tender.stage_status = auditConst.stage.status.checked;
  54. tender.stage_count = tender.stage_complete_count;
  55. tender.stage_complete_count = tender.stage_complete_count;
  56. tender.cur_flow = JSON.parse(cache.stage_flow_cur_info || cache.stage_flow_pre_info);
  57. tender.pre_flow = cache.stage_flow_pre_info ? JSON.parse(cache.stage_flow_pre_info) : null;
  58. tender.stage_tp = JSON.parse(cache.stage_flow_cur_tp || cache.stage_flow_pre_tp);
  59. tender.progress = {
  60. title: `第${cache.stage_complete_count}期`,
  61. status: auditConst.stage.tiStatusString[auditConst.stage.status.checked],
  62. status_class: auditConst.stage.tiStatusStringClass[auditConst.stage.status.checked],
  63. };
  64. }
  65. tender.contract_price = cache.contract_price;
  66. tender.advance_tp = cache.advance_tp;
  67. tender.change_tp = cache.change_tp;
  68. }
  69. async loadTenderCache(tender, uid) {
  70. const cache = await this.getDataById(tender.id);
  71. if (cache) this._analysisTenderCache(tender, cache, uid);
  72. }
  73. async insertTenderCache(transaction, tid, uid) {
  74. const user = await this.ctx.service.projectAccount.getAccountCacheData(uid);
  75. user.order = 0;
  76. user.status = auditConst.ledger.status.uncheck;
  77. const data = {
  78. id: tid,
  79. ledger_status: auditConst.flow.status.uncheck,
  80. ledger_flow_cur_uid: uid,
  81. ledger_flow_cur_info: JSON.stringify(user),
  82. };
  83. await transaction.insert(this.tableName, data);
  84. }
  85. async updateLedgerCache4Start(transaction, tid, status, audit, tp) {
  86. const orgCache = await this.getDataById(tid);
  87. const preInfo = JSON.parse(orgCache.ledger_flow_cur_info);
  88. preInfo.time = new Date();
  89. const data = {
  90. id: tid, ledger_status: status,
  91. ledger_flow_pre_uid: orgCache.ledger_flow_cur_uid, ledger_flow_pre_info: JSON.stringify(preInfo),
  92. };
  93. if (audit) {
  94. const info = await this.ctx.service.projectAccount.getAccountCacheData(audit.audit_id);
  95. info.order = audit.audit_order;
  96. info.status = status;
  97. data.ledger_flow_cur_uid = audit.audit_id;
  98. data.ledger_flow_cur_info = JSON.stringify(info);
  99. }
  100. if (tp) data.ledger_tp = JSON.stringify(tp);
  101. await transaction.update(this.tableName, data);
  102. }
  103. async updateLedgerCache(transaction, tid, status, checkType, next, tp) {
  104. const orgCache = await this.getDataById(tid);
  105. const preInfo = JSON.parse(orgCache.ledger_flow_cur_info);
  106. preInfo.time = new Date();
  107. preInfo.status = checkType;
  108. const data = {
  109. id: tid, ledger_status: status,
  110. ledger_flow_pre_uid: orgCache.ledger_flow_cur_uid, ledger_flow_pre_info: JSON.stringify(preInfo),
  111. };
  112. if (next) {
  113. const info = await this.ctx.service.projectAccount.getAccountCacheData(next.audit_id);
  114. info.status = checkType === auditConst.ledger.status.checkNo ? status : auditConst.ledger.status.uncheck;
  115. data.ledger_flow_cur_uid = next.audit_id;
  116. data.ledger_flow_cur_info = JSON.stringify(info);
  117. } else {
  118. data.ledger_flow_cur_uid = 0;
  119. data.ledger_flow_cur_info = '';
  120. }
  121. if (tp) data.ledger_tp = JSON.stringify(tp);
  122. await transaction.update(this.tableName, data);
  123. }
  124. async updateStageCache4Add(transaction, newStage, pcTp) {
  125. const tp = {
  126. contract_tp: 0, qc_tp: 0,
  127. positive_qc_tp: 0, negative_qc_tp: 0,
  128. yf_tp: 0, sf_tp: 0,
  129. pre_contract_tp: newStage.pre_contract_tp, pre_qc_tp: newStage.pre_qc_tp,
  130. pre_positive_qc_tp: newStage.pre_positive_qc_tp, pre_negative_qc_tp: newStage.pre_positive_qc_tp,
  131. pre_yf_tp: newStage.pre_yf_tp, pre_sf_tp: newStage.pre_sf_tp,
  132. ...pcTp,
  133. };
  134. const cur_flow_info = await this.ctx.service.projectAccount.getAccountCacheData(newStage.user_id);
  135. cur_flow_info.order = newStage.order;
  136. cur_flow_info.status = auditConst.stage.status.uncheck;
  137. await transaction.update(this.tableName, {
  138. id: newStage.tid, stage_count: newStage.order, stage_status: auditConst.stage.status.uncheck,
  139. stage_flow_cur_uid: newStage.user_id, stage_flow_cur_info: JSON.stringify(cur_flow_info),
  140. stage_flow_cur_tp: JSON.stringify(tp),
  141. });
  142. }
  143. async updateStageCache4Del(transaction, delStage) {
  144. const preStage = delStage.order > 1 ? await this.ctx.service.stage.getDataBYCondition({ tid: delStage.tid, order: delStage.order - 1 }): {};
  145. if (preStage) {
  146. const tp = JSON.stringify({
  147. contract_tp: preStage.contract_tp, qc_tp: preStage.qc_tp, contract_pc_tp: preStage.contract_pc_tp, qc_pc_tp: preStage.qc_pc_tp, pc_tp: preStage.pc_tp,
  148. positive_qc_tp: preStage.positive_qc_tp, positive_qc_pc_tp: preStage.positive_qc_pc_tp, negative_qc_tp: preStage.negative_qc_pc_tp, negative_qc_pc_tp: preStage.negative_qc_pc_tp,
  149. yf_tp: preStage.yf_tp, sf_tp: preStage.sf_tp,
  150. pre_contract_tp: preStage.pre_contract_tp, pre_qc_tp: preStage.pre_qc_tp,
  151. pre_positive_qc_tp: preStage.pre_positive_qc_tp, pre_negative_qc_tp: preStage.pre_positive_qc_tp,
  152. pre_yf_tp: preStage.pre_yf_tp, pre_sf_tp: preStage.pre_sf_tp,
  153. });
  154. const auditor = await this.ctx.service.stageAudit.getLastestAuditor(preStage.id, preStage.times, preStage.status);
  155. const user_info = JSON.stringify({
  156. order: preStage.order, status: preStage.status, time: auditor.end_time,
  157. name: auditor.name, company: auditor.company, role: auditor.role, mobile: auditor.mobile, telephone: auditor.telephone,
  158. });
  159. await transaction.update(this.tableName, {
  160. id: delStage.tid, stage_count: preStage.order, stage_status: preStage.status,
  161. stage_flow_cur_uid: 0, stage_flow_cur_info: '', stage_flow_cur_tp: '',
  162. stage_flow_pre_uid: auditor.id, stage_flow_pre_info: user_info, stage_flow_pre_tp: tp,
  163. });
  164. } else {
  165. await transaction.update(this.tableName, {
  166. id: delStage.tid, stage_count: 0, stage_complete_count: 0, stage_status: 0,
  167. stage_flow_cur_uid: 0, stage_flow_cur_info: '', stage_flow_cur_tp: '',
  168. stage_flow_pre_uid: 0, stage_flow_pre_info: '', stage_flow_pre_tp: '',
  169. });
  170. }
  171. }
  172. async updateStageCache4Start(transaction, stage, status, auditor, ledgerTp, stageTp) {
  173. const orgCache = await this.getDataById(stage.tid);
  174. const data = { id: tid, stage_status: status };
  175. if (ledgerTp) data.ledger_tp = JSON.parse(ledgerTp);
  176. const tp = JSON.parse(orgCache.stage_flow_cur_tp);
  177. if (stageTp) this._.assign(tp, stageTp);
  178. data.stage_flow_pre_uid = data.stage_flow_cur_uid;
  179. data.stage_flow_pre_info = data.stage_flow_cur_info;
  180. data.stage_flow_pre_tp = JSON.stringify(tp);
  181. data.stage_flow_cur_uid = auditor.id;
  182. const cur_flow_info = await this.ctx.service.projectAccount.getAccountCacheData(auditor.id);
  183. cur_flow_info.stage_order = stage.order;
  184. cur_flow_info.stage_status = stage.status;
  185. data.stage_flow_cur_info = JSON.parse(cur_flow_info);
  186. data.stage_flow_cur_tp = JSON.stringify(tp);
  187. await transaction.update(this.tableName, data);
  188. }
  189. async updateStageCache4Flow(transaction, stage, status, auditor, preAuditor, ledgerTp, stageTp, pcTp) {
  190. const orgCache = await this.getDataById(stage.tid);
  191. const data = { id: tid, stage_status: status };
  192. if (ledgerTp) data.ledger_tp = JSON.parse(ledgerTp);
  193. const tp = JSON.parse(orgCache.stage_flow_cur_tp);
  194. if (stageTp) this._.assign(tp, stageTp);
  195. if (pcTp) this._.assign(tp, pcTp);
  196. if (preAuditor) {
  197. data.stage_flow_pre_uid = preAuditor.id;
  198. const info = await this.ctx.service.projectAccount.getAccountCacheData(preAuditor.id);
  199. data.stage_flow_pre_info = JSON.parse(info);
  200. }
  201. data.stage_flow_pre_uid = data.stage_flow_cur_uid;
  202. data.stage_flow_pre_info = data.stage_flow_cur_info;
  203. data.stage_flow_pre_tp = JSON.stringify(tp);
  204. if (auditor) {
  205. data.stage_flow_cur_uid = auditor.id;
  206. const info = await this.ctx.service.projectAccount.getAccountCacheData(auditor.id);
  207. data.stage_flow_cur_info = JSON.parse(info);
  208. }
  209. data.stage_flow_cur_tp = JSON.stringify(tp);
  210. console.log(data);
  211. await transaction.update(this.tableName, data);
  212. }
  213. async updateStageCache4Revise(transaction, tid, ledgerTp, pcTp) {
  214. const orgCache = await this.getDataById(tid);
  215. const data = { id: tid };
  216. if (ledgerTp) data.ledger_tp = JSON.parse(ledgerTp);
  217. if (data.stage_status !== auditConst.stage.status.checked && pcTp) {
  218. const curTp = JSON.parse(orgCache.stage_flow_cur_tp);
  219. this._.assign(curTp, pcTp);
  220. data.stage_flow_cur_tp = JSON.stringify(curTp);
  221. if (orgCache.stage_status !== auditConst.stage.status.uncheck) {
  222. const preTp = JSON.parse(orgCache.stage_flow_pre_tp);
  223. this._.assign(preTp, pcTp);
  224. data.stage_flow_cur_tp = JSON.stringify(preTp);
  225. }
  226. }
  227. await transaction.update(this.tableName, data);
  228. }
  229. async _refreshLedgerRela(tender, data) {
  230. data.ledger_status = tender.ledger_status || 0;
  231. if (tender.ledger_status === auditConst.ledger.status.uncheck) {
  232. data.ledger_flow_cur_uid = tender.user_id;
  233. const user = await this.ctx.service.projectAccount.getAccountCacheData(tender.user_id);
  234. user.status = tender.ledger_status;
  235. user.order = 0;
  236. data.ledger_flow_cur_info = JSON.stringify(user);
  237. } else if (tender.ledger_status === auditConst.ledger.status.checked) {
  238. const pre = await this.ctx.service.ledgerAudit.getLastestAuditor(tender.id, tender.ledger_times, tender.ledger_status);
  239. data.ledger_flow_pre_uid = pre.audit_id;
  240. data.ledger_flow_pre_info = JSON.stringify({
  241. order: pre.order, status: pre.status, time: pre.end_time,
  242. name: pre.name, company: pre.company, role: pre.role, mobile: pre.mobile, telephone: pre.telephone,
  243. });
  244. } else if (tender.ledger_status === auditConst.ledger.status.checkNo) {
  245. data.ledger_flow_cur_uid = tender.user_id;
  246. const user = await this.ctx.service.projectAccount.getAccountCacheData(tender.user_id);
  247. user.order = 0;
  248. user.status = auditConst.ledger.status.uncheck;
  249. data.ledger_flow_cur_info = JSON.stringify(user);
  250. const pre = await this.ctx.service.ledgerAudit.getLastestAuditor(tender.id, tender.ledger_times - 1, tender.ledger_status);
  251. data.ledger_flow_pre_uid = pre.audit_id;
  252. data.ledger_flow_pre_info = JSON.stringify({
  253. order: pre.order, status: pre.status, time: pre.end_time,
  254. name: pre.name, company: pre.company, role: pre.role, mobile: pre.mobile, telephone: pre.telephone,
  255. });
  256. } else {
  257. const cur = await this.ctx.service.ledgerAudit.getLastestAuditor(tender.id, tender.ledger_times, tender.ledger_status);
  258. if (cur) {
  259. data.ledger_flow_cur_uid = cur.audit_id;
  260. data.ledger_flow_cur_info = JSON.stringify({
  261. order: cur.order, status: cur.status, time: cur.end_time,
  262. name: cur.name, company: cur.company, role: cur.role, mobile: cur.mobile, telephone: cur.telephone,
  263. });
  264. if (cur.audit_order === 1) {
  265. data.ledger_flow_pre_uid = tender.user_id;
  266. const user = await await this.ctx.service.projectAccount.getAccountCacheData(tender.user_id, { order: 0, time: cur.begin_time });
  267. data.ledger_flow_pre_info = JSON.stringify(user);
  268. } else {
  269. const pre = await this.ctx.service.ledgerAudit.getAuditorByOrder(tender.id, cur.audit_order - 1, cur.times);
  270. data.ledger_flow_pre_uid = pre.audit_id;
  271. data.ledger_flow_pre_info = JSON.stringify({
  272. order: pre.order, status: pre.status, time: pre.end_time,
  273. name: pre.name, company: pre.company, role: pre.role, mobile: pre.mobile, telephone: pre.telephone,
  274. });
  275. }
  276. }
  277. }
  278. data.ledger_tp = JSON.stringify(await this.ctx.service.ledger.addUp({ tender_id: tender.id/* , is_leaf: true*/ }));
  279. const revise = await this.service.ledgerRevise.getLastestRevise(tender.id);
  280. data.revise_status = revise ? revise.status : 0;
  281. }
  282. async _calcTp (lastStage, tp) {
  283. lastStage.curTimes = lastStage.times;
  284. const tpData = await this.ctx.service.stageBills.getSumTotalPrice(lastStage);
  285. const pcSum = await this.ctx.service.stageBillsPc.getSumTotalPrice(lastStage);
  286. tp.contract_tp = tpData.contract_tp;
  287. tp.qc_tp = tpData.qc_tp;
  288. tp.positive_qc_tp = tpData.positive_qc_tp;
  289. tp.negative_qc_tp = tpData.negative_qc_tp;
  290. tp.contract_pc_tp = pcSum.contract_pc_tp;
  291. tp.qc_pc_tp = pcSum.qc_pc_tp;
  292. tp.pc_tp = pcSum.pc_tp;
  293. tp.positive_qc_pc_tp = pcSum.positive_qc_pc_tp;
  294. tp.negative_qc_pc_tp = pcSum.negative_qc_pc_tp;
  295. const payTp = await this.ctx.service.stagePay.getSpecialTotalPrice(lastStage);
  296. tp.yf_tp = payTp.yf;
  297. tp.sf_tp = payTp.sf;
  298. };
  299. async _refreshStageRela(tender, data) {
  300. if (tender.ledger_status === auditConst.ledger.status.checked) {
  301. const lastStage = await this.ctx.service.stage.getLastestStage(tender.id, true);
  302. if (!lastStage) return;
  303. data.stage_count = lastStage.order;
  304. data.stage_complete_count = lastStage.status === auditConst.stage.status.checked ? lastStage.order : lastStage.order - 1;
  305. data.stage_status = lastStage.status;
  306. const tp = {
  307. contract_tp: lastStage.contract_tp || 0, qc_tp: lastStage.qc_tp || 0, contract_pc_tp: lastStage.contract_pc_tp, qc_pc_tp: lastStage.qc_pc_tp, pc_tp: lastStage.pc_tp,
  308. positive_qc_tp: lastStage.positive_qc_tp, positive_qc_pc_tp: lastStage.positive_qc_pc_tp, negative_qc_tp: lastStage.negative_qc_pc_tp, negative_qc_pc_tp: lastStage.negative_qc_pc_tp,
  309. yf_tp: lastStage.yf_tp, sf_tp: lastStage.sf_tp,
  310. pre_contract_tp: lastStage.pre_contract_tp, pre_qc_tp: lastStage.pre_qc_tp,
  311. pre_positive_qc_tp: lastStage.pre_positive_qc_tp, pre_negative_qc_tp: lastStage.pre_positive_qc_tp,
  312. pre_yf_tp: lastStage.pre_yf_tp, pre_sf_tp: lastStage.pre_sf_tp,
  313. };
  314. const preStage = lastStage.order > 1 ? await this.ctx.service.stage.getDataByCondition({ tid: lastStage.tid, order: lastStage.order - 1}) : null;
  315. if (lastStage.status === auditConst.stage.status.uncheck) {
  316. if (preStage) {
  317. const preAuditor = await this.ctx.service.stageAudit.getLastestAuditor(preStage.id, preStage.times, preStage.status);
  318. data.stage_flow_pre_uid = preAuditor.aid;
  319. data.stage_flow_pre_info = JSON.stringify({
  320. order: preAuditor.order, status: preAuditor.status, time: preAuditor.end_time,
  321. name: preAuditor.name, company: preAuditor.company, role: preAuditor.role, mobile: preAuditor.mobile, telephone: preAuditor.telephone,
  322. });
  323. data.stage_flow_pre_tp = JSON.stringify({
  324. contract_tp: preStage.contract_tp || 0, qc_tp: preStage.qc_tp || 0, contract_pc_tp: preStage.contract_pc_tp, qc_pc_tp: preStage.qc_pc_tp, pc_tp: preStage.pc_tp,
  325. positive_qc_tp: preStage.positive_qc_tp, positive_qc_pc_tp: preStage.positive_qc_pc_tp, negative_qc_tp: preStage.negative_qc_pc_tp, negative_qc_pc_tp: preStage.negative_qc_pc_tp,
  326. yf_tp: preStage.yf_tp, sf_tp: preStage.sf_tp,
  327. pre_contract_tp: preStage.pre_contract_tp, pre_qc_tp: preStage.pre_qc_tp,
  328. pre_positive_qc_tp: preStage.pre_positive_qc_tp, pre_negative_qc_tp: preStage.pre_positive_qc_tp,
  329. pre_yf_tp: preStage.pre_yf_tp, pre_sf_tp: preStage.pre_sf_tp,
  330. });
  331. }
  332. lastStage.curOrder = 0;
  333. await this._calcTp(lastStage, tp);
  334. data.stage_flow_cur_uid = lastStage.user_id;
  335. const curInfo = await this.ctx.service.projectAccount.getAccountCacheData(lastStage.user_id, { order: 0, status: lastStage.status });
  336. data.stage_flow_cur_info = JSON.stringify(curInfo);
  337. data.stage_flow_cur_tp = JSON.stringify(tp);
  338. } else if (lastStage.status === auditConst.stage.status.checked) {
  339. const preAuditor = await this.ctx.service.stageAudit.getLastestAuditor(lastStage.id, lastStage.times, lastStage.status);
  340. lastStage.curOrder = preAuditor.order;
  341. await this._calcTp(lastStage, tp);
  342. data.stage_flow_pre_uid = preAuditor.aid;
  343. data.stage_flow_pre_info = JSON.stringify({
  344. order: preAuditor.order, status: preAuditor.status, time: preAuditor.end_time,
  345. name: preAuditor.name, company: preAuditor.company, role: preAuditor.role, mobile: preAuditor.mobile, telephone: preAuditor.telephone,
  346. });
  347. data.stage_flow_cur_tp = JSON.stringify(tp);
  348. data.stage_flow_pre_tp = JSON.stringify(tp);
  349. } else if (lastStage.status === auditConst.stage.status.checkNo) {
  350. lastStage.curOrder = 0;
  351. await this._calcTp(lastStage, tp);
  352. data.stage_flow_cur_uid = lastStage.user_id;
  353. const curInfo = await this.ctx.service.projectAccount.getAccountCacheData(lastStage.user_id, { order: 0, status: auditConst.stage.status.uncheck });
  354. data.stage_flow_cur_info = JSON.stringify(curInfo);
  355. data.stage_flow_cur_tp = JSON.stringify(tp);
  356. const preAuditor = await this.ctx.service.stageAudit.getLastestAuditor(lastStage.id, lastStage.times - 1, lastStage.status);
  357. data.stage_flow_pre_uid = preAuditor.aid;
  358. data.stage_flow_pre_info = JSON.stringify({
  359. order: preAuditor.order, status: preAuditor.status, time: preAuditor.end_time,
  360. name: preAuditor.name, company: preAuditor.company, role: preAuditor.role, mobile: preAuditor.mobile, telephone: preAuditor.telephone,
  361. });
  362. const his = lastStage.tp_history.find(x => { return x.times === preAuditor.times && x.order === preAuditor.order; });
  363. if (his) {
  364. tp.contract_tp = his.contract_tp;
  365. tp.qc_tp = his.qc_tp;
  366. tp.positive_qc_tp = his.positive_qc_tp;
  367. tp.negative_qc_tp = his.negative_qc_tp;
  368. tp.yf_tp = his.yf_tp;
  369. tp.sf_tp = his.sf_tp;
  370. }
  371. data.stage_flow_pre_tp = JSON.stringify(tp);
  372. } else {
  373. const curAuditor = await this.ctx.service.stageAudit.getLastestAuditor(lastStage.id, lastStage.times, lastStage.status);
  374. lastStage.curOrder = curAuditor.order;
  375. await this._calcTp(lastStage, tp);
  376. data.stage_flow_cur_uid = curAuditor.aid;
  377. data.stage_flow_cur_info = JSON.stringify({
  378. order: curAuditor.order, status: curAuditor.status,
  379. name: curAuditor.name, company: curAuditor.company, role: curAuditor.role, mobile: curAuditor.mobile, telephone: curAuditor.telephone,
  380. });
  381. data.stage_flow_cur_tp = JSON.stringify(tp);
  382. const preAuditor = curAuditor.order > 1 ? await this.ctx.service.stageAudit.getAuditorByOrder(lastStage.id, lastStage.times, curAuditor.order - 1) : null;
  383. if (preAuditor) {
  384. data.stage_flow_pre_uid = preAuditor.aid;
  385. data.stage_flow_pre_info = JSON.stringify({
  386. order: preAuditor.order, status: preAuditor.status, time: curAuditor.begin_time,
  387. name: preAuditor.name, company: preAuditor.company, role: preAuditor.role, mobile: preAuditor.mobile, telephone: preAuditor.telephone,
  388. });
  389. } else {
  390. data.stage_flow_pre_uid = lastStage.user_id;
  391. const preInfo = await this.ctx.service.projectAccount.getAccountCacheData(lastStage.user_id, { order: 0, status: auditConst.stage.status.uncheck, time: curAuditor.begin_time });
  392. data.stage_flow_pre_info = JSON.stringify(preInfo);
  393. }
  394. const his = preAuditor
  395. ? lastStage.tp_history.find(x => { return x.times === preAuditor.times && x.order === preAuditor.order; })
  396. : lastStage.tp_history.find(x => { return x.times === lastStage.times && x.order === 0; });
  397. if (his) {
  398. tp.contract_tp = his.contract_tp;
  399. tp.qc_tp = his.qc_tp;
  400. tp.positive_qc_tp = his.positive_qc_tp;
  401. tp.negative_qc_tp = his.negative_qc_tp;
  402. tp.yf_tp = his.yf_tp;
  403. tp.sf_tp = his.sf_tp;
  404. }
  405. data.stage_flow_pre_tp = JSON.stringify(tp);
  406. }
  407. }
  408. }
  409. async refreshTenderCache(tender, transaction) {
  410. const orgCache = await this.getDataById(tender.id);
  411. const data = { id: tender.id, ledger_status: 0,
  412. ledger_flow_cur_uid: 0, ledger_flow_cur_info: '', ledger_flow_pre_uid: 0, ledger_flow_pre_info: '',
  413. stage_count: 0, stage_complete_count: 0, stage_status: 0,
  414. stage_flow_cur_uid: 0, stage_flow_cur_info: '', stage_flow_cur_tp: '',
  415. stage_flow_pre_uid: 0, stage_flow_pre_info: '', stage_flow_pre_tp: '',
  416. };
  417. // 台账
  418. await this._refreshLedgerRela(tender, data);
  419. // 计量
  420. await this._refreshStageRela(tender, data);
  421. // 其他计算项
  422. const tenderInfo = await this.ctx.service.tenderInfo.getTenderInfo(tender.id, tender.project_id);
  423. data.contract_price = tenderInfo.deal_param.contractPrice || 0;
  424. data.advance_tp = await this.ctx.service.advance.getSumAdvance(tender.id);
  425. const changeSum = await this.db.queryOne(`SELECT SUM(cast (total_price as decimal(18,6))) AS total_price FROM ${this.ctx.service.change.tableName} WHERE tid = ? AND status = ? And valid = 1`, [tender.id, auditConst.flow.status.checked]);
  426. data.change_tp = changeSum.total_price || 0;
  427. console.log(data);
  428. const conn = transaction || this.db;
  429. if (orgCache) {
  430. conn.update(this.tableName, data);
  431. } else {
  432. conn.insert(this.tableName, data);
  433. }
  434. }
  435. }
  436. return TenderCache;
  437. };