divide_facade.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. module.exports = {
  2. getData: getData,
  3. updateItem:updateItem,
  4. updateCoeAdjust:updateCoeAdjust
  5. };
  6. let mongoose = require('mongoose');
  7. let divideModel = mongoose.model("divide_setting");
  8. let consts = require('../models/project_consts');
  9. let calculate_facade = require("../../ration_glj/facade/glj_calculate_facade");
  10. let ration_glj_facade = require("../../ration_glj/facade/ration_glj_facade");
  11. let projectConsts = consts.projectConst;
  12. const uuidV1 = require('uuid/v1');
  13. async function updateItem(data){
  14. let ID = data.ID;
  15. let tasks= [];
  16. let udatas = [];
  17. let proportioRationID = null;
  18. for(let u of data.updateDatas){
  19. if(u.type == 'add'){
  20. tasks.push({updateOne: {filter: {ID: ID}, update: {"$push":{divideList:u.doc} }}});
  21. }
  22. if(u.type == "update"){
  23. let ndoc = {};
  24. let pre = "divideList.$."
  25. if(u.model) pre= u.model+".$.";
  26. for(let key in u.doc){
  27. ndoc[pre+key] = u.doc[key]
  28. }
  29. if(u.model){//改定额工料机的自定消耗或者子目换算时,要重算消耗量,所以就不走task流程了,另外算
  30. let query = {"ID": ID};
  31. query[u.model+".ID"] = u.ID;
  32. if(u.updateProportion == true){//更新稳定土的时候要先把所有定额工料机更新后,再计算消耗量,所以放在builkWrite后面
  33. tasks.push({updateOne: {filter: query, update: ndoc}});
  34. proportioRationID = u.rationID;
  35. }else{
  36. await divideModel.update(query,ndoc);
  37. //重新计算消耗量
  38. let [ntasks,ndatas] = await calculate_facade.calculateQuantityFromDivide(ID,u.rationID);
  39. if(ntasks.length > 0) tasks = tasks.concat(ntasks);
  40. if(ndatas.length > 0) udatas = udatas.concat(ndatas);
  41. }
  42. }else if(u.updateAss == true){//修改辅助定额
  43. await divideModel.update({"ID": ID,"divideList.ID":u.ID},ndoc);
  44. let [ntasks,ndatas] = await calculate_facade.calculateQuantityFromDivide(ID,u.ID);
  45. if(ntasks.length > 0) tasks = tasks.concat(ntasks);
  46. if(ndatas.length > 0) udatas = udatas.concat(ndatas);
  47. }else{
  48. tasks.push({updateOne: {filter: {"ID": ID,"divideList.ID":u.ID}, update: ndoc}});
  49. }
  50. }
  51. if(u.type == "delete"){
  52. tasks.push({updateOne: {filter: {ID: ID}, update: {"$pull":{divideList:{ID:u.ID}} }}});
  53. if(u.itemType == "定额"){
  54. await divideModel.update(
  55. {ID:ID},
  56. { $pull: {ration_gljs:{rationID:u.ID},ration_coes:{rationID:u.ID}}},
  57. { multi: true })
  58. }
  59. }
  60. }
  61. if(tasks.length > 0) await divideModel.bulkWrite(tasks);
  62. if(udatas.length > 0) data.updateDatas = data.updateDatas.concat(udatas);
  63. if(proportioRationID!=null){//说明更新了稳定土
  64. let [ptasks,pdatas] = await calculate_facade.calculateQuantityFromDivide(ID,proportioRationID);
  65. if(ptasks.length > 0) await divideModel.bulkWrite(ptasks);
  66. if(pdatas.length > 0) data.updateDatas = data.updateDatas.concat(pdatas);
  67. }
  68. return data;
  69. }
  70. async function updateCoeAdjust(data,compilation){
  71. let replace = [],projectGLJList=[],ration_gljs=[];
  72. let result = {updateDatas:[]}
  73. let ndoc = {};
  74. let pre = "ration_coes.$."
  75. for(let key in data.doc){
  76. ndoc[pre+key] = data.doc[key]
  77. }
  78. await divideModel.update({ID:data.divideID,"ration_coes.ID":data.ID},ndoc);
  79. result.updateDatas.push({ID:data.ID,type:'update',model:'ration_coes',doc:data.doc});
  80. //添加单个工料机的情况
  81. if (data.add.length > 0){
  82. let [tg,pl] = await ration_glj_facade.insertAddTypeGLJ(data.add,compilation,false);
  83. await divideModel.update({ID:data.divideID},{$push:{ration_gljs:{$each:tg}}});
  84. ration_gljs = ration_gljs.concat(tg);
  85. if(pl.length > 0) projectGLJList = projectGLJList.concat(pl);
  86. }
  87. //删除的情况
  88. if(data.delete.length > 0){
  89. await divideModel.update({ID:data.divideID},{$pull:{ration_gljs:{$in: data.delete}}});
  90. }
  91. //替换工料机的情况
  92. if (data.replace.length > 0){
  93. let rationGLJlist = await getRationGLJs(data.divideID,data.rationID);
  94. for(let r of data.replace){
  95. let ration_glj_ID = r.ID;
  96. if(data.toCommercial == true) ration_glj_ID = r.originalID;
  97. let r_result = await ration_glj_facade.replaceGLJByData(r,compilation,false,rationGLJlist);
  98. let rdoc = {};
  99. for(let key in r_result.data){
  100. rdoc[pre+key] = result.data[key]
  101. }
  102. //修改定额工料机
  103. await divideModel.update({ID:data.divideID,"ration_gljs.ID":ration_glj_ID},rdoc);
  104. result.updateDatas.push({ID:data.ID,type:'update',model:'ration_gljs',doc:r_result.data});
  105. projectGLJList.push(r_result.projectGLJ);
  106. //新增定额工料机
  107. if(r_result.newRecodes.length > 0){
  108. await divideModel.update({ID:data.divideID},{$push:{ration_gljs:{$each:r_result.newRecodes}}});
  109. ration_gljs = ration_gljs.concat(r_result.newRecodes);
  110. }
  111. //删除定额工料机
  112. if(r_result.deleteList.length > 0){
  113. await divideModel.update({ID:data.divideID},{$pull:{ration_gljs:{$in: r_result.deleteList}}});
  114. data.delete = data.delete.concat(r_result.deleteList);
  115. }
  116. }
  117. }
  118. let [ptasks,pdatas] = await calculate_facade.calculateQuantityFromDivide(data.divideID,data.rationID);
  119. if(ptasks.length > 0) await divideModel.bulkWrite(ptasks);
  120. if(pdatas.length > 0) result.updateDatas = result.updateDatas.concat(pdatas);
  121. result.ration_gljs= ration_gljs;
  122. result.projectGLJList = projectGLJList;
  123. result.delete = data.delete;
  124. return result;
  125. }
  126. async function getRationGLJs(divideID,rationID){
  127. let gljList = [];
  128. let divide_setting = await divideModel.findOne({ID:divideID}).lean();
  129. for(let rg of divide_setting.ration_gljs){
  130. if(rg.rationID == rationID) gljList.push(rg);
  131. }
  132. return gljList;
  133. }
  134. function getData(projectID, callback) {
  135. divideModel.findOne({projectID: projectID}, '-_id', async function (err, datas) {
  136. if (!err) {
  137. // 旧项目没有人工系数文件,默认给它生成一个。
  138. if (!datas) {
  139. datas = {
  140. ID: uuidV1(),
  141. projectID:projectID,
  142. divideList:[],
  143. ration_gljs:[],
  144. ration_coes:[]
  145. }
  146. await divideModel.create(datas);
  147. callback(0, projectConsts.DIVIDE_SETTING, datas);
  148. } else {
  149. callback(0, projectConsts.DIVIDE_SETTING, datas);
  150. };
  151. } else {
  152. callback(1, projectConsts.DIVIDE_SETTING, null);
  153. };
  154. });
  155. }