xiaoyong931011
2020-06-18 22a1ada1fefc901e391279e01a251aa3c471e96a
20200618   代码提交
4 files deleted
21 files modified
17 files added
2073 ■■■■■ changed files
src/main/java/com/xcong/excoin/common/utils/CoinTypeConvert.java 50 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/common/utils/RedisUtils.java 554 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java 1 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/entity/MemberAccountMoneyChangeEntity.java 26 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/entity/MemberCoinWithdrawEntity.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/mapper/MemberAccountMoneyChangeMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/mapper/MemberMapper.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/vo/MemberCoinChargeVo.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/vo/MemberCoinWithdrawVo.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/vo/MemberQuickBuySaleVo.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/vo/MemberQuickSaleVo.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/trademanage/controller/ContractHoldOrderController.java 38 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/trademanage/controller/TradeManageController.java 66 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/trademanage/controller/ViewController.java 35 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/trademanage/dto/MemberAccountInfoDto.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/trademanage/entity/ContractHoldOrderEntity.java 28 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/trademanage/entity/ContractOrderEntity.java 217 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/trademanage/entity/MemberWalletAgentEntity.java 60 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/trademanage/mapper/ContractHoldOrderEntityMapper.java 10 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/trademanage/mapper/ContractOrderMapper.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/trademanage/mapper/MemberWalletAgentMapper.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/trademanage/service/ContractHoldOrderService.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/trademanage/service/TradeManageService.java 26 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/trademanage/service/impl/ContractHoldOrderServiceImpl.java 28 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/trademanage/service/impl/TradeManageServiceImpl.java 131 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/trademanage/vo/MemberAccountInfoVo.java 55 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/ContractHoldOrderEntityMapper.xml 20 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/ContractOrderMapper.xml 21 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MemberAccountMoneyChangeMapper.xml 30 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MemberCoinChargeMapper.xml 2 ●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MemberCoinWithdrawMapper.xml 2 ●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MemberMapper.xml 34 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MemberQuickBuySaleMapper.xml 5 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/contract/ContractHoldOrderDao.xml 20 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/member/applyCoin.html 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/member/chargeUsdt.html 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/member/extractUsdt.html 6 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/member/withdrawCoin.html 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/trademanage/accountInfo.html 107 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/trademanage/agentReturnInfo.html 116 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/trademanage/contractHoldOrder.html 104 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/trademanage/historyOrder.html 197 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/common/utils/CoinTypeConvert.java
New file
@@ -0,0 +1,50 @@
package com.xcong.excoin.common.utils;
/**
 * @author wzy
 * @date 2020-05-28
 **/
public class CoinTypeConvert {
    public static String convert(String symbol) {
        switch (symbol) {
            case "btcusdt":
                return "BTC/USDT";
            case "ethusdt":
                return "ETH/USDT";
            case "xrpusdt":
                return "XRP/USDT";
            case "ltcusdt":
                return "LTC/USDT";
            case "bchusdt":
                return "BCH/USDT";
            case "eosusdt":
                return "EOS/USDT";
            case "etcusdt":
                return "ETC/USDT";
            default:
                return null;
        }
    }
    public static String convertToKey(String symbol) {
        switch (symbol) {
            case "BTC/USDT":
                return "BTC_NEW_PRICE";
            case "ETH/USDT":
                return "ETH_NEW_PRICE";
            case "XRP/USDT":
                return "XRP_NEW_PRICE";
            case "LTC/USDT":
                return "LTC_NEW_PRICE";
            case "BCH/USDT":
                return "BCH_NEW_PRICE";
            case "EOS/USDT":
                return "EOS_NEW_PRICE";
            case "ETC/USDT":
                return "ETC_NEW_PRICE";
            default:
                return null;
        }
    }
}
src/main/java/com/xcong/excoin/common/utils/RedisUtils.java
New file
@@ -0,0 +1,554 @@
package com.xcong.excoin.common.utils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
 * @Author wzy
 * @Date 2020/5/10
 * @email wangdoubleone@gmail.com
 * @Version V1.0
 **/
@Component
public class RedisUtils {
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    // =============================common============================
    /**
     * 指定缓存失效时间
     * @param key 键
     * @param time 时间(秒)
     * @return
     */
    public boolean expire(String key, long time) {
        try {
            if (time > 0) {
                redisTemplate.expire(key, time, TimeUnit.SECONDS);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 根据key 获取过期时间
     * @param key 键 不能为null
     * @return 时间(秒) 返回0代表为永久有效
     */
    public long getExpire(String key) {
        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
    }
    /**
     * 判断key是否存在
     * @param key 键
     * @return true 存在 false不存在
     */
    public boolean hasKey(String key) {
        try {
            return redisTemplate.hasKey(key);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 删除缓存
     * @param key 可以传一个值 或多个
     */
    @SuppressWarnings("unchecked")
    public void del(String... key) {
        if (key != null && key.length > 0) {
            if (key.length == 1) {
                redisTemplate.delete(key[0]);
            } else {
                redisTemplate.delete(CollectionUtils.arrayToList(key));
            }
        }
    }
    // ============================String=============================
    /**
     * 普通缓存获取
     * @param key 键
     * @return 值
     */
    public Object get(String key) {
        return key == null ? null : redisTemplate.opsForValue().get(key);
    }
    /**
     * 普通缓存获取
     * @param key 键
     * @return 值
     */
    public String getString(String key) {
        Object obj = key == null ? null : redisTemplate.opsForValue().get(key);
        if(obj!=null){
            return obj.toString();
        }
        return null;
    }
    /**
     * 普通缓存放入
     * @param key 键
     * @param value 值
     * @return true成功 false失败
     */
    public boolean set(String key, Object value) {
        try {
            redisTemplate.opsForValue().set(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 普通缓存放入并设置时间
     * @param key 键
     * @param value 值
     * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
     * @return true成功 false 失败
     */
    public boolean set(String key, Object value, long time) {
        try {
            if (time > 0) {
                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
            } else {
                set(key, value);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    public boolean setNotExist(String key, Object value, long time) {
        return redisTemplate.opsForValue().setIfAbsent(key, value, time, TimeUnit.SECONDS);
    }
    /**
     * 递增
     * @param key 键
     * @param delta 要增加几(大于0)
     * @return
     */
    public long incr(String key, long delta) {
        if (delta < 0) {
            throw new RuntimeException("递增因子必须大于0");
        }
        return redisTemplate.opsForValue().increment(key, delta);
    }
    /**
     * 递减
     * @param key 键
     * @param delta 要减少几(小于0)
     * @return
     */
    public long decr(String key, long delta) {
        if (delta < 0) {
            throw new RuntimeException("递减因子必须大于0");
        }
        return redisTemplate.opsForValue().increment(key, -delta);
    }
    // ================================Map=================================
    /**
     * HashGet
     * @param key 键 不能为null
     * @param item 项 不能为null
     * @return 值
     */
    public Object hget(String key, String item) {
        return redisTemplate.opsForHash().get(key, item);
    }
    /**
     * 获取hashKey对应的所有键值
     * @param key 键
     * @return 对应的多个键值
     */
    public Map<Object, Object> hmget(String key) {
        return redisTemplate.opsForHash().entries(key);
    }
    /**
     * HashSet
     * @param key 键
     * @param map 对应多个键值
     * @return true 成功 false 失败
     */
    public boolean hmset(String key, Map<String, Object> map) {
        try {
            redisTemplate.opsForHash().putAll(key, map);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * HashSet 并设置时间
     * @param key 键
     * @param map 应多个键值
     * @param time 时间(秒)
     * @return true成功 false失败
     */
    public boolean hmset(String key, Map<String, Object> map, long time) {
        try {
            redisTemplate.opsForHash().putAll(key, map);
            if (time > 0) {
                expire(key, time);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 向一张hash表中放入数据,如果不存在将创建
     * @param key 键
     * @param item 项
     * @param value 值
     * @return true 成功 false失败
     */
    public boolean hset(String key, String item, Object value) {
        try {
            redisTemplate.opsForHash().put(key, item, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 向一张hash表中放入数据,如果不存在将创建
     * @param key 键
     * @param item 项
     * @param value 值
     * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
     * @return true 成功 false失败
     */
    public boolean hset(String key, String item, Object value, long time) {
        try {
            redisTemplate.opsForHash().put(key, item, value);
            if (time > 0) {
                expire(key, time);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 删除hash表中的值
     * @param key 键 不能为null
     * @param item 项 可以使多个 不能为null
     */
    public void hdel(String key, Object... item) {
        redisTemplate.opsForHash().delete(key, item);
    }
    /**
     * 判断hash表中是否有该项的值
     * @param key 键 不能为null
     * @param item 项 不能为null
     * @return true 存在 false不存在
     */
    public boolean hHasKey(String key, String item) {
        return redisTemplate.opsForHash().hasKey(key, item);
    }
    /**
     * hash递增 如果不存在,就会创建一个 并把新增后的值返回
     * @param key 键
     * @param item 项
     * @param by 要增加几(大于0)
     * @return
     */
    public double hincr(String key, String item, double by) {
        return redisTemplate.opsForHash().increment(key, item, by);
    }
    /**
     * hash递减
     * @param key 键
     * @param item 项
     * @param by 要减少记(小于0)
     * @return
     */
    public double hdecr(String key, String item, double by) {
        return redisTemplate.opsForHash().increment(key, item, -by);
    }
    // ============================set=============================
    /**
     * 根据key获取Set中的所有值
     * @param key 键
     * @return
     */
    public Set<Object> sGet(String key) {
        try {
            return redisTemplate.opsForSet().members(key);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 根据value从一个set中查询,是否存在
     * @param key 键
     * @param value 值
     * @return true 存在 false不存在
     */
    public boolean sHasKey(String key, Object value) {
        try {
            return redisTemplate.opsForSet().isMember(key, value);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 将数据放入set缓存
     * @param key 键
     * @param values 值 可以是多个
     * @return 成功个数
     */
    public long sSet(String key, Object... values) {
        try {
            return redisTemplate.opsForSet().add(key, values);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
    /**
     336
     * 将set数据放入缓存
     337
     * @param key 键
     * @param time 时间(秒)
     * @param values 值 可以是多个
     * @return 成功个数
     */
    public long sSetAndTime(String key, long time, Object... values) {
        try {
            Long count = redisTemplate.opsForSet().add(key, values);
            if (time > 0)
                expire(key, time);
            return count;
        }catch(Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
    /**
     * 获取set缓存的长度
     * @param key 键
     * @return
     */
    public long sGetSetSize(String key) {
        try {
            return redisTemplate.opsForSet().size(key);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
    /**
     * 移除值为value的
     * @param key 键
     * @param values 值 可以是多个
     * @return 移除的个数
     */
    public long setRemove(String key, Object... values) {
        try {
            Long count = redisTemplate.opsForSet().remove(key, values);
            return count;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
    // ===============================list=================================
    /**
     * 获取list缓存的内容     * @param key 键
     * @param start 开始
     * @param end 结束 0 到 -1代表所有值
     * @return
     */
    public List<Object> lGet(String key, long start, long end) {
        try {
            return redisTemplate.opsForList().range(key, start, end);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 获取list缓存的长度
     * @param key 键
     * @return
     */
    public long lGetListSize(String key) {        try {
        return redisTemplate.opsForList().size(key);
    } catch (Exception e) {
        e.printStackTrace();
        return 0;
    }
    }    /**
     * 通过索引 获取list中的值
     * @param key 键
     * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
     * @return
     */
    public Object lGetIndex(String key, long index) {
        try {
            return redisTemplate.opsForList().index(key, index);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 将list放入缓存
     * @param key 键
     * @param value 值
     * @return
     */
    public boolean lSet(String key, Object value) {
        try {
            redisTemplate.opsForList().rightPush(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 将list放入缓存
     * @param key 键
     * @param value 值
     * @param time 时间(秒)
     * @return
     */
    public boolean lSet(String key, Object value, long time) {
        try {
            redisTemplate.opsForList().rightPush(key, value);
            if (time > 0)
                expire(key, time);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 将list放入缓存
     * @param key 键
     * @param value 值
     * @return
     */
    public boolean lSet(String key, List<Object> value) {
        try {
            redisTemplate.opsForList().rightPushAll(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 将list放入缓存
     *
     * @param key 键
     * @param value 值
     * @param time 时间(秒)
     * @return
     */
    public boolean lSet(String key, List<Object> value, long time) {
        try {
            redisTemplate.opsForList().rightPushAll(key, value);
            if (time > 0)
                expire(key, time);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 根据索引修改list中的某条数据
     * @param key 键
     * @param index 索引
     * @param value 值
     * @return
     */
    public boolean lUpdateIndex(String key, long index, Object value) {
        try {
            redisTemplate.opsForList().set(key, index, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 移除N个值为value
     * @param key 键
     * @param count 移除多少个
     * @param value 值
     * @return 移除的个数
     */
    public long lRemove(String key, long count, Object value) {
        try {
            return redisTemplate.opsForList().remove(key, count, value);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
}
src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java
@@ -10,7 +10,6 @@
import com.xcong.excoin.modules.member.entity.MemberEntity;
import com.xcong.excoin.modules.member.entity.MemberQuickBuySaleEntity;
import com.xcong.excoin.modules.member.service.IMemberService;
import com.xcong.excoin.system.entity.User;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
src/main/java/com/xcong/excoin/modules/member/entity/MemberAccountMoneyChangeEntity.java
@@ -1,8 +1,11 @@
package com.xcong.excoin.modules.member.entity;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xcong.excoin.common.entity.BaseEntity;
import lombok.Data;
@@ -11,6 +14,10 @@
@TableName("member_account_money_change")
public class MemberAccountMoneyChangeEntity extends BaseEntity {
private static final long serialVersionUID = 1L;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    
    /**
     *  类型【1:币币资产2:合约资产3:代理资产】
@@ -49,4 +56,23 @@
     */
    private int status;
    /**
     * 手机号(包含国际手机号)
     */
    @TableField(exist = false)
    private String phone;
    /**
     * 邮箱
     */
    @TableField(exist = false)
    private String email;
    @TableField(exist = false)
    private String account;
    /**
     * 邀请码
     */
    @TableField(exist = false)
    private String inviteId;
}
src/main/java/com/xcong/excoin/modules/member/entity/MemberCoinWithdrawEntity.java
@@ -1,8 +1,6 @@
package com.xcong.excoin.modules.member.entity;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.xcong.excoin.common.entity.BaseEntity;
src/main/java/com/xcong/excoin/modules/member/mapper/MemberAccountMoneyChangeMapper.java
@@ -1,8 +1,15 @@
package com.xcong.excoin.modules.member.mapper;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xcong.excoin.modules.member.entity.MemberAccountMoneyChangeEntity;
public interface MemberAccountMoneyChangeMapper extends BaseMapper<MemberAccountMoneyChangeEntity>  {
    IPage<MemberAccountMoneyChangeEntity> findMemberAccountInfoListInPage(Page<MemberAccountMoneyChangeEntity> page,
            @Param("record") MemberAccountMoneyChangeEntity memberAccountMoneyChangeEntity);
}
src/main/java/com/xcong/excoin/modules/member/mapper/MemberMapper.java
@@ -4,6 +4,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xcong.excoin.modules.member.entity.MemberEntity;
import com.xcong.excoin.modules.trademanage.vo.MemberAccountInfoVo;
import org.apache.ibatis.annotations.Param;
/**
@@ -14,4 +16,10 @@
    IPage<MemberEntity> selectMemberListInPage(Page<MemberEntity> page, @Param("record") MemberEntity memberEntity);
    
    IPage<MemberAccountInfoVo> findMemberAccountInfoListInPage(Page<MemberEntity> page, @Param("record")MemberEntity memberEntity);
    String selectAgentForAccount(long memberId);
    String selectTradeSetting();
}
src/main/java/com/xcong/excoin/modules/member/vo/MemberCoinChargeVo.java
@@ -4,6 +4,7 @@
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
@@ -59,4 +60,9 @@
     */
    private String orderCode;
    /**
     * 邀请码
     */
    private String inviteId;
}
src/main/java/com/xcong/excoin/modules/member/vo/MemberCoinWithdrawVo.java
@@ -55,5 +55,7 @@
     * 是否内部转账 Y-是N-不是
     */
    private String isInside;
    private String inviteId;
}
src/main/java/com/xcong/excoin/modules/member/vo/MemberQuickBuySaleVo.java
@@ -60,5 +60,7 @@
     * 订单编号
     */
    private String orderNo;
    private String inviteId;
}
src/main/java/com/xcong/excoin/modules/member/vo/MemberQuickSaleVo.java
@@ -69,5 +69,7 @@
     * 订单编号
     */
    private String orderNo;
    private String inviteId;
}
src/main/java/com/xcong/excoin/modules/trademanage/controller/ContractHoldOrderController.java
File was deleted
src/main/java/com/xcong/excoin/modules/trademanage/controller/TradeManageController.java
New file
@@ -0,0 +1,66 @@
package com.xcong.excoin.modules.trademanage.controller;
import java.util.Map;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.xcong.excoin.common.controller.BaseController;
import com.xcong.excoin.common.entity.FebsResponse;
import com.xcong.excoin.common.entity.QueryRequest;
import com.xcong.excoin.modules.member.entity.MemberAccountMoneyChangeEntity;
import com.xcong.excoin.modules.member.entity.MemberEntity;
import com.xcong.excoin.modules.trademanage.entity.ContractHoldOrderEntity;
import com.xcong.excoin.modules.trademanage.entity.ContractOrderEntity;
import com.xcong.excoin.modules.trademanage.service.TradeManageService;
import lombok.RequiredArgsConstructor;
@Validated
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/tradeManage")
public class TradeManageController extends BaseController{
    private final TradeManageService tradeManageService;
    /**
     * 当前持仓---列表
     */
    @GetMapping("contractHoldOrder")
    public FebsResponse getList(ContractHoldOrderEntity contractHoldOrderEntity, QueryRequest request) {
        Map<String, Object> data = getDataTable(tradeManageService.findContractHoldOrderListInPage(contractHoldOrderEntity, request));
        return new FebsResponse().success().data(data);
    }
    /**
     * 账户信息---列表
     */
    @GetMapping("memberAccountInfo")
    public FebsResponse memberAccountInfo(MemberEntity memberEntity, QueryRequest request) {
        Map<String, Object> data = getDataTable(tradeManageService.findMemberAccountInfoListInPage(memberEntity, request));
        return new FebsResponse().success().data(data);
    }
    /**
     * 返佣明细---列表
     */
    @GetMapping("memberAgentReturnInfo")
    public FebsResponse memberAgentReturnInfo(MemberAccountMoneyChangeEntity memberAccountMoneyChangeEntity, QueryRequest request) {
        Map<String, Object> data = getDataTable(tradeManageService.findMemberAgentReturnInfoInPage(memberAccountMoneyChangeEntity, request));
        return new FebsResponse().success().data(data);
    }
    /**
     * 历史委托明细---列表
     */
    @GetMapping("historyOrderInfo")
    public FebsResponse historyOrderInfo(ContractOrderEntity contractOrderEntity, QueryRequest request) {
        Map<String, Object> data = getDataTable(tradeManageService.findMemberHistoryOrderInfoInPage(contractOrderEntity, request));
        return new FebsResponse().success().data(data);
    }
}
src/main/java/com/xcong/excoin/modules/trademanage/controller/ViewController.java
@@ -11,14 +11,47 @@
 * @author wzy
 * @date 2020-06-10
 **/
@Controller("contractHoldOrderView")
@Controller("tradeManageView")
@RequestMapping(FebsConstant.VIEW_PREFIX + "modules/trademanage")
public class ViewController {
    /**
     * 当前持仓
     */
    @GetMapping("contractHoldOrder")
    @RequiresPermissions("contractHoldOrder:view")
    public String contractHoldOrder() {
        return FebsUtil.view("modules/trademanage/contractHoldOrder");
    }
    
    /**
     * 账户信息
     * @return
     */
    @GetMapping("accountInfo")
    @RequiresPermissions("accountInfo:view")
    public String accountInfo() {
        return FebsUtil.view("modules/trademanage/accountInfo");
    }
    /**
     * 返佣明细
     * @return
     */
    @GetMapping("agentReturnInfo")
    @RequiresPermissions("agentReturnInfo:view")
    public String agentReturnInfo() {
        return FebsUtil.view("modules/trademanage/agentReturnInfo");
    }
    /**
     * 历史委托明细
     * @return
     */
    @GetMapping("historyOrder")
    @RequiresPermissions("historyOrder:view")
    public String historyOrder() {
        return FebsUtil.view("modules/trademanage/historyOrder");
    }
}
src/main/java/com/xcong/excoin/modules/trademanage/dto/MemberAccountInfoDto.java
New file
@@ -0,0 +1,11 @@
package com.xcong.excoin.modules.trademanage.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
@Data
public class MemberAccountInfoDto {
    @TableField(exist = false)
    private String account;
}
src/main/java/com/xcong/excoin/modules/trademanage/entity/ContractHoldOrderEntity.java
@@ -2,6 +2,7 @@
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.xcong.excoin.common.entity.BaseEntity;
@@ -17,6 +18,10 @@
@TableName("contract_hold_order")
public class ContractHoldOrderEntity extends BaseEntity {
    /**
     *
     */
    private static final long serialVersionUID = 1L;
    /**
     * 是否可平仓 1-是
     */
@@ -147,4 +152,27 @@
     * 批次号 队列平仓时使用,避免重复
     */
    public String batchNo;
    /**
     * 手机号(包含国际手机号)
     */
    @TableField(exist = false)
    private String phone;
    /**
     * 邮箱
     */
    @TableField(exist = false)
    private String email;
    @TableField(exist = false)
    private String account;
    /**
     * 邀请码
     */
    @TableField(exist = false)
    private String inviteId;
    /**
     * 系统盈亏
     */
    @TableField(exist = false)
    private BigDecimal rewardRatio;
}
src/main/java/com/xcong/excoin/modules/trademanage/entity/ContractOrderEntity.java
New file
@@ -0,0 +1,217 @@
package com.xcong.excoin.modules.trademanage.entity;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.xcong.excoin.common.entity.BaseEntity;
import lombok.Data;
@Data
@TableName("contract_order")
public class ContractOrderEntity extends BaseEntity {/**
     *
     */
    private static final long serialVersionUID = 1L;
    /**
     * 交易类型 市价
     */
    public static final int TRADE_TYPE_MARK_PRICE = 1;
    /**
     * 交易类型 限价
     */
    public static final int TRADE_TYPE_LIMIT_PRICE = 2;
    /**
     * 订单状态 撤单
     */
    public static final int ORDER_STATUS_CANCEL = 2;
    /**
     * 订单状态 成交
     */
    public static final int ORDER_STATUS_SUCCESS = 1;
    /**
     * 订单类型 开多
     */
    public static final int ORDER_TYPE_OPEN_MORE = 1;
    /**
     * 订单类型 开空
     */
    public static final int ORDER_TYPE_OPEN_LESS = 2;
    /**
     * 订单类型 平多
     */
    public static final int ORDER_TYPE_CLOSE_MORE = 3;
    /**
     * 订单类型 平空
     */
    public static final int ORDER_TYPE_CLOSE_LESS = 4;
    /**
     * 会员Id
     */
    private Long memberId;
    /**
     * 订单编号
     */
    private String orderNo;
    /**
     * 仓位类型 1-逐仓 2-全仓
     */
    private int positionType;
    /**
     * 交易类型 1-市价 2-限价
     */
    private int tradeType;
    /**
     * 订单类型 - 1开多,2开空,3平多,4平空
     */
    private int orderType;
    /**
     * 订单状态 - 1成交 2撤单
     */
    private int orderStatus = 1;
    /**
     * 委托开仓价
     */
    private BigDecimal entrustOpeningPrice;
    /**
     * 委托时间
     */
    private Date entrustTime;
    /**
     * 币种
     */
    private String symbol;
    /**
     * 手数
     */
    private int symbolCnt;
    /**
     * 币种规格
     */
    private BigDecimal symbolSku;
    /**
     * 平仓价
     */
    private BigDecimal closingPrice;
    /**
     * 平仓手续费
     */
    private BigDecimal closingFeeAmount;
    /**
     * 平仓时间
     */
    private Date closingTime;
    /**
     * 平仓类型 2平多3平空4爆仓平多5爆仓平空6止盈平多7止盈平空8止损平多9止损平空
     */
    private int closingType;
    /**
     * 杠杆倍率
     */
    private int leverRatio;
    /**
     * 止损价
     */
    private BigDecimal stopLossPrice;
    /**
     * 止盈价
     */
    private BigDecimal stopProfitPrice;
    /**
     * 盈亏金额
     */
    private BigDecimal rewardAmount;
    /**
     * 盈亏比例
     */
    private BigDecimal rewardRatio;
    /**
     * 开仓价
     */
    private BigDecimal openingPrice;
    /**
     * 开仓手续费
     */
    private BigDecimal openingFeeAmount;
    private Date openingTime;
    /**
     * 预付款金额
     */
    private BigDecimal prePaymentAmount;
    /**
     * 保证金
     */
    private BigDecimal bondAmount;
    /**
     * 市场价
     */
    private BigDecimal markPrice;
    /**
     * 预估强平价
     */
    private BigDecimal forceClosingPrice;
    /**
     * 持仓费
     */
    private BigDecimal holdAmount;
    private int operateNo;
    /**
     * 手机号(包含国际手机号)
     */
    @TableField(exist = false)
    private String phone;
    /**
     * 邮箱
     */
    @TableField(exist = false)
    private String email;
    @TableField(exist = false)
    private String account;
    /**
     * 邀请码
     */
    @TableField(exist = false)
    private String inviteId;
}
src/main/java/com/xcong/excoin/modules/trademanage/entity/MemberWalletAgentEntity.java
New file
@@ -0,0 +1,60 @@
package com.xcong.excoin.modules.trademanage.entity;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.TableName;
import com.xcong.excoin.common.entity.BaseEntity;
import lombok.Data;
/**
 * 代理用户钱包
 *
 * @author wzy
 * @date 2020-05-18
 **/
@Data
@TableName("member_wallet_agent")
public class MemberWalletAgentEntity extends BaseEntity {
    /**
     *
     */
    private static final long serialVersionUID = 1L;
    /**
     * 用户Id
     */
    private Long memberId;
    /**
     * 可用余额
     */
    private BigDecimal availableBalance;
    /**
     * 总金额
     */
    private BigDecimal totalBalance;
    /**
     * 冻结金额
     */
    private BigDecimal frozenBalance;
    /**
     * 借入资产金额
     */
    private BigDecimal borrowedFund;
    /**
     * 钱包标识
     */
    private String walletCode;
    /**
     * 钱包地址
     */
    private String walletAddress;
}
src/main/java/com/xcong/excoin/modules/trademanage/mapper/ContractHoldOrderEntityMapper.java
@@ -1,22 +1,14 @@
package com.xcong.excoin.modules.trademanage.mapper;
import org.apache.ibatis.annotations.Param;
import org.mapstruct.Mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xcong.excoin.modules.trademanage.entity.ContractHoldOrderEntity;
/**
 * @author wzy
 * @date 2020-05-31
 **/
@Mapper
public interface ContractHoldOrderEntityMapper extends BaseMapper<ContractHoldOrderEntity> {
    IPage<ContractHoldOrderEntity> selectContractHoldOrderListInPage(Page<ContractHoldOrderEntity> page,
            @Param("contractHoldOrderEntity") ContractHoldOrderEntity contractHoldOrderEntity);
            @Param("record") ContractHoldOrderEntity contractHoldOrderEntity);
    
    long countContractHoldOrderSql(@Param("contractHoldOrderEntity") ContractHoldOrderEntity contractHoldOrderEntity);
}
src/main/java/com/xcong/excoin/modules/trademanage/mapper/ContractOrderMapper.java
New file
@@ -0,0 +1,15 @@
package com.xcong.excoin.modules.trademanage.mapper;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xcong.excoin.modules.trademanage.entity.ContractOrderEntity;
public interface ContractOrderMapper extends BaseMapper<ContractOrderEntity> {
    IPage<ContractOrderEntity> findMemberHistoryOrderInfoInPage(Page<ContractOrderEntity> page,
            @Param("record") ContractOrderEntity contractOrderEntity);
}
src/main/java/com/xcong/excoin/modules/trademanage/mapper/MemberWalletAgentMapper.java
New file
@@ -0,0 +1,8 @@
package com.xcong.excoin.modules.trademanage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcong.excoin.modules.trademanage.entity.MemberWalletAgentEntity;
public interface MemberWalletAgentMapper extends BaseMapper<MemberWalletAgentEntity>{
}
src/main/java/com/xcong/excoin/modules/trademanage/service/ContractHoldOrderService.java
File was deleted
src/main/java/com/xcong/excoin/modules/trademanage/service/TradeManageService.java
New file
@@ -0,0 +1,26 @@
package com.xcong.excoin.modules.trademanage.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xcong.excoin.common.entity.QueryRequest;
import com.xcong.excoin.modules.member.entity.MemberAccountMoneyChangeEntity;
import com.xcong.excoin.modules.member.entity.MemberEntity;
import com.xcong.excoin.modules.trademanage.entity.ContractHoldOrderEntity;
import com.xcong.excoin.modules.trademanage.entity.ContractOrderEntity;
import com.xcong.excoin.modules.trademanage.vo.MemberAccountInfoVo;
/**
 * @author helius
 */
public interface TradeManageService extends IService<ContractHoldOrderEntity> {
    IPage<ContractHoldOrderEntity> findContractHoldOrderListInPage(ContractHoldOrderEntity contractHoldOrderEntity, QueryRequest request);
    IPage<MemberAccountInfoVo> findMemberAccountInfoListInPage(MemberEntity memberEntity, QueryRequest request);
    IPage<MemberAccountMoneyChangeEntity> findMemberAgentReturnInfoInPage(MemberAccountMoneyChangeEntity memberAccountMoneyChangeEntity,
            QueryRequest request);
    IPage<ContractOrderEntity> findMemberHistoryOrderInfoInPage(ContractOrderEntity contractOrderEntity, QueryRequest request);
}
src/main/java/com/xcong/excoin/modules/trademanage/service/impl/ContractHoldOrderServiceImpl.java
File was deleted
src/main/java/com/xcong/excoin/modules/trademanage/service/impl/TradeManageServiceImpl.java
New file
@@ -0,0 +1,131 @@
package com.xcong.excoin.modules.trademanage.service.impl;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xcong.excoin.common.entity.QueryRequest;
import com.xcong.excoin.common.utils.CoinTypeConvert;
import com.xcong.excoin.common.utils.RedisUtils;
import com.xcong.excoin.modules.member.entity.MemberAccountMoneyChangeEntity;
import com.xcong.excoin.modules.member.entity.MemberEntity;
import com.xcong.excoin.modules.member.mapper.MemberAccountMoneyChangeMapper;
import com.xcong.excoin.modules.member.mapper.MemberMapper;
import com.xcong.excoin.modules.trademanage.entity.ContractHoldOrderEntity;
import com.xcong.excoin.modules.trademanage.entity.ContractOrderEntity;
import com.xcong.excoin.modules.trademanage.entity.MemberWalletAgentEntity;
import com.xcong.excoin.modules.trademanage.mapper.ContractHoldOrderEntityMapper;
import com.xcong.excoin.modules.trademanage.mapper.ContractOrderMapper;
import com.xcong.excoin.modules.trademanage.mapper.MemberWalletAgentMapper;
import com.xcong.excoin.modules.trademanage.service.TradeManageService;
import com.xcong.excoin.modules.trademanage.vo.MemberAccountInfoVo;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class TradeManageServiceImpl extends ServiceImpl<ContractHoldOrderEntityMapper, ContractHoldOrderEntity> implements TradeManageService{
    private final ContractHoldOrderEntityMapper contractHoldOrderEntityMapper;
    private final MemberMapper memberMapper;
    private final MemberWalletAgentMapper memberWalletAgentMapper;
    private final MemberAccountMoneyChangeMapper memberAccountMoneyChangeMapper;
    private final ContractOrderMapper contractHoldOrderMapper;
    private final RedisUtils redisUtils;
    @Override
    public IPage<ContractHoldOrderEntity> findContractHoldOrderListInPage(
            ContractHoldOrderEntity contractHoldOrderEntity, QueryRequest request) {
        Page<ContractHoldOrderEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
        IPage<ContractHoldOrderEntity> findMemberAccountInfoListInPage = contractHoldOrderEntityMapper.selectContractHoldOrderListInPage(page, contractHoldOrderEntity);
        List<ContractHoldOrderEntity> records = findMemberAccountInfoListInPage.getRecords();
        if (records != null) {
            for (ContractHoldOrderEntity holdOrderEntity : records) {
                MemberEntity selectById = memberMapper.selectById(holdOrderEntity.getMemberId());
                // 获取最新价
                BigDecimal newPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(holdOrderEntity.getSymbol())));
                BigDecimal lotNumber = holdOrderEntity.getSymbolSku();
                // 盈亏
                BigDecimal rewardRatio = BigDecimal.ZERO;
                // 开多
                if (ContractHoldOrderEntity.OPENING_TYPE_MORE == holdOrderEntity.getOpeningType()) {
                    // (最新价-开仓价)*规格*张数
                    rewardRatio = newPrice.subtract(holdOrderEntity.getOpeningPrice()).multiply(lotNumber).multiply(new BigDecimal(holdOrderEntity.getSymbolCnt()));
                    // 开空
                } else {
                    // (开仓价-最新价)*规格*张数
                    rewardRatio = holdOrderEntity.getOpeningPrice().subtract(newPrice).multiply(lotNumber).multiply(new BigDecimal(holdOrderEntity.getSymbolCnt()));
                }
                if (selectById.getIsProfit() == MemberEntity.IS_PROFIT_Y) {
                   String selectTradeSetting = memberMapper.selectTradeSetting();
                    BigDecimal profitParam=new BigDecimal(selectTradeSetting);
                    if (rewardRatio.compareTo(BigDecimal.ZERO) > -1) {
                        rewardRatio = rewardRatio.multiply(BigDecimal.ONE.subtract(profitParam));
                    } else {
                        rewardRatio = rewardRatio.multiply(BigDecimal.ONE.add(profitParam));
                    }
                }
                holdOrderEntity.setRewardRatio(rewardRatio);
            }
        }
        return findMemberAccountInfoListInPage;
    }
    @Override
    public IPage<MemberAccountInfoVo> findMemberAccountInfoListInPage(MemberEntity memberEntity, QueryRequest request) {
        Page<MemberEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
        IPage<MemberAccountInfoVo> selectMemberListInPage = memberMapper.findMemberAccountInfoListInPage(page, memberEntity);
        List<MemberAccountInfoVo> records = selectMemberListInPage.getRecords();
        if(records.size() > 0) {
            for(MemberAccountInfoVo memberAccountInfoVo : records) {
                Long memberId = memberAccountInfoVo.getId();
                String inviteId = memberMapper.selectAgentForAccount(memberId);
                if("".equals(inviteId) || inviteId == null) {
                    memberAccountInfoVo.setIsSuAccount(0);
                }else {
                    memberAccountInfoVo.setIsSuAccount(1);
                }
                Map<String, Object> columnMap = new HashMap<>();
                columnMap.put("member_id", memberId);
                List<MemberWalletAgentEntity> selectByMap = memberWalletAgentMapper.selectByMap(columnMap);
                if(selectByMap.size() > 0) {
                    BigDecimal availableBalance = selectByMap.get(0).getAvailableBalance();
                    memberAccountInfoVo.setAgentAvailableBalance(availableBalance);
                }
            }
        }
        return selectMemberListInPage;
    }
    @Override
    public IPage<MemberAccountMoneyChangeEntity> findMemberAgentReturnInfoInPage(
            MemberAccountMoneyChangeEntity memberAccountMoneyChangeEntity, QueryRequest request) {
        Page<MemberAccountMoneyChangeEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
        IPage<MemberAccountMoneyChangeEntity> findMemberAccountInfoListInPage = memberAccountMoneyChangeMapper.findMemberAccountInfoListInPage(page, memberAccountMoneyChangeEntity);
        return findMemberAccountInfoListInPage;
    }
    @Override
    public IPage<ContractOrderEntity> findMemberHistoryOrderInfoInPage(
            ContractOrderEntity contractOrderEntity, QueryRequest request) {
        Page<ContractOrderEntity> page = new Page<>(request.getPageNum(), request.getPageSize());
        IPage<ContractOrderEntity> findMemberAccountInfoListInPage = contractHoldOrderMapper.findMemberHistoryOrderInfoInPage(page, contractOrderEntity);
        return findMemberAccountInfoListInPage;
    }
}
src/main/java/com/xcong/excoin/modules/trademanage/vo/MemberAccountInfoVo.java
New file
@@ -0,0 +1,55 @@
package com.xcong.excoin.modules.trademanage.vo;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
@Data
public class MemberAccountInfoVo {
    @TableId(value = "id",type = IdType.AUTO)
    private Long id;
    /**
     * 手机号(包含国际手机号)
     */
    private String phone;
    /**
     * 邮箱
     */
    private String email;
    private String inviteId;
    /**
     * 币币可用金额
     */
    private BigDecimal walletCoinAvailableBalance;
    /**
     * 币币总金额
     */
    private BigDecimal walletCoinTotalBalance;
    /**
     * 币币冻结金额
     */
    private BigDecimal walletCoinFrozenBalance;
    /**
     * 合约可用金额
     */
    private BigDecimal walletAvailableBalance;
    /**
     * 合约总金额
     */
    private BigDecimal walletTotalBalance;
    /**
     * 合约冻结金额
     */
    private BigDecimal walletFrozenBalance;
    /**
     * 是否是代理
     */
    private int isSuAccount;
    /**
     * 代理可用金额
     */
    private BigDecimal agentAvailableBalance;
}
src/main/resources/mapper/modules/ContractHoldOrderEntityMapper.xml
New file
@@ -0,0 +1,20 @@
<?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.trademanage.mapper.ContractHoldOrderEntityMapper">
    <select id="selectContractHoldOrderListInPage" resultType="com.xcong.excoin.modules.trademanage.entity.ContractHoldOrderEntity">
        SELECT
            *
        FROM
            contract_hold_order s
        LEFT JOIN member m ON m.id = s.member_id
        <where>
            <if test="record != null" >
                <if test="record.account!=null and record.account!=''">
                    and (m.phone = #{record.account} or m.email = #{record.account} or m.invite_id=#{record.account})
                </if>
            </if>
        </where>
    </select>
</mapper>
src/main/resources/mapper/modules/ContractOrderMapper.xml
New file
@@ -0,0 +1,21 @@
<?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.trademanage.mapper.ContractOrderMapper">
    <select id="findMemberHistoryOrderInfoInPage" resultType="com.xcong.excoin.modules.trademanage.entity.ContractOrderEntity">
        SELECT
            *
        FROM
            contract_order s
        LEFT JOIN member m ON m.id = s.member_id
        <where>
            <if test="record != null" >
                <if test="record.account!=null and record.account!=''">
                    and (m.phone = #{record.account} or m.email = #{record.account} or m.invite_id=#{record.account})
                </if>
            </if>
        </where>
        order by s.order_no DESC,s.create_time asc
    </select>
</mapper>
src/main/resources/mapper/modules/MemberAccountMoneyChangeMapper.xml
New file
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xcong.excoin.modules.member.mapper.MemberAccountMoneyChangeMapper">
    <select id="findMemberAccountInfoListInPage" resultType="com.xcong.excoin.modules.member.entity.MemberAccountMoneyChangeEntity">
        SELECT
            m.phone,
            m.email,
            m.invite_id inviteId,
            s.symbol,
            s.amount,
            s.content,
            s.create_time createTime,
            s. STATUS,
            s.type
        FROM
            member_account_money_change s
        LEFT JOIN member m ON m.id = s.member_id
        <where>
        s.type = 3
        and s.content like '%佣金入账%'
            <if test="record != null" >
                <if test="record.account!=null and record.account!=''">
                    and (m.phone = #{record.account} or m.email = #{record.account} or m.invite_id=#{record.account})
                </if>
            </if>
        </where>
    </select>
</mapper>
src/main/resources/mapper/modules/MemberCoinChargeMapper.xml
@@ -7,7 +7,7 @@
        <where>
            <if test="record != null" >
                <if test="record.account!=null and record.account!=''">
                    and (m.phone = #{record.account} or m.email = #{record.account} or s.member_id=#{record.account})
                    and (m.phone = #{record.account} or m.email = #{record.account} or m.invite_id=#{record.account})
                </if>
                <if test="record.address!=null and record.address!=''">
                    and s.address=#{record.address}
src/main/resources/mapper/modules/MemberCoinWithdrawMapper.xml
@@ -10,7 +10,7 @@
         <where>
            <if test="record != null" >
                <if test="record.account!=null and record.account!=''">
                    and (m.phone = #{record.account} or m.email = #{record.account} or s.member_id=#{record.account})
                     and (m.phone = #{record.account} or m.email = #{record.account} or m.invite_id=#{record.account})
                </if>
                <if test="record.isInside!=null and record.isInside!=''">
                    and s.is_inside= #{record.isInside}
src/main/resources/mapper/modules/MemberMapper.xml
@@ -2,7 +2,6 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xcong.excoin.modules.member.mapper.MemberMapper">
    <select id="selectMemberListInPage" resultType="com.xcong.excoin.modules.member.entity.MemberEntity">
        select * from member
        <where>
@@ -30,4 +29,37 @@
        order by create_time desc
    </select>
    <select id="findMemberAccountInfoListInPage" resultType="com.xcong.excoin.modules.trademanage.vo.MemberAccountInfoVo">
        SELECT
            m.id,
            m.phone,
            m.email,
            m.invite_id inviteId,
            a.available_balance walletCoinAvailableBalance,
            a.total_balance walletCoinTotalBalance,
            a.frozen_balance walletCoinFrozenBalance,
            b.available_balance walletAvailableBalance,
            b.total_balance walletTotalBalance,
            b.frozen_balance walletFrozenBalance
        FROM
            member m
        LEFT JOIN member_wallet_coin b ON m.id = b.member_id
        LEFT JOIN member_wallet_contract a ON a.member_id = m.id
        <where>
            b.wallet_code = 'USDT'
            <if test="record.account!=null and record.account!=''">
                    and (m.phone = #{record.account} or m.email = #{record.account} or m.invite_id=#{record.account})
            </if>
        </where>
        order by m.create_time desc
    </select>
    <select id="selectAgentForAccount" resultType="java.lang.String">
        select invite_id from agent_friend_relation where member_id = #{memberId}
    </select>
    <select id="selectTradeSetting" resultType="java.lang.String">
        select profit_param from platform_trade_setting
    </select>
</mapper>
src/main/resources/mapper/modules/MemberQuickBuySaleMapper.xml
@@ -9,7 +9,7 @@
        s.order_type = 'B' 
            <if test="record != null" >
                <if test="record.account!=null and record.account!=''">
                    and (m.phone = #{record.account} or m.email = #{record.account} or s.member_id=#{record.account})
                    and (m.phone = #{record.account} or m.email = #{record.account} or m.invite_id=#{record.account})
                </if>
                <if test="record.orderStatus!=null and record.orderStatus!= 0" >
                    and s.order_status = #{record.orderStatus}
@@ -32,6 +32,7 @@
            s.order_status orderStatus,
            m.name,
            m.account,
            a.invite_id inviteId,
            m.payment_qrcode paymentQrcode,
            m.bank,
            m.payment_type paymentType,
@@ -44,7 +45,7 @@
        s.order_type = 'S' 
            <if test="record != null" >
                <if test="record.account!=null and record.account!=''">
                    and (a.phone = #{record.account} or a.email = #{record.account} or s.member_id=#{record.account})
                    and (a.phone = #{record.account} or a.email = #{record.account} or a.invite_id=#{record.account})
                </if>
                <if test="record.orderStatus!=null and record.orderStatus!= 0" >
                    and s.order_status = #{record.orderStatus}
src/main/resources/mapper/modules/contract/ContractHoldOrderDao.xml
File was deleted
src/main/resources/templates/febs/views/modules/member/applyCoin.html
@@ -105,7 +105,7 @@
                cols: [[
                    {field: 'phone', title: '手机号码', minWidth: 120,align:'left'},
                    {field: 'email', title: '邮箱', minWidth: 200,align:'left'},
                    {field: 'memberId', title: '邀请码UID', minWidth: 100,align:'center'},
                    {field: 'inviteId', title: '邀请码UID', minWidth: 80,align:'center'},
                    {field: 'symbol', title: '币种', minWidth: 60,align:'center'},
                    {field: 'tag', title: 'USDT类型', minWidth: 60,align:'center'},
                    {field: 'amount', title: '充币数量', minWidth: 100,align:'center'},
src/main/resources/templates/febs/views/modules/member/chargeUsdt.html
@@ -166,7 +166,7 @@
                cols: [[
                    {field: 'phone', title: '手机号码', minWidth: 120,align:'left'},
                    {field: 'email', title: '邮箱', minWidth: 200,align:'left'},
                    {field: 'memberId', title: '邀请码UID', minWidth: 100,align:'center'},
                    {field: 'inviteId', title: '邀请码UID', minWidth: 120,align:'center'},
                    {field: 'amountCny', title: '人民币金额', minWidth: 120,align:'center'},
                    {field: 'amountUsdt', title: 'USDT金额', minWidth: 120,align:'center'},
                    {field: 'unitPrice', title: '单价', minWidth: 80,align:'center'},
src/main/resources/templates/febs/views/modules/member/extractUsdt.html
@@ -167,17 +167,17 @@
                cols: [[
                    {field: 'phone', title: '手机号码', minWidth: 120,align:'left'},
                    {field: 'email', title: '邮箱', minWidth: 200,align:'left'},
                    {field: 'memberId', title: '邀请码UID', minWidth: 100,align:'center'},
                    {field: 'inviteId', title: '邀请码UID', minWidth: 80,align:'center'},
                    {field: 'amountCny', title: '人民币金额', minWidth: 120,align:'center'},
                    {field: 'amountUsdt', title: 'USDT金额', minWidth: 120,align:'center'},
                    {field: 'unitPrice', title: '单价', minWidth: 80,align:'center'},
                    {field: 'createTime', title: '提现时间', minWidth: 180,align:'center'},
                    {title: '提现状态', templet: '#order-Status', minWidth: 100,align:'center'},
                    {field: 'orderNo', title: '订单编号', minWidth: 150,align:'center'},
                    {title: '收款方式', templet: '#payment-Type', minWidth: 100,align:'center'},
                    {field: 'paymentQrcode', title: '支付码', minWidth: 120,align:'center'},
                    {field: 'orderNo', title: '订单编号', minWidth: 150,align:'center'},
                    {field: 'name', title: '收款人', minWidth: 150,align:'center'},
                    {field: 'account', title: '收款账号', minWidth: 150,align:'center'},
                    {title: '收款方式', templet: '#payment-Type', minWidth: 100,align:'center'},
                    {field: 'paymentAccount', title: '二维码', minWidth: 150,align:'center'},
                    {field: 'bank', title: '所属银行', minWidth: 150,align:'center'},
                    {title: '操作', toolbar: '#user-option', minWidth: 150, fixed : 'right'}
src/main/resources/templates/febs/views/modules/member/withdrawCoin.html
@@ -166,7 +166,7 @@
                cols: [[
                    {field: 'phone', title: '手机号码', minWidth: 120,align:'left'},
                    {field: 'email', title: '邮箱', minWidth: 200,align:'left'},
                    {field: 'memberId', title: '邀请码UID', minWidth: 100,align:'center'},
                    {field: 'inviteId', title: '邀请码UID', minWidth: 80,align:'center'},
                    {field: 'symbol', title: '币种', minWidth: 100,align:'center'},
                    {field: 'amount', title: '提币数量', minWidth: 120,align:'center'},
                    {field: 'address', title: '提币地址', minWidth: 300,align:'center'},
src/main/resources/templates/febs/views/modules/trademanage/accountInfo.html
New file
@@ -0,0 +1,107 @@
<div class="layui-fluid layui-anim febs-anim" id="febs-user" lay-title="账户信息">
    <div class="layui-row febs-container">
        <div class="layui-col-md12">
            <div class="layui-card">
                <div class="layui-card-body febs-table-full">
                    <form class="layui-form layui-table-form" lay-filter="user-table-form">
                        <div class="layui-row">
                            <div class="layui-col-md10">
                                <div class="layui-form-item">
                                    <div class="layui-inline">
                                        <div class="layui-input-inline">
                                            <input type="text" placeholder="手机号/邮箱/邀请码" name="account" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                </div>
                            </div>
                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
                                    <i class="layui-icon">&#xe848;</i>
                                </div>
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
                                    <i class="layui-icon">&#xe79b;</i>
                                </div>
                            </div>
                        </div>
                    </form>
                    <table lay-filter="userTable" lay-data="{id: 'userTable'}"></table>
                </div>
            </div>
        </div>
    </div>
</div>
<script type="text/html" id="isSuAccount">
    {{#
    var isSuAccount = {
    "1": {title: '是' , color: 'green'},
    "0": {title: '否' , color: 'red' }
    }[d.isSuAccount];
    }}
    <span class="layui-badge febs-tag-{{isSuAccount.color}}">{{ isSuAccount.title }}</span>
</script>
<!-- 表格操作栏 end -->
<script data-th-inline="none" type="text/javascript">
    // 引入组件并初始化
    layui.use(['dropdown', 'jquery', 'laydate', 'form', 'table', 'febs', 'treeSelect'], function () {
        var $ = layui.jquery,
            laydate = layui.laydate,
            febs = layui.febs,
            form = layui.form,
            table = layui.table,
            treeSelect = layui.treeSelect,
            dropdown = layui.dropdown,
            $view = $('#febs-user'),
            $query = $view.find('#query'),
            $reset = $view.find('#reset'),
            $searchForm = $view.find('form'),
            sortObject = {field: 'createTime', type: null},
            tableIns;
        form.render();
        // 表格初始化
        initTable();
        // 查询按钮
        $query.on('click', function () {
            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
            tableIns.reload({where: params, page: {curr: 1}});
        });
        // 刷新按钮
        $reset.on('click', function () {
            $searchForm[0].reset();
            sortObject.type = 'null';
            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
        });
        function initTable() {
            tableIns = febs.table.init({
                elem: $view.find('table'),
                id: 'userTable',
                url: ctx + 'tradeManage/memberAccountInfo',
                cols: [[
                    {field: 'phone', title: '手机号', minWidth: 100,align:'left'},
                    {field: 'email', title: '邮箱', minWidth: 200,align:'left'},
                    {field: 'inviteId', title: '邀请码UID', minWidth: 80,align:'center'},
                    {field: 'walletCoinAvailableBalance', title: '币币可用', minWidth: 80,align:'center'},
                    {field: 'walletCoinFrozenBalance', title: '币币冻结', minWidth: 80,align:'center'},
                    {field: 'walletCoinTotalBalance', title: '币币总金额', minWidth: 80,align:'center'},
                    {field: 'walletAvailableBalance', title: '合约可用', minWidth: 80,align:'center'},
                    {field: 'walletFrozenBalance', title: '合约冻结', minWidth: 80,align:'center'},
                    {field: 'walletTotalBalance', title: '合约总金额', minWidth: 80,align:'center'},
                    {title: '是否是代理', templet: '#isSuAccount', minWidth: 100,align:'center'},
                    {field: 'agentAvailableBalance', title: '代理账户', minWidth: 80,align:'center'}
                ]]
            });
        }
        // 获取查询参数
        function getQueryParams() {
            return {
                account: $searchForm.find('input[name="account"]').val().trim(),
            };
        }
    })
</script>
src/main/resources/templates/febs/views/modules/trademanage/agentReturnInfo.html
New file
@@ -0,0 +1,116 @@
<div class="layui-fluid layui-anim febs-anim" id="febs-user" lay-title="返佣明细">
    <div class="layui-row febs-container">
        <div class="layui-col-md12">
            <div class="layui-card">
                <div class="layui-card-body febs-table-full">
                    <form class="layui-form layui-table-form" lay-filter="user-table-form">
                        <div class="layui-row">
                            <div class="layui-col-md10">
                                <div class="layui-form-item">
                                    <div class="layui-inline">
                                        <div class="layui-input-inline">
                                            <input type="text" placeholder="手机号/邮箱/邀请码" name="account" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                </div>
                            </div>
                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
                                    <i class="layui-icon">&#xe848;</i>
                                </div>
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
                                    <i class="layui-icon">&#xe79b;</i>
                                </div>
                            </div>
                        </div>
                    </form>
                    <table lay-filter="userTable" lay-data="{id: 'userTable'}"></table>
                </div>
            </div>
        </div>
    </div>
</div>
<script type="text/html" id="isType">
    {{#
    var type = {
    "1": {title: '币币资产' , color: 'red'},
    "2": {title: '合约资产' , color: 'green'},
    "3": {title: '代理资产' , color: 'blue' }
    }[d.type];
    }}
    <span class="layui-badge febs-tag-{{type.color}}">{{ type.title }}</span>
</script>
<script type="text/html" id="status">
    {{#
    var status = {
    "2": {title: '失败' , color: 'red'},
    "1": {title: '成功' , color: 'green'},
    "0": {title: '待审核' , color: 'blue' }
    }[d.status];
    }}
    <span class="layui-badge febs-tag-{{status.color}}">{{ status.title }}</span>
</script>
<!-- 表格操作栏 end -->
<script data-th-inline="none" type="text/javascript">
    // 引入组件并初始化
    layui.use(['dropdown', 'jquery', 'laydate', 'form', 'table', 'febs', 'treeSelect'], function () {
        var $ = layui.jquery,
            laydate = layui.laydate,
            febs = layui.febs,
            form = layui.form,
            table = layui.table,
            treeSelect = layui.treeSelect,
            dropdown = layui.dropdown,
            $view = $('#febs-user'),
            $query = $view.find('#query'),
            $reset = $view.find('#reset'),
            $searchForm = $view.find('form'),
            sortObject = {field: 'createTime', type: null},
            tableIns;
        form.render();
        // 表格初始化
        initTable();
        // 查询按钮
        $query.on('click', function () {
            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
            tableIns.reload({where: params, page: {curr: 1}});
        });
        // 刷新按钮
        $reset.on('click', function () {
            $searchForm[0].reset();
            sortObject.type = 'null';
            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
        });
        function initTable() {
            tableIns = febs.table.init({
                elem: $view.find('table'),
                id: 'userTable',
                url: ctx + 'tradeManage/memberAgentReturnInfo',
                cols: [[
                    {field: 'phone', title: '手机号', minWidth: 100,align:'left'},
                    {field: 'email', title: '邮箱', minWidth: 200,align:'left'},
                    {field: 'inviteId', title: '邀请码UID', minWidth: 80,align:'center'},
                    {field: 'symbol', title: '币种', minWidth: 80,align:'center'},
                    {field: 'amount', title: '金额', minWidth: 80,align:'center'},
                    {field: 'content', title: '记录内容', minWidth: 80,align:'center'},
                    {field: 'createTime', title: '时间', minWidth: 80,align:'center'},
                    {title: '状态', templet: '#status', minWidth: 100,align:'center'},
                    {title: '类型', templet: '#isType', minWidth: 100,align:'center'},
                ]]
            });
        }
        // 获取查询参数
        function getQueryParams() {
            return {
                account: $searchForm.find('input[name="account"]').val().trim(),
            };
        }
    })
</script>
src/main/resources/templates/febs/views/modules/trademanage/contractHoldOrder.html
@@ -8,9 +8,8 @@
                            <div class="layui-col-md10">
                                <div class="layui-form-item">
                                    <div class="layui-inline">
                                        <label class="layui-form-label layui-form-label-sm">用户名</label>
                                        <div class="layui-input-inline">
                                            <input type="text" name="username" autocomplete="off" class="layui-input">
                                            <input type="text" placeholder="手机号/邮箱/邀请码" name="account" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                </div>
@@ -22,30 +21,36 @@
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
                                    <i class="layui-icon">&#xe79b;</i>
                                </div>
                                <div class="layui-btn layui-btn-sm layui-btn-primary table-action action-more"
                                     shiro:hasAnyPermissions="user:add,user:update,user:password:reset,user:export">
                                    <i class="layui-icon">&#xe875;</i>
                                </div>
                            </div>
                        </div>
                    </form>
                    <table lay-filter="contractHoldOrderTable" lay-data="{id: 'contractHoldOrderTable'}"></table>
                    <table lay-filter="userTable" lay-data="{id: 'userTable'}"></table>
                </div>
            </div>
        </div>
    </div>
</div>
<script type="text/html" id="user-option">
    <span shiro:lacksPermission="user:view,user:update,user:delete">
        <span class="layui-badge-dot febs-bg-orange"></span> 无权限
    </span>
    <a lay-event="detail" shiro:hasPermission="user:view"><i
            class="layui-icon febs-edit-area febs-green">&#xe7a5;</i></a>
    <a lay-event="edit" shiro:hasPermission="user:update"><i
            class="layui-icon febs-edit-area febs-blue">&#xe7a4;</i></a>
    <a lay-event="del" shiro:hasPermission="user:delete"><i class="layui-icon febs-edit-area febs-red">&#xe7f9;</i></a>
<script type="text/html" id="tradeType">
    {{#
    var tradeType = {
    1: {title: '市价' , color: 'green'},
    2: {title: '限价' , color: 'blue' }
    }[d.tradeType];
    }}
    <span class="layui-badge febs-tag-{{tradeType.color}}">{{ tradeType.title }}</span>
</script>
<script type="text/html" id="openingType">
    {{#
    var openingType = {
    1: {title: '开多' , color: 'green'},
    2: {title: '开空' , color: 'red' }
    }[d.openingType];
    }}
    <span class="layui-badge febs-tag-{{openingType.color}}">{{ openingType.title }}</span>
</script>
<!-- 表格操作栏 end -->
<script data-th-inline="none" type="text/javascript">
    // 引入组件并初始化
    layui.use(['dropdown', 'jquery', 'laydate', 'form', 'table', 'febs', 'treeSelect'], function () {
        var $ = layui.jquery,
            laydate = layui.laydate,
@@ -59,47 +64,60 @@
            $reset = $view.find('#reset'),
            $searchForm = $view.find('form'),
            sortObject = {field: 'createTime', type: null},
            tableIns,
            createTimeFrom,
            createTimeTo;
            tableIns;
        form.render();
        // 表格初始化
        initTable();
        // 查询按钮
        $query.on('click', function () {
            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
            tableIns.reload({where: params, page: {curr: 1}});
        });
        // 刷新按钮
        $reset.on('click', function () {
            $searchForm[0].reset();
            sortObject.type = 'null';
            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
        });
        function initTable() {
            tableIns = febs.table.init({
                elem: $view.find('table'),
                id: 'contractHoldOrderTable',
                url: ctx + 'contractHoldOrder/getList',
                id: 'userTable',
                url: ctx + 'tradeManage/contractHoldOrder',
                cols: [[
                    {type: 'checkbox'},
                    {field: 'memberId', title: 'uId', minWidth: 100},
                    {field: 'memberId', title: '用户账号', minWidth: 100},
                    {field: 'symbol', title: '币种', minWidth: 100},
                    {field: 'tradeType', title: '建仓类型', minWidth: 100},
                    {field: 'openingPrice', title: '建仓价格', minWidth: 100},
                    {field: 'symbolCnt', title: '建仓张数', minWidth: 100}
                    {field: 'phone', title: '手机号', minWidth: 100,align:'left'},
                    {field: 'email', title: '邮箱', minWidth: 200,align:'left'},
                    {field: 'inviteId', title: '邀请码UID', minWidth: 120,align:'center'},
                    {field: 'orderNo', title: '订单编号', minWidth: 200,align:'center'},
                    {title: '开仓类型', templet: '#openingType', minWidth: 80,align:'center'},
                    {title: '交易类型', templet: '#tradeType', minWidth: 80,align:'center'},
                    {field: 'symbol', title: '币种', minWidth: 100,align:'center'},
                    {field: 'symbolCnt', title: '手数', minWidth: 80,align:'center'},
                    {field: 'rewardRatio', title: '实时盈亏', minWidth: 120,align:'center'},
                    {field: 'symbolSku', title: '币种规格', minWidth: 120,align:'center'},
                    {field: 'openingPrice', title: '开仓价', minWidth: 100,align:'center'},
                    {field: 'openingFeeAmount', title: '开仓手续费', minWidth: 120,align:'center'},
                    {field: 'bondAmount', title: '保证金', minWidth: 120,align:'center'},
                    {field: 'leverRatio', title: '杠杆倍率', minWidth: 120,align:'center'},
                    {field: 'stopLossPrice', title: '止损价', minWidth: 120,align:'center'},
                    {field: 'stopProfitPrice', title: '止盈价', minWidth: 120,align:'center'},
                    {field: 'prePaymentAmount', title: '预付款金额', minWidth: 120,align:'center'},
                    {field: 'forceClosingPrice', title: '预估强平价', minWidth: 120,align:'center'}
                ]]
            });
        }
        /* function getQueryParams() {
            var createTime = $searchForm.find('input[name="createTime"]').val();
            if (createTime) {
                createTimeFrom = createTime.split(' - ')[0];
                createTimeTo = createTime.split(' - ')[1];
            }
        // 获取查询参数
        function getQueryParams() {
            return {
                createTimeFrom: createTimeFrom,
                createTimeTo: createTimeTo,
                username: $searchForm.find('input[name="username"]').val().trim(),
                status: $searchForm.find("select[name='status']").val(),
                sex: $searchForm.find("select[name='sex']").val(),
                mobile: $searchForm.find("input[name='mobile']").val().trim(),
                deptId: $searchForm.find("input[name='dept']").val().trim(),
                invalidate_ie_cache: new Date()
                account: $searchForm.find('input[name="account"]').val().trim(),
            };
        } */
        }
    })
</script>
src/main/resources/templates/febs/views/modules/trademanage/historyOrder.html
New file
@@ -0,0 +1,197 @@
<div class="layui-fluid layui-anim febs-anim" id="febs-user" lay-title="历史委托明细">
    <div class="layui-row febs-container">
        <div class="layui-col-md12">
            <div class="layui-card">
                <div class="layui-card-body febs-table-full">
                    <form class="layui-form layui-table-form" lay-filter="user-table-form">
                        <div class="layui-row">
                            <div class="layui-col-md10">
                                <div class="layui-form-item">
                                    <div class="layui-inline">
                                        <div class="layui-input-inline">
                                            <input type="text" placeholder="手机号/邮箱/邀请码" name="account" autocomplete="off" class="layui-input">
                                        </div>
                                    </div>
                                </div>
                            </div>
                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
                                    <i class="layui-icon">&#xe848;</i>
                                </div>
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
                                    <i class="layui-icon">&#xe79b;</i>
                                </div>
                            </div>
                        </div>
                    </form>
                    <table lay-filter="userTable" lay-data="{id: 'userTable'}"></table>
                </div>
            </div>
        </div>
    </div>
</div>
<script type="text/html" id="tradeType">
    {{#
    var tradeType = {
    1: {title: '市价' , color: 'green'},
    2: {title: '限价' , color: 'blue' }
    }[d.tradeType];
    }}
    <span class="layui-badge febs-tag-{{tradeType.color}}">{{ tradeType.title }}</span>
</script>
<script type="text/html" id="closingType">
    {{#
    var closingType = {
    0: {title: '开仓' , color: 'blue'},
    2: {title: '平多' , color: 'green'},
    3: {title: '平空' , color: 'red'},
    4: {title: '爆仓平多' , color: 'red'},
    5: {title: '爆仓平空' , color: 'red'},
    6: {title: '止盈平多' , color: 'green'},
    7: {title: '止盈平空' , color: 'green'},
    8: {title: '止损平多' , color: 'red'},
    9: {title: '止损平空' , color: 'red'}
    }[d.closingType];
    }}
    <span class="layui-badge febs-tag-{{closingType.color}}">{{ closingType.title }}</span>
</script>
<script type="text/html" id="orderStatus">
    {{#
    var orderStatus = {
    1: {title: '成交' , color: 'green'},
    2: {title: '撤单' , color: 'blue' }
    }[d.orderStatus];
    }}
    <span class="layui-badge febs-tag-{{orderStatus.color}}">{{ orderStatus.title }}</span>
</script>
<script type="text/html" id="orderType">
    {{#
    var orderType = {
    1: {title: '开多' , color: 'green'},
    2: {title: '开空' , color: 'red'},
    3: {title: '平多' , color: 'green'},
    4: {title: '平空' , color: 'red' }
    }[d.orderType];
    }}
    <span class="layui-badge febs-tag-{{orderType.color}}">{{ orderType.title }}</span>
</script>
<script type="text/html" id="openingType">
    {{#
    var openingType = {
    1: {title: '开多' , color: 'green'},
    2: {title: '开空' , color: 'red' }
    }[d.openingType];
    }}
    <span class="layui-badge febs-tag-{{openingType.color}}">{{ openingType.title }}</span>
</script>
<script type="text/html" id="isCanClosing">
    {{#
    var openingType = {
    1: {title: '是' , color: 'green'},
    0: {title: '否' , color: 'red' }
    }[d.isCanClosing];
    }}
    <span class="layui-badge febs-tag-{{isCanClosing.color}}">{{ isCanClosing.title }}</span>
</script>
<!-- 表格操作栏 end -->
<script data-th-inline="none" type="text/javascript">
    // 引入组件并初始化
    layui.use(['dropdown', 'jquery', 'laydate', 'form', 'table', 'febs', 'treeSelect'], function () {
        var $ = layui.jquery,
            laydate = layui.laydate,
            febs = layui.febs,
            form = layui.form,
            table = layui.table,
            treeSelect = layui.treeSelect,
            dropdown = layui.dropdown,
            $view = $('#febs-user'),
            $query = $view.find('#query'),
            $reset = $view.find('#reset'),
            $searchForm = $view.find('form'),
            sortObject = {field: 'createTime', type: null},
            tableIns;
        form.render();
        // 表格初始化
        initTable();
        // 查询按钮
        $query.on('click', function () {
            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
            tableIns.reload({where: params, page: {curr: 1}});
        });
        // 刷新按钮
        $reset.on('click', function () {
            $searchForm[0].reset();
            sortObject.type = 'null';
            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
        });
        function initTable() {
            tableIns = febs.table.init({
                elem: $view.find('table'),
                id: 'userTable',
                url: ctx + 'tradeManage/historyOrderInfo',
                cols: [[
                    {field: 'phone', title: '手机号', minWidth: 100,align:'left'},
                    {field: 'email', title: '邮箱', minWidth: 200,align:'left'},
                    {field: 'inviteId', title: '邀请码UID', minWidth: 120,align:'center'},
                    {field: 'orderNo', title: '订单编号', minWidth: 200,align:'center'},
                    {title: '交易类型', templet: '#tradeType', minWidth: 120,align:'center'},
                    {title: '订单类型', templet: '#orderType', minWidth: 120,align:'center'},
                    {title: '订单状态', templet: '#orderStatus', minWidth: 120,align:'center'},
                    {title: '平仓类型', templet: '#closingType', minWidth: 120,align:'center'},
                    {field: 'rewardAmount', title: '盈亏金额',
                        templet: function (d) {
                            if (d.rewardAmount > 0) {
                                return '<span style="color:green;">' + d.rewardAmount + '</span>'
                            }
                            if (d.rewardAmount < 0) {
                                return '<span style="color:red;">' + d.rewardAmount + '</span>'
                            }
                            if (d.rewardAmount == 0 ||  d.rewardAmount == "" || d.rewardAmount == null) {
                                return '<span></span>'
                            }
                        },minWidth: 120,align:'center'},
                    {field: 'openingPrice', title: '开仓价',
                            templet: function (d) {
                                if (d.closingPrice > 0 || d.closingPrice < 0) {
                                    return '<span></span>'
                                }else{
                                       return '<span>' + d.openingPrice + '</span>'
                                }
                            }, minWidth: 150,align:'center'},
                    {field: 'closingPrice', title: '平仓价', minWidth: 150,align:'center'},
                    {field: 'openingTime', title: '开仓时间', minWidth: 200,align:'center'},
                    {field: 'closingTime', title: '平仓时间', minWidth: 200,align:'center'},
                    {field: 'entrustOpeningPrice', title: '委托开仓价', minWidth: 150,align:'center'},
                    {field: 'entrustTime', title: '委托时间', minWidth: 200,align:'center'},
                    {field: 'symbol', title: '币种', minWidth: 120,align:'center'},
                    {field: 'symbolCnt', title: '手数', minWidth: 80,align:'center'},
                    {field: 'symbolSku', title: '币种规格', minWidth: 100,align:'center'},
                    {field: 'leverRatio', title: '杠杆倍率', minWidth: 120,align:'center'},
                    {field: 'stopLossPrice', title: '止损价', minWidth: 120,align:'center'},
                    {field: 'stopProfitPrice', title: '止盈价', minWidth: 120,align:'center'},
                    {field: 'rewardRatio', title: '盈亏比例', minWidth: 120,align:'center'},
                    {field: 'prePaymentAmount', title: '预付款金额', minWidth: 120,align:'center'},
                    {field: 'forceClosingPrice', title: '预估强平价', minWidth: 120,align:'center'},
                    {field: 'bondAmount', title: '保证金', minWidth: 120,align:'center'},
                    {field: 'openingFeeAmount', title: '开仓手续费', minWidth: 120,align:'center'},
                    {field: 'closingFeeAmount', title: '平仓手续费', minWidth: 100,align:'center'},
                    {field: 'holdAmount', title: '持仓费', minWidth: 120,align:'center'}
                ]]
            });
        }
        // 获取查询参数
        function getQueryParams() {
            return {
                account: $searchForm.find('input[name="account"]').val().trim(),
            };
        }
    })
</script>