فهرست منبع

feat: 新增用户类型:应用推广信息,增加渠道推广管理相关接口

hidewnd 1 ماه پیش
والد
کامیت
82c5756ecf
23فایلهای تغییر یافته به همراه633 افزوده شده و 59 حذف شده
  1. 71 0
      yt-agent/agent-service/src/main/java/com/ytpm/controller/PromoterUserController.java
  2. 22 35
      yt-agent/agent-service/src/main/java/com/ytpm/controller/UserController.java
  3. 27 1
      yt-agent/agent-service/src/main/java/com/ytpm/dao/AgentUserMapper.java
  4. 30 0
      yt-agent/agent-service/src/main/java/com/ytpm/dao/PromoterUserMapper.java
  5. 39 0
      yt-agent/agent-service/src/main/java/com/ytpm/service/PromoterUserService.java
  6. 7 5
      yt-agent/agent-service/src/main/java/com/ytpm/service/impl/AgentAppServiceImpl.java
  7. 140 0
      yt-agent/agent-service/src/main/java/com/ytpm/service/impl/PromoterUserServiceImpl.java
  8. 101 1
      yt-agent/agent-service/src/main/resources/mapper/AgentUserMapper.xml
  9. 5 0
      yt-agent/agent-service/src/main/resources/mapper/AppMapper.xml
  10. 55 0
      yt-agent/agent-service/src/main/resources/mapper/PromoterUserMapper.xml
  11. 1 1
      yt-common/src/main/java/com/ytpm/agent/enums/UserTypeEnum.java
  12. 5 0
      yt-common/src/main/java/com/ytpm/agent/model/YtApp.java
  13. 48 0
      yt-common/src/main/java/com/ytpm/agent/model/YtPlatformUserPromoter.java
  14. 2 2
      yt-common/src/main/java/com/ytpm/agent/param/AppParam.java
  15. 32 0
      yt-common/src/main/java/com/ytpm/agent/param/PromoterAssignParam.java
  16. 24 0
      yt-common/src/main/java/com/ytpm/agent/param/PromoterUserParam.java
  17. 2 2
      yt-common/src/main/java/com/ytpm/agent/view/AgentAppView.java
  18. 9 0
      yt-common/src/main/java/com/ytpm/agent/view/AgentUserInfo.java
  19. 2 2
      yt-common/src/main/java/com/ytpm/app/model/YtAppDefaultConfig.java
  20. 2 2
      yt-common/src/main/java/com/ytpm/app/view/WxDefaultConfig.java
  21. 1 0
      yt-common/src/main/java/com/ytpm/oauth/model/YtPlatformUser.java
  22. 3 3
      yt-question/yt-question-service/src/main/java/com/ytpm/question/controller/UserController.java
  23. 5 5
      yt-question/yt-question-service/src/main/resources/mapper/AppUserMapper.xml

+ 71 - 0
yt-agent/agent-service/src/main/java/com/ytpm/controller/PromoterUserController.java

@@ -0,0 +1,71 @@
+package com.ytpm.controller;
+
+
+import com.ytpm.agent.param.PromoterAssignParam;
+import com.ytpm.agent.param.PromoterUserParam;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+import com.ytpm.middle.param.MiddleUserParam;
+import com.ytpm.middle.view.MiddleUserInfo;
+import com.ytpm.oauth.model.YtPlatformUser;
+import com.ytpm.service.PromoterUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.annotation.Resource;
+
+/**
+ * @author lih
+ * @date 2025-10-10 11:45
+ */
+@Api(tags = "渠道推广管理模块")
+@RestController
+@RequestMapping("/promoterUser")
+public class PromoterUserController {
+
+    @Resource
+    private PromoterUserService promoterUserService;
+
+    @ApiOperation("查询渠道所属用户列表")
+    @PostMapping("/queryList")
+    public ResultTable<YtPlatformUser> queryList(@RequestBody PromoterUserParam userParam) {
+        return promoterUserService.promoterUserList(userParam);
+    }
+
+    @ApiOperation("新增渠道所属用户")
+    @PostMapping("/addOne")
+    public Result<String> addOne(@RequestBody MiddleUserParam param, @ApiIgnore @AuthenticationPrincipal MiddleUserInfo userInfo) {
+        param.setOperatorId(userInfo.getUserId());
+        return Result.resultObjOk(promoterUserService.addOne(param, userInfo));
+    }
+
+    @ApiOperation("修改渠道所属用户")
+    @PostMapping("/updateOne")
+    public Result<String> updateOne(@RequestBody MiddleUserParam param, @ApiIgnore @AuthenticationPrincipal MiddleUserInfo userInfo) {
+        param.setOperatorId(userInfo.getUserId());
+        return Result.resultObjOk(promoterUserService.updateOne(param, userInfo));
+    }
+
+    @ApiOperation("删除渠道所属用户")
+    @ApiImplicitParam(name = "userId", value = "用户ID", required = true)
+    @GetMapping("/deleteOne")
+    public Result<String> deleteOne(@RequestParam(name = "userId") String userId) {
+        return Result.resultObjOk(promoterUserService.deleteOne(userId));
+    }
+
+    @ApiOperation("分配推广人")
+    @PostMapping("/assignment")
+    public Result<String> assignmentApp(@RequestBody PromoterAssignParam assignParam,
+                                        @ApiIgnore @AuthenticationPrincipal MiddleUserInfo userInfo) {
+        return Result.resultObjOk(promoterUserService.assignmentApp(assignParam, userInfo));
+    }
+}

+ 22 - 35
yt-agent/agent-service/src/main/java/com/ytpm/controller/UserController.java

@@ -1,60 +1,47 @@
 package com.ytpm.controller;
 
+import com.ytpm.agent.enums.UserTypeEnum;
+import com.ytpm.agent.model.YtPlatformUserPromoter;
 import com.ytpm.agent.view.AgentUserInfo;
+import com.ytpm.dao.AgentUserMapper;
+import com.ytpm.dao.PromoterUserMapper;
 import com.ytpm.general.Result;
-import com.ytpm.general.ResultTable;
-import com.ytpm.middle.param.AgentUserListParam;
-import com.ytpm.middle.param.MiddleUserParam;
-import com.ytpm.middle.view.MiddleUserInfo;
+import com.ytpm.oauth.model.YtPlatformUser;
 import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.security.core.annotation.AuthenticationPrincipal;
 import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
 
+import javax.annotation.Resource;
+import java.util.List;
+
 @Api(tags = "用户管理模块")
 @RestController
 @RequestMapping("/ytUser")
 public class UserController {
 
+    @Resource
+    private AgentUserMapper agentUserMapper;
+
+    @Resource
+    private PromoterUserMapper promoterUserMapper;
+
     @ApiOperation(value = "获取当前登录用户", notes = "无需传参")
     @GetMapping("/curUser")
     public Result<AgentUserInfo> getCurrentUser(@ApiIgnore @AuthenticationPrincipal AgentUserInfo userInfo) {
+        YtPlatformUser ytPlatformUser = userInfo == null ? null : agentUserMapper.selectPrimary(userInfo.getUserId());
+        if(userInfo != null && ytPlatformUser != null){
+            userInfo.setUserType(ytPlatformUser.getUserType());
+            if(UserTypeEnum.PLATFORM_USER.getCode().equals(userInfo.getUserType())){
+                List<YtPlatformUserPromoter> list = promoterUserMapper.selectPromoterByUserId(userInfo.getUserId());
+                userInfo.setPromoters(list);
+            }
+        }
         return Result.resultObjOk(userInfo);
     }
 
 
-    @ApiOperation("查询渠道所属用户列表")
-    @PostMapping("/queryList")
-    public ResultTable<MiddleUserInfo> queryList(@RequestBody AgentUserListParam param) {
-        return null;
-    }
-
-    @ApiOperation("新增渠道所属用户")
-    @PostMapping("/addOne")
-    public Result<String> addOne(@RequestBody MiddleUserParam param, @ApiIgnore @AuthenticationPrincipal MiddleUserInfo userInfo) {
-        param.setOperatorId(userInfo.getUserId());
-        return null;
-    }
-
-    @ApiOperation("修改渠道所属用户")
-    @PostMapping("/updateOne")
-    public Result<String> updateOne(@RequestBody MiddleUserParam param, @ApiIgnore @AuthenticationPrincipal MiddleUserInfo userInfo) {
-        param.setOperatorId(userInfo.getUserId());
-        return null;
-    }
-
-    @ApiOperation("删除渠道所属用户")
-    @ApiImplicitParam(name = "userId", value = "用户ID", required = true)
-    @GetMapping("/deleteOne")
-    public Result<String> deleteOne(@RequestParam(name = "userId")String userId) {
-        return null;
-    }
-
 }

+ 27 - 1
yt-agent/agent-service/src/main/java/com/ytpm/dao/AgentUserMapper.java

@@ -1,14 +1,40 @@
 package com.ytpm.dao;
 
+import com.ytpm.agent.param.PromoterUserParam;
 import com.ytpm.agent.view.AgentUserInfo;
+import com.ytpm.oauth.model.YtPlatformUser;
 import org.apache.ibatis.annotations.Param;
 import org.mapstruct.Mapper;
 
+import java.util.List;
+
 @Mapper
 public interface AgentUserMapper {
     /**
      * 获取当前登录用户信息
+     *
      * @param loginName 用户名
      */
-    AgentUserInfo getCurrentUserInfo(@Param("loginName")String loginName);
+    AgentUserInfo getCurrentUserInfo(@Param("loginName") String loginName);
+
+    /**
+     * 分页查询渠道管理用户列表
+     */
+    List<YtPlatformUser> selectListByParent(@Param("param") PromoterUserParam userParam);
+
+    /**
+     * 主键查询
+     */
+    YtPlatformUser selectPrimary(@Param("userId") String userId);
+
+    /**
+     * 新增推广用户
+     */
+    void insertOne(@Param("user") YtPlatformUser user);
+
+    /**
+     * 修改用户
+     */
+    void updateById(YtPlatformUser user);
+
 }

+ 30 - 0
yt-agent/agent-service/src/main/java/com/ytpm/dao/PromoterUserMapper.java

@@ -0,0 +1,30 @@
+package com.ytpm.dao;
+
+
+import com.ytpm.agent.model.YtPlatformUserPromoter;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author lih
+ * @date 2025-10-10 12:01
+ */
+public interface PromoterUserMapper {
+
+    /**
+     * 新增推广应用关系
+     */
+    void insertPromoter(@Param("promoter") YtPlatformUserPromoter promoter);
+
+    /**
+     * 查询应用推广配置信息
+     *
+     */
+    YtPlatformUserPromoter selectPromoterByAppId(@Param("appId") String appId);
+
+    /**
+     * 根据用户ID查询推广信息
+     */
+    List<YtPlatformUserPromoter> selectPromoterByUserId(@Param("userId") String userId);
+}

+ 39 - 0
yt-agent/agent-service/src/main/java/com/ytpm/service/PromoterUserService.java

@@ -0,0 +1,39 @@
+package com.ytpm.service;
+
+
+import com.ytpm.agent.param.PromoterAssignParam;
+import com.ytpm.agent.param.PromoterUserParam;
+import com.ytpm.general.ResultTable;
+import com.ytpm.middle.param.MiddleUserParam;
+import com.ytpm.middle.view.MiddleUserInfo;
+import com.ytpm.oauth.model.YtPlatformUser;
+
+/**
+ * 渠道推广人服务
+ * @author lih
+ * @date 2025-10-10 11:33
+ */
+public interface PromoterUserService {
+
+    ResultTable<YtPlatformUser> promoterUserList(PromoterUserParam userParam);
+
+    /**
+     * 新增渠道推广人
+     */
+    String addOne(MiddleUserParam param, MiddleUserInfo userInfo);
+
+    /**
+     * 修改渠道推广人
+     */
+    String updateOne(MiddleUserParam param, MiddleUserInfo userInfo);
+
+    /**
+     * 删除渠道推广人
+     */
+    String deleteOne(String userId);
+
+    /**
+     * 分配至渠道应用
+     */
+    String assignmentApp(PromoterAssignParam assignParam, MiddleUserInfo userInfo);
+}

+ 7 - 5
yt-agent/agent-service/src/main/java/com/ytpm/service/impl/AgentAppServiceImpl.java

@@ -4,15 +4,10 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.text.CharSequenceUtil;
 import cn.hutool.core.util.IdUtil;
-import cn.hutool.core.util.StrUtil;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.ytpm.advertise.enums.AppCategoryEnum;
-import com.ytpm.advertise.param.AddAppParam;
-import com.ytpm.advertise.param.ComprehensiveReportParam;
 import com.ytpm.advertise.param.RelativeChannelParam;
-import com.ytpm.advertise.view.AddAppResponse;
-import com.ytpm.advertise.view.ComprehensiveAppReport;
 import com.ytpm.agent.model.YtApp;
 import com.ytpm.agent.model.YtAppChannelRelative;
 import com.ytpm.agent.model.YtPlatformUserApp;
@@ -111,6 +106,12 @@ public class AgentAppServiceImpl implements AgentAppService {
         BeanUtil.copyProperties(param, app);
         if(CharSequenceUtil.isNotBlank(param.getAppId())){
             appMapper.updateOne(app);
+            // 同步更新子服务相关配置
+            YtPlatformUserApp superior = agentAppMapper.selectByPrimaryKey(param.getSuperiorId());
+            YtAppDefaultConfig config = new YtAppDefaultConfig();
+            config.setAppId(app.getAppId());
+            config.setRevenueDisplayRate(app.getRevenueDisplayRate());
+            feignInvoker.invoke(superior.getServiceName(), "updateAppConfig", config);
         }else{
             //同一个应用同一个渠道只能出一个包
             YtApp exist = appMapper.getByDitchIdAndSuperiorId(param.getDitchId(),param.getSuperiorId());
@@ -160,6 +161,7 @@ public class AgentAppServiceImpl implements AgentAppService {
         //远程调用指定应用保存 应用的出包配置
         YtPlatformUserApp superior = agentAppMapper.selectByPrimaryKey(param.getSuperiorId());
         YtAppDefaultConfig config = new YtAppDefaultConfig(null, param.getAppName(), vo.getWxAppId(), vo.getWxSecret(), app.getAppId(), app.getAppId(), appType,ditchId);
+        config.setRevenueDisplayRate(app.getRevenueDisplayRate());
         feignInvoker.invoke(superior.getServiceName(), "saveAppConfig",config);
     }
 

+ 140 - 0
yt-agent/agent-service/src/main/java/com/ytpm/service/impl/PromoterUserServiceImpl.java

@@ -0,0 +1,140 @@
+package com.ytpm.service.impl;
+
+
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.ytpm.agent.enums.UserTypeEnum;
+import com.ytpm.agent.model.YtApp;
+import com.ytpm.agent.model.YtPlatformUserPromoter;
+import com.ytpm.agent.param.PromoterAssignParam;
+import com.ytpm.agent.param.PromoterUserParam;
+import com.ytpm.dao.AgentUserMapper;
+import com.ytpm.dao.AppMapper;
+import com.ytpm.dao.PromoterUserMapper;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.ResultTable;
+import com.ytpm.handle.CustomerException;
+import com.ytpm.middle.param.MiddleUserParam;
+import com.ytpm.middle.view.MiddleUserInfo;
+import com.ytpm.oauth.model.YtPlatformUser;
+import com.ytpm.service.PromoterUserService;
+import com.ytpm.util.IDUtil;
+import com.ytpm.util.RandomPasswordGenerator;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author lih
+ * @date 2025-10-10 11:45
+ */
+@Slf4j
+@Service
+public class PromoterUserServiceImpl implements PromoterUserService {
+
+    @Resource
+    private AgentUserMapper agentUserMapper;
+
+    @Resource
+    private PromoterUserMapper promoterUserMapper;
+
+    @Resource
+    private AppMapper appMapper;
+
+    @Override
+    public ResultTable<YtPlatformUser> promoterUserList(PromoterUserParam userParam) {
+        PageHelper.startPage(userParam.getPage(), userParam.getLimit());
+        List<YtPlatformUser> userList = agentUserMapper.selectListByParent(userParam);
+        return ResultTable.resultTableOk(new PageInfo<>(userList));
+    }
+
+    @Override
+    public String addOne(MiddleUserParam param, MiddleUserInfo userInfo) {
+        //根据登录名生成登录账号
+        YtPlatformUser user = new YtPlatformUser();
+        user.setUserId(IDUtil.generateFlowID("yt_agent_"));
+        user.setAccountStatus(1);
+        user.setUserType(UserTypeEnum.APP_PROMOTER.getCode());
+        user.setNickName(param.getNickName());
+        user.setLoginName(param.getLoginName());
+        String generatedPassword = RandomPasswordGenerator.generatePassword(8);
+        log.info("创建推广用户成功,您本次的登录密码为:{}", generatedPassword);
+        user.setEncryptPwd(new BCryptPasswordEncoder().encode(generatedPassword));
+        user.setPhone(param.getPhone());
+        user.setLastLoginTime(new Date());
+        user.setRegistryTime(new Date());
+        user.setParentUserId(userInfo.getUserId());
+        agentUserMapper.insertOne(user);
+        return RepMessage.ADD_SUCCESS;
+    }
+
+    @Override
+    public String updateOne(MiddleUserParam param, MiddleUserInfo userInfo) {
+        YtPlatformUser platformUser = agentUserMapper.selectPrimary(param.getUserId());
+        if (Objects.isNull(platformUser)) {
+            return RepMessage.OBJECT_NOT_EXIST;
+        }
+        //修改用户信息
+        YtPlatformUser user = new YtPlatformUser();
+        BeanUtils.copyProperties(param, user);
+        if (StrUtil.isNotBlank(param.getPassword())) {
+            BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
+            user.setEncryptPwd(encoder.encode(param.getPassword()));
+        }
+
+        agentUserMapper.updateById(user);
+        return RepMessage.MODIFY_SUCCESS;
+    }
+
+    @Override
+    public String deleteOne(String userId) {
+        YtPlatformUser platformUser = agentUserMapper.selectPrimary(userId);
+        if (Objects.isNull(platformUser)) {
+            return RepMessage.OBJECT_NOT_EXIST;
+        }
+        platformUser = new YtPlatformUser();
+        platformUser.setUserId(userId);
+        platformUser.setAccountStatus(2);
+        agentUserMapper.updateById(platformUser);
+        return RepMessage.DELETE_SUCCESS;
+    }
+
+    @Override
+    public String assignmentApp(PromoterAssignParam assignParam, MiddleUserInfo userInfo) {
+        YtApp ytApp = appMapper.selectPrimary(assignParam.getAppId());
+        if (ytApp == null) {
+            throw new CustomerException("应用不存在!");
+        }
+        // 校验 一个子包应用只允许一个推广人
+        YtPlatformUserPromoter promoter = promoterUserMapper.selectPromoterByAppId(ytApp.getAppId());
+        if (promoter != null) {
+            throw new CustomerException("该应用已绑定推广人!");
+        }
+        // 开始时间为空则默认当前时间
+        if (assignParam.getStartTime() == null) {
+            assignParam.setStartTime(new Date());
+        }
+        promoter = new YtPlatformUserPromoter();
+        promoter.setRelationId(IdUtil.fastSimpleUUID());
+        promoter.setPlatformUserId(userInfo.getUserId());
+        promoter.setPromoterUserId(assignParam.getUserId());
+        promoter.setAppId(ytApp.getAppId());
+        promoter.setDitchId(ytApp.getDitchId());
+        promoter.setShareRate(assignParam.getShareRate());
+        promoter.setStartTime(assignParam.getStartTime());
+        promoter.setEndTime(assignParam.getEndTime());
+        promoter.setOperatorId(userInfo.getUserId());
+        promoter.setOperatorTime(new Date());
+        promoterUserMapper.insertPromoter(promoter);
+        log.info("[agent promoter]渠道商为应用{}指派推广人{}", ytApp.getAppId(), assignParam.getUserId());
+        return RepMessage.SAVE_SUCCESS;
+    }
+}

+ 101 - 1
yt-agent/agent-service/src/main/resources/mapper/AgentUserMapper.xml

@@ -4,9 +4,109 @@
 
     <select id="getCurrentUserInfo" resultType="com.ytpm.agent.view.AgentUserInfo">
         select
-            user_id, nick_name, head_image, login_name, encrypt_pwd, salt, phone, last_login_time, account_status,  user_type, registry_time
+            user_id, nick_name, head_image, login_name, encrypt_pwd, salt, phone,
+            last_login_time, account_status,  user_type, registry_time, parent_user_id
         from yt_platform_user
         where account_status = 1
         and login_name = #{loginName}
     </select>
+
+    <select id="selectPrimary" resultType="com.ytpm.oauth.model.YtPlatformUser">
+        select
+            user_id, nick_name, head_image, login_name, encrypt_pwd, salt, phone,
+            last_login_time,  account_status,  user_type,  registry_time, parent_user_id
+        from yt_platform_user
+        where user_id = #{userId}
+    </select>
+
+    <select id="selectListByParent" resultType="com.ytpm.oauth.model.YtPlatformUser">
+        select
+            user_id,
+            nick_name,
+            head_image,
+            login_name,
+            encrypt_pwd,
+            salt,
+            phone,
+            last_login_time,
+            account_status,
+            user_type,
+            registry_time,
+            dept_id,
+            super_admin,
+            parent_user_id
+        from yt_platform_user ypu
+        where ypu.user_type = 11
+          and ypu.parent_user_id = #{param.parentUserId}
+          and ypu.account_status = 1
+        order by ypu.registry_time
+    </select>
+
+    <insert id="insertOne">
+        insert into yt_platform_user(user_id,
+                                     nick_name,
+                                     head_image,
+                                     login_name,
+                                     encrypt_pwd,
+                                     phone,
+                                     last_login_time,
+                                     account_status,
+                                     user_type,
+                                     registry_time,
+                                     parent_user_id)
+        values (#{user.userId},
+                #{user.nickName},
+                #{user.headImage},
+                #{user.loginName},
+                #{user.encryptPwd},
+                #{user.phone},
+                #{user.lastLoginTime},
+                #{user.accountStatus},
+                #{user.userType},
+                #{user.registryTime},
+                #{user.parentUserId});
+    </insert>
+
+    <update id="updateById">
+        update yt_platform_user
+        <set>
+            <if test="nickName != null">
+                nick_name = #{nickName},
+            </if>
+            <if test="headImage != null">
+                head_image = #{headImage},
+            </if>
+            <if test="loginName != null">
+                login_name = #{loginName},
+            </if>
+            <if test="encryptPwd != null">
+                encrypt_pwd = #{encryptPwd},
+            </if>
+            <if test="salt != null">
+                salt = #{salt},
+            </if>
+            <if test="phone != null">
+                phone = #{phone},
+            </if>
+            <if test="lastLoginTime != null">
+                last_login_time = #{lastLoginTime},
+            </if>
+            <if test="accountStatus != null">
+                account_status = #{accountStatus},
+            </if>
+            <if test="userType != null">
+                user_type = #{userType},
+            </if>
+            <if test="registryTime != null">
+                registry_time = #{registryTime},
+            </if>
+            <if test="parentUserId != null">
+                parent_user_id = #{parentUserId},
+            </if>
+            <if test="deptId != null">
+                dept_id = #{deptId}
+            </if>
+        </set>
+        where user_id = #{userId}
+    </update>
 </mapper>

+ 5 - 0
yt-agent/agent-service/src/main/resources/mapper/AppMapper.xml

@@ -27,6 +27,7 @@
          ditch_id,
          ditch_name,
          superior_id,
+         revenue_display_rate,
          enabled
         )
         values
@@ -53,6 +54,7 @@
          #{ditchId},
          #{ditchName},
          #{superiorId},
+         #{revenueDisplayRate},
          #{enabled}
         )
     </insert>
@@ -119,6 +121,9 @@
             <if test="ditchName != null">
                 ditch_name = #{ditchName},
             </if>
+            <if test="revenueDisplayRate != null">
+                revenue_display_rate = #{revenueDisplayRate},
+            </if>
             <if test="superiorId != null">
                 superior_id = #{superiorId}
             </if>

+ 55 - 0
yt-agent/agent-service/src/main/resources/mapper/PromoterUserMapper.xml

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.PromoterUserMapper">
+
+    <insert id="insertPromoter">
+        insert into yt_platform_user_promoter
+        (relation_id, paltform_user_id, promoter_user_id, ditch_id, app_id, share_rate, start_time, end_time,
+         operator_id, operator_time)
+        values (#{promoter.relationId},
+                #{promoter.platformUserId},
+                #{promoter.promoterUserId},
+                #{promoter.ditchId},
+                #{promoter.appId},
+                #{promoter.shareRate},
+                #{promoter.startTime},
+                #{promoter.endTime},
+                #{promoter.operatorId},
+                #{promoter.operatorTime});
+
+    </insert>
+
+    <select id="selectPromoterByAppId" resultType="com.ytpm.agent.model.YtPlatformUserPromoter">
+        select relation_id,
+               paltform_user_id,
+               promoter_user_id,
+               ditch_id,
+               app_id,
+               share_rate,
+               start_time,
+               end_time,
+               operator_id,
+               operator_time
+        from yt_platform_user_promoter
+        where app_id = #{appId}
+        and (end_time is null or end_time <![CDATA[ <= ]]> current_date())
+        limit 1
+    </select>
+    <select id="selectPromoterByUserId" resultType="com.ytpm.agent.model.YtPlatformUserPromoter">
+        select relation_id,
+               paltform_user_id,
+               promoter_user_id,
+               ditch_id,
+               app_id,
+               share_rate,
+               start_time,
+               end_time,
+               operator_id,
+               operator_time
+        from yt_platform_user_promoter
+        where promoter_user_id = #{userId}
+            and (end_time is null or end_time <![CDATA[ <= ]]> current_date())
+        order by start_time
+    </select>
+
+</mapper>

+ 1 - 1
yt-common/src/main/java/com/ytpm/agent/enums/UserTypeEnum.java

@@ -15,7 +15,7 @@ import lombok.Getter;
 public enum UserTypeEnum {
     AGENT_LEVEL_1(1, "一级代理商"),
     AGENT_LEVEL_2(2, "二级代理商"),
-    APP_PROMOTER(11, "应用推销员"),
+    APP_PROMOTER(11, "渠道推广人"),
     PLATFORM_USER(99, "平台用户"),
     ;
     private final Integer code;

+ 5 - 0
yt-common/src/main/java/com/ytpm/agent/model/YtApp.java

@@ -110,5 +110,10 @@ public class YtApp {
      */
     private String superiorId;
 
+    /**
+     * 收益 显示比例
+     */
+    private String revenueDisplayRate;
+
 
 }

+ 48 - 0
yt-common/src/main/java/com/ytpm/agent/model/YtPlatformUserPromoter.java

@@ -0,0 +1,48 @@
+package com.ytpm.agent.model;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author lih
+ * @date 2025-10-10 13:57
+ */
+@Data
+@ApiModel("渠道应用推广关系表")
+public class YtPlatformUserPromoter implements Serializable {
+
+    @ApiModelProperty("关系表ID")
+    private String relationId;
+
+    @ApiModelProperty("渠道商ID")
+    private String platformUserId;
+
+    @ApiModelProperty("推广人ID")
+    private String promoterUserId;
+
+    @ApiModelProperty("渠道ID")
+    private Long ditchId;
+
+    @ApiModelProperty("应用ID")
+    private String appId;
+
+    @ApiModelProperty("分成比例(%)")
+    private String shareRate;
+
+    @ApiModelProperty("开始时间")
+    private Date startTime;
+
+    @ApiModelProperty("结束时间")
+    private Date endTime;
+
+    @ApiModelProperty("操作人")
+    private String operatorId;
+
+    @ApiModelProperty("操作时间")
+    private Date operatorTime;
+}

+ 2 - 2
yt-common/src/main/java/com/ytpm/agent/param/AppParam.java

@@ -89,6 +89,6 @@ public class AppParam {
     @ApiModelProperty("是否允许自动刷新")
     private Integer canAllowAutoRefresh;
 
-    @ApiModelProperty("收益 分层系数")
-    private String stratificationRate;
+    @ApiModelProperty("收益 显示比例")
+    private String revenueDisplayRate;
 }

+ 32 - 0
yt-common/src/main/java/com/ytpm/agent/param/PromoterAssignParam.java

@@ -0,0 +1,32 @@
+package com.ytpm.agent.param;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author lih
+ * @date 2025-10-10 11:39
+ */
+@Data
+@ApiModel("渠道推广指派参数")
+public class PromoterAssignParam implements Serializable {
+
+    private String userId;
+
+    private Long ditchId;
+
+    private String appId;
+
+    private String shareRate;
+
+    @ApiModelProperty("开始时间")
+    private Date startTime;
+
+    @ApiModelProperty("结束时间")
+    private Date endTime;
+}

+ 24 - 0
yt-common/src/main/java/com/ytpm/agent/param/PromoterUserParam.java

@@ -0,0 +1,24 @@
+package com.ytpm.agent.param;
+
+
+import com.ytpm.general.PageMeta;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author lih
+ * @date 2025-10-10 14:17
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel("渠道管理列表入参")
+public class PromoterUserParam extends PageMeta {
+
+    private String parentUserId;
+
+}

+ 2 - 2
yt-common/src/main/java/com/ytpm/agent/view/AgentAppView.java

@@ -176,7 +176,7 @@ public class AgentAppView {
     @ApiModelProperty("是否允许自动刷新")
     private Integer canAllowAutoRefresh;
 
-    @ApiModelProperty("收益 分层系数")
-    private String stratificationRate;
+    @ApiModelProperty("收益 显示比例")
+    private String revenueDisplayRate;
 
 }

+ 9 - 0
yt-common/src/main/java/com/ytpm/agent/view/AgentUserInfo.java

@@ -1,5 +1,7 @@
 package com.ytpm.agent.view;
 
+import com.ytpm.agent.model.YtPlatformUserPromoter;
+import com.ytpm.oauth.model.YtPlatformUser;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -10,6 +12,7 @@ import org.springframework.security.core.GrantedAuthority;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
+import java.util.List;
 
 @Data
 @NoArgsConstructor
@@ -31,6 +34,12 @@ public class AgentUserInfo {
     @ApiModelProperty("最新登录IP")
     private String lastLoginIp;
 
+    @ApiModelProperty("用户类型")
+    private Integer userType;
+
+    @ApiModelProperty("推广关联集合")
+    private List<YtPlatformUserPromoter> promoters;
+
     public Collection<? extends GrantedAuthority> getAuthorities() {
         return Collections.emptyList();
     }

+ 2 - 2
yt-common/src/main/java/com/ytpm/app/model/YtAppDefaultConfig.java

@@ -80,8 +80,8 @@ public class YtAppDefaultConfig {
     @ApiModelProperty("是否允许自动刷新")
     private Integer canAllowAutoRefresh;
 
-    @ApiModelProperty("收益 分层系数")
-    private String stratificationRate;
+    @ApiModelProperty("收益 显示比例")
+    private String revenueDisplayRate;
 
     public YtAppDefaultConfig(Object o, String appName, String wxAppId, String wxSecret, String appId, String appKey, int appType,String ditchId) {
         this.configId = Objects.isNull(o)?null: Integer.parseInt(o.toString());

+ 2 - 2
yt-common/src/main/java/com/ytpm/app/view/WxDefaultConfig.java

@@ -76,6 +76,6 @@ public class WxDefaultConfig {
     @ApiModelProperty("是否允许自动刷新")
     private Integer canAllowAutoRefresh;
 
-    @ApiModelProperty("收益 分层系数")
-    private String stratificationRate;
+    @ApiModelProperty("收益 显示比例")
+    private String revenueDisplayRate;
 }

+ 1 - 0
yt-common/src/main/java/com/ytpm/oauth/model/YtPlatformUser.java

@@ -28,6 +28,7 @@ public class YtPlatformUser implements UserDetails {
     private Integer userType;
     private Integer superAdmin;
     private Date registryTime;
+    private String parentUserId;
 
     @Override
     public Collection<? extends GrantedAuthority> getAuthorities() {

+ 3 - 3
yt-question/yt-question-service/src/main/java/com/ytpm/question/controller/UserController.java

@@ -166,11 +166,11 @@ public class UserController {
             user.setAnswerRecordList(questionMapper.getAnswerRecords(userId));
             WxDefaultConfig defaultConfig = appUserMapper.getDefaultConfigByAppId(user.getAppId());
             // 分层系数
-            String stratificationRate = defaultConfig == null ? "" : defaultConfig.getStratificationRate();
+            String revenueDisplayRate = defaultConfig == null ? "" : defaultConfig.getRevenueDisplayRate();
             BigDecimal todayRevenue = adRecordMapper.getToTalRevenue(userId, 1);
             BigDecimal totalRevenue = user.getTotalIncome() == null ? adRecordMapper.getToTalRevenue(userId, 2) : user.getTotalIncome();
-            if (StrUtil.isNotEmpty(stratificationRate)) {
-                BigDecimal rate = NumberUtils.rateToBigDecimal(stratificationRate);
+            if (StrUtil.isNotEmpty(revenueDisplayRate)) {
+                BigDecimal rate = NumberUtils.rateToBigDecimal(revenueDisplayRate);
                 todayRevenue = todayRevenue.multiply(rate).setScale(5, RoundingMode.HALF_UP);
                 totalRevenue = totalRevenue.multiply(rate).setScale(5, RoundingMode.HALF_UP);
             }

+ 5 - 5
yt-question/yt-question-service/src/main/resources/mapper/AppUserMapper.xml

@@ -453,8 +453,8 @@
             <if test="canAllowAutoRefresh != null">
                 can_allow_auto_refresh = #{canAllowAutoRefresh},
             </if>
-            <if test="stratificationRate != null">
-                stratification_rate = #{stratificationRate}
+            <if test="revenueDisplayRate != null">
+                revenue_display_rate = #{revenueDisplayRate}
             </if>
         </set>
         where app_id = #{appId}
@@ -470,7 +470,7 @@
             can_use_root, can_use_adb, can_use_float, can_accumulation,
             ditch_id, power_wait_time, interstitial_interval_time,
             low_value_tip, brush_tip,flow_interval_time,task_limit_tip,start_wait_time,
-            can_cache_video,can_allow_auto_refresh, stratification_rate
+            can_cache_video,can_allow_auto_refresh, revenue_display_rate
         from yt_app_default_config
         where app_type = #{appType}
     </select>
@@ -481,7 +481,7 @@
             taku_reward_pid, taku_interstitial_pid, can_use_root, can_use_adb, can_use_float, can_accumulation,
             ditch_id, power_wait_time, interstitial_interval_time,
             low_value_tip, brush_tip,flow_interval_time,task_limit_tip,start_wait_time,
-            can_cache_video,can_allow_auto_refresh, stratification_rate
+            can_cache_video,can_allow_auto_refresh, revenue_display_rate
         from yt_app_default_config
         where app_id = #{appId}
     </select>
@@ -492,7 +492,7 @@
             taku_reward_pid, taku_interstitial_pid, can_use_root, can_use_adb, can_use_float, can_accumulation,
             ditch_id, power_wait_time, interstitial_interval_time,
             low_value_tip, brush_tip,flow_interval_time,task_limit_tip,start_wait_time,
-            can_cache_video,can_allow_auto_refresh, stratification_rate
+            can_cache_video,can_allow_auto_refresh, revenue_display_rate
         from yt_app_default_config
         where app_id in
         <foreach collection="appIds.split(',')" item="item" separator="," open="(" close=")">