Java實現抽獎模組的相關分享
Java實現抽獎模組的相關分享
最近進行的項目中,有個抽獎的需求,今天就把相關程式碼給大家分享一下。
一、DAO層
/**
* 獲取獎品列表
* @param systemVersion 手機系統版本(1-Android 2-iOS)
* @Date: 2021/6/7
*/
List<LuckyPrize> getPrizeList(int systemVersion);
二、mapper.xml
<select id="getPrizeList">
SELECT *
FROM system_card sc
LEFT JOIN lucky_prize lp ON sc.system_card_id = lp.system_card_id
WHERE sc.`status` = 1
AND sc.category = 3
AND sc.system_version = #{systemVersion}
</select>
三、service層
//簽到抽獎
LuckyPrizeVo startSignDraw(Integer systemVersion);
//積分抽獎
LuckyPrizeVo startIntegralDraw(Integer systemVersion);
其中入參systemVersion為手機系統,1是Android 2是蘋果
四、實現層
查看程式碼
/**
* 開始簽到抽獎
*/
@Override
public LuckyPrizeVo startSignDraw(Integer systemVersion) {
//判斷用戶是否有抽獎機會
String userId = TokenUtil.getUserId();
UserSign userSign = userSignMapper.selectOne(new QueryWrapper<UserSign>().eq("user_id", userId).eq("luck_chance", 1));
if (null == userSign) {
throw new BusinessException("連續成功簽到7天才可參與抽獎!");
}
//判斷上次簽到時間是否在本周
Date nowTime = new Date();
Date lastSignTime = userSign.getLastSignTime();
boolean flag = DateUtil.isSameWeek(nowTime, lastSignTime);
if (!flag) {
throw new BusinessException("連續成功簽到7天才可參與轉盤抽獎");
}
//同一周的,可以抽獎,調用定義的私有方法:luckyDraw(systemVersion)
LuckyPrizeVo luckyPrizeVo = luckyDraw(systemVersion);
//中獎了
//用戶簽到機會 改為0
userSign.setLuckChance(0);
userSignMapper.updateById(userSign);
//記錄表添加一條數據
LuckyPrizeLog luckyPrizeLog = new LuckyPrizeLog();
luckyPrizeLog.setLogId(SnowflakeUtil.genId());
luckyPrizeLog.setLuckyPrizeId(luckyPrizeVo.getLuckyPrizeId());
luckyPrizeLog.setUserId(userId);
luckyPrizeLog.setPrizeName(luckyPrizeVo.getCardName());
luckyPrizeLog.setCreateTime(nowTime);
luckyPrizeLogMapper.insert(luckyPrizeLog);
//用戶卡卷添加一條數據
UserCard userCard = new UserCard();
userCard.setUserCardId(SnowflakeUtil.genId());
userCard.setUserId(userId);
userCard.setSystemCardId(luckyPrizeVo.getSystemCardId());
int systemCardType = luckyPrizeVo.getSystemCardType();
userCard.setType(systemCardType);
userCard.setStatus(0);
userCard.setCreateTime(nowTime);
if (systemCardType == 1 || systemCardType == 2) {
//折扣卷和體驗卷有效期為30天
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, 30);
Date date = calendar.getTime();
userCard.setExpirationDate(date);
}
userCard.setRules(luckyPrizeVo.getSystemRules());
userCardMapper.insert(userCard);
return luckyPrizeVo;
}
查看程式碼
/**
* 開始積分抽獎
*/
@Override
public LuckyPrizeVo startIntegralDraw(Integer systemVersion) {
//判斷用戶是否有抽獎資格(100積分抽一次)
String userId = TokenUtil.getUserId();
UserExperience userExperience = userExperienceMapper.selectById(userId);
if (null == userExperience) {
throw new BusinessException("您的積分異常");
}
int integral = userExperience.getIntegral();
//積分滿100,抽一次
int score = 100;
if (integral < score) {
throw new BusinessException("您的積分不足,無法參與抽獎");
}
LuckyPrizeVo luckyPrizeVo = luckyDraw(systemVersion);
//中獎了
//更新用戶積分
int newIntegral = integral - 100;
userExperience.setIntegral(newIntegral);
userExperienceMapper.updateById(userExperience);
Date nowTime = new Date();
//記錄表添加一條數據
LuckyPrizeLog luckyPrizeLog = new LuckyPrizeLog();
luckyPrizeLog.setLogId(SnowflakeUtil.genId());
luckyPrizeLog.setLuckyPrizeId(luckyPrizeVo.getLuckyPrizeId());
luckyPrizeLog.setUserId(userId);
luckyPrizeLog.setPrizeName(luckyPrizeVo.getCardName());
luckyPrizeLog.setCreateTime(nowTime);
luckyPrizeLogMapper.insert(luckyPrizeLog);
//用戶卡卷添加一條數據
UserCard userCard = new UserCard();
userCard.setUserCardId(SnowflakeUtil.genId());
userCard.setUserId(userId);
userCard.setSystemCardId(luckyPrizeVo.getSystemCardId());
int systemCardType = luckyPrizeVo.getSystemCardType();
userCard.setType(systemCardType);
userCard.setStatus(0);
userCard.setCreateTime(nowTime);
if (systemCardType == 1 || systemCardType == 2) {
//折扣卷和體驗卷有效期為30天
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, 30);
Date date = calendar.getTime();
userCard.setExpirationDate(date);
}
userCard.setRules(luckyPrizeVo.getSystemRules());
userCardMapper.insert(userCard);
return luckyPrizeVo;
}
提示:
1.可能我的需求與大家不一樣,具體還是要看各位的需求要有所改動,但大體的思路可以參考我的程式碼;
2.項目中,繼承了mabytis-plus,還封裝了一些工具類,以及結果的統一處理。
五、Controller層
@PostMapping("/startSignDraw")
@ApiOperation(value = "簽到抽獎")
@Log(title = "簽到抽獎")
public String startSignDraw(@RequestBody SystemVersionDto dto) {
LuckyPrizeVo luckyPrizeVo = luckyPrizeService.startSignDraw(Integer.valueOf(dto.getSystemVersion()));
return Result.success(luckyPrizeVo);
}
@PostMapping("/startIntegralDraw")
@ApiOperation(value = "積分抽獎")
@Log(title = "積分抽獎")
public String startIntegralDraw(@RequestBody SystemVersionDto dto) {
LuckyPrizeVo luckyPrizeVo = luckyPrizeService.startIntegralDraw(Integer.valueOf(dto.getSystemVersion()));
return Result.success(luckyPrizeVo);
}
最後,附上建表sql:
六、建表SQL語句
CREATE TABLE `lucky_prize` (
`lucky_prize_id` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '獎品id',
`system_card_id` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '系統卡卷id',
`system_version` tinyint(1) DEFAULT NULL COMMENT '手機系統版本(1-Android 2-iOS)',
`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '備註',
`probability` double(3,2) NOT NULL COMMENT '抽獎概率',
`num` int DEFAULT NULL COMMENT '獎品數量',
PRIMARY KEY (`lucky_prize_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='獎品表';
CREATE TABLE `lucky_prize_log` (
`log_id` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '記錄id',
`lucky_prize_id` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '獎品id',
`user_id` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '抽獎用戶id',
`prize_name` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '獎品名稱',
`create_time` datetime DEFAULT NULL COMMENT '抽獎時間',
PRIMARY KEY (`log_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='抽獎記錄表';
CREATE TABLE `system_card` (
`system_card_id` char(18) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '系統卡卷id',
`card_name` char(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '卡卷名稱',
`type` tinyint(1) NOT NULL COMMENT '卡卷類型(0謝謝參與卷 1折扣卷 2vip體驗卷 3經驗卷)',
`count` int DEFAULT NULL COMMENT '卡卷數量(個)',
`is_count` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否有數量(0否 1是)默認為0',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '狀態(0未啟用,1已啟用,2已下線) 默認為1',
`failure_time` tinyint(1) NOT NULL COMMENT '卡卷時效時間(天)',
`is_failure_time` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否有時效時間(0否 1是)默認為0',
`create_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '創建時間',
`update_time` datetime DEFAULT NULL COMMENT '修改時間',
`remark` char(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '備註',
`rules` double(5,2) NOT NULL COMMENT '卡卷規則',
`category` tinyint(1) DEFAULT NULL COMMENT '卡卷種類(1-普通類 2-積分兌換類 3-轉盤類)',
`system_version` tinyint(1) DEFAULT NULL COMMENT '手機系統版本(1-Android 2-iOS)',
`required_points` int DEFAULT NULL COMMENT '積分卷所需積分',
PRIMARY KEY (`system_card_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='系統卡卷';
CREATE TABLE `user_sign` (
`user_id` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用戶id',
`is_monday` tinyint(1) DEFAULT '0' COMMENT '周一是否簽到(0無 1有)',
`is_tuesday` tinyint(1) DEFAULT '0' COMMENT '周二是否簽到(0無 1有)',
`is_wednesday` tinyint(1) DEFAULT '0' COMMENT '周三是否簽到(0無 1有)',
`is_thursday` tinyint(1) DEFAULT '0' COMMENT '周四是否簽到(0無 1有)',
`is_friday` tinyint(1) DEFAULT '0' COMMENT '周五是否簽到(0無 1有)',
`is_saturday` tinyint(1) DEFAULT '0' COMMENT '周六是否簽到(0無 1有)',
`is_sunday` tinyint(1) DEFAULT '0' COMMENT '周末是否簽到(0無 1有)',
`last_sign_time` datetime DEFAULT NULL COMMENT '最近一次簽到時間',
`luck_chance` tinyint(1) DEFAULT '0' COMMENT '抽獎機會(0無 1有)',
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用戶簽到記錄表';