Commit 9c8277c8 by 姜海波

更新最新master代码

parent 5fc4c4d2
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>platform-order-service</artifactId>
<dependencies>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>com.freemud.application.service.sdk</groupId>
<artifactId>sdk-common-base</artifactId>
<version>1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.freemud.sdk.api.assortment</groupId>
<artifactId>assortment-data-manager</artifactId>
<version>3.2.RELEASE</version>
</dependency>
<!--引入eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<artifactId>membercenter-sdk</artifactId>
<groupId>com.freemud.application.service.sdk</groupId>
<version>2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.freemud.application.service.sdk</groupId>
<artifactId>membercenter-sdk</artifactId>
<version>2.3.6-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.freemud.application.service.sdk</groupId>
<artifactId>storecenter-sdk</artifactId>
<version>1.4.RELEASE</version>
</dependency>
<!-- 聚合订单sdk -->
<dependency>
<artifactId>assortment-ordercenter-sdk</artifactId>
<groupId>cn.freemud</groupId>
<version>1.0.0</version>
</dependency>
<!-- 邮件sdk -->
<!--<dependency>-->
<!--<artifactId>commons-amqp</artifactId>-->
<!--<groupId>cn.freemud.commons</groupId>-->
<!--<version>1.4.12-release</version>-->
<!--</dependency>-->
<dependency>
<groupId>com.freemud.sdk.api.assortment</groupId>
<artifactId>assortment-orderdistributor-sdk</artifactId>
<version>2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.freemud.sdk.api.assortment</groupId>
<artifactId>assortment-payment-sdk</artifactId>
<version>2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.freemud.application.service.sdk</groupId>
<artifactId>paymentcenter-sdk</artifactId>
<version>2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.0</version>
</dependency>
<!--健康检查-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.freemud.application.service.sdk</groupId>
<artifactId>promotioncenter-sdk</artifactId>
<version>2.0.RELEASE</version>
</dependency>
<!--<dependency>-->
<!--<groupId>com.freemud.sdk.components</groupId>-->
<!--<artifactId>common-components-sdk</artifactId>-->
<!--<version>1.0.0-SNAPSHOT</version>-->
<!--</dependency>-->
<dependency>
<groupId>com.freemud.sdk.api.assortment</groupId>
<artifactId>assortment-messagepush-sdk</artifactId>
<version>2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>cn.freemud</groupId>
<artifactId>monitor-tools</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>com.freemud.application.service.sdk</groupId>
<artifactId>membercenter-sdk</artifactId>
<version>2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>com.freemud.application.service.sdk</groupId>
<artifactId>stockcenter-sdk</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
<dependency>
<artifactId>structure-center-sdk</artifactId>
<groupId>com.freemud.application.service.sdk</groupId>
<version>1.2-SNAPSHOT</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
<repositories>
<repository>
<id>public</id>
<name>public Repository</name>
<url>http://115.159.2.190:7654/nexus/content/groups/public/</url>
</repository>
<repository>
<id>freemud-hosted-release</id>
<name>freemud-hosted-release</name>
<url>http://115.159.2.190:7654/nexus/content/repositories/freemud-hosted-release/</url>
</repository>
<repository>
<id>spring-libs-release</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/libs-release</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
\ No newline at end of file
package com.freemud.platform.amp.constant;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: ${FILE_NAME}
* @Package com.freemud.mail.core
* @Description: ${TODO}(用一句话描述该文件做什么)
* @author: aiqi.gong
* @date: 2019/3/21 15:16
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
public class QueueMetadata {
public static final String EXCHANGE_NAME = "topic-Exchange";
public static class Email {
public static final String EMAIL_QUEUE_NAME = "mail-alert-queue";
public static final String EMAIL_QUEUE_NAME_ROUTING_KEY = "mail-alert-queue-routing-key";
}
public static class Order {
public static final String QUEUE_NAME = "push-order-queue";
public static final String QUEUE_NAME_ROUTING_KEY = "push-order-queue-routing-key";
public static final String OPEN_QUEUE_NAME = "open-push-order-queue";
public static final String OPEN_QUEUE_NAME_ROUTING_KEY = "open-push-order-queue-routing-key";
//开放平台
public static final String OPEN_PLATFORM_ORDER_STATUS_CHANGE_PUSH_QUEUE_NAME = "open-platform-order-status-change-push-queue";
public static final String OPEN_PLATFORM_ORDER_STATUS_CHANGE_PUSH_ROUTING_KEY = "open-platform-order-status-change-routing-key";
public static final String OPEN_PLATFORM_ORDER_STATUS_CHANGE_PUSH_DL_QUEUE_NAME = "open-platform-order-status-change-push-dl-queue";
public static final String OPEN_PLATFORM_ORDER_STATUS_CHANGE_PUSH_DL_ROUTING_KEY = "open-platform-order-status-change-dl-routing-key";
public static final String OPEN_PLATFORM_ORDER_DIVER_PUSH_QUEUE_NAME = "open-platform-order-diver-push-queue";
public static final String OPEN_PLATFORM_ORDER_DIVER_PUSH_ROUTING_KEY = "open-platform-order-diver-routing-key";
}
public static class Member {
public static final String MEMBER_QUEUE = "push-member-queue";
public static final String MEMBER_NAME_ROUTING_KEY = "push-member-queue-routing-key";
public static final String MEMBER_DL_QUEUE = "push-member-dead-letter-queue";
public static final String MEMBER_DL_NAME_ROUTING_KEY = "push-member-dead-letter-queue-routing-key";
}
public static class Score {
public static final String SCORE_QUEUE_NAME = "send_score_queue";
public static final String SCORE_QUEUE_NAME_ROUTING_KEY = "send_score_key";
}
public static class WechatPush {
public static final String WECHAT_QUEUE_NAME = "wechat_queue";
public static final String WECHAT_QUEUE_NAME_ROUTING_KEY = "wechat_key";
}
public static class SendExperience {
public static final String EXPERIENCE_QUEUE_NAME = "send_experience_queue";
public static final String EXPERIENCE_QUEUE_NAME_ROUTING_KEY = "send_experience_key";
}
/**
* 本地调试使用
*/
public static class LocalSendScore {
public static final String QUEUE_NAME = "local-send-score-queue";
public static final String QUEUE_NAME_ROUTING_KEY = "local-send-score-queue-routing-key";
}
/**
* 自动屡单业务队列
*/
public static class OrderAutomaticExecute {
public static final String ORDER_AUTOMATIC_EXECUTE_QUEUE_NAME = "order_automatic_execute";
public static final String ORDER_AUTOMATIC_EXECUTE_QUEUE_NAME_ROUTING_KEY = "order_automatic_execute_routing_key";
public static class OrderAutomaticMakeFinishedAutomaticExecuteLetterQueue {
public static final String ORDER_MAKE_FINISHED_DEAD_LETTER_QUEUE_NAME = "order_automatic_make_finished_dead_letter_queue_name";
public static final String ORDER_MAKE_FINISHED_DEAD_LETTER_QUEUE_NAME_ROUTING_KEY = "order_automatic_make_finished_dead_letter_routing_key";
}
public static class OrderAutomaticCompleteAutomaticExecuteLetterQueue {
public static final String ORDER_COMPLETE_DEAD_LETTER_QUEUE_NAME = "order_automatic_complete_dead_letter_queue_name";
public static final String ORDER_COMPLETE_DEAD_LETTER_QUEUE_NAME_ROUTING_KEY = "order_automatic_complete_dead_letter_routing_key";
}
}
}
package com.freemud.platform.amp.order;
import cn.freemud.amqp.config.MQConfig;
import com.freemud.platform.amp.constant.QueueMetadata;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import java.util.HashMap;
import java.util.Map;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: ${FILE_NAME}
* @Package com.freemud.mail.core
* @Description: ${TODO}(用一句话描述该文件做什么)
* @author: aiqi.gong
* @date: 2019/5/23 15:18
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@AutoConfigureAfter(MQConfig.class)
public class OrderAmpConfig {
// /**
// * 定义基于Fanout 的Exchange。
// * 基于这个代码,也可以非常方便的定义其他的Exchange类型。
// *
// * @return Fanout Exchange
// */
// @ConditionalOnMissingBean
// @Bean
// public Exchange topicExchange() {
// return ExchangeBuilder.topicExchange(QueueMetadata.EXCHANGE_NAME).durable(true).build();
// }
/**
* 写入RabbitMQ使用的默认队列
*
* @return
*/
@Bean("orderAutomaticExecute")
public Queue orderAutomaticExecute() {
return QueueBuilder.durable(QueueMetadata.OrderAutomaticExecute.ORDER_AUTOMATIC_EXECUTE_QUEUE_NAME).build();
}
/**
* 绑定消息队列
*
* @param queue 消息队列
* @param topicExchange RabbitMQ Fanout Exchange
* @return 消息队列绑定
*/
@Bean("bindingOrderAutomaticExecute")
Binding bindingOrderAutomaticExecute(@Qualifier("orderAutomaticExecute") Queue queue, @Qualifier("orderPushTopicExchange") Exchange topicExchange) {
return BindingBuilder.bind(queue).to(topicExchange).with(QueueMetadata.OrderAutomaticExecute.ORDER_AUTOMATIC_EXECUTE_QUEUE_NAME_ROUTING_KEY).noargs();
}
@Bean("makeFinishedDeadLetterQueue")
public Queue makeFinishedDeadLetterQueue() {
Map<String, Object> args = new HashMap<>(2);
args.put("x-dead-letter-exchange", QueueMetadata.EXCHANGE_NAME);
args.put("x-dead-letter-routing-key", QueueMetadata.OrderAutomaticExecute.ORDER_AUTOMATIC_EXECUTE_QUEUE_NAME_ROUTING_KEY);
return QueueBuilder.durable(QueueMetadata.OrderAutomaticExecute.OrderAutomaticMakeFinishedAutomaticExecuteLetterQueue.ORDER_MAKE_FINISHED_DEAD_LETTER_QUEUE_NAME).withArguments(args).build();
}
@Bean("makeFinishedDeadLetterToOrderAutomaticExecute")
public Binding makeFinishedDeadLetterToOrderAutomaticExecute(@Qualifier("makeFinishedDeadLetterQueue") Queue queue, @Qualifier("orderPushTopicExchange") Exchange topicExchange) {
Map<String, Object> args = new HashMap<>(2);
args.put("x-dead-letter-exchange", QueueMetadata.EXCHANGE_NAME);
args.put("x-dead-letter-routing-key", QueueMetadata.OrderAutomaticExecute.ORDER_AUTOMATIC_EXECUTE_QUEUE_NAME_ROUTING_KEY);
return BindingBuilder.bind(queue).to(topicExchange).with(QueueMetadata.OrderAutomaticExecute.OrderAutomaticMakeFinishedAutomaticExecuteLetterQueue.ORDER_MAKE_FINISHED_DEAD_LETTER_QUEUE_NAME_ROUTING_KEY).and(args);
}
@Bean("completeDeadLetterQueue")
public Queue completeDeadLetterQueue() {
Map<String, Object> args = new HashMap<>(2);
args.put("x-dead-letter-exchange", QueueMetadata.EXCHANGE_NAME);
args.put("x-dead-letter-routing-key", QueueMetadata.OrderAutomaticExecute.ORDER_AUTOMATIC_EXECUTE_QUEUE_NAME_ROUTING_KEY);
return QueueBuilder.durable(QueueMetadata.OrderAutomaticExecute.OrderAutomaticCompleteAutomaticExecuteLetterQueue.ORDER_COMPLETE_DEAD_LETTER_QUEUE_NAME).withArguments(args).build();
}
@Bean("completeDeadLetterToOrderAutomaticExecute")
public Binding completeDeadLetterToOrderAutomaticExecute(@Qualifier("completeDeadLetterQueue") Queue queue, @Qualifier("orderPushTopicExchange") Exchange topicExchange) {
Map<String, Object> args = new HashMap<>(2);
args.put("x-dead-letter-exchange", QueueMetadata.EXCHANGE_NAME);
args.put("x-dead-letter-routing-key", QueueMetadata.OrderAutomaticExecute.ORDER_AUTOMATIC_EXECUTE_QUEUE_NAME_ROUTING_KEY);
return BindingBuilder.bind(queue).to(topicExchange).with(QueueMetadata.OrderAutomaticExecute.OrderAutomaticCompleteAutomaticExecuteLetterQueue.ORDER_COMPLETE_DEAD_LETTER_QUEUE_NAME_ROUTING_KEY).and(args);
}
}
package com.freemud.platform.amp.order;
import cn.freemud.amqp.MQMessage;
import com.alibaba.fastjson.JSON;
import com.freemud.platform.amp.constant.QueueMetadata;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: ${FILE_NAME}
* @Package com.freemud.mail.core
* @Description: ${TODO}(用一句话描述该文件做什么)
* @author: aiqi.gong
* @date: 2019/5/23 16:21
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@ImportAutoConfiguration(classes = {OrderAmpConfig.class})
public class OrderAmpService {
@Autowired
private RabbitTemplate rabbitTemplate;
// @Autowired
// private OrderDistributionService orderDistributionService;
public void convertAndSend(String orderCode) {
MQMessage<OrderAutomaticBody> mqMessage = buildOrderBody(orderCode);
rabbitTemplate.convertAndSend(QueueMetadata.EXCHANGE_NAME,QueueMetadata.OrderAutomaticExecute.ORDER_AUTOMATIC_EXECUTE_QUEUE_NAME_ROUTING_KEY, mqMessage);
}
public void convertAndSendToMake(String partnerId,String orderCode, long ttl) {
MQMessage<OrderAutomaticBody> mqMessage = buildOrderBody(orderCode);
mqMessage.getBody().setOrderStatus(OrderAutomaticBody.OpOrderStatus.COMPLETE_MAKE.getCode());
mqMessage.getBody().setPartnerId(partnerId);
rabbitTemplate.convertAndSend(QueueMetadata.EXCHANGE_NAME,QueueMetadata.OrderAutomaticExecute.OrderAutomaticMakeFinishedAutomaticExecuteLetterQueue.ORDER_MAKE_FINISHED_DEAD_LETTER_QUEUE_NAME_ROUTING_KEY, mqMessage, buildOrderMessagePostProcessor(ttl));
}
public void convertAndSendToComplete(String partnerId,String orderCode, long ttl) {
MQMessage<OrderAutomaticBody> mqMessage = buildOrderBody(orderCode);
mqMessage.getBody().setOrderStatus(OrderAutomaticBody.OpOrderStatus.COMPLETE.getCode());
mqMessage.getBody().setPartnerId(partnerId);
rabbitTemplate.convertAndSend(QueueMetadata.EXCHANGE_NAME,QueueMetadata.OrderAutomaticExecute.OrderAutomaticCompleteAutomaticExecuteLetterQueue.ORDER_COMPLETE_DEAD_LETTER_QUEUE_NAME_ROUTING_KEY, mqMessage, buildOrderMessagePostProcessor(ttl));
}
private MQMessage<OrderAutomaticBody> buildOrderBody(String orderCode) {
MQMessage<OrderAutomaticBody> mqMessage = new MQMessage<>();
OrderAutomaticBody messageBode = new OrderAutomaticBody();
messageBode.setOrderCode(orderCode);
mqMessage.setBody(messageBode);
return mqMessage;
}
// public void messageDistribute(SendScoreDistributeOrderBody sendScoreDistributeOrderBody){
// DisRequest disRequest = new DisRequest();
// disRequest.setPartnerId(sendScoreDistributeOrderBody.getOrderBean().getCompanyId());
// disRequest.setStatus(sendScoreDistributeOrderBody.getOrderBean().getStatus().toString());
// disRequest.setVer("1");
// disRequest.setExtJson(JSONObject.toJSONString(sendScoreDistributeOrderBody));
// orderDistributionService.pushOrder(disRequest);
// }
/**
* 单位秒
*
* @param expiration
*/
private MessagePostProcessor buildOrderMessagePostProcessor(long expiration) {
MessagePostProcessor messagePostProcessor = message -> {
MessageProperties messageProperties = message.getMessageProperties();
// 设置编码
messageProperties.setContentEncoding("utf-8");
// 设置过期时间10*1000毫秒(最终过期时间取x-message-ttl和messageProperties.setExpiration的最小值
messageProperties.setExpiration(String.valueOf(expiration * 1000));
return message;
};
return messagePostProcessor;
}
public void sendOrderStatusChangeDelayNotifyMsg(MQMessage notifyMsg, String expire, String delayKey) {
byte[] notifyMsgBytes = JSON.toJSONString(notifyMsg).getBytes();
MessageProperties messageProperties = new MessageProperties();
messageProperties.setExpiration(expire);
messageProperties.setContentType(MessageProperties.CONTENT_TYPE_JSON);
Message message = new Message(notifyMsgBytes, messageProperties);
rabbitTemplate.convertAndSend(QueueMetadata.EXCHANGE_NAME, delayKey, message);
}
}
package com.freemud.platform.amp.order;
import lombok.Data;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: ${FILE_NAME}
* @Package com.freemud.mail.core
* @Description: ${TODO}(用一句话描述该文件做什么)
* @author: aiqi.gong
* @date: 2019/5/23 16:10
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Data
public class OrderAutomaticBody {
/**
* 订单号
*/
private String orderCode;
private Integer orderStatus;
private String partnerId;
public enum OpOrderStatus {
COMPLETE(5, "完成"),
COMPLETE_MAKE(31, "制作完成");
private Integer code;
private String desc;
OpOrderStatus(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
}
package com.freemud.platform.amp.order;
import cn.freemud.amqp.config.MQConfig;
import com.freemud.platform.amp.constant.QueueMetadata;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import java.util.HashMap;
import java.util.Map;
/**
* All rights Reserved, Designed By www.freemud.com
*
* @version V1.0
* @Title:
* @Package: com.freemud.platform.amp.order
* @Descripttion:
* @author: shuhu.hou
* @date: 2019/7/7
* @Copyright: 2017 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目.
*/
@AutoConfigureAfter(MQConfig.class)
public class OrderStatusChangePushConfig {
@Bean("orderStatusChangeTopicExchange")
public Exchange orderStatusChangeTopicExchange() {
return ExchangeBuilder.topicExchange(QueueMetadata.EXCHANGE_NAME).durable(true).build();
}
/**
* 写入RabbitMQ使用的默认队列
*
* @return
*/
@Bean("orderStatusChangeQueue")
public Queue orderStatusChangeQueue() {
return QueueBuilder.durable(QueueMetadata.Order.OPEN_PLATFORM_ORDER_STATUS_CHANGE_PUSH_QUEUE_NAME).build();
}
@Bean("orderStatusChangeDlQueue")
public Queue orderStatusChangeDlQueue() {
Map<String, Object> delayQueueParams = new HashMap<>(2);
// DLX,dead letter发送到的exchange
delayQueueParams.put("x-dead-letter-exchange", QueueMetadata.EXCHANGE_NAME);
// dead letter携带的routing key
delayQueueParams.put("x-dead-letter-routing-key", QueueMetadata.Order.OPEN_PLATFORM_ORDER_STATUS_CHANGE_PUSH_ROUTING_KEY);
return QueueBuilder.durable(QueueMetadata.Order.OPEN_PLATFORM_ORDER_STATUS_CHANGE_PUSH_DL_QUEUE_NAME).withArguments(delayQueueParams).build();
}
/**
* 绑定消息队列
*
* @param queue 消息队列
* @param topicExchange RabbitMQ Fanout Exchange
* @return 消息队列绑定
*/
@Bean("bindingOrderStatusChange")
Binding bindingOrderStatusChange(@Qualifier("orderStatusChangeQueue") Queue queue, @Qualifier("orderStatusChangeTopicExchange") Exchange topicExchange) {
return BindingBuilder.bind(queue).to(topicExchange).with(QueueMetadata.Order.OPEN_PLATFORM_ORDER_STATUS_CHANGE_PUSH_ROUTING_KEY).noargs();
}
@Bean("bindingOrderStatusDlChange")
Binding bindingOrderStatusDlChange(@Qualifier("orderStatusChangeDlQueue") Queue queue, @Qualifier("orderStatusChangeTopicExchange") Exchange topicExchange) {
Map<String, Object> args = new HashMap<>(2);
args.put("x-dead-letter-exchange", QueueMetadata.EXCHANGE_NAME);
args.put("x-dead-letter-routing-key", QueueMetadata.Order.OPEN_PLATFORM_ORDER_STATUS_CHANGE_PUSH_ROUTING_KEY);
return BindingBuilder.bind(queue).to(topicExchange).with(QueueMetadata.Order.OPEN_PLATFORM_ORDER_STATUS_CHANGE_PUSH_DL_ROUTING_KEY).and(args);
}
}
package com.freemud.platform.common.annotations;
import java.lang.annotation.*;
/**
* @author sunjiajie
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.PARAMETER})
@Documented
public @interface PlatformRequestBody {
Class value();
}
package com.freemud.platform.common.code;
/**
* All rights Reserved, Designed By www.freemud.com
*
* @version V1.0
* @Title:
* @Package: cn.freemud.base.open.code
* @Descripttion:
* @author: genyou.cui
* @date: 2019/4/19 16:33
* @Copyright: 2017 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目.
*/
public enum PlatformStatusCode {
/**
* 开放平台适配器返回响应状态码
* 100成功, 小于100的定义开个店系统级别返回码
*/
MISSING_PARAMS("21", "缺少必要参数"),
SIGN_ERROR("22", "签名错误"),
NOT_SUPPORT("23", "操作不支持"),
API_ERROR("24", "API调用失败"),
SUCCESS("100", "成功"),
/**
* 500系统错误全局唯一
*/
SYSTEM_ERROR("500", "系统错误"),
/**
* 业务码由4位组成
* 1001 支付
* 2001 订单
* 3001 商品
* 4001 券码
* 5001 门店
* 6001 会员
* 7001 兑换码
*
* 业务错误信息,如果基础服务有返回准确的错误消息需要拼接到以下msg后面
* 例如("创建预支付订单失败"+"原因:"+基础服务返回msg)
*/
PAYMENT_STATUS_1001("1001","创建预支付订单失败"),
ORDER_STATUS_2001("2001","创建订单失败"),
ORDER_STATUS_2002("2002","该售后已再审核中,请勿重复操作"),
GOODS_STATUS_3001("3001","根绝门店id查询商品失败"),
GOODS_STATUS_3002("3002","商品沽清失败"),
GOODS_STATUS_3003("3003","商品撤销沽清失败"),
GOODS_STATUS_3100("3100","商品信息不能为空"),
COUPON_STATUS_4001("4001","查询券码失败"),
COUPON_STATUS_4002("4002","核销券码失败"),
COUPON_STATUS_4003("4003","冲正券码失败"),
MEMBER_STATUS_6001("6001","查询会员失败"),
MEMBER_STATUS_6002("6002","会员不存在"),
MEMBER_STATUS_6003("6003","暂无数据"),
STORE_STATUS_5001("5001","门店信息不存在"),
STORE_STATUS_5002("5002","门店信息修改失败"),
OUT_OF_LENGTH("5003","列表长度不能超过300"),
REDEEM_STATUS_7001("7001","兑换码批量上传失败"),
REDEEM_STATUS_7002("7002","兑换码批量作废失败"),
UPDATE_SCORE_ERROR_7003("7003","更新积分失败"),
SEND_SCORE_ERROR_7004("7004","发送积分失败"),
REFUND_SCORE_ERROR_7005("7005","回退积分失败"),
GET_DYNAMIC_CODE_ERROR_7006("7006","解密动态码失败"),
ANALYZE_DYNAMIC_CODE_ERROR_7007("7007","解析动态码失败"),
;
private String statusCode;
private String message;
PlatformStatusCode(String statusCode, String message) {
this.statusCode = statusCode;
this.message = message;
}
public String getStatusCode() {
return statusCode;
}
public String getMessage() {
return message;
}
public static PlatformStatusCode getInfoByCode(String statusCode) {
for (PlatformStatusCode adapterStatusCode : values()) {
if (adapterStatusCode.getStatusCode().equals(statusCode)) {
return adapterStatusCode;
}
}
return null;
}
}
package com.freemud.platform.common.constant;
/**
* All rights Reserved, Designed By www.freemud.com
*
* @version V1.0
* @Title:
* @Package: cn.freemud.base.constant
* @Descripttion:
* @author: genyou.cui
* @date: 2019/4/19 16:45
* @Copyright: 2017 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目.
*/
public class VersionNum {
public static final String VERSION_ONE = "1";
public static final String VERSION_TWO = "2";
public static final int VERSION_1 = 1;
}
package com.freemud.platform.common.entity;
import lombok.Data;
import java.io.Serializable;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: PaginationRequest
* @Package com.freemud.platform.common.entity
* @Description: 简单描述下这个类是做什么用的
* @author: bingnan.zhang
* @date: 2019/7/9 11:15
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Data
public class PaginationRequest implements Serializable {
private Integer pageNum;
private Integer pageSize;
}
package com.freemud.platform.common.entity;
import lombok.Data;
import java.io.Serializable;
/**
* All rights Reserved, Designed By www.freemud.cn
*
* @version V1.0
* @Title: PaginationRequest
* @Package com.freemud.platform.common.entity
* @Description: 简单描述下这个类是做什么用的
* @author: bingnan.zhang
* @date: 2019/7/9 11:15
* @Copyright: 2018 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Data
public class PaginationResponse implements Serializable {
private Integer pageNum;
private Integer pageSize;
private Integer totalCount;
private Integer totalPages;
}
package com.freemud.platform.common.entity;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* All rights Reserved, Designed By www.freemud.com
*
* @version V1.0
* @Title:
* @Package: cn.freemud.base.entity
* @Descripttion:
* @author: genyou.cui
* @date: 2019/4/19 15:11
* @Copyright: 2017 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目.
*/
@Data
public class PlatformBaseRequest {
/**
* 版本号
*/
@NotEmpty(message = "ver不能为空")
private String ver;
/**
* 由非码颁发商户唯一标识
*/
@NotEmpty(message = "partnerId不能为空")
private String partnerId;
/**
* 由非码颁发平台唯一标识
*/
@NotEmpty(message = "appId不能为空")
private String appId;
/**
* 业务请求参数json格式字符串
*/
@NotEmpty(message = "requestBody不能为空")
private String requestBody;
/**
* SHA256WithRSA 加密签名
*/
@NotEmpty(message = "sign不能为空")
private String sign;
}
package com.freemud.platform.common.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* All rights Reserved, Designed By www.freemud.com
*
* @version V1.0
* @Title:
* @Package: cn.freemud.base.entity
* @Descripttion:
* @author: genyou.cui
* @date: 2019/4/19 15:14
* @Copyright: 2017 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目.
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class PlatformBaseResponse {
/**
* 版本号
*/
private String ver;
/**
* 返回状态码
*/
private String statusCode;
/**
* 返回信息
*/
private String message;
/**
* 业务响应参数
*/
private String responseBody;
/**
* 返回签名
*/
private String sign;
}
package com.freemud.platform.common.entity;
import com.alibaba.fastjson.JSONObject;
import com.freemud.platform.common.code.PlatformStatusCode;
import com.freemud.platform.common.constant.VersionNum;
/**
* All rights Reserved, Designed By www.freemud.com
*
* @version V1.0
* @Title:
* @Package: cn.freemud.base.entity
* @Descripttion:
* @author: genyou.cui
* @date: 2019/4/19 16:31
* @Copyright: 2017 www.freemud.cn Inc. All rights reserved.
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目.
*/
public class ResponseBuilder {
/**
* 无业务响应参数成功返回
* @return
*/
public static PlatformBaseResponse success() {
return PlatformBaseResponse.builder()
.ver(VersionNum.VERSION_ONE)
.statusCode(PlatformStatusCode.SUCCESS.getStatusCode())
.message(PlatformStatusCode.SUCCESS.getMessage())
.build();
}
/**
* 带有业务响应参数成功返回
* @return
*/
public static PlatformBaseResponse success(String result) {
return PlatformBaseResponse.builder()
.ver(VersionNum.VERSION_ONE)
.statusCode(PlatformStatusCode.SUCCESS.getStatusCode())
.message(PlatformStatusCode.SUCCESS.getMessage())
.responseBody(result)
.build();
}
/**
* 带有复杂业务响应参数成功返回
* @return
*/
public static PlatformBaseResponse success(Object obj) {
return PlatformBaseResponse.builder()
.ver(VersionNum.VERSION_ONE)
.statusCode(PlatformStatusCode.SUCCESS.getStatusCode())
.message(PlatformStatusCode.SUCCESS.getMessage())
.responseBody(JSONObject.toJSONString(obj))
.build();
}
/**
* 指定版本,带有复杂业务响应参数成功返回
* @return
*/
public static PlatformBaseResponse success(String ver, Object obj) {
return PlatformBaseResponse.builder()
.ver(ver)
.statusCode(PlatformStatusCode.SUCCESS.getStatusCode())
.message(PlatformStatusCode.SUCCESS.getMessage())
.responseBody(JSONObject.toJSONString(obj))
.build();
}
public static PlatformBaseResponse error(PlatformStatusCode platformStatusCode) {
return PlatformBaseResponse.builder()
.ver(VersionNum.VERSION_ONE)
.statusCode(platformStatusCode.getStatusCode())
.message(platformStatusCode.getMessage())
.build();
}
public static PlatformBaseResponse error(PlatformStatusCode platformStatusCode, String message) {
return PlatformBaseResponse.builder()
.ver(VersionNum.VERSION_ONE)
.statusCode(platformStatusCode.getStatusCode())
.message(message)
.build();
}
public static PlatformBaseResponse error(PlatformStatusCode platformStatusCode, Object object) {
return PlatformBaseResponse.builder()
.ver(VersionNum.VERSION_ONE)
.statusCode(platformStatusCode.getStatusCode())
.message(platformStatusCode.getMessage())
.responseBody(JSONObject.toJSONString(object))
.build();
}
public static PlatformBaseResponse buildError(PlatformStatusCode platformStatusCode, String message) {
return PlatformBaseResponse.builder()
.ver(VersionNum.VERSION_ONE)
.statusCode(platformStatusCode.getStatusCode())
.message(platformStatusCode.getMessage() + ": " + message)
.build();
}
public static PlatformBaseResponse apiError(String code, String message) {
return PlatformBaseResponse.builder()
.ver(VersionNum.VERSION_ONE)
.statusCode(code)
.message(message)
.build();
}
public static PlatformBaseResponse resultEmpty() {
return PlatformBaseResponse.builder()
.ver(VersionNum.VERSION_ONE)
.statusCode(PlatformStatusCode.API_ERROR.getStatusCode())
.message(PlatformStatusCode.API_ERROR.getMessage())
.build();
}
public static PlatformBaseResponse outOfLength() {
return PlatformBaseResponse.builder()
.ver(VersionNum.VERSION_ONE)
.statusCode(PlatformStatusCode.OUT_OF_LENGTH.getStatusCode())
.message(PlatformStatusCode.OUT_OF_LENGTH.getMessage())
.build();
}
public static boolean isSuccess(PlatformBaseResponse response) {
return response.getStatusCode().equals(PlatformStatusCode.SUCCESS.getStatusCode());
}
}
package com.freemud.platform.common.util;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoUnit;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
/**
* @author sunjiajie
*/
public class DateTimeUtil {
public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss" ;
public static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
public static final DateTimeFormatter FORMAT_YYYY_DD_23_59_59 = DateTimeFormatter.ofPattern("yyyy-MM-dd 23:59:59");
public static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");
/**
* 返回当前的日期
*
* @return
*/
public static LocalDate getCurrentLocalDate() {
return LocalDate.now();
}
/**
* 返回当前日期时间
*
* @return
*/
public static LocalDateTime getCurrentLocalDateTime() {
return LocalDateTime.now();
}
/**
* 返回当前日期字符串 yyyyMMdd
*
* @return
*/
public static String getCurrentDateStr() {
return LocalDate.now().format(DATE_FORMATTER);
}
/**
* 返回当前时间字符串 HHmmss
*
* @return
*/
public static String getCurrentTimeStr() {
return LocalDateTime.now().format(TIME_FORMATTER);
}
/**
* 返回当前日期时间字符串 yyyyMMddHHmmss
*
* @return
*/
public static String getCurrentDateTimeStr() {
return LocalDateTime.now().format(DATETIME_FORMATTER);
}
/**
* 将date转为string类型
* @param date
* @param pattern
* @return
*/
public static String getDateStr(Date date, String pattern) {
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern(pattern);
return localDateTime.format(timeFormatter);
}
/**
* 将date转为string类型
* @param date
* @param dateTimeFormatter
* @return
*/
public static String getDateStr(Date date, DateTimeFormatter dateTimeFormatter) {
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
return localDateTime.format(dateTimeFormatter);
}
/**
* 返回当前日期
* @param dateStr
* @param pattern
* @return
*/
public static Date parseDate(String dateStr, String pattern) {
ZoneId zoneId = ZoneId.systemDefault();
try {
// 默认先尝试解析成带时间的date
return parseDateTime(dateStr, pattern);
} catch (DateTimeParseException e) {
LocalDate localDate = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(pattern));
ZonedDateTime zdt = localDate.atStartOfDay(zoneId);
return Date.from(zdt.toInstant());
}
}
/**
* 返回当前日期(包含时间)
* @param dateTimeStr
* @param pattern
* @return
*/
private static Date parseDateTime(String dateTimeStr, String pattern) {
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern(pattern));
ZonedDateTime zdt = localDateTime.atZone(zoneId);
return Date.from(zdt.toInstant());
}
public static LocalDate parseLocalDate(String dateStr, String pattern) {
return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(pattern));
}
public static LocalDateTime parseLocalDateTime(String dateTimeStr, String pattern) {
return LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern(pattern));
}
/**
* 日期相隔天数
*
* @param startDateInclusive
* @param endDateExclusive
* @return
*/
public static int periodDays(LocalDate startDateInclusive, LocalDate endDateExclusive) {
return Period.between(startDateInclusive, endDateExclusive).getDays();
}
/**
* 日期相隔小时
*
* @param startInclusive
* @param endExclusive
* @return
*/
public static long durationHours(Temporal startInclusive, Temporal endExclusive) {
return Duration.between(startInclusive, endExclusive).toHours();
}
/**
* 日期相隔分钟
*
* @param startInclusive
* @param endExclusive
* @return
*/
public static long durationMinutes(Temporal startInclusive, Temporal endExclusive) {
return Duration.between(startInclusive, endExclusive).toMinutes();
}
/**
* 日期相隔毫秒数
*
* @param startInclusive
* @param endExclusive
* @return
*/
public static long durationMillis(Temporal startInclusive, Temporal endExclusive) {
return Duration.between(startInclusive, endExclusive).toMillis();
}
/**
* 是否当天
*
* @param date
* @return
*/
public static boolean isToday(LocalDate date) {
return getCurrentLocalDate().equals(date);
}
/**
* 获取本月的第一天
*
* @return
*/
public static String getFirstDayOfThisMonth() {
return getCurrentLocalDate().with(TemporalAdjusters.firstDayOfMonth()).format(DATE_FORMATTER);
}
/**
* 获取本月的最后一天
*
* @return
*/
public static String getLastDayOfThisMonth() {
return getCurrentLocalDate().with(TemporalAdjusters.lastDayOfMonth()).format(DATE_FORMATTER);
}
/**
* 获取2017-01的第一个周一
*
* @return
*/
public static String getFirstMonday() {
return LocalDate.parse("2017-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY))
.format(DATE_FORMATTER);
}
/**
* 获取当前日期的后两周
*
* @return
*/
public static String getCurDateAfterTwoWeek() {
return getCurrentLocalDate().plus(2, ChronoUnit.WEEKS).format(DATE_FORMATTER);
}
/**
* 获取当前日期的6个月后的日期
*
* @return
*/
public static String getCurDateAfterSixMonth() {
return getCurrentLocalDate().plus(6, ChronoUnit.MONTHS).format(DATE_FORMATTER);
}
/**
* 获取当前日期的5年后的日期
*
* @return
*/
public static String getCurDateAfterFiveYear() {
return getCurrentLocalDate().plus(5, ChronoUnit.YEARS).format(DATE_FORMATTER);
}
/**
* 对当前日期增加天数
* @param date
* @param day
* @return localDateTime
*/
public static LocalDateTime addDays(Date date, int day) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
return localDateTime.plus(day, ChronoUnit.DAYS);
}
/**
* 对当前日期增加天数并返回字符串
* @param date
* @param day
* @param dateTimeFormatter
* @return 日期的字符串
*/
public static String getAddDaysStr(Date date, int day, DateTimeFormatter dateTimeFormatter) {
return addDays(date, day).format(dateTimeFormatter);
}
/**
* 获取当前日期的20年后的日期
*
* @return
*/
public static String getCurDateAfterTwentyYear() {
return getCurrentLocalDate().plus(2, ChronoUnit.DECADES).format(DATE_FORMATTER);
}
}
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
<module>call-back-service</module> <module>call-back-service</module>
<module>push-order-service</module> <module>push-order-service</module>
<module>platform-sdk</module> <module>platform-sdk</module>
<module>platform-order-service</module>
</modules> </modules>
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
......
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