project_facade.js 8.1 KB

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