Kaynağa Gözat

新增链接生成和查看

wilhelm wong 2 ay önce
ebeveyn
işleme
9a777cb044

+ 3 - 2
src/controllers/promotion-link.controller.ts

@@ -56,8 +56,9 @@ export class PromotionLinkController {
         return reply.code(403).send({ message: '用户未登录' })
       }
       if (user.role === UserRole.PROMOTER) {
-        const teamMembers = await this.teamMembersService.findByUserId(user.id)
-        request.query.teamId = teamMembers.teamId
+        // 推广员只能查看自己的链接(memberId)
+        const teamMember = await this.teamMembersService.findByUserId(user.id)
+        request.query.memberId = teamMember.id
       } else if (user.role === UserRole.TEAM) {
         const team = await this.teamService.findByUserId(user.id)
         request.query.teamId = team.id

+ 3 - 0
src/dto/promotion-link.dto.ts

@@ -4,6 +4,7 @@ import { Pagination } from './common.dto'
 
 export interface CreatePromotionLinkBody {
   teamId?: number
+  memberId?: number
   name: string
   image: string
   link: string
@@ -13,6 +14,7 @@ export interface CreatePromotionLinkBody {
 export interface UpdatePromotionLinkBody {
   id: number
   teamId?: number
+  memberId?: number
   name?: string
   image?: string
   link?: string
@@ -23,6 +25,7 @@ export interface ListPromotionLinkQuery extends Pagination {
   name?: string
   type?: LinkType
   teamId?: number
+  memberId?: number
 }
 
 export interface PromotionLinkParams {

+ 3 - 0
src/entities/promotion-link.entity.ts

@@ -14,6 +14,9 @@ export class PromotionLink {
   @Column()
   teamId: number
 
+  @Column({ nullable: true })
+  memberId: number
+
   @Column()
   name: string
 

+ 29 - 0
src/services/payment.service.ts

@@ -174,6 +174,7 @@ export class PaymentService {
 
   /**
    * 获取默认分成信息(domainId为0时的逻辑)
+   * 如果user的parentId绑定的是团队成员,也要计入个人分润
    */
   private async getDefaultCommission(member: any): Promise<{
     teamAgentId: number
@@ -183,6 +184,34 @@ export class PaymentService {
     isPersonalCommission: boolean
   }> {
     const teamCommission = await this.getTeamCommission(member)
+    
+    // 检查user的parentId是否是团队成员
+    try {
+      const user = await this.userService.findById(member.userId)
+      if (user && user.parentId && user.parentId > 0) {
+        try {
+          const teamMember = await this.teamMembersService.findByUserId(user.parentId)
+          if (teamMember && teamMember.commissionRate > 0) {
+            // 如果parentId是团队成员,计入个人分润
+            return {
+              teamAgentId: teamCommission.agentId,
+              teamCommissionRate: teamCommission.commissionRate, // 团队总分成比例
+              personalAgentId: teamMember.userId,
+              personalCommissionRate: teamMember.commissionRate, // 个人分成比例
+              isPersonalCommission: true
+            }
+          }
+        } catch (teamMemberError) {
+          // parentId不是团队成员,继续使用默认逻辑
+          this.app.log.debug(`User parentId ${user.parentId} is not a team member, using default commission`)
+        }
+      }
+    } catch (userError) {
+      // 获取user信息失败,继续使用默认逻辑
+      this.app.log.warn(`Failed to get user info for member ${member.id}, using default commission`, userError)
+    }
+    
+    // 默认只给团队分成
     return {
       teamAgentId: teamCommission.agentId,
       teamCommissionRate: teamCommission.commissionRate,

+ 46 - 1
src/services/promotion-link.service.ts

@@ -26,6 +26,47 @@ export class PromotionLinkService {
     return link
   }
 
+  /**
+   * 根据 memberId 查找推广链接
+   * @param memberId 团队成员ID
+   * @returns 推广链接或 null
+   */
+  async findByMemberId(memberId: number): Promise<PromotionLink | null> {
+    return this.promotionLinkRepository.findOne({ where: { memberId } })
+  }
+
+  /**
+   * 创建或更新推广链接(根据 memberId)
+   * 如果已存在相同 memberId 的记录,则更新;否则创建新记录
+   * @param data 推广链接数据
+   * @returns 推广链接
+   */
+  async createOrUpdateByMemberId(data: CreatePromotionLinkBody): Promise<PromotionLink> {
+    if (!data.memberId) {
+      // 如果没有 memberId,直接创建新记录
+      return this.create(data)
+    }
+
+    // 查找是否已存在相同 memberId 的记录
+    const existingLink = await this.findByMemberId(data.memberId)
+    
+    if (existingLink) {
+      // 如果存在,更新记录(只更新提供的字段)
+      const updateData: any = {}
+      if (data.teamId !== undefined) updateData.teamId = data.teamId
+      if (data.name !== undefined) updateData.name = data.name
+      if (data.image !== undefined) updateData.image = data.image
+      if (data.link !== undefined) updateData.link = data.link
+      if (data.type !== undefined) updateData.type = data.type
+      
+      await this.promotionLinkRepository.update(existingLink.id, updateData)
+      return this.findById(existingLink.id)
+    } else {
+      // 如果不存在,创建新记录
+      return this.create(data)
+    }
+  }
+
   /**
    * 处理图片链接,如果是OSS链接则生成签名URL
    * @param imageUrl 原始图片URL
@@ -72,7 +113,7 @@ export class PromotionLinkService {
   }
 
   async findAll(query: ListPromotionLinkQuery): Promise<PaginationResponse<PromotionLink>> {
-    const { page, size, name, type, teamId } = query
+    const { page, size, name, type, teamId, memberId } = query
     
     const where: any = {}
     
@@ -88,6 +129,10 @@ export class PromotionLinkService {
       where.teamId = teamId
     }
 
+    if (memberId) {
+      where.memberId = memberId
+    }
+
     const [links, total] = await this.promotionLinkRepository.findAndCount({
       where,
       skip: (Number(page) || 0) * (Number(size) || 20),