installation_facade.js 6.0 KB

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