瀏覽代碼

fix 签到、奖品设置、任务后台代码

zoujiajian 3 年之前
父節點
當前提交
33073c2dbd
共有 37 個文件被更改,包括 1399 次插入48 次删除
  1. 14 0
      netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
  2. 7 0
      netflix-common/src/main/java/com/cyksj/common/constant/PointsRecordConst.java
  3. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/manage/statistics/SignStatisticsDataMapper.java
  4. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/market/draw/LuckyDrawMapper.java
  5. 8 0
      netflix-dao/src/main/java/com/cyksj/mapper/market/sign/SignConfigMapper.java
  6. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/market/sign/SignUserMapper.java
  7. 32 0
      netflix-dao/src/main/java/com/cyksj/mapper/market/sign/UserPointsRecordMapper.java
  8. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/market/task/TaskMapper.java
  9. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/market/task/TaskTypeMapper.java
  10. 60 0
      netflix-dao/src/main/java/com/cyksj/model/entity/LuckyDraw.java
  11. 14 0
      netflix-dao/src/main/java/com/cyksj/model/entity/SignConfig.java
  12. 83 0
      netflix-dao/src/main/java/com/cyksj/model/entity/SignStatisticsData.java
  13. 21 0
      netflix-dao/src/main/java/com/cyksj/model/entity/SignUser.java
  14. 51 0
      netflix-dao/src/main/java/com/cyksj/model/entity/Task.java
  15. 16 0
      netflix-dao/src/main/java/com/cyksj/model/entity/TaskType.java
  16. 18 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserBindPhone.java
  17. 15 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserPointsRecord.java
  18. 16 1
      netflix-dao/src/main/java/com/cyksj/model/manage/views/UserView.java
  19. 6 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuView.java
  20. 70 0
      netflix-dao/src/main/java/com/cyksj/model/views/LuckyDrawView.java
  21. 19 0
      netflix-dao/src/main/java/com/cyksj/model/views/SignUserView.java
  22. 52 0
      netflix-dao/src/main/java/com/cyksj/model/views/TaskView.java
  23. 16 0
      netflix-service/src/main/java/com/cyksj/service/market/MarketFrontService.java
  24. 17 0
      netflix-service/src/main/java/com/cyksj/service/market/draw/LuckyDrawService.java
  25. 133 0
      netflix-service/src/main/java/com/cyksj/service/market/draw/impl/LuckyDrawServiceImpl.java
  26. 139 0
      netflix-service/src/main/java/com/cyksj/service/market/impl/MarketFrontServiceImpl.java
  27. 15 0
      netflix-service/src/main/java/com/cyksj/service/market/task/TaskService.java
  28. 77 0
      netflix-service/src/main/java/com/cyksj/service/market/task/impl/TaskServiceImpl.java
  29. 94 0
      netflix-service/src/main/java/com/cyksj/task/SignStatisticsDataScheduler.java
  30. 2 3
      netflix-service/src/main/java/com/cyksj/task/StatisticsDataScheduler.java
  31. 30 0
      netflix-web/src/main/java/com/cyksj/config/SaTokenConfigure.java
  32. 0 35
      netflix-web/src/main/java/com/cyksj/config/WebConfig.java
  33. 89 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/market/LuckyDrawController.java
  34. 46 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/market/SignController.java
  35. 99 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/market/TaskController.java
  36. 20 9
      netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java
  37. 55 0
      netflix-web/src/main/java/com/cyksj/web/controller/market/SignFrontController.java

+ 14 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -0,0 +1,14 @@
+package com.cyksj.common.constant;
+
+/*
+ *项目名: netflix
+ *文件名: Constant
+ *创建者: JavaZou
+ *创建时间:2022/12/27 18:30
+ */
+public interface Constant {
+	/**
+	 * 一天秒数
+	 */
+	Long DAY_MILLS = 86400000l;
+}

+ 7 - 0
netflix-common/src/main/java/com/cyksj/common/constant/PointsRecordConst.java

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

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/statistics/SignStatisticsDataMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage.statistics;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.SignStatisticsData;
+
+/*
+ *项目名: netflix
+ *文件名: SignStatisticsDataMapper
+ *创建者: JavaZou
+ *创建时间:2022/12/27 18:23
+ */
+public interface SignStatisticsDataMapper extends BaseMapper<SignStatisticsData> {
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/market/draw/LuckyDrawMapper.java

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

+ 8 - 0
netflix-dao/src/main/java/com/cyksj/mapper/market/sign/SignConfigMapper.java

@@ -0,0 +1,8 @@
+package com.cyksj.mapper.market.sign;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.SignConfig;
+
+public interface SignConfigMapper extends BaseMapper<SignConfig> {
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/market/sign/SignUserMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.market.sign;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.SignUser;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.Date;
+
+public interface SignUserMapper extends BaseMapper<SignUser> {
+    @Update("update sign_user set day = #{day}, day_period = #{dayPeriod} where user_id = #{userId} and update_time = #{originalTime}")
+    Integer updateUserSignDay(@Param("day") Integer day, @Param("dayPeriod") Integer dayPeriod, @Param("userId") Long userId, @Param("originalTime") Date originalTime);
+}

+ 32 - 0
netflix-dao/src/main/java/com/cyksj/mapper/market/sign/UserPointsRecordMapper.java

@@ -0,0 +1,32 @@
+package com.cyksj.mapper.market.sign;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserPointsRecord;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.Date;
+
+public interface UserPointsRecordMapper extends BaseMapper<UserPointsRecord> {
+	@Update("update user set active_points = active_points + #{points} where id = #{userId}")
+	void updateUserPoints(@Param("userId") Long userId, @Param("points") Integer points);
+
+	@Select("select sum(points) from user_points_record ur where created_time between #{yesZeroDate} and #{thisZeroDate} and points > 0")
+	Integer getTodayNumOfPoints(@Param("yesZeroDate") Date yesZeroDate, @Param("thisZeroDate") Date thisZeroDate);
+
+	@Select("select sum(points) from user_points_record ur where points > 0")
+	Integer getSumOfPoints();
+
+	@Select("select sum(points) from user_points_record ur where created_time between #{yesZeroDate} and #{thisZeroDate} and points < 0")
+	Integer getTodayUseOfPoints(@Param("yesZeroDate") Date yesZeroDate, @Param("thisZeroDate") Date thisZeroDate);
+
+	@Select("select sum(points) from user_points_record ur where points < 0")
+	Integer getSumUseOfPoints();
+
+	@Select("select count(*) from user_points_record ur where created_time between #{yesZeroDate} and #{thisZeroDate} and points < 0 and remark = #{remark}")
+	Integer getTodayNumOfLottery(@Param("remark") String remark, @Param("yesZeroDate") Date yesZeroDate, @Param("thisZeroDate") Date thisZeroDate);
+
+	@Select("select count(*) from sign_user where update_time between #{yesZeroDate} and #{thisZeroDate} and day_period = #{dayPeriod}")
+	Integer getSignDayByCondition(@Param("dayPeriod") Integer dayPeriod, @Param("yesZeroDate") Date yesZeroDate, @Param("thisZeroDate") Date thisZeroDate);
+}

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

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

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

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

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

@@ -0,0 +1,60 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: LuckyDraw
+ *创建者: JavaZou
+ *创建时间:2022/12/27 15:57
+ */
+@Getter
+@Setter
+public class LuckyDraw extends BaseEntity {
+	@NotNull(message = "类型不能为空")
+	private Type type;
+
+	@NotEmpty(message = "奖品名称不能为空")
+	private String name;
+
+	private Integer points;
+
+	private Long couponId;
+
+	private Long goodsId;
+
+	private Long skuId;
+
+	private Integer cost;
+
+	@NotEmpty(message = "奖品位置不能为空")
+	private String position;
+
+	@NotNull(message = "概率不能为空")
+	private BigDecimal probability;
+
+	private String picture;
+
+	private Boolean status;
+
+	private Boolean deleted;
+
+	@Getter
+	public enum Type {
+		points("积分"),
+		coupon("优惠券"),
+		realGoods("实物"),
+		virtualGoods("虚物"),
+		;
+		String desc;
+
+		Type(String desc) {
+			this.desc = desc;
+		}
+	}
+}

+ 14 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/SignConfig.java

@@ -0,0 +1,14 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class SignConfig extends BaseEntity{
+    private String type;
+
+    private Integer minPoints;
+
+    private Integer maxPoints;
+}

+ 83 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/SignStatisticsData.java

@@ -0,0 +1,83 @@
+package com.cyksj.model.entity;
+
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: SignStatisticsData
+ *创建者: JavaZou
+ *创建时间:2022/12/27 18:19
+ */
+@Getter
+@Setter
+@SearchBean(tables = "sign_statistics_data")
+public class SignStatisticsData extends BaseEntity {
+	/**
+	 * 今日签到人数
+	 */
+	private Integer todayNumOfSign;
+
+	/**
+	 * 今日发放积分
+	 */
+	private Integer todayNumOfPoints;
+
+	/**
+	 * 累计发放积分
+	 */
+	private Integer sumOfPoints;
+
+	/**
+	 * 今日使用积分
+	 */
+	private Integer todayUseOfPoints;
+
+	/**
+	 * 累计使用积分
+	 */
+	private Integer sumUseOfPoints;
+
+	/**
+	 * 今日抽奖次数
+	 */
+	private Integer todayNumOfLottery;
+
+	/**
+	 * 连签2天
+	 */
+	private Integer t2;
+
+	/**
+	 * 连签3天
+	 */
+	private Integer t3;
+
+	/**
+	 * 连签4天
+	 */
+	private Integer t4;
+
+	/**
+	 * 连签5天
+	 */
+	private Integer t5;
+
+	/**
+	 * 连签6天
+	 */
+	private Integer t6;
+
+	/**
+	 * 连签7天
+	 */
+	private Integer t7;
+
+	/**
+	 * 统计日期
+	 */
+	private Date statisticsDate;
+}

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

@@ -0,0 +1,21 @@
+package com.cyksj.model.entity;
+
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class SignUser extends BaseEntity{
+    private Long userId;
+
+    /**
+     * 签到天数
+     */
+    private Integer day;
+
+    /**
+     * 周期签到天数(7天)
+     */
+    private Integer dayPeriod;
+}

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

@@ -0,0 +1,51 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+/*
+ *项目名: netflix
+ *文件名: Task
+ *创建者: JavaZou
+ *创建时间:2022/12/27 13:36
+ */
+@Getter
+@Setter
+public class Task extends BaseEntity{
+	@NotEmpty(message = "任务名称不能为空")
+	private String name;
+
+	/**
+	 * 类型id
+	 */
+	@NotNull(message = "类型不能为空")
+	private Long typeId;
+
+	private String description;
+
+	/**
+	 * 任务时限 time,day,week
+	 */
+	@NotEmpty(message = "任务时限不能为空")
+	private String taskLimit;
+
+	private Long couponId;
+
+	/**
+	 * 邀请人数
+	 */
+	private Integer inviteNum;
+
+	/**
+	 * 积分
+	 */
+	@NotNull(message = "积分不能为空")
+	@Min(value = 1)
+	private Integer points;
+
+	private Boolean deleted;
+}

+ 16 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/TaskType.java

@@ -0,0 +1,16 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: TaskType
+ *创建者: JavaZou
+ *创建时间:2022/12/27 13:35
+ */
+@Getter
+@Setter
+public class TaskType extends BaseEntity{
+	private String name;
+}

+ 18 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserBindPhone.java

@@ -0,0 +1,18 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: UserBindPhone
+ *创建者: JavaZou
+ *创建时间:2022/12/27 13:39
+ */
+@Getter
+@Setter
+public class UserBindPhone extends BaseEntity{
+	private Long userId;
+
+	private String phone;
+}

+ 15 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserPointsRecord.java

@@ -0,0 +1,15 @@
+package com.cyksj.model.entity;
+
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class UserPointsRecord extends BaseEntity{
+    private Long userId;
+
+    private Integer points;
+
+    private String remark;
+}

+ 16 - 1
netflix-dao/src/main/java/com/cyksj/model/manage/views/UserView.java

@@ -6,6 +6,9 @@ import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
+import java.util.Date;
+
 /**
  * @author chan
  * @date 2022/10/12 2:31 PM
@@ -49,7 +52,13 @@ public class UserView {
      * 积分
      */
     @DbField("u.points")
-    private Integer points;
+    private BigDecimal points;
+
+    /**
+     * 活跃抽奖积分
+     */
+    @DbField("u.active_points")
+    private BigDecimal activePoints;
 
     /**
      * 账户数
@@ -63,6 +72,12 @@ public class UserView {
     @DbField("usd.shared_id")
     private Long sharedId;
 
+    /**
+     * 创建时间
+     */
+    @DbField("u.created_time")
+    private Date createdTime;
+
     /**
      * 邀请人名称
      */

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuView.java

@@ -34,4 +34,10 @@ public class GoodsDonSkuView {
 
 	@DbField("gdk.price")
 	private BigDecimal money;
+
+	@DbField("gd.status")
+	private Boolean goodsDonStatus;
+
+	@DbField("gdk.status")
+	private Boolean goodsDonSkuStatus;
 }

+ 70 - 0
netflix-dao/src/main/java/com/cyksj/model/views/LuckyDrawView.java

@@ -0,0 +1,70 @@
+package com.cyksj.model.views;
+
+import com.cyksj.model.entity.LuckyDraw;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/*
+ *项目名: netflix
+ *文件名: LuckyDrawView
+ *创建者: JavaZou
+ *创建时间:2022/12/27 16:35
+ */
+@Getter
+@Setter
+@SearchBean(tables = "lucky_draw ld",
+where = "ld.deleted is true")
+public class LuckyDrawView {
+	@DbField("ld.id")
+	private Long id;
+
+	@DbField("ld.type")
+	private LuckyDraw.Type type;
+
+	@DbField("ld.name")
+	private String name;
+
+	@DbField("ld.points")
+	private Integer points;
+
+	@DbField("ld.coupon_id")
+	private Long couponId;
+
+	@DbField("ld.goods_id")
+	private Long goodsId;
+
+	@DbField("ld.sku_id")
+	private Long skuId;
+
+	@DbField("ld.cost")
+	private Integer cost;
+
+	@DbField("ld.position")
+	private String position;
+
+	@DbField("ld.probability")
+	private BigDecimal probability;
+
+	@DbField("ld.picture")
+	private String picture;
+
+	@DbField("ld.status")
+	private Boolean status;
+
+	/**
+	 * 中奖人数
+	 */
+	@DbIgnore
+	private Integer LotteryNum;
+
+	/**
+	 * 中奖次数
+	 */
+	@DbIgnore
+	private Integer LotteryCount;
+}

+ 19 - 0
netflix-dao/src/main/java/com/cyksj/model/views/SignUserView.java

@@ -0,0 +1,19 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class SignUserView {
+    private Long userId;
+
+    private Integer day;
+
+    private Integer dayPeriod;
+
+    /**
+     * 是否已签 false未签
+     */
+    private Boolean isCheckIn;
+}

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

@@ -0,0 +1,52 @@
+package com.cyksj.model.views;
+
+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
+ *文件名: TaskView
+ *创建者: JavaZou
+ *创建时间:2022/12/27 15:35
+ */
+@Getter
+@Setter
+@SearchBean(tables = "task t left join task_type tt on tt.id = t.type_id",
+where = "t.deleted is true")
+public class TaskView {
+	@DbField("t.id")
+	private Long id;
+
+	/**
+	 * 类型id
+	 */
+	@DbField("tt.id")
+	private Long typeId;
+
+	@DbField("t.name")
+	private String name;
+
+	@DbField("tt.name")
+	private String typeName;
+
+	@DbField("t.description")
+	private String description;
+
+	@DbField("t.task_limit")
+	private String taskLimit;
+
+	@DbIgnore
+	private Integer todayCompleteNum;
+
+	@DbIgnore
+	private Integer sumCompleteNum;
+
+	@DbIgnore
+	private Integer todayPoints;
+
+	@DbIgnore
+	private Integer sumPoints;
+}

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

@@ -0,0 +1,16 @@
+package com.cyksj.service.market;
+
+
+import com.cyksj.model.entity.SignUser;
+import com.cyksj.model.views.SignUserView;
+
+public interface MarketFrontService {
+    Integer signByUserId(Long userId);
+
+    SignUserView getUserSignDetail(Long userId);
+
+    /**
+     * 记录积分明细,发放积分
+     */
+    void pointsRecord(Long userId, Integer points, String remark);
+}

+ 17 - 0
netflix-service/src/main/java/com/cyksj/service/market/draw/LuckyDrawService.java

@@ -0,0 +1,17 @@
+package com.cyksj.service.market.draw;
+
+import com.cyksj.model.entity.LuckyDraw;
+
+/*
+ *项目名: netflix
+ *文件名: LuckyDrawService
+ *创建者: JavaZou
+ *创建时间:2022/12/27 16:04
+ */
+public interface LuckyDrawService {
+	void saveLuckyDraw(LuckyDraw luckyDraw) throws Exception;
+
+	void putStatus(Long id) throws Exception;
+
+	void updateLuckyDraw(LuckyDraw luckyDraw) throws Exception;
+}

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

@@ -0,0 +1,133 @@
+package com.cyksj.service.market.draw.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.mapper.manage.coupon.CouponMapper;
+import com.cyksj.mapper.market.draw.LuckyDrawMapper;
+import com.cyksj.model.entity.Coupon;
+import com.cyksj.model.entity.LuckyDraw;
+import com.cyksj.model.views.GoodsDonSkuView;
+import com.cyksj.service.market.draw.LuckyDrawService;
+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.HashSet;
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: LuckyDrawServiceImpl
+ *创建者: JavaZou
+ *创建时间:2022/12/27 16:05
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class LuckyDrawServiceImpl implements LuckyDrawService {
+	private final LuckyDrawMapper luckyDrawMapper;
+
+	private final CouponMapper couponMapper;
+
+	private final BeanSearcher beanSearcher;
+
+	@Override
+	public void saveLuckyDraw(LuckyDraw luckyDraw) throws Exception {
+		//校验参数
+		checkLuckyDraw(luckyDraw);
+		luckyDrawMapper.insert(luckyDraw);
+	}
+
+	@Override
+	public void putStatus(Long id) throws Exception {
+		LuckyDraw luckyDraw = luckyDrawMapper.selectById(id);
+		if (luckyDraw == null || !luckyDraw.getDeleted()) {
+			throw BusinessRuntimeException.getInstance("该奖品已不存在");
+		}
+		if (!luckyDraw.getStatus()) {
+			//剔除相同位置的奖品
+			changeLuckyDrawIndex(luckyDraw);
+		}
+		luckyDraw.setStatus(!luckyDraw.getStatus());
+		luckyDrawMapper.updateById(luckyDraw);
+	}
+
+	@Override
+	public void updateLuckyDraw(LuckyDraw luckyDraw) throws Exception {
+		if (luckyDraw.getId() == null || luckyDraw.getId() < 1) {
+			throw BusinessRuntimeException.getInstance("奖品id为空");
+		}
+		LuckyDraw entity = luckyDrawMapper.selectById(luckyDraw.getId());
+		if (entity == null || !entity.getDeleted()) {
+			throw BusinessRuntimeException.getInstance("该奖品已不存在");
+		}
+		if (entity.getStatus()) {
+			changeLuckyDrawIndex(entity);
+		}
+		BeanUtil.copyProperties(luckyDraw, entity);
+		//校验参数
+		checkLuckyDraw((entity));
+		luckyDrawMapper.updateById(entity);
+	}
+
+	public void checkLuckyDraw(LuckyDraw luckyDraw) throws Exception {
+		HashSet<Integer> set = Jsons.parseObject(luckyDraw.getPosition(), HashSet.class);
+		for (Integer index : set) {
+			if (index < 1 || index > 9) {
+				throw BusinessRuntimeException.getInstance("奖品位置错误");
+			}
+		}
+		luckyDraw.setPosition(set.toString());
+		if (luckyDraw.getType() == LuckyDraw.Type.coupon) {
+			//优惠券是否存在
+			if (luckyDraw.getCouponId() == null || luckyDraw.getCouponId() < 1) {
+				throw BusinessRuntimeException.getInstance("选择的优惠券不存在");
+			}
+			Long couponId = luckyDraw.getCouponId();
+			Coupon coupon = couponMapper.selectById(couponId);
+			if (coupon == null) {
+				throw BusinessRuntimeException.getInstance("选择的优惠券不存在");
+			}
+		} else if (luckyDraw.getType() == LuckyDraw.Type.points) {
+			if (luckyDraw.getPoints() == null || luckyDraw.getPoints() < 0) {
+				throw BusinessRuntimeException.getInstance("积分为空");
+			}
+		} else {
+			GoodsDonSkuView goodsDonSkuView = beanSearcher.searchFirst(GoodsDonSkuView.class, MapUtils.builder()
+					.field(GoodsDonSkuView::getGoodsId, luckyDraw.getGoodsId()).op(Operator.Equal)
+					.field(GoodsDonSkuView::getSkuId, luckyDraw.getSkuId()).op(Operator.Equal)
+					.field(GoodsDonSkuView::getGoodsDonStatus, true).op(Operator.Equal)
+					.field(GoodsDonSkuView::getGoodsDonSkuStatus, true).op(Operator.Equal).build());
+			if (goodsDonSkuView == null) {
+				throw BusinessRuntimeException.getInstance("所选平台或规格 不存在或已下架");
+			}
+		}
+	}
+
+	public void changeLuckyDrawIndex(LuckyDraw entity) throws Exception {
+		//先找出所有已上架的商品
+		List<LuckyDraw> luckyDraws = luckyDrawMapper.selectList(Wrappers.lambdaQuery(LuckyDraw.class)
+				.eq(LuckyDraw::getStatus, true)
+				.ne(LuckyDraw::getId, entity.getId()));
+		List<Integer> self = Jsons.parseList(entity.getPosition(), Integer.class);
+		for (LuckyDraw luckyDraw : luckyDraws) {
+			List<Integer> list = Jsons.parseList(luckyDraw.getPosition(), Integer.class);
+			for (Integer selfIndex : self) {
+				if (list.contains(selfIndex)) {
+					if (list.size() == 1) {
+						luckyDraw.setStatus(false);
+					} else {
+						list.removeIf(i -> i.equals(selfIndex));
+						luckyDraw.setPosition(list.toString());
+					}
+					luckyDrawMapper.updateById(luckyDraw);
+				}
+			}
+		}
+	}
+}

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

@@ -0,0 +1,139 @@
+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.toolkit.Wrappers;
+import com.cyksj.common.constant.PointsRecordConst;
+import com.cyksj.common.exception.BusinessRuntimeException;
+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.model.views.SignUserView;
+import com.cyksj.service.market.MarketFrontService;
+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 java.sql.Wrapper;
+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)) {
+//            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);
+        }
+    }
+}

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

@@ -0,0 +1,15 @@
+package com.cyksj.service.market.task;
+
+import com.cyksj.model.entity.Task;
+
+/*
+ *项目名: netflix
+ *文件名: TaskService
+ *创建者: JavaZou
+ *创建时间:2022/12/27 15:17
+ */
+public interface TaskService {
+	void saveTask(Task task);
+
+	void updateTask(Task task);
+}

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

@@ -0,0 +1,77 @@
+package com.cyksj.service.market.task.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.mapper.market.task.TaskMapper;
+import com.cyksj.mapper.market.task.TaskTypeMapper;
+import com.cyksj.model.entity.Task;
+import com.cyksj.model.entity.TaskType;
+import com.cyksj.service.market.task.TaskService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: TaskServiceImpl
+ *创建者: JavaZou
+ *创建时间:2022/12/27 15:17
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class TaskServiceImpl implements TaskService {
+
+	public static List<String> times = List.of("添加企业微信", "绑定手机号");
+
+	private final TaskTypeMapper taskTypeMapper;
+
+	private final TaskMapper taskMapper;
+
+	@Override
+	public void saveTask(Task task) {
+		checkTask(task);
+		taskMapper.insert(task);
+	}
+
+	@Override
+	public void updateTask(Task task) {
+		Task db = taskMapper.selectById(task.getId());
+		if (db == null || !db.getDeleted()) {
+			throw BusinessRuntimeException.getInstance("该任务已不存在");
+		}
+		BeanUtil.copyProperties(task, db);
+		checkTask(db);
+		taskMapper.updateById(db);
+	}
+
+
+	public void checkTask(Task task) {
+		Long typeId = task.getTypeId();
+		TaskType taskType = taskTypeMapper.selectById(typeId);
+		if (times.contains(taskType.getName())) {
+			if (!"time".equals(task.getTaskLimit())) {
+				throw BusinessRuntimeException.getInstance("该任务类型只能为一次性");
+			}
+		}
+		if ("邀请好友".equals(taskType.getName())) {
+			if (task.getInviteNum() == null || task.getInviteNum() < 1) {
+				throw BusinessRuntimeException.getInstance("邀请人数错误");
+			}
+		}
+		LambdaQueryWrapper<Task> wrapper = Wrappers.lambdaQuery(Task.class)
+				.eq(Task::getTypeId, typeId)
+				.eq(Task::getDeleted, true).last("limit 1");
+		if (task.getId() != null) {
+			wrapper.ne(Task::getId, task.getId());
+		}
+		Task selectOne = taskMapper.selectOne(wrapper);
+		if (selectOne != null) {
+			throw BusinessRuntimeException.getInstance("已新增对应的任务");
+		}
+	}
+}

+ 94 - 0
netflix-service/src/main/java/com/cyksj/task/SignStatisticsDataScheduler.java

@@ -0,0 +1,94 @@
+package com.cyksj.task;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.constant.Constant;
+import com.cyksj.common.constant.PointsRecordConst;
+import com.cyksj.mapper.manage.statistics.SignStatisticsDataMapper;
+import com.cyksj.mapper.market.sign.SignUserMapper;
+import com.cyksj.mapper.market.sign.UserPointsRecordMapper;
+import com.cyksj.model.entity.SignStatisticsData;
+import com.cyksj.model.entity.SignUser;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: SignStatisticsDataScheduler
+ *创建者: JavaZou
+ *创建时间:2022/12/27 18:27
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class SignStatisticsDataScheduler {
+	private final SignStatisticsDataMapper signStatisticsDataMapper;
+
+	private final UserPointsRecordMapper userPointsRecordMapper;
+
+	private final SignUserMapper signUserMapper;
+
+	@Scheduled(cron = "0 0 0 * * ?")
+	public void signStatisticsData() {
+		Date thisZeroDate = DateUtil.beginOfDay(DateTime.now());
+		Date yesZeroDate = DateTime.of(thisZeroDate.getTime() - Constant.DAY_MILLS);
+		SignStatisticsData signStatisticsData = new SignStatisticsData();
+		//今日签到人数
+		Integer todayNumOfSign = signUserMapper.selectCount(Wrappers.lambdaQuery(SignUser.class)
+				.between(SignUser::getUpdateTime, yesZeroDate, thisZeroDate));
+		signStatisticsData.setTodayNumOfSign(todayNumOfSign);
+
+		//今日发放积分
+		Integer todayNumOfPoints = userPointsRecordMapper.getTodayNumOfPoints(yesZeroDate, thisZeroDate);
+
+		signStatisticsData.setTodayNumOfPoints(todayNumOfPoints);
+
+		//累计发放积分
+		Integer sumOfPoints = userPointsRecordMapper.getSumOfPoints();
+
+		signStatisticsData.setSumOfPoints(sumOfPoints);
+
+		//今日使用积分
+		Integer todayUseOfPoints = userPointsRecordMapper.getTodayUseOfPoints(yesZeroDate, thisZeroDate);
+		signStatisticsData.setTodayUseOfPoints(todayUseOfPoints);
+
+		//累计使用积分
+		Integer sumUseOfPoints = userPointsRecordMapper.getSumUseOfPoints();
+		signStatisticsData.setSumUseOfPoints(sumUseOfPoints);
+
+		//今日抽奖次数
+		Integer todayNumOfLottery = userPointsRecordMapper.getTodayNumOfLottery(PointsRecordConst.LOTTERY, yesZeroDate, thisZeroDate);
+		signStatisticsData.setTodayNumOfLottery(todayNumOfLottery);
+
+		//连签2天
+		Integer sign2Day = userPointsRecordMapper.getSignDayByCondition(2, yesZeroDate, thisZeroDate);
+		signStatisticsData.setT2(sign2Day);
+
+		//连签3天
+		Integer sign3Day = userPointsRecordMapper.getSignDayByCondition(3, yesZeroDate, thisZeroDate);
+		signStatisticsData.setT3(sign3Day);
+
+		//连签4天
+		Integer sign4Day = userPointsRecordMapper.getSignDayByCondition(4, yesZeroDate, thisZeroDate);
+		signStatisticsData.setT4(sign4Day);
+
+		//连签5天
+		Integer sign5Day = userPointsRecordMapper.getSignDayByCondition(5, yesZeroDate, thisZeroDate);
+		signStatisticsData.setT5(sign5Day);
+
+		//连签6天
+		Integer sign6Day = userPointsRecordMapper.getSignDayByCondition(6, yesZeroDate, thisZeroDate);
+		signStatisticsData.setT6(sign6Day);
+
+		//连签7天
+		Integer sign7Day = userPointsRecordMapper.getSignDayByCondition(7, yesZeroDate, thisZeroDate);
+		signStatisticsData.setT7(sign7Day);
+
+		signStatisticsData.setStatisticsDate(yesZeroDate);
+	}
+}

+ 2 - 3
netflix-service/src/main/java/com/cyksj/task/StatisticsDataScheduler.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.constant.Constant;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
 import com.cyksj.mapper.GoodsDonMapper;
 import com.cyksj.mapper.RegisterAccountDataMapper;
@@ -60,8 +61,6 @@ public class StatisticsDataScheduler {
 
 	private final static List<String> registerAccount = List.of("apple", "spotify", "google");
 
-	private static Long DAY_MILLS = 86400000l;
-
 	private final GoodsDonMapper goodsDonMapper;
 
 	private final RealGoodsDataMapper realGoodsDataMapper;
@@ -80,7 +79,7 @@ public class StatisticsDataScheduler {
 	@Scheduled(cron = "0 0 1 * * ?")
 	public void statisticsData() {
 		Date thisZeroDate = DateUtil.beginOfDay(DateTime.now());
-		Date yesZeroDate = DateTime.of(thisZeroDate.getTime() - DAY_MILLS);
+		Date yesZeroDate = DateTime.of(thisZeroDate.getTime() - Constant.DAY_MILLS);
 		//统计AppleOne数据
 		TASK_POOL.execute(() -> statisticsAppleOneData(yesZeroDate, thisZeroDate, false));
 		//统计流媒体账号数据

+ 30 - 0
netflix-web/src/main/java/com/cyksj/config/SaTokenConfigure.java

@@ -0,0 +1,30 @@
+package com.cyksj.config;
+
+import cn.dev33.satoken.interceptor.SaRouteInterceptor;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.util.List;
+
+/*
+ *项目名: yicang-admin
+ *文件名: SaTokenConfigure
+ *创建者: JavaZou
+ *创建时间:2022/12/19 10:01
+ */
+@Configuration
+public class SaTokenConfigure implements WebMvcConfigurer {
+	// 注册拦截器
+	@Override
+	public void addInterceptors(InterceptorRegistry registry) {
+		registry.addInterceptor(new SaRouteInterceptor())
+				.addPathPatterns(List.of("/manage/**", "/manager/**", "/sys/update", "/sys/delete/**"))
+				.excludePathPatterns(List.of("/manage/admin/login",
+						"/manage/admin/get/loginInfo",
+						"/manage/corp/**",
+						"/manage/coupon/corp/send",
+						"/manage/coupon",
+						"/manage/register/wx/refund/notify"));
+	}
+}

+ 0 - 35
netflix-web/src/main/java/com/cyksj/config/WebConfig.java

@@ -1,35 +0,0 @@
-package com.cyksj.config;
-
-import cn.dev33.satoken.interceptor.SaRouteInterceptor;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-import java.util.List;
-
-/*
- *项目名: yicang-admin
- *文件名: WebConfig
- *创建者: JavaZou
- *创建时间:2022/12/19 10:01
- */
-@Configuration
-public class WebConfig implements WebMvcConfigurer {
-
-	@Configuration
-	public class SaTokenConfigure implements WebMvcConfigurer {
-		// 注册拦截器
-		@Override
-		public void addInterceptors(InterceptorRegistry registry) {
-			registry.addInterceptor(new SaRouteInterceptor())
-					.addPathPatterns(List.of("/manage/**","/manager/**","/sys/update","/sys/delete/**"))
-					.excludePathPatterns(List.of("/manage/admin/login",
-							"/manage/admin/get/loginInfo",
-							"/manage/corp/**",
-							"/manage/coupon/corp/send",
-							"/manage/coupon",
-							"/manage/register/wx/refund/notify"));
-		}
-	}
-
-}

+ 89 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/market/LuckyDrawController.java

@@ -0,0 +1,89 @@
+package com.cyksj.web.controller.manage.market;
+
+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.model.entity.LuckyDraw;
+import com.cyksj.model.views.LuckyDrawView;
+import com.cyksj.service.market.draw.LuckyDrawService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+/*
+ *项目名: netflix
+ *文件名: LuckyDrawController
+ *创建者: JavaZou
+ *创建时间:2022/12/27 13:33
+ */
+@RestController
+@RequestMapping("/manage/market/luckyDraw")
+@RequiredArgsConstructor
+public class LuckyDrawController {
+	private final LuckyDrawService luckyDrawService;
+
+	private final LuckyDrawMapper luckyDrawMapper;
+
+	private final BeanSearcher beanSearcher;
+
+	/**
+	 * 新增抽奖奖品
+	 */
+	@PostMapping("/post")
+	public Result<String> saveLuckyDraw(@RequestBody @Validated LuckyDraw luckyDraw) throws Exception {
+		luckyDrawService.saveLuckyDraw(luckyDraw);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("新增奖品成功");
+	}
+
+	/**
+	 * 上下架奖品
+	 */
+	@PutMapping("/put/status/{id}")
+	public Result<String> putStatus(@PathVariable Long id) throws Exception {
+		luckyDrawService.putStatus(id);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("操作成功");
+	}
+
+	/**
+	 * 编辑奖品
+	 */
+	@PutMapping("/put")
+	public Result<String> updateLuckyDraw(@RequestBody LuckyDraw luckyDraw) throws Exception {
+		luckyDrawService.updateLuckyDraw(luckyDraw);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("操作成功");
+	}
+
+	/**
+	 * 删除奖品
+	 */
+	@DeleteMapping("/delete/{id}")
+	public Result<String> deleteLuckyDraw(@PathVariable Long id) {
+		LuckyDraw luckyDraw = luckyDrawMapper.selectById(id);
+		if (luckyDraw == null || !luckyDraw.getDeleted()) {
+			throw BusinessRuntimeException.getInstance("该奖品已不存在");
+		}
+		luckyDraw.setDeleted(!luckyDraw.getDeleted());
+		luckyDrawMapper.updateById(luckyDraw);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("删除奖品成功");
+	}
+
+	/**
+	 * 奖品列表
+	 */
+	@GetMapping("/get")
+	public Result<SearchResult<LuckyDrawView>> get(HttpServletRequest request) {
+		SearchResult<LuckyDrawView> search = beanSearcher.search(LuckyDrawView.class, MapUtils.flatBuilder(request.getParameterMap())
+				.build());
+		search.getDataList().forEach(data->{
+			data.setLotteryNum(1);
+			data.setLotteryCount(1);
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+}

+ 46 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/market/SignController.java

@@ -0,0 +1,46 @@
+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
+@RequestMapping("/manage/market/sign")
+@RequiredArgsConstructor
+public class SignController {
+    private final SignConfigMapper signConfigMapper;
+
+    /**
+     * 每日签到设置明细
+     */
+    @GetMapping("/get")
+    public Result<List<SignConfig>> getSign() {
+        return GatewayResponse.SUCCESS.newBuilder().toResult(signConfigMapper.selectList(Wrappers.lambdaQuery(SignConfig.class).orderByAsc(SignConfig::getId)));
+    }
+
+    /**
+     * 编辑每日签到设置
+     */
+    @PutMapping("/put")
+    public Result<String> getSign(@RequestBody SignConfig signConfig) {
+        if (signConfig.getId() == null || signConfig.getId() < 1) {
+            throw BusinessRuntimeException.getInstance("id为空");
+        }
+        signConfigMapper.updateById(signConfig);
+        return GatewayResponse.SUCCESS.newBuilder().toResult("编辑成功");
+    }
+}

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

@@ -0,0 +1,99 @@
+package com.cyksj.web.controller.manage.market;
+
+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.model.entity.Task;
+import com.cyksj.model.entity.TaskType;
+import com.cyksj.model.views.TaskView;
+import com.cyksj.service.market.task.TaskService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: TaskController
+ *创建者: JavaZou
+ *创建时间:2022/12/27 13:34
+ */
+@RestController
+@RequestMapping("/manage/market/task")
+@RequiredArgsConstructor
+public class TaskController {
+	private final TaskTypeMapper taskTypeMapper;
+
+	private final TaskMapper taskMapper;
+
+	private final TaskService taskService;
+
+	private final BeanSearcher beanSearcher;
+
+
+	/**
+	 * 任务分类列表
+	 */
+	@GetMapping("/get/type")
+	public Result<List<TaskType>> getType() {
+		return GatewayResponse.SUCCESS.newBuilder().toResult(taskTypeMapper.selectList(null));
+	}
+
+	/**
+	 * 新增任务
+	 */
+	@PostMapping("/post")
+	public Result<String> saveTask(@RequestBody @Validated Task task) {
+		taskService.saveTask(task);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("新增任务成功");
+	}
+
+	/**
+	 * 删除任务
+	 */
+	@DeleteMapping("/delete/{id}")
+	public Result<String> deleteTask(@PathVariable Long id) {
+		Task task = taskMapper.selectById(id);
+		if (task == null || !task.getDeleted()) {
+			throw BusinessRuntimeException.getInstance("该任务已不存在");
+		}
+		task.setDeleted(!task.getDeleted());
+		taskMapper.updateById(task);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("删除任务成功");
+	}
+
+	/**
+	 * 修改任务
+	 */
+	@PutMapping("/put")
+	public Result<String> updateTask(@RequestBody Task task) {
+		if (task.getId() == null || task.getId() < 1) {
+			throw BusinessRuntimeException.getInstance("任务id错误");
+		}
+		taskService.updateTask(task);
+		return GatewayResponse.SUCCESS.newBuilder().toResult("编辑任务成功");
+	}
+
+	/**
+	 * 任务列表
+	 */
+	@GetMapping("/get")
+	public Result<SearchResult<TaskView>> getTask(HttpServletRequest request) {
+		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);
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+}
+

+ 20 - 9
netflix-web/src/main/java/com/cyksj/web/controller/manage/statistics/StatisticsDataController.java

@@ -8,22 +8,21 @@ 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.stock.GoodsDonStockRecordMapper;
-import com.cyksj.model.entity.*;
-import com.cyksj.model.excel.ExcelAccountData;
-import com.cyksj.model.views.BackgroundDataView;
-import com.cyksj.model.views.ExpiredAccountDataView;
 import com.cyksj.mapper.GroupsRelationMapper;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.manage.CustomerServiceEveryMonthDetailMapper;
 import com.cyksj.mapper.manage.RealGoodsOrderHandleMapper;
 import com.cyksj.mapper.manage.statistics.IncrExpiryTimeRecordMapper;
+import com.cyksj.mapper.manage.statistics.SignStatisticsDataMapper;
 import com.cyksj.mapper.manage.statistics.StatisticsUserDataMapper;
+import com.cyksj.mapper.stock.GoodsDonStockRecordMapper;
+import com.cyksj.model.entity.*;
+import com.cyksj.model.excel.ExcelAccountData;
 import com.cyksj.model.request.RenewTimeUpReq;
 import com.cyksj.model.views.*;
 import com.cyksj.service.mange.statistics.StatisticsDataService;
-import com.cyksj.web.util.EasyExcelUtils;
 import com.cyksj.task.OrderCustomerHandleScheduler;
+import com.cyksj.web.util.EasyExcelUtils;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.param.Operator;
@@ -33,13 +32,14 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.*;
-
-import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /*
@@ -72,6 +72,8 @@ public class StatisticsDataController {
 
 	private final GoodsDonStockRecordMapper stockRecordMapper;
 
+	private final SignStatisticsDataMapper signStatisticsDataMapper;
+
 	/**
 	 * 查询统计数据
 	 */
@@ -279,4 +281,13 @@ public class StatisticsDataController {
 		EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, StatisticsStockView.class, res, "库存统计", "库存统计", ExcelTypeEnum.XLSX, null);
 
 	}
+
+	/**
+	 * 签到以及积分数据统计
+	 */
+	@GetMapping("/get/sign")
+	public Result<SearchResult<SignStatisticsData>> getSign(HttpServletRequest request) {
+		SearchResult<SignStatisticsData> search = beanSearcher.search(SignStatisticsData.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
 }

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

@@ -0,0 +1,55 @@
+package com.cyksj.web.controller.market;
+
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+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.UserPointsRecord;
+import com.cyksj.model.views.SignUserView;
+import com.cyksj.service.market.MarketFrontService;
+import com.cyksj.web.util.StpUserUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/applets/market/sign")
+@RequiredArgsConstructor
+public class SignFrontController {
+    private final MarketFrontService marketFrontService;
+
+    private final UserPointsRecordMapper userPointsRecordMapper;
+
+    /**
+     * 用户积分详情
+     */
+    @GetMapping("/get/points/detail")
+    public Result<Page<UserPointsRecord>> getUserPointsDetail(@RequestParam(defaultValue = "1") Integer start, @RequestParam(defaultValue = "5") Integer limit) {
+        Long userId = StpUserUtil.getLoginIdAsLong();
+        return GatewayResponse.SUCCESS.newBuilder().toResult(userPointsRecordMapper.selectPage(new Page<>(start, limit), Wrappers.lambdaQuery(UserPointsRecord.class)
+                .eq(UserPointsRecord::getUserId, userId)
+                .orderByAsc(UserPointsRecord::getId)));
+    }
+
+    /**
+     * 签到详情
+     */
+    @GetMapping("/get/detail")
+    public Result<SignUserView> getUserSignDetail() {
+        Long userId = StpUserUtil.getLoginIdAsLong();
+        return GatewayResponse.SUCCESS.newBuilder().toResult(marketFrontService.getUserSignDetail(userId));
+    }
+
+
+    /**
+     * 每日签到
+     */
+    @PostMapping("/post")
+    public Result<Integer> sign() {
+        Long userId = StpUserUtil.getLoginIdAsLong();
+        Integer dayPeriod = marketFrontService.signByUserId(userId);
+        return GatewayResponse.SUCCESS.newBuilder().setMsg("签到成功").toResult(dayPeriod);
+    }
+
+}