xiaoyong931011
2021-05-10 5ee80b98b9b1b2e44aa4d9600ef68f6bc1629927
20210510 云顶
10 files added
10 files modified
897 ■■■■■ changed files
src/main/java/com/xcong/excoin/configurations/security/WebSecurityConfig.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/controller/YunDingController.java 88 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/dao/YdBasicSettingDao.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/dao/YdOrderDao.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/dao/YdProductDao.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/dto/PayProductDto.java 26 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/dto/YdOrderListDto.java 26 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/dto/YdProductListDto.java 26 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/entity/YdBasicSettingEntity.java 37 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/entity/YdOrderEntity.java 28 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/entity/YdProductEntity.java 8 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/service/Impl/YunDingServiceImpl.java 286 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/service/YunDingService.java 17 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/vo/OrderAllInfoVo.java 26 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/vo/YdBasicSettingVo.java 29 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/vo/YdOrderVo.java 100 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/yunding/vo/YdProductVo.java 128 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/yunding/YdBasicSettingDao.xml 7 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/yunding/YdOrderDao.xml 17 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/yunding/YdProductDao.xml 21 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/configurations/security/WebSecurityConfig.java
@@ -58,6 +58,9 @@
                .antMatchers("/api/trader/beTraderStatusCondition").permitAll()
                .antMatchers("/api/activity/getActivityMain").permitAll()
                .antMatchers("/api/helpCenter/**").permitAll()
                .antMatchers("/api/yd/findAllInfo").permitAll()
                .antMatchers("/api/yd/getProductList").permitAll()
                .antMatchers("/api/yd/findProductInfo").permitAll()
                .anyRequest().authenticated()
                .and().apply(securityConfiguereAdapter());
    }
src/main/java/com/xcong/excoin/modules/yunding/controller/YunDingController.java
@@ -1,11 +1,17 @@
package com.xcong.excoin.modules.yunding.controller;
import com.xcong.excoin.modules.activity.service.ActivityService;
import com.xcong.excoin.common.response.Result;
import com.xcong.excoin.modules.yunding.dto.PayProductDto;
import com.xcong.excoin.modules.yunding.dto.YdOrderListDto;
import com.xcong.excoin.modules.yunding.dto.YdProductListDto;
import com.xcong.excoin.modules.yunding.service.YunDingService;
import io.swagger.annotations.Api;
import com.xcong.excoin.modules.yunding.vo.OrderAllInfoVo;
import com.xcong.excoin.modules.yunding.vo.YdOrderVo;
import com.xcong.excoin.modules.yunding.vo.YdProductVo;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@@ -18,5 +24,79 @@
    @Resource
    YunDingService yunDingService;
    /**
     * 全网数据
     */
    @ApiOperation(value = "全网数据")
    @GetMapping(value = "/findAllInfo")
    public Result findAllInfo() {
        return yunDingService.findAllInfo();
    }
    /**
     * 算力产品列表
     */
    @ApiOperation(value = "产品列表")
    @ApiResponses({
            @ApiResponse(code = 0, message = "success", response = YdProductVo.class)
    })
    @PostMapping(value = "/getProductList")
    public Result getProductList(@RequestBody @Validated YdProductListDto ydProductListDto) {
        return yunDingService.getProductList(ydProductListDto);
    }
    /**
     * 获取算力产品详情
     */
    @ApiOperation(value = "获取产品详情")
    @GetMapping(value = "/findProductInfo")
    public Result findProductInfoById(@ApiParam(name = "id", value = "产品ID", required = true, example = "1")
                                      @RequestParam(value = "id") Long id) {
        return yunDingService.findProductInfoById(id);
    }
    /**
     * 获取USDT余额
     */
    @ApiOperation(value = "获取USDT余额")
    @GetMapping(value = "/getBalance")
    public Result getBalance() {
        return yunDingService.getBalance();
    }
    /**
     * 支付
     */
    @ApiOperation(value = "购买,点击支付")
    @PostMapping(value = "/payProduct")
    public Result payProduct(@RequestBody @Validated PayProductDto payProductDto) {
        return yunDingService.payProduct(payProductDto);
    }
    /**
     * 订单列表
     */
    @ApiOperation(value = "订单列表")
    @ApiResponses({
            @ApiResponse(code = 0, message = "success", response = YdOrderVo.class)
    })
    @PostMapping(value = "/getOrderList")
    public Result getOrderList(@RequestBody @Validated YdOrderListDto ydOrderListDto) {
        return yunDingService.getOrderList(ydOrderListDto);
    }
    /**
     *订单头部数据
     */
    @ApiOperation(value = "订单头部数据")
    @ApiResponses({
            @ApiResponse(code = 0, message = "success", response = OrderAllInfoVo.class)
    })
    @GetMapping(value = "/findOrderAllInfo")
    public Result findOrderAllInfo() {
        return yunDingService.findOrderAllInfo();
    }
}
src/main/java/com/xcong/excoin/modules/yunding/dao/YdBasicSettingDao.java
New file
@@ -0,0 +1,7 @@
package com.xcong.excoin.modules.yunding.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcong.excoin.modules.yunding.entity.YdBasicSettingEntity;
public interface YdBasicSettingDao extends BaseMapper<YdBasicSettingEntity> {
}
src/main/java/com/xcong/excoin/modules/yunding/dao/YdOrderDao.java
@@ -1,7 +1,15 @@
package com.xcong.excoin.modules.yunding.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xcong.excoin.modules.yunding.dto.YdOrderListDto;
import com.xcong.excoin.modules.yunding.entity.YdOrderEntity;
import com.xcong.excoin.modules.yunding.vo.YdOrderVo;
import org.apache.ibatis.annotations.Param;
public interface YdOrderDao extends BaseMapper<YdOrderEntity> {
    IPage<YdOrderVo> getOrderList(Page<YdOrderVo> page, @Param("record") YdOrderEntity ydOrderEntity);
}
src/main/java/com/xcong/excoin/modules/yunding/dao/YdProductDao.java
@@ -1,7 +1,16 @@
package com.xcong.excoin.modules.yunding.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xcong.excoin.modules.yunding.dto.YdProductListDto;
import com.xcong.excoin.modules.yunding.entity.YdProductEntity;
import com.xcong.excoin.modules.yunding.vo.YdProductVo;
import org.apache.ibatis.annotations.Param;
public interface YdProductDao extends BaseMapper<YdProductEntity> {
    IPage<YdProductVo> getProductList(Page<YdProductVo> page, @Param("record") YdProductListDto ydProductListDto);
    YdProductVo findProductInfoById(@Param("id")Long id);
}
src/main/java/com/xcong/excoin/modules/yunding/dto/PayProductDto.java
New file
@@ -0,0 +1,26 @@
package com.xcong.excoin.modules.yunding.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
@Data
@ApiModel(value = "PayProductDto", description = "支付入参类")
public class PayProductDto {
    @NotNull
    @ApiModelProperty(value = "产品ID", example = "2")
    private Long id;
    /**
     * 购买数量
     */
    @NotNull
    @ApiModelProperty(value = "购买数量", example = "2")
    private BigDecimal quantity;
}
src/main/java/com/xcong/excoin/modules/yunding/dto/YdOrderListDto.java
New file
@@ -0,0 +1,26 @@
package com.xcong.excoin.modules.yunding.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
@Data
@ApiModel(value = "YdOrderListDto", description = "订单列表入参类")
public class YdOrderListDto {
    @NotNull
    @Min(1)
    @ApiModelProperty(value = "第几页", example = "1")
    private int pageNum;
    @NotNull
    @ApiModelProperty(value = "每页数量", example = "10")
    private int pageSize;
    @ApiModelProperty(value = "订单状态1:待生效 2:生效中 3:已终止", example = "2")
    private Integer state;
}
src/main/java/com/xcong/excoin/modules/yunding/dto/YdProductListDto.java
New file
@@ -0,0 +1,26 @@
package com.xcong.excoin.modules.yunding.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
@Data
@ApiModel(value = "YdProductListDto", description = "产品列表入参类")
public class YdProductListDto {
    @NotNull
    @Min(1)
    @ApiModelProperty(value = "第几页", example = "1")
    private int pageNum;
    @NotNull
    @ApiModelProperty(value = "每页数量", example = "10")
    private int pageSize;
    @ApiModelProperty(value = "产品类型1:期货 2:现货", example = "2")
    private Integer typeCoin;
}
src/main/java/com/xcong/excoin/modules/yunding/entity/YdBasicSettingEntity.java
New file
@@ -0,0 +1,37 @@
package com.xcong.excoin.modules.yunding.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
//yd_basic_setting基础参数设置表
@Data
@TableName("yd_basic_setting")
public class YdBasicSettingEntity {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id",type = IdType.AUTO)
    private Long id;
    //合伙人收益比例
    private BigDecimal partnerRatio;
    //当前每T预计产生收益
    private BigDecimal prifitT;
    //全网算力
    private BigDecimal allPower;
    //日平均收益
    private BigDecimal profitDay;
    //矿机模式
    private String powerModel;
    //24小时爆块
    private BigDecimal explosiveBlock;
}
src/main/java/com/xcong/excoin/modules/yunding/entity/YdOrderEntity.java
@@ -16,6 +16,12 @@
    private static final long serialVersionUID = 1L;
    /**
     * 会员ID
     */
    private Long memberId;
    /**
     * 产品ID
     */
@@ -26,6 +32,19 @@
     */
    private Integer quantity;
    /**
     * 返利状态 1:待返利 2:已返利
     */
    private Integer returnState;
    public static final int RETURN_STATE_READY = 1;
    public static final int RETURN_STATE_DONE = 2;
    /**
     * 返利类型 1:USDT 2:XCH
     */
    private Integer returnType;
    /**
     * 总金额
@@ -50,6 +69,15 @@
     */
    private Integer state;
    public static final int ORDER_STATE_READY = 1;
    public static final int ORDER_STATE_WORK = 2;
    public static final int ORDER_STATE_END = 3;
    /**
     * 购买日期
     */
    private Date buyTime;
    /**
     * 生效日期
src/main/java/com/xcong/excoin/modules/yunding/entity/YdProductEntity.java
@@ -90,10 +90,16 @@
    private Integer type;
    /**
     * 1:期货 2:现货
     * 产品类型1:期货 2:现货
     */
    private Integer typeCoin;
    /**
     * 优惠 1:免除电费
     */
    private Integer favourable;
}
src/main/java/com/xcong/excoin/modules/yunding/service/Impl/YunDingServiceImpl.java
@@ -1,14 +1,300 @@
package com.xcong.excoin.modules.yunding.service.Impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xcong.excoin.common.LoginUserUtils;
import com.xcong.excoin.common.response.Result;
import com.xcong.excoin.modules.member.dao.MemberWalletCoinDao;
import com.xcong.excoin.modules.member.entity.MemberEntity;
import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity;
import com.xcong.excoin.modules.yunding.dao.YdBasicSettingDao;
import com.xcong.excoin.modules.yunding.dao.YdOrderDao;
import com.xcong.excoin.modules.yunding.dao.YdProductDao;
import com.xcong.excoin.modules.yunding.dto.PayProductDto;
import com.xcong.excoin.modules.yunding.dto.YdOrderListDto;
import com.xcong.excoin.modules.yunding.dto.YdProductListDto;
import com.xcong.excoin.modules.yunding.entity.YdBasicSettingEntity;
import com.xcong.excoin.modules.yunding.entity.YdOrderEntity;
import com.xcong.excoin.modules.yunding.entity.YdProductEntity;
import com.xcong.excoin.modules.yunding.service.YunDingService;
import com.xcong.excoin.modules.yunding.vo.OrderAllInfoVo;
import com.xcong.excoin.modules.yunding.vo.YdBasicSettingVo;
import com.xcong.excoin.modules.yunding.vo.YdOrderVo;
import com.xcong.excoin.modules.yunding.vo.YdProductVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@Slf4j
@Service
public class YunDingServiceImpl extends ServiceImpl<YdOrderDao, YdOrderEntity> implements YunDingService {
    @Resource
    private YdProductDao ydProductDao;
    @Resource
    private YdBasicSettingDao ydBasicSettingDao;
    @Resource
    private YdOrderDao ydOrderDao;
    @Resource
    private MemberWalletCoinDao memberWalletCoinDao;
    @Override
    public Result findAllInfo() {
        log.info("全网数据");
        YdBasicSettingVo ydBasicSettingVo = new YdBasicSettingVo();
        Wrapper<YdBasicSettingEntity> queryWrapper = new QueryWrapper<>();
        List<YdBasicSettingEntity> ydBasicSettingEntities = ydBasicSettingDao.selectList(queryWrapper);
        if(CollUtil.isNotEmpty(ydBasicSettingEntities)){
            // 不足四位小数补0
            DecimalFormat decimalFormat = new DecimalFormat("0.0000#");
            YdBasicSettingEntity ydBasicSettingEntity = ydBasicSettingEntities.get(0);
            ydBasicSettingVo.setAllPower(ydBasicSettingEntity.getAllPower() == null ? decimalFormat.format(BigDecimal.ZERO) : decimalFormat.format(ydBasicSettingEntity.getAllPower()));
            ydBasicSettingVo.setProfitDay(ydBasicSettingEntity.getProfitDay() == null ?decimalFormat.format(BigDecimal.ZERO) : decimalFormat.format(ydBasicSettingEntity.getProfitDay()));
            ydBasicSettingVo.setPowerModel(ydBasicSettingEntity.getPowerModel() == null ? "" : ydBasicSettingEntity.getPowerModel());
            ydBasicSettingVo.setExplosiveBlock(ydBasicSettingEntity.getExplosiveBlock() == null ?decimalFormat.format(BigDecimal.ZERO) : decimalFormat.format(ydBasicSettingEntity.getExplosiveBlock()));
        }
        return Result.ok(ydBasicSettingVo);
    }
    @Override
    public Result getProductList(YdProductListDto ydProductListDto) {
        log.info("获取产品列表");
        Integer typeCoin = ydProductListDto.getTypeCoin();
        //默认查询现货的产品
        if(ObjectUtil.isEmpty(typeCoin)){
            typeCoin = 2;
        }
        //MemberEntity memberEntity = LoginUserUtils.getAppLoginUser();
        Page<YdProductVo> page = new Page<>(ydProductListDto.getPageNum(), ydProductListDto.getPageSize());
        IPage<YdProductVo> list = ydProductDao.getProductList(page, ydProductListDto);
        return Result.ok(list);
    }
    @Override
    public Result findProductInfoById(Long id) {
        log.info("获取产品详情");
        YdProductVo ydProductVo = ydProductDao.findProductInfoById(id);
        if (ObjectUtil.isEmpty(ydProductVo)) {
            return Result.fail("产品不存在!");
        }
        //预计收益
        Wrapper<YdBasicSettingEntity> queryWrapper = new QueryWrapper<>();
        List<YdBasicSettingEntity> ydBasicSettingEntities = ydBasicSettingDao.selectList(queryWrapper);
        if(CollUtil.isNotEmpty(ydBasicSettingEntities)){
            BigDecimal prifitT = ydBasicSettingEntities.get(0).getPrifitT();
            if(ObjectUtil.isNotEmpty(prifitT)){
                ydProductVo.setProfitT(prifitT);
            }
        }
        /**
         *产出规则
         */
        Date date = DateUtil.date();
        ydProductVo.setNowTime(date);
        //上架天数
        Integer shelvesDays = ydProductVo.getShelvesDays();
        Date workTime = DateUtil.offsetDay(date, shelvesDays);
        ydProductVo.setWorkTime(workTime);
        //服务周期
        Integer proCycle = ydProductVo.getProCycle();
        Date endTime = DateUtil.offsetDay(workTime, proCycle);
        ydProductVo.setEndTime(endTime);
        return Result.ok(ydProductVo);
    }
    @Override
    public Result getBalance() {
        log.info("获取可用USDT");
        MemberEntity memberEntity = LoginUserUtils.getAppLoginUser();
        Long memberId = memberEntity.getId();
//        Long memberId = 28L;
        MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, "USDT");
        BigDecimal availableBalance = memberWalletCoinEntity.getAvailableBalance();
        return Result.ok(availableBalance);
    }
    @Override
    @Transactional
    public Result payProduct(PayProductDto payProductDto) {
        log.info("购买,点击支付");
        /**
         * 获取购买数量和当前价格,计算出支付总数
         * 去加减币币账户余额,减少产品的剩余数目
         *   成功后
         *   生成订单记录
         *   生成返利记录
         */
        MemberEntity memberEntity = LoginUserUtils.getAppLoginUser();
        Long memberId = memberEntity.getId();
//        Long memberId = 28L;
        BigDecimal quantity = payProductDto.getQuantity();
        if(ObjectUtil.isEmpty(quantity)){
            return Result.fail("请输入购买数量");
        }
        if(quantity.compareTo(BigDecimal.ZERO) <= 0){
            return Result.fail("请输入正确的购买数量");
        }
        Long id = payProductDto.getId();
        YdProductEntity ydProductEntity = ydProductDao.selectById(id);
        if(ObjectUtil.isEmpty(ydProductEntity)){
            return Result.fail("请重新选择产品");
        }
        BigDecimal salePrice = ydProductEntity.getSalePrice();
        //剩余产品数量
        BigDecimal surplusT = ydProductEntity.getSurplusT();
        if(quantity.compareTo(surplusT) > 0){
            return Result.fail("当前产品数量不足,请联系客服");
        }
        //支付总数
        BigDecimal multiplyUsdt = quantity.multiply(salePrice);
        if(multiplyUsdt.compareTo(BigDecimal.ZERO) <= 0){
            return Result.fail("支付失败");
        }
        //去加减币币账户余额,减少产品的剩余数目
        boolean flag = updateWalletCoin(memberId, multiplyUsdt,id,quantity);
        if(flag == false){
            return Result.fail("支付失败");
        }
        //生成订单
        YdOrderEntity ydOrderEntity = new YdOrderEntity();
        ydOrderEntity.setMemberId(memberId);
        ydOrderEntity.setProductId(id);
        ydOrderEntity.setQuantity(Integer.parseInt(quantity.toString()));
        ydOrderEntity.setAmount(multiplyUsdt);
        ydOrderEntity.setTotalProfit(BigDecimal.ZERO);
        ydOrderEntity.setTodayProfit(BigDecimal.ZERO);
        ydOrderEntity.setState(YdOrderEntity.ORDER_STATE_READY);
        Date date = DateUtil.date();
        ydOrderEntity.setBuyTime(date);
        //上架天数
        Integer shelvesDays = ydProductEntity.getShelvesDays();
        Date workTime = DateUtil.offsetDay(date, shelvesDays);
        ydOrderEntity.setWorkTime(workTime);
        //服务周期
        Integer proCycle = ydProductEntity.getProCycle();
        Date endTime = DateUtil.offsetDay(workTime, proCycle);
        ydOrderEntity.setEndTime(endTime);
        ydOrderEntity.setReturnState(YdOrderEntity.RETURN_STATE_READY);
        ydOrderDao.insert(ydOrderEntity);
        return Result.ok("支付成功");
    }
    @Override
    public Result getOrderList(YdOrderListDto ydOrderListDto) {
        log.info("获取订单列表");
        Integer state = ydOrderListDto.getState();
        //默认查询待生效
        if(ObjectUtil.isEmpty(state)){
            state = 1;
        }
        MemberEntity memberEntity = LoginUserUtils.getAppLoginUser();
        Long memberId = memberEntity.getId();
        //Long memberId = 28L;
        Page<YdOrderVo> page = new Page<>(ydOrderListDto.getPageNum(), ydOrderListDto.getPageSize());
        YdOrderEntity ydOrderEntity = new YdOrderEntity();
        ydOrderEntity.setMemberId(memberId);
        ydOrderEntity.setState(state);
        IPage<YdOrderVo> list = ydOrderDao.getOrderList(page, ydOrderEntity);
        return Result.ok(list);
    }
    @Override
    public Result findOrderAllInfo() {
        log.info("订单头部数据");
        MemberEntity memberEntity = LoginUserUtils.getAppLoginUser();
        Long memberId = memberEntity.getId();
//        Long memberId = 28L;
        OrderAllInfoVo orderAllInfoVo = new OrderAllInfoVo();
        DecimalFormat decimalFormat = new DecimalFormat("0.0000#");
        //历史总收益
        BigDecimal totalProfitAll = BigDecimal.ZERO;
        QueryWrapper<YdOrderEntity> objectQueryWrapper = new QueryWrapper<>();
        objectQueryWrapper.eq("member_id",memberId);
        List<YdOrderEntity> ydOrderEntities = ydOrderDao.selectList(objectQueryWrapper);
        if(CollUtil.isNotEmpty(ydOrderEntities)){
            for(YdOrderEntity order : ydOrderEntities){
                BigDecimal totalProfit = order.getTotalProfit();
                totalProfitAll = totalProfitAll.add(totalProfit);
            }
        }
        orderAllInfoVo.setAllProfit(decimalFormat.format(totalProfitAll));
        //当前已生效算力
        int powerNow = 0;
        QueryWrapper<YdOrderEntity> powerNowQuery = new QueryWrapper<>();
        powerNowQuery.eq("member_id",memberId);
        powerNowQuery.eq("state",YdOrderEntity.ORDER_STATE_WORK);
        List<YdOrderEntity> PowerNowQuery = ydOrderDao.selectList(powerNowQuery);
        if(CollUtil.isNotEmpty(PowerNowQuery)){
            for(YdOrderEntity order : PowerNowQuery){
                int quantity = order.getQuantity();
                powerNow = powerNow + quantity;
            }
        }
        orderAllInfoVo.setPowerNow(powerNow);
        //当前待生效算力
        int powerReady = 0;
        QueryWrapper<YdOrderEntity> powerReradyQuery = new QueryWrapper<>();
        powerReradyQuery.eq("member_id",memberId);
        powerReradyQuery.eq("state",YdOrderEntity.ORDER_STATE_READY);
        List<YdOrderEntity> PowerReradyQuery = ydOrderDao.selectList(powerNowQuery);
        if(CollUtil.isNotEmpty(PowerReradyQuery)){
            for(YdOrderEntity order : PowerReradyQuery){
                int quantity = order.getQuantity();
                powerReady = powerReady + quantity;
            }
        }
        orderAllInfoVo.setPowerReady(powerReady);
        return Result.ok(orderAllInfoVo);
    }
    /**
     * 去加减币币账户余额,减少产品的剩余数目
     * @param memberId
     * @param multiplyUsdt
     * @param productId
     * @param quantity
     * @return
     */
    public synchronized boolean updateWalletCoin(Long memberId,BigDecimal multiplyUsdt,Long productId,BigDecimal quantity){
        MemberWalletCoinEntity memberWalletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, "USDT");
        BigDecimal availableBalance = memberWalletCoinEntity.getAvailableBalance();
        BigDecimal totalBalance = memberWalletCoinEntity.getTotalBalance();
        BigDecimal availableSubtract = availableBalance.subtract(multiplyUsdt);
        BigDecimal totalSubtract = totalBalance.subtract(multiplyUsdt);
        boolean flag = false;
        if(availableSubtract.compareTo(BigDecimal.ZERO) >= 0){
            //更新余额
            memberWalletCoinEntity.setAvailableBalance(availableSubtract);
            memberWalletCoinEntity.setTotalBalance(totalSubtract);
            memberWalletCoinDao.updateById(memberWalletCoinEntity);
            //减少产品的剩余数量
            YdProductEntity ydProductEntity = ydProductDao.selectById(productId);
            BigDecimal surplusT = ydProductEntity.getSurplusT();
            BigDecimal subtract = surplusT.subtract(quantity);
            ydProductEntity.setSurplusT(subtract);
            ydProductDao.updateById(ydProductEntity);
            flag = true;
        }
        return flag;
    }
}
src/main/java/com/xcong/excoin/modules/yunding/service/YunDingService.java
@@ -1,8 +1,25 @@
package com.xcong.excoin.modules.yunding.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xcong.excoin.common.response.Result;
import com.xcong.excoin.modules.yunding.dto.PayProductDto;
import com.xcong.excoin.modules.yunding.dto.YdOrderListDto;
import com.xcong.excoin.modules.yunding.dto.YdProductListDto;
import com.xcong.excoin.modules.yunding.entity.YdOrderEntity;
public interface YunDingService extends IService<YdOrderEntity> {
    Result findAllInfo();
    Result getProductList(YdProductListDto ydProductListDto);
    Result findProductInfoById(Long id);
    Result getBalance();
    Result payProduct(PayProductDto payProductDto);
    Result getOrderList(YdOrderListDto ydOrderListDto);
    Result findOrderAllInfo();
}
src/main/java/com/xcong/excoin/modules/yunding/vo/OrderAllInfoVo.java
New file
@@ -0,0 +1,26 @@
package com.xcong.excoin.modules.yunding.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "OrderAllInfoVo", description = "产品详情")
public class OrderAllInfoVo {
    //昨日收益
    @ApiModelProperty("昨日收益")
    private String lastdayProfit;
    //当前拥有算力
    @ApiModelProperty("当前拥有算力")
    private int powerNow;
    //当前待生效拥有算力
    @ApiModelProperty("当前待生效拥有算力")
    private int powerReady;
    //历史总受益
    @ApiModelProperty("历史总受益")
    private String allProfit;
}
src/main/java/com/xcong/excoin/modules/yunding/vo/YdBasicSettingVo.java
New file
@@ -0,0 +1,29 @@
package com.xcong.excoin.modules.yunding.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "YdBasicSettingVo", description = "产品详情")
public class YdBasicSettingVo {
    //全网算力
    @ApiModelProperty("全网算力")
    private String allPower;
    //日平均收益
    @ApiModelProperty("日平均收益")
    private String profitDay;
    //矿机模式
    @ApiModelProperty("矿机模式")
    private String powerModel;
    //24小时爆块
    @ApiModelProperty("24小时爆块")
    private String explosiveBlock;
}
src/main/java/com/xcong/excoin/modules/yunding/vo/YdOrderVo.java
New file
@@ -0,0 +1,100 @@
package com.xcong.excoin.modules.yunding.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
@ApiModel(value = "YdOrderVo", description = "订单详情")
public class YdOrderVo {
    @ApiModelProperty("订单ID")
    private Long id;
    /**
     * 产品ID
     */
    @ApiModelProperty("产品ID")
    private Long productId;
    /**
     * 购买数量
     */
    @ApiModelProperty("购买数量")
    private Integer quantity;
    /**
     * 总金额
     */
    @ApiModelProperty("总金额")
    private BigDecimal amount;
    /**
     * 累计收益
     */
    @ApiModelProperty("累计收益")
    private BigDecimal totalProfit;
    /**
     * 今日收益
     */
    @ApiModelProperty("今日收益")
    private BigDecimal todayProfit;
    /**
     * 1:待生效 2:生效中 3:已终止
     */
    @ApiModelProperty("1:待生效 2:生效中 3:已终止")
    private Integer state;
    /**
     * 购买日期
     */
    @ApiModelProperty("购买日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date buyTime;
    /**
     * 生效日期
     */
    @ApiModelProperty("生效日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date workTime;
    /**
     * 终止日期
     */
    @ApiModelProperty("终止日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date endTime;
    /**
     * 名称
     */
    @ApiModelProperty("名称")
    private String  name;
    /**
     * 产品售价
     */
    @ApiModelProperty("产品售价")
    private BigDecimal salePrice;
    /**
     * 1:期货 2:现货
     */
    @ApiModelProperty("产品类型 1:期货 2:现货")
    private Integer typeCoin;
}
src/main/java/com/xcong/excoin/modules/yunding/vo/YdProductVo.java
New file
@@ -0,0 +1,128 @@
package com.xcong.excoin.modules.yunding.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
@ApiModel(value = "YdProductVo", description = "产品详情")
public class YdProductVo {
    @ApiModelProperty("产品ID")
    private Long id;
    /**
     * 名称
     */
    @ApiModelProperty("名称")
    private String  name;
    /**
     * 编码
     */
    @ApiModelProperty("编码")
    private String  code;
    /**
     * 预计产出
     */
    @ApiModelProperty("预计产出")
    private BigDecimal  profitT;
    /**
     * 产品总数
     */
    @ApiModelProperty("产品总数")
    private BigDecimal totalT;
    /**
     * 剩余产品数量
     */
    @ApiModelProperty("剩余产品数量")
    private BigDecimal surplusT;
    /**
     * 产品售价
     */
    @ApiModelProperty("产品售价")
    private BigDecimal salePrice;
    /**
     * 服务周期
     */
    @ApiModelProperty("服务周期")
    private Integer proCycle;
    /**
     * 管理费
     */
    @ApiModelProperty("管理费")
    private BigDecimal manageExpense;
    /**
     * 上架天数
     */
    @ApiModelProperty("上架天数")
    private Integer shelvesDays;
    /**
     * 单位
     */
    @ApiModelProperty("单位")
    private String proUnit;
    /**
     * 产品币种
     */
    @ApiModelProperty("产品币种")
    private String coin;
    /**
     * 限购
     */
    @ApiModelProperty("限购")
    private Integer limitedNum;
    /**
     * 1:体验  2:正式
     */
    @ApiModelProperty("1:体验  2:正式")
    private Integer type;
    /**
     * 1:期货 2:现货
     */
    @ApiModelProperty("产品类型 1:期货 2:现货")
    private Integer typeCoin;
    /**
     * 优惠 1:免除电费
     */
    @ApiModelProperty("优惠 1:免除电费")
    private Integer favourable;
    /**
     * 当前日期
     */
    @ApiModelProperty("当前日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date nowTime;
    /**
     * 生效日期
     */
    @ApiModelProperty("生效日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date workTime;
    /**
     * 终止日期
     */
    @ApiModelProperty("终止日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date endTime;
}
src/main/resources/mapper/yunding/YdBasicSettingDao.xml
New file
@@ -0,0 +1,7 @@
<?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="com.xcong.excoin.modules.yunding.dao.YdBasicSettingDao">
</mapper>
src/main/resources/mapper/yunding/YdOrderDao.xml
@@ -4,4 +4,21 @@
<mapper namespace="com.xcong.excoin.modules.yunding.dao.YdOrderDao">
    <select id="getOrderList" resultType="com.xcong.excoin.modules.yunding.vo.YdOrderVo">
        SELECT
        *
        FROM
        yd_order a
        left join yd_product b on b.id = a.product_id
        <if test="record != null">
            <where>
                and a.member_id = #{record.memberId}
                <if test="record.state != null" >
                    and a.state=#{record.state}
                </if>
            </where>
        </if>
        ORDER BY a.create_time DESC
    </select>
</mapper>
src/main/resources/mapper/yunding/YdProductDao.xml
@@ -4,4 +4,25 @@
<mapper namespace="com.xcong.excoin.modules.yunding.dao.YdProductDao">
    <select id="getProductList" resultType="com.xcong.excoin.modules.yunding.vo.YdProductVo">
        select
            *
        from yd_product
        <if test="record != null">
            <where>
                <if test="record.typeCoin != null" >
                    and type_coin=#{record.typeCoin}
                </if>
            </where>
        </if>
        order by type,id asc
    </select>
    <select id="findProductInfoById" resultType="com.xcong.excoin.modules.yunding.vo.YdProductVo">
        select
        *
        from yd_product
        where id = #{id}
    </select>
</mapper>