Jelajahi Sumber

Merge branch 'follow_task_func' into pre

# Conflicts:
#	netflix-service/src/main/java/com/cyksj/redis/RedisService.java
zoujiajian 3 tahun lalu
induk
melakukan
ac6a2c0162

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

@@ -6,6 +6,8 @@ import com.cyksj.model.entity.TaskUserCompleteRecord;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
+import java.math.BigDecimal;
+
 /*
  *项目名: netflix
  *文件名: TaskUserCompleteRecordMapper
@@ -24,4 +26,10 @@ public interface TaskUserCompleteRecordMapper extends BaseMapper<TaskUserComplet
 
 	@Select("select count(distinct user_id) from task_user_complete_record where task_id = #{taskId}")
 	Integer getSumCompleteNum(Long taskId);
+
+	@Select("select ifnull(sum(balance),0) from task_user_complete_record where task_id = #{taskId} and status = 'received' and created_time between #{beginOfDay} and #{endOfDay}")
+	BigDecimal sumTodayBalance(@Param("taskId") Long taskId, @Param("beginOfDay") DateTime beginOfDay, @Param("endOfDay") DateTime endOfDay);
+
+	@Select("select ifnull(sum(balance),0) from task_user_complete_record where task_id = #{taskId} and status = 'received'")
+	BigDecimal sumBalance(Long taskId);
 }

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java

@@ -127,6 +127,11 @@ public class OrderDon extends BaseEntity implements Serializable {
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private String labelSource;
 
+    /**
+     * 实物电视机类型 1、其他,2索尼 3三星 4东芝 5LG 6海信 7小米
+     */
+    private Integer tvType;
+
     /**
      * 支付时间
      */

+ 11 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/Task.java

@@ -1,5 +1,7 @@
 package com.cyksj.model.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
@@ -7,6 +9,7 @@ import lombok.Setter;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
 
 /*
  *项目名: netflix
@@ -46,10 +49,17 @@ public class Task extends BaseEntity{
 	 * 积分
 	 */
 	@NotNull(message = "积分不能为空")
-	@Min(value = 1)
+	@Min(value = 1, message = "积分不小于0")
 	private Integer points;
 
 	private Boolean status;
 
+	private String link;
+
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private String picture;
+
+	private BigDecimal balance;
+
 	private Boolean deleted;
 }

+ 4 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/TaskUserCompleteRecord.java

@@ -3,6 +3,8 @@ package com.cyksj.model.entity;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
+
 /*
  *项目名: netflix
  *文件名: TaskUserCompleteRecord
@@ -20,6 +22,8 @@ public class TaskUserCompleteRecord extends BaseEntity {
 
 	private Integer points;
 
+	private BigDecimal balance;
+
 	@Getter
 	public enum Status {
 		waiting("待完成"),

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonBackView.java

@@ -114,6 +114,9 @@ public class OrderDonBackView {
 	@DbField("o.label_source")
 	private String labelSource;
 
+	@DbField("o.tv_type")
+	private Integer tvType;
+
 	@DbIgnore
 	private Integer months;
 

+ 5 - 1
netflix-dao/src/main/java/com/cyksj/model/views/TaskFollowVerifyView.java

@@ -6,6 +6,7 @@ import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 /*
@@ -16,7 +17,7 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = "task_follow_plat_verify tv left join task t on t.id = tv.task_id" +
+@SearchBean(tables = "task_follow_plat_verify tv left join task_user_complete_record t on t.task_id = tv.task_id and t.user_id = tv.user_id" +
 		" left join user u on u.id = tv.user_id")
 public class TaskFollowVerifyView {
 	@DbField("tv.id")
@@ -40,6 +41,9 @@ public class TaskFollowVerifyView {
 	@DbField("t.points")
 	private Integer points;
 
+	@DbField("t.balance")
+	private BigDecimal balance;
+
 	@DbField("tv.status")
 	private TaskFollowPlatVerify.Status status;
 

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/model/views/TaskFrontView.java

@@ -7,6 +7,8 @@ import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
+
 /*
  *项目名: netflix
  *文件名: TaskFrontView
@@ -56,6 +58,15 @@ public class TaskFrontView {
 	@DbField("t.invite_num")
 	private Integer inviteNum;
 
+	@DbField("t.link")
+	private String link;
+
+	@DbField("t.picture")
+	private String picture;
+
+	@DbField("t.balance")
+	private BigDecimal balance;
+
 	/**
 	 * 个人邀请人数
 	 */

+ 23 - 0
netflix-dao/src/main/java/com/cyksj/model/views/TaskView.java

@@ -6,6 +6,8 @@ import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
+
 /*
  *项目名: netflix
  *文件名: TaskView
@@ -41,6 +43,15 @@ public class TaskView {
 	@DbField("t.points")
 	private Integer points;
 
+	@DbField("t.picture")
+	private String picture;
+
+	@DbField("t.link")
+	private String link;
+
+	@DbField("t.balance")
+	private BigDecimal balance;
+
 	@DbField("t.status")
 	private Boolean status;
 
@@ -77,6 +88,18 @@ public class TaskView {
 	@DbIgnore
 	private Integer sumPoints;
 
+	/**
+	 * 今日奖励余额
+	 */
+	@DbIgnore
+	private BigDecimal todayBalance;
+
+	/**
+	 * 累计奖励余额
+	 */
+	@DbIgnore
+	private BigDecimal sumBalance;
+
 	/**
 	 * 待审核数量
 	 */

+ 2 - 1
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -632,6 +632,7 @@ public class RedisService {
         CHAT_GPT_TOKEN_EXCEPTION_KEY("chat_gpt_token_exception_key:", "chatGPT直连token异常 key", -1l),
         ORDER_COMMENT_KEY("order_comment_key:", "订单评价", 10l),
         USER_BIND_ACCOUNT_INFO_KEY("user_bind_account_info_key:", "用户绑定其他账号key", 10l),
+        TASK_RECEIVED_KEY("task_received_key:%s:%s", "领取任务奖励key", 10l),
         ;
 
         private String name;
@@ -641,7 +642,7 @@ public class RedisService {
         private long timeout;
 
 
-        public String getNameFormat(Object... str) {
+        public String getNameFormat(Object ... str) {
             return String.format(this.getName(), str);
         }
 

+ 5 - 0
netflix-service/src/main/java/com/cyksj/service/market/impl/MarketFrontServiceImpl.java

@@ -269,6 +269,10 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public void receivedTaskPoints(Long userId, Long taskId) {
+		String key = RedisService.key.TASK_RECEIVED_KEY.getNameFormat(userId, taskId);
+		if (!redisService.setNx(key, taskId, RedisService.key.TASK_RECEIVED_KEY.getTimeout())) {
+			throw BusinessRuntimeException.getInstance("请勿重复点击按钮,正在领取中...");
+		}
 		TaskFrontView data = beanSearcher.searchFirst(TaskFrontView.class, MapUtils.builder()
 				.field(TaskFrontView::getId, taskId).build());
 		if (data == null) {
@@ -290,6 +294,7 @@ public class MarketFrontServiceImpl implements MarketFrontService {
 		record.setId(data.getTaskCompleteRecordId());
 		record.setStatus(TaskUserCompleteRecord.Status.received);
 		taskUserCompleteRecordMapper.updateById(record);
+		redisService.del(key);
 	}
 
 	@Override

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

@@ -3,6 +3,7 @@ package com.cyksj.service.market.task.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.constant.PointsRecordConst;
@@ -15,12 +16,17 @@ import com.cyksj.mapper.market.task.TaskMapper;
 import com.cyksj.mapper.market.task.TaskTypeMapper;
 import com.cyksj.mapper.market.task.TaskUserCompleteRecordMapper;
 import com.cyksj.model.entity.*;
+import com.cyksj.model.views.TaskView;
 import com.cyksj.service.market.task.TaskService;
+import com.cyksj.service.user.UserBenefitsService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /*
@@ -48,6 +54,10 @@ public class TaskServiceImpl implements TaskService {
 
 	private final UserPointsRecordMapper userPointsRecordMapper;
 
+	private final BeanSearcher beanSearcher;
+
+	private final UserBenefitsService userBenefitsService;
+
 	@Override
 	public void saveTask(Task task) {
 		checkTask(task);
@@ -60,6 +70,9 @@ public class TaskServiceImpl implements TaskService {
 		if (db == null || !db.getDeleted()) {
 			throw BusinessRuntimeException.getInstance("该任务已不存在");
 		}
+		if (task.getPoints() == null || task.getPoints() <= 0) {
+			throw BusinessRuntimeException.getInstance("积分不小于0");
+		}
 		BeanUtil.copyProperties(task, db);
 		checkTask(db);
 		taskMapper.updateById(db);
@@ -137,6 +150,14 @@ public class TaskServiceImpl implements TaskService {
 					if (verifyStatus == success) {
 						record.setStatus(TaskUserCompleteRecord.Status.received);
 						this.pointsRecord(record.getUserId(), record.getPoints(), PointsRecordConst.TASK, false);
+						TaskView taskView = beanSearcher.searchFirst(TaskView.class, MapUtils.builder().field(TaskView::getId, dbPlatVerify.getTaskId()).build());
+						if (taskView != null) {
+							if ("关注引导".equals(taskView.getTypeName()) && taskView.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+								//发送余额
+								userBenefitsService.addUserBalance(dbPlatVerify.getUserId(), taskView.getBalance());
+								record.setBalance(taskView.getBalance());
+							}
+						}
 					} else if (verifyStatus == fail) {
 						record.setStatus(TaskUserCompleteRecord.Status.fail);
 					}
@@ -184,6 +205,12 @@ public class TaskServiceImpl implements TaskService {
 			if (selectOne != null) {
 				throw BusinessRuntimeException.getInstance("已新增对应的任务");
 			}
+			//关注引导 才配置奖励余额
+			task.setBalance(BigDecimal.ZERO);
+			task.setLink(StrUtil.EMPTY);
+		}
+		if (task.getBalance() != null && task.getBalance().compareTo(BigDecimal.ZERO) < 0) {
+			throw BusinessRuntimeException.getInstance("请输入正确的奖励余额");
 		}
 	}
 

+ 13 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/CmsOrderController.java

@@ -505,6 +505,19 @@ public class CmsOrderController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
 
+	/**
+	 * 设置实物订单电视机类型
+	 */
+	@PutMapping("/update/order/tvType")
+	public Result<String> updateOrderTvType(@RequestBody OrderDon orderDon) {
+		Integer tvType = orderDon.getTvType();
+		Long id = orderDon.getId();
+		cmsOrderDonService.update(null, Wrappers.lambdaUpdate(OrderDon.class)
+				.set(OrderDon::getTvType, tvType)
+				.eq(OrderDon::getId, id));
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
 	/**
 	 * 订单统一退款
 	 */

+ 6 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/market/TaskController.java

@@ -25,11 +25,12 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
 import java.util.List;
 
 /*
  *项目名: netflix
- *文件名: TaskController
+ *文件名: GoodsDonSkuFrontView
  *创建者: JavaZou
  *创建时间:2022/12/27 13:34
  */
@@ -125,6 +126,10 @@ public class TaskController {
 			data.setTodayPoints(todayPoints);
 			Integer sumPoints = taskUserCompleteRecordMapper.sumPoints(data.getId());
 			data.setSumPoints(sumPoints);
+			BigDecimal todayBalance = taskUserCompleteRecordMapper.sumTodayBalance(data.getId(), beginOfDay, endOfDay);
+			data.setTodayBalance(todayBalance);
+			BigDecimal sumBalance = taskUserCompleteRecordMapper.sumBalance(data.getId());
+			data.setSumBalance(sumBalance);
 			//关注任务待审核数量
 			data.setVerifyNum(taskFollowPlatVerifyMapper.selectCount(Wrappers.lambdaQuery(TaskFollowPlatVerify.class)
 					.eq(TaskFollowPlatVerify::getTaskId, data.getId())