Procházet zdrojové kódy

提交群裂变的后台相关接口

hxl13994548489 před 7 měsíci
rodič
revize
76fe3fd4cc
62 změnil soubory, kde provedl 3337 přidání a 5 odebrání
  1. 6 0
      linkwe-auth/bin/src/main/resources/mapper/system/SysUserMapper.xml
  2. 199 0
      linkwe-auth/src/main/java/com/linkwechat/web/controller/system/WeGroupFissionController.java
  3. 7 0
      linkwe-auth/src/main/java/com/linkwechat/web/mapper/SysUserMapper.java
  4. 8 5
      linkwe-auth/src/main/java/com/linkwechat/web/service/ISysUserService.java
  5. 22 0
      linkwe-auth/src/main/java/com/linkwechat/web/service/impl/SysUserServiceImpl.java
  6. 6 0
      linkwe-common/pom.xml
  7. 109 0
      linkwe-common/src/main/java/com/linkwechat/common/utils/WxMiniProgramSchemeUtil.java
  8. 337 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/bdsh/LocalMerchantInfo.java
  9. 170 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/bdsh/LocalRightsInfo.java
  10. 76 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/bdsh/LotteryActivity.java
  11. 27 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/dto/DistDto.java
  12. 33 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/dto/InvitationUserDto.java
  13. 29 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/dto/UserRewardDetailDto.java
  14. 34 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/dto/UserRewardDto.java
  15. 99 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/dto/WeGroupFissionDetailDto.java
  16. 51 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/dto/WeGroupFissionDto.java
  17. 105 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/entity/WeGroupFission.java
  18. 59 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/entity/WeGroupFissionExtraRecord.java
  19. 47 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/entity/WeGroupFissionInvitationRecord.java
  20. 53 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/entity/WeGroupFissionStepRecord.java
  21. 62 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/entity/WeGroupFissionStepUserRecord.java
  22. 33 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/vo/AddWecomGroupVo.java
  23. 33 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/vo/CreateWechatGroupFissionUrlVo.java
  24. 103 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/vo/WeGroupFissionAddVo.java
  25. 45 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/vo/WeGroupFissionExtraVo.java
  26. 34 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/vo/WeGroupFissionFlagVo.java
  27. 37 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/vo/WeGroupFissionStepAppVo.java
  28. 31 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/vo/WeGroupFissionStepVo.java
  29. 49 0
      linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/vo/WeGroupFissionVo.java
  30. 24 0
      linkwe-service/src/main/java/com/linkwechat/mapper/FissionMerchantInfoMapper.java
  31. 23 0
      linkwe-service/src/main/java/com/linkwechat/mapper/LocalRightsInfoMapper.java
  32. 28 0
      linkwe-service/src/main/java/com/linkwechat/mapper/LotteryActivityMapper.java
  33. 9 0
      linkwe-service/src/main/java/com/linkwechat/mapper/WeGroupFissionDictDtoMapper.java
  34. 21 0
      linkwe-service/src/main/java/com/linkwechat/mapper/WeGroupFissionExtraRecordMapper.java
  35. 14 0
      linkwe-service/src/main/java/com/linkwechat/mapper/WeGroupFissionInvitationRecordMapper.java
  36. 33 0
      linkwe-service/src/main/java/com/linkwechat/mapper/WeGroupFissionMapper.java
  37. 21 0
      linkwe-service/src/main/java/com/linkwechat/mapper/WeGroupFissionStepRecordMapper.java
  38. 14 0
      linkwe-service/src/main/java/com/linkwechat/mapper/WeGroupFissionStepUserRecordMapper.java
  39. 22 0
      linkwe-service/src/main/java/com/linkwechat/service/ILotteryActivityService.java
  40. 30 0
      linkwe-service/src/main/java/com/linkwechat/service/IWeGroupFissionExtraRecordService.java
  41. 32 0
      linkwe-service/src/main/java/com/linkwechat/service/IWeGroupFissionInvitationRecordService.java
  42. 92 0
      linkwe-service/src/main/java/com/linkwechat/service/IWeGroupFissionService.java
  43. 30 0
      linkwe-service/src/main/java/com/linkwechat/service/IWeGroupFissionStepRecordService.java
  44. 31 0
      linkwe-service/src/main/java/com/linkwechat/service/IWeGroupFissionStepUserRecordService.java
  45. 27 0
      linkwe-service/src/main/java/com/linkwechat/service/LocalMerchantInfoService.java
  46. 23 0
      linkwe-service/src/main/java/com/linkwechat/service/LocalRightsInfoService.java
  47. 46 0
      linkwe-service/src/main/java/com/linkwechat/service/impl/LocalMerchantInfoServiceImpl.java
  48. 42 0
      linkwe-service/src/main/java/com/linkwechat/service/impl/LocalRightsInfoServiceImpl.java
  49. 35 0
      linkwe-service/src/main/java/com/linkwechat/service/impl/LotteryActivityServiceImpl.java
  50. 40 0
      linkwe-service/src/main/java/com/linkwechat/service/impl/WeGroupFissionExtraRecordServiceImpl.java
  51. 51 0
      linkwe-service/src/main/java/com/linkwechat/service/impl/WeGroupFissionInvitationRecordServiceImpl.java
  52. 525 0
      linkwe-service/src/main/java/com/linkwechat/service/impl/WeGroupFissionServiceImpl.java
  53. 41 0
      linkwe-service/src/main/java/com/linkwechat/service/impl/WeGroupFissionStepRecordServiceImpl.java
  54. 62 0
      linkwe-service/src/main/java/com/linkwechat/service/impl/WeGroupFissionStepUserRecordServiceImpl.java
  55. 7 0
      linkwe-service/src/main/resources/mapper/wecom/FissionMerchantInfoMapper.xml
  56. 5 0
      linkwe-service/src/main/resources/mapper/wecom/LocalRightsInfoMapper.xml
  57. 22 0
      linkwe-service/src/main/resources/mapper/wecom/LotteryActivityMapper.xml
  58. 8 0
      linkwe-service/src/main/resources/mapper/wecom/WeGroupFissionExtraRecordMapper.xml
  59. 5 0
      linkwe-service/src/main/resources/mapper/wecom/WeGroupFissionInvitationRecordMapper.xml
  60. 57 0
      linkwe-service/src/main/resources/mapper/wecom/WeGroupFissionMapper.xml
  61. 8 0
      linkwe-service/src/main/resources/mapper/wecom/WeGroupFissionStepRecordMapper.xml
  62. 5 0
      linkwe-service/src/main/resources/mapper/wecom/WeGroupFissionStepUserRecordMapper.xml

+ 6 - 0
linkwe-auth/bin/src/main/resources/mapper/system/SysUserMapper.xml

@@ -640,4 +640,10 @@
         WHERE
             u.we_user_id=#{weUserId}
     </select>
+    <select id="getUserDictList" resultType="com.linkwechat.common.core.domain.entity.SysUser">
+        SELECT
+            su.*
+        FROM
+            sys_user su
+    </select>
 </mapper>

+ 199 - 0
linkwe-auth/src/main/java/com/linkwechat/web/controller/system/WeGroupFissionController.java

@@ -0,0 +1,199 @@
+package com.linkwechat.web.controller.system;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.linkwechat.common.annotation.InnerAuth;
+import com.linkwechat.common.core.controller.BaseController;
+import com.linkwechat.common.core.domain.AjaxResult;
+import com.linkwechat.common.core.page.TableDataInfo;
+import com.linkwechat.domain.weGroupFission.dto.DistDto;
+import com.linkwechat.domain.weGroupFission.dto.WeGroupFissionDetailDto;
+import com.linkwechat.domain.weGroupFission.dto.WeGroupFissionDto;
+import com.linkwechat.domain.weGroupFission.entity.WeGroupFission;
+import com.linkwechat.domain.weGroupFission.vo.CreateWechatGroupFissionUrlVo;
+import com.linkwechat.domain.weGroupFission.vo.WeGroupFissionAddVo;
+import com.linkwechat.domain.weGroupFission.vo.WeGroupFissionVo;
+import com.linkwechat.service.IWeGroupFissionService;
+import com.linkwechat.web.service.ISysUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+* @Description: 群裂变活动表
+* @Author: jeecg-boot
+* @Date:   2026-01-28
+* @Version: V1.0
+*/
+@Slf4j
+//@Api(tags="群裂变后台接口相关")
+@RestController
+@RequestMapping("system/weGroupFission")
+@CrossOrigin
+public class WeGroupFissionController extends BaseController {
+   @Autowired
+   private IWeGroupFissionService weGroupFissionService;
+
+   @Autowired
+   private ISysUserService sysUserService;
+
+   /**
+    *  @version
+    *  @author: hxl
+    *  @Date: 2026/1/28 10:43
+    *  @Description:  后台分页列表
+    */
+   //@ApiOperation(value="群裂变活动表-分页列表查询", notes="群裂变活动表-分页列表查询")
+   @PostMapping(value = "/list")
+   public TableDataInfo<?> queryPageList(@RequestBody WeGroupFissionVo weGroupFissionVo){
+       return weGroupFissionService.getPageList(weGroupFissionVo);
+   }
+
+   /**
+    *  @version
+    *  @author: hxl
+    *  @Date: 2026/1/28 11:10
+    *  @Description:
+    */
+   //@ApiOperation(value="群裂变活动表-添加或者修改", notes="群裂变活动表-添加或者修改")
+   @PostMapping(value = "/addOrUpdate")
+   public AjaxResult addOrUpdate(@RequestBody  @Valid WeGroupFissionAddVo weGroupFissionAddVo) {
+       try{
+           weGroupFissionService.addOrUpdate(weGroupFissionAddVo);
+           return AjaxResult.success();
+       }catch (Exception e){
+           return AjaxResult.error(e.getMessage());
+       }
+   }
+
+   /**
+    *  @version
+    *  @author: hxl
+    *  @Date: 2026/1/28 11:11
+    *  @Description:  详情接口
+    */
+    //@ApiOperation(value="群裂变活动表-详情接口", notes="群裂变活动表-详情接口")
+    @GetMapping(value = "/queryById")
+    public AjaxResult queryById(@RequestParam(name="id",required=true) String id) {
+        try{
+            WeGroupFissionDetailDto weGroupFissionDetailDto = weGroupFissionService.queryDetailById(id,"1");
+            return AjaxResult.success(weGroupFissionDetailDto);
+        }catch (Exception e){
+            return AjaxResult.error(e.getMessage());
+        }
+    }
+
+   /**
+    *  @version
+    *  @author: hxl
+    *  @Date: 2026/1/28 11:11
+    *  @Description: 通过id删除数据
+    */
+   //@ApiOperation(value="群裂变活动表-通过id删除", notes="群裂变活动表-通过id删除")
+   @DeleteMapping(value = "/delete")
+   public AjaxResult delete(@RequestParam(name="id",required=true) String id) {
+       try{
+           weGroupFissionService.deleteByWeGroupFissionId(id);
+           return AjaxResult.success();
+       }catch (Exception e){
+           return AjaxResult.error(e.getMessage());
+       }
+   }
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 15:42
+     *  @Description: 生成小程序的群裂变页面加密链接
+     */
+    //@ApiOperation(value="群裂变活动表-群打卡微信小程序短链", notes="群裂变活动表-群打卡微信小程序短链")
+    @PostMapping(value = "/getWechatGroupFissionUrl")
+    public AjaxResult getWechatGroupFissionUrl(@RequestBody CreateWechatGroupFissionUrlVo createWechatGroupFissionUrlVo) {
+        if(StringUtils.isBlank(createWechatGroupFissionUrlVo.getUrl())){
+            return AjaxResult.error("生成页面路径不能为空");
+        }
+        if(StringUtils.isBlank(createWechatGroupFissionUrlVo.getGroupFissionId())){
+            return AjaxResult.error("群裂变活动id不能为空");
+        }
+        if(StringUtils.isBlank(createWechatGroupFissionUrlVo.getVersion())){
+            return AjaxResult.error("版本不能为空");
+        }
+        try{
+            String url = weGroupFissionService.getWechatGroupFissionUrl(createWechatGroupFissionUrlVo);
+            return AjaxResult.success(url);
+        }catch (Exception e){
+            return AjaxResult.error(e.getMessage());
+        }
+    }
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 16:36
+     *  @Description: 企业微信群列表
+     */
+    //@ApiOperation(value="群打卡活动app-企业微信群列表", notes="群打卡活动app-企业微信群列表")
+    @GetMapping(value = "/getWecomGroupList")
+    public AjaxResult getWecomGroupList() {
+        try{
+            List<DistDto> list =  weGroupFissionService.getWecomGroupList();
+            return AjaxResult.success(list);
+        }catch (Exception e){
+            return AjaxResult.error(e.getMessage());
+        }
+    }
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 16:36
+     *  @Description: 企业微信群列表
+     */
+    //@ApiOperation(value="群裂变活动表-企业微信员工列表", notes="群裂变活动表-企业微信员工列表")
+    @GetMapping(value = "/getWecomEmployeeList")
+    public AjaxResult getWecomEmployeeList() {
+        try{
+            List<DistDto> list =  weGroupFissionService.getWecomEmployeeList();
+            return AjaxResult.success(list);
+        }catch (Exception e){
+            return AjaxResult.error(e.getMessage());
+        }
+    }
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/31 16:19
+     *  @Description: 通过类型查询字典列表 type 1.商户 2.权益券 3.抽奖  4.负责人列表
+     */
+    @GetMapping(value = "/getDictListByType")
+    public AjaxResult getDictListByType(@RequestParam(name="type",required=true) String type) {
+        try{
+            List<DistDto> list =  new ArrayList<>();
+            //商户字典
+            if("1".equals(type)){
+                //商户
+                list =  weGroupFissionService.getLocalMerchantInfoDictDtos();
+            }else if("2".equals(type)){
+                //权益券
+                list = weGroupFissionService.getRightInfoDictDtos();
+            }else if("3".equals(type)){
+                //抽奖活动
+                list = weGroupFissionService.getActivityDictDtos();
+            }else if("4".equals(type)){
+                //负责人
+                list = sysUserService.getUserDictDtos();
+            }
+            return AjaxResult.success(list);
+        }catch (Exception e){
+            return AjaxResult.error(e.getMessage());
+        }
+    }
+}

+ 7 - 0
linkwe-auth/src/main/java/com/linkwechat/web/mapper/SysUserMapper.java

@@ -163,4 +163,11 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
      * @return
      */
     List<SysUser> findAllSysUser(@Param("weUserIds") String weUserIds,@Param("positions") String positions,@Param("deptIds") String deptIds);
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/2/2 11:12
+     *  @Description: 获取用户列表
+     */
+    List<SysUser> getUserDictList();
 }

+ 8 - 5
linkwe-auth/src/main/java/com/linkwechat/web/service/ISysUserService.java

@@ -7,6 +7,7 @@ import com.linkwechat.common.core.page.PageDomain;
 import com.linkwechat.domain.system.user.query.SysUserQuery;
 import com.linkwechat.domain.system.user.vo.SysUserVo;
 import com.linkwechat.domain.user.vo.WeUserScreenConditVo;
+import com.linkwechat.domain.weGroupFission.dto.DistDto;
 import com.linkwechat.web.domain.vo.UserVo;
 import org.apache.ibatis.annotations.Param;
 
@@ -293,9 +294,11 @@ public interface ISysUserService extends IService<SysUser> {
      */
     void builderLeaveSysUser(List<SysUser> sysUsers);
 
-
-
-
-
-
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/2/2 11:10
+     *  @Description: 获取用户列表数据
+     */
+    List<DistDto> getUserDictDtos();
 }

+ 22 - 0
linkwe-auth/src/main/java/com/linkwechat/web/service/impl/SysUserServiceImpl.java

@@ -32,6 +32,8 @@ import com.linkwechat.config.rabbitmq.RabbitMQSettingConfig;
 import com.linkwechat.domain.system.user.query.SysUserQuery;
 import com.linkwechat.domain.system.user.vo.SysUserVo;
 import com.linkwechat.domain.user.vo.WeUserScreenConditVo;
+import com.linkwechat.domain.weGroupFission.bdsh.LotteryActivity;
+import com.linkwechat.domain.weGroupFission.dto.DistDto;
 import com.linkwechat.domain.wecom.query.user.WeUserIdListQuery;
 import com.linkwechat.domain.wecom.query.user.WeUserListQuery;
 import com.linkwechat.domain.wecom.query.user.WeUserQuery;
@@ -1053,6 +1055,26 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         }
 
     }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/2/2 11:10
+     *  @Description: 获取用户列表
+     */
+    @Override
+    public List<DistDto> getUserDictDtos() {
+        List<DistDto> list = new ArrayList<>();
+        List<SysUser>  userList = this.getBaseMapper().getUserDictList();
+        if(userList != null && userList.size() > 0){
+            for(SysUser sysUser : userList){
+                DistDto dto = new DistDto();
+                dto.setVal(sysUser.getUserId()+"");
+                dto.setName(sysUser.getUserName());
+                list.add(dto);
+            }
+        }
+        return list;
+    }
 
 
 }

+ 6 - 0
linkwe-common/pom.xml

@@ -327,6 +327,12 @@
             <groupId>com.baomidou</groupId>
             <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>4.4.1</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 109 - 0
linkwe-common/src/main/java/com/linkwechat/common/utils/WxMiniProgramSchemeUtil.java

@@ -0,0 +1,109 @@
+package com.linkwechat.common.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import okhttp3.*;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class WxMiniProgramSchemeUtil {
+
+    //微信小程序的appid
+    @Value("${wechat.app_id}")
+    private String wechatAppId;
+
+
+    //微信小程序的appid
+    @Value("${wechat.secret}")
+    private String wechatSecret;
+
+    // 超时时间(秒)
+    private static final int TIMEOUT = 10;
+
+    // OkHttp客户端
+    private static final OkHttpClient client = new OkHttpClient.Builder()
+            .connectTimeout(TIMEOUT, TimeUnit.SECONDS)
+            .readTimeout(TIMEOUT, TimeUnit.SECONDS)
+            .writeTimeout(TIMEOUT, TimeUnit.SECONDS)
+            .build();
+
+    /**
+     * 获取access_token
+     */
+    public String getAccessToken() throws IOException {
+        // 接口地址
+        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
+                "&appid=" + wechatAppId +
+                "&secret=" + wechatSecret;
+
+        // 发送GET请求
+        Request request = new Request.Builder().url(url).get().build();
+        Response response = client.newCall(request).execute();
+        String responseBody = response.body().string();
+
+        // 解析响应
+        JSONObject json = JSONObject.parseObject(responseBody);
+        if (json.containsKey("errcode") && json.getInteger("errcode") != 0) {
+            throw new RuntimeException("获取access_token失败:" + json.getString("errmsg"));
+        }
+        return json.getString("access_token");
+    }
+
+    /**
+     * 生成小程序Scheme链接
+     *
+     * @param path       小程序页面路径(如 "/pages/index/index",根路径可省略)
+     * @param query      页面参数(如 "id=1&name=test")
+     * @param expireTime 有效期(秒,最大2592000,即30天,0表示永久)
+     * @return Scheme链接(如 "weixin://dl/business/?t=xxxxxx")  不行  必須为上线版本
+     */
+    public String generateScheme(String path, String query, Integer expireTime,String version) throws IOException {
+        // 1. 获取access_token
+        String accessToken = getAccessToken();
+
+        // 2. 构建请求参数
+        JSONObject params = new JSONObject();
+
+
+
+        Map<String,Object> jump_wxaMap =new HashMap<>();
+        // 页面路径(可选,默认跳首页)
+        if (path != null && !path.isEmpty()) {
+            jump_wxaMap.put("path", path);
+        }
+
+        // 页面参数(可选)
+        if (query != null && !query.isEmpty()) {
+            jump_wxaMap.put("query", query);
+        }
+        // 有效期(可选,0表示永久)
+        if (expireTime != null) {
+            params.put("expire_time", expireTime);
+        }
+        //要打开的小程序版本。正式版为"release",体验版为"trial",开发版为"develop"
+        jump_wxaMap.put("env_version", version);
+        params.put("jump_wxa",jump_wxaMap);
+        // 3. 发送POST请求
+        String url = "https://api.weixin.qq.com/wxa/generatescheme?access_token=" + accessToken;
+
+        MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
+        // 兼容写法(参数顺序调换,可能有@Deprecated警告)
+        RequestBody requestBody = RequestBody.create(mediaType, params.toJSONString());
+        Request request = new Request.Builder().url(url).post(requestBody).build();
+        Response response = client.newCall(request).execute();
+        String responseBody = response.body().string();
+
+        // 4. 解析响应
+        JSONObject json = JSONObject.parseObject(responseBody);
+        if (json.containsKey("errcode") && json.getInteger("errcode") != 0) {
+            throw new RuntimeException("生成Scheme失败:" + json.getString("errmsg"));
+        }
+        return json.getString("openlink"); // 返回Scheme链接
+    }
+}

+ 337 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/bdsh/LocalMerchantInfo.java

@@ -0,0 +1,337 @@
+package com.linkwechat.domain.weGroupFission.bdsh;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description: 商户表实体
+ * @Author: jeecg-boot
+ * @Date:   2025-01-06
+ * @Version: V1.0
+ */
+@Data
+@TableName("local_merchant_info")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="local_merchant_info对象", description="商户表实体")
+public class LocalMerchantInfo  {
+
+	/**
+	 * ID
+	 */
+	@TableId(type = IdType.ASSIGN_ID)
+	@ApiModelProperty(value = "ID")
+	private java.lang.String id;
+
+	/**
+	 * 创建人
+	 */
+	@ApiModelProperty(value = "创建人")
+	@TableField(fill = FieldFill.INSERT)
+	private java.lang.String createBy;
+
+	/**
+	 * 创建时间
+	 */
+	@ApiModelProperty(value = "创建时间")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@TableField(fill = FieldFill.INSERT)
+	private java.util.Date createTime;
+
+	/**
+	 * 更新人
+	 */
+	@ApiModelProperty(value = "更新人")
+	@TableField(fill = FieldFill.INSERT_UPDATE)
+	private java.lang.String updateBy;
+
+	/**
+	 * 更新时间
+	 */
+	@ApiModelProperty(value = "更新时间")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@TableField(fill = FieldFill.INSERT_UPDATE)
+	private java.util.Date updateTime;
+
+
+	@ApiModelProperty(value = "联系人")
+	@TableField(exist = false)
+	private String name;
+
+
+	@ApiModelProperty(value = "手机号")
+	@TableField(exist = false)
+	private String phone;
+
+	@ApiModelProperty(value = "密码")
+	@TableField(exist = false)
+	private String passWord;
+
+
+	@ApiModelProperty(value = "供应商名称")
+	private String purveyorName;
+
+	/**商户账号*/
+
+    @ApiModelProperty(value = "商户账号")
+	private String userId;
+
+
+	/**公司主体类型*/
+    @ApiModelProperty(value = "公司主体类型(1:普通企业 2:个体工商户) ")
+
+	private Integer type;
+
+	/**公司名称*/
+    @ApiModelProperty(value = "公司名称")
+	private String corporateName;
+	/**统一社会信用代码*/
+    @ApiModelProperty(value = "统一社会信用代码")
+	private String creditCode;
+
+	/**
+	 * 营业执照有效期类型(1.长期有效 2.固定期限)
+	 */
+	@ApiModelProperty(value = "营业执照有效期类型(1.长期有效 2.固定期限)")
+	private String lifespanType;
+
+	/**营业执照有效期*/
+    @ApiModelProperty(value = "营业执照有效期开始时间")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	private String lifespanBegin;
+
+	@ApiModelProperty(value = "营业执照有效期结束时间")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	private String lifespanEnd;
+	/**法人*/
+    @ApiModelProperty(value = "法人")
+	private String legalPerson;
+	/**法人证件号*/
+    @ApiModelProperty(value = "法人证件号")
+	private String legalPersonCode;
+	/**营业执照*/
+    @ApiModelProperty(value = "营业执照")
+	private String businessLicense;
+	/**身份证人像面*/
+    @ApiModelProperty(value = "身份证人像面")
+	private String identityOne;
+	/**身份证国徽面*/
+    @ApiModelProperty(value = "身份证国徽面")
+	private String identityTwo;
+	/**门店类型*/
+    @ApiModelProperty(value = "门店类型(1:单体 2:连锁店)")
+	private Integer storeType;
+	/**门店名称*/
+    @ApiModelProperty(value = "门店名称")
+	private String storeName;
+	/**店铺面积*/
+	@ApiModelProperty(value = "店铺面积")
+	private String storeExtent;
+
+	/**所在地区*/
+    @ApiModelProperty(value = "所在地区码")
+	private String country;
+
+	/**所在地区全部码*/
+    @ApiModelProperty(value = "所在地区全部码")
+	private String countryAll;
+
+	/**
+	 * 所在地区
+	 */
+	@ApiModelProperty(value = "所在地区")
+	private String locality;
+	/**所属供应商*/
+    @ApiModelProperty(value = "所属供应商")
+	private String purveyorId;
+	/**详细地址*/
+    @ApiModelProperty(value = "详细地址")
+	private String address;
+	/**地图位置经度*/
+    @ApiModelProperty(value = "地图位置经度")
+	private String longitude;
+	/**地图位置维度*/
+    @ApiModelProperty(value = "地图位置维度")
+	private String latitude;
+	/**门头照*/
+    @ApiModelProperty(value = "门头照")
+	private String headPhoto;
+	/**商户状态(1:上架,2:下架 ,3:暂停营业, 4:解约下线)*/
+    @ApiModelProperty(value = "商户状态(1:正常营业,2:关闭门店 ,3:暂停营业, 4:解约下线)")
+	private Integer merchantStatus;
+
+	/**
+	 * 来源(1-平台 2-个人 3-供应商)
+	 */
+	@ApiModelProperty(value = "来源(1-平台 2-个人 3-供应商)")
+	private Integer source;
+
+	@ApiModelProperty(value = "门店评分")
+	@TableField(exist = false)
+	private BigDecimal grade;
+
+	@ApiModelProperty(value = "完成服务数")
+	@TableField(exist = false)
+	private Integer serviceNum;
+
+	@ApiModelProperty(value = "产品id")
+	@TableField(exist = false)
+	private String productId;
+
+	/**
+	 * 1.4新增商户字段
+	 */
+	/**商户关联用户id*/
+	@ApiModelProperty(value = "商户关联用户id")
+	private String merchantUserId;
+
+	/**商户关联用户姓名*/
+	@ApiModelProperty(value = "商户关联用户姓名")
+	private String merchantUserName;
+
+	/**商户关联用户手机号*/
+	@ApiModelProperty(value = "商户关联用户手机号")
+	private String merchantUserPhone;
+
+	/**推荐人昵称*/
+	@ApiModelProperty(value = "推荐人昵称")
+	private String referenceNick;
+
+	/**推荐人姓名*/
+	@ApiModelProperty(value = "推荐人姓名")
+	private String referenceName;
+
+	/**推荐人id*/
+	@ApiModelProperty(value = "推荐人id")
+	private String referenceId;
+
+	/**推荐人手机号*/
+	@ApiModelProperty(value = "推荐人手机号")
+	private String referencePhone;
+
+	/**推荐码*/
+	@ApiModelProperty(value = "推荐码")
+	private String referenceCode;
+
+	/**管理人昵称*/
+	@ApiModelProperty(value = "管理人昵称")
+	private String manageNick;
+
+	/**管理人id*/
+	@ApiModelProperty(value = "管理人id")
+	private String manageUserId;
+
+	/**管理人姓名*/
+	@ApiModelProperty(value = "管理人姓名")
+	private String manageUserName;
+
+	/**管理人手机号*/
+	@ApiModelProperty(value = "管理人手机号")
+	private String manageUserPhone;
+
+	/**法人手机号*/
+	@ApiModelProperty(value = "法人手机号")
+	private String legalPersonPhone;
+
+	/**商户银行账号*/
+	@ApiModelProperty(value = "商户银行账号")
+	private String accCode;
+
+	/**商户银行名称*/
+	@ApiModelProperty(value = "商户银行名称")
+	private String bankName;
+
+	/**商户开户行*/
+	@ApiModelProperty(value = "商户开户行")
+	private String accName;
+
+	/**营业执照地址*/
+	@ApiModelProperty(value = "营业执照地址")
+	private String tradeCardAddr;
+
+	/**行业*/
+	@ApiModelProperty(value = "行业")
+	private String industry;
+
+	/**商户负责人姓名*/
+	@ApiModelProperty(value = "商户负责人姓名")
+	private String leaderName;
+
+	/**商户负责人手机号*/
+	@ApiModelProperty(value = "商户负责人手机号")
+	private String leaderPhone;
+
+	/**是否进入回收站(0:否 1:是)*/
+	@ApiModelProperty(value = "是否进入回收站(0:否 1:是)")
+	private Integer isRecycle;
+
+	/**是否进入黑名单(0:否 1:是)*/
+	@ApiModelProperty(value = "是否进入黑名单(0:否 1:是)")
+	private Integer isBlacklist;
+
+	/**是否进入拒绝注册(0:否 1:是)*/
+	@ApiModelProperty(value = "是否进入拒绝注册(0:否 1:是)")
+	private Integer isRefuse;
+
+	/**是否进入临时用户(0:否 1:是)*/
+	@ApiModelProperty(value = "是否进入临时用户(0:否 1:是)")
+	private Integer isTemporary;
+
+	/**数据是否删除 0-否 1-是*/
+	@ApiModelProperty(value = "数据是否删除 0-否 1-是")
+	private Integer isDelete;
+
+	/**
+	 * 普通用户id
+	 */
+	@TableField(exist = false)
+	@ApiModelProperty(value = "普通用户id")
+	private String ordinaryUserId;
+
+	/**
+	 * 开业时间
+	 */
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+	@DateTimeFormat(pattern="yyyy-MM-dd")
+	@ApiModelProperty(value = "开业时间")
+	private Date openingTime;
+
+	/**权益等级*/
+	@ApiModelProperty(value = "权益等级")
+	private String rightsLevel;
+
+	/**是否启用禁用 1 启用 0 禁用*/
+	@ApiModelProperty(value = "是否启用禁用 1 启用 0 禁用")
+	private String isEnable;
+
+	/**经营范围*/
+	@ApiModelProperty(value = "经营范围")
+	private String businessScope;
+
+	@TableField(exist = false)
+	@ApiModelProperty(value = "logo")
+	private String logo;
+
+	/**
+	 * 商户所在地区code
+	 */
+	@TableField(exist = false)
+	@ApiModelProperty(value = "商户所在地区code")
+	private List<String> thirdPartyAreaList;
+
+
+}

+ 170 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/bdsh/LocalRightsInfo.java

@@ -0,0 +1,170 @@
+package com.linkwechat.domain.weGroupFission.bdsh;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.linkwechat.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Description: 权益劵
+ * @Author: jeecg-boot
+ * @Date:   2025-04-30
+ * @Version: V1.0
+ */
+@Data
+@TableName("local_rights_info")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="local_rights_info对象", description="权益劵")
+public class LocalRightsInfo {
+    
+	/**权益卷id*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "权益卷id")
+	private String id;
+	/**类型(1.兑换券 2.折扣卷 3.抵现劵)*/
+    @ApiModelProperty(value = "类型(1.兑换券 2.折扣卷 3.抵现劵)")
+	private String type;
+	/**权益名称*/
+    @ApiModelProperty(value = "权益名称")
+	private String rightsName;
+	/**分类*/
+    @ApiModelProperty(value = "分类")
+	private String classify;
+	/**折扣值*/
+    @ApiModelProperty(value = "折扣值")
+	private String rebate;
+	/**抵现金额*/
+    @ApiModelProperty(value = "抵现金额")
+	private BigDecimal amount;
+	/**权益图片*/
+    @ApiModelProperty(value = "权益图片")
+	private String rightsPicture;
+	/**使用有限期类型(1.用户领取后生效2.三方用户赠送时间起3.固定时间段4.长期可用)*/
+    @ApiModelProperty(value = "使用有限期类型(1.用户领取后生效2.三方用户赠送时间起3.固定时间段4.长期可用)")
+	private String useCondition;
+	/**天数*/
+    @ApiModelProperty(value = "天数")
+	private Integer dayNum;
+	/**开始时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "开始时间")
+	private Date startTime;
+	/**结束时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "结束时间")
+	private Date endTime;
+	/**市场售价*/
+    @ApiModelProperty(value = "市场售价")
+	private BigDecimal marketPrice;
+	/**协议价*/
+    @ApiModelProperty(value = "协议价")
+	private BigDecimal contractRate;
+	/**三方结算价格*/
+    @ApiModelProperty(value = "三方结算价格")
+	private BigDecimal settlePrice;
+	/**服务说明*/
+    @ApiModelProperty(value = "服务说明")
+	private String description;
+	@ApiModelProperty(value = "权益卷状态(1:上架,2:下架 )")
+	private Integer rightsStatus;
+
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty(value = "上架时间")
+	private Date upperTime;
+
+	/**是否删除(0,:否 1:是)*/
+    @ApiModelProperty(value = "是否删除(0,:否 1:是)")
+	private Integer delFlag;
+	/**创建者*/
+	@Excel(name = "创建者", width = 15)
+    @ApiModelProperty(value = "创建者")
+	private String createBy;
+	/**创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+	private Date createTime;
+	/**修改者*/
+    @ApiModelProperty(value = "修改者")
+	private String updateBy;
+	/**修改时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "修改时间")
+	private Date updateTime;
+
+	@ApiModelProperty(value = "使用数量")
+	@TableField(exist = false)
+	private long useNum;
+
+	@ApiModelProperty(value = "赠送数量")
+	@TableField(exist = false)
+	private Integer giftNum;
+
+	@ApiModelProperty(value = "未使用数量")
+	@TableField(exist = false)
+	private long noUseNum;
+
+	// add by  hxl  券是否可用
+	@ApiModelProperty(value = "券是否可用")
+	@TableField(exist = false)
+	private Boolean useFlag;
+
+	/**门槛金额(元): 满X元生效,适用于满减/折扣*/
+	@TableField(exist = false)
+	@ApiModelProperty(value = "门槛金额(元): 满X元生效,适用于满减/折扣")
+	private BigDecimal ruleMinSpendAmount;
+	/**折扣率: 如0.80表示8折,仅折扣券使用*/
+	@TableField(exist = false)
+	@ApiModelProperty(value = "折扣率: 如0.80表示8折,仅折扣券使用")
+	private BigDecimal ruleDiscountRate;
+	/**折扣封顶金额(元): 折扣最高优惠*/
+	@TableField(exist = false)
+	@ApiModelProperty(value = "折扣封顶金额(元): 折扣最高优惠")
+	private BigDecimal ruleDiscountCapAmount;
+	/**满减金额(元): 仅满减券使用*/
+	@TableField(exist = false)
+	@ApiModelProperty(value = "满减金额(元): 仅满减券使用")
+	private BigDecimal ruleReductionAmount;
+
+	@TableField(exist = false)
+	@ApiModelProperty(value = "券的抵扣金额")
+	private BigDecimal discountAmount;
+
+	@TableField(exist = false)
+	@ApiModelProperty(value = "关联类型: 1-商品, 2-商品分类")
+	private String relatedType;
+
+	/**关联ID (商品ID或分类ID)*/
+	@TableField(exist = false)
+	@ApiModelProperty(value = "关联ID (商品ID或分类ID)")
+	private String relatedId;
+
+	@TableField(exist = false)
+	@ApiModelProperty(value = "所在地区码")
+	private String country;
+
+	@ApiModelProperty(value = "所在地区全部码")
+	@TableField(exist = false)
+	private String countryAll;
+
+	@ApiModelProperty(value = "商户id")
+	@TableField(exist = false)
+	private String merchantId;
+
+}

+ 76 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/bdsh/LotteryActivity.java

@@ -0,0 +1,76 @@
+package com.linkwechat.domain.weGroupFission.bdsh;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.linkwechat.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+/**
+ * @Description: 抽奖活动
+ * @Author: jeecg-boot
+ * @Date:   2026-01-22
+ * @Version: V1.0
+ */
+@Data
+@TableName("lottery_activity")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="lottery_activity对象", description="抽奖活动")
+public class LotteryActivity {
+
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+	private String id;
+	/**活动名称*/
+    @ApiModelProperty(value = "活动名称")
+	private String activityName;
+	/**活动类型 0:大转盘,1九宫格*/
+    @ApiModelProperty(value = "活动类型 0:大转盘,1九宫格")
+	private Integer type;
+	/**活动开始时间*/
+    @ApiModelProperty(value = "活动开始时间")
+	private Date activityStartTime;
+	/**活动结束时间*/
+    @ApiModelProperty(value = "活动结束时间")
+	private Date activityEndTime;
+	/**参与规则 1:推广拉新,2:积分消耗,3:任务奖励,4:消费奖励*/
+    @ApiModelProperty(value = "参与规则 1:推广拉新,2:积分消耗,3:任务奖励,4:消费奖励")
+	private Integer participationRules;
+	/**活动背景图*/
+    @ApiModelProperty(value = "活动背景图")
+	private String activityBackgroundImage;
+	/**海报背景图*/
+    @ApiModelProperty(value = "海报背景图")
+	private String posterBackgroundImage;
+	/**活动链接*/
+    @ApiModelProperty(value = "活动链接")
+	private String activityUrl;
+	/**活动说明*/
+    @ApiModelProperty(value = "活动说明")
+	private String activityDescribe;
+	/**创建人*/
+    @ApiModelProperty(value = "创建人")
+	private String createBy;
+	/**修改人*/
+    @ApiModelProperty(value = "修改人")
+	private String updateBy;
+	/**创建时间*/
+    @ApiModelProperty(value = "创建时间")
+	private Date createTime;
+	/**更新时间*/
+    @ApiModelProperty(value = "更新时间")
+	private Date updateTime;
+	/**状态*/
+	@ApiModelProperty(value = "状态")
+	@TableField(exist = false)
+	private String status;
+}

+ 27 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/dto/DistDto.java

@@ -0,0 +1,27 @@
+package com.linkwechat.domain.weGroupFission.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2026/1/22 17:49
+ *  @Description: 字典对象
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="字典对象", description="字典对象")
+public class DistDto {
+
+    @ApiModelProperty(value = "值")
+    private String val;
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+}

+ 33 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/dto/InvitationUserDto.java

@@ -0,0 +1,33 @@
+package com.linkwechat.domain.weGroupFission.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2026/1/29 10:35
+ *  @Description: 邀请用户对象
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="邀请用户对象", description="邀请用户对象")
+public class InvitationUserDto {
+
+    @ApiModelProperty(value = "邀请人名称")
+    private String nickName;
+
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "邀请时间")
+    private Date createTime;
+
+}

+ 29 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/dto/UserRewardDetailDto.java

@@ -0,0 +1,29 @@
+package com.linkwechat.domain.weGroupFission.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2026/1/29 11:30
+ *  @Description:  用户邀请奖励对象
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="用户邀请奖励对象", description="用户邀请奖励对象")
+public class UserRewardDetailDto {
+
+    @ApiModelProperty(value = "奖励总金额")
+    private BigDecimal sumAmount;
+
+    @ApiModelProperty(value = "奖励记录")
+    private List<UserRewardDto> userAmountRecord;
+}

+ 34 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/dto/UserRewardDto.java

@@ -0,0 +1,34 @@
+package com.linkwechat.domain.weGroupFission.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2026/1/29 10:35
+ *  @Description: 用户奖励对象
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="用户奖励对象", description="用户奖励对象")
+public class UserRewardDto {
+    
+    @ApiModelProperty(value = "奖励金额")
+    private BigDecimal rewardAmount;
+
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "奖励时间")
+    private Date createTime;
+
+}

+ 99 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/dto/WeGroupFissionDetailDto.java

@@ -0,0 +1,99 @@
+package com.linkwechat.domain.weGroupFission.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.linkwechat.domain.weGroupFission.vo.WeGroupFissionExtraVo;
+import com.linkwechat.domain.weGroupFission.vo.WeGroupFissionStepAppVo;
+import com.linkwechat.domain.weGroupFission.vo.WeGroupFissionStepVo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2026/1/28 11:27
+ *  @Description: 群裂变详情对象
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="群裂变详情对象", description="群裂变详情对象")
+public class WeGroupFissionDetailDto {
+
+	@ApiModelProperty(value = "主键")
+	private String id;
+
+
+	@ApiModelProperty(value = "活动标题")
+	private String title;
+
+
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty(value = "活动开始时间")
+	private Date beginDate;
+
+
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty(value = "活动结束时间")
+	private Date endDate;
+
+	@ApiModelProperty(value = "商户id")
+	private String merchantId;
+
+	@ApiModelProperty(value = "商户名称")
+	private String merchantName;
+
+
+	@ApiModelProperty(value = "活动负责人")
+	private String leaderUserId;
+
+
+	@ApiModelProperty(value = "企业微信群id")
+	private String wecomGroupId;
+
+
+	@ApiModelProperty(value = "企业微信员工id")
+	private String wecomEmployeeId;
+
+	@ApiModelProperty(value = "新客户判定规则 1.开启 2.关闭")
+	private String newUserRule;
+
+	@ApiModelProperty(value = "活动说明")
+	private String activityInstructions;
+
+	@ApiModelProperty(value = "触发条件 (邀请新客户人数) ≥1,≤200(邀请新客户进群人数)")
+	private Integer invitationCount;
+
+	@ApiModelProperty(value = "派奖方式 (自动发放)")
+	private String payoutMethod;
+
+	@ApiModelProperty(value = "发放时机 1.达标后即时发放 2.活动结束后统一发放")
+	private String timingDistribution;
+
+	@ApiModelProperty(value = "单日助力上限 邀请人数")
+	private Integer dailyAssistanceLimit;
+
+	@ApiModelProperty(value = "同一客户最多助力数  邀请人数")
+	private Integer customAssistanceLimit;
+
+	@ApiModelProperty(value = "进群欢迎语")
+	private String welcomeMessage;
+
+	@ApiModelProperty(value = "阶梯集合")
+	private List<WeGroupFissionStepVo> weGroupFissionStepList;
+
+	@ApiModelProperty(value = "额外奖励集合")
+	private List<WeGroupFissionExtraVo> weGroupFissionExtraList;
+
+	@ApiModelProperty(value = "App阶梯集合")
+	private List<WeGroupFissionStepAppVo> weGroupFissionStepAppList;
+}

+ 51 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/dto/WeGroupFissionDto.java

@@ -0,0 +1,51 @@
+package com.linkwechat.domain.weGroupFission.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2026/1/28 10:51
+ *  @Description: 群裂变活动列表对象
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="群裂变活动列表对象", description="群裂变活动列表对象")
+public class WeGroupFissionDto {
+
+	@ApiModelProperty(value = "主键")
+	private String id;
+
+	@ApiModelProperty(value = "标题")
+	private String title;
+
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty(value = "活动开始时间")
+	private Date beginDate;
+
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty(value = "活动结束时间")
+	private Date endDate;
+
+	@ApiModelProperty(value = "创建人")
+	private String createUserName;
+
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty(value = "创建时间")
+	private Date createTime;
+
+	@ApiModelProperty(value = "活动状态 未开始  进行中 已结束")
+	private String activityStatus;
+}

+ 105 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/entity/WeGroupFission.java

@@ -0,0 +1,105 @@
+package com.linkwechat.domain.weGroupFission.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.linkwechat.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @Description: 群裂变活动表
+ * @Author: jeecg-boot
+ * @Date:   2026-01-28
+ * @Version: V1.0
+ */
+@Data
+@TableName("we_group_fission")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="we_group_fission对象", description="群裂变活动表")
+public class WeGroupFission {
+    
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+	private String id;
+	/**标题*/
+	@Excel(name = "标题", width = 15)
+    @ApiModelProperty(value = "标题")
+	private String title;
+	/**活动开始时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "活动开始时间")
+	private Date beginDate;
+	/**活动结束时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "活动结束时间")
+	private Date endDate;
+	/**商户id*/
+    @ApiModelProperty(value = "商户id")
+	private String merchantId;
+	/**活动负责人*/
+    @ApiModelProperty(value = "活动负责人")
+	private String leaderUserId;
+	/**企业微信群id*/
+    @ApiModelProperty(value = "企业微信群id")
+	private String wecomGroupId;
+	/**企业微信员工id*/
+    @ApiModelProperty(value = "企业微信员工id")
+	private String wecomEmployeeId;
+	/**新客户判定规则 1.开启 2.关闭*/
+    @ApiModelProperty(value = "新客户判定规则 1.开启 2.关闭")
+	private String newUserRule;
+	/**活动说明*/
+    @ApiModelProperty(value = "活动说明")
+	private String activityInstructions;
+	/**触发条件 (邀请新客户人数) ≥1,≤200(邀请新客户进群人数)*/
+    @ApiModelProperty(value = "触发条件 (邀请新客户人数) ≥1,≤200(邀请新客户进群人数)")
+	private Integer invitationCount;
+	/**派奖方式 (自动发放)*/
+    @ApiModelProperty(value = "派奖方式 (自动发放)")
+	private String payoutMethod;
+	/**发放时机 1.达标后即时发放 2.活动结束后统一发放*/
+    @ApiModelProperty(value = "发放时机 1.达标后即时发放 2.活动结束后统一发放")
+	private String timingDistribution;
+	/**单日助力上限 邀请人数*/
+    @ApiModelProperty(value = "单日助力上限 邀请人数")
+	private Integer dailyAssistanceLimit;
+	/**同一客户最多助力数  邀请人数*/
+    @ApiModelProperty(value = "同一客户最多助力数  邀请人数")
+	private Integer customAssistanceLimit;
+	/**进群欢迎语*/
+    @ApiModelProperty(value = "进群欢迎语")
+	private String welcomeMessage;
+	/**创建人*/
+    @ApiModelProperty(value = "创建人")
+	private String createUserId;
+	/**创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+	private Date createTime;
+	/**修改人*/
+    @ApiModelProperty(value = "修改人")
+	private String updateUserId;
+	/**修改时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "修改时间")
+	private Date updateTime;
+
+	@TableField(exist = false)
+	@ApiModelProperty(value = "活动状态")
+	private  String  activityStatus;
+}

+ 59 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/entity/WeGroupFissionExtraRecord.java

@@ -0,0 +1,59 @@
+package com.linkwechat.domain.weGroupFission.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @Description: 群裂变阶梯奖励记录
+ * @Author: jeecg-boot
+ * @Date:   2026-01-28
+ * @Version: V1.0
+ */
+@Data
+@TableName("we_group_fission_extra_record")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="we_group_fission_extra_record对象", description="群裂变阶梯奖励记录")
+public class WeGroupFissionExtraRecord {
+    
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+	private String id;
+	/**群裂变id*/
+    @ApiModelProperty(value = "群裂变id")
+	private String groupFissionId;
+	/**阶梯序号*/
+    @ApiModelProperty(value = "阶梯序号")
+	private Integer sortNum;
+
+	@ApiModelProperty(value = "奖励类型1.现金 2.优惠券 3.抽奖 ")
+	private String rewardType;
+	/**奖励金额*/
+    @ApiModelProperty(value = "奖励金额")
+	private java.math.BigDecimal rewardAmount;
+	/**创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+	private Date createTime;
+	/**创建人*/
+    @ApiModelProperty(value = "创建人")
+	private String createUserId;
+
+	@ApiModelProperty(value = "抽奖活动id")
+	private String lotteryActivityId;
+
+	@ApiModelProperty(value = "优惠券id")
+	private String rightInfoId;
+}

+ 47 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/entity/WeGroupFissionInvitationRecord.java

@@ -0,0 +1,47 @@
+package com.linkwechat.domain.weGroupFission.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @Description: 群裂变用户邀请记录
+ * @Author: jeecg-boot
+ * @Date:   2026-01-29
+ * @Version: V1.0
+ */
+@Data
+@TableName("we_group_fission_invitation_record")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="we_group_fission_invitation_record对象", description="群裂变用户邀请记录")
+public class WeGroupFissionInvitationRecord {
+    
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+	private String id;
+	/**群裂变活动id*/
+    @ApiModelProperty(value = "群裂变活动id")
+	private String groupFissionId;
+	/**分享人id*/
+    @ApiModelProperty(value = "分享人id")
+	private String shareUserId;
+	/**邀请人id*/
+    @ApiModelProperty(value = "邀请人id")
+	private String invitationUserId;
+	/**创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+	private Date createTime;
+}

+ 53 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/entity/WeGroupFissionStepRecord.java

@@ -0,0 +1,53 @@
+package com.linkwechat.domain.weGroupFission.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @Description: 群群裂阶梯额外奖励记录
+ * @Author: jeecg-boot
+ * @Date:   2026-01-28
+ * @Version: V1.0
+ */
+@Data
+@TableName("we_group_fission_step_record")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="we_group_fission_step_record对象", description="群群裂阶梯额外奖励记录")
+public class WeGroupFissionStepRecord {
+    
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+	private String id;
+	/**群裂变id*/
+    @ApiModelProperty(value = "群裂变id")
+	private String groupFissionId;
+	/**阶梯序号*/
+    @ApiModelProperty(value = "阶梯序号")
+	private Integer sortNum;
+	/**邀请人数*/
+    @ApiModelProperty(value = "邀请人数")
+	private Integer invitationCount;
+	/**奖励金额*/
+    @ApiModelProperty(value = "奖励金额")
+	private java.math.BigDecimal rewardAmount;
+	/**创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+	private Date createTime;
+	/**创建人*/
+    @ApiModelProperty(value = "创建人")
+	private String createUserId;
+}

+ 62 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/entity/WeGroupFissionStepUserRecord.java

@@ -0,0 +1,62 @@
+package com.linkwechat.domain.weGroupFission.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @Description: 用户奖励记录表
+ * @Author: jeecg-boot
+ * @Date:   2026-01-29
+ * @Version: V1.0
+ */
+@Data
+@TableName("we_group_fission_step_user_record")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="we_group_fission_step_user_record对象", description="用户奖励记录表")
+public class WeGroupFissionStepUserRecord {
+    
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+	private String id;
+	/**群裂变活动id*/
+    @ApiModelProperty(value = "群裂变活动id")
+	private String groupFissionId;
+	/**阶梯奖励id*/
+    @ApiModelProperty(value = "阶梯奖励id")
+	private String stepRecordId;
+	/**阶梯序号*/
+    @ApiModelProperty(value = "阶梯序号")
+	private Integer sortNum;
+	/**奖励金额*/
+    @ApiModelProperty(value = "奖励金额")
+	private java.math.BigDecimal rewardAmount;
+	/**奖励类型 1.阶梯奖励 2.额外奖励*/
+    @ApiModelProperty(value = "奖励类型 1.阶梯奖励 2.额外奖励")
+	private String rewardType;
+	/**额外奖励类型1.积分 2.现金*/
+    @ApiModelProperty(value = "额外奖励类型1.积分 2.现金")
+	private String extraRewardType;
+	/**额外奖励金额*/
+    @ApiModelProperty(value = "额外奖励金额")
+	private java.math.BigDecimal extraRewardAmount;
+	/**用户id*/
+    @ApiModelProperty(value = "用户id")
+	private String userId;
+	/**创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+	private Date createTime;
+}

+ 33 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/vo/AddWecomGroupVo.java

@@ -0,0 +1,33 @@
+package com.linkwechat.domain.weGroupFission.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2026/1/28 17:56
+ *  @Description: 添加企业微信群对象
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="添加企业微信群对象", description="添加企业微信群对象")
+public class AddWecomGroupVo {
+
+    @NotBlank(message = "用户id不能为空")
+    @ApiModelProperty(value = "用户id")
+    private String userId;
+
+    @NotBlank(message = "分享人id不能为空")
+    @ApiModelProperty(value = "分享人id")
+    private String shareUserId;
+
+    @NotBlank(message = "群打卡活动id不能为空")
+    @ApiModelProperty(value = "群打卡活动id")
+    private String groupFissionId;
+}

+ 33 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/vo/CreateWechatGroupFissionUrlVo.java

@@ -0,0 +1,33 @@
+package com.linkwechat.domain.weGroupFission.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2026/1/28 15:43
+ *  @Description: 生成小程序的打卡链接参数
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="生成小程序的打卡链接参数对象", description="生成小程序的打卡链接参数对象")
+public class CreateWechatGroupFissionUrlVo {
+
+	@ApiModelProperty(value = "小程序页面")
+	private  String url;
+
+	@ApiModelProperty(value = "群打卡活动id")
+	private String groupFissionId;
+
+    @ApiModelProperty(value = "小程序版本正式版为release,体验版为trial,开发版为develop")
+	private String version;
+
+	@ApiModelProperty(value = "分享人用户id")
+	private String shareUserId;
+
+}

+ 103 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/vo/WeGroupFissionAddVo.java

@@ -0,0 +1,103 @@
+package com.linkwechat.domain.weGroupFission.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+import java.util.List;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2026/1/28 11:13
+ *  @Description: 群裂变添加对象
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="群裂变添加对象", description="群裂变添加对象")
+public class WeGroupFissionAddVo {
+    
+
+    @ApiModelProperty(value = "主键")
+	private String id;
+
+    @NotBlank(message = "活动标题不能为空")
+    @ApiModelProperty(value = "活动标题")
+    private String title;
+
+    @NotNull(message = "活动开始时间不能为空")
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "活动开始时间")
+    private Date beginDate;
+
+    @NotNull(message = "活动结束时间不能为空")
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "活动结束时间")
+    private Date endDate;
+
+    @ApiModelProperty(value = "商户id")
+    private String merchantId;
+
+
+    @ApiModelProperty(value = "活动负责人")
+    private String leaderUserId;
+
+
+    @NotBlank(message = "企业微信群id不能为空")
+    @ApiModelProperty(value = "企业微信群id")
+    private String wecomGroupId;
+
+
+    @NotBlank(message = "企业微信员工id不能为空")
+    @ApiModelProperty(value = "企业微信员工id")
+    private String wecomEmployeeId;
+
+    @NotBlank(message = "新客户判定规则不能为空")
+    @ApiModelProperty(value = "新客户判定规则 1.开启 2.关闭")
+    private String newUserRule;
+
+    @NotBlank(message = "活动说明不能为空")
+    @ApiModelProperty(value = "活动说明")
+    private String activityInstructions;
+
+    @NotNull(message = "触发条件不能为空")
+    @ApiModelProperty(value = "触发条件 (邀请新客户人数) ≥1,≤200(邀请新客户进群人数)")
+    private Integer invitationCount;
+
+    @NotBlank(message = "派奖方式不能为空")
+    @ApiModelProperty(value = "派奖方式 (自动发放)")
+    private String payoutMethod;
+
+    @NotBlank(message = "发放时机不能为空")
+    @ApiModelProperty(value = "发放时机 1.达标后即时发放 2.活动结束后统一发放")
+    private String timingDistribution;
+
+    @NotNull(message = "单日助力上限不能为空")
+    @ApiModelProperty(value = "单日助力上限 邀请人数")
+    private Integer dailyAssistanceLimit;
+
+    @NotNull(message = "同一客户最多助力数不能为空")
+    @ApiModelProperty(value = "同一客户最多助力数  邀请人数")
+    private Integer customAssistanceLimit;
+
+    @ApiModelProperty(value = "进群欢迎语")
+    private String welcomeMessage;
+
+    @ApiModelProperty(value = "阶梯集合")
+    private List<WeGroupFissionStepVo> weGroupFissionStepList;
+
+    @ApiModelProperty(value = "额外奖励集合")
+    private List<WeGroupFissionExtraVo> weGroupFissionExtraList;
+
+
+}

+ 45 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/vo/WeGroupFissionExtraVo.java

@@ -0,0 +1,45 @@
+package com.linkwechat.domain.weGroupFission.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.aspectj.weaver.ast.Not;
+
+import java.math.BigDecimal;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2026/1/28 10:48
+ *  @Description: 群裂变额外奖励对象
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="群裂变额外奖励对象", description="群裂变额外奖励对象")
+public class WeGroupFissionExtraVo {
+
+    @ApiModelProperty(value = "阶梯序号")
+	private Integer sortNum;
+
+	@ApiModelProperty(value = "奖励类型1.现金 2.优惠券 3.大转盘抽奖 4.九宫格抽奖")
+	private String rewardType;
+
+	@ApiModelProperty(value = "奖励金额")
+	private BigDecimal rewardAmount;
+
+	@ApiModelProperty(value = "抽奖活动id")
+	private String lotteryActivityId;
+
+	@ApiModelProperty(value = "优惠券id")
+	private String rightInfoId;
+
+	@ApiModelProperty(value = "抽奖活动名称")
+	private String lotteryActivityName;
+
+	@ApiModelProperty(value = "优惠券名称")
+	private String rightInfoName;
+
+}

+ 34 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/vo/WeGroupFissionFlagVo.java

@@ -0,0 +1,34 @@
+package com.linkwechat.domain.weGroupFission.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2026/1/28 17:38
+ *  @Description: 群裂变标志对象
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="群裂变标志对象", description="群裂变标志对象")
+public class WeGroupFissionFlagVo {
+
+	@NotBlank(message = "用户id不能为空")
+	@ApiModelProperty(value = "用户id")
+    private String userId;
+
+	@NotBlank(message = "企业微信群id不能为空")
+	@ApiModelProperty(value = "企业微信群id")
+	private String wecomGroupId;
+
+	@NotBlank(message = "企业微信员工id不能为空")
+	@ApiModelProperty(value = "企业微信员工id")
+	private String wecomEmployeeId;
+}

+ 37 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/vo/WeGroupFissionStepAppVo.java

@@ -0,0 +1,37 @@
+package com.linkwechat.domain.weGroupFission.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2026/1/29 9:51
+ *  @Description: 群裂变阶梯App对象
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="群裂变阶梯App对象", description="群裂变阶梯App对象")
+public class WeGroupFissionStepAppVo {
+
+	@ApiModelProperty(value = "阶梯序号")
+	private Integer sortNum;
+
+    @ApiModelProperty(value = "邀请人数")
+	private Integer invitationCount;
+
+	@ApiModelProperty(value = "奖励金额")
+	private BigDecimal rewardAmount;
+
+	@ApiModelProperty(value = "额外奖励类型1.积分 2.现金")
+	private String rewardType;
+
+	@ApiModelProperty(value = "额外奖励金额")
+	private BigDecimal extraRewardAmount;
+}

+ 31 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/vo/WeGroupFissionStepVo.java

@@ -0,0 +1,31 @@
+package com.linkwechat.domain.weGroupFission.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2026/1/28 10:48
+ *  @Description: 群裂变阶梯对象
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="群裂变阶梯对象", description="群裂变阶梯对象")
+public class WeGroupFissionStepVo {
+
+	@ApiModelProperty(value = "阶梯序号")
+	private Integer sortNum;
+
+    @ApiModelProperty(value = "邀请人数")
+	private Integer invitationCount;
+
+	@ApiModelProperty(value = "奖励金额")
+	private BigDecimal rewardAmount;
+}

+ 49 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weGroupFission/vo/WeGroupFissionVo.java

@@ -0,0 +1,49 @@
+package com.linkwechat.domain.weGroupFission.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ *  @version
+ *  @author: hxl
+ *  @Date: 2026/1/28 10:48
+ *  @Description: 群裂变列表查询对象
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="群裂变列表查询对象", description="群裂变列表查询对象")
+public class WeGroupFissionVo {
+
+	@ApiModelProperty(value = "当前页")
+	private Integer pageNum;
+
+	@ApiModelProperty(value = "页数")
+	private Integer pageSize;
+
+    @ApiModelProperty(value = "活动标题")
+	private String title;
+
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "活动开始时间")
+	private Date beginDate;
+
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty(value = "活动结束时间")
+	private Date endDate;
+
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+	private Date createDate;
+
+}

+ 24 - 0
linkwe-service/src/main/java/com/linkwechat/mapper/FissionMerchantInfoMapper.java

@@ -0,0 +1,24 @@
+package com.linkwechat.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.linkwechat.domain.weGroupFission.bdsh.LocalMerchantInfo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+
+import java.util.List;
+
+/**
+ * @Description: 商户表实体
+ * @Author: jeecg-boot
+ * @Date: 2025-01-06
+ * @Version: V1.0
+ */
+@DS("master")
+@Mapper
+public interface FissionMerchantInfoMapper extends BaseMapper<LocalMerchantInfo> {
+
+}

+ 23 - 0
linkwe-service/src/main/java/com/linkwechat/mapper/LocalRightsInfoMapper.java

@@ -0,0 +1,23 @@
+package com.linkwechat.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.linkwechat.domain.weGroupFission.bdsh.LocalRightsInfo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @Description: 权益劵
+ * @Author: jeecg-boot
+ * @Date:   2025-04-30
+ * @Version: V1.0
+ */
+@DS("master")
+@Mapper
+public interface LocalRightsInfoMapper extends BaseMapper<LocalRightsInfo> {
+
+}

+ 28 - 0
linkwe-service/src/main/java/com/linkwechat/mapper/LotteryActivityMapper.java

@@ -0,0 +1,28 @@
+package com.linkwechat.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.linkwechat.domain.weGroupFission.bdsh.LotteryActivity;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * @Description: 抽奖活动
+ * @Author: jeecg-boot
+ * @Date:   2026-01-22
+ * @Version: V1.0
+ */
+@DS("master")
+@Mapper
+public interface LotteryActivityMapper extends BaseMapper<LotteryActivity> {
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/27 11:06
+     *  @Description: 查询进行中的活动的 participation_rules=3 的任务奖励活动
+     *  活动类型 0:大转盘,1九宫格
+     */
+    List<LotteryActivity> findListType(String type);
+}

+ 9 - 0
linkwe-service/src/main/java/com/linkwechat/mapper/WeGroupFissionDictDtoMapper.java

@@ -0,0 +1,9 @@
+package com.linkwechat.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+
+@DS("master")
+public interface WeGroupFissionDictDtoMapper {
+
+
+}

+ 21 - 0
linkwe-service/src/main/java/com/linkwechat/mapper/WeGroupFissionExtraRecordMapper.java

@@ -0,0 +1,21 @@
+package com.linkwechat.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.linkwechat.domain.weGroupFission.entity.WeGroupFissionExtraRecord;
+
+
+/**
+ * @Description: 群裂变阶梯奖励记录
+ * @Author: jeecg-boot
+ * @Date:   2026-01-28
+ * @Version: V1.0
+ */
+public interface WeGroupFissionExtraRecordMapper extends BaseMapper<WeGroupFissionExtraRecord> {
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 12:01
+     *  @Description: 通过群裂变id删除数据
+     */
+    void deleteByGroupFissionId(String id);
+}

+ 14 - 0
linkwe-service/src/main/java/com/linkwechat/mapper/WeGroupFissionInvitationRecordMapper.java

@@ -0,0 +1,14 @@
+package com.linkwechat.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.linkwechat.domain.weGroupFission.entity.WeGroupFissionInvitationRecord;
+
+/**
+ * @Description: 群裂变用户邀请记录
+ * @Author: jeecg-boot
+ * @Date:   2026-01-29
+ * @Version: V1.0
+ */
+public interface WeGroupFissionInvitationRecordMapper extends BaseMapper<WeGroupFissionInvitationRecord> {
+
+}

+ 33 - 0
linkwe-service/src/main/java/com/linkwechat/mapper/WeGroupFissionMapper.java

@@ -0,0 +1,33 @@
+package com.linkwechat.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.linkwechat.domain.weGroupFission.dto.WeGroupFissionDto;
+import com.linkwechat.domain.weGroupFission.entity.WeGroupFission;
+import com.linkwechat.domain.weGroupFission.vo.WeGroupFissionVo;
+import org.apache.ibatis.annotations.Param;
+
+
+/**
+ * @Description: 群裂变活动表
+ * @Author: jeecg-boot
+ * @Date:   2026-01-28
+ * @Version: V1.0
+ */
+public interface WeGroupFissionMapper extends BaseMapper<WeGroupFission> {
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 11:00
+     *  @Description: 群裂变列表+分页
+     */
+    IPage<WeGroupFissionDto> getPageList(@Param("page") Page<WeGroupFissionDto> page, @Param("vo") WeGroupFissionVo weGroupFissionVo);
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 14:54
+     *  @Description: 通过id查询结束状态
+     */
+    WeGroupFission getStatusDetailsById(String id);
+}

+ 21 - 0
linkwe-service/src/main/java/com/linkwechat/mapper/WeGroupFissionStepRecordMapper.java

@@ -0,0 +1,21 @@
+package com.linkwechat.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.linkwechat.domain.weGroupFission.entity.WeGroupFissionStepRecord;
+
+
+/**
+ * @Description: 群群裂阶梯额外奖励记录
+ * @Author: jeecg-boot
+ * @Date:   2026-01-28
+ * @Version: V1.0
+ */
+public interface WeGroupFissionStepRecordMapper extends BaseMapper<WeGroupFissionStepRecord> {
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 11:59
+     *  @Description: 通过群裂变id删除
+     */
+    void deleteByGroupFissionId(String id);
+}

+ 14 - 0
linkwe-service/src/main/java/com/linkwechat/mapper/WeGroupFissionStepUserRecordMapper.java

@@ -0,0 +1,14 @@
+package com.linkwechat.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.linkwechat.domain.weGroupFission.entity.WeGroupFissionStepUserRecord;
+
+/**
+ * @Description: 用户奖励记录表
+ * @Author: jeecg-boot
+ * @Date:   2026-01-29
+ * @Version: V1.0
+ */
+public interface WeGroupFissionStepUserRecordMapper extends BaseMapper<WeGroupFissionStepUserRecord> {
+
+}

+ 22 - 0
linkwe-service/src/main/java/com/linkwechat/service/ILotteryActivityService.java

@@ -0,0 +1,22 @@
+package com.linkwechat.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.linkwechat.domain.weGroupFission.bdsh.LotteryActivity;
+
+import java.util.List;
+
+/**
+ * @Description: 抽奖活动
+ * @Author: jeecg-boot
+ * @Date:   2026-01-22
+ * @Version: V1.0
+ */
+public interface ILotteryActivityService extends IService<LotteryActivity> {
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/27 11:05
+     *  @Description: 查询进行中的活动
+     */
+    List<LotteryActivity> findListType(String type);
+}

+ 30 - 0
linkwe-service/src/main/java/com/linkwechat/service/IWeGroupFissionExtraRecordService.java

@@ -0,0 +1,30 @@
+package com.linkwechat.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.linkwechat.domain.weGroupFission.entity.WeGroupFissionExtraRecord;
+
+
+import java.util.List;
+
+/**
+ * @Description: 群裂变阶梯奖励记录
+ * @Author: jeecg-boot
+ * @Date:   2026-01-28
+ * @Version: V1.0
+ */
+public interface IWeGroupFissionExtraRecordService extends IService<WeGroupFissionExtraRecord> {
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 11:50
+     *  @Description: 通过群列表id删除额外奖励数据
+     */
+    void deleteByGroupFissionId(String id);
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 14:39
+     *  @Description: 通过群裂变id查询额外奖励数据
+     */
+    List<WeGroupFissionExtraRecord> findListByGroupFissionId(String id);
+}

+ 32 - 0
linkwe-service/src/main/java/com/linkwechat/service/IWeGroupFissionInvitationRecordService.java

@@ -0,0 +1,32 @@
+package com.linkwechat.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.linkwechat.domain.weGroupFission.dto.InvitationUserDto;
+import com.linkwechat.domain.weGroupFission.entity.WeGroupFissionInvitationRecord;
+
+
+import java.util.List;
+
+/**
+ * @Description: 群裂变用户邀请记录
+ * @Author: jeecg-boot
+ * @Date:   2026-01-29
+ * @Version: V1.0
+ */
+public interface IWeGroupFissionInvitationRecordService extends IService<WeGroupFissionInvitationRecord> {
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/29 10:58
+     *  @Description: 通过用户id查询用户奖励表
+     */
+    List<InvitationUserDto> getInvitationUserListByUserId(String userId, String groupFissionId);
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/29 11:14
+     *  @Description: 获取用户邀请记录
+     */
+    List<WeGroupFissionInvitationRecord> getListByUserId(String userId, String groupFissionId);
+}

+ 92 - 0
linkwe-service/src/main/java/com/linkwechat/service/IWeGroupFissionService.java

@@ -0,0 +1,92 @@
+package com.linkwechat.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.linkwechat.common.core.page.TableDataInfo;
+import com.linkwechat.domain.weGroupFission.dto.DistDto;
+import com.linkwechat.domain.weGroupFission.dto.WeGroupFissionDetailDto;
+import com.linkwechat.domain.weGroupFission.dto.WeGroupFissionDto;
+import com.linkwechat.domain.weGroupFission.entity.WeGroupFission;
+import com.linkwechat.domain.weGroupFission.vo.*;
+
+
+import java.util.List;
+
+/**
+ * @Description: 群裂变活动表
+ * @Author: jeecg-boot
+ * @Date:   2026-01-28
+ * @Version: V1.0
+ */
+public interface IWeGroupFissionService extends IService<WeGroupFission> {
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 10:56
+     *  @Description: 群列表列表+分页
+     */
+    TableDataInfo<?> getPageList(WeGroupFissionVo weGroupFissionVo);
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 11:26
+     *  @Description: 添加或者修改
+     */
+    void addOrUpdate(WeGroupFissionAddVo weGroupFissionAddVo);
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 11:29
+     *  @Description: 通过id查询详情信息
+     */
+    WeGroupFissionDetailDto queryDetailById(String id, String type);
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 11:31
+     *  @Description: 通过id删除数据
+     */
+    void deleteByWeGroupFissionId(String id);
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 15:05
+     *  @Description: 生成小程序的短连接
+     */
+    String getWechatGroupFissionUrl(CreateWechatGroupFissionUrlVo createWechatGroupFissionUrlVo);
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 16:40
+     *  @Description: 获取企业群列表
+     */
+    List<DistDto> getWecomGroupList();
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 16:41
+     *  @Description: 获取企业员工列表
+     */
+    List<DistDto> getWecomEmployeeList();
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/2/2 11:08
+     *  @Description: 获取商户列表数据
+     */
+    List<DistDto> getLocalMerchantInfoDictDtos();
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/2/2 11:09
+     *  @Description: 获取权益券列表
+     */
+    List<DistDto> getRightInfoDictDtos();
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/2/2 11:09
+     *  @Description: 获取抽奖活动列表
+     */
+    List<DistDto> getActivityDictDtos();
+}

+ 30 - 0
linkwe-service/src/main/java/com/linkwechat/service/IWeGroupFissionStepRecordService.java

@@ -0,0 +1,30 @@
+package com.linkwechat.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.linkwechat.domain.weGroupFission.entity.WeGroupFissionStepRecord;
+
+
+import java.util.List;
+
+/**
+ * @Description: 群群裂阶梯额外奖励记录
+ * @Author: jeecg-boot
+ * @Date:   2026-01-28
+ * @Version: V1.0
+ */
+public interface IWeGroupFissionStepRecordService extends IService<WeGroupFissionStepRecord> {
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 11:58
+     *  @Description: 通过群裂变id删除数据
+     */
+    void deleteByGroupFissionId(String id);
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 14:46
+     *  @Description: 根据群裂变id查询数据
+     */
+    List<WeGroupFissionStepRecord> findListByGroupCheckInId(String id);
+}

+ 31 - 0
linkwe-service/src/main/java/com/linkwechat/service/IWeGroupFissionStepUserRecordService.java

@@ -0,0 +1,31 @@
+package com.linkwechat.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.linkwechat.domain.weGroupFission.dto.UserRewardDetailDto;
+import com.linkwechat.domain.weGroupFission.entity.WeGroupFissionStepUserRecord;
+
+import java.util.List;
+
+/**
+ * @Description: 用户奖励记录表
+ * @Author: jeecg-boot
+ * @Date:   2026-01-29
+ * @Version: V1.0
+ */
+public interface IWeGroupFissionStepUserRecordService extends IService<WeGroupFissionStepUserRecord> {
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/29 11:00
+     *  @Description: 查询用户奖励表
+     */
+    UserRewardDetailDto getRewardListByUserId(String userId, String groupFissionId);
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/29 11:00
+     *  @Description: 查询用户奖励表
+     */
+    List<WeGroupFissionStepUserRecord> getListByUserId(String userId,String groupFissionId);
+}

+ 27 - 0
linkwe-service/src/main/java/com/linkwechat/service/LocalMerchantInfoService.java

@@ -0,0 +1,27 @@
+package com.linkwechat.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.linkwechat.domain.weGroupFission.bdsh.LocalMerchantInfo;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * @Description: 商户表实体
+ * @Author: jeecg-boot
+ * @Date: 2025-01-06
+ * @Version: V1.0
+ */
+public interface LocalMerchantInfoService extends IService<LocalMerchantInfo> {
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/31 17:03
+     *  @Description: 查询营业的商户数据
+     */
+    List<LocalMerchantInfo>  getMerchantInfoList();
+}

+ 23 - 0
linkwe-service/src/main/java/com/linkwechat/service/LocalRightsInfoService.java

@@ -0,0 +1,23 @@
+package com.linkwechat.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.linkwechat.domain.weGroupFission.bdsh.LocalRightsInfo;
+
+import java.util.List;
+
+/**
+ * @Description: 权益劵
+ * @Author: jeecg-boot
+ * @Date:   2025-04-30
+ * @Version: V1.0
+ */
+public interface LocalRightsInfoService extends IService<LocalRightsInfo> {
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/31 17:10
+     *  @Description: 获取已经上架的权益券列表
+     */
+    List<LocalRightsInfo> getRightInfoList();
+}

+ 46 - 0
linkwe-service/src/main/java/com/linkwechat/service/impl/LocalMerchantInfoServiceImpl.java

@@ -0,0 +1,46 @@
+package com.linkwechat.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateTime;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.linkwechat.domain.weGroupFission.bdsh.LocalMerchantInfo;
+import com.linkwechat.mapper.FissionMerchantInfoMapper;
+import com.linkwechat.service.LocalMerchantInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @Description: 商户表实体
+ * @Author: jeecg-boot
+ * @Date: 2025-01-06
+ * @Version: V1.0
+ */
+@Slf4j
+@DS("master")
+@Service
+public class LocalMerchantInfoServiceImpl extends ServiceImpl<FissionMerchantInfoMapper, LocalMerchantInfo> implements LocalMerchantInfoService {
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/31 16:41
+     *  @Description: 获取已营业的商户列表
+     */
+    public List<LocalMerchantInfo>  getMerchantInfoList(){
+        return this.list(new QueryWrapper<LocalMerchantInfo>().eq("merchant_status", 1));
+    }
+
+}

+ 42 - 0
linkwe-service/src/main/java/com/linkwechat/service/impl/LocalRightsInfoServiceImpl.java

@@ -0,0 +1,42 @@
+package com.linkwechat.service.impl;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.linkwechat.domain.weGroupFission.bdsh.LocalRightsInfo;
+import com.linkwechat.mapper.LocalRightsInfoMapper;
+import com.linkwechat.service.LocalRightsInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+
+/**
+ * @Description: 权益劵
+ * @Author: jeecg-boot
+ * @Date: 2025-04-30
+ * @Version: V1.0
+ */
+@Slf4j
+@DS("master")
+@Service
+public class LocalRightsInfoServiceImpl extends ServiceImpl<LocalRightsInfoMapper, LocalRightsInfo> implements LocalRightsInfoService {
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/31 17:10
+     *  @Description: 获取已经上架的权益券列表
+     */
+    @Override
+    public List<LocalRightsInfo> getRightInfoList() {
+        QueryWrapper<LocalRightsInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("rights_status", 1);
+        queryWrapper.orderByDesc("create_time");
+        return this.list(queryWrapper);
+    }
+}

+ 35 - 0
linkwe-service/src/main/java/com/linkwechat/service/impl/LotteryActivityServiceImpl.java

@@ -0,0 +1,35 @@
+package com.linkwechat.service.impl;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.linkwechat.domain.weGroupFission.bdsh.LotteryActivity;
+import com.linkwechat.mapper.LotteryActivityMapper;
+import com.linkwechat.service.ILotteryActivityService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+
+/**
+ * @Description: 抽奖活动
+ * @Author: jeecg-boot
+ * @Date:   2026-01-22
+ *
+ * @Version: V1.0
+ */
+@DS("master")
+@Service
+public class LotteryActivityServiceImpl extends ServiceImpl<LotteryActivityMapper, LotteryActivity> implements ILotteryActivityService {
+
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/27 11:06
+     *  @Description: 查询进行中的活动
+     */
+    @Override
+    public List<LotteryActivity> findListType(String type) {
+        return baseMapper.findListType(type);
+    }
+}

+ 40 - 0
linkwe-service/src/main/java/com/linkwechat/service/impl/WeGroupFissionExtraRecordServiceImpl.java

@@ -0,0 +1,40 @@
+package com.linkwechat.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.linkwechat.domain.weGroupFission.entity.WeGroupFissionExtraRecord;
+import com.linkwechat.mapper.WeGroupFissionExtraRecordMapper;
+import com.linkwechat.service.IWeGroupFissionExtraRecordService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @Description: 群裂变阶梯奖励记录
+ * @Author: jeecg-boot
+ * @Date:   2026-01-28
+ * @Version: V1.0
+ */
+@Service
+public class WeGroupFissionExtraRecordServiceImpl extends ServiceImpl<WeGroupFissionExtraRecordMapper, WeGroupFissionExtraRecord> implements IWeGroupFissionExtraRecordService {
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 12:00
+     *  @Description: 通过群裂变id删除数据
+     */
+    @Override
+    public void deleteByGroupFissionId(String id) {
+        this.baseMapper.deleteByGroupFissionId(id);
+    }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 14:40
+     *  @Description: 通过群裂变id查询额外奖励数据
+     */
+    @Override
+    public List<WeGroupFissionExtraRecord> findListByGroupFissionId(String id) {
+        return this.list(new QueryWrapper<WeGroupFissionExtraRecord>().eq("group_fission_id", id).orderByAsc("sort_num"));
+    }
+}

+ 51 - 0
linkwe-service/src/main/java/com/linkwechat/service/impl/WeGroupFissionInvitationRecordServiceImpl.java

@@ -0,0 +1,51 @@
+package com.linkwechat.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import com.linkwechat.domain.weGroupFission.dto.InvitationUserDto;
+import com.linkwechat.domain.weGroupFission.entity.WeGroupFissionInvitationRecord;
+import com.linkwechat.mapper.WeGroupFissionInvitationRecordMapper;
+import com.linkwechat.service.IWeGroupFissionInvitationRecordService;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description: 群裂变用户邀请记录
+ * @Author: jeecg-boot
+ * @Date:   2026-01-29
+ * @Version: V1.0
+ */
+@Service
+public class WeGroupFissionInvitationRecordServiceImpl extends ServiceImpl<WeGroupFissionInvitationRecordMapper, WeGroupFissionInvitationRecord> implements IWeGroupFissionInvitationRecordService {
+
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/29 10:58
+     *  @Description: 通过用户id查询用户奖励表
+     */
+    @Override
+    public List<InvitationUserDto> getInvitationUserListByUserId(String userId, String groupFissionId) {
+        List<WeGroupFissionInvitationRecord> list = getListByUserId(userId, groupFissionId);
+        List<InvitationUserDto> invitationUserDtoList  =new ArrayList<>();
+        if(list!=null && !list.isEmpty()){
+            for (WeGroupFissionInvitationRecord weGroupFissionInvitationRecord : list) {
+                InvitationUserDto dto =new InvitationUserDto();
+                dto.setNickName(weGroupFissionInvitationRecord.getInvitationUserId());
+                dto.setCreateTime(weGroupFissionInvitationRecord.getCreateTime());
+                invitationUserDtoList.add(dto);
+            }
+        }
+        return invitationUserDtoList;
+    }
+    @Override
+    public List<WeGroupFissionInvitationRecord> getListByUserId(String userId,String groupFissionId) {
+        return this.list(new QueryWrapper<WeGroupFissionInvitationRecord>()
+                .eq("share_user_id",userId).eq("group_fission_id",groupFissionId)
+                .orderByDesc("create_time"));
+    }
+}

+ 525 - 0
linkwe-service/src/main/java/com/linkwechat/service/impl/WeGroupFissionServiceImpl.java

@@ -0,0 +1,525 @@
+package com.linkwechat.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.linkwechat.common.core.domain.AjaxResult;
+import com.linkwechat.common.core.domain.model.LoginUser;
+import com.linkwechat.common.core.page.TableDataInfo;
+import com.linkwechat.common.exception.CustomException;
+import com.linkwechat.common.utils.WxMiniProgramSchemeUtil;
+import com.linkwechat.domain.weGroupFission.bdsh.LocalMerchantInfo;
+import com.linkwechat.domain.weGroupFission.bdsh.LocalRightsInfo;
+import com.linkwechat.domain.weGroupFission.bdsh.LotteryActivity;
+import com.linkwechat.domain.weGroupFission.dto.DistDto;
+import com.linkwechat.domain.weGroupFission.dto.WeGroupFissionDetailDto;
+import com.linkwechat.domain.weGroupFission.dto.WeGroupFissionDto;
+import com.linkwechat.domain.weGroupFission.entity.WeGroupFission;
+import com.linkwechat.domain.weGroupFission.entity.WeGroupFissionExtraRecord;
+import com.linkwechat.domain.weGroupFission.entity.WeGroupFissionStepRecord;
+import com.linkwechat.domain.weGroupFission.vo.*;
+import com.linkwechat.framework.service.TokenService;
+import com.linkwechat.mapper.WeGroupFissionMapper;
+import com.linkwechat.service.*;
+import me.chanjar.weixin.cp.api.WxCpExternalContactService;
+import me.chanjar.weixin.cp.bean.external.WxCpUserExternalGroupChatList;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 群裂变活动表
+ * @Author: jeecg-boot
+ * @Date:   2026-01-28
+ * @Version: V1.0
+ */
+@Service
+public class WeGroupFissionServiceImpl extends ServiceImpl<WeGroupFissionMapper, WeGroupFission> implements IWeGroupFissionService {
+
+
+    @Autowired
+    private IWeGroupFissionExtraRecordService weGroupFissionExtraRecordService;
+
+    @Autowired
+    private IWeGroupFissionStepRecordService weGroupFissionStepRecordService;
+
+    @Resource
+    private WxMiniProgramSchemeUtil wxMiniProgramSchemeUtil;
+
+    @Autowired
+    private LocalMerchantInfoService localMerchantInfoService;
+    @Resource
+    private TokenService tokenService;
+
+    @Autowired
+    private ILotteryActivityService lotteryActivityService;
+
+    @Autowired
+    private LocalRightsInfoService localRightsInfoService;
+
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 10:59
+     *  @Description: 群裂变列表+分页
+     */
+    @Override
+    public TableDataInfo<?> getPageList(WeGroupFissionVo weGroupFissionVo) {
+        TableDataInfo rspData = new TableDataInfo();
+        if(weGroupFissionVo.getPageNum() == null){
+            rspData.setCode(500);
+            rspData.setMsg("当前页码不能为空");
+            return rspData;
+        }
+        if(weGroupFissionVo.getPageSize() == null){
+            rspData.setCode(500);
+            rspData.setMsg("页数不能为空");
+            return rspData;
+        }
+        Page<WeGroupFissionDto> page = new Page<WeGroupFissionDto>(weGroupFissionVo.getPageNum(), weGroupFissionVo.getPageSize());
+        IPage<WeGroupFissionDto> pageList = this.getBaseMapper().getPageList(page, weGroupFissionVo);
+        List<WeGroupFissionDto> records = pageList.getRecords();
+        if(records==null || records.isEmpty()){
+            records =new ArrayList<>();
+        }
+        rspData.setCode(200);
+        rspData.setMsg("查询成功");
+        rspData.setRows(records);
+        rspData.setPageNum(weGroupFissionVo.getPageNum());
+        rspData.setPageSize(weGroupFissionVo.getPageSize());
+        rspData.setTotal(pageList.getTotal());
+        return rspData;
+    }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 11:30
+     *  @Description: 群裂变添加或者修改
+     */
+    @Override
+    public void addOrUpdate(WeGroupFissionAddVo weGroupFissionAddVo) {
+        try{
+            //获取平台用户登录id
+            LoginUser loginUser = tokenService.getLoginUser();
+            //验证数据正确性
+            checkData(weGroupFissionAddVo);
+            //判断是否有id 新增
+            String id ="";
+            if (StringUtils.isNotBlank(weGroupFissionAddVo.getId())) {
+                WeGroupFission weGroupFissionUpdate = this.getById(weGroupFissionAddVo.getId());
+                if(weGroupFissionUpdate==null){
+                    throw new CustomException("数据不存在");
+                }
+                id = weGroupFissionUpdate.getId();
+                BeanUtil.copyProperties(weGroupFissionAddVo, weGroupFissionUpdate);
+                //修改创建时间、创建人
+                weGroupFissionUpdate.setUpdateTime(new Date());
+                weGroupFissionUpdate.setUpdateUserId(String.valueOf(loginUser.getUserId()));
+                this.updateById(weGroupFissionUpdate);
+            }else{
+                WeGroupFission weGroupFissionAdd =new WeGroupFission();
+                BeanUtil.copyProperties(weGroupFissionAddVo, weGroupFissionAdd);
+                //添加创建时间、创建人
+                weGroupFissionAdd.setCreateTime(new Date());
+                 weGroupFissionAdd.setCreateUserId(String.valueOf(loginUser.getUserId()));
+                //1.插入群打卡表
+                this.save(weGroupFissionAdd);
+                id = weGroupFissionAdd.getId();
+            }
+            //2.插入阶段记录表  先通过id删除再添加
+            List<WeGroupFissionStepVo> weGroupFissionStepList = weGroupFissionAddVo.getWeGroupFissionStepList();
+            if(weGroupFissionStepList!=null && !weGroupFissionStepList.isEmpty()) {
+                weGroupFissionStepRecordService.deleteByGroupFissionId(id);
+                List<WeGroupFissionStepRecord> list =new ArrayList<WeGroupFissionStepRecord>();
+                String weGroupFissionId = id;
+                for (WeGroupFissionStepVo weGroupFissionStepVo : weGroupFissionStepList) {
+                    WeGroupFissionStepRecord add = new WeGroupFissionStepRecord();
+                    add.setGroupFissionId(weGroupFissionId);
+                    add.setInvitationCount(weGroupFissionStepVo.getInvitationCount());
+                    add.setSortNum(weGroupFissionStepVo.getSortNum());
+                    add.setRewardAmount(weGroupFissionStepVo.getRewardAmount());
+                    add.setCreateTime(new Date());
+                    list.add(add);
+                }
+                weGroupFissionStepRecordService.saveBatch(list);
+            }
+            //2.插入额外奖励记录表  先通过id删除再添加
+            List<WeGroupFissionExtraVo> weGroupFissionExtraList = weGroupFissionAddVo.getWeGroupFissionExtraList();
+
+            if(weGroupFissionExtraList!=null && !weGroupFissionExtraList.isEmpty()) {
+                weGroupFissionExtraRecordService.deleteByGroupFissionId(id);
+                List<WeGroupFissionExtraRecord> list =new ArrayList<WeGroupFissionExtraRecord>();
+                String weGroupFissionId = id;
+                for (WeGroupFissionExtraVo weGroupFissionExtraVo : weGroupFissionExtraList) {
+                    WeGroupFissionExtraRecord add = new WeGroupFissionExtraRecord();
+                    add.setGroupFissionId(weGroupFissionId);
+                    add.setSortNum(weGroupFissionExtraVo.getSortNum());
+                    add.setRewardType(weGroupFissionExtraVo.getRewardType());
+                    add.setRewardAmount(weGroupFissionExtraVo.getRewardAmount());
+                    add.setRightInfoId(weGroupFissionExtraVo.getRightInfoId());
+                    add.setLotteryActivityId(weGroupFissionExtraVo.getLotteryActivityId());
+                    add.setCreateTime(new Date());
+                    list.add(add);
+                }
+                weGroupFissionExtraRecordService.saveBatch(list);
+            }
+        }catch (Exception e){
+            throw new CustomException(e.getMessage());
+        }
+    }
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 14:34
+     *  @Description:  验证数据准确性
+     */
+    public  void  checkData(WeGroupFissionAddVo weGroupFissionAddVo){
+        //1.触发条件判断  注:≥1,≤200(邀请新客户进群人数)
+        if(weGroupFissionAddVo.getInvitationCount() <1 || weGroupFissionAddVo.getInvitationCount()>200){
+            throw new CustomException("邀请新客户进群人数必须>=1且<=200");
+        }
+        //2.验证阶梯集合对象
+        if (weGroupFissionAddVo.getWeGroupFissionStepList() == null || weGroupFissionAddVo.getWeGroupFissionStepList().isEmpty()) {
+            throw new CustomException("阶梯列表不能为空!");
+        }else{
+            //验证每行数据不能为空
+            validateStepList(weGroupFissionAddVo.getWeGroupFissionStepList());
+        }
+        //3.验证额外奖励集合对象
+        if(weGroupFissionAddVo.getWeGroupFissionExtraList() == null  || weGroupFissionAddVo.getWeGroupFissionExtraList().isEmpty()){
+            throw new CustomException("额外奖励列表不能为空!");
+        }else{
+            //验证每行数据不能为空
+            validateExtraList(weGroupFissionAddVo.getWeGroupFissionExtraList(),weGroupFissionAddVo.getWeGroupFissionStepList().size());
+        }
+
+    }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 14:23
+     *  @Description: 验证额外奖励数据
+     */
+    private void validateExtraList(List<WeGroupFissionExtraVo> weGroupFissionExtraList, int size) {
+        Set<Integer> sortNumSet = new HashSet<>();
+        for (int i = 0; i < weGroupFissionExtraList.size(); i++) {
+            WeGroupFissionExtraVo weGroupFissionExtraVo = weGroupFissionExtraList.get(i);
+            String indexTip = "第" + (i + 1) + "条额外奖励记录:";
+            if (weGroupFissionExtraVo == null) {
+                throw new CustomException(indexTip + "额外奖励记录对象不能为空");
+            }
+            if (weGroupFissionExtraVo.getSortNum() == null) {
+                throw new CustomException(indexTip + "阶梯序号不能为空");
+            }
+            if (weGroupFissionExtraVo.getSortNum()>size) {
+                throw new CustomException(indexTip + "阶梯序号不能大于阶梯的数量");
+            }
+            if (sortNumSet.contains(weGroupFissionExtraVo.getSortNum())) {
+                throw new CustomException("阶梯序号[" + weGroupFissionExtraVo.getSortNum() + "]重复");
+            }
+            sortNumSet.add(weGroupFissionExtraVo.getSortNum());
+
+            if (weGroupFissionExtraVo.getRewardType() == null || weGroupFissionExtraVo.getRewardType().trim().isEmpty()) {
+                throw new CustomException(indexTip + "奖励类型不能为空");
+            }
+            String rewardType = weGroupFissionExtraVo.getRewardType().trim();
+            if (!"1".equals(rewardType) && !"2".equals(rewardType) && !"3".equals(rewardType)) {
+                throw new CustomException(indexTip + "奖励类型不正确");
+            }
+            if ("1".equals(rewardType)) {
+                if (weGroupFissionExtraVo.getRewardAmount() == null) {
+                    throw new CustomException(indexTip + "奖励金额不能为空");
+                }
+                if (weGroupFissionExtraVo.getRewardAmount().compareTo(BigDecimal.ZERO) <= 0) {
+                    throw new CustomException(indexTip + "奖励金额数值必须大于0");
+                }
+            }else if ("2".equals(rewardType)) {
+                if (StringUtils.isBlank(weGroupFissionExtraVo.getRightInfoId())) {
+                    throw new CustomException(indexTip + "权益券id不能为空");
+                }
+            }else if ("3".equals(rewardType)) {
+                if (StringUtils.isBlank(weGroupFissionExtraVo.getLotteryActivityId())) {
+                    throw new CustomException(indexTip + "大转盘或者九宫格活动id不能为空");
+                }
+            }
+
+
+        }
+    }
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 14:13
+     *  @Description: 验证数据
+     */
+    public static void validateStepList(List<WeGroupFissionStepVo> stepVoList) {
+        // 验证数据
+        WeGroupFissionStepVo prevStep = null;
+        for (int i = 0; i < stepVoList.size(); i++) {
+            WeGroupFissionStepVo currentStep = stepVoList.get(i);
+            if (currentStep.getSortNum() == null) {
+                throw new IllegalArgumentException("第" + (i + 1) + "条阶梯数据的序号不能为空");
+            }
+            if (currentStep.getInvitationCount() == null) {
+                throw new IllegalArgumentException("第" + (i + 1) + "条阶梯数据的邀请人数不能为空");
+            }
+            if (currentStep.getRewardAmount() == null) {
+                throw new IllegalArgumentException("第" + (i + 1) + "条阶梯数据的奖励金额不能为空");
+            }
+            if (i > 0 && prevStep != null) {
+                if (currentStep.getInvitationCount() <= prevStep.getInvitationCount()) {
+                    throw new IllegalArgumentException(
+                            "第" + (i + 1) + "条阶梯数据的邀请人数(" + currentStep.getInvitationCount() + ")" +
+                                    "必须大于第" + i + "条的邀请人数(" + prevStep.getInvitationCount() + ")"
+                    );
+                }
+            }
+            prevStep = currentStep;
+        }
+    }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 11:30
+     *  @Description: 通过id查询群裂变信息
+     * @param type  1.后台结构  2.app结构
+     */
+    @Override
+    public WeGroupFissionDetailDto queryDetailById(String id, String type) {
+        WeGroupFission weGroupFission = this.getById(id);
+        if(weGroupFission==null){
+            throw  new CustomException("群裂变活动不存在");
+        }
+        //1.基础数据赋值
+        WeGroupFissionDetailDto dto =new WeGroupFissionDetailDto();
+        BeanUtils.copyProperties(weGroupFission, dto);
+        //2.关联阶梯奖励赋值
+        List<WeGroupFissionStepRecord> stepList = weGroupFissionStepRecordService.findListByGroupCheckInId(id);
+        if(stepList!=null && !stepList.isEmpty()) {
+            if("1".equals(type)){
+                List<WeGroupFissionStepVo> weGroupFissionStepList = new ArrayList<WeGroupFissionStepVo>();
+                stepList.forEach(reward -> {
+                    WeGroupFissionStepVo weGroupFissionStepVo = new WeGroupFissionStepVo();
+                    BeanUtils.copyProperties(reward, weGroupFissionStepVo);
+                    weGroupFissionStepList.add(weGroupFissionStepVo);
+                });
+                dto.setWeGroupFissionStepList(weGroupFissionStepList);
+            }
+        }
+        //3.关联额外奖励赋值
+        List<WeGroupFissionExtraRecord> extraList = weGroupFissionExtraRecordService.findListByGroupFissionId(id);
+        HashMap<String, WeGroupFissionExtraRecord> extraMap = new HashMap<>();
+        if(extraList!=null && !extraList.isEmpty()) {
+            List<WeGroupFissionExtraVo> weGroupFissionExtraList = new ArrayList<WeGroupFissionExtraVo>();
+            extraList.forEach(reward -> {
+                WeGroupFissionExtraVo weGroupFissionExtraVo = new WeGroupFissionExtraVo();
+                BeanUtils.copyProperties(reward, weGroupFissionExtraVo);
+                if(StringUtils.isNotBlank(reward.getRightInfoId())){
+                    LocalRightsInfo localRightsInfo = localRightsInfoService.getById(reward.getRightInfoId());
+                    weGroupFissionExtraVo.setRightInfoName(localRightsInfo!=null?localRightsInfo.getRightsName():null);
+                }
+                if(StringUtils.isNotBlank(reward.getLotteryActivityId())){
+                     LotteryActivity lotteryActivity = lotteryActivityService.getById(reward.getLotteryActivityId());
+                     weGroupFissionExtraVo.setLotteryActivityName(lotteryActivity!=null?lotteryActivity.getActivityName():null);
+                }
+                extraMap.put(reward.getSortNum()+"", reward);
+                weGroupFissionExtraList.add(weGroupFissionExtraVo);
+            });
+            if("1".equals(type)){
+                dto.setWeGroupFissionExtraList(weGroupFissionExtraList);
+            }else if("2".equals(type)){
+                //APP对象
+                if(stepList!=null && !stepList.isEmpty()) {
+                    List<WeGroupFissionStepAppVo> weGroupFissionStepAppList = new ArrayList<WeGroupFissionStepAppVo>();
+                    stepList.forEach(reward -> {
+                        WeGroupFissionStepAppVo weGroupFissionStepVo = new WeGroupFissionStepAppVo();
+                        BeanUtils.copyProperties(reward, weGroupFissionStepVo);
+                        WeGroupFissionExtraRecord weGroupFissionExtraRecord = extraMap.get(reward.getSortNum() + "");
+                        if(weGroupFissionExtraRecord!=null){
+                            weGroupFissionStepVo.setExtraRewardAmount(weGroupFissionExtraRecord.getRewardAmount());
+                            weGroupFissionStepVo.setRewardType(weGroupFissionExtraRecord.getRewardType());
+                        }
+                        weGroupFissionStepAppList.add(weGroupFissionStepVo);
+                    });
+                    dto.setWeGroupFissionStepAppList(weGroupFissionStepAppList);
+                }
+            }
+
+        }
+        //4.查询商户名称
+        LocalMerchantInfo merchantInfo = localMerchantInfoService.getById(weGroupFission.getMerchantId());
+        dto.setMerchantName(merchantInfo!=null?merchantInfo.getStoreName():null);
+        return dto;
+    }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 11:32
+     *  @Description: 通过id删除数据
+     */
+    @Override
+    public void deleteByWeGroupFissionId(String id) {
+        WeGroupFission weGroupFission = getStatusDetailsById(id);
+        if("进行中".equals(weGroupFission.getActivityStatus())
+                || "已结束".equals(weGroupFission.getActivityStatus())){
+            throw new CustomException("活动进行中或已结束,不能删除");
+        }else{
+            this.removeById(id);
+            //删除阶梯表
+            weGroupFissionStepRecordService.deleteByGroupFissionId(id);
+            //刪除关联额外奖励务表
+            weGroupFissionExtraRecordService.deleteByGroupFissionId(id);
+        }
+    }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 15:05
+     *  @Description: 生成小程序的短连接
+     */
+    @Override
+    public String getWechatGroupFissionUrl(CreateWechatGroupFissionUrlVo createWechatGroupFissionUrlVo) {
+        String queryParam = "groupFissionId="+createWechatGroupFissionUrlVo.getGroupFissionId();
+        //添加分享人id
+        if(StringUtils.isNotBlank(createWechatGroupFissionUrlVo.getShareUserId())){
+            queryParam = queryParam + "&shareUserId="+createWechatGroupFissionUrlVo.getShareUserId();
+        }
+        String url ="";
+        try{
+            url = wxMiniProgramSchemeUtil.generateScheme(createWechatGroupFissionUrlVo.getUrl(), queryParam, 0,createWechatGroupFissionUrlVo.getVersion());
+        }catch (Exception e){
+            throw new CustomException("生成群打卡的短链失败");
+        }
+        return url;
+    }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 16:42
+     *  @Description: 获取企业微信群列表
+     */
+    @Override
+    public List<DistDto> getWecomGroupList() {
+        List<DistDto> list = new ArrayList<>();
+        DistDto dto = new DistDto();
+        dto.setVal("1");
+        dto.setName("企业微信群1");
+        DistDto dto2 = new DistDto();
+        dto2.setVal("2");
+        dto2.setName("企业微信群2");
+        list.add(dto2);
+        try {
+          /*  WxCpExternalContactService externalContactService = wxCpService.getExternalContactService();
+            WxCpUserExternalGroupChatList wxCpUserExternalGroupChatList = externalContactService.listGroupChat(0, 1000, 0, null,null);
+            // 3. 处理返回结果(打印群信息)
+            if (wxCpUserExternalGroupChatList != null ) {
+                List<WxCpUserExternalGroupChatList.ChatStatus> groupChatList = wxCpUserExternalGroupChatList.getGroupChatList();
+                System.out.println("查询成功!获取到 " + groupChatList.size() + " 个企业群");
+                for (WxCpUserExternalGroupChatList.ChatStatus groupChat : groupChatList) {
+                    DistDto dto =new DistDto();
+                    dto.setVal(groupChat.getChatId());
+                    dto.setName(groupChat.getChatId());
+                    System.out.println("------------------------");
+                    System.out.println("群 ID:" + groupChat.getChatId());
+                    System.out.println("群状态:" + groupChat.getStatus());
+                }
+            } else {
+                System.out.println("查询成功,但未获取到任何企业群(可能无群或权限不足)");
+            }*/
+        } catch (Exception e) {
+            System.out.println("查询企业群列表失败,异常信息:" + e.getMessage());
+            e.printStackTrace(); // 打印详细堆栈,方便排查问题
+        }
+        return list;
+    }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 16:42
+     *  @Description:  获取企业微信员工列表
+     */
+    @Override
+    public List<DistDto> getWecomEmployeeList() {
+        return getWecomGroupList();
+    }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/31 16:16
+     *  @Description: 获取九宫格活动列表
+     */
+    public List<DistDto> getActivityDictDtos() {
+        List<DistDto> list = new ArrayList<>();
+        List<LotteryActivity> activityList = lotteryActivityService.findListType(null);
+        if(activityList != null && activityList.size() > 0){
+            for(LotteryActivity info : activityList){
+                DistDto dto = new DistDto();
+                dto.setVal(info.getId());
+                dto.setName(info.getActivityName());
+                list.add(dto);
+            }
+        }
+        return list;
+    }
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/31 16:16
+     *  @Description: 获取权益券列表
+     */
+    public List<DistDto> getRightInfoDictDtos() {
+
+        List<DistDto> list = new ArrayList<>();
+        List<LocalRightsInfo> localRightsInfoList = localRightsInfoService.getRightInfoList();
+        if(localRightsInfoList != null && localRightsInfoList.size() > 0){
+            for(LocalRightsInfo info : localRightsInfoList){
+                DistDto dto = new DistDto();
+                dto.setVal(info.getId());
+                dto.setName(info.getRightsName());
+                list.add(dto);
+            }
+        }
+        return list;
+    }
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/31 16:15
+     *  @Description: 获取启用的商户
+     */
+    public List<DistDto> getLocalMerchantInfoDictDtos() {
+        List<DistDto> list = new ArrayList<>();
+        List<LocalMerchantInfo> merchantInfoList = localMerchantInfoService.getMerchantInfoList();
+        if(merchantInfoList != null && merchantInfoList.size() > 0){
+            for(LocalMerchantInfo info : merchantInfoList){
+                DistDto dto = new DistDto();
+                dto.setVal(info.getId());
+                dto.setName(info.getStoreName());
+                list.add(dto);
+            }
+        }
+        return list;
+    }
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 14:53
+     *  @Description: 查询状态
+     */
+    public WeGroupFission getStatusDetailsById(String id) {
+        return this.getBaseMapper().getStatusDetailsById(id);
+    }
+}

+ 41 - 0
linkwe-service/src/main/java/com/linkwechat/service/impl/WeGroupFissionStepRecordServiceImpl.java

@@ -0,0 +1,41 @@
+package com.linkwechat.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.linkwechat.domain.weGroupFission.entity.WeGroupFissionStepRecord;
+import com.linkwechat.mapper.WeGroupFissionStepRecordMapper;
+import com.linkwechat.service.IWeGroupFissionStepRecordService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @Description: 群群裂阶梯额外奖励记录
+ * @Author: jeecg-boot
+ * @Date:   2026-01-28
+ * @Version: V1.0
+ */
+@Service
+public class WeGroupFissionStepRecordServiceImpl extends ServiceImpl<WeGroupFissionStepRecordMapper, WeGroupFissionStepRecord> implements IWeGroupFissionStepRecordService {
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 11:59
+     *  @Description: 通过群裂变id删除数据
+     */
+    @Override
+    public void deleteByGroupFissionId(String id) {
+        this.baseMapper.deleteByGroupFissionId(id);
+    }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/28 14:47
+     *  @Description: 通过群列表id查询数据
+     */
+    @Override
+    public List<WeGroupFissionStepRecord> findListByGroupCheckInId(String id) {
+        return this.list(new QueryWrapper<WeGroupFissionStepRecord>().eq("group_fission_id", id).orderByAsc("sort_num"));
+    }
+}

+ 62 - 0
linkwe-service/src/main/java/com/linkwechat/service/impl/WeGroupFissionStepUserRecordServiceImpl.java

@@ -0,0 +1,62 @@
+package com.linkwechat.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import com.linkwechat.domain.weGroupFission.dto.UserRewardDetailDto;
+import com.linkwechat.domain.weGroupFission.dto.UserRewardDto;
+import com.linkwechat.domain.weGroupFission.entity.WeGroupFissionStepUserRecord;
+import com.linkwechat.mapper.WeGroupFissionStepUserRecordMapper;
+import com.linkwechat.service.IWeGroupFissionStepUserRecordService;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description: 用户奖励记录表
+ * @Author: jeecg-boot
+ * @Date:   2026-01-29
+ * @Version: V1.0
+ */
+@Service
+public class WeGroupFissionStepUserRecordServiceImpl extends ServiceImpl<WeGroupFissionStepUserRecordMapper, WeGroupFissionStepUserRecord> implements IWeGroupFissionStepUserRecordService {
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/29 11:00
+     *  @Description: 通过用户id查询奖励记录表
+     */
+    @Override
+    public UserRewardDetailDto getRewardListByUserId(String userId, String groupFissionId) {
+        List<WeGroupFissionStepUserRecord> list = getListByUserId(userId, groupFissionId);
+        List<UserRewardDto> invitationUserDtoList  =new ArrayList<>();
+        UserRewardDetailDto detailDto =new UserRewardDetailDto();
+        BigDecimal sumAmount = BigDecimal.ZERO;
+        if(list!=null && !list.isEmpty()){
+            for (WeGroupFissionStepUserRecord weGroupFissionStepUserRecord : list) {
+                UserRewardDto dto =new UserRewardDto();
+                dto.setRewardAmount(weGroupFissionStepUserRecord.getRewardAmount());
+                sumAmount = sumAmount.add(weGroupFissionStepUserRecord.getRewardAmount());
+                dto.setCreateTime(weGroupFissionStepUserRecord.getCreateTime());
+                invitationUserDtoList.add(dto);
+            }
+        }
+        detailDto.setSumAmount(sumAmount);
+        detailDto.setUserAmountRecord(invitationUserDtoList);
+        return detailDto;
+    }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2026/1/29 11:00
+     *  @Description: 通过用户id查询奖励记录表
+     */
+    @Override
+    public List<WeGroupFissionStepUserRecord> getListByUserId(String userId, String groupFissionId) {
+        return this.list(new QueryWrapper<WeGroupFissionStepUserRecord>()
+                .eq("userId",userId).eq("group_fission_id",groupFissionId)
+                .orderByDesc("create_time"));
+    }
+}

+ 7 - 0
linkwe-service/src/main/resources/mapper/wecom/FissionMerchantInfoMapper.xml

@@ -0,0 +1,7 @@
+<?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.linkwechat.mapper.FissionMerchantInfoMapper">
+
+
+
+</mapper>

+ 5 - 0
linkwe-service/src/main/resources/mapper/wecom/LocalRightsInfoMapper.xml

@@ -0,0 +1,5 @@
+<?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.linkwechat.mapper.LocalRightsInfoMapper">
+
+</mapper>

+ 22 - 0
linkwe-service/src/main/resources/mapper/wecom/LotteryActivityMapper.xml

@@ -0,0 +1,22 @@
+<?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.linkwechat.mapper.LotteryActivityMapper">
+    <select id="findListType" resultType="com.linkwechat.domain.weGroupFission.bdsh.LotteryActivity">
+        SELECT
+            lo.*
+        FROM
+            lottery_activity lo
+        <where>
+            <if test="type !=null and type  !=''">
+                AND lo.type =#{type}
+            </if>
+             AND lo.participation_rules = 3
+             AND lo.activity_start_time IS NOT NULL
+             AND lo.activity_end_time IS NOT NULL
+             AND NOW() <![CDATA[>=]]> lo.activity_start_time
+             AND NOW() <![CDATA[<=]]> lo.activity_end_time
+         </where>
+
+     </select>
+
+ </mapper>

+ 8 - 0
linkwe-service/src/main/resources/mapper/wecom/WeGroupFissionExtraRecordMapper.xml

@@ -0,0 +1,8 @@
+<?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.linkwechat.mapper.WeGroupFissionExtraRecordMapper">
+
+    <delete id="deleteByGroupFissionId">
+        delete from we_group_fission_extra_record where group_fission_id = #{id}
+    </delete>
+</mapper>

+ 5 - 0
linkwe-service/src/main/resources/mapper/wecom/WeGroupFissionInvitationRecordMapper.xml

@@ -0,0 +1,5 @@
+<?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.linkwechat.mapper.WeGroupFissionInvitationRecordMapper">
+
+</mapper>

+ 57 - 0
linkwe-service/src/main/resources/mapper/wecom/WeGroupFissionMapper.xml

@@ -0,0 +1,57 @@
+<?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.linkwechat.mapper.WeGroupFissionMapper">
+
+    <select id="getPageList" resultType="com.linkwechat.domain.weGroupFission.dto.WeGroupFissionDto">
+        SELECT
+            lo.id AS id,
+            lo.title AS title,
+            lo.begin_date AS beginDate,
+            lo.end_date AS endDate,
+            lo.create_time AS createTime,
+            su.user_name AS createUserName,
+            CASE
+            WHEN lo.begin_date IS NOT NULL
+            AND lo.end_date IS NOT NULL
+            AND NOW() <![CDATA[>=]]> lo.begin_date
+            AND NOW() <![CDATA[<=]]> lo.end_date THEN '进行中' WHEN lo.end_date IS NOT NULL AND NOW() <![CDATA[>=]]>  lo.end_date THEN
+            '已结束'
+            WHEN lo.begin_date IS NULL
+            OR NOW() <![CDATA[<=]]> lo.begin_date THEN
+            '未开始' ELSE '状态异常'
+            END AS activityStatus
+        FROM
+        we_group_fission lo
+        LEFT JOIN sys_user su ON lo.create_user_id = su.user_id
+        <where>
+            <if test="vo.title !=null and vo.title !=''">
+                AND lo.title LIKE CONCAT('%', #{vo.title}, '%')
+            </if>
+            <if test="vo.beginDate !=null  and  vo.beginDate !='' and vo.endDate !=null  and  vo.endDate !=''" >
+                AND lo.begin_date <![CDATA[>=]]> #{vo.beginDate} AND lo.end_date <![CDATA[<=]]> #{vo.endDate}
+            </if>
+            <if test="vo.createDate !=null  and  vo.createDate !=''" >
+                AND lo.create_time  = #{vo.createDate}
+            </if>
+        </where>
+        order by lo.create_time desc
+    </select>
+
+    <select id="getStatusDetailsById" resultType="com.linkwechat.domain.weGroupFission.entity.WeGroupFission">
+        SELECT
+            lo.*,
+            CASE
+                WHEN lo.begin_date IS NOT NULL
+                    AND lo.end_date IS NOT NULL
+                    AND NOW() <![CDATA[>=]]> lo.begin_date
+                    AND NOW() <![CDATA[<=]]> lo.end_date THEN '进行中' WHEN lo.end_date IS NOT NULL AND NOW() <![CDATA[>=]]>  lo.end_date THEN
+                    '已结束'
+                WHEN lo.begin_date IS NULL
+                    OR NOW() <![CDATA[<=]]> lo.begin_date THEN
+                    '未开始' ELSE '状态异常'
+                END AS activityStatus
+        FROM
+            we_group_fission lo
+        where lo.id = #{id}
+    </select>
+</mapper>

+ 8 - 0
linkwe-service/src/main/resources/mapper/wecom/WeGroupFissionStepRecordMapper.xml

@@ -0,0 +1,8 @@
+<?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.linkwechat.mapper.WeGroupFissionStepRecordMapper">
+
+    <delete id="deleteByGroupFissionId">
+        delete from we_group_fission_step_record where group_fission_id = #{id}
+    </delete>
+</mapper>

+ 5 - 0
linkwe-service/src/main/resources/mapper/wecom/WeGroupFissionStepUserRecordMapper.xml

@@ -0,0 +1,5 @@
+<?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.linkwechat.mapper.WeGroupFissionStepUserRecordMapper">
+
+</mapper>