spss_controller.js 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710
  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', checked = false) {
  175. const accountId = this.ctx.session.sessionUser.accountId;
  176. const condition = { tid: tenderId };
  177. if (checked) condition.status = status.checked;
  178. const stages = await this.ctx.service.stage.getAllDataByCondition({ where: condition, orders: [['order', sort]] });
  179. return stages.filter(s => { return s.status !== status.uncheck || s.user_id === accountId; });
  180. }
  181. async _filterOrder(tender, order, checked) {
  182. const stages = await this._getValidStages(tender.id, 'desc', checked);
  183. const stage = this.ctx.helper._.find(stages, { order });
  184. if (stage) await this.ctx.service.stage.doCheckStage(stage);
  185. return { type: 'stage', stage, filter: `第${order}期` };
  186. }
  187. async _filterMonth(tender, month, checked) {
  188. const stages = await this._getValidStages(tender.id, 'desc', checked);
  189. const stage = this.ctx.helper._.find(stages, { s_time: month });
  190. if (stage) await this.ctx.service.stage.doCheckStage(stage);
  191. return { type: 'stage', stage, filter: month };
  192. }
  193. async _filterFinal(tender, checked) {
  194. const stages = await this._getValidStages(tender.id, 'desc', checked);
  195. const stage = stages[0];
  196. if (stage) await this.ctx.service.stage.doCheckStage(stage);
  197. return { type: 'stage', stage, filter: `第${stage.order}期` };
  198. }
  199. async _filterCheckedFinal(tender, checked) {
  200. const stages = await this._getValidStages(tender.id, 'desc', checked);
  201. const checkedStages = stages.filter(x => { return x.status === status.checked; });
  202. const stage = checkedStages[0];
  203. if (stage) await this.ctx.service.stage.doCheckStage(stage);
  204. return { type: 'stage', stage, filter: `第${stage.order}期` };
  205. }
  206. async _filterOrderZone(tender, zone, checked) {
  207. let [iBegin, iEnd] = zone.split(':');
  208. iBegin = this.ctx.helper._.toInteger(iBegin) || 0;
  209. iEnd = this.ctx.helper._.toInteger(iEnd) || 0;
  210. const stages = await this._getValidStages(tender.id, 'asc', checked), validStages = [];
  211. let preStage, endStage;
  212. for (const stage of stages) {
  213. if (stage.order < iBegin) {
  214. if (!preStage || preStage.order < stage.order) preStage = stage;
  215. } else if (stage.order > iEnd) {
  216. if (!endStage || endStage.order > stage.order) endStage = stage;
  217. } else {
  218. validStages.push(stage);
  219. }
  220. }
  221. return { type: 'stages', stages: validStages, preStage, endStage, filter: `第${iBegin}期 ~ 第${iEnd}期` };
  222. }
  223. async _filterTimeZone(tender, zone, checked) {
  224. const times = zone.split(' - ');
  225. if (times.length !== 2) throw '选择的汇总周期无效';
  226. const beginTime = moment(times[0], 'YYYY-MM');
  227. const endTime = moment(times[1], 'YYYY-MM');
  228. const stages = await this._getValidStages(tender.id, 'asc', checked), validStages = [];
  229. let preStage, endStage;
  230. for (const stage of stages) {
  231. const sTime = moment(stage.s_time, 'YYYY-MM');
  232. if (sTime.isBetween(beginTime, endTime, null, '[]')) {
  233. validStages.push(stage);
  234. } else if (sTime.isBefore(beginTime)) {
  235. if (!preStage || moment(preStage.s_time, 'YYYY-MM').isBefore(sTime)) preStage = stage;
  236. } else if (sTime.isAfter(endTime)) {
  237. if (!endStage || moment(endStage.s_time, 'YYYY-MM').isAfter(sTime)) endStage = stage;
  238. }
  239. }
  240. return { type: 'stages', stages: validStages, preStage, endStage, filter: zone };
  241. }
  242. async _filterStages(tender, stageInfo) {
  243. switch (stageInfo.type) {
  244. case 'stage':
  245. return await this._filterOrder(tender, stageInfo.stage, stageInfo.checked);
  246. case 'month':
  247. return await this._filterMonth(tender, stageInfo.month, stageInfo.checked);
  248. case 'final':
  249. return await this._filterFinal(tender, stageInfo.checked);
  250. case 'checked-final':
  251. return await this._filterCheckedFinal(tender, stageInfo.checked);
  252. case 'zone':
  253. return await this._filterTimeZone(tender, stageInfo.zone, stageInfo.checked);
  254. case 'stage-zone':
  255. return await this._filterOrderZone(tender, stageInfo.stage_zone, stageInfo.checked);
  256. default:
  257. return;
  258. }
  259. }
  260. async _loadStageData(tender, stage) {
  261. const bills = await this.ctx.service.ledger.getAllDataByCondition({
  262. columns: ['id', 'ledger_id', 'ledger_pid', 'level', 'full_path', 'is_leaf', 'order', 'code', 'b_code', 'name', 'unit', 'unit_price', 'quantity', 'total_price'],
  263. where: { tender_id: tender.id },
  264. });
  265. const pos = await this.ctx.service.pos.getAllDataByCondition({
  266. columns: ['id', 'lid', 'name', 'quantity', 'porder'],
  267. where: { tid: tender.id },
  268. });
  269. if (!stage) return [bills, pos];
  270. const curStage = stage.readOnly
  271. ? await this.ctx.service.stageBills.getAuditorStageData2(tender.id, stage.id, stage.curTimes, stage.curOrder)
  272. : await this.ctx.service.stageBills.getLastestStageData2(tender.id, stage.id);
  273. const preStage = stage.preCheckedStage ? await this.ctx.service.stageBillsFinal.getFinalData(tender, stage.preCheckedStage.order) : [];
  274. const bpcStage = await this.ctx.service.stageBillsPc.getAllDataByCondition({ where: { sid: stage.id } });
  275. this.ctx.helper.assignRelaData(bills, [
  276. { data: curStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: '', relaId: 'lid' },
  277. { data: preStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: 'pre_', relaId: 'lid' },
  278. { data: bpcStage, fields: ['contract_pc_tp', 'qc_pc_tp', 'pc_tp'], prefix: '', relaId: 'lid' },
  279. ]);
  280. const curStagePos = stage.readOnly
  281. ? await this.ctx.service.stagePos.getAuditorStageData2(tender.id, stage.id, stage.curTimes, stage.curOrder)
  282. : await this.ctx.service.stagePos.getLastestStageData2(tender.id, stage.id);
  283. const preStagePos = stage.preCheckedStage ? await this.ctx.service.stagePosFinal.getFinalData(tender, stage.preCheckedStage.order) : [];
  284. this.ctx.helper.assignRelaData(pos, [
  285. { data: curStagePos, fields: ['contract_qty', 'qc_qty'], prefix: '', relaId: 'pid' },
  286. { data: preStagePos, fields: ['contract_qty', 'qc_qty'], prefix: 'pre_', relaId: 'pid' },
  287. ]);
  288. return [bills, pos];
  289. }
  290. async _loadStagesData(tender, stages, preStage, endStage) {
  291. const indexPre = 'id_', helper = this.ctx.helper;
  292. const sumAssignRelaData = function (index, rela) {
  293. const loadFields = function (datas, fields, prefix, relaId) {
  294. for (const d of datas) {
  295. const key = indexPre + d[relaId];
  296. const m = index[key];
  297. if (m) {
  298. for (const f of fields) {
  299. if (d[f] !== undefined) {
  300. m[prefix + f] = helper.add(m[prefix + f], d[f]);
  301. }
  302. }
  303. }
  304. }
  305. };
  306. for (const r of rela) {
  307. loadFields(r.data, r.fields, r.prefix, r.relaId);
  308. }
  309. };
  310. const bills = await this.ctx.service.ledger.getAllDataByCondition({
  311. columns: ['id', 'ledger_id', 'ledger_pid', 'level', 'full_path', 'is_leaf', 'order', 'code', 'b_code', 'name', 'unit', 'unit_price', 'quantity', 'total_price'],
  312. where: { tender_id: tender.id },
  313. });
  314. const pos = await this.ctx.service.pos.getAllDataByCondition({
  315. columns: ['id', 'lid', 'name', 'quantity', 'porder'],
  316. where: { tid: tender.id },
  317. });
  318. let billsIndexData = {};
  319. for (const bd of bills) {
  320. billsIndexData[indexPre + bd.id] = bd;
  321. }
  322. let posIndexData = {};
  323. for (const p of pos) {
  324. posIndexData[indexPre + p.id] = p;
  325. }
  326. if (preStage) {
  327. const endStage = await this.ctx.service.stageBillsFinal.getFinalData(tender, preStage.order);
  328. sumAssignRelaData(billsIndexData, [
  329. { data: endStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: 'pre_', relaId: 'lid'},
  330. ]);
  331. const endStagePos = await this.ctx.service.stagePosFinal.getFinalData(tender, preStage.order);
  332. sumAssignRelaData(posIndexData, [
  333. {data: endStagePos, fields: ['contract_qty', 'qc_qty'], prefix: 'pre_', relaId: 'lid'},
  334. ]);
  335. }
  336. for (const stage of stages) {
  337. await this.ctx.service.stage.doCheckStage(stage);
  338. const curStage = stage.readOnly
  339. ? await this.ctx.service.stageBills.getAuditorStageData2(tender.id, stage.id, stage.curTimes, stage.curOrder)
  340. : await this.ctx.service.stageBills.getLastestStageData2(tender.id, stage.id);
  341. const bpcStage = await this.ctx.service.stageBillsPc.getAllDataByCondition({ where: { sid: stage.id } });
  342. sumAssignRelaData(billsIndexData, [
  343. {data: curStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: '', relaId: 'lid'},
  344. { data: bpcStage, fields: ['contract_pc_tp', 'qc_pc_tp', 'pc_tp'], prefix: '', relaId: 'lid' },
  345. ]);
  346. const curStagePos = stage.readOnly
  347. ? await this.ctx.service.stagePos.getAuditorStageData2(tender.id, stage.id, stage.curTimes, stage.curOrder)
  348. : await this.ctx.service.stagePos.getLastestStageData2(tender.id, stage.id);
  349. sumAssignRelaData(posIndexData, [
  350. {data: curStagePos, fields: ['contract_qty', 'qc_qty'], prefix: '', relaId: 'pid'},
  351. ]);
  352. }
  353. return [bills, pos];
  354. }
  355. async _loadStageLedgerData(tender, filter) {
  356. return filter.type === 'stage'
  357. ? await this._loadStageData(tender, filter.stage)
  358. : await this._loadStagesData(tender, filter.stages, filter.preStage, filter.endStage);
  359. }
  360. async _loadStagePayData(tender, stage) {
  361. if (!stage) return [];
  362. const dealPay = await this.ctx.service.stagePay.getStagePays(stage);
  363. if (!stage.readOnly) {
  364. // 计算 本期金额
  365. const PayCalculator = require('../lib/pay_calc');
  366. const payCalculator = new PayCalculator(this.ctx, stage, tender.info);
  367. await payCalculator.calculateAll(dealPay);
  368. }
  369. return dealPay;
  370. }
  371. async _loadStagesPayData(tender, stages, preStage, endStage) {
  372. // todo
  373. return [];
  374. }
  375. async _loadPayData(tender, filter) {
  376. return filter.type === 'stage'
  377. ? await this._loadStagePayData(tender, filter.stage)
  378. : await this._loadStagesPayData(tender, filter.stage, filter.preStage, filter.endStage);
  379. }
  380. async _loadStageJgclData(tender, stage) {
  381. if (!stage) return [];
  382. const data = await this.ctx.service.stageJgcl.getStageData(stage);
  383. const preData = stage.preCheckedStage ? await this.ctx.service.stageJgcl.getEndStageData(stage.tid, stage.preCheckedStage.order) : [];
  384. for (const d of data) {
  385. const pd = this.ctx.helper._.find(preData, {uuid: d.uuid});
  386. if (pd) {
  387. d.pre_arrive_qty = pd.arrive_qty;
  388. d.pre_arrive_tp = pd.arrive_tp;
  389. d.pre_deduct_qty = pd.deduct_qty;
  390. d.pre_deduct_tp = pd.deduct_tp;
  391. }
  392. d.end_arrive_qty = this.ctx.helper.add(d.pre_arrive_qty, d.arrive_qty);
  393. d.end_arrive_tp = this.ctx.helper.add(d.pre_arrive_tp, d.arrive_tp);
  394. d.end_deduct_qty = this.ctx.helper.add(d.pre_deduct_qty, d.deduct_qty);
  395. d.end_deduct_tp = this.ctx.helper.add(d.pre_deduct_tp, d.deduct_tp);
  396. }
  397. return data;
  398. }
  399. async _loadStagesJgclData(tender, stages, preStage, endStage) {
  400. // todo
  401. return [];
  402. }
  403. async _loadJgclData(tender, filter) {
  404. return filter.type === 'stage'
  405. ? await this._loadStageJgclData(tender, filter.stage)
  406. : await this._loadStagesJgclData(tender, filter.stages, filter.preStage, filter.endStage);
  407. };
  408. async _loadStageYgclData(tender, stage) {
  409. if (!stage) return [];
  410. const data = await this.ctx.service.stageYjcl.getStageData(stage);
  411. for (const d of data) {
  412. d.end_qty = this.ctx.helper.add(d.pre_qty, d.qty);
  413. d.end_tp = this.ctx.helper.add(d.pre_tp, d.tp);
  414. }
  415. return data;
  416. }
  417. async _loadStagesYgclData(tender, stages, preStage, endStage) {
  418. // todo
  419. return [];
  420. }
  421. async _loadYjclData(tender, filter) {
  422. return filter.type === 'stage'
  423. ? await this._loadStageYgclData(tender, filter.stage)
  424. : await this._loadStagesYgclData(tender, filter.stages, filter.preStage, filter.endStage);
  425. };
  426. async _loadStageBonusData(tender, stage) {
  427. if (!stage) return [];
  428. const data = await this.ctx.service.stageBonus.getEndStageData(tender.id, stage.order);
  429. return data;
  430. }
  431. async _loadStagesBonusData(tender, stages, preStage, endStage) {
  432. // todo
  433. return [];
  434. }
  435. async _loadBonusData(tender, filter) {
  436. return filter.type === 'stage'
  437. ? await this._loadStageBonusData(tender, filter.stage)
  438. : await this._loadStagesBonusData(tender, filter.stages, filter.preStage, filter.endStage);
  439. };
  440. async _loadStageSafeProdData(tender, stage) {
  441. if (!stage) return [];
  442. const data = await this.ctx.service.stageSafeProd.getStageData(stage);
  443. const preData = stage.preCheckedStage ? await this.ctx.service.stageSafeProd.getEndStageData(stage.tid, stage.preCheckedStage.order) : [];
  444. for (const d of data) {
  445. const pd = this.ctx.helper._.find(preData, {uuid: d.uuid});
  446. if (pd) {
  447. d.pre_qty = pd.qty;
  448. d.pre_tp = pd.tp;
  449. }
  450. d.end_qty = this.ctx.helper.add(d.pre_qty, d.qty);
  451. d.end_tp = this.ctx.helper.add(d.pre_tp, d.tp);
  452. }
  453. return data;
  454. }
  455. async _loadStagesSafeProdData(tender, stages, preStage, endStage) {
  456. // todo
  457. return [];
  458. }
  459. async _loadSafeProdData(tender, filter) {
  460. return filter.type === 'stage'
  461. ? await this._loadStageSafeProdData(tender, filter.stage)
  462. : await this._loadStagesSafeProdData(tender, filter.stages, filter.preStage, filter.endStage);
  463. };
  464. async _loadStageTempLandData(tender, stage) {
  465. if (!stage) return [];
  466. const data = await this.ctx.service.stageTempLand.getStageData(stage);
  467. const preData = stage.preCheckedStage ? await this.ctx.service.stageTempLand.getEndStageData(stage.tid, stage.preCheckedStage.order) : [];
  468. for (const d of data) {
  469. const pd = this.ctx.helper._.find(preData, {uuid: d.uuid});
  470. if (pd) {
  471. d.pre_qty = pd.qty;
  472. d.pre_tp = pd.tp;
  473. }
  474. d.end_qty = this.ctx.helper.add(d.pre_qty, d.qty);
  475. d.end_tp = this.ctx.helper.add(d.pre_tp, d.tp);
  476. }
  477. return data;
  478. }
  479. async _loadStagesTempLandData(tender, stages, preStage, endStage) {
  480. // todo
  481. return [];
  482. }
  483. async _loadTempLandData(tender, filter) {
  484. return filter.type === 'stage'
  485. ? await this._loadStageTempLandData(tender, filter.stage)
  486. : await this._loadStagesTempLandData(tender, filter.stages, filter.preStage, filter.endStage);
  487. };
  488. async _loadStageOtherData(tender, stage) {
  489. if (!stage) return [];
  490. const data = await this.ctx.service.stageOther.getStageData(stage);
  491. const preData = stage.preCheckedStage ? await this.ctx.service.stageOther.getEndStageData(stage.tid, stage.preCheckedStage.order) : [];
  492. for (const d of data) {
  493. const pd = this.ctx.helper._.find(preData, {uuid: d.uuid});
  494. if (pd) {
  495. d.pre_tp = pd.tp;
  496. }
  497. d.end_tp = this.ctx.helper.add(d.pre_tp, d.tp);
  498. }
  499. return data;
  500. }
  501. async _loadStagesOtherData(tender, stages, preStage, endStage) {
  502. // todo
  503. return [];
  504. }
  505. async _loadOtherData(tender, filter) {
  506. return filter.type === 'stage'
  507. ? await this._loadStageOtherData(tender, filter.stage)
  508. : await this._loadStagesOtherData(tender, filter.stages, filter.preStage, filter.endStage);
  509. };
  510. async _loadTenderData(tid, filter, stageInfo) {
  511. this.ctx.tender = null;
  512. const tender = await this.ctx.service.tender.checkTender(tid);
  513. const result = { id: tender.id, name: tender.name, category: tender.category };
  514. let stageFilter = null;
  515. for (const f of filter) {
  516. switch (f) {
  517. case 'info':
  518. if (!stageFilter) {
  519. stageFilter = await this._filterStages(tender, stageInfo);
  520. result.stage_filter = stageFilter.filter;
  521. }
  522. result.info = await this._loadInfoData(tender, stageFilter);
  523. break;
  524. case 'ledger':
  525. if (filter.indexOf('stage') < 0) [result.bills, result.pos] = await this._loadLedgerData(tender);
  526. break;
  527. case 'stage':
  528. if (!stageFilter) {
  529. stageFilter = await this._filterStages(tender, stageInfo);
  530. result.stage_filter = stageFilter.filter;
  531. }
  532. [result.bills, result.pos] = await this._loadStageLedgerData(tender, stageFilter);
  533. break;
  534. case 'pay':
  535. if (!stageFilter) {
  536. stageFilter = await this._filterStages(tender, stageInfo);
  537. result.stage_filter = stageFilter.filter;
  538. }
  539. result.pay = await this._loadPayData(tender, stageFilter);
  540. break;
  541. case 'jgcl':
  542. if (!stageFilter) {
  543. stageFilter = await this._filterStages(tender, stageInfo);
  544. result.stage_filter = stageFilter.filter;
  545. }
  546. result.jgcl = await this._loadJgclData(tender, stageFilter);
  547. break;
  548. case 'yjcl':
  549. if (!stageFilter) {
  550. stageFilter = await this._filterStages(tender, stageInfo);
  551. result.stage_filter = stageFilter.filter;
  552. }
  553. result.yjcl = await this._loadYjclData(tender, stageFilter);
  554. break;
  555. case 'bonus':
  556. if (!stageFilter) {
  557. stageFilter = await this._filterStages(tender, stageInfo);
  558. result.stage_filter = stageFilter.filter;
  559. }
  560. result.bonus = await this._loadBonusData(tender, stageFilter);
  561. break;
  562. case 'safeProd':
  563. if (!stageFilter) {
  564. stageFilter = await this._filterStages(tender, stageInfo);
  565. result.stage_filter = stageFilter.filter;
  566. }
  567. result.safeProd = await this._loadSafeProdData(tender, stageFilter);
  568. break;
  569. case 'tempLand':
  570. if (!stageFilter) {
  571. stageFilter = await this._filterStages(tender, stageInfo);
  572. result.stage_filter = stageFilter.filter;
  573. }
  574. result.tempLand = await this._loadTempLandData(tender, stageFilter);
  575. break;
  576. case 'other':
  577. if (!stageFilter) {
  578. stageFilter = await this._filterStages(tender, stageInfo);
  579. result.stage_filter = stageFilter.filter;
  580. }
  581. result.other = await this._loadOtherData(tender, stageFilter);
  582. break;
  583. default:
  584. throw '查询的数据类型未定义';
  585. }
  586. }
  587. return result;
  588. }
  589. async load(ctx) {
  590. try {
  591. const data = JSON.parse(ctx.request.body.data);
  592. const filter = data.filter.split(';');
  593. const result = [];
  594. for (const t of data.tender) {
  595. result.push(await this._loadTenderData(t.tid, filter, t.stageInfo));
  596. }
  597. ctx.body = { err: 0, msg: '', data: result };
  598. } catch (err) {
  599. ctx.log(err);
  600. ctx.ajaxErrorBody(err, '加载数据错误');
  601. }
  602. }
  603. async _getTzData(tid, includePos = false) {
  604. const tender = await this.ctx.service.tender.getTender(tid);
  605. if (!tender || tender.project_id !== this.ctx.session.sessionProject.id) {
  606. throw '不存在该标段';
  607. }
  608. const bills = await this.ctx.service.ledger.getData(tid);
  609. const pos = tender.measure_type === measureType.tz.value || includePos
  610. ? await this.ctx.service.pos.getPosData({tid: tid})
  611. : [];
  612. return { id: tid, name: tender.name, bills: bills, pos: pos };
  613. }
  614. async _checkStage(tid, sorder) {
  615. const stage = await this.service.stage.getDataByCondition({ tid: tid, order: sorder });
  616. if (!stage) throw '期数据错误';
  617. await this.service.stage.doCheckStage(stage);
  618. return stage;
  619. }
  620. async _getStageData(tid, sorder) {
  621. const data = await this._getTzData(tid, true);
  622. const stage = await this._checkStage(tid, sorder);
  623. const bills = await this.ctx.service.stageBills.getAuditorStageData2(tid, stage.id, stage.curTimes, stage.curOrder);
  624. const pos = await this.ctx.service.stagePos.getAuditorStageData2(tid, stage.id, stage.curTimes, stage.curOrder);
  625. data.stage = {
  626. sid: stage.id, sorder: stage.order, curTimes: stage.curTimes, curOrder: stage.curOrder,
  627. bills: bills, pos: pos
  628. };
  629. return data;
  630. }
  631. /**
  632. * 检测台账 页面
  633. *
  634. * @param {Object} ctx - egg全局变量
  635. * @return {void}
  636. */
  637. async checkTz(ctx) {
  638. try {
  639. const renderData = {
  640. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.tools.checkTz)
  641. };
  642. await this.layout('spss/check_tz.ejs', renderData);
  643. } catch (err) {
  644. ctx.helper.log(err);
  645. }
  646. }
  647. /**
  648. * 获取 期计量 汇总 数据(Ajax)
  649. * @param ctx
  650. * @returns {Promise<void>}
  651. */
  652. async loadBaseData(ctx) {
  653. try {
  654. const data = JSON.parse(ctx.request.body.data);
  655. const responseData = {err: 0, msg: '', data: []};
  656. responseData.data = await this._getTzData(data.id);
  657. ctx.body = responseData;
  658. } catch (err) {
  659. ctx.helper.log(err);
  660. ctx.body = this.ajaxErrorBody(err, '查询数据错误');
  661. }
  662. }
  663. }
  664. return SpssController;
  665. };