diff --git a/yshop-common/src/main/java/co/yixiang/event/TemplateBean.java b/yshop-common/src/main/java/co/yixiang/event/TemplateBean.java index 7a81f591..2c651e04 100644 --- a/yshop-common/src/main/java/co/yixiang/event/TemplateBean.java +++ b/yshop-common/src/main/java/co/yixiang/event/TemplateBean.java @@ -25,5 +25,9 @@ public class TemplateBean { private String deliveryId; private String payType; private Long uid; + /** + * 提现申请ID + */ + private Long extractId; } diff --git a/yshop-common/src/main/java/co/yixiang/event/TemplateListenEnum.java b/yshop-common/src/main/java/co/yixiang/event/TemplateListenEnum.java index 6d05b545..76122506 100644 --- a/yshop-common/src/main/java/co/yixiang/event/TemplateListenEnum.java +++ b/yshop-common/src/main/java/co/yixiang/event/TemplateListenEnum.java @@ -20,7 +20,8 @@ public enum TemplateListenEnum { TYPE_4("4","充值成功通知"), TYPE_5("5","在线买单/收款成功通知"), TYPE_6("6","商家收款通知"), - TYPE_7("7","用户下单未支付通知"); + TYPE_7("7","用户下单未支付通知"), + TYPE_8("8","用户体现通知"); private String value; private String desc; diff --git a/yshop-mall/src/main/java/co/yixiang/modules/activity/service/impl/YxUserExtractServiceImpl.java b/yshop-mall/src/main/java/co/yixiang/modules/activity/service/impl/YxUserExtractServiceImpl.java index d4f56b54..9804d407 100644 --- a/yshop-mall/src/main/java/co/yixiang/modules/activity/service/impl/YxUserExtractServiceImpl.java +++ b/yshop-mall/src/main/java/co/yixiang/modules/activity/service/impl/YxUserExtractServiceImpl.java @@ -9,6 +9,7 @@ package co.yixiang.modules.activity.service.impl; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import co.yixiang.api.YshopException; import co.yixiang.common.service.impl.BaseServiceImpl; @@ -17,6 +18,9 @@ import co.yixiang.dozer.service.IGenerator; import co.yixiang.enums.BillDetailEnum; import co.yixiang.enums.PayTypeEnum; import co.yixiang.enums.ShopCommonEnum; +import co.yixiang.event.TemplateBean; +import co.yixiang.event.TemplateEvent; +import co.yixiang.event.TemplateListenEnum; import co.yixiang.exception.BadRequestException; import co.yixiang.modules.activity.domain.YxUserExtract; import co.yixiang.modules.activity.param.UserExtParam; @@ -27,9 +31,14 @@ import co.yixiang.modules.activity.service.mapper.YxUserExtractMapper; import co.yixiang.modules.user.domain.YxUser; import co.yixiang.modules.user.service.YxUserBillService; import co.yixiang.modules.user.service.YxUserService; +import co.yixiang.modules.user.service.dto.WechatUserDto; +import co.yixiang.modules.user.service.dto.YxWechatUserDto; import co.yixiang.utils.FileUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.github.binarywang.wxpay.exception.WxPayException; import com.github.pagehelper.PageInfo; import lombok.AllArgsConstructor; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; @@ -58,7 +67,7 @@ public class YxUserExtractServiceImpl extends BaseServiceImpl().eq("uid",resources.getUid())),YxWechatUserDto.class); - if(ObjectUtil.isNotNull(wechatUser)){ - try { - payService.entPay(wechatUser.getOpenid(),resources.getId().toString(), - resources.getRealName(), - resources.getExtractPrice().multiply(new BigDecimal(100)).intValue()); - } catch (WxPayException e) { - throw new BadRequestException(e.getMessage()); - } - }else{ - throw new BadRequestException("不是微信用户无法退款"); - } - - } - **/ - this.saveOrUpdate(resources); } } diff --git a/yshop-weixin/src/main/java/co/yixiang/modules/mp/listener/TemplateListener.java b/yshop-weixin/src/main/java/co/yixiang/modules/mp/listener/TemplateListener.java index 561c93c2..edddc72e 100644 --- a/yshop-weixin/src/main/java/co/yixiang/modules/mp/listener/TemplateListener.java +++ b/yshop-weixin/src/main/java/co/yixiang/modules/mp/listener/TemplateListener.java @@ -9,14 +9,26 @@ package co.yixiang.modules.mp.listener; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import co.yixiang.enums.BillDetailEnum; import co.yixiang.enums.PayTypeEnum; import co.yixiang.event.TemplateBean; import co.yixiang.event.TemplateEvent; import co.yixiang.event.TemplateListenEnum; +import co.yixiang.exception.BadRequestException; import co.yixiang.message.rocketmq.MqProducer; +import co.yixiang.modules.activity.domain.YxUserExtract; +import co.yixiang.modules.activity.service.YxUserExtractService; import co.yixiang.modules.mp.service.WeiXinSubscribeService; import co.yixiang.modules.mp.service.WeixinPayService; import co.yixiang.modules.mp.service.WeixinTemplateService; +import co.yixiang.modules.user.domain.YxUser; +import co.yixiang.modules.user.service.YxUserBillService; +import co.yixiang.modules.user.service.YxUserService; +import co.yixiang.modules.user.service.dto.WechatUserDto; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.github.binarywang.wxpay.exception.WxPayException; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEvent; @@ -25,6 +37,8 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.math.BigDecimal; +import java.util.Date; +import java.util.UUID; /** * @author hupeng @@ -33,64 +47,106 @@ import java.math.BigDecimal; @Slf4j @Component public class TemplateListener implements SmartApplicationListener { - - @Autowired - private WeixinTemplateService weixinTemplateService; - @Autowired - private WeixinPayService weixinPayService; - @Autowired - private WeiXinSubscribeService weiXinSubscribeService; + @Autowired + private YxUserService userService; + @Autowired + private WeixinTemplateService weixinTemplateService; + @Autowired + private WeixinPayService weixinPayService; + @Autowired + private WeiXinSubscribeService weiXinSubscribeService; + @Autowired + private YxUserExtractService yxUserExtractService; + @Autowired + private WeixinPayService payService; + @Autowired + private YxUserBillService billService; //@Autowired //private MqProducer mqProducer; - @Override - public boolean supportsEventType(Class aClass) { - return aClass == TemplateEvent.class; - } + @Override + public boolean supportsEventType(Class aClass) { + return aClass == TemplateEvent.class; + } - @Async - @Override - public void onApplicationEvent(ApplicationEvent applicationEvent) { - //转换事件类型 - TemplateEvent templateEvent = (TemplateEvent) applicationEvent; - //获取注册用户对象信息 - TemplateBean templateBean = templateEvent.getTemplateBean(); - log.info("模板事件类型:{}",templateBean.getTemplateType()); - switch (TemplateListenEnum.toType(templateBean.getTemplateType())){ - case TYPE_1: - weixinTemplateService.paySuccessNotice(templateBean.getOrderId() - ,templateBean.getPrice(),templateBean.getUid()); - weiXinSubscribeService.paySuccessNotice(templateBean.getOrderId() - ,templateBean.getPrice(),templateBean.getUid()); - break; - case TYPE_2: - //处理退款与消息 - if(PayTypeEnum.WEIXIN.getValue().equals(templateBean.getPayType())){ - BigDecimal bigDecimal = new BigDecimal("100"); - int payPrice = bigDecimal.multiply(new BigDecimal(templateBean.getPrice())).intValue(); - weixinPayService.refundOrder(templateBean.getOrderId(),payPrice); - } + @Async + @Override + public void onApplicationEvent(ApplicationEvent applicationEvent) { + //转换事件类型 + TemplateEvent templateEvent = (TemplateEvent) applicationEvent; + //获取注册用户对象信息 + TemplateBean templateBean = templateEvent.getTemplateBean(); + log.info("模板事件类型:{}", templateBean.getTemplateType()); + switch (TemplateListenEnum.toType(templateBean.getTemplateType())) { + case TYPE_1: + weixinTemplateService.paySuccessNotice(templateBean.getOrderId() + , templateBean.getPrice(), templateBean.getUid()); + weiXinSubscribeService.paySuccessNotice(templateBean.getOrderId() + , templateBean.getPrice(), templateBean.getUid()); + break; + case TYPE_2: + //处理退款与消息 + if (PayTypeEnum.WEIXIN.getValue().equals(templateBean.getPayType())) { + BigDecimal bigDecimal = new BigDecimal("100"); + int payPrice = bigDecimal.multiply(new BigDecimal(templateBean.getPrice())).intValue(); + weixinPayService.refundOrder(templateBean.getOrderId(), payPrice); + } - weixinTemplateService.refundSuccessNotice(templateBean.getOrderId(),templateBean.getPrice(), - templateBean.getUid(),templateBean.getTime()); - break; - case TYPE_3: - weixinTemplateService.deliverySuccessNotice(templateBean.getOrderId(),templateBean.getDeliveryName(), - templateBean.getDeliveryId(),templateBean.getUid()); - break; - case TYPE_4: - weixinTemplateService.rechargeSuccessNotice(templateBean.getTime(),templateBean.getPrice(), - templateBean.getUid()); - break; + weixinTemplateService.refundSuccessNotice(templateBean.getOrderId(), templateBean.getPrice(), + templateBean.getUid(), templateBean.getTime()); + break; + case TYPE_3: + weixinTemplateService.deliverySuccessNotice(templateBean.getOrderId(), templateBean.getDeliveryName(), + templateBean.getDeliveryId(), templateBean.getUid()); + break; + case TYPE_4: + weixinTemplateService.rechargeSuccessNotice(templateBean.getTime(), templateBean.getPrice(), + templateBean.getUid()); + break; case TYPE_7: //使用MQ延时消息 //mqProducer.sendMsg("yshop-topic", templateBean.getOrderId()); log.info("投递延时订单id: [{}]:", templateBean.getOrderId()); + break; + case TYPE_8: + YxUserExtract resources = yxUserExtractService.getById(templateBean.getExtractId()); + Boolean success = false; + YxUser user = userService.getById(resources.getUid()); + if (user != null) { + WechatUserDto wechatUser = user.getWxProfile(); + if (ObjectUtil.isNotNull(wechatUser)) { + try { + String nonce_str = UUID.randomUUID().toString().replace("-", ""); + payService.entPay(wechatUser.getOpenid(), nonce_str, + resources.getRealName(), + resources.getExtractPrice().multiply(new BigDecimal(100)).intValue()); + success = true; + } catch (WxPayException e) { + log.error("退款失败,原因:{}",e.getMessage()); + } + } + } + if (!success) { + String mark = "提现失败,退回佣金" + resources.getExtractPrice() + "元"; + double balance = NumberUtil.add(user.getBrokeragePrice(), resources.getExtractPrice()).doubleValue(); + //插入流水 + billService.income(resources.getUid(), "提现失败", BillDetailEnum.CATEGORY_1.getValue(), + BillDetailEnum.TYPE_4.getValue(), resources.getExtractPrice().doubleValue(), balance, + mark, resources.getId().toString()); + //返回提现金额 + userService.incBrokeragePrice(resources.getExtractPrice(), resources.getUid()); + resources.setFailTime(new Date()); + yxUserExtractService.updateById(resources); + } + + + + break; default: //todo } - } + } }