浏览代码

feat: 门面接口封装和对象转换

seamew 2 年之前
父节点
当前提交
f5e155d6c8
共有 26 个文件被更改,包括 571 次插入168 次删除
  1. 12 1
      lottery-application/src/main/java/com/seamew/lottery/application/process/IActivityProcess.java
  2. 37 13
      lottery-application/src/main/java/com/seamew/lottery/application/process/impl/ActivityProcessImpl.java
  3. 8 8
      lottery-application/src/main/java/com/seamew/lottery/application/process/res/DrawProcessResult.java
  4. 31 0
      lottery-application/src/main/java/com/seamew/lottery/application/process/res/RuleQuantificationCrowdResult.java
  5. 2 1
      lottery-common/src/main/java/com/seamew/lottery/common/Constants.java
  6. 6 0
      lottery-domain/src/main/java/com/seamew/lottery/domain/strategy/model/req/DrawReq.java
  7. 2 2
      lottery-domain/src/main/java/com/seamew/lottery/domain/strategy/model/res/DrawResult.java
  8. 10 4
      lottery-domain/src/main/java/com/seamew/lottery/domain/strategy/model/vo/DrawAwardVO.java
  9. 6 2
      lottery-domain/src/main/java/com/seamew/lottery/domain/strategy/service/algorithm/impl/SingleRateRandomDrawAlgorithm.java
  10. 2 2
      lottery-domain/src/main/java/com/seamew/lottery/domain/strategy/service/draw/AbstractDrawBase.java
  11. 8 1
      lottery-interfaces/pom.xml
  12. 0 43
      lottery-interfaces/src/main/java/com/seamew/lottery/interfaces/ActivityBooth.java
  13. 26 0
      lottery-interfaces/src/main/java/com/seamew/lottery/interfaces/assembler/AwardMapping.java
  14. 73 0
      lottery-interfaces/src/main/java/com/seamew/lottery/interfaces/assembler/IMapping.java
  15. 106 0
      lottery-interfaces/src/main/java/com/seamew/lottery/interfaces/facade/LotteryActivityBooth.java
  16. 3 2
      lottery-interfaces/src/test/java/com/seamew/lottery/test/DrawAlgorithmTest.java
  17. 57 0
      lottery-interfaces/src/test/java/com/seamew/lottery/test/interfaces/LotteryActivityBoothTest.java
  18. 0 15
      lottery-rpc/src/main/java/com/seamew/lottery/rpc/IActivityBooth.java
  19. 31 0
      lottery-rpc/src/main/java/com/seamew/lottery/rpc/ILotteryActivityBooth.java
  20. 0 45
      lottery-rpc/src/main/java/com/seamew/lottery/rpc/dto/ActivityDto.java
  21. 64 0
      lottery-rpc/src/main/java/com/seamew/lottery/rpc/dto/AwardDTO.java
  22. 12 4
      lottery-rpc/src/main/java/com/seamew/lottery/rpc/req/DrawReq.java
  23. 34 0
      lottery-rpc/src/main/java/com/seamew/lottery/rpc/req/QuantificationDrawReq.java
  24. 0 25
      lottery-rpc/src/main/java/com/seamew/lottery/rpc/res/ActivityRes.java
  25. 31 0
      lottery-rpc/src/main/java/com/seamew/lottery/rpc/res/DrawRes.java
  26. 10 0
      pom.xml

+ 12 - 1
lottery-application/src/main/java/com/seamew/lottery/application/process/IActivityProcess.java

@@ -2,6 +2,8 @@ package com.seamew.lottery.application.process;
 
 import com.seamew.lottery.application.process.req.DrawProcessReq;
 import com.seamew.lottery.application.process.res.DrawProcessResult;
+import com.seamew.lottery.application.process.res.RuleQuantificationCrowdResult;
+import com.seamew.lottery.domain.rule.model.req.DecisionMatterReq;
 
 /**
  * @Author: seamew
@@ -14,9 +16,18 @@ public interface IActivityProcess {
 
     /**
      * 执行抽奖流程
+     *
      * @param req 抽奖请求
-     * @return    抽奖结果
+     * @return 抽奖结果
      */
     DrawProcessResult doDrawProcess(DrawProcessReq req);
 
+    /**
+     * 规则量化人群,返回可参与的活动ID
+     *
+     * @param req 规则请求
+     * @return 量化结果,用户可以参与的活动ID
+     */
+    RuleQuantificationCrowdResult doRuleQuantificationCrowd(DecisionMatterReq req);
+
 }

+ 37 - 13
lottery-application/src/main/java/com/seamew/lottery/application/process/impl/ActivityProcessImpl.java

@@ -3,14 +3,18 @@ package com.seamew.lottery.application.process.impl;
 import com.seamew.lottery.application.process.IActivityProcess;
 import com.seamew.lottery.application.process.req.DrawProcessReq;
 import com.seamew.lottery.application.process.res.DrawProcessResult;
+import com.seamew.lottery.application.process.res.RuleQuantificationCrowdResult;
 import com.seamew.lottery.common.Constants;
 import com.seamew.lottery.domain.activity.model.req.PartakeReq;
 import com.seamew.lottery.domain.activity.model.res.PartakeResult;
 import com.seamew.lottery.domain.activity.model.vo.DrawOrderVO;
 import com.seamew.lottery.domain.activity.service.partake.IActivityPartake;
+import com.seamew.lottery.domain.rule.model.req.DecisionMatterReq;
+import com.seamew.lottery.domain.rule.model.res.EngineResult;
+import com.seamew.lottery.domain.rule.service.engine.EngineFilter;
 import com.seamew.lottery.domain.strategy.model.req.DrawReq;
 import com.seamew.lottery.domain.strategy.model.res.DrawResult;
-import com.seamew.lottery.domain.strategy.model.vo.DrawAwardInfo;
+import com.seamew.lottery.domain.strategy.model.vo.DrawAwardVO;
 import com.seamew.lottery.domain.strategy.service.draw.IDrawExec;
 import com.seamew.lottery.domain.support.ids.IIdGenerator;
 import org.springframework.stereotype.Service;
@@ -33,6 +37,9 @@ public class ActivityProcessImpl implements IActivityProcess {
     @Resource
     private IDrawExec drawExec;
 
+    @Resource
+    private EngineFilter engineFilter;
+
     @Resource
     private Map<Constants.Ids, IIdGenerator> idGeneratorMap;
 
@@ -47,22 +54,39 @@ public class ActivityProcessImpl implements IActivityProcess {
         Long takeId = partakeResult.getTakeId();
 
         // 2. 执行抽奖
-        DrawResult drawResult = drawExec.doDrawExec(new DrawReq(req.getUId(), strategyId, String.valueOf(takeId)));
+        DrawResult drawResult = drawExec.doDrawExec(new DrawReq(req.getUId(), strategyId));
         if (Constants.DrawState.FAIL.getCode().equals(drawResult.getDrawState())) {
             return new DrawProcessResult(Constants.ResponseCode.LOSING_DRAW.getCode(), Constants.ResponseCode.LOSING_DRAW.getInfo());
         }
-        DrawAwardInfo drawAwardInfo = drawResult.getDrawAwardInfo();
+        DrawAwardVO drawAwardVO = drawResult.getDrawAwardInfo();
 
         // 3. 结果落库
-        activityPartake.recordDrawOrder(buildDrawOrderVO(req, strategyId, takeId, drawAwardInfo));
+        activityPartake.recordDrawOrder(buildDrawOrderVO(req, strategyId, takeId, drawAwardVO));
 
         // 4. 发送MQ,触发发奖流程
 
         // 5. 返回结果
-        return new DrawProcessResult(Constants.ResponseCode.SUCCESS.getCode(), Constants.ResponseCode.SUCCESS.getInfo(), drawAwardInfo);
+        return new DrawProcessResult(Constants.ResponseCode.SUCCESS.getCode(), Constants.ResponseCode.SUCCESS.getInfo(), drawAwardVO);
+    }
+
+    @Override
+    public RuleQuantificationCrowdResult doRuleQuantificationCrowd(DecisionMatterReq req) {
+        // 1. 量化决策
+        EngineResult engineResult = engineFilter.process(req);
+
+        if (!engineResult.isSuccess()) {
+            return new RuleQuantificationCrowdResult(Constants.ResponseCode.RULE_ERR.getCode(), Constants.ResponseCode.RULE_ERR.getInfo());
+        }
+
+        // 2. 封装结果
+        RuleQuantificationCrowdResult ruleQuantificationCrowdResult = new RuleQuantificationCrowdResult(Constants.ResponseCode.SUCCESS.getCode(), Constants.ResponseCode.SUCCESS.getInfo());
+        ruleQuantificationCrowdResult.setActivityId(Long.valueOf(engineResult.getNodeValue()));
+
+        return ruleQuantificationCrowdResult;
     }
 
-    private DrawOrderVO buildDrawOrderVO(DrawProcessReq req, Long strategyId, Long takeId, DrawAwardInfo drawAwardInfo) {
+
+    private DrawOrderVO buildDrawOrderVO(DrawProcessReq req, Long strategyId, Long takeId, DrawAwardVO drawAwardVO) {
         long orderId = idGeneratorMap.get(Constants.Ids.SnowFlake).nextId();
         DrawOrderVO drawOrderVO = new DrawOrderVO();
         drawOrderVO.setUId(req.getUId());
@@ -70,14 +94,14 @@ public class ActivityProcessImpl implements IActivityProcess {
         drawOrderVO.setActivityId(req.getActivityId());
         drawOrderVO.setOrderId(orderId);
         drawOrderVO.setStrategyId(strategyId);
-        drawOrderVO.setStrategyMode(drawAwardInfo.getStrategyMode());
-        drawOrderVO.setGrantType(drawAwardInfo.getGrantType());
-        drawOrderVO.setGrantDate(drawAwardInfo.getGrantDate());
+        drawOrderVO.setStrategyMode(drawAwardVO.getStrategyMode());
+        drawOrderVO.setGrantType(drawAwardVO.getGrantType());
+        drawOrderVO.setGrantDate(drawAwardVO.getGrantDate());
         drawOrderVO.setGrantState(Constants.GrantState.INIT.getCode());
-        drawOrderVO.setAwardId(drawAwardInfo.getAwardId());
-        drawOrderVO.setAwardType(drawAwardInfo.getAwardType());
-        drawOrderVO.setAwardName(drawAwardInfo.getAwardName());
-        drawOrderVO.setAwardContent(drawAwardInfo.getAwardContent());
+        drawOrderVO.setAwardId(drawAwardVO.getAwardId());
+        drawOrderVO.setAwardType(drawAwardVO.getAwardType());
+        drawOrderVO.setAwardName(drawAwardVO.getAwardName());
+        drawOrderVO.setAwardContent(drawAwardVO.getAwardContent());
         return drawOrderVO;
     }
 }

+ 8 - 8
lottery-application/src/main/java/com/seamew/lottery/application/process/res/DrawProcessResult.java

@@ -1,7 +1,7 @@
 package com.seamew.lottery.application.process.res;
 
 import com.seamew.lottery.common.Result;
-import com.seamew.lottery.domain.strategy.model.vo.DrawAwardInfo;
+import com.seamew.lottery.domain.strategy.model.vo.DrawAwardVO;
 
 /**
  * @Author: seamew
@@ -12,22 +12,22 @@ import com.seamew.lottery.domain.strategy.model.vo.DrawAwardInfo;
  */
 public class DrawProcessResult extends Result {
 
-    private DrawAwardInfo drawAwardInfo;
+    private DrawAwardVO drawAwardVO;
 
     public DrawProcessResult(String code, String info) {
         super(code, info);
     }
 
-    public DrawProcessResult(String code, String info, DrawAwardInfo drawAwardInfo) {
+    public DrawProcessResult(String code, String info, DrawAwardVO drawAwardVO) {
         super(code, info);
-        this.drawAwardInfo = drawAwardInfo;
+        this.drawAwardVO = drawAwardVO;
     }
 
-    public DrawAwardInfo getDrawAwardInfo() {
-        return drawAwardInfo;
+    public DrawAwardVO getDrawAwardVO() {
+        return drawAwardVO;
     }
 
-    public void setDrawAwardInfo(DrawAwardInfo drawAwardInfo) {
-        this.drawAwardInfo = drawAwardInfo;
+    public void setDrawAwardVO(DrawAwardVO drawAwardVO) {
+        this.drawAwardVO = drawAwardVO;
     }
 }

+ 31 - 0
lottery-application/src/main/java/com/seamew/lottery/application/process/res/RuleQuantificationCrowdResult.java

@@ -0,0 +1,31 @@
+package com.seamew.lottery.application.process.res;
+
+import com.seamew.lottery.common.Result;
+
+/**
+ * @Author: seamew
+ * @Title: RuleQuantificationCrowdResult
+ * @CreateTime: 2023年02月26日 17:44:00
+ * @Description: 量化结果
+ * @Version: 1.0
+ */
+public class RuleQuantificationCrowdResult extends Result {
+
+    /**
+     * 活动ID
+     */
+    private Long activityId;
+
+    public RuleQuantificationCrowdResult(String code, String info) {
+        super(code, info);
+    }
+
+    public Long getActivityId() {
+        return activityId;
+    }
+
+    public void setActivityId(Long activityId) {
+        this.activityId = activityId;
+    }
+
+}

+ 2 - 1
lottery-common/src/main/java/com/seamew/lottery/common/Constants.java

@@ -14,7 +14,8 @@ public class Constants {
         ILLEGAL_PARAMETER("0002", "非法参数"),
         INDEX_DUP("0003", "主键冲突"),
         NO_UPDATE("0004", "SQL操作无更新"),
-        LOSING_DRAW("D001", "未中奖");
+        LOSING_DRAW("D001", "未中奖"),
+        RULE_ERR("D002", "量化人群规则执行失败");
 
         private final String code;
         private final String info;

+ 6 - 0
lottery-domain/src/main/java/com/seamew/lottery/domain/strategy/model/req/DrawReq.java

@@ -29,4 +29,10 @@ public class DrawReq {
      * 防重ID
      */
     private String uuid;
+
+
+    public DrawReq(String uId, Long strategyId) {
+        this.uId = uId;
+        this.strategyId = strategyId;
+    }
 }

+ 2 - 2
lottery-domain/src/main/java/com/seamew/lottery/domain/strategy/model/res/DrawResult.java

@@ -1,7 +1,7 @@
 package com.seamew.lottery.domain.strategy.model.res;
 
 import com.seamew.lottery.common.Constants;
-import com.seamew.lottery.domain.strategy.model.vo.DrawAwardInfo;
+import com.seamew.lottery.domain.strategy.model.vo.DrawAwardVO;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -35,7 +35,7 @@ public class DrawResult {
     /**
      * 中奖奖品信息
      */
-    private DrawAwardInfo drawAwardInfo;
+    private DrawAwardVO drawAwardInfo;
 
     public DrawResult(String uId, Long strategyId, Integer drawState) {
         this.uId = uId;

+ 10 - 4
lottery-domain/src/main/java/com/seamew/lottery/domain/strategy/model/vo/DrawAwardInfo.java → lottery-domain/src/main/java/com/seamew/lottery/domain/strategy/model/vo/DrawAwardVO.java

@@ -8,15 +8,20 @@ import java.util.Date;
 
 /**
  * @Author: seamew
- * @Title: DrawAwardInfo
- * @CreateTime: 2023年02月14日 10:41:00
+ * @Title: DrawAwardVO
+ * @CreateTime: 2023年02月26日 17:39:00
  * @Description: 中奖奖品信息
  * @Version: 1.0
  */
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class DrawAwardInfo {
+public class DrawAwardVO {
+    /**
+     * 用户ID
+     */
+    private String uId;
+
     /**
      * 奖品ID
      */
@@ -51,7 +56,8 @@ public class DrawAwardInfo {
      */
     private Date grantDate;
 
-    public DrawAwardInfo(String awardId, Integer awardType, String awardName, String awardContent) {
+    public DrawAwardVO(String uId, String awardId, Integer awardType, String awardName, String awardContent) {
+        this.uId = uId;
         this.awardId = awardId;
         this.awardType = awardType;
         this.awardName = awardName;

+ 6 - 2
lottery-domain/src/main/java/com/seamew/lottery/domain/strategy/service/algorithm/impl/SingleRateRandomDrawAlgorithm.java

@@ -30,9 +30,13 @@ public class SingleRateRandomDrawAlgorithm extends BaseAlgorithm {
 
         // 返回结果
         String awardId = rateTuple[index];
-        if (excludeAwardIds.contains(awardId)) return "未中奖";
 
-        return awardId == null ? "未中奖" : awardId;
+        // 如果中奖ID命中排除奖品列表,则返回NULL
+        if (excludeAwardIds.contains(awardId)) {
+            return null;
+        }
+
+        return awardId;
     }
 
 }

+ 2 - 2
lottery-domain/src/main/java/com/seamew/lottery/domain/strategy/service/draw/AbstractDrawBase.java

@@ -98,8 +98,8 @@ public abstract class AbstractDrawBase extends DrawStrategySupport implements ID
             return new DrawResult(uId, strategyId, Constants.DrawState.FAIL.getCode());
         }
 
-        AwardBriefVO award = queryAwardInfoByAwardId(awardId);
-        DrawAwardInfo drawAwardInfo = new DrawAwardInfo(award.getAwardId(), award.getAwardType(), award.getAwardName(), award.getAwardContent());
+        AwardBriefVO award = super.queryAwardInfoByAwardId(awardId);
+        DrawAwardVO drawAwardInfo = new DrawAwardVO(uId, award.getAwardId(), award.getAwardType(), award.getAwardName(), award.getAwardContent());
         drawAwardInfo.setStrategyMode(strategy.getStrategyMode());
         drawAwardInfo.setGrantType(strategy.getGrantType());
         drawAwardInfo.setGrantDate(strategy.getGrantDate());

+ 8 - 1
lottery-interfaces/pom.xml

@@ -89,6 +89,14 @@
             <artifactId>junit</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.mapstruct</groupId>
+            <artifactId>mapstruct</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.mapstruct</groupId>
+            <artifactId>mapstruct-processor</artifactId>
+        </dependency>
 
         <!-- 业务包 -->
         <dependency>
@@ -110,7 +118,6 @@
             <groupId>com.seamew</groupId>
             <artifactId>lottery-application</artifactId>
             <version>1.0-SNAPSHOT</version>
-            <scope>test</scope>
         </dependency>
     </dependencies>
 

+ 0 - 43
lottery-interfaces/src/main/java/com/seamew/lottery/interfaces/ActivityBooth.java

@@ -1,43 +0,0 @@
-package com.seamew.lottery.interfaces;
-
-import com.seamew.lottery.common.Constants;
-import com.seamew.lottery.common.Result;
-import com.seamew.lottery.infrastructure.dao.IActivityDao;
-import com.seamew.lottery.infrastructure.po.Activity;
-import com.seamew.lottery.rpc.IActivityBooth;
-import com.seamew.lottery.rpc.dto.ActivityDto;
-import com.seamew.lottery.rpc.req.ActivityReq;
-import com.seamew.lottery.rpc.res.ActivityRes;
-import org.apache.dubbo.config.annotation.DubboService;
-
-import javax.annotation.Resource;
-
-/**
- * @Author: seamew
- * @Title: ActivityBooth
- * @CreateTime: 2023年02月07日 13:48:00
- * @Description: 活动展台
- * @Version: 1.0
- */
-@DubboService
-public class ActivityBooth implements IActivityBooth {
-
-    @Resource
-    private IActivityDao activityDao;
-
-    @Override
-    public ActivityRes queryActivityById(ActivityReq req) {
-        Activity activity = activityDao.queryActivityById(req.getActivityId());
-
-        ActivityDto activityDto = new ActivityDto();
-        activityDto.setActivityId(activity.getActivityId());
-        activityDto.setActivityName(activity.getActivityName());
-        activityDto.setActivityDesc(activity.getActivityDesc());
-        activityDto.setBeginDateTime(activity.getBeginDateTime());
-        activityDto.setEndDateTime(activity.getEndDateTime());
-        activityDto.setStockCount(activity.getStockCount());
-        activityDto.setTakeCount(activity.getTakeCount());
-
-        return new ActivityRes(new Result(Constants.ResponseCode.SUCCESS.getCode(), Constants.ResponseCode.SUCCESS.getInfo()), activityDto);
-    }
-}

+ 26 - 0
lottery-interfaces/src/main/java/com/seamew/lottery/interfaces/assembler/AwardMapping.java

@@ -0,0 +1,26 @@
+package com.seamew.lottery.interfaces.assembler;
+
+import com.seamew.lottery.domain.strategy.model.vo.DrawAwardVO;
+import com.seamew.lottery.rpc.dto.AwardDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.ReportingPolicy;
+
+/**
+ * @Author: seamew
+ * @Title: AwardMapping
+ * @CreateTime: 2023年02月26日 17:32:00
+ * @Description: 对象转换配置
+ * @Version: 1.0
+ */
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, unmappedSourcePolicy = ReportingPolicy.IGNORE)
+public interface AwardMapping extends IMapping<DrawAwardVO, AwardDTO> {
+
+    @Mapping(target = "userId", source = "UId")
+    @Override
+    AwardDTO sourceToTarget(DrawAwardVO var1);
+
+    @Override
+    DrawAwardVO targetToSource(AwardDTO var1);
+
+}

+ 73 - 0
lottery-interfaces/src/main/java/com/seamew/lottery/interfaces/assembler/IMapping.java

@@ -0,0 +1,73 @@
+package com.seamew.lottery.interfaces.assembler;
+
+import org.mapstruct.InheritConfiguration;
+import org.mapstruct.InheritInverseConfiguration;
+import org.mapstruct.MapperConfig;
+import org.mapstruct.Mapping;
+
+import java.util.List;
+import java.util.stream.Stream;
+
+/**
+ * @Author: seamew
+ * @Title: IMapping
+ * @CreateTime: 2023年02月26日 17:40:00
+ * @Description: MapStruct 对象映射接口
+ * @Version: 1.0
+ */
+@MapperConfig
+public interface IMapping<SOURCE, TARGET> {
+
+    /**
+     * 映射同名属性
+     *
+     * @param var1 源
+     * @return 结果
+     */
+    @Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
+    TARGET sourceToTarget(SOURCE var1);
+
+    /**
+     * 映射同名属性,反向
+     *
+     * @param var1 源
+     * @return 结果
+     */
+    @InheritInverseConfiguration(name = "sourceToTarget")
+    SOURCE targetToSource(TARGET var1);
+
+    /**
+     * 映射同名属性,集合形式
+     *
+     * @param var1 源
+     * @return 结果
+     */
+    @InheritConfiguration(name = "sourceToTarget")
+    List<TARGET> sourceToTarget(List<SOURCE> var1);
+
+    /**
+     * 反向,映射同名属性,集合形式
+     *
+     * @param var1 源
+     * @return 结果
+     */
+    @InheritConfiguration(name = "targetToSource")
+    List<SOURCE> targetToSource(List<TARGET> var1);
+
+    /**
+     * 映射同名属性,集合流形式
+     *
+     * @param stream 源
+     * @return 结果
+     */
+    List<TARGET> sourceToTarget(Stream<SOURCE> stream);
+
+    /**
+     * 反向,映射同名属性,集合流形式
+     *
+     * @param stream 源
+     * @return 结果
+     */
+    List<SOURCE> targetToSource(Stream<TARGET> stream);
+
+}

+ 106 - 0
lottery-interfaces/src/main/java/com/seamew/lottery/interfaces/facade/LotteryActivityBooth.java

@@ -0,0 +1,106 @@
+package com.seamew.lottery.interfaces.facade;
+
+import com.alibaba.fastjson2.JSON;
+import com.seamew.lottery.application.process.IActivityProcess;
+import com.seamew.lottery.application.process.req.DrawProcessReq;
+import com.seamew.lottery.application.process.res.DrawProcessResult;
+import com.seamew.lottery.application.process.res.RuleQuantificationCrowdResult;
+import com.seamew.lottery.common.Constants;
+import com.seamew.lottery.domain.rule.model.req.DecisionMatterReq;
+import com.seamew.lottery.domain.strategy.model.vo.DrawAwardVO;
+import com.seamew.lottery.interfaces.assembler.IMapping;
+import com.seamew.lottery.rpc.ILotteryActivityBooth;
+import com.seamew.lottery.rpc.dto.AwardDTO;
+import com.seamew.lottery.rpc.req.DrawReq;
+import com.seamew.lottery.rpc.req.QuantificationDrawReq;
+import com.seamew.lottery.rpc.res.DrawRes;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Controller;
+
+import javax.annotation.Resource;
+
+/**
+ * @Author: seamew
+ * @Title: LotteryActivityBooth
+ * @CreateTime: 2023年02月26日 17:42:00
+ * @Description: 抽奖活动展台
+ * @Version: 1.0
+ */
+@Controller
+@Slf4j
+public class LotteryActivityBooth implements ILotteryActivityBooth {
+    @Resource
+    private IActivityProcess activityProcess;
+
+    @Resource
+    private IMapping<DrawAwardVO, AwardDTO> awardMapping;
+
+    @Override
+    public DrawRes doDraw(DrawReq drawReq) {
+        try {
+            log.info("抽奖,开始 uId:{} activityId:{}", drawReq.getUId(), drawReq.getActivityId());
+
+            // 1. 执行抽奖
+            DrawProcessResult drawProcessResult = activityProcess.doDrawProcess(new DrawProcessReq(drawReq.getUId(), drawReq.getActivityId()));
+            if (!Constants.ResponseCode.SUCCESS.getCode().equals(drawProcessResult.getCode())) {
+                log.error("抽奖,失败(抽奖过程异常) uId:{} activityId:{}", drawReq.getUId(), drawReq.getActivityId());
+                return new DrawRes(drawProcessResult.getCode(), drawProcessResult.getInfo());
+            }
+
+            // 2. 数据转换
+            DrawAwardVO drawAwardVO = drawProcessResult.getDrawAwardVO();
+            AwardDTO awardDTO = awardMapping.sourceToTarget(drawAwardVO);
+            awardDTO.setActivityId(drawReq.getActivityId());
+
+            // 3. 封装数据
+            DrawRes drawRes = new DrawRes(Constants.ResponseCode.SUCCESS.getCode(), Constants.ResponseCode.SUCCESS.getInfo());
+            drawRes.setAwardDTO(awardDTO);
+
+            log.info("抽奖,完成 uId:{} activityId:{} drawRes:{}", drawReq.getUId(), drawReq.getActivityId(), JSON.toJSONString(drawRes));
+
+            return drawRes;
+        } catch (Exception e) {
+            log.error("抽奖,失败 uId:{} activityId:{} reqJson:{}", drawReq.getUId(), drawReq.getActivityId(), JSON.toJSONString(drawReq), e);
+            return new DrawRes(Constants.ResponseCode.UN_ERROR.getCode(), Constants.ResponseCode.UN_ERROR.getInfo());
+        }
+    }
+
+    @Override
+    public DrawRes doQuantificationDraw(QuantificationDrawReq quantificationDrawReq) {
+        try {
+            log.info("量化人群抽奖,开始 uId:{} treeId:{}", quantificationDrawReq.getUId(), quantificationDrawReq.getTreeId());
+
+            // 1. 执行规则引擎,获取用户可以参与的活动号
+            RuleQuantificationCrowdResult ruleQuantificationCrowdResult = activityProcess.doRuleQuantificationCrowd(new DecisionMatterReq(quantificationDrawReq.getTreeId(), quantificationDrawReq.getUId(), quantificationDrawReq.getValMap()));
+            if (!Constants.ResponseCode.SUCCESS.getCode().equals(ruleQuantificationCrowdResult.getCode())) {
+                log.error("量化人群抽奖,失败(规则引擎执行异常) uId:{} treeId:{}", quantificationDrawReq.getUId(), quantificationDrawReq.getTreeId());
+                return new DrawRes(ruleQuantificationCrowdResult.getCode(), ruleQuantificationCrowdResult.getInfo());
+            }
+
+            // 2. 执行抽奖
+            Long activityId = ruleQuantificationCrowdResult.getActivityId();
+            DrawProcessResult drawProcessResult = activityProcess.doDrawProcess(new DrawProcessReq(quantificationDrawReq.getUId(), activityId));
+            if (!Constants.ResponseCode.SUCCESS.getCode().equals(drawProcessResult.getCode())) {
+                log.error("量化人群抽奖,失败(抽奖过程异常) uId:{} treeId:{}", quantificationDrawReq.getUId(), quantificationDrawReq.getTreeId());
+                return new DrawRes(drawProcessResult.getCode(), drawProcessResult.getInfo());
+            }
+
+            // 3. 数据转换
+            DrawAwardVO drawAwardVO = drawProcessResult.getDrawAwardVO();
+            AwardDTO awardDTO = awardMapping.sourceToTarget(drawAwardVO);
+            awardDTO.setActivityId(activityId);
+
+            // 4. 封装数据
+            DrawRes drawRes = new DrawRes(Constants.ResponseCode.SUCCESS.getCode(), Constants.ResponseCode.SUCCESS.getInfo());
+            drawRes.setAwardDTO(awardDTO);
+
+            log.info("量化人群抽奖,完成 uId:{} treeId:{} drawRes:{}", quantificationDrawReq.getUId(), quantificationDrawReq.getTreeId(), JSON.toJSONString(drawRes));
+
+            return drawRes;
+        } catch (Exception e) {
+            log.error("量化人群抽奖,失败 uId:{} treeId:{} reqJson:{}", quantificationDrawReq.getUId(), quantificationDrawReq.getTreeId(), JSON.toJSONString(quantificationDrawReq), e);
+            return new DrawRes(Constants.ResponseCode.UN_ERROR.getCode(), Constants.ResponseCode.UN_ERROR.getInfo());
+        }
+    }
+
+}

+ 3 - 2
lottery-interfaces/src/test/java/com/seamew/lottery/test/DrawAlgorithmTest.java

@@ -8,8 +8,9 @@ import com.seamew.lottery.domain.award.service.factory.DistributionGoodsFactory;
 import com.seamew.lottery.domain.award.service.goods.IDistributionGoods;
 import com.seamew.lottery.domain.strategy.model.req.DrawReq;
 import com.seamew.lottery.domain.strategy.model.res.DrawResult;
-import com.seamew.lottery.domain.strategy.model.vo.DrawAwardInfo;
+import com.seamew.lottery.domain.strategy.model.vo.DrawAwardVO;
 import com.seamew.lottery.domain.strategy.service.draw.IDrawExec;
+import com.seamew.lottery.rpc.res.DrawRes;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -53,7 +54,7 @@ public class DrawAlgorithmTest {
         }
 
         // 封装发奖参数,orderId:2109313442431 为模拟ID,需要在用户参与领奖活动时生成
-        DrawAwardInfo drawAwardInfo = drawResult.getDrawAwardInfo();
+        DrawAwardVO drawAwardInfo = drawResult.getDrawAwardInfo();
         GoodsReq goodsReq = new GoodsReq(drawResult.getUId(), "2109313442431", drawAwardInfo.getAwardId(), drawAwardInfo.getAwardName(), drawAwardInfo.getAwardContent());
 
         // 根据 awardType 从抽奖工厂中获取对应的发奖服务

+ 57 - 0
lottery-interfaces/src/test/java/com/seamew/lottery/test/interfaces/LotteryActivityBoothTest.java

@@ -0,0 +1,57 @@
+package com.seamew.lottery.test.interfaces;
+
+import com.alibaba.fastjson2.JSON;
+import com.seamew.lottery.rpc.ILotteryActivityBooth;
+import com.seamew.lottery.rpc.req.DrawReq;
+import com.seamew.lottery.rpc.req.QuantificationDrawReq;
+import com.seamew.lottery.rpc.res.DrawRes;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+
+/**
+ * @Author: seamew
+ * @Title: LotteryActivityBoothTest
+ * @CreateTime: 2023年02月26日 18:20:00
+ * @Description:
+ * @Version: 1.0
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@Slf4j
+public class LotteryActivityBoothTest {
+    @Resource
+    private ILotteryActivityBooth lotteryActivityBooth;
+
+    @Test
+    public void test_doDraw() {
+        DrawReq drawReq = new DrawReq();
+        drawReq.setUId("xiaofuge");
+        drawReq.setActivityId(100001L);
+        DrawRes drawRes = lotteryActivityBooth.doDraw(drawReq);
+        log.info("请求参数:{}", JSON.toJSONString(drawReq));
+        log.info("测试结果:{}", JSON.toJSONString(drawRes));
+
+    }
+
+    @Test
+    public void test_doQuantificationDraw() {
+        QuantificationDrawReq req = new QuantificationDrawReq();
+        req.setUId("xiaofuge");
+        req.setTreeId(2110081902L);
+        req.setValMap(new HashMap<String, Object>() {{
+            put("gender", "man");
+            put("age", "18");
+        }});
+
+        DrawRes drawRes = lotteryActivityBooth.doQuantificationDraw(req);
+        log.info("请求参数:{}", JSON.toJSONString(req));
+        log.info("测试结果:{}", JSON.toJSONString(drawRes));
+
+    }
+}

+ 0 - 15
lottery-rpc/src/main/java/com/seamew/lottery/rpc/IActivityBooth.java

@@ -1,15 +0,0 @@
-package com.seamew.lottery.rpc;
-
-import com.seamew.lottery.rpc.req.ActivityReq;
-import com.seamew.lottery.rpc.res.ActivityRes;
-
-/**
- * @Author: seamew
- * @Title: IActivityBooth
- * @CreateTime: 2023年02月07日 11:17:00
- * @Description: 活动展台 1. 创建活动 2. 更新活动 3. 查询活动
- * @Version: 1.0
- */
-public interface IActivityBooth {
-    ActivityRes queryActivityById(ActivityReq req);
-}

+ 31 - 0
lottery-rpc/src/main/java/com/seamew/lottery/rpc/ILotteryActivityBooth.java

@@ -0,0 +1,31 @@
+package com.seamew.lottery.rpc;
+
+import com.seamew.lottery.rpc.req.DrawReq;
+import com.seamew.lottery.rpc.req.QuantificationDrawReq;
+import com.seamew.lottery.rpc.res.DrawRes;
+
+/**
+ * @Author: seamew
+ * @Title: ILotteryActivityBooth
+ * @CreateTime: 2023年02月26日 17:36:00
+ * @Description: 抽奖活动展台接口
+ * @Version: 1.0
+ */
+public interface ILotteryActivityBooth {
+
+    /**
+     * 指定活动抽奖
+     * @param drawReq 请求参数
+     * @return        抽奖结果
+     */
+    DrawRes doDraw(DrawReq drawReq);
+
+    /**
+     * 量化人群抽奖
+     * @param quantificationDrawReq 请求参数
+     * @return                      抽奖结果
+     */
+    DrawRes doQuantificationDraw(QuantificationDrawReq quantificationDrawReq);
+
+}
+

+ 0 - 45
lottery-rpc/src/main/java/com/seamew/lottery/rpc/dto/ActivityDto.java

@@ -1,45 +0,0 @@
-package com.seamew.lottery.rpc.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * @Author: seamew
- * @Title: ActivityDto
- * @CreateTime: 2023年02月07日 11:18:00
- * @Description:
- * @Version: 1.0
- */
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class ActivityDto implements Serializable {
-    // 活动ID
-    private Long activityId;
-
-    // 活动名称
-    private String activityName;
-
-    // 活动描述
-    private String activityDesc;
-
-    // 开始时间
-    private Date beginDateTime;
-
-    // 结束时间
-    private Date endDateTime;
-
-    // 库存
-    private Integer stockCount;
-
-    // 每人可参与次数
-    private Integer takeCount;
-
-    // 活动状态:编辑、提审、撤审、通过、运行、拒绝、关闭、开启
-    private Integer state;
-
-}

+ 64 - 0
lottery-rpc/src/main/java/com/seamew/lottery/rpc/dto/AwardDTO.java

@@ -0,0 +1,64 @@
+package com.seamew.lottery.rpc.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Author: seamew
+ * @Title: AwardDTO
+ * @CreateTime: 2023年02月26日 17:35:00
+ * @Description: 奖品信息
+ * @Version: 1.0
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class AwardDTO implements Serializable {
+    /**
+     * 用户ID
+     */
+    private String userId;
+
+    /**
+     * 活动ID
+     */
+    private Long activityId;
+
+    /**
+     * 奖品ID
+     */
+    private String awardId;
+
+    /**
+     * 奖品类型(1:文字描述、2:兑换码、3:优惠券、4:实物奖品)
+     */
+    private Integer awardType;
+
+    /**
+     * 奖品名称
+     */
+    private String awardName;
+
+    /**
+     * 奖品内容「描述、奖品码、sku」
+     */
+    private String awardContent;
+
+    /**
+     * 策略方式(1:单项概率、2:总体概率)
+     */
+    private Integer strategyMode;
+
+    /**
+     * 发放奖品方式(1:即时、2:定时[含活动结束]、3:人工)
+     */
+    private Integer grantType;
+    /**
+     * 发奖时间
+     */
+    private Date grantDate;
+}

+ 12 - 4
lottery-rpc/src/main/java/com/seamew/lottery/rpc/req/ActivityReq.java → lottery-rpc/src/main/java/com/seamew/lottery/rpc/req/DrawReq.java

@@ -8,14 +8,22 @@ import java.io.Serializable;
 
 /**
  * @Author: seamew
- * @Title: ActivityReq
- * @CreateTime: 2023年02月07日 11:21:00
- * @Description:
+ * @Title: DrawReq
+ * @CreateTime: 2023年02月26日 17:37:00
+ * @Description: 抽奖请求
  * @Version: 1.0
  */
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class ActivityReq implements Serializable {
+public class DrawReq implements Serializable {
+    /**
+     * 用户ID
+     */
+    private String uId;
+    /**
+     * 活动ID
+     */
     private Long activityId;
+
 }

+ 34 - 0
lottery-rpc/src/main/java/com/seamew/lottery/rpc/req/QuantificationDrawReq.java

@@ -0,0 +1,34 @@
+package com.seamew.lottery.rpc.req;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * @Author: seamew
+ * @Title: QuantificationDrawReq
+ * @CreateTime: 2023年02月26日 17:37:00
+ * @Description: 量化人群抽奖请求参数
+ * @Version: 1.0
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class QuantificationDrawReq implements Serializable {
+
+    /**
+     * 用户ID
+     */
+    private String uId;
+    /**
+     * 规则树ID
+     */
+    private Long treeId;
+    /**
+     * 决策值
+     */
+    private Map<String, Object> valMap;
+}

+ 0 - 25
lottery-rpc/src/main/java/com/seamew/lottery/rpc/res/ActivityRes.java

@@ -1,25 +0,0 @@
-package com.seamew.lottery.rpc.res;
-
-import com.seamew.lottery.common.Result;
-import com.seamew.lottery.rpc.dto.ActivityDto;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.io.Serializable;
-
-/**
- * @Author: seamew
- * @Title: ActivityRes
- * @CreateTime: 2023年02月07日 11:18:00
- * @Description:
- * @Version: 1.0
- */
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class ActivityRes implements Serializable {
-    private Result result;
-    private ActivityDto activity;
-
-}

+ 31 - 0
lottery-rpc/src/main/java/com/seamew/lottery/rpc/res/DrawRes.java

@@ -0,0 +1,31 @@
+package com.seamew.lottery.rpc.res;
+
+import com.seamew.lottery.common.Result;
+import com.seamew.lottery.rpc.dto.AwardDTO;
+
+import java.io.Serializable;
+
+/**
+ * @Author: seamew
+ * @Title: DrawRes
+ * @CreateTime: 2023年02月26日 17:37:00
+ * @Description: 抽奖结果
+ * @Version: 1.0
+ */
+public class DrawRes extends Result implements Serializable {
+
+    private AwardDTO awardDTO;
+
+    public DrawRes(String code, String info) {
+        super(code, info);
+    }
+
+    public AwardDTO getAwardDTO() {
+        return awardDTO;
+    }
+
+    public void setAwardDTO(AwardDTO awardDTO) {
+        this.awardDTO = awardDTO;
+    }
+
+}

+ 10 - 0
pom.xml

@@ -82,6 +82,16 @@
                 <artifactId>fastjson</artifactId>
                 <version>2.0.23</version>
             </dependency>
+            <dependency>
+                <groupId>org.mapstruct</groupId>
+                <artifactId>mapstruct</artifactId>
+                <version>1.4.2.Final</version>
+            </dependency>
+            <dependency>
+                <groupId>org.mapstruct</groupId>
+                <artifactId>mapstruct-processor</artifactId>
+                <version>1.4.2.Final</version>
+            </dependency>
 
             <!-- 分库分表插件 -->
             <dependency>