material_replace_facade.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. /**
  2. * Created by zhang on 2018/8/22.
  3. */
  4. import mongoose from "mongoose";
  5. const uuidV1 = require('uuid/v1');
  6. let moment = require("moment");
  7. let compilationModel = mongoose.model("compilation");
  8. let materialLibModel = mongoose.model("std_material_replace_lib");
  9. let replaceBillModel = mongoose.model("std_replace_bills");
  10. let replaceMaterialModel = mongoose.model("std_replace_material");
  11. let StdBillsLib = mongoose.model('std_bills_lib_list');
  12. let stdBillsModel = mongoose.model('std_bills_lib_bills');
  13. let stdGLJMode = mongoose.model('std_glj_lib_gljList');
  14. const stdGljLibModel = mongoose.model('std_glj_lib_map');
  15. let materialReplaceLib = {
  16. findByCondition:async function(conditions,options,single=true){
  17. if(single == true){
  18. return await materialLibModel.findOne(conditions,options);
  19. }else {
  20. return await materialLibModel.find(conditions,options);
  21. }
  22. },
  23. addLib : async function (data){
  24. let now = new Date().getTime();
  25. let dateStr = moment(now).format('YYYY-MM-DD HH:mm:ss');
  26. //取编办信息
  27. let compilation = await compilationModel.findOne({_id:data.compilationId});
  28. //取清单规则信息
  29. let billLib = await StdBillsLib.findOne({billsLibId:data.billsLibId});
  30. if(compilation && billLib){
  31. let newLib = {
  32. creator: data.userAccount,
  33. createDate: now,
  34. recentOpr: [{operator: data.userAccount, operateDate: dateStr}],
  35. name: data.name,
  36. compilationId: data.compilationId,
  37. compilationName: compilation.name,
  38. billsLibId:billLib.billsLibId,
  39. billsLibName:billLib.billsLibName,
  40. deleted: false
  41. };
  42. newLib.ID = uuidV1();
  43. return await materialLibModel.create(newLib);
  44. }else {
  45. throw new Error("编办或清单规则有误!");
  46. }
  47. },
  48. saveLib:async function(param) {
  49. return await materialLibModel.findOneAndUpdate(param.query,param.data,{new:true});
  50. },
  51. deleteLibByID:async function(ID){
  52. //删除材料数据
  53. await replaceMaterialModel.deleteMany({libID:ID});
  54. //删除清单数据
  55. await replaceBillModel.deleteMany({libID:ID});
  56. return await materialLibModel.deleteOne({ID:ID});
  57. },
  58. findGLJLibByComID:async function(compilationId){//跟据费用定额查找工料机库
  59. return await stdGljLibModel.findOne({compilationId:compilationId},['ID']);
  60. },
  61. findBillsByLibID:async function(libID){
  62. return await replaceBillModel.find({libID:libID});
  63. },
  64. saveBills:async function(data){
  65. let [addList,updateList,deleteList] = prepareDatas(data);
  66. let p = await Promise.all([addBills(addList),updateBills(updateList),deleteBills(deleteList)]);
  67. return p;
  68. },
  69. saveMaterial:async function(data){
  70. let [addList,updateList,deleteList] = prepareDatas(data);
  71. let p = await Promise.all([addMaterial(addList),replaceMaterial(updateList),deleteMaterial(deleteList)]);
  72. return p;
  73. },
  74. getMaterialByBillsID : async function(billsID){
  75. return await replaceMaterialModel.find({billsItemID:billsID});
  76. },
  77. getStdBillsByLib:async function(libID){
  78. let bills = await stdBillsModel.find({billsLibId: libID},['ID','code','name','items']);
  79. return bills;
  80. }
  81. };
  82. function prepareDatas(data) {//整理数据
  83. let addList = [],updateList =[],deleteList=[];
  84. for(let d of data){
  85. if(d.type == 'add') addList.push(d);
  86. if(d.type == 'update') updateList.push(d);
  87. if(d.type == 'delete') deleteList.push(d);
  88. }
  89. return [addList,updateList,deleteList]
  90. }
  91. async function addMaterial(datas) {
  92. let newMaterial = [],missCodes=[];
  93. for(let d of datas){
  94. let stdGLJ = await stdGLJMode.findOne({repositoryId:d.gljLibID,code:d.code});
  95. if(stdGLJ){
  96. let temM = {
  97. libID:d.libID,
  98. billsItemID:d.billsItemID,
  99. code:d.code,
  100. name:stdGLJ.name,
  101. specs:stdGLJ.specs,
  102. type:stdGLJ.gljType,
  103. unit:stdGLJ.unit
  104. };
  105. temM.ID = uuidV1();
  106. newMaterial.push(temM);
  107. }else {
  108. missCodes.push(d.code);
  109. }
  110. }
  111. if(newMaterial.length>0){
  112. await replaceMaterialModel.create(newMaterial);
  113. }
  114. return {type:'add',list:newMaterial,missCodes:missCodes};
  115. }
  116. async function replaceMaterial(datas) {
  117. let tasks = [],list=[],missCodes = [];
  118. for(let d of datas){
  119. let stdGLJ = await stdGLJMode.findOne({repositoryId:d.gljLibID,code:d.code});
  120. if(stdGLJ){
  121. let updateData = {code:d.code, name:stdGLJ.name, specs:stdGLJ.specs, type:stdGLJ.gljType, unit:stdGLJ.unit};
  122. let task = {
  123. updateOne:{filter:{ID:d.ID}, update :updateData}
  124. };
  125. tasks.push(task);
  126. list.push({ID:d.ID,updateData:updateData})
  127. }else {
  128. missCodes.push(d.code)
  129. }
  130. }
  131. if(tasks.length > 0) await replaceMaterialModel.bulkWrite(tasks);
  132. return {type:'update',list:list,missCodes:missCodes};
  133. }
  134. async function deleteMaterial(datas) {
  135. let IDList = [];
  136. for(let d of datas){
  137. if(d.ID) IDList.push(d.ID);
  138. }
  139. await replaceMaterialModel.deleteMany({ID:{"$in": IDList}});
  140. return {type:'delete',list:IDList};
  141. }
  142. async function addBills(datas) {
  143. let newBills = [],missCodes=[];
  144. for(let d of datas){
  145. //先查找清单规则库找到对应的清单
  146. let stdBill = await stdBillsModel.findOne({billsLibId:d.billsLibId,code:d.code});
  147. if(stdBill){
  148. let temBill = {
  149. libID:d.libID,
  150. code:d.code,
  151. name:stdBill.name,
  152. };
  153. temBill.ID = uuidV1();
  154. newBills.push(temBill);
  155. }else {
  156. missCodes.push(d.code);
  157. }
  158. }
  159. if(newBills.length>0){
  160. await replaceBillModel.create(newBills);
  161. }
  162. return {type:'add',list:newBills,missCodes:missCodes};
  163. }
  164. async function updateBills(datas) {
  165. let tasks = [],list=[],missCodes = [];
  166. for(let d of datas){
  167. let updateData = null;
  168. let filter = {libID:d.libID, code:d.oldCode};
  169. if(d.newCode && d.newCode !=''){//说明是要替换清单
  170. let stdBill = await stdBillsModel.findOne({billsLibId:d.billsLibId,code:d.newCode});
  171. if(stdBill){
  172. updateData = {code:d.newCode, name:stdBill.name};
  173. }else {
  174. missCodes.push(d.newCode);
  175. }
  176. }else {
  177. updateData = d.updateData;
  178. }
  179. if(updateData){
  180. let task = {
  181. updateOne:{filter:filter, update :updateData}
  182. };
  183. tasks.push(task);
  184. list.push({code:d.oldCode,updateData:updateData})
  185. }
  186. }
  187. if(tasks.length > 0) await replaceBillModel.bulkWrite(tasks);
  188. return {type:'update',list:list,missCodes:missCodes};
  189. }
  190. async function deleteBills(datas) {
  191. let IDList = [];
  192. for(let d of datas){
  193. if(d.ID) IDList.push(d.ID)
  194. }
  195. await replaceMaterialModel.deleteMany({billsItemID:{"$in": IDList}});//删除清单时要把对应的材料也删除了
  196. await replaceBillModel.deleteMany({ID:{"$in": IDList}});
  197. return {type:'delete',list:IDList};
  198. }
  199. export default materialReplaceLib