tender_node.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. 'use strict';
  2. /**
  3. * 标段项目节数据模型
  4. *
  5. * @author CaiAoLin
  6. * @date 2017/12/1
  7. * @version
  8. */
  9. module.exports = app => {
  10. class TenderNode extends app.BaseService {
  11. /**
  12. * 构造函数
  13. *
  14. * @param {Object} ctx - egg全局变量
  15. * @return {void}
  16. */
  17. constructor(ctx) {
  18. super(ctx);
  19. this.tableName = 'tender_node';
  20. }
  21. /**
  22. * 新增数据
  23. *
  24. * @param {Object} data - 新增的数据(可批量)
  25. * @param {Number} tenderId - 标段id
  26. * @return {Boolean} - 返回新增的结果
  27. */
  28. async add(data, tenderId) {
  29. this.transaction = await this.db.beginTransaction();
  30. let result = false;
  31. try {
  32. if (tenderId <= 0) {
  33. throw '标段id错误';
  34. }
  35. if (data instanceof Array) {
  36. // 数组则为批量插入
  37. if (data.length <= 0) {
  38. throw '插入数据为空';
  39. }
  40. // 整理数据
  41. const insertData = [];
  42. for (const tmp of data) {
  43. tmp.template_id = tmp.id;
  44. tmp.template_pid = tmp.pid;
  45. tmp.tender_id = tenderId;
  46. delete tmp.id;
  47. delete tmp.pid;
  48. insertData.push(tmp);
  49. }
  50. const operate = await this.transaction.insert(this.tableName, insertData);
  51. result = operate.affectedRows > 0;
  52. } else {
  53. // 对象则单个插入
  54. }
  55. } catch (error) {
  56. result = false;
  57. }
  58. return result;
  59. }
  60. /**
  61. * 根据层级获取数据
  62. *
  63. * @param {Number} tenderId - 标段id
  64. * @param {Boolean} showAll - 是否显示全部
  65. * @return {Array} - 返回数据
  66. */
  67. async getDataByTenderId(tenderId, showAll = false) {
  68. if (tenderId <= 0) {
  69. return [];
  70. }
  71. const showLevel = !showAll ? 2 : -1;
  72. this.initSqlBuilder();
  73. this.sqlBuilder.setAndWhere('tender_id', {
  74. value: tenderId,
  75. operate: '=',
  76. });
  77. if (showLevel > 0) {
  78. this.sqlBuilder.setAndWhere('level', {
  79. value: showLevel,
  80. operate: '<=',
  81. });
  82. }
  83. const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
  84. const data = await this.db.query(sql, sqlParam);
  85. return data;
  86. }
  87. /**
  88. * 根据节点Id获取数据
  89. *
  90. * @param {Number} tenderId - 标段id
  91. * @param {Number} nodeId - 项目节/工程量清单节点id
  92. * @return {Object} - 返回查询到的节点数据
  93. */
  94. async getDataByNodeId(tenderId, nodeId) {
  95. if ((nodeId <= 0) || (tenderId <= 0)) {
  96. return undefined;
  97. }
  98. this.initSqlBuilder();
  99. this.sqlBuilder.setAndWhere('tender_id', {
  100. value: tenderId,
  101. operate: '=',
  102. });
  103. this.sqlBuilder.setAndWhere('template_id', {
  104. value: nodeId,
  105. operate: '=',
  106. });
  107. const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
  108. const data = await this.db.queryOne(sql, sqlParam);
  109. return data;
  110. }
  111. /**
  112. * select的全部后兄弟节点,Order自增
  113. *
  114. * @param {Object} select - 选中的节点
  115. * @return {Array} - 自增后的数据
  116. * @private
  117. */
  118. async _updateSelectNextsOrder(select) {
  119. this.initSqlBuilder();
  120. this.sqlBuilder.setAndWhere('tender_id', {
  121. value: select.tender_id,
  122. operate: '=',
  123. });
  124. this.sqlBuilder.setAndWhere('order', {
  125. value: select.order + 1,
  126. operate: '>=',
  127. });
  128. this.sqlBuilder.setAndWhere('template_pid', {
  129. value: select.template_pid,
  130. operate: '=',
  131. });
  132. this.sqlBuilder.setUpdateData('order', {
  133. value: 1,
  134. selfOperate: '+',
  135. });
  136. // sql = update this.tableName set order = order + 1 where (tender_id = select.tender_id) && (pid = select.pid) && (order >= select.order+1)
  137. const [sql, sqlParam] = this.sqlBuilder.build(this.tableName, 'update');
  138. const data = await this.transaction.query(sql, sqlParam);
  139. return data;
  140. }
  141. /**
  142. * 根据selectData, data 新增数据
  143. * @param {Number} tenderId - 标段id
  144. * @param {Object} selectData - 选中节点的数据
  145. * @param {Object} data - 新增节点的初始数据
  146. * @return {Object} - 新增结果
  147. * @private
  148. */
  149. async _addNodeData(tenderId, selectData, data) {
  150. if (tenderId <= 0) {
  151. return undefined;
  152. }
  153. if (!data) {
  154. data = {};
  155. }
  156. data.tender_id = tenderId;
  157. data.template_id = 15;
  158. data.template_pid = selectData.template_pid;
  159. data.level = selectData.level;
  160. data.order = selectData.order + 1;
  161. data.full_path = selectData.full_path.replace(selectData.template_id, data.template_id);
  162. const result = await this.transaction.insert(this.tableName, data);
  163. return result;
  164. }
  165. /**
  166. * tenderId标段中, 在selectId后新增一个节点
  167. * @param {Number} tenderId - 标段id
  168. * @param {Number} selectId - 选中节点id
  169. * @param {Object} data - 新增节点初始化数据
  170. * @return {Array} 新增后的数据,其他被修改的数据
  171. */
  172. async addNode(tenderId, selectId, data) {
  173. if ((tenderId <= 0) || (selectId <= 0)) {
  174. return undefined;
  175. }
  176. const selectData = await this.getDataByNodeId(tenderId, selectId);
  177. this.transaction = await this.db.beginTransaction();
  178. let resultData = [];
  179. if (selectData) {
  180. try {
  181. // 选中节点的所有后兄弟节点,order+1
  182. const updateData = await this._updateSelectNextsOrder(selectData);
  183. console.log(updateData);
  184. // 数据库创建新增节点数据
  185. const addData = await this._addNodeData(tenderId, selectData, data);
  186. console.log(addData);
  187. resultData = await this.transaction.commit();
  188. console.log(resultData);
  189. resultData.concat(updateData, addData);
  190. } catch (err) {
  191. await this.transaction.rollback();
  192. throw err;
  193. }
  194. } else {
  195. throw '新增节点数据错误';
  196. }
  197. return resultData;
  198. }
  199. }
  200. return TenderNode;
  201. };