Helius
2022-05-09 92eadc582305983ae679ed80e5d9d9692bf4371b
add score some interface
12 files added
3 files modified
517 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java 19 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java 7 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/AdminScoreController.java 33 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiScoreController.java 47 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ViewScoreController.java 33 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/ScoreSettingDto.java 23 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallScoreSignRecord.java 24 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallScoreSignRecordMapper.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/ICommonService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IScoreService.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/CommonService.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ScoreServiceImpl.java 140 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/ScoreSignVo.java 24 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallScoreSignRecordMapper.xml 12 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/score/setting.html 113 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java
New file
@@ -0,0 +1,19 @@
package cc.mrbird.febs.common.enumerates;
import lombok.Data;
import lombok.Getter;
@Getter
public enum DataDictionaryEnum {
    SCORE_SIGN_SETTING("SCORE_SETTING", "SCORE_SIGN_SETTING");
    private String type;
    private String code;
    DataDictionaryEnum(String type, String code) {
        this.type = type;
        this.code = code;
    }
}
src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
@@ -68,7 +68,12 @@
    /**
     * 佣金转余额
     */
    COMMISSION_TO_BALANCE(13);
    COMMISSION_TO_BALANCE(13),
    /**
     * 竞猜积分签到
     */
    SCORE_SIGN(14);
    private final int value;
src/main/java/cc/mrbird/febs/mall/controller/AdminScoreController.java
New file
@@ -0,0 +1,33 @@
package cc.mrbird.febs.mall.controller;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
import cc.mrbird.febs.mall.dto.ScoreSettingDto;
import cc.mrbird.febs.mall.service.ICommonService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author wzy
 * @date 2022-05-09
 **/
@Slf4j
@Validated
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/admin/score")
public class AdminScoreController {
    private final ICommonService commonService;
    @PostMapping(value = "/addSetting")
    public FebsResponse addSetting(ScoreSettingDto scoreSettingDto) {
        commonService.addDataDic(DataDictionaryEnum.SCORE_SIGN_SETTING.getType(), DataDictionaryEnum.SCORE_SIGN_SETTING.getCode(), scoreSettingDto, "积分签到设置");
        return new FebsResponse().success();
    }
}
src/main/java/cc/mrbird/febs/mall/controller/ApiScoreController.java
New file
@@ -0,0 +1,47 @@
package cc.mrbird.febs.mall.controller;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.mall.service.ICommonService;
import cc.mrbird.febs.mall.service.IScoreService;
import cc.mrbird.febs.mall.vo.ScoreSignVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
 * @author wzy
 * @date 2022-05-09
 **/
@Slf4j
@Validated
@RestController
@CrossOrigin("*")
@RequiredArgsConstructor
@RequestMapping(value = "/api/score")
@Api(value = "ApiScoreController", tags = "积分接口类")
public class ApiScoreController {
    private final IScoreService scoreService;
    @ApiOperation(value = "积分签到", notes = "积分签到")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = ScoreSignVo.class)
    })
    @GetMapping(value = "/signSetting")
    public FebsResponse signSetting() {
        return new FebsResponse().success().data(scoreService.scoreSign());
    }
    @ApiOperation(value = "签到", notes = "签到")
    @PostMapping(value = "/sign")
    public FebsResponse sign() {
        scoreService.sign();
        return new FebsResponse().success();
    }
}
src/main/java/cc/mrbird/febs/mall/controller/ViewScoreController.java
New file
@@ -0,0 +1,33 @@
package cc.mrbird.febs.mall.controller;
import cc.mrbird.febs.common.entity.FebsConstant;
import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
import cc.mrbird.febs.common.utils.FebsUtil;
import cc.mrbird.febs.mall.dto.ScoreSettingDto;
import cc.mrbird.febs.mall.entity.DataDictionaryCustom;
import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller("scoreView")
@RequestMapping(FebsConstant.VIEW_PREFIX + "modules/score")
@RequiredArgsConstructor
public class ViewScoreController {
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    @GetMapping("setting")
//    @RequiresPermissions("orderList:view")
    public String setting(Model model) {
        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SCORE_SIGN_SETTING.getType(), DataDictionaryEnum.SCORE_SIGN_SETTING.getCode());
        if (dic != null) {
            model.addAttribute("obj", JSONObject.parseObject(dic.getValue(), ScoreSettingDto.class));
        }
        return FebsUtil.view("modules/score/setting");
    }
}
src/main/java/cc/mrbird/febs/mall/dto/ScoreSettingDto.java
New file
@@ -0,0 +1,23 @@
package cc.mrbird.febs.mall.dto;
import lombok.Data;
/**
 * @author wzy
 * @date 2022-05-09
 **/
@Data
public class ScoreSettingDto {
    private Integer signInOne;
    private Integer signInTwo;
    private Integer signInThree;
    private Integer signInFour;
    private Integer signInFive;
    private Integer signInSix;
    private Integer signInSeven;
    private Integer signInTotal;
    private Integer signInMore;
    private Integer mostSignIn;
}
src/main/java/cc/mrbird/febs/mall/entity/MallScoreSignRecord.java
New file
@@ -0,0 +1,24 @@
package cc.mrbird.febs.mall.entity;
import cc.mrbird.febs.common.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
/**
 * @author wzy
 * @date 2022-05-09
 **/
@Data
@TableName("mall_score_sign_record")
public class MallScoreSignRecord extends BaseEntity {
    private Long memberId;
    private Integer totalCnt;
    private Integer score;
    private Date signTime;
}
src/main/java/cc/mrbird/febs/mall/mapper/MallScoreSignRecordMapper.java
New file
@@ -0,0 +1,10 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.MallScoreSignRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
public interface MallScoreSignRecordMapper extends BaseMapper<MallScoreSignRecord> {
    MallScoreSignRecord selectRecentSignRecord(@Param("memberId") Long memberId);
}
src/main/java/cc/mrbird/febs/mall/service/ICommonService.java
@@ -15,4 +15,6 @@
    List<DataDictionaryCustom> findDataDicByType(String type);
    List<AppVersion> findAppVersion();
    void addDataDic(String type, String key, Object value, String description);
}
src/main/java/cc/mrbird/febs/mall/service/IScoreService.java
New file
@@ -0,0 +1,10 @@
package cc.mrbird.febs.mall.service;
import cc.mrbird.febs.mall.vo.ScoreSignVo;
public interface IScoreService {
    ScoreSignVo scoreSign();
    void sign();
}
src/main/java/cc/mrbird/febs/mall/service/impl/CommonService.java
@@ -8,6 +8,7 @@
import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper;
import cc.mrbird.febs.mall.service.ICommonService;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -53,4 +54,23 @@
    public List<AppVersion> findAppVersion() {
        return appVersionMapper.selectList(null);
    }
    @Override
    public void addDataDic(String type, String code, Object value, String description) {
        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(type, code);
        String data = JSONObject.toJSONString(value);
        if (dic != null) {
            dic.setValue(data);
            dataDictionaryCustomMapper.updateById(dic);
            return;
        }
        dic = new DataDictionaryCustom();
        dic.setCode(code);
        dic.setType(type);
        dic.setValue(data);
        dic.setDescription(description);
        dataDictionaryCustomMapper.insert(dic);
    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/ScoreServiceImpl.java
New file
@@ -0,0 +1,140 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.utils.LoginUserUtil;
import cc.mrbird.febs.mall.dto.ScoreSettingDto;
import cc.mrbird.febs.mall.entity.DataDictionaryCustom;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.entity.MallMemberWallet;
import cc.mrbird.febs.mall.entity.MallScoreSignRecord;
import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper;
import cc.mrbird.febs.mall.mapper.MallMemberWalletMapper;
import cc.mrbird.febs.mall.mapper.MallScoreSignRecordMapper;
import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
import cc.mrbird.febs.mall.service.IScoreService;
import cc.mrbird.febs.mall.vo.ScoreSignVo;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.Date;
/**
 * @author wzy
 * @date 2022-05-09
 **/
@Slf4j
@Service
@RequiredArgsConstructor
public class ScoreServiceImpl implements IScoreService {
    private final MallMemberWalletMapper mallMemberWalletMapper;
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    private final MallScoreSignRecordMapper mallScoreSignRecordMapper;
    private final IMallMoneyFlowService mallMoneyFlowService;
    private final IApiMallMemberWalletService walletService;
    @Override
    public ScoreSignVo scoreSign() {
        MallMember member = LoginUserUtil.getLoginUser();
        MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(member.getId());
        ScoreSignVo scoreSign = new ScoreSignVo();
        scoreSign.setMineScore(wallet.getPrizeScore().intValue());
        scoreSign.setHasSignDays(1);
        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SCORE_SIGN_SETTING.getType(), DataDictionaryEnum.SCORE_SIGN_SETTING.getCode());
        if (dic != null) {
            scoreSign.setSetting(JSONObject.parseObject(dic.getValue(), ScoreSettingDto.class));
        }
        return scoreSign;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void sign() {
        MallMember member = LoginUserUtil.getLoginUser();
        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SCORE_SIGN_SETTING.getType(), DataDictionaryEnum.SCORE_SIGN_SETTING.getCode());
        if (dic == null) {
            throw new FebsException("暂未设置积分");
        }
        MallScoreSignRecord mallScoreSignRecord = mallScoreSignRecordMapper.selectRecentSignRecord(member.getId());
        if (mallScoreSignRecord == null) {
            mallScoreSignRecord = new MallScoreSignRecord();
        }
        System.out.println(DateUtil.between(mallScoreSignRecord.getSignTime(), new Date(), DateUnit.DAY));
        if (mallScoreSignRecord.getSignTime() != null && DateUtil.between(mallScoreSignRecord.getSignTime(), new Date(), DateUnit.DAY) == 0) {
            throw new FebsException("今天已签到");
        }
        ScoreSettingDto scoreSetting = JSONObject.parseObject(dic.getValue(),ScoreSettingDto.class);
        int days = mallScoreSignRecord.getTotalCnt() == null ? 1 : mallScoreSignRecord.getTotalCnt() + 1;
        switch (days) {
            case 1:
                if (scoreSetting.getSignInOne() == null) {
                    throw new FebsException("积分未设置");
                }
                mallScoreSignRecord.setScore(scoreSetting.getSignInOne());
                break;
            case 2:
                if (scoreSetting.getSignInTwo() == null) {
                    throw new FebsException("积分未设置");
                }
                mallScoreSignRecord.setScore(scoreSetting.getSignInTwo());
                break;
            case 3:
                if (scoreSetting.getSignInThree() == null) {
                    throw new FebsException("积分未设置");
                }
                mallScoreSignRecord.setScore(scoreSetting.getSignInThree());
                break;
            case 4:
                if (scoreSetting.getSignInFour() == null) {
                    throw new FebsException("积分未设置");
                }
                mallScoreSignRecord.setScore(scoreSetting.getSignInFour());
                break;
            case 5:
                if (scoreSetting.getSignInFive() == null) {
                    throw new FebsException("积分未设置");
                }
                mallScoreSignRecord.setScore(scoreSetting.getSignInFive());
                break;
            case 6:
                if (scoreSetting.getSignInSix() == null) {
                    throw new FebsException("积分未设置");
                }
                mallScoreSignRecord.setScore(scoreSetting.getSignInSix());
                break;
            case 7:
                if (scoreSetting.getSignInSeven() == null) {
                    throw new FebsException("积分未设置");
                }
                mallScoreSignRecord.setScore(scoreSetting.getSignInSeven());
                break;
        }
        mallScoreSignRecord.setMemberId(member.getId());
        mallScoreSignRecord.setTotalCnt(days);
        mallScoreSignRecord.setSignTime(new Date());
        mallScoreSignRecordMapper.insert(mallScoreSignRecord);
        BigDecimal amount = BigDecimal.valueOf(mallScoreSignRecord.getScore());
        walletService.add(amount, member.getId(), "prizeScore");
        mallMoneyFlowService.addMoneyFlow(member.getId(), amount, MoneyFlowTypeEnum.SCORE_SIGN.getValue(), null, FlowTypeEnum.PRIZE_SCORE.getValue());
    }
}
src/main/java/cc/mrbird/febs/mall/vo/ScoreSignVo.java
New file
@@ -0,0 +1,24 @@
package cc.mrbird.febs.mall.vo;
import cc.mrbird.febs.mall.dto.ScoreSettingDto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author wzy
 * @date 2022-05-09
 **/
@Data
@ApiModel(value = "ScoreSignVo", description = "积分签到返回参数接口")
public class ScoreSignVo {
    @ApiModelProperty(value = "我的竞猜积分")
    private Integer mineScore;
    @ApiModelProperty(value = "已连续签到")
    private Integer hasSignDays;
    @ApiModelProperty(value = "签到积分设置")
    private ScoreSettingDto setting;
}
src/main/resources/mapper/modules/MallScoreSignRecordMapper.xml
New file
@@ -0,0 +1,12 @@
<?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">
<mapper namespace="cc.mrbird.febs.mall.mapper.MallScoreSignRecordMapper">
    <select id="selectRecentSignRecord" resultType="cc.mrbird.febs.mall.entity.MallScoreSignRecord">
        select *, max(sign_time) signTime from mall_score_sign_record
        where member_id=#{memberId}
        group by member_id
    </select>
</mapper>
src/main/resources/templates/febs/views/modules/score/setting.html
New file
@@ -0,0 +1,113 @@
<div class="layui-fluid layui-anim febs-anim" id="score-setting" lay-title="签到积分设置">
    <div class="layui-row layui-col-space8 febs-container">
        <form class="layui-form" action="" lay-filter="score-setting-form">
            <div class="layui-card">
                <div class="layui-card-body">
                    <div class="layui-form-item">
                        <label class="layui-form-label ">连续签到1天:</label>
                        <div class="layui-input-block">
                            <input type="text" name="signInOne" lay-verify="number" th:value="${obj != null ? obj.signInOne : null}" autocomplete="off" class="layui-input">
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label ">连续签到2天:</label>
                        <div class="layui-input-block">
                            <input type="text" name="signInTwo" lay-verify="number" th:value="${obj != null ? obj.signInTwo : null}" autocomplete="off" class="layui-input">
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label ">连续签到3天:</label>
                        <div class="layui-input-block">
                            <input type="text" name="signInThree" lay-verify="number" th:value="${obj != null ? obj.signInThree : null}" autocomplete="off" class="layui-input">
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label ">连续签到4天:</label>
                        <div class="layui-input-block">
                            <input type="text" name="signInFour" lay-verify="number" th:value="${obj != null ? obj.signInFour : null}" autocomplete="off" class="layui-input">
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label ">连续签到5天:</label>
                        <div class="layui-input-block">
                            <input type="text" name="signInFive" lay-verify="number" th:value="${obj != null ? obj.signInFive : null}" autocomplete="off" class="layui-input">
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label ">连续签到6天:</label>
                        <div class="layui-input-block">
                            <input type="text" name="signInSix" lay-verify="number" th:value="${obj != null ? obj.signInSix : null}" autocomplete="off" class="layui-input">
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label ">连续签到7天:</label>
                        <div class="layui-input-block">
                            <input type="text" name="signInSeven" lay-verify="number" th:value="${obj != null ? obj.signInSeven : null}" autocomplete="off" class="layui-input">
                        </div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label ">连续签到</label>
                        <div class="layui-input-inline" style="width: 120px">
                            <input type="text" name="signInTotal" lay-verify="number" th:value="${obj != null ? obj.signInTotal : null}" autocomplete="off" class="layui-input">
                        </div>
                        <div class="layui-form-mid">天,可获得额外</div>
                        <div class="layui-input-inline" style="width: 120px">
                            <input type="text" name="signInMore" lay-verify="number" th:value="${obj != null ? obj.signInMore : null}" autocomplete="off" class="layui-input">
                        </div>
                        <div class="layui-form-mid">竞猜积分</div>
                    </div>
                    <div class="layui-form-item">
                        <label class="layui-form-label ">最多可得积分:</label>
                        <div class="layui-input-block">
                            <input type="text" name="mostSignIn" lay-verify="number" th:value="${obj != null ? obj.mostSignIn : null}" autocomplete="off" class="layui-input">
                        </div>
                    </div>
                </div>
                <div class="layui-card-footer">
                    <button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="score-setting-form-submit" id="submit">保存</button>
                </div>
            </div>
        </form>
<!--        <div class="layui-form-item febs-hide">-->
<!--            <button class="layui-btn" lay-submit="" lay-filter="score-setting-form-submit" id="submit-form"></button>-->
<!--            <button type="reset" class="layui-btn" id="reset"></button>-->
<!--        </div>-->
    </div>
</div>
<style>
    .layui-form-label {
        width: 120px;
    }
    .layui-form-item .layui-input-block {
        margin-left: 150px;
    }
    .layui-table-form .layui-form-item {
        margin-bottom: 20px !important;
    }
</style>
<script data-th-inline="javascript" type="text/javascript">
    layui.use(['dropdown', 'jquery', 'validate', 'febs', 'form', 'eleTree'], function () {
        var $ = layui.jquery,
            febs = layui.febs,
            form = layui.form,
            validate = layui.validate,
            $view = $('#score-setting');
        form.verify(validate);
        form.render();
        form.on('submit(score-setting-form-submit)', function (data) {
            console.log(data);
            febs.post(ctx + 'admin/score/addSetting', data.field, function (res) {
                febs.alert.success('设置成功');
            });
            return false;
        });
    });
</script>