From 3838a676330838ad3bfa1c95fdf5c14014adea74 Mon Sep 17 00:00:00 2001 From: xhxu Date: Thu, 20 Jul 2023 23:13:09 +0800 Subject: [PATCH] //..notice --- .../db/migration/V2023072000002_msg_model.sql | 8 +- .../schedule/SharingOrderRedoSchedule.java | 93 ++++++++++++++++--- .../domain/po/WxMsgValidationcodeModel.java | 2 +- .../com/iformall/enums/EnumMailMsgModel.java | 3 + .../java/com/iformall/enums/EnumMsgModel.java | 1 + .../impl/WxProfitSharingOrderServiceImpl.java | 8 +- .../msg/impl/SendEmailServiceImpl.java | 35 ++++--- .../service/msg/impl/SendSmsServiceImpl.java | 1 + 8 files changed, 113 insertions(+), 38 deletions(-) diff --git a/mallinkAdmin/src/main/resources/db/migration/V2023072000002_msg_model.sql b/mallinkAdmin/src/main/resources/db/migration/V2023072000002_msg_model.sql index 1de8a8dbe..4115fbe9b 100644 --- a/mallinkAdmin/src/main/resources/db/migration/V2023072000002_msg_model.sql +++ b/mallinkAdmin/src/main/resources/db/migration/V2023072000002_msg_model.sql @@ -1,2 +1,6 @@ -INSERT INTO `mallink`.`wx_msg_validationcode_model`(`id`, `type`, `name`, `signature`, `content`, `createtime`, `status`, `minutes`, `email_bg_img`, `open`, `msg_type`, `role_type`, `model_code`) VALUES (34, 34, '预约通知', '富茂', '您有新的预约订单请及时处理。', '2023-07-20 18:00:26', 1, 0, NULL, 0, 1, 2, ' -SMS_461970987'); +INSERT INTO `mallink`.`wx_msg_validationcode_model`(`id`, `type`, `name`, `signature`, `content`, `createtime`, `status`, `minutes`, `email_bg_img`, `open`, `msg_type`, `role_type`, `model_code`) VALUES (34, 34, '预约通知', '富茂', '您有新的预约订单请及时处理。', '2023-07-20 18:00:26', 1, 0, NULL, 0, 1, 2, 'SMS_461970987'); + +INSERT INTO `mallink`.`wx_msg_validationcode_model`(`id`, `type`, `name`, `signature`, `content`, `createtime`, `status`, `minutes`, `email_bg_img`, `open`, `msg_type`, `role_type`, `model_code`) VALUES (35, 35, '分账失败提醒', '富茂', '您有订单分账处理失败,请及时查看。', '2023-07-20 18:00:26', 1, 0, NULL, 0, 1, 1, 'SMS_462021018'); + + +INSERT INTO `mallink`.`wx_msg_validationcode_model`(`id`, `type`, `name`, `signature`, `content`, `createtime`, `status`, `minutes`, `email_bg_img`, `open`, `msg_type`, `role_type`, `model_code`) VALUES (36, 36, '分账失败通知', '富茂', '\r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n 富茂通知邮件\r\n \r\n \r\n\r\n\r\n\r\n
\r\n
\r\n
\r\n \r\n
\r\n
通知({mallName})
\r\n
您有分账处理失败的订单,请电脑登录后台查看分账详情
\r\n
\r\n
\r\n
\r\n\r\n\r\n', '2023-07-20 18:00:26', 1, NULL, NULL, 0, 2, 1, NULL); diff --git a/mallinkSchedule/src/main/java/com/iformall/schedule/SharingOrderRedoSchedule.java b/mallinkSchedule/src/main/java/com/iformall/schedule/SharingOrderRedoSchedule.java index a835a84dc..81a9cb2d9 100644 --- a/mallinkSchedule/src/main/java/com/iformall/schedule/SharingOrderRedoSchedule.java +++ b/mallinkSchedule/src/main/java/com/iformall/schedule/SharingOrderRedoSchedule.java @@ -1,21 +1,20 @@ package com.iformall.schedule; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.iformall.common.ErrorCode; import com.iformall.common.ResultData; -import com.iformall.domain.dto.WxSharingOrderDto; -import com.iformall.domain.po.WxMall; -import com.iformall.domain.po.WxPayOrder; -import com.iformall.domain.po.WxProfitSharingOrder; +import com.iformall.domain.po.*; import com.iformall.domain.po.base.TenantEntity; -import com.iformall.enums.EnumPayStatus; -import com.iformall.enums.EnumPayWay; -import com.iformall.enums.EnumProfitSharingOrderStatus; -import com.iformall.enums.EnumProfitSharingOrderType; +import com.iformall.domain.po.msg.MailMsg; +import com.iformall.domain.po.msg.WxMsgRecord; +import com.iformall.enums.*; import com.iformall.mapper.WxMallMapper; +import com.iformall.mapper.WxMallNoticeContactMapper; import com.iformall.mapper.WxPayOrderMapper; import com.iformall.mapper.WxProfitSharingOrderMapper; +import com.iformall.mq.MqBaseProducer; import com.iformall.service.WxProfitSharingOrderService; +import com.iformall.utils.DateUtils; +import org.apache.commons.collections.map.HashedMap; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -23,7 +22,9 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -import java.util.List; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; @Component public class SharingOrderRedoSchedule { @@ -39,10 +40,18 @@ public class SharingOrderRedoSchedule { @Autowired WxPayOrderMapper wxPayOrderMapper; - @Autowired WxMallMapper wxMallMapper; + @Autowired + WxMallNoticeContactMapper wxMallNoticeContactMapper; + + @Autowired + MqBaseProducer mqBaseProducer; + + @Autowired + private String fmExceptionEmails; + private List getMalls() { WxMall wxMall =new WxMall(); return wxMallMapper.findList(wxMall); @@ -55,6 +64,8 @@ public class SharingOrderRedoSchedule { public void sharingOrderRedoSchedule() { List malls = getMalls(); for (WxMall mall: malls) { + AtomicInteger errorCount = new AtomicInteger(); + WxProfitSharingOrder wxProfitSharingOrder = new WxProfitSharingOrder(); wxProfitSharingOrder.setTenantId(mall.getTenantId()); // wxProfitSharingOrder.setType(EnumProfitSharingOrderType.PROFIT_SHARING_SINGLE.getCode()); @@ -62,32 +73,48 @@ public class SharingOrderRedoSchedule { List list = wxProfitSharingOrderMapper.findList(wxProfitSharingOrder); if (null != list) { list.stream().forEach(sharingOrder->{ - try { + int i = DateUtils.daysBetween(sharingOrder.getCreateTime(), new Date()); + boolean isSuccess = true; + try { // WxPayOrder wxPayOrder = new WxPayOrder(); // wxPayOrder.updateTenantInfo(sharingOrder); // wxPayOrder.setId(sharingOrder.getOrderId()); // wxPayOrder = wxPayOrderMapper.selectOne(new QueryWrapper(wxPayOrder)); WxPayOrder wxPayOrder = wxPayOrderMapper.selectById(sharingOrder.getOrderId(),sharingOrder.getTenantId()); if (null == wxPayOrder) { + isSuccess = false; logger.error("分账重试失败:" + EnumProfitSharingOrderType.PROFIT_SHARING_SINGLE.getMessage() + " ID:" +sharingOrder.getId() + " RES: wxPayOrder is null." ); + return; } ResultData result = wxProfitSharingOrderService.redoSharingOrder(sharingOrder,wxPayOrder); if (result.code != ResultData.SUCCESS) { + isSuccess = false; logger.error("分账重试失败:" + EnumProfitSharingOrderType.PROFIT_SHARING_SINGLE.getMessage() + " ID:" +sharingOrder.getId() + " RES:" + result.message); } } catch (Exception e){ + isSuccess = false; logger.error("分账重试失败:" + EnumProfitSharingOrderType.PROFIT_SHARING_SINGLE.getMessage() + " ID:" +sharingOrder.getId() + " MSG:" + e.getMessage()); } + //分账3天失败给通知 + if(!isSuccess && i >= 3){ + errorCount.getAndIncrement(); + } }); } - + + if(errorCount.get() > 0){ + try{ + //分账失败通知 + sendSharingErrorMsg(mall); + }catch(Exception e){} + } // wxProfitSharingOrder.setType(EnumProfitSharingOrderType.PROFIT_SHARING_MULTI.getCode()); // wxProfitSharingOrder.setSharingStatus(EnumProfitSharingOrderStatus.PROFIT_SHARING_APPLY_FAILED.getCode()); @@ -134,6 +161,44 @@ public class SharingOrderRedoSchedule { } + private void sendSharingErrorMsg(WxMall mall){ + logger.info("分账失败通知start"); + WxMallNoticeContact noticeContact = wxMallNoticeContactMapper.getByTenantInfo(mall); + if(noticeContact == null){ + return; + } + if(StringUtils.isNotBlank(noticeContact.getPhone()) && EnumYesOrNo.YES.getCode().equals(noticeContact.getPhoneEnabled())){ + WxMsgRecord wxMsgRecord = new WxMsgRecord(); + wxMsgRecord.updateTenantInfo(mall); + wxMsgRecord.setMsgType(EnumMsgRecordType.SMS.getCode()); + wxMsgRecord.setModelType(EnumMsgModel.COUPON_ORDER_SHARING_ERROR.getCode()); + wxMsgRecord.setReceiver(noticeContact.getPhone()); + mqBaseProducer.sendMessage(wxMsgRecord, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); + logger.info("分账失败短信通知end"); + } + String[] fmEmails = fmExceptionEmails.split(","); + List mails = new ArrayList<>(Arrays.asList(fmEmails)); + if(StringUtils.isNotBlank(noticeContact.getEmail()) && EnumYesOrNo.YES.getCode().equals(noticeContact.getEmailEnabled())){ + mails.add(noticeContact.getEmail()); + } + String[] strings = mails.toArray(new String[mails.size()]); + + Map map = new HashedMap(); + map.put("mallName", mall.getName()); + MailMsg mailMsg = new MailMsg(); + mailMsg.setSubject("分账失败通知"); + mailMsg.setHtml(true); + mailMsg.setMsgType(EnumMsgRecordType.EMAIL.getCode()); + mailMsg.setModelType(EnumMailMsgModel.MAIL_SHARING_ERROR.getCode()); + mailMsg.setTo(strings); + mailMsg.updateTenantInfo(mall); + mailMsg.setDynamicContentMap(map); + mqBaseProducer.sendMessage(mailMsg, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); + logger.info("分账失败邮件通知end"); + + } + + // @Async //// @Scheduled(cron = "0 0 2 * * ?") // 每天凌晨02:00分账重试 // @Scheduled(cron = "0 10 */1 * * ?") // 测试 diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxMsgValidationcodeModel.java b/mallinkService/src/main/java/com/iformall/domain/po/WxMsgValidationcodeModel.java index 34d594f77..0e2826dea 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxMsgValidationcodeModel.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxMsgValidationcodeModel.java @@ -37,7 +37,7 @@ public class WxMsgValidationcodeModel extends BaseEntity { @io.swagger.annotations.ApiModelProperty(value="发送开关 0开1关",name="open") private Integer open; - @io.swagger.annotations.ApiModelProperty(value="消息类型 0全部 1短信 2邮箱 11阿里云短信(暂未启用)",name="msgType") + @io.swagger.annotations.ApiModelProperty(value="消息类型 1短信 2邮箱",name="msgType") private Integer msgType; @io.swagger.annotations.ApiModelProperty(value="0通用1管理员2商户端3消费者",name="roleType") diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumMailMsgModel.java b/mallinkService/src/main/java/com/iformall/enums/EnumMailMsgModel.java index b9afa9388..dfa37fe0c 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumMailMsgModel.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumMailMsgModel.java @@ -17,6 +17,9 @@ public enum EnumMailMsgModel { MAIL_C_APPLY_NODIFY(25, "审批通知"), MAIL_C_ASSIGNEE_NODIFY(26, "代办通知"), MAIL_C_REJECT_NODIFY(27, "驳回通知"), + + + MAIL_SHARING_ERROR(36, "分账失败通知"), ; public static EnumMailMsgModel getEnum(Integer code) { diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumMsgModel.java b/mallinkService/src/main/java/com/iformall/enums/EnumMsgModel.java index e4fd95220..2c5a4d76d 100644 --- a/mallinkService/src/main/java/com/iformall/enums/EnumMsgModel.java +++ b/mallinkService/src/main/java/com/iformall/enums/EnumMsgModel.java @@ -43,6 +43,7 @@ public enum EnumMsgModel { COUPON_ORDER_REFUND(33,"提交退款提醒"), COUPON_ORDER_RESERVATION_SUCCESS(34,"预约成功提醒"), + COUPON_ORDER_SHARING_ERROR(35,"分账失败提醒"), ; public static EnumMsgModel getEnum(Integer code) { diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxProfitSharingOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxProfitSharingOrderServiceImpl.java index 7b5e0c3fc..0ace888d0 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxProfitSharingOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxProfitSharingOrderServiceImpl.java @@ -250,16 +250,18 @@ public class WxProfitSharingOrderServiceImpl implements WxProfitSharingOrderServ WxProfitSharingOrder updSharingOrder = new WxProfitSharingOrder(); updSharingOrder.updateTenantInfo(sharingOrder); updSharingOrder.setId(sharingOrder.getId()); + updSharingOrder.setUpdateTime(currentDate); if(e.getErrorCode() == ErrorCode.PROFIT_SHARING_NO_SUB_LEDGER_AMOUNT.getCode()){ updSharingOrder.setSharingStatus(EnumProfitSharingOrderStatus.PROFIT_SHARING_PROCESSING.getCode()); updSharingOrder.setErrorMsg(e.getMessage()); + wxProfitSharingOrderMapper.updateById(updSharingOrder); + return new ResultData(); }else{ updSharingOrder.setSharingStatus(EnumProfitSharingOrderStatus.PROFIT_SHARING_APPLY_FAILED.getCode()); updSharingOrder.setErrorMsg(e.getMessage()); + wxProfitSharingOrderMapper.updateById(updSharingOrder); + return new ResultData(ErrorCode.PROFIT_SHARING_REQUEST_FAILED.getCode(),e.getMessage()); } - updSharingOrder.setUpdateTime(currentDate); - wxProfitSharingOrderMapper.updateById(updSharingOrder); - return new ResultData(ErrorCode.PROFIT_SHARING_REQUEST_FAILED.getCode(),e.getMessage()); }catch(Exception e){ WxProfitSharingOrder updSharingOrder = new WxProfitSharingOrder(); updSharingOrder.updateTenantInfo(sharingOrder); diff --git a/mallinkService/src/main/java/com/iformall/service/msg/impl/SendEmailServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/msg/impl/SendEmailServiceImpl.java index a19d1e21b..cde6d4718 100644 --- a/mallinkService/src/main/java/com/iformall/service/msg/impl/SendEmailServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/msg/impl/SendEmailServiceImpl.java @@ -48,26 +48,25 @@ public class SendEmailServiceImpl implements MsgSendService { TenantEntity tenantEntity = mailMsg.getTenantInfo(); //根据模板替换动态内容 - if(mailMsg.getModelId() != null){ - WxMsgValidationcodeModel msgModel = new WxMsgValidationcodeModel(); - msgModel.setType(mailMsg.getModelType()); - msgModel.setModelCode(String.valueOf(mailMsg.getModelId())); - msgModel.setOpen(EnumMsgOpen.OPEN.getCode()); - List modelList = wxMsgValidationcodeModelMapper.findList(msgModel); - if(CollectionUtils.isEmpty(modelList)){ - throw new Exception("模板id:"+mailMsg.getModelId()+"不存在"); - } - WxMsgValidationcodeModel wxMsgModel = modelList.get(0); + WxMsgValidationcodeModel msgModel = new WxMsgValidationcodeModel(); + msgModel.setType(mailMsg.getModelType()); + msgModel.setMsgType(2); +// msgModel.setModelCode(String.valueOf(mailMsg.getModelId())); + msgModel.setOpen(EnumMsgOpen.OPEN.getCode()); + List modelList = wxMsgValidationcodeModelMapper.findList(msgModel); + if(CollectionUtils.isEmpty(modelList)){ + throw new Exception("模板:不存在"); + } + WxMsgValidationcodeModel wxMsgModel = modelList.get(0); - String msg = wxMsgModel.getContent(); - for (Map.Entry entry : mailMsg.getDynamicContentMap().entrySet()) { - msg = msg.replace("{"+entry.getKey()+"}", entry.getValue()); - } - if(StringUtils.isNotBlank(wxMsgModel.getEmailBgImg())){ - msg = msg.replace("{bg}", wxMsgModel.getEmailBgImg()); - } - mailMsg.setMsg(msg); + String msg = wxMsgModel.getContent(); + for (Map.Entry entry : mailMsg.getDynamicContentMap().entrySet()) { + msg = msg.replace("{"+entry.getKey()+"}", entry.getValue()); + } + if(StringUtils.isNotBlank(wxMsgModel.getEmailBgImg())){ + msg = msg.replace("{bg}", wxMsgModel.getEmailBgImg()); } + mailMsg.setMsg(msg); if(mailMsg.isHtml()){ //html邮件 MimeMessage message = sender.createMimeMessage(); diff --git a/mallinkService/src/main/java/com/iformall/service/msg/impl/SendSmsServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/msg/impl/SendSmsServiceImpl.java index a936a1741..fca924460 100644 --- a/mallinkService/src/main/java/com/iformall/service/msg/impl/SendSmsServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/msg/impl/SendSmsServiceImpl.java @@ -61,6 +61,7 @@ public class SendSmsServiceImpl implements MsgSendService { WxMsgValidationcodeModel wxMsgValidationcodeModel = new WxMsgValidationcodeModel(); wxMsgValidationcodeModel.setType(record.getModelType()); + wxMsgValidationcodeModel.setMsgType(1); wxMsgValidationcodeModel.setOpen(EnumMsgOpen.OPEN.getCode()); List modelList = wxMsgValidationcodeModelMapper.findList(wxMsgValidationcodeModel); if(CollectionUtils.isEmpty(modelList)){