瀏覽代碼

积分管理

Wang-Xiao-Ran 1 年之前
父節點
當前提交
2f5bdd713d

+ 66 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/score/ScoreController.java

@@ -0,0 +1,66 @@
+package com.ruoyi.web.controller.score;
+
+import com.ruoyi.common.core.domain.R;
+import com.sooka.jnb.score.domain.ScoreOperate;
+import com.sooka.jnb.score.service.IScoreService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/score")
+public class ScoreController {
+    @Autowired
+    private IScoreService service;
+
+    /**
+     * 初始化积分
+     *
+     * @param scoreOperate
+     * @return
+     */
+    @PostMapping("/initScore")
+    public R initScore(@RequestBody ScoreOperate scoreOperate) {
+        if(service.soleVerify(scoreOperate.getUserId())){
+            return R.fail("用户已存在, 不能初始化积分!");
+        }
+        return R.ok(service.initScore(scoreOperate));
+    }
+
+    /**
+     * 获取积分
+     *
+     * @param userId
+     * @return
+     */
+    @GetMapping("/getScore")
+    public R getScore(@RequestParam String userId) {
+        return R.ok(service.getScore(userId));
+    }
+
+    /**
+     * 获取积分流水
+     */
+    @GetMapping("/getScoreList")
+    public R getScoreList(@RequestParam String userId) {
+        return R.ok(service.getScoreList(userId));
+    }
+
+    /**
+     * 增加积分
+     */
+    @PostMapping("/addScore")
+    public R addScore(@RequestBody ScoreOperate scoreOperate) {
+        return R.ok(service.addScore(scoreOperate));
+    }
+
+
+    /**
+     * 减少积分
+     */
+    @PostMapping("/reduceScore")
+    public R reduceScore(@RequestBody ScoreOperate scoreOperate) {
+        return R.ok(service.reduceScore(scoreOperate));
+    }
+
+
+}

+ 0 - 23
sooka-jnb/src/main/java/com/sooka/jnb/score/domain/Score.java

@@ -1,23 +0,0 @@
-package com.sooka.jnb.score.domain;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import lombok.Data;
-
-import java.math.BigInteger;
-import java.util.Date;
-
-/**
- * 积分实体类
- * @author LG
- * @date 2021/1/21 10:59
- */
-@Data
-public class Score {
-    private int id;
-    private String userId;
-    private BigInteger scoreNum;
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createTime;
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date updateTime;
-}

+ 41 - 2
sooka-jnb/src/main/java/com/sooka/jnb/score/domain/ScoreOperate.java

@@ -3,22 +3,61 @@ package com.sooka.jnb.score.domain;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
+import org.apache.ibatis.type.Alias;
 
 import java.math.BigInteger;
 import java.util.Date;
 
 /**
- * 积分流水实体类
+ * 积分以及流水实体类
+ *
  * @author LG
  * @date 2020-09-07 11:14
  */
 @Data
+@Alias("scoreOperate")
 public class ScoreOperate {
-    private BigInteger id;
+    /**
+     * 数据id
+     */
+    private Integer id;
+
+    /**
+     * 用户id
+     */
     private String userId;
+
+    /**
+     * 积分
+     */
+    private Integer scoreNum;
+
+    /**
+     * 积分操作
+     */
     private String scoreOperate;
+
+    /**
+     * 创建时间
+     */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    /**
+     * 积分操作类型
+     */
     private String relevance;
+
+    /**
+     * 积分操作类型的数据id
+     */
     private String relevanceDataId;
+
+
 }

+ 22 - 0
sooka-jnb/src/main/java/com/sooka/jnb/score/mapper/ScoreMapper.java

@@ -0,0 +1,22 @@
+package com.sooka.jnb.score.mapper;
+
+import com.sooka.jnb.score.domain.ScoreOperate;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ScoreMapper {
+    int initScore(ScoreOperate score);
+
+    ScoreOperate getScore(String userId);
+
+    List<ScoreOperate> getScoreList(String userId);
+
+    int addScore(ScoreOperate score);
+
+    int reduceScore(ScoreOperate score);
+
+    int insertScoreOperate(ScoreOperate score);
+
+    Map<String, Long> soleVerify(String userId);
+}

+ 54 - 0
sooka-jnb/src/main/java/com/sooka/jnb/score/service/IScoreService.java

@@ -0,0 +1,54 @@
+package com.sooka.jnb.score.service;
+
+import com.sooka.jnb.score.domain.ScoreOperate;
+
+import java.util.List;
+
+public interface IScoreService{
+
+    /**
+     * 初始化积分
+     * @param score 积分实体类
+     * - userId 用户ID
+     * - scoreNum 初始化积分
+     * - createTime 创建时间
+     */
+    int initScore(ScoreOperate score);
+
+    /**
+     * 获取积分
+     * @param userId 用户id
+     */
+    ScoreOperate getScore(String userId);
+
+    /**
+     * 获取积分流水
+     */
+    List<ScoreOperate> getScoreList(String userId);
+
+    /**
+     * 增加积分
+     * @param scoreOperate 积分操作实体
+     * - userId 用户id
+     * - scoreNum 增加的分数
+     * - createTime 创建时间
+     */
+    int addScore(ScoreOperate scoreOperate);
+
+    /**
+     * 减少积分
+     * @param scoreOperate 积分操作实体
+     * - userId 用户id
+     * - scoreNum 减少的分数
+     * - createTime 创建时间
+     */
+    int reduceScore(ScoreOperate scoreOperate);
+
+    /**
+     * 唯一校验
+     * @param userId 用户id
+     * @return boolean 用户存在返回true,不存在则返回false
+     */
+    boolean soleVerify(String userId);
+
+}

+ 82 - 0
sooka-jnb/src/main/java/com/sooka/jnb/score/service/impl/ScoreServiceImpl.java

@@ -0,0 +1,82 @@
+package com.sooka.jnb.score.service.impl;
+
+import com.sooka.jnb.score.domain.ScoreOperate;
+import com.sooka.jnb.score.mapper.ScoreMapper;
+import com.sooka.jnb.score.service.IScoreService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 积分操作
+ *
+ * @author LG
+ * @date 2019-05-29 10:43
+ */
+@Service
+public class ScoreServiceImpl implements IScoreService {
+
+    private static final String ADD = "+";
+    private static final String REDUCE = "-";
+
+    @Resource
+    private ScoreMapper scoreMapper;
+
+    @Override
+    @Transactional
+    public int initScore(ScoreOperate score) {
+        if (null == score.getCreateTime()) {
+            score.setCreateTime(new Date());
+        }
+        score.setScoreOperate(ADD + score.getScoreNum());
+        scoreMapper.insertScoreOperate(score);
+        return scoreMapper.initScore(score);
+    }
+
+    @Override
+    public ScoreOperate getScore(String userId) {
+        return scoreMapper.getScore(userId);
+    }
+
+    @Override
+    public List<ScoreOperate> getScoreList(String userId) {
+        return scoreMapper.getScoreList(userId);
+    }
+
+    @Override
+    @Transactional
+    public int addScore(ScoreOperate scoreOperate) {
+        scoreMapper.addScore(scoreOperate);
+        return this.insertScoreOperate(scoreOperate, ADD);
+    }
+
+    @Override
+    @Transactional
+    public int reduceScore(ScoreOperate scoreOperate) {
+        scoreMapper.reduceScore(scoreOperate);
+        return this.insertScoreOperate(scoreOperate, REDUCE);
+    }
+
+    /**
+     * 插入积分操作记录
+     * @param scoreOperate 积分操作对象
+     * @param operate 积分操作类型
+     */
+    private int insertScoreOperate(ScoreOperate scoreOperate, String operate) {
+        scoreOperate.setScoreOperate(operate + scoreOperate.getScoreNum());
+        Date date = new Date();
+        scoreOperate.setCreateTime(date);
+        scoreOperate.setUpdateTime(date);
+        return scoreMapper.insertScoreOperate(scoreOperate);
+    }
+
+    @Override
+    public boolean soleVerify(String userId) {
+        Map<String, Long> resultMap = scoreMapper.soleVerify(userId);
+        return resultMap.get("personSum") > 0;
+    }
+}

+ 61 - 0
sooka-jnb/src/main/resources/mapper/score/ScoreMapper.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--suppress ALL -->
+<mapper namespace="com.sooka.jnb.score.mapper.ScoreMapper">
+    
+    <resultMap id="scoreOperateResult" type="scoreOperate">
+        <id property="id" column="id"/>
+        <result property="userId" column="user_id"/>
+        <result property="scoreOperate" column="score_operate"/>
+        <result property="scoreNum" column="score_num"/>
+        <result property="relevance" column="relevance"/>
+        <result property="relevanceDataId" column="relevance_data_id"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+
+    <!-- 初始化积分 -->
+    <insert id="initScore" parameterType="scoreOperate">
+        insert into jnb_score(user_id, score_num, create_time)
+        values(#{userId}, #{scoreNum}, #{createTime})
+    </insert>
+
+    <!-- 获取积分 -->
+    <select id="getScore" parameterType="string" resultMap="scoreOperateResult">
+        select id, user_id, score_num from jnb_score where user_id = #{userId}
+    </select>
+
+    <!-- 获取积分流水 -->
+    <select id="getScoreList" parameterType="string" resultMap="scoreOperateResult">
+        select jso.id, jso.user_id, jso.score_operate, jso.score_num, jso.create_time, sdd.dict_label as relevance, jso.relevance_data_id
+        from jnb_score_operate jso
+        left join sys_dict_data sdd on jso.relevance = sdd.dict_value
+        where sdd.dict_type = 'score_type' and  user_id = #{userId}
+        order by create_time desc
+    </select>
+
+    <!-- 增加积分 -->
+    <update id="addScore" parameterType="scoreOperate">
+        update jnb_score set score_num = score_num + #{scoreNum}, update_time = #{updateTime} where user_id = #{userId}
+    </update>
+
+    <!-- 减少积分 -->
+    <update id="reduceScore" parameterType="scoreOperate">
+        update jnb_score set score_num = score_num - #{scoreNum}, update_time = #{updateTime} where user_id = #{userId}
+    </update>
+
+    <!-- 积分流水操作 -->
+    <insert id="insertScoreOperate" parameterType="scoreOperate">
+        insert into jnb_score_operate(user_id, score_operate, score_num, create_time, relevance, relevance_data_id)
+        values(#{userId}, #{scoreOperate}, (select score_num from jnb_score where user_id = #{userId}), #{createTime}, #{relevance}, #{relevanceDataId})
+    </insert>
+
+    <!-- 唯一校验 -->
+    <select id="soleVerify" parameterType="string" resultType="map">
+        select count(1) as personSum from jnb_score where user_id = #{userId}
+    </select>
+    
+</mapper>