From 60d75c0629f93a2390a872860ac8392a7dc4621c Mon Sep 17 00:00:00 2001 From: xhxu Date: Thu, 31 Mar 2022 18:09:12 +0800 Subject: [PATCH] //add msg --- .../db/migration/V2022032800001__msg.sql | 5 + .../iformall/controller/WxMsgController.java | 17 + .../iformall/domain/po/msg/SmartAppMsg.java | 3 + .../api/bean/TtMaSubscribeMessage.java | 29 +- .../bean/TtMaSubscribeMessageGsonAdapter.java | 13 +- .../com/iformall/enums/EnumTemplateType.java | 2 + .../com/iformall/service/WxMsgService.java | 2 + .../service/impl/WxCouponSendServiceImpl.java | 168 +------- .../service/impl/WxMsgServiceImpl.java | 81 ++++ .../service/impl/WxOrderServiceImpl.java | 394 ++++++++++++++---- .../msg/impl/SendSmartAppMsgServiceImpl.java | 136 +++--- 11 files changed, 495 insertions(+), 355 deletions(-) diff --git a/mallinkAdmin/src/main/resources/db/migration/V2022032800001__msg.sql b/mallinkAdmin/src/main/resources/db/migration/V2022032800001__msg.sql index a01bb4f6c..de21881c9 100644 --- a/mallinkAdmin/src/main/resources/db/migration/V2022032800001__msg.sql +++ b/mallinkAdmin/src/main/resources/db/migration/V2022032800001__msg.sql @@ -8,3 +8,8 @@ INSERT INTO `mallink`.`wx_msg_validationcode_model`(`id`, `tenant_id`, `parent_t -- INSERT INTO `mallink`.`wx_msg_validationcode_model`(`id`, `tenant_id`, `parent_tenant_id`, `type`, `name`, `signature`, `content`, `createtime`, `status`, `minutes`, `model_id`, `email_bg_img`, `open`, `msg_type`, `role_type`, `model_code`) VALUES (666429058237590158, '1028', NULL, 32, '抖音购买通知', '富茂', '您已成功购买[${name}],可在“抖音app>我>右上角≡>我的订单>查看全部”,务必到店之后进行核销,谨防上当受骗。http://ob4.cn/${sortUrl}', '2022-03-29 10:57:59', 1, 0, NULL, NULL, 0, 1, 0, 'SMS_237590158'); + + + +INSERT INTO `mallink`.`wx_template_msg`(`id`, `tenant_id`, `parent_tenant_id`, `template_id`, `type`, `custom_param`, `create_date`, `update_date`, `on_off`) VALUES (1506450152111814573, '1028', NULL, 'MSG1313619f9822f740ceb30d99db03484fb16dd1814573', 60, null, '2022-03-31 09:57:59', '2022-03-31 09:57:59', 0); + diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxMsgController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxMsgController.java index ab618ab65..421886881 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxMsgController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxMsgController.java @@ -48,4 +48,21 @@ public class WxMsgController extends BaseController { return new ResultData(page); } + @ApiOperation("模板分页列表接口") + @GetMapping("ttTemplateList") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) + public ResultData ttTemplateList(@ModelAttribute WxTemplateMsg wxTemplateMsg, Integer pageNum, Integer pageSize) { + logger.debug("[" + getIpAddr() + "] WxMsgController::list"); + if (null == wxTemplateMsg) wxTemplateMsg = new WxTemplateMsg(); + wxTemplateMsg.updateTenantInfo(getTenantInfo()); + List types = new ArrayList<>(); + types.add(EnumTemplateType.TT_SEND_COUPON_REMIND.getCode()); + wxTemplateMsg.setTypes(types); + wxTemplateMsg.setIsc(true); + final PageInfo page = wxTemplateMsgService.listAsPageForMiniApp(wxTemplateMsg, pageNum, pageSize); + return new ResultData(page); + } + } diff --git a/mallinkService/src/main/java/com/iformall/domain/po/msg/SmartAppMsg.java b/mallinkService/src/main/java/com/iformall/domain/po/msg/SmartAppMsg.java index a3bbfc98d..de1cb01a6 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/msg/SmartAppMsg.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/msg/SmartAppMsg.java @@ -31,4 +31,7 @@ public class SmartAppMsg extends BaseMsg { private String gotopage; @io.swagger.annotations.ApiModelProperty(value="小程序模板参数列表",name="dataList") private List dataList; + + @io.swagger.annotations.ApiModelProperty(value="tt小程序模板参数列表",name="dataJson") + private String dataJson; } diff --git a/mallinkService/src/main/java/com/iformall/douyin/miniapp/api/bean/TtMaSubscribeMessage.java b/mallinkService/src/main/java/com/iformall/douyin/miniapp/api/bean/TtMaSubscribeMessage.java index f4b547a6e..27790dcf6 100644 --- a/mallinkService/src/main/java/com/iformall/douyin/miniapp/api/bean/TtMaSubscribeMessage.java +++ b/mallinkService/src/main/java/com/iformall/douyin/miniapp/api/bean/TtMaSubscribeMessage.java @@ -1,12 +1,10 @@ package com.iformall.douyin.miniapp.api.bean; -import cn.binarywang.wx.miniapp.constant.WxMaConstants; -import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonObject; import lombok.*; import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; /** * 订阅消息. @@ -64,31 +62,10 @@ public class TtMaSubscribeMessage implements Serializable { * 描述: 模板内容,不填则下发空模板 * */ - private List data; - - - public TtMaSubscribeMessage addData(Data datum) { - if (this.data == null) { - this.data = new ArrayList<>(); - } - - this.data.add(datum); - - return this; - } + private JsonObject data; public String toJson() { return TtMaGsonBuilder.create().toJson(this); } - @lombok.Data - @NoArgsConstructor - @AllArgsConstructor - public static class Data implements Serializable { - private static final long serialVersionUID = 1L; - - private String name; - private String value; - } - } diff --git a/mallinkService/src/main/java/com/iformall/douyin/miniapp/api/bean/TtMaSubscribeMessageGsonAdapter.java b/mallinkService/src/main/java/com/iformall/douyin/miniapp/api/bean/TtMaSubscribeMessageGsonAdapter.java index acc23654d..95b125c5c 100644 --- a/mallinkService/src/main/java/com/iformall/douyin/miniapp/api/bean/TtMaSubscribeMessageGsonAdapter.java +++ b/mallinkService/src/main/java/com/iformall/douyin/miniapp/api/bean/TtMaSubscribeMessageGsonAdapter.java @@ -25,18 +25,7 @@ public class TtMaSubscribeMessageGsonAdapter implements JsonSerializer list = wxCUserMapper.findList(wcuQ); - if(list != null && list.size() > 0){ - for (WxCUser cuser:list) { - //发订阅消息 - sendCouponRemind(send, couponOrder, cuser); - // 发送微信模板消息(公众号模板消息/小程序统一消息/小程序模板消息) - sendMpMsgForSendCoupon(send, couponOrder, cuser); - } - } - + private void sendMsgForSendCoupon(TenantEntity tenantEntity,WxCouponSend send, WxCouponOrder couponOrder, WxCUserBasicInfo user) { // 发送短信 if (send.getSendSms().equals(EnumCouponSendSms.YES.getCode())) { - logger.info("》》》》》》》》》》》"); - logger.info("场景投放发送短信开始"); - logger.info("》》》》》》》》》》》"); + logger.info("》》》场景投放发送短信开始》》》"); //券名 String title = send.getTitle(); //找出用户手机号 @@ -621,7 +595,7 @@ public class WxCouponSendServiceImpl implements WxCouponSendService { String appName = ""; if(payw.getType() == null) { WxAppinfo appinfoQ = new WxAppinfo(); - appinfoQ.setPlat(EnumPayWay.PAY_WAY_WECHAT.getPlat().getCode()); +// appinfoQ.setPlat(EnumPayWay.PAY_WAY_WECHAT.getPlat().getCode()); appinfoQ.updateTenantInfo(tenantEntity); appinfoQ.setType(EnumAppType.C.getCode()); List appList = wxAppinfoService.getList(appinfoQ); @@ -641,142 +615,8 @@ public class WxCouponSendServiceImpl implements WxCouponSendService { wxMsgRecord.updateTenantInfo(tenantEntity); wxMsgRecord.setDynamicContentMap(msgReplaceMap); mqBaseProducer.sendMessage(wxMsgRecord, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); - logger.info("》》》》》》》》》》》"); - logger.info("场景投放发送短信结束"); - logger.info("》》》》》》》》》》》"); - } - } - - private void sendCouponRemind(WxCouponSend send, WxCouponOrder couponOrder,WxCUser cuser){ - try { - WxTemplateMsg temp = new WxTemplateMsg(); - temp.updateTenantInfo(send); - temp.setType(EnumTemplateType.SEND_COUPON_REMIND.getCode()); - temp = wxTemplateMsgService.getByObj(temp); - if(temp.getId() != null){ - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - WxMsg msg = new WxMsg(); - msg.updateTenantInfo(send); - msg.setPhones(cuser.getOpenId()); - msg.setModelId(temp.getId()); - Map map = new HashMap<>(); - map.put("thing1",send.getTitle()); - map.put("time3",dateFormat.format(couponOrder.getCreateDate())); - map.put("time4",dateFormat.format(couponOrder.getExpiredTime())); - map.put("thing5","你的优惠券已到账!请立即使用"); - if(EnumCouponType.COUPON_TINGCHE.getCode().equals(couponOrder.getCouponType()) - || EnumCouponType.COUPON_CREDIT_PARK.getCode().equals(couponOrder.getCouponType())){ - map.put("goToPage","pages/index/index?type=in"); - }else{ - map.put("goToPage","pages/index/index?type=mc"); - } - - msg.setMsg(JSONObject.toJSONString(map)); - wxMsgService.batchSendAppinfo(msg); - } - } catch (Exception e) { -// e.printStackTrace(); - logger.error("发卷消息发送异常"); - } - } - - private boolean sendMpMsgForSendCoupon(WxCouponSend send, WxCouponOrder couponOrder, WxCUser user) { - // 发送 公众号 模板消息 - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String gotopage = Constant.mainPageUrl + "?type=mc"; - // 7. 公众号消息 - if (StringUtils.isNotBlank(user.getMpAppId()) && - StringUtils.isNotBlank(user.getMpOpenId()) && - user.getMpSubscribe().equals(EnumUserIsSubscribe.YES.getCode())) { - // 检查是否超限 - WxMsgLimit msgLimit = new WxMsgLimit(); - msgLimit.updateTenantInfo(couponOrder); - msgLimit.setType(EnumMsgLimitType.WXCHAT_OPENID_SEND.getCode()); - msgLimit.setLimitId(user.getMpOpenId()); - if (wxMsgLimitService.checkIsLimit(msgLimit)) { - logger.error("用户公众号模板消息超限" + user.getId()); - return true; - } - - // 已关注公众号 - /** - * 购票成功通知 - * {first.DATA}} - * 订单号:{{keyword1.DATA}} - * 兑换券:{{keyword2.DATA}} - * 订单详情:{{keyword3.DATA}} - * 有效期至:{{keyword4.DATA}} - * 购买数量:{{keyword5.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.updateTenantInfo(couponOrder); - mpAppMsg.setTemplateType(EnumTemplateType.GIFT_MESSAGE.getCode()); - mpAppMsg.setDataList(Lists.newArrayList( - user.getNickName(), - String.valueOf(couponOrder.getOrderId()), - couponOrder.getId().toString(), - send.getTitle(), - dateFormat.format(couponOrder.getExpiredTime()), - "1", - user.getNickName() - - )); - - 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); - } - } else { - // 可能未关注公众号, 用户可能收不到 - // 8. 微信小程序-统一消息 - // 检查是否超限 - WxMsgLimit msgLimit = new WxMsgLimit(); - msgLimit.updateTenantInfo(couponOrder); - msgLimit.setType(EnumMsgLimitType.WEAPP_OPENID_SEND.getCode()); - msgLimit.setLimitId(user.getOpenId()); - if (wxMsgLimitService.checkIsLimit(msgLimit)) { - logger.error("用户小程序统一模板消息超限:" + user.getId()); - return true; - } - // 获取小程序关联的服务号 - WxAuthorizerInfo authQ = new WxAuthorizerInfo(); - authQ.setAuthorizerAppid(user.getAppId()); - authQ.updateTenantInfo(couponOrder); - 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.GIFT_MESSAGE.getCode()); - appUniformMsg.setPagePath(gotopage); - appUniformMsg.setMpAppId(weappInfo.getAuthorizerAppid()); - appUniformMsg.setDataList(Lists.newArrayList( - user.getNickName(), - String.valueOf(couponOrder.getOrderId()), - couponOrder.getId().toString(), - send.getTitle(), - dateFormat.format(couponOrder.getExpiredTime()), - "1", - user.getNickName() - )); - 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); - } - } + logger.info("》》》场景投放发送短信结束》》》"); } - return false; } @Override diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxMsgServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxMsgServiceImpl.java index 45c14f407..a371a80ee 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxMsgServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxMsgServiceImpl.java @@ -15,6 +15,7 @@ import com.iformall.domain.po.*; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.po.msg.SmartAppMsg; import com.iformall.domain.po.msg.WxMsg; +import com.iformall.domain.po.tt.TtCUser; import com.iformall.enums.*; import com.iformall.exception.MallinkException; import com.iformall.mapper.*; @@ -85,6 +86,10 @@ public class WxMsgServiceImpl implements WxMsgService { @Autowired WxCUserService wxCUserService; + @Lazy + @Autowired + TtCUserService ttCUserService; + @Override public PageInfo listAsPage(WxMsg record, Integer pageIndex, Integer pageSize) { PageHelper.startPage(pageIndex, pageSize); @@ -504,6 +509,82 @@ public class WxMsgServiceImpl implements WxMsgService { } + @Override + public void batchSendTtAppinfo(WxMsg msg) { + TenantEntity tenantEntity = new TenantEntity(); + tenantEntity.setTenantId(msg.getTenantId()); + tenantEntity.setParentTenantId(msg.getParentTenantId()); + WxAppinfo cAppInfo = wxAppinfoService.getCAppInfo(tenantEntity, EnumAppPlat.TOUTIAO); + SmartAppMsg smartAppMsg = new SmartAppMsg(); + smartAppMsg.updateTenantInfo(tenantEntity); + smartAppMsg.setMsgType(EnumMsgRecordType.SMART_APP_TO.getCode()); + smartAppMsg.setAppId(cAppInfo.getAppId()); + + WxTemplateMsg wxTemplateMsg = wxTemplateMsgMapper.selectById(msg.getModelId()); +// if(1 == wxTemplateMsg.getOnOff().intValue()){ +// logger.error("订阅消息模板关闭。"); +// return; +// } + + smartAppMsg.setTemplateType(wxTemplateMsg.getType()); + JSONObject customParam = JSON.parseObject(msg.getMsg()); + String goToPage = customParam.getString("goToPage"); + if(StringUtils.isBlank(goToPage)){ + goToPage = "pages/index/index?type=in";//默认首页 + } + smartAppMsg.setGotopage(goToPage); + if(wxTemplateMsg.getType() == EnumTemplateType.TT_SEND_COUPON_REMIND.getCode()){ + smartAppMsg.setDataJson(msg.getMsg()); + }else{ + return; + } + + if(StringUtils.isNotBlank(msg.getPhones())){ + + smartAppMsg.setTo(msg.getPhones()); + mqBaseProducer.sendMessage(smartAppMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); + +// String[] split = wxMsg.getPhones().split(","); +// int length = split.length; +// int extra = length % 1000; +// int extracount = extra > 0 ? (length / 1000 + 1) : (length / 1000); +// int index = extracount - 1; +// for (int i = 0; i < extracount; i++) { +// if (extra > 0 && i == index) { +// List phoneList = Arrays.asList(split).subList(i * 1000, length); +// String phones = StringUtils.join(phoneList, ","); +// smartAppMsg.setTo(phones); +// mqBaseProducer.sendMessage(smartAppMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); +// } else { +// List phoneList = Arrays.asList(split).subList(i * 1000, (i + 1) * 1000); +// String phones = StringUtils.join(phoneList, ","); +// smartAppMsg.setTo(phones); +// mqBaseProducer.sendMessage(smartAppMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); +// } +// } + }else{ + TtCUser ttCUserQ = new TtCUser(); + ttCUserQ.updateTenantInfo(tenantEntity); + PageInfo openIdPage = ttCUserService.listOpenIdAsPage(ttCUserQ, 1, 1000); + msg.setExpectSendNumber((int) openIdPage.getTotal()); + if(openIdPage.getTotal() == 0){ + return; + } + String phones = StringUtils.join(openIdPage.getList(), ","); + smartAppMsg.setTo(phones); + mqBaseProducer.sendMessage(smartAppMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); + if(openIdPage.getPages() > 1){ + for(int i=2;i<=openIdPage.getPages();i++){ + openIdPage = ttCUserService.listOpenIdAsPage(ttCUserQ, i, 1000); + phones = StringUtils.join(openIdPage.getList(), ","); + smartAppMsg.setTo(phones); + mqBaseProducer.sendMessage(smartAppMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); + } + } + + } + } + @Override public void addMsgCallback(WxMsg wxmsg, String batchNo) { diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index 450cc0b87..ec70d0f95 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -16,11 +16,13 @@ import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import com.google.common.collect.Lists; import com.iformall.domain.po.*; -import com.iformall.domain.po.msg.FmInsideOrderPushMsg; -import com.iformall.domain.po.msg.WxMsgRecord; +import com.iformall.domain.po.msg.*; +import com.iformall.domain.po.tt.TtCUser; import com.iformall.domain.vo.*; import com.iformall.enums.*; +import com.iformall.mapper.*; import com.iformall.service.*; import com.iformall.service.order.OrderAdapterService; import com.iformall.service.order.OrderFactory; @@ -30,6 +32,7 @@ import com.iformall.service.order.entity.WxComposeOrder; import com.iformall.service.order.util.OrderHelper; import com.iformall.service.pay.PayServiceFactory; +import com.iformall.utils.*; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,31 +58,8 @@ import com.iformall.domain.dto.OrderComposeSaveDto; import com.iformall.domain.dto.OrderSaveDto; import com.iformall.domain.dto.WxSharingOrderDto; import com.iformall.domain.po.base.TenantEntity; -import com.iformall.domain.po.msg.FmInsideOrderSuccessMsg; import com.iformall.exception.MallinkException; -import com.iformall.mapper.WxAppinfoMapper; -import com.iformall.mapper.WxBatchOrderMapper; -import com.iformall.mapper.WxCUserBasicInfoMapper; -import com.iformall.mapper.WxCUserMapper; -import com.iformall.mapper.WxCardInfoMapper; -import com.iformall.mapper.WxCouponChannelMapper; -import com.iformall.mapper.WxCouponMapper; -import com.iformall.mapper.WxCouponMerchantMapper; -import com.iformall.mapper.WxCouponOrderMapper; -import com.iformall.mapper.WxCouponPasswordMapper; -import com.iformall.mapper.WxMallMapper; -import com.iformall.mapper.WxMerchantBUserMapper; -import com.iformall.mapper.WxMerchantMapper; -import com.iformall.mapper.WxOrderGroupMapper; -import com.iformall.mapper.WxOrderMapper; -import com.iformall.mapper.WxOrderPressMapper; -import com.iformall.mapper.WxPayAccountMapper; -import com.iformall.mapper.WxPayOrderMapper; import com.iformall.mq.MqBaseProducer; -import com.iformall.utils.DateUtils; -import com.iformall.utils.PressUtils; -import com.iformall.utils.RedisLock; -import com.iformall.utils.Utility; @Service @@ -105,6 +85,9 @@ public class WxOrderServiceImpl implements WxOrderService { @Autowired WxCUserMapper wxCUserMapper; + @Autowired + TtCUserMapper ttCUserMapper; + @Autowired WxCouponMapper wxCouponMapper; @@ -192,6 +175,9 @@ public class WxOrderServiceImpl implements WxOrderService { @Autowired private WxCouponPasswordMapper couponPasswordMapper; + @Autowired + WxAuthorizerInfoMapper authorizerInfoMapper; + @Autowired ExcelService excelService; @@ -219,6 +205,14 @@ public class WxOrderServiceImpl implements WxOrderService { @Lazy @Autowired WxMerchantService wxMerchantService; + + @Lazy + @Autowired + WxTemplateMsgService wxTemplateMsgService; + + @Lazy + @Autowired + private WxMsgService wxMsgService; @Override public PageInfo listAsPage(WxOrder record, Integer pageIndex, Integer pageSize) { @@ -1412,67 +1406,73 @@ public class WxOrderServiceImpl implements WxOrderService { /// 储值卡信息添加 if (isCard) { - Integer fee = 0; - WxCardInfo cardInfo = new WxCardInfo(); - cardInfo.setId(couponOrder.getId()); - cardInfo.updateTenantInfo(order); - cardInfo.setCouponId(order.getProductId()); - cardInfo.setAmount(coupon.getPrice()); - cardInfo.setSaleAmount(coupon.getSalePrice()); - cardInfo.setRemainingAmount(coupon.getPrice()); - if (!coupon.checkIsFree()) { - //判断该transctionId是否已经存在,如果存在,则不添加 - WxCardInfo cardInfoq = new WxCardInfo(); - cardInfoq.setTransactionId(payOrder.getTransactionId()); - List cardInfoList = wxCardInfoMapper.findList(cardInfoq); - if (null != cardInfoList && cardInfoList.size() > 0) { - //do nothing - }else { - // 有价卡 - cardInfo.setTransactionId(payOrder.getTransactionId()); - if (payOrder.getShareAmount() != null) { - // 开启分账 - WxComposeChildOrderShare share = payOrder.getChildOrderShare(order.getId()); - fee = share.getRealPayMent() - share.getShareAmount(); - cardInfo.setShareFeeAmount(share.getShareAmount()); - cardInfo.setRemainingShareFeeAmount(share.getShareAmount()); - cardInfo.setRateAmount(share.getRateAmount()); - } else { - // 未开启分账 - Integer orderRealPayMent = payOrder.getChildOrderShare(order.getId()).getRealPayMent(); - fee = OrderHelper.getMallCharge(orderRealPayMent, payAccount); - Integer shareAmount = orderRealPayMent - fee; - cardInfo.setShareFeeAmount(shareAmount); - cardInfo.setRemainingShareFeeAmount(shareAmount); - cardInfo.setRateAmount(OrderHelper.getRateAmount(orderRealPayMent, fee, payAccount)); - } - } - } else { - // 免费卡 - cardInfo.setShareFeeAmount(0); - cardInfo.setRemainingShareFeeAmount(0); - cardInfo.setRateAmount(0); - if (coupon.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) { - WxCouponPassword updateCPwd = new WxCouponPassword(); - updateCPwd.setId(couponPasswordId); - updateCPwd.setCardId(cardInfo.getId()); - updateCPwd.setStatus(EnumCouponPasswordStatus.USED.getCode()); - couponPasswordMapper.updateById(updateCPwd); - } - } - - cardInfo.setServiceFeeAmount(fee); - cardInfo.setCreateDate(curr); - cardInfo.setUpdateDate(curr); - cardInfo.setSupportTransfer(coupon.getSupportTransfer()); - - //检查卡是否下架,如果是,不可转赠 - WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(order.getCouponChannelId(),order.getTenantId()); - if (wxCouponChannel != null && wxCouponChannel.getStatus().equals(EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode())) { - cardInfo.setSupportTransfer(EnumCouponTransfer.NO.getCode()); - } - wxCardInfoMapper.insert(cardInfo); - } + Integer fee = 0; + WxCardInfo cardInfo = new WxCardInfo(); + cardInfo.setId(couponOrder.getId()); + cardInfo.updateTenantInfo(order); + cardInfo.setCouponId(order.getProductId()); + cardInfo.setAmount(coupon.getPrice()); + cardInfo.setSaleAmount(coupon.getSalePrice()); + cardInfo.setRemainingAmount(coupon.getPrice()); + if (!coupon.checkIsFree()) { + //判断该transctionId是否已经存在,如果存在,则不添加 + WxCardInfo cardInfoq = new WxCardInfo(); + cardInfoq.setTransactionId(payOrder.getTransactionId()); + List cardInfoList = wxCardInfoMapper.findList(cardInfoq); + if (null != cardInfoList && cardInfoList.size() > 0) { + //do nothing + }else { + // 有价卡 + cardInfo.setTransactionId(payOrder.getTransactionId()); + if (payOrder.getShareAmount() != null) { + // 开启分账 + WxComposeChildOrderShare share = payOrder.getChildOrderShare(order.getId()); + fee = share.getRealPayMent() - share.getShareAmount(); + cardInfo.setShareFeeAmount(share.getShareAmount()); + cardInfo.setRemainingShareFeeAmount(share.getShareAmount()); + cardInfo.setRateAmount(share.getRateAmount()); + } else { + // 未开启分账 + Integer orderRealPayMent = payOrder.getChildOrderShare(order.getId()).getRealPayMent(); + fee = OrderHelper.getMallCharge(orderRealPayMent, payAccount); + Integer shareAmount = orderRealPayMent - fee; + cardInfo.setShareFeeAmount(shareAmount); + cardInfo.setRemainingShareFeeAmount(shareAmount); + cardInfo.setRateAmount(OrderHelper.getRateAmount(orderRealPayMent, fee, payAccount)); + } + } + } else { + // 免费卡 + cardInfo.setShareFeeAmount(0); + cardInfo.setRemainingShareFeeAmount(0); + cardInfo.setRateAmount(0); + if (coupon.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) { + WxCouponPassword updateCPwd = new WxCouponPassword(); + updateCPwd.setId(couponPasswordId); + updateCPwd.setCardId(cardInfo.getId()); + updateCPwd.setStatus(EnumCouponPasswordStatus.USED.getCode()); + couponPasswordMapper.updateById(updateCPwd); + } + } + + cardInfo.setServiceFeeAmount(fee); + cardInfo.setCreateDate(curr); + cardInfo.setUpdateDate(curr); + cardInfo.setSupportTransfer(coupon.getSupportTransfer()); + + //检查卡是否下架,如果是,不可转赠 + WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(order.getCouponChannelId(),order.getTenantId()); + if (wxCouponChannel != null && wxCouponChannel.getStatus().equals(EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode())) { + cardInfo.setSupportTransfer(EnumCouponTransfer.NO.getCode()); + } + wxCardInfoMapper.insert(cardInfo); + } + + try{ + sendMsgForCouponOrder(couponOrder,coupon); + }catch(Exception e){ + logger.info("卷到账提醒error"+e.getMessage()); + } return couponOrder; } @@ -1563,9 +1563,231 @@ public class WxOrderServiceImpl implements WxOrderService { } wxCardInfoMapper.insert(cardInfo); } + try{ + sendMsgForCouponOrder(couponOrder,coupon); + }catch(Exception e){ + logger.info("卷到账提醒error"+e.getMessage()); + } return couponOrder; } + //卷到账消息 + private void sendMsgForCouponOrder(WxCouponOrder couponOrder, WxCoupon coupon) { + if(EnumPayWay.PAY_WAY_NOT_UNPAY_GIFTLIST.getCode().equals(couponOrder.getPayVendor())){ + logger.info("礼包子券 不发提醒"); + return; + } + if(EnumCouponType.CARD_MULTIMCH.getCode().equals(coupon.getType()) + || EnumCouponType.COUPON_GIFT.getCode().equals(coupon.getType()) + || EnumCouponType.COUPON_DISTRIBUTION.getCode().equals(coupon.getType()) + || EnumCouponType.COUPON_PREORDER.getCode().equals(coupon.getType()) + ){ + logger.info("购物卡,券礼包,可配送商品,预购商品 不发提醒"); + return; + } + boolean isSendTt = false; + boolean isSendWx = false; + + if(EnumPayWay.PAY_WAY_TT.getCode().equals(couponOrder.getPayVendor())){ + isSendTt = true; + }else if(EnumPayWay.PAY_WAY_WECHAT.getCode().equals(couponOrder.getPayVendor())){ + isSendWx = true; + }else{ + isSendTt = true; + isSendWx = true; + } + if(isSendTt){ + TtCUser tcuQ = new TtCUser(); + tcuQ.updateTenantInfo(coupon); + tcuQ.setUserId(couponOrder.getCUserId()); + List list = ttCUserMapper.findList(tcuQ); + if(list != null && list.size() > 0){ + for (TtCUser cuser:list) { + //发订阅消息 + sendCouponRemind(couponOrder,coupon, cuser); + } + } + } + if(isSendWx){ + WxCUser wcuQ = new WxCUser(); + wcuQ.updateTenantInfo(coupon); + wcuQ.setUserId(couponOrder.getCUserId()); + List list = wxCUserMapper.findList(wcuQ); + if(list != null && list.size() > 0){ + for (WxCUser cuser:list) { + //发订阅消息 + sendCouponRemind(couponOrder,coupon, cuser); + // 发送微信模板消息(公众号模板消息/小程序统一消息/小程序模板消息) + sendMpMsgForSendCoupon(couponOrder,coupon, cuser); + } + } + } + } + + private void sendCouponRemind(WxCouponOrder couponOrder,WxCoupon coupon,WxCUser cuser){ + try { + WxTemplateMsg temp = new WxTemplateMsg(); + temp.updateTenantInfo(coupon); + temp.setType(EnumTemplateType.SEND_COUPON_REMIND.getCode()); + temp = wxTemplateMsgService.getByObj(temp); + if(temp.getId() != null){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + WxMsg msg = new WxMsg(); + msg.updateTenantInfo(coupon); + msg.setPhones(cuser.getOpenId()); + msg.setModelId(temp.getId()); + Map map = new HashMap<>(); + map.put("thing1",coupon.getTitle()); + map.put("time3",dateFormat.format(couponOrder.getCreateDate())); + map.put("time4",dateFormat.format(couponOrder.getExpiredTime())); + map.put("thing5","你的优惠券已到账!请立即使用"); + if(EnumCouponType.COUPON_TINGCHE.getCode().equals(couponOrder.getCouponType()) + || EnumCouponType.COUPON_CREDIT_PARK.getCode().equals(couponOrder.getCouponType())){ + map.put("goToPage","pages/index/index?type=in"); + }else{ + map.put("goToPage","pages/index/index?type=mc"); + } + + msg.setMsg(JSONObject.toJSONString(map)); + wxMsgService.batchSendAppinfo(msg); + } + } catch (Exception e) { +// e.printStackTrace(); + logger.error("发卷消息发送异常"); + } + } + + private void sendCouponRemind(WxCouponOrder couponOrder,WxCoupon coupon,TtCUser cuser){ + try { + WxTemplateMsg temp = new WxTemplateMsg(); + temp.updateTenantInfo(coupon); + temp.setType(EnumTemplateType.TT_SEND_COUPON_REMIND.getCode()); + temp = wxTemplateMsgService.getByObj(temp); + if(temp.getId() != null){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + WxMsg msg = new WxMsg(); + msg.updateTenantInfo(coupon); + msg.setPhones(cuser.getOpenId()); + msg.setModelId(temp.getId()); + Map map = new HashMap<>(); + map.put("优惠券名称",coupon.getTitle()); + map.put("过期时间",dateFormat.format(couponOrder.getExpiredTime())); + map.put("备注","你的优惠券已到账!请立即使用"); + if(EnumCouponType.COUPON_TINGCHE.getCode().equals(couponOrder.getCouponType()) + || EnumCouponType.COUPON_CREDIT_PARK.getCode().equals(couponOrder.getCouponType())){ + map.put("goToPage","pages/index/index?type=in"); + }else{ + map.put("goToPage","pages/index/index?type=mc"); + } + + msg.setMsg(JSONObject.toJSONString(map)); + wxMsgService.batchSendTtAppinfo(msg); + } + } catch (Exception e) { +// e.printStackTrace(); + logger.error("发卷消息发送异常"); + } + } + + private boolean sendMpMsgForSendCoupon(WxCouponOrder couponOrder,WxCoupon coupon, WxCUser user) { + // 发送 公众号 模板消息 + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String gotopage = Constant.mainPageUrl + "?type=mc"; + // 7. 公众号消息 + if (StringUtils.isNotBlank(user.getMpAppId()) && + StringUtils.isNotBlank(user.getMpOpenId()) && + user.getMpSubscribe().equals(EnumUserIsSubscribe.YES.getCode())) { + // 检查是否超限 + WxMsgLimit msgLimit = new WxMsgLimit(); + msgLimit.updateTenantInfo(couponOrder); + msgLimit.setType(EnumMsgLimitType.WXCHAT_OPENID_SEND.getCode()); + msgLimit.setLimitId(user.getMpOpenId()); + if (wxMsgLimitService.checkIsLimit(msgLimit)) { + logger.error("用户公众号模板消息超限" + user.getId()); + return true; + } + + // 已关注公众号 + /** + * 购票成功通知 + * {first.DATA}} + * 订单号:{{keyword1.DATA}} + * 兑换券:{{keyword2.DATA}} + * 订单详情:{{keyword3.DATA}} + * 有效期至:{{keyword4.DATA}} + * 购买数量:{{keyword5.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.updateTenantInfo(couponOrder); + mpAppMsg.setTemplateType(EnumTemplateType.GIFT_MESSAGE.getCode()); + mpAppMsg.setDataList(Lists.newArrayList( + user.getNickName(), + String.valueOf(couponOrder.getOrderId()), + couponOrder.getId().toString(), + coupon.getTitle(), + dateFormat.format(couponOrder.getExpiredTime()), + "1", + user.getNickName() + + )); + + 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); + } + } else { + // 可能未关注公众号, 用户可能收不到 + // 8. 微信小程序-统一消息 + // 检查是否超限 + WxMsgLimit msgLimit = new WxMsgLimit(); + msgLimit.updateTenantInfo(couponOrder); + msgLimit.setType(EnumMsgLimitType.WEAPP_OPENID_SEND.getCode()); + msgLimit.setLimitId(user.getOpenId()); + if (wxMsgLimitService.checkIsLimit(msgLimit)) { + logger.error("用户小程序统一模板消息超限:" + user.getId()); + return true; + } + // 获取小程序关联的服务号 + WxAuthorizerInfo authQ = new WxAuthorizerInfo(); + authQ.setAuthorizerAppid(user.getAppId()); + authQ.updateTenantInfo(couponOrder); + 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.GIFT_MESSAGE.getCode()); + appUniformMsg.setPagePath(gotopage); + appUniformMsg.setMpAppId(weappInfo.getAuthorizerAppid()); + appUniformMsg.setDataList(Lists.newArrayList( + user.getNickName(), + String.valueOf(couponOrder.getOrderId()), + couponOrder.getId().toString(), + coupon.getTitle(), + dateFormat.format(couponOrder.getExpiredTime()), + "1", + user.getNickName() + )); + 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); + } + } + } + return false; + } + @Override @Transactional(propagation = Propagation.NESTED, readOnly = false, rollbackFor = {Exception.class}) public WxCouponOrder sendFreeCouponToUser(Long userId,TenantEntity tenantinfo, Long couponId, WxCouponSendVo wxCouponSendVo,EnumPayWay payWay,Long merchantId,Long bUserId) { diff --git a/mallinkService/src/main/java/com/iformall/service/msg/impl/SendSmartAppMsgServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/msg/impl/SendSmartAppMsgServiceImpl.java index 725a76f2a..edf08d2c7 100644 --- a/mallinkService/src/main/java/com/iformall/service/msg/impl/SendSmartAppMsgServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/msg/impl/SendSmartAppMsgServiceImpl.java @@ -6,26 +6,27 @@ import cn.binarywang.wx.miniapp.constant.WxMaConstants; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.google.gson.JsonParser; import com.iformall.domain.po.WxAppinfo; import com.iformall.domain.po.WxTemplateMsg; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.po.msg.BaseMsg; import com.iformall.domain.po.msg.SmartAppMsg; +import com.iformall.douyin.miniapp.api.TtMaService; +import com.iformall.douyin.miniapp.api.bean.TtMaSubscribeMessage; +import com.iformall.enums.EnumTemplateType; import com.iformall.mapper.WxCUserMapper; import com.iformall.mapper.WxTemplateMsgMapper; import com.iformall.service.WxAppinfoService; import com.iformall.service.msg.MsgSendService; import com.iformall.service.wechat.FmOpenService; import com.iformall.utils.MaUtil; -import me.chanjar.weixin.common.error.WxErrorException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; /** @@ -60,23 +61,12 @@ public class SendSmartAppMsgServiceImpl implements MsgSendService { tenantEntity.setTenantId(smartAppMsg.getTenantId()); tenantEntity.setParentTenantId(smartAppMsg.getParentTenantId()); - WxTemplateMsg msg = null; - WxMaSubscribeMessage subscribeMessage; -// WxMaTemplateMessage templateMessage; - - WxMaService wxMaService = null; - if(isFmOpen) { - wxMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(smartAppMsg.getAppId()); - } else { - WxAppinfo appInfo = wxAppinfoService.getByAppId(smartAppMsg.getAppId()); - wxMaService = maUtil.getWeappService(appInfo); - } - //查询信息模板 WxTemplateMsg msgQ = new WxTemplateMsg(); msgQ.updateTenantInfo(tenantEntity); msgQ.setType(smartAppMsg.getTemplateType()); List list = wxTemplateMsgMapper.findList(msgQ); + WxTemplateMsg msg = null; if (list.size() > 0) { msg = list.get(0); } @@ -86,63 +76,75 @@ public class SendSmartAppMsgServiceImpl implements MsgSendService { return; } if(0 == msg.getOnOff().intValue()){ - JSONObject customParam = JSON.parseObject(msg.getCustomParam()); -// String url = customParam.getString("url"); -// String emphasis = customParam.getString("emphasis"); - - // build template data list - List dataList = smartAppMsg.getDataList(); - JSONArray indexArr = customParam.getJSONArray("index"); - - List dataTempList = new ArrayList<>(); - for(int i=0;i dataTempList = new ArrayList<>(); -// for(int i=0;i dataList = smartAppMsg.getDataList(); + JSONArray indexArr = customParam.getJSONArray("index"); + + List dataTempList = new ArrayList<>(); + for(int i=0;i