member.service.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.MEMBER_PRICES = void 0;
  4. exports.getMemberBenefits = getMemberBenefits;
  5. exports.getMemberStatus = getMemberStatus;
  6. exports.createOrder = createOrder;
  7. exports.mockPaymentSuccess = mockPaymentSuccess;
  8. exports.getOrders = getOrders;
  9. const models_1 = require("../../models");
  10. const types_1 = require("../../types");
  11. // 会员价格
  12. exports.MEMBER_PRICES = {
  13. monthly: { price: 19.9, days: 30 },
  14. yearly: { price: 199, days: 365 },
  15. };
  16. // 获取会员权益信息
  17. function getMemberBenefits() {
  18. return {
  19. levels: [
  20. {
  21. level: 0,
  22. name: '免费版',
  23. price: 0,
  24. quota: types_1.MEMBER_QUOTA[0],
  25. features: ['每天3次生成', '每次最多5000字', '基础音色'],
  26. },
  27. {
  28. level: 1,
  29. name: '月度会员',
  30. price: exports.MEMBER_PRICES.monthly.price,
  31. quota: types_1.MEMBER_QUOTA[1],
  32. features: ['每天20次生成', '每次最多50000字', '全部音色', '优先处理'],
  33. },
  34. {
  35. level: 2,
  36. name: '年度会员',
  37. price: exports.MEMBER_PRICES.yearly.price,
  38. quota: types_1.MEMBER_QUOTA[2],
  39. features: ['无限次生成', '无字数限制', '全部音色', '优先处理', '专属客服'],
  40. },
  41. ],
  42. };
  43. }
  44. // 获取用户会员状态
  45. async function getMemberStatus(userId) {
  46. const user = await models_1.prisma.user.findUnique({ where: { id: parseInt(userId) } });
  47. if (!user) {
  48. throw new Error('用户不存在');
  49. }
  50. const today = new Date().toISOString().slice(0, 10);
  51. let dailyUsage = user.dailyUsage;
  52. const memberLevel = user.memberLevel;
  53. const quota = types_1.MEMBER_QUOTA[memberLevel];
  54. // 重置每日使用次数
  55. if (user.lastUsageDate !== today) {
  56. dailyUsage = 0;
  57. }
  58. const isValid = memberLevel > 0 && user.memberExpireAt && new Date() < user.memberExpireAt;
  59. return {
  60. level: memberLevel,
  61. levelName: ['免费版', '月度会员', '年度会员'][memberLevel],
  62. expireAt: user.memberExpireAt,
  63. isValid,
  64. quota: {
  65. dailyLimit: quota.dailyLimit,
  66. dailyUsed: dailyUsage,
  67. dailyRemaining: quota.dailyLimit === -1 ? -1 : Math.max(0, quota.dailyLimit - dailyUsage),
  68. wordLimit: quota.wordLimit,
  69. },
  70. };
  71. }
  72. // 创建订单
  73. async function createOrder(userId, productType) {
  74. const priceInfo = exports.MEMBER_PRICES[productType];
  75. const orderNo = generateOrderNo();
  76. const order = await models_1.prisma.order.create({
  77. data: {
  78. userId: parseInt(userId),
  79. orderNo,
  80. productType,
  81. amount: priceInfo.price,
  82. status: 'pending',
  83. },
  84. });
  85. return {
  86. orderNo: order.orderNo,
  87. amount: Number(order.amount),
  88. };
  89. }
  90. // 模拟支付成功
  91. async function mockPaymentSuccess(orderNo, userId) {
  92. const order = await models_1.prisma.order.findFirst({
  93. where: { orderNo, userId: parseInt(userId) }
  94. });
  95. if (!order) {
  96. throw new Error('订单不存在');
  97. }
  98. if (order.status !== 'pending') {
  99. throw new Error('订单状态不正确');
  100. }
  101. // 更新订单状态
  102. await models_1.prisma.order.update({
  103. where: { id: order.id },
  104. data: {
  105. status: 'paid',
  106. paymentMethod: 'mock',
  107. paidAt: new Date(),
  108. },
  109. });
  110. // 更新用户会员状态
  111. const user = await models_1.prisma.user.findUnique({ where: { id: parseInt(userId) } });
  112. if (!user) {
  113. throw new Error('用户不存在');
  114. }
  115. const days = exports.MEMBER_PRICES[order.productType].days;
  116. const now = new Date();
  117. // 如果当前是会员,从到期日延长;否则从现在开始
  118. const startDate = user.memberExpireAt && user.memberExpireAt > now
  119. ? user.memberExpireAt
  120. : now;
  121. const memberLevel = order.productType === 'yearly' ? 2 : 1;
  122. const memberExpireAt = new Date(startDate.getTime() + days * 24 * 60 * 60 * 1000);
  123. await models_1.prisma.user.update({
  124. where: { id: parseInt(userId) },
  125. data: {
  126. memberLevel,
  127. memberExpireAt,
  128. },
  129. });
  130. return {
  131. success: true,
  132. memberLevel,
  133. memberExpireAt,
  134. };
  135. }
  136. // 获取订单列表
  137. async function getOrders(userId, page = 1, pageSize = 10) {
  138. const uid = parseInt(userId);
  139. const total = await models_1.prisma.order.count({ where: { userId: uid } });
  140. const list = await models_1.prisma.order.findMany({
  141. where: { userId: uid },
  142. orderBy: { createdAt: 'desc' },
  143. skip: (page - 1) * pageSize,
  144. take: pageSize,
  145. });
  146. return {
  147. list,
  148. total,
  149. page,
  150. pageSize,
  151. totalPages: Math.ceil(total / pageSize),
  152. };
  153. }
  154. // 生成订单号
  155. function generateOrderNo() {
  156. const now = new Date();
  157. const dateStr = now.toISOString().slice(0, 10).replace(/-/g, '');
  158. const random = Math.random().toString(36).substring(2, 8).toUpperCase();
  159. return `ORD${dateStr}${random}`;
  160. }