Qchen 1 год назад
Родитель
Сommit
d366f4396b
54 измененных файлов с 2117 добавлено и 76 удалено
  1. 64 0
      linkwe-api/src/main/java/com/linkwechat/controller/WeActivityController.java
  2. 10 0
      linkwe-api/src/main/java/com/linkwechat/controller/WeMaterialController.java
  3. 64 0
      linkwe-api/src/main/java/com/linkwechat/controller/WeSopBaseController.java
  4. 32 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/equity/controller/EquityCouponController.java
  5. 19 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/equity/entity/EquityCoupon.java
  6. 12 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/equity/mapper/EquityCouponMapper.java
  7. 11 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/equity/service/EquityCouponService.java
  8. 22 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/equity/service/impl/EquityCouponServiceImpl.java
  9. 65 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/controller/RedEnvelopeController.java
  10. 40 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/entity/WeAssistanceUserRecord.java
  11. 50 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/entity/WeRedEnvelopeAssistance.java
  12. 34 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/entity/vo/AssistanceRecordVo.java
  13. 32 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/entity/vo/ExportRedEnvelopeRecordVo.java
  14. 19 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/entity/vo/FormRecordVo.java
  15. 21 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/entity/vo/WinningRecordVo.java
  16. 19 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/mapper/WeAssistanceUserRecordMapper.java
  17. 22 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/service/WeAssistanceUserRecordService.java
  18. 70 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/service/impl/WeAssistanceUserRecordServiceImpl.java
  19. 22 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/utils/EasyExcelUtils.java
  20. 14 0
      linkwe-chinacoal/src/main/resources/mapper/modules/bdshdb/customer/EquityCouponMapper.xml
  21. 66 0
      linkwe-chinacoal/src/main/resources/mapper/modules/bdshdb/customer/WeAssistanceUserRecordMapper.xml
  22. 4 0
      linkwe-common/pom.xml
  23. 6 0
      linkwe-fileservice/pom.xml
  24. 1 1
      linkwe-fileservice/src/main/java/com/linkwechat/fileservice/config/ResourcesConfig.java
  25. 62 0
      linkwe-service/src/main/java/com/linkwechat/domain/WeActivity.java
  26. 35 0
      linkwe-service/src/main/java/com/linkwechat/domain/WeActivityField.java
  27. 93 0
      linkwe-service/src/main/java/com/linkwechat/domain/WeLocalRightsInfo.java
  28. 70 0
      linkwe-service/src/main/java/com/linkwechat/domain/WePrize.java
  29. 50 0
      linkwe-service/src/main/java/com/linkwechat/domain/activity/query/WeActivityAddQuery.java
  30. 51 0
      linkwe-service/src/main/java/com/linkwechat/domain/activity/query/WeActivityEditQuery.java
  31. 17 0
      linkwe-service/src/main/java/com/linkwechat/domain/activity/query/WeActivityListQuery.java
  32. 21 0
      linkwe-service/src/main/java/com/linkwechat/domain/activity/vo/FormRecordVo.java
  33. 50 0
      linkwe-service/src/main/java/com/linkwechat/domain/activity/vo/WeActivityListVo.java
  34. 56 0
      linkwe-service/src/main/java/com/linkwechat/domain/activity/vo/WeActivityVo.java
  35. 21 0
      linkwe-service/src/main/java/com/linkwechat/domain/activity/vo/WinRecordVo.java
  36. 40 0
      linkwe-service/src/main/java/com/linkwechat/domain/prize/query/WePrizeAddQuery.java
  37. 30 58
      linkwe-service/src/main/java/com/linkwechat/domain/sop/WeSopBase.java
  38. 85 0
      linkwe-service/src/main/java/com/linkwechat/domain/sop/vo/WeSopAddQueryVo.java
  39. 19 17
      linkwe-service/src/main/java/com/linkwechat/domain/sop/vo/WeSopListsVo.java
  40. 19 0
      linkwe-service/src/main/java/com/linkwechat/domain/sop/vo/WeSopQueryListVo.java
  41. 9 0
      linkwe-service/src/main/java/com/linkwechat/mapper/WeActivityFieldMapper.java
  42. 25 0
      linkwe-service/src/main/java/com/linkwechat/mapper/WeActivityMapper.java
  43. 9 0
      linkwe-service/src/main/java/com/linkwechat/mapper/WePrizeMapper.java
  44. 16 0
      linkwe-service/src/main/java/com/linkwechat/mapper/WeSopBaseMapper.java
  45. 7 0
      linkwe-service/src/main/java/com/linkwechat/service/IWeActivityFieldService.java
  46. 25 0
      linkwe-service/src/main/java/com/linkwechat/service/IWeActivityService.java
  47. 7 0
      linkwe-service/src/main/java/com/linkwechat/service/IWePrizeService.java
  48. 25 0
      linkwe-service/src/main/java/com/linkwechat/service/IWeSopBaseService.java
  49. 114 0
      linkwe-service/src/main/java/com/linkwechat/service/impl/IWeSopBaseServiceImpl.java
  50. 16 0
      linkwe-service/src/main/java/com/linkwechat/service/impl/WeActivityFieldServiceImpl.java
  51. 237 0
      linkwe-service/src/main/java/com/linkwechat/service/impl/WeActivityServiceImpl.java
  52. 16 0
      linkwe-service/src/main/java/com/linkwechat/service/impl/WePrizeServiceImpl.java
  53. 134 0
      linkwe-service/src/main/resources/mapper/wecom/WeActivityMapper.xml
  54. 39 0
      linkwe-service/src/main/resources/mapper/wecom/WeSopBaseMapper.xml

+ 64 - 0
linkwe-api/src/main/java/com/linkwechat/controller/WeActivityController.java

@@ -0,0 +1,64 @@
+package com.linkwechat.controller;
+
+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.WeActivity;
+import com.linkwechat.domain.activity.query.WeActivityAddQuery;
+import com.linkwechat.domain.activity.query.WeActivityEditQuery;
+import com.linkwechat.domain.activity.query.WeActivityListQuery;
+import com.linkwechat.domain.activity.vo.WeActivityListVo;
+import com.linkwechat.service.IWeActivityService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2025/8/27 14:43
+ */
+@Slf4j
+@RestController
+@RequestMapping(value = "activity")
+@Api(tags = "活动管理")
+@CrossOrigin
+public class WeActivityController extends BaseController {
+    @Resource
+    private IWeActivityService weActivityService;
+
+    @ApiOperation(value = "新增活动", httpMethod = "POST")
+    @PostMapping("/addActivity")
+    public AjaxResult addActivity(@RequestBody @Validated WeActivityAddQuery query) {
+        return AjaxResult.success(weActivityService.addActivity(query));
+    }
+    @ApiOperation(value = "编辑活动", httpMethod = "POST")
+    @PostMapping("/editActivity")
+    public AjaxResult editActivity(@RequestBody @Validated WeActivityEditQuery query) {
+        return AjaxResult.success(weActivityService.editActivity(query));
+    }
+
+    @ApiOperation(value = "修改活动状态", httpMethod = "GET")
+    @GetMapping("/editActivityStatus")
+    public AjaxResult editActivityStatus(Long actId, Integer actStatus) {
+        return AjaxResult.success(weActivityService.editActivityStatus(actId,actStatus));
+    }
+
+    @ApiOperation(value = "活动列表分页", httpMethod = "POST")
+    @PostMapping("/listActivity")
+    public TableDataInfo<WeActivity> listActivity(@RequestBody @Validated WeActivityListQuery query) {
+        startPage();
+        List<WeActivityListVo> list = weActivityService.listActivity(query);
+        return getDataTable(list);
+    }
+
+    @ApiOperation(value = "活动详情", httpMethod = "GET")
+    @GetMapping("/getActivity")
+    public AjaxResult getActivity(String actId) {
+        return AjaxResult.success(weActivityService.getActivity(actId));
+    }
+}

+ 10 - 0
linkwe-api/src/main/java/com/linkwechat/controller/WeMaterialController.java

@@ -65,6 +65,16 @@ public class WeMaterialController extends BaseController {
         return getDataTable(weMaterialNewVos);
     }
 
+    @GetMapping("/material/listNew")
+    @ApiOperation("查询素材列表(不分页)")
+    public List<WeMaterial> getMaterial() {
+        LambdaQueryWrapper<WeMaterial> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(WeMaterial::getMaterialStatus, 0);
+        queryWrapper.eq(WeMaterial::getDelFlag, 0);
+        List<WeMaterial> weMaterials = materialService.list(queryWrapper);
+        return weMaterials;
+    }
+
 
     @GetMapping("/material/{id}")
     @ApiOperation("查询素材详细信息")

+ 64 - 0
linkwe-api/src/main/java/com/linkwechat/controller/WeSopBaseController.java

@@ -0,0 +1,64 @@
+package com.linkwechat.controller;
+
+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.sop.vo.WeSopAddQueryVo;
+import com.linkwechat.domain.sop.vo.WeSopQueryListVo;
+import com.linkwechat.service.IWeSopBaseService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * @author quchen
+ * @date 2025/9/2 10:29
+ */
+@Slf4j
+@RestController
+@RequestMapping(value = "sop")
+@Api(tags = "活动管理")
+public class WeSopBaseController extends BaseController {
+    @Resource
+    private IWeSopBaseService weSopBaseService;
+
+    @PostMapping(value = "addSop")
+    @ApiOperation(value = "新增活动", httpMethod = "POST")
+    public AjaxResult addSop(@RequestBody WeSopAddQueryVo weSopAddQueryVo) {
+        return AjaxResult.success(weSopBaseService.addSop(weSopAddQueryVo));
+    }
+
+    @PostMapping(value = "updateSop")
+    public AjaxResult updateSop(@RequestBody WeSopAddQueryVo weSopAddQueryVo) {
+        return AjaxResult.success(weSopBaseService.updateSop(weSopAddQueryVo));
+    }
+
+    @GetMapping(value = "deleteSop")
+    public AjaxResult deleteSop(@RequestParam("id") String id) {
+        return weSopBaseService.deleteSop(id);
+    }
+
+    @GetMapping(value = "disableStatus")
+    public AjaxResult disableStatus(@RequestParam("id") String id) {
+        return weSopBaseService.disableStatus(id);
+    }
+
+    @GetMapping(value = "getSop")
+    public AjaxResult getSop(@RequestParam("id") String id) {
+        return AjaxResult.success(weSopBaseService.getById(id));
+    }
+
+    @GetMapping(value = "copySop")
+    public AjaxResult copySop(@RequestParam("id") String id) {
+        return AjaxResult.success(weSopBaseService.copySop(id));
+    }
+
+    @GetMapping(value = "listSop")
+    public TableDataInfo listSop(WeSopQueryListVo weSopQueryListVo) {
+        startPage();
+        return getDataTable(weSopBaseService.listSop(weSopQueryListVo));
+    }
+}

+ 32 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/equity/controller/EquityCouponController.java

@@ -0,0 +1,32 @@
+package com.linkwechat.coal.modules.bdshdb.equity.controller;
+
+import com.linkwechat.coal.modules.bdshdb.equity.service.EquityCouponService;
+import com.linkwechat.common.core.domain.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * @author quchen
+ * @date 2025/9/1 17:40
+ */
+
+@Slf4j
+@RestController
+@RequestMapping(value = "equity")
+@Api(tags = "权益券")
+public class EquityCouponController {
+
+    @Resource
+    private EquityCouponService equityCouponService;
+    @ApiOperation(value = "查询权益券" , httpMethod = "GET")
+    @GetMapping("/getEquityCoupon")
+    public AjaxResult getEquityCoupon() {
+        return AjaxResult.success(equityCouponService.getEquityCoupon());
+    }
+}

+ 19 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/equity/entity/EquityCoupon.java

@@ -0,0 +1,19 @@
+package com.linkwechat.coal.modules.bdshdb.equity.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2025/9/1 17:24
+ */
+
+@TableName("local_rights_info")
+@Data
+public class EquityCoupon {
+    @TableId
+    private String id;
+
+    private String rightsName;
+}

+ 12 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/equity/mapper/EquityCouponMapper.java

@@ -0,0 +1,12 @@
+package com.linkwechat.coal.modules.bdshdb.equity.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.linkwechat.coal.modules.bdshdb.equity.entity.EquityCoupon;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface EquityCouponMapper extends BaseMapper<EquityCoupon> {
+    List<EquityCoupon> getEquityCoupon();
+}

+ 11 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/equity/service/EquityCouponService.java

@@ -0,0 +1,11 @@
+package com.linkwechat.coal.modules.bdshdb.equity.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.linkwechat.coal.modules.bdshdb.equity.entity.EquityCoupon;
+
+import java.util.List;
+
+public interface EquityCouponService extends IService<EquityCoupon> {
+
+    List<EquityCoupon> getEquityCoupon();
+}

+ 22 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/equity/service/impl/EquityCouponServiceImpl.java

@@ -0,0 +1,22 @@
+package com.linkwechat.coal.modules.bdshdb.equity.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.linkwechat.coal.modules.bdshdb.equity.entity.EquityCoupon;
+import com.linkwechat.coal.modules.bdshdb.equity.mapper.EquityCouponMapper;
+import com.linkwechat.coal.modules.bdshdb.equity.service.EquityCouponService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2025/9/1 17:42
+ */
+
+@Service
+public class EquityCouponServiceImpl extends ServiceImpl<EquityCouponMapper, EquityCoupon> implements EquityCouponService {
+    @Override
+    public List<EquityCoupon> getEquityCoupon() {
+        return this.baseMapper.getEquityCoupon();
+    }
+}

+ 65 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/controller/RedEnvelopeController.java

@@ -0,0 +1,65 @@
+package com.linkwechat.coal.modules.bdshdb.redenvelope.controller;
+
+import com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo.AssistanceRecordVo;
+import com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo.FormRecordVo;
+import com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo.WinningRecordVo;
+import com.linkwechat.coal.modules.bdshdb.redenvelope.service.WeAssistanceUserRecordService;
+import com.linkwechat.common.core.controller.BaseController;
+import com.linkwechat.common.core.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+
+/**
+ * @author quchen
+ * @date 2025/9/3 15:20
+ */
+
+@Slf4j
+@RestController
+@RequestMapping(value = "redEnvelope")
+@Api(tags = "红包")
+public class RedEnvelopeController extends BaseController {
+    @Resource
+    private WeAssistanceUserRecordService weAssistanceUserRecordService;
+
+    @ApiOperation(value = "查询红包助力" , httpMethod = "GET")
+    @GetMapping("/getRedEnvelopeRecord")
+    public TableDataInfo<AssistanceRecordVo> getRedEnvelopeRecord(AssistanceRecordVo assistanceRecordVo){
+        startPage();
+        return getDataTable(weAssistanceUserRecordService.listAssistanceRecord(assistanceRecordVo));
+    };
+
+    @ApiOperation(value = "助力导出" , httpMethod = "GET")
+    @GetMapping("/exportRedEnvelopeRecord")
+    public void exportRedEnvelopeRecord(AssistanceRecordVo assistanceRecordVo) throws IOException {
+        weAssistanceUserRecordService.exportRedEnvelopeRecord(assistanceRecordVo);
+    }
+
+    @ApiOperation(value = "查询中奖记录" , httpMethod = "GET")
+    @GetMapping("/getWinningRecord")
+    public TableDataInfo<WinningRecordVo> getRedEnvelopeWinningRecord(WinningRecordVo winningRecordVo){
+        startPage();
+        return getDataTable(weAssistanceUserRecordService.listWinningRecord(winningRecordVo));
+    }
+
+    @ApiOperation(value = "表单活动记录" , httpMethod = "GET")
+    @GetMapping("/getFormRecord")
+    public TableDataInfo<FormRecordVo> getRedEnvelopeFormRecord(FormRecordVo formRecordVo){
+        startPage();
+        return getDataTable(weAssistanceUserRecordService.listFormRecord(formRecordVo));
+    }
+
+    @ApiOperation(value = "表单活动记录导出" , httpMethod = "GET")
+    @GetMapping("/exportFormRecord")
+    public void exportFormRecord(FormRecordVo formRecordVo) throws IOException {
+        weAssistanceUserRecordService.exportFormRecord(formRecordVo);
+    }
+
+}

+ 40 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/entity/WeAssistanceUserRecord.java

@@ -0,0 +1,40 @@
+package com.linkwechat.coal.modules.bdshdb.redenvelope.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2025/9/3 15:39
+ */
+
+@Data
+@TableName("we_assistance_user_record")
+public class WeAssistanceUserRecord {
+    @TableId
+    private String id;
+
+    @ApiModelProperty(value = "活动ID")
+    private String actId;
+
+    @ApiModelProperty(value = "活动名称")
+    private String actName;
+
+    @ApiModelProperty(value = "用户ID")
+    private String userId;
+
+    @ApiModelProperty(value = "助力用户id")
+    private String helpUserId;
+
+    @ApiModelProperty(value = "助力用户昵称")
+    private String helpUserNickName;
+
+    @ApiModelProperty(value = "助力用户手机号")
+    private String helpUserPhone;
+
+    @ApiModelProperty(value = "助力发起id")
+    private String assistanceId;
+
+}

+ 50 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/entity/WeRedEnvelopeAssistance.java

@@ -0,0 +1,50 @@
+package com.linkwechat.coal.modules.bdshdb.redenvelope.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @author quchen
+ * @date 2025/9/3 15:26
+ */
+
+@Data
+@TableName("we_red_envelope_assistance")
+public class WeRedEnvelopeAssistance {
+    @TableId
+    private String id;
+
+    @ApiModelProperty(value = "活动ID")
+    private String actId;
+
+    @ApiModelProperty(value = "活动名称")
+    private String actName;
+
+    @ApiModelProperty(value = "用户ID")
+    private String userId;
+
+    @ApiModelProperty(value = "红包金额")
+    private BigDecimal money;
+
+    @ApiModelProperty(value = "用户昵称")
+    private String userNickName;
+
+    @ApiModelProperty(value = "用户手机号")
+    private String userPhone;
+
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "状态")
+    private Integer status;
+
+    @ApiModelProperty(value = "奖品id")
+    private String prizeId;
+}

+ 34 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/entity/vo/AssistanceRecordVo.java

@@ -0,0 +1,34 @@
+package com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author quchen
+ * @date 2025/9/3 15:46
+ */
+
+@Data
+public class AssistanceRecordVo {
+    private String id;
+
+    private String actId;
+
+    private String userId;
+
+    private String userNickName;
+
+    private String userPhone;
+
+    private String helpUserId;
+
+    private String helpUserNickName;
+
+    private String helpUserPhone;
+
+    private String userInfo;
+
+    private BigDecimal money;
+
+}

+ 32 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/entity/vo/ExportRedEnvelopeRecordVo.java

@@ -0,0 +1,32 @@
+package com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author quchen
+ * @date 2025/9/3 16:26
+ */
+
+@Data
+public class ExportRedEnvelopeRecordVo {
+    @ExcelProperty(value = "助力id")
+    private String id;
+
+    @ExcelProperty(value = "发起用户昵称")
+    private String userNickName;
+
+    @ExcelProperty(value = "发起用户手机号")
+    private String userPhone;
+
+    @ExcelProperty(value = "红包金额")
+    private BigDecimal money;
+
+    @ExcelProperty(value = "助力用户昵称")
+    private String helpUserNickName;
+
+    @ExcelProperty(value = "助力用户手机号")
+    private String helpUserPhone;
+}

+ 19 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/entity/vo/FormRecordVo.java

@@ -0,0 +1,19 @@
+package com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo;
+
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2025/9/4 11:03
+ */
+
+@Data
+public class FormRecordVo {
+    private String actId;
+
+    private String userId;
+
+    private String userNickName;
+
+    private String userInfo;
+}

+ 21 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/entity/vo/WinningRecordVo.java

@@ -0,0 +1,21 @@
+package com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo;
+
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2025/9/3 17:29
+ */
+
+@Data
+public class WinningRecordVo {
+    private String id;
+
+    private String actId;
+
+    private String userId;
+
+    private String userNickName;
+
+    private String userPhone;
+}

+ 19 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/mapper/WeAssistanceUserRecordMapper.java

@@ -0,0 +1,19 @@
+package com.linkwechat.coal.modules.bdshdb.redenvelope.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.linkwechat.coal.modules.bdshdb.redenvelope.entity.WeAssistanceUserRecord;
+import com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo.AssistanceRecordVo;
+import com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo.FormRecordVo;
+import com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo.WinningRecordVo;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface WeAssistanceUserRecordMapper extends BaseMapper<WeAssistanceUserRecord> {
+    List<AssistanceRecordVo> listAssistanceRecord(AssistanceRecordVo assistanceRecordVo);
+
+    List<WinningRecordVo> listWinningRecord(WinningRecordVo winningRecordVo);
+
+    List<FormRecordVo> listFormRecord (FormRecordVo formRecordVo);
+}

+ 22 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/service/WeAssistanceUserRecordService.java

@@ -0,0 +1,22 @@
+package com.linkwechat.coal.modules.bdshdb.redenvelope.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.linkwechat.coal.modules.bdshdb.redenvelope.entity.WeAssistanceUserRecord;
+import com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo.AssistanceRecordVo;
+import com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo.FormRecordVo;
+import com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo.WinningRecordVo;
+
+import java.io.IOException;
+import java.util.List;
+
+public interface WeAssistanceUserRecordService extends IService<WeAssistanceUserRecord> {
+    List<AssistanceRecordVo> listAssistanceRecord(AssistanceRecordVo assistanceRecordVo);
+
+    void exportRedEnvelopeRecord (AssistanceRecordVo assistanceRecordVo) throws IOException;
+
+    List<WinningRecordVo> listWinningRecord(WinningRecordVo winningRecordVo);
+
+    List<FormRecordVo> listFormRecord (FormRecordVo formRecordVo);
+
+    void exportFormRecord (FormRecordVo formRecordVo) throws IOException;
+}

+ 70 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/service/impl/WeAssistanceUserRecordServiceImpl.java

@@ -0,0 +1,70 @@
+package com.linkwechat.coal.modules.bdshdb.redenvelope.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.linkwechat.coal.modules.bdshdb.redenvelope.entity.WeAssistanceUserRecord;
+import com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo.AssistanceRecordVo;
+import com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo.ExportRedEnvelopeRecordVo;
+import com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo.FormRecordVo;
+import com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo.WinningRecordVo;
+import com.linkwechat.coal.modules.bdshdb.redenvelope.mapper.WeAssistanceUserRecordMapper;
+import com.linkwechat.coal.modules.bdshdb.redenvelope.service.WeAssistanceUserRecordService;
+import com.linkwechat.common.utils.ServletUtils;
+import com.linkwechat.common.utils.poi.LwExcelUtil;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author quchen
+ * @date 2025/9/3 15:33
+ */
+
+@Service
+public class WeAssistanceUserRecordServiceImpl extends ServiceImpl<WeAssistanceUserRecordMapper, WeAssistanceUserRecord> implements WeAssistanceUserRecordService {
+
+    @Override
+    public List<AssistanceRecordVo> listAssistanceRecord(AssistanceRecordVo assistanceRecordVo) {
+        List<AssistanceRecordVo> list = baseMapper.listAssistanceRecord(assistanceRecordVo);
+        return list;
+    }
+
+    @Override
+    public void exportRedEnvelopeRecord(AssistanceRecordVo assistanceRecordVo) {
+        List<AssistanceRecordVo> list = baseMapper.listAssistanceRecord(assistanceRecordVo);
+        List<ExportRedEnvelopeRecordVo> voList = list.stream()
+                .map(this::convertToDto).collect(Collectors.toList());
+        LwExcelUtil.exprotForWeb(ServletUtils.getResponse(), ExportRedEnvelopeRecordVo.class, voList, "红包助力记录" + System.currentTimeMillis() / 1000L);
+    }
+
+
+
+    private ExportRedEnvelopeRecordVo convertToDto(AssistanceRecordVo assistanceRecordVo) {
+        ExportRedEnvelopeRecordVo vo = new ExportRedEnvelopeRecordVo();
+        vo.setId(assistanceRecordVo.getId());
+        vo.setUserNickName(assistanceRecordVo.getUserNickName());
+        vo.setUserPhone(assistanceRecordVo.getUserPhone());
+        vo.setMoney(assistanceRecordVo.getMoney());
+        vo.setHelpUserNickName(assistanceRecordVo.getHelpUserNickName());
+        vo.setHelpUserPhone(assistanceRecordVo.getHelpUserPhone());
+        return vo;
+    }
+
+    @Override
+    public List<WinningRecordVo> listWinningRecord(WinningRecordVo winningRecordVo) {
+        List<WinningRecordVo> list = baseMapper.listWinningRecord(winningRecordVo);
+        return list;
+    }
+
+    @Override
+    public List<FormRecordVo> listFormRecord(FormRecordVo formRecordVo) {
+        List<FormRecordVo> list = baseMapper.listFormRecord(formRecordVo);
+        return list;
+    }
+
+    @Override
+    public void exportFormRecord(FormRecordVo formRecordVo) {
+        List<FormRecordVo> list = baseMapper.listFormRecord(formRecordVo);
+        LwExcelUtil.exprotForWeb(ServletUtils.getResponse(), FormRecordVo.class, list, "表单活动记录" + System.currentTimeMillis() / 1000L);
+    }
+}

+ 22 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/redenvelope/utils/EasyExcelUtils.java

@@ -0,0 +1,22 @@
+package com.linkwechat.coal.modules.bdshdb.redenvelope.utils;
+
+import com.alibaba.excel.EasyExcel;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2025/9/3 16:41
+ */
+
+@Component
+public class EasyExcelUtils {
+
+    public static String downExcel(String uploadFilePath, String fileName, Class clz, List<?> list) {
+        String file = fileName + System.currentTimeMillis() / 1000  + ".xlsx";
+        String filePath = uploadFilePath + file;
+        EasyExcel.write(filePath, clz).sheet("1").doWrite(list);
+        return file;
+    }
+}

+ 14 - 0
linkwe-chinacoal/src/main/resources/mapper/modules/bdshdb/customer/EquityCouponMapper.xml

@@ -0,0 +1,14 @@
+<?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.coal.modules.bdshdb.equity.mapper.EquityCouponMapper">
+    <select id="getEquityCoupon" resultType="com.linkwechat.coal.modules.bdshdb.equity.entity.EquityCoupon">
+        select
+            lri.id as id,
+            lri.rights_name as rightsName
+            from local_rights_info lri
+            where
+                1=1
+                and lri.rights_status = 1
+                and classify not like '%1947826051340091394%'
+    </select>
+</mapper>

+ 66 - 0
linkwe-chinacoal/src/main/resources/mapper/modules/bdshdb/customer/WeAssistanceUserRecordMapper.xml

@@ -0,0 +1,66 @@
+<?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.coal.modules.bdshdb.redenvelope.mapper.WeAssistanceUserRecordMapper">
+    <select id="listAssistanceRecord" resultType="com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo.AssistanceRecordVo">
+        select
+            waur.id as id,
+            waur.act_id as actId,
+            waur.user_id as userId,
+            wrea.user_nick_name as userNickName,
+            wrea.user_phone as userPhone,
+            wrea.money as money,
+            waur.assistance_user_id as helpUserId,
+            waur.assistance_user_nick_name as helpUserNickName,
+            waur.assistance_user_phone as helpUserPhone
+        from
+            we_assistance_user_record waur
+        left join
+            we_red_envelope_assistance wrea on wrea.user_id = waur.user_id
+        where
+            1=1
+        <if test="userInfo != null and userInfo != ''">
+            and (wrea.user_nick_name like concat('%',#{userInfo},'%')
+            or wrea.user_phone like concat('%',#{userInfo},'%'))
+        </if>
+        <if test="actId != null and actId != ''">
+            and waur.act_id = #{actId}
+        </if>
+    </select>
+
+    <select id="listWinningRecord" resultType="com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo.WinningRecordVo">
+        select
+        wpr.id as id,
+        wpr.act_id as actId,
+        wpr.user_id as userId,
+        wpr.user_name as userNickName,
+        wpr.user_phone as userPhone
+        from
+        we_prize_record wpr
+        where
+        1=1
+        <if test="actId != null and actId != ''">
+            and wpr.act_id = #{actId}
+        </if>
+    </select>
+
+    <select id="listFormRecord" resultType="com.linkwechat.coal.modules.bdshdb.redenvelope.entity.vo.FormRecordVo">
+        select
+        wafr.act_id as actId,
+        wafr.user_id as userId,
+        MAX(wafr.user_nick_name) as userNickName,
+        GROUP_CONCAT(CONCAT(wafr.form_name, ':', wafr.form_val) SEPARATOR ',') as userInfo
+        from
+        we_application_form_record wafr
+        where
+        1=1
+        <if test="actId != null and actId != ''">
+            and wafr.act_id = #{actId}
+        </if>
+        <if test="userInfo != null and userInfo != ''">
+            and (wafr.user_nick_name like concat('%',#{userInfo},'%')
+            or wafr.user_phone like concat('%',#{userInfo},'%'))
+        </if>
+        group by wafr.act_id, wafr.user_id
+    </select>
+
+</mapper>

+ 4 - 0
linkwe-common/pom.xml

@@ -318,6 +318,10 @@
             <artifactId>hibernate-core</artifactId>
             <version>5.6.15.Final</version>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 6 - 0
linkwe-fileservice/pom.xml

@@ -56,6 +56,12 @@
             <version>${fastdfs.version}</version>
         </dependency>
 
+        <!--    mysql    -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
         <!-- Minio -->
         <dependency>
             <groupId>io.minio</groupId>

+ 1 - 1
linkwe-fileservice/src/main/java/com/linkwechat/fileservice/config/ResourcesConfig.java

@@ -13,7 +13,7 @@ import java.io.File;
  *
  * @author leejoker
  */
-//@Configuration
+@Configuration
 public class ResourcesConfig implements WebMvcConfigurer {
     /**
      * 上传文件存储在本地的根路径

+ 62 - 0
linkwe-service/src/main/java/com/linkwechat/domain/WeActivity.java

@@ -0,0 +1,62 @@
+package com.linkwechat.domain;
+
+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.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author quchen
+ * @date 2025/8/27 10:33
+ */
+
+@EqualsAndHashCode(callSuper = true)
+@ApiModel
+@Data
+@TableName("we_activity")
+public class WeActivity extends BaseEntity {
+
+    @ApiModelProperty(value = "主键ID")
+    @TableId(type = IdType.ASSIGN_ID)
+    @TableField("act_id")
+    private Long actId;
+
+    @ApiModelProperty(value = "活动名称")
+    @TableField("act_name")
+    private String actName;
+
+    @ApiModelProperty(value = "活动规则")
+    @TableField("act_desc")
+    private String actDesc;
+
+    @ApiModelProperty(value = "活动类型 1-抽奖 2-转盘 3-红包 4-表单")
+    @TableField("act_type")
+    private Integer actType;
+
+    @ApiModelProperty(value = "活动开始时间")
+    @TableField("act_start_time")
+    private LocalDateTime actStartTime;
+
+    @ApiModelProperty(value = "活动结束时间")
+    @TableField("act_end_time")
+    private LocalDateTime actEndTime;
+
+    @ApiModelProperty(value = "活动状态 1-开启 2-关闭")
+    @TableField("act_status")
+    private Integer actStatus;
+
+    @ApiModelProperty(value = "活动链接")
+    @TableField("act_url")
+    private String actUrl;
+
+    @ApiModelProperty(value = "文件地址")
+    @TableField("file_url")
+    private String fileUrl;
+}

+ 35 - 0
linkwe-service/src/main/java/com/linkwechat/domain/WeActivityField.java

@@ -0,0 +1,35 @@
+package com.linkwechat.domain;
+
+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 io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2025/8/29 9:42
+ */
+
+@ApiModel
+@Data
+@TableName("we_activity_field")
+public class WeActivityField {
+    @ApiModelProperty(value = "主键ID")
+    @TableId(type = IdType.ASSIGN_ID)
+    @TableField("act_id")
+    private Long id;
+    @ApiModelProperty(value = "活动ID")
+    @TableField("act_id")
+    private Long actId;
+
+    @ApiModelProperty(value = "字段名称")
+    @TableField("field_name")
+    private String fieldName;
+
+    @ApiModelProperty(value = "字段值")
+    @TableField("field_value")
+    private String fieldValue;
+}

+ 93 - 0
linkwe-service/src/main/java/com/linkwechat/domain/WeLocalRightsInfo.java

@@ -0,0 +1,93 @@
+package com.linkwechat.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author quchen
+ * @date 2025/9/1 9:20
+ */
+
+@Data
+@TableName(value = "local_rights_info")
+public class WeLocalRightsInfo {
+    // 权益卷id
+    @TableId
+    private Long id;
+    // 类型(1.兑换券 2.折扣卷 3.抵现券)
+    @TableField("type")
+    private String type;
+    // 权益名称
+    @TableField("rights_name")
+    private String rightsName;
+    // 分类
+    @TableField("classify")
+    private String classify;
+    // 折扣值
+    @TableField("rebate")
+    private String rebate;
+    // 抵现金额
+    @TableField("amount")
+    private BigDecimal amount;
+    // 权益图片
+    @TableField("rights_picture")
+    private String rightsPicture;
+    // 使用有效期类型(1.用户领取后生效2.三方用户赠送时间)
+    @TableField("use_condition")
+    private String useCondition;
+    // 天数
+    @TableField("day_num")
+    private Integer dayNum;
+    // 开始时间
+    @TableField("start_time")
+    private Date startTime;
+    // 结束时间
+    @TableField("end_time")
+    private Date endTime;
+    // 市场售价
+    @TableField("market_price")
+    private BigDecimal marketPrice;
+    // 协议价
+    @TableField("contract_rate")
+    private BigDecimal contractRate;
+    // 三方结算价格
+    @TableField("settle_price")
+    private BigDecimal settlePrice;
+
+    // 服务说明
+    @TableField("description")
+    private String description;
+
+    // 是否删除 (0: 否 1: 是)
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    // 创建者
+    @TableField("create_by")
+    private String createBy;
+
+    // 创建时间
+    @TableField("create_time")
+    private Date createTime;
+
+    // 修改者
+    @TableField("update_by")
+    private String updateBy;
+
+    // 修改时间
+    @TableField("update_time")
+    private Date updateTime;
+
+    // 权益卷状态(1:上架,2:下架 )
+    @TableField("rights_status")
+    private Integer rightsStatus;
+
+    // 上架时间
+    @TableField("upper_time")
+    private Date upperTime;
+}

+ 70 - 0
linkwe-service/src/main/java/com/linkwechat/domain/WePrize.java

@@ -0,0 +1,70 @@
+package com.linkwechat.domain;
+
+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 io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author quchen
+ * @date 2025/8/27 10:56
+ */
+
+@Data
+@ApiModel
+@TableName("we_prize")
+public class WePrize {
+    @TableId(type = IdType.ASSIGN_ID)
+    @TableField("id")
+    @ApiModelProperty(value = "主键ID")
+    private Long id;
+
+    @TableField("act_id")
+    @ApiModelProperty(value = "活动ID")
+    private Long actId;
+
+    @TableField("prize_name")
+    @ApiModelProperty(value = "奖品名称")
+    private String prizeName;
+
+    @TableField("prize_type")
+    @ApiModelProperty(value = "奖品类型 1-优惠券 2-积分 3-平台会员 4-红包")
+    private Integer prizeType;
+
+    @TableField("prize_num")
+    @ApiModelProperty(value = "奖品数量")
+    private Integer prizeNum;
+
+    @TableField("win_percent")
+    @ApiModelProperty(value = "中奖概率")
+    private Integer winPercent;
+
+    @ApiModelProperty(value = "优惠券id(仅类型1使用)")
+    @TableField("equity_id")
+    private String equityId;
+
+    @ApiModelProperty(value = "积分值(仅类型2使用)")
+    @TableField("point_value")
+    private Integer pointValue;
+
+    @ApiModelProperty(value = "会员时长(天)(仅类型3使用)")
+    @TableField("vip_id")
+    private String vipId;
+
+    @ApiModelProperty(value = "红包预算(仅类型4使用)")
+    @TableField("red_racket_budget")
+    private BigDecimal redRacketBudget;
+
+    @ApiModelProperty(value = "红包金额(仅类型4使用)")
+    @TableField("red_racket_amount")
+    private BigDecimal redRacketAmount;
+
+    @ApiModelProperty(value = "红包裂变规则(仅类型4使用)")
+    @TableField("red_racket_rules")
+    private Integer redRacketRules;
+}

+ 50 - 0
linkwe-service/src/main/java/com/linkwechat/domain/activity/query/WeActivityAddQuery.java

@@ -0,0 +1,50 @@
+package com.linkwechat.domain.activity.query;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.linkwechat.domain.prize.query.WePrizeAddQuery;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2025/8/27 15:00
+ */
+
+@Data
+public class WeActivityAddQuery {
+    @ApiModelProperty("活动名称")
+    @NotNull(message = "活动名称不能为空")
+    private String actName;
+
+    @ApiModelProperty(value = "活动描述")
+    private String actDesc;
+
+    @ApiModelProperty("活动文件")
+    private String fileUrl;
+
+    @ApiModelProperty("活动类型 1-抽奖 2-转盘 3-红包 4-表单活动")
+    @NotNull(message = "活动类型不能为空")
+    private String actType;
+
+    @ApiModelProperty("活动开始时间")
+    @NotNull(message = "活动开始时间不能为空")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime actStartTime;
+
+    @ApiModelProperty("活动结束时间")
+    @NotNull(message = "活动结束时间不能为空")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime actEndTime;
+
+    @ApiModelProperty("活动预算")
+    private BigDecimal actBudget;
+
+    @ApiModelProperty("奖品列表")
+    private List<WePrizeAddQuery> actPrizeList;
+
+}

+ 51 - 0
linkwe-service/src/main/java/com/linkwechat/domain/activity/query/WeActivityEditQuery.java

@@ -0,0 +1,51 @@
+package com.linkwechat.domain.activity.query;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.linkwechat.domain.prize.query.WePrizeAddQuery;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2025/8/27 18:26
+ */
+
+@Data
+public class WeActivityEditQuery {
+    @ApiModelProperty(value = "主键ID")
+    @NotNull(message = "ID不能为空")
+    private Long actId;
+
+    @ApiModelProperty("活动名称")
+    private String actName;
+
+    @ApiModelProperty("活动类型 1-抽奖 2-转盘")
+    private String actType;
+
+    @ApiModelProperty("活动文件")
+    private String fileUrl;
+
+    @ApiModelProperty("活动开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime actStartTime;
+
+    @ApiModelProperty("活动结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime actEndTime;
+
+    @ApiModelProperty("奖品设置 1-单等级 2-多等级")
+    private Integer actPrizeSet;
+
+    @ApiModelProperty("参与用户 1-全部用户 2-部分用户")
+    private Integer actUserScope;
+
+    @ApiModelProperty("中奖人数")
+    private Integer actWinNum;
+
+    @ApiModelProperty("奖品列表")
+    private List<WePrizeAddQuery> actPrizeList;
+}

+ 17 - 0
linkwe-service/src/main/java/com/linkwechat/domain/activity/query/WeActivityListQuery.java

@@ -0,0 +1,17 @@
+package com.linkwechat.domain.activity.query;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2025/8/28 16:51
+ */
+
+@Data
+public class WeActivityListQuery {
+    private List<String> actTypeList;
+
+    private String actName;
+}

+ 21 - 0
linkwe-service/src/main/java/com/linkwechat/domain/activity/vo/FormRecordVo.java

@@ -0,0 +1,21 @@
+package com.linkwechat.domain.activity.vo;
+
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2025/9/4 11:45
+ */
+
+@Data
+public class FormRecordVo {
+    private String actId;
+
+    private String userId;
+
+    private String userNickName;
+
+    private String userPhone;
+
+    private String userInfo;
+}

+ 50 - 0
linkwe-service/src/main/java/com/linkwechat/domain/activity/vo/WeActivityListVo.java

@@ -0,0 +1,50 @@
+package com.linkwechat.domain.activity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.linkwechat.domain.WePrize;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2025/8/28 17:08
+ */
+
+@Data
+public class WeActivityListVo {
+    private Long actId;
+
+    private String actName;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    private Integer actType;
+
+    private String actDesc;
+
+    private String actUrl;
+
+    private String fileUrl;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime actStartTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime actEndTime;
+
+    private Integer actStatus;
+
+    private String updateBy;
+
+    // 奖品列表
+    private List<WePrize> prizeList;
+
+    // 参与用户
+    private int listNum;
+
+    // 中奖用户
+    private int winNum;
+}

+ 56 - 0
linkwe-service/src/main/java/com/linkwechat/domain/activity/vo/WeActivityVo.java

@@ -0,0 +1,56 @@
+package com.linkwechat.domain.activity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.linkwechat.domain.WePrize;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2025/8/29 17:07
+ */
+
+@Data
+public class WeActivityVo {
+    private Long actId;
+
+    // 活动名称
+    private String actName;
+
+    // 活动规则
+    private String actDesc;
+
+    // 活动类型 1-抽奖 2-转盘 3-红包 4-表单活动
+    private Integer actType;
+
+    // 活动链接
+    private String actUrl;
+
+    // 收集数量
+    private List<FormRecordVo> number;
+
+    // 活动创建时间
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    // 活动开始时间
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime actStartTime;
+
+    // 活动结束时间
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime actEndTime;
+
+    // 修改人
+    private String updateBy;
+
+    // 活动状态 1-开启 2-关闭
+    private Integer actStatus;
+
+    private String fileUrl;
+
+    // 奖品列表
+    private List<WePrize> prizeList;
+}

+ 21 - 0
linkwe-service/src/main/java/com/linkwechat/domain/activity/vo/WinRecordVo.java

@@ -0,0 +1,21 @@
+package com.linkwechat.domain.activity.vo;
+
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2025/9/4 15:18
+ */
+
+@Data
+public class WinRecordVo {
+    private String id;
+
+    private String actId;
+
+    private String userId;
+
+    private String userNickName;
+
+    private String userPhone;
+}

+ 40 - 0
linkwe-service/src/main/java/com/linkwechat/domain/prize/query/WePrizeAddQuery.java

@@ -0,0 +1,40 @@
+package com.linkwechat.domain.prize.query;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * @author quchen
+ * @date 2025/8/27 15:12
+ */
+
+@Data
+public class WePrizeAddQuery {
+    @ApiModelProperty("奖品名称")
+    private String prizeName;
+
+    @ApiModelProperty("奖品类型 1-优惠券 2-积分 3-平台会员 4-红包 5-谢谢惠顾")
+    private String prizeType;
+
+    @TableField("win_percent")
+    @ApiModelProperty(value = "中奖概率")
+    private Integer winPercent;
+
+    @TableField("prize_num")
+    @ApiModelProperty(value = "奖品数量")
+    private Integer prizeNum;
+
+    @ApiModelProperty("红包预算")
+    private String redRacketBudget;
+
+    @ApiModelProperty("红包金额")
+    private String redRacketAmount;
+
+    @ApiModelProperty("奖品内容")
+    private String prizeContent;
+
+    @ApiModelProperty("红包裂变规则")
+    private Integer redRacketRule;
+}

+ 30 - 58
linkwe-service/src/main/java/com/linkwechat/domain/sop/WeSopBase.java

@@ -1,107 +1,79 @@
 package com.linkwechat.domain.sop;
 
 import com.baomidou.mybatisplus.annotation.*;
-import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.linkwechat.common.core.domain.BaseEntity;
-import com.linkwechat.domain.sop.vo.WeSopExecuteConditVo;
-import com.linkwechat.domain.sop.vo.WeSopExecuteEndVo;
-import com.linkwechat.domain.sop.vo.WeSopExecuteUserConditVo;
-import com.linkwechat.domain.strategic.crowd.WeStrategicCrowdSwipe;
-import com.linkwechat.typeHandler.WeStrategicCrowdSwipeListTypeHandler;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+import io.swagger.annotations.ApiModel;
+import lombok.*;
 
-import java.util.List;
+import java.time.LocalDateTime;
 
+@EqualsAndHashCode(callSuper = true)
+@ApiModel
 @Data
-@TableName(value ="we_sop_base",autoResultMap = true)
-@Builder
-@AllArgsConstructor
-@NoArgsConstructor
+@TableName(value ="we_sop_base")
 public class WeSopBase extends BaseEntity {
     /**
      * 主键
      */
-    @TableId
+    @TableId(type = IdType.ASSIGN_ID)
     private Long id;
 
-    /**
-     * sop基础类型(1:客户sop;2:客群sop)
-     */
-    private Integer baseType;
-
-    /**
-     * sop业务类(1:新客sop;2:活动节日sop;3:客户转化sop;4:新群培育sop;5:周期营销sop;6:特定宣发sop)
-     */
-    private Integer businessType;
-
     /**
      * sop名称
      */
     private String sopName;
 
     /**
-     * sop发送类型(1:企业微信发送;2:手动发送)
+     * 场景描述
      */
-    private Integer sendType;
+    private String sopDesc;
+
 
     /**
-     * 执行成员条件,如果为空,则为全部成员
+     * sop状态(1:启用;2:禁用)
      */
-    @TableField(updateStrategy = FieldStrategy.IGNORED,typeHandler = FastjsonTypeHandler.class)
-    private WeSopExecuteUserConditVo executeWeUser;
+    private Integer sopStatus;
 
     /**
-     * 被执行的客户或群条件,如果为空,则为全部客户或群(便于前端回显使用)
+     * 触发类型 1-时间触发 2-行为触发
      */
-    @TableField(updateStrategy = FieldStrategy.IGNORED,typeHandler = FastjsonTypeHandler.class)
-    private WeSopExecuteConditVo executeCustomerOrGroup;
+    private Integer executeType;
 
     /**
-     * 策略执行条件
+     * 行为类型id
      */
-    @TableField(updateStrategy = FieldStrategy.IGNORED,typeHandler = WeStrategicCrowdSwipeListTypeHandler.class)
-    private List<WeStrategicCrowdSwipe>  executeCustomerSwipe;
-
-
+    private Long behaviorId;
 
     /**
-     * sop结束内容
+     * 标签组id
      */
-    @TableField(typeHandler = FastjsonTypeHandler.class)
-    private WeSopExecuteEndVo endContent;
-
+    private Long tagGroupId;
 
     /**
-     * 推送内容设置
+     * 标签id
      */
-    @TableField(exist = false)
-    private List<WeSopPushTime> weSopPushTimes;
-
+    private String tagId;
     /**
-     * 群主id
+     * 时间类型 1-相对时间 2-绝对时间
      */
-    @TableField(exist = false)
-    private String groupLenderId;
-
+    private Integer timeType;
 
     /**
-     * sop状态(1:执行中;2:暂停)
+     * 相对时间
      */
-    private Integer sopState;
-
+    private Integer relativeTime;
 
     /**
-     * 是否提前结束(是否提前结束:1:提前结束满足任意条件;0:不提前结束;2:提前结束全部任意条件)
+     * 绝对时间
      */
-    private Integer earlyEnd;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime absoluteTime;
 
     /**
-     * 符合条件执行成员id,多个id逗号隔开
+     * 素材id
      */
-    private String executeWeUserIds;
+    private String materialId;
 
     /**
      * 删除标识 0 有效 1删除

+ 85 - 0
linkwe-service/src/main/java/com/linkwechat/domain/sop/vo/WeSopAddQueryVo.java

@@ -0,0 +1,85 @@
+package com.linkwechat.domain.sop.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author quchen
+ * @date 2025/9/2 10:31
+ */
+
+@Data
+public class WeSopAddQueryVo {
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * sop名称
+     */
+    @ApiModelProperty("sop名称")
+    private String sopName;
+
+    /**
+     * 场景描述
+     */
+    @ApiModelProperty("sop描述")
+    private String sopDesc;
+
+
+    /**
+     * sop状态(1:启用;2:禁用)
+     */
+    @ApiModelProperty("sop状态")
+    private Integer sopStatus;
+
+    /**
+     * 触发类型 1-时间触发 2-行为触发
+     */
+    @ApiModelProperty("触发类型")
+    private Integer executeType;
+
+    /**
+     * 行为类型id
+     */
+    @ApiModelProperty("行为类型id")
+    private Long behaviorId;
+
+    /**
+     * 标签组id
+     */
+    @ApiModelProperty("标签组id")
+    private Long tagGroupId;
+
+    /**
+     * 标签id
+     */
+    @ApiModelProperty("标签id")
+    private String tagId;
+    /**
+     * 时间类型 1-相对时间 2-绝对时间
+     */
+    @ApiModelProperty("时间类型")
+    private Integer timeType;
+
+    /**
+     * 相对时间
+     */
+    private Integer relativeTime;
+
+    /**
+     * 绝对时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime absoluteTime;
+
+    /**
+     * 素材id
+     */
+    private String materialId;
+
+}

+ 19 - 17
linkwe-service/src/main/java/com/linkwechat/domain/sop/vo/WeSopListsVo.java

@@ -13,25 +13,27 @@ import java.util.Date;
 @AllArgsConstructor
 @NoArgsConstructor
 public class WeSopListsVo {
-    //sop主键
-    private Long sopBaseId;
+    private String id;
 
-    // sop业务类(1:新客sop;2:活动节日sop;3:客户转化sop;4:新群培育sop;5:周期营销sop;6:特定宣发sop)
-    private Integer businessType;
-    //sop名称
     private String sopName;
-    //执行成员,多个使用逗号隔开
-    private String executeUser;
-    //推送所需天数
-    private int pushNeedDayNumber;
-    //推送所需次数
-    private int pushNeedUserNumber;
-    //创建人
-    private String createBy;
-    //sop状态
-    private Integer sopState;
-    //SOP推送方式(1:企业微信发送;2:手动发送)
-    private Integer sendType;
+
+    private String sopDesc;
+
+    private String behaviorId;
+
+    private String behaviorName;
+
+    private Integer executeType;
+
+    private String tagGroupId;
+
+    private String tagGroupName;
+
+    private String tagId;
+
+    private String tagName;
+
+    private Integer sopStatus;
     //创建时间
     @JsonFormat(pattern="yyyy-MM-dd")
     private Date createTime;

+ 19 - 0
linkwe-service/src/main/java/com/linkwechat/domain/sop/vo/WeSopQueryListVo.java

@@ -0,0 +1,19 @@
+package com.linkwechat.domain.sop.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2025/9/2 14:58
+ */
+
+@Data
+public class WeSopQueryListVo {
+    private String sopName;
+
+    private Integer sopStatus;
+
+    private List<String> tagIds;
+}

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

@@ -0,0 +1,9 @@
+package com.linkwechat.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.linkwechat.domain.WeActivityField;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface WeActivityFieldMapper extends BaseMapper<WeActivityField> {
+}

+ 25 - 0
linkwe-service/src/main/java/com/linkwechat/mapper/WeActivityMapper.java

@@ -0,0 +1,25 @@
+package com.linkwechat.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.linkwechat.domain.WeActivity;
+import com.linkwechat.domain.activity.query.WeActivityListQuery;
+import com.linkwechat.domain.activity.vo.FormRecordVo;
+import com.linkwechat.domain.activity.vo.WeActivityListVo;
+import com.linkwechat.domain.activity.vo.WeActivityVo;
+import com.linkwechat.domain.activity.vo.WinRecordVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface WeActivityMapper extends BaseMapper<WeActivity> {
+    List<WeActivityListVo> queryActivityList(WeActivityListQuery query);
+
+    List<FormRecordVo> selectFormRecordByActId(String actId);
+
+    List<WinRecordVo> selectWinRecordByActId(@Param("actId")String actId, @Param("prizeType") String prizeType);
+
+    WeActivityVo getActivity(String actId);
+
+}

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

@@ -0,0 +1,9 @@
+package com.linkwechat.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.linkwechat.domain.WePrize;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface WePrizeMapper extends BaseMapper<WePrize> {
+}

+ 16 - 0
linkwe-service/src/main/java/com/linkwechat/mapper/WeSopBaseMapper.java

@@ -0,0 +1,16 @@
+package com.linkwechat.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.linkwechat.domain.sop.WeSopBase;
+import com.linkwechat.domain.sop.vo.WeSopListsVo;
+import com.linkwechat.domain.sop.vo.WeSopQueryListVo;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface WeSopBaseMapper extends BaseMapper<WeSopBase> {
+    List<WeSopListsVo> selectSopList(WeSopQueryListVo weSopQueryListVo);
+
+
+}

+ 7 - 0
linkwe-service/src/main/java/com/linkwechat/service/IWeActivityFieldService.java

@@ -0,0 +1,7 @@
+package com.linkwechat.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.linkwechat.domain.WeActivityField;
+
+public interface IWeActivityFieldService extends IService<WeActivityField> {
+}

+ 25 - 0
linkwe-service/src/main/java/com/linkwechat/service/IWeActivityService.java

@@ -0,0 +1,25 @@
+package com.linkwechat.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.linkwechat.domain.WeActivity;
+import com.linkwechat.domain.activity.query.WeActivityAddQuery;
+import com.linkwechat.domain.activity.query.WeActivityEditQuery;
+import com.linkwechat.domain.activity.query.WeActivityListQuery;
+import com.linkwechat.domain.activity.vo.WeActivityListVo;
+import com.linkwechat.domain.activity.vo.WeActivityVo;
+
+import java.util.List;
+
+
+public interface IWeActivityService extends IService<WeActivity> {
+
+    WeActivity addActivity(WeActivityAddQuery query);
+
+    WeActivity editActivity(WeActivityEditQuery query);
+
+    boolean editActivityStatus(Long actId, Integer status);
+
+    List<WeActivityListVo> listActivity(WeActivityListQuery query);
+
+    WeActivityVo getActivity(String actId);
+}

+ 7 - 0
linkwe-service/src/main/java/com/linkwechat/service/IWePrizeService.java

@@ -0,0 +1,7 @@
+package com.linkwechat.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.linkwechat.domain.WePrize;
+
+public interface IWePrizeService extends IService<WePrize> {
+}

+ 25 - 0
linkwe-service/src/main/java/com/linkwechat/service/IWeSopBaseService.java

@@ -0,0 +1,25 @@
+package com.linkwechat.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.linkwechat.common.core.domain.AjaxResult;
+import com.linkwechat.domain.sop.WeSopBase;
+import com.linkwechat.domain.sop.vo.WeSopAddQueryVo;
+import com.linkwechat.domain.sop.vo.WeSopListsVo;
+import com.linkwechat.domain.sop.vo.WeSopQueryListVo;
+
+import java.util.List;
+
+public interface IWeSopBaseService extends IService<WeSopBase> {
+    WeSopBase addSop(WeSopAddQueryVo weSopAddQueryVo);
+
+    WeSopBase updateSop(WeSopAddQueryVo weSopAddQueryVo);
+
+    AjaxResult deleteSop(String id);
+
+    AjaxResult disableStatus(String id);
+
+    WeSopBase copySop(String id);
+
+    List<WeSopListsVo> listSop(WeSopQueryListVo weSopQueryListVo);
+
+}

+ 114 - 0
linkwe-service/src/main/java/com/linkwechat/service/impl/IWeSopBaseServiceImpl.java

@@ -0,0 +1,114 @@
+package com.linkwechat.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.linkwechat.common.core.domain.AjaxResult;
+import com.linkwechat.common.exception.wecom.WeComException;
+import com.linkwechat.common.utils.bean.BeanUtils;
+import com.linkwechat.domain.sop.WeSopBase;
+import com.linkwechat.domain.sop.vo.WeSopAddQueryVo;
+import com.linkwechat.domain.sop.vo.WeSopListsVo;
+import com.linkwechat.domain.sop.vo.WeSopQueryListVo;
+import com.linkwechat.mapper.WeSopBaseMapper;
+import com.linkwechat.service.IWeSopBaseService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2025/9/2 10:26
+ */
+
+@Service
+public class IWeSopBaseServiceImpl extends ServiceImpl<WeSopBaseMapper, WeSopBase> implements IWeSopBaseService {
+    @Resource
+    private IWeSopBaseService weSopBaseService;
+
+    @Override
+    @Transactional
+    public WeSopBase addSop(WeSopAddQueryVo weSopAddQueryVo) {
+        WeSopBase weSopBase = new WeSopBase();
+        BeanUtil.copyProperties(weSopAddQueryVo,weSopBase);
+        this.save(weSopBase);
+        return weSopBase;
+    }
+
+    @Override
+    @Transactional
+    public WeSopBase updateSop(WeSopAddQueryVo weSopAddQueryVo) {
+        WeSopBase weSopBase = weSopBaseService.getById(weSopAddQueryVo.getId());
+        if (weSopBase == null) {
+            throw new WeComException("SOP不存在");
+        }
+        BeanUtils.copyProperties(weSopAddQueryVo,weSopBase);
+        this.updateById(weSopBase);
+        return weSopBase;
+    }
+
+    @Override
+    public AjaxResult deleteSop(String id) {
+        WeSopBase weSopBase = weSopBaseService.getById(id);
+        if (weSopBase == null) {
+            throw new WeComException("SOP不存在");
+        }
+        weSopBase.setDelFlag(1);
+        this.removeById(weSopBase);
+        return AjaxResult.success("删除成功");
+    }
+
+    @Override
+    public AjaxResult disableStatus(String id) {
+        WeSopBase weSopBase = weSopBaseService.getById(id);
+        if (weSopBase == null) {
+            throw new WeComException("SOP不存在");
+        }
+        weSopBase.setSopStatus(weSopBase.getSopStatus() == 1 ? 2 : 1);
+        this.updateById(weSopBase);
+        return AjaxResult.success(weSopBase.getSopStatus() == 1 ? "启用成功" : "禁用成功");
+    }
+
+    @Override
+    public WeSopBase copySop(String id) {
+        WeSopBase weSopBase = weSopBaseService.getById(id);
+        if (weSopBase == null) {
+            throw new WeComException("SOP不存在");
+        }
+        WeSopBase weSopBaseCopy = new WeSopBase();
+        BeanUtils.copyProperties(weSopBase,weSopBaseCopy);
+        weSopBaseCopy.setId(null);
+        weSopBaseCopy.setSopStatus(2);
+        weSopBaseService.save(weSopBaseCopy);
+        return weSopBaseCopy;
+    }
+
+    @Override
+    public List<WeSopListsVo> listSop(WeSopQueryListVo weSopQueryListVo) {
+//        LambdaQueryWrapper<WeSopBase> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+//        if (weSopQueryListVo.getSopName() != null){
+//            lambdaQueryWrapper.like(WeSopBase::getSopName, weSopQueryListVo.getSopName());
+//        }
+//        if (weSopQueryListVo.getSopStatus() != null){
+//            lambdaQueryWrapper.eq(WeSopBase::getSopName, weSopQueryListVo.getSopStatus());
+//        }
+//        return weSopBaseService.list(lambdaQueryWrapper);
+        return baseMapper.selectSopList(weSopQueryListVo);
+    }
+
+//    public List<WeSopListsVo> list(WeSopQueryListVo weSopQueryListVo) {
+//        LambdaQueryWrapper<WeSopBase> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+//        if (weSopQueryListVo.getSopName() != null){
+//            lambdaQueryWrapper.like(WeSopBase::getSopName, weSopQueryListVo.getSopName());
+//        }
+//        if (weSopQueryListVo.getSopStatus() != null){
+//            lambdaQueryWrapper.eq(WeSopBase::getSopName, weSopQueryListVo.getSopStatus());
+//        }
+//        baseMapper
+//        return weSopBaseService.list(lambdaQueryWrapper);
+//    }
+
+
+
+}

+ 16 - 0
linkwe-service/src/main/java/com/linkwechat/service/impl/WeActivityFieldServiceImpl.java

@@ -0,0 +1,16 @@
+package com.linkwechat.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.linkwechat.domain.WeActivityField;
+import com.linkwechat.mapper.WeActivityFieldMapper;
+import com.linkwechat.service.IWeActivityFieldService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author quchen
+ * @date 2025/8/29 9:47
+ */
+
+@Service
+public class WeActivityFieldServiceImpl extends ServiceImpl<WeActivityFieldMapper, WeActivityField> implements IWeActivityFieldService {
+}

+ 237 - 0
linkwe-service/src/main/java/com/linkwechat/service/impl/WeActivityServiceImpl.java

@@ -0,0 +1,237 @@
+package com.linkwechat.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.linkwechat.common.exception.wecom.WeComException;
+import com.linkwechat.domain.*;
+import com.linkwechat.domain.activity.query.WeActivityAddQuery;
+import com.linkwechat.domain.activity.query.WeActivityEditQuery;
+import com.linkwechat.domain.activity.query.WeActivityListQuery;
+import com.linkwechat.domain.activity.vo.FormRecordVo;
+import com.linkwechat.domain.activity.vo.WeActivityListVo;
+import com.linkwechat.domain.activity.vo.WeActivityVo;
+import com.linkwechat.domain.activity.vo.WinRecordVo;
+import com.linkwechat.domain.prize.query.WePrizeAddQuery;
+import com.linkwechat.mapper.WeActivityMapper;
+import com.linkwechat.service.*;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author quchen
+ * @date 2025/8/27 15:36
+ */
+@Service
+public class WeActivityServiceImpl extends ServiceImpl<WeActivityMapper, WeActivity> implements IWeActivityService {
+
+    @Resource
+    private IWePrizeService wePrizeService;
+
+    @Resource
+    private IWeActivityFieldService weActivityFieldService;
+
+
+    @Override
+    @Transactional
+    public WeActivity addActivity(WeActivityAddQuery query) {
+        WeActivity weActivity = new WeActivity();
+        BeanUtil.copyProperties(query, weActivity);
+        weActivity.setActStatus(2);
+        this.save(weActivity);
+        // 生成活动链接
+        weActivity.setActUrl("http://192.168.0.106:6180/open/activity/getActivity?actId=" + weActivity.getActId());
+        // 更新活动链接
+        this.updateById(weActivity);
+        // 获取活动类型
+        String actType = query.getActType();
+        if (query.getActType().equals("4")) {
+            for (WePrizeAddQuery prize : query.getActPrizeList()) {
+                WeActivityField weActivityField = new WeActivityField();
+                weActivityField.setActId(weActivity.getActId());
+                weActivityField.setFieldName(prize.getPrizeName());
+                weActivityField.setFieldValue(prize.getPrizeContent());
+                weActivityFieldService.save(weActivityField);
+            }
+        } else {
+            boolean needVerifyProbability = (actType.equals("1") || actType.equals("2"));
+            int totalPercent = 0;
+            for (WePrizeAddQuery prize : query.getActPrizeList()) {
+                if (needVerifyProbability) {
+                    Integer winPercent = prize.getWinPercent();
+                    if (winPercent == null || winPercent < 0 || winPercent > 100) {
+                        throw new WeComException("中奖概率必须是0-100之间的整数");
+                    }
+                    totalPercent += winPercent;
+                }
+                WePrize wePrize = new WePrize();
+                wePrize.setPrizeName(prize.getPrizeName());
+                wePrize.setPrizeType(prize.getPrizeType() != null ? Integer.parseInt(prize.getPrizeType()) : 0);
+                wePrize.setActId(weActivity.getActId());
+                wePrize.setPrizeNum(prize.getPrizeNum());
+                setPrizeSpecificFields(wePrize, prize);
+                if (needVerifyProbability) {
+                    wePrize.setWinPercent(prize.getWinPercent());
+                }
+                wePrizeService.save(wePrize);
+            }
+            // 只有抽奖和转盘类型需要验证概率总和
+            if (needVerifyProbability && totalPercent != 100) {
+                throw new WeComException("抽奖类活动奖品中奖概率总和必须为100");
+            }
+        }
+        return weActivity;
+    }
+
+    private void setPrizeSpecificFields(WePrize wePrize, WePrizeAddQuery prizeQuery) {
+        String prizeType = prizeQuery.getPrizeType();
+
+        if (prizeQuery.getPrizeContent() != null && !prizeQuery.getPrizeContent().equals("") ) {
+            String prizeContent = prizeQuery.getPrizeContent();
+            switch (prizeType) {
+                case "1": // 优惠券
+                    wePrize.setEquityId(prizeContent);
+                    break;
+                case "2": // 积分
+                    wePrize.setPointValue(Integer.valueOf(prizeContent));
+                    break;
+                case "5": // 谢谢参与
+                    wePrize.setPrizeName("谢谢参与");
+                    wePrize.setPrizeType(5);
+                    break;
+                default:
+                    throw new WeComException("不支持的奖品类型: " + prizeType);
+            }
+        }
+        //
+        if (prizeQuery.getPrizeType().equals("3")) {
+            wePrize.setVipId("1935579715119136769"); // 青铜会员 id
+        }
+        // 红包
+        if (prizeQuery.getPrizeType().equals("4")) {
+            wePrize.setPrizeName("红包");
+            // 红包金额
+            wePrize.setRedRacketAmount(new BigDecimal(prizeQuery.getRedRacketAmount()));
+            // 裂变规则
+            wePrize.setRedRacketRules(prizeQuery.getRedRacketRule());
+            // 红包数量
+            wePrize.setPrizeNum(prizeQuery.getPrizeNum());
+            // 红包预算
+            BigDecimal budget = new BigDecimal(prizeQuery.getRedRacketAmount()).multiply(new BigDecimal(prizeQuery.getPrizeNum()));
+            if (budget.compareTo(new BigDecimal(prizeQuery.getRedRacketBudget())) != 0) {
+                throw new WeComException("红包预算与红包金额乘积必须等于红包预算");
+            }
+            wePrize.setRedRacketBudget(new BigDecimal(prizeQuery.getRedRacketBudget()));
+        }
+    }
+    @Override
+    @Transactional
+    public WeActivity editActivity(WeActivityEditQuery query) {
+        WeActivity weActivity = getById(query.getActId());
+        if (Objects.isNull(weActivity)) {
+            throw new WeComException("活动不存在");
+        }
+        BeanUtil.copyProperties(query, weActivity);
+        updateById(weActivity);
+        Long actId = weActivity.getActId();
+        String actType = query.getActType();
+        if (query.getActType().equals("4")) {
+            List<WeActivityField> existingField = weActivityFieldService.list(new LambdaQueryWrapper<WeActivityField>().eq(WeActivityField::getActId, actId));
+            for (WeActivityField field : existingField) {
+                // 删除奖品主表数据
+                weActivityFieldService.removeById(field.getId());
+            }
+            for (WePrizeAddQuery prize : query.getActPrizeList()) {
+                WeActivityField weActivityField = new WeActivityField();
+                weActivityField.setActId(weActivity.getActId());
+                weActivityField.setFieldName(prize.getPrizeName());
+                weActivityField.setFieldValue(prize.getPrizeContent());
+                weActivityFieldService.save(weActivityField);
+            }
+        } else {
+            List<WePrize> existingPrizes = wePrizeService.list(new LambdaQueryWrapper<WePrize>().eq(WePrize::getActId, actId));
+            for (WePrize prize : existingPrizes) {
+                // 删除奖品主表数据
+                wePrizeService.removeById(prize.getId());
+            }
+            List<WePrizeAddQuery> newPrizeList = query.getActPrizeList();
+            boolean needVerifyProbability = (actType.equals("1") || actType.equals("2"));
+            int totalPercent = 0;
+            for (WePrizeAddQuery prize : query.getActPrizeList()) {
+                if (needVerifyProbability) {
+                    Integer winPercent = prize.getWinPercent();
+                    if (winPercent == null || winPercent < 0 || winPercent > 100) {
+                        throw new WeComException("中奖概率必须是0-100之间的整数");
+                    }
+                    totalPercent += winPercent;
+                }
+                WePrize wePrize = new WePrize();
+                wePrize.setPrizeName(prize.getPrizeName());
+                wePrize.setPrizeType(prize.getPrizeType() != null ? Integer.parseInt(prize.getPrizeType()) : 0);
+                wePrize.setActId(weActivity.getActId());
+                wePrize.setPrizeNum(prize.getPrizeNum());
+                setPrizeSpecificFields(wePrize, prize);
+                if (needVerifyProbability) {
+                    wePrize.setWinPercent(prize.getWinPercent());
+                }
+                wePrizeService.save(wePrize);
+            }
+            // 只有抽奖和转盘类型需要验证概率总和
+            if (needVerifyProbability && totalPercent != 100) {
+                throw new WeComException("抽奖类活动奖品中奖概率总和必须为100");
+            }
+        }
+        return weActivity;
+    }
+
+    @Override
+    public boolean editActivityStatus(Long actId, Integer status) {
+        WeActivity weActivity = getById(actId);
+        if (Objects.isNull(weActivity)) {
+            throw new WeComException("活动不存在");
+        }
+        weActivity.setActStatus(status);
+        updateById(weActivity);
+        return true;
+    }
+
+    @Override
+    public List<WeActivityListVo> listActivity(WeActivityListQuery query) {
+        List<WeActivityListVo> list = this.baseMapper.queryActivityList(query);
+        list.forEach(vo -> {
+            if (vo.getActType()== 4) {
+                List<FormRecordVo> formRecordList = selectFormRecordByActId(vo.getActId().toString());
+                vo.setListNum(formRecordList.size());
+            }
+            if (vo.getActType() == 1 || vo.getActType() == 2) {
+                // 中奖人数
+                List<WinRecordVo> winNumList = selectWinRecordByActId(vo.getActId().toString(),"中奖人数");
+                vo.setWinNum(winNumList.size());
+                // 参与人数
+                List<WinRecordVo> partNum = selectWinRecordByActId(vo.getActId().toString(), "");
+                vo.setListNum(partNum.size());
+            }
+
+        });
+        return list;
+    }
+
+    public List<FormRecordVo> selectFormRecordByActId(String actId) {
+        return this.baseMapper.selectFormRecordByActId(actId);
+    }
+
+    public List<WinRecordVo> selectWinRecordByActId(String actId , String prizeType) {
+        return this.baseMapper.selectWinRecordByActId(actId, prizeType);
+    }
+
+
+    @Override
+    public WeActivityVo getActivity(String actId) {
+        return this.baseMapper.getActivity(actId);
+    }
+}

+ 16 - 0
linkwe-service/src/main/java/com/linkwechat/service/impl/WePrizeServiceImpl.java

@@ -0,0 +1,16 @@
+package com.linkwechat.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.linkwechat.domain.WePrize;
+import com.linkwechat.mapper.WePrizeMapper;
+import com.linkwechat.service.IWePrizeService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author quchen
+ * @date 2025/8/27 16:21
+ */
+
+@Service
+public class WePrizeServiceImpl extends ServiceImpl<WePrizeMapper, WePrize> implements IWePrizeService {
+}

+ 134 - 0
linkwe-service/src/main/resources/mapper/wecom/WeActivityMapper.xml

@@ -0,0 +1,134 @@
+<?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.WeActivityMapper">
+    <resultMap id="ActivityWithPrizeMap" type="com.linkwechat.domain.activity.vo.WeActivityVo">
+        <id column="act_id" property="actId"/>
+        <result column="act_name" property="actName"/>
+        <result column="act_desc" property="actDesc"/>
+        <result column="act_type" property="actType"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_by" property="updateBy"/>
+        <result column="act_start_time" property="actStartTime"/>
+        <result column="act_end_time" property="actEndTime"/>
+        <result column="act_status" property="actStatus"/>
+        <result column="act_url" property="actUrl"/>
+        <result column="file_url" property="fileUrl"/>
+        <collection property="prizeList" ofType="com.linkwechat.domain.WePrize"
+                    select="selectPrizesByActId"
+                    column="act_id"/>
+    </resultMap>
+
+    <select id="selectFormRecordByActId" resultType="com.linkwechat.domain.activity.vo.FormRecordVo">
+        select
+        wafr.act_id as actId,
+        wafr.user_id as userId,
+        MAX(wafr.user_nick_name) as userNickName,
+        GROUP_CONCAT(CONCAT(wafr.form_name, ':', wafr.form_val) SEPARATOR ',') as userInfo
+        from
+        `jeecg-boot`.we_application_form_record wafr
+        where
+        1=1
+        and wafr.act_id = #{actId}
+        group by wafr.act_id, wafr.user_id
+    </select>
+
+    <select id="selectWinRecordByActId" resultType="com.linkwechat.domain.activity.vo.WinRecordVo">
+        select
+            wpr.id as id,
+            wpr.act_id as actId,
+            wpr.user_id as userId,
+            wpr.user_phone as userPhone,
+            wpr.user_name as userNickName
+        from
+            `jeecg-boot`.we_prize_record wpr
+        where
+            1=1
+        and wpr.act_id = #{actId}
+        <if test="prizeType != null and prizeType != ''">
+            and wpr.prize_type != 5
+        </if>
+    </select>
+
+    <select id="selectPrizesByActId" resultType="com.linkwechat.domain.WePrize">
+        select
+            id,
+            act_id as actId,
+            prize_name as prizeName,
+            prize_type as prizeType,
+            prize_num as prizeNum,
+            win_percent as winPercent,
+            equity_id as equityId,
+            point_value as pointValue,
+            vip_id as durationDays,
+            red_racket_amount as redRacketAmount,
+            red_racket_budget as redRacketBudget,
+            red_racket_rules as redRacketRules
+        from we_prize
+        where act_id = #{actId}
+    </select>
+
+    <resultMap id="ActivityWithPrizeList" type="com.linkwechat.domain.activity.vo.WeActivityListVo">
+        <id column="act_id" property="actId"/>
+        <result column="act_name" property="actName"/>
+        <result column="act_desc" property="actDesc"/>
+        <result column="act_type" property="actType"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_by" property="updateBy"/>
+        <result column="act_start_time" property="actStartTime"/>
+        <result column="act_end_time" property="actEndTime"/>
+        <result column="act_status" property="actStatus"/>
+        <result column="act_url" property="actUrl"/>
+        <result column="file_url" property="fileUrl"/>
+        <collection property="prizeList" ofType="com.linkwechat.domain.WePrize"
+                    select="selectPrizesByActId"
+                    column="act_id"/>
+    </resultMap>
+
+
+
+    <select id="queryActivityList" resultMap="ActivityWithPrizeList">
+        select
+        wa.act_id,
+        wa.act_name,
+        wa.create_time,
+        wa.act_type,
+        wa.act_start_time,
+        wa.act_end_time,
+        wa.act_status,
+        wa.act_url,
+        wa.update_by
+        from we_activity wa
+        <where>
+            <if test="actTypeList != null and actTypeList != ''">
+                and wa.act_type in
+                <foreach collection="actTypeList" item="type" open="(" separator="," close=")">
+                    #{type}
+                </foreach>
+            </if>
+            <if test="actName != null and actName != ''">
+                and wa.act_name like concat('%',#{actName},'%')
+            </if>
+            and wa.del_flag = 0
+        </where>
+    </select>
+
+    <select id="getActivity" resultMap="ActivityWithPrizeMap">
+        select
+            wa.act_id,
+            wa.act_name,
+            wa.act_desc,
+            wa.act_type,
+            wa.act_start_time,
+            wa.act_end_time,
+            wa.act_url,
+            wa.act_status,
+            wa.file_url
+        from we_activity wa
+        where wa.act_id = #{actId}
+          and wa.del_flag = 0
+    </select>
+
+
+
+
+</mapper>

+ 39 - 0
linkwe-service/src/main/resources/mapper/wecom/WeSopBaseMapper.xml

@@ -0,0 +1,39 @@
+<?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.WeSopBaseMapper">
+    <resultMap id="BaseResultMap" type="com.linkwechat.domain.sop.vo.WeSopListsVo">
+        <id column="id" jdbcType="BIGINT" property="id" />
+        <result column="sop_name" jdbcType="VARCHAR" property="sopName" />
+        <result column="sop_desc" jdbcType="VARCHAR" property="sopDesc" />
+        <result column="execute_type" jdbcType="INTEGER" property="executeType" />
+        <result column="tag_group_id" jdbcType="VARCHAR" property="tagGroupId" />
+        <result column="tagGroupName" jdbcType="VARCHAR" property="tagGroupName" />
+        <result column="tag_id" jdbcType="VARCHAR" property="tagId" />
+        <result column="tagName" jdbcType="VARCHAR" property="tagName" />
+        <result column="behaviorId" jdbcType="VARCHAR" property="behaviorId" />
+        <result column="behaviorName" jdbcType="VARCHAR" property="behaviorName" />
+        <result column="sop_status" jdbcType="INTEGER" property="sopStatus" />
+        <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    </resultMap>
+
+    <select id="selectSopList" resultMap="BaseResultMap">
+        select
+            wsb.*,
+            kbt.id  as behaviorId,
+            kbt.name as behaviorName,
+            wtg.group_name as tagGroupName,
+            GROUP_CONCAT(wt.name ORDER BY FIND_IN_SET(wt.id, wsb.tag_id)) as tagName
+        from we_sop_base wsb
+        left join kh_behavior_type kbt on kbt.id = wsb.behavior_id
+        left join we_tag_group wtg on wtg.id = wsb.tag_group_id
+        left join we_tag wt on FIND_IN_SET(wt.id, wsb.tag_id) > 0
+        where 1=1 and wsb.del_flag = 0
+        <if test="sopName != null and sopName != ''">
+            and wsb.sop_name like concat('%',#{sopName},'%')
+        </if>
+        <if test="sopStatus != null and sopStatus != ''">
+            and wsb.sop_status = #{sopStatus}
+        </if>
+        group by wsb.id
+    </select>
+</mapper>