package com.xcong.excoin.modules.coin.controller; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.xcong.excoin.common.LoginUserUtils; import com.xcong.excoin.common.contants.AppContants; import com.xcong.excoin.common.enumerates.CoinTypeEnum; import com.xcong.excoin.common.response.Result; import com.xcong.excoin.modules.coin.dao.GbzOrderDao; import com.xcong.excoin.modules.coin.entity.GbzOrderEntity; import com.xcong.excoin.modules.coin.parameter.dto.GbzAddDto; import com.xcong.excoin.modules.coin.parameter.dto.GbzListDto; import com.xcong.excoin.modules.coin.parameter.vo.PriceVo; 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.utils.LogRecordUtils; import com.xcong.excoin.utils.RedisUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; @Slf4j @Validated @RestController @RequestMapping(value = "/api/gbz") @Api(value = "GbzOrderController", tags = "gbz订单接口类") public class GbzOrderController { @Autowired private GbzOrderDao gbzOrderDao; @Autowired private MemberWalletCoinDao memberWalletCoinDao; @Autowired private RedisUtils redisUtils; @ApiOperation(value = "新增订单", notes = "新增订单") @PostMapping(value = "/add") @Transactional(rollbackFor = Exception.class) public Result add(@RequestBody GbzAddDto gbzAddDto) { // String status = redisUtils.getString("xct_order_status"); // if ("1".equals(status)) { // return Result.fail("无法购买"); // } String start = redisUtils.getString("xct_start"); if ("2".equals(start)) { return Result.fail("暂无法购买"); } if (gbzAddDto.getCount() < 10) { return Result.fail("最少购买数量为10个"); } String total = redisUtils.getString("xct_coin_total"); MemberEntity loginUser = LoginUserUtils.getAppLoginUser(); BigDecimal price = new BigDecimal(redisUtils.getString("xct_order_new_price")); BigDecimal amount = BigDecimal.valueOf(gbzAddDto.getCount()).multiply(price); MemberWalletCoinEntity wallet = memberWalletCoinDao.selectWalletCoinBymIdAndCode(loginUser.getId(), CoinTypeEnum.USDT.name()); if (amount.compareTo(wallet.getAvailableBalance()) > 0) { return Result.fail("可用金额不足"); } if (Integer.parseInt(total) < gbzAddDto.getCount()) { return Result.fail("XCT数量不足"); } GbzOrderEntity gbzOrder = new GbzOrderEntity(); gbzOrder.setPrice(price); gbzOrder.setAmount(amount); gbzOrder.setCnt(gbzAddDto.getCount()); gbzOrder.setMemberId(loginUser.getId()); gbzOrder.setSymbol(CoinTypeEnum.XCT.name()); gbzOrder.setStatus(1); gbzOrderDao.insert(gbzOrder); memberWalletCoinDao.updateBlockBalance(wallet.getId(), amount.negate(), BigDecimal.ZERO, 0); redisUtils.set("xct_coin_total", Integer.parseInt(total) - gbzAddDto.getCount()); LogRecordUtils.insertMemberAccountMoneyChange(loginUser.getId(), "购买BEA", amount, "USDT", 1, 1); return Result.ok("购买成功"); } @ApiOperation(value = "获取订单列表") @PostMapping(value = "/findList") public Result findList(@RequestBody GbzListDto gbzListDto) { MemberEntity member = LoginUserUtils.getAppLoginUser(); GbzOrderEntity gbzOrderEntity = new GbzOrderEntity(); gbzOrderEntity.setMemberId(member.getId()); Page page = new Page<>(gbzListDto.getPageNum(), gbzListDto.getPageSize()); IPage result = gbzOrderDao.selectInPage(gbzOrderEntity, page); return Result.ok(result.getRecords()); } @ApiOperation(value = "获取最新价") @ApiResponses({ @ApiResponse(code = 200, message = "sucess", response = PriceVo.class) }) @GetMapping(value = "/findPrice") public Result findPrice() { PriceVo priceVo = new PriceVo(); String newPriceStr = redisUtils.getString("xct_order_new_price"); priceVo.setNewPrice(StrUtil.isNotBlank(newPriceStr) ? new BigDecimal(newPriceStr) : AppContants.DEFAULT_PRICE); String status = redisUtils.getString("xct_order_status"); priceVo.setStatus(StrUtil.isNotBlank(status) ? Integer.parseInt(status) : 2); String remain = redisUtils.getString("xct_coin_total"); priceVo.setRemainCnt(280000); BigDecimal totalAmount = gbzOrderDao.selectOrderTotalAmount(LoginUserUtils.getAppLoginUser().getId()); priceVo.setTotalAmount(totalAmount); return Result.ok(priceVo); } @ApiOperation(value = "提取到资产") @PostMapping(value = "/changeWallet") public Result changeWallet() { String status = redisUtils.getString("xct_order_status"); if (!"1".equals(status)) { return Result.fail("暂无法划转"); } MemberEntity member = LoginUserUtils.getAppLoginUser(); BigDecimal totalAmount = gbzOrderDao.selectOrderTotalAmount(member.getId()); if (totalAmount.compareTo(BigDecimal.ZERO) <= 0) { return Result.fail("无可提取金额"); } MemberWalletCoinEntity wallet = memberWalletCoinDao.selectWalletCoinBymIdAndCode(member.getId(), CoinTypeEnum .XCT.name()); memberWalletCoinDao.updateBlockBalance(wallet.getId(), totalAmount, BigDecimal.ZERO, 0); gbzOrderDao.updateStatus(member.getId()); LogRecordUtils.insertMemberAccountMoneyChange(member.getId(), "提取BEA到资产", totalAmount, "XCT", 1, 1); return Result.ok("提取成功"); } }