installation_facade.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /**
  2. * Created by zhang on 2018/1/31.
  3. */
  4. let mongoose = require('mongoose');
  5. import {installSectionModel,installFeeItemModel} from "../../complementary_ration_lib/models/schemas";
  6. let installationFeeModel = mongoose.model("installation_fee");
  7. let engineeringModel = mongoose.model('engineering_lib');
  8. const uuidV1 = require('uuid/v1');
  9. let consts = require('../../main/models/project_consts');
  10. module.exports={
  11. copyInstallationFeeFromLib:copyInstallationFeeFromLib,
  12. updateInstallationFee:updateInstallationFee,
  13. resetToDefault:resetToDefault,
  14. getData:getData
  15. };
  16. async function updateInstallationFee(projectID,updateData) {
  17. let result = {};
  18. let tasks = generateUpdateTask(projectID,updateData);
  19. if(tasks.length>0){
  20. result =await installationFeeModel.bulkWrite(tasks);
  21. }
  22. return result;
  23. }
  24. function generateUpdateTask(projectID,updateData) {
  25. let tasks = [];
  26. if(updateData){
  27. if(updateData instanceof Array){
  28. for(let ud of updateData){
  29. let [uquery,udoc] = createUpdateQuery(projectID,ud);
  30. let task={
  31. updateOne:{
  32. filter:uquery,
  33. update :udoc
  34. }
  35. };
  36. tasks.push(task);
  37. }
  38. } else {
  39. let [query,doc] = createUpdateQuery(projectID,updateData);
  40. let task={
  41. updateOne:{
  42. filter:query,
  43. update :doc
  44. }
  45. };
  46. tasks.push(task);
  47. }
  48. }
  49. return tasks;
  50. }
  51. function createUpdateQuery(projectID,data) {
  52. let updateKey = data.type+'.ID';
  53. let query = {
  54. projectID:projectID,
  55. ID:data.ID,
  56. };
  57. query[updateKey] = data.itemID;
  58. let udoc = {};
  59. for(let property in data.doc){
  60. udoc[data.type+'.$.'+property] = data.doc[property];
  61. }
  62. return [query,udoc];
  63. }
  64. /*[
  65. {libID:56,ID:123558}
  66. ]*/
  67. async function resetToDefault(projectID,installFees) {
  68. let newInstallFees = [];
  69. for(let inf of installFees){
  70. let newInstallationFee = await getInstallationFeeFromLib(inf.libID);
  71. if(newInstallationFee){
  72. let updateResult = await installationFeeModel.findOneAndUpdate({projectID:projectID,ID:inf.ID},newInstallationFee,{new: true});
  73. newInstallFees.push(updateResult);
  74. }
  75. }
  76. return newInstallFees;
  77. }
  78. async function copyInstallationFeeFromLib(projectID,engineering_id) {
  79. //安装增加费用内嵌文档的方式
  80. let engineering = await engineeringModel.findById(engineering_id);
  81. let ration_lib = engineering.ration_lib;
  82. let installationFeeList = [];
  83. for(let rl of ration_lib){
  84. let newInstallationFee = await getInstallationFeeFromLib(rl.id);
  85. if(newInstallationFee){
  86. newInstallationFee.libID = rl.id;
  87. newInstallationFee.libName = rl.name;
  88. newInstallationFee.projectID = projectID;
  89. newInstallationFee.ID = uuidV1();
  90. installationFeeList.push(newInstallationFee);
  91. }
  92. }
  93. if(installationFeeList.length > 0){
  94. await installationFeeModel.insertMany(installationFeeList);
  95. }
  96. }
  97. async function getInstallationFeeFromLib(libID) {
  98. let installFeeItems = await installFeeItemModel.find({'rationRepId':libID});
  99. let installSections = await installSectionModel.find({'rationRepId':libID});
  100. let positionMap = {};
  101. let create = false;
  102. let newInstallationFee={};
  103. if(installFeeItems && installFeeItems.length > 0) {//费用项
  104. create = true;
  105. let tem_installFeeItem = [];
  106. for(let ifee of installFeeItems){
  107. let tem_fee ={
  108. feeItem:ifee.feeItem,
  109. feeType:ifee.feeType,
  110. position:ifee.position,
  111. ID:ifee.ID
  112. };
  113. positionMap[ifee.ID] = ifee.position;//设置选取位置对应表,为给规项赋值
  114. tem_installFeeItem.push(tem_fee);
  115. }
  116. newInstallationFee.installFeeItem = tem_installFeeItem;
  117. }
  118. if(installSections && installSections.length > 0){//章节项
  119. create = true;
  120. let tem_installSections = [];
  121. let tem_feeRules = [];
  122. for(let isect of installSections){
  123. let tem_sec={
  124. ID:isect.ID,
  125. name:isect.name,
  126. feeItemId:isect.feeItemId
  127. };
  128. if(isect.feeRule && isect.feeRule.length > 0){//规则项
  129. tem_sec.feeRuleId = isect.feeRule[0].ID; //选中第一个
  130. for(let ifeeR of isect.feeRule){
  131. let tem_feeRule = {
  132. ID: ifeeR.ID,
  133. code: ifeeR.code,
  134. rule: ifeeR.rule,
  135. base: ifeeR.base,
  136. feeRate: ifeeR.feeRate,
  137. labour: ifeeR.labour,
  138. material: ifeeR.material,
  139. machine: ifeeR.machine,
  140. sectionId:isect.ID,
  141. feeItemId:isect.feeItemId,
  142. position:positionMap[isect.feeItemId]
  143. };
  144. tem_feeRules.push(tem_feeRule);
  145. }
  146. }else {
  147. tem_sec.feeRuleId = "";
  148. }
  149. tem_installSections.push(tem_sec);
  150. }
  151. newInstallationFee.installSection = tem_installSections;
  152. newInstallationFee.feeRule = tem_feeRules;
  153. }
  154. if(create == true){
  155. return newInstallationFee;
  156. }
  157. return null;
  158. }
  159. function getData(projectID, callback) {
  160. installationFeeModel.find({'projectID': projectID}, (err, datas) => {
  161. if (err) {
  162. callback(1, '', null);
  163. } else {
  164. callback(0, consts.projectConst.INSTALLATION_FEE, datas);
  165. }
  166. })
  167. }