Просмотр исходного кода

[下订单][修改]:订单后处理与下订单主流程分离

release_toaliyun_real
Stormeye Wu 7 лет назад
Родитель
Сommit
2f1efd2552
7 измененных файлов: 150 добавлений и 15 удалений
  1. +16
    -6
      mallinkMQConsumer/src/main/java/com/iformall/mq/MqBaseConsumer.java
  2. +2
    -0
      mallinkService/src/main/java/com/iformall/common/ErrorCode.java
  3. +21
    -0
      mallinkService/src/main/java/com/iformall/domain/po/msg/FmInsideOrderSuccessMsg.java
  4. +1
    -0
      mallinkService/src/main/java/com/iformall/enums/EnumMsgRecordType.java
  5. +8
    -0
      mallinkService/src/main/java/com/iformall/service/WxOrderService.java
  6. +30
    -9
      mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java
  7. +72
    -0
      mallinkService/src/main/java/com/iformall/service/msg/impl/FmInsideOrderSuccessMsgServiceImpl.java

+ 16
- 6
mallinkMQConsumer/src/main/java/com/iformall/mq/MqBaseConsumer.java Просмотреть файл

@@ -40,22 +40,32 @@ public class MqBaseConsumer {


if(EnumMsgRecordType.SMS.getCode().equals(baseMsg.getMsgType())){ if(EnumMsgRecordType.SMS.getCode().equals(baseMsg.getMsgType())){
//短信 //短信
sendSmsService.send((WxMsgRecord)JsonUtil.readValue(message,WxMsgRecord.class));
WxMsgRecord msg = (WxMsgRecord)JsonUtil.readValue(message,WxMsgRecord.class);
sendSmsService.send(msg);
} else if(EnumMsgRecordType.SMS_CALLBACK.getCode().equals(baseMsg.getMsgType())){ } else if(EnumMsgRecordType.SMS_CALLBACK.getCode().equals(baseMsg.getMsgType())){
//业务短信 //业务短信
sendCallBackSmsService.send((WxMsg)JsonUtil.readValue(message,WxMsg.class));
WxMsg msg = (WxMsg)JsonUtil.readValue(message,WxMsg.class);
sendCallBackSmsService.send(msg);
} else if(EnumMsgRecordType.EMAIL.getCode().equals(baseMsg.getMsgType())){ } else if(EnumMsgRecordType.EMAIL.getCode().equals(baseMsg.getMsgType())){
//邮件 //邮件
sendEmailService.send((MailMsg)JsonUtil.readValue(message,MailMsg.class));
MailMsg msg = (MailMsg)JsonUtil.readValue(message,MailMsg.class);
sendEmailService.send(msg);
} else if(EnumMsgRecordType.SMART_APP.getCode().equals(baseMsg.getMsgType())){ } else if(EnumMsgRecordType.SMART_APP.getCode().equals(baseMsg.getMsgType())){
//微信小程序-模板消息 //微信小程序-模板消息
sendSmartAppMsgService.send((SmartAppMsg)JsonUtil.readValue(message,SmartAppMsg.class));
SmartAppMsg msg = (SmartAppMsg)JsonUtil.readValue(message,SmartAppMsg.class);
sendSmartAppMsgService.send(msg);
} else if(EnumMsgRecordType.PUBLIC.getCode().equals(baseMsg.getMsgType())) { } else if(EnumMsgRecordType.PUBLIC.getCode().equals(baseMsg.getMsgType())) {
//公众号-模板消息 //公众号-模板消息
sendMpMsgService.send((MpAppMsg)JsonUtil.readValue(message,MpAppMsg.class));
MpAppMsg msg = (MpAppMsg)JsonUtil.readValue(message,MpAppMsg.class);
sendMpMsgService.send(msg);
} else if(EnumMsgRecordType.SMART_APP_UNIFORM.getCode().equals(baseMsg.getMsgType())) { } else if(EnumMsgRecordType.SMART_APP_UNIFORM.getCode().equals(baseMsg.getMsgType())) {
//微信小程序-统一消息 //微信小程序-统一消息
sendWeappUniformMsgService.send((AppUniformMsg)JsonUtil.readValue(message,AppUniformMsg.class));
AppUniformMsg msg = (AppUniformMsg)JsonUtil.readValue(message,AppUniformMsg.class);
sendWeappUniformMsgService.send(msg);
} else if(EnumMsgRecordType.INSIDE_ORDER_SUCCESS.getCode().equals(baseMsg.getMsgType())) {
// 内部消息 - 下订单成功
FmInsideOrderSuccessMsg msg = (FmInsideOrderSuccessMsg)JsonUtil.readValue(message,FmInsideOrderSuccessMsg.class);

} }
baseMsg.setMsgStatus(EnumMsgRecordStatus.CONSUME_SUCC.getCode()); baseMsg.setMsgStatus(EnumMsgRecordStatus.CONSUME_SUCC.getCode());
wxMsgRecordMapper.update(baseMsg); wxMsgRecordMapper.update(baseMsg);


+ 2
- 0
mallinkService/src/main/java/com/iformall/common/ErrorCode.java Просмотреть файл

@@ -405,6 +405,8 @@ public enum ErrorCode{
MSG_CONFIG_NOT_FOUND(27001, "找不到短信配置"), MSG_CONFIG_NOT_FOUND(27001, "找不到短信配置"),
MSG_CONFIG_ACCOUNT(27002, "短信条数剩余不足"), MSG_CONFIG_ACCOUNT(27002, "短信条数剩余不足"),


MSG_INSIDE_ERROR(271001, "内部消息转发失败"),

/** /**
* 拼团 * 拼团
*/ */


+ 21
- 0
mallinkService/src/main/java/com/iformall/domain/po/msg/FmInsideOrderSuccessMsg.java Просмотреть файл

@@ -0,0 +1,21 @@
package com.iformall.domain.po.msg;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class FmInsideOrderSuccessMsg extends BaseMsg{
private static final long serialVersionUID = 1L;

@io.swagger.annotations.ApiModelProperty(value = "租户ID", name = "tenantId")
private String tenantId;
@io.swagger.annotations.ApiModelProperty(value = "成功订单ID", name = "orderId")
private Long orderId;
@io.swagger.annotations.ApiModelProperty(value = "券ID", name = "couponId")
private Long couponId;
@io.swagger.annotations.ApiModelProperty(value = "用户ID", name = "cUserId")
private Long cUserId;
}

+ 1
- 0
mallinkService/src/main/java/com/iformall/enums/EnumMsgRecordType.java Просмотреть файл

@@ -12,6 +12,7 @@ public enum EnumMsgRecordType {
SYSTEM(6, "系统通知"), SYSTEM(6, "系统通知"),
SMART_APP_UNIFORM(7, "小程序统一消息"), SMART_APP_UNIFORM(7, "小程序统一消息"),
WEBSOCKET_APP(8, "小程序websocket"), WEBSOCKET_APP(8, "小程序websocket"),
INSIDE_ORDER_SUCCESS(100, "下订单成功"),
; ;


public static EnumMsgRecordType getEnum(Integer code) { public static EnumMsgRecordType getEnum(Integer code) {


+ 8
- 0
mallinkService/src/main/java/com/iformall/service/WxOrderService.java Просмотреть файл

@@ -160,4 +160,12 @@ public interface WxOrderService {
// 3. 创建有价订单 // 3. 创建有价订单
WxOrder saveNoFreeOrderForCoupon(WxCUser user, WxCoupon coupon, Long couponChannelId, boolean isPress, Long orderGroupId, String formId); WxOrder saveNoFreeOrderForCoupon(WxCUser user, WxCoupon coupon, Long couponChannelId, boolean isPress, Long orderGroupId, String formId);


/**
* 下订单成功后处理
* @param updateOrder
* @param coupon
* @param user
*/
void actionAfterCouponOrderSuccess(WxOrder updateOrder, WxCoupon coupon, WxCUser user);

} }

+ 30
- 9
mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java Просмотреть файл

@@ -7,10 +7,12 @@ import com.iformall.common.IdWorker;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.dto.WxSharingOrderDto; import com.iformall.domain.dto.WxSharingOrderDto;
import com.iformall.domain.po.*; import com.iformall.domain.po.*;
import com.iformall.domain.po.msg.FmInsideOrderSuccessMsg;
import com.iformall.domain.vo.*; import com.iformall.domain.vo.*;
import com.iformall.enums.*; import com.iformall.enums.*;
import com.iformall.exception.MallinkException; import com.iformall.exception.MallinkException;
import com.iformall.mapper.*; import com.iformall.mapper.*;
import com.iformall.mq.MqBaseProducer;
import com.iformall.service.*; import com.iformall.service.*;
import com.iformall.utils.DateUtils; import com.iformall.utils.DateUtils;
import com.iformall.utils.PressUtils; import com.iformall.utils.PressUtils;
@@ -108,6 +110,9 @@ public class WxOrderServiceImpl implements WxOrderService {
@Autowired @Autowired
WxCouponChannelMapper wxCouponChannelMapper; WxCouponChannelMapper wxCouponChannelMapper;


@Autowired
private MqBaseProducer mqBaseProducer;

@Override @Override
public PageInfo<WxOrder> listAsPage(WxOrder record, Integer pageIndex, Integer pageSize) { public PageInfo<WxOrder> listAsPage(WxOrder record, Integer pageIndex, Integer pageSize) {
return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findList(record)); return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findList(record));
@@ -600,8 +605,6 @@ public class WxOrderServiceImpl implements WxOrderService {
wxOrderMapper.insertSelective(record); wxOrderMapper.insertSelective(record);
} catch (Exception e) { } catch (Exception e) {
logger.error("保存订单:" + e.getMessage()); logger.error("保存订单:" + e.getMessage());
// 库存恢复
stockBack(record);
throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); throw new MallinkException(ErrorCode.ORDER_SAVE_ERR);
} }


@@ -611,8 +614,6 @@ public class WxOrderServiceImpl implements WxOrderService {
couponOrder = createCouponOrder(record, user, coupon); couponOrder = createCouponOrder(record, user, coupon);
} catch (Exception e) { } catch (Exception e) {
logger.error("保存订单:" + e.getMessage()); logger.error("保存订单:" + e.getMessage());
// 库存恢复
stockBack(record);
throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR); throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR);
} }


@@ -667,18 +668,33 @@ public class WxOrderServiceImpl implements WxOrderService {
throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR); throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR);
} }


// 订单+券包 流程 完成
actionAfterCouponOrderSuccess(updateOrder, coupon, user);
// 下订单完成,发送内部消息
try {
sendInsideOrderSuccessMsg(updateOrder, coupon, user);
} catch (Exception e) {
logger.error("内部消息发送失败: " + e.getMessage());
throw new MallinkException(ErrorCode.MSG_INSIDE_ERROR);
}
return ret; return ret;
} }


private void sendInsideOrderSuccessMsg(WxOrder updateOrder, WxCoupon coupon, WxCUser user) {
FmInsideOrderSuccessMsg orderSuccess = new FmInsideOrderSuccessMsg();
orderSuccess.setMsgType(EnumMsgRecordType.INSIDE_ORDER_SUCCESS.getCode());
orderSuccess.setTenantId(updateOrder.getTenantId());
orderSuccess.setOrderId(updateOrder.getId());
orderSuccess.setCUserId(user.getId());
orderSuccess.setCouponId(coupon.getId());
mqBaseProducer.sendMessage(orderSuccess, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode());
}

/** /**
* 下订单后操作 * 下订单后操作
* @param updateOrder * @param updateOrder
* @param coupon * @param coupon
* @param user * @param user
*/ */
private void actionAfterCouponOrderSuccess(WxOrder updateOrder, WxCoupon coupon, WxCUser user) {
public void actionAfterCouponOrderSuccess(WxOrder updateOrder, WxCoupon coupon, WxCUser user) {
// 交易发券 // 交易发券
try { try {
wxCouponSendService.sendCouponToUser(EnumCouponSendSendType.C_ORDER, updateOrder); wxCouponSendService.sendCouponToUser(EnumCouponSendSendType.C_ORDER, updateOrder);
@@ -1185,8 +1201,13 @@ public class WxOrderServiceImpl implements WxOrderService {
throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR); throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR);
} }


// 6. 订单+券包 流程 完成
actionAfterCouponOrderSuccess(record, coupon, user);
// 6. 下订单完成,发送内部消息
try {
sendInsideOrderSuccessMsg(record, coupon, user);
} catch (Exception e) {
logger.error("内部消息发送失败: " + e.getMessage());
throw new MallinkException(ErrorCode.MSG_INSIDE_ERROR);
}
return record; return record;
} }




+ 72
- 0
mallinkService/src/main/java/com/iformall/service/msg/impl/FmInsideOrderSuccessMsgServiceImpl.java Просмотреть файл

@@ -0,0 +1,72 @@
package com.iformall.service.msg.impl;

import com.iformall.domain.po.WxCUser;
import com.iformall.domain.po.WxCoupon;
import com.iformall.domain.po.WxCouponChannel;
import com.iformall.domain.po.WxOrder;
import com.iformall.domain.po.msg.BaseMsg;
import com.iformall.domain.po.msg.FmInsideOrderSuccessMsg;
import com.iformall.service.WxCUserService;
import com.iformall.service.WxCouponChannelService;
import com.iformall.service.WxCouponService;
import com.iformall.service.WxOrderService;
import com.iformall.service.msg.MsgSendService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
*
* @author Stormeye Wu
* @date 2019/5/10
*/
@Service
public class FmInsideOrderSuccessMsgServiceImpl implements MsgSendService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
private WxOrderService orderService;

@Autowired
private WxCUserService userService;

@Autowired
private WxCouponService couponService;

@Autowired
private WxCouponChannelService couponChannelService;



@Override
public void send(BaseMsg baseMsg) throws Exception{
FmInsideOrderSuccessMsg msg = (FmInsideOrderSuccessMsg)baseMsg;
WxOrder record = orderService.getById(msg.getOrderId());
if(record == null) {
logger.error("订单未找到" + msg.getOrderId());
}
if(record.getcUserId() != msg.getCUserId()) {
logger.error("订单用户不一致" + msg.getOrderId());
}
WxCouponChannel couponChannel = couponChannelService.getById(record.getCouponChannelId());
if(couponChannel == null) {
logger.error("投放渠道未找到" + record.getCouponChannelId());
}
if(couponChannel.getCouponId() != msg.getCouponId()) {
logger.error("券ID不一致" + msg.getCouponId());
}

WxCUser user = userService.getById(msg.getCUserId());
if(user == null) {
logger.error("用户未找到" + msg.getCUserId());
}
WxCoupon coupon = couponService.getById(msg.getCouponId());
if(coupon == null) {
logger.error("券未找到" + msg.getCouponId());
}

// 下订单后处理
orderService.actionAfterCouponOrderSuccess(record, coupon, user);
}
}

Загрузка…
Отмена
Сохранить