|
@@ -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 };
|
|
|
}
|
|
|
}
|
|
|
|