From cbf27426370f1fc9c8ae27b717c8d1f175ea358e Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Thu, 02 Jul 2020 19:07:15 +0800
Subject: [PATCH] add guiji
---
src/main/java/com/xcong/excoin/quartz/job/BlockCoinUpdateJob.java | 40 +++++
src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinChargeDao.java | 11 +
src/main/java/com/xcong/excoin/modules/member/entity/MemberCoinChargeEntity.java | 36 +++++
src/main/resources/mapper/member/MemberCoinAddressDao.xml | 18 ++
src/main/resources/mapper/member/MemberWalletCoinDao.xml | 10 +
src/main/java/com/xcong/excoin/modules/coin/service/impl/BlockCoinServiceImpl.java | 159 ++++++++++++++++++++++
src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletCoinDao.java | 16 +-
src/main/java/com/xcong/excoin/modules/coin/service/BlockCoinService.java | 13 +
src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java | 16 +
src/main/resources/mapper/member/MemberCoinChargeDao.xml | 15 ++
src/main/java/com/xcong/excoin/quartz/job/NotionalPoolingJob.java | 16 ++
src/main/java/com/xcong/excoin/utils/LogRecordUtils.java | 26 +++
12 files changed, 361 insertions(+), 15 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/modules/coin/service/BlockCoinService.java b/src/main/java/com/xcong/excoin/modules/coin/service/BlockCoinService.java
new file mode 100644
index 0000000..4944af5
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/coin/service/BlockCoinService.java
@@ -0,0 +1,13 @@
+package com.xcong.excoin.modules.coin.service;
+
+public interface BlockCoinService {
+
+ public void updateEthUsdt();
+
+ public void updateEth();
+
+ public void updateBtcUsdt();
+
+ public void updateBtc();
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/coin/service/impl/BlockCoinServiceImpl.java b/src/main/java/com/xcong/excoin/modules/coin/service/impl/BlockCoinServiceImpl.java
new file mode 100644
index 0000000..1e02af0
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/coin/service/impl/BlockCoinServiceImpl.java
@@ -0,0 +1,159 @@
+package com.xcong.excoin.modules.coin.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.xcong.excoin.common.enumerates.CoinTypeEnum;
+import com.xcong.excoin.modules.blackchain.service.EthService;
+import com.xcong.excoin.modules.coin.service.BlockCoinService;
+import com.xcong.excoin.modules.member.dao.MemberCoinAddressDao;
+import com.xcong.excoin.modules.member.dao.MemberCoinChargeDao;
+import com.xcong.excoin.modules.member.dao.MemberDao;
+import com.xcong.excoin.modules.member.dao.MemberWalletCoinDao;
+import com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity;
+import com.xcong.excoin.modules.member.entity.MemberCoinChargeEntity;
+import com.xcong.excoin.modules.member.entity.MemberEntity;
+import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity;
+import com.xcong.excoin.utils.LogRecordUtils;
+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.math.RoundingMode;
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2020-07-02
+ **/
+@Slf4j
+@Service
+public class BlockCoinServiceImpl implements BlockCoinService {
+
+ @Resource
+ private MemberCoinAddressDao memberCoinAddressDao;
+ @Resource
+ private MemberDao memberDao;
+ @Resource
+ private MemberCoinChargeDao memberCoinChargeDao;
+ @Resource
+ private MemberWalletCoinDao memberWalletCoinDao;
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public void updateEthUsdt() {
+ List<MemberCoinAddressEntity> list = memberCoinAddressDao.selectAllBlockAddressBySymbolAndTag(CoinTypeEnum.USDT.name(), "ERC20");
+ if (CollUtil.isNotEmpty(list)) {
+ EthService ethService = new EthService();
+ for (MemberCoinAddressEntity addressEntity : list) {
+ String address = addressEntity.getAddress();
+ Long memberId = addressEntity.getMemberId();
+
+ if (StrUtil.isNotBlank(address)) {
+ continue;
+ }
+
+ BigDecimal balance = ethService.tokenGetBalance(address);
+ if (balance != null && balance.compareTo(new BigDecimal("0.1")) > 0) {
+ balance = balance.setScale(8, RoundingMode.CEILING);
+
+ BigDecimal early = BigDecimal.ZERO;
+ MemberCoinChargeEntity chargeEntity = memberCoinChargeDao.selectNewestChargeRecord(memberId, CoinTypeEnum.USDT.name(), "ERC20");
+ if (chargeEntity != null) {
+ BigDecimal lastAmount = chargeEntity.getLastAmount();
+ if (lastAmount != null) {
+ early = lastAmount;
+ }
+ }
+
+ MemberWalletCoinEntity walletCoinEntity = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.USDT.name());
+ if (walletCoinEntity == null) {
+ continue;
+ }
+
+ if (balance.compareTo(early) > 0) {
+ BigDecimal newBalance = balance.subtract(early);
+ memberWalletCoinDao.updateBlockBalance(memberId, newBalance, balance, 0);
+
+ insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.USDT.name(), "ERC20", balance);
+ // TODO 钉钉发送, 短信提醒
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void updateEth() {
+ List<MemberCoinAddressEntity> list = memberCoinAddressDao.selectAllBlockAddressBySymbol(CoinTypeEnum.ETH.name());
+ if (CollUtil.isNotEmpty(list)) {
+ for (MemberCoinAddressEntity coinAddressEntity : list) {
+ String address = coinAddressEntity.getAddress();
+ Long memberId = coinAddressEntity.getMemberId();
+
+ BigDecimal balance = EthService.getEthBlance(address);
+ if (balance != null && new BigDecimal("0.008").compareTo(balance) < 0) {
+ MemberWalletCoinEntity walletCoin = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, CoinTypeEnum.ETH.name());
+
+ if (walletCoin == null) {
+ continue;
+ }
+
+ BigDecimal early = BigDecimal.ZERO;
+ MemberCoinChargeEntity coinChargeEntity = memberCoinChargeDao.selectNewestChargeRecord(memberId, CoinTypeEnum.ETH.name(), null);
+ if (coinChargeEntity != null) {
+ BigDecimal lastAmount = coinChargeEntity.getLastAmount();
+ if (lastAmount != null) {
+ early = lastAmount;
+ }
+ }
+
+ balance = balance.setScale(8, RoundingMode.CEILING);
+ if (balance.compareTo(early) > 0) {
+ log.info("#ETH更新:{},{},{}#", memberId, balance, early);
+
+ BigDecimal newBalance = balance.subtract(early);
+ memberWalletCoinDao.updateBlockBalance(memberId, newBalance, balance, 0);
+ insertCoinCharge(address, memberId, newBalance, CoinTypeEnum.ETH.name(), null, balance);
+
+ // 插入财务记录
+ LogRecordUtils.insertMemberAccountMoneyChange(memberId, "转入", newBalance, CoinTypeEnum.ETH.name(), 1, 1);
+ // TODO 钉钉消息, 短信提醒
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void updateBtcUsdt() {
+
+ }
+
+ @Override
+ public void updateBtc() {
+
+ }
+
+ private String generateNo() {
+ // 生成订单号
+ Long timestamp = System.currentTimeMillis();
+ // 随机数
+ int random = (int) (Math.random() * 10);
+ return String.valueOf(timestamp).substring(2) + random;
+ }
+
+ public void insertCoinCharge(String address, Long memberId, BigDecimal newBalance, String symbol, String tag, BigDecimal lastAmount) {
+ MemberCoinChargeEntity memberCoinChargeEntity = new MemberCoinChargeEntity();
+ memberCoinChargeEntity.setAddress(address);
+ memberCoinChargeEntity.setMemberId(memberId);
+ memberCoinChargeEntity.setAmount(newBalance);
+ memberCoinChargeEntity.setSymbol(symbol);
+ memberCoinChargeEntity.setTag(tag);
+ memberCoinChargeEntity.setStatus(1);
+ memberCoinChargeEntity.setLastAmount(lastAmount);
+ memberCoinChargeEntity.setOrderCode(generateNo());
+ memberCoinChargeDao.insert(memberCoinChargeEntity);
+ }
+}
diff --git a/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java b/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java
index 067cea1..b9fea92 100644
--- a/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java
+++ b/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java
@@ -7,15 +7,19 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity;
-public interface MemberCoinAddressDao extends BaseMapper<MemberCoinAddressEntity> {
+public interface MemberCoinAddressDao extends BaseMapper<MemberCoinAddressEntity> {
- MemberCoinAddressEntity selectAddressByMemberIdAndSymbol(Long memberId, String symbol);
-
- MemberCoinAddressEntity selectBlockAddressWithTag(@Param("memberId")Long memberId, @Param("symbol")String symbol, @Param("tag")String tag);
- MemberCoinAddressEntity selectBlockAddress(@Param("memberId")Long memberId, @Param("symbol")String symbol);
+ MemberCoinAddressEntity selectAddressByMemberIdAndSymbol(Long memberId, String symbol);
- List<MemberCoinAddressEntity> selectCoinAddressListByMap(@Param("symbol")String symbol, @Param("memberId")Long memberId);
+ MemberCoinAddressEntity selectBlockAddressWithTag(@Param("memberId") Long memberId, @Param("symbol") String symbol, @Param("tag") String tag);
+ MemberCoinAddressEntity selectBlockAddress(@Param("memberId") Long memberId, @Param("symbol") String symbol);
+
+ List<MemberCoinAddressEntity> selectCoinAddressListByMap(@Param("symbol") String symbol, @Param("memberId") Long memberId);
+
+ List<MemberCoinAddressEntity> selectAllBlockAddressBySymbolAndTag(@Param("symbol") String symbol, @Param("tag") String tag);
+
+ List<MemberCoinAddressEntity> selectAllBlockAddressBySymbol(@Param("symbol") String symbol);
}
diff --git a/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinChargeDao.java b/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinChargeDao.java
new file mode 100644
index 0000000..94d25f2
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinChargeDao.java
@@ -0,0 +1,11 @@
+package com.xcong.excoin.modules.member.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xcong.excoin.modules.member.entity.MemberCoinChargeEntity;
+import org.apache.ibatis.annotations.Param;
+
+public interface MemberCoinChargeDao extends BaseMapper<MemberCoinChargeEntity> {
+
+ public MemberCoinChargeEntity selectNewestChargeRecord(@Param("memberId") Long memberId, @Param("symbol") String symbol, @Param("tag") String tag);
+
+}
diff --git a/src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletCoinDao.java b/src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletCoinDao.java
index f299d4d..eb12551 100644
--- a/src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletCoinDao.java
+++ b/src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletCoinDao.java
@@ -13,11 +13,13 @@
*/
public interface MemberWalletCoinDao extends BaseMapper<MemberWalletCoinEntity> {
- List<MemberWalletCoinEntity> selectMemberWalletCoinsByMemberId(Long memberId);
-
- MemberWalletCoinEntity selectWalletCoinBymIdAndCode(@Param("memberId")Long memberId,@Param("walletCode")String walletCode);
-
- int updateFrozenBalance(@Param("memberId")Long memberId,@Param("id")Long id,@Param("amount")BigDecimal amount);
-
- int subFrozenBalance(@Param("memberId")Long memberId,@Param("id")Long id,@Param("amount")BigDecimal amount);
+ List<MemberWalletCoinEntity> selectMemberWalletCoinsByMemberId(Long memberId);
+
+ MemberWalletCoinEntity selectWalletCoinBymIdAndCode(@Param("memberId") Long memberId, @Param("walletCode") String walletCode);
+
+ int updateFrozenBalance(@Param("memberId") Long memberId, @Param("id") Long id, @Param("amount") BigDecimal amount);
+
+ int subFrozenBalance(@Param("memberId") Long memberId, @Param("id") Long id, @Param("amount") BigDecimal amount);
+
+ int updateBlockBalance(@Param("memberId") Long memberId, @Param("availableBalance") BigDecimal availableBalance, @Param("earlyBalance") BigDecimal earlyBalance, @Param("blockNumber") Integer blockNumber);
}
diff --git a/src/main/java/com/xcong/excoin/modules/member/entity/MemberCoinChargeEntity.java b/src/main/java/com/xcong/excoin/modules/member/entity/MemberCoinChargeEntity.java
new file mode 100644
index 0000000..8171578
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/member/entity/MemberCoinChargeEntity.java
@@ -0,0 +1,36 @@
+package com.xcong.excoin.modules.member.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.excoin.common.system.base.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2020-07-02
+ **/
+@Data
+@TableName("member_coin_charge")
+public class MemberCoinChargeEntity extends BaseEntity {
+
+ private Long memberId;
+
+ private String certificate;
+
+ private BigDecimal amount;
+
+ private BigDecimal lastAmount;
+
+ private int status;
+
+ private String symbol;
+
+ private String address;
+
+ private String tag;
+
+ private String hash;
+
+ private String orderCode;
+}
diff --git a/src/main/java/com/xcong/excoin/quartz/job/BlockCoinUpdateJob.java b/src/main/java/com/xcong/excoin/quartz/job/BlockCoinUpdateJob.java
new file mode 100644
index 0000000..10e567e
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/quartz/job/BlockCoinUpdateJob.java
@@ -0,0 +1,40 @@
+package com.xcong.excoin.quartz.job;
+
+import com.xcong.excoin.modules.coin.service.BlockCoinService;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * 链上币种同步任务
+ *
+ * @author wzy
+ * @date 2020-07-02
+ **/
+@Component
+@ConditionalOnProperty(prefix = "app", name = "block-job", havingValue = "true")
+public class BlockCoinUpdateJob {
+
+ @Resource
+ private BlockCoinService blockCoinService;
+
+
+ /**
+ * ETH_USDT 同步
+ */
+ @Scheduled(cron = "0 0/10 * * * ? ")
+ public void ethUsdtUpdate() {
+ blockCoinService.updateEthUsdt();
+ }
+
+ /**
+ * eth 同步
+ */
+ @Scheduled(cron = "0 1/20 * * * ? ")
+ public void ethUpdate() {
+ blockCoinService.updateEth();
+ }
+
+}
diff --git a/src/main/java/com/xcong/excoin/quartz/job/NotionalPoolingJob.java b/src/main/java/com/xcong/excoin/quartz/job/NotionalPoolingJob.java
new file mode 100644
index 0000000..0c50b25
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/quartz/job/NotionalPoolingJob.java
@@ -0,0 +1,16 @@
+package com.xcong.excoin.quartz.job;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Component;
+
+/**
+ * 归集定时任务
+ *
+ * @author wzy
+ * @date 2020-07-02
+ **/
+
+@Component
+@ConditionalOnProperty(prefix = "app", name = "block-job", havingValue = "true")
+public class NotionalPoolingJob {
+}
diff --git a/src/main/java/com/xcong/excoin/utils/LogRecordUtils.java b/src/main/java/com/xcong/excoin/utils/LogRecordUtils.java
new file mode 100644
index 0000000..274b052
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/utils/LogRecordUtils.java
@@ -0,0 +1,26 @@
+package com.xcong.excoin.utils;
+
+import com.xcong.excoin.modules.coin.dao.MemberAccountMoneyChangeDao;
+import com.xcong.excoin.modules.coin.entity.MemberAccountMoneyChange;
+
+import java.math.BigDecimal;
+
+/**
+ * 日志记录工具类
+ *
+ * @author wzy
+ * @date 2020-07-02
+ **/
+public class LogRecordUtils {
+
+ public static void insertMemberAccountMoneyChange(Long memberId,String content, BigDecimal amount, String symbol, Integer status, Integer type) {
+ MemberAccountMoneyChange accountRecord = new MemberAccountMoneyChange();
+ accountRecord.setContent(content);
+ accountRecord.setMemberId(memberId);
+ accountRecord.setAmount(amount);
+ accountRecord.setStatus(status);
+ accountRecord.setSymbol(symbol);
+ accountRecord.setType(type);
+ SpringContextHolder.getBean(MemberAccountMoneyChangeDao.class).insert(accountRecord);
+ }
+}
diff --git a/src/main/resources/mapper/member/MemberCoinAddressDao.xml b/src/main/resources/mapper/member/MemberCoinAddressDao.xml
index ade0be5..1c45e9c 100644
--- a/src/main/resources/mapper/member/MemberCoinAddressDao.xml
+++ b/src/main/resources/mapper/member/MemberCoinAddressDao.xml
@@ -50,5 +50,21 @@
</if>
</where>
</select>
-
+
+
+ <select id="selectAllBlockAddressBySymbolAndTag" resultType="com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity">
+ select * from member_coin_address
+ where is_biyict = 1
+ <if test="symbol != null and symbol != ''">
+ and symbol = #{symbol}
+ </if>
+ <if test="tag != null and tag != ''">
+ and tag = #{tag}
+ </if>
+ </select>
+
+ <select id="selectAllBlockAddressBySymbol" resultType="com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity">
+ select * from member_coin_address
+ where symbol=#{symbol}
+ </select>
</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/member/MemberCoinChargeDao.xml b/src/main/resources/mapper/member/MemberCoinChargeDao.xml
new file mode 100644
index 0000000..3f6faae
--- /dev/null
+++ b/src/main/resources/mapper/member/MemberCoinChargeDao.xml
@@ -0,0 +1,15 @@
+<?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.member.dao.MemberCoinChargeDao">
+
+ <select id="selectNewestChargeRecord" resultType="com.xcong.excoin.modules.member.entity.MemberCoinChargeEntity">
+ select * from member_coin_charge
+ where member_id=#{memberId}
+ and symbol=#{symbol}
+ <if test="tag !=null and tag != ''">
+ and tag = #{tag}
+ </if>
+ order by create_time desc limit 1
+ </select>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/member/MemberWalletCoinDao.xml b/src/main/resources/mapper/member/MemberWalletCoinDao.xml
index e8f13e3..4cc7717 100644
--- a/src/main/resources/mapper/member/MemberWalletCoinDao.xml
+++ b/src/main/resources/mapper/member/MemberWalletCoinDao.xml
@@ -29,7 +29,15 @@
</update>
-
+ <update id="updateBlockBalance">
+ update member_wallet_coin
+ set
+ available_balance = IFNULL(available_balance, 0) + #{availableBalance},
+ total_balance = IFNULL(total_balance, 0) + #{availableBalance},
+ early_balance = IFNULL(early_balance, 0) + #{earlyBalance},
+ block_number = IFNULL(block_number, 0) + #{blockNumber}
+ where id=#{memberId}
+ </update>
</mapper>
\ No newline at end of file
--
Gitblit v1.9.1