block_lib_facade.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /**
  2. * Created by CSL on 2018-12-17.
  3. */
  4. let mongoose = require('mongoose');
  5. let blModel = mongoose.model('blockLibsModel');
  6. let uuid = require('../../../public/web/uuid');
  7. const UserModel = require('../../users/models/user_model');
  8. const userInstance = new UserModel();
  9. const pmFacade = require('../../pm/facade/pm_facade');
  10. const { ShareLibType } = require('../../../public/common_constants');
  11. module.exports = {
  12. getLibNames: getLibNames,
  13. getLib: getLib,
  14. getLibNamesAndFirstLib: getLibNamesAndFirstLib,
  15. copyTemplateLib: copyTemplateLib,
  16. saveBlock: saveBlock
  17. };
  18. // userID、compilationID
  19. async function getLibNames(data) {
  20. let libNames = await blModel.find({userID: data.userID, compilationID: data.compilationID}, ["libID","libName","-_id"]);
  21. // 块模板库改成组价模板,兼容旧数据
  22. const bulks = [];
  23. const reg = /块模板库/;
  24. libNames.forEach(lib => {
  25. if (reg.test(lib.libName)) {
  26. const newLibName = lib.libName.replace('块模板库', '组价模板');
  27. lib.libName = newLibName;
  28. bulks.push({
  29. updateOne: {
  30. filter: { libID: lib.libID },
  31. update: { libName: newLibName }
  32. }
  33. });
  34. }
  35. });
  36. if (bulks.length) {
  37. await blModel.bulkWrite(bulks);
  38. }
  39. return libNames;
  40. };
  41. // libID
  42. async function getLib(data) {
  43. let lib = await blModel.findOne({libID: data.libID});
  44. return lib;
  45. };
  46. // userID、compilationID
  47. async function getLibNamesAndFirstLib(data) {
  48. let libNames = await getLibNames(data);
  49. let lib = null;
  50. if (libNames.length == 0){
  51. lib = await copyTemplateLib(data.userID, data.sessionUser.real_name, data.compilationID);
  52. libNames.push({libID: lib.libID, libName: lib.libName});
  53. }
  54. else{
  55. lib = await getLib(libNames[0]);
  56. }
  57. // 别人分享的组价模板
  58. const receiveLibs = await pmFacade.getReceiveLibList(data.userID, data.compilationID, ShareLibType.BLOCK_LIB);
  59. const userIDList = receiveLibs.map(user => user._id);
  60. const receiveLibNames = await blModel.find({userID: { $in: userIDList }, compilationID: data.compilationID}, ["libID","libName","-_id"]);
  61. libNames.push(...receiveLibNames);
  62. // 分享给别人
  63. const shareList = await pmFacade.getLibShareList(data.userID, data.compilationID, ShareLibType.BLOCK_LIB);
  64. return {libNames: libNames, firstLib: lib, shareList};
  65. };
  66. async function copyTemplateLib(userID, userName, compilationID) {
  67. // let template = await getLib({libID: '00000000'});
  68. let template = {
  69. libID: "00000000",
  70. libName: "模板",
  71. datas: [
  72. {
  73. "ID": "00000001",
  74. "ParentID": "-1",
  75. "NextSiblingID": "00000002",
  76. "type": 1,
  77. "nodeName": "分类1"
  78. },
  79. {
  80. "ID": "00000002",
  81. "ParentID": "-1",
  82. "NextSiblingID": "00000003",
  83. "type": 1,
  84. "nodeName": "分类2"
  85. },
  86. {
  87. "ID": "00000003",
  88. "ParentID": "-1",
  89. "NextSiblingID": "-1",
  90. "type": 1,
  91. "nodeName": "分类3"
  92. }
  93. ],
  94. share: {
  95. "shareName": "共享",
  96. "shareTo": []
  97. }
  98. };
  99. let newLib = {
  100. userID: userID,
  101. compilationID: compilationID,
  102. libID: uuid.v1(),
  103. libName: `${userName}的组价模板`,
  104. datas: template.datas,
  105. share: template.share
  106. };
  107. newLib.share.shareName = `共享-${newLib.libName}`;
  108. await blModel.create(newLib);
  109. // console.log(JSON.stringify(newLib));
  110. return newLib;
  111. };
  112. /*------------------------------------------------------------------------------
  113. 参数: {libID: n, nodeID: m, create: {node} | delete: true | update: {A:'xxx', B:'xxx'} }
  114. 说明: libID、nodeID 必须。 create|update|delete三选一。
  115. create属性值:完整的node节点数据。
  116. delete属性值:固定为true(false没有实际意义)。
  117. update属性值:列出多个要修改的结点属性(键值对组成的对象)。
  118. 示例: {libID: 3, nodeID: 5, create: {....}}
  119. {libID: 3, nodeID: 5, delete: true}
  120. {libID: 3, nodeID: 5, update: {nodeName: 'xxx', children: [...]} }
  121. ------------------------------------------------------------------------------*/
  122. async function saveBlock(data) {
  123. if (data.create) {
  124. await blModel.update({libID: data.libID}, {$addToSet: {datas: data.create}});
  125. }
  126. if (data.delete) {
  127. console.log(JSON.stringify(data));
  128. console.log(data.nodeID);
  129. await blModel.update({libID: data.libID}, {$pull: {datas: {ID: data.nodeID}}});
  130. if (data.delete.nodeType == 1){ // 同步删除所有子结点
  131. await blModel.update({libID: data.libID}, {$pull: {datas: {ParentID: data.nodeID}}});
  132. }
  133. }
  134. else if (data.update){
  135. let doc = await blModel.findOne({libID: data.libID});
  136. let datas = doc._doc.datas;
  137. for (let i = 0; i < datas.length; i++) {
  138. if (datas[i].ID == data.nodeID) {
  139. for (let pn in data.update){
  140. datas[i][pn] = data.update[pn];
  141. };
  142. await doc.save();
  143. break;
  144. }
  145. };
  146. };
  147. return 'saveBlock.OK';
  148. };