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

[核销][修改]:核销及其后处理分离

release_toaliyun_real
Stormeye Wu 7 лет назад
Родитель
Сommit
46baa1cec7
11 измененных файлов: 349 добавлений и 201 удалений
  1. +20
    -33
      mallinkBApi/src/main/java/com/iformall/controller/WxCouponOrderController.java
  2. +6
    -0
      mallinkMQConsumer/src/main/java/com/iformall/mq/MqBaseConsumer.java
  3. +19
    -0
      mallinkService/src/main/java/com/iformall/domain/po/msg/FmInsideCouponVerifyMsg.java
  4. +0
    -1
      mallinkService/src/main/java/com/iformall/domain/po/msg/MpAppMsg.java
  5. +1
    -0
      mallinkService/src/main/java/com/iformall/enums/EnumMsgRecordType.java
  6. +12
    -9
      mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java
  7. +16
    -3
      mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java
  8. +205
    -146
      mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java
  9. +14
    -9
      mallinkService/src/main/java/com/iformall/service/impl/WxCouponSendServiceImpl.java
  10. +48
    -0
      mallinkService/src/main/java/com/iformall/service/msg/impl/FmInsideCouponVerifyMsgServiceImpl.java
  11. +8
    -0
      mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml

+ 20
- 33
mallinkBApi/src/main/java/com/iformall/controller/WxCouponOrderController.java Просмотреть файл

@@ -5,11 +5,11 @@ import com.iformall.common.ErrorCode;
import com.iformall.common.Result;
import com.iformall.common.ResultData;
import com.iformall.domain.po.WxCouponOrder;
import com.iformall.domain.po.WxMerchantBUser;
import com.iformall.domain.vo.WxCouponOrderCVo;
import com.iformall.enums.EnumCouponChannelActivityStatus;
import com.iformall.enums.EnumCouponOrderValidStatus;
import com.iformall.exception.MallinkException;
import com.iformall.service.WxCouponOrderService;
import com.iformall.service.WxMerchantBUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -32,6 +32,9 @@ public class WxCouponOrderController extends BaseController {
@Autowired
private WxCouponOrderService wxCouponOrderService;

@Autowired
private WxMerchantBUserService wxMerchantBUserService;

@ApiOperation("分页列表接口")
@GetMapping("list")
@ApiImplicitParams({
@@ -136,9 +139,21 @@ public class WxCouponOrderController extends BaseController {
}
}

WxCouponOrder wxCouponOrder = wxCouponOrderService.getById(couponOrderId);
if (wxCouponOrder == null) {
logger.error("券ID不存在:" + couponOrderId);
return new ResultData(ErrorCode.COUPON_ORDER_IS_NULL);
}

WxMerchantBUser wxMerchantBUser = wxMerchantBUserService.getById(getUserId());
if (wxMerchantBUser == null) {
logger.error("核销员ID不存在:" + getUserId());
throw new MallinkException(ErrorCode.USER_IS_EMPTY.getCode(), "核销员ID不存在或者无权限");
}

WxCouponOrder couponOrder = null;
try {
couponOrder = wxCouponOrderService.verify(couponOrderId, getUser().getId());
couponOrder = wxCouponOrderService.verify(wxCouponOrder, wxMerchantBUser);
} catch (MallinkException e) {
logger.error("核销异常: " + e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
@@ -147,36 +162,8 @@ public class WxCouponOrderController extends BaseController {
return new ResultData(ErrorCode.VERIFY_ERROR, e.getMessage());
}

if (couponOrder != null) {
try {
// 核销分账
wxCouponOrderService.shareAfterVerify(couponOrder, getUser().getMerchantId());
} catch (Exception e) {
logger.error(e.getMessage());
}

try {
// 核销补贴
wxCouponOrderService.subsidyAfterVerify(couponOrder, getUser().getMerchantId());
} catch (Exception e) {
logger.error(e.getMessage());
}

boolean bSentCoupon = false;

// 核销发券
try {
bSentCoupon = wxCouponOrderService.sendCouponAfterVerify(couponOrder, getUser());
} catch (Exception e) {
logger.error(e.getMessage());
}

// 核销发模板消息
try {
wxCouponOrderService.sendVerifyMsg(couponOrder, getUser(), bSentCoupon);
} catch (Exception e) {
logger.error("核销发送消息发生错误:"+e.getMessage());
}
if(couponOrder != null) {
wxCouponOrderService.sendInsideCouponVerifyMsg(couponOrder, wxMerchantBUser);
}

return new ResultData(couponOrder);


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

@@ -32,6 +32,8 @@ public class MqBaseConsumer {
private SendWeappUniformMsgServiceImpl sendWeappUniformMsgService;
@Autowired
private FmInsideOrderSuccessMsgServiceImpl fmInsideOrderSuccessMsgService;
@Autowired
private FmInsideCouponVerifyMsgServiceImpl fmInsideCouponVerifyMsgService;

public void doMessage(String message) {
log.info("received message: {}", message);
@@ -68,6 +70,10 @@ public class MqBaseConsumer {
// 内部消息 - 下订单成功
FmInsideOrderSuccessMsg msg = (FmInsideOrderSuccessMsg)JsonUtil.readValue(message,FmInsideOrderSuccessMsg.class);
fmInsideOrderSuccessMsgService.send(msg);
} else if(EnumMsgRecordType.INSIDE_COUPON_VERIFY.getCode().equals(baseMsg.getMsgType())) {
// 内部消息 - 券核销
FmInsideCouponVerifyMsg msg = (FmInsideCouponVerifyMsg)JsonUtil.readValue(message,FmInsideCouponVerifyMsg.class);
fmInsideCouponVerifyMsgService.send(msg);
}
baseMsg.setMsgStatus(EnumMsgRecordStatus.CONSUME_SUCC.getCode());
wxMsgRecordMapper.update(baseMsg);


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

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

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

@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class FmInsideCouponVerifyMsg 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 = "couponOrderId")
private Long couponOrderId;
@io.swagger.annotations.ApiModelProperty(value = "B端用户ID", name = "bUserId")
private Long bUserId;
}

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

@@ -1,6 +1,5 @@
package com.iformall.domain.po.msg;

import com.iformall.domain.po.msg.BaseMsg;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;


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

@@ -13,6 +13,7 @@ public enum EnumMsgRecordType {
SMART_APP_UNIFORM(7, "小程序统一消息"),
WEBSOCKET_APP(8, "小程序websocket"),
INSIDE_ORDER_SUCCESS(100, "下订单成功"),
INSIDE_COUPON_VERIFY(101, "券核销"),
;

public static EnumMsgRecordType getEnum(Integer code) {


+ 12
- 9
mallinkService/src/main/java/com/iformall/mapper/WxCouponOrderMapper.java Просмотреть файл

@@ -12,19 +12,25 @@ import java.util.Map;

public interface WxCouponOrderMapper extends CommonMapper<WxCouponOrder, Long> {

List<WxCouponOrder> findList(WxCouponOrder wxCouponOrder);

List<WxCouponOrder> findListOfOrderedByDate(Map dateMap);
List<WxCouponOrder> findListOfVerifiedByDate(Map dateMap);

List<WxCouponOrder> findExpiredFreeCouponOrderByValidDate();

List<WxCouponOrder> findExpiredCouponOrderByValidDate();

// 券包核销
int updateVerifyCouponOrder(WxCouponOrder wxCouponOrder);

//统一的计数接口
int findCount(WxCouponOrder wxCouponOrder);
//统一额度统计接口
int queryPriceTotal(WxCouponOrder wxCouponOrder);


List<WxCouponOrder> findList(WxCouponOrder wxCouponOrder);

List<WxCouponOrderCarCVo> findCarListOfCUser(WxCouponOrder wxCouponOrder);

List<WxCouponOrder> findListOfOrderedByDate(Map dateMap);
List<WxCouponOrder> findListOfVerifiedByDate(Map dateMap);

List<WxCouponOrderBVo> findListOfOrderedByDateForBUser(Map dateMap);
List<WxCouponOrderBVo> findListOfVerifiedByDateForBUser(Map dateMap);

@@ -57,9 +63,6 @@ public interface WxCouponOrderMapper extends CommonMapper<WxCouponOrder, Long> {
List<MarkingSceneDataVo> queryForSceneRepotyHistoryOrdered(HashMap<String,Object> params);


List<WxCouponOrder> findExpiredFreeCouponOrderByValidDate();

List<WxCouponOrder> findExpiredCouponOrderByValidDate();

//// 卡相关接口
List<WxCardCVo> findCardListOfCUser(WxCardCVo wxCardCVo);


+ 16
- 3
mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java Просмотреть файл

@@ -48,10 +48,23 @@ public interface WxCouponOrderService {
/**
* 根据主键couponOrderId(券码)核销
*
* @param couponOrderId
* @param bUserId 核销人(登录用户)
* @param couponOrder
* @param bUser 核销人(登录用户)
*/
WxCouponOrder verify(WxCouponOrder couponOrder, WxMerchantBUser bUser);

/**
* 核销后发送消息
*/
void sendInsideCouponVerifyMsg(WxCouponOrder couponOrder, WxMerchantBUser bUser);

/**
* 核销后处理
*
* @param couponOrder
* @param bUser 核销人(登录用户)
*/
WxCouponOrder verify(Long couponOrderId, Long bUserId);
void actionAfterVerify(WxCouponOrder couponOrder, WxMerchantBUser bUser);

/**
* 核销发券


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

@@ -11,9 +11,7 @@ import com.iformall.common.Result;
import com.iformall.common.ResultData;
import com.iformall.domain.dto.WxSharingOrderDto;
import com.iformall.domain.po.*;
import com.iformall.domain.po.msg.AppUniformMsg;
import com.iformall.domain.po.msg.MpAppMsg;
import com.iformall.domain.po.msg.SmartAppMsg;
import com.iformall.domain.po.msg.*;
import com.iformall.domain.vo.*;
import com.iformall.enums.*;
import com.iformall.exception.MallinkException;
@@ -276,61 +274,96 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService {

@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public WxCouponOrder verify(Long couponOrderId, Long bUserId) {
public WxCouponOrder verify(WxCouponOrder couponOrder, WxMerchantBUser bUser) {

WxCouponOrder wxCouponOrder = wxCouponOrderMapper.selectByPrimaryKey(couponOrderId);
if (wxCouponOrder == null) {
logger.error("券ID不存在:" + couponOrderId);
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_NULL);
}

WxMerchantBUser wxMerchantBUser = wxMerchantBUserMapper.selectByPrimaryKey(bUserId.longValue());
if (wxMerchantBUser == null) {
logger.error("核销员ID不存在:" + bUserId);
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_NULL);
}

WxCoupon wxCoupon = wxCouponMapper.selectByPrimaryKey(wxCouponOrder.getCouponId());
// 1. 获取券信息
WxCoupon wxCoupon = wxCouponMapper.selectByPrimaryKey(couponOrder.getCouponId());
if (wxCoupon == null) {
logger.error("券: coupon-" + wxCoupon.getId() + "不存在" + "couponOrder-" + wxCouponOrder.getId());
logger.error("券: coupon-" + wxCoupon.getId() + "不存在" + "couponOrder-" + couponOrder.getId());
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_NULL);
}else {
WxCouponMerchant wxCouponMerchant = new WxCouponMerchant();
wxCouponMerchant.setProductId(wxCoupon.getId());
wxCouponMerchant.setStatus(EnumCouponMerchantStatus.COUPON_MERCHANT_STATUS_VALID.getCode());
List<WxCouponMerchant> couponMerchantList = wxCouponMerchantMapper.findList(wxCouponMerchant);
if (!couponMerchantList.stream().anyMatch(cm->cm.getMerchantId().equals(wxMerchantBUser.getMerchantId()))){
logger.error("券: coupon-" + wxCoupon.getId() + "核销: couponMerchantId-" + wxMerchantBUser.getMerchantId());
throw new MallinkException(ErrorCode.VERIFY_COUPON_ORDER_MERCHANT_IS_NULL);
}
}

// 2. 检查适用门店
WxCouponMerchant wxCouponMerchant = new WxCouponMerchant();
wxCouponMerchant.setProductId(wxCoupon.getId());
wxCouponMerchant.setStatus(EnumCouponMerchantStatus.COUPON_MERCHANT_STATUS_VALID.getCode());
List<WxCouponMerchant> couponMerchantList = wxCouponMerchantMapper.findList(wxCouponMerchant);
if (!couponMerchantList.stream().anyMatch(cm->cm.getMerchantId().equals(bUser.getMerchantId()))){
logger.error("券: coupon-" + wxCoupon.getId() + "核销: couponMerchantId-" + bUser.getMerchantId());
throw new MallinkException(ErrorCode.VERIFY_COUPON_ORDER_MERCHANT_IS_NULL);
}

if (wxCouponOrder.getCouponOrderStatus() == EnumCouponOrderStatus.COUPON_ORDER_OVER_TIME.getCode()) {
logger.error("已过期: couponOrder-" + wxCouponOrder.getId());
// 3. 券包状态检查
if (couponOrder.getCouponOrderStatus() == EnumCouponOrderStatus.COUPON_ORDER_OVER_TIME.getCode()) {
logger.error("已过期: couponOrder-" + couponOrder.getId());
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_OVER_TIME);
}
if (wxCouponOrder.getCouponOrderStatus() == EnumCouponOrderStatus.COUPON_ORDER_INVALID.getCode()) {
logger.error("已退款: couponOrder-" + wxCouponOrder.getId());
if (couponOrder.getCouponOrderStatus() == EnumCouponOrderStatus.COUPON_ORDER_INVALID.getCode()) {
logger.error("已退款: couponOrder-" + couponOrder.getId());
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_INVALID);
}
if (wxCouponOrder.getCouponOrderStatus() == EnumCouponOrderStatus.COUPON_ORDER_USED.getCode()) {
logger.error("已经核销过的券: couponOrder-" + wxCouponOrder.getId());
if (couponOrder.getCouponOrderStatus() == EnumCouponOrderStatus.COUPON_ORDER_USED.getCode()) {
logger.error("已经核销过的券: couponOrder-" + couponOrder.getId());
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_USED);
}
int num = 0;
try {
wxCouponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USED.getCode()); //1核销
wxCouponOrder.setbUserId(wxMerchantBUser.getId());
wxCouponOrder.setUpdateDate(new Date());
wxCouponOrderMapper.updateByPrimaryKeySelective(wxCouponOrder);
couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USED.getCode()); //1核销
couponOrder.setbUserId(bUser.getId());
couponOrder.setUpdateDate(new Date());
num = wxCouponOrderMapper.updateVerifyCouponOrder(couponOrder);
} catch (Exception e) {
logger.error("db failed: couponOrder-" + wxCouponOrder.getId() + ", e:" + e.getMessage());
logger.error("db failed: couponOrder-" + couponOrder.getId() + ", e:" + e.getMessage());
throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage());
}
if(num != 1) {
logger.error("核销异常:updatete num " + num);
throw new MallinkException(ErrorCode.VERIFY_ERROR.getCode(), "updatete num " + num);
}
return couponOrder;
}

return wxCouponOrder;
@Override
public void sendInsideCouponVerifyMsg(WxCouponOrder couponOrder, WxMerchantBUser bUser) {
FmInsideCouponVerifyMsg verifyMsg = new FmInsideCouponVerifyMsg();
verifyMsg.setMsgType(EnumMsgRecordType.INSIDE_COUPON_VERIFY.getCode());
verifyMsg.setTenantId(couponOrder.getTenantId());
verifyMsg.setCouponOrderId(couponOrder.getId());
verifyMsg.setBUserId(bUser.getId());
mqBaseProducer.sendMessage(verifyMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode());
}

@Override
public void actionAfterVerify(WxCouponOrder couponOrder, WxMerchantBUser bUser) {
try {
// 核销分账
shareAfterVerify(couponOrder, bUser.getMerchantId());
} catch (Exception e) {
logger.error(e.getMessage());
}

try {
// 核销补贴
subsidyAfterVerify(couponOrder, bUser.getMerchantId());
} catch (Exception e) {
logger.error(e.getMessage());
}

boolean bSentCoupon = false;

// 核销发券
try {
bSentCoupon = sendCouponAfterVerify(couponOrder, bUser);
} catch (Exception e) {
logger.error(e.getMessage());
}

// 核销发模板消息
try {
sendVerifyMsg(couponOrder, bUser, bSentCoupon);
} catch (Exception e) {
logger.error("核销发送消息发生错误:"+e.getMessage());
}
}

@Override
@@ -510,6 +543,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService {

// 6. get payOrder info
if(StringUtils.isBlank(order.getFormId())) {
// formId为空,获取prepayId
WxPayOrder payOrder = null;
WxPayOrder payOrderQ = new WxPayOrder();
payOrderQ.setTenantId(couponOrder.getTenantId());
@@ -557,129 +591,154 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService {
StringUtils.isNotBlank(user.getMpOpenId()) &&
user.getMpSubscribe().equals(EnumUserIsSubscribe.YES.getCode())) {
// 已关注公众号
/**
* 卡券核销通知
* {{first.DATA}}
* 卡券类型:{{keyword1.DATA}}
* 卡券号码:{{keyword2.DATA}}
* 核销时间:{{keyword3.DATA}}
* {{remark.DATA}}
*/
MpAppMsg mpAppMsg = new MpAppMsg();
mpAppMsg.setMsgType(EnumMsgRecordType.PUBLIC.getCode());
mpAppMsg.setAppId(user.getMpAppId());
mpAppMsg.setTo(user.getMpOpenId());
mpAppMsg.setMiniAppId(user.getAppId());
mpAppMsg.setMiniPagePath(gotopage);
mpAppMsg.setTenantId(couponOrder.getTenantId());
mpAppMsg.setTemplateType(EnumTemplateType.VERIFY_RESULT.getCode());
mpAppMsg.setTemplateDataList(Lists.newArrayList(
new WxMpTemplateData("first", "商家"+merchant.getName()+"的券被核销", "#173177"),
new WxMpTemplateData("keyword1", EnumCouponType.getEnum(coupon.getType()).getMessage(), "#173177"),
new WxMpTemplateData("keyword2", couponOrder.getId().toString(), "#173177"),
new WxMpTemplateData("keyword3", dateFormat.format(new Date()), "#173177"),
new WxMpTemplateData("remark", "更多优惠等您来!", "#173177")
));

try {
mqBaseProducer.sendMessage(mpAppMsg, EnumMsgMqTopic.DEFAULT.getCode(),EnumMsgMqTag.DEFAULT.getCode(),EnumMsgMqKey.DEFAULT.getCode());
} catch (Exception e) {
logger.error("核销-公众号-模板消息发送失败: " + e.getMessage());
throw new MallinkException(ErrorCode.MP_TEMPLATE_SEND_FAILED);
}
doVerifyMpMsg(couponOrder, coupon, merchant, user, dateFormat, gotopage);
return;
} else {
// 可能未关注公众号, 用户可能收不到
// 8. 微信小程序-统一消息
// 获取小程序关联的服务号
WxAuthorizerInfo authQ = new WxAuthorizerInfo();
authQ.setAuthorizerAppid(user.getAppId());
authQ.setTenantId(user.getTenantId());
WxAuthorizerInfo weappInfo = authorizerInfoMapper.findMp(authQ);
if(weappInfo != null) {
AppUniformMsg appUniformMsg = new AppUniformMsg();
appUniformMsg.setMsgType(EnumMsgRecordType.SMART_APP_UNIFORM.getCode());
appUniformMsg.setAppId(user.getAppId());
appUniformMsg.setTo(user.getOpenId());
appUniformMsg.setTemplateType(EnumTemplateType.VERIFY_RESULT.getCode());
appUniformMsg.setPagePath(gotopage);
appUniformMsg.setUrl("http://iformall.com");
appUniformMsg.setMpAppId(weappInfo.getAuthorizerAppid());
appUniformMsg.setTemplateDataList(Lists.newArrayList(
new WxMaTemplateData("first", "商家"+merchant.getName()+"的券被核销", "#173177"),
new WxMaTemplateData("keyword1", EnumCouponType.getEnum(coupon.getType()).getMessage(), "#173177"),
new WxMaTemplateData("keyword2", couponOrder.getId().toString(), "#173177"),
new WxMaTemplateData("keyword3", dateFormat.format(new Date()), "#173177"),
new WxMaTemplateData("remark", "更多优惠等您来!", "#173177")
));
try {
mqBaseProducer.sendMessage(appUniformMsg, EnumMsgMqTopic.DEFAULT.getCode(),EnumMsgMqTag.DEFAULT.getCode(),EnumMsgMqKey.DEFAULT.getCode());
} catch (Exception e) {
logger.error("核销-公众号-模板消息发送失败: " + e.getMessage());
throw new MallinkException(ErrorCode.UNIFORM_SEND_FAILED);
}
}
doVerifyAppUniformMsg(couponOrder, coupon, merchant, user, dateFormat, gotopage);
}

// 9. 微信小程序-模板消息
SmartAppMsg smartAppMsg;
if (bUsed) {
//mq发送小程序消息 - 核销成功消息
/**
* 核销成功消息
* 核销金额 {{keyword1.DATA}}
* 商家名称 {{keyword2.DATA}}
* 商品 {{keyword3.DATA}}
* 商品描述 {{keyword4.DATA}}
* 订单金额 {{keyword5.DATA}}
* 核销时间 {{keyword6.DATA}}
* 温馨提示 {{keyword7.DATA}}
*/
smartAppMsg = new SmartAppMsg();
smartAppMsg.setMsgType(EnumMsgRecordType.SMART_APP.getCode());
smartAppMsg.setAppId(user.getAppId());
smartAppMsg.setTenantId(couponOrder.getTenantId());
smartAppMsg.setTemplateType(EnumTemplateType.VERIFY_SUCCESS.getCode());
smartAppMsg.setGotopage(gotopage);
smartAppMsg.setTo(user.getOpenId());
smartAppMsg.setFormId(formId);
smartAppMsg.setTemplateDataList(Lists.newArrayList(
new WxMaTemplateData("keyword1", coupon.getPriceStr() + "元", "#173177"),
new WxMaTemplateData("keyword2", merchant.getName(), "#173177"),
new WxMaTemplateData("keyword3", coupon.getTitle(), "#173177"),
new WxMaTemplateData("keyword4", couponDetail, "#173177"),
new WxMaTemplateData("keyword5", coupon.getSalePriceStr() + "元", "#173177"),
new WxMaTemplateData("keyword6", dateFormat.format(new Date()), "#173177"),
new WxMaTemplateData("keyword7", notes, "#173177")));
smartAppMsg.setEmphasisKeyword("keyword1.DATA");
doVerifySuccessMsg(couponOrder, formId, coupon, merchant, user, dateFormat, couponDetail, gotopage, notes);
} else {
// mq发送小程序消息 - 核销失败消息
/**
* 核销失败消息
* 商品名称 {{keyword1.DATA}}
* 核销时间 {{keyword2.DATA}}
* 失败原因 {{keyword3.DATA}}
* 备注 {{keyword4.DATA}}
*/
smartAppMsg = new SmartAppMsg();
smartAppMsg.setMsgType(EnumMsgRecordType.SMART_APP.getCode());
smartAppMsg.setAppId(user.getAppId());
smartAppMsg.setTenantId(couponOrder.getTenantId());
smartAppMsg.setTemplateType(EnumTemplateType.VERIFY_FAIL.getCode());
smartAppMsg.setGotopage(gotopage);
smartAppMsg.setTo(user.getOpenId());
smartAppMsg.setReceiver(user.getOpenId());
smartAppMsg.setFormId(formId);
smartAppMsg.setTemplateDataList(Lists.newArrayList(
new WxMaTemplateData("keyword1", coupon.getTitle(), "#173177"),
new WxMaTemplateData("keyword2", dateFormat.format(new Date()), "#173177"),
new WxMaTemplateData("keyword3", "未知"),
new WxMaTemplateData("keyword4", couponDetail)));
smartAppMsg.setEmphasisKeyword("keyword1.DATA");
doVerifyFailMsg(couponOrder, formId, coupon, user, dateFormat, couponDetail, gotopage);
}


}

private void doVerifyMpMsg(WxCouponOrder couponOrder, WxCoupon coupon, WxMerchant merchant, WxCUser user, SimpleDateFormat dateFormat, String gotopage) {
/**
* 卡券核销通知
* {{first.DATA}}
* 卡券类型:{{keyword1.DATA}}
* 卡券号码:{{keyword2.DATA}}
* 核销时间:{{keyword3.DATA}}
* {{remark.DATA}}
*/
MpAppMsg mpAppMsg = new MpAppMsg();
mpAppMsg.setMsgType(EnumMsgRecordType.PUBLIC.getCode());
mpAppMsg.setAppId(user.getMpAppId());
mpAppMsg.setTo(user.getMpOpenId());
mpAppMsg.setMiniAppId(user.getAppId());
mpAppMsg.setMiniPagePath(gotopage);
mpAppMsg.setTenantId(couponOrder.getTenantId());
mpAppMsg.setTemplateType(EnumTemplateType.VERIFY_RESULT.getCode());
mpAppMsg.setTemplateDataList(Lists.newArrayList(
new WxMpTemplateData("first", "商家"+merchant.getName()+"的券被核销", "#173177"),
new WxMpTemplateData("keyword1", EnumCouponType.getEnum(coupon.getType()).getMessage(), "#173177"),
new WxMpTemplateData("keyword2", couponOrder.getId().toString(), "#173177"),
new WxMpTemplateData("keyword3", dateFormat.format(new Date()), "#173177"),
new WxMpTemplateData("remark", "更多优惠等您来!", "#173177")
));

try {
mqBaseProducer.sendMessage(mpAppMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(),EnumMsgMqKey.DEFAULT.getCode());
} catch (Exception e) {
logger.error("核销-公众号-模板消息发送失败: " + e.getMessage());
throw new MallinkException(ErrorCode.MP_TEMPLATE_SEND_FAILED);
}
}

private void doVerifyAppUniformMsg(WxCouponOrder couponOrder, WxCoupon coupon, WxMerchant merchant, WxCUser user, SimpleDateFormat dateFormat, String gotopage) {
WxAuthorizerInfo authQ = new WxAuthorizerInfo();
authQ.setAuthorizerAppid(user.getAppId());
authQ.setTenantId(user.getTenantId());
WxAuthorizerInfo weappInfo = authorizerInfoMapper.findMp(authQ);
if(weappInfo != null) {
AppUniformMsg appUniformMsg = new AppUniformMsg();
appUniformMsg.setMsgType(EnumMsgRecordType.SMART_APP_UNIFORM.getCode());
appUniformMsg.setAppId(user.getAppId());
appUniformMsg.setTo(user.getOpenId());
appUniformMsg.setTemplateType(EnumTemplateType.VERIFY_RESULT.getCode());
appUniformMsg.setPagePath(gotopage);
appUniformMsg.setUrl("http://iformall.com");
appUniformMsg.setMpAppId(weappInfo.getAuthorizerAppid());
appUniformMsg.setTemplateDataList(Lists.newArrayList(
new WxMaTemplateData("first", "商家"+merchant.getName()+"的券被核销", "#173177"),
new WxMaTemplateData("keyword1", EnumCouponType.getEnum(coupon.getType()).getMessage(), "#173177"),
new WxMaTemplateData("keyword2", couponOrder.getId().toString(), "#173177"),
new WxMaTemplateData("keyword3", dateFormat.format(new Date()), "#173177"),
new WxMaTemplateData("remark", "更多优惠等您来!", "#173177")
));
try {
mqBaseProducer.sendMessage(appUniformMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(),EnumMsgMqKey.DEFAULT.getCode());
} catch (Exception e) {
logger.error("核销-公众号-模板消息发送失败: " + e.getMessage());
throw new MallinkException(ErrorCode.UNIFORM_SEND_FAILED);
}
}
}

private void doVerifySuccessMsg(WxCouponOrder couponOrder, String formId, WxCoupon coupon, WxMerchant merchant, WxCUser user, SimpleDateFormat dateFormat, String couponDetail, String gotopage, String notes) {
SmartAppMsg smartAppMsg; /**
* 核销成功消息
* 核销金额 {{keyword1.DATA}}
* 商家名称 {{keyword2.DATA}}
* 商品 {{keyword3.DATA}}
* 商品描述 {{keyword4.DATA}}
* 订单金额 {{keyword5.DATA}}
* 核销时间 {{keyword6.DATA}}
* 温馨提示 {{keyword7.DATA}}
*/
smartAppMsg = new SmartAppMsg();
smartAppMsg.setMsgType(EnumMsgRecordType.SMART_APP.getCode());
smartAppMsg.setAppId(user.getAppId());
smartAppMsg.setTenantId(couponOrder.getTenantId());
smartAppMsg.setTemplateType(EnumTemplateType.VERIFY_SUCCESS.getCode());
smartAppMsg.setGotopage(gotopage);
smartAppMsg.setTo(user.getOpenId());
smartAppMsg.setFormId(formId);
smartAppMsg.setTemplateDataList(Lists.newArrayList(
new WxMaTemplateData("keyword1", coupon.getPriceStr() + "元", "#173177"),
new WxMaTemplateData("keyword2", merchant.getName(), "#173177"),
new WxMaTemplateData("keyword3", coupon.getTitle(), "#173177"),
new WxMaTemplateData("keyword4", couponDetail, "#173177"),
new WxMaTemplateData("keyword5", coupon.getSalePriceStr() + "元", "#173177"),
new WxMaTemplateData("keyword6", dateFormat.format(new Date()), "#173177"),
new WxMaTemplateData("keyword7", notes, "#173177")));
smartAppMsg.setEmphasisKeyword("keyword1.DATA");

try {
mqBaseProducer.sendMessage(smartAppMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode());
} catch (Exception e) {
logger.error("支付通知发送失败: " + e.getMessage());
throw new MallinkException(ErrorCode.TEMPLATE_SEND_FAILED);
}
}

private void doVerifyFailMsg(WxCouponOrder couponOrder, String formId, WxCoupon coupon, WxCUser user, SimpleDateFormat dateFormat, String couponDetail, String gotopage) {
SmartAppMsg smartAppMsg; /**
* 核销失败消息
* 商品名称 {{keyword1.DATA}}
* 核销时间 {{keyword2.DATA}}
* 失败原因 {{keyword3.DATA}}
* 备注 {{keyword4.DATA}}
*/
smartAppMsg = new SmartAppMsg();
smartAppMsg.setMsgType(EnumMsgRecordType.SMART_APP.getCode());
smartAppMsg.setAppId(user.getAppId());
smartAppMsg.setTenantId(couponOrder.getTenantId());
smartAppMsg.setTemplateType(EnumTemplateType.VERIFY_FAIL.getCode());
smartAppMsg.setGotopage(gotopage);
smartAppMsg.setTo(user.getOpenId());
smartAppMsg.setReceiver(user.getOpenId());
smartAppMsg.setFormId(formId);
smartAppMsg.setTemplateDataList(Lists.newArrayList(
new WxMaTemplateData("keyword1", coupon.getTitle(), "#173177"),
new WxMaTemplateData("keyword2", dateFormat.format(new Date()), "#173177"),
new WxMaTemplateData("keyword3", "未知"),
new WxMaTemplateData("keyword4", couponDetail)));
smartAppMsg.setEmphasisKeyword("keyword1.DATA");

try {
mqBaseProducer.sendMessage(smartAppMsg, EnumMsgMqTopic.DEFAULT.getCode(),EnumMsgMqTag.DEFAULT.getCode(),EnumMsgMqKey.DEFAULT.getCode());
mqBaseProducer.sendMessage(smartAppMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode());
} catch (Exception e) {
logger.error("支付通知发送失败: " + e.getMessage());
throw new MallinkException(ErrorCode.TEMPLATE_SEND_FAILED);


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

@@ -234,23 +234,28 @@ public class WxCouponSendServiceImpl implements WxCouponSendService {
try {
couponOrder = wxOrderService.sendFreeCouponToUser(cUserId, send.getCouponId());
if (couponOrder != null) {
bRet = true;

wxCouponActionLogService.addOne(tenantId, send.getCouponId(), couponOrder.getId(), type.getCode(), send.getId());

// 查找cUser
WxCUser user = wxCUserMapper.selectByPrimaryKey(cUserId);
if(user == null) {
continue;
}

// 发送消息
if(couponOrder != null) {
sendMsgForSendCoupon(tenantId, send, couponOrder, user);
}

bRet = true;
}
} catch (Exception e) {
logger.error(e.getMessage());
}

// 查找cUser
WxCUser user = wxCUserMapper.selectByPrimaryKey(cUserId);
if(user == null) {
continue;
}

// 发送消息
if(couponOrder != null) {
sendMsgForSendCoupon(tenantId, send, couponOrder, user);
}
}

return bRet;


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

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

import com.iformall.common.ErrorCode;
import com.iformall.domain.po.*;
import com.iformall.domain.po.msg.BaseMsg;
import com.iformall.domain.po.msg.FmInsideCouponVerifyMsg;
import com.iformall.domain.po.msg.FmInsideOrderSuccessMsg;
import com.iformall.exception.MallinkException;
import com.iformall.service.*;
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 FmInsideCouponVerifyMsgServiceImpl implements MsgSendService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
private WxCouponOrderService couponOrderService;

@Autowired
private WxMerchantBUserService merchantBUserService;

@Override
public void send(BaseMsg baseMsg) throws Exception{
FmInsideCouponVerifyMsg msg = (FmInsideCouponVerifyMsg)baseMsg;
WxCouponOrder couponOrder = couponOrderService.getById(msg.getCouponOrderId());
if(couponOrder == null) {
logger.error("券包ID未找到: " + msg.getCouponOrderId());
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_NULL.getCode(), "券包ID未找到" + msg.getCouponOrderId());
}

WxMerchantBUser user = merchantBUserService.getById(msg.getBUserId());
if(user == null) {
logger.error("用户未找到: " + msg.getBUserId());
throw new MallinkException(ErrorCode.USER_IS_EMPTY.getCode(), "用户未找到" + msg.getBUserId());
}

couponOrderService.actionAfterVerify(couponOrder, user);
}
}

+ 8
- 0
mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml Просмотреть файл

@@ -95,6 +95,14 @@
<include refid="dynamicWhereConditions" />
</select>

<update id="updateVerifyCouponOrder" parameterType="com.iformall.domain.po.WxCouponOrder">
update wx_coupon_order
set `coupon_order_status` = #{couponOrderStatus},
`b_user_id` = #{bUserId},
`update_date` = #{updateDate}
where `tenant_id`=#{tenantId} and id=#{id} and `b_user_id` is null
</update>

<select id="couponDataMap" resultType="com.iformall.domain.vo.MarkingCouponDataReportVo" parameterType="hashmap">
SELECT DATE_FORMAT(create_date,'%m/%d') as createTime,
COUNT(DISTINCT c_user_id) as couponUserCount,


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