| 
					
				 | 
			
			
				@@ -13,8 +13,15 @@ const needField = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     pid: 'ledger_pid', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     order: 'order', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     level: 'level', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    fullPath: 'full_path' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fullPath: 'full_path', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    isLeaf: 'is_leaf', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const keyFields = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    table: ['id'], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    index: ['tender_id', 'ledger_id'], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 以下字段仅可通过树结构操作改变,不可直接通过update方式从接口提交,发现时过滤 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const readOnlyFields = ['id', 'tender_id', 'ledger_id', 'ledger_pid', 'order', 'level', 'full_path', 'is_leaf']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -132,20 +139,47 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * 根据节点Id获取数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param {Number} tenderId - 标段Id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param {Array} nodesIds - 节点Id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @return {Array} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        async getDataByNodeIds(tenderId, nodesIds) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (tenderId <= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            this.initSqlBuilder(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            this.sqlBuilder.setAndWhere('tender_id', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                value: tenderId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                operate: '=', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            this.sqlBuilder.setAndWhere('ledger_id', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                value: nodesIds, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                operate: 'in', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const data = await this.db.query(sql, sqlParam); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * 获取最末的子节点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * @param {Number} tenderId - 标段id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * @param {Number} pid - 父节点id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * @returns {Object} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @return {Object} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getLastChildData(tenderId, pid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.initSqlBuilder(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sqlBuilder.setAndWhere('tender_id', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 value: tenderId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                operate: '=' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                operate: '=', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sqlBuilder.setAndWhere('ledger_pid', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 value: pid, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                operate: '=' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                operate: '=', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sqlBuilder.orderBy = [['order', 'DESC']]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const [sql, sqlParam] = this.sqlBuilder.build(this.tableName); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -160,7 +194,7 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * @param {Number} tenderId - 标段id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * @param {Number} pid - 父节点id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * @param {Number|Array} order - 排序 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * @returns {Object|Array} - 查询结果 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @return {Object|Array} - 查询结果 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getDataByParentAndOrder(tenderId, pid, order) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if ((tenderId <= 0) || (pid <= 0) || (order <= 0)) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -170,7 +204,7 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.initSqlBuilder(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sqlBuilder.setAndWhere('tender_id', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 value: tenderId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                operate: '=' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                operate: '=', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sqlBuilder.setAndWhere('ledger_pid', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 value: pid, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -179,12 +213,12 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (order instanceof Array) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 this.sqlBuilder.setAndWhere('order', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     value: order, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    operate: 'in' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    operate: 'in', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 this.sqlBuilder.setAndWhere('order', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     value: order, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    operate: '=' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    operate: '=', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -203,7 +237,7 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * 根据 父节点id 获取子节点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * @param tenderId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * @param nodeId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * @returns {Promise<*>} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @return {Promise<*>} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getChildrenByParentId(tenderId, nodeId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if ((nodeId <= 0) || (tenderId <= 0)) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -230,19 +264,19 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * 根据full_path获取数据 full_path Like ‘1.2.3%’(传参full_path = '1.2.3%') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * @param {Number} tenderId - 标段id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * @param {String} full_path - 路径 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * @returns {Promise<void>} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @return {Promise<void>} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getDataByFullPath(tenderId, full_path) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.initSqlBuilder(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sqlBuilder.setAndWhere('tender_id', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 value: tenderId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                operate: '=' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                operate: '=', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sqlBuilder.setAndWhere('full_path', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 value: this.db.escape(full_path), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                operate: 'Like' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                operate: 'Like', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            let [sql, sqlParam] = this.sqlBuilder.build(this.tableName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const resultData = await this.db.query(sql, sqlParam); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return resultData; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -252,7 +286,7 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * @param {Number} tenderId - 标段id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * @param {Number} pid - 父节点id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * @param {Number} order - 排序 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * @returns {Array} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @return {Array} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async getNextsData(tenderId, pid, order) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if ((tenderId <= 0) || (pid <= 0) || (order <= 0)) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -262,7 +296,7 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.initSqlBuilder(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sqlBuilder.setAndWhere('tender_id', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 value: tenderId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                operate: '=' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                operate: '=', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sqlBuilder.setAndWhere('ledger_pid', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 value: pid, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -270,7 +304,7 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sqlBuilder.setAndWhere('order', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 value: order, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                operate: '>' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                operate: '>', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const [sql, sqlParam] = this.sqlBuilder.build(this.tableName); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -345,8 +379,8 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const cacheKey = 'tender_node_maxId:' + tenderId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             let maxId = parseInt(await this.cache.get(cacheKey)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (!maxId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-               maxId = await this._getMaxNodeId(tenderId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-               this.cache.set(cacheKey, maxId, 'EX', this.ctx.app.config.cacheTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                maxId = await this._getMaxNodeId(tenderId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.cache.set(cacheKey, maxId, 'EX', this.ctx.app.config.cacheTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             data.tender_id = tenderId; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -396,7 +430,7 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // 查询应返回的结果 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const createData = await this.getDataByParentAndOrder(selectData.tender_id, selectData.ledger_pid, [selectData.order + 1]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const updateData = await this.getNextsData(selectData.tender_id, selectData.ledger_pid, selectData.order + 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return {create: createData, update: updateData}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return { create: createData, update: updateData }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -425,28 +459,28 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 this.initSqlBuilder(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 this.sqlBuilder.setAndWhere('tender_id', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     value: tenderId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    operate: '=' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    operate: '=', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 this.sqlBuilder.setAndWhere('full_path', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     value: this.db.escape(selectData.full_path + '%'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    operate: 'Like' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    operate: 'Like', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 const [sql, sqlParam] = this.sqlBuilder.build(this.tableName, 'delete'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 const operate = await this.transaction.query(sql, sqlParam); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 // 选中节点--父节点 只有一个子节点时,应升级is_leaf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (parentData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    const count = this.db.count(this.tableName, {ledger_pid: selectData.ledger_pid}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const count = this.db.count(this.tableName, { ledger_pid: selectData.ledger_pid }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if (count === 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         await this.transaction.update({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             id: parentData.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            is_leaf: true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            is_leaf: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 // 选中节点--全部后节点 order-- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 await this._updateSelectNextsOrder(selectData, -1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 await this.transaction.commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } catch(err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 deleteData = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 await this.transaction.rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 throw err; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -461,7 +495,7 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     updateData.push(updateData2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return {delete: deleteData, update: updateData}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return { delete: deleteData, update: updateData }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -486,8 +520,8 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.transaction = await this.db.beginTransaction(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const sData = await this.transaction.update(this.tableName, {id: selectData.id, order: selectData.order - 1}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const pData = await this.transaction.update(this.tableName, {id: preData.id, order: preData.order + 1}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const sData = await this.transaction.update(this.tableName, { id: selectData.id, order: selectData.order - 1 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const pData = await this.transaction.update(this.tableName, { id: preData.id, order: preData.order + 1 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 this.transaction.commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 await this.transaction.rollback(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -495,7 +529,7 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const resultData = await this.getDataByParentAndOrder(tenderId, selectData.ledger_pid, [selectData.order, preData.order]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return {update: resultData}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return { update: resultData }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -515,13 +549,13 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const nextData = await this.getDataByParentAndOrder(tenderId, selectData.ledger_pid, selectData.order + 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (!nextData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                throw '节点不可下移' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw '节点不可下移'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.transaction = await this.db.beginTransaction(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const sData = await this.transaction.update(this.tableName, {id: selectData.id, order: selectData.order + 1}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const pData = await this.transaction.update(this.tableName, {id: nextData.id, order: nextData.order - 1}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const sData = await this.transaction.update(this.tableName, { id: selectData.id, order: selectData.order + 1 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const pData = await this.transaction.update(this.tableName, { id: nextData.id, order: nextData.order - 1 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 this.transaction.commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 await this.transaction.rollback(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -529,7 +563,7 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const resultData = await this.getDataByParentAndOrder(tenderId, selectData.ledger_pid, [selectData.order, nextData.order]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return {update: resultData}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return { update: resultData }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -542,19 +576,19 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.initSqlBuilder(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sqlBuilder.setAndWhere('tender_id', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 value: selectData.tender_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                operate: '=' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                operate: '=', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sqlBuilder.setAndWhere('full_path', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 value: this.db.escape(selectData.full_path + '.%'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                operate: 'like' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                operate: 'like', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sqlBuilder.setUpdateData('level', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 value: 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                selfOperate: '-' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                selfOperate: '-', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sqlBuilder.setUpdateData('full_path', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 value: ['`full_path`', this.db.escape(selectData.ledger_pid + '.'), this.db.escape('')], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                literal: 'Replace' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                literal: 'Replace', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const [sql, sqlParam] = this.sqlBuilder.build(this.tableName, 'update'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const data = this.transaction.query(sql, sqlParam); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -576,29 +610,29 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 // 修改nextsData pid, 排序 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 this.initSqlBuilder(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 this.sqlBuilder.setUpdateData('ledger_pid', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    value: selectData.ledger_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    value: selectData.ledger_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const orderInc = lastChildData ? lastChildData.order - selectData.order : - selectData.order; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const orderInc = lastChildData ? lastChildData.order - selectData.order : -selectData.order; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 this.sqlBuilder.setUpdateData('order', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     value: Math.abs(orderInc), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    selfOperate: orderInc > 0 ? '+' : '-' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    selfOperate: orderInc > 0 ? '+' : '-', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 this.sqlBuilder.setAndWhere('ledger_pid', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     value: selectData.ledger_pid, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    operate: '=' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    operate: '=', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 this.sqlBuilder.setAndWhere('order', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     value: selectData.order, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    operate: '>' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    operate: '>', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 const [sql1, sqlParam1] = this.sqlBuilder.build(this.tableName, 'update'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 await this.transaction.query(sql1, sqlParam1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 // 选中节点 is_leaf应为false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (selectData.is_leaf) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    const updateData = {id: selectData.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        is_leaf: false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const updateData = { id: selectData.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        is_leaf: false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     await this.transaction.update(this.tableName, updateData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -607,7 +641,7 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 const newSubStr = this.db.escape(selectData.ledger_id + '.'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 const sqlArr = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 sqlArr.push('Update ?? SET `full_path` = Replace(`full_path`,' + oldSubStr + ',' + newSubStr + ') Where'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                sqlArr.push('(`tender_id` = ' + selectData.tender_id +')'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                sqlArr.push('(`tender_id` = ' + selectData.tender_id + ')'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 sqlArr.push(' And ('); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 for (const data of nextsData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     sqlArr.push('`full_path` Like ' + this.db.escape(data.full_path + '%')); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -639,7 +673,7 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const parentData = await this.getDataByNodeId(tenderId, selectData.ledger_pid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (!parentData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                throw '升级节点数据错误' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw '升级节点数据错误'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.transaction = await this.db.beginTransaction(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -649,17 +683,17 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (selectData.order === 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     this.transaction.update(this.tableName, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         id: parentData.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        is_leaf: true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        is_leaf: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 // 选中节点--父节点--全部后兄弟节点 order+1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 await this._updateSelectNextsOrder(parentData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 // 选中节点 修改pid, order, full_path 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const updateData = {id: selectData.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const updateData = { id: selectData.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     ledger_pid: parentData.ledger_pid, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     order: parentData.order + 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     level: selectData.level - 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    full_path: newFullPath 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    full_path: newFullPath, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 await this.transaction.update(this.tableName, updateData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 // 选中节点--全部子节点(含孙) level-1, full_path变更 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -679,33 +713,33 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 const preParent = await this.getDataByNodeId(tenderId, parentData.ledger_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 resultData2.push(preParent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return {update: resultData1.concat(resultData2)}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return { update: resultData1.concat(resultData2) }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * 降级selectData, 同步修改所有子节点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * @param {Object} selectData - 选中节点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * @param {Object} preData - 选中节点的前一节点(降级后为父节点) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * @returns {Promise<*>} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @return {Promise<*>} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          * @private 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				          */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         async _syncDownlevelChildren(selectData, preData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.initSqlBuilder(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sqlBuilder.setAndWhere('tender_id', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 value: selectData.tender_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                operate: '=' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                operate: '=', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sqlBuilder.setAndWhere('full_path', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 value: this.db.escape(selectData.full_path + '.%'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                operate: 'like' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                operate: 'like', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sqlBuilder.setUpdateData('level', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 value: 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                selfOperate: '+' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                selfOperate: '+', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.sqlBuilder.setUpdateData('full_path', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                value: ['`full_path`', this.db.escape(selectData.ledger_id), this.db.escape(preData.ledger_id + '.' + selectData.ledger_id)], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                literal: 'Replace' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                value: ['`full_path`', this.db.escape('.' + selectData.ledger_id), this.db.escape('.' + preData.ledger_id + '.' + selectData.ledger_id)], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                literal: 'Replace', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const [sql, sqlParam] = this.sqlBuilder.build(this.tableName, 'update'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const data = this.transaction.query(sql, sqlParam); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -728,32 +762,36 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (!selectData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 throw '降级节点数据错误'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const preData = await this.getDataByParentAndOrder(tenderId, selectData.ledger_pid, selectData.order-1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const preData = await this.getDataByParentAndOrder(tenderId, selectData.ledger_pid, selectData.order - 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (!preData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 throw '节点不可降级'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const preLastChildData = await this.getLastChildData(tenderId, preData.ledger_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             this.transaction = await this.db.beginTransaction(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const newFullPath = selectData.full_path.replace(selectData.ledger_id, preData.ledger_id + '.' + selectData.ledger_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const orgLastPath = selectData.level === 1 ? selectData.ledger_id : '.' + selectData.ledger_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const newLastPath = selectData.level === 1 ? preData.ledger_id + '.' + selectData.ledger_id : '.' + preData.ledger_id + '.' + selectData.ledger_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const newFullPath = selectData.full_path.replace(orgLastPath, newLastPath); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 // 选中节点--全部后节点 order-- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 await this._updateSelectNextsOrder(selectData, -1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 // 选中节点 修改pid, level, order, full_path 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                const updateData = {id: selectData.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const updateData = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    id: selectData.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     ledger_pid: preData.ledger_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     order: preLastChildData ? preLastChildData.order + 1 : 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     level: selectData.level + 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    full_path: newFullPath 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    full_path: newFullPath, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 await this.transaction.update(this.tableName, updateData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 // 选中节点--全部子节点(含孙) level++, full_path 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 await this._syncDownlevelChildren(selectData, preData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 // 选中节点--前兄弟节点 is_leaf应为false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (preData.is_leaf) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    const updateData2 = {id: preData.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        is_leaf: false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const updateData2 = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        id: preData.id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        is_leaf: false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     await this.transaction.update(this.tableName, updateData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 this.transaction.commit(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -768,7 +806,194 @@ module.exports = app => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // 选中节点--原前兄弟节点&全部后兄弟节点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const queryOrder = preData.is_leaf ? preData.order - 1 : preData.order; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             const resultData2 = await this.getNextsData(tenderId, preData.ledger_pid, queryOrder); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return {update: resultData1.concat(resultData2)}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return { update: resultData1.concat(resultData2) }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * 过滤data中update方式不可提交的字段 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param {Number} id - 主键key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param {Object} data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @return {Object<{id: *}>} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @private 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        _filterUpdateInvalidField(id, data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const result = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (const prop in data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (readOnlyFields.indexOf(prop) === -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    result[prop] = data[prop]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * 提交数据 - 不影响计算等未提交项 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param {Number} tenderId - 标段id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param {Object} data - 提交数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @return {Object} - 提交后的数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        async updateInfo(tenderId, data) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 简单校验数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (tenderId <= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw '标段不存在'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (tenderId !== data.tender_id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw '提交数据错误'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 过滤不可提交字段 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const updateNode = await this.getDataById(data.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (!updateNode || tenderId !== updateNode.tender_id || data.ledger_id !== updateNode.ledger_id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    throw '提交数据错误'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                const updateData = this._filterUpdateInvalidField(updateNode.id, data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.db.update(this.tableName, updateData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const result = await this.getDataByNodeId(tenderId, data.ledger_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * 提交多条数据 - 不影响计算等未提交项 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param {Number} tenderId - 标段id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param {Array} datas - 提交数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @return {Array} - 提交后的数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        async updateInfos(tenderId, datas) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (tenderId <= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw '标段不存在'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (const data of datas) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (tenderId !== data.tender_id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    throw '提交数据错误1'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            this.transaction = await this.db.beginTransaction(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for (const data of datas) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const updateNode = await this.getDataById(data.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (!updateNode || tenderId !== updateNode.tender_id || data.ledger_id !== updateNode.ledger_id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        throw '提交数据错误2'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const updateData = this._filterUpdateInvalidField(updateNode.id, data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    await this.transaction.update(this.tableName, updateData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.transaction.commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                this.transaction.rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const filter = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (const data of datas) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                filter.push(data.id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            this.initSqlBuilder(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            this.sqlBuilder.setAndWhere('id', { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                value: filter, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                operate: 'in', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const resultData = await this.db.query(sql, sqlParam); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return resultData; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * 复制粘贴整块 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param {Number} tenderId - 标段Id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param {Number} selectId - 选中几点Id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @param {Array} block - 复制节点Id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * @return {Object} - 提价后的数据(其中新增粘贴数据,只返回第一层) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        async pasteBlock(tenderId, selectId, block) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if ((tenderId <= 0) || (selectId <= 0)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const selectData = await this.getDataByNodeId(tenderId, selectId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (!selectData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw '位置数据错误'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const newParentPath = selectData.full_path.replace(selectData.ledger_id, ''); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const copyNodes = await this.getDataByNodeIds(tenderId, block); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (!copyNodes || copyNodes.length <= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw '复制数据错误'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let bSameParent = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (const node of copyNodes) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (node.ledger_pid !== copyNodes[0].ledger_pid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    bSameParent = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (!bSameParent) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw '复制数据错误:仅可操作同层节点'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const orgParentPath = copyNodes[0].full_path.replace(copyNodes[0].ledger_id, ''); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            this.transaction = await this.db.beginTransaction(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 选中节点的所有后兄弟节点,order+粘贴节点个数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this._updateSelectNextsOrder(selectData, copyNodes.length); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 数据库创建新增节点数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for (const node of copyNodes) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const datas = await this.getDataByFullPath(tenderId, node.full_path + '%'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    const cacheKey = 'tender_node_maxId:' + tenderId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    let maxId = parseInt(await this.cache.get(cacheKey)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (!maxId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        maxId = await this._getMaxNodeId(tenderId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    this.cache.set(cacheKey, maxId + datas.length, 'EX', this.ctx.app.config.cacheTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // 计算粘贴数据中需更新部分 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    for (let index = 0; index < datas.length; index++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        const data = datas[index]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        const newId = maxId + index + 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        delete data.id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (!data.is_leaf) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            for (const children of datas) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                children.full_path = children.full_path.replace('.' + data.ledger_id, '.' + newId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                if (children.ledger_pid === data.ledger_id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    children.ledger_pid = newId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            data.full_path = data.full_path.replace('.' + data.ledger_id, '.' + newId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        data.ledger_id = newId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        data.full_path = data.full_path.replace(orgParentPath, newParentPath); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (data.ledger_pid === copyNodes[0].ledger_pid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            data.ledger_pid = selectData.ledger_pid; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            data.order = selectData.order + index + 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        data.level = data.level + selectData.level - copyNodes[0].level; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // 插入粘贴数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    await this.transaction.insert(this.tableName, datas); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.transaction.commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await this.transaction.rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw err; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 查询应返回的结果 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const order = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for (let i = 1; i <= copyNodes.length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                order.push(selectData.order + i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const createData = await this.getDataByParentAndOrder(selectData.tender_id, selectData.ledger_pid, order); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const updateData = await this.getNextsData(selectData.tender_id, selectData.ledger_pid, selectData.order + copyNodes.length); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return { create: createData, update: updateData }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |