xiaoyong931011
2020-05-31 9c8711046b00898717aa7a3b9f6dfee974d3f427
20200531  代码提交
24 files added
8 files modified
4064 ■■■■■ changed files
lib/ripple-core-0.0.1-SNAPSHOT.jar patch | view | raw | blame | history
pom.xml 20 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/blackchain/controller/BlockController.java 47 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransResult.java 49 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransactions.java 36 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTx.java 63 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/blackchain/service/BchService.java 138 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/blackchain/service/BigDecimalUtil.java 190 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/blackchain/service/BlockSerive.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/blackchain/service/BtcService.java 138 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/blackchain/service/DateUtil.java 1369 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/blackchain/service/EthService.java 283 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/blackchain/service/HttpUtil.java 281 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java 219 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/blackchain/service/LtcService.java 125 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtService.java 167 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/blackchain/service/XrpService.java 487 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java 92 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java 6 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/parameter/dto/MemberPaymethodDto.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAuthenticationInfoVo.java 26 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAvivableCoinInfoVo.java 19 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoListVo.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoVo.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberPersonCenterInfoVo.java 32 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/service/MemberService.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java 106 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/platform/dao/PlatformFeeSettingDao.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/platform/entity/PlatformCnyUsdtExchangeEntity.java 8 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/platform/entity/PlatformFeeSettingEntity.java 53 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/member/MemberCoinAddressDao.xml 19 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/platform/PlatformFeeSettingDao.xml 24 ●●●●● patch | view | raw | blame | history
lib/ripple-core-0.0.1-SNAPSHOT.jar
Binary files differ
pom.xml
@@ -35,6 +35,14 @@
    </properties>
    <dependencies>
        <dependency>
            <groupId>ripple</groupId>
            <artifactId>ripple</artifactId>
            <version>0.0.1</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/ripple-core-0.0.1-SNAPSHOT.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
@@ -112,6 +120,18 @@
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-driver.version}</version>
        </dependency>
        <dependency>
            <groupId>org.web3j</groupId>
            <artifactId>core</artifactId>
            <version>4.5.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.web3j/parity -->
        <dependency>
            <groupId>org.web3j</groupId>
            <artifactId>parity</artifactId>
            <version>4.5.10</version>
        </dependency>
        <!-- 参数校验 start -->
        <dependency>
src/main/java/com/xcong/excoin/modules/blackchain/controller/BlockController.java
New file
@@ -0,0 +1,47 @@
package com.xcong.excoin.modules.blackchain.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.xcong.excoin.common.response.Result;
import com.xcong.excoin.modules.blackchain.service.BlockSerive;
import com.xcong.excoin.utils.RedisUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Api(value = "链上钱包接口", tags = "链上钱包接口")
@RestController
@RequestMapping(value = "/api/block")
public class BlockController {
    @Autowired
    RedisUtils  redisUtils;
    @Autowired
    BlockSerive blockSerive;
    /**
     * BTC
     * @param token
     * @return
     */
    @ApiOperation(value = "链上生成钱包地址接口", notes = "链上生成钱包地址接口")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "symbol", value = "币种", required = true, dataType = "String", paramType="query")
    })
    @GetMapping(value = "/findBlockAddress")
    public Result findBlockAddress(String symbol) {
        return blockSerive.findBlockAddress(symbol);
    }
}
src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransResult.java
New file
@@ -0,0 +1,49 @@
package com.xcong.excoin.modules.blackchain.model;
import java.util.List;
// https://github.com/ripple/rippled-historical-database#get-account-transaction-history
public class XrpTransResult {
    private String result; //success
    private Integer count; //
    private String marker;//
    //transactions
    List<XrpTransactions> transactions;
    public String getResult() {
        return result;
    }
    public void setResult(String result) {
        this.result = result;
    }
    public Integer getCount() {
        return count;
    }
    public void setCount(Integer count) {
        this.count = count;
    }
    public String getMarker() {
        return marker;
    }
    public void setMarker(String marker) {
        this.marker = marker;
    }
    public List<XrpTransactions> getTransactions() {
        return transactions;
    }
    public void setTransactions(List<XrpTransactions> transactions) {
        this.transactions = transactions;
    }
}
src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTransactions.java
New file
@@ -0,0 +1,36 @@
package com.xcong.excoin.modules.blackchain.model;
public class XrpTransactions {
    private String hash;
    private Integer ledger_index;
    private String date;//2019-10-28T15:01:01+00:00
    private XrpTx tx;
    public String getHash() {
        return hash;
    }
    public void setHash(String hash) {
        this.hash = hash;
    }
    public Integer getLedger_index() {
        return ledger_index;
    }
    public void setLedger_index(Integer ledger_index) {
        this.ledger_index = ledger_index;
    }
    public String getDate() {
        return date;
    }
    public void setDate(String date) {
        this.date = date;
    }
    public XrpTx getTx() {
        return tx;
    }
    public void setTx(XrpTx tx) {
        this.tx = tx;
    }
}
src/main/java/com/xcong/excoin/modules/blackchain/model/XrpTx.java
New file
@@ -0,0 +1,63 @@
package com.xcong.excoin.modules.blackchain.model;
public class XrpTx {
    private String TransactionType;
    private Integer Flags;
    private Integer Sequence;
    private Integer DestinationTag; // 对应的用户标签
    private Integer Amount; // 金额 除以1000000 一百万
    private Integer Fee;  // 手续费
    private String Account; // 转账人
    private String Destination; // 收款人(收款人是系统账户 说明是转入)
    public String getTransactionType() {
        return TransactionType;
    }
    public void setTransactionType(String transactionType) {
        TransactionType = transactionType;
    }
    public Integer getFlags() {
        return Flags;
    }
    public void setFlags(Integer flags) {
        Flags = flags;
    }
    public Integer getSequence() {
        return Sequence;
    }
    public void setSequence(Integer sequence) {
        Sequence = sequence;
    }
    public Integer getDestinationTag() {
        return DestinationTag;
    }
    public void setDestinationTag(Integer destinationTag) {
        DestinationTag = destinationTag;
    }
    public Integer getAmount() {
        return Amount;
    }
    public void setAmount(Integer amount) {
        Amount = amount;
    }
    public Integer getFee() {
        return Fee;
    }
    public void setFee(Integer fee) {
        Fee = fee;
    }
    public String getAccount() {
        return Account;
    }
    public void setAccount(String account) {
        Account = account;
    }
    public String getDestination() {
        return Destination;
    }
    public void setDestination(String destination) {
        Destination = destination;
    }
}
src/main/java/com/xcong/excoin/modules/blackchain/service/BchService.java
New file
@@ -0,0 +1,138 @@
package com.xcong.excoin.modules.blackchain.service;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class BchService {
    private static BchService service = null;
    private final static String RESULT = "result";
    private final static String METHOD_SEND_TO_ADDRESS = "sendtoaddress";
    private final static String METHOD_GET_TRANSACTION = "gettransaction";
    private final static String METHOD_LIST_TRANSACTIONS = "listtransactions";
    private final static String METHOD_GET_BLOCK_COUNT = "getblockcount";
    private final static String METHOD_NEW_ADDRESS = "getnewaddress";
    private final static String METHOD_GET_BALANCE = "getbalance";
    private final static String METHOD_GET_BALANCE_ADDRESS = "getreceivedbyaddress";
    private final static String METHOD_WALLET_PASSPHRASE = "walletpassphrase";
    private final static String METHOD_WALLET_LOCK = "walletlock";
    private String url = "http://121.40.86.163:1882";
    private String username = "biyi";
    private String password = "biyi12345";
    public static BchService getInstance() {
        if (service != null) {
            return service;
        }
        return new BchService();
    }
    private BchService() {
    }
    /**
     * 创建BTC钱包 每个账户对应一个地址 方便后续操作
     * @param mId 账户
     * @return
     */
    public static Map<String, String> createWallet(String mId) {
        BchService btcService = getInstance();
        // 创建钱包地址
        String address = btcService.getAddress(mId);
        // 私钥
        String privateKey = btcService.dumpprivkey(address);
        Map<String, String> result = new HashMap<String,String>();
        result.put("address", address);
        result.put("privateKey", privateKey);
        return result;
    }
    public String getAddress(String label) {
        try {
            JSONObject json = doRequest(METHOD_NEW_ADDRESS,label);
            if (isError(json)) {
                return "";
            }
            return json.getString(RESULT);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    private JSONObject doRequest(String method, Object... params) {
        JSONObject param = new JSONObject();
        param.put("id", System.currentTimeMillis() + "");
        param.put("jsonrpc", "2.0");
        param.put("method", method);
        if (params != null) {
            param.put("params", params);
        }
        String creb = Base64.encodeBase64String((username + ":" + password).getBytes());
        Map<String, String> headers = new HashMap<>(2);
        headers.put("Authorization", "Basic " + creb);
        return JSON.parseObject(HttpUtil.jsonPost(url, headers, param.toJSONString()));
    }
    private boolean isError(JSONObject json) {
        if (json == null || (StringUtils.isNotEmpty(json.getString("error")) && json.get("error") != "null")) {
            return true;
        }
        return false;
    }
    public String dumpprivkey(String address) {
        try {
            JSONObject obj = doRequest("dumpprivkey", address);
            System.out.println(obj);
            if (!isError(obj)) {
                return obj.getString(RESULT);
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 查询给定地址的总收款额(只计算接受的)
     * @param address
     * @return
     */
    public BigDecimal getBalance(String address) {
        JSONObject json = doRequest(METHOD_GET_BALANCE_ADDRESS,address,3);
        if (!isError(json)) {
            return new BigDecimal(json.getString(RESULT));
        } else {
            return null;
        }
    }
    public String METHOD_GET_BLOCK_COUNT() {
        JSONObject json = doRequest(METHOD_GET_BLOCK_COUNT);
        if (!isError(json)) {
            return json.getString(RESULT);
        } else {
            return null;
        }
    }
    public static void main(String[] args) {
        BchService ser = new BchService();
        //ser.getBalance("36RiLqCrnFfBoyUUHpGvEotXiMRtrJG8dp");
        //System.out.println(ser.METHOD_GET_BLOCK_COUNT());
       System.out.println(ser.getBalance("36RiLqCrnFfBoyUUHpGvEotXiMRtrJG8dp"));
    }
}
src/main/java/com/xcong/excoin/modules/blackchain/service/BigDecimalUtil.java
New file
@@ -0,0 +1,190 @@
package com.xcong.excoin.modules.blackchain.service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
/**
 * 数据计算工具类
 *
 * @author cloud cloud
 * @create 2017/10/11
 **/
public class BigDecimalUtil {
    /**
     * 基本单位
     */
    private static final BigDecimal UNIT = new BigDecimal(100000000);
    /**
     * 对double数据进行取精度.
     * @param value  double数据.
     * @param scale  精度位数(保留的小数位数).
     * @param roundingMode  精度取值方式.
     * @return 精度计算后的数据.
     */
    public static double round(double value, int scale,
                               int roundingMode) {
        BigDecimal bd = new BigDecimal(value);
        bd = bd.setScale(scale, roundingMode);
        double d = bd.doubleValue();
        bd = null;
        return d;
    }
    /**
     * 获取四位小数的字符串,小数位不够补充0
     * @param value
     * @return  X.0000
     */
    public static String getFourString(double value){
        DecimalFormat df = new DecimalFormat("0.0000");
        return df.format(value);
    }
    /**
     * double 相加
     * @param d1
     * @param d2
     * @return
     */
    public static double sum(Double d1,Double d2){
        BigDecimal bd1 = new BigDecimal(d1.toString());
        BigDecimal bd2 = new BigDecimal(d2.toString());
        return bd1.add(bd2).doubleValue();
    }
    public static double sum(String a,String b){
        BigDecimal pa = new BigDecimal(a);
        BigDecimal pb = new BigDecimal(b);
        return pa.add(pb).doubleValue();
    }
    /**
     * double 相减
     * @param d1
     * @param d2
     * @return
     */
    public static double sub(double d1,double d2){
        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
        return bd1.subtract(bd2).setScale(6,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    /**
     * double 乘法
     * @param d1
     * @param d2
     * @return
     */
    public static double mul(double d1,double d2){
        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
        return bd1.multiply(bd2).setScale(6,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    /**
     * double 除法
     * @param d1
     * @param d2
     * @param scale 四舍五入 小数点位数
     * @return
     */
    public static double div(double d1,double d2,int scale){
        //  当然在此之前,你要判断分母是否为0,
        //  为0你可以根据实际需求做相应的处理
        BigDecimal bd1 = new BigDecimal(Double.toString(d1));
        BigDecimal bd2 = new BigDecimal(Double.toString(d2));
        return bd1.divide
                (bd2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    /**
     * 长整数相乘
     * @param pa
     * @param pb
     * @return
     */
    public static long longMul(long pa,long pb){
        BigDecimal b1 = new BigDecimal(pa);
        BigDecimal b2 = new BigDecimal(pb);
        return b1.multiply(b2).longValue();
    }
    public static long longMul(long pa ,Double rate){
        BigDecimal b1 = new BigDecimal(pa);
        BigDecimal b2 = new BigDecimal(rate.toString());
        b2 = b2.setScale(6,BigDecimal.ROUND_HALF_UP);
        return b1.multiply(b2).longValue();
    }
    public static long longMul(long pa ,String rate){
        BigDecimal b1 = new BigDecimal(pa);
        BigDecimal b2 = new BigDecimal(rate);
        return b1.multiply(b2).longValue();
    }
    /**
     * 长整数相减
     * @param pa
     * @param pb
     * @return
     */
    public static long longSub(long pa,long pb){
        BigDecimal b1 = new BigDecimal(pa);
        BigDecimal b2 = new BigDecimal(pb);
        return b1.subtract(b2).longValue();
    }
    /**
     * 长整数相加
     * @param pa
     * @param pb
     * @return
     */
    public static long longAdd(long pa,long pb){
        BigDecimal b1 = new BigDecimal(pa);
        BigDecimal b2 = new BigDecimal(pb);
        return b1.add(b2).longValue();
    }
    /**
     * 入参转化
     * @param value
     * @return
     */
    public static long inputConvert(Double value){
       BigDecimal input =  new BigDecimal(value.toString());
       return input.multiply(UNIT).longValue();
    }
    /**
     * 输出转化
     * @param value
     * @return
     */
    public static double outputConvert(long value){
        BigDecimal output = new BigDecimal(value);
        return output.divide(UNIT,6, RoundingMode.DOWN).doubleValue();
    }
    public static void main(String[] args) {
        long res = longMul(100000000,0.000009999999);
        System.out.println(res);
    }
    public static long sum(Long d1,String d2){
        BigDecimal bd1 = new BigDecimal(d1.toString());
        BigDecimal bd2 = new BigDecimal(d2);
        return bd1.add(bd2).longValue();
    }
}
src/main/java/com/xcong/excoin/modules/blackchain/service/BlockSerive.java
New file
@@ -0,0 +1,9 @@
package com.xcong.excoin.modules.blackchain.service;
import com.xcong.excoin.common.response.Result;
public interface BlockSerive {
    Result findBlockAddress(String symbol);
}
src/main/java/com/xcong/excoin/modules/blackchain/service/BtcService.java
New file
@@ -0,0 +1,138 @@
package com.xcong.excoin.modules.blackchain.service;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class BtcService {
    private static BtcService service = null;
    private final static String RESULT = "result";
    private final static String METHOD_SEND_TO_ADDRESS = "sendtoaddress";
    private final static String METHOD_GET_TRANSACTION = "gettransaction";
    private final static String METHOD_LIST_TRANSACTIONS = "listtransactions";
    private final static String METHOD_GET_BLOCK_COUNT = "getblockcount";
    private final static String METHOD_NEW_ADDRESS = "getnewaddress";
    private final static String METHOD_GET_BALANCE = "getbalance";
    private final static String METHOD_GET_BALANCE_ADDRESS = "getreceivedbyaddress";
    private final static String METHOD_WALLET_PASSPHRASE = "walletpassphrase";
    private final static String METHOD_WALLET_LOCK = "walletlock";
    private String url = "http://120.55.86.146:1880";
    private String username = "biyi";
    private String password = "biyi1234";
    public static BtcService getInstance() {
        if (service != null) {
            return service;
        }
        return new BtcService();
    }
    private BtcService() {
    }
    /**
     * 创建BTC钱包 每个账户对应一个地址 方便后续操作
     * @param mId 账户
     * @return
     */
    public static Map<String, String> createWallet(String mId) {
        BtcService btcService = getInstance();
        // 创建钱包地址
        String address = btcService.getAddress(mId);
        // 私钥
        String privateKey = btcService.dumpprivkey(address);
        Map<String, String> result = new HashMap<String,String>();
        result.put("address", address);
        result.put("privateKey", privateKey);
        return result;
    }
    public String getAddress(String label) {
        try {
            JSONObject json = doRequest(METHOD_NEW_ADDRESS,label);
            if (isError(json)) {
                return "";
            }
            return json.getString(RESULT);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    private JSONObject doRequest(String method, Object... params) {
        JSONObject param = new JSONObject();
        param.put("id", System.currentTimeMillis() + "");
        param.put("jsonrpc", "2.0");
        param.put("method", method);
        if (params != null) {
            param.put("params", params);
        }
        String creb = Base64.encodeBase64String((username + ":" + password).getBytes());
        Map<String, String> headers = new HashMap<>(2);
        headers.put("Authorization", "Basic " + creb);
        return JSON.parseObject(HttpUtil.jsonPost(url, headers, param.toJSONString()));
    }
    private boolean isError(JSONObject json) {
        if (json == null || (StringUtils.isNotEmpty(json.getString("error")) && json.get("error") != "null")) {
            return true;
        }
        return false;
    }
    public String dumpprivkey(String address) {
        try {
            JSONObject obj = doRequest("dumpprivkey", address);
            System.out.println(obj);
            if (!isError(obj)) {
                return obj.getString(RESULT);
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 查询给定地址的总收款额(只计算接受的)
     * @param address
     * @return
     */
    public BigDecimal getBalance(String address) {
        JSONObject json = doRequest(METHOD_GET_BALANCE_ADDRESS,address,3);
        if (!isError(json)) {
            return new BigDecimal(json.getString(RESULT));
        } else {
            return null;
        }
    }
    public String METHOD_GET_BLOCK_COUNT() {
        JSONObject json = doRequest(METHOD_GET_BLOCK_COUNT);
        if (!isError(json)) {
            return json.getString(RESULT);
        } else {
            return null;
        }
    }
    public static void main(String[] args) {
        BtcService ser = new BtcService();
        //ser.getBalance("36RiLqCrnFfBoyUUHpGvEotXiMRtrJG8dp");
        //System.out.println(ser.METHOD_GET_BLOCK_COUNT());
       System.out.println(ser.getBalance("36RiLqCrnFfBoyUUHpGvEotXiMRtrJG8dp"));
    }
}
src/main/java/com/xcong/excoin/modules/blackchain/service/DateUtil.java
New file
@@ -0,0 +1,1369 @@
package com.xcong.excoin.modules.blackchain.service;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang.StringUtils;
public class DateUtil {
    public DateUtil() {
    }
    /**
     * 测试用
     * @param args
     * @throws ParseException
     */
    public static void main(String[] args) throws ParseException {
//        long time = System.currentTimeMillis()+7200000;
//        Date a = new Date(time);
//        long space = dateSpaceHours(new Date(), a);
//        System.out.println(space);
//        System.out.println(DateUtil.dateToString(DateUtil.getStringToDate(DateUtil.getSQLDateYMD())));
//        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
//        Date date= DateUtil.addDays(new Date(), -1);
//        System.out.println(date);
//        System.out.println(DateUtil.dateToString(date));
//        System.out.println(simpleDateFormat.format(date));
//        System.out.println(DateUtil.getStringToDate(dateToStringYMD(date),"yyyy-MM-dd"));
//        System.out.println(DateUtil.getStringToDate(null));
        //for(int i=0;i<10;i++){
        //System.out.println(getSQLDateYMD());
        //}
        //System.out.println(dateDiff("2013-06-08 12:25:23","2013-07-08 12:25:23"));
        //        System.out.println(currentTimeDiff2("2013-12-08"));
        //        System.out.println(compare_date("2013-07-08 12:25:23", "2013-07-08 12:23:23"));
        //System.out.println(fomatDate("2013-10-16 9:27:34"));
        //System.out.println(System.currentTimeMillis());
        //System.out.println(getTenTimestamp());
        //System.out.println(getSixRandom());
        //        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //获取当前时间
        //        Date time = Calendar.getInstance().getTime();
        //        System.out.println(simpleDateFormat.format(datePlusOrMinus("2013-10-16 9:27:34",2)));
        //        System.out.println(dateToString(datePlusOrMinus(getSQLDate(), 2)));
        //        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        //        String strDate1 = "2012-3-15";
        //        String strDate2 = "2013-5-13";
        //        Date date1=sdf.parse(strDate1);
        //        Date date2=sdf.parse(strDate2);
        //        //
        //        //        System.out.println(getMonths(date2,date1));
        //        System.out.println(daysBetween(date2, date1));
        //        System.out.println(fomatDate("2014-04"));
        //        System.out.println(fomatDate("2014-05"));
        //        System.out.println(Double.parseDouble(fomatDate("2014-05")) > Double.parseDouble(fomatDate("2014-04")));
        //        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        //        String date1 = "2014-04";
        //        String date2 = "2015-08";
        //        Date start = sdf.parse(date1);
        //        Date end = sdf.parse(date2);
        //
        //
        //        System.out.println("###start:==" + start);
        //        System.out.println("###end:==" + end);
        //        System.out.println("月份="+myTimeStr(9615000));
        //        System.out.println(fomatDateToNumber("2014-07-28 14:12:14"));
        //System.out.println(compareDate("2014-08-13","2014-08-12"));
        //        System.out.println(getNineRandom());
        //        System.out.println("222="+dateDiffStr("2014-06-11 00:00:00","2014-06-25 23:59:59"));
//        System.out.println("getUTCTimeStr()=="+DateUtil.currentTimeDiffToHour("2015-01-22 18:12:59"));
        //System.out.println(DateUtil.dateDiff("2015-09-02 09:55:14",DateUtil.dateToString(new Date())));
        System.out.println(DateUtil.currentTimeDiff("2018-07-11 18:00:00"));
    }
    /**
     * 计算今天的剩余秒数
     * @return
     */
    public static int getTodaySeconds(){
        Calendar cal = Calendar.getInstance();
        long start = TimeUnit.MILLISECONDS.toSeconds(cal.getTimeInMillis());
        cal.add(Calendar.DAY_OF_YEAR, 1);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        long end = TimeUnit.MILLISECONDS.toSeconds(cal.getTimeInMillis());
        return (int) (end - start);
    }
    /**
     * 获取当前分钟
     * @return
     */
    public static Integer getNowDateMin(){
        Calendar c1 = Calendar.getInstance();
        c1.setTime(new Date());
        return c1.get(Calendar.MINUTE);
    }
    /**
     * 获取当前day
     * @return
     */
    public static Integer getNowDateDay(){
        Calendar c1 = Calendar.getInstance();
        c1.setTime(new Date());
        return c1.get(Calendar.DATE);
    }
    /**
     * 获取当前秒
     * @return
     */
    public static Integer getNowDateSecond(){
        Calendar c1 = Calendar.getInstance();
        c1.setTime(new Date());
        return c1.get(Calendar.SECOND);
    }
    /**
     * 返回两个日期之间相差天数---只比较天数
     * @param fDate
     * @param oDate
     * @return
     */
    public static int daysOfTwo(Date fDate, Date oDate) {
           Calendar aCalendar = Calendar.getInstance();
           aCalendar.setTime(fDate);
           int day1 = aCalendar.get(Calendar.DAY_OF_YEAR);
           aCalendar.setTime(oDate);
           int day2 = aCalendar.get(Calendar.DAY_OF_YEAR);
           return Math.abs(day2 - day1);
    }
    /**
     * 把日期格式转换为字符串格式HH:mm:ss
     * @param date
     * @return
     */
    public static String dateToStringHMS (Date date){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
        return simpleDateFormat.format(date);
    }
    /**
     * 把日期格式转换为字符串格式HH:mm
     * @param date
     * @return
     */
    public static String dateToStringHM (Date date){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
        return simpleDateFormat.format(date);
    }
    /**
     * 把日期格式转换为字符串格式HHmm
     * @param date
     * @return
     */
    public static int dateToIntHM (Date date){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HHmm");
        return Integer.parseInt(simpleDateFormat.format(date));
    }
    /**
     * 指定格式日期往后加多少分钟
     * @param format
     * @param StrDate
     * @param min
     * @return
     */
    @SuppressWarnings("static-access")
    public static String addMin(String format,String StrDate,int min){
            Calendar   cal = Calendar.getInstance();
            SimpleDateFormat sFmt = new SimpleDateFormat(format);
            cal.setTime(sFmt.parse( (StrDate), new ParsePosition(0)));
            if (min != 0) {
                cal.add(cal.MINUTE,min);
            }
            return sFmt.format(cal.getTime());
    }
    /**
     * 指定格式日期往后加多少分钟
     * @param date
     * @param min
     * @return
     */
    public static Date addMin(Date date,int min){
            Calendar   cal = Calendar.getInstance();
            cal.setTime(date);
            if (min != 0) {
                cal.add(Calendar.MINUTE,min);
            }
            return cal.getTime();
    }
    /**
     * HH:mm:ss上加秒
     * @param date
     * @param seconds
     * @return
     */
    public static String addSecond(Date date, int seconds) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.SECOND, seconds);
        date =calendar.getTime();
        return dateToStringHMS(date);
    }
    /**
     * 产生2位
     */
    public static String getThreeRandom(){
        int random1 = (int) (Math.random() * 900 + 100);
        String random = String.valueOf(random1);
        return random;
    }
    /**
     * 把日期格式转换为字符串格式yyyy-MM-dd
     * @param
     * @return
     */
    public static String dateToStringYMD (){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        return simpleDateFormat.format(new Date());
    }
    /**
     * 把日期格式转换为字符串格式yyyy-MM-dd
     * @param
     * @return
     */
    public static String dateToStringYMD (Date data){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        return simpleDateFormat.format(data);
    }
    /**
       * String类型时间转为Timestamp,str与format必须格式一致
       *
        * @param str
       * @param
       * @return
     */
    public static Timestamp str2Timestamp(String str) {
          Timestamp ts = null;
          try {
             if (null != str && !"".equals(str)) {
                DateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                ts = new Timestamp(sdf.parse(str).getTime());
             }
          } catch (Exception e) {
             // TODO: handle exception
             e.printStackTrace();
          }
          return ts;
     }
    /**
       * Date类型时间转为String格式,format为需要返回的格式
       *
       * @param
       * @param
       * @return
    */
    public static String timeStamp2Str(Date dateTime) {
        /*SimpleDateFormat oldFormat  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date();
        try {
            date = oldFormat.parse(dateTime);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        return sdf.format(dateTime);
    }
    /**
     * 获取一个月的天数
     * @param year
     * @param month
     * @return
     */
    public static int dateToString (String year,String month){
        Calendar c= Calendar.getInstance();
             c.set(Calendar.YEAR, Integer.parseInt(year));
             c.set(Calendar.MONTH, Integer.parseInt(month)+1);
        return c.getActualMaximum(Calendar.DAY_OF_MONTH);
    }
    /**
     * 把日期格式转换为字符串格式
     * @param date
     * @return
     */
    public static String dateToString (Date date){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return simpleDateFormat.format(date);
    }
    /**
     * 把日期格式转换为字符串格式
     * @param date
     * @return
     */
    public static String dateToString (Date date,String dateFormat){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
        return simpleDateFormat.format(date);
    }
    /**
     * 把日期格式转换为YYMMDDHHMMSS格式
     * @param
     * @return
     */
    public static String dateToNumber (String time){
        SimpleDateFormat oldFormat  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat newFormat  = new SimpleDateFormat("yyMMddHHmmss");
        Date date = new Date();
        try {
            date = oldFormat.parse(time);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return newFormat.format(date);
    }
    /**
     * 根据有效期格式化时间
     * @param type  1每年 2 每月 3 每天 4 每小时 5 每分钟
     * @param time  yyMMddHHmmss
     * @return
     */
    public static String termvalidityFormat(int type,String time){
        String retime = null;
        try {
            if(type == 1){
                retime = "00"+time.substring(2, time.length());
            }else if(type == 2){
                retime = "0000"+time.substring(4, time.length());
            }else if(type == 3){
                retime = "000000"+time.substring(6, time.length());
            }else if(type == 4){
                retime = "00000000"+time.substring(8, time.length());
            }else if(type == 5){
                retime = "0000000000"+time.substring(10, time.length());
            }else {
                retime = time;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return retime;
    }
    /**
     * 把原始字符串扩展成自定的长度
     * @param oriStr 原始字符串
     * @param fillChar 要填充的字符
     * @param setLength 要扩展成的长度
     * @param preFill 前扩充还是后扩充 true-在前面填充,false-后面填充
     * @return
     */
    public static String fixStringToSetLength(String oriStr, String fillChar, int setLength, boolean preFill) {
        if(oriStr == null || fillChar.equals("")) {
            return oriStr;
        }
        int oriLength = oriStr.length();
        StringBuilder sb = null;
        if(preFill == true) {
            sb = new StringBuilder();
            for(int i = oriLength; i < setLength; i++) {
                sb.append(fillChar);
            }
            sb.append(oriStr);
        } else {
            sb = new StringBuilder(oriStr);
            for(int i = oriLength; i < setLength; i++) {
                sb.append(fillChar);
            }
        }
        return sb.toString();
    }
    //日期往后加多少个月,多少天,多少年
    @SuppressWarnings("static-access")
    public static String addMonth(String format,String StrDate,int year,int month,int day){
        Calendar   cal = Calendar.getInstance();
        SimpleDateFormat sFmt = new SimpleDateFormat(format);
        cal.setTime(sFmt.parse( (StrDate), new ParsePosition(0)));
        if (day != 0) {
            cal.add(cal.DATE,day);
        }
        if (month != 0) {
            cal.add(cal.MONTH, month);
        }
        if (year != 0) {
            cal.add(cal.YEAR, year);
        }
        return sFmt.format(cal.getTime());
    }
    /**
     * 在当前时间增加或减少N个小時
     * @param
     * @param month
     * @return
     */
    public static Date addHour(int hour){
        Calendar   cal = Calendar.getInstance();
        cal.add( Calendar.HOUR, hour);
        return cal.getTime();
    }
    /**
     * 在当前时间增加或减少N个月
     * @param
     * @param month
     * @return
     */
    public static Date addMonth(int month){
        Calendar   cal = Calendar.getInstance();
        cal.add( Calendar.MONTH, month);
        return cal.getTime();
    }
    /**
     * 增加days天
     * @param date
     * @param days
     * @return
     */
    public static Date addDays(Date date ,int days){
        Calendar   cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DAY_OF_MONTH, days);
        return cal.getTime();
    }
    /**
     * 判断两个时间字符串之差
     * @param date1
     * @param date2
     * @return 毫秒数
     */
    public static Long dateDiff(String date1,String date2) {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            return df.parse(date1).getTime() - df.parse(date2).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 判断两个指定格式时间字符串之差
     * @param format
     * @param date1
     * @param date2
     * @return 毫秒数
     */
    public static Long dateDiff(String format,String date1,String date2) {
        DateFormat df = new SimpleDateFormat(format);
        try {
            return df.parse(date1).getTime() - df.parse(date2).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 计算时间差,相差多少天、小时、分、秒
     * @param stime
     * @param etime
     * @return
     */
    public static String dateDiffStr(String stime,String etime){
        String diff = "";
        try {
            SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            java.util.Date begin=dfs.parse(stime);
            java.util.Date end = dfs.parse(etime);
            long between=(end.getTime()-begin.getTime())/1000;//除以1000是为了转换成秒
            long day1=between/(24*3600);
            long hour1=between%(24*3600)/3600;
            long minute1=between%3600/60;
            long second1=between%60;
            System.out.println(""+day1+"天"+hour1+"小时"+minute1+"分"+second1+"秒");
            if(day1>0){
                diff = ""+day1+"天"+hour1+"小时"+minute1+"分"+second1+"秒";
                return diff;
            }
            if(hour1>0){
                diff = ""+hour1+"小时"+minute1+"分"+second1+"秒";
                return diff;
            }
            if(minute1>0){
                diff = ""+minute1+"分"+second1+"秒";
                return diff;
            }
            if(second1>=0){
                diff = ""+second1+"秒";
                return diff;
            }
            return diff;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return diff;
    }
    /**
     * 和当前时间差
     * @param date
     * @return 当前时间 - date 毫秒数
     */
    public static Long currentTimeDiff(String date) {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            return System.currentTimeMillis() -  df.parse(date).getTime();
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 和当前时间差
     * @param date
     * @return 当前时间 - date 返回相差小时
     */
    public static int currentTimeDiffToHour(String date) {
        if(date == null || date.equals("")){
            return 25;
        }
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            Long longss = System.currentTimeMillis() -  df.parse(date).getTime();
            int hour = Integer.parseInt(longss/(1000*3600)+"");
            return hour;
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return 25;
    }
    /**
     * 和当前时间差 分钟
     * @param date
     * @return 当前时间 - 返回分钟
     */
    public static int currentTimeDiffToMin(String date) {
        if(date == null || date.equals("")){
            return 25;
        }
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            Long longss = System.currentTimeMillis() -  df.parse(date).getTime();
            int hour = Integer.parseInt(longss/(1000*60)+"");
            return hour;
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return 0;
    }
    /**
     * 和当前时间差(不需要时分秒)
     * @param date
     * @return 当前时间 - date
     *
     *      */
    public static Long currentTimeDiff2(String date) {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return System.currentTimeMillis() -  df.parse(date).getTime();
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 日期比较
     * @param DATE1
     * @param DATE2
     * @return DATE1 > DATE2 返回1
     */
    public static int compare_date(String DATE1, String DATE2) {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            Date dt1 = df.parse(DATE1);
            Date dt2 = df.parse(DATE2);
            if (dt1.getTime() > dt2.getTime()) {
                return 1;
            } else if (dt1.getTime() < dt2.getTime()) {
                return -1;
            } else {
                return 0;
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return 0;
    }
    /**
     * 日期比较
     * @param DATE1
     * @param DATE2
     * @return DATE1 > DATE2 返回1
     */
    public static int compareDate(String DATE1, String DATE2) {
        if(DATE1 == null || DATE1.equals("")){
            return -1;
        }
        if(DATE2 == null || DATE2.equals("")){
            return 1;
        }
        if(DATE1.equals(DATE2)){
            return 0;
        }
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date dt1 = df.parse(DATE1);
            Date dt2 = df.parse(DATE2);
            if (dt1.getTime() > dt2.getTime()) {
                return 1;
            } else if (dt1.getTime() < dt2.getTime()) {
                return -1;
            } else {
                return 0;
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return 0;
    }
    /**
     * 日期比较
     * @param DATE1
     * @param DATE2
     * @return DATE1 > DATE2 返回1
     */
    public static int compareDate(String DATE1, String DATE2,String formate) {
        if(DATE1 == null || DATE1.equals("")){
            return -1;
        }
        if(DATE2 == null || DATE2.equals("")){
            return 1;
        }
        if(DATE1.equals(DATE2)){
            return 0;
        }
        DateFormat df = new SimpleDateFormat(formate);
        try {
            Date dt1 = df.parse(DATE1);
            Date dt2 = df.parse(DATE2);
            if (dt1.getTime() > dt2.getTime()) {
                return 1;
            } else if (dt1.getTime() < dt2.getTime()) {
                return -1;
            } else {
                return 0;
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return 0;
    }
    /**
     * 将日期yyyy-MM-dd HH:mm:ss 格式化为 yyyyMMddHHmmss
     * @param date
     * @return
     */
    public static String fomatDate(String date){
        String dateStr = null;
        if(date == null || "".equals(date)){
            dateStr = "";
        }else{
            try {
                dateStr = date.replaceAll(":", "").replaceAll("-", "").replaceAll(" ", "");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return dateStr;
    }
    /**
     * 获取插入数据库格式的时间
     * @return
     */
    public static String getSQLDate() {
        String systemdate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
        .format(Calendar.getInstance().getTime()); // 获取系统当前时间
        return systemdate;
    }
    /**
     * 字符串转日期 yyyy-MM-dd HH:mm:ss
     * @param date
     * @return
     */
    public static Date getStringToDate(String date){
        if (StringUtils.isEmpty(date)) {
            return null;
        }
        Date date2 = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            date2 = simpleDateFormat.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date2;
    }
    /**
     * 字符串转日期 yyyy-MM-dd HH:mm:ss
     * @param date
     * @return
     */
    public static Date getStringToDate(String date,String format){
        Date date2 = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        try {
            date2 = simpleDateFormat.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date2;
    }
    /**
     * 获取插入数据库格式的时间yyyy-MM-dd
     * @return
     */
    public static String getSQLDateYMD() {
        String systemdate = new SimpleDateFormat("yyyy-MM-dd")
        .format(Calendar.getInstance().getTime()); // 获取系统当前时间
        return systemdate;
    }
    public static Integer getSQLDateMonth() {
        String systemdate = new SimpleDateFormat("MM")
        .format(Calendar.getInstance().getTime()); // 获取系统当前时间
        return Integer.parseInt(systemdate);
    }
    /**
     * 对月份进行加减
     * @param i
     * @return
     * @throws ParseException
     */
    public static Date datePlusOrMinus(String systime ,Integer i) throws ParseException{
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date systDate =df.parse(systime);
        GregorianCalendar gc =new GregorianCalendar();
        gc.setTime(systDate);
        gc.add(2,i);
        return gc.getTime();
    }
    /**
     * 得到月日时分秒10位时间戳字符串
     */
    public static String getTenTimestamp() {
        String systemdate = new SimpleDateFormat("MMddHHmmss").format(Calendar.getInstance().getTime());
        return systemdate;
    }
    /**
     * 得到年月日
     */
    public static String getDateTime() {
        SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");
        String systemdate = sdf.format(Calendar.getInstance().getTime());
        return systemdate.substring(0, systemdate.length());
    }
    /**
     * 得到16位时间戳字符串,前面14位年月日时分秒,第15位毫秒,第16位随机数
     */
    public static String getUniqueTimestamp() {
        SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String systemdate = sdf.format(Calendar.getInstance().getTime());
        return systemdate.substring(0, systemdate.length()-2)+getOneRandom();
    }
    /**
     * 产生6位随机数
     */
    public static String getSixRandom(){
        int random1 = (int) (Math.random() * 900000 + 100000);
        String random = String.valueOf(random1);
        return random;
    }
    /**
     * 产生4位随机数
     */
    public static String getFourRandom(){
        int random1 = (int) (Math.random() * 9000 + 1000);
        String random = String.valueOf(random1);
        return random;
    }
    /**
     * 产生2位随机数
     */
    public static String getTwoRandom(){
        int random1 = (int) (Math.random() * 90 + 10);
        String random = String.valueOf(random1);
        return random;
    }
    /**
     * 产生1位随机数
     */
    public static String getOneRandom(){
        int random1 = (int) (Math.random() * 9 + 1);
        String random = String.valueOf(random1);
        return random;
    }
    /**
     * 产生2位小于60的随机数
     */
    public static String getTwoRandomSixth(){
        int random1 = (int) (Math.random() * 90 + 10);
        String random = String.valueOf(random1);
        return random;
    }
    /**
     * 产生-10——10之间的数字
     * @return
     */
    public static Integer randomZF(){
        int a=(int)(Math.random()*2+1);
        //System.out.println(a);
        int aa=(int)(Math.pow(-1, a));
        //System.out.println(aa);
        int aaa=(int)(Math.random()*10+1);
        int num=aa*aaa;
        //System.out.println(num);
        return num;
    }
    /**
     * 计算两个日期之间相差的月数
     *
     * @param date1
     * @param date2
     * @return
     */
    public static int getMonths(Date date1, Date date2) {
        int iMonth = 0;
        int flag = 0;
        try {
            Calendar objCalendarDate1 = Calendar.getInstance();
            objCalendarDate1.setTime(date1);
            Calendar objCalendarDate2 = Calendar.getInstance();
            objCalendarDate2.setTime(date2);
            if (objCalendarDate2.equals(objCalendarDate1))
                return 0;
            if (objCalendarDate1.after(objCalendarDate2)) {
                Calendar temp = objCalendarDate1;
                objCalendarDate1 = objCalendarDate2;
                objCalendarDate2 = temp;
            }
            if (objCalendarDate2.get(Calendar.DAY_OF_MONTH) < objCalendarDate1
                    .get(Calendar.DAY_OF_MONTH))
                flag = 1;
            if (objCalendarDate2.get(Calendar.YEAR) > objCalendarDate1
                    .get(Calendar.YEAR))
                iMonth = ((objCalendarDate2.get(Calendar.YEAR) - objCalendarDate1
                        .get(Calendar.YEAR))
                        * 12 + objCalendarDate2.get(Calendar.MONTH) - flag)
                        - objCalendarDate1.get(Calendar.MONTH);
            else
                iMonth = objCalendarDate2.get(Calendar.MONTH)
                - objCalendarDate1.get(Calendar.MONTH) - flag;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return iMonth;
    }
    /**
     * 计算两个日期之间相差的天数
     *
     * @param date1
     * @param date2
     * @return
     */
    public static final int daysBetween(Date date1, Date date2) {
        java.util.Calendar time1 = java.util.Calendar.getInstance();
        java.util.Calendar time2 = java.util.Calendar.getInstance();
        time1.setTime(date1);
        time2.setTime(date2);
        int days = 0;
        if(time1.getTime().getTime() >= time2.getTime().getTime()){
            days = ((int) (time1.getTime().getTime() / 1000) - (int) (time2.getTime().getTime() / 1000)) / 3600 / 24;
        }else{
            days = ((int) (time2.getTime().getTime() / 1000) - (int) (time1.getTime().getTime() / 1000)) / 3600 / 24;
        }
        return days;
    }
    /**
     * 计算两个日期之间相差秒
     *
     * @param sdate1
     * @param sdate2
     * @return
     */
    public static final int secBetween(String sdate1, String sdate2) {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date1 = null;
        try {
            date1 = df.parse(sdate1);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Date date2 = null;
        try {
            date2 = df.parse(sdate2);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        java.util.Calendar time1 = java.util.Calendar.getInstance();
        java.util.Calendar time2 = java.util.Calendar.getInstance();
        time1.setTime(date1);
        time2.setTime(date2);
        int sec = 0;
        if(time1.getTime().getTime() >= time2.getTime().getTime()){
            sec = ((int) (time1.getTime().getTime() / 1000) - (int) (time2.getTime().getTime() / 1000));
        }else{
            sec = ((int) (time2.getTime().getTime() / 1000) - (int) (time1.getTime().getTime() / 1000));
        }
        return sec;
    }
    /**
     *
     * @param date1 <String>
     * @param date2 <String>
     * @return int
     * @throws ParseException
     */
    public static int getMonthSpace(String date1, String date2)
    throws ParseException {
        int result = 0;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();
        c1.setTime(sdf.parse(date1));
        c2.setTime(sdf.parse(date2));
        result = c2.get(Calendar.MONTH) - c1.get(Calendar.MONTH);
        return result == 0 ? 1 : Math.abs(result);
    }
    /**
     * 根据毫秒数计算时分秒
     * @param timeMillis
     * @return
     */
    public static String myTimeStr(long timeMillis) {
        int timezone = 8;
        long totalSeconds = timeMillis / 1000;
        totalSeconds += 60 * 60 * timezone;
        int second = (int)(totalSeconds % 60);// 秒
        long totalMinutes = totalSeconds / 60;
        int minute = (int)(totalMinutes % 60);// 分
        long totalHours = totalMinutes / 60;
        int hour = (int)(totalHours % 24);// 时
        int totalDays = (int)(totalHours / 24);
        int _year = 1970;
        int year = _year + totalDays / 366;
        int month = 1;
        int day = 1;
        int diffDays;
        boolean leapYear;
        while (true) {
            int diff = (year - _year) * 365;
            diff += (year - 1) / 4 - (_year - 1) / 4;
            diff -= ((year - 1) / 100 - (_year - 1) / 100);
            diff += (year - 1) / 400 - (_year - 1) / 400;
            diffDays = totalDays - diff;
            leapYear = (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0);
            if (!leapYear && diffDays < 365 || leapYear && diffDays < 366) {
                break;
            } else {
                year++;
            }
        }
        int[] monthDays;
        if (diffDays >= 59 && leapYear) {
            monthDays = new int[]{-1,0,31,60,91,121,152,182,213, 244, 274, 305, 335 };
        } else {
            monthDays = new int[]{-1,0,31,59,90,120,151,181,212, 243, 273, 304, 334 };
        }
        for (int i = monthDays.length - 1; i >= 1; i--) {
            if (diffDays >= monthDays[i]) {
                month = i;
                day = diffDays - monthDays[i] + 1;
                break;
            }
        }
        return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
    }
    /**
     * 根据秒数计算小时
     * @param
     * @return
     */
    public static String secondToHour(String second) {
        if(second == null || "".equals(second) || "null".equals(second)){
            return null;
        }
        Double sec = Double.parseDouble(second);
        Double hour = sec/3600;
        DecimalFormat df=new DecimalFormat("0.0");
        return df.format(hour).toString();
    }
    /**
     * 根据秒数计算分钟
     * @param
     * @return
     */
    public static String secondToMinute(String second) {
        if(second == null || "".equals(second) || "null".equals(second)){
            return null;
        }
        Double sec = Double.parseDouble(second);
        Double minute = sec/60;
        DecimalFormat df=new DecimalFormat("0.0");
        return df.format(minute).toString();
    }
    /**
     * 根据小时数计算秒
     * @param
     * @return
     */
    public static String hourToSecond(String hour) {
        if(hour == null || "".equals(hour) || "null".equals(hour)){
            return null;
        }
        DecimalFormat df=new DecimalFormat("0");
        return df.format(Double.parseDouble(hour)*3600).toString();
    }
    /**
     * 根据分钟计算秒
     * @param
     * @return
     */
    public static String MinuteToSecond(String minute) {
        if(minute == null || "".equals(minute) || "null".equals(minute)){
            return null;
        }
        DecimalFormat df=new DecimalFormat("0");
        return df.format(Double.parseDouble(minute)*60).toString();
    }
    /**
     * 将日期yyyy-MM-dd HH:mm:ss 格式化为 yyMMddHHmmss
     * @param date
     * @return
     */
    public static String fomatDateToNumber(String date){
        String dateStr = null;
        if(date == null || "".equals(date)){
            dateStr = "";
        }else{
            try {
                dateStr = date.replaceAll(":", "").replaceAll("-", "").replaceAll(" ", "");
                dateStr = dateStr.substring(2);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return dateStr;
    }
    /**
     * 把YYMMDDHHMMSS格式转换为date格式
     * @param
     * @return
     */
    public static String numberToDate (String number){
        SimpleDateFormat oldFormat  = new SimpleDateFormat("yyMMddHHmmss");
        SimpleDateFormat newFormat  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date();
        try {
            date = oldFormat.parse(number);
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
        return newFormat.format(date);
    }
    /**
     * 产生8位HHmmss
     */
    public static String getEightRandom(){
        String systemdate = new SimpleDateFormat("HHmmss")
        .format(Calendar.getInstance().getTime()); // 获取系统当前时间
        int random1 = (int) (Math.random() * 90 + 10);
        String random = String.valueOf(random1);
        return systemdate + random;
    }
    /**
     * 时间戳转换成时间
     * @param time
     * @return
     */
    public static String TimeStampToDateTime(long time){
        String datetime = null;
        try {
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            datetime = sdf.format(new Date(time*1000));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return datetime;
    }
    /**
     * 时间转成时间戳 毫秒
     * @param datetime
     * @return
     */
    public static long DateTimeToTimeStampSS(String datetime){
         try {
             SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
             Date date=simpleDateFormat.parse(datetime);
             long timeStemp = date.getTime();
             return timeStemp;
        } catch (Exception e) {
            e.printStackTrace();
            return 0L ;
        }
    }
    /**
     * 时间转成时间戳 秒
     * @param datetime
     * @return
     */
    public static long DateTimeToTimeStampS(String datetime){
         try {
             SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
             Date date=simpleDateFormat.parse(datetime);
             long timeStemp = date.getTime()/1000;
             return timeStemp;
        } catch (Exception e) {
            e.printStackTrace();
            return System.currentTimeMillis()/1000 ;
        }
    }
    /**
     * 转成时间戳
     * @param datetime
     * @return
     */
    public static long NumberTimeToTimeStamp(String datetime){
        try {
            SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyMMddHHmmss");
            Date date=simpleDateFormat.parse(datetime);
            long timeStemp = date.getTime()/1000;
            return timeStemp;
        } catch (Exception e) {
            e.printStackTrace();
            return System.currentTimeMillis()/1000 ;
        }
    }
    /**
     * 得到UTC时间,类型为字符串,格式为"yyyy-MM-dd HH:mm"<br />
     * 如果获取失败,返回null
     * @return
     */
    public static String getUTCTimeStr() {
        SimpleDateFormat foo = new SimpleDateFormat("yyyy-MM-dd hh:mm");
        System.out.println("foo:"+foo.format(new Date()));
        Calendar gc = GregorianCalendar.getInstance();
        System.out.println("gc.getTime():"+gc.getTime());
        System.out.println("gc.getTimeInMillis():"+new Date(gc.getTimeInMillis()));
        //当前系统默认时区的时间:
        Calendar calendar=new GregorianCalendar();
        System.out.print("时区:"+calendar.getTimeZone().getID()+"  ");
        System.out.println("时间:"+calendar.get(Calendar.HOUR_OF_DAY)+":"+calendar.get(Calendar.MINUTE));
        //美国洛杉矶时区
        TimeZone tz=TimeZone.getTimeZone("America/Los_Angeles");
        //时区转换
        calendar.setTimeZone(tz);
        System.out.print("时区:"+calendar.getTimeZone().getID()+"  ");
        System.out.println("时间:"+calendar.get(Calendar.HOUR_OF_DAY)+":"+calendar.get(Calendar.MINUTE));
        //1、取得本地时间:
        java.util.Calendar cal = java.util.Calendar.getInstance();
        //2、取得时间偏移量:
        int zoneOffset = cal.get(java.util.Calendar.ZONE_OFFSET);
        //3、取得夏令时差:
        int dstOffset = cal.get(java.util.Calendar.DST_OFFSET);
        //4、从本地时间里扣除这些差量,即可以取得UTC时间:
        cal.add(java.util.Calendar.MILLISECOND, -(zoneOffset + dstOffset));
        //之后调用cal.get(int x)或cal.getTimeInMillis()方法所取得的时间即是UTC标准时间。
        System.out.println("UTC:"+new Date(cal.getTimeInMillis()));
        Calendar calendar1 = Calendar.getInstance();
        TimeZone tztz = TimeZone.getTimeZone("GMT");
        calendar1.setTimeZone(tztz);
        System.out.println(calendar.getTime());
        System.out.println("9999:"+calendar.getTimeInMillis()/1000);
        System.out.println("utc1="+System.currentTimeMillis()/1000);
        System.out.println("utc="+new Date().getTime()/1000);
        System.out.println(TimeStampToDateTime(1421724351));
        System.out.println("=="+DateTimeToTimeStampS("2015-01-20 11:35:06"));
        System.out.println(TimeStampToDateTime(DateTimeToTimeStampS("2015-01-20 11:35:06")));
        return null;
    }
    /**
     * 获得指定日期的前/后n天,小时
     *
     * @param specifiedDay
     * @return
     */
    public static String getSpecifiedDayAbove(String specifiedDay,int n,int h) {
        Calendar c = Calendar.getInstance();
        Date date = null;
        try {
            date = new SimpleDateFormat("yy-MM-dd HH:mm:ss").parse(specifiedDay);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        c.setTime(date);
        int day = c.get(Calendar.DATE);
        c.set(Calendar.DATE, day + n);
        int hour = c.get(Calendar.HOUR);
        c.set(Calendar.HOUR,hour + h);
        String dayAfter = new SimpleDateFormat("yy-MM-dd HH:mm:ss")
                .format(c.getTime());
        return dayAfter;
    }
    /**
     * 两个时间的小时差
     * @param st
     * @param ed
     * @return
     */
    public static long dateSpaceHours(Date st,Date ed){
        return (long) Math.ceil((ed.getTime() - st.getTime())/3600000.0);
    }
    public static String formatDate(Date date,  String format) throws ParseException {
        DateFormat df = new SimpleDateFormat(format);
        df.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        return df.format(date);
    }
    public static Date parseDate(String date,  String format) {
        DateFormat df = new SimpleDateFormat(format);
        df.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        try {
            return df.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}
src/main/java/com/xcong/excoin/modules/blackchain/service/EthService.java
New file
@@ -0,0 +1,283 @@
package com.xcong.excoin.modules.blackchain.service;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.web3j.abi.FunctionEncoder;
import org.web3j.abi.FunctionReturnDecoder;
import org.web3j.abi.TypeReference;
import org.web3j.abi.datatypes.Address;
import org.web3j.abi.datatypes.Function;
import org.web3j.abi.datatypes.Type;
import org.web3j.abi.datatypes.generated.Uint256;
import org.web3j.crypto.Credentials;
import org.web3j.crypto.RawTransaction;
import org.web3j.crypto.TransactionEncoder;
import org.web3j.crypto.WalletUtils;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.admin.Admin;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.Request;
import org.web3j.protocol.core.methods.request.Transaction;
import org.web3j.protocol.core.methods.response.*;
import org.web3j.protocol.http.HttpService;
import org.web3j.utils.Convert;
import org.web3j.utils.Numeric;
import org.web3j.utils.Convert.Unit;
/**
 * ETH类,使用Web3j 下面为使用教程
 * https://kauri.io/article/925d923e12c543da9a0a3e617be963b4/manage-an-ethereum-account-with-java-and-web3js
 *
 * @author Administrator
 *
 */
public class EthService {
    private static String ethWalletPath = "/home/javaweb/webresource/eth";
    // private static String ethWalletPath="E://";
    private Web3j web3j;
    // private Admin admin;
    // private Parity parity;
    /**
     * 服务器地址
     */
    //private static final String ETH_UTL = "https://mainnet.infura.io/v3/882c66ebcfc141abbea22b948fa44321";
    private static final String ETH_UTL = "http://120.55.86.146:8545";
    public EthService() {
        try {
            HttpService service = new HttpService(ETH_UTL);
            web3j = Web3j.build(service);
            // parity = Parity.build(service);
            // admin = Admin.build(service);
        } catch (Exception e) {
            System.out.println("liangjieshibao");
            // logger.error("==============虚拟币-以太坊链接获取失败!");
            e.printStackTrace();
        }
    }
    /**
     * 查询ETH余额
     *
     * @param address
     * @return
     */
    public static BigDecimal getEthBlance(String address) {
        Web3j web3 = Web3j.build(new HttpService(ETH_UTL));
        EthGetBalance balanceWei;
        try {
            balanceWei = web3.ethGetBalance(address, DefaultBlockParameterName.LATEST).send();
            if (balanceWei.getResult() == null) {
                return null;
            }
            BigDecimal balanceInEther = Convert.fromWei(balanceWei.getBalance().toString(), Unit.ETHER);
            return balanceInEther;
        } catch (Exception e) {
            System.out.println("ETH查询失败:" + address);
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 创建ETH钱包
     *
     * @return
     */
    public static Map<String, String> createEth() {
        Map<String, String> wallet = new HashMap<String, String>();
        try {
            String walletPassword = "secr3t";
            // 文件路径
            String walletDirectory = ethWalletPath;
            String walletName = WalletUtils.generateNewWalletFile(walletPassword, new File(walletDirectory));
            System.out.println("wallet location: " + walletDirectory + "/" + walletName);
            Credentials credentials = WalletUtils.loadCredentials(walletPassword, walletDirectory + "/" + walletName);
            String accountAddress = credentials.getAddress();
            String privateKey = credentials.getEcKeyPair().getPrivateKey().toString(16);
            // 钱包地址
            wallet.put("address", accountAddress);
            // 钱包私钥
            wallet.put("privateKey", privateKey);
            // 产生的钱包文件地址
            wallet.put("walletLocation", walletDirectory + "/" + walletName);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return wallet;
    }
    public boolean checkTransferResult(String hash) {
        // 0xa3e6a0ccc3aac30d866a86ca9c0477dd58b7b061787ba40b16c3844803273816 交易hash
        Request<?, EthGetTransactionReceipt> ethGetTransactionReceiptRequest = web3j.ethGetTransactionReceipt(hash);
        EthGetTransactionReceipt send = null;
        try {
            send = ethGetTransactionReceiptRequest.send();
            if(send!=null){
                TransactionReceipt result = send.getResult();
                if(result!=null){
                    String status = result.getStatus();
                    System.out.println(status);//0x1
                    if("0x1".equals(status)){
                        return true;
                    }else{
                        return false;
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return false;
    }
    public static void main(String[] args) throws IOException {
        HttpService service = new HttpService(ETH_UTL);
        Web3j build = Web3j.build(service);
        //Request<?, EthTransaction> ethTransactionRequest = build.ethGetTransactionByHash("0xa3e6a0ccc3aac30d866a86ca9c0477dd58b7b061787ba40b16c3844803273816");
        Request<?, EthGetTransactionReceipt> ethGetTransactionReceiptRequest = build.ethGetTransactionReceipt("0xa3e6a0ccc3aac30d866a86ca9c0477dd58b7b061787ba40b16c3844803273816");
        EthGetTransactionReceipt send = ethGetTransactionReceiptRequest.send();
        String status = send.getResult().getStatus();
        System.out.println(status);//0x1
//        EthTransaction send = ethTransactionRequest.send();
//        String input = send.getResult().getInput();
//        System.out.println(input);
    }
    /**
     *
     * 方法描述:获取代币余额
     *
     * @param fromAddress
     * @param
     * @param
     * @return long
     */
    public BigDecimal tokenGetBalance(String fromAddress) {
        try {
            // 合约地址
            String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7";
            int decimal = 6;
            String methodName = "balanceOf";
            List<Type> inputParameters = new ArrayList<>();
            List<TypeReference<?>> outputParameters = new ArrayList<>();
            Address address = new Address(fromAddress);
            inputParameters.add(address);
            TypeReference<Uint256> typeReference = new TypeReference<Uint256>() {
            };
            outputParameters.add(typeReference);
            Function function = new Function(methodName, inputParameters, outputParameters);
            String data = FunctionEncoder.encode(function);
            Transaction transaction = Transaction.createEthCallTransaction(fromAddress, contractAddress, data);
            EthCall ethCall;
            BigInteger balanceValue = BigInteger.ZERO;
            try {
                ethCall = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).send();
                List<Type> results = FunctionReturnDecoder.decode(ethCall.getValue(), function.getOutputParameters());
                balanceValue = (BigInteger) results.get(0).getValue();
            } catch (IOException e) {
                e.printStackTrace();
            }
            double res = BigDecimalUtil.div(new BigDecimal(balanceValue).doubleValue(), Math.pow(10, decimal), 8);
            if (res > 0) {
                return new BigDecimal(res);
            }
        } catch (Exception e) {
            // logger.error("==============以太坊代币链接获取失败!");
            e.printStackTrace();
        }
        return BigDecimal.ZERO;
    }
    // USDT
    public String tokenSend(String privateKey, String fromAddress, String toAddress, String amount)
            throws InterruptedException, ExecutionException {
        // Web3j web3j = Web3j.build(new
        // HttpService("https://mainnet.infura.io/v3/882c66ebcfc141abbea22b948fa44321"));
        String contractAddress = "0xdac17f958d2ee523a2206206994597c13d831ec7";
        Credentials credentials = Credentials.create(privateKey);
        EthGetTransactionCount ethGetTransactionCount = web3j
                .ethGetTransactionCount(fromAddress, DefaultBlockParameterName.LATEST).sendAsync().get();
        BigInteger nonce = ethGetTransactionCount.getTransactionCount();
        Function function = new Function("transfer",
                Arrays.asList(new Address(toAddress), new Uint256(new BigInteger(amount))),
                Arrays.asList(new TypeReference<Type>() {
                }));
        String encodedFunction = FunctionEncoder.encode(function);
        RawTransaction rawTransaction = RawTransaction.createTransaction(nonce,
                Convert.toWei("40", Convert.Unit.GWEI).toBigInteger(),// 给矿工开的转账单价 单价越高越快
                Convert.toWei("80000", Convert.Unit.WEI).toBigInteger(), contractAddress, encodedFunction);//里程上限
                // 10*80000/1000000000=0.0008 手续费
        byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
        String hexValue = Numeric.toHexString(signedMessage);
        // log.debug("transfer hexValue:" + hexValue);
        EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get();
        if (ethSendTransaction.hasError()) {
            // log.info("transfer error:", ethSendTransaction.getError().getMessage());
            return "";
        } else {
            String transactionHash = ethSendTransaction.getTransactionHash();
            // log.info("Transfer transactionHash:" + transactionHash);
            return transactionHash;
        }
    }
    public String ethSend(String privateKey, String fromAddress, String toAddress, String amount)
            throws InterruptedException, ExecutionException {
        // Web3j web3j = Web3j.build(new
        // HttpService("https://mainnet.infura.io/v3/882c66ebcfc141abbea22b948fa44321"));
        Credentials credentials = Credentials.create(privateKey);
        EthGetTransactionCount ethGetTransactionCount = web3j
                .ethGetTransactionCount(fromAddress, DefaultBlockParameterName.LATEST).sendAsync().get();
        BigInteger nonce = ethGetTransactionCount.getTransactionCount();
        BigInteger value = Convert.toWei(amount, Convert.Unit.ETHER).toBigInteger();
        RawTransaction rawTransaction = RawTransaction.createEtherTransaction(nonce,
                Convert.toWei("40", Convert.Unit.GWEI).toBigInteger(),
                Convert.toWei("60000", Convert.Unit.WEI).toBigInteger(), toAddress, value);
        byte[] signedMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
        String hexValue = Numeric.toHexString(signedMessage);
        EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get();
        if (ethSendTransaction.hasError()) {
            // log.info("transfer error:", ethSendTransaction.getError().getMessage());
            return "";
        } else {
            String transactionHash = ethSendTransaction.getTransactionHash();
            // log.info("Transfer transactionHash:" + transactionHash);
            return transactionHash;
        }
    }
}
src/main/java/com/xcong/excoin/modules/blackchain/service/HttpUtil.java
New file
@@ -0,0 +1,281 @@
package com.xcong.excoin.modules.blackchain.service;
/**
 * @author: DengJiong
 * @date: 2018-05-09 18:43
 * @description:
 */
import org.apache.commons.lang3.StringUtils;
import javax.net.ssl.*;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;
/**
 * http 工具类
 *
 * @author cloud cloud
 * @create 2017/10/18
 **/
public class HttpUtil {
    private static final String CHARSET = "UTF-8";
    private static final String HTTP_POST = "POST";
    private static final String HTTP_GET = "GET";
    private static final String HTTP_PUT = "PUT";
    /**
     * Send GET request
     */
    public static String get(String url, Map<String, String> queryParas, Map<String, String> headers) {
        HttpURLConnection conn = null;
        try {
            conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), HTTP_GET, headers);
            conn.connect();
            return readResponseString(conn);
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
        finally {
            if (conn != null) {
                conn.disconnect();
            }
        }
    }
    public static String get(String url, Map<String, String> queryParas) {
        return get(url, queryParas, null);
    }
    public static String get(String url) {
        return get(url, null, null);
    }
    public static String jsonGet(String url,Map<String,String> params){
        Map<String,String> headers = new HashMap<>();
        headers.put("Content-Type","application/json");
        return get(url,params,headers);
    }
    /**
     * Send POST request
     */
    public static String post(String url, Map<String, String> queryParas, String data, Map<String, String> headers) {
        HttpURLConnection conn = null;
        try {
            conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), HTTP_POST, headers);
            conn.connect();
            OutputStream out = conn.getOutputStream();
            out.write(data.getBytes(CHARSET));
            out.flush();
            out.close();
            return readResponseString(conn);
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
        finally {
            if (conn != null) {
                conn.disconnect();
            }
        }
    }
    public static String post(String url, Map<String, String> queryParas, String data) {
        return post(url, queryParas, data, null);
    }
    public static String post(String url, String data, Map<String, String> headers) {
        return post(url, null, data, headers);
    }
    public static String post(String url, String data) {
        return post(url, null, data, null);
    }
    public static String jsonPost(String url,String data){
        Map<String,String> headers = new HashMap<>();
        headers.put("Content-Type","application/json");
        return post(url,null,data,headers);
    }
    public static String jsonPost(String url,Map<String,String>headers,String data){
        if(headers == null){
            headers = new HashMap<>();
        }
        headers.put("Content-Type","application/json");
        return post(url,null,data,headers);
    }
    /**
     * Send POST request
     */
    public static String put(String url, Map<String, String> queryParas, String data, Map<String, String> headers) {
        HttpURLConnection conn = null;
        try {
            conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), HTTP_PUT, headers);
            conn.connect();
            OutputStream out = conn.getOutputStream();
            out.write(data.getBytes(CHARSET));
            out.flush();
            out.close();
            return readResponseString(conn);
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
        finally {
            if (conn != null) {
                conn.disconnect();
            }
        }
    }
    public static String jsonPut(String url,String data){
        Map<String,String> headers = new HashMap<>();
        headers.put("Content-Type","application/json");
        return put(url,null,data,headers);
    }
    /**
     * https 域名校验
     */
    private static class TrustAnyHostnameVerifier implements HostnameVerifier {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    }
    /**
     * https 证书管理
     */
    private static class TrustAnyTrustManager implements X509TrustManager {
        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }
        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }
    }
    private static SSLSocketFactory initSSLSocketFactory() {
        try {
            TrustManager[] tm = {new TrustAnyTrustManager()};
            SSLContext sslContext = SSLContext.getInstance("TLS", "SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom());
            return sslContext.getSocketFactory();
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    private static final SSLSocketFactory sslSocketFactory = initSSLSocketFactory();
    private static final TrustAnyHostnameVerifier trustAnyHostnameVerifier = new TrustAnyHostnameVerifier();
    private static HttpURLConnection getHttpConnection(String url, String method, Map<String, String> headers) throws Exception {
        URL _url = new URL(url);
        HttpURLConnection conn = (HttpURLConnection)_url.openConnection();
        if (conn instanceof HttpsURLConnection) {
            ((HttpsURLConnection)conn).setSSLSocketFactory(sslSocketFactory);
            ((HttpsURLConnection)conn).setHostnameVerifier(trustAnyHostnameVerifier);
        }
        conn.setRequestMethod(method);
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setConnectTimeout(30000);
        conn.setReadTimeout(30000);
        conn.setUseCaches(false); // Post 请求不能使用缓存
        if(headers != null){
            String contentType = headers.get("Content-Type");
            if(StringUtils.isNotEmpty(contentType)){
                conn.setRequestProperty("Content-Type",contentType);
            }else{
                conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded;charset=utf-8");
            }
        }
        conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36");
        if (headers != null && !headers.isEmpty())
            for (Map.Entry<String, String> entry : headers.entrySet())
                conn.setRequestProperty(entry.getKey(), entry.getValue());
        return conn;
    }
    private static String readResponseString(HttpURLConnection conn) {
        StringBuilder sb = new StringBuilder();
        InputStream inputStream = null;
        try {
            inputStream = conn.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, CHARSET));
            String line = null;
            while ((line = reader.readLine()) != null){
                sb.append(line).append("\n");
            }
            return sb.toString();
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
        finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     * Build queryString of the url
     */
    private static String buildUrlWithQueryString(String url, Map<String, String> queryParas) {
        if (queryParas == null || queryParas.isEmpty())
            return url;
        StringBuilder sb = new StringBuilder(url);
        boolean isFirst;
        if (url.indexOf("?") == -1) {
            isFirst = true;
            sb.append("?");
        }
        else {
            isFirst = false;
        }
        for (Map.Entry<String, String> entry : queryParas.entrySet()) {
            if (isFirst) isFirst = false;
            else sb.append("&");
            String key = entry.getKey();
            String value = entry.getValue();
            if (!StringUtils.isEmpty(value)){
                try {value = URLEncoder.encode(value, CHARSET);} catch (UnsupportedEncodingException e) {throw new RuntimeException(e);}
                sb.append(key).append("=").append(value);
            }
        }
        return sb.toString();
    }
}
src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java
New file
@@ -0,0 +1,219 @@
package com.xcong.excoin.modules.blackchain.service.Impl;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSONObject;
import com.xcong.excoin.common.LoginUserUtils;
import com.xcong.excoin.common.response.Result;
import com.xcong.excoin.modules.blackchain.service.BlockSerive;
import com.xcong.excoin.modules.blackchain.service.BtcService;
import com.xcong.excoin.modules.blackchain.service.EthService;
import com.xcong.excoin.modules.blackchain.service.LtcService;
import com.xcong.excoin.modules.blackchain.service.UsdtService;
import com.xcong.excoin.modules.blackchain.service.XrpService;
import com.xcong.excoin.modules.member.dao.MemberCoinAddressDao;
import com.xcong.excoin.modules.member.dao.MemberDao;
import com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity;
import com.xcong.excoin.modules.member.entity.MemberEntity;
import com.xcong.excoin.utils.MessageSourceUtils;
import com.xcong.excoin.utils.RedisUtils;
@Service
public class BlockSeriveImpl implements BlockSerive {
    @Resource
    RedisUtils  redisUtil;
    @Resource
    MemberDao memberDao;
    @Resource
    MemberCoinAddressDao memberMapper;
    @Override
    public Result findBlockAddress(String symbol) {
        //获取用户ID
        String mId = LoginUserUtils.getAppLoginUser().getId().toString();
        MemberEntity member = memberDao.selectById(mId);
        if(member==null) {
            return Result.fail(MessageSourceUtils.getString("member_service_0003"));
        }
        String lable = member.getInviteId();
        Result result = new Result();
        try {
        Map<String, String> map = new HashMap<String, String>();
        MemberCoinAddressEntity memberCoinAddress = new MemberCoinAddressEntity();
        if("USDT".equals(symbol)) {
            memberCoinAddress = memberMapper.selectBlockAddressWithTag(Long.parseLong(mId), symbol,member.getInviteId());
        }else {
            memberCoinAddress = memberMapper.selectBlockAddress(Long.parseLong(mId), symbol);
        }
        ////System.out.println("symbol  ========== "+symbol);
        if(memberCoinAddress!=null) {
            ////System.out.println("1===================================");
            map.put("address", memberCoinAddress.getAddress());
            map.put("lable", memberCoinAddress.getLabel());
            result.setData(map);
            result.setCode(0);
        }else {
            ////System.out.println("2===================================");
            String address = "";
            String key = "";
            String uuid = member.getInviteId();
            switch (symbol) {
            case "BTC":
                Map<String,String> btcMap = UsdtService.createWallet(mId);
                address = btcMap.get("address");
                key = btcMap.get("privateKey");
                map.put("address", address);
                break;
            case "ETH":
                Map<String,String> ethMap = EthService.createEth();
                address = ethMap.get("address");
                key = ethMap.get("privateKey");
                map.put("address", address);
                break;
            case "BCH":
                MemberCoinAddressEntity btcAddress = memberMapper.selectBlockAddress(Long.parseLong(mId), "BTC");
                if(btcAddress!=null) {
                    address = btcAddress.getAddress();
                    key = btcAddress.getPrivateKey();
                    map.put("address", address);
                }else {
                    Map<String,String> bchMap = BtcService.createWallet(mId);
                    address = bchMap.get("address");
                    key = bchMap.get("privateKey");
                    map.put("address", address);
                    MemberCoinAddressEntity coinAddress = new MemberCoinAddressEntity();
                    coinAddress.setAddress(address);
                    coinAddress.setIsBiyict(MemberCoinAddressEntity.IS_BIYICT_YES);
                    coinAddress.setMemberId(Long.parseLong(mId));
                    coinAddress.setPrivateKey(key);
                    coinAddress.setSymbol("BTC");
                    coinAddress.setLabel(uuid);
                    memberMapper.insert(coinAddress);
                }
                break;
            case "EOS":
                address = "biyicteos123";
//                lable = member.getUID();
//                Map<String,String> eosMap = new HashMap<String, String>();
                map.put("address", address);
                map.put("lable",uuid);
                break;
            case "XRP":
                JSONObject jSONObject = XrpService.createWallet();
                address = (String)jSONObject.get("xAddress");
                key = (String)jSONObject.get("secret");
//                lable = member.getUID();
                map.put("address", address);
                map.put("lable", uuid);
                break;
            case "LTC":
                Map<String,String> ltcMap = LtcService.createWallet(mId);
                address = ltcMap.get("address");
                key = ltcMap.get("privateKey");
                map.put("address", address);
                break;
            case "ETC":
                MemberCoinAddressEntity ethAddress = memberMapper.selectBlockAddress(Long.parseLong(mId), "ETH");
                if(ethAddress!=null) {
                    address = ethAddress.getAddress();
                    key = ethAddress.getPrivateKey();
                    map.put("address", address);
                }else {
                    Map<String,String> etcMap = EthService.createEth();
                    address = etcMap.get("address");
                    key = etcMap.get("privateKey");
                    map.put("address", address);
                    MemberCoinAddressEntity coinAddress = new MemberCoinAddressEntity();
                    coinAddress.setAddress(address);
                    coinAddress.setIsBiyict(MemberCoinAddressEntity.IS_BIYICT_YES);
                    coinAddress.setMemberId(Long.parseLong(mId));
                    coinAddress.setPrivateKey(key);
                    coinAddress.setSymbol("ETH");
                    coinAddress.setLabel(uuid);
                    memberMapper.insert(coinAddress);
                }
                break;
            case "USDT":
                if("OMNI".equals(lable)) {
                    MemberCoinAddressEntity btcAddress2 = memberMapper.selectBlockAddress(Long.parseLong(mId), "BTC");
                    if(btcAddress2!=null) {
                        address = btcAddress2.getAddress();
                        key = btcAddress2.getPrivateKey();
                        map.put("address", address);
                    }else {
                        //如果BTC地址不存在,创建一个BTC地址
                        Map<String,String> usdtMap = UsdtService.createWallet(mId);
                        address = usdtMap.get("address");
                        key = usdtMap.get("privateKey");
                        map.put("address", address);
                        MemberCoinAddressEntity coinAddress = new MemberCoinAddressEntity();
                        coinAddress.setAddress(address);
                        coinAddress.setIsBiyict(MemberCoinAddressEntity.IS_BIYICT_YES);
                        coinAddress.setMemberId(Long.parseLong(mId));
                        coinAddress.setPrivateKey(key);
                        coinAddress.setSymbol("BTC");
                        coinAddress.setLabel(uuid);
                        memberMapper.insert(coinAddress);
                    }
                }else {
                    MemberCoinAddressEntity ethAddress2 = memberMapper.selectBlockAddress(Long.parseLong(mId), "ETH");
                    if(ethAddress2!=null) {
                        address = ethAddress2.getAddress();
                        key = ethAddress2.getPrivateKey();
                        map.put("address", address);
                    }else {
                        Map<String,String> usdtMap = EthService.createEth();
                        address = usdtMap.get("address");
                        key = usdtMap.get("privateKey");
                        map.put("address", address);
                        MemberCoinAddressEntity coinAddress = new MemberCoinAddressEntity();
                        coinAddress.setAddress(address);
                        coinAddress.setIsBiyict(MemberCoinAddressEntity.IS_BIYICT_YES);
                        coinAddress.setMemberId(Long.parseLong(mId));
                        coinAddress.setPrivateKey(key);
                        coinAddress.setSymbol("ETH");
                        coinAddress.setLabel(uuid);
                        memberMapper.insert(coinAddress);
                    }
                }
                break;
            default:
                break;
            }
            MemberCoinAddressEntity coinAddress = new MemberCoinAddressEntity();
            coinAddress.setAddress(address);
            coinAddress.setIsBiyict(MemberCoinAddressEntity.IS_BIYICT_YES);
            coinAddress.setMemberId(Long.parseLong(mId));
            coinAddress.setPrivateKey(key);
            coinAddress.setSymbol(symbol);
            coinAddress.setLabel(uuid);
            if(symbol.equals("USDT")) {
                coinAddress.setTag(lable);
            }
            memberMapper.insert(coinAddress);
            ////System.out.println("生成的地址:"+address+"  密钥:"+key);
            result.setData(map);
            result.setCode(0);
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}
src/main/java/com/xcong/excoin/modules/blackchain/service/LtcService.java
New file
@@ -0,0 +1,125 @@
package com.xcong.excoin.modules.blackchain.service;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class LtcService {
    private static LtcService service = null;
    private final static String RESULT = "result";
    private final static String METHOD_SEND_TO_ADDRESS = "sendtoaddress";
    private final static String METHOD_GET_TRANSACTION = "gettransaction";
    private final static String METHOD_LIST_TRANSACTIONS = "listtransactions";
    private final static String METHOD_GET_BLOCK_COUNT = "getblockcount";
    private final static String METHOD_NEW_ADDRESS = "getnewaddress";
    private final static String METHOD_GET_BALANCE = "getbalance";
    private final static String METHOD_WALLET_PASSPHRASE = "walletpassphrase";
    private final static String METHOD_WALLET_LOCK = "walletlock";
    private final static String METHOD_GET_BALANCE_ADDRESS = "getreceivedbyaddress";
    private String url = "http://121.40.86.163:1888";
    private String username = "biyiltc";
    private String password = "biyiltc";
    public static LtcService getInstance() {
        if (service != null) {
            return service;
        }
        return new LtcService();
    }
    private LtcService() {
    }
    /**
     * 创建BTC钱包 每个账户对应一个地址 方便后续操作
     * @param mId 账户
     * @return
     */
    public static Map<String, String> createWallet(String mId) {
        LtcService btcService = getInstance();
        // 创建钱包地址
        String address = btcService.getAddress(mId);
        // 私钥
        String privateKey = btcService.dumpprivkey(address);
        Map<String, String> result = new HashMap<String,String>();
        result.put("address", address);
        result.put("privateKey", privateKey);
        return result;
    }
    public String getAddress(String label) {
        try {
             JSONObject json = doRequest(METHOD_NEW_ADDRESS,label);
            //JSONObject json = doRequest(METHOD_NEW_ADDRESS);
            if (isError(json)) {
                return "";
            }
            return json.getString(RESULT);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    private JSONObject doRequest(String method, Object... params) {
        JSONObject param = new JSONObject();
        param.put("id", System.currentTimeMillis() + "");
        param.put("jsonrpc", "2.0");
        param.put("method", method);
        if (params != null) {
            param.put("params", params);
        }
        String creb = Base64.encodeBase64String((username + ":" + password).getBytes());
        Map<String, String> headers = new HashMap<>(2);
        headers.put("Authorization", "Basic " + creb);
        return JSON.parseObject(HttpUtil.jsonPost(url, headers, param.toJSONString()));
    }
    private boolean isError(JSONObject json) {
        if (json == null || (StringUtils.isNotEmpty(json.getString("error")) && json.get("error") != "null")) {
            return true;
        }
        return false;
    }
    public String dumpprivkey(String address) {
        try {
            JSONObject obj = doRequest("dumpprivkey", address);
            //System.out.println(obj);
            if (!isError(obj)) {
                return obj.getString(RESULT);
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 查询给定地址的总收款额(只计算接受的)
     * @param address
     * @return
     */
    public BigDecimal getBalance(String address) {
        JSONObject json = doRequest(METHOD_GET_BALANCE_ADDRESS,address,3);
        if (!isError(json)) {
            return new BigDecimal(json.getString(RESULT));
        } else {
            return null;
        }
    }
    public static void main(String[] args) {
        BigDecimal s = LtcService.getInstance().getBalance("MS6UBteTkQYbbBg5xEPWUQ1PPG7zkxY368");
       System.out.println(s);
    }
}
src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtService.java
New file
@@ -0,0 +1,167 @@
package com.xcong.excoin.modules.blackchain.service;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class UsdtService {
//    public static void main(String[] args) throws IOException {
//        ECKey key = new ECKey();
//        //logger.info("We created a new key:\n" + key);
//        // TEST 网络
//        NetworkParameters params = MainNetParams.get();
//        Address addressFromKey = key.toAddress(params);
//        System.out.println("Public Address generated: " + addressFromKey);
//        //logger.info("Public Address generated: " + addressFromKey);
//        String privateKey = key.getPrivateKeyEncoded(params).toString();
//        System.out.println("Private key is: " + privateKey);
//        //logger.info("Private key is: " + privateKey);
//        //logger.info("Private Hex key is: " + key.getPrivateKeyAsHex());
//        Wallet wallet = new Wallet(TestNet3Params.get());
//        File walletFile = new File("D//:test.wallet");
//        wallet.importKey(key);
//        wallet.saveToFile(walletFile);
//    }
    private static UsdtService service = null;
    private final static String RESULT = "result";
    private final static String METHOD_SEND_TO_ADDRESS = "sendtoaddress";
    private final static String METHOD_GET_TRANSACTION = "gettransaction";
    private final static String METHOD_LIST_TRANSACTIONS = "listtransactions";
    private final static String METHOD_GET_BLOCK_COUNT = "getblockcount";
    private final static String METHOD_NEW_ADDRESS = "getnewaddress";
    private final static String METHOD_GET_BALANCE = "getbalance";
    private final static String METHOD_GET_BALANCE_ADDRESS = "getreceivedbyaddress";
    private final static String METHOD_WALLET_PASSPHRASE = "walletpassphrase";
    private final static String METHOD_WALLET_LOCK = "walletlock";
    private String url = "http://120.55.86.146:1880";
    private String username = "biyi";
    private String password = "biyi1234";
    public static UsdtService getInstance() {
        if (service != null) {
            return service;
        }
        return new UsdtService();
    }
    private UsdtService() {
    }
    /**
     * 创建BTC钱包 每个账户对应一个地址 方便后续操作
     *
     * @param mId 账户
     * @return
     */
    public static Map<String, String> createWallet(String mId) {
        UsdtService btcService = getInstance();
        // 创建钱包地址
        String address = btcService.getAddress(mId);
        // 私钥
        String privateKey = btcService.dumpprivkey(address);
        Map<String, String> result = new HashMap<String, String>();
        result.put("address", address);
        result.put("privateKey", privateKey);
        return result;
    }
    public String getAddress(String label) {
        try {
            JSONObject json = doRequest(METHOD_NEW_ADDRESS, label);
            if (isError(json)) {
                return "";
            }
            return json.getString(RESULT);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    private JSONObject doRequest(String method, Object... params) {
        JSONObject param = new JSONObject();
        param.put("id", System.currentTimeMillis() + "");
        param.put("jsonrpc", "2.0");
        param.put("method", method);
        if (params != null) {
            param.put("params", params);
        }
        String creb = Base64.encodeBase64String((username + ":" + password).getBytes());
        Map<String, String> headers = new HashMap<>(2);
        headers.put("Authorization", "Basic " + creb);
        return JSON.parseObject(HttpUtil.jsonPost(url, headers, param.toJSONString()));
    }
    private boolean isError(JSONObject json) {
        if (json == null || (StringUtils.isNotEmpty(json.getString("error")) && json.get("error") != "null")) {
            return true;
        }
        return false;
    }
    public String dumpprivkey(String address) {
        try {
            JSONObject obj = doRequest("dumpprivkey", address);
            System.out.println(obj);
            if (!isError(obj)) {
                return obj.getString(RESULT);
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 查询给定地址的总收款额(只计算接受的)
     *
     * @param address
     * @return
     */
    public BigDecimal getBalance(String address) {
        try {
            JSONObject json = doRequest("omni_getbalance", address, 31);
            if (!isError(json)) {
                return new BigDecimal(json.getJSONObject(RESULT).get("balance").toString());
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("BTC-USDT查询余额失败");
            return null;
        }
    }
    public String METHOD_GET_BLOCK_COUNT() {
        JSONObject json = doRequest(METHOD_GET_BLOCK_COUNT);
        if (!isError(json)) {
            return json.getString(RESULT);
        } else {
            return null;
        }
    }
    public static void main(String[] args) {
        System.out.println(UsdtService.getInstance().getBalance("1PLCr8A2z7YLEtoPLJdzzqpfb3Ym87UCtt"));
    }
}
src/main/java/com/xcong/excoin/modules/blackchain/service/XrpService.java
New file
@@ -0,0 +1,487 @@
package com.xcong.excoin.modules.blackchain.service;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.MessageFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ripple.core.coretypes.AccountID;
import com.ripple.core.coretypes.Amount;
import com.ripple.core.coretypes.uint.UInt32;
import com.ripple.core.types.known.tx.signed.SignedTransaction;
import com.ripple.core.types.known.tx.txns.Payment;
import com.xcong.excoin.modules.blackchain.model.XrpTransResult;
public class XrpService {
    // private //logger //logger = //logger.get//logger(getClass());
    /**
     * 官方接口地址
     */
    private static String getUrl = "https://data.ripple.com";
    private String postUrl = "https://s1.ripple.com:51234";
    /**
     * 本地nodejs创建钱包地址
     */
    private static String localUrl = "http://121.40.86.163:1886";
    private String address;
    private String password;
    private static final String gasFee = "100";
    private static final String COIN_XRP = "XRP";
    private final static String RESULT = "result";
    private final static String SUCCESS = "success";
    private final static String TES_SUCCESS = "tesSUCCESS";
    private final static String METHOD_GET_TRANSACTION = "/v2/accounts/{0}/transactions";
    private final static String METHOD_GET_BALANCE = "/v2/accounts/{0}/balances";
    private final static String METHOD_POST_SIGN = "sign";
    private final static String METHOD_POST_INDEX = "ledger_current";
    private final static String METHOD_POST_ACCOUNT_INFO = "account_info";
    private final static String METHOD_POST_SUBMIT = "submit";
    public XrpService(String address, String password) {
        try {
            this.address = address;
            this.password = password;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public String getAddress() {
        return address;
    }
    public static void main(String[] args) {
        // 十分钟查一次 每次100条
        String result =  HttpUtil.get("https://data.ripple.com/v2/accounts/rBEXvZL66VvaMzX5R2W5g5xC9Z3D81wkzb/transactions?start=2019-09-01T10:10:00Z");
         JSONObject json = JSONObject.parseObject(result);
         XrpTransResult res = json.toJavaObject(XrpTransResult.class);
    }
    /**
     * 创建钱包 { "xAddress":"X7bpbHDKxS3Mr417RPtgS3TFFHwAHqULXJUVZntHWAKnccw",
     * "secret":"snYpXT4wrhi8ve2miSUHUdn9wgzz7",
     * "classicAddress":"rsJftGoh49zju51k2LdvUYrzLzJ44XJpXh",
     * "address":"rsJftGoh49zju51k2LdvUYrzLzJ44XJpXh" }
     *
     * @return
     */
    public static JSONObject createWallet() {
        String res = HttpUtil.get(localUrl);
        JSONObject obj = JSONObject.parseObject(res);
        return obj;
    }
    /**
     * 查询交易记录 用于更新用户的余额 本系统的地址:X75MxY8sjcebBasymUXDYcYHWj6v8wqWLGmg9N3x65SXUJw
     * https://data.ripple.com/v2/accounts/rBEXvZL66VvaMzX5R2W5g5xC9Z3D81wkzb/transactions
     * https://data.ripple.com/v2/accounts/rBEXvZL66VvaMzX5R2W5g5xC9Z3D81wkzb/transactions?start=2019-09-01T10:10:00Z&limit=1
     */
    /**
     * start YYYY-MM-DDThh:mm:ssZ String - Timestamp Start time of query range. The default is the
     * earliest date available.
     * end String - Timestamp End time of query range. The
     * default is the current date.
     * min_sequence String Minimum sequence number to
     * query.
     * max_sequence String Max sequence number to query.
     * type String Restrict results to a specified transaction type.
     * result String Restrict results to a specified transaction result.
     * binary Boolean Return results in binary format.
     * descending Boolean If true, return results in reverse chronological order.The default is false.
     * limit Integer Maximum results per page. The default is 20. Cannot be more than 1,000.
     *  marker String Pagination key from previously
     * returned response.
     *
     * https://github.com/ripple/rippled-historical-database
     */
    public static XrpTransResult getTransactions(Date start) {
        // SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-DDThh:mm:ssZ");
         SimpleDateFormat formatDay = new SimpleDateFormat("YYYY-MM-dd");
         SimpleDateFormat formatHour = new SimpleDateFormat("hh:mm:ss");
         String startTime = formatDay.format(start)+"T"+formatHour.format(start)+"Z";
         String url ="https://data.ripple.com/v2/accounts/X75MxY8sjcebBasymUXDYcYHWj6v8wqWLGmg9N3x65SXUJw/transactions?start="+startTime+"&limit=1000";
         // 十分钟查一次 每次100条
         String result =  HttpUtil.get(url);
         try {
             JSONObject json = JSONObject.parseObject(result);
             XrpTransResult res = json.toJavaObject(XrpTransResult.class);
             return res;
         }catch(Exception e) {
             e.printStackTrace();
         }
        return null;
    }
    /**
     * XRP查询余额
     *
     * @return
     */
    public static double getBalance(String address) {
        try {
            HashMap<String, String> params = new HashMap<String, String>();
            params.put("currency", COIN_XRP);
            String re = HttpUtil.jsonGet(getUrl + MessageFormat.format(METHOD_GET_BALANCE, address), params);
            if (!StringUtils.isEmpty(re)) {
                JSONObject json = JSON.parseObject(re);
                if (SUCCESS.equals(json.getString(RESULT))) {
                    JSONArray array = json.getJSONArray("balances");
                    if (array != null && array.size() > 0) {
                        // 总余额
                        double balance = array.getJSONObject(0).getDoubleValue("value");
                        if (balance >= 20) {
                            // 可用余额 xrp会冻结20个币
                            return BigDecimalUtil.sub(balance, 20);
                        }
                    }
                }
            }
        } catch (Exception e) {
            // logger.error("==============虚拟币-瑞波币getBalance失败!");
            e.printStackTrace();
        }
        return 0.00;
    }
    /**
     * 发送交易
     *
     * @param address
     * @param value
     * @return
     */
    public synchronized String send(String toAddress, double value, String tag) {
        try {
            String txBlob = this.sign(toAddress, value, tag);
            if (StringUtils.isEmpty(txBlob)) {
                // logger.error("签名失败:{" + toAddress + "}");
                return null;
            }
            HashMap<String, Object> params = new HashMap<String, Object>();
            params.put("tx_blob", txBlob);
            // 签名
            JSONObject json = doRequest(METHOD_POST_SUBMIT, params);
            if (!isError(json)) {
                // logger.error("============瑞波币XRP转账返回!json="+json);
                JSONObject result = json.getJSONObject(RESULT);
                if (result != null) {
                    if (TES_SUCCESS.equals(result.getString("engine_result"))) {
                        String hash = result.getJSONObject("tx_json").getString("hash");
                        if (!StringUtils.isEmpty(hash)) {
                            // logger.error("转账成功:toAddress:{" + toAddress + "},value:{" + value +
                            // "},hash:{" + hash + "}");
                            return hash;
                        } else {
                            // logger.error(
                            // "转账失败:toAddress:{" + toAddress + "},value:{" + value + "},hash:{" + hash +
                            // "}");
                        }
                    }
                }
            } else {
                // logger.error("============瑞波币XRP转账失败!json="+json);
            }
        } catch (Exception e) {
            // logger.error("==============虚拟币-瑞波币send失败!");
            e.printStackTrace();
        }
        return null;
    }
    public synchronized String sendOnLine(String toAddress, double value, String tag) {
        try {
            String txBlob = this.signOnLine(toAddress, value, tag);
            if (StringUtils.isEmpty(txBlob)) {
                // logger.error("签名失败:{" + toAddress + "}");
                return null;
            }
            HashMap<String, Object> params = new HashMap<String, Object>();
            params.put("tx_blob", txBlob);
            // 签名
            JSONObject json = doRequest(METHOD_POST_SUBMIT, params);
            if (!isError(json)) {
                // logger.error("============瑞波币XRP转账返回!json="+json);
                JSONObject result = json.getJSONObject(RESULT);
                if (result != null) {
                    if (TES_SUCCESS.equals(result.getString("engine_result"))) {
                        String hash = result.getJSONObject("tx_json").getString("hash");
                        if (!StringUtils.isEmpty(hash)) {
                            // logger.error("转账成功:toAddress:{" + toAddress + "},value:{" + value +
                            // "},hash:{" + hash + "}");
                            return hash;
                        } else {
                            // logger.error(
                            // "转账失败:toAddress:{" + toAddress + "},value:{" + value + "},hash:{" + hash +
                            // "}");
                        }
                    }
                }
            } else {
                // logger.error("==============瑞波币XRP转账失败!json="+json);
            }
        } catch (Exception e) {
            // logger.error("==============虚拟币-瑞波币send失败!");
            e.printStackTrace();
        }
        return null;
    }
    @Deprecated
    public String signOnLine(String toAddress, Double value, String tag) {
        try {
            // 瑞波币余额存储加六位长度
            value = BigDecimalUtil.mul(value, 1000000);
            Integer vInteger = BigDecimal.valueOf(value).intValue();
            JSONObject txJson = new JSONObject();
            txJson.put("Account", address);
            txJson.put("Amount", vInteger.toString());
            txJson.put("Destination", toAddress);// 标签
            txJson.put("TransactionType", "Payment");
            txJson.put("DestinationTag", tag);
            HashMap<String, Object> params = new HashMap<String, Object>();
            params.put("secret", password);
            params.put("tx_json", txJson);
            params.put("offline", false);
            // 签名
            JSONObject json = doRequest(METHOD_POST_SIGN, params);
            if (!isError(json)) {
                // logger.error("==============XRP签名返回:"+json);
                JSONObject result = json.getJSONObject(RESULT);
                if (result != null) {
                    if (SUCCESS.equals(result.getString("status"))) {
                        return result.getString("tx_blob");
                    }
                }
            } else {
                // logger.error("瑞波币XRP签名失败!json="+json);
            }
        } catch (Exception e) {
            // logger.error("==============虚拟币-瑞波币signOnLine失败!");
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 签名
     *
     * @param address
     * @param value
     * @return tx_blob
     */
    public String sign(String toAddress, Double value, String tag) {
        try {
            value = BigDecimalUtil.mul(value, 1000000);
            Integer vInteger = BigDecimal.valueOf(value).intValue();
            Map<String, String> map = getAccountSequenceAndLedgerCurrentIndex();
            Payment payment = new Payment();
            payment.as(AccountID.Account, address);
            payment.as(AccountID.Destination, toAddress);
            payment.as(UInt32.DestinationTag, tag);
            payment.as(Amount.Amount, vInteger.toString());
            payment.as(UInt32.Sequence, map.get("accountSequence"));
            payment.as(UInt32.LastLedgerSequence, map.get("ledgerCurrentIndex") + 4);
            payment.as(Amount.Fee, gasFee);
            SignedTransaction signed = payment.sign(password);
            if (signed != null) {
                return signed.tx_blob;
            }
        } catch (Exception e) {
            // logger.error("==============虚拟币-瑞波币sign失败!");
            e.printStackTrace();
        }
        return null;
    }
    public Map<String, String> getAccountSequenceAndLedgerCurrentIndex() {
        try {
            HashMap<String, String> params = new HashMap<String, String>();
            params.put("account", address);
            params.put("strict", "true");
            params.put("ledger_index", "current");
            params.put("queue", "true");
            JSONObject re = doRequest(METHOD_POST_ACCOUNT_INFO, params);
            if (re != null) {
                JSONObject result = re.getJSONObject("result");
                if (SUCCESS.equals(result.getString("status"))) {
                    Map<String, String> map = new HashMap<String, String>();
                    map.put("accountSequence", result.getJSONObject("account_data").getString("Sequence"));
                    map.put("ledgerCurrentIndex", result.getString("ledger_current_index"));
                    return map;
                }
            }
        } catch (Exception e) {
            // logger.error("==============虚拟币-瑞波币getAccountSequenceAndLedgerCurrentIndex失败!");
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 获取用户交易序列号
     *
     * @return
     */
    public long getAccountSequence() {
        try {
            HashMap<String, String> params = new HashMap<String, String>();
            params.put("account", address);
            params.put("strict", "true");
            params.put("ledger_index", "current");
            params.put("queue", "true");
            JSONObject re = doRequest(METHOD_POST_ACCOUNT_INFO, params);
            if (re != null) {
                JSONObject result = re.getJSONObject("result");
                if (SUCCESS.equals(result.getString("status"))) {
                    return result.getJSONObject("account_data").getLongValue("Sequence");
                }
            }
        } catch (Exception e) {
            // logger.error("==============虚拟币-瑞波币getAccountSequence失败!");
            e.printStackTrace();
        }
        return 0L;
    }
    /**
     * 获取最新序列
     *
     * @return
     */
    public long getLedgerIndex() {
        try {
            JSONObject re = doRequest(METHOD_POST_INDEX);
            if (re != null) {
                JSONObject result = re.getJSONObject("result");
                if (SUCCESS.equals(result.getString("status"))) {
                    return result.getLongValue("ledger_current_index");
                }
            }
        } catch (Exception e) {
            // logger.error("==============虚拟币-瑞波币getLedgerIndex失败!");
            e.printStackTrace();
        }
        return 0L;
    }
    public String getTransaction(Date dateGMT, String limit) throws ParseException {
        try {
            HashMap<String, String> params = new HashMap<String, String>();
            params.put("start", DateUtil.formatDate(dateGMT, "yyyy-MM-dd'T'HH:mm:ss"));
            params.put("result", "tesSUCCESS");
            params.put("type", "Payment");
            params.put("limit", limit);
            return HttpUtil.jsonGet(getUrl + MessageFormat.format(METHOD_GET_TRANSACTION, address), params);
            // {"result":"success","count":1,"transactions":[{"hash":"86859CBEFB870C941727E291BB13312BC3D6042D8DA08BF1DEDE6BB55F21B8EC","ledger_index":42268358,"date":"2018-10-16T06:49:30+00:00","tx":{"TransactionType":"Payment","Flags":2147483648,"Sequence":37996,"Amount":"29840000","Fee":"1000","SigningPubKey":"0279154FA62D1F28B6CB1F0264663F19EF3A1718D15363CAC1B47A9C6987231F94","TxnSignature":"304502210089F6526134F335C01C65D3E82284C06E22598A4EAD912604BF4FEAA42D5ACCE402203C044F32D399CEA6F4A16DD6DCBB339A7D0CF76E52C1AB090330A67EDFBABBE4","Account":"rH8yTBLm2SYgcL5HQGDznuNxMiy5ayYcmK","Destination":"raHb1tR1BcNB92nEqxiTuKsDap46szkJG2"},"meta":{"TransactionIndex":1,"AffectedNodes":[{"CreatedNode":{"LedgerEntryType":"AccountRoot","LedgerIndex":"56419B3209DA988033F6F0BD921806B4821A73EDF8C338FB5F06C785E527E967","NewFields":{"Sequence":1,"Balance":"29840000","Account":"raHb1tR1BcNB92nEqxiTuKsDap46szkJG2"}}},{"ModifiedNode":{"LedgerEntryType":"AccountRoot","PreviousTxnLgrSeq":42268355,"PreviousTxnID":"63D5A3121F2706099835D9A3A9E5DA574070A4E08FC70956DB1CC196DE6CDEFC","LedgerIndex":"7D2FC14FA2B344F41BB8A6E10B319301EA1C11705AE159B3E2FA82D9F3079E4C","PreviousFields":{"Sequence":37996,"Balance":"2051629511468"},"FinalFields":{"Flags":131072,"Sequence":37997,"OwnerCount":0,"Balance":"2051599670468","Account":"rH8yTBLm2SYgcL5HQGDznuNxMiy5ayYcmK"}}}],"TransactionResult":"tesSUCCESS","delivered_amount":"29840000"}}]}
        } catch (Exception e) {
            // logger.error("==============虚拟币-瑞波币getBalance失败!");
            e.printStackTrace();
        }
        return null;
    }
    public Long parseTransaction(String startTm) throws ParseException {
        try {
            HashMap<String, String> params = new HashMap<String, String>();
            if (!StringUtils.isEmpty(startTm)) {
                Date d = new Date(BigDecimalUtil.longAdd(Long.parseLong(startTm), 1000L));
                params.put("start", DateUtil.formatDate(d, "yyyy-MM-dd'T'HH:mm:ss"));
            }
            params.put("result", "tesSUCCESS");
            params.put("type", "Payment");
            params.put("limit", "1");
            String re = HttpUtil.jsonGet(getUrl + MessageFormat.format(METHOD_GET_TRANSACTION, address), params);
            if (!StringUtils.isEmpty(re)) {
                JSONObject json = JSON.parseObject(re);
                if (SUCCESS.equals(json.getString(RESULT))) {
                    // marker = json.getString("marker");
                    JSONArray transactions = json.getJSONArray("transactions");
                    if (transactions != null && transactions.size() > 0) {
                        for (Object object : transactions) {
                            JSONObject transaction = (JSONObject) object;
                            String hash = transaction.getString("hash");
                            String dateString = transaction.getString("date");
                            Date date = DateUtil.parseDate(dateString, "yyyy-MM-dd'T'HH:mm:ss");
                            JSONObject tx = transaction.getJSONObject("tx");
                            String destinationTag = tx.getString("DestinationTag");
                            if (StringUtils.isEmpty(destinationTag)) {
                                // logger.info("非用户充值记录");
                                return date.getTime();
                            }
                            String to = tx.getString("Destination");
                            if (!address.equals(to)) {
                                // logger.info("非用户充值记录,地址不一致");
                                return date.getTime();
                            }
                            // 校验用户是否存在
                            /*
                             * UserEntity user = userService.getUserById(Integer.parseInt( destinationTag));
                             * if (user == null) { //logger.info("用户不存在:{}",destinationTag); return
                             * date.getTime(); }
                             */
                            double amount = tx.getDoubleValue("Amount");
                            if (amount > 0) {
                                amount = BigDecimalUtil.div(amount, 1000000, 6);
                            } else {
                                // logger.error("交易金额异常:{" + amount + "}");
                                return date.getTime();
                            }
                            // 添加充值记录
                        }
                    }
                }
            }
        } catch (Exception e) {
            // logger.error("==============虚拟币-瑞波币parseTransaction失败!");
            e.printStackTrace();
        }
        return null;
    }
    private boolean isError(JSONObject json) {
        if (json == null || (!StringUtils.isEmpty(json.getString("error")) && json.get("error") != "null")) {
            return true;
        }
        return false;
    }
    private JSONObject doRequest(String method, Object... params) {
        JSONObject param = new JSONObject();
        param.put("id", System.currentTimeMillis() + "");
        param.put("jsonrpc", "2.0");
        param.put("method", method);
        if (params != null) {
            param.put("params", params);
        }
        String creb = Base64.encodeBase64String((address + ":" + password).getBytes());
        Map<String, String> headers = new HashMap<>(2);
        headers.put("Authorization", "Basic " + creb);
        String resp = "";
        try {
            resp = HttpUtil.jsonPost(postUrl, headers, param.toJSONString());
        } catch (Exception e) {
            // logger.info(e.getMessage());
            if (e instanceof IOException) {
                resp = "{}";
            }
        }
        return JSON.parseObject(resp);
    }
}
src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java
@@ -6,10 +6,7 @@
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.xcong.excoin.common.response.Result;
@@ -23,11 +20,15 @@
import com.xcong.excoin.modules.member.parameter.dto.MemberPaymethodDto;
import com.xcong.excoin.modules.member.parameter.dto.MemberUpdatePwdDto;
import com.xcong.excoin.modules.member.parameter.dto.MemberUpdateTradePwdDto;
import com.xcong.excoin.modules.member.parameter.vo.MemberAuthenticationInfoVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberAvivableCoinInfoVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressCountListVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressListVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberCoinInfoListVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberInfoVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberPaymethodDetailListVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberPaymethodDetailVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberPersonCenterInfoVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberSendCodeWayVo;
import com.xcong.excoin.modules.member.service.MemberService;
@@ -85,6 +86,17 @@
        //System.out.println("修改密码:");
        return memberService.memberUpdatePwd(memberUpdatePwdDto);
    }
    /**
     * 获取实名认证信息
     * @return
     */
    @ApiOperation(value = "获取实名认证信息", notes = "获取实名认证信息")
    @ApiResponses({@ApiResponse( code = 200, message = "success", response = MemberAuthenticationInfoVo.class)})
    @GetMapping(value = "/memberAuthenticationInfo")
    public Result memberAuthenticationInfo() {
        return memberService.memberAuthenticationInfo();
    }
    
    /**
     * 实名认证
@@ -250,40 +262,42 @@
        return memberService.memberSendCodeWay();
    }
    
    /**
     * 获取个人中心信息
     * @return
     */
    @ApiOperation(value = "获取个人中心信息", notes = "获取个人中心信息")
    @ApiResponses({@ApiResponse( code = 200, message = "success", response = MemberPersonCenterInfoVo.class)})
    @GetMapping(value = "/memberPersonCenterInfo")
    public Result memberPersonCenterInfo() {
        return memberService.memberPersonCenterInfo();
    }
    /**
     * 提币币种信息
     * @return
     */
    @ApiOperation(value = "获取提币币种信息", notes = "获取提币币种信息")
    @ApiResponses({@ApiResponse( code = 200, message = "success", response = MemberCoinInfoListVo.class)})
    @GetMapping(value = "/memberCoinInfoList")
    public Result memberCoinInfoList() {
        return memberService.memberCoinInfoList();
    }
    /**
     *     提币币种可用资金
     * @param token
     * @param coinVo
     * @return
     */
    @ApiOperation(value = "提币币种可用资金", notes = "提币币种可用资金")
    @ApiResponses({@ApiResponse( code = 200, message = "success", response = MemberAvivableCoinInfoVo.class)})
    @ApiImplicitParams({
        @ApiImplicitParam(name = "symbol", value = "币种", required = true, dataType = "String", paramType="query")
    })
    @GetMapping(value = "/memberAvivableCoinInfo")
    public Result memberAvivableCoinInfo(String symbol) {
        return memberService.memberAvivableCoinInfo(symbol);
    }
}
src/main/java/com/xcong/excoin/modules/member/dao/MemberCoinAddressDao.java
@@ -1,13 +1,17 @@
package com.xcong.excoin.modules.member.dao;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcong.excoin.modules.member.entity.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 selectBlockAddress(Long memberId, String string);
}
src/main/java/com/xcong/excoin/modules/member/parameter/dto/MemberPaymethodDto.java
@@ -42,11 +42,5 @@
    @NotNull(message = "类型不能为空")
    @ApiModelProperty(value = "类型 1-支付宝2-微信3-银行卡", example = "1")
    private String paymentType;
    /**
     * 默认收款方式
     */
    @NotNull(message = "默认收款方式不能为空")
    @ApiModelProperty(value = "类型 1-是 0-否", example = "1")
    private String isDefualt;
}
src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAuthenticationInfoVo.java
New file
@@ -0,0 +1,26 @@
package com.xcong.excoin.modules.member.parameter.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "MemberAuthenticationInfoVo", description = "实名认证信息")
public class MemberAuthenticationInfoVo {
    @ApiModelProperty(value = "实名认证状态 0-审核未通过 1-审核通过 2-等待审核")
    private Integer certifyStatus;
    @ApiModelProperty(value = "姓")
    private String firstName;
    @ApiModelProperty(value = "名")
    private String secondName;
    @ApiModelProperty(value = "身份证卡号")
    private String idCardNo;
    @ApiModelProperty(value = "国家")
    private String nation;
}
src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberAvivableCoinInfoVo.java
New file
@@ -0,0 +1,19 @@
package com.xcong.excoin.modules.member.parameter.vo;
import java.math.BigDecimal;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "MemberAvivableCoinInfoVo", description = "提币币种可用资金信息")
public class MemberAvivableCoinInfoVo {
    @ApiModelProperty(value = "可用余额")
    private BigDecimal availableBalance;
    @ApiModelProperty(value = "手续费")
    private BigDecimal fee;
}
src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoListVo.java
New file
@@ -0,0 +1,16 @@
package com.xcong.excoin.modules.member.parameter.vo;
import java.util.List;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "MemberCoinInfoListVo", description = "币种信息")
public class MemberCoinInfoListVo {
    @ApiModelProperty(value = "币种名称")
    private List<MemberCoinInfoVo> memberCoinInfoVo;
}
src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberCoinInfoVo.java
New file
@@ -0,0 +1,14 @@
package com.xcong.excoin.modules.member.parameter.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "MemberCoinInfoVo", description = "币种信息")
public class MemberCoinInfoVo {
    @ApiModelProperty(value = "币种名称")
    private String name;
}
src/main/java/com/xcong/excoin/modules/member/parameter/vo/MemberPersonCenterInfoVo.java
New file
@@ -0,0 +1,32 @@
package com.xcong.excoin.modules.member.parameter.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "MemberPersonCenterInfoVo", description = "个人中心信息")
public class MemberPersonCenterInfoVo {
    @ApiModelProperty(value = "手机号(包含国际手机号)1:有  0没有")
    private Integer phone;
    @ApiModelProperty(value = "邮箱1:有  0没有")
    private Integer email;
    @ApiModelProperty(value = "交易密码1:有  0没有")
    private Integer tradePassword;
    @ApiModelProperty(value = "交易密码时效性设置1:一直需要输入密码  2不需要输入密码")
    private Integer tradeAgingSetting;
    /**
     * 一直需要输入密码
     */
    public static final int PWD_NEED_FORVER = 1;
    /**
     * 不需要输入密码
     */
    public static final int PWD_NEED_NO = 2;
}
src/main/java/com/xcong/excoin/modules/member/service/MemberService.java
@@ -60,5 +60,13 @@
    public Result memberDelCoinAddress(@Valid MemberDelCoinAddressDto memberDelCoinAddressDto);
    public Result memberAuthenticationInfo();
    public Result memberPersonCenterInfo();
    public Result memberCoinInfoList();
    public Result memberAvivableCoinInfo(String symbol);
}
src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
@@ -25,16 +25,23 @@
import com.xcong.excoin.modules.member.parameter.dto.MemberPaymethodDto;
import com.xcong.excoin.modules.member.parameter.dto.MemberUpdatePwdDto;
import com.xcong.excoin.modules.member.parameter.dto.MemberUpdateTradePwdDto;
import com.xcong.excoin.modules.member.parameter.vo.MemberAuthenticationInfoVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberAvivableCoinInfoVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressCountListVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressCountVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressListVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberCoinAddressVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberCoinInfoListVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberCoinInfoVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberInfoVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberPaymethodDetailListVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberPaymethodDetailVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberPersonCenterInfoVo;
import com.xcong.excoin.modules.member.parameter.vo.MemberSendCodeWayVo;
import com.xcong.excoin.modules.member.service.MemberService;
import com.xcong.excoin.modules.platform.dao.PlatformFeeSettingDao;
import com.xcong.excoin.modules.platform.dao.PlatformSymbolsCoinDao;
import com.xcong.excoin.modules.platform.entity.PlatformFeeSettingEntity;
import com.xcong.excoin.modules.platform.entity.PlatformSymbolsCoinEntity;
import com.xcong.excoin.utils.MessageSourceUtils;
import com.xcong.excoin.utils.RedisUtils;
@@ -89,14 +96,17 @@
    PlatformSymbolsCoinDao platformSymbolsCoinDao;
    
    @Resource
    PlatformFeeSettingDao platformFeeSettingDao;
    @Resource
    MemberCoinAddressDao memberCoinAddressDao;
    
    @Resource
    private CommonService commonservice;
    @Resource
    private MemberWalletContractSimulateDao memberWalletContractSimulateDao;
    @Transactional()
    @Override
    public Result register(RegisterDto registerDto) {
@@ -442,7 +452,6 @@
        String paymentQrcode = memberPaymethodDto.getPaymentQrcode();
        String paymentType = memberPaymethodDto.getPaymentType();
        String subBank = memberPaymethodDto.getSubBank();
        String isDefualt = memberPaymethodDto.getIsDefualt();
        MemberPaymentMethodEntity memberPaymentMethodEntity = new MemberPaymentMethodEntity();
        memberPaymentMethodEntity.setMemberId(memberId);
        memberPaymentMethodEntity.setAccount(account);
@@ -451,7 +460,6 @@
        memberPaymentMethodEntity.setPaymentQrcode(paymentQrcode);
        memberPaymentMethodEntity.setPaymentType(paymentType);
        memberPaymentMethodEntity.setSubBank(subBank);
        memberPaymentMethodEntity.setIsDefualt(isDefualt);
        memberPaymentMethodDao.insert(memberPaymentMethodEntity);
        return Result.ok(MessageSourceUtils.getString("member_service_0024"));
    }
@@ -656,4 +664,94 @@
        return Result.ok("success");
    }
    @Override
    public Result memberAuthenticationInfo() {
        //获取用户ID
        Long memberId = LoginUserUtils.getAppLoginUser().getId();
        MemberEntity member = memberDao.selectById(memberId);
        Map<String, Object> columnMap = new HashMap<>();
        columnMap.put("member_id", memberId);
        List<MemberAuthenticationEntity> selectByMap = memberAuthenticationDao.selectByMap(columnMap);
        MemberAuthenticationInfoVo memberAuthnticationInfoVo = new MemberAuthenticationInfoVo();
        memberAuthnticationInfoVo.setCertifyStatus(member.getCertifyStatus());
        if(CollUtil.isNotEmpty(selectByMap)) {
            for(MemberAuthenticationEntity memberAuthenticationEntity : selectByMap) {
                memberAuthnticationInfoVo.setFirstName(memberAuthenticationEntity.getFirstName());
                memberAuthnticationInfoVo.setSecondName(memberAuthenticationEntity.getSecondName());
                memberAuthnticationInfoVo.setNation(memberAuthenticationEntity.getNation());
                memberAuthnticationInfoVo.setIdCardNo(memberAuthenticationEntity.getIdcardNo());
            }
        }
        return Result.ok(memberAuthnticationInfoVo);
    }
    @Override
    public Result memberPersonCenterInfo() {
        //获取用户ID
        Long memberId = LoginUserUtils.getAppLoginUser().getId();
        MemberEntity member = memberDao.selectById(memberId);
        MemberPersonCenterInfoVo memberPersonCenterInfoVo = new MemberPersonCenterInfoVo();
        if(StrUtil.isNotEmpty(member.getPhone())) {
            memberPersonCenterInfoVo.setPhone(1);
        }
        memberPersonCenterInfoVo.setPhone(0);
        if(StrUtil.isNotEmpty(member.getEmail())) {
            memberPersonCenterInfoVo.setEmail(1);
        }
        memberPersonCenterInfoVo.setEmail(0);
        if(StrUtil.isNotEmpty(member.getTradePassword())) {
            memberPersonCenterInfoVo.setTradePassword(1);
        }
        memberPersonCenterInfoVo.setTradePassword(0);
        if(StrUtil.isNotEmpty(member.getTradeAgingSetting().toString())) {
            memberPersonCenterInfoVo.setTradeAgingSetting(MemberPersonCenterInfoVo.PWD_NEED_FORVER);
        }
        memberPersonCenterInfoVo.setTradeAgingSetting(MemberPersonCenterInfoVo.PWD_NEED_FORVER);
        return Result.ok(memberPersonCenterInfoVo);
    }
    @Override
    public Result memberCoinInfoList() {
        //获取用户ID
        Long memberId = LoginUserUtils.getAppLoginUser().getId();
        MemberCoinInfoListVo memberCoinInfoListVo = new MemberCoinInfoListVo();
        List<PlatformSymbolsCoinEntity> selectByMap = platformSymbolsCoinDao.selectByMap(new HashMap<>());
        List<MemberCoinInfoVo> arrayList = new ArrayList<>();
        if(CollUtil.isNotEmpty(selectByMap)) {
            for(PlatformSymbolsCoinEntity platformSymbolsCoinEntity : selectByMap) {
                MemberCoinInfoVo memberCoinInfoVo = new MemberCoinInfoVo();
                memberCoinInfoVo.setName(platformSymbolsCoinEntity.getName());
                arrayList.add(memberCoinInfoVo);
            }
        }
        memberCoinInfoListVo.setMemberCoinInfoVo(arrayList);
        return Result.ok(memberCoinInfoListVo);
    }
    @Override
    public Result memberAvivableCoinInfo(String symbol) {
        //获取用户ID
        Long memberId = LoginUserUtils.getAppLoginUser().getId();
        MemberWalletCoinEntity walletCoin = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, symbol);
        if (ObjectUtil.isEmpty(walletCoin)) {
              return Result.fail(MessageSourceUtils.getString("member_service_0087"));
        }
        MemberAvivableCoinInfoVo memberAvivableCoinInfoVo = new MemberAvivableCoinInfoVo();
        memberAvivableCoinInfoVo.setAvailableBalance(walletCoin.getAvailableBalance());
        PlatformFeeSettingEntity feeSetting = platformFeeSettingDao.getFeeSettingByTypeAndSymbol(2,symbol);
        memberAvivableCoinInfoVo.setFee(feeSetting.getFeePrice());
        return Result.ok(memberAvivableCoinInfoVo);
    }
}
src/main/java/com/xcong/excoin/modules/platform/dao/PlatformFeeSettingDao.java
New file
@@ -0,0 +1,14 @@
package com.xcong.excoin.modules.platform.dao;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcong.excoin.modules.platform.entity.PlatformFeeSettingEntity;
public interface PlatformFeeSettingDao extends BaseMapper<PlatformFeeSettingEntity> {
    PlatformFeeSettingEntity getFeeSettingByTypeAndSymbolLable(@Param("type")Integer type,@Param("symbol")String symbol,@Param("lable")String lable);
    PlatformFeeSettingEntity getFeeSettingByTypeAndSymbol(@Param("type")Integer type,@Param("symbol")String symbol);
}
src/main/java/com/xcong/excoin/modules/platform/entity/PlatformCnyUsdtExchangeEntity.java
@@ -1,5 +1,6 @@
package com.xcong.excoin.modules.platform.entity;
import java.io.Serializable;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -7,7 +8,12 @@
import lombok.Data;
@Data
@TableName("platform_cny_usdt_exchange")
public class PlatformCnyUsdtExchangeEntity{
public class PlatformCnyUsdtExchangeEntity implements Serializable {
    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private Long id;
src/main/java/com/xcong/excoin/modules/platform/entity/PlatformFeeSettingEntity.java
New file
@@ -0,0 +1,53 @@
package com.xcong.excoin.modules.platform.entity;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("platform_fee_setting")
public class PlatformFeeSettingEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 主键ID
     */
    private Long id;
    /**
     * 类型 1-充币2-提币3-充值USDT4-提现USDT
     */
    private Integer type;
    /**
     * 最低价
     */
    private BigDecimal minPrice;
    /**
     * 最高价
     */
    private BigDecimal maxPrice;
    /**
     * 手续费价
     */
    private BigDecimal feePrice;
    /**
     *
     */
    private Date createTime;
    /**
     * 人民币价格
     */
    private BigDecimal cnyPrice;
    /**
     * 币种
     */
    private String symbol;
    /**
     * USDT链名
     */
    private String lable;
}
src/main/resources/mapper/member/MemberCoinAddressDao.xml
@@ -6,7 +6,7 @@
        select * from member_coin_address where member_id=#{memberId} and symbol = #{symbol}
    </select>
    
    <select id="selectBlockAddress" resultType="com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity">
    <select id="selectBlockAddressWithTag" resultType="com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity">
        select *
          from member_coin_address 
         <where>
@@ -17,6 +17,23 @@
             <if test="symbol != null  and  symbol  != ''">
                 and symbol = #{symbol}
             </if>
             <if test="tag != null  and  tag  != ''">
                 and tag = #{tag}
             </if>
         </where>
    </select>
    <select id="selectBlockAddress" resultType="com.xcong.excoin.modules.member.entity.MemberCoinAddressEntity">
        select *
          from member_coin_address
         <where>
         is_biyict = 1
             <if test="memberId != null  and  memberId  != ''">
                  and member_id = #{memberId}
             </if>
             <if test="symbol != null  and  symbol  != ''">
                 and symbol = #{symbol}
             </if>
         </where>
    </select>
    
src/main/resources/mapper/platform/PlatformFeeSettingDao.xml
New file
@@ -0,0 +1,24 @@
<?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.platform.dao.PlatformFeeSettingDao">
    <select id="getFeeSettingByTypeAndSymbolLable" resultType="com.xcong.excoin.modules.platform.entity.PlatformFeeSettingEntity">
         select * from fee_setting
          <where>
             <if test="type != null  and  type  != ''">
                  type = #{type}
             </if>
             <if test="symbol != null  and  symbol  != ''">
                 and symbol = #{symbol}
             </if>
             <if test="lable != null  and  lable  != ''">
                 and lable = #{lable}
             </if>
         </where>
     </select>
     <select id="getFeeSettingByTypeAndSymbol" resultType="com.xcong.excoin.modules.platform.entity.PlatformFeeSettingEntity">
         select * from fee_setting where  type = #{type} and symbol = #{symbol}
     </select>
</mapper>