ソースを参照

Merge remote-tracking branch 'origin/sign_draw' into sign_draw

zoujiajian 3 年 前
コミット
8104ec8936

+ 2 - 2
netflix-dao/src/main/java/com/cyksj/mapper/market/task/TaskUserCompleteRecordMapper.java

@@ -13,10 +13,10 @@ import org.apache.ibatis.annotations.Select;
  *创建时间:2022/12/28 17:15
  */
 public interface TaskUserCompleteRecordMapper extends BaseMapper<TaskUserCompleteRecord> {
-	@Select("select sum(points) from task_user_complete_record where task_id = #{taskId} and created_time between #{beginOfDay} and #{endOfDay}")
+	@Select("select ifnull(sum(points),0) from task_user_complete_record where task_id = #{taskId} and status = 'received' and created_time between #{beginOfDay} and #{endOfDay}")
 	Integer sumTodayPoints(@Param("taskId") Long taskId, @Param("beginOfDay") DateTime beginOfDay, @Param("endOfDay") DateTime endOfDay);
 
-	@Select("select sum(points) from task_user_complete_record where task_id = #{taskId}")
+	@Select("select ifnull(sum(points),0) from task_user_complete_record where task_id = #{taskId} and status = 'received'")
 	Integer sumPoints(Long taskId);
 
 	@Select("select count(distinct user_id) from task_user_complete_record where task_id = #{taskId} and created_time between #{beginOfDay} and #{endOfDay}")

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/SignUser.java

@@ -25,4 +25,10 @@ public class SignUser extends BaseEntity{
      */
     @TableField(exist = false)
     private Boolean isHadChecked;
+
+    /**
+     * 签到发放的积分
+     */
+    @TableField(exist = false)
+    private Integer points;
 }

+ 4 - 4
netflix-service/src/main/java/com/cyksj/service/market/MarketFrontService.java

@@ -11,10 +11,10 @@ public interface MarketFrontService {
 
 	SignUser getUserSignDetail(Long userId);
 
-    /**
-     * 记录积分明细,发放积分
-     */
-    void pointsRecord(Long userId, Integer points, String remark);
+	/**
+	 * 记录积分明细,发放积分
+	 */
+	void pointsRecord(Long userId, Integer points, String remark, Boolean isLottery);
 
 	LuckyDrawView lottery(Long userId);
 

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/market/draw/impl/LuckyDrawServiceImpl.java

@@ -67,7 +67,7 @@ public class LuckyDrawServiceImpl implements LuckyDrawService {
 			throw BusinessRuntimeException.getInstance("该奖品已不存在");
 		}
 		if (entity.getStatus()) {
-			changeLuckyDrawIndex(entity);
+			changeLuckyDrawIndex(luckyDraw);
 		}
 		BeanUtil.copyProperties(luckyDraw, entity);
 		//校验参数

+ 58 - 43
netflix-service/src/main/java/com/cyksj/service/market/impl/MarketFrontServiceImpl.java

@@ -46,7 +46,6 @@ import org.springframework.transaction.annotation.Transactional;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
-import java.util.Optional;
 import java.util.concurrent.ThreadLocalRandom;
 
 @Service
@@ -96,33 +95,28 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 		//第一次签到
 		SignUser signUser = signUserMapper.selectOne(Wrappers.lambdaQuery(SignUser.class)
 				.eq(SignUser::getUserId, userId).last("limit 1"));
-		Optional.ofNullable(signUser)
-				.ifPresentOrElse(sign -> {
-					//更新签到
-					signCheck(signUser);
-				}, () -> {
-					log.info("用户:{}第一次签到", userId);
-					SignUser save = new SignUser();
-					save.setUserId(userId);
-					save.setDay(1);
-					save.setDayPeriod(1);
-					try {
-						signUserMapper.insert(save);
-						//发放积分
-						updateUserSignDay(save);
-					} catch (DuplicateKeyException e) {
-						log.info("用户:{}重复签到记录插入", userId);
-					}
-				});
-		SignUser sign = signUserMapper.selectOne(Wrappers.lambdaQuery(SignUser.class)
-				.eq(SignUser::getUserId, userId).last("limit 1"));
-		sign.setIsHadChecked(false);
 		if (signUser == null) {
-			sign.setIsHadChecked(true);
-		}
-		if (signUser != null && signUser.getDayPeriod() != sign.getDayPeriod()) {
-			sign.setIsHadChecked(true);
+			log.info("用户:{}第一次签到", userId);
+			signUser = new SignUser();
+			signUser.setUserId(userId);
+			signUser.setDay(1);
+			signUser.setDayPeriod(1);
+			try {
+				signUserMapper.insert(signUser);
+				//发放积分
+				updateUserSignDay(signUser, true);
+				signUser.setIsHadChecked(true);
+			} catch (DuplicateKeyException e) {
+				log.info("用户:{}重复签到记录插入", userId);
+			}
+		}else {
+			//更新签到
+			signCheck(signUser);
 		}
+		SignUser sign = signUserMapper.selectOne(Wrappers.lambdaQuery(SignUser.class)
+				.eq(SignUser::getUserId, userId).last("limit 1"));
+		sign.setPoints(signUser.getPoints());
+		sign.setIsHadChecked(signUser.getIsHadChecked());
 		return sign;
 	}
 
@@ -134,17 +128,20 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 	}
 
 	@Override
-	public void pointsRecord(Long userId, Integer points, String remark) {
+	public void pointsRecord(Long userId, Integer points, String remark, Boolean isLottery) {
 		UserPointsRecord userPointsRecord = new UserPointsRecord();
 		userPointsRecord.setUserId(userId);
 		userPointsRecord.setPoints(points);
 		userPointsRecord.setRemark(remark);
 		userPointsRecordMapper.insert(userPointsRecord);
 
-		//发放爱心
-		userPointsRecordMapper.updateUserPoints(userId, points);
+		if (!isLottery) {
+			//发放爱心
+			userPointsRecordMapper.updateUserPoints(userId, points);
+		}
 	}
 
+
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public LuckyDrawView lottery(Long userId) {
@@ -159,7 +156,7 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 		if (sub != 1) {
 			throw BusinessRuntimeException.getInstance("积分不足");
 		}
-		pointsRecord(userId, -subPoints.intValue(), PointsRecordConst.POINTS_LOTTERY);
+		pointsRecord(userId, -subPoints.intValue(), PointsRecordConst.POINTS_LOTTERY, true);
 		List<LuckyDrawView> drawViews = beanSearcher.searchAll(LuckyDrawView.class, MapUtils.builder()
 				.field(LuckyDrawView::getStatus, true).op(Operator.Equal)
 				.orderBy(LuckyDrawView::getProbability).asc()
@@ -188,7 +185,7 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 		LuckyDrawRecord record = new LuckyDrawRecord();
 		BeanUtil.copyProperties(luckyDraw, record, "status");
 		if (luckyDraw.getType() == LuckyDraw.Type.points) {
-			pointsRecord(userId, luckyDraw.getPoints(), PointsRecordConst.LOTTERY);
+			pointsRecord(userId, luckyDraw.getPoints(), PointsRecordConst.LOTTERY, false);
 			record.setStatus(LuckyDrawRecord.Status.success);
 		} else if (luckyDraw.getType() == LuckyDraw.Type.coupon) {
 			//发放优惠券
@@ -286,7 +283,7 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 		if (data.getCouponId() != null && data.getCouponId() != 0) {
 			couponCommonService.sendCouponToUser(userId, data.getCouponId(), null, null, null, CouponUser.Channel.task);
 		}
-		pointsRecord(userId, data.getPoints(), PointsRecordConst.TASK);
+		pointsRecord(userId, data.getPoints(), PointsRecordConst.TASK, false);
 		//改变状态
 		TaskUserCompleteRecord record = new TaskUserCompleteRecord();
 		record.setId(data.getTaskCompleteRecordId());
@@ -303,6 +300,7 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 		DateTime signZero = DateUtil.beginOfDay(DateTime.now());
 		DateTime thisZero = DateUtil.beginOfDay(DateTime.now());
 		if (updateTime.after(thisZero)) {
+			signUser.setIsHadChecked(false);
 //            throw BusinessRuntimeException.getInstance("您已签到");
 		} else {
 			if (updateTime.before(thisZero) && thisZero.getTime() - signZero.getTime() == 0) {
@@ -313,21 +311,26 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 				}
 				signUser.setDayPeriod(signUser.getDayPeriod() + 1);
 				//更新签到时间
-				updateUserSignDay(signUser);
+				updateUserSignDay(signUser, false);
+				signUser.setIsHadChecked(true);
 			} else {
 				log.info("用户:{}断签,断签天数为:{}", signUser.getUserId(), signUser.getDayPeriod());
 				signUser.setDay(1);
 				signUser.setDayPeriod(1);
 				//更新签到时间
-				updateUserSignDay(signUser);
+				updateUserSignDay(signUser, false);
+				signUser.setIsHadChecked(true);
 			}
 		}
 	}
 
-	public void updateUserSignDay(SignUser signUser) {
-		Integer update = signUserMapper.updateUserSignDay(signUser.getDay(), signUser.getDayPeriod(), signUser.getUserId(), signUser.getUpdateTime());
+	public void updateUserSignDay(SignUser signUser, Boolean isFirst) {
+		Integer update = 1;
+		if (!isFirst) {
+			update = signUserMapper.updateUserSignDay(signUser.getDay(), signUser.getDayPeriod(), signUser.getUserId(), signUser.getUpdateTime());
+		}
+		Integer points = 0;
 		if (update > 0) {
-			Integer points = 0;
 			if (signUser.getDayPeriod() > 1) {
 				//发放积分
 				SignConfig signConfig = signConfigMapper.selectOne(Wrappers.lambdaQuery(SignConfig.class)
@@ -342,8 +345,9 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 				points = signConfigMapper.selectOne(Wrappers.lambdaQuery(SignConfig.class)
 						.orderByAsc(SignConfig::getId).last("limit 1")).getMaxPoints();
 			}
-			pointsRecord(signUser.getUserId(), points, PointsRecordConst.SIGN);
+			pointsRecord(signUser.getUserId(), points, PointsRecordConst.SIGN, false);
 		}
+		signUser.setPoints(points);
 	}
 
 	/**
@@ -454,6 +458,7 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 						record = new TaskUserCompleteRecord();
 						record.setUserId(userId);
 						record.setTaskId(data.getId());
+						record.setPoints(data.getPoints());
 						record.setStatus(TaskUserCompleteRecord.Status.complete);
 						taskUserCompleteRecordMapper.insert(record);
 					}
@@ -466,7 +471,7 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 				data.setTaskCompleteRecordId(record.getId());
 				data.setStatus(record.getStatus());
 			}
-			handleSpecialTask(userId, data, beginOfDay, endOfDay);
+			handleSpecialTask(userId, data, record, beginOfDay, endOfDay);
 
 		} else if ("week".equals(data.getTaskLimit())) {
 			wrapper.between(TaskUserCompleteRecord::getCreatedTime, beginOfWeek, endOfWeek);
@@ -475,12 +480,12 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 				data.setTaskCompleteRecordId(record.getId());
 				data.setStatus(record.getStatus());
 			}
-			handleSpecialTask(userId, data, beginOfWeek, endOfWeek);
+			handleSpecialTask(userId, data, record, beginOfWeek, endOfWeek);
 		}
 	}
 
-	public void handleSpecialTask(Long userId, TaskFrontView data, DateTime beginTime, DateTime endTime) {
-		if (TaskTypeEnum.share.name().equals(data.getTypeName())) {
+	public void handleSpecialTask(Long userId, TaskFrontView data, TaskUserCompleteRecord record, DateTime beginTime, DateTime endTime) {
+		if (TaskTypeEnum.share.getDesc().equals(data.getTypeName())) {
 			//邀请人数是否达标
 			Integer count = userDistributeSharedMapper.selectCount(Wrappers.lambdaQuery(UserDistributeShared.class)
 					.eq(UserDistributeShared::getSharedId, userId)
@@ -488,8 +493,18 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 			data.setHadInvitedNum(count);
 			if (count >= data.getInviteNum() && data.getStatus() == TaskUserCompleteRecord.Status.waiting) {
 				data.setStatus(TaskUserCompleteRecord.Status.complete);
+				if (record == null) {
+					if (redisService.setNx(RedisService.key.TASK_TIME_LIMIT_KEY.getNameFormat(String.format("day_week_%s", userId)), userId, RedisService.key.TASK_TIME_LIMIT_KEY.getTimeout())) {
+						record = new TaskUserCompleteRecord();
+						record.setUserId(userId);
+						record.setTaskId(data.getId());
+						record.setPoints(data.getPoints());
+						record.setStatus(TaskUserCompleteRecord.Status.complete);
+						taskUserCompleteRecordMapper.insert(record);
+					}
+				}
 			}
-		} else if (TaskTypeEnum.bind_phone.name().equals(data.getTypeName())) {
+		} else if (TaskTypeEnum.bind_phone.getDesc().equals(data.getTypeName())) {
 			UserBindPhone bindPhone = userBindPhoneMapper.selectOne(Wrappers.lambdaQuery(UserBindPhone.class)
 					.eq(UserBindPhone::getUserId, userId).last("limit 1"));
 			if (bindPhone != null) {

+ 1 - 0
netflix-service/src/main/java/com/cyksj/service/market/task/impl/TaskServiceImpl.java

@@ -124,6 +124,7 @@ public class TaskServiceImpl implements TaskService {
 	}
 
 	public void handleSpecialTask(TaskType type, Task task, Long userId, LambdaQueryWrapper<TaskUserCompleteRecord> wrapper, DateTime beginTime, DateTime endTime) {
+		wrapper.eq(TaskUserCompleteRecord::getTaskId, task.getId());
 		if (!TaskTypeEnum.share.name().equals(type.getName())) {
 			wrapper.between(TaskUserCompleteRecord::getCreatedTime, beginTime, endTime);
 			TaskUserCompleteRecord record = taskUserCompleteRecordMapper.selectOne(wrapper);

+ 10 - 0
netflix-web/src/main/java/com/cyksj/web/controller/market/TaskFrontController.java

@@ -81,6 +81,11 @@ public class TaskFrontController {
 	@NoSubmit
 	public Result<String> bindPhone(@RequestBody LoginPhoneReq phoneReq) {
 		Long userId = StpUserUtil.getLoginIdAsLong();
+		UserBindPhone other = userBindPhoneMapper.selectOne(Wrappers.lambdaQuery(UserBindPhone.class)
+				.eq(UserBindPhone::getPhone, phoneReq.getPhone()).ne(UserBindPhone::getUserId, userId).select(UserBindPhone::getId).last("limit 1"));
+		if (other != null) {
+			throw BusinessRuntimeException.getInstance("该手机号已被绑定");
+		}
 		UserBindPhone bindPhone = userBindPhoneMapper.selectOne(Wrappers.lambdaQuery(UserBindPhone.class)
 				.eq(UserBindPhone::getUserId, userId).last("limit 1"));
 		if (bindPhone != null) {
@@ -114,6 +119,11 @@ public class TaskFrontController {
 		if (bindPhone == null) {
 			throw BusinessRuntimeException.getInstance("您未绑定手机号");
 		}
+		UserBindPhone other = userBindPhoneMapper.selectOne(Wrappers.lambdaQuery(UserBindPhone.class)
+				.eq(UserBindPhone::getPhone, phoneReq.getPhone()).ne(UserBindPhone::getUserId, userId).select(UserBindPhone::getId).last("limit 1"));
+		if (other != null) {
+			throw BusinessRuntimeException.getInstance("该手机号已被绑定");
+		}
 		phoneCodeService.checkPhone(phoneReq.getPhone(), phoneReq.getCode());
 		bindPhone.setPhone(phoneReq.getPhone());
 		userBindPhoneMapper.updateById(bindPhone);