KKSU
2024-12-18 77c79f189d86a99595d2666faef135e64b7a627f
refactor(test): 重构 AgentTest 类并添加新的测试方法

- 清理了冗余的导入语句和未使用的测试方法
- 新增 IMemberProfitService依赖,用于后续的测试
- 添加了新的测试方法的注释,为未来的测试用例预留空间
- 新增 ApiGetRunDateDto 类,用于接收日期参数
6 files added
20 files modified
1323 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/enumerates/RunVipDataDictionaryEnum.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/RunVipMoneyFlowTypeEnum.java 7 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiRunVipController.java 32 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/ApiGetRunDateDto.java 17 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/ApiGoChargeDto.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/AsyncService.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IRunVipService.java 10 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java 24 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AsyncServiceImpl.java 43 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java 112 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/RunVipServiceImpl.java 172 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/ApiGetRunDateVo.java 18 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/ApiRunDataVo.java 26 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/ApiRunHealthVo.java 23 ●●●●● patch | view | raw | blame | history
src/main/resources/application-dev.yml 3 ●●●● patch | view | raw | blame | history
src/main/resources/application-prod.yml 3 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMemberMapper.xml 13 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMemberWalletMapper.xml 5 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMoneyFlowMapper.xml 13 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/runVip/buyVipList.html 4 ●●●● patch | view | raw | blame | history
src/test/java/cc/mrbird/febs/AgentTest.java 749 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/RunVipDataDictionaryEnum.java
@@ -5,6 +5,10 @@
@Getter
public enum RunVipDataDictionaryEnum {
    //释放碳积分的开始结束时间
    RUN_START_TIME("RUN_START_TIME", "RUN_START_TIME"),
    RUN_END_TIME("RUN_END_TIME", "RUN_END_TIME"),
    //充值类型
    CHARGE_TYPE_TRC("CHARGE_TYPE", "CHARGE_TYPE_TRC"),
    CHARGE_TYPE_BSC("CHARGE_TYPE", "CHARGE_TYPE_BSC"),
src/main/java/cc/mrbird/febs/common/enumerates/RunVipMoneyFlowTypeEnum.java
@@ -6,9 +6,14 @@
public enum RunVipMoneyFlowTypeEnum {
    /**
     * 获得碳积分
     */
    GET_SCORE(9,"本次获得碳积分{}","获得碳积分"),
    /**
     * 系统拨付碳积分
     */
    SYS_SCORE(8,"系统拨付碳积分{}","系统拨付碳积分"),
    SYS_SCORE(8,"获得碳积分{}","系统拨付碳积分"),
    /**
     * 系统拨付碳币
src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java
@@ -1,5 +1,6 @@
package cc.mrbird.febs.mall.controller;
import cc.mrbird.febs.common.annotation.SubmitRepeat;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.service.IApiMallMemberService;
@@ -48,6 +49,7 @@
    @ApiOperation(value = "修改用户信息")
    @PostMapping(value = "/modifyInfo")
    @SubmitRepeat
    public FebsResponse modifyInfo(@RequestBody ModifyMemberInfoDto modifyMemberInfoDto) {
        return memberService.modifyMemberInfo(modifyMemberInfoDto);
    }
@@ -73,6 +75,7 @@
    @ApiOperation(value = "兑换碳币")
    @PostMapping(value = "/changeScore")
    @SubmitRepeat
    public FebsResponse changeScore(@RequestBody @Validated CommissionChangeDto commissionChange) {
        memberService.commissionChange(commissionChange);
        return new FebsResponse().success().message("操作成功");
@@ -80,6 +83,7 @@
    @ApiOperation(value = "转赠好友")
    @PostMapping(value = "/giveFriend")
    @SubmitRepeat
    public FebsResponse giveFriend(@RequestBody @Validated TransferDto transferDto) {
        memberService.transfer(transferDto);
        return new FebsResponse().success().message("操作成功");
@@ -88,6 +92,7 @@
    @ApiOperation(value = "地址新增和编辑")
    @PostMapping(value = "/setPayment")
    @SubmitRepeat
    public FebsResponse setPayment(@RequestBody ApiMallMemberPaymentDto mallMemberPayment) {
        memberService.setPayment(mallMemberPayment);
        return new FebsResponse().success().message("操作成功");
@@ -101,6 +106,7 @@
    @ApiOperation(value = "地址删除")
    @PostMapping(value = "/delPayment")
    @SubmitRepeat
    public FebsResponse delPayment(@RequestBody ApiMallMemberPaymentDto mallMemberPayment) {
        memberService.delPayment(mallMemberPayment);
        return new FebsResponse().success().message("操作成功");
@@ -108,6 +114,7 @@
    @ApiOperation(value = "兑换提现")
    @PostMapping(value = "/withdrawal")
    @SubmitRepeat
    public FebsResponse withdrawal(@RequestBody @Validated WithdrawalDto withdrawalDto) {
        memberService.withdrawal(withdrawalDto);
        return new FebsResponse().success().message("操作成功");
src/main/java/cc/mrbird/febs/mall/controller/ApiRunVipController.java
@@ -3,12 +3,11 @@
import cc.mrbird.febs.common.annotation.SubmitRepeat;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.mall.dto.ApiChargeListDto;
import cc.mrbird.febs.mall.dto.ApiGetRunDateDto;
import cc.mrbird.febs.mall.dto.ApiGoChargeDto;
import cc.mrbird.febs.mall.dto.ApiGoChargeInfoDto;
import cc.mrbird.febs.mall.service.IRunVipService;
import cc.mrbird.febs.mall.vo.ApiChargeVo;
import cc.mrbird.febs.mall.vo.ApiGoChargeVo;
import cc.mrbird.febs.mall.vo.ApiRunVipVo;
import cc.mrbird.febs.mall.vo.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
@@ -31,6 +30,33 @@
    private final IRunVipService iRunVipService;
    @ApiOperation(value = "走路-健康", notes = "走路-健康")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = ApiRunHealthVo.class)
    })
    @GetMapping(value = "/runHealth")
    public FebsResponse runHealth() {
        return new FebsResponse().success().data(iRunVipService.runHealth());
    }
    @ApiOperation(value = "运动数据", notes = "运动数据")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = ApiRunDataVo.class)
    })
    @GetMapping(value = "/runData")
    public FebsResponse runData() {
        return new FebsResponse().success().data(iRunVipService.runData());
    }
    @ApiOperation(value = "运动日历", notes = "运动日历")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = ApiGetRunDateVo.class)
    })
    @PostMapping(value = "/getRunDate")
    public FebsResponse getChargeList(@RequestBody @Valid ApiGetRunDateDto apiGetRunDateDto) {
        return new FebsResponse().success().data(iRunVipService.getRunDate(apiGetRunDateDto));
    }
    @ApiOperation(value = "会员中心-购买VIP列表", notes = "会员中心-购买VIP列表")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = ApiRunVipVo.class)
src/main/java/cc/mrbird/febs/mall/dto/ApiGetRunDateDto.java
New file
@@ -0,0 +1,17 @@
package cc.mrbird.febs.mall.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
@ApiModel(value = "ApiGetRunDateDto", description = "参数接收类")
public class ApiGetRunDateDto {
    @NotBlank(message = "参数不能为空")
    @ApiModelProperty(value = "日期的年月日")
    private String dateStr;
}
src/main/java/cc/mrbird/febs/mall/dto/ApiGoChargeDto.java
@@ -22,4 +22,8 @@
    @ApiModelProperty(value = "数量", example = "123456")
    private Integer vipCnt;
    @NotNull(message = "请输入资金密码")
    @ApiModelProperty(value = "资金密码", example = "123456")
    private String tradeWord;
}
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
@@ -97,4 +97,6 @@
    void updateLastLogin(@Param("id")Long id,@Param("lastLogin") Date lastLogin);
    void updateVipLevelTimeAndLevel(@Param("id")Long id,@Param("vipLevelTime") Date lastLogin,@Param("level") String level);
    void updateNameAndAvatar(@Param("id")Long id, @Param("name")String name, @Param("photo")String photo);
}
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java
@@ -17,4 +17,6 @@
    int updateAmountWithVersion(@Param("record") MallMemberWallet wallet);
    void updateBalanceWithId(@Param("record")MallMemberWallet mallMemberWallet);
    void updateScore();
}
src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
@@ -9,17 +9,29 @@
@Slf4j
@Component
@ConditionalOnProperty(prefix = "system", name = "job", havingValue = "true")
@ConditionalOnProperty(prefix = "system", name = "runStep", havingValue = "true")
public class ProfitJob {
    @Autowired
    private IMemberProfitService memberProfitService;
    /**
     * 每天凌晨
     * 清空用户的碳积分
     * 套餐过期后,更新用户为游客等级
     */
    @Scheduled(cron = "0 0 0 * * ?")
    public void updateMemberLevel() {
        memberProfitService.updateMemberLevel();
    }
    /**
     * 每1小时执行一次
     * 分发碳积分
     *      根据会员等级分发
     */
    @Scheduled(cron = "0 0 0/1 * * ?")
    public void updateRunScore() {
        memberProfitService.updateRunScore();
    }
}
src/main/java/cc/mrbird/febs/mall/service/AsyncService.java
New file
@@ -0,0 +1,14 @@
package cc.mrbird.febs.mall.service;
import cc.mrbird.febs.common.entity.FebsConstant;
import cc.mrbird.febs.mall.entity.MallMember;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.scheduling.annotation.Async;
import java.math.BigDecimal;
public interface AsyncService extends IService<MallMember> {
    @Async(FebsConstant.ASYNC_POOL)
    void releaseScore(BigDecimal amount,Long memberId);
}
src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java
@@ -43,4 +43,6 @@
    void getOrderCoupon(Long orderId);
    void updateMemberLevel();
    void updateRunScore();
}
src/main/java/cc/mrbird/febs/mall/service/IRunVipService.java
@@ -2,11 +2,11 @@
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.mall.dto.ApiChargeListDto;
import cc.mrbird.febs.mall.dto.ApiGetRunDateDto;
import cc.mrbird.febs.mall.dto.ApiGoChargeDto;
import cc.mrbird.febs.mall.dto.ApiGoChargeInfoDto;
import cc.mrbird.febs.mall.entity.RunVip;
import cc.mrbird.febs.mall.vo.ApiChargeVo;
import cc.mrbird.febs.mall.vo.ApiRunVipVo;
import cc.mrbird.febs.mall.vo.*;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
@@ -19,4 +19,10 @@
    FebsResponse goChargeInfo(ApiGoChargeInfoDto apiGoChargeInfoDto);
    List<ApiChargeVo> getChargeList(ApiChargeListDto apiChargeListDto);
    List<ApiGetRunDateVo> getRunDate(ApiGetRunDateDto queryDto);
    ApiRunDataVo runData();
    ApiRunHealthVo runHealth();
}
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -361,7 +361,7 @@
            mallMember.setAvatar(modifyMemberInfoDto.getPhoto());
        }
        this.baseMapper.updateById(mallMember);
        this.baseMapper.updateNameAndAvatar(member.getId(),modifyMemberInfoDto.getName(),modifyMemberInfoDto.getPhoto());
        return new FebsResponse().success().message("修改成功");
    }
@@ -691,20 +691,24 @@
    @Override
    public void setPayment(ApiMallMemberPaymentDto apiMallMemberPaymentDto) {
        List<MallMemberPayment> mallMemberPayments = mallMemberPaymentMapper.selectList(
                new LambdaQueryWrapper<MallMemberPayment>().eq(MallMemberPayment::getBank, apiMallMemberPaymentDto.getBank()));
        if(CollUtil.isNotEmpty(mallMemberPayments)){
            throw new FebsException("地址已使用");
        }
        MallMember member = LoginUserUtil.getLoginUser();
        if(null == apiMallMemberPaymentDto.getId()){//新增
            List<MallMemberPayment> mallMemberPayments = mallMemberPaymentMapper.selectList(
                    new LambdaQueryWrapper<MallMemberPayment>().eq(MallMemberPayment::getBank, apiMallMemberPaymentDto.getBank()));
            if(CollUtil.isNotEmpty(mallMemberPayments)){
                throw new FebsException("地址已使用");
            }
            MallMemberPayment mallMemberPayment = new MallMemberPayment();
            mallMemberPayment.setMemberId(member.getId());
            mallMemberPayment.setBankNo(apiMallMemberPaymentDto.getBankNo());
            mallMemberPayment.setBank(apiMallMemberPaymentDto.getBank());
            mallMemberPaymentMapper.insert(mallMemberPayment);
        }else{
            List<MallMemberPayment> mallMemberPayments = mallMemberPaymentMapper.selectList(
                    new LambdaQueryWrapper<MallMemberPayment>().eq(MallMemberPayment::getBank, apiMallMemberPaymentDto.getBank()));
            if(CollUtil.isNotEmpty(mallMemberPayments) && mallMemberPayments.size() > 1){
                throw new FebsException("地址已使用");
            }
            MallMemberPayment mallMemberPayment = mallMemberPaymentMapper.selectById(apiMallMemberPaymentDto.getId());
            mallMemberPayment.setMemberId(member.getId());
            mallMemberPayment.setBankNo(apiMallMemberPaymentDto.getBankNo());
@@ -1576,7 +1580,11 @@
            mallMoneyFlowLambdaQueryWrapper.ge(MallMoneyFlow :: getCreatedTime , dateTime);
        }
        mallMoneyFlowLambdaQueryWrapper.eq(MallMoneyFlow :: getFlowType, FlowTypeEnum.SCORE.getValue());
        mallMoneyFlowLambdaQueryWrapper.eq(MallMoneyFlow :: getType, RunVipMoneyFlowTypeEnum.SCORE_OUT_BALANCE.getValue());
        mallMoneyFlowLambdaQueryWrapper.in(
                MallMoneyFlow :: getType,
                RunVipMoneyFlowTypeEnum.GET_SCORE.getValue(),
                RunVipMoneyFlowTypeEnum.SYS_SCORE.getValue()
        );
        List<MallMoneyFlow> mallMoneyFlows = mallMoneyFlowMapper.selectList(mallMoneyFlowLambdaQueryWrapper);
        List<ApiChartVo> apiChartVos = new ArrayList<>();
src/main/java/cc/mrbird/febs/mall/service/impl/AsyncServiceImpl.java
New file
@@ -0,0 +1,43 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
import cc.mrbird.febs.common.enumerates.RunVipMoneyFlowTypeEnum;
import cc.mrbird.febs.common.enumerates.YesOrNoEnum;
import cc.mrbird.febs.common.utils.MallUtils;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.mapper.MallMemberMapper;
import cc.mrbird.febs.mall.service.AsyncService;
import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
@Slf4j
@Service
@RequiredArgsConstructor
public class AsyncServiceImpl extends ServiceImpl<MallMemberMapper, MallMember> implements AsyncService {
    private final IMallMoneyFlowService mallMoneyFlowService;
    private final IApiMallMemberWalletService walletService;
    @Override
    public void releaseScore(BigDecimal V3, Long memberId) {
        walletService.addScore(V3,memberId);
        String orderNo = MallUtils.getOrderNum("HD");
        mallMoneyFlowService.runVipMoneyFlowAdd(
                memberId,
                memberId,
                orderNo,
                FlowTypeEnum.SCORE.getValue(),
                RunVipMoneyFlowTypeEnum.GET_SCORE.getValue(),
                V3,
                StrUtil.format(RunVipMoneyFlowTypeEnum.GET_SCORE.getDescription(),V3),
                YesOrNoEnum.YES.getValue()
        );
    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -1,18 +1,20 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
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.enumerates.*;
import cc.mrbird.febs.common.utils.AppContants;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
import cc.mrbird.febs.mall.service.AsyncService;
import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
import cc.mrbird.febs.mall.service.IMemberProfitService;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -48,6 +50,9 @@
    private final MallAchieveRecordMapper mallAchieveRecordMapper;
    private final MallMemberCouponMapper mallMemberCouponMapper;
    private final RunVipMapper runVipMapper;
    private final MallMemberWalletMapper mallMemberWalletMapper;
    private final AsyncService asyncService;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -497,6 +502,7 @@
    @Override
    public void updateMemberLevel() {
        mallMemberWalletMapper.updateScore();
        List<RunVip> runVips = runVipMapper.selectList(new LambdaQueryWrapper<RunVip>().orderByAsc(RunVip :: getOrderNumber));
        RunVip runVip = runVips.get(0);
@@ -513,4 +519,102 @@
            );
        }
    }
    public static void main(String[] args) {
        //计算当前时间是否是最后一次
        String lastDateTimeStr = DateUtil.formatDate(DateUtil.date())+" 20:00:00";
        DateTime lastDateTime = DateUtil.parseDateTime(lastDateTimeStr);
        System.out.println(DateUtil.compare(DateUtil.date(),lastDateTime) > 0);
        System.out.println(DateUtil.parseTime(DateUtil.date().toTimeStr()));
    }
    /**
     * 获取全部会员
     *      根据会员等级的最大每日获得去给用户新增碳积分
     *      更新钱包数据
     *      生成对应的流水数据
     * 释放规则
     *    当前时间的小时 H1 / 2,整除时
     *      每个会员等级每日总释放量 T1 / 总时间间隔 C1 = 每次释放量上限 V1
     *      每次释放量上线 V1 / 2 = 每次释放量下限 V2
     *      每次释放量 V3 = 随机 [V2,V1)
     *    当前时间的小时 H1 / 2,不整除时
     *      每个会员等级每日总释放量 T1 / 总时间间隔 C1 = 每次释放量上限 V1
     *      每次释放量 V3 = 每次释放量上限 V1 + (每次释放量上限 V1 - 上一次释放的数量 U1)
     *          如果上一次没有释放,则 V3 = 每次释放量上限 [V1,V1*2)
     */
    @Override
    public void updateRunScore() {
        DateTime nowTimeStr = DateUtil.date();
        String startTimeStr = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                RunVipDataDictionaryEnum.RUN_START_TIME.getType(),
                RunVipDataDictionaryEnum.RUN_START_TIME.getCode()
        ).getValue();
        String endTimeStr = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                RunVipDataDictionaryEnum.RUN_END_TIME.getType(),
                RunVipDataDictionaryEnum.RUN_END_TIME.getCode()
        ).getValue();
        DateTime nowTime = DateUtil.parseTime(nowTimeStr.toTimeStr());
        DateTime startTime = DateUtil.parseTime(startTimeStr);
        DateTime endTime = DateUtil.parseTime(endTimeStr);
        //判断时间是否在时间范围内
        if(DateUtil.compare(nowTime,startTime) < 0 || DateUtil.compare(nowTime,endTime) > 0){
            return;
        }
        int hour = DateUtil.hour(nowTime,true);
        boolean flag = isDivisibleByTwo(hour);
        int C1 = Integer.parseInt(String.valueOf(DateUtil.between(startTime, endTime, DateUnit.HOUR)));
        List<RunVip> runVips = runVipMapper.selectList(null);
        Map<String, RunVip> runVipMap = runVips.stream()
                .collect(Collectors.toMap(RunVip::getVipCode, runVip -> runVip));
        List<MallMember> mallMembers = mallMemberMapper.selectList(null);
        if(CollUtil.isNotEmpty(mallMembers)){
            for (MallMember item : mallMembers) {
                RunVip runVip = runVipMap.get(item.getLevel());
                if(ObjectUtil.isEmpty(runVip)){
                    //未匹配到,直接跳过
                    continue;
                }
                BigDecimal T1 = new BigDecimal(runVip.getGrowthCnt());
                BigDecimal V3 = BigDecimal.ZERO;
                BigDecimal V1 = T1.divide(new BigDecimal(C1), 2, BigDecimal.ROUND_DOWN);
                if (flag) {
                    BigDecimal V2 = V1.divide(new BigDecimal("2"), 2, BigDecimal.ROUND_DOWN);
                    V3 = RandomUtil.randomBigDecimal(V2,V1);
                }else{
                    List<MallMoneyFlow> mallMoneyFlows = mallMoneyFlowMapper.selectList(
                            new LambdaQueryWrapper<MallMoneyFlow>()
                                    .eq(MallMoneyFlow::getMemberId, item.getId())
                                    .eq(MallMoneyFlow::getFlowType, FlowTypeEnum.SCORE.getValue())
                                    .eq(MallMoneyFlow::getType, RunVipMoneyFlowTypeEnum.GET_SCORE.getValue())
                                    .ge(MallMoneyFlow::getCreatedTime, DateUtil.beginOfDay(nowTimeStr))
                                    .orderByDesc(MallMoneyFlow::getCreatedTime)
                                    .last("LIMIT 1")
                    );
                    if(CollUtil.isNotEmpty(mallMoneyFlows)){
                        V3 = V1.add(V1.subtract(mallMoneyFlows.get(0).getAmount()));
                    }else{
                        V3 = RandomUtil.randomBigDecimal(V1,V1.multiply(new BigDecimal("2")));
                    }
                }
                V3 = V3.setScale(0,BigDecimal.ROUND_DOWN);
                //更新钱包数据
                if(V3.intValue() <= 0){
                    continue;
                }
                //异步线程池去释放积分操作
                asyncService.releaseScore(V3,item.getId());
            }
        }
    }
    public boolean isDivisibleByTwo(int number) {
        return number % 2 == 0;
    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/RunVipServiceImpl.java
@@ -1,33 +1,27 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
import cc.mrbird.febs.common.enumerates.RunVipDataDictionaryEnum;
import cc.mrbird.febs.common.enumerates.RunVipMoneyFlowTypeEnum;
import cc.mrbird.febs.common.enumerates.YesOrNoEnum;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.utils.LoginUserUtil;
import cc.mrbird.febs.common.utils.MallUtils;
import cc.mrbird.febs.mall.conversion.RunVipConversion;
import cc.mrbird.febs.mall.dto.ApiChargeListDto;
import cc.mrbird.febs.mall.dto.ApiGoChargeDto;
import cc.mrbird.febs.mall.dto.ApiGoChargeInfoDto;
import cc.mrbird.febs.mall.dto.ApiMemberChargeFailDto;
import cc.mrbird.febs.mall.entity.MallCharge;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.entity.MallMemberPayment;
import cc.mrbird.febs.mall.entity.RunVip;
import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper;
import cc.mrbird.febs.mall.mapper.MallChargeMapper;
import cc.mrbird.febs.mall.mapper.MallMemberPaymentMapper;
import cc.mrbird.febs.mall.mapper.RunVipMapper;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
import cc.mrbird.febs.mall.service.IRunVipService;
import cc.mrbird.febs.mall.vo.ApiChargeVo;
import cc.mrbird.febs.mall.vo.ApiGoChargeVo;
import cc.mrbird.febs.mall.vo.ApiRunVipVo;
import cc.mrbird.febs.mall.vo.*;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -38,6 +32,9 @@
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@Slf4j
@Service
@@ -48,6 +45,9 @@
    private final MallMemberPaymentMapper mallMemberPaymentMapper;
    private final MallChargeMapper mallChargeMapper;
    private final AgentProducer agentProducer;
    private final MallMoneyFlowMapper mallMoneyFlowMapper;
    private final MallMemberWalletMapper mallMemberWalletMapper;
    private final MallMemberMapper mallMemberMapper;
    @Override
    public List<ApiRunVipVo> vipInfo() {
        MallMember member = LoginUserUtil.getLoginUser();
@@ -72,7 +72,14 @@
    public FebsResponse goCharge(ApiGoChargeDto apiGoChargeDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        MallMember mallMember = mallMemberMapper.selectById(memberId);
        if (StrUtil.isBlank(mallMember.getTradePassword())) {
            throw new FebsException("未设置资金密码");
        }
        if (!mallMember.getTradePassword().equals(SecureUtil.md5(apiGoChargeDto.getTradeWord()))) {
            throw new FebsException("资金密码错误");
        }
        Long runVipId = apiGoChargeDto.getRunVipId();
        RunVip runVip = this.baseMapper.selectById(runVipId);
        if(runVip.getState() != YesOrNoEnum.YES.getValue()){
@@ -169,4 +176,139 @@
        Page<ApiChargeVo> page = new Page<>(apiChargeListDto.getPageNum(), apiChargeListDto.getPageSize());
        return mallChargeMapper.selectChargeListInPage(apiChargeListDto, page);
    }
    @Override
    public List<ApiGetRunDateVo> getRunDate(ApiGetRunDateDto queryDto) {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        DateTime dateTime = DateUtil.parseDate(queryDto.getDateStr());
        DateTime startTime = DateUtil.beginOfMonth(dateTime);
        DateTime endTime = DateUtil.endOfMonth(dateTime);
        long between = DateUtil.between(startTime, endTime, DateUnit.DAY);
        List<ApiGetRunDateVo> apiGetRunDateVos = generateDateList(startTime, between);
        List<MallMoneyFlow> mallMoneyFlows = mallMoneyFlowMapper.selectList(
                new LambdaQueryWrapper<MallMoneyFlow>()
                        .eq(MallMoneyFlow::getMemberId, memberId)
                        .eq(MallMoneyFlow::getFlowType, FlowTypeEnum.SCORE.getValue())
                        .eq(MallMoneyFlow::getType, RunVipMoneyFlowTypeEnum.SCORE_OUT_BALANCE.getValue())
                        .ge(MallMoneyFlow::getCreatedTime, startTime)
                        .le(MallMoneyFlow::getCreatedTime, endTime)
        );
        if(CollUtil.isNotEmpty(mallMoneyFlows)){
            calculateProfits(apiGetRunDateVos,mallMoneyFlows);
        }
        return apiGetRunDateVos;
    }
    /**
     * 生成日期列表
     *
     * @param startDate 开始日期
     * @param days      从开始日期算起的天数
     * @return 一个包含日期信息的ApiGetRunDateVo对象列表
     */
    private List<ApiGetRunDateVo> generateDateList(DateTime startDate, long days) {
        // 使用IntStream生成从0到days(包含days)的整数流,表示每一天
        return IntStream.range(0, (int) days + 1)
                // 将每个整数映射为一个ApiGetRunDateVo对象
                .mapToObj(i -> {
                    // 创建ApiGetRunDateVo对象
                    ApiGetRunDateVo apiGetRunDateVo = new ApiGetRunDateVo();
                    // 计算日期:从起始日期开始偏移i天
                    DateTime dateTime = DateUtil.offsetDay(startDate, i);
                    // 格式化日期为"yyyy-MM-dd"字符串,并设置到对象中
                    apiGetRunDateVo.setDateStr(DateUtil.format(dateTime, "yyyy-MM-dd"));
                    // 初始化碳积分为0
                    apiGetRunDateVo.setScore(BigDecimal.ZERO);
                    // 返回构建好的对象
                    return apiGetRunDateVo;
                })
                // 将流中的对象收集到一个列表中
                .collect(Collectors.toList());
    }
    /**
     * 计算每日累计碳积分
     *
     * @param dateList 日期列表,包含了每日的碳积分信息
     * @param mallMoneyFlows 商城资金流列表,包含了每笔碳积分信息
     */
    private void calculateProfits(List<ApiGetRunDateVo> dateList, List<MallMoneyFlow> mallMoneyFlows) {
        // 将日期列表转换为映射,以便通过日期快速访问每日碳积分信息
        Map<String, ApiGetRunDateVo> dateMap = dateList.stream()
                .collect(Collectors.toMap(ApiGetRunDateVo::getDateStr, vo -> vo));
        // 遍历mallMoneyFlows
        for (MallMoneyFlow item : mallMoneyFlows) {
            // 格式化当前项的创建时间,提取日期
            String date = DateUtil.format(item.getCreatedTime(), "yyyy-MM-dd");
            // 从日期映射中获取对应的每日碳积分信息
            ApiGetRunDateVo apiGetRunDateVo = dateMap.get(date);
            // 如果找到了对应的每日碳积分信息
            if (apiGetRunDateVo != null) {
                // 获取当前日期的碳积分
                BigDecimal score = apiGetRunDateVo.getScore();
                // 计算新的碳积分,将碳积分与碳积分相加,并向下取整到个位数
                BigDecimal profit = score.add(item.getAmount().abs()).setScale(0,BigDecimal.ROUND_DOWN);
                // 更新每日碳积分信息的利润值
                apiGetRunDateVo.setScore(profit);
            }
        }
    }
    @Override
    public ApiRunDataVo runData() {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        ApiRunDataVo apiRunDataVo = new ApiRunDataVo();
        MallMember mallMember = mallMemberMapper.selectById(memberId);
        String level = mallMember.getLevel();
        RunVip runVip = this.baseMapper.selectOne(new LambdaQueryWrapper<RunVip>().eq(RunVip::getVipCode, level));
        apiRunDataVo.setAimScore(runVip.getGrowthCnt());
        List<MallMoneyFlow> mallMoneyFlows = mallMoneyFlowMapper.selectList(
                new LambdaQueryWrapper<MallMoneyFlow>()
                        .eq(MallMoneyFlow::getMemberId, memberId)
                        .eq(MallMoneyFlow::getFlowType, FlowTypeEnum.SCORE.getValue())
                        .in(MallMoneyFlow::getType, RunVipMoneyFlowTypeEnum.GET_SCORE.getValue(),RunVipMoneyFlowTypeEnum.SYS_SCORE.getValue())
                        .ge(MallMoneyFlow::getCreatedTime, DateUtil.beginOfDay(DateUtil.date()))
                        .le(MallMoneyFlow::getCreatedTime, DateUtil.endOfDay(DateUtil.date()))
        );
        if(CollUtil.isNotEmpty(mallMoneyFlows)){
            BigDecimal reduce = mallMoneyFlows.stream().map(MallMoneyFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
            apiRunDataVo.setScore(reduce.intValue());
        }
        MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId);
        apiRunDataVo.setBalance(mallMemberWallet.getBalance());
        apiRunDataVo.setRealScore(mallMemberWallet.getScore().intValue());
        return apiRunDataVo;
    }
    @Override
    public ApiRunHealthVo runHealth() {
        Long memberId = LoginUserUtil.getLoginUser().getId();
        ApiRunHealthVo apiRunHealthVo = new ApiRunHealthVo();
        MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId);
        int realScore = mallMemberWallet.getScore().intValue();
        apiRunHealthVo.setScore(realScore);
        List<MallMoneyFlow> mallMoneyFlows = mallMoneyFlowMapper.selectList(
                new LambdaQueryWrapper<MallMoneyFlow>()
                        .eq(MallMoneyFlow::getMemberId, memberId)
                        .eq(MallMoneyFlow::getFlowType, FlowTypeEnum.SCORE.getValue())
                        .in(MallMoneyFlow::getType, RunVipMoneyFlowTypeEnum.GET_SCORE.getValue(),RunVipMoneyFlowTypeEnum.SYS_SCORE.getValue())
                        .ge(MallMoneyFlow::getCreatedTime, DateUtil.beginOfDay(DateUtil.date()))
                        .le(MallMoneyFlow::getCreatedTime, DateUtil.endOfDay(DateUtil.date()))
        );
        if(CollUtil.isNotEmpty(mallMoneyFlows)){
            BigDecimal reduce = mallMoneyFlows.stream().map(MallMoneyFlow::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
            if(reduce.intValue() > realScore){
                apiRunHealthVo.setScoreUsed(reduce.intValue() - realScore);
                apiRunHealthVo.setScoreTotal(reduce.intValue());
            }
        }
        return apiRunHealthVo;
    }
}
src/main/java/cc/mrbird/febs/mall/vo/ApiGetRunDateVo.java
New file
@@ -0,0 +1,18 @@
package cc.mrbird.febs.mall.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "ApiGetRunDateVo", description = "信息返回类")
public class ApiGetRunDateVo {
    @ApiModelProperty(value = "日期")
    private String  dateStr;
    @ApiModelProperty(value = "当日已兑换碳积分")
    private BigDecimal score;
}
src/main/java/cc/mrbird/febs/mall/vo/ApiRunDataVo.java
New file
@@ -0,0 +1,26 @@
package cc.mrbird.febs.mall.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "ApiRunDataVo", description = "信息返回类")
public class ApiRunDataVo {
    @ApiModelProperty(value = "我的碳积分")
    private Integer score = 0;//今日累计获得
    @ApiModelProperty(value = "碳币")
    private BigDecimal  balance = BigDecimal.ZERO;
    @ApiModelProperty(value = "今日行走")
    private Integer  realScore = 0;//今日剩余
    @ApiModelProperty(value = "今日目标")
    private Integer  aimScore = 0;//当前等级每日获取的最大值
}
src/main/java/cc/mrbird/febs/mall/vo/ApiRunHealthVo.java
New file
@@ -0,0 +1,23 @@
package cc.mrbird.febs.mall.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "ApiRunHealthVo", description = "信息返回类")
public class ApiRunHealthVo {
    @ApiModelProperty(value = "可兑换")
    private Integer score = 0;
    @ApiModelProperty(value = "今日累计兑换")
    private Integer scoreUsed = 0;
    @ApiModelProperty(value = "碳积分")
    private Integer scoreTotal = 0;
}
src/main/resources/application-dev.yml
@@ -79,4 +79,5 @@
    path: /home/javaweb/resource/
system:
  job: true
  job: true
  runStep: true
src/main/resources/application-prod.yml
@@ -79,4 +79,5 @@
    path: /home/javaweb/resource/
system:
  job: true
  job: true
  runStep: true
src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -438,8 +438,6 @@
        order by m.CREATED_TIME desc
    </select>
    <update id="updateReferrerId">
        update mall_member
        set referrer_id = '',
@@ -447,16 +445,12 @@
        where id = #{id}
    </update>
    <update id="updateLastLogin">
        update mall_member
        set last_login_time = #{lastLogin}
        where id = #{id}
    </update>
    <update id="updateVipLevelTimeAndLevel">
        update mall_member
        set vip_level_time = #{vipLevelTime},
@@ -464,4 +458,11 @@
        where id = #{id}
    </update>
    <update id="updateNameAndAvatar">
        update mall_member
        set avatar = #{photo},
            name = #{name}
        where id = #{id}
    </update>
</mapper>
src/main/resources/mapper/modules/MallMemberWalletMapper.xml
@@ -51,4 +51,9 @@
        </if>
        where id=#{record.id} and revision=#{record.revision}
    </update>
    <update id="updateScore">
        UPDATE mall_member_wallet
        SET score = 0
    </update>
</mapper>
src/main/resources/mapper/modules/MallMoneyFlowMapper.xml
@@ -26,14 +26,11 @@
        select
        a.*,
        b.name,
        b.bind_phone bindPhone,
        c.pay_method payMethod,
        b.phone
        from mall_money_flow a
        inner join mall_member b on a.member_id=b.id
        left join mall_order_info c on a.order_no = c.order_no
        <where>
            1=1 and a.status = 2
            1=1
            <if test="record != null" >
                <if test="record.name!=null and record.name!=''">
                    and b.name like concat('%',  #{record.name},'%')
@@ -41,11 +38,11 @@
                <if test="record.phone!=null and record.phone!=''">
                    and b.phone like concat('%',  #{record.phone},'%')
                </if>
                <if test="record.type!=null and record.type!=''">
                    and a.type like concat('%',  #{record.type},'%')
                <if test="record.type!=null">
                    and a.type = #{record.type}
                </if>
                <if test="record.flowType!=null and record.flowType!=''">
                    and a.flow_type like concat('%',  #{record.flowType},'%')
                <if test="record.flowType!=null">
                    and a.flow_type = #{record.flowType}
                </if>
                <if test="record.startTime != null and record.startTime != ''">
                    and a.created_time &gt;= #{record.startTime}
src/main/resources/templates/febs/views/modules/runVip/buyVipList.html
@@ -133,13 +133,13 @@
                    {type: 'numbers', title: '序号', width: 80},
                    {field: 'orderNo', title: '编号', minWidth: 100,align:'center', totalRowText: '合计'},
                    {field: 'account', title: '账号', minWidth: 150,align:'center'},
                    {field: 'type', title: '链', minWidth: 100,align:'center'},
                    {field: 'vipName', title: '会员名称', minWidth: 100,align:'center'},
                    {field: 'vipCnt', title: '数量', minWidth: 100,align:'center'},
                    {field: 'amount', title: '金额', minWidth: 100,align:'center',totalRow: '{{= parseInt(d.amount) }}'},
                    {field: 'type', title: '链', minWidth: 100,align:'center'},
                    {field: 'address', title: '地址', minWidth: 100,align:'center'},
                    {title: '状态', templet: '#stateType', minWidth: 100,align:'center'},
                    {field: 'failTime', title: '失效时间', minWidth: 180,align:'center'},
                    {field: 'vipCnt', title: '数量', minWidth: 100,align:'center'},
                    {field: 'createdTime', title: '创建时间', minWidth: 180,align:'center'},
                    {title: '操作', toolbar: '#commissionOption', minWidth: 200}
                ]],
src/test/java/cc/mrbird/febs/AgentTest.java
@@ -1,737 +1,20 @@
//package cc.mrbird.febs;
//
//import cc.mrbird.febs.vip.service.IVipCommonService;
//import lombok.extern.slf4j.Slf4j;
//import org.junit.jupiter.api.Test;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.test.context.SpringBootTest;
//
///**
// * @author wzy
// * @date 2021-09-25
// **/
//@Slf4j
//@SpringBootTest
//public class AgentTest {
//    @Autowired
//    private IVipCommonService vipCommonService;
package cc.mrbird.febs;
import cc.mrbird.febs.mall.service.IMemberProfitService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@Slf4j
@SpringBootTest
public class AgentTest {
    @Autowired
    private IMemberProfitService memberProfitService;
//    @Test
//    public void getCouponAmountMap(){
//        vipCommonService.getScore(283L);
//
//        memberProfitService.updateRunScore();
//
//    }
//
//
////    @Autowired
////    private RedisUtils redisUtils;
////    @Resource
////    RestTemplate restTemplate;
////
////    public static final String API_KEY = "MPHXcBxkGLIDOmoaahS9pIB7";
////    public static final String SECRET_KEY = "f5ueNY65fE9C6FzFTVKc6Imo8NdZSWMw";
////
////    static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();
////    @Test
////    public void getAccessToken(){
////        ApiIdentifyAddressDto apiIdentifyAddressDto = new ApiIdentifyAddressDto();
////        apiIdentifyAddressDto.setText("上海市浦东新区纳贤路701号百度上海研发中心 F4A000 张三");
////        MediaType mediaType = MediaType.parse("application/json");
////        RequestBody body = RequestBody.create(mediaType, JSONUtil.toJsonStr(apiIdentifyAddressDto));
////        Request request = new Request.Builder()
////                .url("https://aip.baidubce.com/rpc/2.0/nlp/v1/address?access_token=" + redisUtils.get(WechatConfigure.BAIDU_ACCESS_TOKEN_REDIS_KEY).toString())
////                .method("POST", body)
////                .addHeader("Content-Type", "application/json")
////                .addHeader("Accept", "application/json")
////                .build();
////        try {
////            Response response = HTTP_CLIENT.newCall(request).execute();
////            String responseStr = response.body().string();
////            System.out.println(responseStr);
////            if (responseStr.contains("error_code")) {
////                System.out.println("获取access_token失败");
////                JSONObject jsonObject = JSONUtil.parseObj(responseStr);
////                System.out.print(jsonObject.get("error_code").toString());
////            }
////        } catch (IOException e) {
////            e.printStackTrace();
////        }
////    }
////    @Test
////    public void getAccessToken2(){
////        // 官网获取的 API Key 更新为你注册的
////        String clientId = "MPHXcBxkGLIDOmoaahS9pIB7";
////        // 官网获取的 Secret Key 更新为你注册的
////        String clientSecret = "f5ueNY65fE9C6FzFTVKc6Imo8NdZSWMw";
////        String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
////        String getAccessTokenUrl = authHost
////                // 1. grant_type为固定参数
////                + "grant_type=client_credentials"
////                // 2. 官网获取的 API Key
////                + "&client_id=" + clientId
////                // 3. 官网获取的 Secret Key
////                + "&client_secret=" + clientSecret;
////        String jsonStr = restTemplate.getForObject(getAccessTokenUrl, String.class);
////
////        /**
////         * 返回结果
////         * {"access_token":"ACCESS_TOKEN","expires_in":7200}
////         */
////        if (!jsonStr.contains("access_token")) {
////            System.out.println("获取access_token失败");
////        }
////        com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(jsonStr);
////        String accessToken = jsonObject.getString("access_token");
////
////        String accessTokenKey = WechatConfigure.BAIDU_ACCESS_TOKEN_REDIS_KEY;
////        if (StrUtil.isEmpty(accessToken)) {
////            log.error("获取baidu access_token失败: {}" , jsonObject.getString("errmsg"));
////            throw new ApiException("获取access token失败");
////        } else {
////            log.info("baidu access_token : {}",accessToken);
////            System.out.println(accessToken);
////            redisUtils.set(accessTokenKey,accessToken);
////        }
////    }
////    @Test
////    public void goodsDetails(){
////        Long id = 68L;
////        MallGoods mallGoods = mallGoodsMapper.selectGoodsDetailById(id);
////        if (mallGoods == null) {
////            throw new FebsException("商品不存在");
////        }
////        List<String> images = goodsImagesMapper.selectGoodsImagesByGoodsId(mallGoods.getId());
////        MallGoodsDetailsVo mallGoodsDetailsVo = MallGoodsConversion.INSTANCE.entityToDetailsVo(mallGoods);
////
////        List<GoodsDetailsStyleVo> styles = mallGoodsDetailsVo.getStyles();
////        if(ObjectUtil.isNotEmpty(styles)){
////            for(GoodsDetailsStyleVo goodsDetailsStyleVo : styles){
////                List<GoodsDetailsSkuVo> skus = goodsDetailsStyleVo.getSkus();
////                if(CollUtil.isNotEmpty(skus) ){
////                    for(GoodsDetailsSkuVo goodsDetailsSkuVo : skus){
////                        if(StrUtil.isNotEmpty(goodsDetailsSkuVo.getSample())){
////                            goodsDetailsSkuVo.setSampleFlag(true);
////                        }else{
////                            goodsDetailsSkuVo.setSampleFlag(false);
////                        }
////                    }
////                }
////            }
////        }
////
////        if (CollUtil.isNotEmpty(mallGoods.getStyles())) {
////            Map<String, BigDecimal> stockAndVolume = mallGoodsMapper.selectGoodsStockAndVolume(id);
////            mallGoodsDetailsVo.setStock(stockAndVolume.get("stock").intValue());
////            mallGoodsDetailsVo.setVolume(stockAndVolume.get("volume").intValue());
////        }
////        mallGoodsDetailsVo.setImages(images);
////
////    }
////
////    @Test
////    public void levelTest(){
////        ApiCreateOrderVerifyDto apiCreateOrderVerifyDto = new ApiCreateOrderVerifyDto();
////        List<AddOrderItemDto> addOrderItemDtos = new ArrayList<>();
////        AddOrderItemDto addOrderItemDto = new AddOrderItemDto();
////        addOrderItemDto.setCnt(1);
////        addOrderItemDto.setSkuId(243L);
////        addOrderItemDtos.add(addOrderItemDto);
////        apiCreateOrderVerifyDto.setItems(addOrderItemDtos);
////        MallMember member = mallMemberMapper.selectById(401L);
////        List<AddOrderItemDto> items = apiCreateOrderVerifyDto.getItems();
////        if(CollUtil.isEmpty(items)){
////            System.out.println("请先挑选商品");
////        }
////        for (AddOrderItemDto item : apiCreateOrderVerifyDto.getItems()) {
////            MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId());
////            if (sku == null) {
////                System.out.println("购买商品或sku不存在");
////            }
////            if("样品".equals(sku.getSample())){
////                List<MallOrderItem> mallOrderItems = mallOrderItemMapper.selectItemBySkuIdUnCancel(sku.getId(), member.getId());
////                if (CollUtil.isNotEmpty(mallOrderItems)) {
////                    System.out.println("样品只能购买一次");
////                }
////                Integer cnt = item.getCnt();
////                if(1 < cnt){
////                    System.out.println("样品只能购买一件");
////                }
////            }else{
////                //验证用户的等级
////                if(AgentLevelEnum.ZERO_LEVEL.name().equals(member.getLevel())){
////                    System.out.println(sku.getSkuName() + "请先申请成为合伙人");
////                }
////            }
////
////            if (sku.getStock() < item.getCnt()) {
////                System.out.println(sku.getSkuName() + "库存不足");
////            }
////
////            MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId());
////            if (MallGoods.ISSALE_STATUS_DISABLED.equals(mallGoods.getIsSale())) {
////                System.out.println(mallGoods.getGoodsName() + "已下架");
////            }
////        }
////    }
//////    @Test
//////    public void skusTest() {
//////        ApiMallAwardDetailsVo apiMallAwardDetailsVo = new ApiMallAwardDetailsVo();
//////        Long memberId = 4L;
//////        Long actId = 1L;
//////        MallMember mallMember = mallMemberMapper.selectById(memberId);
//////        if(ObjectUtil.isEmpty(mallMember)){
//////            throw new FebsException("用户不存在");
//////        }
//////
//////        MallActSet mallActSet = mallActSetMapper.selectById(actId);
//////        if(ObjectUtil.isEmpty(mallActSet)){
//////            throw new FebsException("活动不存在");
//////        }
//////        Integer actStatus = mallActSet.getActStatus();
//////        if(MallActSet.ACT_STATUS_DISABLED == actStatus){
//////            throw new FebsException("活动还没开始");
//////        }
//////        /**
//////         * 获取用户积分数,判断能不能抽奖
//////         * 减少对应的积分数量
//////         * 较少奖品的已抽奖
//////         * 生成一条抽奖记录
//////         */
//////
//////        MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(memberId);
//////        if(ObjectUtil.isEmpty(wallet)){
//////            throw new FebsException("账户不存在");
//////        }
//////        BigDecimal commission = wallet.getCommission();
//////        BigDecimal prizeScore = wallet.getPrizeScore();
//////        Integer actScoreCnt = mallActSet.getActScoreCnt();
//////        if(prizeScore.compareTo(new BigDecimal(actScoreCnt))<0){
//////            throw new FebsException("竞猜积分不足");
//////        }
//////        /**
//////         * 中奖概率 20%
//////         * 每次抽奖产生一个随机数要大于8,则中奖
//////         * 历史10条抽奖记录有中奖过,中奖记录少于两条,则中奖
//////         */
//////        //获取中奖概率
//////        DataDictionaryCustom scoreDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
//////                DataDictionaryEnum.WIN_SCORE.getType(),
//////                DataDictionaryEnum.WIN_SCORE.getCode());
//////        DataDictionaryCustom cashDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
//////                DataDictionaryEnum.WIN_CASH.getType(),
//////                DataDictionaryEnum.WIN_CASH.getCode());
//////        String scoreDicValue = scoreDic.getValue();
//////        String cashDicValue = cashDic.getValue();
//////        BigDecimal totalProbability = new BigDecimal(scoreDicValue).add(new BigDecimal(cashDicValue));
//////        //获取那个更大一点的几率
//////        BigDecimal maxProbability = BigDecimal.ZERO;
//////        BigDecimal minProbability = BigDecimal.ZERO;
//////        Integer maxAwardType = 0;
//////        Integer minAwardType = 0;
//////        if(new BigDecimal(scoreDicValue).compareTo(new BigDecimal(cashDicValue)) < 0){
//////            maxProbability = new BigDecimal(cashDicValue);
//////            minProbability = new BigDecimal(scoreDicValue);
//////            maxAwardType = MallActAwardSet.AWARD_TYPE_YJ;
//////            minAwardType = MallActAwardSet.AWARD_TYPE_JF;
//////        }else{
//////            maxProbability = new BigDecimal(scoreDicValue);
//////            minProbability = new BigDecimal(cashDicValue);
//////            maxAwardType = MallActAwardSet.AWARD_TYPE_JF;
//////            minAwardType = MallActAwardSet.AWARD_TYPE_YJ;
//////        }
//////
//////        BigDecimal multiply = totalProbability.multiply(new BigDecimal(100));
//////        BigDecimal failureScope = new BigDecimal(100).subtract(multiply);
//////        int randomInt = 90;
//////        //小于failureScope这个数字,则没中奖
//////        if(new BigDecimal(randomInt).compareTo(failureScope) <= 0){
//////            //抽奖记录
//////            MallActLuckdrawRecord mallActLuckdrawRecord = new MallActLuckdrawRecord();
//////            mallActLuckdrawRecord.setActId(actId);
//////            mallActLuckdrawRecord.setActName(mallActSet.getActName());
//////            mallActLuckdrawRecord.setMemberId(memberId);
//////            mallActLuckdrawRecord.setActScoreCnt(actScoreCnt);
//////            mallActLuckdrawRecord.setStatus(MallActLuckdrawRecord.STATUS_DISABLED);
//////            mallActLuckdrawRecordMapper.insert(mallActLuckdrawRecord);
//////
//////            List<MallActAwardSet> mallActAwardSetXXCY = mallActAwardSetMapper.selectMallActAwardByActIdAndAwardType(actId, MallActAwardSet.AWARD_TYPE_XXCY);
//////            if(CollUtil.isNotEmpty(mallActAwardSetXXCY)){
//////                apiMallAwardDetailsVo.setAwardImage(mallActAwardSetXXCY.get(0).getAwardImage());
//////                apiMallAwardDetailsVo.setAwardName(mallActAwardSetXXCY.get(0).getAwardName());
//////            }else{
//////                apiMallAwardDetailsVo.setAwardName("未中奖");
//////            }
//////        }else if(new BigDecimal(randomInt).compareTo(failureScope) > 0
//////                && new BigDecimal(randomInt).compareTo(failureScope.add(maxProbability.multiply(new BigDecimal(100)))) <= 0){
//////            //大于failureScope.add(maxProbability.multiply(new BigDecimal(100)))这个数字,则中奖
//////            //获取最新的十条抽奖记录
//////            List<MallActLuckdrawRecord> records = mallActLuckdrawRecordMapper.selectRecordByMemberIdAndActId(memberId,actId);
//////            if(CollUtil.isNotEmpty(records)){
//////                //中奖次数
//////                Integer count = 0;
//////                for(MallActLuckdrawRecord mallActLuckdrawRecord : records){
//////                    Integer status = mallActLuckdrawRecord.getStatus();
//////                    if(MallActLuckdrawRecord.STATUS_ENABLE == status){
//////                        count = count + 1;
//////                    }
//////                }
//////                if(new BigDecimal(count).compareTo(maxProbability.multiply(new BigDecimal(10))) < 0){
//////                    //获取活动下该类别的奖品
//////                    List<MallActAwardSet> mallActAwardSets = mallActAwardSetMapper.selectMallActAwardByActIdAndAwardType(actId,maxAwardType);
//////                    if(CollUtil.isEmpty(mallActAwardSets)){
//////                        //抽奖记录
//////                        MallActLuckdrawRecord mallActLuckdrawRecord = new MallActLuckdrawRecord();
//////                        mallActLuckdrawRecord.setActId(actId);
//////                        mallActLuckdrawRecord.setActName(mallActSet.getActName());
//////                        mallActLuckdrawRecord.setMemberId(memberId);
//////                        mallActLuckdrawRecord.setActScoreCnt(actScoreCnt);
//////                        mallActLuckdrawRecord.setStatus(MallActLuckdrawRecord.STATUS_DISABLED);
//////                        mallActLuckdrawRecordMapper.insert(mallActLuckdrawRecord);
//////
//////                        List<MallActAwardSet> mallActAwardSetXXCY = mallActAwardSetMapper.selectMallActAwardByActIdAndAwardType(actId, MallActAwardSet.AWARD_TYPE_XXCY);
//////                        if(CollUtil.isNotEmpty(mallActAwardSetXXCY)){
//////                            apiMallAwardDetailsVo.setAwardImage(mallActAwardSetXXCY.get(0).getAwardImage());
//////                            apiMallAwardDetailsVo.setAwardName(mallActAwardSetXXCY.get(0).getAwardName());
//////                        }else{
//////                            apiMallAwardDetailsVo.setAwardName("未中奖");
//////                        }
//////                    }else{
//////                        List<MallActAwardSet> idList = new ArrayList();
//////                        for(MallActAwardSet mallActAwardSet : mallActAwardSets){
//////                            Integer awardTotal = mallActAwardSet.getAwardTotal();
//////                            Integer awardCnt = mallActAwardSet.getAwardCnt();
//////                            if(awardCnt < awardTotal){
//////                                idList.add(mallActAwardSet);
//////                            }
//////                        }
//////                        MallActAwardSet mallActAwardSet = new MallActAwardSet();
//////                        if(idList.size() <= 1){
//////                            mallActAwardSet = idList.get(0);
//////                        }else{
//////                            int randomIdIndex = RandomUtil.randomInt(0, idList.size()-1);
//////                            mallActAwardSet = idList.get(randomIdIndex);
//////                        }
//////                        mallActAwardSet.setAwardCnt(mallActAwardSet.getAwardCnt() + 1);
//////                        mallActAwardSetMapper.updateById(mallActAwardSet);
//////
//////                        MallActLuckdrawRecord mallActLuckdrawRecord = new MallActLuckdrawRecord();
//////                        mallActLuckdrawRecord.setActId(actId);
//////                        mallActLuckdrawRecord.setActName(mallActSet.getActName());
//////                        mallActLuckdrawRecord.setMemberId(memberId);
//////                        mallActLuckdrawRecord.setActScoreCnt(actScoreCnt);
//////                        mallActLuckdrawRecord.setStatus(MallActLuckdrawRecord.STATUS_ENABLE);
//////                        mallActLuckdrawRecordMapper.insert(mallActLuckdrawRecord);
//////
//////                        MallActWinRecord mallActWinRecord = new MallActWinRecord();
//////                        mallActWinRecord.setMemberId(memberId);
//////                        mallActWinRecord.setActId(actId);
//////                        mallActWinRecord.setActName(mallActSet.getActName());
//////                        mallActWinRecord.setAwardId(mallActAwardSet.getId());
//////                        mallActWinRecord.setAwardName(mallActAwardSet.getAwardName());
//////                        mallActWinRecord.setAwardType(mallActAwardSet.getAwardType());
//////                        mallActWinRecord.setAwardValue(mallActAwardSet.getAwardValue());
//////                        mallActWinRecord.setRecordId(mallActLuckdrawRecord.getId());
//////                        mallActWinRecordMapper.insert(mallActWinRecord);
//////
//////                        apiMallAwardDetailsVo.setAwardName(mallActAwardSet.getAwardName());
//////                        apiMallAwardDetailsVo.setAwardType(mallActAwardSet.getAwardType());
//////                        apiMallAwardDetailsVo.setAwardValue(mallActAwardSet.getAwardValue());
//////                        apiMallAwardDetailsVo.setAwardImage(mallActAwardSet.getAwardImage());
//////
//////                        if(MallActAwardSet.AWARD_TYPE_JF == mallActAwardSet.getAwardType()){
//////                            prizeScore = prizeScore.add(new BigDecimal(mallActAwardSet.getAwardValue()));
//////                        }else if(MallActAwardSet.AWARD_TYPE_YJ == mallActAwardSet.getAwardType()){
//////                            commission = commission.add(new BigDecimal(mallActAwardSet.getAwardValue()));
//////                        }
//////                    }
//////                }else{
//////                    //抽奖记录
//////                    MallActLuckdrawRecord mallActLuckdrawRecord = new MallActLuckdrawRecord();
//////                    mallActLuckdrawRecord.setActId(actId);
//////                    mallActLuckdrawRecord.setActName(mallActSet.getActName());
//////                    mallActLuckdrawRecord.setMemberId(memberId);
//////                    mallActLuckdrawRecord.setActScoreCnt(actScoreCnt);
//////                    mallActLuckdrawRecord.setStatus(MallActLuckdrawRecord.STATUS_DISABLED);
//////                    mallActLuckdrawRecordMapper.insert(mallActLuckdrawRecord);
//////
//////                    List<MallActAwardSet> mallActAwardSetXXCY = mallActAwardSetMapper.selectMallActAwardByActIdAndAwardType(actId, MallActAwardSet.AWARD_TYPE_XXCY);
//////                    if(CollUtil.isNotEmpty(mallActAwardSetXXCY)){
//////                        apiMallAwardDetailsVo.setAwardImage(mallActAwardSetXXCY.get(0).getAwardImage());
//////                        apiMallAwardDetailsVo.setAwardName(mallActAwardSetXXCY.get(0).getAwardName());
//////                    }else{
//////                        apiMallAwardDetailsVo.setAwardName("未中奖");
//////                    }
//////                }
//////            }else{
//////                //获取活动下该类别的奖品
//////                List<MallActAwardSet> mallActAwardSets = mallActAwardSetMapper.selectMallActAwardByActIdAndAwardType(actId,maxAwardType);
//////                if(CollUtil.isEmpty(mallActAwardSets)){
//////                    //抽奖记录
//////                    MallActLuckdrawRecord mallActLuckdrawRecord = new MallActLuckdrawRecord();
//////                    mallActLuckdrawRecord.setActId(actId);
//////                    mallActLuckdrawRecord.setActName(mallActSet.getActName());
//////                    mallActLuckdrawRecord.setMemberId(memberId);
//////                    mallActLuckdrawRecord.setActScoreCnt(actScoreCnt);
//////                    mallActLuckdrawRecord.setStatus(MallActLuckdrawRecord.STATUS_DISABLED);
//////                    mallActLuckdrawRecordMapper.insert(mallActLuckdrawRecord);
//////
//////                    List<MallActAwardSet> mallActAwardSetXXCY = mallActAwardSetMapper.selectMallActAwardByActIdAndAwardType(actId, MallActAwardSet.AWARD_TYPE_XXCY);
//////                    if(CollUtil.isNotEmpty(mallActAwardSetXXCY)){
//////                        apiMallAwardDetailsVo.setAwardImage(mallActAwardSetXXCY.get(0).getAwardImage());
//////                        apiMallAwardDetailsVo.setAwardName(mallActAwardSetXXCY.get(0).getAwardName());
//////                    }else{
//////                        apiMallAwardDetailsVo.setAwardName("未中奖");
//////                    }
//////                }else{
//////                    List<MallActAwardSet> idList = new ArrayList();
//////                    for(MallActAwardSet mallActAwardSet : mallActAwardSets){
//////                        Integer awardTotal = mallActAwardSet.getAwardTotal();
//////                        Integer awardCnt = mallActAwardSet.getAwardCnt();
//////                        if(awardCnt < awardTotal){
//////                            idList.add(mallActAwardSet);
//////                        }
//////                    }
//////                    MallActAwardSet mallActAwardSet = new MallActAwardSet();
//////                    if(idList.size() <= 1){
//////                        mallActAwardSet = idList.get(0);
//////                    }else{
//////                        int randomIdIndex = RandomUtil.randomInt(0, idList.size()-1);
//////                        mallActAwardSet = idList.get(randomIdIndex);
//////                    }
//////                    mallActAwardSet.setAwardCnt(mallActAwardSet.getAwardCnt() + 1);
//////                    mallActAwardSetMapper.updateById(mallActAwardSet);
//////
//////                    MallActLuckdrawRecord mallActLuckdrawRecord = new MallActLuckdrawRecord();
//////                    mallActLuckdrawRecord.setActId(actId);
//////                    mallActLuckdrawRecord.setActName(mallActSet.getActName());
//////                    mallActLuckdrawRecord.setMemberId(memberId);
//////                    mallActLuckdrawRecord.setActScoreCnt(actScoreCnt);
//////                    mallActLuckdrawRecord.setStatus(MallActLuckdrawRecord.STATUS_ENABLE);
//////                    mallActLuckdrawRecordMapper.insert(mallActLuckdrawRecord);
//////
//////                    MallActWinRecord mallActWinRecord = new MallActWinRecord();
//////                    mallActWinRecord.setMemberId(memberId);
//////                    mallActWinRecord.setActId(actId);
//////                    mallActWinRecord.setActName(mallActSet.getActName());
//////                    mallActWinRecord.setAwardId(mallActAwardSet.getId());
//////                    mallActWinRecord.setAwardName(mallActAwardSet.getAwardName());
//////                    mallActWinRecord.setAwardType(mallActAwardSet.getAwardType());
//////                    mallActWinRecord.setAwardValue(mallActAwardSet.getAwardValue());
//////                    mallActWinRecord.setRecordId(mallActLuckdrawRecord.getId());
//////                    mallActWinRecordMapper.insert(mallActWinRecord);
//////
//////                    apiMallAwardDetailsVo.setAwardName(mallActAwardSet.getAwardName());
//////                    apiMallAwardDetailsVo.setAwardType(mallActAwardSet.getAwardType());
//////                    apiMallAwardDetailsVo.setAwardValue(mallActAwardSet.getAwardValue());
//////                    apiMallAwardDetailsVo.setAwardImage(mallActAwardSet.getAwardImage());
//////
//////                    if(MallActAwardSet.AWARD_TYPE_JF == mallActAwardSet.getAwardType()){
//////                        prizeScore = prizeScore.add(new BigDecimal(mallActAwardSet.getAwardValue()));
//////                    }else if(MallActAwardSet.AWARD_TYPE_YJ == mallActAwardSet.getAwardType()){
//////                        commission = commission.add(new BigDecimal(mallActAwardSet.getAwardValue()));
//////                    }
//////                }
//////            }
//////        }else{
//////            //中奖
//////            //获取最新的十条抽奖记录
//////            List<MallActLuckdrawRecord> records = mallActLuckdrawRecordMapper.selectRecordByMemberIdAndActId(memberId,actId);
//////            if(CollUtil.isNotEmpty(records)){
//////                //中奖次数
//////                Integer count = 0;
//////                for(MallActLuckdrawRecord mallActLuckdrawRecord : records){
//////                    Integer status = mallActLuckdrawRecord.getStatus();
//////                    if(MallActLuckdrawRecord.STATUS_ENABLE == status){
//////                        count = count + 1;
//////                    }
//////                }
//////                if(new BigDecimal(count).compareTo(minProbability.multiply(new BigDecimal(10))) < 0){
//////                    //获取活动下该类别的奖品
//////                    List<MallActAwardSet> mallActAwardSets = mallActAwardSetMapper.selectMallActAwardByActIdAndAwardType(actId,minAwardType);
//////                    if(CollUtil.isEmpty(mallActAwardSets)){
//////                        //抽奖记录
//////                        MallActLuckdrawRecord mallActLuckdrawRecord = new MallActLuckdrawRecord();
//////                        mallActLuckdrawRecord.setActId(actId);
//////                        mallActLuckdrawRecord.setActName(mallActSet.getActName());
//////                        mallActLuckdrawRecord.setMemberId(memberId);
//////                        mallActLuckdrawRecord.setActScoreCnt(actScoreCnt);
//////                        mallActLuckdrawRecord.setStatus(MallActLuckdrawRecord.STATUS_DISABLED);
//////                        mallActLuckdrawRecordMapper.insert(mallActLuckdrawRecord);
//////
//////                        List<MallActAwardSet> mallActAwardSetXXCY = mallActAwardSetMapper.selectMallActAwardByActIdAndAwardType(actId, MallActAwardSet.AWARD_TYPE_XXCY);
//////                        if(CollUtil.isNotEmpty(mallActAwardSetXXCY)){
//////                            apiMallAwardDetailsVo.setAwardImage(mallActAwardSetXXCY.get(0).getAwardImage());
//////                            apiMallAwardDetailsVo.setAwardName(mallActAwardSetXXCY.get(0).getAwardName());
//////                        }else{
//////                            apiMallAwardDetailsVo.setAwardName("未中奖");
//////                        }
//////                    }else{
//////                        List<MallActAwardSet> idList = new ArrayList();
//////                        for(MallActAwardSet mallActAwardSet : mallActAwardSets){
//////                            Integer awardTotal = mallActAwardSet.getAwardTotal();
//////                            Integer awardCnt = mallActAwardSet.getAwardCnt();
//////                            if(awardCnt < awardTotal){
//////                                idList.add(mallActAwardSet);
//////                            }
//////                        }
//////                        MallActAwardSet mallActAwardSet = new MallActAwardSet();
//////                        if(idList.size() <= 1){
//////                            mallActAwardSet = idList.get(0);
//////                        }else{
//////                            int randomIdIndex = RandomUtil.randomInt(0, idList.size()-1);
//////                            mallActAwardSet = idList.get(randomIdIndex);
//////                        }
//////                        mallActAwardSet.setAwardCnt(mallActAwardSet.getAwardCnt() + 1);
//////                        mallActAwardSetMapper.updateById(mallActAwardSet);
//////
//////                        MallActLuckdrawRecord mallActLuckdrawRecord = new MallActLuckdrawRecord();
//////                        mallActLuckdrawRecord.setActId(actId);
//////                        mallActLuckdrawRecord.setActName(mallActSet.getActName());
//////                        mallActLuckdrawRecord.setMemberId(memberId);
//////                        mallActLuckdrawRecord.setActScoreCnt(actScoreCnt);
//////                        mallActLuckdrawRecord.setStatus(MallActLuckdrawRecord.STATUS_ENABLE);
//////                        mallActLuckdrawRecordMapper.insert(mallActLuckdrawRecord);
//////
//////                        MallActWinRecord mallActWinRecord = new MallActWinRecord();
//////                        mallActWinRecord.setMemberId(memberId);
//////                        mallActWinRecord.setActId(actId);
//////                        mallActWinRecord.setActName(mallActSet.getActName());
//////                        mallActWinRecord.setAwardId(mallActAwardSet.getId());
//////                        mallActWinRecord.setAwardName(mallActAwardSet.getAwardName());
//////                        mallActWinRecord.setAwardType(mallActAwardSet.getAwardType());
//////                        mallActWinRecord.setAwardValue(mallActAwardSet.getAwardValue());
//////                        mallActWinRecord.setRecordId(mallActLuckdrawRecord.getId());
//////                        mallActWinRecordMapper.insert(mallActWinRecord);
//////
//////                        apiMallAwardDetailsVo.setAwardName(mallActAwardSet.getAwardName());
//////                        apiMallAwardDetailsVo.setAwardType(mallActAwardSet.getAwardType());
//////                        apiMallAwardDetailsVo.setAwardValue(mallActAwardSet.getAwardValue());
//////                        apiMallAwardDetailsVo.setAwardImage(mallActAwardSet.getAwardImage());
//////
//////                        if(MallActAwardSet.AWARD_TYPE_JF == mallActAwardSet.getAwardType()){
//////                            prizeScore = prizeScore.add(new BigDecimal(mallActAwardSet.getAwardValue()));
//////                        }else if(MallActAwardSet.AWARD_TYPE_YJ == mallActAwardSet.getAwardType()){
//////                            commission = commission.add(new BigDecimal(mallActAwardSet.getAwardValue()));
//////                        }
//////                    }
//////                }else{
//////                    //抽奖记录
//////                    MallActLuckdrawRecord mallActLuckdrawRecord = new MallActLuckdrawRecord();
//////                    mallActLuckdrawRecord.setActId(actId);
//////                    mallActLuckdrawRecord.setActName(mallActSet.getActName());
//////                    mallActLuckdrawRecord.setMemberId(memberId);
//////                    mallActLuckdrawRecord.setActScoreCnt(actScoreCnt);
//////                    mallActLuckdrawRecord.setStatus(MallActLuckdrawRecord.STATUS_DISABLED);
//////                    mallActLuckdrawRecordMapper.insert(mallActLuckdrawRecord);
//////
//////                    List<MallActAwardSet> mallActAwardSetXXCY = mallActAwardSetMapper.selectMallActAwardByActIdAndAwardType(actId, MallActAwardSet.AWARD_TYPE_XXCY);
//////                    if(CollUtil.isNotEmpty(mallActAwardSetXXCY)){
//////                        apiMallAwardDetailsVo.setAwardImage(mallActAwardSetXXCY.get(0).getAwardImage());
//////                        apiMallAwardDetailsVo.setAwardName(mallActAwardSetXXCY.get(0).getAwardName());
//////                    }else{
//////                        apiMallAwardDetailsVo.setAwardName("未中奖");
//////                    }
//////                }
//////            }else{
//////                //获取活动下该类别的奖品
//////                List<MallActAwardSet> mallActAwardSets = mallActAwardSetMapper.selectMallActAwardByActIdAndAwardType(actId,minAwardType);
//////                if(CollUtil.isEmpty(mallActAwardSets)){
//////                    //抽奖记录
//////                    MallActLuckdrawRecord mallActLuckdrawRecord = new MallActLuckdrawRecord();
//////                    mallActLuckdrawRecord.setActId(actId);
//////                    mallActLuckdrawRecord.setActName(mallActSet.getActName());
//////                    mallActLuckdrawRecord.setMemberId(memberId);
//////                    mallActLuckdrawRecord.setActScoreCnt(actScoreCnt);
//////                    mallActLuckdrawRecord.setStatus(MallActLuckdrawRecord.STATUS_DISABLED);
//////                    mallActLuckdrawRecordMapper.insert(mallActLuckdrawRecord);
//////
//////                    List<MallActAwardSet> mallActAwardSetXXCY = mallActAwardSetMapper.selectMallActAwardByActIdAndAwardType(actId, MallActAwardSet.AWARD_TYPE_XXCY);
//////                    if(CollUtil.isNotEmpty(mallActAwardSetXXCY)){
//////                        apiMallAwardDetailsVo.setAwardImage(mallActAwardSetXXCY.get(0).getAwardImage());
//////                        apiMallAwardDetailsVo.setAwardName(mallActAwardSetXXCY.get(0).getAwardName());
//////                    }else{
//////                        apiMallAwardDetailsVo.setAwardName("未中奖");
//////                    }
//////                }else{
//////                    List<MallActAwardSet> idList = new ArrayList();
//////                    for(MallActAwardSet mallActAwardSet : mallActAwardSets){
//////                        Integer awardTotal = mallActAwardSet.getAwardTotal();
//////                        Integer awardCnt = mallActAwardSet.getAwardCnt();
//////                        if(awardCnt < awardTotal){
//////                            idList.add(mallActAwardSet);
//////                        }
//////                    }
//////                    MallActAwardSet mallActAwardSet = new MallActAwardSet();
//////                    if(idList.size() <= 1){
//////                        mallActAwardSet = idList.get(0);
//////                    }else{
//////                        int randomIdIndex = RandomUtil.randomInt(0, idList.size()-1);
//////                        mallActAwardSet = idList.get(randomIdIndex);
//////                    }
//////                    mallActAwardSet.setAwardCnt(mallActAwardSet.getAwardCnt() + 1);
//////                    mallActAwardSetMapper.updateById(mallActAwardSet);
//////
//////                    MallActLuckdrawRecord mallActLuckdrawRecord = new MallActLuckdrawRecord();
//////                    mallActLuckdrawRecord.setActId(actId);
//////                    mallActLuckdrawRecord.setActName(mallActSet.getActName());
//////                    mallActLuckdrawRecord.setMemberId(memberId);
//////                    mallActLuckdrawRecord.setActScoreCnt(actScoreCnt);
//////                    mallActLuckdrawRecord.setStatus(MallActLuckdrawRecord.STATUS_ENABLE);
//////                    mallActLuckdrawRecordMapper.insert(mallActLuckdrawRecord);
//////
//////                    MallActWinRecord mallActWinRecord = new MallActWinRecord();
//////                    mallActWinRecord.setMemberId(memberId);
//////                    mallActWinRecord.setActId(actId);
//////                    mallActWinRecord.setActName(mallActSet.getActName());
//////                    mallActWinRecord.setAwardId(mallActAwardSet.getId());
//////                    mallActWinRecord.setAwardName(mallActAwardSet.getAwardName());
//////                    mallActWinRecord.setAwardType(mallActAwardSet.getAwardType());
//////                    mallActWinRecord.setAwardValue(mallActAwardSet.getAwardValue());
//////                    mallActWinRecord.setRecordId(mallActLuckdrawRecord.getId());
//////                    mallActWinRecordMapper.insert(mallActWinRecord);
//////
//////                    apiMallAwardDetailsVo.setAwardName(mallActAwardSet.getAwardName());
//////                    apiMallAwardDetailsVo.setAwardType(mallActAwardSet.getAwardType());
//////                    apiMallAwardDetailsVo.setAwardValue(mallActAwardSet.getAwardValue());
//////                    apiMallAwardDetailsVo.setAwardImage(mallActAwardSet.getAwardImage());
//////
//////                    if(MallActAwardSet.AWARD_TYPE_JF == mallActAwardSet.getAwardType()){
//////                        prizeScore = prizeScore.add(new BigDecimal(mallActAwardSet.getAwardValue()));
//////                    }else if(MallActAwardSet.AWARD_TYPE_YJ == mallActAwardSet.getAwardType()){
//////                        commission = commission.add(new BigDecimal(mallActAwardSet.getAwardValue()));
//////                    }
//////                }
//////            }
//////        }
//////
//////        //扣竞猜积分
//////        prizeScore = prizeScore.subtract(new BigDecimal(actScoreCnt));
//////        wallet.setPrizeScore(prizeScore);
//////        wallet.setCommission(commission);
//////        mallMemberWalletMapper.updateAmountWithVersion(wallet);
//////
//////        System.out.println(apiMallAwardDetailsVo);
//////    }
//////
//////    @Test
//////    public void agentTest() {
////////        agentProducer.sendDelayMsg(1L, 10000L);
//////
//////        ApiMallActWinDetailsDto apiMallActWinDetailsDto = new ApiMallActWinDetailsDto();
//////        apiMallActWinDetailsDto.setActId(1L);
//////        apiMallActWinDetailsDto.setPageNow(1);
//////        apiMallActWinDetailsDto.setPageSize(10);
//////        Long memberId = 4L;
//////        MallMember mallMember = mallMemberMapper.selectById(memberId);
//////        if(ObjectUtil.isEmpty(mallMember)){
//////            throw new FebsException("用户不存在");
//////        }
//////        apiMallActWinDetailsDto.setMemberId(memberId);
//////
//////        Long actId = apiMallActWinDetailsDto.getActId();
//////        MallActSet mallActSet = mallActSetMapper.selectById(actId);
//////        if(ObjectUtil.isEmpty(mallActSet)){
//////            throw new FebsException("活动不存在");
//////        }
//////        Page<ApiMallActWinDetailsVo> page = new Page<>(apiMallActWinDetailsDto.getPageNow(), apiMallActWinDetailsDto.getPageSize());
//////        IPage<ApiMallActWinDetailsVo> apiMallActWinDetailsVoIPage = mallActWinRecordMapper.selectApiMallActWinDetailsListInPage(apiMallActWinDetailsDto, page);
//////        System.out.println(apiMallActWinDetailsVoIPage);
//////    }
//////
//////    @Test
//////    public void insertAgentTest() {
////////        AgentInfo agentInfo = new AgentInfo();
////////        agentInfo.setOrderType(2);
////////        agentInfo.setOrderCnt(2000);
////////        agentInfo.setLastCnt(3);
////////        agentInfo.setDirectIncome(BigDecimal.valueOf(50));
////////        agentInfo.setTeamIncome(BigDecimal.valueOf(15));
////////        agentInfo.setTeamIncomeType(2);
////////
////////        DataDictionaryCustom data = new DataDictionaryCustom();
////////        data.setType("AGENT_LEVEL_REQUIRE");
////////        data.setCode(AgentLevelEnum.FOUR_LEVEL.name());
////////        data.setValue(JSONObject.toJSONString(agentInfo));
////////        dataDictionaryCustomMapper.insert(data);
//////    }
//////
//////    @Test
//////    public void insertData() {
//////        int i = 1;
//////        for (AgentLevelEnum value : AgentLevelEnum.values()) {
//////            DataDictionaryCustom data = new DataDictionaryCustom();
//////            data.setType("AGENT_LEVEL");
//////            data.setDescription(value.getName());
//////            data.setCode(value.name());
//////            data.setValue(String.valueOf(i));
//////            dataDictionaryCustomMapper.insert(data);
//////        }
//////
//////    }
//////
//////    public static void main(String[] args) {
//////        getJson();
//////    }
//////
//////    public static void getJson(){
//////        AgentLevelUpdateDto adminAgentLevelUpdateInfoVo = new AgentLevelUpdateDto();
//////        String jsonStr = "{\"directIncome\":50,\"lastCnt\":3,\"orderCnt\":2000,\"orderType\":2,\"teamIncome\":15,\"teamIncomeType\":2}";
//////        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
//////        adminAgentLevelUpdateInfoVo.setDirectIncome(new BigDecimal((jsonObject.get("directIncome")==null?0:jsonObject.get("directIncome")).toString()));
//////        adminAgentLevelUpdateInfoVo.setLastCnt(Integer.parseInt((jsonObject.get("lastCnt")==null?0:jsonObject.get("lastCnt")).toString()));
//////        adminAgentLevelUpdateInfoVo.setOrderCnt(Integer.parseInt((jsonObject.get("orderCnt")==null?0:jsonObject.get("orderCnt")).toString()));
//////        adminAgentLevelUpdateInfoVo.setOrderType(Integer.parseInt(jsonObject.get("orderType").toString()));
//////        adminAgentLevelUpdateInfoVo.setTeamIncome(new BigDecimal((jsonObject.get("teamIncome")==null?0:jsonObject.get("teamIncome")).toString()));
//////        adminAgentLevelUpdateInfoVo.setTeamIncomeType(Integer.parseInt(jsonObject.get("orderType").toString()));
//////        adminAgentLevelUpdateInfoVo.setId(14L);
//////        AgentLevelUpdateDto agentLevelUpdateDtoJson = new AgentLevelUpdateDto();
//////        agentLevelUpdateDtoJson.setDirectIncome(adminAgentLevelUpdateInfoVo.getDirectIncome());
//////        agentLevelUpdateDtoJson.setLastCnt(adminAgentLevelUpdateInfoVo.getLastCnt());
//////        agentLevelUpdateDtoJson.setOrderCnt(adminAgentLevelUpdateInfoVo.getOrderCnt());
//////        agentLevelUpdateDtoJson.setTeamIncome(adminAgentLevelUpdateInfoVo.getTeamIncome());
//////        agentLevelUpdateDtoJson.setOrderType(adminAgentLevelUpdateInfoVo.getOrderType());
//////        agentLevelUpdateDtoJson.setTeamIncomeType(adminAgentLevelUpdateInfoVo.getTeamIncomeType());
//////        JSONObject jsonObjectA = (JSONObject)JSONObject.toJSON(agentLevelUpdateDtoJson);
//////        System.out.println(jsonObjectA.toJSONString());
//////    }
//////
//////    @Test
//////    public void autoLevelUp() {
//////        // agentService.autoUpAgentLevel(3L);
////////        agentProducer.sendAutoLevelUpMsg(5L);
//////
//////        agentProducer.sendReturnMoneyMsg(2L);
//////    }
//////
//////    @Test
//////    public void returnMoney() {
//////        // agentService.autoUpAgentLevel(3L);
////////        agentProducer.sendAutoLevelUpMsg(5L);
////////        agentProducer.sendReturnMoneyMsg(52L);
//////        agentService.returnMoneyToAgent(52L);
//////    }
//////
//////    @Test
//////    public void bigdecimalTest() {
//////        BigDecimal aa = new BigDecimal("1.345");
//////
//////        System.out.println(aa.setScale(2, RoundingMode.DOWN));
//////        System.out.println(aa.setScale(2, RoundingMode.UP));
//////    }
//////
//////    @Autowired
//////    private ProfitJob profitJob;
//////
//////    @Test
//////    public void profitJobTest() {
//////        profitJob.profitJob();
//////    }
//////
//////
////    @Autowired
////    private AgentConsumer agentConsumer;
////
////    @Test
////    public void orderReturnTest() {
////        agentConsumer.getScoreMsg(215L);
////    }
//}
}