project.js 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /**
  2. * Created by jimiz on 2017/4/16.
  3. */
  4. var billsData = require('./bills');
  5. var rationData = require('./ration');
  6. var ration_glj_data = require('../../ration_glj/facade/ration_glj_facade');
  7. var ration_coe_data = require('../../ration_glj/facade/ration_coe_facade');
  8. var ration_ass_data = require('../../ration_glj/facade/ration_ass_facade');
  9. let ration_installation = require('../facade/ration_installation_facade');
  10. let ration_template = require('../facade/ration_template_facade');
  11. var quantity_detail_data = require('../facade/quantity_detail_facade');
  12. var fee_rate_data = require('../../fee_rates/facade/fee_rates_facade');
  13. let projCounter = require('./proj_counter_model');
  14. let projSetting = require('./proj_setting_model');
  15. // let volumePriceData = require('../../volume_price/models/volume_price_model');
  16. var labour_coe_facade = require('../facade/labour_coe_facade');
  17. var calc_program_facade = require('../facade/calc_program_facade');
  18. const GLJController = require("../../glj/controllers/glj_controller");
  19. let installation_facade = require('../facade/installation_facade');
  20. let pmController = require('../../pm/controllers/pm_controller');
  21. let divide_facade = require('../facade/divide_facade');
  22. let evaluate_facade = require('../facade/evaluate_facade');
  23. let bid_facade = require('../facade/bid_facade');
  24. const commonFacade = require('../../main/facade/common_facade');
  25. const GLJListModel = require("../../glj/models/glj_list_model");
  26. var consts = require('./project_consts');
  27. var projectConsts = consts.projectConst;
  28. var asyncTool = require("async");
  29. var moduleMap = {};
  30. moduleMap[projectConsts.BILLS] = billsData;
  31. moduleMap[projectConsts.RATION] = rationData;
  32. moduleMap[projectConsts.RATION_GLJ] = ration_glj_data;
  33. moduleMap[projectConsts.RATION_COE] = ration_coe_data;
  34. moduleMap[projectConsts.RATION_ASS] = ration_ass_data;
  35. moduleMap[projectConsts.RATION_INSTALLATION] = ration_installation;
  36. moduleMap[projectConsts.QUANTITY_DETAIL] = quantity_detail_data;
  37. moduleMap[projCounter.collectionName] = projCounter;
  38. moduleMap[projSetting.collectionName] = projSetting;
  39. moduleMap[projectConsts.FEERATE] = fee_rate_data;
  40. moduleMap[projectConsts.LABOUR_COE] = labour_coe_facade;
  41. moduleMap[projectConsts.CALC_PROGRAM] = calc_program_facade;
  42. moduleMap[projectConsts.PROJECTGLJ] = new GLJController();
  43. moduleMap[projectConsts.INSTALLATION_FEE] = installation_facade;
  44. moduleMap[projectConsts.RATION_TEMPLATE] = ration_template;
  45. moduleMap[projectConsts.PROJECT_INFO] = pmController;
  46. moduleMap[projectConsts.DIVIDE_SETTING] = divide_facade;
  47. moduleMap[projectConsts.EVALUATE_LIST] = evaluate_facade;
  48. moduleMap[projectConsts.BID_EVALUATION_LIST] = bid_facade;
  49. var Project = function (){};
  50. Project.prototype.datas = [];
  51. Project.prototype.prepare = function(data, callback){
  52. var me = this;
  53. data.update_data.forEach(function(item){
  54. item.user_id = data.user_id;
  55. me.datas.push(item);
  56. /*
  57. to do
  58. moduleMap[item.moduleName].prepare(item.data, jobCallback);
  59. */
  60. });
  61. };
  62. Project.prototype.save = function(datas, callback){
  63. var job, savePoint;
  64. var functions = [];
  65. var item;
  66. var me = this;
  67. me.prepare(datas, function(job, savePoint){});
  68. function saveModule(data) {
  69. return function (cb) {
  70. if(data.moduleName!=undefined){
  71. moduleMap[data.moduleName].save(data.user_id, data.data, cb);
  72. }
  73. // console.log(moduleMap[data.moduleName])
  74. }
  75. }
  76. for (var i = 0; i < me.datas.length; i++){
  77. item = me.datas[i];
  78. functions.push(saveModule(item));
  79. }
  80. asyncTool.parallel(functions, function(err, results) {
  81. if (!err){
  82. callback(null, '', results)
  83. } else{
  84. console.log(err);
  85. callback(1, 'save project failed', null)
  86. }
  87. });
  88. me.datas = [];
  89. };
  90. Project.prototype.getData = function(projectID, callback, isReport, userID){
  91. var functions = [];
  92. var itemName;
  93. let firstTime = +new Date();
  94. for (itemName in moduleMap){
  95. functions.push((function(itemName){
  96. return function (cb) {
  97. moduleMap[itemName].getData(projectID, function(err, moduleName, data){
  98. cb(err, {moduleName: moduleName, data: data})
  99. }, isReport, userID)
  100. }
  101. })(itemName))
  102. }
  103. asyncTool.parallel(functions, function(err, results) {
  104. if (!err){
  105. let lastTime = +new Date();
  106. console.log('最后加载时间---------------'+(lastTime - firstTime));
  107. callback(0, '', results)
  108. }
  109. else{
  110. callback(1, 'load project failed', null)
  111. }
  112. });
  113. };
  114. Project.prototype.getDataSync = function(projectID){
  115. return new Promise((resolve, reject) => {
  116. const functions = [];
  117. const firstTime = +new Date();
  118. for (const itemName in moduleMap){
  119. functions.push((function(itemName){
  120. return function (cb) {
  121. const startTime = +new Date();
  122. moduleMap[itemName].getData(projectID, function(err, moduleName, data){
  123. const endTime = +new Date();
  124. console.log(moduleName+'---------------'+(endTime - startTime));
  125. cb(err, {moduleName: moduleName, data: data})
  126. }, false);
  127. }
  128. })(itemName))
  129. }
  130. asyncTool.parallel(functions, function(err, results) {
  131. if (!err) {
  132. const lastTime = +new Date();
  133. console.log('最后加载时间---------------'+(lastTime - firstTime));
  134. resolve(results);
  135. } else {
  136. reject(err);
  137. }
  138. });
  139. });
  140. };
  141. Project.prototype.getFilterDataSync = function(projectID, filters){
  142. return new Promise((resolve, reject) => {
  143. const functions = [];
  144. for (const moduleName of filters){
  145. if (moduleMap[moduleName]) {
  146. functions.push((function(filterName){
  147. return function (cb) {
  148. moduleMap[filterName].getData(projectID, function(err, fmName, data){
  149. cb(err, {moduleName: fmName, data: data})
  150. }, false);
  151. }
  152. })(moduleName));
  153. } else {
  154. console.log(`有未知模块数据(Project.prototype.getFilterDataSync): ${moduleName} - projectID : ${projectID} - ${(new Date()).toString()}`);
  155. }
  156. }
  157. asyncTool.parallel(functions, function(err, results) {
  158. if (!err) {
  159. resolve(results);
  160. } else {
  161. reject(err);
  162. }
  163. });
  164. });
  165. };
  166. Project.prototype.getFilterData = function (projectID, filter, callback) {
  167. let functions = [];
  168. let getModuleData = function (moduleName) {
  169. return async function (cb) {
  170. if (moduleMap[moduleName]) {
  171. moduleMap[moduleName].getData(projectID, function (err, name, data) {
  172. cb(err, {'moduleName': name, 'data': data})
  173. }, true); // 所有报表只显示调价后的数据,这里传入一个标记true,子方法会将调价后的值赋给调价前的字段,这样报表可以不用动。
  174. } else if (moduleName === projectConsts.PROJECTGLJ) {
  175. try {
  176. if (isNaN(projectID) || projectID <= 0) {
  177. throw '标段id有误';
  178. }
  179. // 获取标段对应的单价文件id
  180. let unitPriceFileId = await commonFacade.getUnitPriceFileId(projectID);
  181. if (unitPriceFileId <= 0) {
  182. throw '没有对应的单价文件';
  183. }
  184. // 先获取对应标段的项目工料机数据
  185. let gljListModel = new GLJListModel();
  186. let [gljList, mixRatioConnectData] = await gljListModel.getListByProjectId(projectID, unitPriceFileId);
  187. cb(null, {'moduleName': moduleName, 'data': gljList});
  188. } catch (error) {
  189. cb(error, null);
  190. }
  191. } else {
  192. throw '要查询的项目模块不存在';
  193. }
  194. }
  195. };
  196. for (let itemName of filter) {
  197. functions.push(getModuleData(itemName));
  198. }
  199. asyncTool.parallel(functions, function (err, results) {
  200. //console.log(results);
  201. if (err) {
  202. throw '获取项目数据出错';
  203. } else {
  204. callback(results);
  205. }
  206. });
  207. };
  208. module.exports = new Project();