project_facade.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. /**
  2. * Created by zhang on 2018/1/26.
  3. */
  4. let mongoose = require('mongoose');
  5. let logger = require("../../../logs/log_helper").logger;
  6. let projectsModel = mongoose.model('projects');
  7. let async_n = require("async");
  8. let _ = require('lodash');
  9. let ration_model = require('../models/ration');
  10. let bill_model = require('../models/bills');
  11. let consts = require('../models/project_consts');
  12. let projectConsts = consts.projectConst;
  13. let ration_glj_model = mongoose.model('ration_glj');
  14. let project_glj_model = mongoose.model('glj_list');
  15. let ration_glj_facade = require("../../ration_glj/facade/ration_glj_facade");
  16. const uuidV1 = require('uuid/v1');
  17. const gljUtil = require('../../../public/gljUtil');
  18. let stdColSettingModel = mongoose.model('std_main_col_lib');
  19. module.exports = {
  20. markUpdateProject:markUpdateProject,
  21. removeProjectMark:removeProjectMark,
  22. updateNodes:updateNodes,
  23. calcInstallationFee:calcInstallationFee,
  24. saveProperty: saveProperty,
  25. getDefaultColSetting: getDefaultColSetting
  26. };
  27. async function calcInstallationFee(data) {
  28. let result={};
  29. let billTasks = generateTasks(data.bills,data.useID);
  30. let rationTasks = generateTasks(data.ration,data.useID);
  31. if(billTasks.length>0){
  32. await bill_model.model.bulkWrite(billTasks);
  33. }
  34. console.log(rationTasks);
  35. if(rationTasks.length>0){
  36. await ration_model.model.bulkWrite(rationTasks);
  37. }
  38. //如果删除定额,需要删除对应的工料机
  39. if(data.ration.delete.length>0){
  40. let rationIDS = _.map(data.ration.delete,'ID');
  41. await ration_glj_model.deleteMany({projectID: data.ration.delete[0].projectID, rationID: {"$in": rationIDS}});//删除定额工料机
  42. }
  43. let rationGLJTasks = [];
  44. let updateList = [];
  45. if(data.ration.update.length>0){//如果有需要更新的定额工料机
  46. for(let ur of data.ration.update){
  47. for(let g of ur.glj){
  48. let gTasks = {
  49. updateOne:{
  50. filter:{
  51. ID:g.ID,
  52. projectID:g.projectID
  53. },
  54. update :{
  55. quantity:g.quantity,
  56. rationItemQuantity:g.rationItemQuantity
  57. }
  58. }
  59. };
  60. rationGLJTasks.push(gTasks);
  61. updateList.push(g);
  62. }
  63. }
  64. }
  65. if(rationGLJTasks.length>0){
  66. await ration_glj_model.bulkWrite(rationGLJTasks);
  67. }
  68. let newGljList = [];
  69. if(data.ration.add.length>0){//新增的安装子目要增加对应的工料机
  70. for(let nr of data.ration.add){
  71. for(let tkey in nr.glj){
  72. newGljList.push(await addInstallationGLJ(nr.glj[tkey]));
  73. }
  74. }
  75. }
  76. if(newGljList.length>0){
  77. await ration_glj_model.insertMany(newGljList);
  78. }
  79. result.update = updateList;
  80. result.add = newGljList;
  81. return result;
  82. }
  83. async function addInstallationGLJ(glj) {
  84. glj.ID = uuidV1();
  85. let info = await ration_glj_facade.getInfoFromProjectGLJ(glj);
  86. let newRecode = ration_glj_facade.createNewRecord(info);
  87. return newRecode;
  88. }
  89. function generateTasks(data,userID) {
  90. let tasks=[];
  91. let deleteInfo={deleted: true, deleteDateTime: new Date(), deleteBy: userID};
  92. if(data.delete && data.delete.length > 0){
  93. for(let bd of data.delete){
  94. let task={
  95. updateOne:{
  96. filter:{
  97. ID:bd.ID,
  98. projectID:bd.projectID
  99. },
  100. update :{
  101. deleteInfo:deleteInfo
  102. }
  103. }
  104. };
  105. tasks.push(task);
  106. }
  107. }
  108. if(data.add && data.add.length > 0){
  109. for(let n_data of data.add){
  110. let task = {
  111. insertOne :{
  112. document:n_data
  113. }
  114. };
  115. tasks.push(task);
  116. }
  117. }
  118. return tasks;
  119. }
  120. async function updateNodes(datas){
  121. let nodeGroups = _.groupBy(datas,'type');
  122. let rationTasks = [];
  123. let billTasks = [];
  124. let rationGLJTasks = [];
  125. let projectGLJTasks = [];
  126. let projectTasks = [];
  127. let asyncTasks = [];
  128. for(let type in nodeGroups){
  129. for(let node of nodeGroups[type]){
  130. if(type == projectConsts.BILLS){
  131. billTasks.push(getTask(node));
  132. }else if(type == projectConsts.RATION){
  133. rationTasks.push(getTask(node));
  134. }else if(type == projectConsts.RATION_GLJ){
  135. rationGLJTasks.push(getTask(node));
  136. }else if(type == projectConsts.PROJECTGLJ){
  137. projectGLJTasks.push(getTask(node,'id'));
  138. }else if(type == projectConsts.PROJECT){
  139. projectTasks.push(getTask(node));
  140. }
  141. }
  142. }
  143. rationTasks.length>0?asyncTasks.push(ration_model.model.bulkWrite(rationTasks)):'';
  144. billTasks.length>0?asyncTasks.push(bill_model.model.bulkWrite(billTasks)):"";
  145. rationGLJTasks.length>0?asyncTasks.push(ration_glj_model.bulkWrite(rationGLJTasks)):"";
  146. projectGLJTasks.length>0?asyncTasks.push(project_glj_model.bulkWrite(projectGLJTasks)):"";
  147. projectTasks.length>0?asyncTasks.push(projectsModel.bulkWrite(projectTasks)):"";
  148. return asyncTasks.length>0?await Promise.all(asyncTasks):"";
  149. function getTask(node,idFiled = 'ID') {
  150. let task={
  151. updateOne:{
  152. filter:{},
  153. update :_.cloneDeep(node.data)
  154. }
  155. };
  156. task.updateOne.filter[idFiled] = node.data[idFiled];//现在复制项目也重新生成一个新的ID了,所以ID是唯一的
  157. delete task.updateOne.update[idFiled];//防止误操作
  158. return task;
  159. }
  160. }
  161. /*function updateNodes(datas,callback) {
  162. let tasks = [];
  163. for(let node of datas){
  164. tasks.push(updateOne(node))
  165. }
  166. async_n.parallel(tasks, function(err, results) {
  167. if (!err){
  168. callback(0, '', results);
  169. }
  170. else{
  171. console.log(err);
  172. callback(1, 'save project failed'+err.message, null);
  173. }
  174. });
  175. function updateOne(node) {
  176. if(node.type == projectConsts.BILLS){
  177. return function (asCallback) {
  178. bill_model.model.findOneAndUpdate({projectID: node.data.projectID, ID: node.data.ID,deleteInfo: null}, node.data,{new: true}, asCallback);
  179. }
  180. }else if(node.type ==projectConsts.RATION){
  181. return function (asCallback) {
  182. ration_model.model.findOneAndUpdate({projectID: node.data.projectID, ID: node.data.ID,deleteInfo: null}, node.data,{new: true}, asCallback);
  183. }
  184. }
  185. }
  186. }*/
  187. //data = {feeRateID:111111,projectID:1245}; type = feeRate
  188. async function markUpdateProject(data,type) {
  189. let tasks=[];
  190. let query = {deleteInfo:null};
  191. let result = null;
  192. if(type=="feeRate"){//更改了费率
  193. query['property.feeFile.id'] = data.feeRateID;
  194. }
  195. if(type=="unitFile"){//更改了单价文件
  196. query['property.unitPriceFile.id'] = data.unitFileID;//unitPriceFile
  197. }
  198. let projects =await projectsModel.find(query);
  199. for(let p of projects){
  200. if(p.ID!=data.projectID){//当前项目不用更新
  201. tasks.push(generateMarkTask(type,p.ID));
  202. }
  203. }
  204. if(tasks.length>0){
  205. result = await projectsModel.bulkWrite(tasks);
  206. }
  207. return result;
  208. }
  209. async function removeProjectMark(projectID) {
  210. return await projectsModel.findOneAndUpdate({ID:projectID},{"$unset":{"changeMark":1}});
  211. }
  212. function generateMarkTask(value,projectID) {
  213. let task = {
  214. updateOne:{
  215. filter:{
  216. ID:projectID
  217. },
  218. update:{
  219. changeMark:value
  220. }
  221. }
  222. };
  223. return task
  224. }
  225. // {projectID: 5, propertyName: 'aaa', propertyValue: 1}
  226. function saveProperty(data, callback){
  227. let obj = {};
  228. let pn = 'property.' + data.propertyName;
  229. obj[pn] = data.propertyValue;
  230. projectsModel.update({"ID": data.projectID}, obj, function (err) {
  231. if (err) {
  232. logger.err(pn + ' save error: ' + err);
  233. callback(err, null)
  234. } else {
  235. logger.info(pn + ' saved.');
  236. callback('', null);
  237. }}
  238. );
  239. }
  240. async function getDefaultColSetting(libID){
  241. return await stdColSettingModel.findOne({ID: libID, deleted: false}, '-_id main_tree_col');
  242. }