下单功能
# OTC下单功能
## 功能简介
 用户对某条广告进行下单的接口。
## 代码流程
1. 判断用户是否可以交易
1. 判断是否可以交易接口
1.  接口:app/otc/user/releaseadvertisement/isCanTransaction
2.  代码结构:hry/app/otc/ReleaseAdvertisementMobileController
3.  实现内容:
1. 判断用户是否登录。
2. 调用"isCanTransaction"方法。
3. 返回是否可以交易。
2. 判断是否可以交易方法
1.  代码结构:hry/otc/remote/RemoteAdvertisementService/isCanTransaction
2.  实现内容:
1. 查询广告表,判断用户是否有此订单同币种同方向的广告。如果有则不可以进行交易。
2. 查询订单表,判断用户是否有此订单同币种同方向的订单。如果有则不可以进行交易。
3. 返回信息。
2. 用户下单功能
1. 用户下单接口
1.  接口:app/otc/user/releaseadvertisement/tradedetail
2.  代码结构:hry/app/otc/ReleaseAdvertisementMobileController/tradedetail
3.  实现内容:
1. 为卖-吃单的时候,判断当前用户是否添加了支付方式的相关信息。
2. 调用"getMoneyNow"方法计算下单时的实时价格。
3. 判断吃单方向。
4. 调用"buydetail"核心方法,完成下单的数据库主流程,并且加上redis分布式锁。
5. 判断用户信息是否存在。
6. 返回下单的结果信息。释放redis分布式锁"tradedetailLock:"+user.getCustomerId。<br>`redisService.unLock(tradedetailLockKey);`
2. 计算市场价格方法
1.  代码结构:
hry/otc/remote/RemoteAdvertisementServiceImpl/getMoneyNow
2.  实现内容:
1. 从广告表中查询出当前交易广告,拿到溢价。
2. 从redis中拿到"otc:exLawcoin"里面的法币信息。
3. 调用"gitPricenow"得到最新市场价。计算溢价和汇率。
4. 返回计算后的价格。
3. 下单核心方法
1.  代码结构:hry/otc/remote/RemoteAdvertisementServiceImpl/buydetail
2.  实现内容:
1. 添加名为"tradedetailLock:"的分布式锁。
2. 从redis"otc:canNotBuy:"中查询出数据判断用户是否被禁止交易。<br>`String ss = redisService.get("otc:canNotBuy:"+buyId);`
3. 从redis"otc:coinCodeList"中拿到币种的手续费等信息。
4. 调用"getCoinAccountRedis"方法从redis里面拿到用户的钱包信息。判断用户是否有足够的币来进行交易。
5. 查询广告表里面此条广告是否关闭或者交易数量不在范围内。如果广告的最大价格小于市场价的最低限额则关闭此广告。
6. 创建订单对象,将所有订单属性绑定到订单对象。
7. 创建广告对象,算出减去交易金额以后的广告最大金额,绑定其他属性。
8. 判断如果是买单,计算手续费。当本次交易完成广告的最大价格小于市场价的最低限额则临时关闭此广告,并且在"otc:ReleaseAdvertisementAfterColse:"redis里面储存该广告信息30天,等订单完成的时候或者恢复广告的时候删除。<br>`int i=60*60*24*30;`<br>`redisService.save("otc:ReleaseAdvertisementAfterColse:"+otcAppTransaction.getTransactionNum(),releaseAdvertisement.getCoinNumMax().toString(),i);`<br>然后推送对钱包的操作到消息队列,更改用户冷钱包和热钱包的数量。更新广告表中该条广告的信息。将该订单信息存到叫"otc:tradeNum"的redis里面。
9. 判断如果是卖单,计算手续费。并且推送消息队列来冻结卖家将要交易的币。设置订单状态为"2",修改广告表信息,将订单存到叫"otc:tradeNum"的redis里面。
10. 判断用户的支付信息,是否有对应的支付方式。
11. 将订单信息存入数据库。
12. 返回信息。