installation_facade.js 6.2 KB

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