发布委托功能
# 币币交易发布委托功能文档
## 功能简介
平台已有交易区和交易对,并且用户进入交易大厅发布委托单,对已有委托列表进行匹配对过程。
## 代码流程
### 1.发布委托消息
#### a.发布委托用户端接口
##### 1)代码结构:app/trade/tradescontroller/entrustOrder
##### 2)实现内容:
###### i.判断交易类型是否杠杆交易。
###### ii.判断是否关闭了交易。
###### iii.从redis获取config。判断是否开启了实名认证。
###### iiii.构造exentrust结果,调用addentrust接口,返回接口内容。
#### b.创建委托
##### 1)代码结构:service/manage/remote/remoteManageServiceImpl/addEntrust
##### 2)实现内容:
###### i 判断该用户是否有货币金额小于0。
###### ii 然后调用entrust检查接口。
###### iii 检查通过后构造entrust数据以后调用初始化接口。
#### c.检查委托单
##### 1)代码结构:service/trade/entrust/exentrustserviceimpl/saveExEntrustCheck
##### 2)实现内容:
###### i 判断是否开盘。
###### ii 判断交易对是否可用。
###### iii 判断委托单金额是否在交易对配置单可用区间内。
###### iv 根据收盘价判断价格是否在涨跌幅范围内。
###### v 委托数量是否在单笔范围内。
#### d.初始化委托单
##### 1)代码结构:service/trade/entrust/exentrustserviceimpl/saveExEntrustTrade
##### 2)实现内容:
###### i 设置委托单时间
###### ii 设置总额
###### iii 设置单价如果为空则为0
###### iv 设置手续费
###### v 设置上下界限价格
###### vi 判断手续费是否使用平台币,配置平台币
#### e.发布委托到消息队列
##### 1)代码结构:service/trade/entrust/exentrustserviceimpl/saveExEntrustTrade
##### 2)实现内容:
###### i 根据委托单类型判断用户定价币或者交易币是否充足
###### ii 将委托单信息发布到toTrade消息队列中。
### 2.消费委托消息
#### a.监听消息队列
##### 1)代码结构:trade/mq/messagetrade
##### 2)实现内容:在mq中配置的消息监听totrade消息,调用匹配委托方法
#### b.匹配委托
##### 1) 代码结构:trade/entrust/tradeserviceimpl/matchExtrustToOrderQueue
##### 2)实现内容
###### i 判断委托时间,为空撤销委托。
###### ii 判断匹配计划,如果为空,初始化匹配计划。
###### iii 初始化计划委托。
###### iv 判断余额是否足够。
###### v 生产委托单号
###### vi 调用匹配委托接口。
#### c.初始化计划委托
##### 1)代码结构:trade/entrust/tradeserviceimpl/initplan
##### 2)实现内容:
###### i 判断是正常委托还是计划委托。
###### ii 如果是正常委托设置为已触发,如果是计划委托根据触发价和当前价格关系设置其triggrcompareprice字段为1或者2(代表大于当前价或者小于当前价的触发条件标识),相等返回错误。
#### d.匹配委托接口
##### 1)代码结构:trade/entrust/tradeserviceimpl/matchExtrustToOrder
##### 2)实现内容:
###### i 判断是否触发过,没有则先进行触发。
###### ii 判断买卖状态调用不同接口
#### e.触发委托
##### 1)代码结构:trade/entrust/tradeserviceimpl/dealNoTrigger
##### 2)实现内容:
###### i 判断委托单状态,推送委托单中用户的资金变化到消息队列中
###### ii 将委托单存入触发中委托单列表
#### f.消费资金变化
##### 1)代码结构:trade/entrust/serice/impl/TradeserviceImpl/accountaddqueue
##### 2)实现内容
###### i 判断账户是否有空,如果有则直接返回。
###### ii 根据accountId排序
###### iii 查询redis中账户信息,并且更新。
#### g.买委托交易
##### 1)代码结构:trade/entrust/tradeserviceimpl/buyExchange
##### 2)实现内容:
###### i 获取所有价格低于key列表 (key= 为交易对+相反的交易类型+价格)
###### ii 循环获取每个对应价格的委托单列表循环调用匹配接口
#### h.匹配委托
##### 1)代码结构:trade/entrust/tradeserviceimpl/matching
##### 2)实现内容
###### i 获取交易数量,对比买委托和卖委托的交易数量取最小值
###### ii 判断剩余委托金额,为0 则返回
###### iii 确定交易价格为最低的价格
###### iv 调用匹配完成处理接口
#### i. 匹配完成后处理
##### 1)代码结构:trade/entrust/tradeserviceimpl/dealmatchend
##### 2)实现内容:
###### i 创建交易订单
###### ii 更新买卖委托的信息,剩余数量、剩余金额如果剩余数量为0则设置委托状态为已完成。
#### j. 资金转移接口
##### 1)代码结构:trade/entrust/tradeserviceimpl/deductMoney
##### 2)实现内容:根据委托是法币或数字货币或者是否带杠杆,调用不同接口,现阶段我们只会调用一个接口,调用deductMoneyByExDigita接口
#### k. 资金扣除接口
##### 1)代码结构:trade/entrust/tradeserviceimpl/deductMoneyByExDigita
##### 2)实现内容
###### i 计算买家委托和当次交易金额的差,做钱包解冻操作。
###### ii增加卖家热钱包交易金额,卖家热钱包减去手续费。买家增加代币、卖家减去代币、设置买卖委托单的手续费
###### iii调用单次匹配结束接口,修改实例的订单列表和账户金额改变列表。
#### l.匹配完成结束处理
##### 1)代码结构:trade/model/traderedis/matchOneEnd
##### 2)实现内容:
###### i 传入参数为:账户冻结列表,委托,map结构(key: 交易对+价格,value: 委托列表)、匹配完成列表、最新成交价格
###### ii添加冻结列表到aaddlist
###### iii 增加委托到匹配过委托列表
###### iv 修改redis中(key:交易对+价格,value:价格)值
###### v 推送aaddlist列表到消息队列,修改账户消息
###### vi 修改交易对最新价格。
###### vii 修改用户完成的委托列表信息
###### viii 修改K线数据
###### ix 清空aaddlist(账户变动列表)和eoinfolists (匹配成功订单列表)
###### x 将交易对标识设为1这里不知道意义。
#### j.没有匹配委托处理
##### 1)代码结构:trade/entrust/tradeserviceimpl/dealFundNoMatch
##### 2)实现内容:
###### i 将委托put进个人委托列表中
###### ii 冻结委托金额
###### iii 将委托单存入以改变委托单列表中。