Prechádzať zdrojové kódy

fix 签到、奖品设置、任务服务端代码

zoujiajian 3 rokov pred
rodič
commit
60de9d808f
46 zmenil súbory, kde vykonal 1568 pridanie a 159 odobranie
  1. 4 2
      netflix-common/src/main/java/com/cyksj/common/constant/PointsRecordConst.java
  2. 24 0
      netflix-common/src/main/java/com/cyksj/common/constant/TaskTypeEnum.java
  3. 3 0
      netflix-dao/src/main/java/com/cyksj/mapper/UserMapper.java
  4. 21 0
      netflix-dao/src/main/java/com/cyksj/mapper/market/draw/LuckyDrawRecordMapper.java
  5. 27 0
      netflix-dao/src/main/java/com/cyksj/mapper/market/task/TaskUserCompleteRecordMapper.java
  6. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/market/task/UserBindPhoneMapper.java
  7. 3 0
      netflix-dao/src/main/java/com/cyksj/model/entity/CouponUser.java
  8. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/ExchangeCode.java
  9. 2 0
      netflix-dao/src/main/java/com/cyksj/model/entity/LuckyDraw.java
  10. 56 0
      netflix-dao/src/main/java/com/cyksj/model/entity/LuckyDrawRecord.java
  11. 1 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java
  12. 2 0
      netflix-dao/src/main/java/com/cyksj/model/entity/Task.java
  13. 35 0
      netflix-dao/src/main/java/com/cyksj/model/entity/TaskUserCompleteRecord.java
  14. 2 0
      netflix-dao/src/main/java/com/cyksj/model/entity/User.java
  15. 5 0
      netflix-dao/src/main/java/com/cyksj/model/request/ExchangeCodeReq.java
  16. 2 0
      netflix-dao/src/main/java/com/cyksj/model/request/LoginPhoneReq.java
  17. 26 0
      netflix-dao/src/main/java/com/cyksj/model/request/LuckyDrawReq.java
  18. 68 0
      netflix-dao/src/main/java/com/cyksj/model/views/LuckyDrawRecordView.java
  19. 31 1
      netflix-dao/src/main/java/com/cyksj/model/views/LuckyDrawView.java
  20. 79 0
      netflix-dao/src/main/java/com/cyksj/model/views/TaskFrontView.java
  21. 24 0
      netflix-dao/src/main/java/com/cyksj/model/views/TaskView.java
  22. 43 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserPersonalView.java
  23. 3 1
      netflix-service/src/main/java/com/cyksj/redis/RedisService.java
  24. 1 0
      netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java
  25. 6 0
      netflix-service/src/main/java/com/cyksj/service/mange/coupon/CouponCommonService.java
  26. 24 0
      netflix-service/src/main/java/com/cyksj/service/mange/coupon/impl/CouponCommonServiceImpl.java
  27. 12 1
      netflix-service/src/main/java/com/cyksj/service/market/MarketFrontService.java
  28. 454 110
      netflix-service/src/main/java/com/cyksj/service/market/impl/MarketFrontServiceImpl.java
  29. 3 0
      netflix-service/src/main/java/com/cyksj/service/market/task/TaskService.java
  30. 70 0
      netflix-service/src/main/java/com/cyksj/service/market/task/impl/TaskServiceImpl.java
  31. 2 0
      netflix-service/src/main/java/com/cyksj/service/order/OrderDonService.java
  32. 20 1
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  33. 12 0
      netflix-service/src/main/java/com/cyksj/service/phone/PhoneCodeService.java
  34. 50 0
      netflix-service/src/main/java/com/cyksj/service/phone/impl/PhoneCodeServiceImpl.java
  35. 15 0
      netflix-service/src/main/java/com/cyksj/service/relation/GroupRelationFrontService.java
  36. 69 0
      netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java
  37. 12 0
      netflix-service/src/main/java/com/cyksj/service/user/impl/UserServiceImpl.java
  38. 5 22
      netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java
  39. 14 2
      netflix-web/src/main/java/com/cyksj/web/controller/manage/market/LuckyDrawController.java
  40. 7 11
      netflix-web/src/main/java/com/cyksj/web/controller/manage/market/SignController.java
  41. 16 5
      netflix-web/src/main/java/com/cyksj/web/controller/manage/market/TaskController.java
  42. 99 0
      netflix-web/src/main/java/com/cyksj/web/controller/market/LuckyDrawFrontController.java
  43. 3 3
      netflix-web/src/main/java/com/cyksj/web/controller/market/SignFrontController.java
  44. 129 0
      netflix-web/src/main/java/com/cyksj/web/controller/market/TaskFrontController.java
  45. 11 0
      netflix-web/src/main/java/com/cyksj/web/controller/user/AuthorizationController.java
  46. 55 0
      netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java

+ 4 - 2
netflix-common/src/main/java/com/cyksj/common/constant/PointsRecordConst.java

@@ -1,7 +1,9 @@
 package com.cyksj.common.constant;
 
 public interface PointsRecordConst {
-    String SIGN = "每日签到";
+	String SIGN = "每日签到";
 
-    String LOTTERY = "积分抽奖";
+	String LOTTERY = "积分抽奖";
+
+	String TASK = "任务奖励";
 }

+ 24 - 0
netflix-common/src/main/java/com/cyksj/common/constant/TaskTypeEnum.java

@@ -0,0 +1,24 @@
+package com.cyksj.common.constant;
+
+import lombok.Getter;
+
+/*
+ *项目名: netflix
+ *文件名: TaskTypeEnum
+ *创建者: JavaZou
+ *创建时间:2022/12/29 14:48
+ */
+@Getter
+public enum TaskTypeEnum {
+	yh_order("下一笔订单"),
+	corp_wx("添加企业微信"),
+	bind_phone("绑定手机号"),
+	share("邀请好友"),
+	;
+
+	String desc;
+
+	TaskTypeEnum(String desc) {
+		this.desc = desc;
+	}
+}

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/mapper/UserMapper.java

@@ -24,4 +24,7 @@ public interface UserMapper extends BaseMapper<User> {
 
     @Update("update user set points = points + #{addPoints} where id = #{id} and points = #{originalPoints} and points >=0")
     Integer updatePoints(@Param("id") Long id, @Param("originalPoints") BigDecimal originalPoints, @Param("addPoints") BigDecimal addPoints);
+
+    @Update("update user set active_points = active_points - #{subPoints} where active_points > 0 and active_points >= #{subPoints} and id = #{userId}")
+    Integer subActivePoints(@Param("userId") Long userId, @Param("subPoints") BigDecimal subPoints);
 }

+ 21 - 0
netflix-dao/src/main/java/com/cyksj/mapper/market/draw/LuckyDrawRecordMapper.java

@@ -0,0 +1,21 @@
+package com.cyksj.mapper.market.draw;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.LuckyDrawRecord;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+/*
+ *项目名: netflix
+ *文件名: LuckyDrawRecordMapper
+ *创建者: JavaZou
+ *创建时间:2022/12/28 16:39
+ */
+public interface LuckyDrawRecordMapper extends BaseMapper<LuckyDrawRecord> {
+	@Update("update lucky_draw_record set status = #{success},order_id = #{orderId} where id = #{id} and status = 'pending'")
+	Integer updateStatus(@Param("id") Long id, @Param("orderId") Long orderId, @Param("success") LuckyDrawRecord.Status success);
+
+	@Select("select count(distinct user_id) from lucky_draw_record where draw_id = #{drawId}")
+	Integer getLotteryNum(Long drawId);
+}

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

@@ -0,0 +1,27 @@
+package com.cyksj.mapper.market.task;
+
+import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.TaskUserCompleteRecord;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+/*
+ *项目名: netflix
+ *文件名: TaskUserCompleteRecordMapper
+ *创建者: JavaZou
+ *创建时间: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}")
+	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}")
+	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}")
+	Integer getTodayCompleteNum(@Param("taskId") Long taskId, @Param("beginOfDay") DateTime beginOfDay, @Param("endOfDay") DateTime endOfDay);
+
+	@Select("select count(distinct user_id) from task_user_complete_record where task_id = #{taskId}")
+	Integer getSumCompleteNum(Long taskId);
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/market/task/UserBindPhoneMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.market.task;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserBindPhone;
+
+/*
+ *项目名: netflix
+ *文件名: UserBindPhoneMapper
+ *创建者: JavaZou
+ *创建时间:2022/12/29 13:54
+ */
+public interface UserBindPhoneMapper extends BaseMapper<UserBindPhone> {
+}

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CouponUser.java

@@ -56,6 +56,9 @@ public class CouponUser extends BaseEntity {
 		center("unused", "领卷中心"),
 		exCode("exCode", "兑换码"),
 		wxCorp("wxCorp", "企业微信"),
+		manual("manual","手动发放"),
+		lottery("lottery","抽奖"),
+		task("task","完成任务"),
 		;
 		private String channel;
 		private String desc;

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

@@ -40,4 +40,9 @@ public class ExchangeCode extends BaseEntity{
 	 * 使用人id
 	 */
 	private Long userId;
+
+	/**
+	 * 0平台 1抽奖
+	 */
+	private Integer type;
 }

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/LuckyDraw.java

@@ -32,6 +32,8 @@ public class LuckyDraw extends BaseEntity {
 
 	private Integer cost;
 
+	private Integer num;
+
 	@NotEmpty(message = "奖品位置不能为空")
 	private String position;
 

+ 56 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/LuckyDrawRecord.java

@@ -0,0 +1,56 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: LuckyDrawRecord
+ *创建者: JavaZou
+ *创建时间:2022/12/28 14:49
+ */
+@Getter
+@Setter
+public class LuckyDrawRecord extends BaseEntity{
+	private LuckyDraw.Type type;
+
+	private Long userId;
+
+	private Long drawId;
+
+	private Long orderId;
+
+	private String name;
+
+	private Integer points;
+
+	private Long couponId;
+
+	private Long goodsId;
+
+	private Long skuId;
+
+	private Integer cost;
+
+	/**
+	 * 兑换码
+	 */
+	private String exCode;
+
+	private String picture;
+
+	private Status status;
+
+	@Getter
+	public enum Status{
+		pending("待领取"),
+		success("已领取");
+		;
+
+		String desc;
+
+		Status(String desc) {
+			this.desc = desc;
+		}
+	}
+}

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

@@ -141,6 +141,7 @@ public class OrderDon extends BaseEntity implements Serializable {
         WeChat("wechat","微信"),
         ALI_PAY("zfb","支付宝"),
         EX_CODE("exchange_code","兑换码"),
+        LOTTERY("lottery","抽奖"),
         ;
         String type;
         String desc;

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/Task.java

@@ -1,5 +1,6 @@
 package com.cyksj.model.entity;
 
+import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -15,6 +16,7 @@ import javax.validation.constraints.NotNull;
  */
 @Getter
 @Setter
+@SearchBean(tables = "task")
 public class Task extends BaseEntity{
 	@NotEmpty(message = "任务名称不能为空")
 	private String name;

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

@@ -0,0 +1,35 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: TaskUserCompleteRecord
+ *创建者: JavaZou
+ *创建时间:2022/12/28 17:11
+ */
+@Setter
+@Getter
+public class TaskUserCompleteRecord extends BaseEntity {
+	private Long userId;
+
+	private Long taskId;
+
+	private Status status;
+
+	private Integer points;
+
+	@Getter
+	public enum Status {
+		waiting("待完成"),
+		complete("已完成"),
+		received("已领取"),
+		;
+		String desc;
+
+		Status(String desc) {
+			this.desc = desc;
+		}
+	}
+}

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/User.java

@@ -45,5 +45,7 @@ public class User extends BaseEntity implements Serializable{
     private Integer sex ;
 
     private BigDecimal points;
+
+    private BigDecimal activePoints;
 }
 

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/request/ExchangeCodeReq.java

@@ -26,4 +26,9 @@ public class ExchangeCodeReq {
 	 * 数量
 	 */
 	private Integer number;
+
+	/**
+	 * 0平台 1抽奖
+	 */
+	private Integer type;
 }

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/request/LoginPhoneReq.java

@@ -14,6 +14,8 @@ import lombok.Setter;
 public class LoginPhoneReq {
 	private String phone;
 
+	private String oldPhone;
+
 	/**
 	 * 验证码
 	 */

+ 26 - 0
netflix-dao/src/main/java/com/cyksj/model/request/LuckyDrawReq.java

@@ -0,0 +1,26 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/*
+ *项目名: netflix
+ *文件名: LuckyDrawReq
+ *创建者: JavaZou
+ *创建时间:2022/12/28 16:37
+ */
+@Getter
+@Setter
+public class LuckyDrawReq {
+
+	/**
+	 * 地址id
+	 */
+	@NotNull
+	private Long addressId;
+
+	@NotNull
+	private Long recordId;
+}

+ 68 - 0
netflix-dao/src/main/java/com/cyksj/model/views/LuckyDrawRecordView.java

@@ -0,0 +1,68 @@
+package com.cyksj.model.views;
+
+/*
+ *项目名: netflix
+ *文件名: LuckyDrawRecordView
+ *创建者: JavaZou
+ *创建时间:2022/12/28 16:56
+ */
+
+import com.cyksj.model.entity.LuckyDraw;
+import com.cyksj.model.entity.LuckyDrawRecord;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@SearchBean(tables = "lucky_draw_record lr" +
+		" left join coupon c on c.id = lr.coupon_id" +
+		" left join goods_don gd on gd.id = lr.goods_id" +
+		" left join goods_don_sku gdk on gdk.id = lr.sku_id")
+public class LuckyDrawRecordView {
+	@DbField("lr.id")
+	private Long id;
+
+	@DbField("lr.user_id")
+	private Long userId;
+
+	@DbField("lr.type")
+	private LuckyDraw.Type type;
+
+	@DbField("lr.name")
+	private String name;
+
+	@DbField("lr.points")
+	private Integer points;
+
+	@DbField("lr.coupon_id")
+	private Long couponId;
+
+	@DbField("c.name")
+	private String couponName;
+
+	@DbField("lr.goods_id")
+	private Long goodsId;
+
+	@DbField("gd.title")
+	private String goodsName;
+
+	@DbField("lr.sku_id")
+	private Long skuId;
+
+	@DbField("gdk.spec_val")
+	private String specVal;
+
+	@DbField("lr.ex_code")
+	private String exCode;
+
+	@DbField("lr.picture")
+	private String picture;
+
+	@DbField("lr.cost")
+	private Integer cost;
+
+	@DbField("lr.status")
+	private LuckyDrawRecord.Status status;
+}

+ 31 - 1
netflix-dao/src/main/java/com/cyksj/model/views/LuckyDrawView.java

@@ -17,7 +17,10 @@ import java.math.BigDecimal;
  */
 @Getter
 @Setter
-@SearchBean(tables = "lucky_draw ld",
+@SearchBean(tables = "lucky_draw ld" +
+		" left join coupon c on c.id = ld.coupon_id" +
+		" left join goods_don gd on gd.id = ld.goods_id" +
+		" left join goods_don_sku gdk on gdk.id = ld.sku_id",
 where = "ld.deleted is true")
 public class LuckyDrawView {
 	@DbField("ld.id")
@@ -35,12 +38,30 @@ public class LuckyDrawView {
 	@DbField("ld.coupon_id")
 	private Long couponId;
 
+	/**
+	 * 优惠券名称
+	 */
+	@DbField("c.name")
+	private String couponName;
+
 	@DbField("ld.goods_id")
 	private Long goodsId;
 
+	/**
+	 * 平台名称
+	 */
+	@DbField("gd.title")
+	private String goodsName;
+
 	@DbField("ld.sku_id")
 	private Long skuId;
 
+	/**
+	 * 规格
+	 */
+	@DbField("gdk.spec_val")
+	private String specVal;
+
 	@DbField("ld.cost")
 	private Integer cost;
 
@@ -50,6 +71,9 @@ public class LuckyDrawView {
 	@DbField("ld.probability")
 	private BigDecimal probability;
 
+	@DbField("ld.num")
+	private Integer num;
+
 	@DbField("ld.picture")
 	private String picture;
 
@@ -67,4 +91,10 @@ public class LuckyDrawView {
 	 */
 	@DbIgnore
 	private Integer LotteryCount;
+
+	/**
+	 * 奖品领取次数
+	 */
+	@DbIgnore
+	private Integer luckyOrderCount;
 }

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

@@ -0,0 +1,79 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.TaskUserCompleteRecord;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: TaskFrontView
+ *创建者: JavaZou
+ *创建时间:2022/12/28 17:21
+ */
+@Getter
+@Setter
+@SearchBean(tables = "task t left join task_type tt on tt.id = t.type_id" +
+		" left join coupon c on c.id = t.coupon_id",
+		where = "t.deleted is true")
+public class TaskFrontView {
+
+	@DbField("t.id")
+	private Long id;
+
+	@DbField("t.name")
+	private String name;
+
+	/**
+	 * 类型id
+	 */
+	@DbField("t.type_id")
+	private Long typeId;
+
+	@DbField("t.description")
+	private String description;
+
+	/**
+	 * 任务时限 time,day,week
+	 */
+	@DbField("t.task_limit")
+	private String taskLimit;
+
+	@DbField("tt.name")
+	private String typeName;
+
+	@DbField("t.coupon_id")
+	private Long couponId;
+
+	@DbField("c.name")
+	private String couponName;
+
+	/**
+	 * 邀请人数
+	 */
+	@DbField("t.invite_num")
+	private Integer inviteNum;
+
+	/**
+	 * 个人邀请人数
+	 */
+	@DbIgnore
+	private Integer hadInvitedNum;
+
+	@DbIgnore
+	private String phone;
+
+	/**
+	 * 积分
+	 */
+	@DbField("t.points")
+	private Integer points;
+
+	@DbIgnore
+	private Long taskCompleteRecordId;
+
+	@DbIgnore
+	private TaskUserCompleteRecord.Status status = TaskUserCompleteRecord.Status.waiting;
+}

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

@@ -38,15 +38,39 @@ public class TaskView {
 	@DbField("t.task_limit")
 	private String taskLimit;
 
+	@DbField("t.points")
+	private Integer points;
+
+	@DbField("t.coupon_id")
+	private Long couponId;
+
+	/**
+	 * 邀请人数
+	 */
+	@DbField("t.invite_num")
+	private Integer inviteNum;
+
+	/**
+	 * 今天完成人数
+	 */
 	@DbIgnore
 	private Integer todayCompleteNum;
 
+	/**
+	 * 累计完成人数
+	 */
 	@DbIgnore
 	private Integer sumCompleteNum;
 
+	/**
+	 * 今日奖励积分
+	 */
 	@DbIgnore
 	private Integer todayPoints;
 
+	/**
+	 * 累计奖励积分
+	 */
 	@DbIgnore
 	private Integer sumPoints;
 }

+ 43 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserPersonalView.java

@@ -0,0 +1,43 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: UserPersonalView
+ *创建者: JavaZou
+ *创建时间:2022/12/29 15:46
+ */
+@Getter
+@Setter
+public class UserPersonalView {
+	/**
+	 * 可用优惠券数量
+	 */
+	private Integer numOfCoupons;
+
+	/**
+	 * 车票数量
+	 */
+	private Integer numOfTickets;
+
+	/**
+	 * 我的积分
+	 */
+	private BigDecimal activePoints;
+
+	/**
+	 * 推广积分
+	 */
+	private BigDecimal popularizePoints;
+
+	/**
+	 * 是否有待支付订单 true有
+	 */
+	private Boolean isNoPayment;
+
+	private String phone;
+}

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

@@ -589,7 +589,9 @@ public class RedisService {
 	    CORP_ACCESSO_TOKEN_KEY("corp:access_token:", "corp_access_token", 60 * 30L),
 	    MAPPING_INDEX_KEY("mapper:index:", "授权跳转", 60 * 10L),
         WX_LOGIN_AUTH_URI("wx_login_auth_uri:%s", "微信网页授权登录uri", 60 * 60 * 24L),
-        RECOMMEND_COUPON_DAY("recommend_coupon_day:%s", "推荐优惠券弹窗", 60 * 60 * 24L)
+        RECOMMEND_COUPON_DAY("recommend_coupon_day:%s", "推荐优惠券弹窗", 60 * 60 * 24L),
+        LOTTERY_KEY("lottery_key:%s", "抽奖key", 60 * 60 * 24l),
+        TASK_TIME_LIMIT_KEY("task_time_limit:%s", "一次性任务key", 30),
         ;
 
         private String name;

+ 1 - 0
netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java

@@ -99,6 +99,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 			exchangeCode.setSkuId(exchangeCodeReq.getSkuId());
 			exchangeCode.setCode(sb.toString());
 			exchangeCode.setUseStatus(false);
+			exchangeCode.setType(exchangeCodeReq.getType());
 			exchangeCodeMapper.insert(exchangeCode);
 			ExcelExchangeCodeData excelExchangeCodeData = new ExcelExchangeCodeData();
 			BeanUtils.copyProperties(exchangeCode, excelExchangeCodeData);

+ 6 - 0
netflix-service/src/main/java/com/cyksj/service/mange/coupon/CouponCommonService.java

@@ -2,6 +2,7 @@ package com.cyksj.service.mange.coupon;
 
 import com.cyksj.model.entity.Coupon;
 import com.cyksj.model.entity.CouponDistributePopularize;
+import com.cyksj.model.entity.CouponUser;
 import com.cyksj.model.request.CorpCouponSendReq;
 import com.cyksj.model.request.CouponActiveReq;
 import com.cyksj.model.request.CouponDistributeReq;
@@ -59,4 +60,9 @@ public interface CouponCommonService {
 	 * 发放优惠券
 	 */
 	void corpSendCoupon(CorpCouponSendReq corpCouponSendReq) throws Exception;
+
+	/**
+	 * 发放优惠券至用户
+	 */
+	Boolean sendCouponToUser(Long userId, Long couponId, Long couponActiveId, Long recommendId, Long popularizeId, CouponUser.Channel channel);
 }

+ 24 - 0
netflix-service/src/main/java/com/cyksj/service/mange/coupon/impl/CouponCommonServiceImpl.java

@@ -199,6 +199,30 @@ public class CouponCommonServiceImpl implements CouponCommonService {
 		}
 	}
 
+	@Override
+	public Boolean sendCouponToUser(Long userId, Long couponId, Long couponActiveId, Long recommendId, Long popularizeId, CouponUser.Channel channel) {
+		CouponUser couponUser = couponUserMapper.selectOne(Wrappers.lambdaQuery(CouponUser.class).eq(CouponUser::getUserId, userId).eq(CouponUser::getCouponId, couponId).last("limit 1"));
+		if (couponUser == null) {
+			couponUser = new CouponUser();
+			couponUser.setUserId(userId);
+			couponUser.setCouponId(couponId);
+			//领券中心
+			couponUser.setChannel(channel);
+			couponUser.setStatus(CouponUser.Status.unused);
+			couponUser.setCouponActiveId(couponActiveId);
+			couponUser.setRecommendId(recommendId);
+			couponUser.setPopularizeId(recommendId);
+			//优惠券有效时间
+			couponFontService.updateCouponUserValidTime(couponId, couponUser);
+			try {
+				couponUserMapper.insert(couponUser);
+				return true;
+			} catch (DuplicateKeyException e) {
+				log.info("用户:{}重复领取优惠券{}插入数据错误", userId, couponId);
+			}
+		}
+		return false;
+	}
 
 	public void checkCouponParamsAndSaveOrUpdate(Coupon coupon) throws Exception {
 		List<Coupon.CouponGoodsSku> goodsSkuList = Jsons.parseList(coupon.getGoodsSkuIds(), Coupon.CouponGoodsSku.class);

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

@@ -2,10 +2,13 @@ package com.cyksj.service.market;
 
 
 import com.cyksj.model.entity.SignUser;
+import com.cyksj.model.request.LuckyDrawReq;
+import com.cyksj.model.views.LuckyDrawView;
 import com.cyksj.model.views.SignUserView;
+import com.cyksj.model.views.TaskFrontView;
 
 public interface MarketFrontService {
-    Integer signByUserId(Long userId);
+	SignUser signByUserId(Long userId);
 
     SignUserView getUserSignDetail(Long userId);
 
@@ -13,4 +16,12 @@ public interface MarketFrontService {
      * 记录积分明细,发放积分
      */
     void pointsRecord(Long userId, Integer points, String remark);
+
+	LuckyDrawView lottery(Long userId);
+
+	void receivedLuckyDraw(Long userId, LuckyDrawReq luckyDrawReq);
+
+	void updateTaskStatus(TaskFrontView data, Long userId);
+
+	void receivedTaskPoints(Long userId, Long taskId);
 }

+ 454 - 110
netflix-service/src/main/java/com/cyksj/service/market/impl/MarketFrontServiceImpl.java

@@ -3,137 +3,481 @@ package com.cyksj.service.market.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
-import com.baomidou.mybatisplus.core.toolkit.BeanUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.constant.PointsRecordConst;
+import com.cyksj.common.constant.TaskTypeEnum;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.snowflake.Sequence;
+import com.cyksj.mapper.AddressMapper;
+import com.cyksj.mapper.OrderDonMapper;
+import com.cyksj.mapper.OrderDonTransportMapper;
+import com.cyksj.mapper.UserMapper;
+import com.cyksj.mapper.corp.CorpUserMapper;
+import com.cyksj.mapper.manage.coupon.CouponUserMapper;
+import com.cyksj.mapper.manage.distribute.UserDistributeSharedMapper;
+import com.cyksj.mapper.market.draw.LuckyDrawRecordMapper;
 import com.cyksj.mapper.market.sign.SignConfigMapper;
 import com.cyksj.mapper.market.sign.SignUserMapper;
 import com.cyksj.mapper.market.sign.UserPointsRecordMapper;
-import com.cyksj.model.entity.SignConfig;
-import com.cyksj.model.entity.SignUser;
-import com.cyksj.model.entity.UserPointsRecord;
+import com.cyksj.mapper.market.task.TaskUserCompleteRecordMapper;
+import com.cyksj.mapper.market.task.UserBindPhoneMapper;
+import com.cyksj.model.entity.*;
+import com.cyksj.model.excel.ExcelExchangeCodeData;
+import com.cyksj.model.request.ExchangeCodeReq;
+import com.cyksj.model.request.LuckyDrawReq;
+import com.cyksj.model.views.LuckyDrawView;
 import com.cyksj.model.views.SignUserView;
+import com.cyksj.model.views.TaskFrontView;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.exchange.ExchangeCodeService;
+import com.cyksj.service.mange.coupon.CouponCommonService;
 import com.cyksj.service.market.MarketFrontService;
+import com.cyksj.service.sys.SysConfigService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
-import lombok.Singular;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.jdbc.Null;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.sql.Wrapper;
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 import java.util.Optional;
-import java.util.Random;
 import java.util.concurrent.ThreadLocalRandom;
 
 @Service
 @RequiredArgsConstructor
 @Slf4j
 public class MarketFrontServiceImpl implements MarketFrontService {
-    private final SignUserMapper signUserMapper;
-
-    private final SignConfigMapper signConfigMapper;
-
-    private final UserPointsRecordMapper userPointsRecordMapper;
-
-    @Override
-    public Integer signByUserId(Long userId) {
-        Integer dayPeriod = 0;
-        //第一次签到
-        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);
-                    }
-                });
-        return dayPeriod;
-    }
-
-    @Override
-    public SignUserView getUserSignDetail(Long userId) {
-        SignUserView signUserView = new SignUserView();
-        Integer dayPeriod = 0;
-        //未签到时,签到
-        dayPeriod = signByUserId(userId);
-        signUserView.setUserId(userId);
-        signUserView.setDayPeriod(dayPeriod);
-        return signUserView;
-    }
-
-    @Override
-    public void pointsRecord(Long userId, Integer points, String remark) {
-        UserPointsRecord userPointsRecord = new UserPointsRecord();
-        userPointsRecord.setUserId(userId);
-        userPointsRecord.setPoints(points);
-        userPointsRecord.setRemark(remark);
-        userPointsRecordMapper.insert(userPointsRecord);
-
-        //发放爱心
-        userPointsRecordMapper.updateUserPoints(userId, points);
-    }
-
-
-    /**
-     * 更新签到时间
-     */
-    public void signCheck(SignUser signUser) {
-        //更新时间是否小于今日零时且是否为连签
-        Date updateTime = signUser.getUpdateTime();
-        DateTime signZero = DateUtil.beginOfDay(DateTime.now());
-        DateTime thisZero = DateUtil.beginOfDay(DateTime.now());
-        if (updateTime.after(thisZero)) {
+	private final SignUserMapper signUserMapper;
+
+	private final SignConfigMapper signConfigMapper;
+
+	private final UserPointsRecordMapper userPointsRecordMapper;
+
+	private final SysConfigService sysConfigService;
+
+	private final UserMapper userMapper;
+
+	private final BeanSearcher beanSearcher;
+
+	private final CouponCommonService couponCommonService;
+
+	private final CouponUserMapper couponUserMapper;
+
+	private final ExchangeCodeService exchangeCodeService;
+
+	private final LuckyDrawRecordMapper luckyDrawRecordMapper;
+
+	private final OrderDonMapper orderDonMapper;
+
+	private final AddressMapper addressMapper;
+
+	private final OrderDonTransportMapper orderDonTransportMapper;
+
+	private static final Sequence SEQUENCE = new Sequence(0);
+
+	private final CorpUserMapper corpUserMapper;
+
+	private final TaskUserCompleteRecordMapper taskUserCompleteRecordMapper;
+
+	private final UserDistributeSharedMapper userDistributeSharedMapper;
+
+	private final UserBindPhoneMapper userBindPhoneMapper;
+
+	private final RedisService redisService;
+
+	@Override
+	public SignUser signByUserId(Long userId) {
+		//第一次签到
+		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"));
+		return sign;
+	}
+
+	@Override
+	public SignUserView getUserSignDetail(Long userId) {
+		SignUserView signUserView = new SignUserView();
+		//未签到时,签到
+		SignUser signUser = signByUserId(userId);
+		signUserView.setUserId(userId);
+		signUserView.setDayPeriod(signUser.getDayPeriod());
+		return signUserView;
+	}
+
+	@Override
+	public void pointsRecord(Long userId, Integer points, String remark) {
+		UserPointsRecord userPointsRecord = new UserPointsRecord();
+		userPointsRecord.setUserId(userId);
+		userPointsRecord.setPoints(points);
+		userPointsRecord.setRemark(remark);
+		userPointsRecordMapper.insert(userPointsRecord);
+
+		//发放爱心
+		userPointsRecordMapper.updateUserPoints(userId, points);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Throwable.class)
+	public LuckyDrawView lottery(Long userId) {
+		SysConfig lottery_points_limit = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class).eq(SysConfig::getSysKey, "lottery_points_limit").last("limit 1"));
+		User user = userMapper.selectById(userId);
+		BigDecimal subPoints = BigDecimal.valueOf(Long.parseLong(lottery_points_limit.getSysValue()));
+		if (user.getActivePoints().compareTo(subPoints) < 0) {
+			throw BusinessRuntimeException.getInstance("积分不足");
+		}
+		//扣减积分
+		Integer sub = userMapper.subActivePoints(userId, subPoints);
+		if (sub != 1) {
+			throw BusinessRuntimeException.getInstance("积分不足");
+		}
+		List<LuckyDrawView> drawViews = beanSearcher.searchAll(LuckyDrawView.class, MapUtils.builder()
+				.field(LuckyDrawView::getStatus, true).op(Operator.Equal)
+				.orderBy(LuckyDrawView::getProbability).asc()
+				.build());
+		if (drawViews.isEmpty()) {
+			throw BusinessRuntimeException.getInstance("暂未配置奖品");
+		}
+		Integer index = randomProbabilityIndex(drawViews);
+		if (index == -1) {
+			throw BusinessRuntimeException.getInstance("系统异常,请刷新页面重新操作");
+		}
+		LuckyDrawView luckyDraw = drawViews.get(index);
+		if (luckyDraw.getType() != LuckyDraw.Type.points) {
+			Integer num = 1;
+			luckyDraw = randomNum(luckyDraw, drawViews, num, userId);
+			if (luckyDraw == null) {
+				//随机给一份爱心值谢谢惠顾奖品
+				List<LuckyDrawView> others = beanSearcher.searchAll(LuckyDrawView.class, MapUtils.builder()
+						.field(LuckyDrawView::getStatus, true).op(Operator.Equal)
+						.field(LuckyDrawView::getType, LuckyDraw.Type.points.name()).op(Operator.Equal)
+						.build());
+				Integer finalIndex = randomProbabilityIndex(others);
+				luckyDraw = others.get(finalIndex);
+			}
+		}
+		LuckyDrawRecord record = new LuckyDrawRecord();
+		BeanUtil.copyProperties(luckyDraw, record, "status");
+		if (luckyDraw.getType() == LuckyDraw.Type.points) {
+			pointsRecord(userId, luckyDraw.getPoints(), PointsRecordConst.LOTTERY);
+			record.setStatus(LuckyDrawRecord.Status.success);
+		} else if (luckyDraw.getType() == LuckyDraw.Type.coupon) {
+			//发放优惠券
+			couponCommonService.sendCouponToUser(userId, luckyDraw.getCouponId(), null, null, null, CouponUser.Channel.lottery);
+			record.setStatus(LuckyDrawRecord.Status.success);
+		} else if (luckyDraw.getType() == LuckyDraw.Type.virtualGoods) {
+			ExchangeCodeReq exchangeCodeReq = new ExchangeCodeReq();
+			exchangeCodeReq.setGoodsId(luckyDraw.getGoodsId());
+			exchangeCodeReq.setSkuId(luckyDraw.getSkuId());
+			exchangeCodeReq.setNumber(1);
+			exchangeCodeReq.setType(1);
+			List<ExcelExchangeCodeData> exchangeCode = exchangeCodeService.createExchangeCode(exchangeCodeReq);
+			ExcelExchangeCodeData excelExchangeCodeData = exchangeCode.get(0);
+			record.setExCode(excelExchangeCodeData.getCode());
+			record.setStatus(LuckyDrawRecord.Status.pending);
+		} else if (luckyDraw.getType() == LuckyDraw.Type.realGoods) {
+			record.setStatus(LuckyDrawRecord.Status.pending);
+		}
+		record.setUserId(userId);
+		record.setDrawId(luckyDraw.getId());
+		luckyDrawRecordMapper.insert(record);
+		return luckyDraw;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Throwable.class)
+	public void receivedLuckyDraw(Long userId, LuckyDrawReq luckyDrawReq) {
+		LuckyDrawRecord record = luckyDrawRecordMapper.selectOne(Wrappers.lambdaQuery(LuckyDrawRecord.class)
+				.eq(LuckyDrawRecord::getId, luckyDrawReq.getRecordId())
+				.eq(LuckyDrawRecord::getUserId, userId).last("limit 1"));
+		if (record == null) {
+			throw BusinessRuntimeException.getInstance("该中奖奖品不存在");
+		}
+		if (record.getStatus() == LuckyDrawRecord.Status.success) {
+			throw BusinessRuntimeException.getInstance("您已领取该中奖奖品");
+		}
+		User user = userMapper.selectById(userId);
+		/* 生成订单 */
+		String donNo = SEQUENCE.nextId().toString();
+		OrderDon orderDon = new OrderDon();
+		orderDon.setOrderNo(donNo);
+		orderDon.setOpenId(user.getOpenId());
+		BigDecimal zero = BigDecimal.ZERO;
+		orderDon.setMoney(zero);
+		orderDon.setRealMoney(zero);
+		orderDon.setSkuId(record.getSkuId());
+		orderDon.setRelationId(0L);
+		orderDon.setNum(1);
+		orderDon.setGoodsId(record.getGoodsId());
+		orderDon.setStatus(OrderDon.Status.complete);
+		orderDon.setUserId(user.getId());
+		orderDon.setType(OrderDon.Type.LOTTERY);
+		orderDonMapper.insert(orderDon);
+
+		Address address = addressMapper.selectById(luckyDrawReq.getAddressId());
+		if (address == null) {
+			throw new BusinessRuntimeException("请添加收货地址.");
+		}
+		OrderDonTransport transport = new OrderDonTransport();
+		transport.setOrderId(orderDon.getId());
+		transport.setReceiver(address.getReceiver());
+		transport.setPhone(address.getPhone());
+		transport.setProvince(address.getProvince());
+		transport.setCity(address.getCity());
+		transport.setDistrict(address.getDistrict());
+		transport.setAddress(address.getAddress());
+		orderDonTransportMapper.insert(transport);
+
+		Integer update = luckyDrawRecordMapper.updateStatus(record.getId(), orderDon.getId(), LuckyDrawRecord.Status.success);
+		if (update != 1) {
+			throw BusinessRuntimeException.getInstance("系统异常,请刷新页面重新操作");
+		}
+	}
+
+	@Override
+	public void updateTaskStatus(TaskFrontView data, Long userId) {
+		this.checkTaskStatus(data, userId);
+	}
+
+	@Override
+	public void receivedTaskPoints(Long userId, Long taskId) {
+		TaskFrontView data = beanSearcher.searchFirst(TaskFrontView.class, MapUtils.builder()
+				.field(TaskFrontView::getId, taskId).build());
+		if (data == null) {
+			throw BusinessRuntimeException.getInstance("该任务不存在");
+		}
+		this.checkTaskStatus(data, userId);
+		if (data.getStatus() == TaskUserCompleteRecord.Status.waiting) {
+			throw BusinessRuntimeException.getInstance("您未完成该任务");
+		}
+		if (data.getStatus() == TaskUserCompleteRecord.Status.received) {
+			throw BusinessRuntimeException.getInstance("您已领取该任务奖励");
+		}
+		if (data.getCouponId() != null && data.getCouponId() != 0) {
+			couponCommonService.sendCouponToUser(userId, data.getCouponId(), null, null, null, CouponUser.Channel.task);
+		}
+		pointsRecord(userId, data.getPoints(), PointsRecordConst.TASK);
+		//改变状态
+		TaskUserCompleteRecord record = new TaskUserCompleteRecord();
+		record.setId(data.getTaskCompleteRecordId());
+		record.setStatus(TaskUserCompleteRecord.Status.received);
+		taskUserCompleteRecordMapper.updateById(record);
+	}
+
+	/**
+	 * 更新签到时间
+	 */
+	public void signCheck(SignUser signUser) {
+		//更新时间是否小于今日零时且是否为连签
+		Date updateTime = signUser.getUpdateTime();
+		DateTime signZero = DateUtil.beginOfDay(DateTime.now());
+		DateTime thisZero = DateUtil.beginOfDay(DateTime.now());
+		if (updateTime.after(thisZero)) {
 //            throw BusinessRuntimeException.getInstance("您已签到");
-        } else {
-            if (updateTime.before(thisZero) && thisZero.getTime() - signZero.getTime() == 0) {
-                log.info("用户:{}连续签到,此时天数为:{}", signUser.getUserId(), signUser.getDayPeriod());
-                signUser.setDay(signUser.getDay() + 1);
-                if (signUser.getDayPeriod() == 7) {
-                    signUser.setDayPeriod(0);
-                }
-                signUser.setDayPeriod(signUser.getDayPeriod() + 1);
-                //更新签到时间
-                updateUserSignDay(signUser);
-            } else {
-                log.info("用户:{}断签,断签天数为:{}", signUser.getUserId(), signUser.getDayPeriod());
-                signUser.setDay(1);
-                signUser.setDayPeriod(1);
-                //更新签到时间
-                updateUserSignDay(signUser);
-            }
-        }
-    }
-
-    public void updateUserSignDay(SignUser signUser) {
-        Integer update = signUserMapper.updateUserSignDay(signUser.getDay(), signUser.getDayPeriod(), signUser.getUserId(), signUser.getUpdateTime());
-        if (update > 0) {
-            Integer points = 0;
-            if (signUser.getDayPeriod() > 1) {
-                //发放积分
-                SignConfig signConfig = signConfigMapper.selectOne(Wrappers.lambdaQuery(SignConfig.class)
-                        .like(SignConfig::getType, signUser.getDayPeriod()).last("limit 1"));
-                points = ThreadLocalRandom.current().nextInt(signConfig.getMinPoints(), signConfig.getMaxPoints() + 1);
-            } else {
-                points = signConfigMapper.selectOne(Wrappers.lambdaQuery(SignConfig.class)
-                        .orderByAsc(SignConfig::getId).last("limit 1")).getMaxPoints();
-            }
-            pointsRecord(signUser.getUserId(), points, PointsRecordConst.SIGN);
-        }
-    }
+		} else {
+			if (updateTime.before(thisZero) && thisZero.getTime() - signZero.getTime() == 0) {
+				log.info("用户:{}连续签到,此时天数为:{}", signUser.getUserId(), signUser.getDayPeriod());
+				signUser.setDay(signUser.getDay() + 1);
+				if (signUser.getDayPeriod() == 7) {
+					signUser.setDayPeriod(0);
+				}
+				signUser.setDayPeriod(signUser.getDayPeriod() + 1);
+				//更新签到时间
+				updateUserSignDay(signUser);
+			} else {
+				log.info("用户:{}断签,断签天数为:{}", signUser.getUserId(), signUser.getDayPeriod());
+				signUser.setDay(1);
+				signUser.setDayPeriod(1);
+				//更新签到时间
+				updateUserSignDay(signUser);
+			}
+		}
+	}
+
+	public void updateUserSignDay(SignUser signUser) {
+		Integer update = signUserMapper.updateUserSignDay(signUser.getDay(), signUser.getDayPeriod(), signUser.getUserId(), signUser.getUpdateTime());
+		if (update > 0) {
+			Integer points = 0;
+			if (signUser.getDayPeriod() > 1) {
+				//发放积分
+				SignConfig signConfig = signConfigMapper.selectOne(Wrappers.lambdaQuery(SignConfig.class)
+						.like(SignConfig::getType, signUser.getDayPeriod()).last("limit 1"));
+				points = ThreadLocalRandom.current().nextInt(signConfig.getMinPoints(), signConfig.getMaxPoints() + 1);
+			} else {
+				points = signConfigMapper.selectOne(Wrappers.lambdaQuery(SignConfig.class)
+						.orderByAsc(SignConfig::getId).last("limit 1")).getMaxPoints();
+			}
+			pointsRecord(signUser.getUserId(), points, PointsRecordConst.SIGN);
+		}
+	}
+
+	/**
+	 * 随机概率奖励
+	 * 获取下标
+	 */
+	public Integer randomProbabilityIndex(List<LuckyDrawView> list) {
+		int random = -1;
+		//总权重
+		BigDecimal sums = list.stream().map(LuckyDrawView::getProbability).reduce(BigDecimal::add).get();
+		Double totalProbability = sums.doubleValue();
+		//产生随机数
+		Double randomNumber = ThreadLocalRandom.current().nextDouble();
+		//根据随机数在所有奖品分布的区域并确定所抽奖品
+		Double d1 = 0d;
+		Double d2 = 0d;
+		for (int i = 0; i < list.size(); i++) {
+			d2 += Double.parseDouble(String.valueOf(list.get(i).getProbability())) / totalProbability;
+			if (i == 0) {
+				d1 = 0d;
+			} else {
+				d1 += Double.parseDouble(String.valueOf(list.get(i - 1).getProbability())) / totalProbability;
+			}
+			if (randomNumber >= d1 && randomNumber < d2) {
+				random = i;
+				break;
+			}
+		}
+		return random;
+	}
+
+	public LuckyDrawView randomNum(LuckyDrawView luckyDrawView, List<LuckyDrawView> list, Integer num, Long userId) {
+		if (luckyDrawView.getNum() == 0) {
+			return null;
+		}
+		if (luckyDrawView.getType() == LuckyDraw.Type.coupon) {
+			CouponUser couponUser = couponUserMapper.selectOne(Wrappers.lambdaQuery(CouponUser.class)
+					.eq(CouponUser::getCouponId, luckyDrawView.getCouponId())
+					.eq(CouponUser::getUserId, userId).last("limit 1"));
+			if (couponUser != null) {
+				Integer index = randomProbabilityIndex(list);
+				if (index == -1) {
+					throw BusinessRuntimeException.getInstance("系统异常,请刷新页面重新操作");
+				}
+				LuckyDrawView next = list.get(index);
+				num++;
+				return randomNum(next, list, num, userId);
+			}
+		}
+		DateTime zero = DateUtil.beginOfDay(DateTime.now());
+		String key = RedisService.key.LOTTERY_KEY.getNameFormat(String.format("%s_%s", zero.toString(), luckyDrawView.getId().toString()));
+		Object o = redisService.get(key);
+		if (o != null) {
+			Integer incr = (Integer) o;
+			if (luckyDrawView.getNum() - incr > 0) {
+				redisService.incr(key, 1l);
+			} else {
+				if (num == 3) {
+					return null;
+				}
+				Integer index = randomProbabilityIndex(list);
+				if (index == -1) {
+					throw BusinessRuntimeException.getInstance("系统异常,请刷新页面重新操作");
+				}
+				LuckyDrawView next = list.get(index);
+				num++;
+				return randomNum(next, list, num, userId);
+			}
+		} else {
+			redisService.set(key, 0, RedisService.key.LOTTERY_KEY.getTimeout());
+			redisService.incr(key, 1l);
+			return luckyDrawView;
+		}
+		return luckyDrawView;
+	}
+
+	public void checkTaskStatus(TaskFrontView data, Long userId) {
+		DateTime now = DateTime.now();
+		DateTime beginOfDay = DateUtil.beginOfDay(now);
+		DateTime endOfDay = DateUtil.endOfDay(now);
+		DateTime beginOfWeek = DateUtil.beginOfWeek(now);
+		DateTime endOfWeek = DateUtil.endOfWeek(now);
+		LambdaQueryWrapper<TaskUserCompleteRecord> wrapper = Wrappers.lambdaQuery(TaskUserCompleteRecord.class)
+				.eq(TaskUserCompleteRecord::getUserId, userId)
+				.last("limit 1");
+		User user = userMapper.selectById(userId);
+		if ("time".equals(data.getTaskLimit())) {
+			Boolean isWx = false;
+			if ("添加企业微信".equals(data.getTypeName())) {
+				isWx = true;
+			}
+			TaskUserCompleteRecord record = taskUserCompleteRecordMapper.selectOne(wrapper);
+			if (record != null) {
+				data.setStatus(record.getStatus());
+				data.setTaskCompleteRecordId(record.getId());
+			}
+			if (record == null && isWx) {
+				CorpUser corpUser = corpUserMapper.selectOne(Wrappers.lambdaQuery(CorpUser.class).eq(CorpUser::getUnionid, user.getUnionid()).last("limit 1"));
+				if (corpUser != null) {
+					data.setStatus(TaskUserCompleteRecord.Status.complete);
+					if (redisService.setNx(RedisService.key.TASK_TIME_LIMIT_KEY.getNameFormat(String.format("wx_%s", userId)), userId, RedisService.key.TASK_TIME_LIMIT_KEY.getTimeout())) {
+						record = new TaskUserCompleteRecord();
+						record.setUserId(userId);
+						record.setTaskId(data.getId());
+						record.setStatus(TaskUserCompleteRecord.Status.complete);
+						taskUserCompleteRecordMapper.insert(record);
+					}
+				}
+			}
+		} else if ("day".equals(data.getTaskLimit())) {
+			wrapper.between(TaskUserCompleteRecord::getCreatedTime, beginOfDay, endOfDay);
+			TaskUserCompleteRecord record = taskUserCompleteRecordMapper.selectOne(wrapper);
+			if (record != null) {
+				data.setTaskCompleteRecordId(record.getId());
+				data.setStatus(record.getStatus());
+			}
+			handleSpecialTask(userId, data, beginOfDay, endOfDay);
+
+		} else if ("week".equals(data.getTaskLimit())) {
+			wrapper.between(TaskUserCompleteRecord::getCreatedTime, beginOfWeek, endOfWeek);
+			TaskUserCompleteRecord record = taskUserCompleteRecordMapper.selectOne(wrapper);
+			if (record != null) {
+				data.setTaskCompleteRecordId(record.getId());
+				data.setStatus(record.getStatus());
+			}
+			handleSpecialTask(userId, data, beginOfWeek, endOfWeek);
+		}
+	}
+
+	public void handleSpecialTask(Long userId, TaskFrontView data, DateTime beginTime, DateTime endTime) {
+		if (TaskTypeEnum.share.name().equals(data.getTypeName())) {
+			//邀请人数是否达标
+			Integer count = userDistributeSharedMapper.selectCount(Wrappers.lambdaQuery(UserDistributeShared.class)
+					.eq(UserDistributeShared::getSharedId, userId)
+					.between(UserDistributeShared::getCreatedTime, beginTime, endTime));
+			data.setHadInvitedNum(count);
+			if (count >= data.getInviteNum() && data.getStatus() == TaskUserCompleteRecord.Status.waiting) {
+				data.setStatus(TaskUserCompleteRecord.Status.complete);
+			}
+		} else if (TaskTypeEnum.bind_phone.name().equals(data.getTypeName())) {
+			UserBindPhone bindPhone = userBindPhoneMapper.selectOne(Wrappers.lambdaQuery(UserBindPhone.class)
+					.eq(UserBindPhone::getUserId, userId).last("limit 1"));
+			if (bindPhone != null) {
+				data.setPhone(bindPhone.getPhone());
+			}
+		}
+	}
 }

+ 3 - 0
netflix-service/src/main/java/com/cyksj/service/market/task/TaskService.java

@@ -1,6 +1,7 @@
 package com.cyksj.service.market.task;
 
 import com.cyksj.model.entity.Task;
+import com.cyksj.model.entity.TaskType;
 
 /*
  *项目名: netflix
@@ -12,4 +13,6 @@ public interface TaskService {
 	void saveTask(Task task);
 
 	void updateTask(Task task);
+
+	void completeTask(TaskType type, Long userId);
 }

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

@@ -1,13 +1,20 @@
 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 com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.constant.TaskTypeEnum;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.mapper.manage.distribute.UserDistributeSharedMapper;
 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.Task;
 import com.cyksj.model.entity.TaskType;
+import com.cyksj.model.entity.TaskUserCompleteRecord;
+import com.cyksj.model.entity.UserDistributeShared;
 import com.cyksj.service.market.task.TaskService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -32,6 +39,10 @@ public class TaskServiceImpl implements TaskService {
 
 	private final TaskMapper taskMapper;
 
+	private final TaskUserCompleteRecordMapper taskUserCompleteRecordMapper;
+
+	private final UserDistributeSharedMapper userDistributeSharedMapper;
+
 	@Override
 	public void saveTask(Task task) {
 		checkTask(task);
@@ -49,6 +60,34 @@ public class TaskServiceImpl implements TaskService {
 		taskMapper.updateById(db);
 	}
 
+	@Override
+	public void completeTask(TaskType type, Long userId) {
+		DateTime now = DateTime.now();
+		DateTime beginOfDay = DateUtil.beginOfDay(now);
+		DateTime endOfDay = DateUtil.endOfDay(now);
+		DateTime beginOfWeek = DateUtil.beginOfWeek(now);
+		DateTime endOfWeek = DateUtil.endOfWeek(now);
+		LambdaQueryWrapper<TaskUserCompleteRecord> wrapper = Wrappers.lambdaQuery(TaskUserCompleteRecord.class)
+				.eq(TaskUserCompleteRecord::getUserId, userId)
+				.last("limit 1");
+		List<Task> tasks = taskMapper.selectList(Wrappers.lambdaQuery(Task.class)
+				.eq(Task::getTypeId, type.getId()));
+		tasks.forEach(task -> {
+			if ("time".equals(task.getTaskLimit())) {
+				TaskUserCompleteRecord record = taskUserCompleteRecordMapper.selectOne(Wrappers.lambdaQuery(TaskUserCompleteRecord.class)
+						.eq(TaskUserCompleteRecord::getTaskId, task.getId())
+						.eq(TaskUserCompleteRecord::getUserId, userId).last("limit 1"));
+				if (record == null) {
+					saveCompleteTask(task.getId(), userId, task.getPoints());
+				}
+			} else if ("day".equals(task.getTaskLimit())) {
+				handleSpecialTask(type, task, userId, wrapper, beginOfDay, endOfDay);
+
+			} else if ("week".equals(task.getTaskLimit())) {
+				handleSpecialTask(type, task, userId, wrapper, beginOfWeek, endOfWeek);
+			}
+		});
+	}
 
 	public void checkTask(Task task) {
 		Long typeId = task.getTypeId();
@@ -74,4 +113,35 @@ public class TaskServiceImpl implements TaskService {
 			throw BusinessRuntimeException.getInstance("已新增对应的任务");
 		}
 	}
+
+	public void saveCompleteTask(Long taskId, Long userId, Integer points) {
+		TaskUserCompleteRecord record = new TaskUserCompleteRecord();
+		record.setTaskId(taskId);
+		record.setStatus(TaskUserCompleteRecord.Status.complete);
+		record.setUserId(userId);
+		record.setPoints(points);
+		taskUserCompleteRecordMapper.insert(record);
+	}
+
+	public void handleSpecialTask(TaskType type, Task task, Long userId, LambdaQueryWrapper<TaskUserCompleteRecord> wrapper, DateTime beginTime, DateTime endTime) {
+		if (!TaskTypeEnum.share.name().equals(type.getName())) {
+			wrapper.between(TaskUserCompleteRecord::getCreatedTime, beginTime, endTime);
+			TaskUserCompleteRecord record = taskUserCompleteRecordMapper.selectOne(wrapper);
+			if (record == null) {
+				saveCompleteTask(task.getId(), userId,task.getPoints());
+			}
+		} else if (TaskTypeEnum.share.name().equals(type.getName())) {
+			//邀请人数是否达标
+			Integer count = userDistributeSharedMapper.selectCount(Wrappers.lambdaQuery(UserDistributeShared.class)
+					.eq(UserDistributeShared::getSharedId, userId)
+					.between(UserDistributeShared::getCreatedTime, beginTime, endTime));
+			if (count >= task.getInviteNum()) {
+				wrapper.between(TaskUserCompleteRecord::getCreatedTime, beginTime, endTime);
+				TaskUserCompleteRecord record = taskUserCompleteRecordMapper.selectOne(wrapper);
+				if (record == null) {
+					saveCompleteTask(task.getId(), userId, task.getPoints());
+				}
+			}
+		}
+	}
 }

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/order/OrderDonService.java

@@ -83,4 +83,6 @@ public interface OrderDonService extends IService<OrderDon> {
     Integer updateHasPaymentInterestRealGoods();
 
     void updateHasPaymentInterestRealGoodsPayTime();
+
+    void saveTransport(Long addressId, Long orderId);
 }

+ 20 - 1
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -19,6 +19,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cyksj.common.AliPayCommon;
 import com.cyksj.common.EnvCommonService;
+import com.cyksj.common.constant.TaskTypeEnum;
 import com.cyksj.common.constant.TemplateEnum;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.snowflake.Sequence;
@@ -28,7 +29,6 @@ import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.Xmls;
 import com.cyksj.config.WeChatConfig;
 import com.cyksj.config.zfb.BaseZfbConfig;
-import com.cyksj.config.zfb.ZfbConfig;
 import com.cyksj.config.zfb.ZfbProductCode;
 import com.cyksj.dto.RedisKey;
 import com.cyksj.dto.Result;
@@ -39,6 +39,7 @@ import com.cyksj.mapper.manage.coupon.CouponMapper;
 import com.cyksj.mapper.manage.coupon.CouponSkuMapper;
 import com.cyksj.mapper.manage.coupon.CouponUserMapper;
 import com.cyksj.mapper.manage.distribute.*;
+import com.cyksj.mapper.market.task.TaskTypeMapper;
 import com.cyksj.model.dto.*;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.views.OrderDonView;
@@ -52,6 +53,7 @@ import com.cyksj.model.views.CouponUserView;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.coupon.CouponFontService;
 import com.cyksj.service.mange.stock.GoodsDonStockService;
+import com.cyksj.service.market.task.TaskService;
 import com.cyksj.service.order.OrderDonService;
 import com.cyksj.service.wechat.WeChatService;
 import com.cyksj.task.JobManager;
@@ -150,6 +152,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final GoodsDonStockService goodsDonStockService;
 
+	private final TaskService taskService;
+
+	private final TaskTypeMapper taskTypeMapper;
+
 	@Transactional(rollbackFor = Throwable.class)
 	@Override
 	public OrderDon submit(OrderPayRequest payRequest) throws Exception {
@@ -424,6 +430,12 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			//无车队,新增车队
 			checkNoGroupsTripsAndSendMsg(sku, order);
 		}
+		//完成任务
+		TASK_POOL.execute(() -> {
+			TaskType taskType = taskTypeMapper.selectOne(Wrappers.lambdaQuery(TaskType.class)
+					.eq(TaskType::getName, TaskTypeEnum.yh_order.getDesc()).last("limit 1"));
+			taskService.completeTask(taskType, order.getUserId());
+		});
 	}
 
     @Override
@@ -707,6 +719,12 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			//无车队,新增车队
 			checkNoGroupsTripsAndSendMsg(sku, orderDon);
 		}
+		//完成任务
+		TASK_POOL.execute(() -> {
+			TaskType taskType = taskTypeMapper.selectOne(Wrappers.lambdaQuery(TaskType.class)
+					.eq(TaskType::getName, TaskTypeEnum.yh_order.getDesc()).last("limit 1"));
+			taskService.completeTask(taskType, orderDon.getUserId());
+		});
 	}
 
 	@Override
@@ -992,6 +1010,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 	}
 
+	@Override
 	public void saveTransport(Long addressId, Long orderId) {
 		if (addressId == null) {
 			throw new BusinessRuntimeException("请选择收货地址.");

+ 12 - 0
netflix-service/src/main/java/com/cyksj/service/phone/PhoneCodeService.java

@@ -0,0 +1,12 @@
+package com.cyksj.service.phone;
+
+/*
+ *项目名: netflix
+ *文件名: PhoneCodeService
+ *创建者: JavaZou
+ *创建时间:2022/12/29 14:03
+ */
+public interface PhoneCodeService {
+
+	void checkPhone(String phone,String code);
+}

+ 50 - 0
netflix-service/src/main/java/com/cyksj/service/phone/impl/PhoneCodeServiceImpl.java

@@ -0,0 +1,50 @@
+package com.cyksj.service.phone.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.mapper.PhoneCodeMapper;
+import com.cyksj.model.entity.PhoneCode;
+import com.cyksj.service.phone.PhoneCodeService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: PhoneCodeServiceImpl
+ *创建者: JavaZou
+ *创建时间:2022/12/29 14:03
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class PhoneCodeServiceImpl implements PhoneCodeService {
+	private final PhoneCodeMapper phoneCodeMapper;
+
+	@Override
+	public void checkPhone(String phone, String code) {
+		if (!Validator.isMobile(phone)) {
+			throw BusinessRuntimeException.getInstance("请输入正确的手机号码");
+		}
+		DateTime now = DateTime.now();
+		PhoneCode phoneCode = phoneCodeMapper.selectOne(Wrappers.lambdaQuery(PhoneCode.class).eq(PhoneCode::getPhone, phone).last("limit 1"));
+		if (phoneCode == null || StrUtil.isEmpty(phoneCode.getCode())) {
+			throw BusinessRuntimeException.getInstance("请重新获取手机验证码");
+		}
+		//3分钟失效
+		Date updateTime = phoneCode.getUpdateTime();
+		DateTime afterFiveMinutes = DateUtil.offsetMinute(updateTime, 3);
+		if (now.isAfter(afterFiveMinutes)) {
+			throw BusinessRuntimeException.getInstance("手机验证码已失效,请重新获取");
+		}
+		if (!StrUtil.equals(code, phoneCode.getCode())) {
+			throw BusinessRuntimeException.getInstance("手机验证码错误,请重新输入");
+		}
+	}
+}

+ 15 - 0
netflix-service/src/main/java/com/cyksj/service/relation/GroupRelationFrontService.java

@@ -0,0 +1,15 @@
+package com.cyksj.service.relation;
+
+import com.cyksj.model.views.RenewalView;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: GroupRelationFrontService
+ *创建者: JavaZou
+ *创建时间:2022/12/29 15:42
+ */
+public interface GroupRelationFrontService {
+	List<RenewalView> getMyTicket(long userId);
+}

+ 69 - 0
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -0,0 +1,69 @@
+package com.cyksj.service.relation.impl;
+
+import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.mapper.UserMapper;
+import com.cyksj.mapper.market.task.UserBindPhoneMapper;
+import com.cyksj.model.entity.User;
+import com.cyksj.model.entity.UserBindPhone;
+import com.cyksj.model.views.RenewalView;
+import com.cyksj.service.relation.GroupRelationFrontService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/*
+ *项目名: netflix
+ *文件名: GroupRelationFrontServiceImpl
+ *创建者: JavaZou
+ *创建时间:2022/12/29 15:42
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class GroupRelationFrontServiceImpl implements GroupRelationFrontService {
+	private final UserBindPhoneMapper userBindPhoneMapper;
+
+	private final UserMapper userMapper;
+
+	private final BeanSearcher beanSearcher;
+
+	@Override
+	public List<RenewalView> getMyTicket(long userId) {
+		//是否绑定过手机号
+		UserBindPhone userBindPhone = userBindPhoneMapper.selectOne(Wrappers.lambdaQuery(UserBindPhone.class)
+				.eq(UserBindPhone::getUserId, userId).last("limit 1"));
+		Long otherUserId = 0l;
+		if (userBindPhone != null) {
+			User user = userMapper.selectOne(Wrappers.lambdaQuery(User.class)
+					.eq(User::getLoginPhone, userBindPhone.getPhone()).last("limit 1"));
+			if (user != null) {
+				otherUserId = user.getId();
+			}
+		}
+		List<RenewalView> list = beanSearcher.searchAll(RenewalView.class, MapUtils.builder()
+				.field(RenewalView::getUserId, userId, otherUserId).op(Operator.InList)
+				.field(RenewalView::getStatus, List.of("validity", "overdue")).op(Operator.InList)
+				.orderBy(RenewalView::getExpiryTime).asc()
+				.build());
+		//过滤邀请制、已失效的车位
+		DateTime now = DateTime.now();
+		List<RenewalView> collect = list.stream().filter(ticket -> {
+			if (ticket.getExpiryTime() != null && ticket.getExpiryTime().before(now)) {
+				return false;
+			}
+			if (ticket.getSecondType() == 1) {
+				ticket.setAccount(null);
+				ticket.setPassword(null);
+			}
+			return true;
+		}).collect(Collectors.toList());
+		return collect;
+	}
+}

+ 12 - 0
netflix-service/src/main/java/com/cyksj/service/user/impl/UserServiceImpl.java

@@ -3,14 +3,19 @@ package com.cyksj.service.user.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.common.constant.TaskTypeEnum;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeSharedMapper;
+import com.cyksj.mapper.market.task.TaskTypeMapper;
 import com.cyksj.model.dto.GzhOAuth2UserInfo;
 import com.cyksj.model.dto.UserWhoami;
+import com.cyksj.model.entity.TaskType;
 import com.cyksj.model.entity.User;
 import com.cyksj.model.entity.UserDistributeShared;
+import com.cyksj.service.market.task.TaskService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.service.wechat.WeChatService;
 import lombok.RequiredArgsConstructor;
@@ -35,6 +40,10 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 
     private final UserDistributeSharedMapper userDistributeSharedMapper;
 
+    private final TaskService taskService;
+
+    private final TaskTypeMapper taskTypeMapper;
+
     @Override
     public User saveAuth(GzhOAuth2UserInfo info, Long sharedId) {
         final String unionid = info.getUnionid();
@@ -70,6 +79,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             userDistributeShared.setUserId(user.getId());
             try {
                 userDistributeSharedMapper.insert(userDistributeShared);
+                TaskType taskType = taskTypeMapper.selectOne(Wrappers.lambdaQuery(TaskType.class)
+                        .eq(TaskType::getName, TaskTypeEnum.share.getDesc()).last("limit 1"));
+                taskService.completeTask(taskType, sharedId);
             } catch (DuplicateKeyException e) {
                 log.info("分销被邀请人重复插入");
             }

+ 5 - 22
netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java

@@ -1,6 +1,5 @@
 package com.cyksj.web.controller.group;
 
-import cn.hutool.core.date.DateTime;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
@@ -11,16 +10,14 @@ import com.cyksj.model.entity.OrderDon;
 import com.cyksj.model.request.OrderPayRequest;
 import com.cyksj.model.views.RenewalView;
 import com.cyksj.service.order.OrderDonService;
+import com.cyksj.service.relation.GroupRelationFrontService;
 import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
-import com.ejlchina.searcher.param.Operator;
-import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * @author chan
@@ -38,27 +35,13 @@ public class GroupRelationController {
 
     private final GroupsRelationMapper relationMapper;
 
+    private final GroupRelationFrontService groupRelationFrontService;
+
     @RequestMapping("/get/renewal")
     public Result<List<RenewalView>> get() {
         long userId = StpUserUtil.getLoginIdAsLong();
-        List<RenewalView> list = beanSearcher.searchAll(RenewalView.class, MapUtils.builder()
-                .field(RenewalView::getUserId, userId)
-                .field(RenewalView::getStatus, List.of("validity", "overdue")).op(Operator.InList)
-                .orderBy(RenewalView::getExpiryTime).asc()
-                .build());
-        //过滤邀请制、已失效的车位
-        DateTime now = DateTime.now();
-        List<RenewalView> collect = list.stream().filter(ticket -> {
-            if (ticket.getExpiryTime() != null && ticket.getExpiryTime().before(now)) {
-                return false;
-            }
-            if (ticket.getSecondType() == 1) {
-                ticket.setAccount(null);
-                ticket.setPassword(null);
-            }
-            return true;
-        }).collect(Collectors.toList());
-        return GatewayResponse.SUCCESS.newBuilder().toResult(collect);
+        List<RenewalView> list = groupRelationFrontService.getMyTicket(userId);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(list);
     }
 
     @PostMapping("/post/renewal")

+ 14 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/market/LuckyDrawController.java

@@ -1,10 +1,13 @@
 package com.cyksj.web.controller.manage.market;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.market.draw.LuckyDrawMapper;
+import com.cyksj.mapper.market.draw.LuckyDrawRecordMapper;
 import com.cyksj.model.entity.LuckyDraw;
+import com.cyksj.model.entity.LuckyDrawRecord;
 import com.cyksj.model.views.LuckyDrawView;
 import com.cyksj.service.market.draw.LuckyDrawService;
 import com.ejlchina.searcher.BeanSearcher;
@@ -32,6 +35,8 @@ public class LuckyDrawController {
 
 	private final BeanSearcher beanSearcher;
 
+	private final LuckyDrawRecordMapper luckyDrawRecordMapper;
+
 	/**
 	 * 新增抽奖奖品
 	 */
@@ -81,8 +86,15 @@ public class LuckyDrawController {
 		SearchResult<LuckyDrawView> search = beanSearcher.search(LuckyDrawView.class, MapUtils.flatBuilder(request.getParameterMap())
 				.build());
 		search.getDataList().forEach(data->{
-			data.setLotteryNum(1);
-			data.setLotteryCount(1);
+			Integer lotteryNum = luckyDrawRecordMapper.getLotteryNum(data.getId());
+			data.setLotteryNum(lotteryNum);
+			Integer lotteryCount = luckyDrawRecordMapper.selectCount(Wrappers.lambdaQuery(LuckyDrawRecord.class)
+					.eq(LuckyDrawRecord::getDrawId, data.getId()));
+			data.setLotteryCount(lotteryCount);
+			Integer luckyOrderCount = luckyDrawRecordMapper.selectCount(Wrappers.lambdaQuery(LuckyDrawRecord.class)
+					.eq(LuckyDrawRecord::getDrawId, data.getId())
+					.eq(LuckyDrawRecord::getStatus, LuckyDrawRecord.Status.success));
+			data.setLuckyOrderCount(luckyOrderCount);
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}

+ 7 - 11
netflix-web/src/main/java/com/cyksj/web/controller/manage/market/SignController.java

@@ -1,21 +1,15 @@
 package com.cyksj.web.controller.manage.market;
 
 
-import cn.dev33.satoken.stp.StpLogic;
-import cn.hutool.crypto.asymmetric.Sign;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.market.sign.SignConfigMapper;
 import com.cyksj.model.entity.SignConfig;
-import com.cyksj.model.entity.SysConfig;
-import com.cyksj.web.util.StpUserUtil;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 
-import javax.validation.Valid;
-import javax.validation.constraints.Null;
 import java.util.List;
 
 @RestController
@@ -36,11 +30,13 @@ public class SignController {
      * 编辑每日签到设置
      */
     @PutMapping("/put")
-    public Result<String> getSign(@RequestBody SignConfig signConfig) {
-        if (signConfig.getId() == null || signConfig.getId() < 1) {
-            throw BusinessRuntimeException.getInstance("id为空");
-        }
-        signConfigMapper.updateById(signConfig);
+    public Result<String> getSign(@RequestBody List<SignConfig> signConfigs) {
+        signConfigs.forEach(signConfig->{
+            if (signConfig.getId() == null || signConfig.getId() < 1) {
+                throw BusinessRuntimeException.getInstance("id为空");
+            }
+            signConfigMapper.updateById(signConfig);
+        });
         return GatewayResponse.SUCCESS.newBuilder().toResult("编辑成功");
     }
 }

+ 16 - 5
netflix-web/src/main/java/com/cyksj/web/controller/manage/market/TaskController.java

@@ -1,10 +1,13 @@
 package com.cyksj.web.controller.manage.market;
 
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 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.Task;
 import com.cyksj.model.entity.TaskType;
 import com.cyksj.model.views.TaskView;
@@ -37,6 +40,7 @@ public class TaskController {
 
 	private final BeanSearcher beanSearcher;
 
+	private final TaskUserCompleteRecordMapper taskUserCompleteRecordMapper;
 
 	/**
 	 * 任务分类列表
@@ -86,12 +90,19 @@ public class TaskController {
 	 */
 	@GetMapping("/get")
 	public Result<SearchResult<TaskView>> getTask(HttpServletRequest request) {
+		DateTime now = DateTime.now();
+		DateTime beginOfDay = DateUtil.beginOfDay(now);
+		DateTime endOfDay = DateUtil.endOfDay(now);
 		SearchResult<TaskView> search = beanSearcher.search(TaskView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
-		search.getDataList().forEach(data->{
-			data.setTodayCompleteNum(1);
-			data.setSumCompleteNum(1);
-			data.setTodayPoints(1);
-			data.setSumPoints(1);
+		search.getDataList().forEach(data -> {
+			Integer todayCompleteNum = taskUserCompleteRecordMapper.getTodayCompleteNum(data.getId(),beginOfDay,endOfDay);
+			data.setTodayCompleteNum(todayCompleteNum);
+			Integer sumCompleteNum = taskUserCompleteRecordMapper.getSumCompleteNum(data.getId());
+			data.setSumCompleteNum(sumCompleteNum);
+			Integer todayPoints = taskUserCompleteRecordMapper.sumTodayPoints(data.getId(), beginOfDay, endOfDay);
+			data.setTodayPoints(todayPoints);
+			Integer sumPoints = taskUserCompleteRecordMapper.sumPoints(data.getId());
+			data.setSumPoints(sumPoints);
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}

+ 99 - 0
netflix-web/src/main/java/com/cyksj/web/controller/market/LuckyDrawFrontController.java

@@ -0,0 +1,99 @@
+package com.cyksj.web.controller.market;
+
+import com.cyksj.common.annotation.NoSubmit;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.request.LuckyDrawReq;
+import com.cyksj.model.views.LuckyDrawRecordView;
+import com.cyksj.model.views.LuckyDrawView;
+import com.cyksj.service.market.MarketFrontService;
+import com.cyksj.web.util.StpUserUtil;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/*
+ *项目名: netflix
+ *文件名: LuckyDrawFrontController
+ *创建者: JavaZou
+ *创建时间:2022/12/28 13:51
+ */
+@RestController
+@RequestMapping("/applets/market/luckyDraw")
+@RequiredArgsConstructor
+public class LuckyDrawFrontController {
+	private final BeanSearcher beanSearcher;
+
+	private final MarketFrontService marketFrontService;
+
+	/**
+	 * 奖品列表
+	 */
+	@GetMapping("/get")
+	public Result<List<LuckyDrawView>> getLuckyDraw() throws Exception {
+		List<LuckyDrawView> drawViews = beanSearcher.searchAll(LuckyDrawView.class, MapUtils.builder()
+				.field(LuckyDrawView::getStatus, true).op(Operator.Equal).build());
+		if (drawViews.isEmpty()) {
+			throw BusinessRuntimeException.getInstance("暂未配置奖品");
+		}
+		List<LuckyDrawView> re = new ArrayList<>();
+		for (LuckyDrawView drawView : drawViews) {
+			List<Integer> positions = Jsons.parseList(drawView.getPosition(), Integer.class);
+			for (Integer i : positions) {
+				LuckyDrawView view = new LuckyDrawView();
+				BeanUtils.copyProperties(drawView, view);
+				view.setPosition(i.toString());
+				re.add(view);
+			}
+		}
+		re = re.stream().sorted(Comparator.comparing(LuckyDrawView::getPosition)).collect(Collectors.toList());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(re);
+	}
+
+	/**
+	 * 我的抽奖记录
+	 */
+	@GetMapping("/get/record")
+	public Result<SearchResult<LuckyDrawRecordView>> getLuckyDrawRecord(HttpServletRequest request) {
+		Long userId = StpUserUtil.getLoginIdAsLong();
+		SearchResult<LuckyDrawRecordView> search = beanSearcher.search(LuckyDrawRecordView.class, MapUtils.flatBuilder(request.getParameterMap())
+				.field(LuckyDrawRecordView::getUserId, userId).op(Operator.Equal).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 抽奖
+	 */
+	@PostMapping("/lottery")
+	@NoSubmit
+	public Result<LuckyDrawView> lottery() {
+		Long userId = StpUserUtil.getLoginIdAsLong();
+		LuckyDrawView luckyDrawView = marketFrontService.lottery(userId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(luckyDrawView);
+	}
+
+	/**
+	 * 领取奖品
+	 */
+	@PostMapping("/post/receive")
+	@NoSubmit
+	public Result<String> receivedLuckyDraw(@RequestBody @Validated LuckyDrawReq luckyDrawReq) {
+		Long userId = StpUserUtil.getLoginIdAsLong();
+		marketFrontService.receivedLuckyDraw(userId, luckyDrawReq);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("领取成功");
+	}
+
+}

+ 3 - 3
netflix-web/src/main/java/com/cyksj/web/controller/market/SignFrontController.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.market.sign.UserPointsRecordMapper;
+import com.cyksj.model.entity.SignUser;
 import com.cyksj.model.entity.UserPointsRecord;
 import com.cyksj.model.views.SignUserView;
 import com.cyksj.service.market.MarketFrontService;
@@ -48,8 +49,7 @@ public class SignFrontController {
     @PostMapping("/post")
     public Result<Integer> sign() {
         Long userId = StpUserUtil.getLoginIdAsLong();
-        Integer dayPeriod = marketFrontService.signByUserId(userId);
-        return GatewayResponse.SUCCESS.newBuilder().setMsg("签到成功").toResult(dayPeriod);
+        SignUser signUser = marketFrontService.signByUserId(userId);
+        return GatewayResponse.SUCCESS.newBuilder().setMsg("签到成功").toResult(signUser.getDayPeriod());
     }
-
 }

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

@@ -0,0 +1,129 @@
+package com.cyksj.web.controller.market;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.annotation.NoSubmit;
+import com.cyksj.common.constant.TaskTypeEnum;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.market.task.TaskTypeMapper;
+import com.cyksj.mapper.market.task.UserBindPhoneMapper;
+import com.cyksj.model.entity.TaskType;
+import com.cyksj.model.entity.UserBindPhone;
+import com.cyksj.model.request.LoginPhoneReq;
+import com.cyksj.model.views.TaskFrontView;
+import com.cyksj.service.market.MarketFrontService;
+import com.cyksj.service.market.task.TaskService;
+import com.cyksj.service.phone.PhoneCodeService;
+import com.cyksj.web.util.StpUserUtil;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+/*
+ *项目名: netflix
+ *文件名: TaskFrontController
+ *创建者: JavaZou
+ *创建时间:2022/12/28 13:51
+ */
+@RestController
+@RequestMapping("/applets/market/task")
+@RequiredArgsConstructor
+public class TaskFrontController {
+
+	private final BeanSearcher beanSearcher;
+
+	private final MarketFrontService marketFrontService;
+
+	private final HttpServletRequest request;
+
+	private final UserBindPhoneMapper userBindPhoneMapper;
+
+	private final PhoneCodeService phoneCodeService;
+
+	private final TaskService taskService;
+
+	private final TaskTypeMapper taskTypeMapper;
+
+	/**
+	 * 任务列表
+	 */
+	@GetMapping("/get")
+	public Result<SearchResult<TaskFrontView>> getTask(HttpServletRequest request) {
+		Long userId = StpUserUtil.getLoginIdAsLong();
+		SearchResult<TaskFrontView> search = beanSearcher.search(TaskFrontView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		search.getDataList().forEach(data -> {
+			marketFrontService.updateTaskStatus(data, userId);
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 领取任务积分
+	 */
+	@PostMapping("/post/points/{taskId}")
+	@NoSubmit
+	public Result<String> getTaskPoints(@PathVariable Long taskId) {
+		Long userId = StpUserUtil.getLoginIdAsLong();
+		marketFrontService.receivedTaskPoints(userId, taskId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("领取成功");
+	}
+
+	/**
+	 * 绑定手机号
+	 */
+	@PostMapping("/bind/phone")
+	@NoSubmit
+	public Result<String> bindPhone(@RequestBody LoginPhoneReq phoneReq) {
+		Long userId = StpUserUtil.getLoginIdAsLong();
+		UserBindPhone bindPhone = userBindPhoneMapper.selectOne(Wrappers.lambdaQuery(UserBindPhone.class)
+				.eq(UserBindPhone::getUserId, userId).last("limit 1"));
+		if (bindPhone != null) {
+			throw BusinessRuntimeException.getInstance("您已绑定手机号");
+		}
+		//校验
+		phoneCodeService.checkPhone(phoneReq.getPhone(), phoneReq.getCode());
+		UserBindPhone userBindPhone = new UserBindPhone();
+		userBindPhone.setUserId(userId);
+		userBindPhone.setPhone(phoneReq.getPhone());
+		try {
+			userBindPhoneMapper.insert(userBindPhone);
+		} catch (DuplicateKeyException e) {
+
+		}
+		TaskType taskType = taskTypeMapper.selectOne(Wrappers.lambdaQuery(TaskType.class)
+				.eq(TaskType::getName, TaskTypeEnum.bind_phone.getDesc()).last("limit 1"));
+		//完成任务
+		taskService.completeTask(taskType, userId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("绑定手机号成功");
+	}
+
+	/**
+	 * 修改手机号
+	 */
+	@PutMapping("/put/bind/phone")
+	public Result<String> updateBindPhone(@RequestBody LoginPhoneReq phoneReq) {
+		Long userId = StpUserUtil.getLoginIdAsLong();
+		UserBindPhone bindPhone = userBindPhoneMapper.selectOne(Wrappers.lambdaQuery(UserBindPhone.class)
+				.eq(UserBindPhone::getUserId, userId).last("limit 1"));
+		if (bindPhone == null) {
+			throw BusinessRuntimeException.getInstance("您未绑定手机号");
+		}
+		boolean flag = bindPhone.getPhone().equals(phoneReq.getOldPhone());
+		if (!flag) {
+			throw BusinessRuntimeException.getInstance("原手机号错误");
+		}
+		if (phoneReq.getOldPhone().equals(phoneReq.getPhone())) {
+			throw BusinessRuntimeException.getInstance("前后两次手机号相同");
+		}
+		phoneCodeService.checkPhone(phoneReq.getPhone(), phoneReq.getCode());
+		bindPhone.setPhone(phoneReq.getPhone());
+		userBindPhoneMapper.updateById(bindPhone);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("更换手机号成功");
+	}
+}

+ 11 - 0
netflix-web/src/main/java/com/cyksj/web/controller/user/AuthorizationController.java

@@ -8,6 +8,7 @@ import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.EnvCommonService;
+import com.cyksj.common.constant.TaskTypeEnum;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.snowflake.Sequence;
 import com.cyksj.common.util.Codec;
@@ -20,17 +21,20 @@ import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.PhoneCodeMapper;
 import com.cyksj.mapper.WxAppMapper;
 import com.cyksj.mapper.manage.distribute.UserDistributeSharedMapper;
+import com.cyksj.mapper.market.task.TaskTypeMapper;
 import com.cyksj.model.dto.AuthRedirect;
 import com.cyksj.model.dto.AuthToken;
 import com.cyksj.model.dto.GzhOAuth2UserInfo;
 import com.cyksj.model.dto.JsSdkTicket;
 import com.cyksj.model.entity.PhoneCode;
+import com.cyksj.model.entity.TaskType;
 import com.cyksj.model.entity.User;
 import com.cyksj.model.entity.UserDistributeShared;
 import com.cyksj.model.request.LoginPhoneReq;
 import com.cyksj.model.response.LoginPhoneRep;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.authorization.AuthorizationService;
+import com.cyksj.service.market.task.TaskService;
 import com.cyksj.service.order.OrderDonService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.service.wechat.WeChatService;
@@ -88,6 +92,10 @@ public class AuthorizationController {
 
     private final UserDistributeSharedMapper userDistributeSharedMapper;
 
+    private final TaskService taskService;
+
+    private final TaskTypeMapper taskTypeMapper;
+
     @GetMapping(value = "/weChat")
     public void base(String url,Long sharedId, String authType, HttpServletResponse response) throws Exception {
 
@@ -331,6 +339,9 @@ public class AuthorizationController {
             userDistributeShared.setUserId(user.getId());
             try {
                 userDistributeSharedMapper.insert(userDistributeShared);
+                TaskType taskType = taskTypeMapper.selectOne(Wrappers.lambdaQuery(TaskType.class)
+                        .eq(TaskType::getName, TaskTypeEnum.share.getDesc()).last("limit 1"));
+                taskService.completeTask(taskType, sharedId);
             } catch (DuplicateKeyException e) {
                 log.info("分销被邀请人重复插入");
             }

+ 55 - 0
netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java

@@ -1,15 +1,29 @@
 package com.cyksj.web.controller.user;
 
+import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.OrderDonMapper;
+import com.cyksj.mapper.manage.coupon.CouponUserMapper;
+import com.cyksj.mapper.market.task.UserBindPhoneMapper;
 import com.cyksj.model.dto.UserWhoami;
+import com.cyksj.model.entity.CouponUser;
+import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.entity.User;
+import com.cyksj.model.entity.UserBindPhone;
 import com.cyksj.model.request.ExchangeCodeTicket;
+import com.cyksj.model.views.RenewalView;
+import com.cyksj.model.views.UserPersonalView;
 import com.cyksj.service.exchange.ExchangeCodeService;
+import com.cyksj.service.relation.GroupRelationFrontService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.web.util.StpUserUtil;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * @author chan
  * @date 2021/10/11 下午11:05
@@ -23,7 +37,13 @@ public class UserController {
 
     private final ExchangeCodeService exchangeCodeService;
 
+    private final GroupRelationFrontService groupRelationFrontService;
+
+    private final CouponUserMapper couponUserMapper;
 
+    private final OrderDonMapper orderDonMapper;
+
+    private final UserBindPhoneMapper userBindPhoneMapper;
 
     @GetMapping(value = "/wx/whoami")
     public Result<UserWhoami> whoami(){
@@ -43,4 +63,39 @@ public class UserController {
         return exchangeCodeService.getTicketByExchangeCode(exchangeCodeTicket, userId);
     }
 
+    /**
+     * 个人中心详情
+     */
+    @GetMapping("/personal")
+    public Result<UserPersonalView> getPersonalView() {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        List<RenewalView> ticket = groupRelationFrontService.getMyTicket(userId);
+        UserPersonalView personalView = new UserPersonalView();
+        DateTime now = DateTime.now();
+        //车票
+        personalView.setNumOfTickets(ticket.size());
+        //优惠券
+        Integer couponSize = couponUserMapper.selectCount(Wrappers.lambdaQuery(CouponUser.class)
+                .eq(CouponUser::getUserId, userId)
+                .eq(CouponUser::getStatus, CouponUser.Status.unused)
+                .le(CouponUser::getValidStartTime, now)
+                .gt(CouponUser::getValidEndTime, now));
+        personalView.setNumOfCoupons(couponSize);
+        //积分
+        User user = userService.getById(userId);
+        personalView.setActivePoints(user.getActivePoints());
+        //推广积分
+        personalView.setPopularizePoints(user.getPoints());
+        OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
+                .eq(OrderDon::getUserId, userId)
+                .eq(OrderDon::getStatus, OrderDon.Status.noPayment).last("limit 1"));
+        personalView.setIsNoPayment(orderDon != null ? true : false);
+        UserBindPhone bindPhone = userBindPhoneMapper.selectOne(Wrappers.lambdaQuery(UserBindPhone.class)
+                .eq(UserBindPhone::getUserId, userId).last("limit 1"));
+        //手机号
+        if (bindPhone != null) {
+            personalView.setPhone(bindPhone.getPhone());
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult(personalView);
+    }
 }