From 52921e7f6a73230ef81bbd1d04a3bfec10833c18 Mon Sep 17 00:00:00 2001 From: xhxu Date: Thu, 22 Apr 2021 16:49:58 +0800 Subject: [PATCH] wxbusiness --- .../V202104220001__add_merchant_Cash-out.sql | 17 ++ .../java/com/iformall/config/ShiroConfig.java | 2 +- .../callback/WxBusinessOrderController.java | 165 +++++++----------- .../java/com/iformall/mq/MqBaseConsumer.java | 8 + .../com/iformall/domain/po/msg/BaseMsg.java | 8 + .../po/msg/FmInsideBusinessCircleMsg.java | 32 ++++ .../com/iformall/enums/EnumMsgRecordType.java | 5 +- .../com/iformall/enums/EnumScoreType.java | 2 + .../java/com/iformall/enums/EnumUserType.java | 4 +- .../mapper/WxBusinessCircleOrderMapper.java | 4 + .../service/WxBusinessCircleOrderService.java | 32 ++++ .../WxBusinessCircleOrderServiceImpl.java | 63 ++++++- .../impl/WxCreditHistoryServiceImpl.java | 6 +- .../FmInsideBusinessCircleMsgServiceImpl.java | 147 ++++++++++++++++ .../main/java/com/iformall/utils/MaUtil.java | 17 +- .../mapper/WxBusinessCircleOrderMapper.xml | 8 + 16 files changed, 404 insertions(+), 116 deletions(-) create mode 100644 mallinkAdmin/src/main/resources/db/migration/V202104220001__add_merchant_Cash-out.sql create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/msg/FmInsideBusinessCircleMsg.java create mode 100644 mallinkService/src/main/java/com/iformall/service/msg/impl/FmInsideBusinessCircleMsgServiceImpl.java diff --git a/mallinkAdmin/src/main/resources/db/migration/V202104220001__add_merchant_Cash-out.sql b/mallinkAdmin/src/main/resources/db/migration/V202104220001__add_merchant_Cash-out.sql new file mode 100644 index 000000000..4fb550a26 --- /dev/null +++ b/mallinkAdmin/src/main/resources/db/migration/V202104220001__add_merchant_Cash-out.sql @@ -0,0 +1,17 @@ +--加商户提现菜单 + +INSERT INTO `mall_permission`(`id`, `name`, `parent_id`, `available`, `permission`, `resource_type`, `module_color`, `module_color_num`, `url`, `icon`, `version_type`, `sort`) VALUES (614, '商户提现', 6, 'Y', NULL, 1, NULL, NULL, 'merchantCashout', 'icon-tixian', 0, 610); + + +--销售类型加权限 +update mall_sale_type set menus = '[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 50, 101, 102, 103, 104, 105, 106, 107, 108, 201, 202, 203, 204, 205, 206, 209, 211, 212, 221, 222, 251, 299, 300, 301, 302, 303, 304, 305, 306, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 501, 502, 503, 504, 505, 506, 507, 508, 509, 511, 512, 513, 514, 521, 522, 523, 531, 532, 533, 591, 592, 595, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 621, 622, 623, 624, 625, 626, 627, 641, 642, 643, 644, 645, 646, 651, 661, 662, 663, 664, 671, 672, 673, 674, 675, 681, 682, 683, 684, 685, 686, 691, 692, 693, 694, 695, 701, 702, 703, 704, 711, 712, 713, 901, 902, 903, 904, 905, 931, 932, 951, 952, 961, 962, 963, 965, 966, 967, 968, 1001, 1002, 1003, 1004, 60701, 60702]' where id=1; +update mall_sale_type set menus = '[1, 2, 4, 5, 6, 7, 8, 9, 10, 50, 101, 102, 103, 104, 105, 106, 107, 201, 202, 203, 204, 205, 209, 211, 212, 221, 222, 251, 409, 410, 411, 416, 418, 501, 502, 503, 504, 505, 506, 507, 508, 509, 511, 512, 513, 514, 521, 522, 523, 531, 532, 533, 591, 592, 595, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 621, 622, 623, 624, 625, 626, 627, 641, 642, 643, 644, 645, 646, 651, 661, 662, 663, 664, 671, 672, 673, 674, 675, 681, 682, 683, 684, 685, 686, 691, 692, 693, 694, 695, 701, 702, 703, 704, 711, 712, 713, 901, 902, 903, 904, 905, 931, 932, 951, 961, 60701, 60702]' where id=2; +update mall_sale_type set menus = '[2, 4, 5, 6, 7, 10, 50, 201, 202, 205, 211, 212, 221, 222, 251, 409, 410, 411, 416, 418, 501, 502, 503, 504, 505, 506, 507, 508, 511, 512, 513, 514, 521, 522, 523, 531, 532, 533, 591, 592, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 621, 622, 623, 624, 625, 626, 641, 642, 643, 644, 645, 646, 651, 661, 662, 663, 664, 671, 672, 673, 674, 675, 681, 682, 683, 684, 685, 686, 691, 692, 693, 694, 695, 701, 702, 703, 704, 711, 712, 713, 901, 902, 903, 904, 905, 931, 932, 60701, 60702]' where id=3; +update mall_sale_type set menus = '[2, 4, 5, 6, 7, 10, 50, 201, 202, 205, 211, 212, 221, 222, 251, 409, 410, 411, 416, 418, 501, 502, 503, 504, 505, 506, 507, 508, 511, 512, 513, 514, 521, 522, 523, 531, 532, 591, 601, 602, 604, 605, 606, 607, 608, 610, 611, 612, 613, 614, 622, 623, 624, 625, 626, 641, 642, 643, 644, 661, 662, 663, 664, 671, 672, 674, 675, 681, 682, 684, 685, 686, 691, 692, 693, 694, 695, 711, 901, 902, 904, 905, 931, 932, 60701, 60702]' where id=4; + +--所有广场管理员角色加权限 +INSERT INTO `mall_role_permission`(`id`, `tenant_id`, `parent_tenant_id`, `permission_id`, `role_id`) + select CEILING(RAND()*90000000000+10000000000) ,mui.tenant_id,mui.parent_tenant_id, 614,mur.role_id +from mall_user_info mui +left join mall_user_role mur on mui.id = mur.uid +where mui.is_admin = 1 and mur.role_id is not null GROUP BY mur.role_id; \ No newline at end of file diff --git a/mallinkCallback/src/main/java/com/iformall/config/ShiroConfig.java b/mallinkCallback/src/main/java/com/iformall/config/ShiroConfig.java index 7c648e128..5b40120be 100644 --- a/mallinkCallback/src/main/java/com/iformall/config/ShiroConfig.java +++ b/mallinkCallback/src/main/java/com/iformall/config/ShiroConfig.java @@ -108,7 +108,7 @@ public class ShiroConfig { filterChainDefinitionMap.put("/wxPay/notify/**", "anon"); // 支付回调 filterChainDefinitionMap.put("/wxPayBill/notify/**", "anon"); - filterChainDefinitionMap.put("/business/**", "anon"); // 商圈回调 + filterChainDefinitionMap.put("/business/circle/**", "anon"); // 商圈回调 filterChainDefinitionMap.put("/alipay/notify/**", "anon"); diff --git a/mallinkCallback/src/main/java/com/iformall/controller/callback/WxBusinessOrderController.java b/mallinkCallback/src/main/java/com/iformall/controller/callback/WxBusinessOrderController.java index 7228f0645..4dfc4f8f4 100644 --- a/mallinkCallback/src/main/java/com/iformall/controller/callback/WxBusinessOrderController.java +++ b/mallinkCallback/src/main/java/com/iformall/controller/callback/WxBusinessOrderController.java @@ -14,6 +14,7 @@ import com.iformall.interceptor.BodyReaderHttpServletRequestWrapper; import com.iformall.service.WxBusinessCircleOrderService; import com.iformall.service.WxMallService; import com.iformall.service.WxPayAccountService; +import com.iformall.utils.MaUtil; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,7 +29,7 @@ import java.util.Locale; import java.util.Map; @RestController -@RequestMapping("/business") +@RequestMapping("/business/circle") public class WxBusinessOrderController extends BaseController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @@ -46,28 +47,28 @@ public class WxBusinessOrderController extends BaseController { /** * - * @return 微信商圈支付结果通知 + * @return 微信商圈支付通知 */ @PostMapping(value = "/order/{tenantId}") @ResponseBody public Map createOrder(@PathVariable String tenantId, HttpServletRequest request){ - logger.info("[" +getIpAddr() + "]微信商圈支付结果通知-----"+tenantId); + logger.info("[" +getIpAddr() + "]微信商圈通知-----"+tenantId); Map resultMap = new HashMap<>(); if(StringUtils.isBlank(tenantId)){ - logger.error("微信商圈支付结果通知-----tenantId为空"); + logger.error("微信商圈通知-----tenantId为空"); resultMap.put("code","FAIL"); return resultMap; } TenantEntity tenantEntity = wxMallService.getByTenantId(tenantId); if(tenantEntity == null){ - logger.error("微信商圈支付结果通知-----获取tenantEntity为null"); + logger.error("微信商圈通知-----获取tenantEntity为null"); resultMap.put("code","FAIL"); return resultMap; } WxPayService wxPayService = wxPayAccountService.getWxPayService(tenantId); if(wxPayService == null){ - logger.error("微信商圈支付结果通知-----获取wxPayService失败"); + logger.error("微信商圈通知-----获取wxPayService失败"); resultMap.put("code","FAIL"); return resultMap; } @@ -75,117 +76,74 @@ public class WxBusinessOrderController extends BaseController { try { //----------------签名验证----------- BusinessCircleNotifyData notifyData = verifySignature(request,wxPayService); - logger.info("微信商圈支付结果通知---回调通知对象{}"+notifyData.toString()); - //解密 - PaidResult result = wxPayService.getBusinessCircleService().decryptPaidNotifyDataResource(notifyData); - logger.info("微信商圈支付结果通知---解密结果{}"+notifyData.toString()); + logger.info("微信商圈通知---回调通知对象{}"+notifyData.toString()); WxBusinessCircleOrder wxBusinessCircleOrder = new WxBusinessCircleOrder(); wxBusinessCircleOrder.updateTenantInfo(tenantEntity); wxBusinessCircleOrder.setSourceType(EnumThirdPartyConfigType.WEIXIN.getCode()); - wxBusinessCircleOrder.setNoticeId(notifyData.getId()); - wxBusinessCircleOrder.setNoticeCreateTime(sdf.parse(notifyData.getCreateTime())); - wxBusinessCircleOrder.setNoticeEventType(notifyData.getEventType()); - wxBusinessCircleOrder.setNoticeResourceType(notifyData.getResourceType()); - wxBusinessCircleOrder.setSummary(notifyData.getSummary()); - - wxBusinessCircleOrder.setWxMchid(result.getMchid()); - wxBusinessCircleOrder.setWxMerchantName(result.getMerchantName()); - wxBusinessCircleOrder.setWxShopName(result.getShopName()); - wxBusinessCircleOrder.setWxShopNumber(result.getShopNumber()); - wxBusinessCircleOrder.setAppid(result.getAppid()); - wxBusinessCircleOrder.setOpenid(result.getOpenid()); - wxBusinessCircleOrder.setTimeEnd(sdf.parse(result.getTimeEnd())); - wxBusinessCircleOrder.setAmount(result.getAmount()); - wxBusinessCircleOrder.setTransactionId(result.getTransactionId()); - wxBusinessCircleOrder.setCommitTag(result.getCommitTag()); - - wxBusinessCircleOrderService.createOrder(wxBusinessCircleOrder); - resultMap.put("code","SUCCESS"); - return resultMap; - } catch (WxPayException e) { - e.printStackTrace(); - logger.error(e.getCustomErrorMsg()); - resultMap.put("code","FAIL"); - return resultMap; - } catch (ParseException e) { - e.printStackTrace(); + //解密 + if(MaUtil.noticeEventType.equals(notifyData.getEventType())){ + PaidResult result = wxPayService.getBusinessCircleService().decryptPaidNotifyDataResource(notifyData); + logger.info("微信商圈支付成功通知---解密结果{}"+notifyData.toString()); + + wxBusinessCircleOrder.setNoticeId(notifyData.getId()); + wxBusinessCircleOrder.setNoticeCreateTime(sdf.parse(notifyData.getCreateTime())); + wxBusinessCircleOrder.setNoticeEventType(notifyData.getEventType()); + wxBusinessCircleOrder.setNoticeResourceType(notifyData.getResourceType()); + wxBusinessCircleOrder.setSummary(notifyData.getSummary()); + + wxBusinessCircleOrder.setWxMchid(result.getMchid()); + wxBusinessCircleOrder.setWxMerchantName(result.getMerchantName()); + wxBusinessCircleOrder.setWxShopName(result.getShopName()); + wxBusinessCircleOrder.setWxShopNumber(result.getShopNumber()); + wxBusinessCircleOrder.setAppid(result.getAppid()); + wxBusinessCircleOrder.setOpenid(result.getOpenid()); + wxBusinessCircleOrder.setTimeEnd(sdf.parse(result.getTimeEnd())); + wxBusinessCircleOrder.setAmount(result.getAmount()); + wxBusinessCircleOrder.setTransactionId(result.getTransactionId()); + wxBusinessCircleOrder.setCommitTag(result.getCommitTag()); + + wxBusinessCircleOrderService.createOrder(wxBusinessCircleOrder); + resultMap.put("code","SUCCESS"); + return resultMap; + + }else if(MaUtil.refundEventType.equals(notifyData.getEventType())){ + RefundResult result = wxPayService.getBusinessCircleService().decryptRefundNotifyDataResource(notifyData); + logger.info("微信商圈退款成功通知---解密结果{}"+result.toString()); + + wxBusinessCircleOrder.setRefundNoticeId(notifyData.getId()); + wxBusinessCircleOrder.setRefundCreateTime(sdf.parse(notifyData.getCreateTime())); + wxBusinessCircleOrder.setRefundEventType(notifyData.getEventType()); + wxBusinessCircleOrder.setRefundResourceType(notifyData.getResourceType()); + wxBusinessCircleOrder.setRefundSummary(notifyData.getSummary()); + + wxBusinessCircleOrder.setTransactionId(result.getTransactionId()); + wxBusinessCircleOrder.setWxMchid(result.getMchid()); + wxBusinessCircleOrder.setWxMerchantName(result.getMerchantName()); + wxBusinessCircleOrder.setWxShopName(result.getShopName()); + wxBusinessCircleOrder.setWxShopNumber(result.getShopNumber()); + wxBusinessCircleOrder.setAppid(result.getAppid()); + wxBusinessCircleOrder.setOpenid(result.getOpenid()); + wxBusinessCircleOrder.setRefundTime(sdf.parse(result.getRefundTime())); + wxBusinessCircleOrder.setRefundAmount(result.getRefundAmount()); + wxBusinessCircleOrder.setRefundId(result.getRefundId()); + + wxBusinessCircleOrderService.updateRefundOrder(wxBusinessCircleOrder); + resultMap.put("code","SUCCESS"); + return resultMap; + } logger.error("时间转换异常"); resultMap.put("code","FAIL"); return resultMap; - } - - } - - /** - * - * @return 微信商圈退款成功通知 - */ - @PostMapping(value = "/refundOrder/{tenantId}") - @ResponseBody - public Map updateRefundOrder(@PathVariable String tenantId, HttpServletRequest request){ - logger.info("[" +getIpAddr() + "]微信商圈退款成功通知-----"+tenantId); - Map resultMap = new HashMap<>(); - if(StringUtils.isBlank(tenantId)){ - logger.error("微信商圈退款成功通知-----tenantId为空"); - resultMap.put("code","FAIL"); - return resultMap; - } - TenantEntity tenantEntity = wxMallService.getByTenantId(tenantId); - if(tenantEntity == null){ - logger.error("微信商圈退款成功通知-----获取tenantEntity为null"); - resultMap.put("code","FAIL"); - return resultMap; - } - - WxPayService wxPayService = wxPayAccountService.getWxPayService(tenantId); - if(wxPayService == null){ - logger.error("微信商圈退款成功通知-----获取wxPayService失败"); - resultMap.put("code","FAIL"); - return resultMap; - } - - try { - //----------------签名验证----------- - BusinessCircleNotifyData notifyData = verifySignature(request,wxPayService); - logger.info("微信商圈退款成功通知---回调通知对象{}"+notifyData.toString()); - //解密 - RefundResult result = wxPayService.getBusinessCircleService().decryptRefundNotifyDataResource(notifyData); - logger.info("微信商圈退款成功通知---解密结果{}"+result.toString()); - - WxBusinessCircleOrder wxBusinessCircleOrder = new WxBusinessCircleOrder(); - wxBusinessCircleOrder.updateTenantInfo(tenantEntity); - wxBusinessCircleOrder.setSourceType(EnumThirdPartyConfigType.WEIXIN.getCode()); - - wxBusinessCircleOrder.setRefundNoticeId(notifyData.getId()); - wxBusinessCircleOrder.setRefundCreateTime(sdf.parse(notifyData.getCreateTime())); - wxBusinessCircleOrder.setRefundEventType(notifyData.getEventType()); - wxBusinessCircleOrder.setRefundResourceType(notifyData.getResourceType()); - wxBusinessCircleOrder.setRefundSummary(notifyData.getSummary()); - - wxBusinessCircleOrder.setTransactionId(result.getTransactionId()); - wxBusinessCircleOrder.setWxMchid(result.getMchid()); - wxBusinessCircleOrder.setWxMerchantName(result.getMerchantName()); - wxBusinessCircleOrder.setWxShopName(result.getShopName()); - wxBusinessCircleOrder.setWxShopNumber(result.getShopNumber()); - wxBusinessCircleOrder.setAppid(result.getAppid()); - wxBusinessCircleOrder.setOpenid(result.getOpenid()); - wxBusinessCircleOrder.setRefundTime(sdf.parse(result.getRefundTime())); - wxBusinessCircleOrder.setRefundAmount(result.getRefundAmount()); - wxBusinessCircleOrder.setRefundId(result.getRefundId()); - - wxBusinessCircleOrderService.updateRefundOrder(wxBusinessCircleOrder); - resultMap.put("code","SUCCESS"); - return resultMap; } catch (WxPayException e) { e.printStackTrace(); - logger.error(e.getCustomErrorMsg()); + logger.error("微信商圈通知---"+e.getCustomErrorMsg()); resultMap.put("code","FAIL"); return resultMap; } catch (ParseException e) { e.printStackTrace(); - logger.error("时间转换异常"); + logger.error("微信商圈通知---时间转换异常"); resultMap.put("code","FAIL"); return resultMap; } @@ -193,6 +151,7 @@ public class WxBusinessOrderController extends BaseController { } + /** * 验签 */ diff --git a/mallinkMQConsumer/src/main/java/com/iformall/mq/MqBaseConsumer.java b/mallinkMQConsumer/src/main/java/com/iformall/mq/MqBaseConsumer.java index 2210f544f..80a511322 100644 --- a/mallinkMQConsumer/src/main/java/com/iformall/mq/MqBaseConsumer.java +++ b/mallinkMQConsumer/src/main/java/com/iformall/mq/MqBaseConsumer.java @@ -48,6 +48,9 @@ public class MqBaseConsumer { @Autowired private FmInsideCashOutMsgServiceImpl fmInsideCashOutMsgService; + + @Autowired + private FmInsideBusinessCircleMsgServiceImpl fmInsideBusinessCircleMsgService; @@ -117,6 +120,11 @@ public class MqBaseConsumer { //} //baseMsg.setMsgStatus(EnumMsgRecordStatus.CONSUME_SUCC.getCode()); //wxMsgRecordMapper.updateByBaseMsg(baseMsg); + else if(EnumMsgRecordType.BUSINESS_CIRCLE_NOTICE.getCode().equals(baseMsg.getMsgType())) { + // 商圈通知 + FmInsideBusinessCircleMsg msg = (FmInsideBusinessCircleMsg)JsonUtil.readValue(message, FmInsideBusinessCircleMsg.class); + fmInsideBusinessCircleMsgService.send(msg); + } }catch (Throwable e){ log.error("consum received error: ", e); /** diff --git a/mallinkService/src/main/java/com/iformall/domain/po/msg/BaseMsg.java b/mallinkService/src/main/java/com/iformall/domain/po/msg/BaseMsg.java index aac48392b..cc2dec90f 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/msg/BaseMsg.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/msg/BaseMsg.java @@ -7,6 +7,7 @@ import com.iformall.domain.po.base.TenantEntity; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import org.apache.commons.lang3.StringUtils; /** @@ -72,4 +73,11 @@ public class BaseMsg extends BaseEntity { }}; } + public String getFinalTenantId() { + if (!StringUtils.isBlank(parentTenantId)) { + return parentTenantId; + } + return tenantId; + } + } diff --git a/mallinkService/src/main/java/com/iformall/domain/po/msg/FmInsideBusinessCircleMsg.java b/mallinkService/src/main/java/com/iformall/domain/po/msg/FmInsideBusinessCircleMsg.java new file mode 100644 index 000000000..876df46d7 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/msg/FmInsideBusinessCircleMsg.java @@ -0,0 +1,32 @@ +package com.iformall.domain.po.msg; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class FmInsideBusinessCircleMsg extends BaseMsg{ + private static final long serialVersionUID = 1L; + + @io.swagger.annotations.ApiModelProperty(value="商圈支付结果通知类型",name="eventType") + private String eventType; + + @io.swagger.annotations.ApiModelProperty(value="商圈订单Id",name="businessCircleOrderId") + private Long businessCircleOrderId; + + @io.swagger.annotations.ApiModelProperty(value="门店Id",name="merchantId") + private Long merchantId; + + @io.swagger.annotations.ApiModelProperty(value="c端会员id",name="cUserId") + private Long cUserId; + + @io.swagger.annotations.ApiModelProperty(value="门店名称,商圈在商圈小程序上圈店时填写的门店名称",name="wxShopName") + private String wxShopName; + + @io.swagger.annotations.ApiModelProperty(value="用户实际消费金额,单位(分)",name="amount") + private Integer amount; + + +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumMsgRecordType.java b/mallinkService/src/main/java/com/iformall/enums/EnumMsgRecordType.java index 3e7b81873..c078edcec 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumMsgRecordType.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumMsgRecordType.java @@ -15,11 +15,12 @@ public enum EnumMsgRecordType { WEBSOCKET_APP(8, "小程序websocket"), INSIDE_ORDER_SUCCESS(100, "下订单成功"), INSIDE_COUPON_VERIFY(101, "券核销"), - INSIDE_C_LOGIN(102, "C端用户登录"), + INSIDE_C_LOGIN(102, "C端用户登录"),//内部消息,加积分等 //INSIDE_NOTIFY_PAY_SUCCESS(103, "微信支付回调"), INSIDE_NOTIFY_REFUND_SUCCESS(104, "微信退款回调"), COUPON_STOCK(105, "券库存更新"), - CASH_OUT(106,"商户提现") + CASH_OUT(106,"商户提现"), + BUSINESS_CIRCLE_NOTICE(107, "商圈支付通知"),//内部消息,加积分+积分同步 ; public static EnumMsgRecordType getEnum(Integer code) { diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumScoreType.java b/mallinkService/src/main/java/com/iformall/enums/EnumScoreType.java index cd0cf1698..e8d91ac99 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumScoreType.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumScoreType.java @@ -29,6 +29,8 @@ public enum EnumScoreType { QUESTION_ADD_CREDIT(21, "问卷奖励积分"), + REFUND_CONSUMPTION(22, "消费退款"), + ; public static EnumScoreType getEnum(Integer code) { diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumUserType.java b/mallinkService/src/main/java/com/iformall/enums/EnumUserType.java index fcb3d1d57..c46fd67c5 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumUserType.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumUserType.java @@ -5,7 +5,9 @@ public enum EnumUserType { CUSER(1, "C端用户"), CUSERBASIC(2, "C端用户(会员)"), BUSER(3, "B端用户"), - MALLUSER(4, "A端用户") + MALLUSER(4, "A端用户"), + + BUSINESS_CIRCLE(5, "微信商圈") ; public static EnumUserType getEnum(Integer code) { diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxBusinessCircleOrderMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxBusinessCircleOrderMapper.java index b0c602718..38939fe0b 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/WxBusinessCircleOrderMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/WxBusinessCircleOrderMapper.java @@ -9,6 +9,8 @@ public interface WxBusinessCircleOrderMapper extends CommonMapper findList(WxBusinessCircleOrder record); + WxBusinessCircleOrder getById(WxBusinessCircleOrder wxBusinessCircleOrder); + WxBusinessCircleOrder getByTransactionId(WxBusinessCircleOrder wxBusinessCircleOrder); /** @@ -39,4 +41,6 @@ public interface WxBusinessCircleOrderMapper extends CommonMapper listAsPage(WxBusinessCircleOrder record, Integer pageIndex, Integer pageSize); + /** + * id+tenantId + * @param + * @return + */ + WxBusinessCircleOrder getById(Long id, String tenantId); + + /** + * transactionId+tenantId + * @param + * @return + */ + WxBusinessCircleOrder getByTransactionId(String transactionId, String tenantId); void createOrder(WxBusinessCircleOrder wxBusinessCircleOrder); void updateRefundOrder(WxBusinessCircleOrder wxBusinessCircleOrder); + + /** + * 加积分 + * @param wxBusinessCircleOrder + */ + void updateAddPoints(WxBusinessCircleOrder wxBusinessCircleOrder); + + /** + * 积分同步状态修改 + */ + void updateIsPointsNotify(WxBusinessCircleOrder wxBusinessCircleOrder); + + /** + * 退积分 + * @param wxBusinessCircleOrder + */ + void updateRefundPoints(WxBusinessCircleOrder wxBusinessCircleOrder); + + } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxBusinessCircleOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxBusinessCircleOrderServiceImpl.java index f380197fc..b8a5edd13 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxBusinessCircleOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxBusinessCircleOrderServiceImpl.java @@ -6,7 +6,12 @@ import com.iformall.common.IdWorker; import com.iformall.domain.po.WxBusinessCircleOrder; import com.iformall.domain.po.WxCUser; import com.iformall.domain.po.WxMerchant; +import com.iformall.domain.po.msg.FmInsideBusinessCircleMsg; +import com.iformall.enums.EnumMsgMqKey; +import com.iformall.enums.EnumMsgMqTag; +import com.iformall.enums.EnumMsgMqTopic; import com.iformall.mapper.WxBusinessCircleOrderMapper; +import com.iformall.mq.MqBaseProducer; import com.iformall.service.WxBusinessCircleOrderService; import com.iformall.service.WxCUserService; import com.iformall.service.WxMerchantService; @@ -30,12 +35,31 @@ public class WxBusinessCircleOrderServiceImpl implements WxBusinessCircleOrderSe @Autowired WxCUserService wxCUserService; + @Autowired + MqBaseProducer mqBaseProducer; + @Override public PageInfo listAsPage(WxBusinessCircleOrder record, Integer pageIndex, Integer pageSize) { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxBusinessCircleOrderMapper.findList(record)); } + @Override + public WxBusinessCircleOrder getById(Long id, String tenantId) { + WxBusinessCircleOrder wxBusinessCircleOrder = new WxBusinessCircleOrder(); + wxBusinessCircleOrder.setId(id); + wxBusinessCircleOrder.setTenantId(tenantId); + return wxBusinessCircleOrderMapper.getById(wxBusinessCircleOrder); + } + + @Override + public WxBusinessCircleOrder getByTransactionId(String transactionId, String tenantId) { + WxBusinessCircleOrder wxBusinessCircleOrder = new WxBusinessCircleOrder(); + wxBusinessCircleOrder.setTransactionId(transactionId); + wxBusinessCircleOrder.setTenantId(tenantId); + return wxBusinessCircleOrderMapper.getByTransactionId(wxBusinessCircleOrder); + } + @Override public void createOrder(WxBusinessCircleOrder wxBusinessCircleOrder) { WxBusinessCircleOrder byTransactionId = wxBusinessCircleOrderMapper.getByTransactionId(wxBusinessCircleOrder); @@ -66,13 +90,31 @@ public class WxBusinessCircleOrderServiceImpl implements WxBusinessCircleOrderSe wxBusinessCircleOrderMapper.insertNoticeOrder(wxBusinessCircleOrder); // TODO: 2021/4/21 mq 新增积分 积分同步 + this.sendMessage(wxBusinessCircleOrder,wxBusinessCircleOrder.getNoticeEventType()); } } + /** + * + * @param wxBusinessCircleOrder + * @param eventType + */ + private void sendMessage(WxBusinessCircleOrder wxBusinessCircleOrder,String eventType){ + FmInsideBusinessCircleMsg msg = new FmInsideBusinessCircleMsg(); + msg.updateTenantInfo(wxBusinessCircleOrder); + msg.setEventType(eventType); + msg.setBusinessCircleOrderId(wxBusinessCircleOrder.getId()); + msg.setMerchantId(wxBusinessCircleOrder.getMerchantId()); + msg.setCUserId(wxBusinessCircleOrder.getCUserId()); + msg.setWxShopName(wxBusinessCircleOrder.getWxShopName()); + msg.setAmount(wxBusinessCircleOrder.getAmount()); + mqBaseProducer.sendMessage(msg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); + } + @Override public void updateRefundOrder(WxBusinessCircleOrder wxBusinessCircleOrder) { - WxBusinessCircleOrder byTransactionId = wxBusinessCircleOrderMapper.getByTransactionId(wxBusinessCircleOrder); + WxBusinessCircleOrder byTransactionId = this.getByTransactionId(wxBusinessCircleOrder.getTransactionId(),wxBusinessCircleOrder.getTenantId()); if(byTransactionId == null){ logger.error("--商圈退款--付款消息未找到--"); }else{ @@ -82,8 +124,27 @@ public class WxBusinessCircleOrderServiceImpl implements WxBusinessCircleOrderSe wxBusinessCircleOrderMapper.updateRefundNoticeOrder(wxBusinessCircleOrder); // TODO: 2021/4/21 mq 退积分 + this.sendMessage(wxBusinessCircleOrder,wxBusinessCircleOrder.getRefundEventType()); } } + @Override + public void updateAddPoints(WxBusinessCircleOrder wxBusinessCircleOrder) { + wxBusinessCircleOrder.setUpdateTime(new Date()); + wxBusinessCircleOrderMapper.updateAddPoints(wxBusinessCircleOrder); + } + + @Override + public void updateIsPointsNotify(WxBusinessCircleOrder wxBusinessCircleOrder) { + wxBusinessCircleOrder.setUpdateTime(new Date()); + wxBusinessCircleOrderMapper.updateIsPointsNotify(wxBusinessCircleOrder); + } + + @Override + public void updateRefundPoints(WxBusinessCircleOrder wxBusinessCircleOrder) { + wxBusinessCircleOrder.setUpdateTime(new Date()); + wxBusinessCircleOrderMapper.updateRefundPoints(wxBusinessCircleOrder); + } + } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCreditHistoryServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCreditHistoryServiceImpl.java index c8724cd2e..9c2bc5332 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCreditHistoryServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCreditHistoryServiceImpl.java @@ -283,7 +283,7 @@ public class WxCreditHistoryServiceImpl implements WxCreditHistoryService { // if (total > Integer.MAX_VALUE) { // throw new MallinkException(ErrorCode.OUT_OF_CREDIT); // } - if (total < 0) { + if (total < 0 && !Objects.equals(record.getCreditType(),EnumScoreType.REFUND_CONSUMPTION.getCode())) { throw new MallinkException(ErrorCode.CREDIT_NOT_ENOUGH); } //如果为导入的会员 则直接覆盖总积分和操作积分明细 @@ -448,6 +448,10 @@ public class WxCreditHistoryServiceImpl implements WxCreditHistoryService { return record.getCreditNum(); } + if (record.getCreditType() == EnumScoreType.REFUND_CONSUMPTION.getCode()) { + return reduceCredit(record); + } + return 0; } diff --git a/mallinkService/src/main/java/com/iformall/service/msg/impl/FmInsideBusinessCircleMsgServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/msg/impl/FmInsideBusinessCircleMsgServiceImpl.java new file mode 100644 index 000000000..c33d36d1c --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/msg/impl/FmInsideBusinessCircleMsgServiceImpl.java @@ -0,0 +1,147 @@ +package com.iformall.service.msg.impl; + +import com.github.binarywang.wxpay.bean.businesscircle.PointsNotifyRequest; +import com.github.binarywang.wxpay.service.WxPayService; +import com.iformall.domain.po.WxBusinessCircleOrder; +import com.iformall.domain.po.WxCUserBasicInfo; +import com.iformall.domain.po.WxCreditHistory; +import com.iformall.domain.po.WxMerchant; +import com.iformall.domain.po.msg.BaseMsg; +import com.iformall.domain.po.msg.FmInsideBusinessCircleMsg; +import com.iformall.enums.EnumBusiness; +import com.iformall.enums.EnumScoreType; +import com.iformall.enums.EnumUserType; +import com.iformall.service.*; +import com.iformall.service.msg.MsgSendService; +import com.iformall.utils.MaUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +/** + * + * + */ +@Service +public class FmInsideBusinessCircleMsgServiceImpl implements MsgSendService { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'+'mm:ss", Locale.CHINA); + + + @Autowired + WxMerchantService wxMerchantService; + + @Autowired + WxCreditHistoryService creditHistoryService; + + @Autowired + WxCUserBasicInfoService cUserBasicInfoService; + + WxBusinessCircleOrderService businessCircleOrderService; + + @Autowired + WxPayAccountService wxPayAccountService; + + @Override + public void send(BaseMsg baseMsg) throws Exception { + FmInsideBusinessCircleMsg msg = (FmInsideBusinessCircleMsg)baseMsg; + + if(msg.getCUserId() == null){ + return; + } + WxCUserBasicInfo user = cUserBasicInfoService.getById(msg.getCUserId(), msg.getFinalTenantId()); + if(user == null){ + return; + } + + WxBusinessCircleOrder wxBusinessCircleOrder = businessCircleOrderService.getById(msg.getBusinessCircleOrderId(),msg.getTenantId()); + if(wxBusinessCircleOrder == null){ + return; + } + + if(msg.getMerchantId() == null){ + return; + } + Integer businessId = EnumBusiness.BUSINESS_ID6.getCode(); + WxMerchant wxMerchant = wxMerchantService.getById(msg.getMerchantId()); + if(wxMerchant != null){ + businessId = wxMerchant.getBusinessId(); + } + + WxCreditHistory creditHistory = new WxCreditHistory(); + creditHistory.setTenantId(msg.getFinalTenantId()); + creditHistory.setOperatorType(EnumUserType.BUSINESS_CIRCLE.getCode()); + creditHistory.setOperatorId(msg.getCUserId()); + creditHistory.setCUserId(msg.getCUserId()); + creditHistory.setCreateDate(new Date()); + creditHistory.setCouponId(msg.getBusinessCircleOrderId()); + creditHistory.setBusinessId(businessId); + creditHistory.setMerchantId(msg.getMerchantId()); + + if(MaUtil.noticeEventType.equals(msg.getEventType())){ + + creditHistory.setCreditType(EnumScoreType.CONSUMPTION.getCode()); + creditHistory.setSpend(msg.getAmount()); + creditHistory.setChangePurpose("商圈消费:消费商户["+msg.getWxShopName()+"] ("+creditHistory.getSpendStr()+"元) "); + creditHistory = creditHistoryService.saveOrUpdate(creditHistory,msg.getTenantId()); + Integer creditNum = 0; + if (creditHistory.getCreditNum() != null) { + creditNum = creditHistory.getCreditNum(); + } + if(creditNum == 0){ + return; + } + + wxBusinessCircleOrder.setIncreasedPoints(creditNum); + wxBusinessCircleOrder.setPointsUpdateTime(creditHistory.getCreateDate()); + businessCircleOrderService.updateAddPoints(wxBusinessCircleOrder); + + this.notifyPoints(wxBusinessCircleOrder); + + }else if(MaUtil.refundEventType.equals(msg.getEventType())){ + + creditHistory.setCreditType(EnumScoreType.REFUND_CONSUMPTION.getCode()); + creditHistory.setCreditNum(wxBusinessCircleOrder.getIncreasedPoints()); + + creditHistory.setSpend(0-msg.getAmount()); + + creditHistory.setChangePurpose("商圈消费退款:消费商户["+msg.getWxShopName()+"] ("+creditHistory.getSpendStr()+"元) ");// + creditHistory = creditHistoryService.saveOrUpdate(creditHistory,msg.getTenantId()); + Integer creditNum = 0; + if (creditHistory.getCreditNum() != null) { + creditNum = creditHistory.getCreditNum(); + } + if(creditNum == 0){ + return; + } + + wxBusinessCircleOrder.setRefundPointsTime(creditHistory.getCreateDate()); + businessCircleOrderService.updateRefundPoints(wxBusinessCircleOrder); + } + } + + private void notifyPoints(WxBusinessCircleOrder wxBusinessCircleOrder) throws Exception{ + //添加积分成功,做积分同步 + WxPayService wxPayService = wxPayAccountService.getWxPayService(wxBusinessCircleOrder.getTenantId()); + + PointsNotifyRequest request = new PointsNotifyRequest(); + request.setSubMchid(wxPayService.getConfig().getSubMchId()); + request.setTransactionId(wxBusinessCircleOrder.getTransactionId()); + request.setOpenid(wxBusinessCircleOrder.getOpenid()); + request.setEarnPoints(true); + request.setIncreasedPoints(wxBusinessCircleOrder.getIncreasedPoints()); + request.setPointsUpdateTime(sdf.format(new Date())); + String result = wxPayService.getBusinessCircleService().notifyPoints(request); + logger.info("微信商圈同步积分请求结果----"+result); + + businessCircleOrderService.updateIsPointsNotify(wxBusinessCircleOrder); + } + +} diff --git a/mallinkService/src/main/java/com/iformall/utils/MaUtil.java b/mallinkService/src/main/java/com/iformall/utils/MaUtil.java index a805f001b..c5c06cea3 100644 --- a/mallinkService/src/main/java/com/iformall/utils/MaUtil.java +++ b/mallinkService/src/main/java/com/iformall/utils/MaUtil.java @@ -13,6 +13,9 @@ import org.apache.commons.lang3.StringUtils; public class MaUtil { + public static final String noticeEventType = "MALL_TRANSACTION.SUCCESS"; + public static final String refundEventType = "MALL_REFUND.SUCCESS"; + static public WxMaService getWeappService(WxAppinfo appinfo) { WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl(); config.setAppid(appinfo.getAppId()); @@ -40,13 +43,13 @@ public class MaUtil { config.setKeyPath(payAccount.getCertPath()); //以下是apiv3以及支付分相关 -// config.setServiceId(); -// config.setPayScoreNotifyUrl(); - // TODO: 2021/4/20 - config.setPrivateKeyPath(null);//apiv3 商户apiclient_key.pem 商户私钥 - config.setPrivateCertPath(null);//apiv3 商户apiclient_cert.pem - config.setCertSerialNo(null);//证书序列号 - config.setApiV3Key(null);//apiV3秘钥 +// config.setServiceId(payAccount.getServiceId()); +// config.setPayScoreNotifyUrl(payAccount.getPayScoreNotifyUrl()); + + config.setPrivateKeyPath(payAccount.getPrivateKeyPath());//apiv3 商户apiclient_key.pem 商户私钥 + config.setPrivateCertPath(payAccount.getPrivateCertPath());//apiv3 商户apiclient_cert.pem + config.setCertSerialNo(payAccount.getCertSerialNo());//证书序列号 + config.setApiV3Key(payAccount.getApiV3Key());//apiV3秘钥 WxPayService wxPayService = new WxPayServiceImpl(); wxPayService.setConfig(config); diff --git a/mallinkService/src/main/resources/mapper/WxBusinessCircleOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxBusinessCircleOrderMapper.xml index e429a330f..e7f1d6ddf 100644 --- a/mallinkService/src/main/resources/mapper/WxBusinessCircleOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxBusinessCircleOrderMapper.xml @@ -165,6 +165,14 @@ + +