Bläddra i källkod

线下收款推送模板消息

chao 3 år sedan
förälder
incheckning
dee4377644

+ 8 - 3
src/main/java/com/caimei365/order/components/WeChatService.java

@@ -353,9 +353,9 @@ public class WeChatService {
      * @param money 金额
      * @param time 日期时间
      * @param remarkText 备注文本:收款类型+确认时间
-     * @param redirectUrl 跳转链接
+     * @param pagePath 小程序跳转链接
      */
-    public void sendTemplateMsg(String openid, String title, Double money, String time, String remarkText, String redirectUrl) {
+    public void sendTemplateMsg(String openid, String title, Double money, String time, String remarkText, String pagePath) {
         JSONObject first = new JSONObject();
         first.put("value", title);
         first.put("color", "#000000");
@@ -375,11 +375,16 @@ public class WeChatService {
         data.put("keyword2", keyword2);
         data.put("remark", remark);
 
+        JSONObject miniProgram = new JSONObject();
+        miniProgram.put("appid", receiptAppId);
+        miniProgram.put("pagepath", pagePath);
+
         JSONObject json = new JSONObject();
         json.put("template_id", messageTemplateId);
         json.put("topcolor", "#FF0000");
         json.put("touser", openid);
-        json.put("url", redirectUrl);
+        json.put("url", "https://www.caimei365.com/");
+        json.put("miniprogram", miniProgram);
         json.put("data", data);
         // json 字符串
         String jsonString = json.toJSONString();

+ 0 - 1
src/main/java/com/caimei365/order/controller/ReceiptApi.java

@@ -1,7 +1,6 @@
 package com.caimei365.order.controller;
 
 import com.caimei365.order.model.ResponseJson;
-import com.caimei365.order.model.dto.ReceiptAssociateDto;
 import com.caimei365.order.model.dto.ReceiptAuthDto;
 import com.caimei365.order.model.dto.ReceiptDto;
 import com.caimei365.order.model.dto.ReceiptOperateDto;

+ 6 - 1
src/main/java/com/caimei365/order/mapper/ReceiptMapper.java

@@ -30,6 +30,10 @@ public interface ReceiptMapper {
      * 根据openid获取收款用户
      */
     ReceiptUserVo getReceiptUserByOpenid(String openId);
+    /**
+     * 根据收款用户Id获取姓名
+     */
+    String getReceiptUserNameById(Integer id);
     /**
      * 根据mobile获取收款用户
      */
@@ -155,7 +159,7 @@ public interface ReceiptMapper {
     /**
      * 根据用户类型获取用户openid列表
      */
-    List<String> getOpenidListByUserType(Integer userType);
+    List<String> getOpenidListByPermission(List<Integer> permissions);
     /**
      * 统计收款金额
      */
@@ -198,4 +202,5 @@ public interface ReceiptMapper {
      * 查询待审核数量
      */
     int getPendingAuditCount(Integer orderId);
+
 }

+ 33 - 1
src/main/java/com/caimei365/order/model/vo/ReceiptVo.java

@@ -1,6 +1,5 @@
 package com.caimei365.order.model.vo;
 
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -50,6 +49,18 @@ public class ReceiptVo implements Serializable {
      * 确认时间
      */
     private String confirmDate;
+    /**
+     * 审核时间
+     */
+    private String reviewDate;
+    /**
+     * 撤销时间
+     */
+    private String cancelDate;
+    /**
+     * 撤销原因
+     */
+    private String cancelReason;
     /**
      * 单次收款金额
      */
@@ -106,4 +117,25 @@ public class ReceiptVo implements Serializable {
      * 关联订单列表
      */
     private List<OrderVo> orderList;
+    /**
+     * 收款人
+     */
+    private Integer receiptUserPermissionId;
+    private String receiptUserName;
+    /**
+     * 确认人
+     */
+    private Integer confirmUserPermissionId;
+    private String confirmUserName;
+    /**
+     * 审核人
+     */
+    private Integer reviewUserPermissionId;
+    private String reviewUserName;
+    /**
+     * 撤销人
+     */
+    private Integer cancelUserPermissionId;
+    private String cancelUserName;
+
 }

+ 9 - 0
src/main/java/com/caimei365/order/service/ReceiptService.java

@@ -184,4 +184,13 @@ public interface ReceiptService {
      * @param reviewReason  审核不通过原因
      */
     ResponseJson<Void> receiptAudit(Integer id, Integer receiptStatus, String reviewReason, HttpHeaders headers);
+
+    /**
+     * 微信收款信息推送(待确认超时)
+     */
+    void sendWechatMsgConfirmTimeout();
+    /**
+     * 微信收款信息推送(待审核超时)
+     */
+    void sendWechatMsgAuditTimeout();
 }

+ 112 - 32
src/main/java/com/caimei365/order/service/impl/ReceiptServiceImpl.java

@@ -1,5 +1,6 @@
 package com.caimei365.order.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.caimei365.order.components.WeChatService;
 import com.caimei365.order.mapper.BaseMapper;
 import com.caimei365.order.mapper.OrderCommonMapper;
@@ -117,9 +118,22 @@ public class ReceiptServiceImpl implements ReceiptService {
                     Map<String, Object> infoData = appletsInfo.getData();
                     String openid = (String) infoData.get(WeChatService.Keys.OPEN_ID);
                     String unionId = (String) infoData.get(WeChatService.Keys.UNION_ID);
-                    receiptMapper.updateOpenidByMobile(openid, unionId, mobile);
+                    if (StringUtils.isBlank(unionId)) {
+                        try {
+                            String sessionKey = (String) infoData.get(WeChatService.Keys.SESSION_KEY);
+                            String result = WeChatService.decrypt(encryptedData, sessionKey, iv, "UTF-8");
+                            log.info("解密数据>>>>>>" + result);
+                            Map parseMap = JSONObject.parseObject(result, Map.class);
+                            assert parseMap != null;
+                            unionId = parseMap.get(WeChatService.Keys.UNION_ID).toString();
+                            infoData.put(WeChatService.Keys.UNION_ID, unionId);
+                        } catch (Exception e) {
+                            log.error("微信解密unionId失败:", e);
+                        }
+                    }
                     receiptUser.setOpenid(openid);
                     receiptUser.setUnionId(unionId);
+                    receiptMapper.updateOpenidByMobile(openid, unionId, mobile);
                 } else {
                     return ResponseJson.error(appletsInfo.getMsg(), null);
                 }
@@ -1070,23 +1084,20 @@ public class ReceiptServiceImpl implements ReceiptService {
         receiptPo.setConfirmUserPermissionId(receiptUser.getId());
         receiptPo.setConfirmDate(time);
         receiptMapper.updateReceipt(receiptPo);
-        // 关联成功推送模板消息给审核人员(3财务)
-        List<String> openidList = receiptMapper.getOpenidListByUserType(3);
+
+        // 关联成功推送模板消息给指定人员(用户权限: 1收款列表访问,2收款详情访问,3收款录入,4收款关联订单,5收款关联返佣,6收款关联供应商退款,7收款审核)
+        List<String> openidList = receiptMapper.getOpenidListByPermission(Collections.singletonList(7));
         openidList.removeIf(Objects::isNull);
         double associateAmount = receiptMapper.countAssociateAmountById(receipt.getId());
         String associateTitle = "收款和订单已确认关联,请及时审核!";
         String associateDate = receipt.getReceiptDate();
         String associateType = receiptMapper.getReceiptTypeStrById(receipt.getPayType());
         String remarkText = "收款类型:" + associateType + ",确认时间:"+receipt.getConfirmDate();
-
-        //todo 跳转到详情页
-        // 跳转链接 crm旧链接:/api/user/receivables/toReceivablesPage.rpc?pageName=listToDesc&id=receipt.getId()
-
-
-        String redirectUrl = "";
+        // 跳转到【普通款项待审核】页面
+        String pagePath = "/pages/relation/ordinary/examine-detail?id="+receipt.getId();
         for (String openid : openidList) {
             // sendTemplateMsg(openid, 标题, 金额, 收款日期, 备注, 跳转链接)
-            weChatService.sendTemplateMsg(openid, associateTitle, associateAmount, associateDate, remarkText, redirectUrl);
+            weChatService.sendTemplateMsg(openid, associateTitle, associateAmount, associateDate, remarkText, pagePath);
         }
         return ResponseJson.success("关联收款信息成功!", null);
     }
@@ -1516,41 +1527,98 @@ public class ReceiptServiceImpl implements ReceiptService {
         receiptPo.setReviewDate(time);
         receiptMapper.updateReceipt(receiptPo);
 
-        // 推送消息给指定人员
-        if (3 == receiptStatus) {
-            // 审核通过
-            String title = "订单支付成功!";
-            String openid = receiptUser.getOpenid();
-            String date = receiptPo.getReceiptDate();
-            for (OrderReceiptRelationPo relationItem : listRelation) {
-                // 订单信息
-                OrderVo order = orderCommonMapper.getOrderByOrderId(relationItem.getOrderId());
-                String remarkText = "订单ID:"+order.getOrderId()+","+order.getReceiptStatus()+",买家:"+order.getUserName();
-
-                //todo /spCmOrder/listDetails.rpc?orderId="+order.getOrderId()
-                String redirectUrl = "";
-                // sendTemplateMsg(openid, 标题, 金额, 收款日期, 备注, 跳转链接)
-                weChatService.sendTemplateMsg(openid, title, relationItem.getAssociateAmount(), date, remarkText, redirectUrl);
-            }
-        } else {
+        // 审核未通过 推送模板消息给指定人员
+        if (4 == receiptStatus) {
             // 审核未通过
             String title = "订单审核未通过,请重新确认审核!";
             String date = receipt.getReceiptDate();
             String receiptTypeStr = receiptMapper.getReceiptTypeStrById(receipt.getPayType());
             String remarkText = "收款类型:"+ receiptTypeStr +";"+"审核时间:"+receiptPo.getReviewDate();
             double associateAmount = receiptMapper.countAssociateAmountById(receipt.getId());
-            List<String> openidList = receiptMapper.getOpenidListByUserType(1);
+            // (用户权限: 1收款列表访问,2收款详情访问,3收款录入,4收款关联订单,5收款关联返佣,6收款关联供应商退款,7收款审核)
+            List<String> openidList = receiptMapper.getOpenidListByPermission(Collections.singletonList(4));
             openidList.removeIf(Objects::isNull);
+            // 跳转到【普通款项待审核】页面
+            String pagePath = "/pages/relation/ordinary/examine-detail?id="+receipt.getId();
+            for (String openid : openidList) {
+                // sendTemplateMsg(openid, 标题, 金额, 收款日期, 备注, 跳转链接)
+                weChatService.sendTemplateMsg(openid, title, associateAmount, date, remarkText, pagePath);
+            }
+        }
+        return ResponseJson.success("审核收款信息成功!", null);
+    }
 
-            // todo /api/user/receivables/toReceivablesPage.rpc?pageName="+pageName+"&id="+receipt.getId()
-            String redirectUrl = "";
+    /**
+     * 微信收款信息推送(待确认超时)
+     */
+    @Override
+    public void sendWechatMsgConfirmTimeout() {
+        //待确认超时
+        ReceiptParamsBo paramsBo = new ReceiptParamsBo();
+        String[] receiptStatusArr = "1".split(",");
+        paramsBo.setReceiptStatusArr(receiptStatusArr);
+        paramsBo.setStartDate("2022-01-01 00:00:00");
+        List<ReceiptVo> list = receiptMapper.getReceiptList(paramsBo);
+        list.removeIf(Objects::isNull);
+        // (用户权限: 1收款列表访问,2收款详情访问,3收款录入,4收款关联订单,5收款关联返佣,6收款关联供应商退款,7收款审核)
+        List<String> openidList = receiptMapper.getOpenidListByPermission(Arrays.asList(4,5,6));
+        openidList.removeIf(Objects::isNull);
+        String title = "超时未确认,请及时查看详情并确认关联!";
+        String pagePath = "";
+        for (ReceiptVo receipt : list) {
+            // 收款款项类型:1订单款,2非订单款,3返佣款,5供应商退款
+            Integer receiptType = receipt.getReceiptType();
+            if (null != receiptType && 1 == receiptType) {
+                // 未关联普通款项
+                pagePath = "/pages/relation/ordinary/index?id="+receipt.getId();
+            }
+            if (null != receiptType && 3 == receiptType) {
+                // 未关联返佣款项
+                pagePath = "/pages/relation/return/index?id="+receipt.getId();
+            }
+            if (null != receiptType && 5 == receiptType) {
+                // 未关联供应商退款
+                pagePath = "/pages/relation/refund/index?id="+receipt.getId();
+            }
+            double amount = receipt.getReceiptAmount();
+            String date = receipt.getReceiptDate();
+            String receiptTypeStr = receiptMapper.getReceiptTypeStrById(receipt.getPayType());
+            String remarkText = "收款类型:" + receiptTypeStr;
+            for (String openid : openidList) {
+                // sendTemplateMsg(openid, 标题, 金额, 收款日期, 备注, 跳转链接)
+                weChatService.sendTemplateMsg(openid, title, amount, date, remarkText, pagePath);
+            }
+        }
+    }
 
+    /**
+     * 微信收款信息推送(待审核超时)
+     */
+    @Override
+    public void sendWechatMsgAuditTimeout() {
+        //待审核超时
+        ReceiptParamsBo paramsBo = new ReceiptParamsBo();
+        String[] receiptStatusArr = "2".split(",");
+        paramsBo.setReceiptStatusArr(receiptStatusArr);
+        paramsBo.setStartDate("2022-01-01 00:00:00");
+        List<ReceiptVo> list = receiptMapper.getReceiptList(paramsBo);
+        list.removeIf(Objects::isNull);
+        // (用户权限: 1收款列表访问,2收款详情访问,3收款录入,4收款关联订单,5收款关联返佣,6收款关联供应商退款,7收款审核)
+        List<String> openidList = receiptMapper.getOpenidListByPermission(Collections.singletonList(7));
+        openidList.removeIf(Objects::isNull);
+        String title = "超时未审核,请及时查看详情并审核!";
+        for (ReceiptVo receipt : list) {
+            double amount = receiptMapper.countAssociateAmountById(receipt.getId());
+            String date = receipt.getConfirmDate();
+            String receiptTypeStr = receiptMapper.getReceiptTypeStrById(receipt.getPayType());
+            String remarkText = "收款类型:" + receiptTypeStr + ",确认时间:"+receipt.getConfirmDate();
+            // 跳转到【普通款项待审核】页面
+            String pagePath = "/pages/relation/ordinary/examine-detail?id="+receipt.getId();
             for (String openid : openidList) {
                 // sendTemplateMsg(openid, 标题, 金额, 收款日期, 备注, 跳转链接)
-                weChatService.sendTemplateMsg(openid, title, associateAmount, date, remarkText, redirectUrl);
+                weChatService.sendTemplateMsg(openid, title, amount, date, remarkText, pagePath);
             }
         }
-        return ResponseJson.success("审核收款信息成功!", null);
     }
 
     /**
@@ -1643,6 +1711,18 @@ public class ReceiptServiceImpl implements ReceiptService {
             String userName = baseMapper.getUserNameByUserId(receipt.getUserId());
             receipt.setUserName(userName);
         }
+        if (null != receipt.getReceiptUserPermissionId()) {
+            String receiptUserName = receiptMapper.getReceiptUserNameById(receipt.getReceiptUserPermissionId());
+            receipt.setReceiptUserName(receiptUserName);
+        }
+        if (null != receipt.getConfirmUserPermissionId()) {
+            String confirmUserName = receiptMapper.getReceiptUserNameById(receipt.getConfirmUserPermissionId());
+            receipt.setConfirmUserName(confirmUserName);
+        }
+        if (null != receipt.getReviewUserPermissionId()) {
+            String reviewUserName = receiptMapper.getReceiptUserNameById(receipt.getReviewUserPermissionId());
+            receipt.setReviewUserName(reviewUserName);
+        }
         ReceiptTypeVo type = receiptMapper.getReceiptTypeById(receipt.getPayType());
         receipt.setPayTypeText(type.getType());
         receipt.setReceiptTypeText(ReceiptType.getTypeDesc(receipt.getReceiptType()));

+ 38 - 0
src/main/java/com/caimei365/order/task/ReceiptMsgTask.java

@@ -0,0 +1,38 @@
+package com.caimei365.order.task;
+
+import com.caimei365.order.service.ReceiptService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * 线下收款推送模板消息
+ *
+ * @author : Charles
+ * @date : 2022/2/25
+ */
+@Slf4j
+@Component
+@EnableScheduling
+public class ReceiptMsgTask {
+    @Resource
+    private ReceiptService receiptService;
+
+    /**
+     * 微信收款信息推送
+     * 每天九点钟推送
+     */
+    @Scheduled(cron = "0 0 09 * * ?")
+    public void sendWechatMsgTask() {
+        log.info("-------->微信收款信息定时推送--start<--------------");
+        // 待确认超时
+        receiptService.sendWechatMsgConfirmTimeout();
+        // 待审核超时
+        receiptService.sendWechatMsgAuditTimeout();
+        log.info("-------->微信收款信息定时推送--end<--------------");
+    }
+
+}

+ 19 - 6
src/main/resources/mapper/ReceiptMapper.xml

@@ -146,6 +146,9 @@
         FROM cm_receipt_user
         WHERE mobile = #{mobile} AND del_flag = 0
     </select>
+    <select id="getReceiptUserNameById" resultType="java.lang.String">
+        SELECT DISTINCT name FROM cm_receipt_user WHERE id = #{id}
+    </select>
     <select id="getPermissionsByUserId" resultType="java.lang.Integer">
         SELECT permission_id FROM cm_receipt_user_permission WHERE user_id = #{userId}
     </select>
@@ -316,12 +319,17 @@
         cdr.smsMd5Code,
         cdr.receiptDate,
         cdr.confirmDate,
+        cdr.reviewDate,
+        cdr.cancelDate,
         cdr.handlingFee,
         cdr.orderFlag,
         cdr.noOrderReason,
+        cdr.cancelReason,
         cdr.confirmType,
-        cru.name AS confirmUserName,
-        su.fullName AS cancelUserName,
+        receiptUserPermissionID AS receiptUserPermissionId,
+        confirmUserPermissionID AS confirmUserPermissionId,
+        reviewUserPermissionID AS reviewUserPermissionId,
+        cancelUserPermissionID AS cancelUserPermissionId,
         CASE WHEN cror.relationType = 2 THEN co.organizeID
         WHEN cror.relationType = 1 THEN cso.organizeID
         ELSE '' END AS organizeId,
@@ -333,8 +341,6 @@
         ), 0) AS associateAmount
         FROM cm_discern_receipt cdr
         LEFT JOIN cm_receipt_order_relation cror ON (cror.receiptID = cdr.id AND cror.delFlag = '0')
-        LEFT JOIN cm_receipt_user cru ON cru.id = cdr.confirmUserPermissionID
-        LEFT JOIN system_user su ON su.id = cdr.cancelUserPermissionID
         LEFT JOIN cm_order co ON (cror.orderID = co.orderID AND cror.relationType = 2)
         LEFT JOIN cm_shop_order cso ON (cror.orderID = cso.shopOrderID AND cror.relationType = 1)
         WHERE cdr.delFlag = '0' AND cdr.id = #{id}
@@ -793,8 +799,14 @@
         WHERE cror.relationType = '1' AND cror.delFlag = '0'
           AND cror.orderID = #{shopOrderId} and cdr.receiptType = '3'
     </select>
-    <select id="getOpenidListByUserType" resultType="java.lang.String">
-        SELECT DISTINCT openid FROM cm_receipt_user WHERE user_type = #{userType} AND del_flag = 0
+    <select id="getOpenidListByPermission" resultType="java.lang.String">
+        SELECT DISTINCT cru.openid FROM cm_receipt_user cru
+        LEFT JOIN cm_receipt_user_permission crup ON crup.user_id = cru.id
+        WHERE crup.permission_id IN
+        <foreach collection="permissions" open="(" close=")" item="permission" separator=",">
+            #{permission}
+        </foreach>
+        AND cru.del_flag = 0
     </select>
     <select id="countAssociateAmountById" resultType="java.lang.Double">
         SELECT IFNULL(SUM(associateAmount), 0) FROM cm_receipt_order_relation WHERE receiptID = #{receiptId}
@@ -854,4 +866,5 @@
           AND cdr.delFlag = '0'
           AND cdr.receiptStatus IN (2,4)
     </select>
+
 </mapper>