pm_controller.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. /**
  2. * Created by Mai on 2017/1/18.
  3. */
  4. import UnitPriceFileModel from "../../glj/models/unit_price_file_model";
  5. let ProjectsData = require('../models/project_model').project;
  6. let labourCoe = require('../../main/facade/labour_coe_facade');
  7. let projType = require('../models/project_model').projType;
  8. let fileType = require('../models/project_model').fileType;
  9. const engineering = require("../../common/const/engineering");
  10. let EngineeringLibModel = require("../../users/models/engineering_lib_model");
  11. let fee_rate_facade = require("../../fee_rates/facade/fee_rates_facade");
  12. let billsModel = require('../../main/models/bills').model;
  13. let rationsModel = require('../../main/models/ration').model;
  14. let projectModel = require("../models/project_schema");
  15. let asyncTool = require('async');
  16. //统一回调函数
  17. let callback = function(req, res, err, message, data){
  18. res.json({error: err, message: message, data: data});
  19. };
  20. module.exports = {
  21. checkRight: function (req, res) {
  22. let data = JSON.parse(req.body.data);
  23. if (data.user_id) {
  24. return data.user_id === req.session.sessionUser.ssoId;
  25. } else {
  26. return false;
  27. }
  28. },
  29. checkProjectRight: function (userId, projectId, callback) {
  30. ProjectsData.getProject(projectId).then(function (result) {
  31. /**
  32. * result._doc.userID(Number): MongoDB
  33. * userId(String): Session.userID
  34. */
  35. if (result._doc.userID == userId && result._doc.projType === projType.tender) {
  36. callback(true);
  37. } else {
  38. callback(false);
  39. }
  40. }).catch(function (err) {
  41. callback(false);
  42. });
  43. },
  44. getProjects: function(req, res){
  45. ProjectsData.getUserProjects(req.session.sessionUser.ssoId, req.session.sessionCompilation._id, function(err, message, projects){
  46. if (projects) {
  47. callback(req, res, err, message, projects);
  48. } else {
  49. callback(req, res, err, message, null);
  50. }
  51. });
  52. },
  53. updateProjects: async function (req, res) {
  54. let data = JSON.parse(req.body.data);
  55. await ProjectsData.updateUserProjects(req.session.sessionUser.ssoId, req.session.sessionCompilation._id, data.updateData, function (err, message, data) {
  56. if (err === 0) {
  57. callback(req, res, err, message, data);
  58. } else {
  59. callback(req, res, err, message, null);
  60. }
  61. });
  62. },
  63. // CSL, 2017-12-14 该方法用于项目属性:提交保存混合型数据,这些数据来自不同的表,包括projects.property、ration、bills、labour_coes.
  64. updateMixDatas: function(req, res){
  65. let datas = JSON.parse(req.body.data).mixDataArr;
  66. let functions = [];
  67. function updateFunc(model, cod, doc) {
  68. return function (cb) {
  69. model.update(cod, doc, cb);
  70. }
  71. };
  72. function updateLC(){
  73. return function (cb) {
  74. datas.labourCoes.updateData.projectID = datas.projectID;
  75. labourCoe.save(datas.labourCoes.updateData, cb);
  76. }
  77. };
  78. // 项目属性
  79. if (Object.keys(datas.properties).length > 0){
  80. // projectModel.update({ID: datas.projectID}, datas.properties, callBackInner);
  81. functions.push(updateFunc(projectModel, {ID: datas.projectID}, datas.properties));
  82. };
  83. // 人工系数
  84. if (datas.labourCoes.updateData){
  85. // datas.labourCoes.updateData.projectID = datas.projectID;
  86. // labourCoe.save(datas.labourCoes.updateData, callBackInner);
  87. functions.push(updateLC());
  88. };
  89. // 清单:每文档doc只存储一条清单,每条清单都必须定位一次文档,无法合并处理
  90. if (datas.bills.length > 0){
  91. for (let bill of datas.bills){
  92. // billsModel.update({projectID: datas.projectID, ID: bill.ID, deleteInfo: null}, bill, callBackInner);
  93. functions.push(updateFunc(billsModel, {projectID: datas.projectID, ID: bill.ID, deleteInfo: null}, bill));
  94. };
  95. };
  96. // 定额:每文档doc只存储一条定额,每条定额都必须定位一次文档,无法合并处理
  97. if (datas.rations.length > 0){
  98. for (let ration of datas.rations){
  99. // rationsModel.update({projectID: datas.projectID, ID: ration.ID, deleteInfo: null}, ration, callBackInner);
  100. functions.push(updateFunc(rationsModel, {projectID: datas.projectID, ID: ration.ID, deleteInfo: null}, ration));
  101. };
  102. };
  103. asyncTool.parallel(functions, function(err, result){
  104. {
  105. if (!err) {
  106. res.json({error: 0, message: err, data: result});
  107. } else {
  108. res.json({error: 1, message: err, data: null});
  109. }
  110. }
  111. });
  112. },
  113. updateFiles: async function(req, res){
  114. let data = JSON.parse(req.body.data);
  115. let updateDatas = data.updateDatas;
  116. await ProjectsData.udpateUserFiles(req.session.sessionUser.ssoId, updateDatas, function (err, message, data) {
  117. callback(req, res, err, message, data);
  118. });
  119. },
  120. copyProjects: function (req, res) {
  121. let data = JSON.parse(req.body.data);
  122. ProjectsData.copyUserProjects(req.session.sessionUser.ssoId, data.updateData, function (err, message, data) {
  123. if (err === 0) {
  124. callback(req, res, err, message, data);
  125. } else {
  126. callback(req, res, err, message, null);
  127. }
  128. });
  129. },
  130. rename: function (req, res) {
  131. let data = JSON.parse(req.body.data);
  132. ProjectsData.rename(req.session.sessionUser.ssoId, req.session.sessionCompilation._id, data, function (err, message) {
  133. callback(req, res, err, message, null);
  134. });
  135. },
  136. getProject: function(req, res){
  137. let data = JSON.parse(req.body.data);
  138. ProjectsData.getUserProject(req.session.sessionUser.ssoId, data.proj_id, async function(err, message, data){
  139. if (err === 0) {
  140. let engineeringLibModel = new EngineeringLibModel();
  141. let engineeringInfo = data !== null && data.property.engineering_id !== undefined ?
  142. await engineeringLibModel.getEngineering(data.property.engineering_id) : null;
  143. let strData = JSON.stringify(data);
  144. let projInfo = JSON.parse(strData);
  145. if (engineeringInfo !== null) {
  146. projInfo.engineeringInfo = engineeringInfo;
  147. }
  148. callback(req, res, err, message, projInfo);
  149. } else {
  150. callback(req, res, err, message, null);
  151. }
  152. });
  153. },
  154. beforeOpenProject: function (req, res) {
  155. let data = JSON.parse(req.body.data);
  156. ProjectsData.beforeOpenProject(req.session.sessionUser.ssoId, data.proj_id, data.updateData, function (err, message, data) {
  157. callback(req, res, err, message, data);
  158. });
  159. },
  160. getNewProjectID: function (req, res) {
  161. let data = JSON.parse(req.body.data);
  162. ProjectsData.getNewProjectID(data.count, function (err, message, data) {
  163. callback(req, res, err, message, data);
  164. });
  165. },
  166. // 项目管理首页
  167. index: async function(request, response) {
  168. // 获取编办信息
  169. let sessionCompilation = request.session.sessionCompilation;
  170. if (sessionCompilation === undefined) {
  171. return response.redirect('/logout');
  172. }
  173. // 清单计价
  174. let billValuation = sessionCompilation.bill_valuation !== undefined ?
  175. sessionCompilation.bill_valuation : [];
  176. // 获取标准库数据
  177. let engineeringLibModel = new EngineeringLibModel();
  178. billValuation = await engineeringLibModel.getLib(billValuation);
  179. // 定额计价
  180. let rationValuation = sessionCompilation.ration_valuation !== undefined ?
  181. sessionCompilation.ration_valuation : [];
  182. rationValuation = await engineeringLibModel.getLib(rationValuation);
  183. let renderData = {
  184. userAccount: request.session.userAccount,
  185. userID: request.session.sessionUser.ssoId,
  186. compilationData: JSON.stringify(sessionCompilation),
  187. billValuation: JSON.stringify(billValuation),
  188. rationValuation: JSON.stringify(rationValuation),
  189. engineeringList: JSON.stringify(engineering.List)
  190. };
  191. response.render('building_saas/pm/html/project-management.html', renderData);
  192. },
  193. // 获取单价文件列表
  194. getUnitFileList: async function(request, response) {
  195. let data = request.body.data;
  196. try {
  197. data = JSON.parse(data);
  198. let projectId = data.parentID !== undefined ? data.parentID : 0;
  199. if (isNaN(projectId) && projectId <= 0) {
  200. throw {msg: 'id数据有误!', err: 1};
  201. }
  202. /*// 获取对应建设项目下所有的单位工程id
  203. let idList = await ProjectsData.getTenderByProjectId(projectId);
  204. if (idList.length <= 0) {
  205. throw {msg: '不存在对应单位工程', err: 0};
  206. }*/
  207. // 获取对应的单价文件
  208. let unitPriceFileModel = new UnitPriceFileModel();
  209. let unitPriceFileData = await unitPriceFileModel.getDataByRootProject(projectId);
  210. if (unitPriceFileData === null) {
  211. throw {msg: '不存在对应单价文件', err: 0};
  212. }
  213. // 整理数据
  214. let unitPriceFileList = [];
  215. for (let unitPriceFile of unitPriceFileData) {
  216. let tmp = {
  217. name: unitPriceFile.name,
  218. id: unitPriceFile.id
  219. };
  220. unitPriceFileList.push(tmp);
  221. }
  222. callback(request, response, 0, '', unitPriceFileList);
  223. } catch (error) {
  224. console.log(error);
  225. let responseData = error.err === 1 ? null : [];
  226. callback(request, response, error.err, error.msg, responseData);
  227. }
  228. },
  229. getFeeRateFileList:async function(request, response) {
  230. let data = request.body.data;
  231. try {
  232. data = JSON.parse(data);
  233. let projectId = data.parentID !== undefined ? data.parentID : 0;
  234. if (isNaN(projectId) && projectId <= 0) {
  235. throw {msg: 'id数据有误!', err: 1};
  236. }
  237. // 获取对应建设项目下所有的单位工程id
  238. let feeRateFileList = await fee_rate_facade.getFeeRatesByProject(projectId);
  239. callback(request, response, 0, '',feeRateFileList );
  240. } catch (error) {
  241. console.log(error);
  242. let responseData = error.err === 1 ? null : [];
  243. callback(request, response, error.err, error.msg, responseData);
  244. }
  245. },
  246. getGCDatas: async function(request, response) {
  247. let userID = request.session.sessionUser.ssoId;
  248. let compilatoinId = request.session.sessionCompilation._id;
  249. let rst = [];
  250. let _projs = Object.create(null), _engs = Object.create(null), prefix = 'ID_';
  251. try{
  252. let gc_unitPriceFiles = await ProjectsData.getGCFiles(fileType.unitPriceFile, userID);
  253. let gc_feeRateFiles = await ProjectsData.getGCFiles(fileType.feeRateFile, userID);
  254. let gc_tenderFiles = await ProjectsData.getGCFiles(projType.tender, userID);
  255. for(let i = 0, len = gc_unitPriceFiles.length; i < len; i++){
  256. let gc_uf = gc_unitPriceFiles[i];
  257. let theProj = _projs[prefix + gc_uf.root_project_id] || null;
  258. if(!theProj){
  259. let tempProj = await ProjectsData.getProjectsByIds(userID, compilatoinId, [gc_uf.root_project_id]);
  260. if(tempProj.length > 0 && tempProj[0].projType !== projType.folder){
  261. theProj = _projs[prefix + gc_uf.root_project_id] = tempProj[0]._doc;
  262. buildProj(theProj);
  263. }
  264. }
  265. if(theProj){
  266. theProj.unitPriceFiles.push(gc_uf);
  267. }
  268. }
  269. for(let i = 0, len = gc_feeRateFiles.length; i < len; i++){
  270. let gc_ff = gc_feeRateFiles[i];
  271. let theProj = _projs[prefix + gc_ff.rootProjectID] || null;
  272. if(!theProj){
  273. let tempProj = await ProjectsData.getProjectsByIds(userID, compilatoinId, [gc_ff.rootProjectID]);
  274. if(tempProj.length > 0 && tempProj[0].projType !== projType.folder){
  275. theProj = _projs[prefix + gc_ff.rootProjectID] = tempProj[0]._doc;
  276. buildProj(theProj);
  277. }
  278. }
  279. if(theProj) {
  280. theProj.feeRateFiles.push(gc_ff);
  281. }
  282. }
  283. if(gc_tenderFiles.length > 0){
  284. for(let i = 0, len = gc_tenderFiles.length; i < len; i++){
  285. let gc_t = gc_tenderFiles[i];
  286. let theEng = _engs[prefix + gc_t.ParentID] || null;
  287. if(!theEng){
  288. let tempEngs = await ProjectsData.getProjectsByIds(userID, compilatoinId, [gc_t.ParentID]);
  289. if(tempEngs.length > 0 && tempEngs[0].projType === projType.engineering){
  290. theEng = _engs[prefix + gc_t.ParentID] = tempEngs[0]._doc;
  291. theEng.children = [];
  292. }
  293. }
  294. if(theEng) {
  295. theEng.children.push(gc_t);
  296. let theProj = _projs[prefix + theEng.ParentID] || null;
  297. if(!theProj){
  298. let tempProj = await ProjectsData.getProjectsByIds(userID, compilatoinId, [theEng.ParentID]);
  299. if(tempProj.length > 0 && tempProj[0].projType === projType.project){
  300. theProj = _projs[prefix + theEng.ParentID] = tempProj[0]._doc;
  301. buildProj(theProj);
  302. }
  303. }
  304. if(theProj) {
  305. let isExist = false;
  306. for(let j = 0, jLen = theProj.children.length; j < jLen; j++){
  307. if(theProj.children[j].ID === theEng.ID){
  308. isExist = true;
  309. break;
  310. }
  311. }
  312. if(!isExist){
  313. theProj.children.push(theEng);
  314. }
  315. }
  316. }
  317. }
  318. }
  319. for(let i in _projs){
  320. rst.push(_projs[i]);
  321. }
  322. function buildProj(proj){
  323. proj.children = [];
  324. proj.unitPriceFiles = [];
  325. proj.feeRateFiles = [];
  326. }
  327. callback(request, response, 0, 'success', rst);
  328. }
  329. catch (error){
  330. callback(request, response, true, error, null);
  331. }
  332. },
  333. recGC: function(request, response){
  334. let userID = request.session.sessionUser.ssoId;
  335. let data = JSON.parse(request.body.data);
  336. let nodes = data.nodes;
  337. ProjectsData.recGC(userID, nodes, function (err, msg, data) {
  338. callback(request, response, err, msg, data);
  339. });
  340. }
  341. };