peng
2 天以前 9d54d50c7beb2e6f0baee23ad0d536eb53d89eec
抽奖活动
14个文件已修改
3个文件已添加
238 ■■■■■ 已修改文件
buyer-api/src/main/java/cn/lili/controller/lmk/PrizeController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/vo/GrantRecordVO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/vo/PrizeDetailVO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/vo/PrizeInfoVO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/vo/PrizeProbabilityVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/vo/PrizeRecordTimeVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/mapper/PrizeActivityMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/mapper/PrizeDrawMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/PrizeActivityService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/PrizeDrawService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/PrizeService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeActivityServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeDrawServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/resources/mapper/lmk/PrizeActivityMapper.xml 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/resources/mapper/lmk/PrizeDrawMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/resources/mapper/lmk/PrizeRecordMapper.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
buyer-api/src/main/java/cn/lili/controller/lmk/PrizeController.java
@@ -1,7 +1,6 @@
package cn.lili.controller.lmk;
import cn.lili.base.Result;
import cn.lili.modules.lmk.domain.entity.PrizeRecord;
import cn.lili.modules.lmk.service.PrizeService;
import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor;
@@ -49,4 +48,14 @@
    public Result prizeInfo(@PathVariable String prizeActivityId) {
        return prizeService.prizeInfo(prizeActivityId);
    }
    /**
     * 获取获取最近中奖信息
     *
     * @param prizeActivityId
     * @return
     */
    @PostMapping("/grantRecord/{prizeActivityId}")
    public Result grantRecord(@PathVariable String prizeActivityId) {
        return prizeService.grantRecord(prizeActivityId);
    }
}
framework/src/main/java/cn/lili/modules/lmk/domain/vo/GrantRecordVO.java
New file
@@ -0,0 +1,31 @@
package cn.lili.modules.lmk.domain.vo;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * 中奖记录
 */
@Data
public class GrantRecordVO {
    /**
     * 昵称
     */
    private String nickname;
    /**
     * 奖品名称
     */
    private String prizeName;
    /**
     * 中奖时间
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date time;
}
framework/src/main/java/cn/lili/modules/lmk/domain/vo/PrizeDetailVO.java
New file
@@ -0,0 +1,20 @@
package cn.lili.modules.lmk.domain.vo;
import lombok.Data;
import java.util.List;
@Data
/**
 * 抽奖活动奖品信息
 */
public class PrizeDetailVO {
    private String id;
    private String activityName;
    private String activityDes;
    private String beginTime;
    private String endTime;
    private String activityImg;
    private String activityCover;
    private List<PrizeInfoVO> prizeInfoVOS;
}
framework/src/main/java/cn/lili/modules/lmk/domain/vo/PrizeInfoVO.java
New file
@@ -0,0 +1,20 @@
package cn.lili.modules.lmk.domain.vo;
import lombok.Data;
@Data
/**
 * 抽奖活动奖品信息
 */
public class PrizeInfoVO {
    private String id;
    private String prizeId;
    private String prizeContent;
    private String maxPreDay;
    private String prizeProbability;
    private String remainNum;
    private String prizeCover;
    private String prizeDes;
    private String prizeImg;
    private String prizeName;
}
framework/src/main/java/cn/lili/modules/lmk/domain/vo/PrizeProbabilityVO.java
@@ -6,6 +6,6 @@
@Data
public class PrizeProbabilityVO {
    private String prizeId;
    private String activityPrizeRefId;
    private BigDecimal[][] probability;
}
framework/src/main/java/cn/lili/modules/lmk/domain/vo/PrizeRecordTimeVO.java
@@ -8,9 +8,9 @@
public class PrizeRecordTimeVO {
    /**
     * 奖品id
     * 活动奖品对应id
     */
    private String prizeId;
    private String activityPrizeRefId;
    /**
     * 活动id
framework/src/main/java/cn/lili/modules/lmk/mapper/PrizeActivityMapper.java
@@ -1,6 +1,7 @@
package cn.lili.modules.lmk.mapper;
import cn.lili.modules.lmk.domain.entity.PrizeActivity;
import cn.lili.modules.lmk.domain.vo.PrizeDetailVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import cn.lili.modules.lmk.domain.vo.PrizeActivityVO;
@@ -31,4 +32,6 @@
    */
    IPage getPage(IPage page, @Param("query") PrizeActivityQuery query);
    PrizeDetailVO prizeInfo(@Param("id") String id);
}
framework/src/main/java/cn/lili/modules/lmk/mapper/PrizeDrawMapper.java
@@ -1,6 +1,7 @@
package cn.lili.modules.lmk.mapper;
import cn.lili.modules.lmk.domain.entity.PrizeDraw;
import cn.lili.modules.lmk.domain.vo.GrantRecordVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import cn.lili.modules.lmk.domain.vo.PrizeDrawVO;
@@ -31,4 +32,6 @@
    */
    IPage getPage(IPage page, @Param("query") PrizeDrawQuery query);
    List<GrantRecordVO> grantRecord(@Param("id")String prizeActivityId);
}
framework/src/main/java/cn/lili/modules/lmk/service/PrizeActivityService.java
@@ -1,10 +1,12 @@
package cn.lili.modules.lmk.service;
import cn.lili.modules.lmk.domain.entity.PrizeActivity;
import cn.lili.modules.lmk.domain.vo.PrizeDetailVO;
import com.baomidou.mybatisplus.extension.service.IService;
import cn.lili.base.Result;
import cn.lili.modules.lmk.domain.form.PrizeActivityForm;
import cn.lili.modules.lmk.domain.query.PrizeActivityQuery;
import java.util.List;
/**
@@ -63,4 +65,7 @@
     * @return
     */
    Result all();
    PrizeDetailVO prizeInfo(String id);
}
framework/src/main/java/cn/lili/modules/lmk/service/PrizeDrawService.java
@@ -69,4 +69,6 @@
     * @return
     */
    Result all();
    Result grantRecord(String prizeActivityId);
}
framework/src/main/java/cn/lili/modules/lmk/service/PrizeService.java
@@ -12,4 +12,6 @@
    Result prizeInfo(String prizeActivityId);
    Result grantRecord( String prizeActivityId);
}
framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeActivityServiceImpl.java
@@ -3,6 +3,7 @@
import cn.lili.common.utils.StringUtils;
import cn.lili.modules.lmk.domain.entity.ActivityRefPrize;
import cn.lili.modules.lmk.domain.vo.ActivityRefPrizeInfoVO;
import cn.lili.modules.lmk.domain.vo.PrizeDetailVO;
import cn.lili.modules.lmk.enums.general.PrizeActivityStatusEnum;
import cn.lili.modules.lmk.service.ActivityRefPrizeService;
import cn.lili.utils.COSUtil;
@@ -171,4 +172,9 @@
                .collect(Collectors.toList());
        return Result.ok().data(vos);
    }
    @Override
    public PrizeDetailVO prizeInfo(String id) {
        return prizeActivityMapper.prizeInfo(id);
    }
}
framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeDrawServiceImpl.java
@@ -166,4 +166,9 @@
                .collect(Collectors.toList());
        return Result.ok().data(vos);
    }
    @Override
    public Result grantRecord(String prizeActivityId) {
        return Result.ok().data(baseMapper.grantRecord(prizeActivityId));
    }
}
framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java
@@ -8,13 +8,14 @@
import cn.lili.common.utils.StringUtils;
import cn.lili.modules.lmk.domain.entity.*;
import cn.lili.modules.lmk.domain.query.PrizeRecordTimeQuery;
import cn.lili.modules.lmk.domain.vo.PrizeDetailVO;
import cn.lili.modules.lmk.domain.vo.PrizeProbabilityVO;
import cn.lili.modules.lmk.domain.vo.PrizeRecordTimeVO;
import cn.lili.modules.lmk.enums.general.*;
import cn.lili.modules.lmk.service.*;
import cn.lili.mybatis.BaseEntity;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.CommentTagsEnum;
import cn.lili.utils.COSUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -37,7 +38,6 @@
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -55,6 +55,7 @@
    private final RedissonClient redissonClient;
    private final RocketmqCustomProperties rocketmqCustomProperties;
    private final RocketMQTemplate rocketMQTemplate;
    private final COSUtil cosUtil;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result prize(String prizeId) {
@@ -167,20 +168,20 @@
        refPrizes = activityRefPrizeService.list(prizeRefQuery);
        canPrizeMap = refPrizes.stream().filter(item -> {
            return item.getRemainNum() > 0;
        }).collect(Collectors.toMap(ActivityRefPrize::getPrizeId, Function.identity()));
        }).collect(Collectors.toMap(ActivityRefPrize::getId, Function.identity()));
        prizeRecordTimeQuery = new PrizeRecordTimeQuery();
        prizeRecordTimeQuery.setStartTime(beginTime);
        prizeRecordTimeQuery.setEndTime(endTime);
        prizeRecordTimeQuery.setRecordActivityId(prizeId);
        prizeRecordListByTime = prizeRecordService.getPrizeRecordListByTime(prizeRecordTimeQuery);
        prizeRecordListByTime.stream().filter(item->{
            return item.getPrizeId() != null;
            return item.getActivityPrizeRefId() != null;
        }).forEach(item -> {
            ActivityRefPrize activityRefPrize = canPrizeMap.get(Long.parseLong(item.getPrizeId()));
            ActivityRefPrize activityRefPrize = canPrizeMap.get(item.getActivityPrizeRefId());
            if (activityRefPrize != null) {
                //移除当日上限的奖品并且添加到不能抽奖商品中去
                if (activityRefPrize.getMaxPreDay() <= item.getTotal()) {
                    canPrizeMap.remove(Long.parseLong(item.getPrizeId()));
                    canPrizeMap.remove(item.getActivityPrizeRefId());
                }
            }
        });
@@ -204,7 +205,7 @@
        BigDecimal probabilityBegin = BigDecimal.ZERO;
        for (ActivityRefPrize item : refPrizeList) {
            PrizeProbabilityVO prizeProbabilityVO = new PrizeProbabilityVO();
            prizeProbabilityVO.setPrizeId(item.getPrizeId());
            prizeProbabilityVO.setActivityPrizeRefId(item.getId());
            BigDecimal multiply = item.getPrizeProbability().multiply(BigDecimal.valueOf(100));
            BigDecimal[][] position = {{probabilityBegin, multiply.add(probabilityBegin)}};
            prizeProbabilityVO.setProbability(position);
@@ -217,7 +218,7 @@
            BigDecimal minP = prizeProbabilityVO.getProbability()[0][0];
            BigDecimal maxP = prizeProbabilityVO.getProbability()[0][1];
            if (bigDecimal.compareTo(minP) > 0 && bigDecimal.compareTo(maxP) <= 0) {
                prizeWon = prizeProbabilityVO.getPrizeId();
                prizeWon = prizeProbabilityVO.getActivityPrizeRefId();
                break;
            }
        }
@@ -263,7 +264,7 @@
        if (!update) {
            throw new ServiceException("当前活动太火爆了请稍后再试");
        }
        PrizeDraw prizeDraw = prizeDrawService.getById(prizeWon);
        PrizeDraw prizeDraw = prizeDrawService.getById(activityRefPrize.getPrizeId());
        //写入抽奖记录
        PrizeRecord prizeRecord = new PrizeRecord();
        prizeRecord.setUserId(Long.parseLong(userId));
@@ -277,7 +278,7 @@
        prizeRecord.setPrizeNumId(Long.parseLong(waitUserPrize.getId()));
        prizeRecord.setActivityPrizeRefId(Long.parseLong(activityRefPrize.getId()));
        prizeRecord.setDistributeStatus(PrizeDistributeStatusEnum.WAIT.name());
        prizeRecord.setPrizeId(prizeWon);
        prizeRecord.setPrizeId(activityRefPrize.getPrizeId());
        prizeRecord.setPrizeName(prizeDraw.getPrizeName());
        prizeRecord.setPrizeActivityCover(prizeActivity.getActivityCover());
        prizeRecord.setPrizeImg(prizeDraw.getPrizeImg());
@@ -328,6 +329,13 @@
        PrizeActivity activity = prizeActivityService.getById(prizeId);
        if (activity == null) {
            throw new RuntimeException("当前活动不存在");
        }
        Date activityEndtime = activity.getEndTime();
        if (new Date().after(activityEndtime)) {
            throw new ServiceException("当前活动已经结束");
        }
        if (!PrizeActivityStatusEnum.ON.name().equals(activity.getEnableStatus())) {
            throw new ServiceException("活动还没有启用");
        }
        //获取用户抽奖次数
        Integer prizeNum = activity.getPrizeNum();
@@ -408,6 +416,25 @@
    @Override
    public Result prizeInfo(String prizeActivityId) {
        return null;
        if (StringUtils.isBlank(prizeActivityId)) {
            return Result.ok().data(0);
        }
        PrizeDetailVO data = prizeActivityService.prizeInfo(prizeActivityId);
        data.getPrizeInfoVOS().forEach(info -> {
            String prizeImg = info.getPrizeImg();
            String prizeCover = info.getPrizeCover();
            if (StringUtils.isNotBlank(prizeImg)&&!prizeImg.contains("http")) {
                info.setPrizeImg(cosUtil.getPreviewUrl(prizeImg));
            }
            if (StringUtils.isNotBlank(prizeCover)&&!prizeCover.contains("http")) {
                info.setPrizeCover(cosUtil.getPreviewUrl(prizeCover));
            }
        });
        return Result.ok().data(data);
    }
    @Override
    public Result grantRecord(String prizeActivityId) {
        return prizeDrawService.grantRecord(prizeActivityId);
    }
}
framework/src/main/resources/mapper/lmk/PrizeActivityMapper.xml
@@ -64,5 +64,52 @@
        <if test="query.endTime != null">AND LPA.end_time &lt;= #{query.endTime}</if>
    </select>
    <resultMap id="prizeInfoMap" type="cn.lili.modules.lmk.domain.vo.PrizeDetailVO">
        <id property="id" column="id"/>
        <result property="activityName" column="activity_name"/>
        <result property="activityDes" column="activity_des"/>
        <result property="beginTime" column="begin_time"/>
        <result property="endTime" column="end_time"/>
        <result property="activityImg" column="activity_img"/>
        <result property="activityCover" column="activity_cover"/>
        <collection property="prizeInfoVOS" ofType="cn.lili.modules.lmk.domain.vo.PrizeInfoVO">
            <id property="id" column="refId"/>
            <result property="prizeId" column="prizeId"/>
            <result property="prizeContent" column="prize_content"/>
            <result property="maxPreDay" column="max_pre_day"/>
            <result property="prizeProbability" column="prize_probability"/>
            <result property="remainNum" column="remain_num"/>
            <result property="prizeCover" column="prize_cover"/>
            <result property="prizeDes" column="prize_des"/>
            <result property="prizeImg" column="prize_img"/>
            <result property="prizeName" column="prize_name"/>
        </collection>
     </resultMap>
    <select id="prizeInfo" resultMap="prizeInfoMap">
        SELECT lpa.id,
               lpa.activity_name,
               lpa.activity_des,
               lpa.begin_time,
               lpa.end_time,
               lpa.activity_img,
               lpa.activity_cover,
               larp.id refId,
               larp.prize_id,
               larp.prize_content,
               larp.max_pre_day,
               larp.prize_probability,
               larp.remain_num,
               lpd.prize_cover,
               lpd.prize_des,
               lpd.prize_img,
               lpd.prize_name
        FROM lmk_prize_activity lpa
                 JOIN lmk_activity_ref_prize larp ON larp.prize_activity_id = lpa.id
            AND lpa.delete_flag = 0
            AND larp.delete_flag = 0
                 JOIN lmk_prize_draw lpd ON lpd.id = larp.prize_id
            AND lpd.delete_flag = 0
            AND larp.delete_flag = 0
        WHERE lpa.id = #{id}
    </select>
</mapper>
framework/src/main/resources/mapper/lmk/PrizeDrawMapper.xml
@@ -58,5 +58,25 @@
            AND LPD.prize_type = #{query.prizeType}
        </if>
    </select>
    <resultMap id="grantRecordMap" type="cn.lili.modules.lmk.domain.vo.GrantRecordVO">
    <result property="nickname" column="nick_name"/>
    <result property="prizeName" column="prize_name"/>
    <result property="time" column="create_time"/>
    </resultMap>
    <select id="grantRecord" resultMap="grantRecordMap">
        SELECT
            nick_name,
            prize_name,
            create_time
        FROM
            lmk_prize_record
        WHERE
            prize_status = 'WIN'
          AND distribute_status = 'SUCCESS'
          AND prize_activity_id = #{id}
        ORDER BY
            create_time DESC
        limit 10
    </select>
</mapper>
framework/src/main/resources/mapper/lmk/PrizeRecordMapper.xml
@@ -67,13 +67,13 @@
            LPR.delete_flag = 0
    </select>
    <resultMap id="getPrizeRecordListByTimeMap" type="cn.lili.modules.lmk.domain.vo.PrizeRecordTimeVO">
        <result property="prizeId" column="prize_id"/>
        <result property="activityPrizeRefId" column="activity_prize_ref_id"/>
        <result property="prizeActivityId" column="prize_activity_id"/>
        <result property="total" column="total"/>
    </resultMap>
    <select id="getPrizeRecordListByTime" resultMap="getPrizeRecordListByTimeMap">
        SELECT
            prize_id,
            activity_prize_ref_id,
            prize_activity_id,
            count(*) total
        FROM
@@ -84,7 +84,7 @@
          AND create_time BETWEEN #{query.startTime}
            AND #{query.endTime}
        GROUP BY
            prize_id,
            activity_prize_ref_id,
            prize_activity_id;
    </select>
</mapper>