Commit 563ef4db by 胡超

Merge remote-tracking branch 'remotes/origin/feature/2020323_1.9.17_rocketmq' into develop

# Conflicts:
#	order-application-service/src/main/resources/application-dev.properties
parents 18ff6800 73cf2012
......@@ -328,6 +328,21 @@
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
</dependency>
......
package cn.freemud.amp;
import cn.freemud.constant.RocketMQConst;
import com.alibaba.fastjson.support.spring.messaging.MappingFastJsonMessageConverter;
import org.apache.rocketmq.acl.common.AclClientRPCHook;
import org.apache.rocketmq.acl.common.SessionCredentials;
import org.apache.rocketmq.client.AccessChannel;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.selector.SelectMessageQueueByHash;
import org.apache.rocketmq.spring.autoconfigure.RocketMQProperties;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
@Configuration
public class RocketMQConfig {
@Resource
private RocketMQProperties rocketMQProperties;
@Bean(name = "deliveryRocketMqTemplate", destroyMethod = "destroy")
public RocketMQTemplate rocketMQTemplate() {
DefaultMQProducer defaultMQProducer = createMQProducer(RocketMQConst.ORDER_THIRD_PUSH_PRODUCER_GROUP);
RocketMQTemplate rocketMQTemplate = new RocketMQTemplate();
rocketMQTemplate.setProducer(defaultMQProducer);
rocketMQTemplate.setMessageConverter(new MappingFastJsonMessageConverter());
rocketMQTemplate.setMessageQueueSelector(new SelectMessageQueueByHash()); // MessageQueueSelector, default SelectMessageQueueByHash
return rocketMQTemplate;
}
/**
* @return
*/
public DefaultMQProducer createMQProducer(String producerGroupName) {
RocketMQProperties.Producer producerConfig = rocketMQProperties.getProducer();
String nameServer = rocketMQProperties.getNameServer();
String groupName = StringUtils.isEmpty(producerGroupName) ? producerConfig.getGroup() : producerGroupName;
Assert.hasText(nameServer, "rocketmq.name-server must not be null");
Assert.hasText(groupName, "rocketmq.producer.group must not be null");
String accessChannel = rocketMQProperties.getAccessChannel();
String accessKey = rocketMQProperties.getProducer().getAccessKey();
String secretKey = rocketMQProperties.getProducer().getSecretKey();
DefaultMQProducer producer = null;
// 密码模式
if (!StringUtils.isEmpty(accessKey) && !StringUtils.isEmpty(secretKey)) {
producer = new DefaultMQProducer(groupName, new AclClientRPCHook(new SessionCredentials(accessKey, secretKey))
, rocketMQProperties.getProducer().isEnableMsgTrace()
, rocketMQProperties.getProducer().getCustomizedTraceTopic());
producer.setVipChannelEnabled(false);
} else {
producer = new DefaultMQProducer(groupName
, rocketMQProperties.getProducer().isEnableMsgTrace()
, rocketMQProperties.getProducer().getCustomizedTraceTopic());
}
producer.setNamesrvAddr(nameServer);
if (!StringUtils.isEmpty(accessChannel)) {
producer.setAccessChannel(AccessChannel.valueOf(accessChannel));
}
producer.setSendMsgTimeout(producerConfig.getSendMessageTimeout());
producer.setRetryTimesWhenSendFailed(producerConfig.getRetryTimesWhenSendFailed());
producer.setRetryTimesWhenSendAsyncFailed(producerConfig.getRetryTimesWhenSendAsyncFailed());
producer.setMaxMessageSize(producerConfig.getMaxMessageSize());
producer.setCompressMsgBodyOverHowmuch(producerConfig.getCompressMessageBodyThreshold());
producer.setRetryAnotherBrokerWhenNotStoreOK(producerConfig.isRetryNextServer());
return producer;
}
}
package cn.freemud.amp.service;
import cn.freemud.amp.config.PushOrderConfig;
import cn.freemud.amqp.Header;
import cn.freemud.amqp.MQAction;
import cn.freemud.amqp.MQMessage;
import cn.freemud.amqp.MQService;
import cn.freemud.constant.RocketMQConst;
import cn.freemud.entities.dto.delivery.CallbackUrlRequestDto;
import com.alibaba.fastjson.JSON;
import com.google.common.base.Throwables;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.MessageConst;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* mq发送方
*/
@Slf4j
@Service
public class ProduceMQService {
@Autowired
private MQService mqService;
@Resource
private RocketMQTemplate deliveryRocketMqTemplate;
/**
* 发送配送状态变更信息
* @param body
* @Description 发现配送信息到rabbitMQ
* @param deliveryRequest
*/
public void sendOfDeliveryInfo(MQMessage body) {
mqService.convertAndSend(PushOrderConfig.EXCHANGE_NAME, PushOrderConfig.OPEN_PLATFORM_ORDER_DELIVERY_ROUTING_KEY, body);
public void sendOfDeliveryInfo(CallbackUrlRequestDto deliveryRequest) {
Header header = new Header(MQAction.UPDATE.getAction(), "delivery/callbackUrl", deliveryRequest.getOrderId(), "open-platform-order-delivery-queue");
MQMessage<CallbackUrlRequestDto> mqMessage = new MQMessage<>(header, deliveryRequest);
mqService.convertAndSend(PushOrderConfig.EXCHANGE_NAME, PushOrderConfig.OPEN_PLATFORM_ORDER_DELIVERY_ROUTING_KEY, mqMessage);
}
/**
* @Description 发送配送信息到rocketMq:
* @param deliveryRequest
*/
public void sendRocketMqOfDeliveryInfo(CallbackUrlRequestDto deliveryRequest) {
Header header = new Header(MQAction.UPDATE.getAction(), "delivery/callbackUrl", deliveryRequest.getOrderId(), RocketMQConst.ORDER_THIRD_PUSH_TOPIC);
MQMessage<CallbackUrlRequestDto> mqMessage = new MQMessage(header, deliveryRequest);
String destination = String.format("%s:%s", RocketMQConst.ORDER_THIRD_PUSH_TOPIC, RocketMQConst.OrderSubsidiaryTag.delivery);
Message message = MessageBuilder
.withPayload(mqMessage)
.setHeader("partnerId", deliveryRequest.getPartnerId())
.setHeader(MessageConst.PROPERTY_KEYS, deliveryRequest.getDeliveryId())
.build();
try {
SendResult sendResult = deliveryRocketMqTemplate.syncSendOrderly(destination, message, deliveryRequest.getOrderId());
log.info("sendDelivery of status:{}, message:{},", sendResult.toString(), JSON.toJSONString(message));
} catch (Exception e) {
log.error("sendDelivery.error, message:{}, cause:{}", JSON.toJSONString(message), Throwables.getStackTraceAsString(e));
}
}
}
package cn.freemud.constant;
/**
* @Description RocketMQ服务配置
* @mark topic 、producerGroup、consumerGroup 最大长度32,格式为 ^[%|a-zA-Z0-9_-]
*/
public class RocketMQConst {
// 订单周边业务(配送、发票)推送开放平台topic
public static final String ORDER_THIRD_PUSH_TOPIC = "order_third_push_topic";
// 订单周边业务(配送、发票)推送开放平台生产者名称
public static final String ORDER_THIRD_PUSH_PRODUCER_GROUP = "order_third_push_producer";
public enum OrderSubsidiaryTag {
delivery, invoice;
}
}
package cn.freemud.controller.test;
import cn.freemud.amp.service.ProduceMQService;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.entities.dto.delivery.CallbackUrlRequestDto;
import cn.freemud.entities.vo.CheckBeforeCreateOrderRequestVo;
import cn.freemud.monitorcenter.tools.HealthUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.freemud.application.sdk.api.log.ApiAnnotation;
import com.freemud.application.sdk.api.log.LogParams;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* All rights Reserved, Designed By www.freemud.com
*
......@@ -63,5 +69,42 @@ public class TestController {
return platformBaseResponse;
}
@Resource
ProduceMQService produceMQService;
@ApiAnnotation(logMessage = "test")
@PostMapping("/test")
public PlatformBaseResponse test(String order,String partnerId,String channel) {
CallbackUrlRequestDto deliveryRequest = buildCallbackUrlRequestDto();
deliveryRequest.setOrderId(order);
deliveryRequest.setPartnerId(partnerId);
deliveryRequest.setChannelCode(channel);
produceMQService.sendRocketMqOfDeliveryInfo(deliveryRequest);
PlatformBaseResponse platformBaseResponse = new PlatformBaseResponse();
platformBaseResponse.setResponseBody(JSON.toJSONString(sendResult));
platformBaseResponse.setStatusCode("100");
return platformBaseResponse;
}
public CallbackUrlRequestDto buildCallbackUrlRequestDto() {
String json = "{\n" +
" \"channelCode\":\"MeiTuan\",\n" +
" \"channelDeliveryId\":\"1584868781086019780\",\n" +
" \"channelName\":\"美团\",\n" +
" \"deliveryId\":\"6913353047542579209b\",\n" +
" \"deliveryStatus\":2,\n" +
" \"orderId\":\"17283381807564801000006\",\n" +
" \"partnerId\":\"1864\",\n" +
" \"riderName\":\"宋**\",\n" +
" \"riderPhone\":\"1782****316\",\n" +
" \"storeId\":\"a785e270-0f67-4805-b3db-6e2604b87909\",\n" +
" \"updateTime\":\"2020-03-22 17:20:45\"\n" +
"}";
CallbackUrlRequestDto callbackUrlRequestDto = JSON.parseObject(json, CallbackUrlRequestDto.class);
return callbackUrlRequestDto;
}
}
......@@ -64,6 +64,11 @@ public enum DeliveryStatus {
return null;
}
/**
* @Description: 校验配送单状态是否需要推送给开放平台
* @param status
* @return
*/
public static boolean checkDeliveryStatueForPlatform(int status) {
DeliveryStatus deliveryStatus = DeliveryStatus.getDeliveryStatusByCode(status);
if (null == deliveryStatus) return false;
......
......@@ -131,9 +131,7 @@ public class ThirdDeliveryServiceImpl implements ThirdDeliveryService {
// 订单配送状态变化时发送到MQ
if (DeliveryStatus.checkDeliveryStatueForPlatform(deliveryStatus)) {
Header header = new Header(MQAction.UPDATE.getAction(), "delivery/callbackUrl", request.getOrderId(), "open-platform-order-delivery-queue");
MQMessage<CallbackUrlRequestDto> message = new MQMessage<>(header, request);
produceMQService.sendOfDeliveryInfo(message);
produceMQService.sendRocketMqOfDeliveryInfo(request);
}
// else {
// return ResponseUtil.error(ResponseResult.SYSTEM_ERROR.getCode(), "订单回调状态有误");
......
......@@ -8,4 +8,4 @@ apollo.meta=http://212.129.229.203
env=dev
apollo.cluster=default
apollo.bootstrap.enabled=true
apollo.bootstrap.namespaces=order_service
apollo.bootstrap.namespaces=micro_progeram_commons,order_service
package cn.freemud.amp.service;
import cn.freemud.amqp.Header;
import cn.freemud.amqp.MQAction;
import cn.freemud.amqp.MQMessage;
import cn.freemud.entities.dto.delivery.CallbackUrlRequestDto;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Random;
@RunWith(SpringRunner.class)
@SpringBootTest
@EnableDiscoveryClient
@EnableFeignClients
@EnableAutoConfiguration
@ActiveProfiles("dev")
@Slf4j
public class ProduceMQServiceTest {
@Autowired
private ProduceMQService produceMQService;
@Test
public void sendOfDeliveryInfo() {
CallbackUrlRequestDto callbackUrlRequestDto = buildCallbackUrlRequestDto();
produceMQService.sendOfDeliveryInfo(callbackUrlRequestDto);
}
@Test
public void send() {
CallbackUrlRequestDto callbackUrlRequestDto = buildCallbackUrlRequestDto();
produceMQService.sendRocketMqOfDeliveryInfo(callbackUrlRequestDto);
}
public MQMessage buildMQMessage() {
MQMessage body = new MQMessage();
Header header = new Header(MQAction.UPDATE.getAction(), "order-application-service", "orderId", "ORDER_DELIVERY");
body.setHeader(header);
CallbackUrlRequestDto callbackUrlRequestDto = buildCallbackUrlRequestDto();
Random random = new Random(System.currentTimeMillis());
callbackUrlRequestDto.setDeliveryStatus(random.nextInt(8) + 1);
body.setBody(callbackUrlRequestDto);
return body;
}
public CallbackUrlRequestDto buildCallbackUrlRequestDto() {
String json = "{\n" +
" \"channelCode\":\"MeiTuan\",\n" +
" \"channelDeliveryId\":\"1584868781086019780\",\n" +
" \"channelName\":\"美团\",\n" +
" \"deliveryId\":\"6913353047542579209b\",\n" +
" \"deliveryStatus\":2,\n" +
" \"orderId\":\"17283381807564801000006\",\n" +
" \"partnerId\":\"1864\",\n" +
" \"riderName\":\"宋**\",\n" +
" \"riderPhone\":\"1782****316\",\n" +
" \"storeId\":\"a785e270-0f67-4805-b3db-6e2604b87909\",\n" +
" \"updateTime\":\"2020-03-22 17:20:45\"\n" +
"}";
CallbackUrlRequestDto callbackUrlRequestDto = JSON.parseObject(json, CallbackUrlRequestDto.class);
return callbackUrlRequestDto;
}
}
......@@ -79,6 +79,7 @@ public class DefaultPromotionService implements IPromotionService {
shoppingCartGoodsDto.setOriginalTotalAmount(shoppingCartGoodsResponseVo.getOriginalTotalAmount());
shoppingCartGoodsDto.setTotalAmount(shoppingCartGoodsResponseVo.getTotalAmount());
shoppingCartGoodsDto.setTotalDiscountAmount(shoppingCartGoodsResponseVo.getTotalDiscountAmount());
// todo 包装费
shoppingCartGoodsDto.setPackageAmount(shoppingCartGoodsResponseVo.getNewPackAmount());
List<CartGoods> cartGoodsList = shoppingCartGoodsResponseVo.getProducts();
List<ActivityCalculationDiscountResponseDto.CalculationDiscountResult.ApportionGoods> apportionGoodsList =
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment