sys-config.service.ts 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. import { FastifyInstance } from 'fastify'
  2. import { Like, Repository, Not } from 'typeorm'
  3. import Decimal from 'decimal.js'
  4. import { SysConfig } from '../entities/sys-config.entity'
  5. import {
  6. CreateSysConfigBody,
  7. UpdateSysConfigBody,
  8. CreateTeamConfigBody,
  9. UpdateTeamConfigBody,
  10. ListTeamConfigQuery
  11. } from '../dto/sys-config.dto'
  12. import { ConfigType } from '../entities/sys-config.entity'
  13. import { User, UserRole } from '../entities/user.entity'
  14. import { Team } from '../entities/team.entity'
  15. import { TeamMembers } from '../entities/team-members.entity'
  16. export class SysConfigService {
  17. private app: FastifyInstance
  18. private sysConfigRepository: Repository<SysConfig>
  19. private userRepository: Repository<User>
  20. private teamRepository: Repository<Team>
  21. private teamMembersRepository: Repository<TeamMembers>
  22. constructor(app: FastifyInstance) {
  23. this.app = app
  24. this.sysConfigRepository = app.dataSource.getRepository(SysConfig)
  25. this.userRepository = app.dataSource.getRepository(User)
  26. this.teamRepository = app.dataSource.getRepository(Team)
  27. this.teamMembersRepository = app.dataSource.getRepository(TeamMembers)
  28. }
  29. async getSysConfig(name: string, teamId?: number) {
  30. const where: any = { name }
  31. if (teamId !== undefined) {
  32. where.teamId = teamId
  33. }
  34. const sysConfig = await this.sysConfigRepository.findOneOrFail({ where })
  35. return sysConfig
  36. }
  37. async maxTransferAmount(defaultAmount: Decimal) {
  38. const sysConfig = await this.sysConfigRepository.findOne({ where: { name: 'max_transfer_amount' } })
  39. if (sysConfig) {
  40. return new Decimal(sysConfig.value)
  41. }
  42. await this.sysConfigRepository.save({ name: 'max_transfer_amount', value: defaultAmount.toString() })
  43. return defaultAmount
  44. }
  45. async replaceType(defaultValue: number) {
  46. try {
  47. const sysConfig = await this.sysConfigRepository.findOne({ where: { name: 'replace_type' } })
  48. if (sysConfig) {
  49. return Number(sysConfig.value)
  50. }
  51. await this.sysConfigRepository.save({ name: 'replace_type', value: defaultValue.toString() })
  52. } catch (e) {
  53. this.app.log.error(e, 'get replaceType error')
  54. }
  55. return defaultValue
  56. }
  57. async getSensitiveWords() {
  58. try {
  59. const config = await this.sysConfigRepository.findOne({ where: { name: 'sensitive_words' } })
  60. if (config) {
  61. return { value: config.value }
  62. }
  63. } catch (e) {
  64. this.app.log.error(e, 'get sensitiveWords error')
  65. }
  66. return null
  67. }
  68. async updateSensitiveWords(words: string) {
  69. try {
  70. const config = await this.sysConfigRepository.findOne({ where: { name: 'sensitive_words' } })
  71. if (config) {
  72. config.value = words
  73. const sysConfig = await this.sysConfigRepository.save(config)
  74. return {
  75. value: sysConfig.value
  76. }
  77. }
  78. await this.sysConfigRepository.save({ name: 'sensitive_words', value: words })
  79. } catch (e) {
  80. this.app.log.error(e, 'update sensitiveWords error')
  81. }
  82. }
  83. async create(data: CreateSysConfigBody) {
  84. const where: any = { name: data.name }
  85. if (data.teamId !== undefined) {
  86. where.teamId = data.teamId
  87. }
  88. const existingConfig = await this.sysConfigRepository.findOne({ where })
  89. if (existingConfig) {
  90. throw new Error('操作失败')
  91. }
  92. const config = this.sysConfigRepository.create(data)
  93. return await this.sysConfigRepository.save(config)
  94. }
  95. async update(name: string, data: UpdateSysConfigBody, teamId?: number) {
  96. const config = await this.getSysConfig(name, teamId)
  97. Object.assign(config, data)
  98. return await this.sysConfigRepository.save(config)
  99. }
  100. async delete(name: string, teamId?: number) {
  101. const config = await this.getSysConfig(name, teamId)
  102. return await this.sysConfigRepository.remove(config)
  103. }
  104. async list(page: number = 0, size: number = 20, name?: string, type?: ConfigType, teamId?: number) {
  105. const where: any = {
  106. name: Not('sensitive_words')
  107. }
  108. if (name) {
  109. where.name = Like(`%${name}%`)
  110. }
  111. if (type) {
  112. where.type = type
  113. }
  114. if (teamId !== undefined) {
  115. where.teamId = teamId
  116. }
  117. const [data, total] = await this.sysConfigRepository.findAndCount({
  118. where,
  119. skip: page * size,
  120. take: size,
  121. order: {
  122. id: 'ASC'
  123. }
  124. })
  125. return {
  126. data,
  127. meta: {
  128. page,
  129. size,
  130. total,
  131. totalPages: Math.ceil(total / size)
  132. }
  133. }
  134. }
  135. async getConfigTypes() {
  136. return Object.values(ConfigType)
  137. }
  138. // 获取用户的团队ID
  139. async getUserTeamId(userId: number, userRole: UserRole): Promise<number> {
  140. if (userRole === UserRole.ADMIN) {
  141. throw new Error('管理员不需要团队ID')
  142. }
  143. if (userRole === UserRole.USER) {
  144. throw new Error('普通用户无权限访问团队配置')
  145. }
  146. if (userRole === UserRole.TEAM) {
  147. // 队长从team表中获取teamId
  148. const team = await this.teamRepository.findOne({ where: { userId } })
  149. if (!team) {
  150. throw new Error('未找到该用户的团队信息')
  151. }
  152. return team.id
  153. } else {
  154. // 队员从team-members表中获取teamId
  155. const teamMember = await this.teamMembersRepository.findOne({ where: { userId } })
  156. if (!teamMember) {
  157. throw new Error('未找到该用户的团队成员信息')
  158. }
  159. return teamMember.teamId
  160. }
  161. }
  162. // 团队配置相关方法
  163. async createTeamConfig(data: CreateTeamConfigBody, userId: number, userRole: UserRole, adminTeamId?: number) {
  164. let teamId: number
  165. if (userRole === UserRole.ADMIN) {
  166. if (adminTeamId === undefined) {
  167. throw new Error('管理员操作团队配置时必须指定teamId')
  168. }
  169. teamId = adminTeamId
  170. } else {
  171. teamId = await this.getUserTeamId(userId, userRole)
  172. }
  173. const existingConfig = await this.sysConfigRepository.findOne({
  174. where: { name: data.name, teamId }
  175. })
  176. if (existingConfig) {
  177. throw new Error('该团队配置名称已存在')
  178. }
  179. const config = this.sysConfigRepository.create({ ...data, teamId })
  180. return await this.sysConfigRepository.save(config)
  181. }
  182. async updateTeamConfig(
  183. name: string,
  184. data: UpdateTeamConfigBody,
  185. userId: number,
  186. userRole: UserRole,
  187. adminTeamId?: number
  188. ) {
  189. let teamId: number
  190. if (userRole === UserRole.ADMIN) {
  191. if (adminTeamId === undefined) {
  192. throw new Error('管理员操作团队配置时必须指定teamId')
  193. }
  194. teamId = adminTeamId
  195. } else {
  196. teamId = await this.getUserTeamId(userId, userRole)
  197. }
  198. const config = await this.getSysConfig(name, teamId)
  199. Object.assign(config, data)
  200. return await this.sysConfigRepository.save(config)
  201. }
  202. async deleteTeamConfig(name: string, userId: number, userRole: UserRole, adminTeamId?: number) {
  203. let teamId: number
  204. if (userRole === UserRole.ADMIN) {
  205. if (adminTeamId === undefined) {
  206. throw new Error('管理员操作团队配置时必须指定teamId')
  207. }
  208. teamId = adminTeamId
  209. } else {
  210. teamId = await this.getUserTeamId(userId, userRole)
  211. }
  212. const config = await this.getSysConfig(name, teamId)
  213. return await this.sysConfigRepository.remove(config)
  214. }
  215. async getTeamConfig(name: string, userId: number, userRole: UserRole, adminTeamId?: number) {
  216. if (userRole === UserRole.ADMIN) {
  217. return await this.getSysConfig(name, adminTeamId)
  218. } else {
  219. const teamId = await this.getUserTeamId(userId, userRole)
  220. return await this.getSysConfig(name, teamId)
  221. }
  222. }
  223. async listTeamConfigs(query: ListTeamConfigQuery, userId: number, userRole: UserRole, adminTeamId?: number) {
  224. if (userRole === UserRole.ADMIN) {
  225. const { page = 0, size = 20, name, type } = query
  226. return await this.list(page, size, name, type, adminTeamId)
  227. } else {
  228. const teamId = await this.getUserTeamId(userId, userRole)
  229. const { page = 0, size = 20, name, type } = query
  230. return await this.list(page, size, name, type, teamId)
  231. }
  232. }
  233. async getUserTeamConfigs(userId?: number) {
  234. let teamId = 0
  235. if (userId) {
  236. const user = await this.userRepository.findOne({ where: { id: userId } })
  237. if (user) {
  238. const team = await this.teamRepository.findOne({ where: { userId: user.parentId } })
  239. if (team) {
  240. teamId = team.id
  241. }
  242. }
  243. }
  244. const configs = await this.sysConfigRepository.find({
  245. where: { teamId },
  246. select: ['name', 'value'],
  247. order: { id: 'ASC' }
  248. })
  249. return configs
  250. }
  251. // 创建团队默认配置
  252. async createDefaultTeamConfigs(teamId: number) {
  253. const defaultConfigs = [
  254. { name: 'hourly', value: '10', remark: '包时会员', type: ConfigType.Number },
  255. { name: 'daily', value: '20', remark: '包天会员', type: ConfigType.Number },
  256. { name: 'weekly', value: '60', remark: '包周会员', type: ConfigType.Number },
  257. { name: 'monthly', value: '80', remark: '包月会员', type: ConfigType.Number },
  258. { name: 'quarterly', value: '100', remark: '包季会员', type: ConfigType.Number },
  259. { name: 'yearly', value: '150', remark: '包年会员', type: ConfigType.Number },
  260. { name: 'lifetime', value: '300', remark: '终生会员', type: ConfigType.Number },
  261. { name: 'single', value: '10', remark: '单片价格', type: ConfigType.Number },
  262. { name: 'preview_duration', value: '30', remark: '试看时间(秒)', type: ConfigType.Number }
  263. ]
  264. const configs = defaultConfigs.map(config =>
  265. this.sysConfigRepository.create({
  266. ...config,
  267. teamId
  268. })
  269. )
  270. return await this.sysConfigRepository.save(configs)
  271. }
  272. }