ソースを参照

feat:“线下订单添加订单通知功能“

soobin 1 年間 前
コミット
55c12090b7

+ 11 - 2
src/main/java/com/szwl/controller/TCoinOrderController.java

@@ -245,8 +245,8 @@ public class TCoinOrderController {
 
         String adminIdStr = String.valueOf(adminId);
         // 根据 adminId 获取admin信息中的公司类型
-        TAdmin byId = R.getDataIfSuccess(szwlFeign.getAdmin(adminIdStr));
-        String companyType = byId.getCompanyType();
+        TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(adminIdStr));
+        String companyType = admin.getCompanyType();
 
         TCoinOrder coinOrder = new TCoinOrder();
         coinOrder.setId(IDGenerator.coinOrderID());
@@ -370,6 +370,15 @@ public class TCoinOrderController {
             e.printStackTrace();
         }
         try {
+            // 推送微信订单
+            // 判断是否开启订单推送功能
+            if(admin != null && StringUtils.isNotEmpty(admin.getOrderNotice()) && admin.getOrderNotice().equals("1")) {
+                String openId = R.getDataIfSuccess(szwlFeign.getOpenId(adminId));
+                // 获取openId
+                if(StringUtils.isNotEmpty(openId)) {
+                    coinOrderService.sendWechatMessage(openId, equipment, coinOrder, admin.getCompanyType());
+                }
+            }
             esTCoinOrderService.insertData(coinOrder);
         } catch (Exception e) {
             e.printStackTrace();

+ 7 - 1
src/main/java/com/szwl/mapper/xml/TAdminMapper.xml

@@ -41,11 +41,17 @@
         <result column="relation_admin_id" property="relationAdminId" />
         <result column="manager_id" property="managerId" />
         <result column="company_type" property="companyType" />
+        <result column="order_notice" property="orderNotice" />
+        <result column="api_key" property="apiKey" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, create_date, modify_date, agency_id, area_id, qr_code_img_url, department, email, is_admined, is_enabled, is_locked, locked_date, login_date, login_failure_count, login_ip, merchant_id, trade_merchant_no, name, parent_id, password, personage_id, notice_id, type, username, phone, is_refund, if_foreign, open, promo_code_open, apply_start_time, apply_end_time, code, pay_platform, logo_rule, relation_admin_id, manager_id, company_type
+        id, create_date, modify_date, agency_id, area_id, qr_code_img_url, department, email, is_admined,
+        is_enabled, is_locked, locked_date, login_date, login_failure_count, login_ip, merchant_id,
+        trade_merchant_no, name, parent_id, password, personage_id, notice_id, type, username, phone,
+        is_refund, if_foreign, open, promo_code_open, apply_start_time, apply_end_time, code, pay_platform,
+        logo_rule, relation_admin_id, manager_id, company_type, order_notice, api_key
     </sql>
 
 </mapper>

+ 1 - 1
src/main/java/com/szwl/model/bean/CoinOrderVO.java

@@ -35,7 +35,7 @@ public class CoinOrderVO {
 
     private Integer payType;
 
-    private Integer productNumber = 1;
+    private Integer productNumber;
 
     public Integer getProductNumber() {
         return productNumber;

+ 28 - 0
src/main/java/com/szwl/model/bean/WeChatTemplateMsg.java

@@ -0,0 +1,28 @@
+package com.szwl.model.bean;
+
+import lombok.Data;
+import lombok.ToString;
+
+@Data
+@ToString
+public class WeChatTemplateMsg {
+    /**
+     * 消息
+     */
+    private String value;
+    /**
+     * 消息颜色
+     */
+    private String color;
+
+
+    public WeChatTemplateMsg(String value) {
+        this.value = value;
+        this.color = "#173177";
+    }
+
+    public WeChatTemplateMsg(String value, String color) {
+        this.value = value;
+        this.color = color;
+    }
+}

+ 6 - 0
src/main/java/com/szwl/model/entity/TAdmin.java

@@ -136,6 +136,12 @@ public class TAdmin implements Serializable {
     @ApiModelProperty(value = "公司平台,0或空为申泽,1为七云")
     private String companyType;
 
+    @ApiModelProperty(value = "微信公众号订单通知,0:关闭,1:开启,默认关闭")
+    private String orderNotice;
+
+    @ApiModelProperty(value = "第三方调用API密钥")
+    private String apiKey;
+
     @Transient
     public String getManagerId() {
 

+ 1 - 1
src/main/java/com/szwl/model/excel/NewCoinOrderTarget.java

@@ -79,7 +79,7 @@ public class NewCoinOrderTarget {
      * 状态
      */
     @ColumnWidth(20)
-    @ExcelProperty("Payment status")
+    @ExcelProperty("Status")
     private String status;
 
 

+ 10 - 0
src/main/java/com/szwl/service/TCoinOrderService.java

@@ -5,6 +5,7 @@ import com.szwl.model.dto.OrderDto;
 import com.szwl.model.entity.TAdmin;
 import com.szwl.model.entity.TCoinOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.szwl.model.entity.TEquipment;
 import com.szwl.model.excel.CoinOrderTarget;
 import com.szwl.model.query.OrderStatisticsDTO;
 
@@ -37,4 +38,13 @@ public interface TCoinOrderService extends IService<TCoinOrder> {
      * @param response
      */
     void dataExport(OrderDto orderDto, Date begin, Date end, HttpServletResponse response) throws IOException;
+
+    /**
+     * 推送微信订单通知
+     * @param openId
+     * @param equipment
+     * @param coinOrder
+     * @param companyType
+     */
+    void sendWechatMessage(String openId, TEquipment equipment, TCoinOrder coinOrder, String companyType);
 }

+ 86 - 7
src/main/java/com/szwl/service/impl/TCoinOrderServiceImpl.java

@@ -5,20 +5,19 @@ import com.alibaba.excel.ExcelWriter;
 import com.alibaba.excel.write.metadata.WriteSheet;
 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.szwl.constant.ResponseCodesEnum;
 import com.szwl.feign.SzwlFeign;
 import com.szwl.model.bean.OrderDaoChuDTO;
+import com.szwl.model.bean.WeChatTemplateMsg;
 import com.szwl.model.bo.R;
-import com.szwl.model.bo.ResponseModel;
 import com.szwl.model.dto.OrderDto;
 import com.szwl.model.entity.*;
 import com.szwl.mapper.TCoinOrderMapper;
 import com.szwl.model.excel.CoinOrderTarget;
 import com.szwl.model.excel.NewCoinOrderTarget;
-import com.szwl.model.excel.NewOrderTarget;
 import com.szwl.model.query.OrderDaoChuParam;
 import com.szwl.model.query.OrderStatisticsDTO;
 import com.szwl.service.TCoinOrderService;
@@ -26,15 +25,15 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.StringRedisTemplate;
-import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
@@ -57,6 +56,16 @@ public class TCoinOrderServiceImpl extends ServiceImpl<TCoinOrderMapper, TCoinOr
     @Autowired
     SzwlFeign szwlFeign;
 
+    /**
+     * 申泽订单通知模版ID
+     */
+    public static final String SZ_TEMPLATE_ID = "Kn37QCyj-JsvKhP9CtNwsYoZe7liMq2uuTO1MbZdbEk";
+
+    /**
+     * 七云订单通知模版ID
+     */
+    public static final String SC_TEMPLATE_ID = "NNvPtOznN2nSV2g57y7B0tUZ77-bf0XxG4OaUvk5EZA";
+
     @Override
     public List<CoinOrderTarget> findByCoinOrder(TAdmin admin, List<TCoinOrder> coinOrders) {
         ArrayList<CoinOrderTarget> list = new ArrayList<>();
@@ -254,7 +263,7 @@ public class TCoinOrderServiceImpl extends ServiceImpl<TCoinOrderMapper, TCoinOr
         // 创建 CountDownLatch 对象
         CountDownLatch countDownLatch = new CountDownLatch(totalPages);
         // 创建线程池
-        ExecutorService executorService = Executors.newFixedThreadPool(10);
+        ExecutorService executorService = Executors.newFixedThreadPool(totalPages);
         // 循环写入数据
         for (int i = 1; i <= totalPages; i++) {
             int page = i;
@@ -290,6 +299,76 @@ public class TCoinOrderServiceImpl extends ServiceImpl<TCoinOrderMapper, TCoinOr
         executorService.shutdown();
     }
 
+    @Override
+    public void sendWechatMessage(String openId, TEquipment equipment, TCoinOrder coinOrder, String companyType) {
+        String accessToken = "";
+        try {
+            if(StringUtils.isEmpty(companyType) || companyType.equals("0")) {
+                TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin("2738"));
+                accessToken = admin.getApiKey();
+                log.info("申泽的accessToken:{}", accessToken);
+            } else {
+                TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin("2739"));
+                accessToken = admin.getApiKey();
+                log.info("七云的accessToken:{}", accessToken);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        // 模板参数
+        Map<String, WeChatTemplateMsg> sendMag = new HashMap();
+        // 转换时间为String类型
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String payTime = format.format(coinOrder.getPayDate());
+        // 模版参数
+        if(StringUtils.isNotEmpty(equipment.getName())) {
+            if(equipment.getName().length() > 20) {
+                sendMag.put("thing15", new WeChatTemplateMsg(equipment.getName().substring(0, 15) + "..."));
+            } else {
+                sendMag.put("thing15", new WeChatTemplateMsg(equipment.getName()));
+            }
+        } else {
+            sendMag.put("thing15", new WeChatTemplateMsg(equipment.getClientId().substring(-6)));
+        }
+        if(coinOrder.getProductName().length() > 20) {
+            sendMag.put("thing37", new WeChatTemplateMsg(coinOrder.getProductName().substring(0, 15) + "..."));
+        } else {
+            sendMag.put("thing37", new WeChatTemplateMsg(coinOrder.getProductName()));
+        }
+        sendMag.put("character_string8", new WeChatTemplateMsg(coinOrder.getSn()));
+        sendMag.put("amount34", new WeChatTemplateMsg(coinOrder.getPrice().toString()));
+        sendMag.put("time36", new WeChatTemplateMsg(payTime));
+        RestTemplate restTemplate = new RestTemplate();
+        Map<String, Object> sendBody = new HashMap<>();
+        sendBody.put("touser", openId);
+        sendBody.put("topcolor", "#FF0000");
+        sendBody.put("data", sendMag);
+        if(StringUtils.isEmpty(companyType) || companyType.equals("0")) {
+            sendBody.put("template_id", SZ_TEMPLATE_ID);
+        } else {
+            sendBody.put("template_id", SC_TEMPLATE_ID);
+        }
+        sendMessage(accessToken, restTemplate, sendBody);
+    }
+
+    /**
+     * 发送微信消息
+     * @param accessToken
+     * @param restTemplate
+     * @param sendBody
+     * @return
+     */
+    private String sendMessage(String accessToken, RestTemplate restTemplate, Map<String, Object> sendBody) {
+        String sendUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;
+        ResponseEntity<String> forEntity = restTemplate.postForEntity(sendUrl, sendBody, String.class);
+        JSONObject jsonObject = JSONObject.parseObject(forEntity.getBody());
+        String messageCode = jsonObject.getString("errcode");
+        String msgId = jsonObject.getString("msgid");
+        System.out.println("messageCode : " + messageCode + ", msgId: " +msgId);
+        log.info("微信推送结果:{}","messageCode : " + messageCode + ", msgId: " +msgId);
+        return messageCode;
+    }
+
     private List<NewCoinOrderTarget> exportCoinOrderData(TAdmin admin, List<TCoinOrder> coinOrders) {
         ArrayList<NewCoinOrderTarget> list = new ArrayList<>();
         Map<String, String> nameMap = new HashMap<>();

+ 3 - 1
src/main/java/com/szwl/service/impl/TOrderServiceImpl.java

@@ -48,6 +48,8 @@ import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 /**
  * <p>
@@ -517,7 +519,7 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         // 创建 CountDownLatch 对象
         CountDownLatch countDownLatch = new CountDownLatch(totalPages);
         // 创建线程池
-        ExecutorService executorService = Executors.newFixedThreadPool(10);
+        ExecutorService executorService = Executors.newFixedThreadPool(totalPages);
         // 循环写入数据
         for (int i = 1; i <= totalPages; i++) {
             int page = i;