Jelajahi Sumber

fix 模板消息

zoujiajian 3 tahun lalu
induk
melakukan
e212ca4258

+ 26 - 0
netflix-common/src/main/java/com/cyksj/common/constant/TemplateEnum.java

@@ -0,0 +1,26 @@
+package com.cyksj.common.constant;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/*
+ *项目名: netflix
+ *文件名: TemplateEnum
+ *创建者: JavaZou
+ *创建时间:2022/10/27 9:47
+ */
+@Getter
+@AllArgsConstructor
+public enum TemplateEnum {
+	ORDER_TRANSPORT_ENV_TEMPLATE("发货通知测试环境模板", "eQ8IXwudD5yJ6HPgyqTq9O9IZBb5Qvd1_BjoztmsbvA", " "),
+	ORDER_TRANSPORT_PRD_TEMPLATE("发货通知正式环境模板", "PEypYNXir9x9mzse31MP-8rjOXQ7_p16UTZgM8yzjHo", " "),
+	NEW_ORDER_ENV_TEMPLATE("新订单通知正式测试模板", "ArZr9oCJYelqCfn0pU7RQqRbRIWuyRNaU7N_Oo6p2vM", " "),
+	NEW_ORDER_PRD_TEMPLATE("新订单通知正式环境模板", "T88yYYsfhBIKALWGmGTY2ZJGWHx91pcAtinoRGZ0krw", " "),
+	EMPTY_ENV_TEMPLATE("空车位通知测试环境模板", "ArZr9oCJYelqCfn0pU7RQqRbRIWuyRNaU7N_Oo6p2vM", " "),
+	EMPTY_PRD_TEMPLATE("正式环境空车位通知模板", "T88yYYsfhBIKALWGmGTY2ZJGWHx91pcAtinoRGZ0krw", " "),
+
+	;
+	private String desc;
+	private String templateId;
+	private String url;
+}

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java

@@ -27,6 +27,8 @@ public class OrderDon extends BaseEntity implements Serializable {
     /** 订单号 */
     private String orderNo ;
 
+    private Long goodsId;
+
     /**
      * 微信订单号
      */

+ 23 - 0
netflix-service/src/main/java/com/cyksj/common/EnvCommonService.java

@@ -0,0 +1,23 @@
+package com.cyksj.common;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/*
+ *项目名: netflix
+ *文件名: EnvCommon
+ *创建者: JavaZou
+ *创建时间:2022/10/26 17:10
+ */
+@Component
+@Getter
+@Setter
+public class EnvCommonService {
+
+	public static final String active = "dev";
+
+	@Value(value = "${spring.profiles.active}")
+	private String env;
+}

+ 60 - 6
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -2,15 +2,19 @@ package com.cyksj.service.mange.impl;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.cyksj.mapper.OrderDonMapper;
-import com.cyksj.mapper.OrderDonTransportMapper;
-import com.cyksj.mapper.OrderDonWaybillMapper;
-import com.cyksj.model.entity.OrderDon;
-import com.cyksj.model.entity.OrderDonTransport;
-import com.cyksj.model.entity.OrderDonWaybill;
+import com.cyksj.common.EnvCommonService;
+import com.cyksj.common.constant.TemplateEnum;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.mapper.*;
+import com.cyksj.model.dto.WxMpTemplateData;
+import com.cyksj.model.dto.WxMpTemplateMessage;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.excel.ExcelOrderDonInfo;
 import com.cyksj.model.manage.request.ReqSetLogisticsPost;
 import com.cyksj.service.mange.CmsOrderDonService;
+import com.cyksj.service.wechat.WeChatService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -31,6 +35,16 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
 
     private final OrderDonWaybillMapper orderDonWaybillMapper;
 
+    private final UserMapper userMapper;
+
+    private final EnvCommonService envCommonService;
+
+    private final GoodsDonMapper goodsDonMapper;
+
+    private final WeChatService weChatService;
+
+    private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
+
     @Override
     public List<ExcelOrderDonInfo> exportOrderInfo(Long promotionId, String start, String end) {
         return this.getBaseMapper().exportOrderInfo(promotionId,start,end);
@@ -53,6 +67,13 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             orderDon.setStatus(OrderDon.Status.transport);
             updateById(orderDon);
             //发送微信模板消息
+            TASK_POOL.execute(()->{
+                try {
+                    sendTransportMsgNotify(orderDon, reqSetLogisticsPost);
+                } catch (Exception e) {
+                    log.error("发送发货通知至{}用户失败:{}", orderDon.getUserId(), e);
+                }
+            });
         }else {
             orderDonWaybillMapper.updateById(orderDonWaybill);
         }
@@ -60,4 +81,37 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
     }
 
 
+    private void sendTransportMsgNotify(OrderDon orderDon, ReqSetLogisticsPost reqSetLogisticsPost) throws Exception {
+        TemplateEnum templateEnum = null;
+        if (EnvCommonService.active.equals(envCommonService.getEnv())) {
+            templateEnum = TemplateEnum.ORDER_TRANSPORT_ENV_TEMPLATE;
+        }else {
+            templateEnum = TemplateEnum.ORDER_TRANSPORT_PRD_TEMPLATE;
+        }
+        String openId = orderDon.getOpenId();
+        if (openId == null) {
+            User u  = userMapper.selectById(orderDon.getUserId());
+            if (u == null) {
+                throw BusinessRuntimeException.getInstance("用户不存在");
+            }
+            openId = u.getOpenId();
+        }
+        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
+                .toUser(openId)
+                .templateId(templateEnum.getTemplateId())
+                //TODO
+                .url(" ")
+                .build();
+        GoodsDon goodsDon = goodsDonMapper.selectById(orderDon.getGoodsId());
+        OrderDonTransport transport = transportMapper.selectOne(Wrappers.lambdaQuery(OrderDonTransport.class).eq(OrderDonTransport::getOrderId, reqSetLogisticsPost.getOrderId()).last("limit 1"));
+        templateMessage.addData(new WxMpTemplateData("first", "订单发货通知"))
+                .addData(new WxMpTemplateData("keyword1", orderDon.getOrderNo()))
+                .addData(new WxMpTemplateData("keyword2", goodsDon.getTitle()))
+                .addData(new WxMpTemplateData("keyword3", reqSetLogisticsPost.getCodeCn()))
+                .addData(new WxMpTemplateData("keyword4", reqSetLogisticsPost.getTrackingNumber()))
+                .addData(new WxMpTemplateData("keyword5", String.format("%s%s%s%s", transport.getProvince(), transport.getCity(), transport.getDistrict(), transport.getAddress())))
+                .addData(new WxMpTemplateData("remark", "可复制运单编号查询物流信息"));
+
+        weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
+    }
 }

+ 89 - 2
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -1,10 +1,11 @@
 package com.cyksj.service.order.impl;
 
 import cn.hutool.core.date.DateField;
-import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.common.EnvCommonService;
+import com.cyksj.common.constant.TemplateEnum;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.snowflake.Sequence;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
@@ -14,6 +15,8 @@ import com.cyksj.config.WeChatConfig;
 import com.cyksj.dto.RedisKey;
 import com.cyksj.mapper.*;
 import com.cyksj.model.dto.H5JsPayParams;
+import com.cyksj.model.dto.WxMpTemplateData;
+import com.cyksj.model.dto.WxMpTemplateMessage;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.views.OrderDonView;
 import com.cyksj.model.request.OrderAttach;
@@ -36,7 +39,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
-import static com.cyksj.enums.GatewayApiCode.*;
+import static com.cyksj.enums.GatewayApiCode.GROUP_INDEX_ALREADY_BE_USER;
+import static com.cyksj.enums.GatewayApiCode.GROUP_INDEX_NOT_FIND;
 
 /**
  * @author chan
@@ -83,6 +87,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
     private final OrderDonMapper orderDonMapper;
 
+    private final EnvCommonService envCommonService;
+
+    private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
+
 
     @Transactional(rollbackFor = Throwable.class)
     @Override
@@ -283,6 +291,49 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
         this.updateById(order);
 
+        //新订单产生 发送模板消息给用户、客服
+        User user = userMapper.selectById(order.getUserId());
+        THREAD_POOL_TASK_EXECUTOR.execute(() -> {
+            try {
+                //发送至用户消息
+                newOderSendMsgByType(order, goodsDon, sku, user, user.getOpenId());
+            } catch (Exception e) {
+                log.error("向用户发送新订单{}通知消息失败:{}", order.getOrderNo(), e);
+            }
+        });
+//        THREAD_POOL_TASK_EXECUTOR.execute(() -> {
+//            try {
+//                //发送至客服消息
+//                //TODO 客服openId
+//                newOderSendMsgByType(order, goodsDon, sku, user, "customer service OpenId");
+//            } catch (Exception e) {
+//                log.error("向客服发送新订单{}通知消息失败:{}", order.getOrderNo(), e);
+//            }
+//        });
+    }
+
+    private void newOderSendMsgByType(OrderDon order, GoodsDon goodsDon, GoodsDonSku sku, User user, String toPeople) throws Exception {
+        TemplateEnum templateEnum = null;
+        if (EnvCommonService.active.equals(envCommonService.getEnv())) {
+            templateEnum = TemplateEnum.ORDER_TRANSPORT_ENV_TEMPLATE;
+        }else {
+            templateEnum = TemplateEnum.ORDER_TRANSPORT_PRD_TEMPLATE;
+        }
+        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
+                .toUser(toPeople)
+                .templateId(templateEnum.getTemplateId())
+                //TODO
+                .url(" ")
+                .build();
+        templateMessage.addData(new WxMpTemplateData("first", "新订单通知!"))
+                .addData(new WxMpTemplateData("keyword1", order.getOrderNo()))
+                .addData(new WxMpTemplateData("keyword2", String.format("%s,%s", goodsDon.getTitle(), sku.getSpecVal())))
+                .addData(new WxMpTemplateData("keyword3", user.getNickname()))
+                .addData(new WxMpTemplateData("keyword4", order.getMoney().divide(BigDecimal.valueOf(100)).toString()))
+                .addData(new WxMpTemplateData("keyword5", DateUtil.format(order.getCreatedTime(),"yyyy-MM-dd")))
+                .addData(new WxMpTemplateData("remark", "点击查看详情"));
+
+        weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
     }
 
     @Transactional(rollbackFor = Throwable.class)
@@ -307,12 +358,48 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
                         groupsRelation.setStatus(GroupsRelation.Status.none);
                         groupsRelationMapper.updateById(groupsRelation);
                         delRelation(groupsRelation.getId());
+
+                        //车位空余发送模板消息
+//                        TASK_POOL.execute(()->{
+//                            try {
+//                                //TODO 客服openId
+//                                emptySendMsgNotify(orderDon,"customer service openId");
+//                            } catch (Exception e) {
+//                                log.error("发送{}空车位模板消息至客服失败:{}", orderDon.getGoodsId(), e);
+//                            }
+//                        });
                     }
                 }
             }
         }
     }
 
+    private void emptySendMsgNotify(OrderDon orderDon, String toPeople) throws Exception {
+        TemplateEnum templateEnum = null;
+        if (EnvCommonService.active.equals(envCommonService.getEnv())) {
+            templateEnum = TemplateEnum.EMPTY_ENV_TEMPLATE;
+        }else {
+            templateEnum = TemplateEnum.EMPTY_PRD_TEMPLATE;
+        }
+        User u = userMapper.selectById(orderDon.getUserId());
+        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
+                .toUser(toPeople)
+                .templateId(templateEnum.getTemplateId())
+                //TODO
+                .url(" ")
+                .build();
+        GoodsDon goodsDon = goodsDonMapper.selectById(orderDon.getGoodsId());
+        GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(orderDon.getSkuId());
+        templateMessage.addData(new WxMpTemplateData("first", "空车位通知!"))
+                .addData(new WxMpTemplateData("keyword1", orderDon.getOrderNo()))
+                .addData(new WxMpTemplateData("keyword2", String.format("%s,%s", goodsDon.getTitle(), goodsDonSku.getSpecVal())))
+                .addData(new WxMpTemplateData("keyword3", u == null ? " " : u.getNickname()))
+                .addData(new WxMpTemplateData("keyword4", DateUtil.format(orderDon.getCreatedTime(), "yyyy-MM-dd")))
+                .addData(new WxMpTemplateData("remark", "请尽快关联账号信息"));
+
+        weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
+    }
+
     @Override
     public OrderDon renewal(OrderPayRequest payRequest) {
         User user = userMapper.selectById(payRequest.getUserId());