user-refunds.mt.service.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. import { DataSource, Repository } from 'typeorm';
  2. import { OrderRefundMt } from '../entities/order-refund.mt.entity';
  3. import { OrderMt } from '../entities/order.mt.entity';
  4. import { CreateOrderRefundDto, UpdateOrderRefundDto } from '../schemas/order-refund.schema';
  5. import type { z } from 'zod';
  6. export class UserRefundsMtService {
  7. private orderRefundRepository: Repository<OrderRefundMt>;
  8. private orderRepository: Repository<OrderMt>;
  9. constructor(dataSource: DataSource) {
  10. this.orderRefundRepository = dataSource.getRepository(OrderRefundMt);
  11. this.orderRepository = dataSource.getRepository(OrderMt);
  12. }
  13. /**
  14. * 获取当前用户的退款列表
  15. */
  16. async getUserRefundsList(
  17. page: number,
  18. pageSize: number,
  19. keyword?: string,
  20. userId?: number,
  21. tenantId?: number,
  22. filters?: any
  23. ): Promise<[OrderRefundMt[], number]> {
  24. if (!userId) {
  25. throw new Error('用户ID不能为空');
  26. }
  27. const queryBuilder = this.orderRefundRepository
  28. .createQueryBuilder('refund')
  29. .leftJoinAndSelect('refund.order', 'order')
  30. .where('order.userId = :userId', { userId });
  31. // 租户过滤
  32. if (tenantId) {
  33. queryBuilder.andWhere('refund.tenantId = :tenantId', { tenantId });
  34. }
  35. if (keyword) {
  36. queryBuilder.andWhere(
  37. '(refund.orderNo LIKE :keyword OR refund.refundOrderNo LIKE :keyword)',
  38. { keyword: `%${keyword}%` }
  39. );
  40. }
  41. // 处理状态过滤
  42. if (filters && filters.state !== undefined) {
  43. queryBuilder.andWhere('refund.state = :state', { state: filters.state });
  44. }
  45. const [data, total] = await queryBuilder
  46. .orderBy('refund.createdAt', 'DESC')
  47. .skip((page - 1) * pageSize)
  48. .take(pageSize)
  49. .getManyAndCount();
  50. return [data, total];
  51. }
  52. /**
  53. * 根据ID获取当前用户的退款详情
  54. */
  55. async getUserRefundById(id: number, userId?: number, tenantId?: number): Promise<OrderRefundMt | null> {
  56. if (!userId) {
  57. throw new Error('用户ID不能为空');
  58. }
  59. const queryBuilder = this.orderRefundRepository
  60. .createQueryBuilder('refund')
  61. .leftJoinAndSelect('refund.order', 'order')
  62. .where('refund.id = :id', { id });
  63. // 租户过滤
  64. if (tenantId) {
  65. queryBuilder.andWhere('refund.tenantId = :tenantId', { tenantId });
  66. }
  67. const refund = await queryBuilder.getOne();
  68. if (!refund) {
  69. return null;
  70. }
  71. // 检查权限
  72. if (refund.order.userId !== userId) {
  73. throw new Error('无权访问该退款记录');
  74. }
  75. return refund;
  76. }
  77. /**
  78. * 为当前用户创建退款
  79. */
  80. async createUserRefund(data: z.infer<typeof CreateOrderRefundDto>, userId?: number, tenantId?: number): Promise<OrderRefundMt> {
  81. if (!userId) {
  82. throw new Error('用户ID不能为空');
  83. }
  84. // 验证订单是否属于当前用户
  85. const order = await this.orderRepository.findOne({
  86. where: {
  87. orderNo: data.orderNo || undefined,
  88. userId,
  89. ...(tenantId && { tenantId })
  90. }
  91. });
  92. if (!order) {
  93. throw new Error('订单不存在或无权为该订单创建退款');
  94. }
  95. const refund = this.orderRefundRepository.create({
  96. ...data,
  97. tenantId,
  98. createdBy: userId,
  99. updatedBy: userId
  100. });
  101. return await this.orderRefundRepository.save(refund);
  102. }
  103. /**
  104. * 更新当前用户的退款
  105. */
  106. async updateUserRefund(
  107. id: number,
  108. data: z.infer<typeof UpdateOrderRefundDto>,
  109. userId?: number,
  110. tenantId?: number
  111. ): Promise<OrderRefundMt | null> {
  112. if (!userId) {
  113. throw new Error('用户ID不能为空');
  114. }
  115. // 验证退款是否属于当前用户
  116. const existingRefund = await this.getUserRefundById(id, userId, tenantId);
  117. if (!existingRefund) {
  118. return null;
  119. }
  120. const updatedRefund = this.orderRefundRepository.merge(existingRefund, {
  121. ...data,
  122. updatedBy: userId
  123. });
  124. return await this.orderRefundRepository.save(updatedRefund);
  125. }
  126. /**
  127. * 删除当前用户的退款
  128. */
  129. async deleteUserRefund(id: number, userId?: number, tenantId?: number): Promise<boolean> {
  130. if (!userId) {
  131. throw new Error('用户ID不能为空');
  132. }
  133. // 验证退款是否属于当前用户
  134. const existingRefund = await this.getUserRefundById(id, userId, tenantId);
  135. if (!existingRefund) {
  136. return false;
  137. }
  138. await this.orderRefundRepository.remove(existingRefund);
  139. return true;
  140. }
  141. }