Explorar el Código

Merge branch 'dev-xwt' of https://e.coding.net/chuanghaikeji/moxuanyunshangwaimai/backend into dev-test

# Conflicts:
#	src/main/resources/application-prod.yml
wanxl hace 1 año
padre
commit
b664787ca5

BIN
lib/rht-pay-1.2.jar


+ 11 - 1
pom.xml

@@ -178,7 +178,7 @@
         <dependency>
             <groupId>io.jsonwebtoken</groupId>
             <artifactId>jjwt</artifactId>
-            <version>0.9.0</version>
+            <version>0.9.1</version>
         </dependency>
         <dependency>
             <groupId>net.sf.json-lib</groupId>
@@ -443,6 +443,16 @@
             <version>1.2</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-registry-prometheus</artifactId>
+            <scope>runtime</scope>
+        </dependency>
     </dependencies>
 
     <dependencyManagement>

+ 9 - 0
src/main/java/com/sqx/SqxApplication.java

@@ -1,11 +1,15 @@
 package com.sqx;
 
 import com.sqx.common.utils.MyGlobalThreadPool;
+import io.micrometer.core.instrument.MeterRegistry;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.boot.SpringApplication;
+import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.context.ApplicationEvent;
 import org.springframework.context.ApplicationListener;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.event.ContextClosedEvent;
 
 @SpringBootApplication
@@ -36,4 +40,9 @@ public class SqxApplication implements CommandLineRunner, ApplicationListener<Ap
 			MyGlobalThreadPool.shutdown(false);
 		}
 	}
+
+	@Bean
+	MeterRegistryCustomizer<MeterRegistry> configurer(@Value("${spring.application.name}") String applicationName, @Value("${spring.profiles.active}") String active) {
+		return (registry) -> registry.config().commonTags("application", applicationName + "-" + active);
+	}
 }

+ 1 - 0
src/main/java/com/sqx/config/ShiroConfig.java

@@ -44,6 +44,7 @@ public class ShiroConfig {
         Map<String, String> filterMap = new LinkedHashMap<>();
         filterMap.put("/webjars/**", "anon");
         filterMap.put("/druid/**", "anon");
+        filterMap.put("/my-check/**", "anon");
         filterMap.put("/app/wxPay/notifyJsApi", "anon");
 
         filterMap.put("/**/open/**", "anon");

+ 44 - 0
src/main/java/com/sqx/config/SwaggerConfig.java

@@ -1,9 +1,13 @@
 package com.sqx.config;
 
 import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanPostProcessor;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.util.ReflectionUtils;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
 import springfox.documentation.builders.ApiInfoBuilder;
 import springfox.documentation.builders.PathSelectors;
 import springfox.documentation.builders.RequestHandlerSelectors;
@@ -11,9 +15,12 @@ import springfox.documentation.service.ApiInfo;
 import springfox.documentation.service.ApiKey;
 import springfox.documentation.spi.DocumentationType;
 import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
 import springfox.documentation.swagger2.annotations.EnableSwagger2;
 
+import java.lang.reflect.Field;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import static com.google.common.collect.Lists.newArrayList;
 
@@ -50,4 +57,41 @@ public class SwaggerConfig implements WebMvcConfigurer {
         );
     }
 
+    /**
+     * 解决SpringBoot和Swagger2冲突
+     *
+     * @return
+     */
+    @Bean
+    public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
+        return new BeanPostProcessor() {
+
+            @Override
+            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+                if (bean instanceof WebMvcRequestHandlerProvider) {
+                    customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
+                }
+                return bean;
+            }
+
+            private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
+                List<T> copy = mappings.stream()
+                        .filter(mapping -> mapping.getPatternParser() == null)
+                        .collect(Collectors.toList());
+                mappings.clear();
+                mappings.addAll(copy);
+            }
+
+            @SuppressWarnings("unchecked")
+            private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
+                try {
+                    Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
+                    field.setAccessible(true);
+                    return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
+                } catch (IllegalArgumentException | IllegalAccessException e) {
+                    throw new IllegalStateException(e);
+                }
+            }
+        };
+    }
 }

+ 11 - 1
src/main/java/com/sqx/modules/order/controller/app/AppOrderController.java

@@ -1,6 +1,8 @@
 package com.sqx.modules.order.controller.app;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.sqx.common.exception.SqxException;
 import com.sqx.common.utils.Result;
 import com.sqx.modules.app.annotation.Login;
 import com.sqx.modules.order.entity.Evaluate;
@@ -13,7 +15,12 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestAttribute;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
 import java.util.List;
@@ -41,6 +48,9 @@ public class AppOrderController {
     @PostMapping("/updateOrdersRemark")
     public Result updateOrdersRemark(Long orderId,String remark){
         TbOrder tbOrder = appOrderService.getById(orderId);
+        if (ObjectUtil.isNull(tbOrder)) {
+            throw new SqxException("无效的订单id");
+        }
         tbOrder.setRemark(remark);
         appOrderService.updateById(tbOrder);
         return Result.success();

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 299 - 157
src/main/java/com/sqx/modules/order/service/impl/AppAppOrderServiceImpl.java


+ 2 - 0
src/main/java/com/sqx/modules/shop/service/impl/ShopMessageServiceImpl.java

@@ -17,6 +17,7 @@ import com.sqx.common.utils.Constant;
 import com.sqx.common.utils.PageUtils;
 import com.sqx.common.utils.RedisUtils;
 import com.sqx.common.utils.Result;
+import com.sqx.datasource.annotation.DataSource;
 import com.sqx.modules.app.dao.MsgDao;
 import com.sqx.modules.app.dao.UserBrowseDao;
 import com.sqx.modules.app.dao.UserDao;
@@ -365,6 +366,7 @@ public class ShopMessageServiceImpl extends ServiceImpl<ShopMessageDao, GoodsSho
 
 
     @Override
+    @DataSource("dynamic")
     public Result shopHomePage(Long shopId, String startTime, String endTime) {
         HashMap<String, Object> hashMap = new HashMap();
         //总收益

+ 24 - 4
src/main/java/com/sqx/scheduler/order/OrderScheduler.java

@@ -1,6 +1,7 @@
 package com.sqx.scheduler.order;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
@@ -14,6 +15,9 @@ import com.sqx.modules.order.entity.TbOrder;
 import com.sqx.modules.order.service.AppOrderService;
 import com.sqx.modules.pay.config.WXConfig;
 import com.sqx.modules.pay.config.WechatPayConfig;
+import com.sqx.modules.pay.entity.PayDetails;
+import com.sqx.modules.pay.enums.PayStateEnums;
+import com.sqx.modules.pay.service.PayDetailsService;
 import com.sqx.scheduler.config.SchedulerLock;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -42,6 +46,7 @@ public class OrderScheduler {
     private final RedissonClient redissonClient;
     private final AppOrderService orderService;
     private final CommonInfoService commonInfoService;
+    private final PayDetailsService payDetailsService;
 
     private final static String RHT_PAY_BASE_URL = "https://api.ekbuyclub.com";
 
@@ -181,14 +186,14 @@ public class OrderScheduler {
         lock.lock();
         try {
             log.info("超时订单自动取消任务开始运行");
-            long time = new Date().getTime();
+            //加5分钟在前端强制取消前执行
+            long time = new Date().getTime()+5*60*1000;
             List<TbOrder> orderList = orderService.changeTimeOutOrder(time);
 
             if (orderList.size() == 0) {
                 log.info("没有符合条件的超时订单,超时订单自动取消任务运行....");
                 return;
             }
-
             WXConfig config = new WXConfig();
 //            当前都是小程序支付
             config.setAppId(commonInfoService.findOne(74).getValue());
@@ -225,6 +230,7 @@ public class OrderScheduler {
                             tbOrder.setStatus(5);
                             orders.add(tbOrder);
                         }else if ("SUCCESS".equals(trade_state)){
+                            tbOrder.setPayType(1);
                             orderService.updateOrderAfterPaySuccess(tbOrder);
                         }
                     }else {
@@ -232,23 +238,37 @@ public class OrderScheduler {
                         qqrb.setTraceno(orderNumber);// 商户流水号
                         QrcodeQueryResponseBean response2 = qrcodePay.query(qqrb);
                         String respCode = response2.getRespCode();
+                        log.info("超时任务处理订单【{}】查询支付结果,支付通知信息:{}", orderNumber, response2);
 //                        0未支付,1支付成功,2支付失败,4退款中,5退款成功,6退款失败
                         if ("0".equals(respCode)) {
                             tbOrder.setStatus(5);
                             orders.add(tbOrder);
                         }else if ("1".equals(respCode)){
+                            PayDetails payDetails = payDetailsService.getByOrderNo(orderNumber);
+                            if (!ObjectUtil.isNull(payDetails)) {
+                                payDetails.setState(PayStateEnums.PAY_SUCCESS.getStateCode());
+                                payDetails.setPayTime(response2.getTransDate()+ " " + response2.getTransTime());
+                                payDetails.setTradeNo(response2.getChannelOrderno());
+                                payDetails.setRemark("Scheduled RHT PAY SUCCESS");
+                                payDetailsService.updateDetail(payDetails);
+                            }else {
+                                log.error("超时任务处理订单【{}】支付成功,但未获取到支付订单!支付通知信息:{}", orderNumber, response2);
+                            }
+                            tbOrder.setPayType(1);
                             orderService.updateOrderAfterPaySuccess(tbOrder);
                         }
 
                     }
-
                 } else {
                     tbOrder.setStatus(5);
                     orders.add(tbOrder);
                 }
             }
+            //list为空不要执行
+            if(!orders.isEmpty()){
+                orderService.updateBatchById(orders);
+            }
 
-            orderService.updateBatchById(orders);
 
             log.info("超时订单自动取消运行成功");
         } catch (Exception e) {

+ 5 - 4
src/main/resources/application-dev.yml

@@ -6,8 +6,8 @@ spring:
             url: jdbc:mysql://172.16.20.108:3306/tcwm2.5?useUnicode=true&characterEncoding=utf-8&useSSL=false&rewriteBatchedStatements=true&serverTimezone=CTT&useAffectedRows=true
             username: root
             password: chuanghai@2024
-            initial-size: 15
-            max-active: 100
+            initial-size: 100
+            max-active: 500
             min-idle: 10
             max-wait: 60000
             pool-prepared-statements: true
@@ -22,8 +22,9 @@ spring:
             stat-view-servlet:
                 enabled: true
                 url-pattern: /druid/*
-                #login-username: admin
-                #login-password: admin
+                login-username: CH
+                login-password: CH_2025@.
+                allow: ""
             filter:
                 stat:
                     log-slow-sql: true

+ 19 - 0
src/main/resources/application.yml

@@ -15,6 +15,8 @@ server:
     context-path: /sqx_fast
 
 spring:
+  application:
+    name: wm-01ll
   main:
     allow-circular-references: true
   # 环境 dev|test|prod
@@ -37,6 +39,23 @@ spring:
 #  resources:
 #    add-mappings: false
 
+# 监控
+management:
+  endpoints:
+    web:
+      # 个性化端点访问路径,防止地址泄露
+      base-path: /my-check
+      exposure:
+        include: "*"
+  endpoint:
+    prometheus:
+      enabled: true
+    health:
+      show-details: always
+  metrics:
+    export:
+      prometheus:
+        enabled: true
 
 #mybatis
 mybatis-plus:

+ 1 - 1
src/main/resources/mapper/integra/UserIntegralDetailsMapper.xml

@@ -20,7 +20,7 @@
     </select>
 
     <select id="selectUserIntegralDetails" resultType="com.sqx.modules.integral.entity.UserIntegralDetails">
-        select * from user_integral_details where user_id = #{userId} and date_format(create_time,'%Y-%m-%d')=date_format(#{date},'%Y-%m-%d') and classify = 1
+        select * from user_integral_details where user_id = #{userId} and date_format(create_time,'%Y-%m-%d')=date_format(#{date},'%Y-%m-%d') and classify = 1 limit 1
     </select>
 
     <select id="queryIntegralList" resultType="com.sqx.modules.integral.entity.UserIntegralDetails">

+ 1 - 0
src/main/resources/mapper/order/OrderMapper.xml

@@ -558,6 +558,7 @@
                  left join tb_user tus on ti.user_id = tus.user_id
                  left join evaluate e on tor.order_number = e.order_number
         where tor.order_id = #{orderId}
+        limit 1
     </select>
 
     <select id="selectBuyGoods" resultType="com.sqx.modules.order.entity.TbOrder">