spss_controller.js 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708
  1. 'use strict';
  2. /**
  3. * 标段对比 控制器
  4. *
  5. * @author Mai
  6. * @date 2020/2/21
  7. * @version
  8. */
  9. const measureType = require('../const/tender').measureType;
  10. const status = require('../const/audit').stage.status;
  11. const moment = require('moment');
  12. module.exports = app => {
  13. class SpssController extends app.BaseController {
  14. /**
  15. * 构造函数
  16. *
  17. * @param {Object} ctx - egg全局context
  18. * @return {void}
  19. */
  20. constructor(ctx) {
  21. super(ctx);
  22. ctx.showProject = true;
  23. }
  24. async info(ctx) {
  25. try {
  26. const categoryData = await this.ctx.service.category.getAllCategory(this.ctx.subProject);
  27. const renderData = {
  28. categoryData,
  29. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.spss.gatherInfo)
  30. };
  31. await this.layout('spss/gather_info.ejs', renderData, 'spss/gather_info_modal.ejs');
  32. } catch (err) {
  33. ctx.helper.log(err);
  34. }
  35. }
  36. async gatherLedger(ctx) {
  37. try {
  38. const categoryData = await this.ctx.service.category.getAllCategory(this.ctx.subProject);
  39. const renderData = {
  40. categoryData,
  41. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.spss.gatherLedger)
  42. };
  43. await this.layout('spss/gather_ledger.ejs', renderData, 'spss/spss_select_modal.ejs');
  44. } catch (err) {
  45. ctx.helper.log(err);
  46. }
  47. }
  48. async gatherStage(ctx) {
  49. try {
  50. const categoryData = await this.ctx.service.category.getAllCategory(this.ctx.subProject);
  51. const renderData = {
  52. categoryData,
  53. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.spss.gatherStage)
  54. };
  55. await this.layout('spss/gather_stage.ejs', renderData, 'spss/spss_select_modal.ejs');
  56. } catch (err) {
  57. ctx.helper.log(err);
  58. }
  59. }
  60. async gatherStageExtra(ctx) {
  61. try {
  62. const categoryData = await this.ctx.service.category.getAllCategory(this.ctx.subProject);
  63. const renderData = {
  64. categoryData,
  65. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.spss.gatherStageExtra)
  66. };
  67. await this.layout('spss/gather_stage_extra.ejs', renderData, 'spss/spss_select_modal.ejs');
  68. } catch (err) {
  69. ctx.helper.log(err);
  70. }
  71. }
  72. async gatherStagePay(ctx) {
  73. try {
  74. const categoryData = await this.ctx.service.category.getAllCategory(this.ctx.subProject);
  75. const renderData = {
  76. categoryData,
  77. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.spss.gatherStagePay)
  78. };
  79. await this.layout('spss/gather_stage_pay.ejs', renderData, 'spss/spss_select_modal.ejs');
  80. } catch(err) {
  81. ctx.log(err);
  82. }
  83. }
  84. async compareLedger(ctx) {
  85. try {
  86. const categoryData = await this.ctx.service.category.getAllCategory(this.ctx.subProject);
  87. const renderData = {
  88. categoryData,
  89. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.spss.compareLedger)
  90. };
  91. await this.layout('spss/compare_ledger.ejs', renderData, 'spss/spss_select_modal.ejs');
  92. } catch (err) {
  93. ctx.helper.log(err);
  94. }
  95. }
  96. async compareStage(ctx) {
  97. try {
  98. const categoryData = await this.ctx.service.category.getAllCategory(this.ctx.subProject);
  99. const renderData = {
  100. categoryData,
  101. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.spss.compareStage),
  102. };
  103. await this.layout('spss/compare_stage.ejs', renderData, 'spss/spss_select_modal.ejs');
  104. } catch (err) {
  105. ctx.helper.log(err);
  106. }
  107. }
  108. async _loadStageTpData(info, tender, stage, loadPre = true) {
  109. if (!stage) return;
  110. if (stage.readOnly && stage.status === status.uncheck) return;
  111. if (loadPre) {
  112. info.pre_contract_tp = stage.pre_contract_tp;
  113. info.pre_qc_tp = stage.pre_qc_tp;
  114. info.pre_yf_tp = stage.pre_yf_tp;
  115. info.pre_sf_tp = stage.pre_sf_tp;
  116. }
  117. if (!stage.readOnly) await this.ctx.service.stage.checkStageGatherData(stage, this.ctx.session.sessionUser.is_admin);
  118. info.contract_tp = this.ctx.helper.add(stage.contract_tp, info.contract_tp);
  119. info.qc_tp = this.ctx.helper.add(stage.qc_tp, info.qc_tp);
  120. info.contract_pc_tp = this.ctx.helper.add(stage.contract_pc_tp, info.contract_pc_tp);
  121. info.qc_pc_tp = this.ctx.helper.add(stage.qc_pc_tp, info.qc_pc_tp);
  122. info.pc_tp = this.ctx.helper.add(stage.pc_tp, info.pc_tp);
  123. info.yf_tp = this.ctx.helper.add(stage.yf_tp, info.yf_tp);
  124. info.sf_tp = this.ctx.helper.add(stage.sf_tp, info.sf_tp);
  125. }
  126. async _loadStagesTpData(info, tender, stages, preStage, endStage) {
  127. if (preStage) {
  128. info.pre_contract_tp = this.ctx.helper.sum([preStage.contract_tp, preStage.pre_contract_tp, preStage.contract_pc_tp]);
  129. info.pre_contract_tp = this.ctx.helper.sum([preStage.qc_tp, preStage.pre_qc_tp, preStage.qc_pc_tp]);
  130. info.pre_yf_tp = this.ctx.helper.add(preStage.yf_tp, preStage.pre_yf_tp);
  131. info.pre_sf_tp = this.ctx.helper.add(preStage.sf_tp, preStage.pre_sf_tp);
  132. }
  133. for (const stage of stages) {
  134. await this.ctx.service.stage.doCheckStage(stage);
  135. await this._loadStageTpData(info, tender, stage, false);
  136. }
  137. }
  138. async _loadInfoData(tender, filter) {
  139. const info = { measure_type_str: '', total_price: tender.total_price };
  140. if (tender.measure_type === measureType.tz.value) info.measure_type_str = measureType.tz.title;
  141. if (tender.measure_type === measureType.gcl.value) info.measure_type_str = measureType.gcl.title;
  142. await this.ctx.service.tenderCache.loadTenderCache(tender, this.ctx.session.sessionUser.accountId);
  143. info.contract_price = tender.contract_price;
  144. info.advance_tp = tender.advance_tp;
  145. info.change_tp = tender.change_tp;
  146. info.progress = tender.progress;
  147. if (filter.type === 'stage') {
  148. await this._loadStageTpData(info, tender, filter.stage);
  149. } else {
  150. await this._loadStagesTpData(info, tender, filter.stages, filter.preStage, filter.endStage);
  151. }
  152. info.pre_gather_tp = this.ctx.helper.add(info.pre_contract_tp, info.pre_qc_tp);
  153. info.gather_tp = this.ctx.helper.sum([info.contract_tp, info.qc_tp, info.pc_tp]);
  154. info.end_contract_tp = this.ctx.helper.sum([info.contract_tp, info.contract_pc_tp, info.pre_contract_tp]);
  155. info.end_qc_tp = this.ctx.helper.sum([info.qc_tp, info.qc_pc_tp, info.pre_qc_tp]);
  156. info.end_gather_tp = this.ctx.helper.add(info.gather_tp, info.pre_gather_tp);
  157. info.end_sf_tp = this.ctx.helper.add(info.sf_tp, info.pre_sf_tp);
  158. info.end_yf_tp = this.ctx.helper.add(info.yf_tp, info.pre_yf_tp);
  159. return info;
  160. }
  161. async _loadLedgerData(tender) {
  162. const bills = await this.ctx.service.ledger.getAllDataByCondition({
  163. columns: ['id', 'ledger_id', 'ledger_pid', 'level', 'full_path', 'is_leaf', 'order', 'code', 'b_code', 'name', 'unit', 'unit_price', 'quantity', 'total_price'],
  164. where: { tender_id: tender.id },
  165. });
  166. const pos = await this.ctx.service.pos.getAllDataByCondition({
  167. columns: ['id', 'lid', 'name', 'quantity', 'porder'],
  168. where: { tid: tender.id },
  169. });
  170. return [bills, pos];
  171. }
  172. async _loadDealBillsData(tender) {
  173. }
  174. async _getValidStages(tenderId, sort = 'desc') {
  175. const accountId = this.ctx.session.sessionUser.accountId;
  176. const stages = await this.ctx.service.stage.getAllDataByCondition({ where: { tid: tenderId }, orders: [['order', sort]] });
  177. return stages.filter(s => { return s.status !== status.uncheck || s.user_id === accountId; });
  178. }
  179. async _filterOrder(tender, order) {
  180. const stages = await this._getValidStages(tender.id);
  181. const stage = this.ctx.helper._.find(stages, { order });
  182. if (stage) await this.ctx.service.stage.doCheckStage(stage);
  183. return { type: 'stage', stage, filter: `第${order}期` };
  184. }
  185. async _filterMonth(tender, month) {
  186. const stages = await this._getValidStages(tender.id);
  187. const stage = this.ctx.helper._.find(stages, { s_time: month });
  188. if (stage) await this.ctx.service.stage.doCheckStage(stage);
  189. return { type: 'stage', stage, filter: month };
  190. }
  191. async _filterFinal(tender) {
  192. const stages = await this._getValidStages(tender.id);
  193. const stage = stages[0];
  194. if (stage) await this.ctx.service.stage.doCheckStage(stage);
  195. return { type: 'stage', stage, filter: `第${stage.order}期` };
  196. }
  197. async _filterCheckedFinal(tender) {
  198. const stages = await this._getValidStages(tender.id);
  199. const checkedStages = stages.filter(x => { return x.status === status.checked; });
  200. const stage = checkedStages[0];
  201. if (stage) await this.ctx.service.stage.doCheckStage(stage);
  202. return { type: 'stage', stage, filter: `第${stage.order}期` };
  203. }
  204. async _filterOrderZone(tender, zone) {
  205. let [iBegin, iEnd] = zone.split(':');
  206. iBegin = this.ctx.helper._.toInteger(iBegin) || 0;
  207. iEnd = this.ctx.helper._.toInteger(iEnd) || 0;
  208. const stages = await this._getValidStages(tender.id, 'asc'), validStages = [];
  209. let preStage, endStage;
  210. for (const stage of stages) {
  211. if (stage.order < iBegin) {
  212. if (!preStage || preStage.order < stage.order) preStage = stage;
  213. } else if (stage.order > iEnd) {
  214. if (!endStage || endStage.order > stage.order) endStage = stage;
  215. } else {
  216. validStages.push(stage);
  217. }
  218. }
  219. return { type: 'stages', stages: validStages, preStage, endStage, filter: `第${iBegin}期 ~ 第${iEnd}期` };
  220. }
  221. async _filterTimeZone(tender, zone) {
  222. const times = zone.split(' - ');
  223. if (times.length !== 2) throw '选择的汇总周期无效';
  224. const beginTime = moment(times[0], 'YYYY-MM');
  225. const endTime = moment(times[1], 'YYYY-MM');
  226. const stages = await this._getValidStages(tender.id, 'asc'), validStages = [];
  227. let preStage, endStage;
  228. for (const stage of stages) {
  229. const sTime = moment(stage.s_time, 'YYYY-MM');
  230. if (sTime.isBetween(beginTime, endTime, null, '[]')) {
  231. validStages.push(stage);
  232. } else if (sTime.isBefore(beginTime)) {
  233. if (!preStage || moment(preStage.s_time, 'YYYY-MM').isBefore(sTime)) preStage = stage;
  234. } else if (sTime.isAfter(endTime)) {
  235. if (!endStage || moment(endStage.s_time, 'YYYY-MM').isAfter(sTime)) endStage = stage;
  236. }
  237. }
  238. return { type: 'stages', stages: validStages, preStage, endStage, filter: zone };
  239. }
  240. async _filterStages(tender, stageInfo) {
  241. switch (stageInfo.type) {
  242. case 'stage':
  243. return await this._filterOrder(tender, stageInfo.stage);
  244. case 'month':
  245. return await this._filterMonth(tender, stageInfo.month);
  246. case 'final':
  247. return await this._filterFinal(tender);
  248. case 'checked-final':
  249. return await this._filterCheckedFinal(tender);
  250. case 'zone':
  251. return await this._filterTimeZone(tender, stageInfo.zone);
  252. case 'stage-zone':
  253. return await this._filterOrderZone(tender, stageInfo.stage_zone);
  254. default:
  255. return;
  256. }
  257. }
  258. async _loadStageData(tender, stage) {
  259. const bills = await this.ctx.service.ledger.getAllDataByCondition({
  260. columns: ['id', 'ledger_id', 'ledger_pid', 'level', 'full_path', 'is_leaf', 'order', 'code', 'b_code', 'name', 'unit', 'unit_price', 'quantity', 'total_price'],
  261. where: { tender_id: tender.id },
  262. });
  263. const pos = await this.ctx.service.pos.getAllDataByCondition({
  264. columns: ['id', 'lid', 'name', 'quantity', 'porder'],
  265. where: { tid: tender.id },
  266. });
  267. if (!stage) return [bills, pos];
  268. const curStage = stage.readOnly
  269. ? await this.ctx.service.stageBills.getAuditorStageData2(tender.id, stage.id, stage.curTimes, stage.curOrder)
  270. : await this.ctx.service.stageBills.getLastestStageData2(tender.id, stage.id);
  271. const preStage = stage.preCheckedStage ? await this.ctx.service.stageBillsFinal.getFinalData(tender, stage.preCheckedStage.order) : [];
  272. const bpcStage = await this.ctx.service.stageBillsPc.getAllDataByCondition({ where: { sid: stage.id } });
  273. this.ctx.helper.assignRelaData(bills, [
  274. { data: curStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: '', relaId: 'lid' },
  275. { data: preStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: 'pre_', relaId: 'lid' },
  276. { data: bpcStage, fields: ['contract_pc_tp', 'qc_pc_tp', 'pc_tp'], prefix: '', relaId: 'lid' },
  277. ]);
  278. const curStagePos = stage.readOnly
  279. ? await this.ctx.service.stagePos.getAuditorStageData2(tender.id, stage.id, stage.curTimes, stage.curOrder)
  280. : await this.ctx.service.stagePos.getLastestStageData2(tender.id, stage.id);
  281. const preStagePos = stage.preCheckedStage ? await this.ctx.service.stagePosFinal.getFinalData(tender, stage.preCheckedStage.order) : [];
  282. this.ctx.helper.assignRelaData(pos, [
  283. { data: curStagePos, fields: ['contract_qty', 'qc_qty'], prefix: '', relaId: 'pid' },
  284. { data: preStagePos, fields: ['contract_qty', 'qc_qty'], prefix: 'pre_', relaId: 'pid' },
  285. ]);
  286. return [bills, pos];
  287. }
  288. async _loadStagesData(tender, stages, preStage, endStage) {
  289. const indexPre = 'id_', helper = this.ctx.helper;
  290. const sumAssignRelaData = function (index, rela) {
  291. const loadFields = function (datas, fields, prefix, relaId) {
  292. for (const d of datas) {
  293. const key = indexPre + d[relaId];
  294. const m = index[key];
  295. if (m) {
  296. for (const f of fields) {
  297. if (d[f] !== undefined) {
  298. m[prefix + f] = helper.add(m[prefix + f], d[f]);
  299. }
  300. }
  301. }
  302. }
  303. };
  304. for (const r of rela) {
  305. loadFields(r.data, r.fields, r.prefix, r.relaId);
  306. }
  307. };
  308. const bills = await this.ctx.service.ledger.getAllDataByCondition({
  309. columns: ['id', 'ledger_id', 'ledger_pid', 'level', 'full_path', 'is_leaf', 'order', 'code', 'b_code', 'name', 'unit', 'unit_price', 'quantity', 'total_price'],
  310. where: { tender_id: tender.id },
  311. });
  312. const pos = await this.ctx.service.pos.getAllDataByCondition({
  313. columns: ['id', 'lid', 'name', 'quantity', 'porder'],
  314. where: { tid: tender.id },
  315. });
  316. let billsIndexData = {};
  317. for (const bd of bills) {
  318. billsIndexData[indexPre + bd.id] = bd;
  319. }
  320. let posIndexData = {};
  321. for (const p of pos) {
  322. posIndexData[indexPre + p.id] = p;
  323. }
  324. if (preStage) {
  325. const endStage = await this.ctx.service.stageBillsFinal.getFinalData(tender, preStage.order);
  326. sumAssignRelaData(billsIndexData, [
  327. { data: endStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: 'pre_', relaId: 'lid'},
  328. ]);
  329. const endStagePos = await this.ctx.service.stagePosFinal.getFinalData(tender, preStage.order);
  330. sumAssignRelaData(posIndexData, [
  331. {data: endStagePos, fields: ['contract_qty', 'qc_qty'], prefix: 'pre_', relaId: 'lid'},
  332. ]);
  333. }
  334. for (const stage of stages) {
  335. await this.ctx.service.stage.doCheckStage(stage);
  336. const curStage = stage.readOnly
  337. ? await this.ctx.service.stageBills.getAuditorStageData2(tender.id, stage.id, stage.curTimes, stage.curOrder)
  338. : await this.ctx.service.stageBills.getLastestStageData2(tender.id, stage.id);
  339. const bpcStage = await this.ctx.service.stageBillsPc.getAllDataByCondition({ where: { sid: stage.id } });
  340. sumAssignRelaData(billsIndexData, [
  341. {data: curStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: '', relaId: 'lid'},
  342. { data: bpcStage, fields: ['contract_pc_tp', 'qc_pc_tp', 'pc_tp'], prefix: '', relaId: 'lid' },
  343. ]);
  344. const curStagePos = stage.readOnly
  345. ? await this.ctx.service.stagePos.getAuditorStageData2(tender.id, stage.id, stage.curTimes, stage.curOrder)
  346. : await this.ctx.service.stagePos.getLastestStageData2(tender.id, stage.id);
  347. sumAssignRelaData(posIndexData, [
  348. {data: curStagePos, fields: ['contract_qty', 'qc_qty'], prefix: '', relaId: 'pid'},
  349. ]);
  350. }
  351. return [bills, pos];
  352. }
  353. async _loadStageLedgerData(tender, filter) {
  354. return filter.type === 'stage'
  355. ? await this._loadStageData(tender, filter.stage)
  356. : await this._loadStagesData(tender, filter.stages, filter.preStage, filter.endStage);
  357. }
  358. async _loadStagePayData(tender, stage) {
  359. if (!stage) return [];
  360. const dealPay = await this.ctx.service.stagePay.getStagePays(stage);
  361. if (!stage.readOnly) {
  362. // 计算 本期金额
  363. const PayCalculator = require('../lib/pay_calc');
  364. const payCalculator = new PayCalculator(this.ctx, stage, tender.info);
  365. await payCalculator.calculateAll(dealPay);
  366. }
  367. return dealPay;
  368. }
  369. async _loadStagesPayData(tender, stages, preStage, endStage) {
  370. // todo
  371. return [];
  372. }
  373. async _loadPayData(tender, filter) {
  374. return filter.type === 'stage'
  375. ? await this._loadStagePayData(tender, filter.stage)
  376. : await this._loadStagesPayData(tender, filter.stage, filter.preStage, filter.endStage);
  377. }
  378. async _loadStageJgclData(tender, stage) {
  379. if (!stage) return [];
  380. const data = await this.ctx.service.stageJgcl.getStageData(stage);
  381. const preData = stage.preCheckedStage ? await this.ctx.service.stageJgcl.getEndStageData(stage.tid, stage.preCheckedStage.order) : [];
  382. for (const d of data) {
  383. const pd = this.ctx.helper._.find(preData, {uuid: d.uuid});
  384. if (pd) {
  385. d.pre_arrive_qty = pd.arrive_qty;
  386. d.pre_arrive_tp = pd.arrive_tp;
  387. d.pre_deduct_qty = pd.deduct_qty;
  388. d.pre_deduct_tp = pd.deduct_tp;
  389. }
  390. d.end_arrive_qty = this.ctx.helper.add(d.pre_arrive_qty, d.arrive_qty);
  391. d.end_arrive_tp = this.ctx.helper.add(d.pre_arrive_tp, d.arrive_tp);
  392. d.end_deduct_qty = this.ctx.helper.add(d.pre_deduct_qty, d.deduct_qty);
  393. d.end_deduct_tp = this.ctx.helper.add(d.pre_deduct_tp, d.deduct_tp);
  394. }
  395. return data;
  396. }
  397. async _loadStagesJgclData(tender, stages, preStage, endStage) {
  398. // todo
  399. return [];
  400. }
  401. async _loadJgclData(tender, filter) {
  402. return filter.type === 'stage'
  403. ? await this._loadStageJgclData(tender, filter.stage)
  404. : await this._loadStagesJgclData(tender, filter.stages, filter.preStage, filter.endStage);
  405. };
  406. async _loadStageYgclData(tender, stage) {
  407. if (!stage) return [];
  408. const data = await this.ctx.service.stageYjcl.getStageData(stage);
  409. for (const d of data) {
  410. d.end_qty = this.ctx.helper.add(d.pre_qty, d.qty);
  411. d.end_tp = this.ctx.helper.add(d.pre_tp, d.tp);
  412. }
  413. return data;
  414. }
  415. async _loadStagesYgclData(tender, stages, preStage, endStage) {
  416. // todo
  417. return [];
  418. }
  419. async _loadYjclData(tender, filter) {
  420. return filter.type === 'stage'
  421. ? await this._loadStageYgclData(tender, filter.stage)
  422. : await this._loadStagesYgclData(tender, filter.stages, filter.preStage, filter.endStage);
  423. };
  424. async _loadStageBonusData(tender, stage) {
  425. if (!stage) return [];
  426. const data = await this.ctx.service.stageBonus.getEndStageData(tender.id, stage.order);
  427. return data;
  428. }
  429. async _loadStagesBonusData(tender, stages, preStage, endStage) {
  430. // todo
  431. return [];
  432. }
  433. async _loadBonusData(tender, filter) {
  434. return filter.type === 'stage'
  435. ? await this._loadStageBonusData(tender, filter.stage)
  436. : await this._loadStagesBonusData(tender, filter.stages, filter.preStage, filter.endStage);
  437. };
  438. async _loadStageSafeProdData(tender, stage) {
  439. if (!stage) return [];
  440. const data = await this.ctx.service.stageSafeProd.getStageData(stage);
  441. const preData = stage.preCheckedStage ? await this.ctx.service.stageSafeProd.getEndStageData(stage.tid, stage.preCheckedStage.order) : [];
  442. for (const d of data) {
  443. const pd = this.ctx.helper._.find(preData, {uuid: d.uuid});
  444. if (pd) {
  445. d.pre_qty = pd.qty;
  446. d.pre_tp = pd.tp;
  447. }
  448. d.end_qty = this.ctx.helper.add(d.pre_qty, d.qty);
  449. d.end_tp = this.ctx.helper.add(d.pre_tp, d.tp);
  450. }
  451. return data;
  452. }
  453. async _loadStagesSafeProdData(tender, stages, preStage, endStage) {
  454. // todo
  455. return [];
  456. }
  457. async _loadSafeProdData(tender, filter) {
  458. return filter.type === 'stage'
  459. ? await this._loadStageSafeProdData(tender, filter.stage)
  460. : await this._loadStagesSafeProdData(tender, filter.stages, filter.preStage, filter.endStage);
  461. };
  462. async _loadStageTempLandData(tender, stage) {
  463. if (!stage) return [];
  464. const data = await this.ctx.service.stageTempLand.getStageData(stage);
  465. const preData = stage.preCheckedStage ? await this.ctx.service.stageTempLand.getEndStageData(stage.tid, stage.preCheckedStage.order) : [];
  466. for (const d of data) {
  467. const pd = this.ctx.helper._.find(preData, {uuid: d.uuid});
  468. if (pd) {
  469. d.pre_qty = pd.qty;
  470. d.pre_tp = pd.tp;
  471. }
  472. d.end_qty = this.ctx.helper.add(d.pre_qty, d.qty);
  473. d.end_tp = this.ctx.helper.add(d.pre_tp, d.tp);
  474. }
  475. return data;
  476. }
  477. async _loadStagesTempLandData(tender, stages, preStage, endStage) {
  478. // todo
  479. return [];
  480. }
  481. async _loadTempLandData(tender, filter) {
  482. return filter.type === 'stage'
  483. ? await this._loadStageTempLandData(tender, filter.stage)
  484. : await this._loadStagesTempLandData(tender, filter.stages, filter.preStage, filter.endStage);
  485. };
  486. async _loadStageOtherData(tender, stage) {
  487. if (!stage) return [];
  488. const data = await this.ctx.service.stageOther.getStageData(stage);
  489. const preData = stage.preCheckedStage ? await this.ctx.service.stageOther.getEndStageData(stage.tid, stage.preCheckedStage.order) : [];
  490. for (const d of data) {
  491. const pd = this.ctx.helper._.find(preData, {uuid: d.uuid});
  492. if (pd) {
  493. d.pre_tp = pd.tp;
  494. }
  495. d.end_tp = this.ctx.helper.add(d.pre_tp, d.tp);
  496. }
  497. return data;
  498. }
  499. async _loadStagesOtherData(tender, stages, preStage, endStage) {
  500. // todo
  501. return [];
  502. }
  503. async _loadOtherData(tender, filter) {
  504. return filter.type === 'stage'
  505. ? await this._loadStageOtherData(tender, filter.stage)
  506. : await this._loadStagesOtherData(tender, filter.stages, filter.preStage, filter.endStage);
  507. };
  508. async _loadTenderData(tid, filter, stageInfo) {
  509. this.ctx.tender = null;
  510. const tender = await this.ctx.service.tender.checkTender(tid);
  511. const result = { id: tender.id, name: tender.name, category: tender.category };
  512. let stageFilter = null;
  513. for (const f of filter) {
  514. switch (f) {
  515. case 'info':
  516. if (!stageFilter) {
  517. stageFilter = await this._filterStages(tender, stageInfo);
  518. result.stage_filter = stageFilter.filter;
  519. }
  520. result.info = await this._loadInfoData(tender, stageFilter);
  521. break;
  522. case 'ledger':
  523. if (filter.indexOf('stage') < 0) [result.bills, result.pos] = await this._loadLedgerData(tender);
  524. break;
  525. case 'stage':
  526. if (!stageFilter) {
  527. stageFilter = await this._filterStages(tender, stageInfo);
  528. result.stage_filter = stageFilter.filter;
  529. }
  530. [result.bills, result.pos] = await this._loadStageLedgerData(tender, stageFilter);
  531. break;
  532. case 'pay':
  533. if (!stageFilter) {
  534. stageFilter = await this._filterStages(tender, stageInfo);
  535. result.stage_filter = stageFilter.filter;
  536. }
  537. result.pay = await this._loadPayData(tender, stageFilter);
  538. break;
  539. case 'jgcl':
  540. if (!stageFilter) {
  541. stageFilter = await this._filterStages(tender, stageInfo);
  542. result.stage_filter = stageFilter.filter;
  543. }
  544. result.jgcl = await this._loadJgclData(tender, stageFilter);
  545. break;
  546. case 'yjcl':
  547. if (!stageFilter) {
  548. stageFilter = await this._filterStages(tender, stageInfo);
  549. result.stage_filter = stageFilter.filter;
  550. }
  551. result.yjcl = await this._loadYjclData(tender, stageFilter);
  552. break;
  553. case 'bonus':
  554. if (!stageFilter) {
  555. stageFilter = await this._filterStages(tender, stageInfo);
  556. result.stage_filter = stageFilter.filter;
  557. }
  558. result.bonus = await this._loadBonusData(tender, stageFilter);
  559. break;
  560. case 'safeProd':
  561. if (!stageFilter) {
  562. stageFilter = await this._filterStages(tender, stageInfo);
  563. result.stage_filter = stageFilter.filter;
  564. }
  565. result.safeProd = await this._loadSafeProdData(tender, stageFilter);
  566. break;
  567. case 'tempLand':
  568. if (!stageFilter) {
  569. stageFilter = await this._filterStages(tender, stageInfo);
  570. result.stage_filter = stageFilter.filter;
  571. }
  572. result.tempLand = await this._loadTempLandData(tender, stageFilter);
  573. break;
  574. case 'other':
  575. if (!stageFilter) {
  576. stageFilter = await this._filterStages(tender, stageInfo);
  577. result.stage_filter = stageFilter.filter;
  578. }
  579. result.other = await this._loadOtherData(tender, stageFilter);
  580. break;
  581. default:
  582. throw '查询的数据类型未定义';
  583. }
  584. }
  585. return result;
  586. }
  587. async load(ctx) {
  588. try {
  589. const data = JSON.parse(ctx.request.body.data);
  590. const filter = data.filter.split(';');
  591. const result = [];
  592. for (const t of data.tender) {
  593. result.push(await this._loadTenderData(t.tid, filter, t.stageInfo));
  594. }
  595. ctx.body = { err: 0, msg: '', data: result };
  596. } catch (err) {
  597. ctx.log(err);
  598. ctx.ajaxErrorBody(err, '加载数据错误');
  599. }
  600. }
  601. async _getTzData(tid, includePos = false) {
  602. const tender = await this.ctx.service.tender.getTender(tid);
  603. if (!tender || tender.project_id !== this.ctx.session.sessionProject.id) {
  604. throw '不存在该标段';
  605. }
  606. const bills = await this.ctx.service.ledger.getData(tid);
  607. const pos = tender.measure_type === measureType.tz.value || includePos
  608. ? await this.ctx.service.pos.getPosData({tid: tid})
  609. : [];
  610. return { id: tid, name: tender.name, bills: bills, pos: pos };
  611. }
  612. async _checkStage(tid, sorder) {
  613. const stage = await this.service.stage.getDataByCondition({ tid: tid, order: sorder });
  614. if (!stage) throw '期数据错误';
  615. await this.service.stage.doCheckStage(stage);
  616. return stage;
  617. }
  618. async _getStageData(tid, sorder) {
  619. const data = await this._getTzData(tid, true);
  620. const stage = await this._checkStage(tid, sorder);
  621. const bills = await this.ctx.service.stageBills.getAuditorStageData2(tid, stage.id, stage.curTimes, stage.curOrder);
  622. const pos = await this.ctx.service.stagePos.getAuditorStageData2(tid, stage.id, stage.curTimes, stage.curOrder);
  623. data.stage = {
  624. sid: stage.id, sorder: stage.order, curTimes: stage.curTimes, curOrder: stage.curOrder,
  625. bills: bills, pos: pos
  626. };
  627. return data;
  628. }
  629. /**
  630. * 检测台账 页面
  631. *
  632. * @param {Object} ctx - egg全局变量
  633. * @return {void}
  634. */
  635. async checkTz(ctx) {
  636. try {
  637. const renderData = {
  638. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.tools.checkTz)
  639. };
  640. await this.layout('spss/check_tz.ejs', renderData);
  641. } catch (err) {
  642. ctx.helper.log(err);
  643. }
  644. }
  645. /**
  646. * 获取 期计量 汇总 数据(Ajax)
  647. * @param ctx
  648. * @returns {Promise<void>}
  649. */
  650. async loadBaseData(ctx) {
  651. try {
  652. const data = JSON.parse(ctx.request.body.data);
  653. const responseData = {err: 0, msg: '', data: []};
  654. responseData.data = await this._getTzData(data.id);
  655. ctx.body = responseData;
  656. } catch (err) {
  657. ctx.helper.log(err);
  658. ctx.body = this.ajaxErrorBody(err, '查询数据错误');
  659. }
  660. }
  661. }
  662. return SpssController;
  663. };