Эх сурвалжийг харах

查成率调整
绑定ustd地址增加

LiYi 1 долоо хоног өмнө
parent
commit
d84cd5c632

+ 2 - 0
src/main/java/org/jebot/constant/Constant.java

@@ -60,11 +60,13 @@ public class Constant {
 
     //查询商户信息
     public static final String MCH_INFO = "商户信息";
+    public static final String MCH_URL_INFO = "固定地址";
     public static final String QUERY_MCH_ORDER_FLAG = "cd";
 
     //通过群组 ID 解绑商户号
     public static final String UNBIND_MCH_FLAG = "解绑商户";
     public static final String BIND_MCH_FLAG = "绑定商户";
+    public static final String BIND_MCH_USTDURL = "绑定商户地址";
     //通过群组 ID 关闭商户
     public static final String DISABLE_MCH = "关闭商户";
     //通过群组 ID 开启商户

+ 4 - 0
src/main/java/org/jebot/handler/HandlerManager.java

@@ -21,6 +21,7 @@ import org.jebot.repository.jebot.*;
 import org.jebot.repository.xxpay.MchAccountRepository;
 import org.jebot.repository.xxpay.PayOrderRepository;
 import org.jebot.repository.xxpay.PayPassageRepository;
+import org.jebot.repository.xxpay.PayProductRepository;
 import org.jebot.service.IAccountBookService;
 import org.jebot.service.IMchService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -65,6 +66,9 @@ public class HandlerManager {
     @Resource
     PayPassageRepository passageRepository;
 
+    @Resource
+    PayProductRepository productRepository;
+
     @Resource
     MchAccountRepository mchAccountRepository;
 

+ 36 - 2
src/main/java/org/jebot/handler/impl/merchant/MerchantBindGroupOrUnbindGroupHandler.java

@@ -12,8 +12,7 @@ import org.jebot.models.xxpay.MchAccount;
 
 import java.util.regex.Pattern;
 
-import static org.jebot.constant.Constant.BIND_MCH_FLAG;
-import static org.jebot.constant.Constant.UNBIND_MCH_FLAG;
+import static org.jebot.constant.Constant.*;
 
 @Slf4j
 public class MerchantBindGroupOrUnbindGroupHandler extends AbstractHandler {
@@ -24,6 +23,9 @@ public class MerchantBindGroupOrUnbindGroupHandler extends AbstractHandler {
     //将群组与商户绑定
     private static final Pattern BIND_MCH = Pattern.compile("^" + BIND_MCH_FLAG + "[a-zA-Z0-9]*$");
 
+    //群组+商户与支付地址绑定
+    private static final Pattern BIND_MCH_URL = Pattern.compile("^" + BIND_MCH_USTDURL + "[a-zA-Z0-9]*$");
+
     @Override
     public boolean msgHandler(BotMessage botMessage) {
 
@@ -43,6 +45,12 @@ public class MerchantBindGroupOrUnbindGroupHandler extends AbstractHandler {
             return true;
         }
 
+        //绑定url
+        if (BIND_MCH_URL.matcher(text).find()) {
+            bindMerchantGroupByUrl(botMessage);
+            return true;
+        }
+
         //解绑商户群组
         if (UNBIND_MCH_FLAG.equals(text)) {
             unbindByGroup(botMessage);
@@ -116,6 +124,32 @@ public class MerchantBindGroupOrUnbindGroupHandler extends AbstractHandler {
         botMessage.getTelegramBot().execute(new SendMessage(chatId, "绑定成功"));
     }
 
+
+    //绑定url和商户
+    private void bindMerchantGroupByUrl(BotMessage botMessage) {
+        String url = botMessage.getMessage().text().replace(BIND_MCH_USTDURL, "");//获取url
+        if (!botMessage.isGroupAuthenticated()) {
+            botMessage.getTelegramBot().execute(new SendMessage(botMessage.getMessage().chat().id(), "请先绑定商户再进行操作!"));
+            return;
+        }
+        //获取群组 ID
+        Long chatId = botMessage.getMessage().chat().id();
+        //查询当前群组是否绑定商户号
+        BotGroup merchant = this.handlerManager.getGroupRepository().findBotGroupByGroupIdAndDataType(chatId, Constant.DATA_TYPE_MERCHANT);
+        this.handlerManager.getGroupRepository().updateUrlById(url, merchant.getId());
+        if (merchant.getUstdUrl() != null) {
+            //如果商户号已经存在,返回提示
+//            SendResponse execute = botMessage.getTelegramBot().execute(new SendMessage(chatId, String.format("当前商户已绑定固定地址 %s ,请先解绑!", merchant.getUstdUrl())));
+//            if (!execute.isOk()) {
+//                log.error("绑定商户固定地址结果发送失败: {}", execute);
+//            }
+//            return;
+            botMessage.getTelegramBot().execute(new SendMessage(chatId, "固定地址已从" + merchant.getUstdUrl() + "成功替换为" + url));
+        } else {
+            botMessage.getTelegramBot().execute(new SendMessage(chatId, "固定地址绑定成功"));
+        }
+    }
+
     private void unbindByMerchant(BotMessage botMessage) {
         Long mchId = Long.valueOf(botMessage.getMessage().text().replace(UNBIND_MCH_FLAG, ""));//移除解绑标识
         Long chatId = botMessage.getMessage().chat().id();//获取群组 ID

+ 10 - 0
src/main/java/org/jebot/handler/impl/merchant/MerchantInfoHandler.java

@@ -45,6 +45,16 @@ public class MerchantInfoHandler extends AbstractHandler {
 
         }
 
+        //查询当前群组商户url信息
+        if (botMessage.isGroupMch() && MCH_URL_INFO.equals(botMessage.getMessage().text())) {
+            SendMessage sendMessage = new SendMessage(botMessage.getMessage().chat().id(), String.format("商户号: `%s`\n商户名: %s \n地址: %s", botMessage.getBotGroup().getDataId(), botMessage.getBotGroup().getDataName(), botMessage.getBotGroup().getUstdUrl()));
+            sendMessage.replyParameters(new ReplyParameters(botMessage.getMessage().messageId()));
+            sendMessage.parseMode(ParseMode.MarkdownV2);
+            botMessage.getTelegramBot().execute(sendMessage);
+            return true;
+
+        }
+
         //查询代收余额
         if (botMessage.isGroupMch() && !botMessage.messageTextIsEmpty() && QUERY_MCH_BALANCE.equals(botMessage.getMessage().text())) {
             Date endDate = new Date();

+ 39 - 19
src/main/java/org/jebot/handler/impl/merchant/MerchantSuccessRateHandler.java

@@ -8,6 +8,7 @@ import org.jebot.handler.AbstractHandler;
 import org.jebot.handler.dto.BotMessage;
 import org.jebot.models.xxpay.PayOrder;
 import org.jebot.models.xxpay.PayPassage;
+import org.jebot.models.xxpay.PayProduct;
 import org.jebot.repository.xxpay.PayOrderRepository;
 
 import java.math.BigDecimal;
@@ -38,15 +39,17 @@ public class MerchantSuccessRateHandler extends AbstractHandler {
                 return true;
             }
 
-            List<Long> passageIds = new ArrayList<>(payOrderList.stream()
-                    .filter(order -> order.getPassageId() != null)
+            List<Long> productIds = new ArrayList<>(payOrderList.stream()
+                    .filter(order -> order.getProductId() != null)
                     .collect(Collectors.toMap(
-                            PayOrder::getPassageId,
-                            PayOrder::getPassageId,
+                            PayOrder::getProductId,
+                            PayOrder::getProductId,
                             (existing, replacement) -> existing))
                     .values());
 
-            List<PayPassage> passages = handlerManager.getPassageRepository().findByPassageIds(passageIds);
+            List<PayProduct> products = handlerManager.getProductRepository().findByProductIds(productIds);
+            ;
+//            List<PayPassage> passages = handlerManager.getPassageRepository().findByPassageIds(passageIds);
             StringBuilder result = new StringBuilder();
 
             // 总单数和总金额
@@ -65,28 +68,45 @@ public class MerchantSuccessRateHandler extends AbstractHandler {
 //            result.append("有效单数: ").append(validOrderCount).append("\n");
 //            result.append("总金额: ").append(totalAmount.movePointLeft(Constant.AMOUNT_MOVE_POINT)).append("\n");
 //            result.append("有效金额: ").append(validAmount.movePointLeft(Constant.AMOUNT_MOVE_POINT)).append("\n");
-
+            // 按通道统计
+//            for (PayPassage passage : passages) {
+//                List<PayOrder> passageOrders = payOrderList.stream().filter(order -> passage.getId().equals(order.getPassageId())).collect(Collectors.toList());
+//
+//                // 统计不同时间段的成功率
+//                double halfHourSuccessRate = calculateSuccessRate(passageOrders, halfHourAgo, currentTime);
+//                double oneHourSuccessRate = calculateSuccessRate(passageOrders, oneHourAgo, currentTime);
+//                double threeHourSuccessRate = calculateSuccessRate(passageOrders, threeHoursAgo, currentTime);
+//                double dailySuccessRate = calculateSuccessRate(passageOrders, DateUtil.beginOfDay(currentTime), currentTime);
+//
+//                result.append(passage.getPassageName()).append(":\n");
+//                result.append("   30分钟成功率: ").append(String.format("%.2f", halfHourSuccessRate)).append("%\n");
+//                result.append("   1小时成功率: ").append(String.format("%.2f", oneHourSuccessRate)).append("%\n");
+//                result.append("   3小时成功率: ").append(String.format("%.2f", threeHourSuccessRate)).append("%\n");
+//                result.append("   当日成功率: ").append(String.format("%.2f", dailySuccessRate)).append("%\n");
+//            }
             // 时间段
-            Date halfHourAgo = DateUtil.offsetMinute(currentTime, -30);
+            Date fifteenMinutesAgo = DateUtil.offsetMinute(currentTime, -15);
+            Date thirtyMinutesAgo = DateUtil.offsetMinute(currentTime, -30);
             Date oneHourAgo = DateUtil.offsetMinute(currentTime, -60);
-            Date threeHoursAgo = DateUtil.offsetMinute(currentTime, -180);
 
-            // 按通道统计
-            for (PayPassage passage : passages) {
-                List<PayOrder> passageOrders = payOrderList.stream().filter(order -> passage.getId().equals(order.getPassageId())).collect(Collectors.toList());
+            for (PayProduct product : products) {
+                List<PayOrder> productOrders = payOrderList.stream()
+                        .filter(order -> product.getId().equals(order.getProductId()))
+                        .collect(Collectors.toList());
 
                 // 统计不同时间段的成功率
-                double halfHourSuccessRate = calculateSuccessRate(passageOrders, halfHourAgo, currentTime);
-                double oneHourSuccessRate = calculateSuccessRate(passageOrders, oneHourAgo, currentTime);
-                double threeHourSuccessRate = calculateSuccessRate(passageOrders, threeHoursAgo, currentTime);
-                double dailySuccessRate = calculateSuccessRate(passageOrders, DateUtil.beginOfDay(currentTime), currentTime);
-
-                result.append(passage.getPassageName()).append(":\n");
-                result.append("   30分钟成功率: ").append(String.format("%.2f", halfHourSuccessRate)).append("%\n");
+                double fifteenMinuteSuccessRate = calculateSuccessRate(productOrders, fifteenMinutesAgo, currentTime);
+                double thirtyMinuteSuccessRate = calculateSuccessRate(productOrders, thirtyMinutesAgo, currentTime);
+                double oneHourSuccessRate = calculateSuccessRate(productOrders, oneHourAgo, currentTime);
+                double dailySuccessRate = calculateSuccessRate(productOrders, DateUtil.beginOfDay(currentTime), currentTime);
+
+                result.append(product.getId() + "-" + product.getProductName()).append(":\n");
+                result.append("   15分钟成功率: ").append(String.format("%.2f", fifteenMinuteSuccessRate)).append("%\n");
+                result.append("   30分钟成功率: ").append(String.format("%.2f", thirtyMinuteSuccessRate)).append("%\n");
                 result.append("   1小时成功率: ").append(String.format("%.2f", oneHourSuccessRate)).append("%\n");
-                result.append("   3小时成功率: ").append(String.format("%.2f", threeHourSuccessRate)).append("%\n");
                 result.append("   当日成功率: ").append(String.format("%.2f", dailySuccessRate)).append("%\n");
             }
+
             botMessage.getTelegramBot().execute(new SendMessage(botMessage.getMessage().chat().id(), result.toString()));
             return true;
         }

+ 3 - 0
src/main/java/org/jebot/models/jebot/BotGroup.java

@@ -43,4 +43,7 @@ public class BotGroup extends BotModel {
     @Comment("代付警告阈值")
     private double agentWarningThreshold;
 
+    @Comment("固定地址")
+    @Column(name = "ustd_url")
+    private String ustdUrl;
 }

+ 13 - 3
src/main/java/org/jebot/models/xxpay/PayOrder.java

@@ -55,7 +55,7 @@ public class PayOrder {
     private BigDecimal parentAgentProfit;
 
     @Column(name = "ProductId")
-    private String productId;
+    private Long productId;
 
     @Column(name = "PassageId")
     private Long passageId;
@@ -214,7 +214,7 @@ public class PayOrder {
     private Integer buyIdCountAll;
 
     //获取订单状态
-    public String getStatusMsg(){
+    public String getStatusMsg() {
         switch (status) {
             case -2:
                 return "订单已关闭";
@@ -233,7 +233,17 @@ public class PayOrder {
         }
     }
 
-    public PayOrder(BigDecimal amount,Long mchId,BigDecimal mchRate,  Long passageId,  Integer status, Date createTime) {
+    public PayOrder(BigDecimal amount, Long mchId, BigDecimal mchRate, Long passageId, Long productId, Integer status, Date createTime) {
+        this.amount = amount;
+        this.passageId = passageId;
+        this.productId = productId;
+        this.mchId = mchId;
+        this.mchRate = mchRate;
+        this.status = status;
+        this.createTime = createTime;
+    }
+
+    public PayOrder(BigDecimal amount, Long mchId, BigDecimal mchRate, Long passageId, Integer status, Date createTime) {
         this.amount = amount;
         this.passageId = passageId;
         this.mchId = mchId;

+ 27 - 0
src/main/java/org/jebot/models/xxpay/PayProduct.java

@@ -0,0 +1,27 @@
+package org.jebot.models.xxpay;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity(name = "t_pay_product")
+public class PayProduct {
+
+    @Id
+    private Long id;
+
+    @Column(name = "ProductName")
+    private String productName;       // 产品名称
+
+    @Column(name = "Status")
+    private int status;      // 通道ID 通道状态,0-关闭,1-开启
+}

+ 8 - 0
src/main/java/org/jebot/repository/jebot/BotGroupRepository.java

@@ -20,6 +20,9 @@ public interface BotGroupRepository extends JpaRepository<BotGroup, Long> {
     //通过data ID 和数据类型查询群组
     BotGroup findBotGroupByDataIdAndDataType(@Param("dataId") Long dataId, @Param("dataType") String dataType);
 
+
+    BotGroup findBotGroupByGroupIdAndDataType(@Param("groupId") Long groupId, @Param("dataType") String dataType);
+
     //通过群组 ID 和数据类型查询群组列表
     List<BotGroup> findAllByGroupIdAndDataType(@Param("groupId") Long groupId, @Param("dataType") String dataType);
 
@@ -35,6 +38,11 @@ public interface BotGroupRepository extends JpaRepository<BotGroup, Long> {
     @Query("UPDATE bot_group g SET g.paymentWarningThreshold = :paymentWarningThresholdNew WHERE g.id = :id")
     void updatePaymentWarningThresholdByIdAndPaymentWarningThreshold(@Param("paymentWarningThresholdNew") double paymentWarningThresholdNew, @Param("id") Long id);
 
+    @Modifying
+    @Transactional
+    @Query("UPDATE bot_group g SET g.ustdUrl = :ustdUrl WHERE g.id = :id")
+    void updateUrlById(@Param("ustdUrl") String ustdUrl, @Param("id") Long id);
+
     @Modifying
     @Transactional
     @Query("UPDATE bot_group g SET g.agentWarningThreshold =:agentWarningThresholdNew WHERE g.id =:id ")

+ 1 - 1
src/main/java/org/jebot/repository/xxpay/PayOrderRepository.java

@@ -25,7 +25,7 @@ public interface PayOrderRepository extends JpaRepository<PayOrder, String> {
 //    @Query("SELECT t FROM t_pay_order t WHERE t.payOrderId =:orderId OR t.mchOrderNo =:orderId OR t.channelOrderNo =:orderId ")
 //    PayOrder findByPayOrderIdOrMchOrderNoOrChannelOrderNo(@Param("orderId") String orderId);
 
-    @Query("SELECT new org.jebot.models.xxpay.PayOrder( tpo.amount,tpo.mchId,tpo.mchRate,tpo.passageId,tpo.status,tpo.createTime) FROM t_pay_order as tpo WHERE tpo.mchId =:mchId and tpo.createTime >= :startTime and tpo.createTime <= :endTime")
+    @Query("SELECT new org.jebot.models.xxpay.PayOrder( tpo.amount,tpo.mchId,tpo.mchRate,tpo.passageId,tpo.productId,tpo.status,tpo.createTime) FROM t_pay_order as tpo WHERE tpo.mchId =:mchId and tpo.createTime >= :startTime and tpo.createTime <= :endTime")
     List<PayOrder> findPayOrderByMchIdAndCreateTime(Long mchId, Date startTime, Date endTime);
 
     @Query("SELECT new org.jebot.models.xxpay.PayOrder( tpo.amount,tpo.mchId,tpo.mchRate,tpo.passageId,tpo.status,tpo.createTime) FROM t_pay_order as tpo WHERE  tpo.mchId =:mchId and tpo.status in (2,3) and tpo.createTime >= :startTime and tpo.createTime <= :endTime")

+ 19 - 0
src/main/java/org/jebot/repository/xxpay/PayProductRepository.java

@@ -0,0 +1,19 @@
+package org.jebot.repository.xxpay;
+
+import org.jebot.models.xxpay.PayProduct;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Component;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+@Component
+public interface PayProductRepository extends JpaRepository<PayProduct, Long> {
+
+    @Query("SELECT t FROM t_pay_product t WHERE t.id in (:productIds)")
+    List<PayProduct> findByProductIds(List<Long> productIds);
+
+}

+ 23 - 13
src/main/resources/application.yml

@@ -3,13 +3,14 @@ server:
 # 机器人配置
 telegram:
   bot:
-#    token: "8185747478:AAHjhpvGgLy6pwj3g3QquTsp21WB4N60pjM"
-
+    token: "8185747478:AAHjhpvGgLy6pwj3g3QquTsp21WB4N60pjM"
 
+    #印度
+#    token: 8223554708:AAF61EA1TfOD4TXfm9QIbb21hqcCTATf0jE
     #小易
     #    token: "8057879283:AAF5sta5RKgI_HvFqw86-mraHg7fD6p0UQ4"
     #百事
-    token: "7948317344:AAFGfQyQIJrZfkCyaGbCcriFGUku4tOEskc"
+#    token: "7948317344:AAFGfQyQIJrZfkCyaGbCcriFGUku4tOEskc"
 
 
 # 配置数据源信息
@@ -21,18 +22,23 @@ spring:
       driver-class-name: com.mysql.cj.jdbc.Driver         # mysql驱动
 
 
-      #      jdbc-url: jdbc:mysql://127.0.0.1:3306/jebot?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
-      #      username: root
-      #      password: SAu961102
+      jdbc-url: jdbc:mysql://127.0.0.1:3306/jebot?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
+      username: root
+      password: SAu961102
+
+      #印度
+#      jdbc-url: jdbc:mysql://127.0.0.1:3306/jebot?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
+#      username: jebot
+#      password: 6BSRrKfGcRCSN8bR
 
       #小易
 #      jdbc-url: jdbc:mysql://rm-3nsku90lhvto0h705.mysql.rds.aliyuncs.com/jebot?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
 #      username: bayue
 #      password: bvuzCeQMDVb^sy6W
       #百事
-      jdbc-url: jdbc:mysql://rm-3nse1a607497kcxcl.mysql.rds.aliyuncs.com/jebot?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
-      username: xiaopengxixijishu
-      password: Ltadmin123
+#      jdbc-url: jdbc:mysql://rm-3nse1a607497kcxcl.mysql.rds.aliyuncs.com/jebot?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
+#      username: xiaopengxixijishu
+#      password: Ltadmin123
 
 
       hikari:
@@ -49,6 +55,10 @@ spring:
       type: com.zaxxer.hikari.HikariDataSource          # 数据源类型:HikariCP
       driver-class-name: com.mysql.cj.jdbc.Driver         # mysql驱动
 
+      jdbc-url: jdbc:mysql://127.0.0.1:3306/xxpay4pro_xx?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
+      username: root
+      password: SAu961102
+
       #小易
 #      jdbc-url: jdbc:mysql://rm-3nsku90lhvto0h705.mysql.rds.aliyuncs.com/xiaoyixxpay?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
 #      username: bayue
@@ -58,10 +68,10 @@ spring:
 #      username: xiaopengxixijishu
 #      password: Ltadmin123
 
-
-      jdbc-url: jdbc:mysql://127.0.0.1:3306/xxpay4pro?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
-      username: root
-      password: SAu961102
+#印度
+#      jdbc-url: jdbc:mysql://rm-3nsku90lhvto0h705.mysql.rds.aliyuncs.com/gdspay?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
+#      username: bayue
+#      password: bvuzCeQMDVb^sy6W
 
       hikari:
         connection-timeout: 30000        # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认:30秒