取消订单

# OTC取消订单功能 ## 功能简介 &#8195;用户取消正在进行的订单。 ## 代码流程 1. 用户取消订单 1. 用户取消订单接口 1. &#8195;接口:app/releaseAdvertisement/otcapptransaction/cancleOrder 2. &#8195;代码结构:hry/app/otc/ReleaseAdvertisementMobileController/cancleOrder 3. &#8195;实现内容: 1. 判断用户是否登录。然后判断操作订单的人是否在操作自己的订单。 2. 调用"cancleOrder"取消订单核心方法。此方法里面加了redis分布式锁。 3. 释放redis分布式锁,返回信息。 2. 取消订单核心方法 1. &#8195;代码结构:hry/otc/remote/RemoteAdvertisementServiceImpl/cancleOrder 2. &#8195;实现内容: 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小时。