diff --git a/mall-portal/pom.xml b/mall-portal/pom.xml index c9c249c..9c3e656 100644 --- a/mall-portal/pom.xml +++ b/mall-portal/pom.xml @@ -81,6 +81,17 @@ druid-spring-boot-starter 1.1.10 + + + org.springframework.boot + spring-boot-starter-amqp + + + + org.projectlombok + lombok + true + diff --git a/mall-portal/src/main/java/com/macro/mall/portal/component/CancelOrderReceiver.java b/mall-portal/src/main/java/com/macro/mall/portal/component/CancelOrderReceiver.java new file mode 100644 index 0000000..a3158f2 --- /dev/null +++ b/mall-portal/src/main/java/com/macro/mall/portal/component/CancelOrderReceiver.java @@ -0,0 +1,26 @@ +package com.macro.mall.portal.component; + +import com.macro.mall.portal.service.OmsPortalOrderService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 取消订单消息的处理者 + * Created by macro on 2018/9/14. + */ +@Component +@RabbitListener(queues = "${rabbitmq.queue.name.cancelOrder}") +public class CancelOrderReceiver { + private static Logger LOGGER =LoggerFactory.getLogger(CancelOrderReceiver.class); + @Autowired + private OmsPortalOrderService portalOrderService; + @RabbitHandler + public void process(Long orderId){ + portalOrderService.cancelOrder(orderId); + LOGGER.info("process orderId:{}",orderId); + } +} diff --git a/mall-portal/src/main/java/com/macro/mall/portal/component/CancelOrderSender.java b/mall-portal/src/main/java/com/macro/mall/portal/component/CancelOrderSender.java new file mode 100644 index 0000000..3225a33 --- /dev/null +++ b/mall-portal/src/main/java/com/macro/mall/portal/component/CancelOrderSender.java @@ -0,0 +1,26 @@ +package com.macro.mall.portal.component; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.core.AmqpTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * 取消订单消息的发出者 + * Created by macro on 2018/9/14. + */ +@Component +public class CancelOrderSender { + private static Logger LOGGER =LoggerFactory.getLogger(CancelOrderSender.class); + @Value("${rabbitmq.queue.name.cancelOrder}") + private String QUEUE_NAME_CANCEL_ORDER; + @Autowired + private AmqpTemplate amqpTemplate; + + public void send(Long orderId){ + amqpTemplate.convertAndSend(QUEUE_NAME_CANCEL_ORDER,orderId); + LOGGER.info("send orderId:{}",orderId); + } +} diff --git a/mall-portal/src/main/java/com/macro/mall/portal/config/RabbitMqConfig.java b/mall-portal/src/main/java/com/macro/mall/portal/config/RabbitMqConfig.java new file mode 100644 index 0000000..0b1e0d9 --- /dev/null +++ b/mall-portal/src/main/java/com/macro/mall/portal/config/RabbitMqConfig.java @@ -0,0 +1,23 @@ +package com.macro.mall.portal.config; + +import org.springframework.amqp.core.Queue; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 消息队列配置 + * Created by macro on 2018/9/14. + */ +@Configuration +public class RabbitMqConfig { + @Value("${rabbitmq.queue.name.cancelOrder}") + private String QUEUE_NAME_CANCEL_ORDER; + /** + * 超时取消订单的消息 + */ + @Bean + public Queue cancelOrderQueue(){ + return new Queue(QUEUE_NAME_CANCEL_ORDER); + } +} diff --git a/mall-portal/src/main/java/com/macro/mall/portal/controller/OmsPortalOrderController.java b/mall-portal/src/main/java/com/macro/mall/portal/controller/OmsPortalOrderController.java index 8a13f24..c12594d 100644 --- a/mall-portal/src/main/java/com/macro/mall/portal/controller/OmsPortalOrderController.java +++ b/mall-portal/src/main/java/com/macro/mall/portal/controller/OmsPortalOrderController.java @@ -1,5 +1,6 @@ package com.macro.mall.portal.controller; +import com.macro.mall.portal.component.CancelOrderSender; import com.macro.mall.portal.domain.CommonResult; import com.macro.mall.portal.domain.ConfirmOrderResult; import com.macro.mall.portal.domain.OrderParam; @@ -20,6 +21,8 @@ import org.springframework.web.bind.annotation.*; public class OmsPortalOrderController { @Autowired private OmsPortalOrderService portalOrderService; + @Autowired + private CancelOrderSender cancelOrderSender; @ApiOperation("根据购物车信息生成确认单信息") @RequestMapping(value = "/generateConfirmOrder",method = RequestMethod.POST) @ResponseBody @@ -47,4 +50,12 @@ public class OmsPortalOrderController { public Object cancelTimeOutOrder(){ return portalOrderService.cancelTimeOutOrder(); } + + @ApiOperation("取消单个超时订单") + @RequestMapping(value = "/cancelOrder",method = RequestMethod.POST) + @ResponseBody + public Object cancelOrder(Long orderId){ + cancelOrderSender.send(orderId); + return new CommonResult().success(null); + } } diff --git a/mall-portal/src/main/java/com/macro/mall/portal/domain/QueueEnum.java b/mall-portal/src/main/java/com/macro/mall/portal/domain/QueueEnum.java new file mode 100644 index 0000000..a18d45e --- /dev/null +++ b/mall-portal/src/main/java/com/macro/mall/portal/domain/QueueEnum.java @@ -0,0 +1,38 @@ +package com.macro.mall.portal.domain; + +import lombok.Getter; + +/** + * 消息队列枚举配置 + * Created by macro on 2018/9/14. + */ +@Getter +public enum QueueEnum { + /** + * 消息通知队列 + */ + MESSAGE_QUEUE_ORDER("mall.order.direct", "mall.order.cancel", "mall.order.cancel"), + /** + * 消息通知ttl队列 + */ + MESSAGE_TTL_QUEUE_ORDER("mall.order.topic.ttl", "mall.order.cancel.ttl", "mall.order.cancel.ttl"); + + /** + * 交换名称 + */ + private String exchange; + /** + * 队列名称 + */ + private String name; + /** + * 路由键 + */ + private String routeKey; + + QueueEnum(String exchange, String name, String routeKey) { + this.exchange = exchange; + this.name = name; + this.routeKey = routeKey; + } +} diff --git a/mall-portal/src/main/java/com/macro/mall/portal/service/OmsPortalOrderService.java b/mall-portal/src/main/java/com/macro/mall/portal/service/OmsPortalOrderService.java index 059d70a..a67ef96 100644 --- a/mall-portal/src/main/java/com/macro/mall/portal/service/OmsPortalOrderService.java +++ b/mall-portal/src/main/java/com/macro/mall/portal/service/OmsPortalOrderService.java @@ -32,4 +32,10 @@ public interface OmsPortalOrderService { */ @Transactional CommonResult cancelTimeOutOrder(); + + /** + * 取消单个超时订单 + */ + @Transactional + void cancelOrder(Long orderId); } diff --git a/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPortalOrderServiceImpl.java b/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPortalOrderServiceImpl.java index 720539f..7ae3e5e 100644 --- a/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPortalOrderServiceImpl.java +++ b/mall-portal/src/main/java/com/macro/mall/portal/service/impl/OmsPortalOrderServiceImpl.java @@ -2,6 +2,7 @@ package com.macro.mall.portal.service.impl; import com.macro.mall.mapper.*; import com.macro.mall.model.*; +import com.macro.mall.portal.component.CancelOrderSender; import com.macro.mall.portal.dao.PortalOrderDao; import com.macro.mall.portal.dao.PortalOrderItemDao; import com.macro.mall.portal.dao.SmsCouponHistoryDao; @@ -51,6 +52,9 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService { private PortalOrderDao portalOrderDao; @Autowired private OmsOrderSettingMapper orderSettingMapper; + @Autowired + private OmsOrderItemMapper orderItemMapper; + @Override public ConfirmOrderResult generateConfirmOrder() { ConfirmOrderResult result = new ConfirmOrderResult(); @@ -259,6 +263,35 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService { return new CommonResult().success(null); } + @Override + public void cancelOrder(Long orderId) { + //查询为付款的取消订单 + OmsOrderExample example = new OmsOrderExample(); + example.createCriteria().andIdEqualTo(orderId).andStatusEqualTo(0).andDeleteStatusEqualTo(0); + List cancelOrderList = orderMapper.selectByExample(example); + if(CollectionUtils.isEmpty(cancelOrderList)){ + return; + } + OmsOrder cancelOrder = cancelOrderList.get(0); + if(cancelOrder!=null){ + //修改订单状态为取消 + cancelOrder.setStatus(4); + orderMapper.updateByPrimaryKeySelective(cancelOrder); + OmsOrderItemExample orderItemExample=new OmsOrderItemExample(); + orderItemExample.createCriteria().andOrderIdEqualTo(orderId); + List orderItemList = orderItemMapper.selectByExample(orderItemExample); + //解除订单商品库存锁定 + portalOrderDao.releaseSkuStockLock(orderItemList); + //修改优惠券使用状态 + updateCouponStatus(cancelOrder.getCouponId(),cancelOrder.getMemberId(),0); + //返还使用积分 + if(cancelOrder.getUseIntegration()!=null){ + UmsMember member = memberService.getById(cancelOrder.getMemberId()); + memberService.updateIntegration(cancelOrder.getMemberId(),member.getIntegration()+cancelOrder.getUseIntegration()); + } + } + } + /** * 生成18位订单编号:8位日期+2位平台号码+2位支付方式+6位以上自增id */ diff --git a/mall-portal/src/main/resources/application-dev.properties b/mall-portal/src/main/resources/application-dev.properties index 9049ed3..8bbf4ec 100644 --- a/mall-portal/src/main/resources/application-dev.properties +++ b/mall-portal/src/main/resources/application-dev.properties @@ -60,3 +60,11 @@ spring.redis.pool.min-idle=0 spring.redis.timeout=0 #===redis end=== +#===rabbitMq start=== +spring.rabbitmq.host=localhost +spring.rabbitmq.port=5672 +spring.rabbitmq.virtual-host=/mall +spring.rabbitmq.username=mall +spring.rabbitmq.password=mall +#===rabbitMq end=== + diff --git a/mall-portal/src/main/resources/application.properties b/mall-portal/src/main/resources/application.properties index feceec7..f62cb2e 100644 --- a/mall-portal/src/main/resources/application.properties +++ b/mall-portal/src/main/resources/application.properties @@ -15,3 +15,9 @@ redis.key.prefix.orderId=portal:orderId: authCode.expire.seconds=90 #===redis custom key end=== +#===rabbitmq queue name start=== +rabbitmq.queue.name.cancelOrder="cancelOrderQueue" +#===rabbitmq queue name end=== + + +