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>