equipment_purchase_facade.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. module.exports={
  2. getData:getData,
  3. insertData:insertData,
  4. deleteEquipment:deleteEquipment,
  5. updateEquipments:updateEquipments,
  6. getEquipmentTotalCost:getEquipmentTotalCost,
  7. getEquipmentSummary:getEquipmentSummary
  8. };
  9. let mongoose = require('mongoose');
  10. let equipmentPurchaseModel = mongoose.model("equipment_purchase");
  11. let consts = require('../../main/models/project_consts');
  12. let decimal_facade = require('../../main/facade/decimal_facade');
  13. const scMathUtil = require('../../../public/scMathUtil').getUtil();
  14. let _ = require('lodash')
  15. //返回 ID - total 映射如: {2566:60}
  16. async function getEquipmentTotalCost(projectIDs) {
  17. let decimal =2;
  18. let totalMap ={};
  19. if(projectIDs.length > 0){
  20. let decimalObject =await decimal_facade.getProjectDecimal(projectIDs[0]);
  21. if(decimalObject&&decimalObject.glj&&decimalObject.glj.unitPrice)decimal = decimalObject.glj.unitPrice;
  22. let equipments = await equipmentPurchaseModel.find({projectID:{$in: projectIDs}}).lean();
  23. for(let e of equipments){
  24. let total =e.total?scMathUtil.roundForObj(e.total,decimal):0;
  25. totalMap[e.projectID] = total;
  26. }
  27. }
  28. return totalMap;
  29. }
  30. function sortEquipments(equipments) {
  31. let IDMap = {};
  32. let parentMap = {};
  33. equipments = _.sortBy(equipments,'seq');
  34. for(let d of equipments){
  35. IDMap[d.ID] = d;
  36. parentMap[d.ParentID] ?parentMap[d.ParentID].push(d):parentMap[d.ParentID]=[d];
  37. }
  38. let treeData = [];
  39. let roots = parentMap['-1'];
  40. getChildren(roots,treeData);
  41. return treeData;
  42. function getChildren(nodes,data){
  43. if(nodes){
  44. for(let n of nodes){
  45. data.push(n);
  46. getChildren(parentMap[n.ID],data)
  47. }
  48. }
  49. }
  50. }
  51. async function getEquipmentSummary(projectIDs) {
  52. let data = [];
  53. if (projectIDs.length > 0) {
  54. let map = {};
  55. let equipments = await equipmentPurchaseModel.find({projectID:{$in: projectIDs}}).lean();
  56. for (let e of equipments) {
  57. e.equipments = sortEquipments(e.equipments);
  58. map[e.projectID] = e;
  59. }
  60. for (let projectID of projectIDs ) {
  61. /*
  62. if(map[projectID]) data.push(map[projectID]);
  63. /*/
  64. // 以下是根据实际来调整
  65. if(map[projectID]) {
  66. for (let item of map[projectID].equipments) {
  67. let dtlData = {projectID: -1, total: 0, equipSummaryType: 'budget_equipment'};
  68. // 属性summaryType是作为一个判断依据给后来代码用
  69. dtlData.projectID = projectID;
  70. dtlData.total = item.total;
  71. for (let key in item) {
  72. dtlData[key] = item[key];
  73. }
  74. data.push(dtlData);
  75. }
  76. }
  77. //*/
  78. }
  79. }
  80. return data;
  81. }
  82. function getPreUpdate (pre, doc){
  83. const update = {};
  84. for (const key in doc) {
  85. update[`${pre}.${key}`] = doc[key];
  86. }
  87. return update;
  88. };
  89. async function deleteEquipment(projectID,ID){
  90. await equipmentPurchaseModel.update({projectID},{'$pull':{equipments:{ ID }}});
  91. }
  92. async function insertData (projectID,data){
  93. await equipmentPurchaseModel.update({projectID},{'$push':{equipments:{ $each: data }}});
  94. return data
  95. }
  96. async function updateEquipments (projectID,updateData,total){
  97. let tasks = [];
  98. if(total !== undefined || total !== null) tasks.push({updateOne :{filter:{projectID},update:{$set:{total:total}}}});
  99. for(let data of updateData){
  100. if(data.type === 'insert' ){
  101. tasks.push({updateOne:{ filter:{projectID},update:{'$push':{equipments:{ $each: data.documents }}}}})
  102. }else if(data.type === 'delete' ){
  103. tasks.push({updateOne:{ filter:{projectID},update:{'$pull':{equipments:{ ID: data.ID }}}}})
  104. } else {
  105. let task = {updateOne : {
  106. filter:{projectID,'equipments.ID':data.ID},
  107. update:{$set:getPreUpdate('equipments.$',data.doc)}
  108. }}
  109. tasks.push(task)
  110. }
  111. }
  112. if(tasks.length > 0) await equipmentPurchaseModel.bulkWrite(tasks);
  113. return updateData
  114. }
  115. function getData(projectID, callback) {
  116. equipmentPurchaseModel.findOne({'projectID': projectID}).lean().exec((err, data) => {
  117. if (err) {
  118. callback(1, '', null);
  119. } else {
  120. callback(0, consts.projectConst.EQUIPMENT_PURCHASE, data);
  121. }
  122. })
  123. }