取消订单
# OTC取消订单功能
## 功能简介
 用户取消正在进行的订单。
## 代码流程
1. 用户取消订单
1. 用户取消订单接口
1.  接口:app/releaseAdvertisement/otcapptransaction/cancleOrder
2.  代码结构:hry/app/otc/ReleaseAdvertisementMobileController/cancleOrder
3.  实现内容:
1. 判断用户是否登录。然后判断操作订单的人是否在操作自己的订单。
2. 调用"cancleOrder"取消订单核心方法。此方法里面加了redis分布式锁。
3. 释放redis分布式锁,返回信息。
2. 取消订单核心方法
1.  代码结构:hry/otc/remote/RemoteAdvertisementServiceImpl/cancleOrder
2.  实现内容:
1. 在redis里面设置一个防止重复取消锁。<br>`Long setnx = redisService.setnx("orderNo:" + tradeNum, "1");`<br>拿到锁资源以后把锁设为5秒过期。
2. 判断订单的状态。为"5"返回不能重复取消。状态为"2"或者"3"的时候将订单状态变为"5"。更新订单信息。将订单信息发送到名为"otc:queue"的redis。同时发布订阅到名为"otcCompletionRate"的redis消息队列,用于计算用户的成交率。
3. 如果订单的总价大于等于广告的单价*百分比汇率。将广告的属性返回到这笔订单发生前的属性。如果最大可交易的币大约等于最小可交易的币则重新开启广告,并且从redis拿到用户钱包信息,以及"otc:ReleaseAdvertisementAfterColse:"将要关闭的订单信息。冻结卖家钱包,删除"otc:ReleaseAdvertisementAfterColse:" redis。更新广告表。
4. 如果是发布的购买广告则不会有冻结币,所以返还步骤3中卖家冻结的币。
5. 删除reids里面的"orderNo:"记录,同时移除redis里面的"otc:tradeNum"订单信息。
6. 判断如果是买家吃卖单取消则增加"otc:cancleOrder:"次数一次,如果超过三次则在"otc:canNotBuy:"中加入标识,禁止用户再买入,持续24小时。