Group.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. const { pool } = require('../config/database');
  2. // 创建群组表
  3. const createGroupTable = async () => {
  4. try {
  5. await pool.query(`
  6. CREATE TABLE IF NOT EXISTS groups (
  7. id INT AUTO_INCREMENT PRIMARY KEY,
  8. group_id VARCHAR(50) NOT NULL UNIQUE,
  9. group_name VARCHAR(100) NOT NULL,
  10. creator_id VARCHAR(50) NOT NULL,
  11. is_active BOOLEAN DEFAULT TRUE,
  12. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  13. )
  14. `);
  15. } catch (error) {
  16. console.error('创建群组表失败:', error);
  17. }
  18. };
  19. // 初始化表
  20. createGroupTable();
  21. // 群组相关方法
  22. const Group = {
  23. // 获取所有群组
  24. findAll: async () => {
  25. try {
  26. const [rows] = await pool.query('SELECT * FROM groups ORDER BY created_at DESC');
  27. return rows;
  28. } catch (error) {
  29. console.error('查询群组列表失败:', error);
  30. throw error;
  31. }
  32. },
  33. // 根据ID查找群组
  34. findById: async (id) => {
  35. try {
  36. const [rows] = await pool.query(
  37. 'SELECT * FROM groups WHERE id = ?',
  38. [id]
  39. );
  40. return rows[0];
  41. } catch (error) {
  42. console.error('查询群组失败:', error);
  43. throw error;
  44. }
  45. },
  46. // 根据群组ID查找群组
  47. findByGroupId: async (groupId) => {
  48. const [rows] = await pool.query(
  49. 'SELECT * FROM groups WHERE group_id = ?',
  50. [groupId]
  51. );
  52. return rows[0];
  53. },
  54. // 创建群组
  55. create: async ({
  56. group_id,
  57. group_name,
  58. group_type = 'group',
  59. creator_id,
  60. admin_id,
  61. in_fee_rate = 0,
  62. in_exchange_rate = 1,
  63. out_fee_rate = 0,
  64. out_exchange_rate = 1
  65. }) => {
  66. try {
  67. const [result] = await pool.query(
  68. `INSERT INTO groups (
  69. group_id,
  70. group_name,
  71. group_type,
  72. creator_id,
  73. admin_id,
  74. in_fee_rate,
  75. in_exchange_rate,
  76. out_fee_rate,
  77. out_exchange_rate
  78. ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
  79. [
  80. group_id,
  81. group_name,
  82. group_type,
  83. creator_id,
  84. admin_id,
  85. in_fee_rate,
  86. in_exchange_rate,
  87. out_fee_rate,
  88. out_exchange_rate
  89. ]
  90. );
  91. return result.insertId;
  92. } catch (error) {
  93. console.error('创建群组失败:', error);
  94. throw error;
  95. }
  96. },
  97. // 更新群组
  98. update: async (id, {
  99. group_name,
  100. is_active,
  101. in_fee_rate,
  102. in_exchange_rate,
  103. out_fee_rate,
  104. out_exchange_rate
  105. }) => {
  106. try {
  107. const [result] = await pool.query(
  108. `UPDATE groups
  109. SET group_name = ?,
  110. is_active = ?,
  111. in_fee_rate = ?,
  112. in_exchange_rate = ?,
  113. out_fee_rate = ?,
  114. out_exchange_rate = ?,
  115. updated_at = CURRENT_TIMESTAMP
  116. WHERE id = ?`,
  117. [
  118. group_name,
  119. is_active,
  120. in_fee_rate,
  121. in_exchange_rate,
  122. out_fee_rate,
  123. out_exchange_rate,
  124. id
  125. ]
  126. );
  127. if (result.affectedRows === 0) {
  128. throw new Error('群组不存在');
  129. }
  130. return result;
  131. } catch (error) {
  132. console.error('更新群组失败:', error);
  133. throw error;
  134. }
  135. },
  136. // 删除群组
  137. delete: async (id) => {
  138. try {
  139. const [result] = await pool.query('DELETE FROM groups WHERE id = ?', [id]);
  140. if (result.affectedRows === 0) {
  141. throw new Error('群组不存在');
  142. }
  143. return result;
  144. } catch (error) {
  145. console.error('删除群组失败:', error);
  146. throw error;
  147. }
  148. },
  149. // 添加操作人
  150. addOperator: async (groupId, { operator_id, operator_username, added_by }) => {
  151. try {
  152. // 获取当前群组信息
  153. const [group] = await pool.query(
  154. 'SELECT operators FROM groups WHERE group_id = ?',
  155. [groupId]
  156. );
  157. if (!group[0]) {
  158. throw new Error('群组不存在');
  159. }
  160. // 解析现有的操作人列表,如果为null则初始化为空数组
  161. const operators = group[0].operators ? JSON.parse(group[0].operators) : [];
  162. // 检查操作人是否已存在
  163. if (operators.some(op => op.operator_id === operator_id)) {
  164. throw new Error('该用户已经是操作人');
  165. }
  166. // 添加新操作人
  167. operators.push({
  168. operator_id,
  169. operator_username,
  170. added_by,
  171. added_at: new Date().toISOString()
  172. });
  173. // 更新群组
  174. await pool.query(
  175. 'UPDATE groups SET operators = ? WHERE group_id = ?',
  176. [JSON.stringify(operators), groupId]
  177. );
  178. return true;
  179. } catch (error) {
  180. console.error('添加操作人失败:', error);
  181. throw error;
  182. }
  183. },
  184. // 检查用户是否是操作人
  185. isOperator: async (groupId, operatorId) => {
  186. try {
  187. const [group] = await pool.query(
  188. 'SELECT operators FROM groups WHERE group_id = ?',
  189. [groupId]
  190. );
  191. if (!group[0] || !group[0].operators) {
  192. return false;
  193. }
  194. const operators = JSON.parse(group[0].operators);
  195. return operators.some(op => op.operator_id === operatorId);
  196. } catch (error) {
  197. console.error('检查操作人状态失败:', error);
  198. throw error;
  199. }
  200. },
  201. // 获取群组的所有操作人
  202. getOperators: async (groupId) => {
  203. try {
  204. const [group] = await pool.query(
  205. 'SELECT operators FROM groups WHERE group_id = ?',
  206. [groupId]
  207. );
  208. if (!group[0] || !group[0].operators) {
  209. return [];
  210. }
  211. return JSON.parse(group[0].operators);
  212. } catch (error) {
  213. console.error('获取群组操作人列表失败:', error);
  214. throw error;
  215. }
  216. },
  217. // 删除操作人
  218. removeOperator: async (groupId, operatorId) => {
  219. try {
  220. // 获取当前群组信息
  221. const [group] = await pool.query(
  222. 'SELECT operators FROM groups WHERE group_id = ?',
  223. [groupId]
  224. );
  225. if (!group[0] || !group[0].operators) {
  226. throw new Error('群组不存在或没有操作人');
  227. }
  228. // 解析现有的操作人列表
  229. const operators = JSON.parse(group[0].operators);
  230. // 过滤掉要删除的操作人
  231. const updatedOperators = operators.filter(op => op.operator_id !== operatorId);
  232. // 如果操作人列表没有变化,说明要删除的操作人不存在
  233. if (operators.length === updatedOperators.length) {
  234. return false;
  235. }
  236. // 更新群组
  237. await pool.query(
  238. 'UPDATE groups SET operators = ? WHERE group_id = ?',
  239. [JSON.stringify(updatedOperators), groupId]
  240. );
  241. return true;
  242. } catch (error) {
  243. console.error('删除操作人失败:', error);
  244. throw error;
  245. }
  246. }
  247. };
  248. module.exports = Group;