datacollect_controller.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author EllisRan
  6. * @date 2021/9/26
  7. * @version
  8. */
  9. const tenderConst = require('../const/tender');
  10. const codeRuleConst = require('../const/code_rule');
  11. const settingConst = require('../const/setting.js');
  12. const tenderMenu = require('../../config/menu').tenderMenu;
  13. const auditConst = require('../const/audit');
  14. const shenpiConst = require('../const/shenpi');
  15. const accountGroup = require('../const/account_group').group;
  16. const accountPermission = require('../const/account_permission');
  17. const measureType = require('../const/tender').measureType;
  18. const billsPosConvert = require('../lib/bills_pos_convert');
  19. const path = require('path');
  20. const sendToWormhole = require('stream-wormhole');
  21. const scheduleConst = require('../const/schedule');
  22. const changeConst = require('../const/change');
  23. const tenderInfoModel = require('../lib/tender_info');
  24. const projectSettingConst = require('../const/project_setting');
  25. const mapConst = require('../const/map');
  26. module.exports = app => {
  27. class DatacollectController extends app.BaseController {
  28. /**
  29. * 构造函数
  30. *
  31. * @param {Object} ctx - egg全局变量
  32. * @return {void}
  33. */
  34. constructor(ctx) {
  35. super(ctx);
  36. ctx.showProject = true;
  37. ctx.showTitle = true;
  38. }
  39. /**
  40. * 期列表(Get)
  41. * @param ctx
  42. * @return {Promise<void>}
  43. */
  44. async index(ctx) {
  45. try {
  46. if (!ctx.subProject.showDataCollect) {
  47. throw '该功能已关闭或无法查看';
  48. }
  49. // 获取标段审批信息
  50. const dcTenders = await ctx.service.datacollectTender.getList(ctx.session.sessionProject.id, ctx.subProject.id);
  51. const noTids = ctx.app._.map(dcTenders, 'tid');
  52. let tenderList = await ctx.service.tender.getList('', null, 1);
  53. tenderList = ctx.app._.filter(tenderList, function(item) {
  54. return ctx.app._.indexOf(noTids, item.id) === -1;
  55. });
  56. const tenderidList = ctx.helper._.map(tenderList, 'id');
  57. // 获取分类
  58. const categoryData = await this.ctx.service.category.getListByCategoryLevel(ctx.subProject.id);
  59. // 默认坐标,否则则取办事处坐标
  60. const projectData = await ctx.service.project.getDataById(ctx.session.sessionProject.id);
  61. ctx.subProject.data_collect_pages = ctx.subProject.data_collect_pages ? ctx.subProject.data_collect_pages.split(',') : [];
  62. // 判断ctx.subProject.data_collect_pages如果只有7或者只有8或者只有7,8,则不用获取其它数据
  63. const pages = ctx.subProject.data_collect_pages;
  64. const only_cost =
  65. (pages.length === 1 && (pages[0] === '7' || pages[0] === '8')) ||
  66. (pages.length === 2 &&
  67. pages.includes('7') &&
  68. pages.includes('8'));
  69. let noticeList = [];
  70. if (!only_cost) {
  71. noticeList = await ctx.service.noticePush.getNoticeByDataCollect(ctx.session.sessionProject.id, tenderidList);
  72. }
  73. if (ctx.params.index) {
  74. ctx.subProject.data_collect = parseInt(ctx.params.index);
  75. ctx.session.sessionSubProj = {
  76. data_collect: ctx.subProject.data_collect,
  77. };
  78. } else {
  79. ctx.session.sessionSubProj = {
  80. data_collect: ctx.subProject.data_collect,
  81. };
  82. }
  83. // const is_cost = ctx.subProject.data_collect_pages.includes('7') && ctx.subProject.data_collect === 7;
  84. const is_dz2 = ['P0505', 'P0506', 'P1201', 'P1202', 'GY18Y', 'GYJJ1', 'P1103', 'KLG25', 'I2U5B', 'SEN48'].indexOf(ctx.session.sessionProject.code) !== -1
  85. && ctx.subProject.data_collect_pages.includes('6') && ctx.subProject.data_collect === 6;
  86. const is_dzcb = ['P0505', 'P0506', 'P1201', 'P1202', 'P1002', 'GY18Y', 'Y3T2Q'].indexOf(ctx.session.sessionProject.code) !== -1 && ctx.subProject.data_collect_pages.includes('7') && ctx.subProject.data_collect === 7;// 成本管理定制大屏
  87. const is_dztz = ['P0505', 'P0506', 'P1201', 'P1202', 'P1002', 'Y3T2Q'].indexOf(ctx.session.sessionProject.code) !== -1 && ctx.subProject.data_collect_pages.includes('8') && ctx.subProject.data_collect === 8;// 投资总控定制大屏
  88. // const shj_url = 'http://112.74.42.187:3300/#/project/viewer?projectId=b03i54j0j8ai';
  89. const renderData = {
  90. projectData,
  91. noticeList,
  92. categoryData,
  93. // map_json,
  94. acLedger: auditConst.ledger,
  95. acStage: auditConst.stage,
  96. acChange: auditConst.flow,
  97. acRevise: auditConst.revise,
  98. acMaterial: auditConst.material,
  99. acAdvance: auditConst.advance,
  100. pushType: auditConst.pushType,
  101. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.datacollect.index),
  102. // shj_url,
  103. };
  104. if (is_dzcb) {
  105. await this.layout('datacollect/index_cost.ejs', renderData);
  106. } else if (is_dztz) {
  107. await this.layout('datacollect/index_tz.ejs', renderData);
  108. } else if (is_dz2) {
  109. // 判断并更新common_json
  110. if (!ctx.subProject.common_json) {
  111. ctx.subProject.common_json = await ctx.service.subProject.updateCommonJsonDaping06(ctx.subProject, projectData);
  112. }
  113. const commonJson = ctx.subProject.common_json ? JSON.parse(ctx.subProject.common_json) : null;
  114. renderData.daping06Set = commonJson && commonJson.daPing06_set ? commonJson.daPing06_set : ctx.helper._.cloneDeep(projectSettingConst.daPing06Set);
  115. const glCategory = categoryData.find(item => item.name === '管理类别');
  116. const dpCategory = [];
  117. for (const d of renderData.daping06Set.cb_show) {
  118. if (glCategory && glCategory.value) dpCategory.push(glCategory.value.find(item => item.id === d));
  119. }
  120. renderData.dpCategory = dpCategory;
  121. await this.layout('datacollect/index4GY18Y.ejs', renderData);
  122. // } else if (is_dz3) {
  123. // ctx.redirect(shj_url);
  124. } else {
  125. await this.layout('datacollect/index.ejs', renderData);
  126. }
  127. } catch (err) {
  128. console.log(err);
  129. this.log(err);
  130. ctx.redirect(this.menu.menu.dashboard.url);
  131. }
  132. }
  133. async loadData(ctx) {
  134. try {
  135. const responseData = { err: 0, msg: '', data: {} };
  136. // const tenderidList = [];
  137. // const noticeList = await ctx.service.noticePush.getNoticeByDataCollect(ctx.session.sessionProject.id, tenderidList);
  138. const have_cost = ctx.session.sessionSubProj.data_collect === 7 || ctx.session.sessionSubProj.data_collect === 8;
  139. const thisMonth = new Date();
  140. const [startMonth, endMonth] = ctx.helper.getStartEndMonth(thisMonth);
  141. // 统计方法总时长
  142. // let sumStageByDataCollectTime = 0;
  143. const only_tz = ctx.session.sessionSubProj.data_collect === 8;
  144. if (!only_tz) {
  145. const dcTenders = await ctx.service.datacollectTender.getList(ctx.session.sessionProject.id, ctx.subProject.id);
  146. const noTids = ctx.app._.map(dcTenders, 'tid');
  147. let tenderList = await ctx.service.tender.getList('', null, 1);
  148. // let tenderList = await this.ctx.service.tender.getBuildList('', null, 1);
  149. tenderList = ctx.app._.filter(tenderList, function(item) {
  150. return ctx.app._.indexOf(noTids, item.id) === -1;
  151. });
  152. for (const t of tenderList) {
  153. // 用标段管理的方法获取t数据
  154. await this.ctx.service.tenderCache.loadTenderCache(t, '');
  155. t.total_price = t.ledger_tp && t.ledger_tp.total_price ? t.ledger_tp.total_price : 0;
  156. [t.change_tp, t.change_p_tp, t.change_n_tp, t.change_valuation_tp, t.change_unvaluation_tp] = await ctx.service.change.getChangeTp(t.id);
  157. // t.material_tp = await ctx.service.material.getSumMaterial(t.id);
  158. // 获取本标段 本月计量期审批通过数目,变更令审批通过数目,台账修订通过数目,材料调差通过数目
  159. t.month_stage_num = await ctx.service.stageAudit.getNumByMonth(t.id, startMonth, endMonth);
  160. t.month_change_num = await ctx.service.changeAudit.getNumByMonth(t.id, startMonth, endMonth);
  161. t.month_revise_num = await ctx.service.reviseAudit.getNumByMonth(t.id, startMonth, endMonth);
  162. t.month_material_num = await ctx.service.materialAudit.getNumByMonth(t.id, startMonth, endMonth);
  163. // 获取标段计量月统计及截止月累计计量
  164. // 这个慢,统计下面这个方法时长
  165. const stageList = await ctx.service.stage.getStageByDataCollect(t.id, t.stage_tp);
  166. // const stageList = [];
  167. const month_stage = [];
  168. for (const s of stageList) {
  169. const monthOneStage = ctx.app._.find(month_stage, { yearmonth: s.s_time });
  170. if (monthOneStage) {
  171. monthOneStage.tp = ctx.helper.add(monthOneStage.tp, s.tp);
  172. monthOneStage.end_yf_tp = ctx.helper.add(monthOneStage.end_yf_tp, s.yf_tp);
  173. monthOneStage.end_sf_tp = ctx.helper.add(monthOneStage.end_sf_tp, s.sf_tp);
  174. } else {
  175. const data = {
  176. yearmonth: s.s_time,
  177. tp: s.tp,
  178. end_tp: s.end_tp,
  179. end_yf_tp: s.yf_tp,
  180. end_sf_tp: s.sf_tp,
  181. };
  182. month_stage.push(data);
  183. }
  184. }
  185. t.month_stage = month_stage;
  186. if (have_cost) {
  187. // 取最新已审批完成的成本管理-成本分析期数据
  188. t.cost_analysis = await ctx.service.costStage.getLastCheckedStage(t.id, 'analysis');
  189. t.cost_duty = await ctx.service.costStage.getStageByOrder(t.id, 'duty', 1);
  190. t.stage_num = await ctx.service.stage.getNumByChecked(t.id);
  191. t.cost_ledger_num = await ctx.service.costStage.getNumByChecked(t.id, 'ledger');
  192. t.cost_analysis_num = await ctx.service.costStage.getNumByChecked(t.id, 'analysis');
  193. t.cost_book_num = await ctx.service.costStage.getNumByChecked(t.id, 'book');
  194. }
  195. }
  196. responseData.data.tenderList = tenderList;
  197. }
  198. if (have_cost) {
  199. const data = {};
  200. const budget = await ctx.service.budget.getCurBudget(ctx.subProject.budget_id);
  201. budget.name = ctx.subProject.name || '';
  202. if (!budget) throw '未设置概预算标准';
  203. if (budget.final_id) {
  204. data.final = await ctx.service.budgetFinal.getAllDataByCondition({ where: { final_id: budget.final_id } });
  205. data.finalInfo = await ctx.service.budgetFinalList.getFinal(budget.final_id);
  206. } else {
  207. data.gu = await ctx.service.budgetGu.getData(budget.id);
  208. data.gai = await ctx.service.budgetGai.getData(budget.id);
  209. data.yu = await ctx.service.budgetYu.getData(budget.id);
  210. data.zb = await ctx.service.budgetZb.getData(budget.id);
  211. data.ctrl = await ctx.service.budgetCtrl.getData(budget.id);
  212. data.real = await ctx.service.budgetReal.getData(budget.id);
  213. }
  214. data.info = budget;
  215. responseData.data.budget = data;
  216. }
  217. if (only_tz) {
  218. const commonJson = ctx.subProject.common_json ? JSON.parse(ctx.subProject.common_json) : null;
  219. const daping08Set = commonJson && commonJson.daPing08_set ? commonJson.daPing08_set : ctx.helper._.cloneDeep(projectSettingConst.daPing08Set);
  220. const tenderList = {
  221. 1: {
  222. a: null,
  223. b: null,
  224. // name: '',
  225. // contract_price: 0,
  226. // end_gather_tp: 0,
  227. // end_profit: 0,
  228. },
  229. 2: {
  230. a: null,
  231. b: null,
  232. },
  233. 3: {
  234. a: null,
  235. b: null,
  236. },
  237. 4: {
  238. a: null,
  239. b: null,
  240. },
  241. };
  242. for (const t of daping08Set.tenders) {
  243. tenderList[t.id] = {};
  244. const tendera = t.a ? await ctx.service.tender.getDataById(t.a) : null;
  245. if (tendera) {
  246. await this.ctx.service.tenderCache.loadTenderCache(tendera, '');
  247. tenderList[t.id].a = tendera;
  248. const tenderb = t.b ? await ctx.service.tender.getDataById(t.b) : null;
  249. if (tenderb) {
  250. await this.ctx.service.tenderCache.loadTenderCache(tenderb, '');
  251. tenderList[t.id].b = tenderb;
  252. }
  253. }
  254. }
  255. responseData.data.tenderList = tenderList;
  256. }
  257. // const tenderMapList = await ctx.service.tenderMap.getAllDataByCondition({ where: { tid: tender.id } });
  258. ctx.body = responseData;
  259. } catch (err) {
  260. this.log(err);
  261. ctx.body = { err: 1, msg: err.toString(), data: null };
  262. }
  263. }
  264. }
  265. return DatacollectController;
  266. };