fanli/src/main/java/com/yeshi/fanli/controller/TestController.java
@@ -642,4 +642,14 @@ } } @RequestMapping("getSchedulerList") public void getSchedulerList(PrintWriter out) { try { for (String groupName : scheduler.getJobGroupNames()) { System.out.println(groupName); } } catch (Exception e) { } } } fanli/src/main/java/com/yeshi/fanli/dto/order/OrderMQMsgDTO.java
New file @@ -0,0 +1,48 @@ package com.yeshi.fanli.dto.order; /** * 红包MQ消息 * * @author Administrator * */ public class OrderMQMsgDTO { private String orderId; private Integer type; private Long uid; public OrderMQMsgDTO(String orderId, Integer type, Long uid) { this.orderId = orderId; this.type = type; this.uid = uid; } public OrderMQMsgDTO() { } public String getOrderId() { return orderId; } public void setOrderId(String orderId) { this.orderId = orderId; } public Integer getType() { return type; } public void setType(Integer type) { this.type = type; } public Long getUid() { return uid; } public void setUid(Long uid) { this.uid = uid; } } fanli/src/main/java/com/yeshi/fanli/service/impl/order/HongBaoV2ServiceImpl.java
@@ -145,7 +145,7 @@ @Transactional @Override public void addHongBao(List<CommonOrder> commonOrderList, int type) throws HongBaoException { public int addHongBao(List<CommonOrder> commonOrderList, int type) throws HongBaoException { Set<Integer> stateSet = new HashSet<>();// 订单状态Set if (commonOrderList != null && commonOrderList.size() > 0) { int orderType = commonOrderList.get(0).getSourceType(); @@ -153,6 +153,7 @@ Map<Integer, HongBaoOrder> notificationMap = new HashMap<>(); int goodsCount = 0; boolean hasAdd = false; boolean hasUpdate = false; for (CommonOrder commonOrder : commonOrderList) { stateSet.add(commonOrder.getState()); goodsCount += commonOrder.getCount(); @@ -163,7 +164,9 @@ saveHongBao(commonOrder, type, notificationMap); hasAdd = true; } else { updateHongBao(hongBaoOrder, commonOrder, type, notificationMap); boolean update = updateHongBao(hongBaoOrder, commonOrder, type, notificationMap); if (update) hasUpdate = true; } } /** @@ -242,8 +245,17 @@ } } } } int resultCode = 0; if (hasAdd && hasUpdate) return 12; else if (hasAdd) return 1; else if (hasUpdate) return 2; return resultCode; } return 0; } private int getOrderState(Set<Integer> states) { @@ -261,7 +273,7 @@ } @Transactional private void updateHongBao(HongBaoOrder hongBaoOrder, CommonOrder commonOrder, int type, private boolean updateHongBao(HongBaoOrder hongBaoOrder, CommonOrder commonOrder, int type, Map<Integer, HongBaoOrder> notificationMap) throws HongBaoException { System.out.println(commonOrder.getOrderNo()); // 锁行 @@ -270,7 +282,7 @@ throw new HongBaoException(10, "红包对象不存在"); // 已经失效,已经领取,新老状态一致的红包不做处理 if (oldHongBao.getState() == HongBaoV2.STATE_SHIXIAO || oldHongBao.getState() == HongBaoV2.STATE_YILINGQU) return; return false; if (type == HongBaoV2.TYPE_ZIGOU) {// 获取自购的返利比例 BigDecimal fanliRate = hongBaoManageService.getFanLiRate(commonOrder.getCreateTime().getTime()); @@ -317,7 +329,7 @@ // 新老红包状态一致不处理 if (oldHongBao.getState().intValue() == hongBao.getState()) return; return false; if (hongBao.getState() == HongBaoV2.STATE_SHIXIAO) { if (mianDan) { @@ -411,7 +423,7 @@ BigDecimal firstRate = hongBaoManageService .getFirstInviteRate(boss.getRank() == null ? 0 : boss.getRank()); if (firstRate.compareTo(new BigDecimal(0)) <= 0) return; return true; HongBaoV2 firstHongbao = new HongBaoV2(); firstHongbao.setUserInfo(boss); firstHongbao.setUrank(boss.getRank()); @@ -459,7 +471,7 @@ BigDecimal secondRate = hongBaoManageService .getSecondInviteRate(boss.getRank() == null ? 0 : boss.getRank()); if (secondRate.compareTo(new BigDecimal(0)) <= 0) return; return true; HongBaoV2 secondHongbao = new HongBaoV2(); secondHongbao.setUserInfo(boss); secondHongbao.setUrank(boss.getRank()); @@ -622,6 +634,8 @@ } } else throw new HongBaoException(2, "type错误"); return true; } @Transactional @@ -642,7 +656,6 @@ CommonOrderGoods goods = commonOrderGoodsMapper .selectByPrimaryKey(commonOrder.getCommonOrderGoods().getId()); if (goods != null) { try { if (userSystemCouponService.updateCouponRecordUsed(commonOrder.getUserInfo().getId(), commonOrder.getOrderNo(), payMent, Long.parseLong(goods.getGoodsId()))) fanli/src/main/java/com/yeshi/fanli/service/impl/order/OrderProcessServiceImpl.java
@@ -18,6 +18,10 @@ import org.springframework.transaction.annotation.Transactional; import org.yeshi.utils.NumberUtil; import com.aliyun.openservices.ons.api.Message; import com.aliyun.openservices.ons.api.transaction.LocalTransactionExecuter; import com.aliyun.openservices.ons.api.transaction.TransactionProducer; import com.aliyun.openservices.ons.api.transaction.TransactionStatus; import com.google.gson.Gson; import com.yeshi.fanli.dao.mybatis.HongBaoV2Mapper; import com.yeshi.fanli.dao.mybatis.UserInfoMapper; @@ -27,6 +31,7 @@ import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoWeiQuanOrderMapper; import com.yeshi.fanli.dto.HongBao; import com.yeshi.fanli.dto.order.CommonOrderAddResultDTO; import com.yeshi.fanli.dto.order.OrderMQMsgDTO; import com.yeshi.fanli.entity.bus.user.HongBaoV2; import com.yeshi.fanli.entity.bus.user.Order; import com.yeshi.fanli.entity.bus.user.UserExtraTaoBaoInfo; @@ -139,6 +144,9 @@ @Resource private PDDOrderService pddOrderService; @Resource(name = "orderTransactionProducer") private TransactionProducer orderTransactionProducer; /** * 是否是分享订单 @@ -986,8 +994,7 @@ List<CommonOrderAddResultDTO> commonOrderList = null; try { commonOrderList = commonOrderService.addTaoBaoOrder(orderList, uid); hongBaoV2Service.addHongBao(convertCommonOrder(commonOrderList), HongBaoV2.TYPE_ZIGOU); addHongBaoWithMQ(commonOrderList, orderId, uid, Constant.SOURCE_TYPE_TAOBAO, HongBaoV2.TYPE_ZIGOU); if (isCommonOrderAllAdd(commonOrderList)) { Order order = new Order(); order.setOrderId(orderId); @@ -1046,7 +1053,7 @@ // 用第一个子订单锁定用户 try { List<CommonOrderAddResultDTO> commonOrders = commonOrderService.addTaoBaoOrder(orderList, uid); hongBaoV2Service.addHongBao(convertCommonOrder(commonOrders), HongBaoV2.TYPE_SHARE_GOODS); addHongBaoWithMQ(commonOrders, orderId, uid, Constant.SOURCE_TYPE_TAOBAO, HongBaoV2.TYPE_SHARE_GOODS); if (isCommonOrderAllAdd(commonOrders)) { Order order = new Order(); order.setOrderId(orderId); @@ -1059,8 +1066,6 @@ } } catch (CommonOrderException e) { e.printStackTrace(); } catch (HongBaoException e1) { e1.printStackTrace(); } } } @@ -1165,11 +1170,13 @@ try { List<CommonOrderAddResultDTO> commonOrderList = commonOrderService.addJDOrder(jdOrder, uid); hongBaoV2Service.addHongBao(convertCommonOrder(commonOrderList), HongBaoV2.TYPE_ZIGOU); addHongBaoWithMQ(commonOrderList, jdOrder.getOrderId() + "", uid, Constant.SOURCE_TYPE_JD, HongBaoV2.TYPE_ZIGOU); if (isCommonOrderAllAdd(commonOrderList)) { Order order = new Order(); order.setOrderId(jdOrder.getOrderId() + ""); order.setOrderType(Constant.SOURCE_TYPE_TAOBAO); order.setOrderType(Constant.SOURCE_TYPE_JD); order.setUserInfo(new UserInfo(uid)); try { PlaceOrderCMQManager.getInstance().addPlaceOrderMsg(order); @@ -1177,12 +1184,6 @@ } } } catch (CommonOrderException e) { try { LogHelper.errorDetailInfo(e, "addJDOrder或addHongBao出错", "订单号:" + jdOrder.getOrderId()); } catch (Exception e1) { e1.printStackTrace(); } } catch (HongBaoException e) { try { LogHelper.errorDetailInfo(e, "addJDOrder或addHongBao出错", "订单号:" + jdOrder.getOrderId()); } catch (Exception e1) { @@ -1201,11 +1202,12 @@ private void processShareJDOrder(JDOrder jdOrder, Long uid) { try { List<CommonOrderAddResultDTO> commonOrderList = commonOrderService.addJDOrder(jdOrder, uid); hongBaoV2Service.addHongBao(convertCommonOrder(commonOrderList), HongBaoV2.TYPE_SHARE_GOODS); addHongBaoWithMQ(commonOrderList, jdOrder.getOrderId() + "", uid, Constant.SOURCE_TYPE_JD, HongBaoV2.TYPE_SHARE_GOODS); if (isCommonOrderAllAdd(commonOrderList)) { Order order = new Order(); order.setOrderId(jdOrder.getOrderId() + ""); order.setOrderType(Constant.SOURCE_TYPE_TAOBAO); order.setOrderType(Constant.SOURCE_TYPE_JD); order.setUserInfo(new UserInfo(uid)); try { PlaceOrderCMQManager.getInstance().addPlaceOrderMsg(order); @@ -1213,12 +1215,6 @@ } } } catch (CommonOrderException e) { try { LogHelper.errorDetailInfo(e, "addJDOrder或addHongBao出错", "订单号:" + jdOrder.getOrderId()); } catch (Exception e1) { e1.printStackTrace(); } } catch (HongBaoException e) { try { LogHelper.errorDetailInfo(e, "addJDOrder或addHongBao出错", "订单号:" + jdOrder.getOrderId()); } catch (Exception e1) { @@ -1315,11 +1311,12 @@ List<PDDOrder> pddOrderList = new ArrayList<>(); pddOrderList.add(pddOrder); List<CommonOrderAddResultDTO> commonOrderList = commonOrderService.addPDDOrder(pddOrderList, uid); hongBaoV2Service.addHongBao(convertCommonOrder(commonOrderList), HongBaoV2.TYPE_ZIGOU); addHongBaoWithMQ(commonOrderList, pddOrder.getOrderSn(), uid, Constant.SOURCE_TYPE_PDD, HongBaoV2.TYPE_ZIGOU); if (isCommonOrderAllAdd(commonOrderList)) { Order order = new Order(); order.setOrderId(pddOrder.getOrderSn()); order.setOrderType(Constant.SOURCE_TYPE_TAOBAO); order.setOrderType(Constant.SOURCE_TYPE_PDD); order.setUserInfo(new UserInfo(uid)); try { PlaceOrderCMQManager.getInstance().addPlaceOrderMsg(order); @@ -1327,12 +1324,6 @@ } } } catch (CommonOrderException e) { try { LogHelper.errorDetailInfo(e, "addPDDOrder或addHongBao出错", "订单号:" + pddOrder.getOrderSn()); } catch (Exception e1) { e1.printStackTrace(); } } catch (HongBaoException e) { try { LogHelper.errorDetailInfo(e, "addPDDOrder或addHongBao出错", "订单号:" + pddOrder.getOrderSn()); } catch (Exception e1) { @@ -1353,11 +1344,12 @@ List<PDDOrder> pddOrderList = new ArrayList<>(); pddOrderList.add(pddOrder); List<CommonOrderAddResultDTO> commonOrderList = commonOrderService.addPDDOrder(pddOrderList, uid); hongBaoV2Service.addHongBao(convertCommonOrder(commonOrderList), HongBaoV2.TYPE_SHARE_GOODS); addHongBaoWithMQ(commonOrderList, pddOrder.getOrderSn(), uid, Constant.SOURCE_TYPE_PDD, HongBaoV2.TYPE_SHARE_GOODS); if (isCommonOrderAllAdd(commonOrderList)) { Order order = new Order(); order.setOrderId(pddOrder.getOrderSn()); order.setOrderType(Constant.SOURCE_TYPE_TAOBAO); order.setOrderType(Constant.SOURCE_TYPE_PDD); order.setUserInfo(new UserInfo(uid)); try { PlaceOrderCMQManager.getInstance().addPlaceOrderMsg(order); @@ -1365,12 +1357,6 @@ } } } catch (CommonOrderException e) { try { LogHelper.errorDetailInfo(e, "addJDOrder或addHongBao出错", "订单号:" + pddOrder.getOrderId()); } catch (Exception e1) { e1.printStackTrace(); } } catch (HongBaoException e) { try { LogHelper.errorDetailInfo(e, "addJDOrder或addHongBao出错", "订单号:" + pddOrder.getOrderId()); } catch (Exception e1) { @@ -1560,4 +1546,31 @@ // 返利到账 } private void addHongBaoWithMQ(List<CommonOrderAddResultDTO> commonOrderList, String orderId, Long uid, int sourceType, int hongBaoType) { final List<CommonOrder> coList = convertCommonOrder(commonOrderList); OrderMQMsgDTO mqMsg = new OrderMQMsgDTO(orderId, sourceType, uid); Message msg = new Message("TOPIC_ORDER", String.format("orderhongbao-%s-%s", sourceType, hongBaoType), new Gson().toJson(mqMsg).getBytes()); orderTransactionProducer.send(msg, new LocalTransactionExecuter() { @Override public TransactionStatus execute(Message arg0, Object arg1) { int resultCode = 0; try { resultCode = hongBaoV2Service.addHongBao(coList, hongBaoType); } catch (HongBaoException e) { try { LogHelper.errorDetailInfo(e, "addJDOrder或addHongBao出错", "订单号:" + orderId); } catch (Exception e1) { e1.printStackTrace(); } } if (resultCode != 0) return TransactionStatus.CommitTransaction; else return TransactionStatus.RollbackTransaction; } }, null); } } fanli/src/main/java/com/yeshi/fanli/service/inter/order/HongBaoV2Service.java
@@ -25,14 +25,12 @@ /** * 添加红包 * * @param commonOrder * 订单对象 * @param type * 类型 * @param commonOrder 订单对象 * @param type 类型 * @return 0-未添加也未更新 1-只添加 2-只更新 12-有添加也有更新 * @throws HongBaoException */ public void addHongBao(List<CommonOrder> commonOrder, int type) throws HongBaoException; public int addHongBao(List<CommonOrder> commonOrder, int type) throws HongBaoException; /** * 奖金列表(1.4.9之前的版本) fanli/src/main/java/com/yeshi/fanli/util/rocketmq/RocketMQLocalTransactionChecker.java
File was deleted fanli/src/main/java/com/yeshi/fanli/util/rocketmq/RocketMQMessageListener.java
File was deleted fanli/src/main/java/com/yeshi/fanli/util/rocketmq/consumer/order/InviteOrderSubsidyMessageListener.java
New file @@ -0,0 +1,30 @@ package com.yeshi.fanli.util.rocketmq.consumer.order; import org.springframework.stereotype.Component; import com.aliyun.openservices.ons.api.Action; import com.aliyun.openservices.ons.api.ConsumeContext; import com.aliyun.openservices.ons.api.Message; import com.aliyun.openservices.ons.api.MessageListener; /** * 邀请订单补贴消息消费 * * @author Administrator * */ @Component public class InviteOrderSubsidyMessageListener implements MessageListener { public InviteOrderSubsidyMessageListener() { } @Override public Action consume(Message message, ConsumeContext context) { if (message.getTag().startsWith("")) { } return Action.CommitMessage; } } fanli/src/main/java/com/yeshi/fanli/util/rocketmq/order/RocketMQLocalOrderTransactionChecker.java
New file @@ -0,0 +1,22 @@ package com.yeshi.fanli.util.rocketmq.order; import org.springframework.stereotype.Component; import com.aliyun.openservices.ons.api.Message; import com.aliyun.openservices.ons.api.transaction.LocalTransactionChecker; import com.aliyun.openservices.ons.api.transaction.TransactionStatus; @Component public class RocketMQLocalOrderTransactionChecker implements LocalTransactionChecker { public RocketMQLocalOrderTransactionChecker() { } @Override public TransactionStatus check(Message msg) { if (msg.getTag().startsWith("orderhongbao-")) {// 订单加入红包标识 return TransactionStatus.CommitTransaction; } return TransactionStatus.Unknow; } } fanli/src/main/resource/rocket/consumer.xml
@@ -2,15 +2,15 @@ <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="msgListener" class="com.yeshi.fanli.util.rocketmq.RocketMQMessageListener"></bean> <!--Listener 配置 --> <bean id="msgListener" class="com.yeshi.fanli.util.rocketmq.consumer.order.InviteOrderSubsidyMessageListener"></bean> <!--Listener 配置 --> <!-- Group ID 订阅同一个 Topic,可以创建多个 ConsumerBean --> <bean id="consumer" class="com.aliyun.openservices.ons.api.bean.ConsumerBean" <bean id="orderTransactionConsumer" class="com.aliyun.openservices.ons.api.bean.ConsumerBean" init-method="start" destroy-method="shutdown"> <property name="properties"> <!--消费者配置信息 --> <props> <prop key="AccessKey">LTAI4FwmTxVCuzTaoZtDiV8z</prop> <prop key="SecretKey">ixWg90QbYFKP6ae5xpAo2P1qwIyll5</prop> <prop key="GROUP_ID">GID_DEMO</prop> <prop key="GROUP_ID">GID_ORDER</prop> <prop key="NAMESRV_ADDR">http://MQ_INST_1205444665315884_BbaMbxF4.mq-internet-access.mq-internet.aliyuncs.com:80 </prop> <!--将消费者线程数固定为 50 个 <prop key="ConsumeThreadNums">50</prop> --> @@ -21,18 +21,9 @@ <entry value-ref="msgListener"> <key> <bean class="com.aliyun.openservices.ons.api.bean.Subscription"> <property name="topic" value="TopicTestMQ" /> <property name="topic" value=TOPIC_ORDER /> <property name="expression" value="*" /><!--expression 即 Tag,可以设置成具体的 Tag,如 taga||tagb||tagc,也可设置成 *。 * 仅代表订阅所有 Tag,不支持通配 --> </bean> </key> </entry> <!--更多的订阅添加 entry 节点即可,如下所示 --> <entry value-ref="msgListener"> <key> <bean class="com.aliyun.openservices.ons.api.bean.Subscription"> <property name="topic" value="TopicTestMQ-Other" /> <!--订阅另外一个 Topic --> <property name="expression" value="taga||tagb" /> <!-- 订阅多个 Tag --> </bean> </key> </entry> fanli/src/main/resource/rocket/transactionProducer.xml
@@ -3,19 +3,19 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 事务消息生产 --> <bean id="localTransactionChecker" class="com.yeshi.fanli.util.rocketmq.RocketMQLocalTransactionChecker"></bean> <bean id="transactionProducer" <bean id="localOrderTransactionChecker" class="com.yeshi.fanli.util.rocketmq.order.RocketMQLocalOrderTransactionChecker"></bean> <bean id="orderTransactionProducer" class="com.aliyun.openservices.ons.api.bean.TransactionProducerBean" init-method="start" destroy-method="shutdown"> <property name="properties"> <!--事务消息生产者配置信息 --> <props> <prop key="AccessKey">LTAI4FwmTxVCuzTaoZtDiV8z</prop> <prop key="SecretKey">ixWg90QbYFKP6ae5xpAo2P1qwIyll5</prop> <prop key="GROUP_ID">GID_DEMO</prop> <prop key="GROUP_ID">GID_ORDER</prop> <prop key="NAMESRV_ADDR">http://MQ_INST_1205444665315884_BbaMbxF4.mq-internet-access.mq-internet.aliyuncs.com:80 </prop> </props> </property> <property name="localTransactionChecker" ref="localTransactionChecker"></property> <property name="localTransactionChecker" ref="localOrderTransactionChecker"></property> </bean> </beans> pom.xml
@@ -531,13 +531,20 @@ <artifactId>thumbnailator</artifactId> <version>0.4.8</version> </dependency> <!-- RocketMQ --> <dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>ons-client</artifactId> <version>1.8.0.Final</version> </dependency> <!-- 分步式任务 --> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.1.0</version> </dependency> </dependencies>